From 057959cb8fac26da7162141a8c4ac0bcfd1ca40e Mon Sep 17 00:00:00 2001 From: Thomas Misund Date: Tue, 13 Oct 2009 15:43:04 +0200 Subject: [PATCH] Initial import --- .bzrignore | 2 + includes/DB.php | 1388 ++++ includes/DB/common.php | 2157 ++++++ includes/DB/dbase.php | 510 ++ includes/DB/fbsql.php | 770 +++ includes/DB/ibase.php | 1071 +++ includes/DB/ifx.php | 681 ++ includes/DB/msql.php | 810 +++ includes/DB/mssql.php | 914 +++ includes/DB/mysql.php | 1034 +++ includes/DB/mysqli.php | 1076 +++ includes/DB/oci8.php | 1117 +++ includes/DB/odbc.php | 883 +++ includes/DB/pgsql.php | 1097 +++ includes/DB/sqlite.php | 942 +++ includes/DB/storage.php | 504 ++ includes/DB/sybase.php | 907 +++ includes/PEAR.php | 1055 +++ includes/PEAR/Autoloader.php | 208 + includes/PEAR/Builder.php | 426 ++ includes/PEAR/Command.php | 398 ++ includes/PEAR/Command/Auth.php | 155 + includes/PEAR/Command/Build.php | 89 + includes/PEAR/Command/Common.php | 249 + includes/PEAR/Command/Config.php | 225 + includes/PEAR/Command/Install.php | 470 ++ includes/PEAR/Command/Mirror.php | 101 + includes/PEAR/Command/Package.php | 819 +++ includes/PEAR/Command/Registry.php | 351 + includes/PEAR/Command/Remote.php | 435 ++ includes/PEAR/Common.php | 2094 ++++++ includes/PEAR/Config.php | 1169 ++++ includes/PEAR/Dependency.php | 487 ++ includes/PEAR/Downloader.php | 680 ++ includes/PEAR/ErrorStack.php | 981 +++ includes/PEAR/Exception.php | 359 + includes/PEAR/Frontend/CLI.php | 509 ++ includes/PEAR/Installer.php | 1068 +++ includes/PEAR/Packager.php | 165 + includes/PEAR/Registry.php | 538 ++ includes/PEAR/Remote.php | 394 ++ includes/PEAR/RunTest.php | 363 + includes/tiny_mce/blank.htm | 9 + includes/tiny_mce/langs/ar.js | 43 + includes/tiny_mce/langs/ca.js | 41 + includes/tiny_mce/langs/cs.js | 52 + includes/tiny_mce/langs/cy.js | 41 + includes/tiny_mce/langs/da.js | 41 + includes/tiny_mce/langs/de.js | 41 + includes/tiny_mce/langs/el.js | 41 + includes/tiny_mce/langs/en.js | 41 + includes/tiny_mce/langs/es.js | 50 + includes/tiny_mce/langs/fa.js | 46 + includes/tiny_mce/langs/fi.js | 42 + includes/tiny_mce/langs/fr.js | 43 + includes/tiny_mce/langs/fr_ca.js | 40 + includes/tiny_mce/langs/he.js | 41 + includes/tiny_mce/langs/hu.js | 41 + includes/tiny_mce/langs/is.js | 41 + includes/tiny_mce/langs/it.js | 41 + includes/tiny_mce/langs/ja.js | 41 + includes/tiny_mce/langs/ko.js | 40 + includes/tiny_mce/langs/nb.js | 41 + includes/tiny_mce/langs/nl.js | 42 + includes/tiny_mce/langs/nn.js | 41 + includes/tiny_mce/langs/pl.js | 44 + includes/tiny_mce/langs/pt.js | 42 + includes/tiny_mce/langs/pt_br.js | 50 + includes/tiny_mce/langs/readme.txt | 2 + includes/tiny_mce/langs/ru.js | 43 + includes/tiny_mce/langs/ru_KOI8-R.js | 43 + includes/tiny_mce/langs/ru_UTF-8.js | 43 + includes/tiny_mce/langs/sk.js | 50 + includes/tiny_mce/langs/sv.js | 43 + includes/tiny_mce/langs/th.js | 40 + includes/tiny_mce/langs/zh_cn.js | 41 + includes/tiny_mce/langs/zh_tw.js | 42 + includes/tiny_mce/langs/zh_tw_utf8.js | 42 + includes/tiny_mce/license.txt | 437 ++ .../plugins/_template/editor_plugin.js | 118 + .../plugins/_template/editor_plugin_src.js | 132 + .../plugins/_template/images/template.gif | Bin 0 -> 87 bytes .../tiny_mce/plugins/_template/langs/da.js | 8 + .../tiny_mce/plugins/_template/langs/de.js | 9 + .../tiny_mce/plugins/_template/langs/en.js | 8 + .../tiny_mce/plugins/_template/langs/es.js | 14 + .../tiny_mce/plugins/_template/langs/fr.js | 9 + .../tiny_mce/plugins/_template/langs/fr_ca.js | 8 + .../tiny_mce/plugins/_template/langs/he.js | 8 + .../tiny_mce/plugins/_template/langs/hu.js | 8 + .../tiny_mce/plugins/_template/langs/is.js | 8 + .../tiny_mce/plugins/_template/langs/nb.js | 8 + .../tiny_mce/plugins/_template/langs/nl.js | 8 + .../tiny_mce/plugins/_template/langs/nn.js | 8 + .../tiny_mce/plugins/_template/langs/pl.js | 8 + .../tiny_mce/plugins/_template/langs/pt_br.js | 13 + .../tiny_mce/plugins/_template/langs/ru.js | 8 + .../plugins/_template/langs/ru_KOI8-R.js | 8 + .../plugins/_template/langs/ru_UTF-8.js | 8 + .../tiny_mce/plugins/_template/langs/zh_cn.js | 8 + .../tiny_mce/plugins/_template/langs/zh_tw.js | 0 .../plugins/_template/langs/zh_tw_utf8.js | 7 + includes/tiny_mce/plugins/_template/popup.htm | 48 + .../tiny_mce/plugins/_template/readme.txt | 1 + .../tiny_mce/plugins/advhr/editor_plugin.js | 1 + .../plugins/advhr/editor_plugin_src.js | 75 + .../tiny_mce/plugins/advhr/images/advhr.gif | Bin 0 -> 153 bytes .../tiny_mce/plugins/advhr/jscripts/rule.js | 41 + includes/tiny_mce/plugins/advhr/langs/cs.js | 14 + includes/tiny_mce/plugins/advhr/langs/cy.js | 8 + includes/tiny_mce/plugins/advhr/langs/da.js | 8 + includes/tiny_mce/plugins/advhr/langs/de.js | 8 + includes/tiny_mce/plugins/advhr/langs/en.js | 8 + includes/tiny_mce/plugins/advhr/langs/es.js | 10 + includes/tiny_mce/plugins/advhr/langs/fa.js | 13 + includes/tiny_mce/plugins/advhr/langs/fi.js | 8 + includes/tiny_mce/plugins/advhr/langs/fr.js | 9 + .../tiny_mce/plugins/advhr/langs/fr_ca.js | 8 + includes/tiny_mce/plugins/advhr/langs/he.js | 8 + includes/tiny_mce/plugins/advhr/langs/hu.js | 8 + includes/tiny_mce/plugins/advhr/langs/is.js | 8 + includes/tiny_mce/plugins/advhr/langs/nb.js | 8 + includes/tiny_mce/plugins/advhr/langs/nl.js | 8 + includes/tiny_mce/plugins/advhr/langs/nn.js | 8 + includes/tiny_mce/plugins/advhr/langs/pl.js | 11 + .../tiny_mce/plugins/advhr/langs/pt_br.js | 16 + includes/tiny_mce/plugins/advhr/langs/ru.js | 8 + .../tiny_mce/plugins/advhr/langs/ru_KOI8-R.js | 8 + .../tiny_mce/plugins/advhr/langs/ru_UTF-8.js | 8 + includes/tiny_mce/plugins/advhr/langs/sk.js | 16 + includes/tiny_mce/plugins/advhr/langs/sv.js | 8 + .../tiny_mce/plugins/advhr/langs/zh_cn.js | 8 + .../tiny_mce/plugins/advhr/langs/zh_tw.js | 10 + .../plugins/advhr/langs/zh_tw_utf8.js | 10 + includes/tiny_mce/plugins/advhr/readme.txt | 1 + includes/tiny_mce/plugins/advhr/rule.htm | 59 + .../plugins/advimage/css/advimage.css | 66 + .../plugins/advimage/editor_plugin.js | 1 + .../plugins/advimage/editor_plugin_src.js | 113 + includes/tiny_mce/plugins/advimage/image.htm | 240 + .../plugins/advimage/images/sample.gif | Bin 0 -> 1624 bytes .../plugins/advimage/jscripts/functions.js | 545 ++ .../tiny_mce/plugins/advimage/langs/cs.js | 8 + .../tiny_mce/plugins/advimage/langs/cy.js | 27 + .../tiny_mce/plugins/advimage/langs/da.js | 26 + .../tiny_mce/plugins/advimage/langs/de.js | 27 + .../tiny_mce/plugins/advimage/langs/en.js | 27 + .../tiny_mce/plugins/advimage/langs/es.js | 35 + .../tiny_mce/plugins/advimage/langs/fa.js | 13 + .../tiny_mce/plugins/advimage/langs/fa_ca.js | 8 + .../tiny_mce/plugins/advimage/langs/fr.js | 47 + .../tiny_mce/plugins/advimage/langs/fr_ca.js | 8 + .../tiny_mce/plugins/advimage/langs/he.js | 27 + .../tiny_mce/plugins/advimage/langs/hu.js | 27 + .../tiny_mce/plugins/advimage/langs/is.js | 27 + .../tiny_mce/plugins/advimage/langs/ko.js | 8 + .../tiny_mce/plugins/advimage/langs/nb.js | 27 + .../tiny_mce/plugins/advimage/langs/nl.js | 27 + .../tiny_mce/plugins/advimage/langs/nn.js | 27 + .../tiny_mce/plugins/advimage/langs/pl.js | 0 .../tiny_mce/plugins/advimage/langs/pt_br.js | 35 + .../tiny_mce/plugins/advimage/langs/ru.js | 26 + .../plugins/advimage/langs/ru_KOI8-R.js | 26 + .../plugins/advimage/langs/ru_UTF-8.js | 26 + .../tiny_mce/plugins/advimage/langs/sk.js | 16 + .../tiny_mce/plugins/advimage/langs/sv.js | 27 + .../tiny_mce/plugins/advimage/langs/zh_cn.js | 27 + .../tiny_mce/plugins/advimage/langs/zh_tw.js | 29 + .../plugins/advimage/langs/zh_tw_utf8.js | 29 + includes/tiny_mce/plugins/advimage/readme.txt | 1 + .../tiny_mce/plugins/advlink/css/advlink.css | 35 + .../tiny_mce/plugins/advlink/editor_plugin.js | 1 + .../plugins/advlink/editor_plugin_src.js | 69 + .../plugins/advlink/jscripts/functions.js | 564 ++ includes/tiny_mce/plugins/advlink/langs/cs.js | 28 + includes/tiny_mce/plugins/advlink/langs/cy.js | 46 + includes/tiny_mce/plugins/advlink/langs/da.js | 46 + includes/tiny_mce/plugins/advlink/langs/de.js | 47 + includes/tiny_mce/plugins/advlink/langs/en.js | 46 + includes/tiny_mce/plugins/advlink/langs/es.js | 54 + includes/tiny_mce/plugins/advlink/langs/fa.js | 27 + includes/tiny_mce/plugins/advlink/langs/fr.js | 22 + .../tiny_mce/plugins/advlink/langs/fr_ca.js | 22 + includes/tiny_mce/plugins/advlink/langs/he.js | 46 + includes/tiny_mce/plugins/advlink/langs/hu.js | 46 + includes/tiny_mce/plugins/advlink/langs/is.js | 46 + includes/tiny_mce/plugins/advlink/langs/ko.js | 21 + includes/tiny_mce/plugins/advlink/langs/nb.js | 46 + includes/tiny_mce/plugins/advlink/langs/nl.js | 46 + includes/tiny_mce/plugins/advlink/langs/nn.js | 46 + includes/tiny_mce/plugins/advlink/langs/pl.js | 49 + .../tiny_mce/plugins/advlink/langs/pt_br.js | 54 + includes/tiny_mce/plugins/advlink/langs/ru.js | 47 + .../plugins/advlink/langs/ru_KOI8-R.js | 46 + .../plugins/advlink/langs/ru_UTF-8.js | 46 + includes/tiny_mce/plugins/advlink/langs/sk.js | 30 + includes/tiny_mce/plugins/advlink/langs/sv.js | 46 + .../tiny_mce/plugins/advlink/langs/zh_cn.js | 46 + .../tiny_mce/plugins/advlink/langs/zh_tw.js | 47 + .../plugins/advlink/langs/zh_tw_utf8.js | 47 + includes/tiny_mce/plugins/advlink/link.htm | 334 + includes/tiny_mce/plugins/advlink/readme.txt | 1 + .../plugins/autosave/editor_plugin.js | 1 + .../plugins/autosave/editor_plugin_src.js | 30 + .../tiny_mce/plugins/autosave/langs/cs.js | 11 + .../tiny_mce/plugins/autosave/langs/cy.js | 5 + .../tiny_mce/plugins/autosave/langs/da.js | 5 + .../tiny_mce/plugins/autosave/langs/de.js | 5 + .../tiny_mce/plugins/autosave/langs/en.js | 5 + .../tiny_mce/plugins/autosave/langs/es.js | 13 + .../tiny_mce/plugins/autosave/langs/fr.js | 5 + .../tiny_mce/plugins/autosave/langs/he.js | 5 + .../tiny_mce/plugins/autosave/langs/hu.js | 5 + .../tiny_mce/plugins/autosave/langs/is.js | 5 + .../tiny_mce/plugins/autosave/langs/nb.js | 6 + .../tiny_mce/plugins/autosave/langs/nl.js | 5 + .../tiny_mce/plugins/autosave/langs/nn.js | 6 + .../tiny_mce/plugins/autosave/langs/pl.js | 8 + .../tiny_mce/plugins/autosave/langs/pt_br.js | 12 + .../tiny_mce/plugins/autosave/langs/ru.js | 5 + .../plugins/autosave/langs/ru_KOI8-R.js | 5 + .../plugins/autosave/langs/ru_UTF-8.js | 5 + .../tiny_mce/plugins/autosave/langs/sk.js | 13 + .../tiny_mce/plugins/autosave/langs/sv.js | 6 + .../tiny_mce/plugins/autosave/langs/zh_cn.js | 5 + .../tiny_mce/plugins/autosave/langs/zh_tw.js | 6 + .../plugins/autosave/langs/zh_tw_utf8.js | 6 + includes/tiny_mce/plugins/autosave/readme.txt | 1 + .../plugins/contextmenu/css/contextmenu.css | 60 + .../plugins/contextmenu/editor_plugin.js | 1 + .../plugins/contextmenu/editor_plugin_src.js | 309 + .../plugins/contextmenu/images/spacer.gif | Bin 0 -> 43 bytes .../tiny_mce/plugins/contextmenu/readme.txt | 1 + .../plugins/directionality/editor_plugin.js | 1 + .../directionality/editor_plugin_src.js | 81 + .../plugins/directionality/images/ltr.gif | Bin 0 -> 155 bytes .../plugins/directionality/images/rtl.gif | Bin 0 -> 153 bytes .../plugins/directionality/langs/cs.js | 12 + .../plugins/directionality/langs/cy.js | 6 + .../plugins/directionality/langs/da.js | 6 + .../plugins/directionality/langs/de.js | 6 + .../plugins/directionality/langs/en.js | 6 + .../plugins/directionality/langs/es.js | 14 + .../plugins/directionality/langs/fr.js | 6 + .../plugins/directionality/langs/fr_ca.js | 6 + .../plugins/directionality/langs/he.js | 6 + .../plugins/directionality/langs/hu.js | 6 + .../plugins/directionality/langs/is.js | 6 + .../plugins/directionality/langs/nb.js | 6 + .../plugins/directionality/langs/nl.js | 6 + .../plugins/directionality/langs/nn.js | 6 + .../plugins/directionality/langs/pl.js | 8 + .../plugins/directionality/langs/pt_br.js | 13 + .../plugins/directionality/langs/ru.js | 6 + .../plugins/directionality/langs/ru_KOI8-R.js | 6 + .../plugins/directionality/langs/ru_UTF-8.js | 6 + .../plugins/directionality/langs/sk.js | 14 + .../plugins/directionality/langs/sv.js | 6 + .../plugins/directionality/langs/zh_cn.js | 6 + .../plugins/directionality/langs/zh_tw.js | 7 + .../directionality/langs/zh_tw_utf8.js | 7 + .../plugins/directionality/readme.txt | 1 + .../plugins/emotions/editor_plugin.js | 1 + .../plugins/emotions/editor_plugin_src.js | 51 + .../tiny_mce/plugins/emotions/emotions.htm | 40 + .../plugins/emotions/images/emotions.gif | Bin 0 -> 357 bytes .../plugins/emotions/images/readme.txt | 2 + .../plugins/emotions/images/smiley-cool.gif | Bin 0 -> 354 bytes .../plugins/emotions/images/smiley-cry.gif | Bin 0 -> 329 bytes .../emotions/images/smiley-embarassed.gif | Bin 0 -> 331 bytes .../emotions/images/smiley-foot-in-mouth.gif | Bin 0 -> 344 bytes .../plugins/emotions/images/smiley-frown.gif | Bin 0 -> 340 bytes .../emotions/images/smiley-innocent.gif | Bin 0 -> 336 bytes .../plugins/emotions/images/smiley-kiss.gif | Bin 0 -> 338 bytes .../emotions/images/smiley-laughing.gif | Bin 0 -> 344 bytes .../emotions/images/smiley-money-mouth.gif | Bin 0 -> 321 bytes .../plugins/emotions/images/smiley-sealed.gif | Bin 0 -> 325 bytes .../plugins/emotions/images/smiley-smile.gif | Bin 0 -> 345 bytes .../emotions/images/smiley-surprised.gif | Bin 0 -> 342 bytes .../emotions/images/smiley-tongue-out.gif | Bin 0 -> 328 bytes .../emotions/images/smiley-undecided.gif | Bin 0 -> 337 bytes .../plugins/emotions/images/smiley-wink.gif | Bin 0 -> 351 bytes .../plugins/emotions/images/smiley-yell.gif | Bin 0 -> 336 bytes .../plugins/emotions/jscripts/functions.js | 21 + .../tiny_mce/plugins/emotions/langs/cs.js | 12 + .../tiny_mce/plugins/emotions/langs/cy.js | 22 + .../tiny_mce/plugins/emotions/langs/da.js | 22 + .../tiny_mce/plugins/emotions/langs/de.js | 22 + .../tiny_mce/plugins/emotions/langs/el.js | 6 + .../tiny_mce/plugins/emotions/langs/en.js | 22 + .../tiny_mce/plugins/emotions/langs/es.js | 30 + .../tiny_mce/plugins/emotions/langs/fa.js | 11 + .../tiny_mce/plugins/emotions/langs/fr.js | 22 + .../tiny_mce/plugins/emotions/langs/fr_ca.js | 6 + .../tiny_mce/plugins/emotions/langs/he.js | 22 + .../tiny_mce/plugins/emotions/langs/hu.js | 22 + .../tiny_mce/plugins/emotions/langs/is.js | 22 + .../tiny_mce/plugins/emotions/langs/it.js | 6 + .../tiny_mce/plugins/emotions/langs/ko.js | 6 + .../tiny_mce/plugins/emotions/langs/nb.js | 22 + .../tiny_mce/plugins/emotions/langs/nl.js | 22 + .../tiny_mce/plugins/emotions/langs/nn.js | 22 + .../tiny_mce/plugins/emotions/langs/pl.js | 25 + .../tiny_mce/plugins/emotions/langs/pt_br.js | 29 + .../tiny_mce/plugins/emotions/langs/ru.js | 22 + .../plugins/emotions/langs/ru_KOI8-R.js | 22 + .../plugins/emotions/langs/ru_UTF-8.js | 22 + .../tiny_mce/plugins/emotions/langs/sk.js | 14 + .../tiny_mce/plugins/emotions/langs/sv.js | 22 + .../tiny_mce/plugins/emotions/langs/zh_cn.js | 22 + .../tiny_mce/plugins/emotions/langs/zh_tw.js | 23 + .../plugins/emotions/langs/zh_tw_utf8.js | 23 + includes/tiny_mce/plugins/emotions/readme.txt | 1 + .../tiny_mce/plugins/flash/css/content.css | 7 + includes/tiny_mce/plugins/flash/css/flash.css | 11 + .../tiny_mce/plugins/flash/editor_plugin.js | 1 + .../plugins/flash/editor_plugin_src.js | 270 + includes/tiny_mce/plugins/flash/flash.htm | 70 + .../tiny_mce/plugins/flash/images/flash.gif | Bin 0 -> 241 bytes .../tiny_mce/plugins/flash/jscripts/flash.js | 0 includes/tiny_mce/plugins/flash/langs/cs.js | 14 + includes/tiny_mce/plugins/flash/langs/cy.js | 11 + includes/tiny_mce/plugins/flash/langs/da.js | 11 + includes/tiny_mce/plugins/flash/langs/de.js | 0 includes/tiny_mce/plugins/flash/langs/en.js | 11 + includes/tiny_mce/plugins/flash/langs/es.js | 19 + includes/tiny_mce/plugins/flash/langs/fa.js | 13 + includes/tiny_mce/plugins/flash/langs/fr.js | 11 + .../tiny_mce/plugins/flash/langs/fr_ca.js | 9 + includes/tiny_mce/plugins/flash/langs/he.js | 11 + includes/tiny_mce/plugins/flash/langs/hu.js | 11 + includes/tiny_mce/plugins/flash/langs/is.js | 11 + includes/tiny_mce/plugins/flash/langs/nb.js | 11 + includes/tiny_mce/plugins/flash/langs/nl.js | 11 + includes/tiny_mce/plugins/flash/langs/nn.js | 11 + includes/tiny_mce/plugins/flash/langs/pl.js | 14 + .../tiny_mce/plugins/flash/langs/pt_br.js | 19 + includes/tiny_mce/plugins/flash/langs/ru.js | 11 + .../tiny_mce/plugins/flash/langs/ru_KOI8-R.js | 11 + .../tiny_mce/plugins/flash/langs/ru_UTF-8.js | 11 + includes/tiny_mce/plugins/flash/langs/sk.js | 16 + includes/tiny_mce/plugins/flash/langs/sv.js | 11 + .../tiny_mce/plugins/flash/langs/zh_cn.js | 11 + .../tiny_mce/plugins/flash/langs/zh_tw.js | 12 + .../plugins/flash/langs/zh_tw_utf8.js | 12 + includes/tiny_mce/plugins/flash/readme.txt | 1 + .../plugins/fullscreen/editor_plugin.js | 1 + .../plugins/fullscreen/editor_plugin_src.js | 45 + .../plugins/fullscreen/fullscreen.htm | 73 + .../plugins/fullscreen/images/fullscreen.gif | Bin 0 -> 198 bytes .../tiny_mce/plugins/fullscreen/langs/cs.js | 12 + .../tiny_mce/plugins/fullscreen/langs/cy.js | 6 + .../tiny_mce/plugins/fullscreen/langs/da.js | 6 + .../tiny_mce/plugins/fullscreen/langs/de.js | 6 + .../tiny_mce/plugins/fullscreen/langs/en.js | 6 + .../tiny_mce/plugins/fullscreen/langs/es.js | 8 + .../tiny_mce/plugins/fullscreen/langs/fr.js | 6 + .../plugins/fullscreen/langs/fr_ca.js | 6 + .../tiny_mce/plugins/fullscreen/langs/he.js | 6 + .../tiny_mce/plugins/fullscreen/langs/hu.js | 6 + .../tiny_mce/plugins/fullscreen/langs/is.js | 6 + .../tiny_mce/plugins/fullscreen/langs/nb.js | 6 + .../tiny_mce/plugins/fullscreen/langs/nl.js | 6 + .../tiny_mce/plugins/fullscreen/langs/nn.js | 6 + .../tiny_mce/plugins/fullscreen/langs/pl.js | 9 + .../plugins/fullscreen/langs/pt_br.js | 14 + .../tiny_mce/plugins/fullscreen/langs/ru.js | 6 + .../plugins/fullscreen/langs/ru_KOI8-R.js | 6 + .../plugins/fullscreen/langs/ru_UTF-8.js | 6 + .../tiny_mce/plugins/fullscreen/langs/sk.js | 14 + .../tiny_mce/plugins/fullscreen/langs/sv.js | 6 + .../plugins/fullscreen/langs/zh_cn.js | 6 + .../plugins/fullscreen/langs/zh_tw.js | 7 + .../plugins/fullscreen/langs/zh_tw_utf8.js | 7 + .../tiny_mce/plugins/fullscreen/readme.txt | 1 + .../tiny_mce/plugins/iespell/editor_plugin.js | 1 + .../plugins/iespell/editor_plugin_src.js | 49 + .../plugins/iespell/images/iespell.gif | Bin 0 -> 124 bytes includes/tiny_mce/plugins/iespell/langs/cs.js | 12 + includes/tiny_mce/plugins/iespell/langs/cy.js | 7 + includes/tiny_mce/plugins/iespell/langs/da.js | 7 + includes/tiny_mce/plugins/iespell/langs/de.js | 7 + includes/tiny_mce/plugins/iespell/langs/el.js | 7 + includes/tiny_mce/plugins/iespell/langs/en.js | 7 + includes/tiny_mce/plugins/iespell/langs/es.js | 15 + includes/tiny_mce/plugins/iespell/langs/fr.js | 7 + .../tiny_mce/plugins/iespell/langs/fr_ca.js | 6 + includes/tiny_mce/plugins/iespell/langs/he.js | 6 + includes/tiny_mce/plugins/iespell/langs/hu.js | 7 + includes/tiny_mce/plugins/iespell/langs/is.js | 7 + includes/tiny_mce/plugins/iespell/langs/it.js | 7 + includes/tiny_mce/plugins/iespell/langs/ko.js | 7 + includes/tiny_mce/plugins/iespell/langs/nb.js | 6 + includes/tiny_mce/plugins/iespell/langs/nl.js | 6 + includes/tiny_mce/plugins/iespell/langs/nn.js | 6 + includes/tiny_mce/plugins/iespell/langs/pl.js | 8 + .../tiny_mce/plugins/iespell/langs/pt_br.js | 14 + includes/tiny_mce/plugins/iespell/langs/ru.js | 7 + .../plugins/iespell/langs/ru_KOI8-R.js | 7 + .../plugins/iespell/langs/ru_UTF-8.js | 7 + includes/tiny_mce/plugins/iespell/langs/sk.js | 14 + includes/tiny_mce/plugins/iespell/langs/sv.js | 0 .../tiny_mce/plugins/iespell/langs/zh_cn.js | 0 .../tiny_mce/plugins/iespell/langs/zh_tw.js | 0 .../plugins/iespell/langs/zh_tw_utf8.js | 8 + includes/tiny_mce/plugins/iespell/readme.txt | 1 + .../plugins/inlinepopups/css/inlinepopup.css | 69 + .../plugins/inlinepopups/editor_plugin.js | 1 + .../plugins/inlinepopups/editor_plugin_src.js | 653 ++ .../plugins/inlinepopups/images/spacer.gif | Bin 0 -> 43 bytes .../inlinepopups/images/window_close.gif | Bin 0 -> 110 bytes .../inlinepopups/images/window_maximize.gif | Bin 0 -> 111 bytes .../inlinepopups/images/window_minimize.gif | Bin 0 -> 112 bytes .../inlinepopups/images/window_resize.gif | Bin 0 -> 74 bytes .../inlinepopups/jscripts/mcwindows.js | 0 .../tiny_mce/plugins/inlinepopups/readme.txt | 0 .../plugins/insertdatetime/editor_plugin.js | 1 + .../insertdatetime/editor_plugin_src.js | 82 + .../insertdatetime/images/insertdate.gif | Bin 0 -> 287 bytes .../insertdatetime/images/inserttime.gif | Bin 0 -> 239 bytes .../plugins/insertdatetime/langs/cs.js | 18 + .../plugins/insertdatetime/langs/cy.js | 12 + .../plugins/insertdatetime/langs/da.js | 12 + .../plugins/insertdatetime/langs/de.js | 12 + .../plugins/insertdatetime/langs/el.js | 12 + .../plugins/insertdatetime/langs/en.js | 12 + .../plugins/insertdatetime/langs/es.js | 20 + .../plugins/insertdatetime/langs/fa.js | 13 + .../plugins/insertdatetime/langs/fi.js | 12 + .../plugins/insertdatetime/langs/fr.js | 12 + .../plugins/insertdatetime/langs/fr_ca.js | 10 + .../plugins/insertdatetime/langs/he.js | 12 + .../plugins/insertdatetime/langs/hu.js | 12 + .../plugins/insertdatetime/langs/is.js | 12 + .../plugins/insertdatetime/langs/it.js | 12 + .../plugins/insertdatetime/langs/ko.js | 12 + .../plugins/insertdatetime/langs/nb.js | 12 + .../plugins/insertdatetime/langs/nl.js | 12 + .../plugins/insertdatetime/langs/nn.js | 12 + .../plugins/insertdatetime/langs/pl.js | 15 + .../plugins/insertdatetime/langs/pt_br.js | 20 + .../plugins/insertdatetime/langs/ru.js | 12 + .../plugins/insertdatetime/langs/ru_KOI8-R.js | 12 + .../plugins/insertdatetime/langs/ru_UTF-8.js | 12 + .../plugins/insertdatetime/langs/sk.js | 20 + .../plugins/insertdatetime/langs/sv.js | 12 + .../plugins/insertdatetime/langs/zh_cn.js | 12 + .../plugins/insertdatetime/langs/zh_tw.js | 13 + .../insertdatetime/langs/zh_tw_utf8.js | 13 + .../plugins/insertdatetime/readme.txt | 1 + .../plugins/noneditable/css/noneditable.css | 17 + .../plugins/noneditable/editor_plugin.js | 1 + .../plugins/noneditable/editor_plugin_src.js | 149 + .../tiny_mce/plugins/noneditable/readme.txt | 1 + includes/tiny_mce/plugins/paste/blank.htm | 19 + includes/tiny_mce/plugins/paste/css/blank.css | 13 + .../tiny_mce/plugins/paste/css/pasteword.css | 3 + .../tiny_mce/plugins/paste/editor_plugin.js | 1 + .../plugins/paste/editor_plugin_src.js | 333 + .../plugins/paste/images/pastetext.gif | Bin 0 -> 294 bytes .../plugins/paste/images/pasteword.gif | Bin 0 -> 299 bytes .../plugins/paste/images/selectall.gif | Bin 0 -> 205 bytes .../plugins/paste/jscripts/pastetext.js | 34 + .../plugins/paste/jscripts/pasteword.js | 46 + includes/tiny_mce/plugins/paste/langs/cs.js | 16 + includes/tiny_mce/plugins/paste/langs/cy.js | 10 + includes/tiny_mce/plugins/paste/langs/da.js | 10 + includes/tiny_mce/plugins/paste/langs/de.js | 10 + includes/tiny_mce/plugins/paste/langs/en.js | 10 + includes/tiny_mce/plugins/paste/langs/es.js | 12 + includes/tiny_mce/plugins/paste/langs/fi.js | 10 + includes/tiny_mce/plugins/paste/langs/fr.js | 10 + .../tiny_mce/plugins/paste/langs/fr_ca.js | 10 + includes/tiny_mce/plugins/paste/langs/he.js | 10 + includes/tiny_mce/plugins/paste/langs/hu.js | 10 + includes/tiny_mce/plugins/paste/langs/is.js | 10 + includes/tiny_mce/plugins/paste/langs/nb.js | 10 + includes/tiny_mce/plugins/paste/langs/nl.js | 10 + includes/tiny_mce/plugins/paste/langs/nn.js | 10 + includes/tiny_mce/plugins/paste/langs/pl.js | 12 + .../tiny_mce/plugins/paste/langs/pt_br.js | 17 + includes/tiny_mce/plugins/paste/langs/ru.js | 10 + .../tiny_mce/plugins/paste/langs/ru_KOI8-R.js | 10 + .../tiny_mce/plugins/paste/langs/ru_UTF-8.js | 10 + includes/tiny_mce/plugins/paste/langs/sk.js | 18 + includes/tiny_mce/plugins/paste/langs/sv.js | 10 + .../tiny_mce/plugins/paste/langs/zh_cn.js | 10 + .../tiny_mce/plugins/paste/langs/zh_tw.js | 11 + .../plugins/paste/langs/zh_tw_utf8.js | 11 + includes/tiny_mce/plugins/paste/pastetext.htm | 34 + includes/tiny_mce/plugins/paste/pasteword.htm | 29 + includes/tiny_mce/plugins/paste/readme.txt | 1 + .../tiny_mce/plugins/preview/editor_plugin.js | 1 + .../plugins/preview/editor_plugin_src.js | 72 + .../tiny_mce/plugins/preview/example.html | 13 + .../plugins/preview/images/preview.gif | Bin 0 -> 286 bytes includes/tiny_mce/plugins/preview/langs/cs.js | 11 + includes/tiny_mce/plugins/preview/langs/cy.js | 5 + includes/tiny_mce/plugins/preview/langs/da.js | 5 + includes/tiny_mce/plugins/preview/langs/de.js | 5 + includes/tiny_mce/plugins/preview/langs/el.js | 5 + includes/tiny_mce/plugins/preview/langs/en.js | 5 + includes/tiny_mce/plugins/preview/langs/es.js | 7 + includes/tiny_mce/plugins/preview/langs/fa.js | 10 + includes/tiny_mce/plugins/preview/langs/fr.js | 6 + .../tiny_mce/plugins/preview/langs/fr_ca.js | 5 + includes/tiny_mce/plugins/preview/langs/he.js | 5 + includes/tiny_mce/plugins/preview/langs/hu.js | 5 + includes/tiny_mce/plugins/preview/langs/is.js | 5 + includes/tiny_mce/plugins/preview/langs/it.js | 5 + includes/tiny_mce/plugins/preview/langs/ko.js | 5 + includes/tiny_mce/plugins/preview/langs/nb.js | 5 + includes/tiny_mce/plugins/preview/langs/nl.js | 5 + includes/tiny_mce/plugins/preview/langs/nn.js | 5 + includes/tiny_mce/plugins/preview/langs/pl.js | 7 + includes/tiny_mce/plugins/preview/langs/pt.js | 5 + .../tiny_mce/plugins/preview/langs/pt_br.js | 13 + includes/tiny_mce/plugins/preview/langs/ru.js | 5 + .../plugins/preview/langs/ru_KOI8-R.js | 5 + .../plugins/preview/langs/ru_UTF-8.js | 5 + includes/tiny_mce/plugins/preview/langs/sk.js | 0 includes/tiny_mce/plugins/preview/langs/sv.js | 0 .../tiny_mce/plugins/preview/langs/zh_cn.js | 5 + .../tiny_mce/plugins/preview/langs/zh_tw.js | 6 + .../plugins/preview/langs/zh_tw_utf8.js | 6 + includes/tiny_mce/plugins/preview/readme.txt | 1 + .../tiny_mce/plugins/print/editor_plugin.js | 1 + .../plugins/print/editor_plugin_src.js | 37 + .../tiny_mce/plugins/print/images/print.gif | Bin 0 -> 211 bytes includes/tiny_mce/plugins/print/langs/cs.js | 11 + includes/tiny_mce/plugins/print/langs/cy.js | 5 + includes/tiny_mce/plugins/print/langs/da.js | 5 + includes/tiny_mce/plugins/print/langs/de.js | 5 + includes/tiny_mce/plugins/print/langs/en.js | 5 + includes/tiny_mce/plugins/print/langs/es.js | 7 + includes/tiny_mce/plugins/print/langs/fa.js | 10 + includes/tiny_mce/plugins/print/langs/fi.js | 5 + includes/tiny_mce/plugins/print/langs/fr.js | 5 + .../tiny_mce/plugins/print/langs/fr_ca.js | 5 + includes/tiny_mce/plugins/print/langs/he.js | 5 + includes/tiny_mce/plugins/print/langs/hu.js | 5 + includes/tiny_mce/plugins/print/langs/is.js | 5 + includes/tiny_mce/plugins/print/langs/nb.js | 5 + includes/tiny_mce/plugins/print/langs/nl.js | 5 + includes/tiny_mce/plugins/print/langs/nn.js | 5 + includes/tiny_mce/plugins/print/langs/pl.js | 5 + .../tiny_mce/plugins/print/langs/pt_br.js | 13 + includes/tiny_mce/plugins/print/langs/ru.js | 5 + .../tiny_mce/plugins/print/langs/ru_KOI8-R.js | 5 + .../tiny_mce/plugins/print/langs/ru_UTF-8.js | 5 + includes/tiny_mce/plugins/print/langs/sk.js | 13 + includes/tiny_mce/plugins/print/langs/sv.js | 5 + .../tiny_mce/plugins/print/langs/zh_cn.js | 6 + .../tiny_mce/plugins/print/langs/zh_tw.js | 6 + .../plugins/print/langs/zh_tw_utf8.js | 6 + includes/tiny_mce/plugins/print/readme.txt | 1 + includes/tiny_mce/plugins/readme.txt | 1 + .../tiny_mce/plugins/save/editor_plugin.js | 1 + .../plugins/save/editor_plugin_src.js | 58 + .../tiny_mce/plugins/save/images/save.gif | Bin 0 -> 285 bytes includes/tiny_mce/plugins/save/langs/cs.js | 0 includes/tiny_mce/plugins/save/langs/cy.js | 5 + includes/tiny_mce/plugins/save/langs/da.js | 0 includes/tiny_mce/plugins/save/langs/de.js | 5 + includes/tiny_mce/plugins/save/langs/en.js | 5 + includes/tiny_mce/plugins/save/langs/es.js | 7 + includes/tiny_mce/plugins/save/langs/fa.js | 11 + includes/tiny_mce/plugins/save/langs/fi.js | 5 + includes/tiny_mce/plugins/save/langs/fr.js | 6 + includes/tiny_mce/plugins/save/langs/fr_ca.js | 6 + includes/tiny_mce/plugins/save/langs/he.js | 5 + includes/tiny_mce/plugins/save/langs/hu.js | 5 + includes/tiny_mce/plugins/save/langs/is.js | 5 + includes/tiny_mce/plugins/save/langs/nb.js | 5 + includes/tiny_mce/plugins/save/langs/nl.js | 5 + includes/tiny_mce/plugins/save/langs/nn.js | 5 + includes/tiny_mce/plugins/save/langs/pl.js | 5 + includes/tiny_mce/plugins/save/langs/pt_br.js | 13 + includes/tiny_mce/plugins/save/langs/ru.js | 5 + .../tiny_mce/plugins/save/langs/ru_KOI8-R.js | 5 + .../tiny_mce/plugins/save/langs/ru_UTF-8.js | 5 + includes/tiny_mce/plugins/save/langs/sk.js | 13 + includes/tiny_mce/plugins/save/langs/sv.js | 5 + includes/tiny_mce/plugins/save/langs/zh_cn.js | 7 + includes/tiny_mce/plugins/save/langs/zh_tw.js | 6 + .../tiny_mce/plugins/save/langs/zh_tw_utf8.js | 6 + includes/tiny_mce/plugins/save/readme.txt | 1 + .../plugins/searchreplace/editor_plugin.js | 1 + .../searchreplace/editor_plugin_src.js | 195 + .../plugins/searchreplace/images/replace.gif | Bin 0 -> 125 bytes .../plugins/searchreplace/images/search.gif | Bin 0 -> 191 bytes .../plugins/searchreplace/jscripts/replace.js | 40 + .../plugins/searchreplace/jscripts/search.js | 36 + .../plugins/searchreplace/langs/cs.js | 27 + .../plugins/searchreplace/langs/cy.js | 22 + .../plugins/searchreplace/langs/da.js | 21 + .../plugins/searchreplace/langs/de.js | 22 + .../plugins/searchreplace/langs/en.js | 21 + .../plugins/searchreplace/langs/es.js | 30 + .../plugins/searchreplace/langs/fa.js | 26 + .../plugins/searchreplace/langs/fi.js | 21 + .../plugins/searchreplace/langs/fr.js | 22 + .../plugins/searchreplace/langs/fr_ca.js | 21 + .../plugins/searchreplace/langs/he.js | 21 + .../plugins/searchreplace/langs/hu.js | 21 + .../plugins/searchreplace/langs/is.js | 22 + .../plugins/searchreplace/langs/nb.js | 21 + .../plugins/searchreplace/langs/nl.js | 21 + .../plugins/searchreplace/langs/nn.js | 21 + .../plugins/searchreplace/langs/pl.js | 23 + .../plugins/searchreplace/langs/pt_br.js | 29 + .../plugins/searchreplace/langs/ru.js | 22 + .../plugins/searchreplace/langs/ru_KOI8-R.js | 21 + .../plugins/searchreplace/langs/ru_UTF-8.js | 21 + .../plugins/searchreplace/langs/sk.js | 29 + .../plugins/searchreplace/langs/sv.js | 21 + .../plugins/searchreplace/langs/zh_cn.js | 21 + .../plugins/searchreplace/langs/zh_tw.js | 22 + .../plugins/searchreplace/langs/zh_tw_utf8.js | 22 + .../tiny_mce/plugins/searchreplace/readme.txt | 1 + .../plugins/searchreplace/replace.htm | 49 + .../tiny_mce/plugins/searchreplace/search.htm | 42 + includes/tiny_mce/plugins/table/cell.htm | 182 + includes/tiny_mce/plugins/table/css/cell.css | 17 + includes/tiny_mce/plugins/table/css/row.css | 25 + includes/tiny_mce/plugins/table/css/table.css | 13 + .../tiny_mce/plugins/table/editor_plugin.js | 1 + .../plugins/table/editor_plugin_src.js | 1041 +++ .../tiny_mce/plugins/table/images/buttons.gif | Bin 0 -> 1356 bytes .../tiny_mce/plugins/table/images/table.gif | Bin 0 -> 287 bytes .../plugins/table/images/table_cell_props.gif | Bin 0 -> 189 bytes .../plugins/table/images/table_delete.gif | Bin 0 -> 372 bytes .../plugins/table/images/table_delete_col.gif | Bin 0 -> 163 bytes .../plugins/table/images/table_delete_row.gif | Bin 0 -> 171 bytes .../table/images/table_insert_col_after.gif | Bin 0 -> 165 bytes .../table/images/table_insert_col_before.gif | Bin 0 -> 165 bytes .../table/images/table_insert_row_after.gif | Bin 0 -> 163 bytes .../table/images/table_insert_row_before.gif | Bin 0 -> 159 bytes .../table/images/table_merge_cells.gif | Bin 0 -> 198 bytes .../plugins/table/images/table_row_props.gif | Bin 0 -> 187 bytes .../table/images/table_split_cells.gif | Bin 0 -> 210 bytes .../tiny_mce/plugins/table/jscripts/cell.js | 249 + .../plugins/table/jscripts/merge_cells.js | 19 + .../tiny_mce/plugins/table/jscripts/row.js | 200 + .../tiny_mce/plugins/table/jscripts/table.js | 327 + includes/tiny_mce/plugins/table/langs/ar.js | 43 + includes/tiny_mce/plugins/table/langs/cs.js | 49 + includes/tiny_mce/plugins/table/langs/cy.js | 76 + includes/tiny_mce/plugins/table/langs/da.js | 69 + includes/tiny_mce/plugins/table/langs/de.js | 76 + includes/tiny_mce/plugins/table/langs/el.js | 43 + includes/tiny_mce/plugins/table/langs/en.js | 75 + includes/tiny_mce/plugins/table/langs/es.js | 84 + includes/tiny_mce/plugins/table/langs/fa.js | 47 + includes/tiny_mce/plugins/table/langs/fi.js | 77 + includes/tiny_mce/plugins/table/langs/fr.js | 77 + .../tiny_mce/plugins/table/langs/fr_ca.js | 43 + includes/tiny_mce/plugins/table/langs/he.js | 75 + includes/tiny_mce/plugins/table/langs/hu.js | 75 + includes/tiny_mce/plugins/table/langs/is.js | 76 + includes/tiny_mce/plugins/table/langs/it.js | 43 + includes/tiny_mce/plugins/table/langs/ja.js | 43 + includes/tiny_mce/plugins/table/langs/ko.js | 43 + includes/tiny_mce/plugins/table/langs/nb.js | 75 + includes/tiny_mce/plugins/table/langs/nl.js | 75 + includes/tiny_mce/plugins/table/langs/nn.js | 76 + includes/tiny_mce/plugins/table/langs/pl.js | 78 + includes/tiny_mce/plugins/table/langs/pt.js | 84 + .../tiny_mce/plugins/table/langs/pt_br.js | 85 + .../tiny_mce/plugins/table/langs/readme.txt | 4 + includes/tiny_mce/plugins/table/langs/ru.js | 77 + .../tiny_mce/plugins/table/langs/ru_KOI8-R.js | 75 + .../tiny_mce/plugins/table/langs/ru_UTF-8.js | 75 + includes/tiny_mce/plugins/table/langs/sk.js | 51 + includes/tiny_mce/plugins/table/langs/sv.js | 76 + includes/tiny_mce/plugins/table/langs/tw.js | 43 + .../tiny_mce/plugins/table/langs/zh_cn.js | 75 + .../tiny_mce/plugins/table/langs/zh_tw.js | 76 + .../plugins/table/langs/zh_tw_utf8.js | 76 + .../tiny_mce/plugins/table/merge_cells.htm | 37 + includes/tiny_mce/plugins/table/readme.txt | 1 + includes/tiny_mce/plugins/table/row.htm | 159 + includes/tiny_mce/plugins/table/table.htm | 155 + .../tiny_mce/plugins/zoom/editor_plugin.js | 6 + .../plugins/zoom/editor_plugin_src.js | 47 + includes/tiny_mce/plugins/zoom/langs/es.js | 3 + includes/tiny_mce/plugins/zoom/langs/fr.js | 3 + includes/tiny_mce/plugins/zoom/langs/he.js | 5 + includes/tiny_mce/plugins/zoom/langs/pt_br.js | 10 + includes/tiny_mce/plugins/zoom/langs/ru.js | 5 + .../tiny_mce/plugins/zoom/langs/ru_KOI8-R.js | 5 + .../tiny_mce/plugins/zoom/langs/ru_UTF-8.js | 5 + includes/tiny_mce/plugins/zoom/langs/zh_tw.js | 6 + .../tiny_mce/plugins/zoom/langs/zh_tw_utf8.js | 6 + includes/tiny_mce/plugins/zoom/readme.txt | 1 + includes/tiny_mce/themes/advanced/about.htm | 53 + includes/tiny_mce/themes/advanced/anchor.htm | 33 + includes/tiny_mce/themes/advanced/charmap.htm | 53 + .../tiny_mce/themes/advanced/color_picker.htm | 13 + .../themes/advanced/css/editor_content.css | 55 + .../themes/advanced/css/editor_popup.css | 319 + .../themes/advanced/css/editor_ui.css | 173 + .../themes/advanced/docs/cs/about.htm | 31 + .../advanced/docs/cs/common_buttons.htm | 170 + .../docs/cs/images/insert_image_window.png | Bin 0 -> 4799 bytes .../docs/cs/images/insert_link_window.png | Bin 0 -> 3833 bytes .../docs/cs/images/insert_table_window.png | Bin 0 -> 4620 bytes .../themes/advanced/docs/cs/index.htm | 26 + .../advanced/docs/cs/insert_image_button.htm | 66 + .../advanced/docs/cs/insert_link_button.htm | 34 + .../advanced/docs/cs/insert_table_button.htm | 68 + .../themes/advanced/docs/cs/style.css | 28 + .../themes/advanced/docs/da/about.htm | 31 + .../advanced/docs/da/common_buttons.htm | 162 + .../docs/da/create_accessible_content.htm | 76 + .../docs/da/images/insert_anchor_window.gif | Bin 0 -> 5189 bytes .../docs/da/images/insert_image_window.gif | Bin 0 -> 7195 bytes .../docs/da/images/insert_link_window.gif | Bin 0 -> 5658 bytes .../docs/da/images/insert_table_window.gif | Bin 0 -> 10359 bytes .../themes/advanced/docs/da/index.htm | 28 + .../advanced/docs/da/insert_anchor_button.htm | 33 + .../advanced/docs/da/insert_image_button.htm | 67 + .../advanced/docs/da/insert_link_button.htm | 34 + .../advanced/docs/da/insert_table_button.htm | 72 + .../themes/advanced/docs/da/style.css | 28 + .../themes/advanced/docs/de/about.htm | 31 + .../advanced/docs/de/common_buttons.htm | 107 + .../docs/de/images/insert_image_window.gif | Bin 0 -> 4822 bytes .../docs/de/images/insert_link_window.gif | Bin 0 -> 5135 bytes .../themes/advanced/docs/de/index.htm | 24 + .../advanced/docs/de/insert_image_button.htm | 33 + .../advanced/docs/de/insert_link_button.htm | 34 + .../themes/advanced/docs/de/style.css | 28 + .../themes/advanced/docs/en/about.htm | 31 + .../advanced/docs/en/common_buttons.htm | 162 + .../docs/en/create_accessible_content.htm | 45 + .../docs/en/images/insert_anchor_window.gif | Bin 0 -> 5189 bytes .../docs/en/images/insert_image_window.gif | Bin 0 -> 7195 bytes .../docs/en/images/insert_link_window.gif | Bin 0 -> 5658 bytes .../docs/en/images/insert_table_window.gif | Bin 0 -> 7094 bytes .../themes/advanced/docs/en/index.htm | 27 + .../advanced/docs/en/insert_anchor_button.htm | 32 + .../advanced/docs/en/insert_image_button.htm | 65 + .../advanced/docs/en/insert_link_button.htm | 33 + .../advanced/docs/en/insert_table_button.htm | 71 + .../themes/advanced/docs/en/style.css | 28 + .../themes/advanced/docs/es/about.htm | 28 + .../advanced/docs/es/common_buttons.htm | 155 + .../docs/es/images/insert_image_window.gif | Bin 0 -> 7195 bytes .../docs/es/images/insert_link_window.gif | Bin 0 -> 5658 bytes .../docs/es/images/insert_table_window.gif | Bin 0 -> 6747 bytes .../themes/advanced/docs/es/index.htm | 25 + .../advanced/docs/es/insert_image_button.htm | 64 + .../advanced/docs/es/insert_link_button.htm | 32 + .../advanced/docs/es/insert_table_button.htm | 67 + .../themes/advanced/docs/es/style.css | 28 + .../themes/advanced/docs/fi/about.htm | 28 + .../advanced/docs/fi/common_buttons.htm | 156 + .../docs/fi/images/insert_image_window.gif | Bin 0 -> 8825 bytes .../docs/fi/images/insert_link_window.gif | Bin 0 -> 8223 bytes .../docs/fi/images/insert_table_window.gif | Bin 0 -> 8442 bytes .../themes/advanced/docs/fi/index.htm | 25 + .../advanced/docs/fi/insert_image_button.htm | 65 + .../advanced/docs/fi/insert_link_button.htm | 35 + .../advanced/docs/fi/insert_table_button.htm | 67 + .../themes/advanced/docs/fi/style.css | 28 + .../themes/advanced/docs/fr/about.htm | 32 + .../advanced/docs/fr/common_buttons.htm | 160 + .../docs/fr/images/insert_image_window.gif | Bin 0 -> 38920 bytes .../docs/fr/images/insert_link_window.gif | Bin 0 -> 20970 bytes .../docs/fr/images/insert_table_window.gif | Bin 0 -> 32353 bytes .../themes/advanced/docs/fr/index.htm | 25 + .../advanced/docs/fr/insert_image_button.htm | 66 + .../advanced/docs/fr/insert_link_button.htm | 34 + .../advanced/docs/fr/insert_table_button.htm | 71 + .../themes/advanced/docs/fr/style.css | 28 + .../themes/advanced/docs/fr_ca/about.htm | 32 + .../advanced/docs/fr_ca/common_buttons.htm | 160 + .../fr_ca/images/insert_anchor_window.gif | Bin 0 -> 12662 bytes .../docs/fr_ca/images/insert_image_window.gif | Bin 0 -> 38920 bytes .../docs/fr_ca/images/insert_link_window.gif | Bin 0 -> 20970 bytes .../docs/fr_ca/images/insert_table_window.gif | Bin 0 -> 32353 bytes .../themes/advanced/docs/fr_ca/index.htm | 25 + .../docs/fr_ca/insert_anchor_button.htm | 32 + .../docs/fr_ca/insert_image_button.htm | 66 + .../docs/fr_ca/insert_link_button.htm | 34 + .../docs/fr_ca/insert_table_button.htm | 71 + .../themes/advanced/docs/fr_ca/style.css | 28 + .../themes/advanced/docs/hu/about.htm | 28 + .../advanced/docs/hu/common_buttons.htm | 106 + .../docs/hu/images/insert_image_window.gif | Bin 0 -> 5486 bytes .../docs/hu/images/insert_link_window.gif | Bin 0 -> 5762 bytes .../themes/advanced/docs/hu/index.htm | 24 + .../advanced/docs/hu/insert_image_button.htm | 32 + .../advanced/docs/hu/insert_link_button.htm | 31 + .../themes/advanced/docs/hu/style.css | 28 + .../themes/advanced/docs/images/table.gif | Bin 0 -> 1018 bytes .../advanced/docs/images/table_delete_col.gif | Bin 0 -> 929 bytes .../advanced/docs/images/table_delete_row.gif | Bin 0 -> 942 bytes .../docs/images/table_insert_col_after.gif | Bin 0 -> 936 bytes .../docs/images/table_insert_col_before.gif | Bin 0 -> 935 bytes .../docs/images/table_insert_row_after.gif | Bin 0 -> 928 bytes .../docs/images/table_insert_row_before.gif | Bin 0 -> 928 bytes .../themes/advanced/docs/it/about.htm | 37 + .../advanced/docs/it/common_buttons.htm | 180 + .../docs/it/images/insert_anchor_window.gif | Bin 0 -> 5336 bytes .../docs/it/images/insert_image_window.gif | 0 .../docs/it/images/insert_link_window.gif | Bin 0 -> 5909 bytes .../docs/it/images/insert_table_window.gif | Bin 0 -> 7379 bytes .../themes/advanced/docs/it/index.htm | 30 + .../advanced/docs/it/insert_anchor_button.htm | 32 + .../advanced/docs/it/insert_image_button.htm | 66 + .../advanced/docs/it/insert_link_button.htm | 0 .../advanced/docs/it/insert_table_button.htm | 71 + .../themes/advanced/docs/it/style.css | 28 + .../themes/advanced/docs/nb/about.htm | 32 + .../advanced/docs/nb/common_buttons.htm | 163 + .../docs/nb/images/insert_anchor_window.gif | Bin 0 -> 5229 bytes .../docs/nb/images/insert_image_window.gif | Bin 0 -> 7844 bytes .../docs/nb/images/insert_link_window.gif | Bin 0 -> 5767 bytes .../docs/nb/images/insert_table_window.gif | Bin 0 -> 7099 bytes .../themes/advanced/docs/nb/index.htm | 27 + .../advanced/docs/nb/insert_anchor_button.htm | 34 + .../advanced/docs/nb/insert_image_button.htm | 71 + .../advanced/docs/nb/insert_link_button.htm | 33 + .../advanced/docs/nb/insert_table_button.htm | 72 + .../themes/advanced/docs/nb/style.css | 28 + .../themes/advanced/docs/nl/about.htm | 31 + .../advanced/docs/nl/common_buttons.htm | 188 + .../docs/nl/images/html_source_window.gif | Bin 0 -> 16012 bytes .../docs/nl/images/insert_anchor_window.gif | Bin 0 -> 4031 bytes .../docs/nl/images/insert_image_window.gif | Bin 0 -> 8363 bytes .../docs/nl/images/insert_link_window.gif | Bin 0 -> 5569 bytes .../docs/nl/images/insert_specchar_window.gif | Bin 0 -> 10407 bytes .../docs/nl/images/insert_table_window.gif | Bin 0 -> 7337 bytes .../themes/advanced/docs/nl/index.htm | 27 + .../advanced/docs/nl/insert_anchor_button.htm | 37 + .../advanced/docs/nl/insert_image_button.htm | 65 + .../advanced/docs/nl/insert_link_button.htm | 35 + .../docs/nl/insert_specchar_button.htm | 32 + .../advanced/docs/nl/insert_table_button.htm | 73 + .../themes/advanced/docs/nl/style.css | 28 + .../themes/advanced/docs/nn/about.htm | 32 + .../advanced/docs/nn/common_buttons.htm | 163 + .../docs/nn/images/html_source_window.gif | Bin 0 -> 16012 bytes .../docs/nn/images/insert_anchor_window.gif | Bin 0 -> 5229 bytes .../docs/nn/images/insert_image_window.gif | Bin 0 -> 7844 bytes .../docs/nn/images/insert_link_window.gif | Bin 0 -> 5767 bytes .../docs/nn/images/insert_specchar_window.gif | Bin 0 -> 10407 bytes .../docs/nn/images/insert_table_window.gif | Bin 0 -> 7099 bytes .../themes/advanced/docs/nn/index.htm | 27 + .../advanced/docs/nn/insert_anchor_button.htm | 34 + .../advanced/docs/nn/insert_image_button.htm | 71 + .../advanced/docs/nn/insert_link_button.htm | 33 + .../advanced/docs/nn/insert_table_button.htm | 72 + .../themes/advanced/docs/nn/style.css | 28 + .../themes/advanced/docs/pl/about.htm | 33 + .../advanced/docs/pl/common_buttons.htm | 164 + .../docs/pl/images/insert_anchor_window.gif | Bin 0 -> 5401 bytes .../docs/pl/images/insert_image_window.gif | Bin 0 -> 7532 bytes .../docs/pl/images/insert_link_window.gif | Bin 0 -> 5781 bytes .../docs/pl/images/insert_table_window.gif | Bin 0 -> 7418 bytes .../themes/advanced/docs/pl/index.htm | 28 + .../advanced/docs/pl/insert_anchor_button.htm | 33 + .../advanced/docs/pl/insert_image_button.htm | 65 + .../advanced/docs/pl/insert_link_button.htm | 35 + .../advanced/docs/pl/insert_table_button.htm | 73 + .../themes/advanced/docs/pl/style.css | 28 + .../themes/advanced/docs/sk/about.htm | 32 + .../advanced/docs/sk/common_buttons.htm | 170 + .../docs/sk/images/insert_image_window.png | Bin 0 -> 4799 bytes .../docs/sk/images/insert_link_window.png | Bin 0 -> 3833 bytes .../docs/sk/images/insert_table_window.png | Bin 0 -> 4620 bytes .../themes/advanced/docs/sk/index.htm | 26 + .../advanced/docs/sk/insert_image_button.htm | 66 + .../advanced/docs/sk/insert_link_button.htm | 34 + .../advanced/docs/sk/insert_table_button.htm | 68 + .../themes/advanced/docs/sk/style.css | 28 + .../themes/advanced/docs/sv/about.htm | 32 + .../advanced/docs/sv/common_buttons.htm | 163 + .../docs/sv/images/insert_anchor_window.gif | Bin 0 -> 5229 bytes .../docs/sv/images/insert_image_window.gif | Bin 0 -> 7844 bytes .../docs/sv/images/insert_link_window.gif | Bin 0 -> 5767 bytes .../docs/sv/images/insert_table_window.gif | Bin 0 -> 7099 bytes .../themes/advanced/docs/sv/index.htm | 27 + .../advanced/docs/sv/insert_anchor_button.htm | 34 + .../advanced/docs/sv/insert_image_button.htm | 71 + .../advanced/docs/sv/insert_link_button.htm | 33 + .../advanced/docs/sv/insert_table_button.htm | 72 + .../themes/advanced/docs/sv/style.css | 28 + .../themes/advanced/docs/zh_cn/about.htm | 29 + .../advanced/docs/zh_cn/common_buttons.htm | 160 + .../zh_cn/images/insert_anchor_window.gif | Bin 0 -> 7560 bytes .../docs/zh_cn/images/insert_image_window.gif | Bin 0 -> 7560 bytes .../docs/zh_cn/images/insert_link_window.gif | Bin 0 -> 6300 bytes .../docs/zh_cn/images/insert_table_window.gif | Bin 0 -> 19062 bytes .../themes/advanced/docs/zh_cn/index.htm | 27 + .../docs/zh_cn/insert_anchor_button.htm | 31 + .../docs/zh_cn/insert_image_button.htm | 63 + .../docs/zh_cn/insert_link_button.htm | 32 + .../docs/zh_cn/insert_table_button.htm | 71 + .../themes/advanced/docs/zh_cn/style.css | 28 + .../themes/advanced/editor_template.js | 12 + .../themes/advanced/editor_template_src.js | 1208 ++++ includes/tiny_mce/themes/advanced/image.htm | 91 + .../themes/advanced/images/anchor.gif | Bin 0 -> 171 bytes .../themes/advanced/images/anchor_symbol.gif | Bin 0 -> 70 bytes .../themes/advanced/images/backcolor.gif | Bin 0 -> 174 bytes .../tiny_mce/themes/advanced/images/bold.gif | Bin 0 -> 76 bytes .../themes/advanced/images/bold_de_se.gif | Bin 0 -> 73 bytes .../themes/advanced/images/bold_es.gif | Bin 0 -> 80 bytes .../themes/advanced/images/bold_fr.gif | Bin 0 -> 78 bytes .../themes/advanced/images/bold_ru.gif | Bin 0 -> 77 bytes .../themes/advanced/images/bold_tw.gif | Bin 0 -> 207 bytes .../themes/advanced/images/browse.gif | Bin 0 -> 113 bytes .../themes/advanced/images/bullist.gif | Bin 0 -> 108 bytes .../themes/advanced/images/buttons.gif | Bin 0 -> 3286 bytes .../advanced/images/cancel_button_bg.gif | Bin 0 -> 677 bytes .../themes/advanced/images/charmap.gif | Bin 0 -> 245 bytes .../themes/advanced/images/cleanup.gif | Bin 0 -> 256 bytes .../tiny_mce/themes/advanced/images/close.gif | Bin 0 -> 102 bytes .../tiny_mce/themes/advanced/images/code.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/color.gif | Bin 0 -> 125 bytes .../tiny_mce/themes/advanced/images/copy.gif | Bin 0 -> 263 bytes .../themes/advanced/images/custom_1.gif | Bin 0 -> 76 bytes .../tiny_mce/themes/advanced/images/cut.gif | Bin 0 -> 187 bytes .../themes/advanced/images/forecolor.gif | Bin 0 -> 272 bytes .../tiny_mce/themes/advanced/images/help.gif | Bin 0 -> 295 bytes .../tiny_mce/themes/advanced/images/hr.gif | Bin 0 -> 63 bytes .../tiny_mce/themes/advanced/images/image.gif | Bin 0 -> 194 bytes .../themes/advanced/images/indent.gif | Bin 0 -> 112 bytes .../advanced/images/insert_button_bg.gif | Bin 0 -> 703 bytes .../themes/advanced/images/italic.gif | Bin 0 -> 79 bytes .../themes/advanced/images/italic_de_se.gif | Bin 0 -> 75 bytes .../themes/advanced/images/italic_es.gif | Bin 0 -> 74 bytes .../themes/advanced/images/italic_ru.gif | Bin 0 -> 78 bytes .../themes/advanced/images/italic_tw.gif | Bin 0 -> 274 bytes .../themes/advanced/images/justifycenter.gif | Bin 0 -> 70 bytes .../themes/advanced/images/justifyfull.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyleft.gif | Bin 0 -> 71 bytes .../themes/advanced/images/justifyright.gif | Bin 0 -> 70 bytes .../tiny_mce/themes/advanced/images/link.gif | Bin 0 -> 175 bytes .../themes/advanced/images/newdocument.gif | Bin 0 -> 170 bytes .../themes/advanced/images/numlist.gif | Bin 0 -> 111 bytes .../themes/advanced/images/opacity.png | Bin 0 -> 147 bytes .../themes/advanced/images/outdent.gif | Bin 0 -> 110 bytes .../tiny_mce/themes/advanced/images/paste.gif | Bin 0 -> 286 bytes .../tiny_mce/themes/advanced/images/redo.gif | Bin 0 -> 169 bytes .../themes/advanced/images/removeformat.gif | Bin 0 -> 168 bytes .../themes/advanced/images/spacer.gif | Bin 0 -> 43 bytes .../advanced/images/statusbar_resize.gif | Bin 0 -> 79 bytes .../themes/advanced/images/strikethrough.gif | Bin 0 -> 83 bytes .../tiny_mce/themes/advanced/images/sub.gif | Bin 0 -> 148 bytes .../tiny_mce/themes/advanced/images/sup.gif | Bin 0 -> 147 bytes .../tiny_mce/themes/advanced/images/table.gif | Bin 0 -> 287 bytes .../advanced/images/table_delete_col.gif | Bin 0 -> 163 bytes .../advanced/images/table_delete_row.gif | Bin 0 -> 171 bytes .../images/table_insert_col_after.gif | Bin 0 -> 165 bytes .../images/table_insert_col_before.gif | Bin 0 -> 165 bytes .../images/table_insert_row_after.gif | Bin 0 -> 163 bytes .../images/table_insert_row_before.gif | Bin 0 -> 159 bytes .../themes/advanced/images/underline.gif | Bin 0 -> 88 bytes .../themes/advanced/images/underline_es.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_fr.gif | Bin 0 -> 79 bytes .../themes/advanced/images/underline_ru.gif | Bin 0 -> 77 bytes .../themes/advanced/images/underline_tw.gif | Bin 0 -> 245 bytes .../tiny_mce/themes/advanced/images/undo.gif | Bin 0 -> 175 bytes .../themes/advanced/images/unlink.gif | Bin 0 -> 190 bytes .../themes/advanced/images/visualaid.gif | Bin 0 -> 206 bytes .../themes/advanced/images/xp/tab_bg.gif | Bin 0 -> 694 bytes .../themes/advanced/images/xp/tab_end.gif | Bin 0 -> 169 bytes .../themes/advanced/images/xp/tab_sel_bg.gif | Bin 0 -> 428 bytes .../themes/advanced/images/xp/tab_sel_end.gif | Bin 0 -> 101 bytes .../themes/advanced/images/xp/tabs_bg.gif | Bin 0 -> 48 bytes .../themes/advanced/jscripts/about.js | 74 + .../themes/advanced/jscripts/anchor.js | 59 + .../themes/advanced/jscripts/charmap.js | 324 + .../themes/advanced/jscripts/color_picker.js | 107 + .../themes/advanced/jscripts/image.js | 81 + .../tiny_mce/themes/advanced/jscripts/link.js | 69 + .../themes/advanced/jscripts/source_editor.js | 53 + includes/tiny_mce/themes/advanced/langs/ar.js | 63 + includes/tiny_mce/themes/advanced/langs/ca.js | 0 includes/tiny_mce/themes/advanced/langs/cs.js | 70 + includes/tiny_mce/themes/advanced/langs/cy.js | 76 + includes/tiny_mce/themes/advanced/langs/da.js | 75 + includes/tiny_mce/themes/advanced/langs/de.js | 76 + includes/tiny_mce/themes/advanced/langs/el.js | 64 + includes/tiny_mce/themes/advanced/langs/en.js | 76 + includes/tiny_mce/themes/advanced/langs/es.js | 101 + includes/tiny_mce/themes/advanced/langs/fa.js | 65 + includes/tiny_mce/themes/advanced/langs/fi.js | 0 includes/tiny_mce/themes/advanced/langs/fr.js | 78 + .../tiny_mce/themes/advanced/langs/fr_ca.js | 64 + includes/tiny_mce/themes/advanced/langs/he.js | 76 + includes/tiny_mce/themes/advanced/langs/hu.js | 75 + includes/tiny_mce/themes/advanced/langs/is.js | 76 + includes/tiny_mce/themes/advanced/langs/it.js | 64 + includes/tiny_mce/themes/advanced/langs/ja.js | 62 + includes/tiny_mce/themes/advanced/langs/ko.js | 65 + includes/tiny_mce/themes/advanced/langs/nb.js | 77 + includes/tiny_mce/themes/advanced/langs/nl.js | 76 + includes/tiny_mce/themes/advanced/langs/nn.js | 77 + includes/tiny_mce/themes/advanced/langs/pl.js | 79 + includes/tiny_mce/themes/advanced/langs/pt.js | 65 + .../tiny_mce/themes/advanced/langs/pt_br.js | 115 + .../tiny_mce/themes/advanced/langs/readme.txt | 4 + includes/tiny_mce/themes/advanced/langs/ru.js | 76 + .../themes/advanced/langs/ru_KOI8-R.js | 76 + .../themes/advanced/langs/ru_UTF-8.js | 76 + includes/tiny_mce/themes/advanced/langs/sk.js | 72 + includes/tiny_mce/themes/advanced/langs/sv.js | 77 + includes/tiny_mce/themes/advanced/langs/tw.js | 91 + .../tiny_mce/themes/advanced/langs/zh_cn.js | 76 + .../tiny_mce/themes/advanced/langs/zh_tw.js | 78 + .../themes/advanced/langs/zh_tw_utf8.js | 78 + includes/tiny_mce/themes/advanced/link.htm | 92 + .../themes/advanced/source_editor.htm | 30 + .../themes/simple/css/editor_content.css | 27 + .../themes/simple/css/editor_popup.css | 41 + .../tiny_mce/themes/simple/css/editor_ui.css | 92 + .../tiny_mce/themes/simple/editor_template.js | 20 + .../themes/simple/editor_template_src.js | 70 + .../tiny_mce/themes/simple/images/bold.gif | Bin 0 -> 76 bytes .../themes/simple/images/bold_de_se.gif | Bin 0 -> 73 bytes .../tiny_mce/themes/simple/images/bold_fr.gif | Bin 0 -> 78 bytes .../tiny_mce/themes/simple/images/bold_ru.gif | Bin 0 -> 77 bytes .../tiny_mce/themes/simple/images/bold_tw.gif | Bin 0 -> 207 bytes .../tiny_mce/themes/simple/images/bullist.gif | Bin 0 -> 108 bytes .../tiny_mce/themes/simple/images/cleanup.gif | Bin 0 -> 256 bytes .../tiny_mce/themes/simple/images/italic.gif | Bin 0 -> 79 bytes .../themes/simple/images/italic_de_se.gif | Bin 0 -> 75 bytes .../themes/simple/images/italic_ru.gif | Bin 0 -> 78 bytes .../themes/simple/images/italic_tw.gif | Bin 0 -> 274 bytes .../tiny_mce/themes/simple/images/numlist.gif | Bin 0 -> 111 bytes .../tiny_mce/themes/simple/images/redo.gif | Bin 0 -> 169 bytes .../tiny_mce/themes/simple/images/spacer.gif | Bin 0 -> 43 bytes .../themes/simple/images/strikethrough.gif | Bin 0 -> 83 bytes .../themes/simple/images/underline.gif | Bin 0 -> 88 bytes .../themes/simple/images/underline_fr.gif | Bin 0 -> 79 bytes .../themes/simple/images/underline_ru.gif | Bin 0 -> 77 bytes .../themes/simple/images/underline_tw.gif | Bin 0 -> 245 bytes .../tiny_mce/themes/simple/images/undo.gif | Bin 0 -> 175 bytes includes/tiny_mce/tiny_mce.js | 3 + includes/tiny_mce/tiny_mce_popup.js | 253 + includes/tiny_mce/tiny_mce_src.js | 6077 +++++++++++++++++ includes/tiny_mce/utils/form_utils.js | 203 + includes/tiny_mce/utils/mctabs.js | 76 + includes/tiny_mce/utils/validate.js | 50 + includes/zXml/distrib/zxml.js | 2 + includes/zXml/doc/index.htm | 91 + includes/zXml/doc/zXMLSerializer.htm | 109 + includes/zXml/doc/zXPath.htm | 169 + includes/zXml/doc/zXml.htm | 168 + includes/zXml/doc/zXmlDom.htm | 108 + includes/zXml/doc/zXmlHttp.htm | 108 + includes/zXml/doc/zXslt.htm | 112 + includes/zXml/examples/Examples to come.txt | 1 + includes/zXml/src/test.htm | 14 + includes/zXml/src/zxml.src.js | 453 ++ includes/zXml/zxml.js | 2 + inside/Action.php | 138 + inside/ActionGroupRelationship.php | 94 + inside/ActionGroupRelationships.php | 88 + inside/ActionParser.php | 1205 ++++ inside/Actions.php | 56 + inside/Article.php | 270 + inside/Articles.php | 49 + inside/BarShift.php | 442 ++ inside/BarShiftWorker.php | 101 + inside/BarShiftWorkers.php | 120 + inside/BarShifts.php | 65 + inside/BugReport.php | 219 + inside/BugReports.php | 58 + inside/Calendar.php | 210 + inside/Categories.php | 35 + inside/Concert.php | 646 ++ inside/ConcertCategories.php | 24 + inside/ConcertReport.php | 156 + inside/Concerts.php | 136 + inside/Division.php | 229 + inside/DivisionCategories.php | 42 + inside/Divisions.php | 113 + inside/Document.php | 144 + inside/DocumentCategories.php | 48 + inside/DocumentCategory.php | 125 + inside/Documents.php | 149 + inside/Errors.php | 39 + inside/Event.php | 388 ++ inside/EventCategories.php | 42 + inside/EventCategory.php | 125 + inside/EventComment.php | 153 + inside/EventComments.php | 29 + inside/Events.php | 66 + inside/Form.php | 613 ++ inside/Group.php | 187 + inside/Groups.php | 75 + inside/Job.php | 303 + inside/JobCategories.php | 47 + inside/JobCategory.php | 125 + inside/Jobs.php | 74 + inside/Locations.php | 43 + inside/Messages.php | 37 + inside/Navigation.php | 282 + inside/Nordea.php | 156 + inside/Order.php | 316 + inside/OrderItem.php | 197 + inside/OrderStatuses.php | 27 + inside/Page.php | 3094 +++++++++ inside/Payment.php | 138 + inside/Payment_backup.php | 111 + inside/PlacesOfStudy.php | 68 + inside/Position.php | 177 + inside/Positions.php | 81 + inside/Product.php | 337 + inside/Products.php | 102 + inside/ProgramSelection.php | 148 + inside/ProgramsSelection.php | 61 + inside/Transaction.php | 156 + inside/User.php | 1437 ++++ inside/UserGroupRelationship.php | 163 + inside/UserGroupRelationships.php | 79 + inside/Users.php | 557 ++ inside/WeekProgram.php | 149 + inside/WeekPrograms.php | 98 + inside/XMLCatRequest.js | 80 + inside/XMLRequest.js | 46 + inside/XMLUsernameRequest.js | 42 + inside/XMLZipRequest.js | 47 + inside/ajax.js | 213 + inside/ajax.php | 117 + inside/checkZip.php | 28 + inside/credentials-sample.php | 27 + inside/file.php | 59 + inside/finder.js | 117 + inside/functions.js | 358 + inside/functions.php | 1532 +++++ inside/getconcertinfo.php | 29 + inside/grantcardno.php | 16 + inside/graphics/bar.png | Bin 0 -> 185 bytes inside/graphics/call_to.png | Bin 0 -> 788 bytes inside/graphics/cross.png | Bin 0 -> 655 bytes inside/graphics/delete.png | Bin 0 -> 901 bytes inside/graphics/delete_small.png | Bin 0 -> 601 bytes inside/graphics/edit.png | Bin 0 -> 984 bytes inside/graphics/minus.png | Bin 0 -> 174 bytes inside/graphics/payex.png | Bin 0 -> 1620 bytes inside/graphics/plus.png | Bin 0 -> 177 bytes inside/graphics/star.png | Bin 0 -> 269 bytes inside/graphics/tick.png | Bin 0 -> 537 bytes inside/graphics/user_go.png | Bin 0 -> 915 bytes inside/handheld.css | 526 ++ inside/imageResize.php | 116 + inside/images/products/1.jpg | Bin 0 -> 24244 bytes inside/images/products/10.jpg | Bin 0 -> 4436 bytes inside/images/products/11jpeg | Bin 0 -> 4999 bytes inside/images/products/13jpeg | Bin 0 -> 4923 bytes inside/images/products/14.jpg | Bin 0 -> 41064 bytes inside/images/products/16.png | Bin 0 -> 5767 bytes inside/images/products/17.png | Bin 0 -> 5767 bytes inside/images/products/4.gif | Bin 0 -> 32551 bytes inside/images/products/4.jpg | Bin 0 -> 13939 bytes inside/images/products/5.gif | Bin 0 -> 7386 bytes inside/images/products/5.jpg | Bin 0 -> 12642 bytes inside/images/products/6.jpg | Bin 0 -> 15238 bytes inside/images/products/7.jpg | Bin 0 -> 17026 bytes inside/images/products/8.jpg | Bin 0 -> 41064 bytes inside/images/products/9.gif | Bin 0 -> 32551 bytes inside/includes.php | 231 + inside/index.php | 13 + inside/info.php | 3 + inside/language.php | 61 + inside/language/en/common.php | 11 + inside/language/en/iso.txt | 3 + inside/language/en/member.php | 14 + inside/language/nb/common.php | 11 + inside/language/nb/iso.txt | 3 + inside/language/nb/member.php | 14 + inside/linker.php | 13 + inside/menuExpandable3.js | 39 + inside/pos.php | 25 + inside/print.css | 403 ++ inside/print_prog.css | 7 + inside/programutvalg.php | 79 + inside/programutvalgtekst.php | 55 + inside/screen.css | 700 ++ inside/sethascard.php | 18 + inside/setorderdelivery.php | 28 + inside/setweekprogramtext.php | 18 + inside/showCodes.php | 6 + inside/sorttable.js | 194 + inside/test.php | 8 + inside/ukesprogram.php | 424 ++ inside/ukesprogramprint.php | 61 + inside/ukesprogramtekst.php | 51 + inside/ukesprogramuniversitas.php | 197 + inside/updatelaststicker.php | 12 + inside/updateuserexpiry.php | 12 + 1198 files changed, 89467 insertions(+) create mode 100644 .bzrignore create mode 100644 includes/DB.php create mode 100644 includes/DB/common.php create mode 100644 includes/DB/dbase.php create mode 100644 includes/DB/fbsql.php create mode 100644 includes/DB/ibase.php create mode 100644 includes/DB/ifx.php create mode 100644 includes/DB/msql.php create mode 100644 includes/DB/mssql.php create mode 100644 includes/DB/mysql.php create mode 100644 includes/DB/mysqli.php create mode 100644 includes/DB/oci8.php create mode 100644 includes/DB/odbc.php create mode 100644 includes/DB/pgsql.php create mode 100644 includes/DB/sqlite.php create mode 100644 includes/DB/storage.php create mode 100644 includes/DB/sybase.php create mode 100644 includes/PEAR.php create mode 100644 includes/PEAR/Autoloader.php create mode 100644 includes/PEAR/Builder.php create mode 100644 includes/PEAR/Command.php create mode 100644 includes/PEAR/Command/Auth.php create mode 100644 includes/PEAR/Command/Build.php create mode 100644 includes/PEAR/Command/Common.php create mode 100644 includes/PEAR/Command/Config.php create mode 100644 includes/PEAR/Command/Install.php create mode 100644 includes/PEAR/Command/Mirror.php create mode 100644 includes/PEAR/Command/Package.php create mode 100644 includes/PEAR/Command/Registry.php create mode 100644 includes/PEAR/Command/Remote.php create mode 100644 includes/PEAR/Common.php create mode 100644 includes/PEAR/Config.php create mode 100644 includes/PEAR/Dependency.php create mode 100644 includes/PEAR/Downloader.php create mode 100644 includes/PEAR/ErrorStack.php create mode 100644 includes/PEAR/Exception.php create mode 100644 includes/PEAR/Frontend/CLI.php create mode 100644 includes/PEAR/Installer.php create mode 100644 includes/PEAR/Packager.php create mode 100644 includes/PEAR/Registry.php create mode 100644 includes/PEAR/Remote.php create mode 100644 includes/PEAR/RunTest.php create mode 100644 includes/tiny_mce/blank.htm create mode 100644 includes/tiny_mce/langs/ar.js create mode 100644 includes/tiny_mce/langs/ca.js create mode 100644 includes/tiny_mce/langs/cs.js create mode 100644 includes/tiny_mce/langs/cy.js create mode 100644 includes/tiny_mce/langs/da.js create mode 100644 includes/tiny_mce/langs/de.js create mode 100644 includes/tiny_mce/langs/el.js create mode 100644 includes/tiny_mce/langs/en.js create mode 100644 includes/tiny_mce/langs/es.js create mode 100644 includes/tiny_mce/langs/fa.js create mode 100644 includes/tiny_mce/langs/fi.js create mode 100644 includes/tiny_mce/langs/fr.js create mode 100644 includes/tiny_mce/langs/fr_ca.js create mode 100644 includes/tiny_mce/langs/he.js create mode 100644 includes/tiny_mce/langs/hu.js create mode 100644 includes/tiny_mce/langs/is.js create mode 100644 includes/tiny_mce/langs/it.js create mode 100644 includes/tiny_mce/langs/ja.js create mode 100644 includes/tiny_mce/langs/ko.js create mode 100644 includes/tiny_mce/langs/nb.js create mode 100644 includes/tiny_mce/langs/nl.js create mode 100644 includes/tiny_mce/langs/nn.js create mode 100644 includes/tiny_mce/langs/pl.js create mode 100644 includes/tiny_mce/langs/pt.js create mode 100644 includes/tiny_mce/langs/pt_br.js create mode 100644 includes/tiny_mce/langs/readme.txt create mode 100644 includes/tiny_mce/langs/ru.js create mode 100644 includes/tiny_mce/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/langs/sk.js create mode 100644 includes/tiny_mce/langs/sv.js create mode 100644 includes/tiny_mce/langs/th.js create mode 100644 includes/tiny_mce/langs/zh_cn.js create mode 100644 includes/tiny_mce/langs/zh_tw.js create mode 100644 includes/tiny_mce/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/license.txt create mode 100644 includes/tiny_mce/plugins/_template/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/_template/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/_template/images/template.gif create mode 100644 includes/tiny_mce/plugins/_template/langs/da.js create mode 100644 includes/tiny_mce/plugins/_template/langs/de.js create mode 100644 includes/tiny_mce/plugins/_template/langs/en.js create mode 100644 includes/tiny_mce/plugins/_template/langs/es.js create mode 100644 includes/tiny_mce/plugins/_template/langs/fr.js create mode 100644 includes/tiny_mce/plugins/_template/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/_template/langs/he.js create mode 100644 includes/tiny_mce/plugins/_template/langs/hu.js create mode 100644 includes/tiny_mce/plugins/_template/langs/is.js create mode 100644 includes/tiny_mce/plugins/_template/langs/nb.js create mode 100644 includes/tiny_mce/plugins/_template/langs/nl.js create mode 100644 includes/tiny_mce/plugins/_template/langs/nn.js create mode 100644 includes/tiny_mce/plugins/_template/langs/pl.js create mode 100644 includes/tiny_mce/plugins/_template/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/_template/langs/ru.js create mode 100644 includes/tiny_mce/plugins/_template/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/_template/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/_template/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/_template/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/_template/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/_template/popup.htm create mode 100644 includes/tiny_mce/plugins/_template/readme.txt create mode 100644 includes/tiny_mce/plugins/advhr/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/advhr/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/advhr/images/advhr.gif create mode 100644 includes/tiny_mce/plugins/advhr/jscripts/rule.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/cs.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/cy.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/da.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/de.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/en.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/es.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/fa.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/fi.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/fr.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/he.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/hu.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/is.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/nb.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/nl.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/nn.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/pl.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/ru.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/sk.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/sv.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/advhr/readme.txt create mode 100644 includes/tiny_mce/plugins/advhr/rule.htm create mode 100644 includes/tiny_mce/plugins/advimage/css/advimage.css create mode 100644 includes/tiny_mce/plugins/advimage/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/advimage/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/advimage/image.htm create mode 100644 includes/tiny_mce/plugins/advimage/images/sample.gif create mode 100644 includes/tiny_mce/plugins/advimage/jscripts/functions.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/cs.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/cy.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/da.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/de.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/en.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/es.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/fa.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/fa_ca.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/fr.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/he.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/hu.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/is.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/ko.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/nb.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/nl.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/nn.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/pl.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/ru.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/sk.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/sv.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/advimage/readme.txt create mode 100644 includes/tiny_mce/plugins/advlink/css/advlink.css create mode 100644 includes/tiny_mce/plugins/advlink/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/advlink/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/advlink/jscripts/functions.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/cs.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/cy.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/da.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/de.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/en.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/es.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/fa.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/fr.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/he.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/hu.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/is.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/ko.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/nb.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/nl.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/nn.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/pl.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/ru.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/sk.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/sv.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/advlink/link.htm create mode 100644 includes/tiny_mce/plugins/advlink/readme.txt create mode 100644 includes/tiny_mce/plugins/autosave/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/autosave/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/cs.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/cy.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/da.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/de.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/en.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/es.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/fr.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/he.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/hu.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/is.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/nb.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/nl.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/nn.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/pl.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/ru.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/sk.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/sv.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/autosave/readme.txt create mode 100644 includes/tiny_mce/plugins/contextmenu/css/contextmenu.css create mode 100644 includes/tiny_mce/plugins/contextmenu/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/contextmenu/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/contextmenu/images/spacer.gif create mode 100644 includes/tiny_mce/plugins/contextmenu/readme.txt create mode 100644 includes/tiny_mce/plugins/directionality/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/directionality/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/directionality/images/ltr.gif create mode 100644 includes/tiny_mce/plugins/directionality/images/rtl.gif create mode 100644 includes/tiny_mce/plugins/directionality/langs/cs.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/cy.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/da.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/de.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/en.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/es.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/fr.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/he.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/hu.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/is.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/nb.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/nl.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/nn.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/pl.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/ru.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/sk.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/sv.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/directionality/readme.txt create mode 100644 includes/tiny_mce/plugins/emotions/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/emotions/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/emotions/emotions.htm create mode 100644 includes/tiny_mce/plugins/emotions/images/emotions.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/readme.txt create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-cool.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-cry.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-embarassed.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-frown.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-innocent.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-kiss.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-laughing.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-sealed.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-smile.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-surprised.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-undecided.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-wink.gif create mode 100644 includes/tiny_mce/plugins/emotions/images/smiley-yell.gif create mode 100644 includes/tiny_mce/plugins/emotions/jscripts/functions.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/cs.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/cy.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/da.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/de.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/el.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/en.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/es.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/fa.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/fr.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/he.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/hu.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/is.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/it.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/ko.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/nb.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/nl.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/nn.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/pl.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/ru.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/sk.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/sv.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/emotions/readme.txt create mode 100644 includes/tiny_mce/plugins/flash/css/content.css create mode 100644 includes/tiny_mce/plugins/flash/css/flash.css create mode 100644 includes/tiny_mce/plugins/flash/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/flash/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/flash/flash.htm create mode 100644 includes/tiny_mce/plugins/flash/images/flash.gif create mode 100644 includes/tiny_mce/plugins/flash/jscripts/flash.js create mode 100644 includes/tiny_mce/plugins/flash/langs/cs.js create mode 100644 includes/tiny_mce/plugins/flash/langs/cy.js create mode 100644 includes/tiny_mce/plugins/flash/langs/da.js create mode 100644 includes/tiny_mce/plugins/flash/langs/de.js create mode 100644 includes/tiny_mce/plugins/flash/langs/en.js create mode 100644 includes/tiny_mce/plugins/flash/langs/es.js create mode 100644 includes/tiny_mce/plugins/flash/langs/fa.js create mode 100644 includes/tiny_mce/plugins/flash/langs/fr.js create mode 100644 includes/tiny_mce/plugins/flash/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/flash/langs/he.js create mode 100644 includes/tiny_mce/plugins/flash/langs/hu.js create mode 100644 includes/tiny_mce/plugins/flash/langs/is.js create mode 100644 includes/tiny_mce/plugins/flash/langs/nb.js create mode 100644 includes/tiny_mce/plugins/flash/langs/nl.js create mode 100644 includes/tiny_mce/plugins/flash/langs/nn.js create mode 100644 includes/tiny_mce/plugins/flash/langs/pl.js create mode 100644 includes/tiny_mce/plugins/flash/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/flash/langs/ru.js create mode 100644 includes/tiny_mce/plugins/flash/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/flash/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/flash/langs/sk.js create mode 100644 includes/tiny_mce/plugins/flash/langs/sv.js create mode 100644 includes/tiny_mce/plugins/flash/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/flash/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/flash/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/flash/readme.txt create mode 100644 includes/tiny_mce/plugins/fullscreen/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/fullscreen/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/fullscreen/fullscreen.htm create mode 100644 includes/tiny_mce/plugins/fullscreen/images/fullscreen.gif create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/cs.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/cy.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/da.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/de.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/en.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/es.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/fr.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/he.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/hu.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/is.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/nb.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/nl.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/nn.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/pl.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/ru.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/sk.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/sv.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/fullscreen/readme.txt create mode 100644 includes/tiny_mce/plugins/iespell/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/iespell/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/iespell/images/iespell.gif create mode 100644 includes/tiny_mce/plugins/iespell/langs/cs.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/cy.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/da.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/de.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/el.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/en.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/es.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/fr.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/he.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/hu.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/is.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/it.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/ko.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/nb.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/nl.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/nn.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/pl.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/ru.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/sk.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/sv.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/iespell/readme.txt create mode 100644 includes/tiny_mce/plugins/inlinepopups/css/inlinepopup.css create mode 100644 includes/tiny_mce/plugins/inlinepopups/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/inlinepopups/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/inlinepopups/images/spacer.gif create mode 100644 includes/tiny_mce/plugins/inlinepopups/images/window_close.gif create mode 100644 includes/tiny_mce/plugins/inlinepopups/images/window_maximize.gif create mode 100644 includes/tiny_mce/plugins/inlinepopups/images/window_minimize.gif create mode 100644 includes/tiny_mce/plugins/inlinepopups/images/window_resize.gif create mode 100644 includes/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js create mode 100644 includes/tiny_mce/plugins/inlinepopups/readme.txt create mode 100644 includes/tiny_mce/plugins/insertdatetime/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/images/insertdate.gif create mode 100644 includes/tiny_mce/plugins/insertdatetime/images/inserttime.gif create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/cs.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/cy.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/da.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/de.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/el.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/en.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/es.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/fa.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/fi.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/fr.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/he.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/hu.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/is.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/it.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/ko.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/nb.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/nl.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/nn.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/pl.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/ru.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/sk.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/sv.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/insertdatetime/readme.txt create mode 100644 includes/tiny_mce/plugins/noneditable/css/noneditable.css create mode 100644 includes/tiny_mce/plugins/noneditable/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/noneditable/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/noneditable/readme.txt create mode 100644 includes/tiny_mce/plugins/paste/blank.htm create mode 100644 includes/tiny_mce/plugins/paste/css/blank.css create mode 100644 includes/tiny_mce/plugins/paste/css/pasteword.css create mode 100644 includes/tiny_mce/plugins/paste/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/paste/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/paste/images/pastetext.gif create mode 100644 includes/tiny_mce/plugins/paste/images/pasteword.gif create mode 100644 includes/tiny_mce/plugins/paste/images/selectall.gif create mode 100644 includes/tiny_mce/plugins/paste/jscripts/pastetext.js create mode 100644 includes/tiny_mce/plugins/paste/jscripts/pasteword.js create mode 100644 includes/tiny_mce/plugins/paste/langs/cs.js create mode 100644 includes/tiny_mce/plugins/paste/langs/cy.js create mode 100644 includes/tiny_mce/plugins/paste/langs/da.js create mode 100644 includes/tiny_mce/plugins/paste/langs/de.js create mode 100644 includes/tiny_mce/plugins/paste/langs/en.js create mode 100644 includes/tiny_mce/plugins/paste/langs/es.js create mode 100644 includes/tiny_mce/plugins/paste/langs/fi.js create mode 100644 includes/tiny_mce/plugins/paste/langs/fr.js create mode 100644 includes/tiny_mce/plugins/paste/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/paste/langs/he.js create mode 100644 includes/tiny_mce/plugins/paste/langs/hu.js create mode 100644 includes/tiny_mce/plugins/paste/langs/is.js create mode 100644 includes/tiny_mce/plugins/paste/langs/nb.js create mode 100644 includes/tiny_mce/plugins/paste/langs/nl.js create mode 100644 includes/tiny_mce/plugins/paste/langs/nn.js create mode 100644 includes/tiny_mce/plugins/paste/langs/pl.js create mode 100644 includes/tiny_mce/plugins/paste/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/paste/langs/ru.js create mode 100644 includes/tiny_mce/plugins/paste/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/paste/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/paste/langs/sk.js create mode 100644 includes/tiny_mce/plugins/paste/langs/sv.js create mode 100644 includes/tiny_mce/plugins/paste/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/paste/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/paste/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/paste/pastetext.htm create mode 100644 includes/tiny_mce/plugins/paste/pasteword.htm create mode 100644 includes/tiny_mce/plugins/paste/readme.txt create mode 100644 includes/tiny_mce/plugins/preview/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/preview/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/preview/example.html create mode 100644 includes/tiny_mce/plugins/preview/images/preview.gif create mode 100644 includes/tiny_mce/plugins/preview/langs/cs.js create mode 100644 includes/tiny_mce/plugins/preview/langs/cy.js create mode 100644 includes/tiny_mce/plugins/preview/langs/da.js create mode 100644 includes/tiny_mce/plugins/preview/langs/de.js create mode 100644 includes/tiny_mce/plugins/preview/langs/el.js create mode 100644 includes/tiny_mce/plugins/preview/langs/en.js create mode 100644 includes/tiny_mce/plugins/preview/langs/es.js create mode 100644 includes/tiny_mce/plugins/preview/langs/fa.js create mode 100644 includes/tiny_mce/plugins/preview/langs/fr.js create mode 100644 includes/tiny_mce/plugins/preview/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/preview/langs/he.js create mode 100644 includes/tiny_mce/plugins/preview/langs/hu.js create mode 100644 includes/tiny_mce/plugins/preview/langs/is.js create mode 100644 includes/tiny_mce/plugins/preview/langs/it.js create mode 100644 includes/tiny_mce/plugins/preview/langs/ko.js create mode 100644 includes/tiny_mce/plugins/preview/langs/nb.js create mode 100644 includes/tiny_mce/plugins/preview/langs/nl.js create mode 100644 includes/tiny_mce/plugins/preview/langs/nn.js create mode 100644 includes/tiny_mce/plugins/preview/langs/pl.js create mode 100644 includes/tiny_mce/plugins/preview/langs/pt.js create mode 100644 includes/tiny_mce/plugins/preview/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/preview/langs/ru.js create mode 100644 includes/tiny_mce/plugins/preview/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/preview/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/preview/langs/sk.js create mode 100644 includes/tiny_mce/plugins/preview/langs/sv.js create mode 100644 includes/tiny_mce/plugins/preview/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/preview/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/preview/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/preview/readme.txt create mode 100644 includes/tiny_mce/plugins/print/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/print/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/print/images/print.gif create mode 100644 includes/tiny_mce/plugins/print/langs/cs.js create mode 100644 includes/tiny_mce/plugins/print/langs/cy.js create mode 100644 includes/tiny_mce/plugins/print/langs/da.js create mode 100644 includes/tiny_mce/plugins/print/langs/de.js create mode 100644 includes/tiny_mce/plugins/print/langs/en.js create mode 100644 includes/tiny_mce/plugins/print/langs/es.js create mode 100644 includes/tiny_mce/plugins/print/langs/fa.js create mode 100644 includes/tiny_mce/plugins/print/langs/fi.js create mode 100644 includes/tiny_mce/plugins/print/langs/fr.js create mode 100644 includes/tiny_mce/plugins/print/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/print/langs/he.js create mode 100644 includes/tiny_mce/plugins/print/langs/hu.js create mode 100644 includes/tiny_mce/plugins/print/langs/is.js create mode 100644 includes/tiny_mce/plugins/print/langs/nb.js create mode 100644 includes/tiny_mce/plugins/print/langs/nl.js create mode 100644 includes/tiny_mce/plugins/print/langs/nn.js create mode 100644 includes/tiny_mce/plugins/print/langs/pl.js create mode 100644 includes/tiny_mce/plugins/print/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/print/langs/ru.js create mode 100644 includes/tiny_mce/plugins/print/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/print/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/print/langs/sk.js create mode 100644 includes/tiny_mce/plugins/print/langs/sv.js create mode 100644 includes/tiny_mce/plugins/print/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/print/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/print/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/print/readme.txt create mode 100644 includes/tiny_mce/plugins/readme.txt create mode 100644 includes/tiny_mce/plugins/save/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/save/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/save/images/save.gif create mode 100644 includes/tiny_mce/plugins/save/langs/cs.js create mode 100644 includes/tiny_mce/plugins/save/langs/cy.js create mode 100644 includes/tiny_mce/plugins/save/langs/da.js create mode 100644 includes/tiny_mce/plugins/save/langs/de.js create mode 100644 includes/tiny_mce/plugins/save/langs/en.js create mode 100644 includes/tiny_mce/plugins/save/langs/es.js create mode 100644 includes/tiny_mce/plugins/save/langs/fa.js create mode 100644 includes/tiny_mce/plugins/save/langs/fi.js create mode 100644 includes/tiny_mce/plugins/save/langs/fr.js create mode 100644 includes/tiny_mce/plugins/save/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/save/langs/he.js create mode 100644 includes/tiny_mce/plugins/save/langs/hu.js create mode 100644 includes/tiny_mce/plugins/save/langs/is.js create mode 100644 includes/tiny_mce/plugins/save/langs/nb.js create mode 100644 includes/tiny_mce/plugins/save/langs/nl.js create mode 100644 includes/tiny_mce/plugins/save/langs/nn.js create mode 100644 includes/tiny_mce/plugins/save/langs/pl.js create mode 100644 includes/tiny_mce/plugins/save/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/save/langs/ru.js create mode 100644 includes/tiny_mce/plugins/save/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/save/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/save/langs/sk.js create mode 100644 includes/tiny_mce/plugins/save/langs/sv.js create mode 100644 includes/tiny_mce/plugins/save/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/save/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/save/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/save/readme.txt create mode 100644 includes/tiny_mce/plugins/searchreplace/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/searchreplace/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/searchreplace/images/replace.gif create mode 100644 includes/tiny_mce/plugins/searchreplace/images/search.gif create mode 100644 includes/tiny_mce/plugins/searchreplace/jscripts/replace.js create mode 100644 includes/tiny_mce/plugins/searchreplace/jscripts/search.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/cs.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/cy.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/da.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/de.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/en.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/es.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/fa.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/fi.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/fr.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/he.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/hu.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/is.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/nb.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/nl.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/nn.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/pl.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/ru.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/sk.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/sv.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/searchreplace/readme.txt create mode 100644 includes/tiny_mce/plugins/searchreplace/replace.htm create mode 100644 includes/tiny_mce/plugins/searchreplace/search.htm create mode 100644 includes/tiny_mce/plugins/table/cell.htm create mode 100644 includes/tiny_mce/plugins/table/css/cell.css create mode 100644 includes/tiny_mce/plugins/table/css/row.css create mode 100644 includes/tiny_mce/plugins/table/css/table.css create mode 100644 includes/tiny_mce/plugins/table/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/table/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/table/images/buttons.gif create mode 100644 includes/tiny_mce/plugins/table/images/table.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_cell_props.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_delete.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_delete_col.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_delete_row.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_insert_col_after.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_insert_col_before.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_insert_row_after.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_insert_row_before.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_merge_cells.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_row_props.gif create mode 100644 includes/tiny_mce/plugins/table/images/table_split_cells.gif create mode 100644 includes/tiny_mce/plugins/table/jscripts/cell.js create mode 100644 includes/tiny_mce/plugins/table/jscripts/merge_cells.js create mode 100644 includes/tiny_mce/plugins/table/jscripts/row.js create mode 100644 includes/tiny_mce/plugins/table/jscripts/table.js create mode 100644 includes/tiny_mce/plugins/table/langs/ar.js create mode 100644 includes/tiny_mce/plugins/table/langs/cs.js create mode 100644 includes/tiny_mce/plugins/table/langs/cy.js create mode 100644 includes/tiny_mce/plugins/table/langs/da.js create mode 100644 includes/tiny_mce/plugins/table/langs/de.js create mode 100644 includes/tiny_mce/plugins/table/langs/el.js create mode 100644 includes/tiny_mce/plugins/table/langs/en.js create mode 100644 includes/tiny_mce/plugins/table/langs/es.js create mode 100644 includes/tiny_mce/plugins/table/langs/fa.js create mode 100644 includes/tiny_mce/plugins/table/langs/fi.js create mode 100644 includes/tiny_mce/plugins/table/langs/fr.js create mode 100644 includes/tiny_mce/plugins/table/langs/fr_ca.js create mode 100644 includes/tiny_mce/plugins/table/langs/he.js create mode 100644 includes/tiny_mce/plugins/table/langs/hu.js create mode 100644 includes/tiny_mce/plugins/table/langs/is.js create mode 100644 includes/tiny_mce/plugins/table/langs/it.js create mode 100644 includes/tiny_mce/plugins/table/langs/ja.js create mode 100644 includes/tiny_mce/plugins/table/langs/ko.js create mode 100644 includes/tiny_mce/plugins/table/langs/nb.js create mode 100644 includes/tiny_mce/plugins/table/langs/nl.js create mode 100644 includes/tiny_mce/plugins/table/langs/nn.js create mode 100644 includes/tiny_mce/plugins/table/langs/pl.js create mode 100644 includes/tiny_mce/plugins/table/langs/pt.js create mode 100644 includes/tiny_mce/plugins/table/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/table/langs/readme.txt create mode 100644 includes/tiny_mce/plugins/table/langs/ru.js create mode 100644 includes/tiny_mce/plugins/table/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/table/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/table/langs/sk.js create mode 100644 includes/tiny_mce/plugins/table/langs/sv.js create mode 100644 includes/tiny_mce/plugins/table/langs/tw.js create mode 100644 includes/tiny_mce/plugins/table/langs/zh_cn.js create mode 100644 includes/tiny_mce/plugins/table/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/table/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/table/merge_cells.htm create mode 100644 includes/tiny_mce/plugins/table/readme.txt create mode 100644 includes/tiny_mce/plugins/table/row.htm create mode 100644 includes/tiny_mce/plugins/table/table.htm create mode 100644 includes/tiny_mce/plugins/zoom/editor_plugin.js create mode 100644 includes/tiny_mce/plugins/zoom/editor_plugin_src.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/es.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/fr.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/he.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/pt_br.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/ru.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/zh_tw.js create mode 100644 includes/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/plugins/zoom/readme.txt create mode 100644 includes/tiny_mce/themes/advanced/about.htm create mode 100644 includes/tiny_mce/themes/advanced/anchor.htm create mode 100644 includes/tiny_mce/themes/advanced/charmap.htm create mode 100644 includes/tiny_mce/themes/advanced/color_picker.htm create mode 100644 includes/tiny_mce/themes/advanced/css/editor_content.css create mode 100644 includes/tiny_mce/themes/advanced/css/editor_popup.css create mode 100644 includes/tiny_mce/themes/advanced/css/editor_ui.css create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/cs/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/da/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/da/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/da/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/da/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/de/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/de/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/de/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/de/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/de/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/de/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/en/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/en/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/en/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/es/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/es/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/es/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fi/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/fr_ca/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/hu/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_delete_col.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_delete_row.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/it/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/it/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/it/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nb/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nl/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/nn/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/pl/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/images/insert_table_window.png create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sk/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/sv/style.css create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/about.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/index.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm create mode 100644 includes/tiny_mce/themes/advanced/docs/zh_cn/style.css create mode 100644 includes/tiny_mce/themes/advanced/editor_template.js create mode 100644 includes/tiny_mce/themes/advanced/editor_template_src.js create mode 100644 includes/tiny_mce/themes/advanced/image.htm create mode 100644 includes/tiny_mce/themes/advanced/images/anchor.gif create mode 100644 includes/tiny_mce/themes/advanced/images/anchor_symbol.gif create mode 100644 includes/tiny_mce/themes/advanced/images/backcolor.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold_de_se.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold_es.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold_fr.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold_ru.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bold_tw.gif create mode 100644 includes/tiny_mce/themes/advanced/images/browse.gif create mode 100644 includes/tiny_mce/themes/advanced/images/bullist.gif create mode 100644 includes/tiny_mce/themes/advanced/images/buttons.gif create mode 100644 includes/tiny_mce/themes/advanced/images/cancel_button_bg.gif create mode 100644 includes/tiny_mce/themes/advanced/images/charmap.gif create mode 100644 includes/tiny_mce/themes/advanced/images/cleanup.gif create mode 100644 includes/tiny_mce/themes/advanced/images/close.gif create mode 100644 includes/tiny_mce/themes/advanced/images/code.gif create mode 100644 includes/tiny_mce/themes/advanced/images/color.gif create mode 100644 includes/tiny_mce/themes/advanced/images/copy.gif create mode 100644 includes/tiny_mce/themes/advanced/images/custom_1.gif create mode 100644 includes/tiny_mce/themes/advanced/images/cut.gif create mode 100644 includes/tiny_mce/themes/advanced/images/forecolor.gif create mode 100644 includes/tiny_mce/themes/advanced/images/help.gif create mode 100644 includes/tiny_mce/themes/advanced/images/hr.gif create mode 100644 includes/tiny_mce/themes/advanced/images/image.gif create mode 100644 includes/tiny_mce/themes/advanced/images/indent.gif create mode 100644 includes/tiny_mce/themes/advanced/images/insert_button_bg.gif create mode 100644 includes/tiny_mce/themes/advanced/images/italic.gif create mode 100644 includes/tiny_mce/themes/advanced/images/italic_de_se.gif create mode 100644 includes/tiny_mce/themes/advanced/images/italic_es.gif create mode 100644 includes/tiny_mce/themes/advanced/images/italic_ru.gif create mode 100644 includes/tiny_mce/themes/advanced/images/italic_tw.gif create mode 100644 includes/tiny_mce/themes/advanced/images/justifycenter.gif create mode 100644 includes/tiny_mce/themes/advanced/images/justifyfull.gif create mode 100644 includes/tiny_mce/themes/advanced/images/justifyleft.gif create mode 100644 includes/tiny_mce/themes/advanced/images/justifyright.gif create mode 100644 includes/tiny_mce/themes/advanced/images/link.gif create mode 100644 includes/tiny_mce/themes/advanced/images/newdocument.gif create mode 100644 includes/tiny_mce/themes/advanced/images/numlist.gif create mode 100644 includes/tiny_mce/themes/advanced/images/opacity.png create mode 100644 includes/tiny_mce/themes/advanced/images/outdent.gif create mode 100644 includes/tiny_mce/themes/advanced/images/paste.gif create mode 100644 includes/tiny_mce/themes/advanced/images/redo.gif create mode 100644 includes/tiny_mce/themes/advanced/images/removeformat.gif create mode 100644 includes/tiny_mce/themes/advanced/images/spacer.gif create mode 100644 includes/tiny_mce/themes/advanced/images/statusbar_resize.gif create mode 100644 includes/tiny_mce/themes/advanced/images/strikethrough.gif create mode 100644 includes/tiny_mce/themes/advanced/images/sub.gif create mode 100644 includes/tiny_mce/themes/advanced/images/sup.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_delete_col.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_delete_row.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_insert_col_after.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_insert_col_before.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_insert_row_after.gif create mode 100644 includes/tiny_mce/themes/advanced/images/table_insert_row_before.gif create mode 100644 includes/tiny_mce/themes/advanced/images/underline.gif create mode 100644 includes/tiny_mce/themes/advanced/images/underline_es.gif create mode 100644 includes/tiny_mce/themes/advanced/images/underline_fr.gif create mode 100644 includes/tiny_mce/themes/advanced/images/underline_ru.gif create mode 100644 includes/tiny_mce/themes/advanced/images/underline_tw.gif create mode 100644 includes/tiny_mce/themes/advanced/images/undo.gif create mode 100644 includes/tiny_mce/themes/advanced/images/unlink.gif create mode 100644 includes/tiny_mce/themes/advanced/images/visualaid.gif create mode 100644 includes/tiny_mce/themes/advanced/images/xp/tab_bg.gif create mode 100644 includes/tiny_mce/themes/advanced/images/xp/tab_end.gif create mode 100644 includes/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif create mode 100644 includes/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif create mode 100644 includes/tiny_mce/themes/advanced/images/xp/tabs_bg.gif create mode 100644 includes/tiny_mce/themes/advanced/jscripts/about.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/anchor.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/charmap.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/color_picker.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/image.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/link.js create mode 100644 includes/tiny_mce/themes/advanced/jscripts/source_editor.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ar.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ca.js create mode 100644 includes/tiny_mce/themes/advanced/langs/cs.js create mode 100644 includes/tiny_mce/themes/advanced/langs/cy.js create mode 100644 includes/tiny_mce/themes/advanced/langs/da.js create mode 100644 includes/tiny_mce/themes/advanced/langs/de.js create mode 100644 includes/tiny_mce/themes/advanced/langs/el.js create mode 100644 includes/tiny_mce/themes/advanced/langs/en.js create mode 100644 includes/tiny_mce/themes/advanced/langs/es.js create mode 100644 includes/tiny_mce/themes/advanced/langs/fa.js create mode 100644 includes/tiny_mce/themes/advanced/langs/fi.js create mode 100644 includes/tiny_mce/themes/advanced/langs/fr.js create mode 100644 includes/tiny_mce/themes/advanced/langs/fr_ca.js create mode 100644 includes/tiny_mce/themes/advanced/langs/he.js create mode 100644 includes/tiny_mce/themes/advanced/langs/hu.js create mode 100644 includes/tiny_mce/themes/advanced/langs/is.js create mode 100644 includes/tiny_mce/themes/advanced/langs/it.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ja.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ko.js create mode 100644 includes/tiny_mce/themes/advanced/langs/nb.js create mode 100644 includes/tiny_mce/themes/advanced/langs/nl.js create mode 100644 includes/tiny_mce/themes/advanced/langs/nn.js create mode 100644 includes/tiny_mce/themes/advanced/langs/pl.js create mode 100644 includes/tiny_mce/themes/advanced/langs/pt.js create mode 100644 includes/tiny_mce/themes/advanced/langs/pt_br.js create mode 100644 includes/tiny_mce/themes/advanced/langs/readme.txt create mode 100644 includes/tiny_mce/themes/advanced/langs/ru.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ru_KOI8-R.js create mode 100644 includes/tiny_mce/themes/advanced/langs/ru_UTF-8.js create mode 100644 includes/tiny_mce/themes/advanced/langs/sk.js create mode 100644 includes/tiny_mce/themes/advanced/langs/sv.js create mode 100644 includes/tiny_mce/themes/advanced/langs/tw.js create mode 100644 includes/tiny_mce/themes/advanced/langs/zh_cn.js create mode 100644 includes/tiny_mce/themes/advanced/langs/zh_tw.js create mode 100644 includes/tiny_mce/themes/advanced/langs/zh_tw_utf8.js create mode 100644 includes/tiny_mce/themes/advanced/link.htm create mode 100644 includes/tiny_mce/themes/advanced/source_editor.htm create mode 100644 includes/tiny_mce/themes/simple/css/editor_content.css create mode 100644 includes/tiny_mce/themes/simple/css/editor_popup.css create mode 100644 includes/tiny_mce/themes/simple/css/editor_ui.css create mode 100644 includes/tiny_mce/themes/simple/editor_template.js create mode 100644 includes/tiny_mce/themes/simple/editor_template_src.js create mode 100644 includes/tiny_mce/themes/simple/images/bold.gif create mode 100644 includes/tiny_mce/themes/simple/images/bold_de_se.gif create mode 100644 includes/tiny_mce/themes/simple/images/bold_fr.gif create mode 100644 includes/tiny_mce/themes/simple/images/bold_ru.gif create mode 100644 includes/tiny_mce/themes/simple/images/bold_tw.gif create mode 100644 includes/tiny_mce/themes/simple/images/bullist.gif create mode 100644 includes/tiny_mce/themes/simple/images/cleanup.gif create mode 100644 includes/tiny_mce/themes/simple/images/italic.gif create mode 100644 includes/tiny_mce/themes/simple/images/italic_de_se.gif create mode 100644 includes/tiny_mce/themes/simple/images/italic_ru.gif create mode 100644 includes/tiny_mce/themes/simple/images/italic_tw.gif create mode 100644 includes/tiny_mce/themes/simple/images/numlist.gif create mode 100644 includes/tiny_mce/themes/simple/images/redo.gif create mode 100644 includes/tiny_mce/themes/simple/images/spacer.gif create mode 100644 includes/tiny_mce/themes/simple/images/strikethrough.gif create mode 100644 includes/tiny_mce/themes/simple/images/underline.gif create mode 100644 includes/tiny_mce/themes/simple/images/underline_fr.gif create mode 100644 includes/tiny_mce/themes/simple/images/underline_ru.gif create mode 100644 includes/tiny_mce/themes/simple/images/underline_tw.gif create mode 100644 includes/tiny_mce/themes/simple/images/undo.gif create mode 100644 includes/tiny_mce/tiny_mce.js create mode 100644 includes/tiny_mce/tiny_mce_popup.js create mode 100644 includes/tiny_mce/tiny_mce_src.js create mode 100644 includes/tiny_mce/utils/form_utils.js create mode 100644 includes/tiny_mce/utils/mctabs.js create mode 100644 includes/tiny_mce/utils/validate.js create mode 100644 includes/zXml/distrib/zxml.js create mode 100644 includes/zXml/doc/index.htm create mode 100644 includes/zXml/doc/zXMLSerializer.htm create mode 100644 includes/zXml/doc/zXPath.htm create mode 100644 includes/zXml/doc/zXml.htm create mode 100644 includes/zXml/doc/zXmlDom.htm create mode 100644 includes/zXml/doc/zXmlHttp.htm create mode 100644 includes/zXml/doc/zXslt.htm create mode 100644 includes/zXml/examples/Examples to come.txt create mode 100644 includes/zXml/src/test.htm create mode 100644 includes/zXml/src/zxml.src.js create mode 100644 includes/zXml/zxml.js create mode 100644 inside/Action.php create mode 100644 inside/ActionGroupRelationship.php create mode 100644 inside/ActionGroupRelationships.php create mode 100644 inside/ActionParser.php create mode 100644 inside/Actions.php create mode 100644 inside/Article.php create mode 100644 inside/Articles.php create mode 100644 inside/BarShift.php create mode 100644 inside/BarShiftWorker.php create mode 100644 inside/BarShiftWorkers.php create mode 100644 inside/BarShifts.php create mode 100644 inside/BugReport.php create mode 100644 inside/BugReports.php create mode 100644 inside/Calendar.php create mode 100644 inside/Categories.php create mode 100644 inside/Concert.php create mode 100644 inside/ConcertCategories.php create mode 100644 inside/ConcertReport.php create mode 100644 inside/Concerts.php create mode 100644 inside/Division.php create mode 100644 inside/DivisionCategories.php create mode 100644 inside/Divisions.php create mode 100644 inside/Document.php create mode 100644 inside/DocumentCategories.php create mode 100644 inside/DocumentCategory.php create mode 100644 inside/Documents.php create mode 100644 inside/Errors.php create mode 100644 inside/Event.php create mode 100644 inside/EventCategories.php create mode 100644 inside/EventCategory.php create mode 100644 inside/EventComment.php create mode 100644 inside/EventComments.php create mode 100644 inside/Events.php create mode 100644 inside/Form.php create mode 100644 inside/Group.php create mode 100644 inside/Groups.php create mode 100644 inside/Job.php create mode 100644 inside/JobCategories.php create mode 100644 inside/JobCategory.php create mode 100644 inside/Jobs.php create mode 100644 inside/Locations.php create mode 100644 inside/Messages.php create mode 100644 inside/Navigation.php create mode 100644 inside/Nordea.php create mode 100644 inside/Order.php create mode 100644 inside/OrderItem.php create mode 100644 inside/OrderStatuses.php create mode 100644 inside/Page.php create mode 100644 inside/Payment.php create mode 100644 inside/Payment_backup.php create mode 100644 inside/PlacesOfStudy.php create mode 100644 inside/Position.php create mode 100644 inside/Positions.php create mode 100644 inside/Product.php create mode 100644 inside/Products.php create mode 100644 inside/ProgramSelection.php create mode 100644 inside/ProgramsSelection.php create mode 100644 inside/Transaction.php create mode 100644 inside/User.php create mode 100644 inside/UserGroupRelationship.php create mode 100644 inside/UserGroupRelationships.php create mode 100644 inside/Users.php create mode 100644 inside/WeekProgram.php create mode 100644 inside/WeekPrograms.php create mode 100644 inside/XMLCatRequest.js create mode 100644 inside/XMLRequest.js create mode 100644 inside/XMLUsernameRequest.js create mode 100644 inside/XMLZipRequest.js create mode 100644 inside/ajax.js create mode 100644 inside/ajax.php create mode 100644 inside/checkZip.php create mode 100644 inside/credentials-sample.php create mode 100644 inside/file.php create mode 100644 inside/finder.js create mode 100644 inside/functions.js create mode 100644 inside/functions.php create mode 100644 inside/getconcertinfo.php create mode 100644 inside/grantcardno.php create mode 100644 inside/graphics/bar.png create mode 100644 inside/graphics/call_to.png create mode 100644 inside/graphics/cross.png create mode 100644 inside/graphics/delete.png create mode 100644 inside/graphics/delete_small.png create mode 100644 inside/graphics/edit.png create mode 100644 inside/graphics/minus.png create mode 100644 inside/graphics/payex.png create mode 100644 inside/graphics/plus.png create mode 100644 inside/graphics/star.png create mode 100644 inside/graphics/tick.png create mode 100644 inside/graphics/user_go.png create mode 100644 inside/handheld.css create mode 100644 inside/imageResize.php create mode 100644 inside/images/products/1.jpg create mode 100644 inside/images/products/10.jpg create mode 100644 inside/images/products/11jpeg create mode 100644 inside/images/products/13jpeg create mode 100644 inside/images/products/14.jpg create mode 100644 inside/images/products/16.png create mode 100644 inside/images/products/17.png create mode 100644 inside/images/products/4.gif create mode 100644 inside/images/products/4.jpg create mode 100644 inside/images/products/5.gif create mode 100644 inside/images/products/5.jpg create mode 100644 inside/images/products/6.jpg create mode 100644 inside/images/products/7.jpg create mode 100644 inside/images/products/8.jpg create mode 100644 inside/images/products/9.gif create mode 100644 inside/includes.php create mode 100644 inside/index.php create mode 100644 inside/info.php create mode 100644 inside/language.php create mode 100644 inside/language/en/common.php create mode 100644 inside/language/en/iso.txt create mode 100644 inside/language/en/member.php create mode 100644 inside/language/nb/common.php create mode 100644 inside/language/nb/iso.txt create mode 100644 inside/language/nb/member.php create mode 100644 inside/linker.php create mode 100644 inside/menuExpandable3.js create mode 100644 inside/pos.php create mode 100644 inside/print.css create mode 100644 inside/print_prog.css create mode 100644 inside/programutvalg.php create mode 100644 inside/programutvalgtekst.php create mode 100644 inside/screen.css create mode 100644 inside/sethascard.php create mode 100644 inside/setorderdelivery.php create mode 100644 inside/setweekprogramtext.php create mode 100644 inside/showCodes.php create mode 100644 inside/sorttable.js create mode 100644 inside/test.php create mode 100644 inside/ukesprogram.php create mode 100644 inside/ukesprogramprint.php create mode 100644 inside/ukesprogramtekst.php create mode 100644 inside/ukesprogramuniversitas.php create mode 100644 inside/updatelaststicker.php create mode 100644 inside/updateuserexpiry.php diff --git a/.bzrignore b/.bzrignore new file mode 100644 index 0000000..6cb3513 --- /dev/null +++ b/.bzrignore @@ -0,0 +1,2 @@ +credentials.php +inside/credentials.php diff --git a/includes/DB.php b/includes/DB.php new file mode 100644 index 0000000..9f917ea --- /dev/null +++ b/includes/DB.php @@ -0,0 +1,1388 @@ + + * @author Tomas V.V.Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: DB.php,v 1.80 2005/02/16 02:16:00 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + + +// {{{ constants +// {{{ error codes + +/**#@+ + * One of PEAR DB's portable error codes. + * @see DB_common::errorCode(), DB::errorMessage() + * + * {@internal If you add an error code here, make sure you also add a textual + * version of it in DB::errorMessage().}} + */ + +/** + * The code returned by many methods upon success + */ +define('DB_OK', 1); + +/** + * Unkown error + */ +define('DB_ERROR', -1); + +/** + * Syntax error + */ +define('DB_ERROR_SYNTAX', -2); + +/** + * Tried to insert a duplicate value into a primary or unique index + */ +define('DB_ERROR_CONSTRAINT', -3); + +/** + * An identifier in the query refers to a non-existant object + */ +define('DB_ERROR_NOT_FOUND', -4); + +/** + * Tried to create a duplicate object + */ +define('DB_ERROR_ALREADY_EXISTS', -5); + +/** + * The current driver does not support the action you attempted + */ +define('DB_ERROR_UNSUPPORTED', -6); + +/** + * The number of parameters does not match the number of placeholders + */ +define('DB_ERROR_MISMATCH', -7); + +/** + * A literal submitted did not match the data type expected + */ +define('DB_ERROR_INVALID', -8); + +/** + * The current DBMS does not support the action you attempted + */ +define('DB_ERROR_NOT_CAPABLE', -9); + +/** + * A literal submitted was too long so the end of it was removed + */ +define('DB_ERROR_TRUNCATED', -10); + +/** + * A literal number submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_NUMBER', -11); + +/** + * A literal date submitted did not match the data type expected + */ +define('DB_ERROR_INVALID_DATE', -12); + +/** + * Attempt to divide something by zero + */ +define('DB_ERROR_DIVZERO', -13); + +/** + * A database needs to be selected + */ +define('DB_ERROR_NODBSELECTED', -14); + +/** + * Could not create the object requested + */ +define('DB_ERROR_CANNOT_CREATE', -15); + +/** + * Could not drop the database requested because it does not exist + */ +define('DB_ERROR_CANNOT_DROP', -17); + +/** + * An identifier in the query refers to a non-existant table + */ +define('DB_ERROR_NOSUCHTABLE', -18); + +/** + * An identifier in the query refers to a non-existant column + */ +define('DB_ERROR_NOSUCHFIELD', -19); + +/** + * The data submitted to the method was inappropriate + */ +define('DB_ERROR_NEED_MORE_DATA', -20); + +/** + * The attempt to lock the table failed + */ +define('DB_ERROR_NOT_LOCKED', -21); + +/** + * The number of columns doesn't match the number of values + */ +define('DB_ERROR_VALUE_COUNT_ON_ROW', -22); + +/** + * The DSN submitted has problems + */ +define('DB_ERROR_INVALID_DSN', -23); + +/** + * Could not connect to the database + */ +define('DB_ERROR_CONNECT_FAILED', -24); + +/** + * The PHP extension needed for this DBMS could not be found + */ +define('DB_ERROR_EXTENSION_NOT_FOUND',-25); + +/** + * The present user has inadequate permissions to perform the task requestd + */ +define('DB_ERROR_ACCESS_VIOLATION', -26); + +/** + * The database requested does not exist + */ +define('DB_ERROR_NOSUCHDB', -27); + +/** + * Tried to insert a null value into a column that doesn't allow nulls + */ +define('DB_ERROR_CONSTRAINT_NOT_NULL',-29); +/**#@-*/ + + +// }}} +// {{{ prepared statement-related + + +/**#@+ + * Identifiers for the placeholders used in prepared statements. + * @see DB_common::prepare() + */ + +/** + * Indicates a scalar (?) placeholder was used + * + * Quote and escape the value as necessary. + */ +define('DB_PARAM_SCALAR', 1); + +/** + * Indicates an opaque (&) placeholder was used + * + * The value presented is a file name. Extract the contents of that file + * and place them in this column. + */ +define('DB_PARAM_OPAQUE', 2); + +/** + * Indicates a misc (!) placeholder was used + * + * The value should not be quoted or escaped. + */ +define('DB_PARAM_MISC', 3); +/**#@-*/ + + +// }}} +// {{{ binary data-related + + +/**#@+ + * The different ways of returning binary data from queries. + */ + +/** + * Sends the fetched data straight through to output + */ +define('DB_BINMODE_PASSTHRU', 1); + +/** + * Lets you return data as usual + */ +define('DB_BINMODE_RETURN', 2); + +/** + * Converts the data to hex format before returning it + * + * For example the string "123" would become "313233". + */ +define('DB_BINMODE_CONVERT', 3); +/**#@-*/ + + +// }}} +// {{{ fetch modes + + +/**#@+ + * Fetch Modes. + * @see DB_common::setFetchMode() + */ + +/** + * Indicates the current default fetch mode should be used + * @see DB_common::$fetchmode + */ +define('DB_FETCHMODE_DEFAULT', 0); + +/** + * Column data indexed by numbers, ordered from 0 and up + */ +define('DB_FETCHMODE_ORDERED', 1); + +/** + * Column data indexed by column names + */ +define('DB_FETCHMODE_ASSOC', 2); + +/** + * Column data as object properties + */ +define('DB_FETCHMODE_OBJECT', 3); + +/** + * For multi-dimensional results, make the column name the first level + * of the array and put the row number in the second level of the array + * + * This is flipped from the normal behavior, which puts the row numbers + * in the first level of the array and the column names in the second level. + */ +define('DB_FETCHMODE_FLIPPED', 4); +/**#@-*/ + +/**#@+ + * Old fetch modes. Left here for compatibility. + */ +define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); +define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC); +define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); +/**#@-*/ + + +// }}} +// {{{ tableInfo() && autoPrepare()-related + + +/**#@+ + * The type of information to return from the tableInfo() method. + * + * Bitwised constants, so they can be combined using | + * and removed using ^. + * + * @see DB_common::tableInfo() + * + * {@internal Since the TABLEINFO constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_TABLEINFO_FULL accordingly.}} + */ +define('DB_TABLEINFO_ORDER', 1); +define('DB_TABLEINFO_ORDERTABLE', 2); +define('DB_TABLEINFO_FULL', 3); +/**#@-*/ + + +/**#@+ + * The type of query to create with the automatic query building methods. + * @see DB_common::autoPrepare(), DB_common::autoExecute() + */ +define('DB_AUTOQUERY_INSERT', 1); +define('DB_AUTOQUERY_UPDATE', 2); +/**#@-*/ + + +// }}} +// {{{ portability modes + + +/**#@+ + * Portability Modes. + * + * Bitwised constants, so they can be combined using | + * and removed using ^. + * + * @see DB_common::setOption() + * + * {@internal Since the PORTABILITY constants are bitwised, if more of them are + * added in the future, make sure to adjust DB_PORTABILITY_ALL accordingly.}} + */ + +/** + * Turn off all portability features + */ +define('DB_PORTABILITY_NONE', 0); + +/** + * Convert names of tables and fields to lower case + * when using the get*(), fetch*() and tableInfo() methods + */ +define('DB_PORTABILITY_LOWERCASE', 1); + +/** + * Right trim the data output by get*() and fetch*() + */ +define('DB_PORTABILITY_RTRIM', 2); + +/** + * Force reporting the number of rows deleted + */ +define('DB_PORTABILITY_DELETE_COUNT', 4); + +/** + * Enable hack that makes numRows() work in Oracle + */ +define('DB_PORTABILITY_NUMROWS', 8); + +/** + * Makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + */ +define('DB_PORTABILITY_ERRORS', 16); + +/** + * Convert null values to empty strings in data output by + * get*() and fetch*() + */ +define('DB_PORTABILITY_NULL_TO_EMPTY', 32); + +/** + * Turn on all portability features + */ +define('DB_PORTABILITY_ALL', 63); +/**#@-*/ + +// }}} + + +// }}} +// {{{ class DB + +/** + * Database independent query interface + * + * The main "DB" class is simply a container class with some static + * methods for creating DB objects as well as some utility functions + * common to all parts of DB. + * + * The object model of DB is as follows (indentation means inheritance): + *
+ * DB           The main DB class.  This is simply a utility class
+ *              with some "static" methods for creating DB objects as
+ *              well as common utility functions for other DB classes.
+ *
+ * DB_common    The base for each DB implementation.  Provides default
+ * |            implementations (in OO lingo virtual methods) for
+ * |            the actual DB implementations as well as a bunch of
+ * |            query utility functions.
+ * |
+ * +-DB_mysql   The DB implementation for MySQL.  Inherits DB_common.
+ *              When calling DB::factory or DB::connect for MySQL
+ *              connections, the object returned is an instance of this
+ *              class.
+ * 
+ * + * @category Database + * @package DB + * @author Stig Bakken + * @author Tomas V.V.Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB +{ + // {{{ &factory() + + /** + * Create a new DB object for the specified database type but don't + * connect to the database + * + * @param string $type the database type (eg "mysql") + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function &factory($type, $options = false) + { + if (!is_array($options)) { + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/{$type}.php"; + } else { + @include_once "DB/{$type}.php"; + } + + $classname = "DB_${type}"; + + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + return $obj; + } + + // }}} + // {{{ &connect() + + /** + * Create a new DB object including a connection to the specified database + * + * Example 1. + * + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:password@host/database'; + * $options = array( + * 'debug' => 2, + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param mixed $dsn the string "data source name" or array in the + * format returned by DB::parseDSN() + * @param array $options an associative array of option names and values + * + * @return object a new DB object. A DB_Error object on failure. + * + * @uses DB_dbase::connect(), DB_fbsql::connect(), DB_ibase::connect(), + * DB_ifx::connect(), DB_msql::connect(), DB_mssql::connect(), + * DB_mysql::connect(), DB_mysqli::connect(), DB_oci8::connect(), + * DB_odbc::connect(), DB_pgsql::connect(), DB_sqlite::connect(), + * DB_sybase::connect() + * + * @uses DB::parseDSN(), DB_common::setOption(), PEAR::isError() + */ + function &connect($dsn, $options = array()) + { + $dsninfo = DB::parseDSN($dsn); + $type = $dsninfo['phptype']; + + if (!is_array($options)) { + /* + * For backwards compatibility. $options used to be boolean, + * indicating whether the connection should be persistent. + */ + $options = array('persistent' => $options); + } + + if (isset($options['debug']) && $options['debug'] >= 2) { + // expose php errors with sufficient debug level + include_once "DB/${type}.php"; + } else { + @include_once "DB/${type}.php"; + } + + $classname = "DB_${type}"; + if (!class_exists($classname)) { + $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, + "Unable to include the DB/{$type}.php" + . " file for '$dsn'", + 'DB_Error', true); + return $tmp; + } + + @$obj =& new $classname; + + foreach ($options as $option => $value) { + $test = $obj->setOption($option, $value); + if (DB::isError($test)) { + return $test; + } + } + + $err = $obj->connect($dsninfo, $obj->getOption('persistent')); + if (DB::isError($err)) { + $err->addUserInfo($dsn); + return $err; + } + + return $obj; + } + + // }}} + // {{{ apiVersion() + + /** + * Return the DB API version + * + * @return string the DB API version number + */ + function apiVersion() + { + return '1.7.6'; + } + + // }}} + // {{{ isError() + + /** + * Determines if a variable is a DB_Error object + * + * @param mixed $value the variable to check + * + * @return bool whether $value is DB_Error object + */ + function isError($value) + { + return is_a($value, 'DB_Error'); + } + + // }}} + // {{{ isConnection() + + /** + * Determines if a value is a DB_ object + * + * @param mixed $value the value to test + * + * @return bool whether $value is a DB_ object + */ + function isConnection($value) + { + return (is_object($value) && + is_subclass_of($value, 'db_common') && + method_exists($value, 'simpleQuery')); + } + + // }}} + // {{{ isManip() + + /** + * Tell whether a query is a data manipulation or data definition query + * + * Examples of data manipulation queries are INSERT, UPDATE and DELETE. + * Examples of data definition queries are CREATE, DROP, ALTER, GRANT, + * REVOKE. + * + * @param string $query the query + * + * @return boolean whether $query is a data manipulation query + */ + function isManip($query) + { + $manips = 'INSERT|UPDATE|DELETE|REPLACE|' + . 'CREATE|DROP|' + . 'LOAD DATA|SELECT .* INTO|COPY|' + . 'ALTER|GRANT|REVOKE|' + . 'LOCK|UNLOCK'; + if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) { + return true; + } + return false; + } + + // }}} + // {{{ errorMessage() + + /** + * Return a textual error message for a DB error code + * + * @param integer $value the DB error code + * + * @return string the error message or false if the error code was + * not recognized + */ + function errorMessage($value) + { + static $errorMessages; + if (!isset($errorMessages)) { + $errorMessages = array( + DB_ERROR => 'unknown error', + DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions', + DB_ERROR_ALREADY_EXISTS => 'already exists', + DB_ERROR_CANNOT_CREATE => 'can not create', + DB_ERROR_CANNOT_DROP => 'can not drop', + DB_ERROR_CONNECT_FAILED => 'connect failed', + DB_ERROR_CONSTRAINT => 'constraint violation', + DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', + DB_ERROR_DIVZERO => 'division by zero', + DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', + DB_ERROR_INVALID => 'invalid', + DB_ERROR_INVALID_DATE => 'invalid date or time', + DB_ERROR_INVALID_DSN => 'invalid DSN', + DB_ERROR_INVALID_NUMBER => 'invalid number', + DB_ERROR_MISMATCH => 'mismatch', + DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied', + DB_ERROR_NODBSELECTED => 'no database selected', + DB_ERROR_NOSUCHDB => 'no such database', + DB_ERROR_NOSUCHFIELD => 'no such field', + DB_ERROR_NOSUCHTABLE => 'no such table', + DB_ERROR_NOT_CAPABLE => 'DB backend not capable', + DB_ERROR_NOT_FOUND => 'not found', + DB_ERROR_NOT_LOCKED => 'not locked', + DB_ERROR_SYNTAX => 'syntax error', + DB_ERROR_UNSUPPORTED => 'not supported', + DB_ERROR_TRUNCATED => 'truncated', + DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_OK => 'no error', + ); + } + + if (DB::isError($value)) { + $value = $value->getCode(); + } + + return isset($errorMessages[$value]) ? $errorMessages[$value] + : $errorMessages[DB_ERROR]; + } + + // }}} + // {{{ parseDSN() + + /** + * Parse a data source name + * + * Additional keys can be added by appending a URI query string to the + * end of the DSN. + * + * The format of the supplied DSN is in its fullest form: + * + * phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true + * + * + * Most variations are allowed: + * + * phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 + * phptype://username:password@hostspec/database_name + * phptype://username:password@hostspec + * phptype://username@hostspec + * phptype://hostspec/database + * phptype://hostspec + * phptype(dbsyntax) + * phptype + * + * + * @param string $dsn Data Source Name to be parsed + * + * @return array an associative array with the following keys: + * + phptype: Database backend used in PHP (mysql, odbc etc.) + * + dbsyntax: Database used with regards to SQL syntax etc. + * + protocol: Communication protocol to use (tcp, unix etc.) + * + hostspec: Host specification (hostname[:port]) + * + database: Database to use on the DBMS server + * + username: User name for login + * + password: Password for login + */ + function parseDSN($dsn) + { + $parsed = array( + 'phptype' => false, + 'dbsyntax' => false, + 'username' => false, + 'password' => false, + 'protocol' => false, + 'hostspec' => false, + 'port' => false, + 'socket' => false, + 'database' => false, + ); + + if (is_array($dsn)) { + $dsn = array_merge($parsed, $dsn); + if (!$dsn['dbsyntax']) { + $dsn['dbsyntax'] = $dsn['phptype']; + } + return $dsn; + } + + // Find phptype and dbsyntax + if (($pos = strpos($dsn, '://')) !== false) { + $str = substr($dsn, 0, $pos); + $dsn = substr($dsn, $pos + 3); + } else { + $str = $dsn; + $dsn = null; + } + + // Get phptype and dbsyntax + // $str => phptype(dbsyntax) + if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { + $parsed['phptype'] = $arr[1]; + $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; + } else { + $parsed['phptype'] = $str; + $parsed['dbsyntax'] = $str; + } + + if (!count($dsn)) { + return $parsed; + } + + // Get (if found): username and password + // $dsn => username:password@protocol+hostspec/database + if (($at = strrpos($dsn,'@')) !== false) { + $str = substr($dsn, 0, $at); + $dsn = substr($dsn, $at + 1); + if (($pos = strpos($str, ':')) !== false) { + $parsed['username'] = rawurldecode(substr($str, 0, $pos)); + $parsed['password'] = rawurldecode(substr($str, $pos + 1)); + } else { + $parsed['username'] = rawurldecode($str); + } + } + + // Find protocol and hostspec + + if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { + // $dsn => proto(proto_opts)/database + $proto = $match[1]; + $proto_opts = $match[2] ? $match[2] : false; + $dsn = $match[3]; + + } else { + // $dsn => protocol+hostspec/database (old format) + if (strpos($dsn, '+') !== false) { + list($proto, $dsn) = explode('+', $dsn, 2); + } + if (strpos($dsn, '/') !== false) { + list($proto_opts, $dsn) = explode('/', $dsn, 2); + } else { + $proto_opts = $dsn; + $dsn = null; + } + } + + // process the different protocol options + $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; + $proto_opts = rawurldecode($proto_opts); + if ($parsed['protocol'] == 'tcp') { + if (strpos($proto_opts, ':') !== false) { + list($parsed['hostspec'], + $parsed['port']) = explode(':', $proto_opts); + } else { + $parsed['hostspec'] = $proto_opts; + } + } elseif ($parsed['protocol'] == 'unix') { + $parsed['socket'] = $proto_opts; + } + + // Get dabase if any + // $dsn => database + if ($dsn) { + if (($pos = strpos($dsn, '?')) === false) { + // /database + $parsed['database'] = rawurldecode($dsn); + } else { + // /database?param1=value1¶m2=value2 + $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); + $dsn = substr($dsn, $pos + 1); + if (strpos($dsn, '&') !== false) { + $opts = explode('&', $dsn); + } else { // database?param1=value1 + $opts = array($dsn); + } + foreach ($opts as $opt) { + list($key, $value) = explode('=', $opt); + if (!isset($parsed[$key])) { + // don't allow params overwrite + $parsed[$key] = rawurldecode($value); + } + } + } + } + + return $parsed; + } + + // }}} +} + +// }}} +// {{{ class DB_Error + +/** + * DB_Error implements a class for reporting portable database error + * messages + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_Error extends PEAR_Error +{ + // {{{ constructor + + /** + * DB_Error constructor + * + * @param mixed $code DB error code, or string with error message + * @param int $mode what "error mode" to operate in + * @param int $level what error level to use for $mode & + * PEAR_ERROR_TRIGGER + * @param mixed $debuginfo additional debug info, such as the last query + * + * @see PEAR_Error + */ + function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE, $debuginfo = null) + { + if (is_int($code)) { + $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, + $mode, $level, $debuginfo); + } else { + $this->PEAR_Error("DB Error: $code", DB_ERROR, + $mode, $level, $debuginfo); + } + } + + // }}} +} + +// }}} +// {{{ class DB_result + +/** + * This class implements a wrapper for a DB result set + * + * A new instance of this class will be returned by the DB implementation + * after processing a query that returns data. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_result +{ + // {{{ properties + + /** + * Should results be freed automatically when there are no more rows? + * @var boolean + * @see DB_common::$options + */ + var $autofree; + + /** + * A reference to the DB_ object + * @var object + */ + var $dbh; + + /** + * The current default fetch mode + * @var integer + * @see DB_common::$fetchmode + */ + var $fetchmode; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + * @see DB_common::$fetchmode_object_class + */ + var $fetchmode_object_class; + + /** + * The number of rows to fetch from a limit query + * @var integer + */ + var $limit_count = null; + + /** + * The row to start fetching from in limit queries + * @var integer + */ + var $limit_from = null; + + /** + * The execute parameters that created this result + * @var array + * @since Property available since Release 1.7.0 + */ + var $parameters; + + /** + * The query string that created this result + * + * Copied here incase it changes in $dbh, which is referenced + * + * @var string + * @since Property available since Release 1.7.0 + */ + var $query; + + /** + * The query result resource id created by PHP + * @var resource + */ + var $result; + + /** + * The present row being dealt with + * @var integer + */ + var $row_counter = null; + + /** + * The prepared statement resource id created by PHP in $dbh + * + * This resource is only available when the result set was created using + * a driver's native execute() method, not PEAR DB's emulated one. + * + * Copied here incase it changes in $dbh, which is referenced + * + * {@internal Mainly here because the InterBase/Firebird API is only + * able to retrieve data from result sets if the statemnt handle is + * still in scope.}} + * + * @var resource + * @since Property available since Release 1.7.0 + */ + var $statement; + + + // }}} + // {{{ constructor + + /** + * This constructor sets the object's properties + * + * @param object &$dbh the DB object reference + * @param resource $result the result resource id + * @param array $options an associative array with result options + * + * @return void + */ + function DB_result(&$dbh, $result, $options = array()) + { + $this->autofree = $dbh->options['autofree']; + $this->dbh = &$dbh; + $this->fetchmode = $dbh->fetchmode; + $this->fetchmode_object_class = $dbh->fetchmode_object_class; + $this->parameters = $dbh->last_parameters; + $this->query = $dbh->last_query; + $this->result = $result; + $this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt; + foreach ($options as $key => $value) { + $this->setOption($key, $value); + } + } + + /** + * Set options for the DB_result object + * + * @param string $key the option to set + * @param mixed $value the value to set the option to + * + * @return void + */ + function setOption($key, $value = null) + { + switch ($key) { + case 'limit_from': + $this->limit_from = $value; + break; + case 'limit_count': + $this->limit_count = $value; + } + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row of data and return it by reference into an array + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed an array or object containing the row's data, + * NULL when the end of the result set is reached + * or a DB_Error object on failure. + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ($this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + $tmp = null; + return $tmp; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // The default mode is specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = &new $object_class($arr); + } + } + return $arr; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ fetchInto() + + /** + * Fetch a row of data into an array which is passed by reference + * + * The type of array returned can be controlled either by setting this + * method's $fetchmode parameter or by changing the default + * fetch mode setFetchMode() before calling this method. + * + * There are two options for standardizing the information returned + * from databases, ensuring their values are consistent when changing + * DBMS's. These portability options can be turned on when creating a + * new DB object or by using setOption(). + * + * + DB_PORTABILITY_LOWERCASE + * convert names of fields to lower case + * + * + DB_PORTABILITY_RTRIM + * right trim the data + * + * @param array &$arr the variable where the data should be placed + * @param int $fetchmode the constant indicating how to format the data + * @param int $rownum the row number to fetch (index starts at 0) + * + * @return mixed DB_OK if a row is processed, NULL when the end of the + * result set is reached or a DB_Error object on failure + * + * @see DB_common::setOption(), DB_common::setFetchMode() + */ + function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) + { + if ($fetchmode === DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode === DB_FETCHMODE_OBJECT) { + $fetchmode = DB_FETCHMODE_ASSOC; + $object_class = $this->fetchmode_object_class; + } + if ($this->limit_from !== null) { + if ($this->row_counter === null) { + $this->row_counter = $this->limit_from; + // Skip rows + if ($this->dbh->features['limit'] === false) { + $i = 0; + while ($i++ < $this->limit_from) { + $this->dbh->fetchInto($this->result, $arr, $fetchmode); + } + } + } + if ($this->row_counter >= ( + $this->limit_from + $this->limit_count)) + { + if ($this->autofree) { + $this->free(); + } + return null; + } + if ($this->dbh->features['limit'] === 'emulate') { + $rownum = $this->row_counter; + } + + $this->row_counter++; + } + $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); + if ($res === DB_OK) { + if (isset($object_class)) { + // default mode specified in the + // DB_common::fetchmode_object_class property + if ($object_class == 'stdClass') { + $arr = (object) $arr; + } else { + $arr = new $object_class($arr); + } + } + return DB_OK; + } + if ($res == null && $this->autofree) { + $this->free(); + } + return $res; + } + + // }}} + // {{{ numCols() + + /** + * Get the the number of columns in a result set + * + * @return int the number of columns. A DB_Error object on failure. + */ + function numCols() + { + return $this->dbh->numCols($this->result); + } + + // }}} + // {{{ numRows() + + /** + * Get the number of rows in a result set + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows() + { + if ($this->dbh->features['numrows'] === 'emulate' + && $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS) + { + if ($this->dbh->features['prepare']) { + $res = $this->dbh->query($this->query, $this->parameters); + } else { + $res = $this->dbh->query($this->query); + } + if (DB::isError($res)) { + return $res; + } + $i = 0; + while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) { + $i++; + } + return $i; + } else { + return $this->dbh->numRows($this->result); + } + } + + // }}} + // {{{ nextResult() + + /** + * Get the next result if a batch of queries was executed + * + * @return bool true if a new result is available or false if not + */ + function nextResult() + { + return $this->dbh->nextResult($this->result); + } + + // }}} + // {{{ free() + + /** + * Frees the resources allocated for this result set + * + * @return bool true on success. A DB_Error object on failure. + */ + function free() + { + $err = $this->dbh->freeResult($this->result); + if (DB::isError($err)) { + return $err; + } + $this->result = false; + $this->statement = false; + return true; + } + + // }}} + // {{{ tableInfo() + + /** + * @see DB_common::tableInfo() + * @deprecated Method deprecated some time before Release 1.2 + */ + function tableInfo($mode = null) + { + if (is_string($mode)) { + return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA); + } + return $this->dbh->tableInfo($this, $mode); + } + + // }}} + // {{{ getQuery() + + /** + * Determine the query string that created this result + * + * @return string the query string + * + * @since Method available since Release 1.7.0 + */ + function getQuery() + { + return $this->query; + } + + // }}} + // {{{ getRowCounter() + + /** + * Tells which row number is currently being processed + * + * @return integer the current row being looked at. Starts at 1. + */ + function getRowCounter() + { + return $this->row_counter; + } + + // }}} +} + +// }}} +// {{{ class DB_row + +/** + * PEAR DB Row Object + * + * The object contains a row of data from a result set. Each column's data + * is placed in a property named for the column. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + * @see DB_common::setFetchMode() + */ +class DB_row +{ + // {{{ constructor + + /** + * The constructor places a row's data into properties of this object + * + * @param array the array containing the row's data + * + * @return void + */ + function DB_row(&$arr) + { + foreach ($arr as $key => $value) { + $this->$key = &$arr[$key]; + } + } + + // }}} +} + +// }}} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/common.php b/includes/DB/common.php new file mode 100644 index 0000000..7536fbc --- /dev/null +++ b/includes/DB/common.php @@ -0,0 +1,2157 @@ + + * @author Tomas V.V. Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: common.php,v 1.137 2005/04/07 14:27:35 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the PEAR class so it can be extended from + */ +require_once 'PEAR.php'; + +/** + * DB_common is the base class from which each database driver class extends + * + * All common methods are declared here. If a given DBMS driver contains + * a particular method, that method will overload the one here. + * + * @category Database + * @package DB + * @author Stig Bakken + * @author Tomas V.V. Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_common extends PEAR +{ + // {{{ properties + + /** + * The current default fetch mode + * @var integer + */ + var $fetchmode = DB_FETCHMODE_ORDERED; + + /** + * The name of the class into which results should be fetched when + * DB_FETCHMODE_OBJECT is in effect + * + * @var string + */ + var $fetchmode_object_class = 'stdClass'; + + /** + * Was a connection present when the object was serialized()? + * @var bool + * @see DB_common::__sleep(), DB_common::__wake() + */ + var $was_connected = null; + + /** + * The most recently executed query + * @var string + */ + var $last_query = ''; + + /** + * Run-time configuration options + * + * The 'optimize' option has been deprecated. Use the 'portability' + * option instead. + * + * @var array + * @see DB_common::setOption() + */ + var $options = array( + 'result_buffering' => 500, + 'persistent' => false, + 'ssl' => false, + 'debug' => 0, + 'seqname_format' => '%s_seq', + 'autofree' => false, + 'portability' => DB_PORTABILITY_NONE, + 'optimize' => 'performance', // Deprecated. Use 'portability'. + ); + + /** + * The parameters from the most recently executed query + * @var array + * @since Property available since Release 1.7.0 + */ + var $last_parameters = array(); + + /** + * The elements from each prepared statement + * @var array + */ + var $prepare_tokens = array(); + + /** + * The data types of the various elements in each prepared statement + * @var array + */ + var $prepare_types = array(); + + /** + * The prepared queries + * @var array + */ + var $prepared_queries = array(); + + + // }}} + // {{{ DB_common + + /** + * This constructor calls $this->PEAR('DB_Error') + * + * @return void + */ + function DB_common() + { + $this->PEAR('DB_Error'); + } + + // }}} + // {{{ __sleep() + + /** + * Automatically indicates which properties should be saved + * when PHP's serialize() function is called + * + * @return array the array of properties names that should be saved + */ + function __sleep() + { + if ($this->connection) { + // Don't disconnect(), people use serialize() for many reasons + $this->was_connected = true; + } else { + $this->was_connected = false; + } + if (isset($this->autocommit)) { + return array('autocommit', + 'dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } else { + return array('dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); + } + } + + // }}} + // {{{ __wakeup() + + /** + * Automatically reconnects to the database when PHP's unserialize() + * function is called + * + * The reconnection attempt is only performed if the object was connected + * at the time PHP's serialize() function was run. + * + * @return void + */ + function __wakeup() + { + if ($this->was_connected) { + $this->connect($this->dsn, $this->options); + } + } + + // }}} + // {{{ __toString() + + /** + * Automatic string conversion for PHP 5 + * + * @return string a string describing the current PEAR DB object + * + * @since Method available since Release 1.7.0 + */ + function __toString() + { + $info = strtolower(get_class($this)); + $info .= ': (phptype=' . $this->phptype . + ', dbsyntax=' . $this->dbsyntax . + ')'; + if ($this->connection) { + $info .= ' [connected]'; + } + return $info; + } + + // }}} + // {{{ toString() + + /** + * DEPRECATED: String conversion method + * + * @return string a string describing the current PEAR DB object + * + * @deprecated Method deprecated in Release 1.7.0 + */ + function toString() + { + return $this->__toString(); + } + + // }}} + // {{{ quoteString() + + /** + * DEPRECATED: Quotes a string so it can be safely used within string + * delimiters in a query + * + * @param string $string the string to be quoted + * + * @return string the quoted string + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Method deprecated some time before Release 1.2 + */ + function quoteString($string) + { + $string = $this->quote($string); + if ($string{0} == "'") { + return substr($string, 1, -1); + } + return $string; + } + + // }}} + // {{{ quote() + + /** + * DEPRECATED: Quotes a string so it can be safely used in a query + * + * @param string $string the string to quote + * + * @return string the quoted string or the string NULL + * if the value submitted is null. + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.6.0 + */ + function quote($string = null) + { + return ($string === null) ? 'NULL' + : "'" . str_replace("'", "''", $string) . "'"; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * Delimiting style depends on which database driver is being used. + * + * NOTE: just because you CAN use delimited identifiers doesn't mean + * you SHOULD use them. In general, they end up causing way more + * problems than they solve. + * + * Portability is broken by using the following characters inside + * delimited identifiers: + * + backtick (`) -- due to MySQL + * + double quote (") -- due to Oracle + * + brackets ([ or ]) -- due to Access + * + * Delimited identifiers are known to generally work correctly under + * the following drivers: + * + mssql + * + mysql + * + mysqli + * + oci8 + * + odbc(access) + * + odbc(db2) + * + pgsql + * + sqlite + * + sybase (must execute set quoted_identifier on sometime + * prior to use) + * + * InterBase doesn't seem to be able to use delimited identifiers + * via PHP 4. They work fine under PHP 5. + * + * @param string $str the identifier name to be quoted + * + * @return string the quoted identifier + * + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '"' . str_replace('"', '""', $str) . '"'; + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * The output depends on the PHP data type of input and the database + * type being used. + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + *
    + *
  • + * input -> returns + *
  • + *
  • + * null -> the string NULL + *
  • + *
  • + * integer or double -> the unquoted number + *
  • + *
  • + * bool -> output depends on the driver in use + * Most drivers return integers: 1 if + * true or 0 if + * false. + * Some return strings: TRUE if + * true or FALSE if + * false. + * Finally one returns strings: T if + * true or F if + * false. Here is a list of each DBMS, + * the values returned and the suggested column type: + *
      + *
    • + * dbase -> T/F + * (Logical) + *
    • + *
    • + * fbase -> TRUE/FALSE + * (BOOLEAN) + *
    • + *
    • + * ibase -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * ifx -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * msql -> 1/0 + * (INTEGER) + *
    • + *
    • + * mssql -> 1/0 + * (BIT) + *
    • + *
    • + * mysql -> 1/0 + * (TINYINT(1)) + *
    • + *
    • + * mysqli -> 1/0 + * (TINYINT(1)) + *
    • + *
    • + * oci8 -> 1/0 + * (NUMBER(1)) + *
    • + *
    • + * odbc -> 1/0 + * (SMALLINT) [1] + *
    • + *
    • + * pgsql -> TRUE/FALSE + * (BOOLEAN) + *
    • + *
    • + * sqlite -> 1/0 + * (INTEGER) + *
    • + *
    • + * sybase -> 1/0 + * (TINYINT(1)) + *
    • + *
    + * [1] Accommodate the lowest common denominator because not all + * versions of have BOOLEAN. + *
  • + *
  • + * other (including strings and numeric strings) -> + * the data with single quotes escaped by preceeding + * single quotes, backslashes are escaped by preceeding + * backslashes, then the whole string is encapsulated + * between single quotes + *
  • + *
+ * + * @see DB_common::escapeSimple() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 1 : 0; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", $str); + } + + // }}} + // {{{ provides() + + /** + * Tells whether the present driver supports a given feature + * + * @param string $feature the feature you're curious about + * + * @return bool whether this driver supports $feature + */ + function provides($feature) + { + return $this->features[$feature]; + } + + // }}} + // {{{ setFetchMode() + + /** + * Sets the fetch mode that should be used by default for query results + * + * @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC + * or DB_FETCHMODE_OBJECT + * @param string $object_class the class name of the object to be returned + * by the fetch methods when the + * DB_FETCHMODE_OBJECT mode is selected. + * If no class is specified by default a cast + * to object from the assoc array row will be + * done. There is also the posibility to use + * and extend the 'DB_row' class. + * + * @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT + */ + function setFetchMode($fetchmode, $object_class = 'stdClass') + { + switch ($fetchmode) { + case DB_FETCHMODE_OBJECT: + $this->fetchmode_object_class = $object_class; + case DB_FETCHMODE_ORDERED: + case DB_FETCHMODE_ASSOC: + $this->fetchmode = $fetchmode; + break; + default: + return $this->raiseError('invalid fetchmode mode'); + } + } + + // }}} + // {{{ setOption() + + /** + * Sets run-time configuration options for PEAR DB + * + * Options, their data types, default values and description: + *
    + *
  • + * autofree boolean = false + *
    should results be freed automatically when there are no + * more rows? + *
  • + * result_buffering integer = 500 + *
    how many rows of the result set should be buffered? + *
    In mysql: mysql_unbuffered_query() is used instead of + * mysql_query() if this value is 0. (Release 1.7.0) + *
    In oci8: this value is passed to ocisetprefetch(). + * (Release 1.7.0) + *
  • + * debug integer = 0 + *
    debug level + *
  • + * persistent boolean = false + *
    should the connection be persistent? + *
  • + * portability integer = DB_PORTABILITY_NONE + *
    portability mode constant (see below) + *
  • + * seqname_format string = %s_seq + *
    the sprintf() format string used on sequence names. This + * format is applied to sequence names passed to + * createSequence(), nextID() and dropSequence(). + *
  • + * ssl boolean = false + *
    use ssl to connect? + *
  • + *
+ * + * ----------------------------------------- + * + * PORTABILITY MODES + * + * These modes are bitwised, so they can be combined using | + * and removed using ^. See the examples section below on how + * to do this. + * + * DB_PORTABILITY_NONE + * turn off all portability features + * + * This mode gets automatically turned on if the deprecated + * optimize option gets set to performance. + * + * + * DB_PORTABILITY_LOWERCASE + * convert names of tables and fields to lower case when using + * get*(), fetch*() and tableInfo() + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_RTRIM + * right trim the data output by get*() fetch*() + * + * + * DB_PORTABILITY_DELETE_COUNT + * force reporting the number of rows deleted + * + * Some DBMS's don't count the number of rows deleted when performing + * simple DELETE FROM tablename queries. This portability + * mode tricks such DBMS's into telling the count by adding + * WHERE 1=1 to the end of DELETE queries. + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + fbsql + * + mysql + * + mysqli + * + sqlite + * + * + * DB_PORTABILITY_NUMROWS + * enable hack that makes numRows() work in Oracle + * + * This mode gets automatically turned on in the following databases + * if the deprecated option optimize gets set to + * portability: + * + oci8 + * + * + * DB_PORTABILITY_ERRORS + * makes certain error messages in certain drivers compatible + * with those from other DBMS's + * + * + mysql, mysqli: change unique/primary key constraints + * DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT + * + * + odbc(access): MS's ODBC driver reports 'no such field' as code + * 07001, which means 'too few parameters.' When this option is on + * that code gets mapped to DB_ERROR_NOSUCHFIELD. + * DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD + * + * DB_PORTABILITY_NULL_TO_EMPTY + * convert null values to empty strings in data output by get*() and + * fetch*(). Needed because Oracle considers empty strings to be null, + * while most other DBMS's know the difference between empty and null. + * + * + * DB_PORTABILITY_ALL + * turn on all portability features + * + * ----------------------------------------- + * + * Example 1. Simple setOption() example + * + * $db->setOption('autofree', true); + * + * + * Example 2. Portability for lowercasing and trimming + * + * $db->setOption('portability', + * DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM); + * + * + * Example 3. All portability options except trimming + * + * $db->setOption('portability', + * DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM); + * + * + * @param string $option option name + * @param mixed $value value for the option + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::$options + */ + function setOption($option, $value) + { + if (isset($this->options[$option])) { + $this->options[$option] = $value; + + /* + * Backwards compatibility check for the deprecated 'optimize' + * option. Done here in case settings change after connecting. + */ + if ($option == 'optimize') { + if ($value == 'portability') { + switch ($this->phptype) { + case 'oci8': + $this->options['portability'] = + DB_PORTABILITY_LOWERCASE | + DB_PORTABILITY_NUMROWS; + break; + case 'fbsql': + case 'mysql': + case 'mysqli': + case 'sqlite': + $this->options['portability'] = + DB_PORTABILITY_DELETE_COUNT; + break; + } + } else { + $this->options['portability'] = DB_PORTABILITY_NONE; + } + } + + return DB_OK; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ getOption() + + /** + * Returns the value of an option + * + * @param string $option the option name you're curious about + * + * @return mixed the option's value + */ + function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + return $this->raiseError("unknown option $option"); + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute() + * + * Creates a query that can be run multiple times. Each time it is run, + * the placeholders, if any, will be replaced by the contents of + * execute()'s $data argument. + * + * Three types of placeholders can be used: + * + ? scalar value (i.e. strings, integers). The system + * will automatically quote and escape the data. + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Example 1. + * + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res = $db->execute($sth, $data); + * + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders: + *
+     *    "UPDATE foo SET col=? WHERE col='over \& under'"
+     * 
+ * + * With some database backends, this is emulated. + * + * {@internal ibase and oci8 have their own prepare() methods.}} + * + * @param string $query the query to be prepared + * + * @return mixed DB statement resource on success. A DB_Error object + * on failure. + * + * @see DB_common::execute() + */ + function prepare($query) + { + $tokens = preg_split('/((?prepare_tokens[] = &$newtokens; + end($this->prepare_tokens); + + $k = key($this->prepare_tokens); + $this->prepare_types[$k] = $types; + $this->prepared_queries[$k] = implode(' ', $newtokens); + + return $k; + } + + // }}} + // {{{ autoPrepare() + + /** + * Automaticaly generates an insert or update query and pass it to prepare() + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return resource the query handle + * + * @uses DB_common::prepare(), DB_common::buildManipSQL() + */ + function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $query = $this->buildManipSQL($table, $table_fields, $mode, $where); + if (DB::isError($query)) { + return $query; + } + return $this->prepare($query); + } + + // }}} + // {{{ autoExecute() + + /** + * Automaticaly generates an insert or update query and call prepare() + * and execute() with it + * + * @param string $table the table name + * @param array $fields_values the associative array where $key is a + * field name and $value its value + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @uses DB_common::autoPrepare(), DB_common::execute() + */ + function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT, + $where = false) + { + $sth = $this->autoPrepare($table, array_keys($fields_values), $mode, + $where); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, array_values($fields_values)); + $this->freePrepared($sth); + return $ret; + + } + + // }}} + // {{{ buildManipSQL() + + /** + * Produces an SQL query string for autoPrepare() + * + * Example: + *
+     * buildManipSQL('table_sql', array('field1', 'field2', 'field3'),
+     *               DB_AUTOQUERY_INSERT);
+     * 
+ * + * That returns + * + * INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) + * + * + * NOTES: + * - This belongs more to a SQL Builder class, but this is a simple + * facility. + * - Be carefull! If you don't give a $where param with an UPDATE + * query, all the records of the table will be updated! + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param string $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return string the sql query for autoPrepare() + */ + function buildManipSQL($table, $table_fields, $mode, $where = false) + { + if (count($table_fields) == 0) { + return $this->raiseError(DB_ERROR_NEED_MORE_DATA); + } + $first = true; + switch ($mode) { + case DB_AUTOQUERY_INSERT: + $values = ''; + $names = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $names .= ','; + $values .= ','; + } + $names .= $value; + $values .= '?'; + } + return "INSERT INTO $table ($names) VALUES ($values)"; + case DB_AUTOQUERY_UPDATE: + $set = ''; + foreach ($table_fields as $value) { + if ($first) { + $first = false; + } else { + $set .= ','; + } + $set .= "$value = ?"; + } + $sql = "UPDATE $table SET $set"; + if ($where) { + $sql .= " WHERE $where"; + } + return $sql; + default: + return $this->raiseError(DB_ERROR_SYNTAX); + } + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare() + * + * Example 1. + * + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res =& $db->execute($sth, $data); + * + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * {@internal ibase and oci8 have their own execute() methods.}} + * + * @see DB_common::prepare() + */ + function &execute($stmt, $data = array()) + { + $realquery = $this->executeEmulateQuery($stmt, $data); + if (DB::isError($realquery)) { + return $realquery; + } + $result = $this->simpleQuery($realquery); + + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + + // }}} + // {{{ executeEmulateQuery() + + /** + * Emulates executing prepared statements if the DBMS not support them + * + * @param resource $stmt a DB statement resource returned from execute() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a string containing the real query run when emulating + * prepare/execute. A DB_Error object on failure. + * + * @access protected + * @see DB_common::execute() + */ + function executeEmulateQuery($stmt, $data = array()) + { + $stmt = (int)$stmt; + $data = (array)$data; + $this->last_parameters = $data; + + if (count($this->prepare_types[$stmt]) != count($data)) { + $this->last_query = $this->prepared_queries[$stmt]; + return $this->raiseError(DB_ERROR_MISMATCH); + } + + $realquery = $this->prepare_tokens[$stmt][0]; + + $i = 0; + foreach ($data as $value) { + if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) { + $realquery .= $this->quoteSmart($value); + } elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($value, 'rb'); + if (!$fp) { + return $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + } + $realquery .= $this->quoteSmart(fread($fp, filesize($value))); + fclose($fp); + } else { + $realquery .= $value; + } + + $realquery .= $this->prepare_tokens[$stmt][++$i]; + } + + return $realquery; + } + + // }}} + // {{{ executeMultiple() + + /** + * Performs several execute() calls on the same statement handle + * + * $data must be an array indexed numerically + * from 0, one execute call is done for every "row" in the array. + * + * If an error occurs during execute(), executeMultiple() does not + * execute the unfinished rows, but rather returns that error. + * + * @param resource $stmt query handle from prepare() + * @param array $data numeric array containing the + * data to insert into the query + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::prepare(), DB_common::execute() + */ + function executeMultiple($stmt, $data) + { + foreach ($data as $value) { + $res =& $this->execute($stmt, $value); + if (DB::isError($res)) { + return $res; + } + } + return DB_OK; + } + + // }}} + // {{{ freePrepared() + + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's PHP resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_common::prepare() + */ + function freePrepared($stmt, $free_resource = true) + { + $stmt = (int)$stmt; + if (isset($this->prepare_tokens[$stmt])) { + unset($this->prepare_tokens[$stmt]); + unset($this->prepare_types[$stmt]); + unset($this->prepared_queries[$stmt]); + return true; + } + return false; + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * It is defined here to ensure all drivers have this method available. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(), + * DB_sqlite::modifyQuery() + */ + function modifyQuery($query) + { + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * It is defined here to assure that all implementations + * have this method defined. + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return $query; + } + + // }}} + // {{{ query() + + /** + * Sends a query to the database server + * + * The query string can be either a normal statement to be sent directly + * to the server OR if $params are passed the query can have + * placeholders and it will be passed through prepare() and execute(). + * + * @param string $query the SQL query or the statement to prepare + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + * + * @see DB_result, DB_common::prepare(), DB_common::execute() + */ + function &query($query, $params = array()) + { + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $ret =& $this->execute($sth, $params); + $this->freePrepared($sth, false); + return $ret; + } else { + $this->last_parameters = array(); + $result = $this->simpleQuery($query); + if ($result === DB_OK || DB::isError($result)) { + return $result; + } else { + $tmp =& new DB_result($this, $result); + return $tmp; + } + } + } + + // }}} + // {{{ limitQuery() + + /** + * Generates and executes a LIMIT query + * + * @param string $query the query + * @param intr $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + */ + function &limitQuery($query, $from, $count, $params = array()) + { + $query = $this->modifyLimitQuery($query, $from, $count, $params); + if (DB::isError($query)){ + return $query; + } + $result =& $this->query($query, $params); + if (is_a($result, 'DB_result')) { + $result->setOption('limit_from', $from); + $result->setOption('limit_count', $count); + } + return $result; + } + + // }}} + // {{{ getOne() + + /** + * Fetches the first column of the first row from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed the returned value of the query. + * A DB_Error object on failure. + */ + function &getOne($query, $params = array()) + { + $params = (array)$params; + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, DB_FETCHMODE_ORDERED); + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row[0]; + } + + // }}} + // {{{ getRow() + + /** + * Fetches the first row of data returned from a query result + * + * Takes care of doing the query and freeing the results when finished. + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * + * @return array the first row of results as an array. + * A DB_Error object on failure. + */ + function &getRow($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + // modifyLimitQuery() would be nice here, but it causes BC issues + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + if (DB::isError($sth)) { + return $sth; + } + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $err = $res->fetchInto($row, $fetchmode); + + $res->free(); + + if ($err !== DB_OK) { + return $err; + } + + return $row; + } + + // }}} + // {{{ getCol() + + /** + * Fetches a single column from a query result and returns it as an + * indexed array + * + * @param string $query the SQL query + * @param mixed $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return array the results as an array. A DB_Error object on failure. + * + * @see DB_common::query() + */ + function &getCol($query, $col = 0, $params = array()) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + + if (!is_array($row = $res->fetchRow($fetchmode))) { + $ret = array(); + } else { + if (!array_key_exists($col, $row)) { + $ret =& $this->raiseError(DB_ERROR_NOSUCHFIELD); + } else { + $ret = array($row[$col]); + while (is_array($row = $res->fetchRow($fetchmode))) { + $ret[] = $row[$col]; + } + } + } + + $res->free(); + + if (DB::isError($row)) { + $ret = $row; + } + + return $ret; + } + + // }}} + // {{{ getAssoc() + + /** + * Fetches an entire query result and returns it as an + * associative array using the first column as the key + * + * If the result set contains more than two columns, the value + * will be an array of the values from column 2-n. If the result + * set contains only two columns, the returned value will be a + * scalar with the value of the second column (unless forced to an + * array with the $force_array parameter). A DB error code is + * returned on errors. If the result set contains fewer than two + * columns, a DB_ERROR_TRUNCATED error is returned. + * + * For example, if the table "mytable" contains: + * + *
+     *  ID      TEXT       DATE
+     * --------------------------------
+     *  1       'one'      944679408
+     *  2       'two'      944679408
+     *  3       'three'    944679408
+     * 
+ * + * Then the call getAssoc('SELECT id,text FROM mytable') returns: + *
+     *   array(
+     *     '1' => 'one',
+     *     '2' => 'two',
+     *     '3' => 'three',
+     *   )
+     * 
+ * + * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: + *
+     *   array(
+     *     '1' => array('one', '944679408'),
+     *     '2' => array('two', '944679408'),
+     *     '3' => array('three', '944679408')
+     *   )
+     * 
+ * + * If the more than one row occurs with the same value in the + * first column, the last row overwrites all previous ones by + * default. Use the $group parameter if you don't want to + * overwrite like this. Example: + * + *
+     * getAssoc('SELECT category,id,name FROM mytable', false, null,
+     *          DB_FETCHMODE_ASSOC, true) returns:
+     *
+     *   array(
+     *     '1' => array(array('id' => '4', 'name' => 'number four'),
+     *                  array('id' => '6', 'name' => 'number six')
+     *            ),
+     *     '9' => array(array('id' => '4', 'name' => 'number four'),
+     *                  array('id' => '6', 'name' => 'number six')
+     *            )
+     *   )
+     * 
+ * + * Keep in mind that database functions in PHP usually return string + * values for results regardless of the database's internal type. + * + * @param string $query the SQL query + * @param bool $force_array used only when the query returns + * exactly two columns. If true, the values + * of the returned array will be one-element + * arrays instead of scalars. + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use + * @param bool $group if true, the values of the returned array + * is wrapped in another array. If the same + * key value (in the first column) repeats + * itself, the values will be appended to + * this array instead of overwriting the + * existing values. + * + * @return array the associative array containing the query results. + * A DB_Error object on failure. + */ + function &getAssoc($query, $force_array = false, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT, $group = false) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + $cols = $res->numCols(); + + if ($cols < 2) { + $tmp =& $this->raiseError(DB_ERROR_TRUNCATED); + return $tmp; + } + + $results = array(); + + if ($cols > 2 || $force_array) { + // return array values + // XXX this part can be optimized + if ($fetchmode == DB_FETCHMODE_ASSOC) { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) { + reset($row); + $key = current($row); + unset($row[key($row)]); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } elseif ($fetchmode == DB_FETCHMODE_OBJECT) { + while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { + $arr = get_object_vars($row); + $key = current($arr); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } else { + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + // we shift away the first element to get + // indices running from 0 again + $key = array_shift($row); + if ($group) { + $results[$key][] = $row; + } else { + $results[$key] = $row; + } + } + } + if (DB::isError($row)) { + $results = $row; + } + } else { + // return scalar values + while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { + if ($group) { + $results[$row[0]][] = $row[1]; + } else { + $results[$row[0]] = $row[1]; + } + } + if (DB::isError($row)) { + $results = $row; + } + } + + $res->free(); + + return $results; + } + + // }}} + // {{{ getAll() + + /** + * Fetches all of the rows from a query result + * + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of + * items passed must match quantity of + * placeholders in query: meaning 1 + * placeholder for non-array parameters or + * 1 placeholder per array element. + * @param int $fetchmode the fetch mode to use: + * + DB_FETCHMODE_ORDERED + * + DB_FETCHMODE_ASSOC + * + DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED + * + DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED + * + * @return array the nested array. A DB_Error object on failure. + */ + function &getAll($query, $params = array(), + $fetchmode = DB_FETCHMODE_DEFAULT) + { + // compat check, the params and fetchmode parameters used to + // have the opposite order + if (!is_array($params)) { + if (is_array($fetchmode)) { + if ($params === null) { + $tmp = DB_FETCHMODE_DEFAULT; + } else { + $tmp = $params; + } + $params = $fetchmode; + $fetchmode = $tmp; + } elseif ($params !== null) { + $fetchmode = $params; + $params = array(); + } + } + + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res =& $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res =& $this->query($query); + } + + if ($res === DB_OK || DB::isError($res)) { + return $res; + } + + $results = array(); + while (DB_OK === $res->fetchInto($row, $fetchmode)) { + if ($fetchmode & DB_FETCHMODE_FLIPPED) { + foreach ($row as $key => $val) { + $results[$key][] = $val; + } + } else { + $results[] = $row; + } + } + + $res->free(); + + if (DB::isError($row)) { + $tmp =& $this->raiseError($row); + return $tmp; + } + return $results; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numRows() + + /** + * Determines the number of rows in a query result + * + * @param resource $result the query result idenifier produced by PHP + * + * @return int the number of rows. A DB_Error object on failure. + */ + function numRows($result) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getSequenceName() + + /** + * Generates the name used inside the database for a sequence + * + * The createSequence() docblock contains notes about storing sequence + * names. + * + * @param string $sqn the sequence's public name + * + * @return string the sequence's name in the backend + * + * @access protected + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::nextID(), DB_common::setOption() + */ + function getSequenceName($sqn) + { + return sprintf($this->getOption('seqname_format'), + preg_replace('/[^a-z0-9_.]/i', '_', $sqn)); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::dropSequence(), + * DB_common::getSequenceName() + */ + function nextId($seq_name, $ondemand = true) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * The name of a given sequence is determined by passing the string + * provided in the $seq_name argument through PHP's sprintf() + * function using the value from the seqname_format option as + * the sprintf()'s format argument. + * + * seqname_format is set via setOption(). + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function createSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_common::nextID() + */ + function dropSequence($seq_name) + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ raiseError() + + /** + * Communicates an error and invoke error callbacks, etc + * + * Basically a wrapper for PEAR::raiseError without the message string. + * + * @param mixed integer error code, or a PEAR error object (all + * other parameters are ignored if this parameter is + * an object + * @param int error mode, see PEAR_Error docs + * @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the + * error level (E_USER_NOTICE etc). If error mode is + * PEAR_ERROR_CALLBACK, this is the callback function, + * either as a function name, or as an array of an + * object and method name. For other error modes this + * parameter is ignored. + * @param string extra debug information. Defaults to the last + * query and native error code. + * @param mixed native error code, integer or string depending the + * backend + * + * @return object the PEAR_Error object + * + * @see PEAR_Error + */ + function &raiseError($code = DB_ERROR, $mode = null, $options = null, + $userinfo = null, $nativecode = null) + { + // The error is yet a DB error object + if (is_object($code)) { + // because we the static PEAR::raiseError, our global + // handler should be used if it is set + if ($mode === null && !empty($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + } + $tmp = PEAR::raiseError($code, null, $mode, $options, + null, null, true); + return $tmp; + } + + if ($userinfo === null) { + $userinfo = $this->last_query; + } + + if ($nativecode) { + $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; + } else { + $userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']'; + } + + $tmp = PEAR::raiseError(null, $code, $mode, $options, $userinfo, + 'DB_Error', true); + return $tmp; + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return mixed the DBMS' error code. A DB_Error object on failure. + */ + function errorNative() + { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ errorCode() + + /** + * Maps native error codes to DB's portable ones + * + * Uses the $errorcode_map property defined in each driver. + * + * @param string|int $nativecode the error code returned by the DBMS + * + * @return int the portable DB error code. Return DB_ERROR if the + * current driver doesn't have a mapping for the + * $nativecode submitted. + */ + function errorCode($nativecode) + { + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ errorMessage() + + /** + * Maps a DB error code to a textual message + * + * @param integer $dbcode the DB error code + * + * @return string the error message corresponding to the error code + * submitted. FALSE if the error code is unknown. + * + * @see DB::errorMessage() + */ + function errorMessage($dbcode) + { + return DB::errorMessage($this->errorcode_map[$dbcode]); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * The format of the resulting array depends on which $mode + * you select. The sample output below is based on this query: + *
+     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
+     *    FROM tblFoo
+     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId
+     * 
+ * + *
    + *
  • + * + * null (default) + *
    +     *   [0] => Array (
    +     *       [table] => tblFoo
    +     *       [name] => fldId
    +     *       [type] => int
    +     *       [len] => 11
    +     *       [flags] => primary_key not_null
    +     *   )
    +     *   [1] => Array (
    +     *       [table] => tblFoo
    +     *       [name] => fldPhone
    +     *       [type] => string
    +     *       [len] => 20
    +     *       [flags] =>
    +     *   )
    +     *   [2] => Array (
    +     *       [table] => tblBar
    +     *       [name] => fldId
    +     *       [type] => int
    +     *       [len] => 11
    +     *       [flags] => primary_key not_null
    +     *   )
    +     *   
    + * + *
  • + * + * DB_TABLEINFO_ORDER + * + *

    In addition to the information found in the default output, + * a notation of the number of columns is provided by the + * num_fields element while the order + * element provides an array with the column names as the keys and + * their location index number (corresponding to the keys in the + * the default output) as the values.

    + * + *

    If a result set has identical field names, the last one is + * used.

    + * + *
    +     *   [num_fields] => 3
    +     *   [order] => Array (
    +     *       [fldId] => 2
    +     *       [fldTrans] => 1
    +     *   )
    +     *   
    + * + *
  • + * + * DB_TABLEINFO_ORDERTABLE + * + *

    Similar to DB_TABLEINFO_ORDER but adds more + * dimensions to the array in which the table names are keys and + * the field names are sub-keys. This is helpful for queries that + * join tables which have identical field names.

    + * + *
    +     *   [num_fields] => 3
    +     *   [ordertable] => Array (
    +     *       [tblFoo] => Array (
    +     *           [fldId] => 0
    +     *           [fldPhone] => 1
    +     *       )
    +     *       [tblBar] => Array (
    +     *           [fldId] => 2
    +     *       )
    +     *   )
    +     *   
    + * + *
  • + *
+ * + * The flags element contains a space separated list + * of extra information about the field. This data is inconsistent + * between DBMS's due to the way each DBMS works. + * + primary_key + * + unique_key + * + multiple_key + * + not_null + * + * Most DBMS's only provide the table and flags + * elements if $result is a table name. The following DBMS's + * provide full information from queries: + * + fbsql + * + mysql + * + * If the 'portability' option has DB_PORTABILITY_LOWERCASE + * turned on, the names of tables and fields will be lowercased. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode either unused or one of the tableInfo modes: + * DB_TABLEINFO_ORDERTABLE, + * DB_TABLEINFO_ORDER or + * DB_TABLEINFO_FULL (which does both). + * These are bitwise, so the first two can be + * combined using |. + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function tableInfo($result, $mode = null) + { + /* + * If the DB_ class has a tableInfo() method, that one + * overrides this one. But, if the driver doesn't have one, + * this method runs and tells users about that fact. + */ + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ getTables() + + /** + * Lists the tables in the current database + * + * @return array the list of tables. A DB_Error object on failure. + * + * @deprecated Method deprecated some time before Release 1.2 + */ + function getTables() + { + return $this->getListOf('tables'); + } + + // }}} + // {{{ getListOf() + + /** + * Lists internal database information + * + * @param string $type type of information being sought. + * Common items being sought are: + * tables, databases, users, views, functions + * Each DBMS's has its own capabilities. + * + * @return array an array listing the items sought. + * A DB DB_Error object on failure. + */ + function getListOf($type) + { + $sql = $this->getSpecialQuery($type); + if ($sql === null) { + $this->last_query = ''; + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } elseif (is_int($sql) || DB::isError($sql)) { + // Previous error + return $this->raiseError($sql); + } elseif (is_array($sql)) { + // Already the result + return $sql; + } + // Launch this query + return $this->getCol($sql); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } + + // }}} + // {{{ _rtrimArrayValues() + + /** + * Right-trims all strings in an array + * + * @param array $array the array to be trimmed (passed by reference) + * + * @return void + * + * @access protected + */ + function _rtrimArrayValues(&$array) + { + foreach ($array as $key => $value) { + if (is_string($value)) { + $array[$key] = rtrim($value); + } + } + } + + // }}} + // {{{ _convertNullArrayValuesToEmpty() + + /** + * Converts all null values in an array to empty strings + * + * @param array $array the array to be de-nullified (passed by reference) + * + * @return void + * + * @access protected + */ + function _convertNullArrayValuesToEmpty(&$array) + { + foreach ($array as $key => $value) { + if (is_null($value)) { + $array[$key] = ''; + } + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/dbase.php b/includes/DB/dbase.php new file mode 100644 index 0000000..c1d1f1e --- /dev/null +++ b/includes/DB/dbase.php @@ -0,0 +1,510 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: dbase.php,v 1.39 2005/02/19 23:25:25 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's dbase extension + * for interacting with dBase databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Tomas V.V. Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_dbase extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'dbase'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'dbase'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => false, + 'new_link' => false, + 'numrows' => true, + 'pconnect' => false, + 'prepare' => false, + 'ssl' => false, + 'transactions' => false, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * A means of emulating result resources + * @var array + */ + var $res_row = array(); + + /** + * The quantity of results so far + * + * For emulating result resources. + * + * @var integer + */ + var $result = 0; + + /** + * Maps dbase data type id's to human readable strings + * + * The human readable values are based on the output of PHP's + * dbase_get_header_info() function. + * + * @var array + * @since Property available since Release 1.7.0 + */ + var $types = array( + 'C' => 'character', + 'D' => 'date', + 'L' => 'boolean', + 'M' => 'memo', + 'N' => 'number', + ); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_dbase() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database and create it if it doesn't exist + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's dbase driver supports the following extra DSN options: + * + mode An integer specifying the read/write mode to use + * (0 = read only, 1 = write only, 2 = read/write). + * Available since PEAR DB 1.7.0. + * + fields An array of arrays that PHP's dbase_create() function needs + * to create a new database. This information is used if the + * dBase file specified in the "database" segment of the DSN + * does not exist. For more info, see the PHP manual's + * {@link http://php.net/dbase_create dbase_create()} page. + * Available since PEAR DB 1.7.0. + * + * Example of how to connect and establish a new dBase file if necessary: + * + * require_once 'DB.php'; + * + * $dsn = array( + * 'phptype' => 'dbase', + * 'database' => '/path/and/name/of/dbase/file', + * 'mode' => 2, + * 'fields' => array( + * array('a', 'N', 5, 0), + * array('b', 'C', 40), + * array('c', 'C', 255), + * array('d', 'C', 20), + * ), + * ); + * $options = array( + * 'debug' => 2, + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('dbase')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + /* + * Turn track_errors on for entire script since $php_errormsg + * is the only way to find errors from the dbase extension. + */ + ini_set('track_errors', 1); + $php_errormsg = ''; + + if (!file_exists($dsn['database'])) { + $this->dsn['mode'] = 2; + if (empty($dsn['fields']) || !is_array($dsn['fields'])) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + 'the dbase file does not exist and ' + . 'it could not be created because ' + . 'the "fields" element of the DSN ' + . 'is not properly set'); + } + $this->connection = @dbase_create($dsn['database'], + $dsn['fields']); + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + 'the dbase file does not exist and ' + . 'the attempt to create it failed: ' + . $php_errormsg); + } + } else { + if (!isset($this->dsn['mode'])) { + $this->dsn['mode'] = 0; + } + $this->connection = @dbase_open($dsn['database'], + $this->dsn['mode']); + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @dbase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ &query() + + function &query($query = null) + { + // emulate result resources + $this->res_row[(int)$this->result] = 0; + $tmp =& new DB_result($this, $this->result++); + return $tmp; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum === null) { + $rownum = $this->res_row[(int)$result]++; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @dbase_get_record_with_names($this->connection, $rownum); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @dbase_get_record($this->connection, $rownum); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($foo) + { + return @dbase_numfields($this->connection); + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($foo) + { + return @dbase_numrecords($this->connection); + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * + null = the string NULL + * + boolean = T if true or + * F if false. Use the Logical + * data type. + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data with single quotes escaped by preceeding + * single quotes then the whole string is encapsulated + * between single quotes + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'T' : 'F'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about the current database + * + * @param mixed $result THIS IS UNUSED IN DBASE. The current database + * is examined regardless of what is provided here. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + * @since Method available since Release 1.7.0 + */ + function tableInfo($result = null, $mode = null) + { + if (function_exists('dbase_get_header_info')) { + $id = @dbase_get_header_info($this->connection); + if (!$id && $php_errormsg) { + return $this->raiseError(DB_ERROR, + null, null, null, + $php_errormsg); + } + } else { + /* + * This segment for PHP 4 is loosely based on code by + * Hadi Rusiah in the comments on + * the dBase reference page in the PHP manual. + */ + $db = @fopen($this->dsn['database'], 'r'); + if (!$db) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + + $id = array(); + $i = 0; + + $line = fread($db, 32); + while (!feof($db)) { + $line = fread($db, 32); + if (substr($line, 0, 1) == chr(13)) { + break; + } else { + $pos = strpos(substr($line, 0, 10), chr(0)); + $pos = ($pos == 0 ? 10 : $pos); + $id[$i] = array( + 'name' => substr($line, 0, $pos), + 'type' => $this->types[substr($line, 11, 1)], + 'length' => ord(substr($line, 16, 1)), + 'precision' => ord(substr($line, 17, 1)), + ); + } + $i++; + } + + fclose($db); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $res = array(); + $count = count($id); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $this->dsn['database'], + 'name' => $case_func($id[$i]['name']), + 'type' => $id[$i]['type'], + 'len' => $id[$i]['length'], + 'flags' => '' + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + return $res; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/fbsql.php b/includes/DB/fbsql.php new file mode 100644 index 0000000..7f068d4 --- /dev/null +++ b/includes/DB/fbsql.php @@ -0,0 +1,770 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: fbsql.php,v 1.82 2005/03/04 23:12:36 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's fbsql extension + * for interacting with FrontBase databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Frank M. Kromann + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + * @since Class functional since Release 1.7.0 + */ +class DB_fbsql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'fbsql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'fbsql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 22 => DB_ERROR_SYNTAX, + 85 => DB_ERROR_ALREADY_EXISTS, + 108 => DB_ERROR_SYNTAX, + 116 => DB_ERROR_NOSUCHTABLE, + 124 => DB_ERROR_VALUE_COUNT_ON_ROW, + 215 => DB_ERROR_NOSUCHFIELD, + 217 => DB_ERROR_INVALID_NUMBER, + 226 => DB_ERROR_NOSUCHFIELD, + 231 => DB_ERROR_INVALID, + 239 => DB_ERROR_TRUNCATED, + 251 => DB_ERROR_SYNTAX, + 266 => DB_ERROR_NOT_FOUND, + 357 => DB_ERROR_CONSTRAINT_NOT_NULL, + 358 => DB_ERROR_CONSTRAINT, + 360 => DB_ERROR_CONSTRAINT, + 361 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_fbsql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('fbsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array( + $dsn['hostspec'] ? $dsn['hostspec'] : 'localhost', + $dsn['username'] ? $dsn['username'] : null, + $dsn['password'] ? $dsn['password'] : null, + ); + + $connect_function = $persistent ? 'fbsql_pconnect' : 'fbsql_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + + if ($dsn['database']) { + if (!@fbsql_select_db($dsn['database'], $this->connection)) { + return $this->fbsqlRaiseError(); + } + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @fbsql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @fbsql_query("$query;", $this->connection); + if (!$result) { + return $this->fbsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if (DB::isManip($query)) { + return DB_OK; + } + return $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal fbsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @fbsql_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@fbsql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @fbsql_fetch_array($result, FBSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @fbsql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @fbsql_free_result($result); + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff=false) + { + if ($onoff) { + $this->query("SET COMMIT TRUE"); + } else { + $this->query("SET COMMIT FALSE"); + } + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + @fbsql_commit(); + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + @fbsql_rollback(); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @fbsql_num_fields($result); + if (!$cols) { + return $this->fbsqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @fbsql_num_rows($result); + if ($rows === null) { + return $this->fbsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $result = @fbsql_affected_rows($this->connection); + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_fbsql::createSequence(), DB_fbsql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query('SELECT UNIQUE FROM ' . $seqname); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $result; + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->fbsqlRaiseError(); + } + $result->fetchInto($tmp, DB_FETCHMODE_ORDERED); + return $tmp[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_fbsql::nextID(), DB_fbsql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER NOT NULL,' + . ' PRIMARY KEY(id))'); + if ($res) { + $res = $this->query('SET UNIQUE = 0 FOR ' . $seqname); + } + return $res; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_fbsql::nextID(), DB_fbsql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name) + . ' RESTRICT'); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return preg_replace('/^([\s(])*SELECT/i', + "\\1SELECT TOP($count)", $query); + } else { + return preg_replace('/([\s(])*SELECT/i', + "\\1SELECT TOP($from, $count)", $query); + } + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * + null = the string NULL + * + boolean = string TRUE or FALSE + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to FrontBase's settings + * then encapsulated between single quotes + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ fbsqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_fbsql::errorNative(), DB_common::errorCode() + */ + function fbsqlRaiseError($errno = null) + { + if ($errno === null) { + $errno = $this->errorCode(fbsql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @fbsql_error($this->connection)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + return @fbsql_errno($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @fbsql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->fbsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @fbsql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $case_func(@fbsql_field_table($id, $i)), + 'name' => $case_func(@fbsql_field_name($id, $i)), + 'type' => @fbsql_field_type($id, $i), + 'len' => @fbsql_field_len($id, $i), + 'flags' => @fbsql_field_flags($id, $i), + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @fbsql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT "table_name" FROM information_schema.tables' + . ' t0, information_schema.schemata t1' + . ' WHERE t0.schema_pk=t1.schema_pk AND' + . ' "table_type" = \'BASE TABLE\'' + . ' AND "schema_name" = current_schema'; + case 'views': + return 'SELECT "table_name" FROM information_schema.tables' + . ' t0, information_schema.schemata t1' + . ' WHERE t0.schema_pk=t1.schema_pk AND' + . ' "table_type" = \'VIEW\'' + . ' AND "schema_name" = current_schema'; + case 'users': + return 'SELECT "user_name" from information_schema.users'; + case 'functions': + return 'SELECT "routine_name" FROM' + . ' information_schema.psm_routines' + . ' t0, information_schema.schemata t1' + . ' WHERE t0.schema_pk=t1.schema_pk' + . ' AND "routine_kind"=\'FUNCTION\'' + . ' AND "schema_name" = current_schema'; + case 'procedures': + return 'SELECT "routine_name" FROM' + . ' information_schema.psm_routines' + . ' t0, information_schema.schemata t1' + . ' WHERE t0.schema_pk=t1.schema_pk' + . ' AND "routine_kind"=\'PROCEDURE\'' + . ' AND "schema_name" = current_schema'; + default: + return null; + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/ibase.php b/includes/DB/ibase.php new file mode 100644 index 0000000..d04354f --- /dev/null +++ b/includes/DB/ibase.php @@ -0,0 +1,1071 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: ibase.php,v 1.109 2005/03/04 23:12:36 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's interbase extension + * for interacting with Interbase and Firebird databases + * + * These methods overload the ones declared in DB_common. + * + * While this class works with PHP 4, PHP's InterBase extension is + * unstable in PHP 4. Use PHP 5. + * + * NOTICE: limitQuery() only works for Firebird. + * + * @category Database + * @package DB + * @author Sterling Hughes + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + * @since Class became stable in Release 1.7.0 + */ +class DB_ibase extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'ibase'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'ibase'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * NOTE: only firebird supports limit. + * + * @var array + */ + var $features = array( + 'limit' => false, + 'new_link' => false, + 'numrows' => 'emulate', + 'pconnect' => true, + 'prepare' => true, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + -104 => DB_ERROR_SYNTAX, + -150 => DB_ERROR_ACCESS_VIOLATION, + -151 => DB_ERROR_ACCESS_VIOLATION, + -155 => DB_ERROR_NOSUCHTABLE, + -157 => DB_ERROR_NOSUCHFIELD, + -158 => DB_ERROR_VALUE_COUNT_ON_ROW, + -170 => DB_ERROR_MISMATCH, + -171 => DB_ERROR_MISMATCH, + -172 => DB_ERROR_INVALID, + // -204 => // Covers too many errors, need to use regex on msg + -205 => DB_ERROR_NOSUCHFIELD, + -206 => DB_ERROR_NOSUCHFIELD, + -208 => DB_ERROR_INVALID, + -219 => DB_ERROR_NOSUCHTABLE, + -297 => DB_ERROR_CONSTRAINT, + -303 => DB_ERROR_INVALID, + -413 => DB_ERROR_INVALID_NUMBER, + -530 => DB_ERROR_CONSTRAINT, + -551 => DB_ERROR_ACCESS_VIOLATION, + -552 => DB_ERROR_ACCESS_VIOLATION, + // -607 => // Covers too many errors, need to use regex on msg + -625 => DB_ERROR_CONSTRAINT_NOT_NULL, + -803 => DB_ERROR_CONSTRAINT, + -804 => DB_ERROR_VALUE_COUNT_ON_ROW, + -904 => DB_ERROR_CONNECT_FAILED, + -922 => DB_ERROR_NOSUCHDB, + -923 => DB_ERROR_CONNECT_FAILED, + -924 => DB_ERROR_CONNECT_FAILED + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * The number of rows affected by a data manipulation query + * @var integer + * @access private + */ + var $affected = 0; + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The prepared statement handle from the most recently executed statement + * + * {@internal Mainly here because the InterBase/Firebird API is only + * able to retrieve data from result sets if the statemnt handle is + * still in scope.}} + * + * @var resource + */ + var $last_stmt; + + /** + * Is the given prepared statement a data manipulation query? + * @var array + * @access private + */ + var $manip_query = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_ibase() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's ibase driver supports the following extra DSN options: + * + buffers The number of database buffers to allocate for the + * server-side cache. + * + charset The default character set for a database. + * + dialect The default SQL dialect for any statement + * executed within a connection. Defaults to the + * highest one supported by client libraries. + * Functional only with InterBase 6 and up. + * + role Functional only with InterBase 5 and up. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('interbase')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + if ($this->dbsyntax == 'firebird') { + $this->features['limit'] = 'alter'; + } + + $params = array( + $dsn['hostspec'] + ? ($dsn['hostspec'] . ':' . $dsn['database']) + : $dsn['database'], + $dsn['username'] ? $dsn['username'] : null, + $dsn['password'] ? $dsn['password'] : null, + isset($dsn['charset']) ? $dsn['charset'] : null, + isset($dsn['buffers']) ? $dsn['buffers'] : null, + isset($dsn['dialect']) ? $dsn['dialect'] : null, + isset($dsn['role']) ? $dsn['role'] : null, + ); + + $connect_function = $persistent ? 'ibase_pconnect' : 'ibase_connect'; + + $this->connection = @call_user_func_array($connect_function, $params); + if (!$this->connection) { + return $this->ibaseRaiseError(DB_ERROR_CONNECT_FAILED); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @ibase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @ibase_query($this->connection, $query); + + if (!$result) { + return $this->ibaseRaiseError(); + } + if ($this->autocommit && $ismanip) { + @ibase_commit($this->connection); + } + if ($ismanip) { + $this->affected = $result; + return DB_OK; + } else { + $this->affected = 0; + return $result; + } + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * Only works with Firebird. + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if ($this->dsn['dbsyntax'] == 'firebird') { + $query = preg_replace('/^([\s(])*SELECT/i', + "SELECT FIRST $count SKIP $from", $query); + } + return $query; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal ibase result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + return $this->ibaseRaiseError(DB_ERROR_NOT_CAPABLE); + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + if (function_exists('ibase_fetch_assoc')) { + $arr = @ibase_fetch_assoc($result); + } else { + $arr = get_object_vars(ibase_fetch_object($result)); + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @ibase_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @ibase_free_result($result); + } + + // }}} + // {{{ freeQuery() + + function freeQuery($query) + { + @ibase_free_query($query); + return true; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (is_integer($this->affected)) { + return $this->affected; + } + return $this->ibaseRaiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @ibase_num_fields($result); + if (!$cols) { + return $this->ibaseRaiseError(); + } + return $cols; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * + * prepare() requires a generic query as string like + * INSERT INTO numbers VALUES (?, ?, ?) + * . The ? characters are placeholders. + * + * Three types of placeholders can be used: + * + ? a quoted scalar value, i.e. strings, integers + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders. Example: + * "UPDATE foo SET col=? WHERE col='over \& under'" + * + * + * @param string $query query to be prepared + * @return mixed DB statement resource on success. DB_Error on failure. + */ + function prepare($query) + { + $tokens = preg_split('/((? $val) { + switch ($val) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + break; + case '!': + $types[$token++] = DB_PARAM_MISC; + break; + default: + $tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val); + $newquery .= $tokens[$key] . '?'; + } + } + + $newquery = substr($newquery, 0, -1); + $this->last_query = $query; + $newquery = $this->modifyQuery($newquery); + $stmt = @ibase_prepare($this->connection, $newquery); + $this->prepare_types[(int)$stmt] = $types; + $this->manip_query[(int)$stmt] = DB::isManip($query); + return $stmt; + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare(). + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 for non-array items or the + * quantity of elements in the array. + * @return object a new DB_Result or a DB_Error when fail + * @see DB_ibase::prepare() + * @access public + */ + function &execute($stmt, $data = array()) + { + $data = (array)$data; + $this->last_parameters = $data; + + $types =& $this->prepare_types[(int)$stmt]; + if (count($types) != count($data)) { + $tmp =& $this->raiseError(DB_ERROR_MISMATCH); + return $tmp; + } + + $i = 0; + foreach ($data as $key => $value) { + if ($types[$i] == DB_PARAM_MISC) { + /* + * ibase doesn't seem to have the ability to pass a + * parameter along unchanged, so strip off quotes from start + * and end, plus turn two single quotes to one single quote, + * in order to avoid the quotes getting escaped by + * ibase and ending up in the database. + */ + $data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]); + $data[$key] = str_replace("''", "'", $data[$key]); + } elseif ($types[$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($data[$key], 'rb'); + if (!$fp) { + $tmp =& $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + return $tmp; + } + $data[$key] = fread($fp, filesize($data[$key])); + fclose($fp); + } + $i++; + } + + array_unshift($data, $stmt); + + $res = call_user_func_array('ibase_execute', $data); + if (!$res) { + $tmp =& $this->ibaseRaiseError(); + return $tmp; + } + /* XXX need this? + if ($this->autocommit && $this->manip_query[(int)$stmt]) { + @ibase_commit($this->connection); + }*/ + $this->last_stmt = $stmt; + if ($this->manip_query[(int)$stmt]) { + $tmp = DB_OK; + } else { + $tmp =& new DB_result($this, $res); + } + return $tmp; + } + + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's PHP resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_ibase::prepare() + */ + function freePrepared($stmt, $free_resource = true) + { + if (!is_resource($stmt)) { + return false; + } + if ($free_resource) { + @ibase_free_query($stmt); + } + unset($this->prepare_tokens[(int)$stmt]); + unset($this->prepare_types[(int)$stmt]); + unset($this->manip_query[(int)$stmt]); + return true; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + $this->autocommit = $onoff ? 1 : 0; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + return @ibase_commit($this->connection); + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + return @ibase_rollback($this->connection); + } + + // }}} + // {{{ transactionInit() + + function transactionInit($trans_args = 0) + { + return $trans_args + ? @ibase_trans($trans_args, $this->connection) + : @ibase_trans(); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_ibase::createSequence(), DB_ibase::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $sqn = strtoupper($this->getSequenceName($seq_name)); + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT GEN_ID(${sqn}, 1) " + . 'FROM RDB$GENERATORS ' + . "WHERE RDB\$GENERATOR_NAME='${sqn}'"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result)) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $result; + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_ibase::nextID(), DB_ibase::dropSequence() + */ + function createSequence($seq_name) + { + $sqn = strtoupper($this->getSequenceName($seq_name)); + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("CREATE GENERATOR ${sqn}"); + $this->popErrorHandling(); + + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_ibase::nextID(), DB_ibase::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DELETE FROM RDB$GENERATORS ' + . "WHERE RDB\$GENERATOR_NAME='" + . strtoupper($this->getSequenceName($seq_name)) + . "'"); + } + + // }}} + // {{{ _ibaseFieldFlags() + + /** + * Get the column's flags + * + * Supports "primary_key", "unique_key", "not_null", "default", + * "computed" and "blob". + * + * @param string $field_name the name of the field + * @param string $table_name the name of the table + * + * @return string the flags + * + * @access private + */ + function _ibaseFieldFlags($field_name, $table_name) + { + $sql = 'SELECT R.RDB$CONSTRAINT_TYPE CTYPE' + .' FROM RDB$INDEX_SEGMENTS I' + .' JOIN RDB$RELATION_CONSTRAINTS R ON I.RDB$INDEX_NAME=R.RDB$INDEX_NAME' + .' WHERE I.RDB$FIELD_NAME=\'' . $field_name . '\'' + .' AND UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\''; + + $result = @ibase_query($this->connection, $sql); + if (!$result) { + return $this->ibaseRaiseError(); + } + + $flags = ''; + if ($obj = @ibase_fetch_object($result)) { + @ibase_free_result($result); + if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'PRIMARY KEY') { + $flags .= 'primary_key '; + } + if (isset($obj->CTYPE) && trim($obj->CTYPE) == 'UNIQUE') { + $flags .= 'unique_key '; + } + } + + $sql = 'SELECT R.RDB$NULL_FLAG AS NFLAG,' + .' R.RDB$DEFAULT_SOURCE AS DSOURCE,' + .' F.RDB$FIELD_TYPE AS FTYPE,' + .' F.RDB$COMPUTED_SOURCE AS CSOURCE' + .' FROM RDB$RELATION_FIELDS R ' + .' JOIN RDB$FIELDS F ON R.RDB$FIELD_SOURCE=F.RDB$FIELD_NAME' + .' WHERE UPPER(R.RDB$RELATION_NAME)=\'' . strtoupper($table_name) . '\'' + .' AND R.RDB$FIELD_NAME=\'' . $field_name . '\''; + + $result = @ibase_query($this->connection, $sql); + if (!$result) { + return $this->ibaseRaiseError(); + } + if ($obj = @ibase_fetch_object($result)) { + @ibase_free_result($result); + if (isset($obj->NFLAG)) { + $flags .= 'not_null '; + } + if (isset($obj->DSOURCE)) { + $flags .= 'default '; + } + if (isset($obj->CSOURCE)) { + $flags .= 'computed '; + } + if (isset($obj->FTYPE) && $obj->FTYPE == 261) { + $flags .= 'blob '; + } + } + + return trim($flags); + } + + // }}} + // {{{ ibaseRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_ibase::errorNative(), DB_ibase::errorCode() + */ + function &ibaseRaiseError($errno = null) + { + if ($errno === null) { + $errno = $this->errorCode($this->errorNative()); + } + $tmp =& $this->raiseError($errno, null, null, null, @ibase_errmsg()); + return $tmp; + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code. NULL if there is no error code. + * + * @since Method available since Release 1.7.0 + */ + function errorNative() + { + if (function_exists('ibase_errcode')) { + return @ibase_errcode(); + } + if (preg_match('/^Dynamic SQL Error SQL error code = ([0-9-]+)/i', + @ibase_errmsg(), $m)) { + return (int)$m[1]; + } + return null; + } + + // }}} + // {{{ errorCode() + + /** + * Maps native error codes to DB's portable ones + * + * @param int $nativecode the error code returned by the DBMS + * + * @return int the portable DB error code. Return DB_ERROR if the + * current driver doesn't have a mapping for the + * $nativecode submitted. + * + * @since Method available since Release 1.7.0 + */ + function errorCode($nativecode = null) + { + if (isset($this->errorcode_map[$nativecode])) { + return $this->errorcode_map[$nativecode]; + } + + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/generator .* is not defined/' + => DB_ERROR_SYNTAX, // for compat. w ibase_errcode() + '/table.*(not exist|not found|unknown)/i' + => DB_ERROR_NOSUCHTABLE, + '/table .* already exists/i' + => DB_ERROR_ALREADY_EXISTS, + '/unsuccessful metadata update .* failed attempt to store duplicate value/i' + => DB_ERROR_ALREADY_EXISTS, + '/unsuccessful metadata update .* not found/i' + => DB_ERROR_NOT_FOUND, + '/validation error for column .* value "\*\*\* null/i' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violation of [\w ]+ constraint/i' + => DB_ERROR_CONSTRAINT, + '/conversion error from string/i' + => DB_ERROR_INVALID_NUMBER, + '/no permission for/i' + => DB_ERROR_ACCESS_VIOLATION, + '/arithmetic exception, numeric overflow, or string truncation/i' + => DB_ERROR_INVALID, + ); + } + + $errormsg = @ibase_errmsg(); + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @ibase_query($this->connection, + "SELECT * FROM $result WHERE 1=0"); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->ibaseRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @ibase_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $info = @ibase_field_info($id, $i); + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func($info['name']), + 'type' => $info['type'], + 'len' => $info['length'], + 'flags' => ($got_string) + ? $this->_ibaseFieldFlags($info['name'], $result) + : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @ibase_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT DISTINCT R.RDB$RELATION_NAME FROM ' + . 'RDB$RELATION_FIELDS R WHERE R.RDB$SYSTEM_FLAG=0'; + case 'views': + return 'SELECT DISTINCT RDB$VIEW_NAME from RDB$VIEW_RELATIONS'; + case 'users': + return 'SELECT DISTINCT RDB$USER FROM RDB$USER_PRIVILEGES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/ifx.php b/includes/DB/ifx.php new file mode 100644 index 0000000..97b3b0a --- /dev/null +++ b/includes/DB/ifx.php @@ -0,0 +1,681 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: ifx.php,v 1.70 2005/02/20 00:44:48 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's ifx extension + * for interacting with Informix databases + * + * These methods overload the ones declared in DB_common. + * + * More info on Informix errors can be found at: + * http://www.informix.com/answers/english/ierrors.htm + * + * TODO: + * - set needed env Informix vars on connect + * - implement native prepare/execute + * + * @category Database + * @package DB + * @author Tomas V.V.Cox + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_ifx extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'ifx'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'ifx'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'emulate', + 'new_link' => false, + 'numrows' => 'emulate', + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + '-201' => DB_ERROR_SYNTAX, + '-206' => DB_ERROR_NOSUCHTABLE, + '-217' => DB_ERROR_NOSUCHFIELD, + '-236' => DB_ERROR_VALUE_COUNT_ON_ROW, + '-239' => DB_ERROR_CONSTRAINT, + '-253' => DB_ERROR_SYNTAX, + '-292' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-310' => DB_ERROR_ALREADY_EXISTS, + '-316' => DB_ERROR_ALREADY_EXISTS, + '-319' => DB_ERROR_NOT_FOUND, + '-329' => DB_ERROR_NODBSELECTED, + '-346' => DB_ERROR_CONSTRAINT, + '-386' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-391' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-554' => DB_ERROR_SYNTAX, + '-691' => DB_ERROR_CONSTRAINT, + '-692' => DB_ERROR_CONSTRAINT, + '-703' => DB_ERROR_CONSTRAINT_NOT_NULL, + '-1204' => DB_ERROR_INVALID_DATE, + '-1205' => DB_ERROR_INVALID_DATE, + '-1206' => DB_ERROR_INVALID_DATE, + '-1209' => DB_ERROR_INVALID_DATE, + '-1210' => DB_ERROR_INVALID_DATE, + '-1212' => DB_ERROR_INVALID_DATE, + '-1213' => DB_ERROR_INVALID_NUMBER, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The number of rows affected by a data manipulation query + * @var integer + * @access private + */ + var $affected = 0; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_ifx() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('informix') && + !PEAR::loadExtension('Informix')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $dbhost = $dsn['hostspec'] ? '@' . $dsn['hostspec'] : ''; + $dbname = $dsn['database'] ? $dsn['database'] . $dbhost : ''; + $user = $dsn['username'] ? $dsn['username'] : ''; + $pw = $dsn['password'] ? $dsn['password'] : ''; + + $connect_function = $persistent ? 'ifx_pconnect' : 'ifx_connect'; + + $this->connection = @$connect_function($dbname, $user, $pw); + if (!is_resource($this->connection)) { + return $this->ifxRaiseError(DB_ERROR_CONNECT_FAILED); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @ifx_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $this->affected = null; + if (preg_match('/(SELECT)/i', $query)) { //TESTME: Use !DB::isManip()? + // the scroll is needed for fetching absolute row numbers + // in a select query result + $result = @ifx_query($query, $this->connection, IFX_SCROLL); + } else { + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @ifx_query('BEGIN WORK', $this->connection); + if (!$result) { + return $this->ifxRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @ifx_query($query, $this->connection); + } + if (!$result) { + return $this->ifxRaiseError(); + } + $this->affected = @ifx_affected_rows($result); + // Determine which queries should return data, and which + // should return an error code only. + if (preg_match('/(SELECT)/i', $query)) { + return $result; + } + // XXX Testme: free results inside a transaction + // may cause to stop it and commit the work? + + // Result has to be freed even with a insert or update + @ifx_free_result($result); + + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal ifx result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return $this->affected; + } else { + return 0; + } + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if (($rownum !== null) && ($rownum < 0)) { + return null; + } + if ($rownum === null) { + /* + * Even though fetch_row() should return the next row if + * $rownum is null, it doesn't in all cases. Bug 598. + */ + $rownum = 'NEXT'; + } else { + // Index starts at row 1, unlike most DBMS's starting at 0. + $rownum++; + } + if (!$arr = @ifx_fetch_row($result, $rownum)) { + return null; + } + if ($fetchmode !== DB_FETCHMODE_ASSOC) { + $i=0; + $order = array(); + foreach ($arr as $val) { + $order[$i++] = $val; + } + $arr = $order; + } elseif ($fetchmode == DB_FETCHMODE_ASSOC && + $this->options['portability'] & DB_PORTABILITY_LOWERCASE) + { + $arr = array_change_key_case($arr, CASE_LOWER); + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + if (!$cols = @ifx_num_fields($result)) { + return $this->ifxRaiseError(); + } + return $cols; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @ifx_free_result($result); + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = true) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + $result = @ifx_query('COMMIT WORK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->ifxRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @ifx_query('ROLLBACK WORK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->ifxRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ ifxRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_ifx::errorNative(), DB_ifx::errorCode() + */ + function ifxRaiseError($errno = null) + { + if ($errno === null) { + $errno = $this->errorCode(ifx_error()); + } + return $this->raiseError($errno, null, null, null, + $this->errorNative()); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code and message produced by the last query + * + * @return string the DBMS' error code and message + */ + function errorNative() + { + return @ifx_error() . ' ' . @ifx_errormsg(); + } + + // }}} + // {{{ errorCode() + + /** + * Maps native error codes to DB's portable ones. + * + * Requires that the DB implementation's constructor fills + * in the $errorcode_map property. + * + * @param string $nativecode error code returned by the database + * @return int a portable DB error code, or DB_ERROR if this DB + * implementation has no mapping for the given error code. + */ + function errorCode($nativecode) + { + if (ereg('SQLCODE=(.*)]', $nativecode, $match)) { + $code = $match[1]; + if (isset($this->errorcode_map[$code])) { + return $this->errorcode_map[$code]; + } + } + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' if $result is a table name. + * + * If analyzing a query result and the result has duplicate field names, + * an error will be raised saying + * can't distinguish duplicate field names. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + * @since Method available since Release 1.6.0 + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @ifx_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->ifxRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + $flds = @ifx_fieldproperties($id); + $count = @ifx_num_fields($id); + + if (count($flds) != $count) { + return $this->raiseError("can't distinguish duplicate field names"); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $i = 0; + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + foreach ($flds as $key => $value) { + $props = explode(';', $value); + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func($key), + 'type' => $props[0], + 'len' => $props[1], + 'flags' => $props[4] == 'N' ? 'not_null' : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + $i++; + } + + // free the result only if we were called on a table + if ($got_string) { + @ifx_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT tabname FROM systables WHERE tabid >= 100'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/msql.php b/includes/DB/msql.php new file mode 100644 index 0000000..2673e36 --- /dev/null +++ b/includes/DB/msql.php @@ -0,0 +1,810 @@ + + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: msql.php,v 1.57 2005/02/22 07:26:46 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's msql extension + * for interacting with Mini SQL databases + * + * These methods overload the ones declared in DB_common. + * + * PHP's mSQL extension did weird things with NULL values prior to PHP + * 4.3.11 and 5.0.4. Make sure your version of PHP meets or exceeds + * those versions. + * + * @category Database + * @package DB + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + * @since Class not functional until Release 1.7.0 + */ +class DB_msql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'msql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'msql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'emulate', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => false, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * The query result resource created by PHP + * + * Used to make affectedRows() work. Only contains the result for + * data manipulation queries. Contains false for other queries. + * + * @var resource + * @access private + */ + var $_result; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_msql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * Example of how to connect: + * + * require_once 'DB.php'; + * + * // $dsn = 'msql://hostname/dbname'; // use a TCP connection + * $dsn = 'msql:///dbname'; // use a socket + * $options = array( + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('msql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array(); + if ($dsn['hostspec']) { + $params[] = $dsn['port'] + ? $dsn['hostspec'] . ',' . $dsn['port'] + : $dsn['hostspec']; + } + + $connect_function = $persistent ? 'msql_pconnect' : 'msql_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + if (($err = @msql_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $err); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + + if (!@msql_select_db($dsn['database'], $this->connection)) { + return $this->msqlRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @msql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @msql_query($query, $this->connection); + if (!$result) { + return $this->msqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if (DB::isManip($query)) { + $this->_result = $result; + return DB_OK; + } else { + $this->_result = false; + return $result; + } + } + + + // }}} + // {{{ nextResult() + + /** + * Move the internal msql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * PHP's mSQL extension did weird things with NULL values prior to PHP + * 4.3.11 and 5.0.4. Make sure your version of PHP meets or exceeds + * those versions. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@msql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @msql_fetch_array($result, MSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @msql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @msql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @msql_num_fields($result); + if (!$cols) { + return $this->msqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @msql_num_rows($result); + if ($rows === false) { + return $this->msqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affected() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (!$this->_result) { + return 0; + } + return msql_affected_rows($this->_result); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_msql::createSequence(), DB_msql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = false; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT _seq FROM ${seqname}"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = true; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * Also creates a new table to associate the sequence with. Uses + * a separate table to ensure portability with other drivers. + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_msql::nextID(), DB_msql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER NOT NULL)'); + if (DB::isError($res)) { + return $res; + } + $res = $this->query("CREATE SEQUENCE ON ${seqname}"); + return $res; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_msql::nextID(), DB_msql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ quoteIdentifier() + + /** + * mSQL does not support delimited identifiers + * + * @param string $str the identifier name to be quoted + * + * @return object a DB_Error object + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.7.0 + */ + function quoteIdentifier($str) + { + return $this->raiseError(DB_ERROR_UNSUPPORTED); + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.7.0 + */ + function escapeSimple($str) + { + return addslashes($str); + } + + // }}} + // {{{ msqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_msql::errorNative(), DB_msql::errorCode() + */ + function msqlRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * @return string the DBMS' error message + */ + function errorNative() + { + return @msql_error(); + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message + * + * @param string $errormsg the error message returned from the database + * + * @return integer the error number from a DB_ERROR* constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/^Access to database denied/i' + => DB_ERROR_ACCESS_VIOLATION, + '/^Bad index name/i' + => DB_ERROR_ALREADY_EXISTS, + '/^Bad order field/i' + => DB_ERROR_SYNTAX, + '/^Bad type for comparison/i' + => DB_ERROR_SYNTAX, + '/^Can\'t perform LIKE on/i' + => DB_ERROR_SYNTAX, + '/^Can\'t use TEXT fields in LIKE comparison/i' + => DB_ERROR_SYNTAX, + '/^Couldn\'t create temporary table/i' + => DB_ERROR_CANNOT_CREATE, + '/^Error creating table file/i' + => DB_ERROR_CANNOT_CREATE, + '/^Field .* cannot be null$/i' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/^Index (field|condition) .* cannot be null$/i' + => DB_ERROR_SYNTAX, + '/^Invalid date format/i' + => DB_ERROR_INVALID_DATE, + '/^Invalid time format/i' + => DB_ERROR_INVALID, + '/^Literal value for .* is wrong type$/i' + => DB_ERROR_INVALID_NUMBER, + '/^No Database Selected/i' + => DB_ERROR_NODBSELECTED, + '/^No value specified for field/i' + => DB_ERROR_VALUE_COUNT_ON_ROW, + '/^Non unique value for unique index/i' + => DB_ERROR_CONSTRAINT, + '/^Out of memory for temporary table/i' + => DB_ERROR_CANNOT_CREATE, + '/^Permission denied/i' + => DB_ERROR_ACCESS_VIOLATION, + '/^Reference to un-selected table/i' + => DB_ERROR_SYNTAX, + '/^syntax error/i' + => DB_ERROR_SYNTAX, + '/^Table .* exists$/i' + => DB_ERROR_ALREADY_EXISTS, + '/^Unknown database/i' + => DB_ERROR_NOSUCHDB, + '/^Unknown field/i' + => DB_ERROR_NOSUCHFIELD, + '/^Unknown (index|system variable)/i' + => DB_ERROR_NOT_FOUND, + '/^Unknown table/i' + => DB_ERROR_NOSUCHTABLE, + '/^Unqualified field/i' + => DB_ERROR_SYNTAX, + ); + } + + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @msql_query("SELECT * FROM $result", + $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->raiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @msql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $tmp = @msql_fetch_field($id); + + $flags = ''; + if ($tmp->not_null) { + $flags .= 'not_null '; + } + if ($tmp->unique) { + $flags .= 'unique_key '; + } + $flags = trim($flags); + + $res[$i] = array( + 'table' => $case_func($tmp->table), + 'name' => $case_func($tmp->name), + 'type' => $tmp->type, + 'len' => msql_field_len($id, $i), + 'flags' => $flags, + ); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @msql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtain a list of a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return array the array containing the list of objects requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'databases': + $id = @msql_list_dbs($this->connection); + break; + case 'tables': + $id = @msql_list_tables($this->dsn['database'], + $this->connection); + break; + default: + return null; + } + if (!$id) { + return $this->msqlRaiseError(); + } + $out = array(); + while ($row = @msql_fetch_row($id)) { + $out[] = $row[0]; + } + return $out; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/mssql.php b/includes/DB/mssql.php new file mode 100644 index 0000000..0dc61c0 --- /dev/null +++ b/includes/DB/mssql.php @@ -0,0 +1,914 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: mssql.php,v 1.83 2005/03/07 18:24:51 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's mssql extension + * for interacting with Microsoft SQL Server databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Sterling Hughes + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_mssql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'mssql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'mssql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'emulate', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + // XXX Add here error codes ie: 'S100E' => DB_ERROR_SYNTAX + var $errorcode_map = array( + 110 => DB_ERROR_VALUE_COUNT_ON_ROW, + 155 => DB_ERROR_NOSUCHFIELD, + 170 => DB_ERROR_SYNTAX, + 207 => DB_ERROR_NOSUCHFIELD, + 208 => DB_ERROR_NOSUCHTABLE, + 245 => DB_ERROR_INVALID_NUMBER, + 515 => DB_ERROR_CONSTRAINT_NOT_NULL, + 547 => DB_ERROR_CONSTRAINT, + 1913 => DB_ERROR_ALREADY_EXISTS, + 2627 => DB_ERROR_CONSTRAINT, + 2714 => DB_ERROR_ALREADY_EXISTS, + 3701 => DB_ERROR_NOSUCHTABLE, + 8134 => DB_ERROR_DIVZERO, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = null; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_mssql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('mssql') && !PEAR::loadExtension('sybase') + && !PEAR::loadExtension('sybase_ct')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array( + $dsn['hostspec'] ? $dsn['hostspec'] : 'localhost', + $dsn['username'] ? $dsn['username'] : null, + $dsn['password'] ? $dsn['password'] : null, + ); + if ($dsn['port']) { + $params[0] .= ((substr(PHP_OS, 0, 3) == 'WIN') ? ',' : ':') + . $dsn['port']; + } + + $connect_function = $persistent ? 'mssql_pconnect' : 'mssql_connect'; + + $this->connection = @call_user_func_array($connect_function, $params); + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + @mssql_get_last_message()); + } + if ($dsn['database']) { + if (!@mssql_select_db($dsn['database'], $this->connection)) { + return $this->raiseError(DB_ERROR_NODBSELECTED, + null, null, null, + @mssql_get_last_message()); + } + $this->_db = $dsn['database']; + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @mssql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mssql_query('BEGIN TRAN', $this->connection); + if (!$result) { + return $this->mssqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @mssql_query($query, $this->connection); + if (!$result) { + return $this->mssqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + return $ismanip ? DB_OK : $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mssql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @mssql_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@mssql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mssql_fetch_array($result, MSSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mssql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @mssql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @mssql_num_fields($result); + if (!$cols) { + return $this->mssqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @mssql_num_rows($result); + if ($rows === false) { + return $this->mssqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @mssql_query('COMMIT TRAN', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mssqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @mssql_query('ROLLBACK TRAN', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mssqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $res = @mssql_query('select @@rowcount', $this->connection); + if (!$res) { + return $this->mssqlRaiseError(); + } + $ar = @mssql_fetch_row($res); + if (!$ar) { + $result = 0; + } else { + @mssql_free_result($res); + $result = $ar[0]; + } + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_mssql::createSequence(), DB_mssql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + ($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE)) + { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } elseif (!DB::isError($result)) { + $result =& $this->query("SELECT @@IDENTITY FROM $seqname"); + $repeat = 0; + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $result[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_mssql::nextID(), DB_mssql::dropSequence() + */ + function createSequence($seq_name) + { + return $this->query('CREATE TABLE ' + . $this->getSequenceName($seq_name) + . ' ([id] [int] IDENTITY (1, 1) NOT NULL,' + . ' [vapor] [int] NULL)'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_mssql::nextID(), DB_mssql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '[' . str_replace(']', ']]', $str) . ']'; + } + + // }}} + // {{{ mssqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_mssql::errorNative(), DB_mssql::errorCode() + */ + function mssqlRaiseError($code = null) + { + $message = @mssql_get_last_message(); + if (!$code) { + $code = $this->errorNative(); + } + return $this->raiseError($this->errorCode($code, $message), + null, null, null, "$code - $message"); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + $res = @mssql_query('select @@ERROR as ErrorCode', $this->connection); + if (!$res) { + return DB_ERROR; + } + $row = @mssql_fetch_row($res); + return $row[0]; + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from mssql's native codes. + * + * If $nativecode isn't known yet, it will be looked up. + * + * @param mixed $nativecode mssql error code, if known + * @return integer an error number from a DB error constant + * @see errorNative() + */ + function errorCode($nativecode = null, $msg = '') + { + if (!$nativecode) { + $nativecode = $this->errorNative(); + } + if (isset($this->errorcode_map[$nativecode])) { + if ($nativecode == 3701 + && preg_match('/Cannot drop the index/i', $msg)) + { + return DB_ERROR_NOT_FOUND; + } + return $this->errorcode_map[$nativecode]; + } else { + return DB_ERROR; + } + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + if (!@mssql_select_db($this->_db, $this->connection)) { + return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED); + } + $id = @mssql_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mssqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mssql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func(@mssql_field_name($id, $i)), + 'type' => @mssql_field_type($id, $i), + 'len' => @mssql_field_length($id, $i), + // We only support flags for table + 'flags' => $got_string + ? $this->_mssql_field_flags($result, + @mssql_field_name($id, $i)) + : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mssql_free_result($id); + } + return $res; + } + + // }}} + // {{{ _mssql_field_flags() + + /** + * Get a column's flags + * + * Supports "not_null", "primary_key", + * "auto_increment" (mssql identity), "timestamp" (mssql timestamp), + * "unique_key" (mssql unique index, unique check or primary_key) and + * "multiple_key" (multikey index) + * + * mssql timestamp is NOT similar to the mysql timestamp so this is maybe + * not useful at all - is the behaviour of mysql_field_flags that primary + * keys are alway unique? is the interpretation of multiple_key correct? + * + * @param string $table the table name + * @param string $column the field name + * + * @return string the flags + * + * @access private + * @author Joern Barthel + */ + function _mssql_field_flags($table, $column) + { + static $tableName = null; + static $flags = array(); + + if ($table != $tableName) { + + $flags = array(); + $tableName = $table; + + // get unique and primary keys + $res = $this->getAll("EXEC SP_HELPINDEX[$table]", DB_FETCHMODE_ASSOC); + + foreach ($res as $val) { + $keys = explode(', ', $val['index_keys']); + + if (sizeof($keys) > 1) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'multiple_key'); + } + } + + if (strpos($val['index_description'], 'primary key')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'primary_key'); + } + } elseif (strpos($val['index_description'], 'unique')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'unique_key'); + } + } + } + + // get auto_increment, not_null and timestamp + $res = $this->getAll("EXEC SP_COLUMNS[$table]", DB_FETCHMODE_ASSOC); + + foreach ($res as $val) { + $val = array_change_key_case($val, CASE_LOWER); + if ($val['nullable'] == '0') { + $this->_add_flag($flags[$val['column_name']], 'not_null'); + } + if (strpos($val['type_name'], 'identity')) { + $this->_add_flag($flags[$val['column_name']], 'auto_increment'); + } + if (strpos($val['type_name'], 'timestamp')) { + $this->_add_flag($flags[$val['column_name']], 'timestamp'); + } + } + } + + if (array_key_exists($column, $flags)) { + return(implode(' ', $flags[$column])); + } + return ''; + } + + // }}} + // {{{ _add_flag() + + /** + * Adds a string to the flags array if the flag is not yet in there + * - if there is no flag present the array is created + * + * @param array &$array the reference to the flag-array + * @param string $value the flag value + * + * @return void + * + * @access private + * @author Joern Barthel + */ + function _add_flag(&$array, $value) + { + if (!is_array($array)) { + $array = array($value); + } elseif (!in_array($value, $array)) { + array_push($array, $value); + } + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return "SELECT name FROM sysobjects WHERE type = 'U'" + . ' ORDER BY name'; + case 'views': + return "SELECT name FROM sysobjects WHERE type = 'V'"; + default: + return null; + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/mysql.php b/includes/DB/mysql.php new file mode 100644 index 0000000..6494818 --- /dev/null +++ b/includes/DB/mysql.php @@ -0,0 +1,1034 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: mysql.php,v 1.117 2005/03/29 15:03:26 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's mysql extension + * for interacting with MySQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_mysql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'mysql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'mysql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.2.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1044 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1061 => DB_ERROR_ALREADY_EXISTS, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1091 => DB_ERROR_NOT_FOUND, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1142 => DB_ERROR_ACCESS_VIOLATION, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = ''; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_mysql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's mysql driver supports the following extra DSN options: + * + new_link If set to true, causes subsequent calls to connect() + * to return a new connection link instead of the + * existing one. WARNING: this is not portable to + * other DBMS's. Available since PEAR DB 1.7.0. + * + client_flags Any combination of MYSQL_CLIENT_* constants. + * Only used if PHP is at version 4.3.0 or greater. + * Available since PEAR DB 1.7.0. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('mysql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $params = array(); + if ($dsn['protocol'] && $dsn['protocol'] == 'unix') { + $params[0] = ':' . $dsn['socket']; + } else { + $params[0] = $dsn['hostspec'] ? $dsn['hostspec'] + : 'localhost'; + if ($dsn['port']) { + $params[0] .= ':' . $dsn['port']; + } + } + $params[] = $dsn['username'] ? $dsn['username'] : null; + $params[] = $dsn['password'] ? $dsn['password'] : null; + + if (!$persistent) { + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + $params[] = true; + } else { + $params[] = false; + } + } + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = isset($dsn['client_flags']) + ? $dsn['client_flags'] : null; + } + + $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + if (($err = @mysql_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $err); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + + if ($dsn['database']) { + if (!@mysql_select_db($dsn['database'], $this->connection)) { + return $this->mysqlRaiseError(); + } + $this->_db = $dsn['database']; + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @mysql_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * Generally uses mysql_query(). If you want to use + * mysql_unbuffered_query() set the "result_buffering" option to 0 using + * setOptions(). This option was added in Release 1.7.0. + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysql_query('SET AUTOCOMMIT=0', $this->connection); + $result = @mysql_query('BEGIN', $this->connection); + if (!$result) { + return $this->mysqlRaiseError(); + } + } + $this->transaction_opcount++; + } + if (!$this->options['result_buffering']) { + $result = @mysql_unbuffered_query($query, $this->connection); + } else { + $result = @mysql_query($query, $this->connection); + } + if (!$result) { + return $this->mysqlRaiseError(); + } + if (is_resource($result)) { + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result + * + * This method has not been implemented yet. + * + * @param a valid sql result resource + * + * @return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@mysql_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysql_fetch_array($result, MYSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysql_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @mysql_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @mysql_num_fields($result); + if (!$cols) { + return $this->mysqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @mysql_num_rows($result); + if ($rows === null) { + return $this->mysqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('COMMIT', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysql_select_db($this->_db, $this->connection)) { + return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysql_query('ROLLBACK', $this->connection); + $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysql_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_mysql::createSequence(), DB_mysql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("UPDATE ${seqname} ". + 'SET id=LAST_INSERT_ID(id+1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + // COMMON CASE + $id = @mysql_insert_id($this->connection); + if ($id != 0) { + return $id; + } + // EMPTY SEQ TABLE + // Sequence table must be empty for some reason, so fill + // it and return 1 and obtain a user-level lock + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + // Failed to get the lock + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne('SELECT RELEASE_LOCK(' + . "'${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + // ONDEMAND TABLE CREATION + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // BACKWARDS COMPAT + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,' + . ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + $res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + if (DB::isError($res)) { + return $res; + } + // so reset to zero + return $this->query("UPDATE ${seqname} SET id = 0"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes) + * + * @param string $seqname the sequence name to clean up + * + * @return bool true on success. A DB_Error object on failure. + * + * @access private + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query('DELETE FROM ' . $seqname + . " WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * MySQL can't handle the backtick character (`) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + if (function_exists('mysql_real_escape_string')) { + return @mysql_real_escape_string($str, $this->connection); + } else { + return @mysql_escape_string($str); + } + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * This little hack lets you know how many rows were deleted + * when running a "DELETE FROM table" query. Only implemented + * if the DB_PORTABILITY_DELETE_COUNT portability option is on. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_common::setOption() + */ + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + // "DELETE FROM table" gives 0 affected rows in MySQL. + // This little hack lets you know how many rows were deleted. + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_mysql::errorNative(), DB_common::errorCode() + */ + function mysqlRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysql_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysql_errno($this->connection) . ' ** ' . + @mysql_error($this->connection)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + return @mysql_errno($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysql_list_fields($this->dsn['database'], + $result, $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysql_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $case_func(@mysql_field_table($id, $i)), + 'name' => $case_func(@mysql_field_name($id, $i)), + 'type' => @mysql_field_type($id, $i), + 'len' => @mysql_field_len($id, $i), + 'flags' => @mysql_field_flags($id, $i), + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysql_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'users': + return 'SELECT DISTINCT User FROM mysql.user'; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/mysqli.php b/includes/DB/mysqli.php new file mode 100644 index 0000000..16e3ec3 --- /dev/null +++ b/includes/DB/mysqli.php @@ -0,0 +1,1076 @@ + + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: mysqli.php,v 1.69 2005/03/04 23:12:36 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's mysqli extension + * for interacting with MySQL databases + * + * This is for MySQL versions 4.1 and above. Requires PHP 5. + * + * Note that persistent connections no longer exist. + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + * @since Class functional since Release 1.6.3 + */ +class DB_mysqli extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'mysqli'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'mysqli'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => false, + 'prepare' => false, + 'ssl' => true, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 1004 => DB_ERROR_CANNOT_CREATE, + 1005 => DB_ERROR_CANNOT_CREATE, + 1006 => DB_ERROR_CANNOT_CREATE, + 1007 => DB_ERROR_ALREADY_EXISTS, + 1008 => DB_ERROR_CANNOT_DROP, + 1022 => DB_ERROR_ALREADY_EXISTS, + 1044 => DB_ERROR_ACCESS_VIOLATION, + 1046 => DB_ERROR_NODBSELECTED, + 1048 => DB_ERROR_CONSTRAINT, + 1049 => DB_ERROR_NOSUCHDB, + 1050 => DB_ERROR_ALREADY_EXISTS, + 1051 => DB_ERROR_NOSUCHTABLE, + 1054 => DB_ERROR_NOSUCHFIELD, + 1061 => DB_ERROR_ALREADY_EXISTS, + 1062 => DB_ERROR_ALREADY_EXISTS, + 1064 => DB_ERROR_SYNTAX, + 1091 => DB_ERROR_NOT_FOUND, + 1100 => DB_ERROR_NOT_LOCKED, + 1136 => DB_ERROR_VALUE_COUNT_ON_ROW, + 1142 => DB_ERROR_ACCESS_VIOLATION, + 1146 => DB_ERROR_NOSUCHTABLE, + 1216 => DB_ERROR_CONSTRAINT, + 1217 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = ''; + + /** + * Array for converting MYSQLI_*_FLAG constants to text values + * @var array + * @access public + * @since Property available since Release 1.6.5 + */ + var $mysqli_flags = array( + MYSQLI_NOT_NULL_FLAG => 'not_null', + MYSQLI_PRI_KEY_FLAG => 'primary_key', + MYSQLI_UNIQUE_KEY_FLAG => 'unique_key', + MYSQLI_MULTIPLE_KEY_FLAG => 'multiple_key', + MYSQLI_BLOB_FLAG => 'blob', + MYSQLI_UNSIGNED_FLAG => 'unsigned', + MYSQLI_ZEROFILL_FLAG => 'zerofill', + MYSQLI_AUTO_INCREMENT_FLAG => 'auto_increment', + MYSQLI_TIMESTAMP_FLAG => 'timestamp', + MYSQLI_SET_FLAG => 'set', + // MYSQLI_NUM_FLAG => 'numeric', // unnecessary + // MYSQLI_PART_KEY_FLAG => 'multiple_key', // duplicatvie + MYSQLI_GROUP_FLAG => 'group_by' + ); + + /** + * Array for converting MYSQLI_TYPE_* constants to text values + * @var array + * @access public + * @since Property available since Release 1.6.5 + */ + var $mysqli_types = array( + MYSQLI_TYPE_DECIMAL => 'decimal', + MYSQLI_TYPE_TINY => 'tinyint', + MYSQLI_TYPE_SHORT => 'int', + MYSQLI_TYPE_LONG => 'int', + MYSQLI_TYPE_FLOAT => 'float', + MYSQLI_TYPE_DOUBLE => 'double', + // MYSQLI_TYPE_NULL => 'DEFAULT NULL', // let flags handle it + MYSQLI_TYPE_TIMESTAMP => 'timestamp', + MYSQLI_TYPE_LONGLONG => 'bigint', + MYSQLI_TYPE_INT24 => 'mediumint', + MYSQLI_TYPE_DATE => 'date', + MYSQLI_TYPE_TIME => 'time', + MYSQLI_TYPE_DATETIME => 'datetime', + MYSQLI_TYPE_YEAR => 'year', + MYSQLI_TYPE_NEWDATE => 'date', + MYSQLI_TYPE_ENUM => 'enum', + MYSQLI_TYPE_SET => 'set', + MYSQLI_TYPE_TINY_BLOB => 'tinyblob', + MYSQLI_TYPE_MEDIUM_BLOB => 'mediumblob', + MYSQLI_TYPE_LONG_BLOB => 'longblob', + MYSQLI_TYPE_BLOB => 'blob', + MYSQLI_TYPE_VAR_STRING => 'varchar', + MYSQLI_TYPE_STRING => 'char', + MYSQLI_TYPE_GEOMETRY => 'geometry', + ); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_mysqli() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's mysqli driver supports the following extra DSN options: + * + When the 'ssl' $option passed to DB::connect() is true: + * + key The path to the key file. + * + cert The path to the certificate file. + * + ca The path to the certificate authority file. + * + capath The path to a directory that contains trusted SSL + * CA certificates in pem format. + * + cipher The list of allowable ciphers for SSL encryption. + * + * Example of how to connect using SSL: + * + * require_once 'DB.php'; + * + * $dsn = array( + * 'phptype' => 'mysqli', + * 'username' => 'someuser', + * 'password' => 'apasswd', + * 'hostspec' => 'localhost', + * 'database' => 'thedb', + * 'key' => 'client-key.pem', + * 'cert' => 'client-cert.pem', + * 'ca' => 'cacert.pem', + * 'capath' => '/path/to/ca/dir', + * 'cipher' => 'AES', + * ); + * + * $options = array( + * 'ssl' => true, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('mysqli')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $ini = ini_get('track_errors'); + ini_set('track_errors', 1); + $php_errormsg = ''; + + if ($this->getOption('ssl') === true) { + $init = mysqli_init(); + mysqli_ssl_set( + $init, + empty($dsn['key']) ? null : $dsn['key'], + empty($dsn['cert']) ? null : $dsn['cert'], + empty($dsn['ca']) ? null : $dsn['ca'], + empty($dsn['capath']) ? null : $dsn['capath'], + empty($dsn['cipher']) ? null : $dsn['cipher'] + ); + if ($this->connection = @mysqli_real_connect( + $init, + $dsn['hostspec'], + $dsn['username'], + $dsn['password'], + $dsn['database'], + $dsn['port'], + $dsn['socket'])) + { + $this->connection = $init; + } + } else { + $this->connection = @mysqli_connect( + $dsn['hostspec'], + $dsn['username'], + $dsn['password'], + $dsn['database'], + $dsn['port'], + $dsn['socket'] + ); + } + + ini_set('track_errors', $ini); + + if (!$this->connection) { + if (($err = @mysqli_connect_error()) != '') { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $err); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + } + + if ($dsn['database']) { + $this->_db = $dsn['database']; + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @mysqli_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED); + } + } + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=0'); + $result = @mysqli_query($this->connection, 'BEGIN'); + if (!$result) { + return $this->mysqliRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @mysqli_query($this->connection, $query); + if (!$result) { + return $this->mysqliRaiseError(); + } + if (is_object($result)) { + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal mysql result pointer to the next available result. + * + * This method has not been implemented yet. + * + * @param resource $result a valid sql result resource + * @return false + * @access public + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@mysqli_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @mysqli_fetch_array($result, MYSQLI_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @mysqli_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @mysqli_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @mysqli_num_fields($result); + if (!$cols) { + return $this->mysqliRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @mysqli_num_rows($result); + if ($rows === null) { + return $this->mysqliRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysqli_query($this->connection, 'COMMIT'); + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqliRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if ($this->_db) { + if (!@mysqli_select_db($this->connection, $this->_db)) { + return $this->mysqliRaiseError(DB_ERROR_NODBSELECTED); + } + } + $result = @mysqli_query($this->connection, 'ROLLBACK'); + $result = @mysqli_query($this->connection, 'SET AUTOCOMMIT=1'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->mysqliRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + return @mysqli_affected_rows($this->connection); + } else { + return 0; + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_mysqli::createSequence(), DB_mysqli::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query('UPDATE ' . $seqname + . ' SET id = LAST_INSERT_ID(id + 1)'); + $this->popErrorHandling(); + if ($result === DB_OK) { + // COMMON CASE + $id = @mysqli_insert_id($this->connection); + if ($id != 0) { + return $id; + } + + // EMPTY SEQ TABLE + // Sequence table must be empty for some reason, + // so fill it and return 1 + // Obtain a user-level lock + $result = $this->getOne('SELECT GET_LOCK(' + . "'${seqname}_lock', 10)"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + if ($result == 0) { + return $this->mysqliRaiseError(DB_ERROR_NOT_LOCKED); + } + + // add the default value + $result = $this->query('REPLACE INTO ' . $seqname + . ' (id) VALUES (0)'); + if (DB::isError($result)) { + return $this->raiseError($result); + } + + // Release the lock + $result = $this->getOne('SELECT RELEASE_LOCK(' + . "'${seqname}_lock')"); + if (DB::isError($result)) { + return $this->raiseError($result); + } + // We know what the result will be, so no need to try again + return 1; + + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + // ONDEMAND TABLE CREATION + $result = $this->createSequence($seq_name); + + // Since createSequence initializes the ID to be 1, + // we do not need to retrieve the ID again (or we will get 2) + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + // First ID of a newly created sequence is 1 + return 1; + } + + } elseif (DB::isError($result) && + $result->getCode() == DB_ERROR_ALREADY_EXISTS) + { + // BACKWARDS COMPAT + // see _BCsequence() comment + $result = $this->_BCsequence($seqname); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $repeat = 1; + } + } while ($repeat); + + return $this->raiseError($result); + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_mysqli::nextID(), DB_mysqli::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $res = $this->query('CREATE TABLE ' . $seqname + . ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,' + . ' PRIMARY KEY(id))'); + if (DB::isError($res)) { + return $res; + } + // insert yields value 1, nextId call will generate ID 2 + return $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_mysql::nextID(), DB_mysql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ _BCsequence() + + /** + * Backwards compatibility with old sequence emulation implementation + * (clean up the dupes) + * + * @param string $seqname the sequence name to clean up + * + * @return bool true on success. A DB_Error object on failure. + * + * @access private + */ + function _BCsequence($seqname) + { + // Obtain a user-level lock... this will release any previous + // application locks, but unlike LOCK TABLES, it does not abort + // the current transaction and is much less frequently used. + $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); + if (DB::isError($result)) { + return $result; + } + if ($result == 0) { + // Failed to get the lock, can't do the conversion, bail + // with a DB_ERROR_NOT_LOCKED error + return $this->mysqliRaiseError(DB_ERROR_NOT_LOCKED); + } + + $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); + if (DB::isError($highest_id)) { + return $highest_id; + } + + // This should kill all rows except the highest + // We should probably do something if $highest_id isn't + // numeric, but I'm at a loss as how to handle that... + $result = $this->query('DELETE FROM ' . $seqname + . " WHERE id <> $highest_id"); + if (DB::isError($result)) { + return $result; + } + + // If another thread has been waiting for this lock, + // it will go thru the above procedure, but will have no + // real effect + $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); + if (DB::isError($result)) { + return $result; + } + return true; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * MySQL can't handle the backtick character (`) in + * table or column names. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + return '`' . $str . '`'; + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return @mysqli_real_escape_string($this->connection, $str); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + if (DB::isManip($query)) { + return $query . " LIMIT $count"; + } else { + return $query . " LIMIT $from, $count"; + } + } + + // }}} + // {{{ mysqliRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_mysqli::errorNative(), DB_common::errorCode() + */ + function mysqliRaiseError($errno = null) + { + if ($errno === null) { + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; + $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; + $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; + $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; + } + $errno = $this->errorCode(mysqli_errno($this->connection)); + } + return $this->raiseError($errno, null, null, null, + @mysqli_errno($this->connection) . ' ** ' . + @mysqli_error($this->connection)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code + */ + function errorNative() + { + return @mysqli_errno($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::setOption() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @mysqli_query($this->connection, + "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_a($id, 'mysqli_result')) { + return $this->mysqliRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @mysqli_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $tmp = @mysqli_fetch_field($id); + + $flags = ''; + foreach ($this->mysqli_flags as $const => $means) { + if ($tmp->flags & $const) { + $flags .= $means . ' '; + } + } + if ($tmp->def) { + $flags .= 'default_' . rawurlencode($tmp->def); + } + $flags = trim($flags); + + $res[$i] = array( + 'table' => $case_func($tmp->table), + 'name' => $case_func($tmp->name), + 'type' => isset($this->mysqli_types[$tmp->type]) + ? $this->mysqli_types[$tmp->type] + : 'unknown', + 'len' => $tmp->max_length, + 'flags' => $flags, + ); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @mysqli_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SHOW TABLES'; + case 'users': + return 'SELECT DISTINCT User FROM mysql.user'; + case 'databases': + return 'SHOW DATABASES'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/oci8.php b/includes/DB/oci8.php new file mode 100644 index 0000000..38c16a0 --- /dev/null +++ b/includes/DB/oci8.php @@ -0,0 +1,1117 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: oci8.php,v 1.103 2005/04/11 15:10:22 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's oci8 extension + * for interacting with Oracle databases + * + * Definitely works with versions 8 and 9 of Oracle. + * + * These methods overload the ones declared in DB_common. + * + * Be aware... OCIError() only appears to return anything when given a + * statement, so functions return the generic DB_ERROR instead of more + * useful errors that have to do with feedback from the database. + * + * @category Database + * @package DB + * @author James L. Pine + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_oci8 extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'oci8'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'oci8'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '5.0.0', + 'numrows' => 'subquery', + 'pconnect' => true, + 'prepare' => true, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + 1 => DB_ERROR_CONSTRAINT, + 900 => DB_ERROR_SYNTAX, + 904 => DB_ERROR_NOSUCHFIELD, + 913 => DB_ERROR_VALUE_COUNT_ON_ROW, + 921 => DB_ERROR_SYNTAX, + 923 => DB_ERROR_SYNTAX, + 942 => DB_ERROR_NOSUCHTABLE, + 955 => DB_ERROR_ALREADY_EXISTS, + 1400 => DB_ERROR_CONSTRAINT_NOT_NULL, + 1401 => DB_ERROR_INVALID, + 1407 => DB_ERROR_CONSTRAINT_NOT_NULL, + 1418 => DB_ERROR_NOT_FOUND, + 1476 => DB_ERROR_DIVZERO, + 1722 => DB_ERROR_INVALID_NUMBER, + 2289 => DB_ERROR_NOSUCHTABLE, + 2291 => DB_ERROR_CONSTRAINT, + 2292 => DB_ERROR_CONSTRAINT, + 2449 => DB_ERROR_CONSTRAINT, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * Stores the $data passed to execute() in the oci8 driver + * + * Gets reset to array() when simpleQuery() is run. + * + * Needed in case user wants to call numRows() after prepare/execute + * was used. + * + * @var array + * @access private + */ + var $_data = array(); + + /** + * The result or statement handle from the most recently executed query + * @var resource + */ + var $last_stmt; + + /** + * Is the given prepared statement a data manipulation query? + * @var array + * @access private + */ + var $manip_query = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_oci8() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * If PHP is at version 5.0.0 or greater: + * + Generally, oci_connect() or oci_pconnect() are used. + * + But if the new_link DSN option is set to true, oci_new_connect() + * is used. + * + * When using PHP version 4.x, OCILogon() or OCIPLogon() are used. + * + * PEAR DB's oci8 driver supports the following extra DSN options: + * + charset The character set to be used on the connection. + * Only used if PHP is at version 5.0.0 or greater + * and the Oracle server is at 9.2 or greater. + * Available since PEAR DB 1.7.0. + * + new_link If set to true, causes subsequent calls to + * connect() to return a new connection link + * instead of the existing one. WARNING: this is + * not portable to other DBMS's. + * Available since PEAR DB 1.7.0. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('oci8')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + if (function_exists('oci_connect')) { + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + $connect_function = 'oci_new_connect'; + } else { + $connect_function = $persistent ? 'oci_pconnect' + : 'oci_connect'; + } + + // Backwards compatibility with DB < 1.7.0 + if (empty($dsn['database']) && !empty($dsn['hostspec'])) { + $db = $dsn['hostspec']; + } else { + $db = $dsn['database']; + } + + $char = empty($dsn['charset']) ? null : $dsn['charset']; + $this->connection = @$connect_function($dsn['username'], + $dsn['password'], + $db, + $char); + $error = OCIError(); + if (!empty($error) && $error['code'] == 12541) { + // Couldn't find TNS listener. Try direct connection. + $this->connection = @$connect_function($dsn['username'], + $dsn['password'], + null, + $char); + } + } else { + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + if ($dsn['hostspec']) { + $this->connection = @$connect_function($dsn['username'], + $dsn['password'], + $dsn['hostspec']); + } elseif ($dsn['username'] || $dsn['password']) { + $this->connection = @$connect_function($dsn['username'], + $dsn['password']); + } + } + + if (!$this->connection) { + $error = OCIError(); + $error = (is_array($error)) ? $error['message'] : null; + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $error); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + if (function_exists('oci_close')) { + $ret = @oci_close($this->connection); + } else { + $ret = @OCILogOff($this->connection); + } + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * To determine how many rows of a result set get buffered using + * ocisetprefetch(), see the "result_buffering" option in setOptions(). + * This option was added in Release 1.7.0. + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $this->_data = array(); + $this->last_parameters = array(); + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @OCIParse($this->connection, $query); + if (!$result) { + return $this->oci8RaiseError(); + } + if ($this->autocommit) { + $success = @OCIExecute($result,OCI_COMMIT_ON_SUCCESS); + } else { + $success = @OCIExecute($result,OCI_DEFAULT); + } + if (!$success) { + return $this->oci8RaiseError($result); + } + $this->last_stmt = $result; + if (DB::isManip($query)) { + return DB_OK; + } else { + @ocisetprefetch($result, $this->options['result_buffering']); + return $result; + } + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal oracle result pointer to the next available result + * + * @param a valid oci8 result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $moredata = @OCIFetchInto($result,$arr,OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && + $moredata) + { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $moredata = OCIFetchInto($result,$arr,OCI_RETURN_NULLS+OCI_RETURN_LOBS); + } + if (!$moredata) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @OCIFreeStatement($result); + } + + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_oci8::prepare() + */ + function freePrepared($stmt, $free_resource = true) + { + if (!is_resource($stmt)) { + return false; + } + if ($free_resource) { + @ocifreestatement($stmt); + } + if (isset($this->prepare_types[(int)$stmt])) { + unset($this->prepare_types[(int)$stmt]); + unset($this->manip_query[(int)$stmt]); + } else { + return false; + } + return true; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * Only works if the DB_PORTABILITY_NUMROWS portability option + * is turned on. + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows(), DB_common::setOption() + */ + function numRows($result) + { + // emulate numRows for Oracle. yuck. + if ($this->options['portability'] & DB_PORTABILITY_NUMROWS && + $result === $this->last_stmt) + { + $countquery = 'SELECT COUNT(*) FROM ('.$this->last_query.')'; + $save_query = $this->last_query; + $save_stmt = $this->last_stmt; + + if (count($this->_data)) { + $smt = $this->prepare('SELECT COUNT(*) FROM ('.$this->last_query.')'); + $count = $this->execute($smt, $this->_data); + } else { + $count =& $this->query($countquery); + } + + if (DB::isError($count) || + DB::isError($row = $count->fetchRow(DB_FETCHMODE_ORDERED))) + { + $this->last_query = $save_query; + $this->last_stmt = $save_stmt; + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + return $row[0]; + } + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @OCINumCols($result); + if (!$cols) { + return $this->oci8RaiseError($result); + } + return $cols; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * + * With oci8, this is emulated. + * + * prepare() requires a generic query as string like + * INSERT INTO numbers VALUES (?, ?, ?) + * . The ? characters are placeholders. + * + * Three types of placeholders can be used: + * + ? a quoted scalar value, i.e. strings, integers + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders. Example: + * "UPDATE foo SET col=? WHERE col='over \& under'" + * + * + * @param string $query the query to be prepared + * + * @return mixed DB statement resource on success. DB_Error on failure. + * + * @see DB_oci8::execute() + */ + function prepare($query) + { + $tokens = preg_split('/((? $val) { + switch ($val) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + unset($tokens[$key]); + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + unset($tokens[$key]); + break; + case '!': + $types[$token++] = DB_PARAM_MISC; + unset($tokens[$key]); + break; + default: + $tokens[$key] = preg_replace('/\\\([&?!])/', "\\1", $val); + if ($key != $binds) { + $newquery .= $tokens[$key] . ':bind' . $token; + } else { + $newquery .= $tokens[$key]; + } + } + } + + $this->last_query = $query; + $newquery = $this->modifyQuery($newquery); + if (!$stmt = @OCIParse($this->connection, $newquery)) { + return $this->oci8RaiseError(); + } + $this->prepare_types[(int)$stmt] = $types; + $this->manip_query[(int)$stmt] = DB::isManip($query); + return $stmt; + } + + // }}} + // {{{ execute() + + /** + * Executes a DB statement prepared with prepare(). + * + * To determine how many rows of a result set get buffered using + * ocisetprefetch(), see the "result_buffering" option in setOptions(). + * This option was added in Release 1.7.0. + * + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 for non-array items or the + * quantity of elements in the array. + * + * @return mixed returns an oic8 result resource for successful SELECT + * queries, DB_OK for other successful queries. + * A DB error object is returned on failure. + * + * @see DB_oci8::prepare() + */ + function &execute($stmt, $data = array()) + { + $data = (array)$data; + $this->last_parameters = $data; + $this->_data = $data; + + $types =& $this->prepare_types[(int)$stmt]; + if (count($types) != count($data)) { + $tmp =& $this->raiseError(DB_ERROR_MISMATCH); + return $tmp; + } + + $i = 0; + foreach ($data as $key => $value) { + if ($types[$i] == DB_PARAM_MISC) { + /* + * Oracle doesn't seem to have the ability to pass a + * parameter along unchanged, so strip off quotes from start + * and end, plus turn two single quotes to one single quote, + * in order to avoid the quotes getting escaped by + * Oracle and ending up in the database. + */ + $data[$key] = preg_replace("/^'(.*)'$/", "\\1", $data[$key]); + $data[$key] = str_replace("''", "'", $data[$key]); + } elseif ($types[$i] == DB_PARAM_OPAQUE) { + $fp = @fopen($data[$key], 'rb'); + if (!$fp) { + $tmp =& $this->raiseError(DB_ERROR_ACCESS_VIOLATION); + return $tmp; + } + $data[$key] = fread($fp, filesize($data[$key])); + fclose($fp); + } + if (!@OCIBindByName($stmt, ':bind' . $i, $data[$key], -1)) { + $tmp = $this->oci8RaiseError($stmt); + return $tmp; + } + $i++; + } + if ($this->autocommit) { + $success = @OCIExecute($stmt, OCI_COMMIT_ON_SUCCESS); + } else { + $success = @OCIExecute($stmt, OCI_DEFAULT); + } + if (!$success) { + $tmp = $this->oci8RaiseError($stmt); + return $tmp; + } + $this->last_stmt = $stmt; + if ($this->manip_query[(int)$stmt]) { + $tmp = DB_OK; + } else { + @ocisetprefetch($stmt, $this->options['result_buffering']); + $tmp =& new DB_result($this, $stmt); + } + return $tmp; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + $this->autocommit = (bool)$onoff;; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + $result = @OCICommit($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + $result = @OCIRollback($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if ($this->last_stmt === false) { + return $this->oci8RaiseError(); + } + $result = @OCIRowCount($this->last_stmt); + if ($result === false) { + return $this->oci8RaiseError($this->last_stmt); + } + return $result; + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * "SELECT 2+2" must be "SELECT 2+2 FROM dual" in Oracle. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + */ + function modifyQuery($query) + { + if (preg_match('/^\s*SELECT/i', $query) && + !preg_match('/\sFROM\s/i', $query)) { + $query .= ' FROM dual'; + } + return $query; + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + // Let Oracle return the name of the columns instead of + // coding a "home" SQL parser + + if (count($params)) { + $result = $this->prepare("SELECT * FROM ($query) " + . 'WHERE NULL = NULL'); + $tmp =& $this->execute($result, $params); + } else { + $q_fields = "SELECT * FROM ($query) WHERE NULL = NULL"; + + if (!$result = @OCIParse($this->connection, $q_fields)) { + $this->last_query = $q_fields; + return $this->oci8RaiseError(); + } + if (!@OCIExecute($result, OCI_DEFAULT)) { + $this->last_query = $q_fields; + return $this->oci8RaiseError($result); + } + } + + $ncols = OCINumCols($result); + $cols = array(); + for ( $i = 1; $i <= $ncols; $i++ ) { + $cols[] = '"' . OCIColumnName($result, $i) . '"'; + } + $fields = implode(', ', $cols); + // XXX Test that (tip by John Lim) + //if (preg_match('/^\s*SELECT\s+/is', $query, $match)) { + // // Introduce the FIRST_ROWS Oracle query optimizer + // $query = substr($query, strlen($match[0]), strlen($query)); + // $query = "SELECT /* +FIRST_ROWS */ " . $query; + //} + + // Construct the query + // more at: http://marc.theaimsgroup.com/?l=php-db&m=99831958101212&w=2 + // Perhaps this could be optimized with the use of Unions + $query = "SELECT $fields FROM". + " (SELECT rownum as linenum, $fields FROM". + " ($query)". + ' WHERE rownum <= '. ($from + $count) . + ') WHERE linenum >= ' . ++$from; + return $query; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_oci8::createSequence(), DB_oci8::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = 0; + do { + $this->expectError(DB_ERROR_NOSUCHTABLE); + $result =& $this->query("SELECT ${seqname}.nextval FROM dual"); + $this->popExpect(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $arr[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_oci8::nextID(), DB_oci8::dropSequence() + */ + function createSequence($seq_name) + { + return $this->query('CREATE SEQUENCE ' + . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_oci8::nextID(), DB_oci8::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP SEQUENCE ' + . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ oci8RaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_oci8::errorNative(), DB_oci8::errorCode() + */ + function oci8RaiseError($errno = null) + { + if ($errno === null) { + $error = @OCIError($this->connection); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } elseif (is_resource($errno)) { + $error = @OCIError($errno); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } + return $this->raiseError($this->errorCode($errno)); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code produced by the last query + * + * @return int the DBMS' error code. FALSE if the code could not be + * determined + */ + function errorNative() + { + if (is_resource($this->last_stmt)) { + $error = @OCIError($this->last_stmt); + } else { + $error = @OCIError($this->connection); + } + if (is_array($error)) { + return $error['code']; + } + return false; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * NOTE: flags won't contain index information. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $res = array(); + + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $result = strtoupper($result); + $q_fields = 'SELECT column_name, data_type, data_length, ' + . 'nullable ' + . 'FROM user_tab_columns ' + . "WHERE table_name='$result' ORDER BY column_id"; + + $this->last_query = $q_fields; + + if (!$stmt = @OCIParse($this->connection, $q_fields)) { + return $this->oci8RaiseError(DB_ERROR_NEED_MORE_DATA); + } + if (!@OCIExecute($stmt, OCI_DEFAULT)) { + return $this->oci8RaiseError($stmt); + } + + $i = 0; + while (@OCIFetch($stmt)) { + $res[$i] = array( + 'table' => $case_func($result), + 'name' => $case_func(@OCIResult($stmt, 1)), + 'type' => @OCIResult($stmt, 2), + 'len' => @OCIResult($stmt, 3), + 'flags' => (@OCIResult($stmt, 4) == 'N') ? 'not_null' : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + $i++; + } + + if ($mode) { + $res['num_fields'] = $i; + } + @OCIFreeStatement($stmt); + + } else { + if (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $result = $result->result; + } + + $res = array(); + + if ($result === $this->last_stmt) { + $count = @OCINumCols($result); + if ($mode) { + $res['num_fields'] = $count; + } + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => '', + 'name' => $case_func(@OCIColumnName($result, $i+1)), + 'type' => @OCIColumnType($result, $i+1), + 'len' => @OCIColumnSize($result, $i+1), + 'flags' => '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + } else { + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT table_name FROM user_tables'; + case 'synonyms': + return 'SELECT synonym_name FROM user_synonyms'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/odbc.php b/includes/DB/odbc.php new file mode 100644 index 0000000..3688570 --- /dev/null +++ b/includes/DB/odbc.php @@ -0,0 +1,883 @@ + + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: odbc.php,v 1.78 2005/02/28 01:42:17 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's odbc extension + * for interacting with databases via ODBC connections + * + * These methods overload the ones declared in DB_common. + * + * More info on ODBC errors could be found here: + * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/trblsql/tr_err_odbc_5stz.asp + * + * @category Database + * @package DB + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_odbc extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'odbc'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'sql92'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * NOTE: The feature set of the following drivers are different than + * the default: + * + solid: 'transactions' = true + * + navision: 'limit' = false + * + * @var array + */ + var $features = array( + 'limit' => 'emulate', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => false, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + '01004' => DB_ERROR_TRUNCATED, + '07001' => DB_ERROR_MISMATCH, + '21S01' => DB_ERROR_VALUE_COUNT_ON_ROW, + '21S02' => DB_ERROR_MISMATCH, + '22001' => DB_ERROR_INVALID, + '22003' => DB_ERROR_INVALID_NUMBER, + '22005' => DB_ERROR_INVALID_NUMBER, + '22008' => DB_ERROR_INVALID_DATE, + '22012' => DB_ERROR_DIVZERO, + '23000' => DB_ERROR_CONSTRAINT, + '23502' => DB_ERROR_CONSTRAINT_NOT_NULL, + '23503' => DB_ERROR_CONSTRAINT, + '23504' => DB_ERROR_CONSTRAINT, + '23505' => DB_ERROR_CONSTRAINT, + '24000' => DB_ERROR_INVALID, + '34000' => DB_ERROR_INVALID, + '37000' => DB_ERROR_SYNTAX, + '42000' => DB_ERROR_SYNTAX, + '42601' => DB_ERROR_SYNTAX, + 'IM001' => DB_ERROR_UNSUPPORTED, + 'S0000' => DB_ERROR_NOSUCHTABLE, + 'S0001' => DB_ERROR_ALREADY_EXISTS, + 'S0002' => DB_ERROR_NOSUCHTABLE, + 'S0011' => DB_ERROR_ALREADY_EXISTS, + 'S0012' => DB_ERROR_NOT_FOUND, + 'S0021' => DB_ERROR_ALREADY_EXISTS, + 'S0022' => DB_ERROR_NOSUCHFIELD, + 'S1009' => DB_ERROR_INVALID, + 'S1090' => DB_ERROR_INVALID, + 'S1C00' => DB_ERROR_NOT_CAPABLE, + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * The number of rows affected by a data manipulation query + * @var integer + * @access private + */ + var $affected = 0; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_odbc() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's odbc driver supports the following extra DSN options: + * + cursor The type of cursor to be used for this connection. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('odbc')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + switch ($this->dbsyntax) { + case 'access': + case 'db2': + case 'solid': + $this->features['transactions'] = true; + break; + case 'navision': + $this->features['limit'] = false; + } + + /* + * This is hear for backwards compatibility. Should have been using + * 'database' all along, but prior to 1.6.0RC3 'hostspec' was used. + */ + if ($dsn['database']) { + $odbcdsn = $dsn['database']; + } elseif ($dsn['hostspec']) { + $odbcdsn = $dsn['hostspec']; + } else { + $odbcdsn = 'localhost'; + } + + $connect_function = $persistent ? 'odbc_pconnect' : 'odbc_connect'; + + if (empty($dsn['cursor'])) { + $this->connection = @$connect_function($odbcdsn, $dsn['username'], + $dsn['password']); + } else { + $this->connection = @$connect_function($odbcdsn, $dsn['username'], + $dsn['password'], + $dsn['cursor']); + } + + if (!is_resource($this->connection)) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $this->errorNative()); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $err = @odbc_close($this->connection); + $this->connection = null; + return $err; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $this->last_query = $query; + $query = $this->modifyQuery($query); + $result = @odbc_exec($this->connection, $query); + if (!$result) { + return $this->odbcRaiseError(); // XXX ERRORMSG + } + // Determine which queries that should return data, and which + // should return an error code only. + if (DB::isManip($query)) { + $this->affected = $result; // For affectedRows() + return DB_OK; + } + $this->affected = 0; + return $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal odbc result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return @odbc_next_result($result); + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + $arr = array(); + if ($rownum !== null) { + $rownum++; // ODBC first row is 1 + if (version_compare(phpversion(), '4.2.0', 'ge')) { + $cols = @odbc_fetch_into($result, $arr, $rownum); + } else { + $cols = @odbc_fetch_into($result, $rownum, $arr); + } + } else { + $cols = @odbc_fetch_into($result, $arr); + } + if (!$cols) { + return null; + } + if ($fetchmode !== DB_FETCHMODE_ORDERED) { + for ($i = 0; $i < count($arr); $i++) { + $colName = @odbc_field_name($result, $i+1); + $a[$colName] = $arr[$i]; + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $a = array_change_key_case($a, CASE_LOWER); + } + $arr = $a; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @odbc_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @odbc_num_fields($result); + if (!$cols) { + return $this->odbcRaiseError(); + } + return $cols; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (empty($this->affected)) { // In case of SELECT stms + return 0; + } + $nrows = @odbc_num_rows($this->affected); + if ($nrows == -1) { + return $this->odbcRaiseError(); + } + return $nrows; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * Not all ODBC drivers support this functionality. If they don't + * a DB_Error object for DB_ERROR_UNSUPPORTED is returned. + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $nrows = @odbc_num_rows($result); + if ($nrows == -1) { + return $this->odbcRaiseError(DB_ERROR_UNSUPPORTED); + } + if ($nrows === false) { + return $this->odbcRaiseError(); + } + return $nrows; + } + + // }}} + // {{{ quoteIdentifier() + + /** + * Quotes a string so it can be safely used as a table or column name + * + * Use 'mssql' as the dbsyntax in the DB DSN only if you've unchecked + * "Use ANSI quoted identifiers" when setting up the ODBC data source. + * + * @param string $str identifier name to be quoted + * + * @return string quoted identifier string + * + * @see DB_common::quoteIdentifier() + * @since Method available since Release 1.6.0 + */ + function quoteIdentifier($str) + { + switch ($this->dsn['dbsyntax']) { + case 'access': + return '[' . $str . ']'; + case 'mssql': + case 'sybase': + return '[' . str_replace(']', ']]', $str) . ']'; + case 'mysql': + case 'mysqli': + return '`' . $str . '`'; + default: + return '"' . str_replace('"', '""', $str) . '"'; + } + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_odbc::createSequence(), DB_odbc::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("update ${seqname} set id = id + 1"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $this->query("insert into ${seqname} (id) values(0)"); + } else { + $repeat = 0; + } + } while ($repeat); + + if (DB::isError($result)) { + return $this->raiseError($result); + } + + $result = $this->query("select id from ${seqname}"); + if (DB::isError($result)) { + return $result; + } + + $row = $result->fetchRow(DB_FETCHMODE_ORDERED); + if (DB::isError($row || !$row)) { + return $row; + } + + return $row[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_odbc::nextID(), DB_odbc::dropSequence() + */ + function createSequence($seq_name) + { + return $this->query('CREATE TABLE ' + . $this->getSequenceName($seq_name) + . ' (id integer NOT NULL,' + . ' PRIMARY KEY(id))'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_odbc::nextID(), DB_odbc::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + if (!@odbc_autocommit($this->connection, $onoff)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if (!@odbc_commit($this->connection)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if (!@odbc_rollback($this->connection)) { + return $this->odbcRaiseError(); + } + return DB_OK; + } + + // }}} + // {{{ odbcRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_odbc::errorNative(), DB_common::errorCode() + */ + function odbcRaiseError($errno = null) + { + if ($errno === null) { + switch ($this->dbsyntax) { + case 'access': + if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { + $this->errorcode_map['07001'] = DB_ERROR_NOSUCHFIELD; + } else { + // Doing this in case mode changes during runtime. + $this->errorcode_map['07001'] = DB_ERROR_MISMATCH; + } + + $native_code = odbc_error($this->connection); + + // S1000 is for "General Error." Let's be more specific. + if ($native_code == 'S1000') { + $errormsg = odbc_errormsg($this->connection); + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/includes related records.$/i' => DB_ERROR_CONSTRAINT, + '/cannot contain a Null value/i' => DB_ERROR_CONSTRAINT_NOT_NULL, + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $this->raiseError($code, + null, null, null, + $native_code . ' ' . $errormsg); + } + } + $errno = DB_ERROR; + } else { + $errno = $this->errorCode($native_code); + } + break; + default: + $errno = $this->errorCode(odbc_error($this->connection)); + } + } + return $this->raiseError($errno, null, null, null, + $this->errorNative()); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error code and message produced by the last query + * + * @return string the DBMS' error code and message + */ + function errorNative() + { + if (!is_resource($this->connection)) { + return @odbc_error() . ' ' . @odbc_errormsg(); + } + return @odbc_error($this->connection) . ' ' . @odbc_errormsg($this->connection); + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + * @since Method available since Release 1.7.0 + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @odbc_exec($this->connection, "SELECT * FROM $result"); + if (!$id) { + return $this->odbcRaiseError(); + } + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->odbcRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @odbc_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $col = $i + 1; + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func(@odbc_field_name($id, $col)), + 'type' => @odbc_field_type($id, $col), + 'len' => @odbc_field_len($id, $col), + 'flags' => '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @odbc_free_result($id); + } + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * Thanks to symbol1@gmail.com and Philippe.Jausions@11abacus.com. + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the list of objects requested + * + * @access protected + * @see DB_common::getListOf() + * @since Method available since Release 1.7.0 + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'databases': + if (!function_exists('odbc_data_source')) { + return null; + } + $res = @odbc_data_source($this->connection, SQL_FETCH_FIRST); + if (is_array($res)) { + $out = array($res['server']); + while($res = @odbc_data_source($this->connection, + SQL_FETCH_NEXT)) + { + $out[] = $res['server']; + } + return $out; + } else { + return $this->odbcRaiseError(); + } + break; + case 'tables': + case 'schema.tables': + $keep = 'TABLE'; + break; + case 'views': + $keep = 'VIEW'; + break; + default: + return null; + } + + /* + * Removing non-conforming items in the while loop rather than + * in the odbc_tables() call because some backends choke on this: + * odbc_tables($this->connection, '', '', '', 'TABLE') + */ + $res = @odbc_tables($this->connection); + if (!$res) { + return $this->odbcRaiseError(); + } + $out = array(); + while ($row = odbc_fetch_array($res)) { + if ($row['TABLE_TYPE'] != $keep) { + continue; + } + if ($type == 'schema.tables') { + $out[] = $row['TABLE_SCHEM'] . '.' . $row['TABLE_NAME']; + } else { + $out[] = $row['TABLE_NAME']; + } + } + return $out; + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/pgsql.php b/includes/DB/pgsql.php new file mode 100644 index 0000000..efaf8da --- /dev/null +++ b/includes/DB/pgsql.php @@ -0,0 +1,1097 @@ + + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: pgsql.php,v 1.126 2005/03/04 23:12:36 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's pgsql extension + * for interacting with PostgreSQL databases + * + * These methods overload the ones declared in DB_common. + * + * @category Database + * @package DB + * @author Rui Hirokawa + * @author Stig Bakken + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_pgsql extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'pgsql'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'pgsql'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => '4.3.0', + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => true, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The number of rows affected by a data manipulation query + * @var integer + */ + var $affected = 0; + + /** + * The current row being looked at in fetchInto() + * @var array + * @access private + */ + var $row = array(); + + /** + * The number of rows in a given result set + * @var array + * @access private + */ + var $_num_rows = array(); + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_pgsql() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's pgsql driver supports the following extra DSN options: + * + connect_timeout How many seconds to wait for a connection to + * be established. Available since PEAR DB 1.7.0. + * + new_link If set to true, causes subsequent calls to + * connect() to return a new connection link + * instead of the existing one. WARNING: this is + * not portable to other DBMS's. Available only + * if PHP is >= 4.3.0 and PEAR DB is >= 1.7.0. + * + options Command line options to be sent to the server. + * Available since PEAR DB 1.6.4. + * + service Specifies a service name in pg_service.conf that + * holds additional connection parameters. + * Available since PEAR DB 1.7.0. + * + sslmode How should SSL be used when connecting? Values: + * disable, allow, prefer or require. + * Available since PEAR DB 1.7.0. + * + tty This was used to specify where to send server + * debug output. Available since PEAR DB 1.6.4. + * + * Example of connecting to a new link via a socket: + * + * require_once 'DB.php'; + * + * $dsn = 'pgsql://user:pass@unix(/tmp)/dbname?new_link=true'; + * $options = array( + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @link http://www.postgresql.org/docs/current/static/libpq.html#LIBPQ-CONNECT + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('pgsql')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $protocol = $dsn['protocol'] ? $dsn['protocol'] : 'tcp'; + + $params = array(''); + if ($protocol == 'tcp') { + if ($dsn['hostspec']) { + $params[0] .= 'host=' . $dsn['hostspec']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } elseif ($protocol == 'unix') { + // Allow for pg socket in non-standard locations. + if ($dsn['socket']) { + $params[0] .= 'host=' . $dsn['socket']; + } + if ($dsn['port']) { + $params[0] .= ' port=' . $dsn['port']; + } + } + if ($dsn['database']) { + $params[0] .= ' dbname=\'' . addslashes($dsn['database']) . '\''; + } + if ($dsn['username']) { + $params[0] .= ' user=\'' . addslashes($dsn['username']) . '\''; + } + if ($dsn['password']) { + $params[0] .= ' password=\'' . addslashes($dsn['password']) . '\''; + } + if (!empty($dsn['options'])) { + $params[0] .= ' options=' . $dsn['options']; + } + if (!empty($dsn['tty'])) { + $params[0] .= ' tty=' . $dsn['tty']; + } + if (!empty($dsn['connect_timeout'])) { + $params[0] .= ' connect_timeout=' . $dsn['connect_timeout']; + } + if (!empty($dsn['sslmode'])) { + $params[0] .= ' sslmode=' . $dsn['sslmode']; + } + if (!empty($dsn['service'])) { + $params[0] .= ' service=' . $dsn['service']; + } + + if (isset($dsn['new_link']) + && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) + { + if (version_compare(phpversion(), '4.3.0', '>=')) { + $params[] = PGSQL_CONNECT_FORCE_NEW; + } + } + + $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; + + $ini = ini_get('track_errors'); + $php_errormsg = ''; + if ($ini) { + $this->connection = @call_user_func_array($connect_function, + $params); + } else { + ini_set('track_errors', 1); + $this->connection = @call_user_func_array($connect_function, + $params); + ini_set('track_errors', $ini); + } + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + $php_errormsg); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @pg_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @pg_exec($this->connection, 'begin;'); + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @pg_exec($this->connection, $query); + if (!$result) { + return $this->pgsqlRaiseError(); + } + // Determine which queries that should return data, and which + // should return an error code only. + if ($ismanip) { + $this->affected = @pg_affected_rows($result); + return DB_OK; + } elseif (preg_match('/^\s*\(*\s*(SELECT|EXPLAIN|SHOW)\s/si', $query)) { + /* PostgreSQL commands: + ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY, + CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH, + GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET, + REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW, + UNLISTEN, UPDATE, VACUUM + */ + $this->row[(int)$result] = 0; // reset the row counter. + $numrows = $this->numRows($result); + if (is_object($numrows)) { + return $numrows; + } + $this->_num_rows[(int)$result] = $numrows; + $this->affected = 0; + return $result; + } else { + $this->affected = 0; + return DB_OK; + } + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal pgsql result pointer to the next available result + * + * @param a valid fbsql result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + $result_int = (int)$result; + $rownum = ($rownum !== null) ? $rownum : $this->row[$result_int]; + if ($rownum >= $this->_num_rows[$result_int]) { + return null; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @pg_fetch_row($result, $rownum); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + $this->row[$result_int] = ++$rownum; + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + if (is_resource($result)) { + unset($this->row[(int)$result]); + unset($this->_num_rows[(int)$result]); + $this->affected = 0; + return @pg_freeresult($result); + } + return false; + } + + // }}} + // {{{ quote() + + /** + * @deprecated Deprecated in release 1.6.0 + * @internal + */ + function quote($str) + { + return $this->quoteSmart($str); + } + + // }}} + // {{{ quoteSmart() + + /** + * Formats input so it can be safely used in a query + * + * @param mixed $in the data to be formatted + * + * @return mixed the formatted data. The format depends on the input's + * PHP type: + * + null = the string NULL + * + boolean = string TRUE or FALSE + * + integer or double = the unquoted number + * + other (including strings and numeric strings) = + * the data escaped according to MySQL's settings + * then encapsulated between single quotes + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function quoteSmart($in) + { + if (is_int($in) || is_double($in)) { + return $in; + } elseif (is_bool($in)) { + return $in ? 'TRUE' : 'FALSE'; + } elseif (is_null($in)) { + return 'NULL'; + } else { + return "'" . $this->escapeSimple($in) . "'"; + } + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * {@internal PostgreSQL treats a backslash as an escape character, + * so they are escaped as well. + * + * Not using pg_escape_string() yet because it requires PostgreSQL + * to be at version 7.2 or greater.}} + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + function escapeSimple($str) + { + return str_replace("'", "''", str_replace('\\', '\\\\', $str)); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @pg_numfields($result); + if (!$cols) { + return $this->pgsqlRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @pg_numrows($result); + if ($rows === null) { + return $this->pgsqlRaiseError(); + } + return $rows; + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + // (disabled) hack to shut up error messages from libpq.a + //@fclose(@fopen("php://stderr", "w")); + $result = @pg_exec($this->connection, 'end;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + $result = @pg_exec($this->connection, 'abort;'); + $this->transaction_opcount = 0; + if (!$result) { + return $this->pgsqlRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return $this->affected; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_pgsql::createSequence(), DB_pgsql::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + $repeat = false; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result =& $this->query("SELECT NEXTVAL('${seqname}')"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = true; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->createSequence($seq_name); + $this->popErrorHandling(); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + $result->free(); + return $arr[0]; + } + + // }}} + // {{{ createSequence() + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $result = $this->query("CREATE SEQUENCE ${seqname}"); + return $result; + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_pgsql::nextID(), DB_pgsql::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP SEQUENCE ' + . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return "$query LIMIT $count OFFSET $from"; + } + + // }}} + // {{{ pgsqlRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_pgsql::errorNative(), DB_pgsql::errorCode() + */ + function pgsqlRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * {@internal Error messages are used instead of error codes + * in order to support older versions of PostgreSQL.}} + * + * @return string the DBMS' error message + */ + function errorNative() + { + return @pg_errormessage($this->connection); + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/(relation|sequence|table).*does not exist|class .* not found/i' + => DB_ERROR_NOSUCHTABLE, + '/index .* does not exist/' + => DB_ERROR_NOT_FOUND, + '/column .* does not exist/i' + => DB_ERROR_NOSUCHFIELD, + '/relation .* already exists/i' + => DB_ERROR_ALREADY_EXISTS, + '/(divide|division) by zero$/i' + => DB_ERROR_DIVZERO, + '/pg_atoi: error in .*: can\'t parse /i' + => DB_ERROR_INVALID_NUMBER, + '/invalid input syntax for( type)? (integer|numeric)/i' + => DB_ERROR_INVALID_NUMBER, + '/value .* is out of range for type \w*int/i' + => DB_ERROR_INVALID_NUMBER, + '/integer out of range/i' + => DB_ERROR_INVALID_NUMBER, + '/value too long for type character/i' + => DB_ERROR_INVALID, + '/attribute .* not found|relation .* does not have attribute/i' + => DB_ERROR_NOSUCHFIELD, + '/column .* specified in USING clause does not exist in (left|right) table/i' + => DB_ERROR_NOSUCHFIELD, + '/parser: parse error at or near/i' + => DB_ERROR_SYNTAX, + '/syntax error at/' + => DB_ERROR_SYNTAX, + '/column reference .* is ambiguous/i' + => DB_ERROR_SYNTAX, + '/permission denied/' + => DB_ERROR_ACCESS_VIOLATION, + '/violates not-null constraint/' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/violates [\w ]+ constraint/' + => DB_ERROR_CONSTRAINT, + '/referential integrity violation/' + => DB_ERROR_CONSTRAINT, + '/more expressions than target columns/i' + => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0"); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @pg_numfields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $res[$i] = array( + 'table' => $got_string ? $case_func($result) : '', + 'name' => $case_func(@pg_fieldname($id, $i)), + 'type' => @pg_fieldtype($id, $i), + 'len' => @pg_fieldsize($id, $i), + 'flags' => $got_string + ? $this->_pgFieldFlags($id, $i, $result) + : '', + ); + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @pg_freeresult($id); + } + return $res; + } + + // }}} + // {{{ _pgFieldFlags() + + /** + * Get a column's flags + * + * Supports "not_null", "default_value", "primary_key", "unique_key" + * and "multiple_key". The default value is passed through + * rawurlencode() in case there are spaces in it. + * + * @param int $resource the PostgreSQL result identifier + * @param int $num_field the field number + * + * @return string the flags + * + * @access private + */ + function _pgFieldFlags($resource, $num_field, $table_name) + { + $field_name = @pg_fieldname($resource, $num_field); + + $result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef + FROM pg_attribute f, pg_class tab, pg_type typ + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + if (@pg_numrows($result) > 0) { + $row = @pg_fetch_row($result, 0); + $flags = ($row[0] == 't') ? 'not_null ' : ''; + + if ($row[1] == 't') { + $result = @pg_exec($this->connection, "SELECT a.adsrc + FROM pg_attribute f, pg_class tab, pg_type typ, pg_attrdef a + WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid + AND f.attrelid = a.adrelid AND f.attname = '$field_name' + AND tab.relname = '$table_name' AND f.attnum = a.adnum"); + $row = @pg_fetch_row($result, 0); + $num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]); + $flags .= 'default_' . rawurlencode($num) . ' '; + } + } else { + $flags = ''; + } + $result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey + FROM pg_attribute f, pg_class tab, pg_type typ, pg_index i + WHERE tab.relname = typ.typname + AND typ.typrelid = f.attrelid + AND f.attrelid = i.indrelid + AND f.attname = '$field_name' + AND tab.relname = '$table_name'"); + $count = @pg_numrows($result); + + for ($i = 0; $i < $count ; $i++) { + $row = @pg_fetch_row($result, $i); + $keys = explode(' ', $row[2]); + + if (in_array($num_field + 1, $keys)) { + $flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : ''; + $flags .= ($row[1] == 't') ? 'primary_key ' : ''; + if (count($keys) > 1) + $flags .= 'multiple_key '; + } + } + + return trim($flags); + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return 'SELECT c.relname AS "Name"' + . ' FROM pg_class c, pg_user u' + . ' WHERE c.relowner = u.usesysid' + . " AND c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . " AND c.relname !~ '^(pg_|sql_)'" + . ' UNION' + . ' SELECT c.relname AS "Name"' + . ' FROM pg_class c' + . " WHERE c.relkind = 'r'" + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_views' + . ' WHERE viewname = c.relname)' + . ' AND NOT EXISTS' + . ' (SELECT 1 FROM pg_user' + . ' WHERE usesysid = c.relowner)' + . " AND c.relname !~ '^pg_'"; + case 'schema.tables': + return "SELECT schemaname || '.' || tablename" + . ' AS "Name"' + . ' FROM pg_catalog.pg_tables' + . ' WHERE schemaname NOT IN' + . " ('pg_catalog', 'information_schema', 'pg_toast')"; + case 'views': + // Table cols: viewname | viewowner | definition + return 'SELECT viewname from pg_views WHERE schemaname' + . " NOT IN ('information_schema', 'pg_catalog')"; + case 'users': + // cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd |valuntil + return 'SELECT usename FROM pg_user'; + case 'databases': + return 'SELECT datname FROM pg_database'; + case 'functions': + case 'procedures': + return 'SELECT proname FROM pg_proc WHERE proowner <> 1'; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/sqlite.php b/includes/DB/sqlite.php new file mode 100644 index 0000000..3925046 --- /dev/null +++ b/includes/DB/sqlite.php @@ -0,0 +1,942 @@ + + * @author Mika Tuupola + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 3.0 + * @version CVS: $Id: sqlite.php,v 1.109 2005/03/10 01:22:48 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's sqlite extension + * for interacting with SQLite databases + * + * These methods overload the ones declared in DB_common. + * + * NOTICE: This driver needs PHP's track_errors ini setting to be on. + * It is automatically turned on when connecting to the database. + * Make sure your scripts don't turn it off. + * + * @category Database + * @package DB + * @author Urs Gehrig + * @author Mika Tuupola + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_sqlite extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'sqlite'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'sqlite'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'alter', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => false, + ); + + /** + * A mapping of native error codes to DB error codes + * + * {@internal Error codes according to sqlite_exec. See the online + * manual at http://sqlite.org/c_interface.html for info. + * This error handling based on sqlite_exec is not yet implemented.}} + * + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * SQLite data types + * + * @link http://www.sqlite.org/datatypes.html + * + * @var array + */ + var $keywords = array ( + 'BLOB' => '', + 'BOOLEAN' => '', + 'CHARACTER' => '', + 'CLOB' => '', + 'FLOAT' => '', + 'INTEGER' => '', + 'KEY' => '', + 'NATIONAL' => '', + 'NUMERIC' => '', + 'NVARCHAR' => '', + 'PRIMARY' => '', + 'TEXT' => '', + 'TIMESTAMP' => '', + 'UNIQUE' => '', + 'VARCHAR' => '', + 'VARYING' => '', + ); + + /** + * The most recent error message from $php_errormsg + * @var string + * @access private + */ + var $_lasterror = ''; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_sqlite() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's sqlite driver supports the following extra DSN options: + * + mode The permissions for the database file, in four digit + * chmod octal format (eg "0600"). + * + * Example of connecting to a database in read-only mode: + * + * require_once 'DB.php'; + * + * $dsn = 'sqlite:///path/and/name/of/db/file?mode=0400'; + * $options = array( + * 'portability' => DB_PORTABILITY_ALL, + * ); + * + * $db =& DB::connect($dsn, $options); + * if (PEAR::isError($db)) { + * die($db->getMessage()); + * } + * + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('sqlite')) { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + if ($dsn['database']) { + if (!file_exists($dsn['database'])) { + if (!touch($dsn['database'])) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + if (!isset($dsn['mode']) || + !is_numeric($dsn['mode'])) + { + $mode = 0644; + } else { + $mode = octdec($dsn['mode']); + } + if (!chmod($dsn['database'], $mode)) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + if (!file_exists($dsn['database'])) { + return $this->sqliteRaiseError(DB_ERROR_NOT_FOUND); + } + } + if (!is_file($dsn['database'])) { + return $this->sqliteRaiseError(DB_ERROR_INVALID); + } + if (!is_readable($dsn['database'])) { + return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); + } + } else { + return $this->sqliteRaiseError(DB_ERROR_ACCESS_VIOLATION); + } + + $connect_function = $persistent ? 'sqlite_popen' : 'sqlite_open'; + + // track_errors must remain on for simpleQuery() + ini_set('track_errors', 1); + $php_errormsg = ''; + + if (!$this->connection = @$connect_function($dsn['database'])) { + return $this->raiseError(DB_ERROR_NODBSELECTED, + null, null, null, + $php_errormsg); + } + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @sqlite_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * NOTICE: This method needs PHP's track_errors ini setting to be on. + * It is automatically turned on when connecting to the database. + * Make sure your scripts don't turn it off. + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + $query = $this->modifyQuery($query); + + $php_errormsg = ''; + + $result = @sqlite_query($query, $this->connection); + $this->_lasterror = $php_errormsg ? $php_errormsg : ''; + + $this->result = $result; + if (!$this->result) { + return $this->sqliteRaiseError(null); + } + + // sqlite_query() seems to allways return a resource + // so cant use that. Using $ismanip instead + if (!$ismanip) { + $numRows = $this->numRows($result); + if (is_object($numRows)) { + // we've got PEAR_Error + return $numRows; + } + return $result; + } + return DB_OK; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal sqlite result pointer to the next available result + * + * @param resource $result the valid sqlite result resource + * + * @return bool true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@sqlite_seek($this->result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $arr = @sqlite_fetch_array($result, SQLITE_ASSOC); + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @sqlite_fetch_array($result, SQLITE_NUM); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + /* + * Even though this DBMS already trims output, we do this because + * a field might have intentional whitespace at the end that + * gets removed by DB_PORTABILITY_RTRIM under another driver. + */ + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult(&$result) + { + // XXX No native free? + if (!is_resource($result)) { + return false; + } + $result = null; + return true; + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @sqlite_num_fields($result); + if (!$cols) { + return $this->sqliteRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @sqlite_num_rows($result); + if ($rows === null) { + return $this->sqliteRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affected() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + return @sqlite_changes($this->connection); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_sqlite::nextID(), DB_sqlite::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_sqlite::nextID(), DB_sqlite::dropSequence() + */ + function createSequence($seq_name) + { + $seqname = $this->getSequenceName($seq_name); + $query = 'CREATE TABLE ' . $seqname . + ' (id INTEGER UNSIGNED PRIMARY KEY) '; + $result = $this->query($query); + if (DB::isError($result)) { + return($result); + } + $query = "CREATE TRIGGER ${seqname}_cleanup AFTER INSERT ON $seqname + BEGIN + DELETE FROM $seqname WHERE idquery($query); + if (DB::isError($result)) { + return($result); + } + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_sqlite::createSequence(), DB_sqlite::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + + do { + $repeat = 0; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (id) VALUES (NULL)"); + $this->popErrorHandling(); + if ($result === DB_OK) { + $id = @sqlite_last_insert_rowid($this->connection); + if ($id != 0) { + return $id; + } + } elseif ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) + { + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } else { + $repeat = 1; + } + } + } while ($repeat); + + return $this->raiseError($result); + } + + // }}} + // {{{ getDbFileStats() + + /** + * Get the file stats for the current database + * + * Possible arguments are dev, ino, mode, nlink, uid, gid, rdev, size, + * atime, mtime, ctime, blksize, blocks or a numeric key between + * 0 and 12. + * + * @param string $arg the array key for stats() + * + * @return mixed an array on an unspecified key, integer on a passed + * arg and false at a stats error + */ + function getDbFileStats($arg = '') + { + $stats = stat($this->dsn['database']); + if ($stats == false) { + return false; + } + if (is_array($stats)) { + if (is_numeric($arg)) { + if (((int)$arg <= 12) & ((int)$arg >= 0)) { + return false; + } + return $stats[$arg ]; + } + if (array_key_exists(trim($arg), $stats)) { + return $stats[$arg ]; + } + } + return $stats; + } + + // }}} + // {{{ escapeSimple() + + /** + * Escapes a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @since Method available since Release 1.6.1 + * @see DB_common::escapeSimple() + */ + function escapeSimple($str) + { + return @sqlite_escape_string($str); + } + + // }}} + // {{{ modifyLimitQuery() + + /** + * Adds LIMIT clauses to a query string according to current DBMS standards + * + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return string the query string with LIMIT clauses added + * + * @access protected + */ + function modifyLimitQuery($query, $from, $count, $params = array()) + { + return "$query LIMIT $count OFFSET $from"; + } + + // }}} + // {{{ modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * This little hack lets you know how many rows were deleted + * when running a "DELETE FROM table" query. Only implemented + * if the DB_PORTABILITY_DELETE_COUNT portability option is on. + * + * @param string $query the query string to modify + * + * @return string the modified query string + * + * @access protected + * @see DB_common::setOption() + */ + function modifyQuery($query) + { + if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { + if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { + $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', + 'DELETE FROM \1 WHERE 1=1', $query); + } + } + return $query; + } + + // }}} + // {{{ sqliteRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_sqlite::errorNative(), DB_sqlite::errorCode() + */ + function sqliteRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + + $errorcode = @sqlite_last_error($this->connection); + $userinfo = "$errorcode ** $this->last_query"; + + return $this->raiseError($errno, null, null, $userinfo, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * {@internal This is used to retrieve more meaningfull error messages + * because sqlite_last_error() does not provide adequate info.}} + * + * @return string the DBMS' error message + */ + function errorNative() + { + return $this->_lasterror; + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message + * + * @param string $errormsg the error message returned from the database + * + * @return integer the DB error number + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/^no such table:/' => DB_ERROR_NOSUCHTABLE, + '/^no such index:/' => DB_ERROR_NOT_FOUND, + '/^(table|index) .* already exists$/' => DB_ERROR_ALREADY_EXISTS, + '/PRIMARY KEY must be unique/i' => DB_ERROR_CONSTRAINT, + '/is not unique/' => DB_ERROR_CONSTRAINT, + '/columns .* are not unique/i' => DB_ERROR_CONSTRAINT, + '/uniqueness constraint failed/' => DB_ERROR_CONSTRAINT, + '/may not be NULL/' => DB_ERROR_CONSTRAINT_NOT_NULL, + '/^no such column:/' => DB_ERROR_NOSUCHFIELD, + '/column not present in both tables/i' => DB_ERROR_NOSUCHFIELD, + '/^near ".*": syntax error$/' => DB_ERROR_SYNTAX, + '/[0-9]+ values for [0-9]+ columns/i' => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + // Fall back to DB_ERROR if there was no mapping. + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table + * + * @param string $result a string containing the name of a table + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + * @since Method available since Release 1.7.0 + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + $id = @sqlite_array_query($this->connection, + "PRAGMA table_info('$result');", + SQLITE_ASSOC); + $got_string = true; + } else { + $this->last_query = ''; + return $this->raiseError(DB_ERROR_NOT_CAPABLE, null, null, null, + 'This DBMS can not obtain tableInfo' . + ' from result sets'); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = count($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + if (strpos($id[$i]['type'], '(') !== false) { + $bits = explode('(', $id[$i]['type']); + $type = $bits[0]; + $len = rtrim($bits[1],')'); + } else { + $type = $id[$i]['type']; + $len = 0; + } + + $flags = ''; + if ($id[$i]['pk']) { + $flags .= 'primary_key '; + } + if ($id[$i]['notnull']) { + $flags .= 'not_null '; + } + if ($id[$i]['dflt_value'] !== null) { + $flags .= 'default_' . rawurlencode($id[$i]['dflt_value']); + } + $flags = trim($flags); + + $res[$i] = array( + 'table' => $case_func($result), + 'name' => $case_func($id[$i]['name']), + 'type' => $type, + 'len' => $len, + 'flags' => $flags, + ); + + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + return $res; + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * @param array $args SQLITE DRIVER ONLY: a private array of arguments + * used by the getSpecialQuery(). Do not use + * this directly. + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type, $args = array()) + { + if (!is_array($args)) { + return $this->raiseError('no key specified', null, null, null, + 'Argument has to be an array.'); + } + + switch ($type) { + case 'master': + return 'SELECT * FROM sqlite_master;'; + case 'tables': + return "SELECT name FROM sqlite_master WHERE type='table' " + . 'UNION ALL SELECT name FROM sqlite_temp_master ' + . "WHERE type='table' ORDER BY name;"; + case 'schema': + return 'SELECT sql FROM (SELECT * FROM sqlite_master ' + . 'UNION ALL SELECT * FROM sqlite_temp_master) ' + . "WHERE type!='meta' " + . 'ORDER BY tbl_name, type DESC, name;'; + case 'schemax': + case 'schema_x': + /* + * Use like: + * $res = $db->query($db->getSpecialQuery('schema_x', + * array('table' => 'table3'))); + */ + return 'SELECT sql FROM (SELECT * FROM sqlite_master ' + . 'UNION ALL SELECT * FROM sqlite_temp_master) ' + . "WHERE tbl_name LIKE '{$args['table']}' " + . "AND type!='meta' " + . 'ORDER BY type DESC, name;'; + case 'alter': + /* + * SQLite does not support ALTER TABLE; this is a helper query + * to handle this. 'table' represents the table name, 'rows' + * the news rows to create, 'save' the row(s) to keep _with_ + * the data. + * + * Use like: + * $args = array( + * 'table' => $table, + * 'rows' => "id INTEGER PRIMARY KEY, firstname TEXT, surname TEXT, datetime TEXT", + * 'save' => "NULL, titel, content, datetime" + * ); + * $res = $db->query( $db->getSpecialQuery('alter', $args)); + */ + $rows = strtr($args['rows'], $this->keywords); + + $q = array( + 'BEGIN TRANSACTION', + "CREATE TEMPORARY TABLE {$args['table']}_backup ({$args['rows']})", + "INSERT INTO {$args['table']}_backup SELECT {$args['save']} FROM {$args['table']}", + "DROP TABLE {$args['table']}", + "CREATE TABLE {$args['table']} ({$args['rows']})", + "INSERT INTO {$args['table']} SELECT {$rows} FROM {$args['table']}_backup", + "DROP TABLE {$args['table']}_backup", + 'COMMIT', + ); + + /* + * This is a dirty hack, since the above query will not get + * executed with a single query call so here the query method + * will be called directly and return a select instead. + */ + foreach ($q as $query) { + $this->query($query); + } + return "SELECT * FROM {$args['table']};"; + default: + return null; + } + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/storage.php b/includes/DB/storage.php new file mode 100644 index 0000000..738dc58 --- /dev/null +++ b/includes/DB/storage.php @@ -0,0 +1,504 @@ + + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: storage.php,v 1.21 2005/02/02 02:54:51 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB class so it can be extended from + */ +require_once 'DB.php'; + +/** + * Provides an object interface to a table row + * + * It lets you add, delete and change rows using objects rather than SQL + * statements. + * + * @category Database + * @package DB + * @author Stig Bakken + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_storage extends PEAR +{ + // {{{ properties + + /** the name of the table (or view, if the backend database supports + updates in views) we hold data from */ + var $_table = null; + + /** which column(s) in the table contains primary keys, can be a + string for single-column primary keys, or an array of strings + for multiple-column primary keys */ + var $_keycolumn = null; + + /** DB connection handle used for all transactions */ + var $_dbh = null; + + /** an assoc with the names of database fields stored as properties + in this object */ + var $_properties = array(); + + /** an assoc with the names of the properties in this object that + have been changed since they were fetched from the database */ + var $_changes = array(); + + /** flag that decides if data in this object can be changed. + objects that don't have their table's key column in their + property lists will be flagged as read-only. */ + var $_readonly = false; + + /** function or method that implements a validator for fields that + are set, this validator function returns true if the field is + valid, false if not */ + var $_validator = null; + + // }}} + // {{{ constructor + + /** + * Constructor + * + * @param $table string the name of the database table + * + * @param $keycolumn mixed string with name of key column, or array of + * strings if the table has a primary key of more than one column + * + * @param $dbh object database connection object + * + * @param $validator mixed function or method used to validate + * each new value, called with three parameters: the name of the + * field/column that is changing, a reference to the new value and + * a reference to this object + * + */ + function DB_storage($table, $keycolumn, &$dbh, $validator = null) + { + $this->PEAR('DB_Error'); + $this->_table = $table; + $this->_keycolumn = $keycolumn; + $this->_dbh = $dbh; + $this->_readonly = false; + $this->_validator = $validator; + } + + // }}} + // {{{ _makeWhere() + + /** + * Utility method to build a "WHERE" clause to locate ourselves in + * the table. + * + * XXX future improvement: use rowids? + * + * @access private + */ + function _makeWhere($keyval = null) + { + if (is_array($this->_keycolumn)) { + if ($keyval === null) { + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + $keyval[] = $this->{$this->_keycolumn[$i]}; + } + } + $whereclause = ''; + for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { + if ($i > 0) { + $whereclause .= ' AND '; + } + $whereclause .= $this->_keycolumn[$i]; + if (is_null($keyval[$i])) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]); + } + } + } else { + if ($keyval === null) { + $keyval = @$this->{$this->_keycolumn}; + } + $whereclause = $this->_keycolumn; + if (is_null($keyval)) { + // there's not much point in having a NULL key, + // but we support it anyway + $whereclause .= ' IS NULL'; + } else { + $whereclause .= ' = ' . $this->_dbh->quote($keyval); + } + } + return $whereclause; + } + + // }}} + // {{{ setup() + + /** + * Method used to initialize a DB_storage object from the + * configured table. + * + * @param $keyval mixed the key[s] of the row to fetch (string or array) + * + * @return int DB_OK on success, a DB error if not + */ + function setup($keyval) + { + $whereclause = $this->_makeWhere($keyval); + $query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause; + $sth = $this->_dbh->query($query); + if (DB::isError($sth)) { + return $sth; + } + $row = $sth->fetchRow(DB_FETCHMODE_ASSOC); + if (DB::isError($row)) { + return $row; + } + if (!$row) { + return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null, + $query, null, true); + } + foreach ($row as $key => $value) { + $this->_properties[$key] = true; + $this->$key = $value; + } + return DB_OK; + } + + // }}} + // {{{ insert() + + /** + * Create a new (empty) row in the configured table for this + * object. + */ + function insert($newpk) + { + if (is_array($this->_keycolumn)) { + $primarykey = $this->_keycolumn; + } else { + $primarykey = array($this->_keycolumn); + } + settype($newpk, "array"); + for ($i = 0; $i < sizeof($primarykey); $i++) { + $pkvals[] = $this->_dbh->quote($newpk[$i]); + } + + $sth = $this->_dbh->query("INSERT INTO $this->_table (" . + implode(",", $primarykey) . ") VALUES(" . + implode(",", $pkvals) . ")"); + if (DB::isError($sth)) { + return $sth; + } + if (sizeof($newpk) == 1) { + $newpk = $newpk[0]; + } + $this->setup($newpk); + } + + // }}} + // {{{ toString() + + /** + * Output a simple description of this DB_storage object. + * @return string object description + */ + function toString() + { + $info = strtolower(get_class($this)); + $info .= " (table="; + $info .= $this->_table; + $info .= ", keycolumn="; + if (is_array($this->_keycolumn)) { + $info .= "(" . implode(",", $this->_keycolumn) . ")"; + } else { + $info .= $this->_keycolumn; + } + $info .= ", dbh="; + if (is_object($this->_dbh)) { + $info .= $this->_dbh->toString(); + } else { + $info .= "null"; + } + $info .= ")"; + if (sizeof($this->_properties)) { + $info .= " [loaded, key="; + $keyname = $this->_keycolumn; + if (is_array($keyname)) { + $info .= "("; + for ($i = 0; $i < sizeof($keyname); $i++) { + if ($i > 0) { + $info .= ","; + } + $info .= $this->$keyname[$i]; + } + $info .= ")"; + } else { + $info .= $this->$keyname; + } + $info .= "]"; + } + if (sizeof($this->_changes)) { + $info .= " [modified]"; + } + return $info; + } + + // }}} + // {{{ dump() + + /** + * Dump the contents of this object to "standard output". + */ + function dump() + { + foreach ($this->_properties as $prop => $foo) { + print "$prop = "; + print htmlentities($this->$prop); + print "
\n"; + } + } + + // }}} + // {{{ &create() + + /** + * Static method used to create new DB storage objects. + * @param $data assoc. array where the keys are the names + * of properties/columns + * @return object a new instance of DB_storage or a subclass of it + */ + function &create($table, &$data) + { + $classname = strtolower(get_class($this)); + $obj =& new $classname($table); + foreach ($data as $name => $value) { + $obj->_properties[$name] = true; + $obj->$name = &$value; + } + return $obj; + } + + // }}} + // {{{ loadFromQuery() + + /** + * Loads data into this object from the given query. If this + * object already contains table data, changes will be saved and + * the object re-initialized first. + * + * @param $query SQL query + * + * @param $params parameter list in case you want to use + * prepare/execute mode + * + * @return int DB_OK on success, DB_WARNING_READ_ONLY if the + * returned object is read-only (because the object's specified + * key column was not found among the columns returned by $query), + * or another DB error code in case of errors. + */ +// XXX commented out for now +/* + function loadFromQuery($query, $params = null) + { + if (sizeof($this->_properties)) { + if (sizeof($this->_changes)) { + $this->store(); + $this->_changes = array(); + } + $this->_properties = array(); + } + $rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params); + if (DB::isError($rowdata)) { + return $rowdata; + } + reset($rowdata); + $found_keycolumn = false; + while (list($key, $value) = each($rowdata)) { + if ($key == $this->_keycolumn) { + $found_keycolumn = true; + } + $this->_properties[$key] = true; + $this->$key = &$value; + unset($value); // have to unset, or all properties will + // refer to the same value + } + if (!$found_keycolumn) { + $this->_readonly = true; + return DB_WARNING_READ_ONLY; + } + return DB_OK; + } + */ + + // }}} + // {{{ set() + + /** + * Modify an attriute value. + */ + function set($property, $newvalue) + { + // only change if $property is known and object is not + // read-only + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + if (@isset($this->_properties[$property])) { + if (empty($this->_validator)) { + $valid = true; + } else { + $valid = @call_user_func($this->_validator, + $this->_table, + $property, + $newvalue, + $this->$property, + $this); + } + if ($valid) { + $this->$property = $newvalue; + if (empty($this->_changes[$property])) { + $this->_changes[$property] = 0; + } else { + $this->_changes[$property]++; + } + } else { + return $this->raiseError(null, DB_ERROR_INVALID, null, + null, "invalid field: $property", + null, true); + } + return true; + } + return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null, + null, "unknown field: $property", + null, true); + } + + // }}} + // {{{ &get() + + /** + * Fetch an attribute value. + * + * @param string attribute name + * + * @return attribute contents, or null if the attribute name is + * unknown + */ + function &get($property) + { + // only return if $property is known + if (isset($this->_properties[$property])) { + return $this->$property; + } + $tmp = null; + return $tmp; + } + + // }}} + // {{{ _DB_storage() + + /** + * Destructor, calls DB_storage::store() if there are changes + * that are to be kept. + */ + function _DB_storage() + { + if (sizeof($this->_changes)) { + $this->store(); + } + $this->_properties = array(); + $this->_changes = array(); + $this->_table = null; + } + + // }}} + // {{{ store() + + /** + * Stores changes to this object in the database. + * + * @return DB_OK or a DB error + */ + function store() + { + foreach ($this->_changes as $name => $foo) { + $params[] = &$this->$name; + $vars[] = $name . ' = ?'; + } + if ($vars) { + $query = 'UPDATE ' . $this->_table . ' SET ' . + implode(', ', $vars) . ' WHERE ' . + $this->_makeWhere(); + $stmt = $this->_dbh->prepare($query); + $res = $this->_dbh->execute($stmt, $params); + if (DB::isError($res)) { + return $res; + } + $this->_changes = array(); + } + return DB_OK; + } + + // }}} + // {{{ remove() + + /** + * Remove the row represented by this object from the database. + * + * @return mixed DB_OK or a DB error + */ + function remove() + { + if ($this->_readonly) { + return $this->raiseError(null, DB_WARNING_READ_ONLY, null, + null, null, null, true); + } + $query = 'DELETE FROM ' . $this->_table .' WHERE '. + $this->_makeWhere(); + $res = $this->_dbh->query($query); + if (DB::isError($res)) { + return $res; + } + foreach ($this->_properties as $prop => $foo) { + unset($this->$prop); + } + $this->_properties = array(); + $this->_changes = array(); + return DB_OK; + } + + // }}} +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/DB/sybase.php b/includes/DB/sybase.php new file mode 100644 index 0000000..5e61307 --- /dev/null +++ b/includes/DB/sybase.php @@ -0,0 +1,907 @@ + + * @author Antônio Carlos Venâncio Júnior + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version CVS: $Id: sybase.php,v 1.78 2005/02/20 00:44:48 danielc Exp $ + * @link http://pear.php.net/package/DB + */ + +/** + * Obtain the DB_common class so it can be extended from + */ +require_once 'DB/common.php'; + +/** + * The methods PEAR DB uses to interact with PHP's sybase extension + * for interacting with Sybase databases + * + * These methods overload the ones declared in DB_common. + * + * WARNING: This driver may fail with multiple connections under the + * same user/pass/host and different databases. + * + * @category Database + * @package DB + * @author Sterling Hughes + * @author Antônio Carlos Venâncio Júnior + * @author Daniel Convissor + * @copyright 1997-2005 The PHP Group + * @license http://www.php.net/license/3_0.txt PHP License 3.0 + * @version Release: 1.7.6 + * @link http://pear.php.net/package/DB + */ +class DB_sybase extends DB_common +{ + // {{{ properties + + /** + * The DB driver type (mysql, oci8, odbc, etc.) + * @var string + */ + var $phptype = 'sybase'; + + /** + * The database syntax variant to be used (db2, access, etc.), if any + * @var string + */ + var $dbsyntax = 'sybase'; + + /** + * The capabilities of this DB implementation + * + * The 'new_link' element contains the PHP version that first provided + * new_link support for this DBMS. Contains false if it's unsupported. + * + * Meaning of the 'limit' element: + * + 'emulate' = emulate with fetch row by number + * + 'alter' = alter the query + * + false = skip rows + * + * @var array + */ + var $features = array( + 'limit' => 'emulate', + 'new_link' => false, + 'numrows' => true, + 'pconnect' => true, + 'prepare' => false, + 'ssl' => false, + 'transactions' => true, + ); + + /** + * A mapping of native error codes to DB error codes + * @var array + */ + var $errorcode_map = array( + ); + + /** + * The raw database connection created by PHP + * @var resource + */ + var $connection; + + /** + * The DSN information for connecting to a database + * @var array + */ + var $dsn = array(); + + + /** + * Should data manipulation queries be committed automatically? + * @var bool + * @access private + */ + var $autocommit = true; + + /** + * The quantity of transactions begun + * + * {@internal While this is private, it can't actually be designated + * private in PHP 5 because it is directly accessed in the test suite.}} + * + * @var integer + * @access private + */ + var $transaction_opcount = 0; + + /** + * The database specified in the DSN + * + * It's a fix to allow calls to different databases in the same script. + * + * @var string + * @access private + */ + var $_db = ''; + + + // }}} + // {{{ constructor + + /** + * This constructor calls $this->DB_common() + * + * @return void + */ + function DB_sybase() + { + $this->DB_common(); + } + + // }}} + // {{{ connect() + + /** + * Connect to the database server, log in and open the database + * + * Don't call this method directly. Use DB::connect() instead. + * + * PEAR DB's sybase driver supports the following extra DSN options: + * + appname The application name to use on this connection. + * Available since PEAR DB 1.7.0. + * + charset The character set to use on this connection. + * Available since PEAR DB 1.7.0. + * + * @param array $dsn the data source name + * @param bool $persistent should the connection be persistent? + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function connect($dsn, $persistent = false) + { + if (!PEAR::loadExtension('sybase') && + !PEAR::loadExtension('sybase_ct')) + { + return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); + } + + $this->dsn = $dsn; + if ($dsn['dbsyntax']) { + $this->dbsyntax = $dsn['dbsyntax']; + } + + $dsn['hostspec'] = $dsn['hostspec'] ? $dsn['hostspec'] : 'localhost'; + $dsn['password'] = !empty($dsn['password']) ? $dsn['password'] : false; + $dsn['charset'] = isset($dsn['charset']) ? $dsn['charset'] : false; + $dsn['appname'] = isset($dsn['appname']) ? $dsn['appname'] : false; + + $connect_function = $persistent ? 'sybase_pconnect' : 'sybase_connect'; + + if ($dsn['username']) { + $this->connection = @$connect_function($dsn['hostspec'], + $dsn['username'], + $dsn['password'], + $dsn['charset'], + $dsn['appname']); + } else { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + 'The DSN did not contain a username.'); + } + + if (!$this->connection) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED, + null, null, null, + @sybase_get_last_message()); + } + + if ($dsn['database']) { + if (!@sybase_select_db($dsn['database'], $this->connection)) { + return $this->raiseError(DB_ERROR_NODBSELECTED, + null, null, null, + @sybase_get_last_message()); + } + $this->_db = $dsn['database']; + } + + return DB_OK; + } + + // }}} + // {{{ disconnect() + + /** + * Disconnects from the database server + * + * @return bool TRUE on success, FALSE on failure + */ + function disconnect() + { + $ret = @sybase_close($this->connection); + $this->connection = null; + return $ret; + } + + // }}} + // {{{ simpleQuery() + + /** + * Sends a query to the database server + * + * @param string the SQL query string + * + * @return mixed + a PHP result resrouce for successful SELECT queries + * + the DB_OK constant for other successful queries + * + a DB_Error object on failure + */ + function simpleQuery($query) + { + $ismanip = DB::isManip($query); + $this->last_query = $query; + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $query = $this->modifyQuery($query); + if (!$this->autocommit && $ismanip) { + if ($this->transaction_opcount == 0) { + $result = @sybase_query('BEGIN TRANSACTION', $this->connection); + if (!$result) { + return $this->sybaseRaiseError(); + } + } + $this->transaction_opcount++; + } + $result = @sybase_query($query, $this->connection); + if (!$result) { + return $this->sybaseRaiseError(); + } + if (is_resource($result)) { + return $result; + } + // Determine which queries that should return data, and which + // should return an error code only. + return $ismanip ? DB_OK : $result; + } + + // }}} + // {{{ nextResult() + + /** + * Move the internal sybase result pointer to the next available result + * + * @param a valid sybase result resource + * + * @access public + * + * @return true if a result is available otherwise return false + */ + function nextResult($result) + { + return false; + } + + // }}} + // {{{ fetchInto() + + /** + * Places a row from the result set into the given array + * + * Formating of the array and the data therein are configurable. + * See DB_result::fetchInto() for more information. + * + * This method is not meant to be called directly. Use + * DB_result::fetchInto() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result the query result resource + * @param array $arr the referenced array to put the data in + * @param int $fetchmode how the resulting array should be indexed + * @param int $rownum the row number to fetch (0 = first row) + * + * @return mixed DB_OK on success, NULL when the end of a result set is + * reached or on failure + * + * @see DB_result::fetchInto() + */ + function fetchInto($result, &$arr, $fetchmode, $rownum = null) + { + if ($rownum !== null) { + if (!@sybase_data_seek($result, $rownum)) { + return null; + } + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + if (function_exists('sybase_fetch_assoc')) { + $arr = @sybase_fetch_assoc($result); + } else { + if ($arr = @sybase_fetch_array($result)) { + foreach ($arr as $key => $value) { + if (is_int($key)) { + unset($arr[$key]); + } + } + } + } + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { + $arr = array_change_key_case($arr, CASE_LOWER); + } + } else { + $arr = @sybase_fetch_row($result); + } + if (!$arr) { + return null; + } + if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { + $this->_rtrimArrayValues($arr); + } + if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { + $this->_convertNullArrayValuesToEmpty($arr); + } + return DB_OK; + } + + // }}} + // {{{ freeResult() + + /** + * Deletes the result set and frees the memory occupied by the result set + * + * This method is not meant to be called directly. Use + * DB_result::free() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_result::free() + */ + function freeResult($result) + { + return @sybase_free_result($result); + } + + // }}} + // {{{ numCols() + + /** + * Gets the number of columns in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numCols() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of columns. A DB_Error object on failure. + * + * @see DB_result::numCols() + */ + function numCols($result) + { + $cols = @sybase_num_fields($result); + if (!$cols) { + return $this->sybaseRaiseError(); + } + return $cols; + } + + // }}} + // {{{ numRows() + + /** + * Gets the number of rows in a result set + * + * This method is not meant to be called directly. Use + * DB_result::numRows() instead. It can't be declared "protected" + * because DB_result is a separate object. + * + * @param resource $result PHP's query result resource + * + * @return int the number of rows. A DB_Error object on failure. + * + * @see DB_result::numRows() + */ + function numRows($result) + { + $rows = @sybase_num_rows($result); + if ($rows === false) { + return $this->sybaseRaiseError(); + } + return $rows; + } + + // }}} + // {{{ affectedRows() + + /** + * Determines the number of rows affected by a data maniuplation query + * + * 0 is returned for queries that don't manipulate data. + * + * @return int the number of rows. A DB_Error object on failure. + */ + function affectedRows() + { + if (DB::isManip($this->last_query)) { + $result = @sybase_affected_rows($this->connection); + } else { + $result = 0; + } + return $result; + } + + // }}} + // {{{ nextId() + + /** + * Returns the next free id in a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically + * created if it does not exist + * + * @return int the next id number in the sequence. + * A DB_Error object on failure. + * + * @see DB_common::nextID(), DB_common::getSequenceName(), + * DB_sybase::createSequence(), DB_sybase::dropSequence() + */ + function nextId($seq_name, $ondemand = true) + { + $seqname = $this->getSequenceName($seq_name); + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $repeat = 0; + do { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $result = $this->query("INSERT INTO $seqname (vapor) VALUES (0)"); + $this->popErrorHandling(); + if ($ondemand && DB::isError($result) && + ($result->getCode() == DB_ERROR || $result->getCode() == DB_ERROR_NOSUCHTABLE)) + { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $this->raiseError($result); + } + } elseif (!DB::isError($result)) { + $result =& $this->query("SELECT @@IDENTITY FROM $seqname"); + $repeat = 0; + } else { + $repeat = false; + } + } while ($repeat); + if (DB::isError($result)) { + return $this->raiseError($result); + } + $result = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $result[0]; + } + + /** + * Creates a new sequence + * + * @param string $seq_name name of the new sequence + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::createSequence(), DB_common::getSequenceName(), + * DB_sybase::nextID(), DB_sybase::dropSequence() + */ + function createSequence($seq_name) + { + return $this->query('CREATE TABLE ' + . $this->getSequenceName($seq_name) + . ' (id numeric(10, 0) IDENTITY NOT NULL,' + . ' vapor int NULL)'); + } + + // }}} + // {{{ dropSequence() + + /** + * Deletes a sequence + * + * @param string $seq_name name of the sequence to be deleted + * + * @return int DB_OK on success. A DB_Error object on failure. + * + * @see DB_common::dropSequence(), DB_common::getSequenceName(), + * DB_sybase::nextID(), DB_sybase::createSequence() + */ + function dropSequence($seq_name) + { + return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); + } + + // }}} + // {{{ autoCommit() + + /** + * Enables or disables automatic commits + * + * @param bool $onoff true turns it on, false turns it off + * + * @return int DB_OK on success. A DB_Error object if the driver + * doesn't support auto-committing transactions. + */ + function autoCommit($onoff = false) + { + // XXX if $this->transaction_opcount > 0, we should probably + // issue a warning here. + $this->autocommit = $onoff ? true : false; + return DB_OK; + } + + // }}} + // {{{ commit() + + /** + * Commits the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function commit() + { + if ($this->transaction_opcount > 0) { + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @sybase_query('COMMIT', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->sybaseRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ rollback() + + /** + * Reverts the current transaction + * + * @return int DB_OK on success. A DB_Error object on failure. + */ + function rollback() + { + if ($this->transaction_opcount > 0) { + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $result = @sybase_query('ROLLBACK', $this->connection); + $this->transaction_opcount = 0; + if (!$result) { + return $this->sybaseRaiseError(); + } + } + return DB_OK; + } + + // }}} + // {{{ sybaseRaiseError() + + /** + * Produces a DB_Error object regarding the current problem + * + * @param int $errno if the error is being manually raised pass a + * DB_ERROR* constant here. If this isn't passed + * the error information gathered from the DBMS. + * + * @return object the DB_Error object + * + * @see DB_common::raiseError(), + * DB_sybase::errorNative(), DB_sybase::errorCode() + */ + function sybaseRaiseError($errno = null) + { + $native = $this->errorNative(); + if ($errno === null) { + $errno = $this->errorCode($native); + } + return $this->raiseError($errno, null, null, null, $native); + } + + // }}} + // {{{ errorNative() + + /** + * Gets the DBMS' native error message produced by the last query + * + * @return string the DBMS' error message + */ + function errorNative() + { + return @sybase_get_last_message(); + } + + // }}} + // {{{ errorCode() + + /** + * Determines PEAR::DB error code from the database's text error message. + * + * @param string $errormsg error message returned from the database + * @return integer an error number from a DB error constant + */ + function errorCode($errormsg) + { + static $error_regexps; + if (!isset($error_regexps)) { + $error_regexps = array( + '/Incorrect syntax near/' + => DB_ERROR_SYNTAX, + '/^Unclosed quote before the character string [\"\'].*[\"\']\./' + => DB_ERROR_SYNTAX, + '/Implicit conversion (from datatype|of NUMERIC value)/i' + => DB_ERROR_INVALID_NUMBER, + '/Cannot drop the table [\"\'].+[\"\'], because it doesn\'t exist in the system catalogs\./' + => DB_ERROR_NOSUCHTABLE, + '/Only the owner of object [\"\'].+[\"\'] or a user with System Administrator \(SA\) role can run this command\./' + => DB_ERROR_ACCESS_VIOLATION, + '/^.+ permission denied on object .+, database .+, owner .+/' + => DB_ERROR_ACCESS_VIOLATION, + '/^.* permission denied, database .+, owner .+/' + => DB_ERROR_ACCESS_VIOLATION, + '/[^.*] not found\./' + => DB_ERROR_NOSUCHTABLE, + '/There is already an object named/' + => DB_ERROR_ALREADY_EXISTS, + '/Invalid column name/' + => DB_ERROR_NOSUCHFIELD, + '/does not allow null values/' + => DB_ERROR_CONSTRAINT_NOT_NULL, + '/Command has been aborted/' + => DB_ERROR_CONSTRAINT, + '/^Cannot drop the index .* because it doesn\'t exist/i' + => DB_ERROR_NOT_FOUND, + '/^There is already an index/i' + => DB_ERROR_ALREADY_EXISTS, + '/^There are fewer columns in the INSERT statement than values specified/i' + => DB_ERROR_VALUE_COUNT_ON_ROW, + ); + } + + foreach ($error_regexps as $regexp => $code) { + if (preg_match($regexp, $errormsg)) { + return $code; + } + } + return DB_ERROR; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * @param object|string $result DB_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A DB_Error object on failure. + * + * @see DB_common::tableInfo() + * @since Method available since Release 1.6.0 + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + /* + * Probably received a table name. + * Create a result resource identifier. + */ + if (!@sybase_select_db($this->_db, $this->connection)) { + return $this->sybaseRaiseError(DB_ERROR_NODBSELECTED); + } + $id = @sybase_query("SELECT * FROM $result WHERE 1=0", + $this->connection); + $got_string = true; + } elseif (isset($result->result)) { + /* + * Probably received a result object. + * Extract the result resource identifier. + */ + $id = $result->result; + $got_string = false; + } else { + /* + * Probably received a result resource identifier. + * Copy it. + * Deprecated. Here for compatibility only. + */ + $id = $result; + $got_string = false; + } + + if (!is_resource($id)) { + return $this->sybaseRaiseError(DB_ERROR_NEED_MORE_DATA); + } + + if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { + $case_func = 'strtolower'; + } else { + $case_func = 'strval'; + } + + $count = @sybase_num_fields($id); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + for ($i = 0; $i < $count; $i++) { + $f = @sybase_fetch_field($id, $i); + // column_source is often blank + $res[$i] = array( + 'table' => $got_string + ? $case_func($result) + : $case_func($f->column_source), + 'name' => $case_func($f->name), + 'type' => $f->type, + 'len' => $f->max_length, + 'flags' => '', + ); + if ($res[$i]['table']) { + $res[$i]['flags'] = $this->_sybase_field_flags( + $res[$i]['table'], $res[$i]['name']); + } + if ($mode & DB_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & DB_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + + // free the result only if we were called on a table + if ($got_string) { + @sybase_free_result($id); + } + return $res; + } + + // }}} + // {{{ _sybase_field_flags() + + /** + * Get the flags for a field + * + * Currently supports: + * + unique_key (unique index, unique check or primary_key) + * + multiple_key (multi-key index) + * + * @param string $table the table name + * @param string $column the field name + * + * @return string space delimited string of flags. Empty string if none. + * + * @access private + */ + function _sybase_field_flags($table, $column) + { + static $tableName = null; + static $flags = array(); + + if ($table != $tableName) { + $flags = array(); + $tableName = $table; + + // get unique/primary keys + $res = $this->getAll("sp_helpindex $table", DB_FETCHMODE_ASSOC); + + if (!isset($res[0]['index_description'])) { + return ''; + } + + foreach ($res as $val) { + $keys = explode(', ', trim($val['index_keys'])); + + if (sizeof($keys) > 1) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'multiple_key'); + } + } + + if (strpos($val['index_description'], 'unique')) { + foreach ($keys as $key) { + $this->_add_flag($flags[$key], 'unique_key'); + } + } + } + + } + + if (array_key_exists($column, $flags)) { + return(implode(' ', $flags[$column])); + } + + return ''; + } + + // }}} + // {{{ _add_flag() + + /** + * Adds a string to the flags array if the flag is not yet in there + * - if there is no flag present the array is created + * + * @param array $array reference of flags array to add a value to + * @param mixed $value value to add to the flag array + * + * @return void + * + * @access private + */ + function _add_flag(&$array, $value) + { + if (!is_array($array)) { + $array = array($value); + } elseif (!in_array($value, $array)) { + array_push($array, $value); + } + } + + // }}} + // {{{ getSpecialQuery() + + /** + * Obtains the query string needed for listing a given type of objects + * + * @param string $type the kind of objects you want to retrieve + * + * @return string the SQL query string or null if the driver doesn't + * support the object type requested + * + * @access protected + * @see DB_common::getListOf() + */ + function getSpecialQuery($type) + { + switch ($type) { + case 'tables': + return "SELECT name FROM sysobjects WHERE type = 'U'" + . ' ORDER BY name'; + case 'views': + return "SELECT name FROM sysobjects WHERE type = 'V'"; + default: + return null; + } + } + + // }}} + +} + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> diff --git a/includes/PEAR.php b/includes/PEAR.php new file mode 100644 index 0000000..d5c9635 --- /dev/null +++ b/includes/PEAR.php @@ -0,0 +1,1055 @@ + | +// | Stig Bakken | +// | Tomas V.V.Cox | +// +--------------------------------------------------------------------+ +// +// $Id: PEAR.php,v 1.82.2.6 2005/01/01 05:24:51 cellog Exp $ +// + +define('PEAR_ERROR_RETURN', 1); +define('PEAR_ERROR_PRINT', 2); +define('PEAR_ERROR_TRIGGER', 4); +define('PEAR_ERROR_DIE', 8); +define('PEAR_ERROR_CALLBACK', 16); +/** + * WARNING: obsolete + * @deprecated + */ +define('PEAR_ERROR_EXCEPTION', 32); +define('PEAR_ZE2', (function_exists('version_compare') && + version_compare(zend_version(), "2-dev", "ge"))); + +if (substr(PHP_OS, 0, 3) == 'WIN') { + define('OS_WINDOWS', true); + define('OS_UNIX', false); + define('PEAR_OS', 'Windows'); +} else { + define('OS_WINDOWS', false); + define('OS_UNIX', true); + define('PEAR_OS', 'Unix'); // blatant assumption +} + +// instant backwards compatibility +if (!defined('PATH_SEPARATOR')) { + if (OS_WINDOWS) { + define('PATH_SEPARATOR', ';'); + } else { + define('PATH_SEPARATOR', ':'); + } +} + +$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN; +$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; +$GLOBALS['_PEAR_destructor_object_list'] = array(); +$GLOBALS['_PEAR_shutdown_funcs'] = array(); +$GLOBALS['_PEAR_error_handler_stack'] = array(); + +@ini_set('track_errors', true); + +/** + * Base class for other PEAR classes. Provides rudimentary + * emulation of destructors. + * + * If you want a destructor in your class, inherit PEAR and make a + * destructor method called _yourclassname (same name as the + * constructor, but with a "_" prefix). Also, in your constructor you + * have to call the PEAR constructor: $this->PEAR();. + * The destructor method will be called without parameters. Note that + * at in some SAPI implementations (such as Apache), any output during + * the request shutdown (in which destructors are called) seems to be + * discarded. If you need to get any debug information from your + * destructor, use error_log(), syslog() or something similar. + * + * IMPORTANT! To use the emulated destructors you need to create the + * objects by reference: $obj =& new PEAR_child; + * + * @since PHP 4.0.2 + * @author Stig Bakken + * @see http://pear.php.net/manual/ + */ +class PEAR +{ + // {{{ properties + + /** + * Whether to enable internal debug messages. + * + * @var bool + * @access private + */ + var $_debug = false; + + /** + * Default error mode for this object. + * + * @var int + * @access private + */ + var $_default_error_mode = null; + + /** + * Default error options used for this object when error mode + * is PEAR_ERROR_TRIGGER. + * + * @var int + * @access private + */ + var $_default_error_options = null; + + /** + * Default error handler (callback) for this object, if error mode is + * PEAR_ERROR_CALLBACK. + * + * @var string + * @access private + */ + var $_default_error_handler = ''; + + /** + * Which class to use for error objects. + * + * @var string + * @access private + */ + var $_error_class = 'PEAR_Error'; + + /** + * An array of expected errors. + * + * @var array + * @access private + */ + var $_expected_errors = array(); + + // }}} + + // {{{ constructor + + /** + * Constructor. Registers this object in + * $_PEAR_destructor_object_list for destructor emulation if a + * destructor object exists. + * + * @param string $error_class (optional) which class to use for + * error objects, defaults to PEAR_Error. + * @access public + * @return void + */ + function PEAR($error_class = null) + { + $classname = strtolower(get_class($this)); + if ($this->_debug) { + print "PEAR constructor called, class=$classname\n"; + } + if ($error_class !== null) { + $this->_error_class = $error_class; + } + while ($classname && strcasecmp($classname, "pear")) { + $destructor = "_$classname"; + if (method_exists($this, $destructor)) { + global $_PEAR_destructor_object_list; + $_PEAR_destructor_object_list[] = &$this; + if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { + register_shutdown_function("_PEAR_call_destructors"); + $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; + } + break; + } else { + $classname = get_parent_class($classname); + } + } + } + + // }}} + // {{{ destructor + + /** + * Destructor (the emulated type of...). Does nothing right now, + * but is included for forward compatibility, so subclass + * destructors should always call it. + * + * See the note in the class desciption about output from + * destructors. + * + * @access public + * @return void + */ + function _PEAR() { + if ($this->_debug) { + printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); + } + } + + // }}} + // {{{ getStaticProperty() + + /** + * If you have a class that's mostly/entirely static, and you need static + * properties, you can use this method to simulate them. Eg. in your method(s) + * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); + * You MUST use a reference, or they will not persist! + * + * @access public + * @param string $class The calling classname, to prevent clashes + * @param string $var The variable to retrieve. + * @return mixed A reference to the variable. If not set it will be + * auto initialised to NULL. + */ + function &getStaticProperty($class, $var) + { + static $properties; + return $properties[$class][$var]; + } + + // }}} + // {{{ registerShutdownFunc() + + /** + * Use this function to register a shutdown method for static + * classes. + * + * @access public + * @param mixed $func The function name (or array of class/method) to call + * @param mixed $args The arguments to pass to the function + * @return void + */ + function registerShutdownFunc($func, $args = array()) + { + $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); + } + + // }}} + // {{{ isError() + + /** + * Tell whether a value is a PEAR error. + * + * @param mixed $data the value to test + * @param int $code if $data is an error object, return true + * only if $code is a string and + * $obj->getMessage() == $code or + * $code is an integer and $obj->getCode() == $code + * @access public + * @return bool true if parameter is an error + */ + function isError($data, $code = null) + { + if (is_a($data, 'PEAR_Error')) { + if (is_null($code)) { + return true; + } elseif (is_string($code)) { + return $data->getMessage() == $code; + } else { + return $data->getCode() == $code; + } + } + return false; + } + + // }}} + // {{{ setErrorHandling() + + /** + * Sets how errors generated by this object should be handled. + * Can be invoked both in objects and statically. If called + * statically, setErrorHandling sets the default behaviour for all + * PEAR objects. If called in an object, setErrorHandling sets + * the default behaviour for that object. + * + * @param int $mode + * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. + * + * @param mixed $options + * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one + * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * + * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected + * to be the callback function or method. A callback + * function is a string with the name of the function, a + * callback method is an array of two elements: the element + * at index 0 is the object, and the element at index 1 is + * the name of the method to call in the object. + * + * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is + * a printf format string used when printing the error + * message. + * + * @access public + * @return void + * @see PEAR_ERROR_RETURN + * @see PEAR_ERROR_PRINT + * @see PEAR_ERROR_TRIGGER + * @see PEAR_ERROR_DIE + * @see PEAR_ERROR_CALLBACK + * @see PEAR_ERROR_EXCEPTION + * + * @since PHP 4.0.5 + */ + + function setErrorHandling($mode = null, $options = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + $setmode = &$this->_default_error_mode; + $setoptions = &$this->_default_error_options; + } else { + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + } + + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + } + + // }}} + // {{{ expectError() + + /** + * This method is used to tell which errors you expect to get. + * Expected errors are always returned with error mode + * PEAR_ERROR_RETURN. Expected error codes are stored in a stack, + * and this method pushes a new element onto it. The list of + * expected errors are in effect until they are popped off the + * stack with the popExpect() method. + * + * Note that this method can not be called statically + * + * @param mixed $code a single error code or an array of error codes to expect + * + * @return int the new depth of the "expected errors" stack + * @access public + */ + function expectError($code = '*') + { + if (is_array($code)) { + array_push($this->_expected_errors, $code); + } else { + array_push($this->_expected_errors, array($code)); + } + return sizeof($this->_expected_errors); + } + + // }}} + // {{{ popExpect() + + /** + * This method pops one element off the expected error codes + * stack. + * + * @return array the list of error codes that were popped + */ + function popExpect() + { + return array_pop($this->_expected_errors); + } + + // }}} + // {{{ _checkDelExpect() + + /** + * This method checks unsets an error code if available + * + * @param mixed error code + * @return bool true if the error code was unset, false otherwise + * @access private + * @since PHP 4.3.0 + */ + function _checkDelExpect($error_code) + { + $deleted = false; + + foreach ($this->_expected_errors AS $key => $error_array) { + if (in_array($error_code, $error_array)) { + unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); + $deleted = true; + } + + // clean up empty arrays + if (0 == count($this->_expected_errors[$key])) { + unset($this->_expected_errors[$key]); + } + } + return $deleted; + } + + // }}} + // {{{ delExpect() + + /** + * This method deletes all occurences of the specified element from + * the expected error codes stack. + * + * @param mixed $error_code error code that should be deleted + * @return mixed list of error codes that were deleted or error + * @access public + * @since PHP 4.3.0 + */ + function delExpect($error_code) + { + $deleted = false; + + if ((is_array($error_code) && (0 != count($error_code)))) { + // $error_code is a non-empty array here; + // we walk through it trying to unset all + // values + foreach($error_code as $key => $error) { + if ($this->_checkDelExpect($error)) { + $deleted = true; + } else { + $deleted = false; + } + } + return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } elseif (!empty($error_code)) { + // $error_code comes alone, trying to unset it + if ($this->_checkDelExpect($error_code)) { + return true; + } else { + return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME + } + } else { + // $error_code is empty + return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME + } + } + + // }}} + // {{{ raiseError() + + /** + * This method is a wrapper that returns an instance of the + * configured error class with this object's default error + * handling applied. If the $mode and $options parameters are not + * specified, the object's defaults are used. + * + * @param mixed $message a text error message or a PEAR error object + * + * @param int $code a numeric error code (it is up to your class + * to define these if you want to use codes) + * + * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, + * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, + * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. + * + * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter + * specifies the PHP-internal error level (one of + * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). + * If $mode is PEAR_ERROR_CALLBACK, this + * parameter specifies the callback function or + * method. In other error modes this parameter + * is ignored. + * + * @param string $userinfo If you need to pass along for example debug + * information, this parameter is meant for that. + * + * @param string $error_class The returned error object will be + * instantiated from this class, if specified. + * + * @param bool $skipmsg If true, raiseError will only pass error codes, + * the error message parameter will be dropped. + * + * @access public + * @return object a PEAR error object + * @see PEAR::setErrorHandling + * @since PHP 4.0.5 + */ + function raiseError($message = null, + $code = null, + $mode = null, + $options = null, + $userinfo = null, + $error_class = null, + $skipmsg = false) + { + // The error is yet a PEAR error object + if (is_object($message)) { + $code = $message->getCode(); + $userinfo = $message->getUserInfo(); + $error_class = $message->getType(); + $message->error_message_prefix = ''; + $message = $message->getMessage(); + } + + if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { + if ($exp[0] == "*" || + (is_int(reset($exp)) && in_array($code, $exp)) || + (is_string(reset($exp)) && in_array($message, $exp))) { + $mode = PEAR_ERROR_RETURN; + } + } + // No mode given, try global ones + if ($mode === null) { + // Class error handler + if (isset($this) && isset($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + // Global error handler + } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { + $mode = $GLOBALS['_PEAR_default_error_mode']; + $options = $GLOBALS['_PEAR_default_error_options']; + } + } + + if ($error_class !== null) { + $ec = $error_class; + } elseif (isset($this) && isset($this->_error_class)) { + $ec = $this->_error_class; + } else { + $ec = 'PEAR_Error'; + } + if ($skipmsg) { + return new $ec($code, $mode, $options, $userinfo); + } else { + return new $ec($message, $code, $mode, $options, $userinfo); + } + } + + // }}} + // {{{ throwError() + + /** + * Simpler form of raiseError with fewer options. In most cases + * message, code and userinfo are enough. + * + * @param string $message + * + */ + function throwError($message = null, + $code = null, + $userinfo = null) + { + if (isset($this) && is_a($this, 'PEAR')) { + return $this->raiseError($message, $code, null, null, $userinfo); + } else { + return PEAR::raiseError($message, $code, null, null, $userinfo); + } + } + + // }}} + function staticPushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + $stack[] = array($def_mode, $def_options); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $def_mode = $mode; + $def_options = $options; + break; + + case PEAR_ERROR_CALLBACK: + $def_mode = $mode; + // class/object method callback + if (is_callable($options)) { + $def_options = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + $stack[] = array($mode, $options); + return true; + } + + function staticPopErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + $setmode = &$GLOBALS['_PEAR_default_error_mode']; + $setoptions = &$GLOBALS['_PEAR_default_error_options']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + switch ($mode) { + case PEAR_ERROR_EXCEPTION: + case PEAR_ERROR_RETURN: + case PEAR_ERROR_PRINT: + case PEAR_ERROR_TRIGGER: + case PEAR_ERROR_DIE: + case null: + $setmode = $mode; + $setoptions = $options; + break; + + case PEAR_ERROR_CALLBACK: + $setmode = $mode; + // class/object method callback + if (is_callable($options)) { + $setoptions = $options; + } else { + trigger_error("invalid error callback", E_USER_WARNING); + } + break; + + default: + trigger_error("invalid error mode", E_USER_WARNING); + break; + } + return true; + } + + // {{{ pushErrorHandling() + + /** + * Push a new error handler on top of the error handler options stack. With this + * you can easily override the actual error handler for some code and restore + * it later with popErrorHandling. + * + * @param mixed $mode (same as setErrorHandling) + * @param mixed $options (same as setErrorHandling) + * + * @return bool Always true + * + * @see PEAR::setErrorHandling + */ + function pushErrorHandling($mode, $options = null) + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + if (isset($this) && is_a($this, 'PEAR')) { + $def_mode = &$this->_default_error_mode; + $def_options = &$this->_default_error_options; + } else { + $def_mode = &$GLOBALS['_PEAR_default_error_mode']; + $def_options = &$GLOBALS['_PEAR_default_error_options']; + } + $stack[] = array($def_mode, $def_options); + + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + $stack[] = array($mode, $options); + return true; + } + + // }}} + // {{{ popErrorHandling() + + /** + * Pop the last error handler used + * + * @return bool Always true + * + * @see PEAR::pushErrorHandling + */ + function popErrorHandling() + { + $stack = &$GLOBALS['_PEAR_error_handler_stack']; + array_pop($stack); + list($mode, $options) = $stack[sizeof($stack) - 1]; + array_pop($stack); + if (isset($this) && is_a($this, 'PEAR')) { + $this->setErrorHandling($mode, $options); + } else { + PEAR::setErrorHandling($mode, $options); + } + return true; + } + + // }}} + // {{{ loadExtension() + + /** + * OS independant PHP extension load. Remember to take care + * on the correct extension name for case sensitive OSes. + * + * @param string $ext The extension name + * @return bool Success or not on the dl() call + */ + function loadExtension($ext) + { + if (!extension_loaded($ext)) { + // if either returns true dl() will produce a FATAL error, stop that + if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { + return false; + } + if (OS_WINDOWS) { + $suffix = '.dll'; + } elseif (PHP_OS == 'HP-UX') { + $suffix = '.sl'; + } elseif (PHP_OS == 'AIX') { + $suffix = '.a'; + } elseif (PHP_OS == 'OSX') { + $suffix = '.bundle'; + } else { + $suffix = '.so'; + } + return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); + } + return true; + } + + // }}} +} + +// {{{ _PEAR_call_destructors() + +function _PEAR_call_destructors() +{ + global $_PEAR_destructor_object_list; + if (is_array($_PEAR_destructor_object_list) && + sizeof($_PEAR_destructor_object_list)) + { + reset($_PEAR_destructor_object_list); + if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { + $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); + } + while (list($k, $objref) = each($_PEAR_destructor_object_list)) { + $classname = get_class($objref); + while ($classname) { + $destructor = "_$classname"; + if (method_exists($objref, $destructor)) { + $objref->$destructor(); + break; + } else { + $classname = get_parent_class($classname); + } + } + } + // Empty the object list to ensure that destructors are + // not called more than once. + $_PEAR_destructor_object_list = array(); + } + + // Now call the shutdown functions + if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { + foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { + call_user_func_array($value[0], $value[1]); + } + } +} + +// }}} + +class PEAR_Error +{ + // {{{ properties + + var $error_message_prefix = ''; + var $mode = PEAR_ERROR_RETURN; + var $level = E_USER_NOTICE; + var $code = -1; + var $message = ''; + var $userinfo = ''; + var $backtrace = null; + + // }}} + // {{{ constructor + + /** + * PEAR_Error constructor + * + * @param string $message message + * + * @param int $code (optional) error code + * + * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN, + * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, + * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION + * + * @param mixed $options (optional) error level, _OR_ in the case of + * PEAR_ERROR_CALLBACK, the callback function or object/method + * tuple. + * + * @param string $userinfo (optional) additional user/debug info + * + * @access public + * + */ + function PEAR_Error($message = 'unknown error', $code = null, + $mode = null, $options = null, $userinfo = null) + { + if ($mode === null) { + $mode = PEAR_ERROR_RETURN; + } + $this->message = $message; + $this->code = $code; + $this->mode = $mode; + $this->userinfo = $userinfo; + if (function_exists("debug_backtrace")) { + if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { + $this->backtrace = debug_backtrace(); + } + } + if ($mode & PEAR_ERROR_CALLBACK) { + $this->level = E_USER_NOTICE; + $this->callback = $options; + } else { + if ($options === null) { + $options = E_USER_NOTICE; + } + $this->level = $options; + $this->callback = null; + } + if ($this->mode & PEAR_ERROR_PRINT) { + if (is_null($options) || is_int($options)) { + $format = "%s"; + } else { + $format = $options; + } + printf($format, $this->getMessage()); + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + trigger_error($this->getMessage(), $this->level); + } + if ($this->mode & PEAR_ERROR_DIE) { + $msg = $this->getMessage(); + if (is_null($options) || is_int($options)) { + $format = "%s"; + if (substr($msg, -1) != "\n") { + $msg .= "\n"; + } + } else { + $format = $options; + } + die(sprintf($format, $msg)); + } + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_callable($this->callback)) { + call_user_func($this->callback, $this); + } + } + if ($this->mode & PEAR_ERROR_EXCEPTION) { + trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions", E_USER_WARNING); + eval('$e = new Exception($this->message, $this->code);$e->PEAR_Error = $this;throw($e);'); + } + } + + // }}} + // {{{ getMode() + + /** + * Get the error mode from an error object. + * + * @return int error mode + * @access public + */ + function getMode() { + return $this->mode; + } + + // }}} + // {{{ getCallback() + + /** + * Get the callback function/method from an error object. + * + * @return mixed callback function or object/method array + * @access public + */ + function getCallback() { + return $this->callback; + } + + // }}} + // {{{ getMessage() + + + /** + * Get the error message from an error object. + * + * @return string full error message + * @access public + */ + function getMessage() + { + return ($this->error_message_prefix . $this->message); + } + + + // }}} + // {{{ getCode() + + /** + * Get error code from an error object + * + * @return int error code + * @access public + */ + function getCode() + { + return $this->code; + } + + // }}} + // {{{ getType() + + /** + * Get the name of this error/exception. + * + * @return string error/exception name (type) + * @access public + */ + function getType() + { + return get_class($this); + } + + // }}} + // {{{ getUserInfo() + + /** + * Get additional user-supplied information. + * + * @return string user-supplied information + * @access public + */ + function getUserInfo() + { + return $this->userinfo; + } + + // }}} + // {{{ getDebugInfo() + + /** + * Get additional debug information supplied by the application. + * + * @return string debug information + * @access public + */ + function getDebugInfo() + { + return $this->getUserInfo(); + } + + // }}} + // {{{ getBacktrace() + + /** + * Get the call backtrace from where the error was generated. + * Supported with PHP 4.3.0 or newer. + * + * @param int $frame (optional) what frame to fetch + * @return array Backtrace, or NULL if not available. + * @access public + */ + function getBacktrace($frame = null) + { + if ($frame === null) { + return $this->backtrace; + } + return $this->backtrace[$frame]; + } + + // }}} + // {{{ addUserInfo() + + function addUserInfo($info) + { + if (empty($this->userinfo)) { + $this->userinfo = $info; + } else { + $this->userinfo .= " ** $info"; + } + } + + // }}} + // {{{ toString() + + /** + * Make a string representation of this object. + * + * @return string a string with an object summary + * @access public + */ + function toString() { + $modes = array(); + $levels = array(E_USER_NOTICE => 'notice', + E_USER_WARNING => 'warning', + E_USER_ERROR => 'error'); + if ($this->mode & PEAR_ERROR_CALLBACK) { + if (is_array($this->callback)) { + $callback = (is_object($this->callback[0]) ? + strtolower(get_class($this->callback[0])) : + $this->callback[0]) . '::' . + $this->callback[1]; + } else { + $callback = $this->callback; + } + return sprintf('[%s: message="%s" code=%d mode=callback '. + 'callback=%s prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + $callback, $this->error_message_prefix, + $this->userinfo); + } + if ($this->mode & PEAR_ERROR_PRINT) { + $modes[] = 'print'; + } + if ($this->mode & PEAR_ERROR_TRIGGER) { + $modes[] = 'trigger'; + } + if ($this->mode & PEAR_ERROR_DIE) { + $modes[] = 'die'; + } + if ($this->mode & PEAR_ERROR_RETURN) { + $modes[] = 'return'; + } + return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. + 'prefix="%s" info="%s"]', + strtolower(get_class($this)), $this->message, $this->code, + implode("|", $modes), $levels[$this->level], + $this->error_message_prefix, + $this->userinfo); + } + + // }}} +} + +/* + * Local Variables: + * mode: php + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ +?> diff --git a/includes/PEAR/Autoloader.php b/includes/PEAR/Autoloader.php new file mode 100644 index 0000000..de0278d --- /dev/null +++ b/includes/PEAR/Autoloader.php @@ -0,0 +1,208 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Autoloader.php,v 1.11 2004/02/27 02:21:29 cellog Exp $ + +if (!extension_loaded("overload")) { + // die hard without ext/overload + die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader"); +} + +require_once "PEAR.php"; + +/** + * This class is for objects where you want to separate the code for + * some methods into separate classes. This is useful if you have a + * class with not-frequently-used methods that contain lots of code + * that you would like to avoid always parsing. + * + * The PEAR_Autoloader class provides autoloading and aggregation. + * The autoloading lets you set up in which classes the separated + * methods are found. Aggregation is the technique used to import new + * methods, an instance of each class providing separated methods is + * stored and called every time the aggregated method is called. + * + * @author Stig Sæther Bakken + */ +class PEAR_Autoloader extends PEAR +{ + // {{{ properties + + /** + * Map of methods and classes where they are defined + * + * @var array + * + * @access private + */ + var $_autoload_map = array(); + + /** + * Map of methods and aggregate objects + * + * @var array + * + * @access private + */ + var $_method_map = array(); + + // }}} + // {{{ addAutoload() + + /** + * Add one or more autoload entries. + * + * @param string $method which method to autoload + * + * @param string $classname (optional) which class to find the method in. + * If the $method parameter is an array, this + * parameter may be omitted (and will be ignored + * if not), and the $method parameter will be + * treated as an associative array with method + * names as keys and class names as values. + * + * @return void + * + * @access public + */ + function addAutoload($method, $classname = null) + { + if (is_array($method)) { + array_walk($method, create_function('$a,&$b', '$b = strtolower($b);')); + $this->_autoload_map = array_merge($this->_autoload_map, $method); + } else { + $this->_autoload_map[strtolower($method)] = $classname; + } + } + + // }}} + // {{{ removeAutoload() + + /** + * Remove an autoload entry. + * + * @param string $method which method to remove the autoload entry for + * + * @return bool TRUE if an entry was removed, FALSE if not + * + * @access public + */ + function removeAutoload($method) + { + $method = strtolower($method); + $ok = isset($this->_autoload_map[$method]); + unset($this->_autoload_map[$method]); + return $ok; + } + + // }}} + // {{{ addAggregateObject() + + /** + * Add an aggregate object to this object. If the specified class + * is not defined, loading it will be attempted following PEAR's + * file naming scheme. All the methods in the class will be + * aggregated, except private ones (name starting with an + * underscore) and constructors. + * + * @param string $classname what class to instantiate for the object. + * + * @return void + * + * @access public + */ + function addAggregateObject($classname) + { + $classname = strtolower($classname); + if (!class_exists($classname)) { + $include_file = preg_replace('/[^a-z0-9]/i', '_', $classname); + include_once $include_file; + } + $obj =& new $classname; + $methods = get_class_methods($classname); + foreach ($methods as $method) { + // don't import priviate methods and constructors + if ($method{0} != '_' && $method != $classname) { + $this->_method_map[$method] = $obj; + } + } + } + + // }}} + // {{{ removeAggregateObject() + + /** + * Remove an aggregate object. + * + * @param string $classname the class of the object to remove + * + * @return bool TRUE if an object was removed, FALSE if not + * + * @access public + */ + function removeAggregateObject($classname) + { + $ok = false; + $classname = strtolower($classname); + reset($this->_method_map); + while (list($method, $obj) = each($this->_method_map)) { + if (is_a($obj, $classname)) { + unset($this->_method_map[$method]); + $ok = true; + } + } + return $ok; + } + + // }}} + // {{{ __call() + + /** + * Overloaded object call handler, called each time an + * undefined/aggregated method is invoked. This method repeats + * the call in the right aggregate object and passes on the return + * value. + * + * @param string $method which method that was called + * + * @param string $args An array of the parameters passed in the + * original call + * + * @return mixed The return value from the aggregated method, or a PEAR + * error if the called method was unknown. + */ + function __call($method, $args, &$retval) + { + $method = strtolower($method); + if (empty($this->_method_map[$method]) && isset($this->_autoload_map[$method])) { + $this->addAggregateObject($this->_autoload_map[$method]); + } + if (isset($this->_method_map[$method])) { + $retval = call_user_func_array(array($this->_method_map[$method], $method), $args); + return true; + } + return false; + } + + // }}} +} + +overload("PEAR_Autoloader"); + +?> diff --git a/includes/PEAR/Builder.php b/includes/PEAR/Builder.php new file mode 100644 index 0000000..6c483f4 --- /dev/null +++ b/includes/PEAR/Builder.php @@ -0,0 +1,426 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Builder.php,v 1.16.2.3 2005/02/17 17:55:01 cellog Exp $ + +require_once 'PEAR/Common.php'; + +/** + * Class to handle building (compiling) extensions. + * + * @author Stig Sæther Bakken + */ +class PEAR_Builder extends PEAR_Common +{ + // {{{ properties + + var $php_api_version = 0; + var $zend_module_api_no = 0; + var $zend_extension_api_no = 0; + + var $extensions_built = array(); + + var $current_callback = null; + + // used for msdev builds + var $_lastline = null; + var $_firstline = null; + // }}} + // {{{ constructor + + /** + * PEAR_Builder constructor. + * + * @param object $ui user interface object (instance of PEAR_Frontend_*) + * + * @access public + */ + function PEAR_Builder(&$ui) + { + parent::PEAR_Common(); + $this->setFrontendObject($ui); + } + + // }}} + + // {{{ _build_win32() + + /** + * Build an extension from source on windows. + * requires msdev + */ + function _build_win32($descfile, $callback = null) + { + if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { + return $info; + } + $dir = dirname($descfile); + $old_cwd = getcwd(); + + if (!@chdir($dir)) { + return $this->raiseError("could not chdir to $dir"); + } + $this->log(2, "building in $dir"); + + $dsp = $info['package'].'.dsp'; + if (!@is_file("$dir/$dsp")) { + return $this->raiseError("The DSP $dsp does not exist."); + } + // XXX TODO: make release build type configurable + $command = 'msdev '.$dsp.' /MAKE "'.$info['package']. ' - Release"'; + + $this->current_callback = $callback; + $err = $this->_runCommand($command, array(&$this, 'msdevCallback')); + if (PEAR::isError($err)) { + return $err; + } + + // figure out the build platform and type + $platform = 'Win32'; + $buildtype = 'Release'; + if (preg_match('/.*?'.$info['package'].'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) { + $platform = $matches[1]; + $buildtype = $matches[2]; + } + + if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/',$this->_lastline,$matches)) { + if ($matches[2]) { + // there were errors in the build + return $this->raiseError("There were errors during compilation."); + } + $out = $matches[1]; + } else { + return $this->raiseError("Did not understand the completion status returned from msdev.exe."); + } + + // msdev doesn't tell us the output directory :/ + // open the dsp, find /out and use that directory + $dsptext = join(file($dsp),''); + + // this regex depends on the build platform and type having been + // correctly identified above. + $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'. + $info['package'].'\s-\s'. + $platform.'\s'. + $buildtype.'").*?'. + '\/out:"(.*?)"/is'; + + if ($dsptext && preg_match($regex,$dsptext,$matches)) { + // what we get back is a relative path to the output file itself. + $outfile = realpath($matches[2]); + } else { + return $this->raiseError("Could not retrieve output information from $dsp."); + } + if (@copy($outfile, "$dir/$out")) { + $outfile = "$dir/$out"; + } + + $built_files[] = array( + 'file' => "$outfile", + 'php_api' => $this->php_api_version, + 'zend_mod_api' => $this->zend_module_api_no, + 'zend_ext_api' => $this->zend_extension_api_no, + ); + + return $built_files; + } + // }}} + + // {{{ msdevCallback() + function msdevCallback($what, $data) + { + if (!$this->_firstline) + $this->_firstline = $data; + $this->_lastline = $data; + } + // }}} + + // {{{ _harventInstDir + /** + * @param string + * @param string + * @param array + * @access private + */ + function _harvestInstDir($dest_prefix, $dirname, &$built_files) + { + $d = opendir($dirname); + if (!$d) + return false; + + $ret = true; + while (($ent = readdir($d)) !== false) { + if ($ent{0} == '.') + continue; + + $full = $dirname . DIRECTORY_SEPARATOR . $ent; + if (is_dir($full)) { + if (!$this->_harvestInstDir( + $dest_prefix . DIRECTORY_SEPARATOR . $ent, + $full, $built_files)) { + $ret = false; + break; + } + } else { + $dest = $dest_prefix . DIRECTORY_SEPARATOR . $ent; + $built_files[] = array( + 'file' => $full, + 'dest' => $dest, + 'php_api' => $this->php_api_version, + 'zend_mod_api' => $this->zend_module_api_no, + 'zend_ext_api' => $this->zend_extension_api_no, + ); + } + } + closedir($d); + return $ret; + } + + // }}} + + // {{{ build() + + /** + * Build an extension from source. Runs "phpize" in the source + * directory, but compiles in a temporary directory + * (/var/tmp/pear-build-USER/PACKAGE-VERSION). + * + * @param string $descfile path to XML package description file + * + * @param mixed $callback callback function used to report output, + * see PEAR_Builder::_runCommand for details + * + * @return array an array of associative arrays with built files, + * format: + * array( array( 'file' => '/path/to/ext.so', + * 'php_api' => YYYYMMDD, + * 'zend_mod_api' => YYYYMMDD, + * 'zend_ext_api' => YYYYMMDD ), + * ... ) + * + * @access public + * + * @see PEAR_Builder::_runCommand + * @see PEAR_Common::infoFromDescriptionFile + */ + function build($descfile, $callback = null) + { + if (PEAR_OS == "Windows") { + return $this->_build_win32($descfile,$callback); + } + if (PEAR_OS != 'Unix') { + return $this->raiseError("building extensions not supported on this platform"); + } + if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { + return $info; + } + $dir = dirname($descfile); + $old_cwd = getcwd(); + if (!@chdir($dir)) { + return $this->raiseError("could not chdir to $dir"); + } + $vdir = "$info[package]-$info[version]"; + if (is_dir($vdir)) { + chdir($vdir); + } + $dir = getcwd(); + $this->log(2, "building in $dir"); + $this->current_callback = $callback; + putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH')); + $err = $this->_runCommand("phpize", array(&$this, 'phpizeCallback')); + if (PEAR::isError($err)) { + return $err; + } + if (!$err) { + return $this->raiseError("`phpize' failed"); + } + + // {{{ start of interactive part + $configure_command = "$dir/configure"; + if (isset($info['configure_options'])) { + foreach ($info['configure_options'] as $o) { + list($r) = $this->ui->userDialog('build', + array($o['prompt']), + array('text'), + array(@$o['default'])); + if (substr($o['name'], 0, 5) == 'with-' && + ($r == 'yes' || $r == 'autodetect')) { + $configure_command .= " --$o[name]"; + } else { + $configure_command .= " --$o[name]=".trim($r); + } + } + } + // }}} end of interactive part + + // FIXME make configurable + if(!$user=getenv('USER')){ + $user='defaultuser'; + } + $build_basedir = "/var/tmp/pear-build-$user"; + $build_dir = "$build_basedir/$info[package]-$info[version]"; + $inst_dir = "$build_basedir/install-$info[package]-$info[version]"; + $this->log(1, "building in $build_dir"); + if (is_dir($build_dir)) { + System::rm('-rf', $build_dir); + } + if (!System::mkDir(array('-p', $build_dir))) { + return $this->raiseError("could not create build dir: $build_dir"); + } + $this->addTempFile($build_dir); + if (!System::mkDir(array('-p', $inst_dir))) { + return $this->raiseError("could not create temporary install dir: $inst_dir"); + } + $this->addTempFile($inst_dir); + + if (getenv('MAKE')) { + $make_command = getenv('MAKE'); + } else { + $make_command = 'make'; + } + $to_run = array( + $configure_command, + $make_command, + "$make_command INSTALL_ROOT=\"$inst_dir\" install", + "find \"$inst_dir\" -ls" + ); + if (!@chdir($build_dir)) { + return $this->raiseError("could not chdir to $build_dir"); + } + putenv('PHP_PEAR_VERSION=1.3.5'); + foreach ($to_run as $cmd) { + $err = $this->_runCommand($cmd, $callback); + if (PEAR::isError($err)) { + chdir($old_cwd); + return $err; + } + if (!$err) { + chdir($old_cwd); + return $this->raiseError("`$cmd' failed"); + } + } + if (!($dp = opendir("modules"))) { + chdir($old_cwd); + return $this->raiseError("no `modules' directory found"); + } + $built_files = array(); + $prefix = exec("php-config --prefix"); + $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files); + chdir($old_cwd); + return $built_files; + } + + // }}} + // {{{ phpizeCallback() + + /** + * Message callback function used when running the "phpize" + * program. Extracts the API numbers used. Ignores other message + * types than "cmdoutput". + * + * @param string $what the type of message + * @param mixed $data the message + * + * @return void + * + * @access public + */ + function phpizeCallback($what, $data) + { + if ($what != 'cmdoutput') { + return; + } + $this->log(1, rtrim($data)); + if (preg_match('/You should update your .aclocal.m4/', $data)) { + return; + } + $matches = array(); + if (preg_match('/^\s+(\S[^:]+):\s+(\d{8})/', $data, $matches)) { + $member = preg_replace('/[^a-z]/', '_', strtolower($matches[1])); + $apino = (int)$matches[2]; + if (isset($this->$member)) { + $this->$member = $apino; + //$msg = sprintf("%-22s : %d", $matches[1], $apino); + //$this->log(1, $msg); + } + } + } + + // }}} + // {{{ _runCommand() + + /** + * Run an external command, using a message callback to report + * output. The command will be run through popen and output is + * reported for every line with a "cmdoutput" message with the + * line string, including newlines, as payload. + * + * @param string $command the command to run + * + * @param mixed $callback (optional) function to use as message + * callback + * + * @return bool whether the command was successful (exit code 0 + * means success, any other means failure) + * + * @access private + */ + function _runCommand($command, $callback = null) + { + $this->log(1, "running: $command"); + $pp = @popen("$command 2>&1", "r"); + if (!$pp) { + return $this->raiseError("failed to run `$command'"); + } + if ($callback && $callback[0]->debug == 1) { + $olddbg = $callback[0]->debug; + $callback[0]->debug = 2; + } + + while ($line = fgets($pp, 1024)) { + if ($callback) { + call_user_func($callback, 'cmdoutput', $line); + } else { + $this->log(2, rtrim($line)); + } + } + if ($callback && isset($olddbg)) { + $callback[0]->debug = $olddbg; + } + $exitcode = @pclose($pp); + return ($exitcode == 0); + } + + // }}} + // {{{ log() + + function log($level, $msg) + { + if ($this->current_callback) { + if ($this->debug >= $level) { + call_user_func($this->current_callback, 'output', $msg); + } + return; + } + return PEAR_Common::log($level, $msg); + } + + // }}} +} + +?> diff --git a/includes/PEAR/Command.php b/includes/PEAR/Command.php new file mode 100644 index 0000000..2ea6874 --- /dev/null +++ b/includes/PEAR/Command.php @@ -0,0 +1,398 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Command.php,v 1.24 2004/05/16 15:43:30 pajoye Exp $ + + +require_once "PEAR.php"; + +/** + * List of commands and what classes they are implemented in. + * @var array command => implementing class + */ +$GLOBALS['_PEAR_Command_commandlist'] = array(); + +/** + * List of shortcuts to common commands. + * @var array shortcut => command + */ +$GLOBALS['_PEAR_Command_shortcuts'] = array(); + +/** + * Array of command objects + * @var array class => object + */ +$GLOBALS['_PEAR_Command_objects'] = array(); + +/** + * Which user interface class is being used. + * @var string class name + */ +$GLOBALS['_PEAR_Command_uiclass'] = 'PEAR_Frontend_CLI'; + +/** + * Instance of $_PEAR_Command_uiclass. + * @var object + */ +$GLOBALS['_PEAR_Command_uiobject'] = null; + +/** + * PEAR command class, a simple factory class for administrative + * commands. + * + * How to implement command classes: + * + * - The class must be called PEAR_Command_Nnn, installed in the + * "PEAR/Common" subdir, with a method called getCommands() that + * returns an array of the commands implemented by the class (see + * PEAR/Command/Install.php for an example). + * + * - The class must implement a run() function that is called with three + * params: + * + * (string) command name + * (array) assoc array with options, freely defined by each + * command, for example: + * array('force' => true) + * (array) list of the other parameters + * + * The run() function returns a PEAR_CommandResponse object. Use + * these methods to get information: + * + * int getStatus() Returns PEAR_COMMAND_(SUCCESS|FAILURE|PARTIAL) + * *_PARTIAL means that you need to issue at least + * one more command to complete the operation + * (used for example for validation steps). + * + * string getMessage() Returns a message for the user. Remember, + * no HTML or other interface-specific markup. + * + * If something unexpected happens, run() returns a PEAR error. + * + * - DON'T OUTPUT ANYTHING! Return text for output instead. + * + * - DON'T USE HTML! The text you return will be used from both Gtk, + * web and command-line interfaces, so for now, keep everything to + * plain text. + * + * - DON'T USE EXIT OR DIE! Always use pear errors. From static + * classes do PEAR::raiseError(), from other classes do + * $this->raiseError(). + */ +class PEAR_Command +{ + // {{{ factory() + + /** + * Get the right object for executing a command. + * + * @param string $command The name of the command + * @param object $config Instance of PEAR_Config object + * + * @return object the command object or a PEAR error + * + * @access public + * @static + */ + function factory($command, &$config) + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) { + $command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; + } + if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { + return PEAR::raiseError("unknown command `$command'"); + } + $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; + if (!class_exists($class)) { + return PEAR::raiseError("unknown command `$command'"); + } + $ui =& PEAR_Command::getFrontendObject(); + $obj = &new $class($ui, $config); + return $obj; + } + + // }}} + // {{{ & getFrontendObject() + + /** + * Get instance of frontend object. + * + * @return object + * @static + */ + function &getFrontendObject() + { + if (empty($GLOBALS['_PEAR_Command_uiobject'])) { + $GLOBALS['_PEAR_Command_uiobject'] = &new $GLOBALS['_PEAR_Command_uiclass']; + } + return $GLOBALS['_PEAR_Command_uiobject']; + } + + // }}} + // {{{ & setFrontendClass() + + /** + * Load current frontend class. + * + * @param string $uiclass Name of class implementing the frontend + * + * @return object the frontend object, or a PEAR error + * @static + */ + function &setFrontendClass($uiclass) + { + if (is_object($GLOBALS['_PEAR_Command_uiobject']) && + is_a($GLOBALS['_PEAR_Command_uiobject'], $uiclass)) { + return $GLOBALS['_PEAR_Command_uiobject']; + } + if (!class_exists($uiclass)) { + $file = str_replace('_', '/', $uiclass) . '.php'; + if (PEAR_Command::isIncludeable($file)) { + include_once $file; + } + } + if (class_exists($uiclass)) { + $obj = &new $uiclass; + // quick test to see if this class implements a few of the most + // important frontend methods + if (method_exists($obj, 'userConfirm')) { + $GLOBALS['_PEAR_Command_uiobject'] = &$obj; + $GLOBALS['_PEAR_Command_uiclass'] = $uiclass; + return $obj; + } else { + $err = PEAR::raiseError("not a frontend class: $uiclass"); + return $err; + } + } + $err = PEAR::raiseError("no such class: $uiclass"); + return $err; + } + + // }}} + // {{{ setFrontendType() + + // }}} + // {{{ isIncludeable() + + /** + * @param string $path relative or absolute include path + * @return boolean + * @static + */ + function isIncludeable($path) + { + if (file_exists($path) && is_readable($path)) { + return true; + } + $ipath = explode(PATH_SEPARATOR, ini_get('include_path')); + foreach ($ipath as $include) { + $test = realpath($include . DIRECTORY_SEPARATOR . $path); + if (file_exists($test) && is_readable($test)) { + return true; + } + } + return false; + } + + /** + * Set current frontend. + * + * @param string $uitype Name of the frontend type (for example "CLI") + * + * @return object the frontend object, or a PEAR error + * @static + */ + function setFrontendType($uitype) + { + $uiclass = 'PEAR_Frontend_' . $uitype; + return PEAR_Command::setFrontendClass($uiclass); + } + + // }}} + // {{{ registerCommands() + + /** + * Scan through the Command directory looking for classes + * and see what commands they implement. + * + * @param bool (optional) if FALSE (default), the new list of + * commands should replace the current one. If TRUE, + * new entries will be merged with old. + * + * @param string (optional) where (what directory) to look for + * classes, defaults to the Command subdirectory of + * the directory from where this file (__FILE__) is + * included. + * + * @return bool TRUE on success, a PEAR error on failure + * + * @access public + * @static + */ + function registerCommands($merge = false, $dir = null) + { + if ($dir === null) { + $dir = dirname(__FILE__) . '/Command'; + } + $dp = @opendir($dir); + if (empty($dp)) { + return PEAR::raiseError("registerCommands: opendir($dir) failed"); + } + if (!$merge) { + $GLOBALS['_PEAR_Command_commandlist'] = array(); + } + while ($entry = readdir($dp)) { + if ($entry{0} == '.' || substr($entry, -4) != '.php' || $entry == 'Common.php') { + continue; + } + $class = "PEAR_Command_".substr($entry, 0, -4); + $file = "$dir/$entry"; + include_once $file; + // List of commands + if (empty($GLOBALS['_PEAR_Command_objects'][$class])) { + $GLOBALS['_PEAR_Command_objects'][$class] = &new $class($ui, $config); + } + $implements = $GLOBALS['_PEAR_Command_objects'][$class]->getCommands(); + foreach ($implements as $command => $desc) { + $GLOBALS['_PEAR_Command_commandlist'][$command] = $class; + $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc; + } + $shortcuts = $GLOBALS['_PEAR_Command_objects'][$class]->getShortcuts(); + foreach ($shortcuts as $shortcut => $command) { + $GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command; + } + } + @closedir($dp); + return true; + } + + // }}} + // {{{ getCommands() + + /** + * Get the list of currently supported commands, and what + * classes implement them. + * + * @return array command => implementing class + * + * @access public + * @static + */ + function getCommands() + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + return $GLOBALS['_PEAR_Command_commandlist']; + } + + // }}} + // {{{ getShortcuts() + + /** + * Get the list of command shortcuts. + * + * @return array shortcut => command + * + * @access public + * @static + */ + function getShortcuts() + { + if (empty($GLOBALS['_PEAR_Command_shortcuts'])) { + PEAR_Command::registerCommands(); + } + return $GLOBALS['_PEAR_Command_shortcuts']; + } + + // }}} + // {{{ getGetoptArgs() + + /** + * Compiles arguments for getopt. + * + * @param string $command command to get optstring for + * @param string $short_args (reference) short getopt format + * @param array $long_args (reference) long getopt format + * + * @return void + * + * @access public + * @static + */ + function getGetoptArgs($command, &$short_args, &$long_args) + { + if (empty($GLOBALS['_PEAR_Command_commandlist'])) { + PEAR_Command::registerCommands(); + } + if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { + return null; + } + $class = $GLOBALS['_PEAR_Command_commandlist'][$command]; + $obj = &$GLOBALS['_PEAR_Command_objects'][$class]; + return $obj->getGetoptArgs($command, $short_args, $long_args); + } + + // }}} + // {{{ getDescription() + + /** + * Get description for a command. + * + * @param string $command Name of the command + * + * @return string command description + * + * @access public + * @static + */ + function getDescription($command) + { + if (!isset($GLOBALS['_PEAR_Command_commanddesc'][$command])) { + return null; + } + return $GLOBALS['_PEAR_Command_commanddesc'][$command]; + } + + // }}} + // {{{ getHelp() + + /** + * Get help for command. + * + * @param string $command Name of the command to return help for + * + * @access public + * @static + */ + function getHelp($command) + { + $cmds = PEAR_Command::getCommands(); + if (isset($cmds[$command])) { + $class = $cmds[$command]; + return $GLOBALS['_PEAR_Command_objects'][$class]->getHelp($command); + } + return false; + } + // }}} +} + +?> diff --git a/includes/PEAR/Command/Auth.php b/includes/PEAR/Command/Auth.php new file mode 100644 index 0000000..0b9d3d3 --- /dev/null +++ b/includes/PEAR/Command/Auth.php @@ -0,0 +1,155 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Auth.php,v 1.15 2004/01/08 17:33:13 sniper Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Remote.php"; +require_once "PEAR/Config.php"; + +/** + * PEAR commands for managing configuration data. + * + */ +class PEAR_Command_Auth extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'login' => array( + 'summary' => 'Connects and authenticates to remote server', + 'shortcut' => 'li', + 'function' => 'doLogin', + 'options' => array(), + 'doc' => ' +Log in to the remote server. To use remote functions in the installer +that require any kind of privileges, you need to log in first. The +username and password you enter here will be stored in your per-user +PEAR configuration (~/.pearrc on Unix-like systems). After logging +in, your username and password will be sent along in subsequent +operations on the remote server.', + ), + 'logout' => array( + 'summary' => 'Logs out from the remote server', + 'shortcut' => 'lo', + 'function' => 'doLogout', + 'options' => array(), + 'doc' => ' +Logs out from the remote server. This command does not actually +connect to the remote server, it only deletes the stored username and +password from your user configuration.', + ) + + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Auth constructor. + * + * @access public + */ + function PEAR_Command_Auth(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doLogin() + + /** + * Execute the 'login' command. + * + * @param string $command command name + * + * @param array $options option_name => value + * + * @param array $params list of additional parameters + * + * @return bool TRUE on success, FALSE for unknown commands, or + * a PEAR error on failure + * + * @access public + */ + function doLogin($command, $options, $params) + { + $server = $this->config->get('master_server'); + $remote = new PEAR_Remote($this->config); + $username = $this->config->get('username'); + if (empty($username)) { + $username = @$_ENV['USER']; + } + $this->ui->outputData("Logging in to $server.", $command); + + list($username, $password) = $this->ui->userDialog( + $command, + array('Username', 'Password'), + array('text', 'password'), + array($username, '') + ); + $username = trim($username); + $password = trim($password); + + $this->config->set('username', $username); + $this->config->set('password', $password); + + $remote->expectError(401); + $ok = $remote->call('logintest'); + $remote->popExpect(); + if ($ok === true) { + $this->ui->outputData("Logged in.", $command); + $this->config->store(); + } else { + return $this->raiseError("Login failed!"); + } + + } + + // }}} + // {{{ doLogout() + + /** + * Execute the 'logout' command. + * + * @param string $command command name + * + * @param array $options option_name => value + * + * @param array $params list of additional parameters + * + * @return bool TRUE on success, FALSE for unknown commands, or + * a PEAR error on failure + * + * @access public + */ + function doLogout($command, $options, $params) + { + $server = $this->config->get('master_server'); + $this->ui->outputData("Logging out from $server.", $command); + $this->config->remove('username'); + $this->config->remove('password'); + $this->config->store(); + } + + // }}} +} + +?> \ No newline at end of file diff --git a/includes/PEAR/Command/Build.php b/includes/PEAR/Command/Build.php new file mode 100644 index 0000000..2ecbbc9 --- /dev/null +++ b/includes/PEAR/Command/Build.php @@ -0,0 +1,89 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Build.php,v 1.9 2004/01/08 17:33:13 sniper Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Builder.php"; + +/** + * PEAR commands for building extensions. + * + */ +class PEAR_Command_Build extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'build' => array( + 'summary' => 'Build an Extension From C Source', + 'function' => 'doBuild', + 'shortcut' => 'b', + 'options' => array(), + 'doc' => '[package.xml] +Builds one or more extensions contained in a package.' + ), + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Build constructor. + * + * @access public + */ + function PEAR_Command_Build(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doBuild() + + function doBuild($command, $options, $params) + { + if (sizeof($params) < 1) { + $params[0] = 'package.xml'; + } + $builder = &new PEAR_Builder($this->ui); + $this->debug = $this->config->get('verbose'); + $err = $builder->build($params[0], array(&$this, 'buildCallback')); + if (PEAR::isError($err)) { + return $err; + } + return true; + } + + // }}} + // {{{ buildCallback() + + function buildCallback($what, $data) + { + if (($what == 'cmdoutput' && $this->debug > 1) || + ($what == 'output' && $this->debug > 0)) { + $this->ui->outputData(rtrim($data), 'build'); + } + } + + // }}} +} diff --git a/includes/PEAR/Command/Common.php b/includes/PEAR/Command/Common.php new file mode 100644 index 0000000..c6ace69 --- /dev/null +++ b/includes/PEAR/Command/Common.php @@ -0,0 +1,249 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Common.php,v 1.24 2004/01/08 17:33:13 sniper Exp $ + +require_once "PEAR.php"; + +class PEAR_Command_Common extends PEAR +{ + // {{{ properties + + /** + * PEAR_Config object used to pass user system and configuration + * on when executing commands + * + * @var object + */ + var $config; + + /** + * User Interface object, for all interaction with the user. + * @var object + */ + var $ui; + + var $_deps_rel_trans = array( + 'lt' => '<', + 'le' => '<=', + 'eq' => '=', + 'ne' => '!=', + 'gt' => '>', + 'ge' => '>=', + 'has' => '==' + ); + + var $_deps_type_trans = array( + 'pkg' => 'package', + 'extension' => 'extension', + 'php' => 'PHP', + 'prog' => 'external program', + 'ldlib' => 'external library for linking', + 'rtlib' => 'external runtime library', + 'os' => 'operating system', + 'websrv' => 'web server', + 'sapi' => 'SAPI backend' + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Common constructor. + * + * @access public + */ + function PEAR_Command_Common(&$ui, &$config) + { + parent::PEAR(); + $this->config = &$config; + $this->ui = &$ui; + } + + // }}} + + // {{{ getCommands() + + /** + * Return a list of all the commands defined by this class. + * @return array list of commands + * @access public + */ + function getCommands() + { + $ret = array(); + foreach (array_keys($this->commands) as $command) { + $ret[$command] = $this->commands[$command]['summary']; + } + return $ret; + } + + // }}} + // {{{ getShortcuts() + + /** + * Return a list of all the command shortcuts defined by this class. + * @return array shortcut => command + * @access public + */ + function getShortcuts() + { + $ret = array(); + foreach (array_keys($this->commands) as $command) { + if (isset($this->commands[$command]['shortcut'])) { + $ret[$this->commands[$command]['shortcut']] = $command; + } + } + return $ret; + } + + // }}} + // {{{ getOptions() + + function getOptions($command) + { + return @$this->commands[$command]['options']; + } + + // }}} + // {{{ getGetoptArgs() + + function getGetoptArgs($command, &$short_args, &$long_args) + { + $short_args = ""; + $long_args = array(); + if (empty($this->commands[$command])) { + return; + } + reset($this->commands[$command]); + while (list($option, $info) = each($this->commands[$command]['options'])) { + $larg = $sarg = ''; + if (isset($info['arg'])) { + if ($info['arg']{0} == '(') { + $larg = '=='; + $sarg = '::'; + $arg = substr($info['arg'], 1, -1); + } else { + $larg = '='; + $sarg = ':'; + $arg = $info['arg']; + } + } + if (isset($info['shortopt'])) { + $short_args .= $info['shortopt'] . $sarg; + } + $long_args[] = $option . $larg; + } + } + + // }}} + // {{{ getHelp() + /** + * Returns the help message for the given command + * + * @param string $command The command + * @return mixed A fail string if the command does not have help or + * a two elements array containing [0]=>help string, + * [1]=> help string for the accepted cmd args + */ + function getHelp($command) + { + $config = &PEAR_Config::singleton(); + $help = @$this->commands[$command]['doc']; + if (empty($help)) { + // XXX (cox) Fallback to summary if there is no doc (show both?) + if (!$help = @$this->commands[$command]['summary']) { + return "No help for command \"$command\""; + } + } + if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { + foreach($matches[0] as $k => $v) { + $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); + } + } + return array($help, $this->getHelpArgs($command)); + } + + // }}} + // {{{ getHelpArgs() + /** + * Returns the help for the accepted arguments of a command + * + * @param string $command + * @return string The help string + */ + function getHelpArgs($command) + { + if (isset($this->commands[$command]['options']) && + count($this->commands[$command]['options'])) + { + $help = "Options:\n"; + foreach ($this->commands[$command]['options'] as $k => $v) { + if (isset($v['arg'])) { + if ($v['arg']{0} == '(') { + $arg = substr($v['arg'], 1, -1); + $sapp = " [$arg]"; + $lapp = "[=$arg]"; + } else { + $sapp = " $v[arg]"; + $lapp = "=$v[arg]"; + } + } else { + $sapp = $lapp = ""; + } + if (isset($v['shortopt'])) { + $s = $v['shortopt']; + @$help .= " -$s$sapp, --$k$lapp\n"; + } else { + @$help .= " --$k$lapp\n"; + } + $p = " "; + $doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); + $help .= " $doc\n"; + } + return $help; + } + return null; + } + + // }}} + // {{{ run() + + function run($command, $options, $params) + { + $func = @$this->commands[$command]['function']; + if (empty($func)) { + // look for shortcuts + foreach (array_keys($this->commands) as $cmd) { + if (@$this->commands[$cmd]['shortcut'] == $command) { + $command = $cmd; + $func = @$this->commands[$command]['function']; + if (empty($func)) { + return $this->raiseError("unknown command `$command'"); + } + break; + } + } + } + return $this->$func($command, $options, $params); + } + + // }}} +} + +?> \ No newline at end of file diff --git a/includes/PEAR/Command/Config.php b/includes/PEAR/Command/Config.php new file mode 100644 index 0000000..474a234 --- /dev/null +++ b/includes/PEAR/Command/Config.php @@ -0,0 +1,225 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Config.php,v 1.27 2004/06/15 16:48:49 pajoye Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Config.php"; + +/** + * PEAR commands for managing configuration data. + * + */ +class PEAR_Command_Config extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'config-show' => array( + 'summary' => 'Show All Settings', + 'function' => 'doConfigShow', + 'shortcut' => 'csh', + 'options' => array(), + 'doc' => ' +Displays all configuration values. An optional argument +may be used to tell which configuration layer to display. Valid +configuration layers are "user", "system" and "default". +', + ), + 'config-get' => array( + 'summary' => 'Show One Setting', + 'function' => 'doConfigGet', + 'shortcut' => 'cg', + 'options' => array(), + 'doc' => ' [layer] +Displays the value of one configuration parameter. The +first argument is the name of the parameter, an optional second argument +may be used to tell which configuration layer to look in. Valid configuration +layers are "user", "system" and "default". If no layer is specified, a value +will be picked from the first layer that defines the parameter, in the order +just specified. +', + ), + 'config-set' => array( + 'summary' => 'Change Setting', + 'function' => 'doConfigSet', + 'shortcut' => 'cs', + 'options' => array(), + 'doc' => ' [layer] +Sets the value of one configuration parameter. The first argument is +the name of the parameter, the second argument is the new value. Some +parameters are subject to validation, and the command will fail with +an error message if the new value does not make sense. An optional +third argument may be used to specify in which layer to set the +configuration parameter. The default layer is "user". +', + ), + 'config-help' => array( + 'summary' => 'Show Information About Setting', + 'function' => 'doConfigHelp', + 'shortcut' => 'ch', + 'options' => array(), + 'doc' => '[parameter] +Displays help for a configuration parameter. Without arguments it +displays help for all configuration parameters. +', + ), + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Config constructor. + * + * @access public + */ + function PEAR_Command_Config(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doConfigShow() + + function doConfigShow($command, $options, $params) + { + // $params[0] -> the layer + if ($error = $this->_checkLayer(@$params[0])) { + return $this->raiseError($error); + } + $keys = $this->config->getKeys(); + sort($keys); + $data = array('caption' => 'Configuration:'); + foreach ($keys as $key) { + $type = $this->config->getType($key); + $value = $this->config->get($key, @$params[0]); + if ($type == 'password' && $value) { + $value = '********'; + } + if ($value === false) { + $value = 'false'; + } elseif ($value === true) { + $value = 'true'; + } + $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doConfigGet() + + function doConfigGet($command, $options, $params) + { + // $params[0] -> the parameter + // $params[1] -> the layer + if ($error = $this->_checkLayer(@$params[1])) { + return $this->raiseError($error); + } + if (sizeof($params) < 1 || sizeof($params) > 2) { + return $this->raiseError("config-get expects 1 or 2 parameters"); + } elseif (sizeof($params) == 1) { + $this->ui->outputData($this->config->get($params[0]), $command); + } else { + $data = $this->config->get($params[0], $params[1]); + $this->ui->outputData($data, $command); + } + return true; + } + + // }}} + // {{{ doConfigSet() + + function doConfigSet($command, $options, $params) + { + // $param[0] -> a parameter to set + // $param[1] -> the value for the parameter + // $param[2] -> the layer + $failmsg = ''; + if (sizeof($params) < 2 || sizeof($params) > 3) { + $failmsg .= "config-set expects 2 or 3 parameters"; + return PEAR::raiseError($failmsg); + } + if ($error = $this->_checkLayer(@$params[2])) { + $failmsg .= $error; + return PEAR::raiseError($failmsg); + } + if (!call_user_func_array(array(&$this->config, 'set'), $params)) + { + $failmsg = "config-set (" . implode(", ", $params) . ") failed"; + } else { + $this->config->store(); + } + if ($failmsg) { + return $this->raiseError($failmsg); + } + return true; + } + + // }}} + // {{{ doConfigHelp() + + function doConfigHelp($command, $options, $params) + { + if (empty($params)) { + $params = $this->config->getKeys(); + } + $data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); + $data['headline'] = array('Name', 'Type', 'Description'); + $data['border'] = true; + foreach ($params as $name) { + $type = $this->config->getType($name); + $docs = $this->config->getDocs($name); + if ($type == 'set') { + $docs = rtrim($docs) . "\nValid set: " . + implode(' ', $this->config->getSetValues($name)); + } + $data['data'][] = array($name, $type, $docs); + } + $this->ui->outputData($data, $command); + } + + // }}} + // {{{ _checkLayer() + + /** + * Checks if a layer is defined or not + * + * @param string $layer The layer to search for + * @return mixed False on no error or the error message + */ + function _checkLayer($layer = null) + { + if (!empty($layer) && $layer != 'default') { + $layers = $this->config->getLayers(); + if (!in_array($layer, $layers)) { + return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; + } + } + return false; + } + + // }}} +} + +?> diff --git a/includes/PEAR/Command/Install.php b/includes/PEAR/Command/Install.php new file mode 100644 index 0000000..dce52f0 --- /dev/null +++ b/includes/PEAR/Command/Install.php @@ -0,0 +1,470 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Install.php,v 1.53.2.1 2004/10/19 04:08:42 cellog Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Installer.php"; + +/** + * PEAR commands for installation or deinstallation/upgrading of + * packages. + * + */ +class PEAR_Command_Install extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'install' => array( + 'summary' => 'Install Package', + 'function' => 'doInstall', + 'shortcut' => 'i', + 'options' => array( + 'force' => array( + 'shortopt' => 'f', + 'doc' => 'will overwrite newer installed packages', + ), + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, install anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as installed', + ), + 'soft' => array( + 'shortopt' => 's', + 'doc' => 'soft install, fail silently, or upgrade if already installed', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + 'alldeps' => array( + 'shortopt' => 'a', + 'doc' => 'install all required and optional dependencies', + ), + 'onlyreqdeps' => array( + 'shortopt' => 'o', + 'doc' => 'install all required dependencies', + ), + ), + 'doc' => ' ... +Installs one or more PEAR packages. You can specify a package to +install in four ways: + +"Package-1.0.tgz" : installs from a local file + +"http://example.com/Package-1.0.tgz" : installs from +anywhere on the net. + +"package.xml" : installs the package described in +package.xml. Useful for testing, or for wrapping a PEAR package in +another package manager such as RPM. + +"Package" : queries your configured server +({config master_server}) and downloads the newest package with +the preferred quality/state ({config preferred_state}). + +More than one package may be specified at once. It is ok to mix these +four ways of specifying packages. +'), + 'upgrade' => array( + 'summary' => 'Upgrade Package', + 'function' => 'doInstall', + 'shortcut' => 'up', + 'options' => array( + 'force' => array( + 'shortopt' => 'f', + 'doc' => 'overwrite newer installed packages', + ), + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, upgrade anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as upgraded', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + 'alldeps' => array( + 'shortopt' => 'a', + 'doc' => 'install all required and optional dependencies', + ), + 'onlyreqdeps' => array( + 'shortopt' => 'o', + 'doc' => 'install all required dependencies', + ), + ), + 'doc' => ' ... +Upgrades one or more PEAR packages. See documentation for the +"install" command for ways to specify a package. + +When upgrading, your package will be updated if the provided new +package has a higher version number (use the -f option if you need to +upgrade anyway). + +More than one package may be specified at once. +'), + 'upgrade-all' => array( + 'summary' => 'Upgrade All Packages', + 'function' => 'doInstall', + 'shortcut' => 'ua', + 'options' => array( + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, upgrade anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not install files, only register the package as upgraded', + ), + 'nobuild' => array( + 'shortopt' => 'B', + 'doc' => 'don\'t build C extensions', + ), + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'request uncompressed files when downloading', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' +Upgrades all packages that have a newer release available. Upgrades are +done only if there is a release available of the state specified in +"preferred_state" (currently {config preferred_state}), or a state considered +more stable. +'), + 'uninstall' => array( + 'summary' => 'Un-install Package', + 'function' => 'doUninstall', + 'shortcut' => 'un', + 'options' => array( + 'nodeps' => array( + 'shortopt' => 'n', + 'doc' => 'ignore dependencies, uninstall anyway', + ), + 'register-only' => array( + 'shortopt' => 'r', + 'doc' => 'do not remove files, only register the packages as not installed', + ), + 'installroot' => array( + 'shortopt' => 'R', + 'arg' => 'DIR', + 'doc' => 'root directory used when installing files (ala PHP\'s INSTALL_ROOT)', + ), + 'ignore-errors' => array( + 'doc' => 'force install even if there were errors', + ), + ), + 'doc' => ' ... +Uninstalls one or more PEAR packages. More than one package may be +specified at once. +'), + 'bundle' => array( + 'summary' => 'Unpacks a Pecl Package', + 'function' => 'doBundle', + 'shortcut' => 'bun', + 'options' => array( + 'destination' => array( + 'shortopt' => 'd', + 'arg' => 'DIR', + 'doc' => 'Optional destination directory for unpacking (defaults to current path or "ext" if exists)', + ), + 'force' => array( + 'shortopt' => 'f', + 'doc' => 'Force the unpacking even if there were errors in the package', + ), + ), + 'doc' => ' +Unpacks a Pecl Package into the selected location. It will download the +package if needed. +'), + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Install constructor. + * + * @access public + */ + function PEAR_Command_Install(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doInstall() + + function doInstall($command, $options, $params) + { + require_once 'PEAR/Downloader.php'; + if (empty($this->installer)) { + $this->installer = &new PEAR_Installer($this->ui); + } + if ($command == 'upgrade') { + $options['upgrade'] = true; + } + if ($command == 'upgrade-all') { + include_once "PEAR/Remote.php"; + $options['upgrade'] = true; + $remote = &new PEAR_Remote($this->config); + $state = $this->config->get('preferred_state'); + if (empty($state) || $state == 'any') { + $latest = $remote->call("package.listLatestReleases"); + } else { + $latest = $remote->call("package.listLatestReleases", $state); + } + if (PEAR::isError($latest)) { + return $latest; + } + $reg = new PEAR_Registry($this->config->get('php_dir')); + $installed = array_flip($reg->listPackages()); + $params = array(); + foreach ($latest as $package => $info) { + $package = strtolower($package); + if (!isset($installed[$package])) { + // skip packages we don't have installed + continue; + } + $inst_version = $reg->packageInfo($package, 'version'); + if (version_compare("$info[version]", "$inst_version", "le")) { + // installed version is up-to-date + continue; + } + $params[] = $package; + $this->ui->outputData(array('data' => "Will upgrade $package"), $command); + } + } + $this->downloader = &new PEAR_Downloader($this->ui, $options, $this->config); + $errors = array(); + $downloaded = array(); + $this->downloader->download($params); + $errors = $this->downloader->getErrorMsgs(); + if (count($errors)) { + $err['data'] = array($errors); + $err['headline'] = 'Install Errors'; + $this->ui->outputData($err); + return $this->raiseError("$command failed"); + } + $downloaded = $this->downloader->getDownloadedPackages(); + $this->installer->sortPkgDeps($downloaded); + foreach ($downloaded as $pkg) { + PEAR::pushErrorHandling(PEAR_ERROR_RETURN); + $info = $this->installer->install($pkg['file'], $options, $this->config); + PEAR::popErrorHandling(); + if (PEAR::isError($info)) { + $this->ui->outputData('ERROR: ' .$info->getMessage()); + continue; + } + if (is_array($info)) { + if ($this->config->get('verbose') > 0) { + $label = "$info[package] $info[version]"; + $out = array('data' => "$command ok: $label"); + if (isset($info['release_warnings'])) { + $out['release_warnings'] = $info['release_warnings']; + } + $this->ui->outputData($out, $command); + } + } else { + return $this->raiseError("$command failed"); + } + } + return true; + } + + // }}} + // {{{ doUninstall() + + function doUninstall($command, $options, $params) + { + if (empty($this->installer)) { + $this->installer = &new PEAR_Installer($this->ui); + } + if (sizeof($params) < 1) { + return $this->raiseError("Please supply the package(s) you want to uninstall"); + } + include_once 'PEAR/Registry.php'; + $reg = new PEAR_Registry($this->config->get('php_dir')); + $newparams = array(); + $badparams = array(); + foreach ($params as $pkg) { + $info = $reg->packageInfo($pkg); + if ($info === null) { + $badparams[] = $pkg; + } else { + $newparams[] = $info; + } + } + $this->installer->sortPkgDeps($newparams, true); + $params = array(); + foreach($newparams as $info) { + $params[] = $info['info']['package']; + } + $params = array_merge($params, $badparams); + foreach ($params as $pkg) { + if ($this->installer->uninstall($pkg, $options)) { + if ($this->config->get('verbose') > 0) { + $this->ui->outputData("uninstall ok: $pkg", $command); + } + } else { + return $this->raiseError("uninstall failed: $pkg"); + } + } + return true; + } + + // }}} + + + // }}} + // {{{ doBundle() + /* + (cox) It just downloads and untars the package, does not do + any check that the PEAR_Installer::_installFile() does. + */ + + function doBundle($command, $options, $params) + { + if (empty($this->installer)) { + $this->installer = &new PEAR_Downloader($this->ui); + } + $installer = &$this->installer; + if (sizeof($params) < 1) { + return $this->raiseError("Please supply the package you want to bundle"); + } + $pkgfile = $params[0]; + $need_download = false; + if (preg_match('#^(http|ftp)://#', $pkgfile)) { + $need_download = true; + } elseif (!@is_file($pkgfile)) { + if ($installer->validPackageName($pkgfile)) { + $pkgfile = $installer->getPackageDownloadUrl($pkgfile); + $need_download = true; + } else { + if (strlen($pkgfile)) { + return $this->raiseError("Could not open the package file: $pkgfile"); + } else { + return $this->raiseError("No package file given"); + } + } + } + + // Download package ----------------------------------------------- + if ($need_download) { + $downloaddir = $installer->config->get('download_dir'); + if (empty($downloaddir)) { + if (PEAR::isError($downloaddir = System::mktemp('-d'))) { + return $downloaddir; + } + $installer->log(2, '+ tmp dir created at ' . $downloaddir); + } + $callback = $this->ui ? array(&$installer, '_downloadCallback') : null; + $file = $installer->downloadHttp($pkgfile, $this->ui, $downloaddir, $callback); + if (PEAR::isError($file)) { + return $this->raiseError($file); + } + $pkgfile = $file; + } + + // Parse xml file ----------------------------------------------- + $pkginfo = $installer->infoFromTgzFile($pkgfile); + if (PEAR::isError($pkginfo)) { + return $this->raiseError($pkginfo); + } + $installer->validatePackageInfo($pkginfo, $errors, $warnings); + // XXX We allow warnings, do we have to do it? + if (count($errors)) { + if (empty($options['force'])) { + return $this->raiseError("The following errors where found:\n". + implode("\n", $errors)); + } else { + $this->log(0, "warning : the following errors were found:\n". + implode("\n", $errors)); + } + } + $pkgname = $pkginfo['package']; + + // Unpacking ------------------------------------------------- + + if (isset($options['destination'])) { + if (!is_dir($options['destination'])) { + System::mkdir('-p ' . $options['destination']); + } + $dest = realpath($options['destination']); + } else { + $pwd = getcwd(); + if (is_dir($pwd . DIRECTORY_SEPARATOR . 'ext')) { + $dest = $pwd . DIRECTORY_SEPARATOR . 'ext'; + } else { + $dest = $pwd; + } + } + $dest .= DIRECTORY_SEPARATOR . $pkgname; + $orig = $pkgname . '-' . $pkginfo['version']; + + $tar = new Archive_Tar($pkgfile); + if (!@$tar->extractModify($dest, $orig)) { + return $this->raiseError("unable to unpack $pkgfile"); + } + $this->ui->outputData("Package ready at '$dest'"); + // }}} + } + + // }}} + +} +?> diff --git a/includes/PEAR/Command/Mirror.php b/includes/PEAR/Command/Mirror.php new file mode 100644 index 0000000..bf56c3d --- /dev/null +++ b/includes/PEAR/Command/Mirror.php @@ -0,0 +1,101 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Mirror.php,v 1.5 2004/03/18 12:23:57 mj Exp $ + +require_once "PEAR/Command/Common.php"; +require_once "PEAR/Command.php"; +require_once "PEAR/Remote.php"; +require_once "PEAR.php"; + +/** + * PEAR commands for providing file mirrors + * + */ +class PEAR_Command_Mirror extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'download-all' => array( + 'summary' => 'Downloads each available package from master_server', + 'function' => 'doDownloadAll', + 'shortcut' => 'da', + 'options' => array(), + 'doc' => ' + Requests a list of available packages from the package server + (master_server) and downloads them to current working directory' + ), + ); + + // }}} + + // {{{ constructor + + /** + * PEAR_Command_Mirror constructor. + * + * @access public + * @param object PEAR_Frontend a reference to an frontend + * @param object PEAR_Config a reference to the configuration data + */ + function PEAR_Command_Mirror(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doDownloadAll() + /** + * retrieves a list of avaible Packages from master server + * and downloads them + * + * @access public + * @param string $command the command + * @param array $options the command options before the command + * @param array $params the stuff after the command name + * @return bool true if succesful + * @throw PEAR_Error + */ + function doDownloadAll($command, $options, $params) + { + $this->config->set("php_dir", "."); + $remote = &new PEAR_Remote($this->config); + $remoteInfo = $remote->call("package.listAll"); + if (PEAR::isError($remoteInfo)) { + return $remoteInfo; + } + $cmd = &PEAR_Command::factory("download", $this->config); + if (PEAR::isError($cmd)) { + return $cmd; + } + foreach ($remoteInfo as $pkgn => $pkg) { + /** + * Error handling not neccesary, because already done by + * the download command + */ + $cmd->run("download", array(), array($pkgn)); + } + + return true; + } + + // }}} +} diff --git a/includes/PEAR/Command/Package.php b/includes/PEAR/Command/Package.php new file mode 100644 index 0000000..aca8711 --- /dev/null +++ b/includes/PEAR/Command/Package.php @@ -0,0 +1,819 @@ + | +// | Martin Jansen | +// | Greg Beaver | +// +----------------------------------------------------------------------+ +// +// $Id: Package.php,v 1.61.2.7 2005/02/17 17:47:55 cellog Exp $ + +require_once 'PEAR/Common.php'; +require_once 'PEAR/Command/Common.php'; + +class PEAR_Command_Package extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'package' => array( + 'summary' => 'Build Package', + 'function' => 'doPackage', + 'shortcut' => 'p', + 'options' => array( + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'Do not gzip the package file' + ), + 'showname' => array( + 'shortopt' => 'n', + 'doc' => 'Print the name of the packaged file.', + ), + ), + 'doc' => '[descfile] +Creates a PEAR package from its description file (usually called +package.xml). +' + ), + 'package-validate' => array( + 'summary' => 'Validate Package Consistency', + 'function' => 'doPackageValidate', + 'shortcut' => 'pv', + 'options' => array(), + 'doc' => ' +', + ), + 'cvsdiff' => array( + 'summary' => 'Run a "cvs diff" for all files in a package', + 'function' => 'doCvsDiff', + 'shortcut' => 'cd', + 'options' => array( + 'quiet' => array( + 'shortopt' => 'q', + 'doc' => 'Be quiet', + ), + 'reallyquiet' => array( + 'shortopt' => 'Q', + 'doc' => 'Be really quiet', + ), + 'date' => array( + 'shortopt' => 'D', + 'doc' => 'Diff against revision of DATE', + 'arg' => 'DATE', + ), + 'release' => array( + 'shortopt' => 'R', + 'doc' => 'Diff against tag for package release REL', + 'arg' => 'REL', + ), + 'revision' => array( + 'shortopt' => 'r', + 'doc' => 'Diff against revision REV', + 'arg' => 'REV', + ), + 'context' => array( + 'shortopt' => 'c', + 'doc' => 'Generate context diff', + ), + 'unified' => array( + 'shortopt' => 'u', + 'doc' => 'Generate unified diff', + ), + 'ignore-case' => array( + 'shortopt' => 'i', + 'doc' => 'Ignore case, consider upper- and lower-case letters equivalent', + ), + 'ignore-whitespace' => array( + 'shortopt' => 'b', + 'doc' => 'Ignore changes in amount of white space', + ), + 'ignore-blank-lines' => array( + 'shortopt' => 'B', + 'doc' => 'Ignore changes that insert or delete blank lines', + ), + 'brief' => array( + 'doc' => 'Report only whether the files differ, no details', + ), + 'dry-run' => array( + 'shortopt' => 'n', + 'doc' => 'Don\'t do anything, just pretend', + ), + ), + 'doc' => ' +Compares all the files in a package. Without any options, this +command will compare the current code with the last checked-in code. +Using the -r or -R option you may compare the current code with that +of a specific release. +', + ), + 'cvstag' => array( + 'summary' => 'Set CVS Release Tag', + 'function' => 'doCvsTag', + 'shortcut' => 'ct', + 'options' => array( + 'quiet' => array( + 'shortopt' => 'q', + 'doc' => 'Be quiet', + ), + 'reallyquiet' => array( + 'shortopt' => 'Q', + 'doc' => 'Be really quiet', + ), + 'slide' => array( + 'shortopt' => 'F', + 'doc' => 'Move (slide) tag if it exists', + ), + 'delete' => array( + 'shortopt' => 'd', + 'doc' => 'Remove tag', + ), + 'dry-run' => array( + 'shortopt' => 'n', + 'doc' => 'Don\'t do anything, just pretend', + ), + ), + 'doc' => ' +Sets a CVS tag on all files in a package. Use this command after you have +packaged a distribution tarball with the "package" command to tag what +revisions of what files were in that release. If need to fix something +after running cvstag once, but before the tarball is released to the public, +use the "slide" option to move the release tag. +', + ), + 'run-tests' => array( + 'summary' => 'Run Regression Tests', + 'function' => 'doRunTests', + 'shortcut' => 'rt', + 'options' => array( + 'recur' => array( + 'shortopt' => 'r', + 'doc' => 'Run tests in child directories, recursively. 4 dirs deep maximum', + ), + 'ini' => array( + 'shortopt' => 'i', + 'doc' => 'actual string of settings to pass to php in format " -d setting=blah"', + 'arg' => 'SETTINGS' + ), + 'realtimelog' => array( + 'shortopt' => 'l', + 'doc' => 'Log test runs/results as they are run', + ), + ), + 'doc' => '[testfile|dir ...] +Run regression tests with PHP\'s regression testing script (run-tests.php).', + ), + 'package-dependencies' => array( + 'summary' => 'Show package dependencies', + 'function' => 'doPackageDependencies', + 'shortcut' => 'pd', + 'options' => array(), + 'doc' => ' +List all depencies the package has.' + ), + 'sign' => array( + 'summary' => 'Sign a package distribution file', + 'function' => 'doSign', + 'shortcut' => 'si', + 'options' => array(), + 'doc' => ' +Signs a package distribution (.tar or .tgz) file with GnuPG.', + ), + 'makerpm' => array( + 'summary' => 'Builds an RPM spec file from a PEAR package', + 'function' => 'doMakeRPM', + 'shortcut' => 'rpm', + 'options' => array( + 'spec-template' => array( + 'shortopt' => 't', + 'arg' => 'FILE', + 'doc' => 'Use FILE as RPM spec file template' + ), + 'rpm-pkgname' => array( + 'shortopt' => 'p', + 'arg' => 'FORMAT', + 'doc' => 'Use FORMAT as format string for RPM package name, %s is replaced +by the PEAR package name, defaults to "PEAR::%s".', + ), + ), + 'doc' => ' + +Creates an RPM .spec file for wrapping a PEAR package inside an RPM +package. Intended to be used from the SPECS directory, with the PEAR +package tarball in the SOURCES directory: + +$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz +Wrote RPM spec file PEAR::Net_Geo-1.0.spec +$ rpm -bb PEAR::Net_Socket-1.0.spec +... +Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm +', + ), + ); + + var $output; + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Package constructor. + * + * @access public + */ + function PEAR_Command_Package(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ _displayValidationResults() + + function _displayValidationResults($err, $warn, $strict = false) + { + foreach ($err as $e) { + $this->output .= "Error: $e\n"; + } + foreach ($warn as $w) { + $this->output .= "Warning: $w\n"; + } + $this->output .= sprintf('Validation: %d error(s), %d warning(s)'."\n", + sizeof($err), sizeof($warn)); + if ($strict && sizeof($err) > 0) { + $this->output .= "Fix these errors and try again."; + return false; + } + return true; + } + + // }}} + // {{{ doPackage() + + function doPackage($command, $options, $params) + { + $this->output = ''; + include_once 'PEAR/Packager.php'; + if (sizeof($params) < 1) { + $params[0] = "package.xml"; + } + $pkginfofile = isset($params[0]) ? $params[0] : 'package.xml'; + $packager =& new PEAR_Packager(); + $err = $warn = array(); + $dir = dirname($pkginfofile); + $compress = empty($options['nocompress']) ? true : false; + $result = $packager->package($pkginfofile, $compress); + if (PEAR::isError($result)) { + $this->ui->outputData($this->output, $command); + return $this->raiseError($result); + } + // Don't want output, only the package file name just created + if (isset($options['showname'])) { + $this->output = $result; + } + if (PEAR::isError($result)) { + $this->output .= "Package failed: ".$result->getMessage(); + } + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doPackageValidate() + + function doPackageValidate($command, $options, $params) + { + $this->output = ''; + if (sizeof($params) < 1) { + $params[0] = "package.xml"; + } + $obj = new PEAR_Common; + $info = null; + if ($fp = @fopen($params[0], "r")) { + $test = fread($fp, 5); + fclose($fp); + if ($test == "infoFromDescriptionFile($params[0]); + } + } + if (empty($info)) { + $info = $obj->infoFromTgzFile($params[0]); + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $obj->validatePackageInfo($info, $err, $warn); + $this->_displayValidationResults($err, $warn); + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doCvsTag() + + function doCvsTag($command, $options, $params) + { + $this->output = ''; + $_cmd = $command; + if (sizeof($params) < 1) { + $help = $this->getHelp($command); + return $this->raiseError("$command: missing parameter: $help[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromDescriptionFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $err = $warn = array(); + $obj->validatePackageInfo($info, $err, $warn); + if (!$this->_displayValidationResults($err, $warn, true)) { + $this->ui->outputData($this->output, $command); + break; + } + $version = $info['version']; + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $version); + $cvstag = "RELEASE_$cvsversion"; + $files = array_keys($info['filelist']); + $command = "cvs"; + if (isset($options['quiet'])) { + $command .= ' -q'; + } + if (isset($options['reallyquiet'])) { + $command .= ' -Q'; + } + $command .= ' tag'; + if (isset($options['slide'])) { + $command .= ' -F'; + } + if (isset($options['delete'])) { + $command .= ' -d'; + } + $command .= ' ' . $cvstag . ' ' . escapeshellarg($params[0]); + foreach ($files as $file) { + $command .= ' ' . escapeshellarg($file); + } + if ($this->config->get('verbose') > 1) { + $this->output .= "+ $command\n"; + } + $this->output .= "+ $command\n"; + if (empty($options['dry-run'])) { + $fp = popen($command, "r"); + while ($line = fgets($fp, 1024)) { + $this->output .= rtrim($line)."\n"; + } + pclose($fp); + } + $this->ui->outputData($this->output, $_cmd); + return true; + } + + // }}} + // {{{ doCvsDiff() + + function doCvsDiff($command, $options, $params) + { + $this->output = ''; + if (sizeof($params) < 1) { + $help = $this->getHelp($command); + return $this->raiseError("$command: missing parameter: $help[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromDescriptionFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + $files = array_keys($info['filelist']); + $cmd = "cvs"; + if (isset($options['quiet'])) { + $cmd .= ' -q'; + unset($options['quiet']); + } + if (isset($options['reallyquiet'])) { + $cmd .= ' -Q'; + unset($options['reallyquiet']); + } + if (isset($options['release'])) { + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $options['release']); + $cvstag = "RELEASE_$cvsversion"; + $options['revision'] = $cvstag; + unset($options['release']); + } + $execute = true; + if (isset($options['dry-run'])) { + $execute = false; + unset($options['dry-run']); + } + $cmd .= ' diff'; + // the rest of the options are passed right on to "cvs diff" + foreach ($options as $option => $optarg) { + $arg = @$this->commands[$command]['options'][$option]['arg']; + $short = @$this->commands[$command]['options'][$option]['shortopt']; + $cmd .= $short ? " -$short" : " --$option"; + if ($arg && $optarg) { + $cmd .= ($short ? '' : '=') . escapeshellarg($optarg); + } + } + foreach ($files as $file) { + $cmd .= ' ' . escapeshellarg($file); + } + if ($this->config->get('verbose') > 1) { + $this->output .= "+ $cmd\n"; + } + if ($execute) { + $fp = popen($cmd, "r"); + while ($line = fgets($fp, 1024)) { + $this->output .= rtrim($line)."\n"; + } + pclose($fp); + } + $this->ui->outputData($this->output, $command); + return true; + } + + // }}} + // {{{ doRunTests() + + function doRunTests($command, $options, $params) + { + include_once 'PEAR/RunTest.php'; + $log = new PEAR_Common; + $log->ui = &$this->ui; // slightly hacky, but it will work + $run = new PEAR_RunTest($log); + $tests = array(); + if (isset($options['recur'])) { + $depth = 4; + } else { + $depth = 1; + } + if (!count($params)) { + $params[] = '.'; + } + foreach ($params as $p) { + if (is_dir($p)) { + $dir = System::find(array($p, '-type', 'f', + '-maxdepth', $depth, + '-name', '*.phpt')); + $tests = array_merge($tests, $dir); + } else { + if (!@file_exists($p)) { + if (!preg_match('/\.phpt$/', $p)) { + $p .= '.phpt'; + } + $dir = System::find(array(dirname($p), '-type', 'f', + '-maxdepth', $depth, + '-name', $p)); + $tests = array_merge($tests, $dir); + } else { + $tests[] = $p; + } + } + } + $ini_settings = ''; + if (isset($options['ini'])) { + $ini_settings .= $options['ini']; + } + if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) { + $ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}"; + } + if ($ini_settings) { + $this->ui->outputData('Using INI settings: "' . $ini_settings . '"'); + } + $skipped = $passed = $failed = array(); + $this->ui->outputData('Running ' . count($tests) . ' tests', $command); + $start = time(); + if (isset($options['realtimelog'])) { + @unlink('run-tests.log'); + } + foreach ($tests as $t) { + if (isset($options['realtimelog'])) { + $fp = @fopen('run-tests.log', 'a'); + if ($fp) { + fwrite($fp, "Running test $t..."); + fclose($fp); + } + } + $result = $run->run($t, $ini_settings); + if (OS_WINDOWS) { + for($i=0;$i<2000;$i++) { + $i = $i; // delay - race conditions on windows + } + } + if (isset($options['realtimelog'])) { + $fp = @fopen('run-tests.log', 'a'); + if ($fp) { + fwrite($fp, "$result\n"); + fclose($fp); + } + } + if ($result == 'FAILED') { + $failed[] = $t; + } + if ($result == 'PASSED') { + $passed[] = $t; + } + if ($result == 'SKIPPED') { + $skipped[] = $t; + } + } + $total = date('i:s', time() - $start); + if (count($failed)) { + $output = "TOTAL TIME: $total\n"; + $output .= count($passed) . " PASSED TESTS\n"; + $output .= count($skipped) . " SKIPPED TESTS\n"; + $output .= count($failed) . " FAILED TESTS:\n"; + foreach ($failed as $failure) { + $output .= $failure . "\n"; + } + if (isset($options['realtimelog'])) { + $fp = @fopen('run-tests.log', 'a'); + } else { + $fp = @fopen('run-tests.log', 'w'); + } + if ($fp) { + fwrite($fp, $output, strlen($output)); + fclose($fp); + $this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command); + } + } elseif (@file_exists('run-tests.log') && !@is_dir('run-tests.log')) { + @unlink('run-tests.log'); + } + $this->ui->outputData('TOTAL TIME: ' . $total); + $this->ui->outputData(count($passed) . ' PASSED TESTS', $command); + $this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command); + if (count($failed)) { + $this->ui->outputData(count($failed) . ' FAILED TESTS:', $command); + foreach ($failed as $failure) { + $this->ui->outputData($failure, $command); + } + } + + return true; + } + + // }}} + // {{{ doPackageDependencies() + + function doPackageDependencies($command, $options, $params) + { + // $params[0] -> the PEAR package to list its information + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + + $obj = new PEAR_Common(); + if (PEAR::isError($info = $obj->infoFromAny($params[0]))) { + return $this->raiseError($info); + } + + if (is_array($info['release_deps'])) { + $data = array( + 'caption' => 'Dependencies for ' . $info['package'], + 'border' => true, + 'headline' => array("Type", "Name", "Relation", "Version"), + ); + + foreach ($info['release_deps'] as $d) { + + if (isset($this->_deps_rel_trans[$d['rel']])) { + $rel = $this->_deps_rel_trans[$d['rel']]; + } else { + $rel = $d['rel']; + } + + if (isset($this->_deps_type_trans[$d['type']])) { + $type = ucfirst($this->_deps_type_trans[$d['type']]); + } else { + $type = $d['type']; + } + + if (isset($d['name'])) { + $name = $d['name']; + } else { + $name = ''; + } + + if (isset($d['version'])) { + $version = $d['version']; + } else { + $version = ''; + } + + $data['data'][] = array($type, $name, $rel, $version); + } + + $this->ui->outputData($data, $command); + return true; + } + + // Fallback + $this->ui->outputData("This package does not have any dependencies.", $command); + } + + // }}} + // {{{ doSign() + + function doSign($command, $options, $params) + { + // should move most of this code into PEAR_Packager + // so it'll be easy to implement "pear package --sign" + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + if (!file_exists($params[0])) { + return $this->raiseError("file does not exist: $params[0]"); + } + $obj = new PEAR_Common; + $info = $obj->infoFromTgzFile($params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + include_once "Archive/Tar.php"; + include_once "System.php"; + $tar = new Archive_Tar($params[0]); + $tmpdir = System::mktemp('-d pearsign'); + if (!$tar->extractList('package.xml package.sig', $tmpdir)) { + return $this->raiseError("failed to extract tar file"); + } + if (file_exists("$tmpdir/package.sig")) { + return $this->raiseError("package already signed"); + } + @unlink("$tmpdir/package.sig"); + $input = $this->ui->userDialog($command, + array('GnuPG Passphrase'), + array('password')); + $gpg = popen("gpg --batch --passphrase-fd 0 --armor --detach-sign --output $tmpdir/package.sig $tmpdir/package.xml 2>/dev/null", "w"); + if (!$gpg) { + return $this->raiseError("gpg command failed"); + } + fwrite($gpg, "$input[0]\r"); + if (pclose($gpg) || !file_exists("$tmpdir/package.sig")) { + return $this->raiseError("gpg sign failed"); + } + $tar->addModify("$tmpdir/package.sig", '', $tmpdir); + return true; + } + + // }}} + // {{{ doMakeRPM() + + /* + + (cox) + + TODO: + + - Fill the rpm dependencies in the template file. + + IDEAS: + + - Instead of mapping the role to rpm vars, perhaps it's better + + to use directly the pear cmd to install the files by itself + + in %postrun so: + + pear -d php_dir=%{_libdir}/php/pear -d test_dir=.. + + */ + + function doMakeRPM($command, $options, $params) + { + if (sizeof($params) != 1) { + return $this->raiseError("bad parameter(s), try \"help $command\""); + } + if (!file_exists($params[0])) { + return $this->raiseError("file does not exist: $params[0]"); + } + include_once "Archive/Tar.php"; + include_once "PEAR/Installer.php"; + include_once "System.php"; + $tar = new Archive_Tar($params[0]); + $tmpdir = System::mktemp('-d pear2rpm'); + $instroot = System::mktemp('-d pear2rpm'); + $tmp = $this->config->get('verbose'); + $this->config->set('verbose', 0); + $installer = new PEAR_Installer($this->ui); + $info = $installer->install($params[0], + array('installroot' => $instroot, + 'nodeps' => true)); + $pkgdir = "$info[package]-$info[version]"; + $info['rpm_xml_dir'] = '/var/lib/pear'; + $this->config->set('verbose', $tmp); + if (!$tar->extractList("package.xml", $tmpdir, $pkgdir)) { + return $this->raiseError("failed to extract $params[0]"); + } + if (!file_exists("$tmpdir/package.xml")) { + return $this->raiseError("no package.xml found in $params[0]"); + } + if (isset($options['spec-template'])) { + $spec_template = $options['spec-template']; + } else { + $spec_template = $this->config->get('data_dir') . + '/PEAR/template.spec'; + } + if (isset($options['rpm-pkgname'])) { + $rpm_pkgname_format = $options['rpm-pkgname']; + } else { + $rpm_pkgname_format = "PEAR::%s"; + } + + $info['extra_headers'] = ''; + $info['doc_files'] = ''; + $info['files'] = ''; + $info['rpm_package'] = sprintf($rpm_pkgname_format, $info['package']); + $srcfiles = 0; + foreach ($info['filelist'] as $name => $attr) { + + if (!isset($attr['role'])) { + continue; + } + $name = preg_replace('![/:\\\\]!', '/', $name); + if ($attr['role'] == 'doc') { + $info['doc_files'] .= " $name"; + + // Map role to the rpm vars + } else { + + $c_prefix = '%{_libdir}/php/pear'; + + switch ($attr['role']) { + + case 'php': + + $prefix = $c_prefix; break; + + case 'ext': + + $prefix = '%{_libdir}/php'; break; // XXX good place? + + case 'src': + + $srcfiles++; + + $prefix = '%{_includedir}/php'; break; // XXX good place? + + case 'test': + + $prefix = "$c_prefix/tests/" . $info['package']; break; + + case 'data': + + $prefix = "$c_prefix/data/" . $info['package']; break; + + case 'script': + + $prefix = '%{_bindir}'; break; + + } + + $name = str_replace('\\', '/', $name); + $info['files'] .= "$prefix/$name\n"; + + } + } + if ($srcfiles > 0) { + include_once "OS/Guess.php"; + $os = new OS_Guess; + $arch = $os->getCpu(); + } else { + $arch = 'noarch'; + } + $cfg = array('master_server', 'php_dir', 'ext_dir', 'doc_dir', + 'bin_dir', 'data_dir', 'test_dir'); + foreach ($cfg as $k) { + $info[$k] = $this->config->get($k); + } + $info['arch'] = $arch; + $fp = @fopen($spec_template, "r"); + if (!$fp) { + return $this->raiseError("could not open RPM spec file template $spec_template: $php_errormsg"); + } + $spec_contents = preg_replace('/@([a-z0-9_-]+)@/e', '$info["\1"]', fread($fp, filesize($spec_template))); + fclose($fp); + $spec_file = "$info[rpm_package]-$info[version].spec"; + $wp = fopen($spec_file, "wb"); + if (!$wp) { + return $this->raiseError("could not write RPM spec file $spec_file: $php_errormsg"); + } + fwrite($wp, $spec_contents); + fclose($wp); + $this->ui->outputData("Wrote RPM spec file $spec_file", $command); + + return true; + } + + // }}} +} + +?> diff --git a/includes/PEAR/Command/Registry.php b/includes/PEAR/Command/Registry.php new file mode 100644 index 0000000..62cb4b0 --- /dev/null +++ b/includes/PEAR/Command/Registry.php @@ -0,0 +1,351 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Registry.php,v 1.36 2004/01/08 17:33:13 sniper Exp $ + +require_once 'PEAR/Command/Common.php'; +require_once 'PEAR/Registry.php'; +require_once 'PEAR/Config.php'; + +class PEAR_Command_Registry extends PEAR_Command_Common +{ + // {{{ properties + + var $commands = array( + 'list' => array( + 'summary' => 'List Installed Packages', + 'function' => 'doList', + 'shortcut' => 'l', + 'options' => array(), + 'doc' => '[package] +If invoked without parameters, this command lists the PEAR packages +installed in your php_dir ({config php_dir)). With a parameter, it +lists the files in that package. +', + ), + 'shell-test' => array( + 'summary' => 'Shell Script Test', + 'function' => 'doShellTest', + 'shortcut' => 'st', + 'options' => array(), + 'doc' => ' [[relation] version] +Tests if a package is installed in the system. Will exit(1) if it is not. + The version comparison operator. One of: + <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne + The version to compare with +'), + 'info' => array( + 'summary' => 'Display information about a package', + 'function' => 'doInfo', + 'shortcut' => 'in', + 'options' => array(), + 'doc' => ' +Displays information about a package. The package argument may be a +local package file, an URL to a package file, or the name of an +installed package.' + ) + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Registry constructor. + * + * @access public + */ + function PEAR_Command_Registry(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doList() + + function _sortinfo($a, $b) + { + return strcmp($a['package'], $b['package']); + } + + function doList($command, $options, $params) + { + $reg = new PEAR_Registry($this->config->get('php_dir')); + if (sizeof($params) == 0) { + $installed = $reg->packageInfo(); + usort($installed, array(&$this, '_sortinfo')); + $i = $j = 0; + $data = array( + 'caption' => 'Installed packages:', + 'border' => true, + 'headline' => array('Package', 'Version', 'State') + ); + foreach ($installed as $package) { + $data['data'][] = array($package['package'], + $package['version'], + @$package['release_state']); + } + if (count($installed)==0) { + $data = '(no packages installed)'; + } + $this->ui->outputData($data, $command); + } else { + if (file_exists($params[0]) && !is_dir($params[0])) { + include_once "PEAR/Common.php"; + $obj = &new PEAR_Common; + $info = $obj->infoFromAny($params[0]); + $headings = array('Package File', 'Install Path'); + $installed = false; + } else { + $info = $reg->packageInfo($params[0]); + $headings = array('Type', 'Install Path'); + $installed = true; + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + if ($info === null) { + return $this->raiseError("`$params[0]' not installed"); + } + $list = $info['filelist']; + if ($installed) { + $caption = 'Installed Files For ' . $params[0]; + } else { + $caption = 'Contents of ' . basename($params[0]); + } + $data = array( + 'caption' => $caption, + 'border' => true, + 'headline' => $headings); + foreach ($list as $file => $att) { + if ($installed) { + if (empty($att['installed_as'])) { + continue; + } + $data['data'][] = array($att['role'], $att['installed_as']); + } else { + if (isset($att['baseinstalldir'])) { + $dest = $att['baseinstalldir'] . DIRECTORY_SEPARATOR . + $file; + } else { + $dest = $file; + } + switch ($att['role']) { + case 'test': + case 'data': + if ($installed) { + break 2; + } + $dest = '-- will not be installed --'; + break; + case 'doc': + $dest = $this->config->get('doc_dir') . DIRECTORY_SEPARATOR . + $dest; + break; + case 'php': + default: + $dest = $this->config->get('php_dir') . DIRECTORY_SEPARATOR . + $dest; + } + $dest = preg_replace('!/+!', '/', $dest); + $file = preg_replace('!/+!', '/', $file); + $data['data'][] = array($file, $dest); + } + } + $this->ui->outputData($data, $command); + + + } + return true; + } + + // }}} + // {{{ doShellTest() + + function doShellTest($command, $options, $params) + { + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $reg = &new PEAR_Registry($this->config->get('php_dir')); + // "pear shell-test Foo" + if (sizeof($params) == 1) { + if (!$reg->packageExists($params[0])) { + exit(1); + } + // "pear shell-test Foo 1.0" + } elseif (sizeof($params) == 2) { + $v = $reg->packageInfo($params[0], 'version'); + if (!$v || !version_compare("$v", "{$params[1]}", "ge")) { + exit(1); + } + // "pear shell-test Foo ge 1.0" + } elseif (sizeof($params) == 3) { + $v = $reg->packageInfo($params[0], 'version'); + if (!$v || !version_compare("$v", "{$params[2]}", $params[1])) { + exit(1); + } + } else { + $this->popErrorHandling(); + $this->raiseError("$command: expects 1 to 3 parameters"); + exit(1); + } + } + + // }}} + // {{{ doInfo + + function doInfo($command, $options, $params) + { + // $params[0] The package for showing info + if (sizeof($params) != 1) { + return $this->raiseError("This command only accepts one param: ". + "the package you want information"); + } + if (@is_file($params[0])) { + $obj = &new PEAR_Common(); + $info = $obj->infoFromAny($params[0]); + } else { + $reg = &new PEAR_Registry($this->config->get('php_dir')); + $info = $reg->packageInfo($params[0]); + } + if (PEAR::isError($info)) { + return $info; + } + if (empty($info)) { + $this->raiseError("Nothing found for `$params[0]'"); + return; + } + unset($info['filelist']); + unset($info['changelog']); + $keys = array_keys($info); + $longtext = array('description', 'summary'); + foreach ($keys as $key) { + if (is_array($info[$key])) { + switch ($key) { + case 'maintainers': { + $i = 0; + $mstr = ''; + foreach ($info[$key] as $m) { + if ($i++ > 0) { + $mstr .= "\n"; + } + $mstr .= $m['name'] . " <"; + if (isset($m['email'])) { + $mstr .= $m['email']; + } else { + $mstr .= $m['handle'] . '@php.net'; + } + $mstr .= "> ($m[role])"; + } + $info[$key] = $mstr; + break; + } + case 'release_deps': { + $i = 0; + $dstr = ''; + foreach ($info[$key] as $d) { + if (isset($this->_deps_rel_trans[$d['rel']])) { + $rel = $this->_deps_rel_trans[$d['rel']]; + } else { + $rel = $d['rel']; + } + if (isset($this->_deps_type_trans[$d['type']])) { + $type = ucfirst($this->_deps_type_trans[$d['type']]); + } else { + $type = $d['type']; + } + if (isset($d['name'])) { + $name = $d['name'] . ' '; + } else { + $name = ''; + } + if (isset($d['version'])) { + $version = $d['version'] . ' '; + } else { + $version = ''; + } + $dstr .= "$type $name$rel $version\n"; + } + $info[$key] = $dstr; + break; + } + case 'provides' : { + $debug = $this->config->get('verbose'); + if ($debug < 2) { + $pstr = 'Classes: '; + } else { + $pstr = ''; + } + $i = 0; + foreach ($info[$key] as $p) { + if ($debug < 2 && $p['type'] != "class") { + continue; + } + // Only print classes when verbosity mode is < 2 + if ($debug < 2) { + if ($i++ > 0) { + $pstr .= ", "; + } + $pstr .= $p['name']; + } else { + if ($i++ > 0) { + $pstr .= "\n"; + } + $pstr .= ucfirst($p['type']) . " " . $p['name']; + if (isset($p['explicit']) && $p['explicit'] == 1) { + $pstr .= " (explicit)"; + } + } + } + $info[$key] = $pstr; + break; + } + default: { + $info[$key] = implode(", ", $info[$key]); + break; + } + } + } + if ($key == '_lastmodified') { + $hdate = date('Y-m-d', $info[$key]); + unset($info[$key]); + $info['Last Modified'] = $hdate; + } else { + $info[$key] = trim($info[$key]); + if (in_array($key, $longtext)) { + $info[$key] = preg_replace('/ +/', ' ', $info[$key]); + } + } + } + $caption = 'About ' . $info['package'] . '-' . $info['version']; + $data = array( + 'caption' => $caption, + 'border' => true); + foreach ($info as $key => $value) { + $key = ucwords(trim(str_replace('_', ' ', $key))); + $data['data'][] = array($key, $value); + } + $data['raw'] = $info; + + $this->ui->outputData($data, 'package-info'); + } + + // }}} +} + +?> diff --git a/includes/PEAR/Command/Remote.php b/includes/PEAR/Command/Remote.php new file mode 100644 index 0000000..bbd1609 --- /dev/null +++ b/includes/PEAR/Command/Remote.php @@ -0,0 +1,435 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Remote.php,v 1.39 2004/04/03 15:56:00 cellog Exp $ + +require_once 'PEAR/Command/Common.php'; +require_once 'PEAR/Common.php'; +require_once 'PEAR/Remote.php'; +require_once 'PEAR/Registry.php'; + +class PEAR_Command_Remote extends PEAR_Command_Common +{ + // {{{ command definitions + + var $commands = array( + 'remote-info' => array( + 'summary' => 'Information About Remote Packages', + 'function' => 'doRemoteInfo', + 'shortcut' => 'ri', + 'options' => array(), + 'doc' => ' +Get details on a package from the server.', + ), + 'list-upgrades' => array( + 'summary' => 'List Available Upgrades', + 'function' => 'doListUpgrades', + 'shortcut' => 'lu', + 'options' => array(), + 'doc' => ' +List releases on the server of packages you have installed where +a newer version is available with the same release state (stable etc.).' + ), + 'remote-list' => array( + 'summary' => 'List Remote Packages', + 'function' => 'doRemoteList', + 'shortcut' => 'rl', + 'options' => array(), + 'doc' => ' +Lists the packages available on the configured server along with the +latest stable release of each package.', + ), + 'search' => array( + 'summary' => 'Search remote package database', + 'function' => 'doSearch', + 'shortcut' => 'sp', + 'options' => array(), + 'doc' => ' +Lists all packages which match the search parameters (first param +is package name, second package info)', + ), + 'list-all' => array( + 'summary' => 'List All Packages', + 'function' => 'doListAll', + 'shortcut' => 'la', + 'options' => array(), + 'doc' => ' +Lists the packages available on the configured server along with the +latest stable release of each package.', + ), + 'download' => array( + 'summary' => 'Download Package', + 'function' => 'doDownload', + 'shortcut' => 'd', + 'options' => array( + 'nocompress' => array( + 'shortopt' => 'Z', + 'doc' => 'download an uncompressed (.tar) file', + ), + ), + 'doc' => '{package|package-version} +Download a package tarball. The file will be named as suggested by the +server, for example if you download the DB package and the latest stable +version of DB is 1.2, the downloaded file will be DB-1.2.tgz.', + ), + 'clear-cache' => array( + 'summary' => 'Clear XML-RPC Cache', + 'function' => 'doClearCache', + 'shortcut' => 'cc', + 'options' => array(), + 'doc' => ' +Clear the XML-RPC cache. See also the cache_ttl configuration +parameter. +', + ), + ); + + // }}} + // {{{ constructor + + /** + * PEAR_Command_Remote constructor. + * + * @access public + */ + function PEAR_Command_Remote(&$ui, &$config) + { + parent::PEAR_Command_Common($ui, $config); + } + + // }}} + + // {{{ doRemoteInfo() + + function doRemoteInfo($command, $options, $params) + { + if (sizeof($params) != 1) { + return $this->raiseError("$command expects one param: the remote package name"); + } + $r = new PEAR_Remote($this->config); + $info = $r->call('package.info', $params[0]); + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + + $reg = new PEAR_Registry($this->config->get('php_dir')); + $installed = $reg->packageInfo($info['name']); + $info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; + + $this->ui->outputData($info, $command); + + return true; + } + + // }}} + // {{{ doRemoteList() + + function doRemoteList($command, $options, $params) + { + $r = new PEAR_Remote($this->config); + $list_options = false; + if ($this->config->get('preferred_state') == 'stable') + $list_options = true; + $available = $r->call('package.listAll', $list_options); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + $i = $j = 0; + $data = array( + 'caption' => 'Available packages:', + 'border' => true, + 'headline' => array('Package', 'Version'), + ); + foreach ($available as $name => $info) { + $data['data'][] = array($name, isset($info['stable']) ? $info['stable'] : '-n/a-'); + } + if (count($available)==0) { + $data = '(no packages installed yet)'; + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doListAll() + + function doListAll($command, $options, $params) + { + $r = new PEAR_Remote($this->config); + $reg = new PEAR_Registry($this->config->get('php_dir')); + $list_options = false; + if ($this->config->get('preferred_state') == 'stable') + $list_options = true; + $available = $r->call('package.listAll', $list_options); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + if (!is_array($available)) { + return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "'.$available.'")'); + } + $data = array( + 'caption' => 'All packages:', + 'border' => true, + 'headline' => array('Package', 'Latest', 'Local'), + ); + $local_pkgs = $reg->listPackages(); + + foreach ($available as $name => $info) { + $installed = $reg->packageInfo($name); + $desc = $info['summary']; + if (isset($params[$name])) + $desc .= "\n\n".$info['description']; + + if (isset($options['mode'])) + { + if ($options['mode'] == 'installed' && !isset($installed['version'])) + continue; + if ($options['mode'] == 'notinstalled' && isset($installed['version'])) + continue; + if ($options['mode'] == 'upgrades' + && (!isset($installed['version']) || $installed['version'] == $info['stable'])) + { + continue; + } + } + $pos = array_search(strtolower($name), $local_pkgs); + if ($pos !== false) { + unset($local_pkgs[$pos]); + } + + $data['data'][$info['category']][] = array( + $name, + @$info['stable'], + @$installed['version'], + @$desc, + @$info['deps'], + ); + } + + foreach ($local_pkgs as $name) { + $info = $reg->packageInfo($name); + $data['data']['Local'][] = array( + $info['package'], + '', + $info['version'], + $info['summary'], + @$info['release_deps'] + ); + } + + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doSearch() + + function doSearch($command, $options, $params) + { + if ((!isset($params[0]) || empty($params[0])) + && (!isset($params[1]) || empty($params[1]))) + { + return $this->raiseError('no valid search string supplied'); + }; + + $r = new PEAR_Remote($this->config); + $reg = new PEAR_Registry($this->config->get('php_dir')); + $available = $r->call('package.listAll', true, false); + if (PEAR::isError($available)) { + return $this->raiseError($available); + } + $data = array( + 'caption' => 'Matched packages:', + 'border' => true, + 'headline' => array('Package', 'Stable/(Latest)', 'Local'), + ); + + foreach ($available as $name => $info) { + $found = (!empty($params[0]) && stristr($name, $params[0]) !== false); + if (!$found && !(isset($params[1]) && !empty($params[1]) + && (stristr($info['summary'], $params[1]) !== false + || stristr($info['description'], $params[1]) !== false))) + { + continue; + }; + + $installed = $reg->packageInfo($name); + $desc = $info['summary']; + if (isset($params[$name])) + $desc .= "\n\n".$info['description']; + + $unstable = ''; + if ($info['unstable']) { + $unstable = '/(' . $info['unstable'] . $info['state'] . ')'; + } + if (!isset($info['stable']) || !$info['stable']) { + $info['stable'] = 'none'; + } + $data['data'][$info['category']][] = array( + $name, + $info['stable'] . $unstable, + $installed['version'], + $desc, + ); + } + if (!isset($data['data'])) { + return $this->raiseError('no packages found'); + } + $this->ui->outputData($data, $command); + return true; + } + + // }}} + // {{{ doDownload() + + function doDownload($command, $options, $params) + { + //$params[0] -> The package to download + if (count($params) != 1) { + return PEAR::raiseError("download expects one argument: the package to download"); + } + $server = $this->config->get('master_server'); + if (!ereg('^http://', $params[0])) { + $getoption = isset($options['nocompress'])&&$options['nocompress']==1?'?uncompress=on':''; + $pkgfile = "http://$server/get/$params[0]".$getoption; + } else { + $pkgfile = $params[0]; + } + $this->bytes_downloaded = 0; + $saved = PEAR_Common::downloadHttp($pkgfile, $this->ui, '.', + array(&$this, 'downloadCallback')); + if (PEAR::isError($saved)) { + return $this->raiseError($saved); + } + $fname = basename($saved); + $this->ui->outputData("File $fname downloaded ($this->bytes_downloaded bytes)", $command); + return true; + } + + function downloadCallback($msg, $params = null) + { + if ($msg == 'done') { + $this->bytes_downloaded = $params; + } + } + + // }}} + // {{{ doListUpgrades() + + function doListUpgrades($command, $options, $params) + { + include_once "PEAR/Registry.php"; + $remote = new PEAR_Remote($this->config); + if (empty($params[0])) { + $state = $this->config->get('preferred_state'); + } else { + $state = $params[0]; + } + $caption = 'Available Upgrades'; + if (empty($state) || $state == 'any') { + $latest = $remote->call("package.listLatestReleases"); + } else { + $latest = $remote->call("package.listLatestReleases", $state); + $caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')'; + } + $caption .= ':'; + if (PEAR::isError($latest)) { + return $latest; + } + $reg = new PEAR_Registry($this->config->get('php_dir')); + $inst = array_flip($reg->listPackages()); + $data = array( + 'caption' => $caption, + 'border' => 1, + 'headline' => array('Package', 'Local', 'Remote', 'Size'), + ); + foreach ((array)$latest as $pkg => $info) { + $package = strtolower($pkg); + if (!isset($inst[$package])) { + // skip packages we don't have installed + continue; + } + extract($info); + $pkginfo = $reg->packageInfo($package); + $inst_version = $pkginfo['version']; + $inst_state = $pkginfo['release_state']; + if (version_compare("$version", "$inst_version", "le")) { + // installed version is up-to-date + continue; + } + if ($filesize >= 20480) { + $filesize += 1024 - ($filesize % 1024); + $fs = sprintf("%dkB", $filesize / 1024); + } elseif ($filesize > 0) { + $filesize += 103 - ($filesize % 103); + $fs = sprintf("%.1fkB", $filesize / 1024.0); + } else { + $fs = " -"; // XXX center instead + } + $data['data'][] = array($pkg, "$inst_version ($inst_state)", "$version ($state)", $fs); + } + if (empty($data['data'])) { + $this->ui->outputData('No upgrades available'); + } else { + $this->ui->outputData($data, $command); + } + return true; + } + + // }}} + // {{{ doClearCache() + + function doClearCache($command, $options, $params) + { + $cache_dir = $this->config->get('cache_dir'); + $verbose = $this->config->get('verbose'); + $output = ''; + if (!($dp = @opendir($cache_dir))) { + return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); + } + if ($verbose >= 1) { + $output .= "reading directory $cache_dir\n"; + } + $num = 0; + while ($ent = readdir($dp)) { + if (preg_match('/^xmlrpc_cache_[a-z0-9]{32}$/', $ent)) { + $path = $cache_dir . DIRECTORY_SEPARATOR . $ent; + $ok = @unlink($path); + if ($ok) { + if ($verbose >= 2) { + $output .= "deleted $path\n"; + } + $num++; + } elseif ($verbose >= 1) { + $output .= "failed to delete $path\n"; + } + } + } + closedir($dp); + if ($verbose >= 1) { + $output .= "$num cache entries cleared\n"; + } + $this->ui->outputData(rtrim($output), $command); + return $num; + } + + // }}} +} + +?> diff --git a/includes/PEAR/Common.php b/includes/PEAR/Common.php new file mode 100644 index 0000000..fba53a3 --- /dev/null +++ b/includes/PEAR/Common.php @@ -0,0 +1,2094 @@ + | +// | Tomas V.V.Cox | +// +----------------------------------------------------------------------+ +// +// $Id: Common.php,v 1.126.2.2 2004/12/27 07:04:19 cellog Exp $ + +require_once 'PEAR.php'; +require_once 'Archive/Tar.php'; +require_once 'System.php'; +require_once 'PEAR/Config.php'; + +// {{{ constants and globals + +/** + * PEAR_Common error when an invalid PHP file is passed to PEAR_Common::analyzeSourceCode() + */ +define('PEAR_COMMON_ERROR_INVALIDPHP', 1); +define('_PEAR_COMMON_PACKAGE_NAME_PREG', '[A-Za-z][a-zA-Z0-9_]+'); +define('PEAR_COMMON_PACKAGE_NAME_PREG', '/^' . _PEAR_COMMON_PACKAGE_NAME_PREG . '$/'); + +// this should allow: 1, 1.0, 1.0RC1, 1.0dev, 1.0dev123234234234, 1.0a1, 1.0b1, 1.0pl1 +define('_PEAR_COMMON_PACKAGE_VERSION_PREG', '\d+(?:\.\d+)*(?:[a-zA-Z]+\d*)?'); +define('PEAR_COMMON_PACKAGE_VERSION_PREG', '/^' . _PEAR_COMMON_PACKAGE_VERSION_PREG . '$/i'); + +// XXX far from perfect :-) +define('PEAR_COMMON_PACKAGE_DOWNLOAD_PREG', '/^(' . _PEAR_COMMON_PACKAGE_NAME_PREG . ')(-([.0-9a-zA-Z]+))?$/'); + +/** + * List of temporary files and directories registered by + * PEAR_Common::addTempFile(). + * @var array + */ +$GLOBALS['_PEAR_Common_tempfiles'] = array(); + +/** + * Valid maintainer roles + * @var array + */ +$GLOBALS['_PEAR_Common_maintainer_roles'] = array('lead','developer','contributor','helper'); + +/** + * Valid release states + * @var array + */ +$GLOBALS['_PEAR_Common_release_states'] = array('alpha','beta','stable','snapshot','devel'); + +/** + * Valid dependency types + * @var array + */ +$GLOBALS['_PEAR_Common_dependency_types'] = array('pkg','ext','php','prog','ldlib','rtlib','os','websrv','sapi'); + +/** + * Valid dependency relations + * @var array + */ +$GLOBALS['_PEAR_Common_dependency_relations'] = array('has','eq','lt','le','gt','ge','not', 'ne'); + +/** + * Valid file roles + * @var array + */ +$GLOBALS['_PEAR_Common_file_roles'] = array('php','ext','test','doc','data','src','script'); + +/** + * Valid replacement types + * @var array + */ +$GLOBALS['_PEAR_Common_replacement_types'] = array('php-const', 'pear-config', 'package-info'); + +/** + * Valid "provide" types + * @var array + */ +$GLOBALS['_PEAR_Common_provide_types'] = array('ext', 'prog', 'class', 'function', 'feature', 'api'); + +/** + * Valid "provide" types + * @var array + */ +$GLOBALS['_PEAR_Common_script_phases'] = array('pre-install', 'post-install', 'pre-uninstall', 'post-uninstall', 'pre-build', 'post-build', 'pre-configure', 'post-configure', 'pre-setup', 'post-setup'); + +// }}} + +/** + * Class providing common functionality for PEAR administration classes. + * @deprecated This class will disappear, and its components will be spread + * into smaller classes, like the AT&T breakup + */ +class PEAR_Common extends PEAR +{ + // {{{ properties + + /** stack of elements, gives some sort of XML context */ + var $element_stack = array(); + + /** name of currently parsed XML element */ + var $current_element; + + /** array of attributes of the currently parsed XML element */ + var $current_attributes = array(); + + /** assoc with information about a package */ + var $pkginfo = array(); + + /** + * User Interface object (PEAR_Frontend_* class). If null, + * the log() method uses print. + * @var object + */ + var $ui = null; + + /** + * Configuration object (PEAR_Config). + * @var object + */ + var $config = null; + + var $current_path = null; + + /** + * PEAR_SourceAnalyzer instance + * @var object + */ + var $source_analyzer = null; + /** + * Flag variable used to mark a valid package file + * @var boolean + * @access private + */ + var $_validPackageFile; + + // }}} + + // {{{ constructor + + /** + * PEAR_Common constructor + * + * @access public + */ + function PEAR_Common() + { + parent::PEAR(); + $this->config = &PEAR_Config::singleton(); + $this->debug = $this->config->get('verbose'); + } + + // }}} + // {{{ destructor + + /** + * PEAR_Common destructor + * + * @access private + */ + function _PEAR_Common() + { + // doesn't work due to bug #14744 + //$tempfiles = $this->_tempfiles; + $tempfiles =& $GLOBALS['_PEAR_Common_tempfiles']; + while ($file = array_shift($tempfiles)) { + if (@is_dir($file)) { + System::rm(array('-rf', $file)); + } elseif (file_exists($file)) { + unlink($file); + } + } + } + + // }}} + // {{{ addTempFile() + + /** + * Register a temporary file or directory. When the destructor is + * executed, all registered temporary files and directories are + * removed. + * + * @param string $file name of file or directory + * + * @return void + * + * @access public + */ + function addTempFile($file) + { + $GLOBALS['_PEAR_Common_tempfiles'][] = $file; + } + + // }}} + // {{{ mkDirHier() + + /** + * Wrapper to System::mkDir(), creates a directory as well as + * any necessary parent directories. + * + * @param string $dir directory name + * + * @return bool TRUE on success, or a PEAR error + * + * @access public + */ + function mkDirHier($dir) + { + $this->log(2, "+ create dir $dir"); + return System::mkDir(array('-p', $dir)); + } + + // }}} + // {{{ log() + + /** + * Logging method. + * + * @param int $level log level (0 is quiet, higher is noisier) + * @param string $msg message to write to the log + * + * @return void + * + * @access public + */ + function log($level, $msg, $append_crlf = true) + { + if ($this->debug >= $level) { + if (is_object($this->ui)) { + $this->ui->log($msg, $append_crlf); + } else { + print "$msg\n"; + } + } + } + + // }}} + // {{{ mkTempDir() + + /** + * Create and register a temporary directory. + * + * @param string $tmpdir (optional) Directory to use as tmpdir. + * Will use system defaults (for example + * /tmp or c:\windows\temp) if not specified + * + * @return string name of created directory + * + * @access public + */ + function mkTempDir($tmpdir = '') + { + if ($tmpdir) { + $topt = array('-t', $tmpdir); + } else { + $topt = array(); + } + $topt = array_merge($topt, array('-d', 'pear')); + if (!$tmpdir = System::mktemp($topt)) { + return false; + } + $this->addTempFile($tmpdir); + return $tmpdir; + } + + // }}} + // {{{ setFrontendObject() + + /** + * Set object that represents the frontend to be used. + * + * @param object Reference of the frontend object + * @return void + * @access public + */ + function setFrontendObject(&$ui) + { + $this->ui = &$ui; + } + + // }}} + + // {{{ _unIndent() + + /** + * Unindent given string (?) + * + * @param string $str The string that has to be unindented. + * @return string + * @access private + */ + function _unIndent($str) + { + // remove leading newlines + $str = preg_replace('/^[\r\n]+/', '', $str); + // find whitespace at the beginning of the first line + $indent_len = strspn($str, " \t"); + $indent = substr($str, 0, $indent_len); + $data = ''; + // remove the same amount of whitespace from following lines + foreach (explode("\n", $str) as $line) { + if (substr($line, 0, $indent_len) == $indent) { + $data .= substr($line, $indent_len) . "\n"; + } + } + return $data; + } + + // }}} + // {{{ _element_start() + + /** + * XML parser callback for starting elements. Used while package + * format version is not yet known. + * + * @param resource $xp XML parser resource + * @param string $name name of starting element + * @param array $attribs element attributes, name => value + * + * @return void + * + * @access private + */ + function _element_start($xp, $name, $attribs) + { + array_push($this->element_stack, $name); + $this->current_element = $name; + $spos = sizeof($this->element_stack) - 2; + $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; + $this->current_attributes = $attribs; + switch ($name) { + case 'package': { + $this->_validPackageFile = true; + if (isset($attribs['version'])) { + $vs = preg_replace('/[^0-9a-z]/', '_', $attribs['version']); + } else { + $vs = '1_0'; + } + $elem_start = '_element_start_'. $vs; + $elem_end = '_element_end_'. $vs; + $cdata = '_pkginfo_cdata_'. $vs; + if (!method_exists($this, $elem_start) || + !method_exists($this, $elem_end) || + !method_exists($this, $cdata)) { + $this->raiseError("No handlers for package.xml version $attribs[version]"); + return; + } + xml_set_element_handler($xp, $elem_start, $elem_end); + xml_set_character_data_handler($xp, $cdata); + break; + } + } + } + + // }}} + // {{{ _element_end() + + /** + * XML parser callback for ending elements. Used while package + * format version is not yet known. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_end($xp, $name) + { + } + + // }}} + + // Support for package DTD v1.0: + // {{{ _element_start_1_0() + + /** + * XML parser callback for ending elements. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_start_1_0($xp, $name, $attribs) + { + array_push($this->element_stack, $name); + $this->current_element = $name; + $spos = sizeof($this->element_stack) - 2; + $this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : ''; + $this->current_attributes = $attribs; + $this->cdata = ''; + switch ($name) { + case 'dir': + if ($this->in_changelog) { + break; + } + if ($attribs['name'] != '/') { + $this->dir_names[] = $attribs['name']; + } + if (isset($attribs['baseinstalldir'])) { + $this->dir_install = $attribs['baseinstalldir']; + } + if (isset($attribs['role'])) { + $this->dir_role = $attribs['role']; + } + break; + case 'file': + if ($this->in_changelog) { + break; + } + if (isset($attribs['name'])) { + $path = ''; + if (count($this->dir_names)) { + foreach ($this->dir_names as $dir) { + $path .= $dir . DIRECTORY_SEPARATOR; + } + } + $path .= $attribs['name']; + unset($attribs['name']); + $this->current_path = $path; + $this->filelist[$path] = $attribs; + // Set the baseinstalldir only if the file don't have this attrib + if (!isset($this->filelist[$path]['baseinstalldir']) && + isset($this->dir_install)) + { + $this->filelist[$path]['baseinstalldir'] = $this->dir_install; + } + // Set the Role + if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { + $this->filelist[$path]['role'] = $this->dir_role; + } + } + break; + case 'replace': + if (!$this->in_changelog) { + $this->filelist[$this->current_path]['replacements'][] = $attribs; + } + break; + case 'maintainers': + $this->pkginfo['maintainers'] = array(); + $this->m_i = 0; // maintainers array index + break; + case 'maintainer': + // compatibility check + if (!isset($this->pkginfo['maintainers'])) { + $this->pkginfo['maintainers'] = array(); + $this->m_i = 0; + } + $this->pkginfo['maintainers'][$this->m_i] = array(); + $this->current_maintainer =& $this->pkginfo['maintainers'][$this->m_i]; + break; + case 'changelog': + $this->pkginfo['changelog'] = array(); + $this->c_i = 0; // changelog array index + $this->in_changelog = true; + break; + case 'release': + if ($this->in_changelog) { + $this->pkginfo['changelog'][$this->c_i] = array(); + $this->current_release = &$this->pkginfo['changelog'][$this->c_i]; + } else { + $this->current_release = &$this->pkginfo; + } + break; + case 'deps': + if (!$this->in_changelog) { + $this->pkginfo['release_deps'] = array(); + } + break; + case 'dep': + // dependencies array index + if (!$this->in_changelog) { + $this->d_i++; + $this->pkginfo['release_deps'][$this->d_i] = $attribs; + } + break; + case 'configureoptions': + if (!$this->in_changelog) { + $this->pkginfo['configure_options'] = array(); + } + break; + case 'configureoption': + if (!$this->in_changelog) { + $this->pkginfo['configure_options'][] = $attribs; + } + break; + case 'provides': + if (empty($attribs['type']) || empty($attribs['name'])) { + break; + } + $attribs['explicit'] = true; + $this->pkginfo['provides']["$attribs[type];$attribs[name]"] = $attribs; + break; + } + } + + // }}} + // {{{ _element_end_1_0() + + /** + * XML parser callback for ending elements. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name name of ending element + * + * @return void + * + * @access private + */ + function _element_end_1_0($xp, $name) + { + $data = trim($this->cdata); + switch ($name) { + case 'name': + switch ($this->prev_element) { + case 'package': + // XXX should we check the package name here? + $this->pkginfo['package'] = ereg_replace('[^a-zA-Z0-9._]', '_', $data); + break; + case 'maintainer': + $this->current_maintainer['name'] = $data; + break; + } + break; + case 'summary': + $this->pkginfo['summary'] = $data; + break; + case 'description': + $data = $this->_unIndent($this->cdata); + $this->pkginfo['description'] = $data; + break; + case 'user': + $this->current_maintainer['handle'] = $data; + break; + case 'email': + $this->current_maintainer['email'] = $data; + break; + case 'role': + $this->current_maintainer['role'] = $data; + break; + case 'version': + $data = ereg_replace ('[^a-zA-Z0-9._\-]', '_', $data); + if ($this->in_changelog) { + $this->current_release['version'] = $data; + } else { + $this->pkginfo['version'] = $data; + } + break; + case 'date': + if ($this->in_changelog) { + $this->current_release['release_date'] = $data; + } else { + $this->pkginfo['release_date'] = $data; + } + break; + case 'notes': + // try to "de-indent" release notes in case someone + // has been over-indenting their xml ;-) + $data = $this->_unIndent($this->cdata); + if ($this->in_changelog) { + $this->current_release['release_notes'] = $data; + } else { + $this->pkginfo['release_notes'] = $data; + } + break; + case 'warnings': + if ($this->in_changelog) { + $this->current_release['release_warnings'] = $data; + } else { + $this->pkginfo['release_warnings'] = $data; + } + break; + case 'state': + if ($this->in_changelog) { + $this->current_release['release_state'] = $data; + } else { + $this->pkginfo['release_state'] = $data; + } + break; + case 'license': + if ($this->in_changelog) { + $this->current_release['release_license'] = $data; + } else { + $this->pkginfo['release_license'] = $data; + } + break; + case 'dep': + if ($data && !$this->in_changelog) { + $this->pkginfo['release_deps'][$this->d_i]['name'] = $data; + } + break; + case 'dir': + if ($this->in_changelog) { + break; + } + array_pop($this->dir_names); + break; + case 'file': + if ($this->in_changelog) { + break; + } + if ($data) { + $path = ''; + if (count($this->dir_names)) { + foreach ($this->dir_names as $dir) { + $path .= $dir . DIRECTORY_SEPARATOR; + } + } + $path .= $data; + $this->filelist[$path] = $this->current_attributes; + // Set the baseinstalldir only if the file don't have this attrib + if (!isset($this->filelist[$path]['baseinstalldir']) && + isset($this->dir_install)) + { + $this->filelist[$path]['baseinstalldir'] = $this->dir_install; + } + // Set the Role + if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) { + $this->filelist[$path]['role'] = $this->dir_role; + } + } + break; + case 'maintainer': + if (empty($this->pkginfo['maintainers'][$this->m_i]['role'])) { + $this->pkginfo['maintainers'][$this->m_i]['role'] = 'lead'; + } + $this->m_i++; + break; + case 'release': + if ($this->in_changelog) { + $this->c_i++; + } + break; + case 'changelog': + $this->in_changelog = false; + break; + } + array_pop($this->element_stack); + $spos = sizeof($this->element_stack) - 1; + $this->current_element = ($spos > 0) ? $this->element_stack[$spos] : ''; + $this->cdata = ''; + } + + // }}} + // {{{ _pkginfo_cdata_1_0() + + /** + * XML parser callback for character data. Used for version 1.0 + * packages. + * + * @param resource $xp XML parser resource + * @param string $name character data + * + * @return void + * + * @access private + */ + function _pkginfo_cdata_1_0($xp, $data) + { + if (isset($this->cdata)) { + $this->cdata .= $data; + } + } + + // }}} + + // {{{ infoFromTgzFile() + + /** + * Returns information about a package file. Expects the name of + * a gzipped tar file as input. + * + * @param string $file name of .tgz file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromTgzFile($file) + { + if (!@is_file($file)) { + return $this->raiseError("could not open file \"$file\""); + } + $tar = new Archive_Tar($file); + if ($this->debug <= 1) { + $tar->pushErrorHandling(PEAR_ERROR_RETURN); + } + $content = $tar->listContent(); + if ($this->debug <= 1) { + $tar->popErrorHandling(); + } + if (!is_array($content)) { + $file = realpath($file); + return $this->raiseError("Could not get contents of package \"$file\"". + '. Invalid tgz file.'); + } + $xml = null; + foreach ($content as $file) { + $name = $file['filename']; + if ($name == 'package.xml') { + $xml = $name; + break; + } elseif (ereg('package.xml$', $name, $match)) { + $xml = $match[0]; + break; + } + } + $tmpdir = System::mkTemp(array('-d', 'pear')); + $this->addTempFile($tmpdir); + if (!$xml || !$tar->extractList(array($xml), $tmpdir)) { + return $this->raiseError('could not extract the package.xml file'); + } + return $this->infoFromDescriptionFile("$tmpdir/$xml"); + } + + // }}} + // {{{ infoFromDescriptionFile() + + /** + * Returns information about a package file. Expects the name of + * a package xml file as input. + * + * @param string $descfile name of package xml file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromDescriptionFile($descfile) + { + if (!@is_file($descfile) || !is_readable($descfile) || + (!$fp = @fopen($descfile, 'r'))) { + return $this->raiseError("Unable to open $descfile"); + } + + // read the whole thing so we only get one cdata callback + // for each block of cdata + $data = fread($fp, filesize($descfile)); + return $this->infoFromString($data); + } + + // }}} + // {{{ infoFromString() + + /** + * Returns information about a package file. Expects the contents + * of a package xml file as input. + * + * @param string $data name of package xml file + * + * @return array array with package information + * + * @access public + * + */ + function infoFromString($data) + { + require_once('PEAR/Dependency.php'); + if (PEAR_Dependency::checkExtension($error, 'xml')) { + return $this->raiseError($error); + } + $xp = @xml_parser_create(); + if (!$xp) { + return $this->raiseError('Unable to create XML parser'); + } + xml_set_object($xp, $this); + xml_set_element_handler($xp, '_element_start', '_element_end'); + xml_set_character_data_handler($xp, '_pkginfo_cdata'); + xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); + + $this->element_stack = array(); + $this->pkginfo = array('provides' => array()); + $this->current_element = false; + unset($this->dir_install); + $this->pkginfo['filelist'] = array(); + $this->filelist =& $this->pkginfo['filelist']; + $this->dir_names = array(); + $this->in_changelog = false; + $this->d_i = 0; + $this->cdata = ''; + $this->_validPackageFile = false; + + if (!xml_parse($xp, $data, 1)) { + $code = xml_get_error_code($xp); + $msg = sprintf("XML error: %s at line %d", + xml_error_string($code), + xml_get_current_line_number($xp)); + xml_parser_free($xp); + return $this->raiseError($msg, $code); + } + + xml_parser_free($xp); + + if (!$this->_validPackageFile) { + return $this->raiseError('Invalid Package File, no tag'); + } + foreach ($this->pkginfo as $k => $v) { + if (!is_array($v)) { + $this->pkginfo[$k] = trim($v); + } + } + return $this->pkginfo; + } + // }}} + // {{{ infoFromAny() + + /** + * Returns package information from different sources + * + * This method is able to extract information about a package + * from a .tgz archive or from a XML package definition file. + * + * @access public + * @param string Filename of the source ('package.xml', '.tgz') + * @return string + */ + function infoFromAny($info) + { + if (is_string($info) && file_exists($info)) { + $tmp = substr($info, -4); + if ($tmp == '.xml') { + $info = $this->infoFromDescriptionFile($info); + } elseif ($tmp == '.tar' || $tmp == '.tgz') { + $info = $this->infoFromTgzFile($info); + } else { + $fp = fopen($info, "r"); + $test = fread($fp, 5); + fclose($fp); + if ($test == "infoFromDescriptionFile($info); + } else { + $info = $this->infoFromTgzFile($info); + } + } + if (PEAR::isError($info)) { + return $this->raiseError($info); + } + } + return $info; + } + + // }}} + // {{{ xmlFromInfo() + + /** + * Return an XML document based on the package info (as returned + * by the PEAR_Common::infoFrom* methods). + * + * @param array $pkginfo package info + * + * @return string XML data + * + * @access public + */ + function xmlFromInfo($pkginfo) + { + static $maint_map = array( + "handle" => "user", + "name" => "name", + "email" => "email", + "role" => "role", + ); + $ret = "\n"; + $ret .= "\n"; + $ret .= " + $pkginfo[package] + ".htmlspecialchars($pkginfo['summary'])." + ".htmlspecialchars($pkginfo['description'])." + +"; + foreach ($pkginfo['maintainers'] as $maint) { + $ret .= " \n"; + foreach ($maint_map as $idx => $elm) { + $ret .= " <$elm>"; + $ret .= htmlspecialchars($maint[$idx]); + $ret .= "\n"; + } + $ret .= " \n"; + } + $ret .= " \n"; + $ret .= $this->_makeReleaseXml($pkginfo); + if (@sizeof($pkginfo['changelog']) > 0) { + $ret .= " \n"; + foreach ($pkginfo['changelog'] as $oldrelease) { + $ret .= $this->_makeReleaseXml($oldrelease, true); + } + $ret .= " \n"; + } + $ret .= "\n"; + return $ret; + } + + // }}} + // {{{ _makeReleaseXml() + + /** + * Generate part of an XML description with release information. + * + * @param array $pkginfo array with release information + * @param bool $changelog whether the result will be in a changelog element + * + * @return string XML data + * + * @access private + */ + function _makeReleaseXml($pkginfo, $changelog = false) + { + // XXX QUOTE ENTITIES IN PCDATA, OR EMBED IN CDATA BLOCKS!! + $indent = $changelog ? " " : ""; + $ret = "$indent \n"; + if (!empty($pkginfo['version'])) { + $ret .= "$indent $pkginfo[version]\n"; + } + if (!empty($pkginfo['release_date'])) { + $ret .= "$indent $pkginfo[release_date]\n"; + } + if (!empty($pkginfo['release_license'])) { + $ret .= "$indent $pkginfo[release_license]\n"; + } + if (!empty($pkginfo['release_state'])) { + $ret .= "$indent $pkginfo[release_state]\n"; + } + if (!empty($pkginfo['release_notes'])) { + $ret .= "$indent ".htmlspecialchars($pkginfo['release_notes'])."\n"; + } + if (!empty($pkginfo['release_warnings'])) { + $ret .= "$indent ".htmlspecialchars($pkginfo['release_warnings'])."\n"; + } + if (isset($pkginfo['release_deps']) && sizeof($pkginfo['release_deps']) > 0) { + $ret .= "$indent \n"; + foreach ($pkginfo['release_deps'] as $dep) { + $ret .= "$indent $what) { + $ret .= "$indent $fa) { + @$ret .= "$indent $v) { + $ret .= " $k=\"" . htmlspecialchars($v) .'"'; + } + $ret .= "/>\n"; + } + @$ret .= "$indent \n"; + } + } + $ret .= "$indent \n"; + } + $ret .= "$indent \n"; + return $ret; + } + + // }}} + // {{{ validatePackageInfo() + + /** + * Validate XML package definition file. + * + * @param string $info Filename of the package archive or of the + * package definition file + * @param array $errors Array that will contain the errors + * @param array $warnings Array that will contain the warnings + * @param string $dir_prefix (optional) directory where source files + * may be found, or empty if they are not available + * @access public + * @return boolean + */ + function validatePackageInfo($info, &$errors, &$warnings, $dir_prefix = '') + { + if (PEAR::isError($info = $this->infoFromAny($info))) { + return $this->raiseError($info); + } + if (!is_array($info)) { + return false; + } + + $errors = array(); + $warnings = array(); + if (!isset($info['package'])) { + $errors[] = 'missing package name'; + } elseif (!$this->validPackageName($info['package'])) { + $errors[] = 'invalid package name'; + } + $this->_packageName = $pn = $info['package']; + + if (empty($info['summary'])) { + $errors[] = 'missing summary'; + } elseif (strpos(trim($info['summary']), "\n") !== false) { + $warnings[] = 'summary should be on a single line'; + } + if (empty($info['description'])) { + $errors[] = 'missing description'; + } + if (empty($info['release_license'])) { + $errors[] = 'missing license'; + } + if (!isset($info['version'])) { + $errors[] = 'missing version'; + } elseif (!$this->validPackageVersion($info['version'])) { + $errors[] = 'invalid package release version'; + } + if (empty($info['release_state'])) { + $errors[] = 'missing release state'; + } elseif (!in_array($info['release_state'], PEAR_Common::getReleaseStates())) { + $errors[] = "invalid release state `$info[release_state]', should be one of: " + . implode(' ', PEAR_Common::getReleaseStates()); + } + if (empty($info['release_date'])) { + $errors[] = 'missing release date'; + } elseif (!preg_match('/^\d{4}-\d\d-\d\d$/', $info['release_date'])) { + $errors[] = "invalid release date `$info[release_date]', format is YYYY-MM-DD"; + } + if (empty($info['release_notes'])) { + $errors[] = "missing release notes"; + } + if (empty($info['maintainers'])) { + $errors[] = 'no maintainer(s)'; + } else { + $i = 1; + foreach ($info['maintainers'] as $m) { + if (empty($m['handle'])) { + $errors[] = "maintainer $i: missing handle"; + } + if (empty($m['role'])) { + $errors[] = "maintainer $i: missing role"; + } elseif (!in_array($m['role'], PEAR_Common::getUserRoles())) { + $errors[] = "maintainer $i: invalid role `$m[role]', should be one of: " + . implode(' ', PEAR_Common::getUserRoles()); + } + if (empty($m['name'])) { + $errors[] = "maintainer $i: missing name"; + } + if (empty($m['email'])) { + $errors[] = "maintainer $i: missing email"; + } + $i++; + } + } + if (!empty($info['release_deps'])) { + $i = 1; + foreach ($info['release_deps'] as $d) { + if (empty($d['type'])) { + $errors[] = "dependency $i: missing type"; + } elseif (!in_array($d['type'], PEAR_Common::getDependencyTypes())) { + $errors[] = "dependency $i: invalid type '$d[type]', should be one of: " . + implode(' ', PEAR_Common::getDependencyTypes()); + } + if (empty($d['rel'])) { + $errors[] = "dependency $i: missing relation"; + } elseif (!in_array($d['rel'], PEAR_Common::getDependencyRelations())) { + $errors[] = "dependency $i: invalid relation '$d[rel]', should be one of: " + . implode(' ', PEAR_Common::getDependencyRelations()); + } + if (!empty($d['optional'])) { + if (!in_array($d['optional'], array('yes', 'no'))) { + $errors[] = "dependency $i: invalid relation optional attribute '$d[optional]', should be one of: yes no"; + } else { + if (($d['rel'] == 'not' || $d['rel'] == 'ne') && $d['optional'] == 'yes') { + $errors[] = "dependency $i: 'not' and 'ne' dependencies cannot be " . + "optional"; + } + } + } + if ($d['rel'] != 'not' && $d['rel'] != 'has' && empty($d['version'])) { + $warnings[] = "dependency $i: missing version"; + } elseif (($d['rel'] == 'not' || $d['rel'] == 'has') && !empty($d['version'])) { + $warnings[] = "dependency $i: version ignored for `$d[rel]' dependencies"; + } + if ($d['rel'] == 'not' && !empty($d['version'])) { + $warnings[] = "dependency $i: 'not' defines a total conflict, to exclude " . + "specific versions, use 'ne'"; + } + if ($d['type'] == 'php' && !empty($d['name'])) { + $warnings[] = "dependency $i: name ignored for php type dependencies"; + } elseif ($d['type'] != 'php' && empty($d['name'])) { + $errors[] = "dependency $i: missing name"; + } + if ($d['type'] == 'php' && $d['rel'] == 'not') { + $errors[] = "dependency $i: PHP dependencies cannot use 'not' " . + "rel, use 'ne' to exclude versions"; + } + $i++; + } + } + if (!empty($info['configure_options'])) { + $i = 1; + foreach ($info['configure_options'] as $c) { + if (empty($c['name'])) { + $errors[] = "configure option $i: missing name"; + } + if (empty($c['prompt'])) { + $errors[] = "configure option $i: missing prompt"; + } + $i++; + } + } + if (empty($info['filelist'])) { + $errors[] = 'no files'; + } else { + foreach ($info['filelist'] as $file => $fa) { + if (empty($fa['role'])) { + $errors[] = "file $file: missing role"; + continue; + } elseif (!in_array($fa['role'], PEAR_Common::getFileRoles())) { + $errors[] = "file $file: invalid role, should be one of: " + . implode(' ', PEAR_Common::getFileRoles()); + } + if ($fa['role'] == 'php' && $dir_prefix) { + $this->log(1, "Analyzing $file"); + $srcinfo = $this->analyzeSourceCode($dir_prefix . DIRECTORY_SEPARATOR . $file); + if ($srcinfo) { + $this->buildProvidesArray($srcinfo); + } + } + + // (ssb) Any checks we can do for baseinstalldir? + // (cox) Perhaps checks that either the target dir and + // baseInstall doesn't cointain "../../" + } + } + $this->_packageName = $pn = $info['package']; + $pnl = strlen($pn); + foreach ((array)$this->pkginfo['provides'] as $key => $what) { + if (isset($what['explicit'])) { + // skip conformance checks if the provides entry is + // specified in the package.xml file + continue; + } + extract($what); + if ($type == 'class') { + if (!strncasecmp($name, $pn, $pnl)) { + continue; + } + $warnings[] = "in $file: class \"$name\" not prefixed with package name \"$pn\""; + } elseif ($type == 'function') { + if (strstr($name, '::') || !strncasecmp($name, $pn, $pnl)) { + continue; + } + $warnings[] = "in $file: function \"$name\" not prefixed with package name \"$pn\""; + } + } + + + return true; + } + + // }}} + // {{{ buildProvidesArray() + + /** + * Build a "provides" array from data returned by + * analyzeSourceCode(). The format of the built array is like + * this: + * + * array( + * 'class;MyClass' => 'array('type' => 'class', 'name' => 'MyClass'), + * ... + * ) + * + * + * @param array $srcinfo array with information about a source file + * as returned by the analyzeSourceCode() method. + * + * @return void + * + * @access public + * + */ + function buildProvidesArray($srcinfo) + { + $file = basename($srcinfo['source_file']); + $pn = ''; + if (isset($this->_packageName)) { + $pn = $this->_packageName; + } + $pnl = strlen($pn); + foreach ($srcinfo['declared_classes'] as $class) { + $key = "class;$class"; + if (isset($this->pkginfo['provides'][$key])) { + continue; + } + $this->pkginfo['provides'][$key] = + array('file'=> $file, 'type' => 'class', 'name' => $class); + if (isset($srcinfo['inheritance'][$class])) { + $this->pkginfo['provides'][$key]['extends'] = + $srcinfo['inheritance'][$class]; + } + } + foreach ($srcinfo['declared_methods'] as $class => $methods) { + foreach ($methods as $method) { + $function = "$class::$method"; + $key = "function;$function"; + if ($method{0} == '_' || !strcasecmp($method, $class) || + isset($this->pkginfo['provides'][$key])) { + continue; + } + $this->pkginfo['provides'][$key] = + array('file'=> $file, 'type' => 'function', 'name' => $function); + } + } + + foreach ($srcinfo['declared_functions'] as $function) { + $key = "function;$function"; + if ($function{0} == '_' || isset($this->pkginfo['provides'][$key])) { + continue; + } + if (!strstr($function, '::') && strncasecmp($function, $pn, $pnl)) { + $warnings[] = "in1 " . $file . ": function \"$function\" not prefixed with package name \"$pn\""; + } + $this->pkginfo['provides'][$key] = + array('file'=> $file, 'type' => 'function', 'name' => $function); + } + } + + // }}} + // {{{ analyzeSourceCode() + + /** + * Analyze the source code of the given PHP file + * + * @param string Filename of the PHP file + * @return mixed + * @access public + */ + function analyzeSourceCode($file) + { + if (!function_exists("token_get_all")) { + return false; + } + if (!defined('T_DOC_COMMENT')) { + define('T_DOC_COMMENT', T_COMMENT); + } + if (!defined('T_INTERFACE')) { + define('T_INTERFACE', -1); + } + if (!defined('T_IMPLEMENTS')) { + define('T_IMPLEMENTS', -1); + } + if (!$fp = @fopen($file, "r")) { + return false; + } + $contents = fread($fp, filesize($file)); + $tokens = token_get_all($contents); +/* + for ($i = 0; $i < sizeof($tokens); $i++) { + @list($token, $data) = $tokens[$i]; + if (is_string($token)) { + var_dump($token); + } else { + print token_name($token) . ' '; + var_dump(rtrim($data)); + } + } +*/ + $look_for = 0; + $paren_level = 0; + $bracket_level = 0; + $brace_level = 0; + $lastphpdoc = ''; + $current_class = ''; + $current_interface = ''; + $current_class_level = -1; + $current_function = ''; + $current_function_level = -1; + $declared_classes = array(); + $declared_interfaces = array(); + $declared_functions = array(); + $declared_methods = array(); + $used_classes = array(); + $used_functions = array(); + $extends = array(); + $implements = array(); + $nodeps = array(); + $inquote = false; + $interface = false; + for ($i = 0; $i < sizeof($tokens); $i++) { + if (is_array($tokens[$i])) { + list($token, $data) = $tokens[$i]; + } else { + $token = $tokens[$i]; + $data = ''; + } + if ($inquote) { + if ($token != '"') { + continue; + } else { + $inquote = false; + } + } + switch ($token) { + case T_WHITESPACE: + continue; + case ';': + if ($interface) { + $current_function = ''; + $current_function_level = -1; + } + break; + case '"': + $inquote = true; + break; + case T_CURLY_OPEN: + case T_DOLLAR_OPEN_CURLY_BRACES: + case '{': $brace_level++; continue 2; + case '}': + $brace_level--; + if ($current_class_level == $brace_level) { + $current_class = ''; + $current_class_level = -1; + } + if ($current_function_level == $brace_level) { + $current_function = ''; + $current_function_level = -1; + } + continue 2; + case '[': $bracket_level++; continue 2; + case ']': $bracket_level--; continue 2; + case '(': $paren_level++; continue 2; + case ')': $paren_level--; continue 2; + case T_INTERFACE: + $interface = true; + case T_CLASS: + if (($current_class_level != -1) || ($current_function_level != -1)) { + PEAR::raiseError("Parser error: Invalid PHP file $file", + PEAR_COMMON_ERROR_INVALIDPHP); + return false; + } + case T_FUNCTION: + case T_NEW: + case T_EXTENDS: + case T_IMPLEMENTS: + $look_for = $token; + continue 2; + case T_STRING: + if (version_compare(zend_version(), '2.0', '<')) { + if (in_array(strtolower($data), + array('public', 'private', 'protected', 'abstract', + 'interface', 'implements', 'clone', 'throw') + )) { + PEAR::raiseError('Error: PHP5 packages must be packaged by php 5 PEAR'); + return false; + } + } + if ($look_for == T_CLASS) { + $current_class = $data; + $current_class_level = $brace_level; + $declared_classes[] = $current_class; + } elseif ($look_for == T_INTERFACE) { + $current_interface = $data; + $current_class_level = $brace_level; + $declared_interfaces[] = $current_interface; + } elseif ($look_for == T_IMPLEMENTS) { + $implements[$current_class] = $data; + } elseif ($look_for == T_EXTENDS) { + $extends[$current_class] = $data; + } elseif ($look_for == T_FUNCTION) { + if ($current_class) { + $current_function = "$current_class::$data"; + $declared_methods[$current_class][] = $data; + } elseif ($current_interface) { + $current_function = "$current_interface::$data"; + $declared_methods[$current_interface][] = $data; + } else { + $current_function = $data; + $declared_functions[] = $current_function; + } + $current_function_level = $brace_level; + $m = array(); + } elseif ($look_for == T_NEW) { + $used_classes[$data] = true; + } + $look_for = 0; + continue 2; + case T_VARIABLE: + $look_for = 0; + continue 2; + case T_DOC_COMMENT: + case T_COMMENT: + if (preg_match('!^/\*\*\s!', $data)) { + $lastphpdoc = $data; + if (preg_match_all('/@nodep\s+(\S+)/', $lastphpdoc, $m)) { + $nodeps = array_merge($nodeps, $m[1]); + } + } + continue 2; + case T_DOUBLE_COLON: + if (!($tokens[$i - 1][0] == T_WHITESPACE || $tokens[$i - 1][0] == T_STRING)) { + PEAR::raiseError("Parser error: Invalid PHP file $file", + PEAR_COMMON_ERROR_INVALIDPHP); + return false; + } + $class = $tokens[$i - 1][1]; + if (strtolower($class) != 'parent') { + $used_classes[$class] = true; + } + continue 2; + } + } + return array( + "source_file" => $file, + "declared_classes" => $declared_classes, + "declared_interfaces" => $declared_interfaces, + "declared_methods" => $declared_methods, + "declared_functions" => $declared_functions, + "used_classes" => array_diff(array_keys($used_classes), $nodeps), + "inheritance" => $extends, + "implements" => $implements, + ); + } + + // }}} + // {{{ betterStates() + + /** + * Return an array containing all of the states that are more stable than + * or equal to the passed in state + * + * @param string Release state + * @param boolean Determines whether to include $state in the list + * @return false|array False if $state is not a valid release state + */ + function betterStates($state, $include = false) + { + static $states = array('snapshot', 'devel', 'alpha', 'beta', 'stable'); + $i = array_search($state, $states); + if ($i === false) { + return false; + } + if ($include) { + $i--; + } + return array_slice($states, $i + 1); + } + + // }}} + // {{{ detectDependencies() + + function detectDependencies($any, $status_callback = null) + { + if (!function_exists("token_get_all")) { + return false; + } + if (PEAR::isError($info = $this->infoFromAny($any))) { + return $this->raiseError($info); + } + if (!is_array($info)) { + return false; + } + $deps = array(); + $used_c = $decl_c = $decl_f = $decl_m = array(); + foreach ($info['filelist'] as $file => $fa) { + $tmp = $this->analyzeSourceCode($file); + $used_c = @array_merge($used_c, $tmp['used_classes']); + $decl_c = @array_merge($decl_c, $tmp['declared_classes']); + $decl_f = @array_merge($decl_f, $tmp['declared_functions']); + $decl_m = @array_merge($decl_m, $tmp['declared_methods']); + $inheri = @array_merge($inheri, $tmp['inheritance']); + } + $used_c = array_unique($used_c); + $decl_c = array_unique($decl_c); + $undecl_c = array_diff($used_c, $decl_c); + return array('used_classes' => $used_c, + 'declared_classes' => $decl_c, + 'declared_methods' => $decl_m, + 'declared_functions' => $decl_f, + 'undeclared_classes' => $undecl_c, + 'inheritance' => $inheri, + ); + } + + // }}} + // {{{ getUserRoles() + + /** + * Get the valid roles for a PEAR package maintainer + * + * @return array + * @static + */ + function getUserRoles() + { + return $GLOBALS['_PEAR_Common_maintainer_roles']; + } + + // }}} + // {{{ getReleaseStates() + + /** + * Get the valid package release states of packages + * + * @return array + * @static + */ + function getReleaseStates() + { + return $GLOBALS['_PEAR_Common_release_states']; + } + + // }}} + // {{{ getDependencyTypes() + + /** + * Get the implemented dependency types (php, ext, pkg etc.) + * + * @return array + * @static + */ + function getDependencyTypes() + { + return $GLOBALS['_PEAR_Common_dependency_types']; + } + + // }}} + // {{{ getDependencyRelations() + + /** + * Get the implemented dependency relations (has, lt, ge etc.) + * + * @return array + * @static + */ + function getDependencyRelations() + { + return $GLOBALS['_PEAR_Common_dependency_relations']; + } + + // }}} + // {{{ getFileRoles() + + /** + * Get the implemented file roles + * + * @return array + * @static + */ + function getFileRoles() + { + return $GLOBALS['_PEAR_Common_file_roles']; + } + + // }}} + // {{{ getReplacementTypes() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getReplacementTypes() + { + return $GLOBALS['_PEAR_Common_replacement_types']; + } + + // }}} + // {{{ getProvideTypes() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getProvideTypes() + { + return $GLOBALS['_PEAR_Common_provide_types']; + } + + // }}} + // {{{ getScriptPhases() + + /** + * Get the implemented file replacement types in + * + * @return array + * @static + */ + function getScriptPhases() + { + return $GLOBALS['_PEAR_Common_script_phases']; + } + + // }}} + // {{{ validPackageName() + + /** + * Test whether a string contains a valid package name. + * + * @param string $name the package name to test + * + * @return bool + * + * @access public + */ + function validPackageName($name) + { + return (bool)preg_match(PEAR_COMMON_PACKAGE_NAME_PREG, $name); + } + + + // }}} + // {{{ validPackageVersion() + + /** + * Test whether a string contains a valid package version. + * + * @param string $ver the package version to test + * + * @return bool + * + * @access public + */ + function validPackageVersion($ver) + { + return (bool)preg_match(PEAR_COMMON_PACKAGE_VERSION_PREG, $ver); + } + + + // }}} + + // {{{ downloadHttp() + + /** + * Download a file through HTTP. Considers suggested file name in + * Content-disposition: header and can run a callback function for + * different events. The callback will be called with two + * parameters: the callback type, and parameters. The implemented + * callback types are: + * + * 'setup' called at the very beginning, parameter is a UI object + * that should be used for all output + * 'message' the parameter is a string with an informational message + * 'saveas' may be used to save with a different file name, the + * parameter is the filename that is about to be used. + * If a 'saveas' callback returns a non-empty string, + * that file name will be used as the filename instead. + * Note that $save_dir will not be affected by this, only + * the basename of the file. + * 'start' download is starting, parameter is number of bytes + * that are expected, or -1 if unknown + * 'bytesread' parameter is the number of bytes read so far + * 'done' download is complete, parameter is the total number + * of bytes read + * 'connfailed' if the TCP connection fails, this callback is called + * with array(host,port,errno,errmsg) + * 'writefailed' if writing to disk fails, this callback is called + * with array(destfile,errmsg) + * + * If an HTTP proxy has been configured (http_proxy PEAR_Config + * setting), the proxy will be used. + * + * @param string $url the URL to download + * @param object $ui PEAR_Frontend_* instance + * @param object $config PEAR_Config instance + * @param string $save_dir (optional) directory to save file in + * @param mixed $callback (optional) function/method to call for status + * updates + * + * @return string Returns the full path of the downloaded file or a PEAR + * error on failure. If the error is caused by + * socket-related errors, the error object will + * have the fsockopen error code available through + * getCode(). + * + * @access public + */ + function downloadHttp($url, &$ui, $save_dir = '.', $callback = null) + { + if ($callback) { + call_user_func($callback, 'setup', array(&$ui)); + } + if (preg_match('!^http://([^/:?#]*)(:(\d+))?(/.*)!', $url, $matches)) { + list(,$host,,$port,$path) = $matches; + } + if (isset($this)) { + $config = &$this->config; + } else { + $config = &PEAR_Config::singleton(); + } + $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; + if ($proxy = parse_url($config->get('http_proxy'))) { + $proxy_host = @$proxy['host']; + $proxy_port = @$proxy['port']; + $proxy_user = @$proxy['user']; + $proxy_pass = @$proxy['pass']; + + if ($proxy_port == '') { + $proxy_port = 8080; + } + if ($callback) { + call_user_func($callback, 'message', "Using HTTP proxy $host:$port"); + } + } + if (empty($port)) { + $port = 80; + } + if ($proxy_host != '') { + $fp = @fsockopen($proxy_host, $proxy_port, $errno, $errstr); + if (!$fp) { + if ($callback) { + call_user_func($callback, 'connfailed', array($proxy_host, $proxy_port, + $errno, $errstr)); + } + return PEAR::raiseError("Connection to `$proxy_host:$proxy_port' failed: $errstr", $errno); + } + $request = "GET $url HTTP/1.0\r\n"; + } else { + $fp = @fsockopen($host, $port, $errno, $errstr); + if (!$fp) { + if ($callback) { + call_user_func($callback, 'connfailed', array($host, $port, + $errno, $errstr)); + } + return PEAR::raiseError("Connection to `$host:$port' failed: $errstr", $errno); + } + $request = "GET $path HTTP/1.0\r\n"; + } + $request .= "Host: $host:$port\r\n". + "User-Agent: PHP/".PHP_VERSION."\r\n"; + if ($proxy_host != '' && $proxy_user != '') { + $request .= 'Proxy-Authorization: Basic ' . + base64_encode($proxy_user . ':' . $proxy_pass) . "\r\n"; + } + $request .= "\r\n"; + fwrite($fp, $request); + $headers = array(); + while (trim($line = fgets($fp, 1024))) { + if (preg_match('/^([^:]+):\s+(.*)\s*$/', $line, $matches)) { + $headers[strtolower($matches[1])] = trim($matches[2]); + } elseif (preg_match('|^HTTP/1.[01] ([0-9]{3}) |', $line, $matches)) { + if ($matches[1] != 200) { + return PEAR::raiseError("File http://$host:$port$path not valid (received: $line)"); + } + } + } + if (isset($headers['content-disposition']) && + preg_match('/\sfilename=\"([^;]*\S)\"\s*(;|$)/', $headers['content-disposition'], $matches)) { + $save_as = basename($matches[1]); + } else { + $save_as = basename($url); + } + if ($callback) { + $tmp = call_user_func($callback, 'saveas', $save_as); + if ($tmp) { + $save_as = $tmp; + } + } + $dest_file = $save_dir . DIRECTORY_SEPARATOR . $save_as; + if (!$wp = @fopen($dest_file, 'wb')) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); + } + return PEAR::raiseError("could not open $dest_file for writing"); + } + if (isset($headers['content-length'])) { + $length = $headers['content-length']; + } else { + $length = -1; + } + $bytes = 0; + if ($callback) { + call_user_func($callback, 'start', array(basename($dest_file), $length)); + } + while ($data = @fread($fp, 1024)) { + $bytes += strlen($data); + if ($callback) { + call_user_func($callback, 'bytesread', $bytes); + } + if (!@fwrite($wp, $data)) { + fclose($fp); + if ($callback) { + call_user_func($callback, 'writefailed', array($dest_file, $php_errormsg)); + } + return PEAR::raiseError("$dest_file: write failed ($php_errormsg)"); + } + } + fclose($fp); + fclose($wp); + if ($callback) { + call_user_func($callback, 'done', $bytes); + } + return $dest_file; + } + + // }}} + // {{{ sortPkgDeps() + + /** + * Sort a list of arrays of array(downloaded packagefilename) by dependency. + * + * It also removes duplicate dependencies + * @param array + * @param boolean Sort packages in reverse order if true + * @return array array of array(packagefilename, package.xml contents) + */ + function sortPkgDeps(&$packages, $uninstall = false) + { + $ret = array(); + if ($uninstall) { + foreach($packages as $packageinfo) { + $ret[] = array('info' => $packageinfo); + } + } else { + foreach($packages as $packagefile) { + if (!is_array($packagefile)) { + $ret[] = array('file' => $packagefile, + 'info' => $a = $this->infoFromAny($packagefile), + 'pkg' => $a['package']); + } else { + $ret[] = $packagefile; + } + } + } + $checkdupes = array(); + $newret = array(); + foreach($ret as $i => $p) { + if (!isset($checkdupes[$p['info']['package']])) { + $checkdupes[$p['info']['package']][] = $i; + $newret[] = $p; + } + } + $this->_packageSortTree = $this->_getPkgDepTree($newret); + + $func = $uninstall ? '_sortPkgDepsRev' : '_sortPkgDeps'; + usort($newret, array(&$this, $func)); + $this->_packageSortTree = null; + $packages = $newret; + } + + // }}} + // {{{ _sortPkgDeps() + + /** + * Compare two package's package.xml, and sort + * so that dependencies are installed first + * + * This is a crude compare, real dependency checking is done on install. + * The only purpose this serves is to make the command-line + * order-independent (you can list a dependent package first, and + * installation occurs in the order required) + * @access private + */ + function _sortPkgDeps($p1, $p2) + { + $p1name = $p1['info']['package']; + $p2name = $p2['info']['package']; + $p1deps = $this->_getPkgDeps($p1); + $p2deps = $this->_getPkgDeps($p2); + if (!count($p1deps) && !count($p2deps)) { + return 0; // order makes no difference + } + if (!count($p1deps)) { + return -1; // package 2 has dependencies, package 1 doesn't + } + if (!count($p2deps)) { + return 1; // package 1 has dependencies, package 2 doesn't + } + // both have dependencies + if (in_array($p1name, $p2deps)) { + return -1; // put package 1 first: package 2 depends on package 1 + } + if (in_array($p2name, $p1deps)) { + return 1; // put package 2 first: package 1 depends on package 2 + } + if ($this->_removedDependency($p1name, $p2name)) { + return -1; // put package 1 first: package 2 depends on packages that depend on package 1 + } + if ($this->_removedDependency($p2name, $p1name)) { + return 1; // put package 2 first: package 1 depends on packages that depend on package 2 + } + // doesn't really matter if neither depends on the other + return 0; + } + + // }}} + // {{{ _sortPkgDepsRev() + + /** + * Compare two package's package.xml, and sort + * so that dependencies are uninstalled last + * + * This is a crude compare, real dependency checking is done on uninstall. + * The only purpose this serves is to make the command-line + * order-independent (you can list a dependency first, and + * uninstallation occurs in the order required) + * @access private + */ + function _sortPkgDepsRev($p1, $p2) + { + $p1name = $p1['info']['package']; + $p2name = $p2['info']['package']; + $p1deps = $this->_getRevPkgDeps($p1); + $p2deps = $this->_getRevPkgDeps($p2); + if (!count($p1deps) && !count($p2deps)) { + return 0; // order makes no difference + } + if (!count($p1deps)) { + return 1; // package 2 has dependencies, package 1 doesn't + } + if (!count($p2deps)) { + return -1; // package 2 has dependencies, package 1 doesn't + } + // both have dependencies + if (in_array($p1name, $p2deps)) { + return 1; // put package 1 last + } + if (in_array($p2name, $p1deps)) { + return -1; // put package 2 last + } + if ($this->_removedDependency($p1name, $p2name)) { + return 1; // put package 1 last: package 2 depends on packages that depend on package 1 + } + if ($this->_removedDependency($p2name, $p1name)) { + return -1; // put package 2 last: package 1 depends on packages that depend on package 2 + } + // doesn't really matter if neither depends on the other + return 0; + } + + // }}} + // {{{ _getPkgDeps() + + /** + * get an array of package dependency names + * @param array + * @return array + * @access private + */ + function _getPkgDeps($p) + { + if (!isset($p['info']['releases'])) { + return $this->_getRevPkgDeps($p); + } + $rel = array_shift($p['info']['releases']); + if (!isset($rel['deps'])) { + return array(); + } + $ret = array(); + foreach($rel['deps'] as $dep) { + if ($dep['type'] == 'pkg') { + $ret[] = $dep['name']; + } + } + return $ret; + } + + // }}} + // {{{ _getPkgDeps() + + /** + * get an array representation of the package dependency tree + * @return array + * @access private + */ + function _getPkgDepTree($packages) + { + $tree = array(); + foreach ($packages as $p) { + $package = $p['info']['package']; + $deps = $this->_getPkgDeps($p); + $tree[$package] = $deps; + } + return $tree; + } + + // }}} + // {{{ _removedDependency($p1, $p2) + + /** + * get an array of package dependency names for uninstall + * @param string package 1 name + * @param string package 2 name + * @return bool + * @access private + */ + function _removedDependency($p1, $p2) + { + if (empty($this->_packageSortTree[$p2])) { + return false; + } + if (!in_array($p1, $this->_packageSortTree[$p2])) { + foreach ($this->_packageSortTree[$p2] as $potential) { + if ($this->_removedDependency($p1, $potential)) { + return true; + } + } + return false; + } + return true; + } + + // }}} + // {{{ _getRevPkgDeps() + + /** + * get an array of package dependency names for uninstall + * @param array + * @return array + * @access private + */ + function _getRevPkgDeps($p) + { + if (!isset($p['info']['release_deps'])) { + return array(); + } + $ret = array(); + foreach($p['info']['release_deps'] as $dep) { + if ($dep['type'] == 'pkg') { + $ret[] = $dep['name']; + } + } + return $ret; + } + + // }}} +} + +?> diff --git a/includes/PEAR/Config.php b/includes/PEAR/Config.php new file mode 100644 index 0000000..ba64173 --- /dev/null +++ b/includes/PEAR/Config.php @@ -0,0 +1,1169 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Config.php,v 1.52 2004/01/08 17:33:12 sniper Exp $ + +require_once 'PEAR.php'; +require_once 'System.php'; + +/** + * Last created PEAR_Config instance. + * @var object + */ +$GLOBALS['_PEAR_Config_instance'] = null; +if (!defined('PEAR_INSTALL_DIR') || !PEAR_INSTALL_DIR) { + $PEAR_INSTALL_DIR = PHP_LIBDIR . DIRECTORY_SEPARATOR . 'pear'; +} else { + $PEAR_INSTALL_DIR = PEAR_INSTALL_DIR; +} + +// Below we define constants with default values for all configuration +// parameters except username/password. All of them can have their +// defaults set through environment variables. The reason we use the +// PHP_ prefix is for some security, PHP protects environment +// variables starting with PHP_*. + +if (getenv('PHP_PEAR_SYSCONF_DIR')) { + define('PEAR_CONFIG_SYSCONFDIR', getenv('PHP_PEAR_SYSCONF_DIR')); +} elseif (getenv('SystemRoot')) { + define('PEAR_CONFIG_SYSCONFDIR', getenv('SystemRoot')); +} else { + define('PEAR_CONFIG_SYSCONFDIR', PHP_SYSCONFDIR); +} + +// Default for master_server +if (getenv('PHP_PEAR_MASTER_SERVER')) { + define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', getenv('PHP_PEAR_MASTER_SERVER')); +} else { + define('PEAR_CONFIG_DEFAULT_MASTER_SERVER', 'pear.php.net'); +} + +// Default for http_proxy +if (getenv('PHP_PEAR_HTTP_PROXY')) { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('PHP_PEAR_HTTP_PROXY')); +} elseif (getenv('http_proxy')) { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', getenv('http_proxy')); +} else { + define('PEAR_CONFIG_DEFAULT_HTTP_PROXY', ''); +} + +// Default for php_dir +if (getenv('PHP_PEAR_INSTALL_DIR')) { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', getenv('PHP_PEAR_INSTALL_DIR')); +} else { + if (@is_dir($PEAR_INSTALL_DIR)) { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', + $PEAR_INSTALL_DIR); + } else { + define('PEAR_CONFIG_DEFAULT_PHP_DIR', $PEAR_INSTALL_DIR); + } +} + +// Default for ext_dir +if (getenv('PHP_PEAR_EXTENSION_DIR')) { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', getenv('PHP_PEAR_EXTENSION_DIR')); +} else { + if (ini_get('extension_dir')) { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', ini_get('extension_dir')); + } elseif (defined('PEAR_EXTENSION_DIR') && @is_dir(PEAR_EXTENSION_DIR)) { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', PEAR_EXTENSION_DIR); + } elseif (defined('PHP_EXTENSION_DIR')) { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', PHP_EXTENSION_DIR); + } else { + define('PEAR_CONFIG_DEFAULT_EXT_DIR', '.'); + } +} + +// Default for doc_dir +if (getenv('PHP_PEAR_DOC_DIR')) { + define('PEAR_CONFIG_DEFAULT_DOC_DIR', getenv('PHP_PEAR_DOC_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_DOC_DIR', + $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'docs'); +} + +// Default for bin_dir +if (getenv('PHP_PEAR_BIN_DIR')) { + define('PEAR_CONFIG_DEFAULT_BIN_DIR', getenv('PHP_PEAR_BIN_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_BIN_DIR', PHP_BINDIR); +} + +// Default for data_dir +if (getenv('PHP_PEAR_DATA_DIR')) { + define('PEAR_CONFIG_DEFAULT_DATA_DIR', getenv('PHP_PEAR_DATA_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_DATA_DIR', + $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'data'); +} + +// Default for test_dir +if (getenv('PHP_PEAR_TEST_DIR')) { + define('PEAR_CONFIG_DEFAULT_TEST_DIR', getenv('PHP_PEAR_TEST_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_TEST_DIR', + $PEAR_INSTALL_DIR.DIRECTORY_SEPARATOR.'tests'); +} + +// Default for cache_dir +if (getenv('PHP_PEAR_CACHE_DIR')) { + define('PEAR_CONFIG_DEFAULT_CACHE_DIR', getenv('PHP_PEAR_CACHE_DIR')); +} else { + define('PEAR_CONFIG_DEFAULT_CACHE_DIR', + System::tmpdir() . DIRECTORY_SEPARATOR . 'pear' . + DIRECTORY_SEPARATOR . 'cache'); +} + +// Default for php_bin +if (getenv('PHP_PEAR_PHP_BIN')) { + define('PEAR_CONFIG_DEFAULT_PHP_BIN', getenv('PHP_PEAR_PHP_BIN')); +} else { + define('PEAR_CONFIG_DEFAULT_PHP_BIN', PEAR_CONFIG_DEFAULT_BIN_DIR. + DIRECTORY_SEPARATOR.'php'.(OS_WINDOWS ? '.exe' : '')); +} + +// Default for verbose +if (getenv('PHP_PEAR_VERBOSE')) { + define('PEAR_CONFIG_DEFAULT_VERBOSE', getenv('PHP_PEAR_VERBOSE')); +} else { + define('PEAR_CONFIG_DEFAULT_VERBOSE', 1); +} + +// Default for preferred_state +if (getenv('PHP_PEAR_PREFERRED_STATE')) { + define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', getenv('PHP_PEAR_PREFERRED_STATE')); +} else { + define('PEAR_CONFIG_DEFAULT_PREFERRED_STATE', 'stable'); +} + +// Default for umask +if (getenv('PHP_PEAR_UMASK')) { + define('PEAR_CONFIG_DEFAULT_UMASK', getenv('PHP_PEAR_UMASK')); +} else { + define('PEAR_CONFIG_DEFAULT_UMASK', decoct(umask())); +} + +// Default for cache_ttl +if (getenv('PHP_PEAR_CACHE_TTL')) { + define('PEAR_CONFIG_DEFAULT_CACHE_TTL', getenv('PHP_PEAR_CACHE_TTL')); +} else { + define('PEAR_CONFIG_DEFAULT_CACHE_TTL', 3600); +} + +// Default for sig_type +if (getenv('PHP_PEAR_SIG_TYPE')) { + define('PEAR_CONFIG_DEFAULT_SIG_TYPE', getenv('PHP_PEAR_SIG_TYPE')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_TYPE', 'gpg'); +} + +// Default for sig_bin +if (getenv('PHP_PEAR_SIG_BIN')) { + define('PEAR_CONFIG_DEFAULT_SIG_BIN', getenv('PHP_PEAR_SIG_BIN')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_BIN', + System::which( + 'gpg', OS_WINDOWS ? 'c:\gnupg\gpg.exe' : '/usr/local/bin/gpg')); +} + +// Default for sig_keydir +if (getenv('PHP_PEAR_SIG_KEYDIR')) { + define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', getenv('PHP_PEAR_SIG_KEYDIR')); +} else { + define('PEAR_CONFIG_DEFAULT_SIG_KEYDIR', + PEAR_CONFIG_SYSCONFDIR . DIRECTORY_SEPARATOR . 'pearkeys'); +} + +/** + * This is a class for storing configuration data, keeping track of + * which are system-defined, user-defined or defaulted. + */ +class PEAR_Config extends PEAR +{ + // {{{ properties + + /** + * Array of config files used. + * + * @var array layer => config file + */ + var $files = array( + 'system' => '', + 'user' => '', + ); + + var $layers = array(); + + /** + * Configuration data, two-dimensional array where the first + * dimension is the config layer ('user', 'system' and 'default'), + * and the second dimension is keyname => value. + * + * The order in the first dimension is important! Earlier + * layers will shadow later ones when a config value is + * requested (if a 'user' value exists, it will be returned first, + * then 'system' and finally 'default'). + * + * @var array layer => array(keyname => value, ...) + */ + var $configuration = array( + 'user' => array(), + 'system' => array(), + 'default' => array(), + ); + + /** + * Information about the configuration data. Stores the type, + * default value and a documentation string for each configuration + * value. + * + * @var array layer => array(infotype => value, ...) + */ + var $configuration_info = array( + // Internet Access + 'master_server' => array( + 'type' => 'string', + 'default' => 'pear.php.net', + 'doc' => 'name of the main PEAR server', + 'prompt' => 'PEAR server', + 'group' => 'Internet Access', + ), + 'http_proxy' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_HTTP_PROXY, + 'doc' => 'HTTP proxy (host:port) to use when downloading packages', + 'prompt' => 'HTTP Proxy Server Address', + 'group' => 'Internet Access', + ), + // File Locations + 'php_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_PHP_DIR, + 'doc' => 'directory where .php files are installed', + 'prompt' => 'PEAR directory', + 'group' => 'File Locations', + ), + 'ext_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_EXT_DIR, + 'doc' => 'directory where loadable extensions are installed', + 'prompt' => 'PHP extension directory', + 'group' => 'File Locations', + ), + 'doc_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_DOC_DIR, + 'doc' => 'directory where documentation is installed', + 'prompt' => 'PEAR documentation directory', + 'group' => 'File Locations', + ), + 'bin_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_BIN_DIR, + 'doc' => 'directory where executables are installed', + 'prompt' => 'PEAR executables directory', + 'group' => 'File Locations', + ), + 'data_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_DATA_DIR, + 'doc' => 'directory where data files are installed', + 'prompt' => 'PEAR data directory', + 'group' => 'File Locations (Advanced)', + ), + 'test_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_TEST_DIR, + 'doc' => 'directory where regression tests are installed', + 'prompt' => 'PEAR test directory', + 'group' => 'File Locations (Advanced)', + ), + 'cache_dir' => array( + 'type' => 'directory', + 'default' => PEAR_CONFIG_DEFAULT_CACHE_DIR, + 'doc' => 'directory which is used for XMLRPC cache', + 'prompt' => 'PEAR Installer cache directory', + 'group' => 'File Locations (Advanced)', + ), + 'php_bin' => array( + 'type' => 'file', + 'default' => PEAR_CONFIG_DEFAULT_PHP_BIN, + 'doc' => 'PHP CLI/CGI binary for executing scripts', + 'prompt' => 'PHP CLI/CGI binary', + 'group' => 'File Locations (Advanced)', + ), + // Maintainers + 'username' => array( + 'type' => 'string', + 'default' => '', + 'doc' => '(maintainers) your PEAR account name', + 'prompt' => 'PEAR username (for maintainers)', + 'group' => 'Maintainers', + ), + 'password' => array( + 'type' => 'password', + 'default' => '', + 'doc' => '(maintainers) your PEAR account password', + 'prompt' => 'PEAR password (for maintainers)', + 'group' => 'Maintainers', + ), + // Advanced + 'verbose' => array( + 'type' => 'integer', + 'default' => PEAR_CONFIG_DEFAULT_VERBOSE, + 'doc' => 'verbosity level +0: really quiet +1: somewhat quiet +2: verbose +3: debug', + 'prompt' => 'Debug Log Level', + 'group' => 'Advanced', + ), + 'preferred_state' => array( + 'type' => 'set', + 'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE, + 'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified', + 'valid_set' => array( + 'stable', 'beta', 'alpha', 'devel', 'snapshot'), + 'prompt' => 'Preferred Package State', + 'group' => 'Advanced', + ), + 'umask' => array( + 'type' => 'mask', + 'default' => PEAR_CONFIG_DEFAULT_UMASK, + 'doc' => 'umask used when creating files (Unix-like systems only)', + 'prompt' => 'Unix file mask', + 'group' => 'Advanced', + ), + 'cache_ttl' => array( + 'type' => 'integer', + 'default' => PEAR_CONFIG_DEFAULT_CACHE_TTL, + 'doc' => 'amount of secs where the local cache is used and not updated', + 'prompt' => 'Cache TimeToLive', + 'group' => 'Advanced', + ), + 'sig_type' => array( + 'type' => 'set', + 'default' => PEAR_CONFIG_DEFAULT_SIG_TYPE, + 'doc' => 'which package signature mechanism to use', + 'valid_set' => array('gpg'), + 'prompt' => 'Package Signature Type', + 'group' => 'Maintainers', + ), + 'sig_bin' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_SIG_BIN, + 'doc' => 'which package signature mechanism to use', + 'prompt' => 'Signature Handling Program', + 'group' => 'Maintainers', + ), + 'sig_keyid' => array( + 'type' => 'string', + 'default' => '', + 'doc' => 'which key to use for signing with', + 'prompt' => 'Signature Key Id', + 'group' => 'Maintainers', + ), + 'sig_keydir' => array( + 'type' => 'string', + 'default' => PEAR_CONFIG_DEFAULT_SIG_KEYDIR, + 'doc' => 'which package signature mechanism to use', + 'prompt' => 'Signature Key Directory', + 'group' => 'Maintainers', + ), + ); + + // }}} + + // {{{ PEAR_Config([file], [defaults_file]) + + /** + * Constructor. + * + * @param string (optional) file to read user-defined options from + * @param string (optional) file to read system-wide defaults from + * + * @access public + * + * @see PEAR_Config::singleton + */ + function PEAR_Config($user_file = '', $system_file = '') + { + $this->PEAR(); + $sl = DIRECTORY_SEPARATOR; + if (empty($user_file)) { + if (OS_WINDOWS) { + $user_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.ini'; + } else { + $user_file = getenv('HOME') . $sl . '.pearrc'; + } + } + if (empty($system_file)) { + if (OS_WINDOWS) { + $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pearsys.ini'; + } else { + $system_file = PEAR_CONFIG_SYSCONFDIR . $sl . 'pear.conf'; + } + } + $this->layers = array_keys($this->configuration); + $this->files['user'] = $user_file; + $this->files['system'] = $system_file; + if ($user_file && file_exists($user_file)) { + $this->readConfigFile($user_file); + } + if ($system_file && file_exists($system_file)) { + $this->mergeConfigFile($system_file, false, 'system'); + } + foreach ($this->configuration_info as $key => $info) { + $this->configuration['default'][$key] = $info['default']; + } + //$GLOBALS['_PEAR_Config_instance'] = &$this; + } + + // }}} + // {{{ singleton([file], [defaults_file]) + + /** + * Static singleton method. If you want to keep only one instance + * of this class in use, this method will give you a reference to + * the last created PEAR_Config object if one exists, or create a + * new object. + * + * @param string (optional) file to read user-defined options from + * @param string (optional) file to read system-wide defaults from + * + * @return object an existing or new PEAR_Config instance + * + * @access public + * + * @see PEAR_Config::PEAR_Config + */ + function &singleton($user_file = '', $system_file = '') + { + if (is_object($GLOBALS['_PEAR_Config_instance'])) { + return $GLOBALS['_PEAR_Config_instance']; + } + $GLOBALS['_PEAR_Config_instance'] = + &new PEAR_Config($user_file, $system_file); + return $GLOBALS['_PEAR_Config_instance']; + } + + // }}} + // {{{ readConfigFile([file], [layer]) + + /** + * Reads configuration data from a file. All existing values in + * the config layer are discarded and replaced with data from the + * file. + * + * @param string (optional) file to read from, if NULL or not + * specified, the last-used file for the same layer (second param) + * is used + * + * @param string (optional) config layer to insert data into + * ('user' or 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public + */ + function readConfigFile($file = null, $layer = 'user') + { + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = $this->_readConfigDataFrom($file); + if (PEAR::isError($data)) { + return $data; + } + $this->_decodeInput($data); + $this->configuration[$layer] = $data; + return true; + } + + // }}} + // {{{ mergeConfigFile(file, [override], [layer]) + + /** + * Merges data into a config layer from a file. Does the same + * thing as readConfigFile, except it does not replace all + * existing values in the config layer. + * + * @param string file to read from + * + * @param bool (optional) whether to overwrite existing data + * (default TRUE) + * + * @param string config layer to insert data into ('user' or + * 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public. + */ + function mergeConfigFile($file, $override = true, $layer = 'user') + { + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = $this->_readConfigDataFrom($file); + if (PEAR::isError($data)) { + return $data; + } + $this->_decodeInput($data); + if ($override) { + $this->configuration[$layer] = array_merge($this->configuration[$layer], $data); + } else { + $this->configuration[$layer] = array_merge($data, $this->configuration[$layer]); + } + return true; + } + + // }}} + // {{{ writeConfigFile([file], [layer]) + + /** + * Writes data into a config layer from a file. + * + * @param string file to read from + * + * @param bool (optional) whether to overwrite existing data + * (default TRUE) + * + * @param string config layer to insert data into ('user' or + * 'system') + * + * @return bool TRUE on success or a PEAR error on failure + * + * @access public. + */ + function writeConfigFile($file = null, $layer = 'user', $data = null) + { + if ($layer == 'both' || $layer == 'all') { + foreach ($this->files as $type => $file) { + $err = $this->writeConfigFile($file, $type, $data); + if (PEAR::isError($err)) { + return $err; + } + } + return true; + } + if (empty($this->files[$layer])) { + return $this->raiseError("unknown config file type `$layer'"); + } + if ($file === null) { + $file = $this->files[$layer]; + } + $data = ($data === null) ? $this->configuration[$layer] : $data; + $this->_encodeOutput($data); + $opt = array('-p', dirname($file)); + if (!@System::mkDir($opt)) { + return $this->raiseError("could not create directory: " . dirname($file)); + } + if (@is_file($file) && !@is_writeable($file)) { + return $this->raiseError("no write access to $file!"); + } + $fp = @fopen($file, "w"); + if (!$fp) { + return $this->raiseError("PEAR_Config::writeConfigFile fopen('$file','w') failed"); + } + $contents = "#PEAR_Config 0.9\n" . serialize($data); + if (!@fwrite($fp, $contents)) { + return $this->raiseError("PEAR_Config::writeConfigFile: fwrite failed"); + } + return true; + } + + // }}} + // {{{ _readConfigDataFrom(file) + + /** + * Reads configuration data from a file and returns the parsed data + * in an array. + * + * @param string file to read from + * + * @return array configuration data or a PEAR error on failure + * + * @access private + */ + function _readConfigDataFrom($file) + { + $fp = @fopen($file, "r"); + if (!$fp) { + return $this->raiseError("PEAR_Config::readConfigFile fopen('$file','r') failed"); + } + $size = filesize($file); + $rt = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $contents = fread($fp, $size); + set_magic_quotes_runtime($rt); + fclose($fp); + $version = '0.1'; + if (preg_match('/^#PEAR_Config\s+(\S+)\s+/si', $contents, $matches)) { + $version = $matches[1]; + $contents = substr($contents, strlen($matches[0])); + } + if (version_compare("$version", '1', '<')) { + $data = unserialize($contents); + if (!is_array($data)) { + if (strlen(trim($contents)) > 0) { + $error = "PEAR_Config: bad data in $file"; +// if (isset($this)) { + return $this->raiseError($error); +// } else { +// return PEAR::raiseError($error); + } else { + $data = array(); + } + } + // add parsing of newer formats here... + } else { + return $this->raiseError("$file: unknown version `$version'"); + } + return $data; + } + + // }}} + // {{{ getConfFile(layer) + /** + * Gets the file used for storing the config for a layer + * + * @param string $layer 'user' or 'system' + */ + + function getConfFile($layer) + { + return $this->files[$layer]; + } + + // }}} + // {{{ _encodeOutput(&data) + + /** + * Encodes/scrambles configuration data before writing to files. + * Currently, 'password' values will be base64-encoded as to avoid + * that people spot cleartext passwords by accident. + * + * @param array (reference) array to encode values in + * + * @return bool TRUE on success + * + * @access private + */ + function _encodeOutput(&$data) + { + foreach ($data as $key => $value) { + if (!isset($this->configuration_info[$key])) { + continue; + } + $type = $this->configuration_info[$key]['type']; + switch ($type) { + // we base64-encode passwords so they are at least + // not shown in plain by accident + case 'password': { + $data[$key] = base64_encode($data[$key]); + break; + } + case 'mask': { + $data[$key] = octdec($data[$key]); + break; + } + } + } + return true; + } + + // }}} + // {{{ _decodeInput(&data) + + /** + * Decodes/unscrambles configuration data after reading from files. + * + * @param array (reference) array to encode values in + * + * @return bool TRUE on success + * + * @access private + * + * @see PEAR_Config::_encodeOutput + */ + function _decodeInput(&$data) + { + if (!is_array($data)) { + return true; + } + foreach ($data as $key => $value) { + if (!isset($this->configuration_info[$key])) { + continue; + } + $type = $this->configuration_info[$key]['type']; + switch ($type) { + case 'password': { + $data[$key] = base64_decode($data[$key]); + break; + } + case 'mask': { + $data[$key] = decoct($data[$key]); + break; + } + } + } + return true; + } + + // }}} + // {{{ get(key, [layer]) + + /** + * Returns a configuration value, prioritizing layers as per the + * layers property. + * + * @param string config key + * + * @return mixed the config value, or NULL if not found + * + * @access public + */ + function get($key, $layer = null) + { + if ($layer === null) { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return $this->configuration[$layer][$key]; + } + } + } elseif (isset($this->configuration[$layer][$key])) { + return $this->configuration[$layer][$key]; + } + return null; + } + + // }}} + // {{{ set(key, value, [layer]) + + /** + * Set a config value in a specific layer (defaults to 'user'). + * Enforces the types defined in the configuration_info array. An + * integer config variable will be cast to int, and a set config + * variable will be validated against its legal values. + * + * @param string config key + * + * @param string config value + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function set($key, $value, $layer = 'user') + { + if (empty($this->configuration_info[$key])) { + return false; + } + extract($this->configuration_info[$key]); + switch ($type) { + case 'integer': + $value = (int)$value; + break; + case 'set': { + // If a valid_set is specified, require the value to + // be in the set. If there is no valid_set, accept + // any value. + if ($valid_set) { + reset($valid_set); + if ((key($valid_set) === 0 && !in_array($value, $valid_set)) || + (key($valid_set) !== 0 && empty($valid_set[$value]))) + { + return false; + } + } + break; + } + } + $this->configuration[$layer][$key] = $value; + return true; + } + + // }}} + // {{{ getType(key) + + /** + * Get the type of a config value. + * + * @param string config key + * + * @return string type, one of "string", "integer", "file", + * "directory", "set" or "password". + * + * @access public + * + */ + function getType($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['type']; + } + return false; + } + + // }}} + // {{{ getDocs(key) + + /** + * Get the documentation for a config value. + * + * @param string config key + * + * @return string documentation string + * + * @access public + * + */ + function getDocs($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['doc']; + } + return false; + } + // }}} + // {{{ getPrompt(key) + + /** + * Get the short documentation for a config value. + * + * @param string config key + * + * @return string short documentation string + * + * @access public + * + */ + function getPrompt($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['prompt']; + } + return false; + } + // }}} + // {{{ getGroup(key) + + /** + * Get the parameter group for a config key. + * + * @param string config key + * + * @return string parameter group + * + * @access public + * + */ + function getGroup($key) + { + if (isset($this->configuration_info[$key])) { + return $this->configuration_info[$key]['group']; + } + return false; + } + + // }}} + // {{{ getGroups() + + /** + * Get the list of parameter groups. + * + * @return array list of parameter groups + * + * @access public + * + */ + function getGroups() + { + $tmp = array(); + foreach ($this->configuration_info as $key => $info) { + $tmp[$info['group']] = 1; + } + return array_keys($tmp); + } + + // }}} + // {{{ getGroupKeys() + + /** + * Get the list of the parameters in a group. + * + * @param string $group parameter group + * + * @return array list of parameters in $group + * + * @access public + * + */ + function getGroupKeys($group) + { + $keys = array(); + foreach ($this->configuration_info as $key => $info) { + if ($info['group'] == $group) { + $keys[] = $key; + } + } + return $keys; + } + + // }}} + // {{{ getSetValues(key) + + /** + * Get the list of allowed set values for a config value. Returns + * NULL for config values that are not sets. + * + * @param string config key + * + * @return array enumerated array of set values, or NULL if the + * config key is unknown or not a set + * + * @access public + * + */ + function getSetValues($key) + { + if (isset($this->configuration_info[$key]) && + isset($this->configuration_info[$key]['type']) && + $this->configuration_info[$key]['type'] == 'set') + { + $valid_set = $this->configuration_info[$key]['valid_set']; + reset($valid_set); + if (key($valid_set) === 0) { + return $valid_set; + } + return array_keys($valid_set); + } + return false; + } + + // }}} + // {{{ getKeys() + + /** + * Get all the current config keys. + * + * @return array simple array of config keys + * + * @access public + */ + function getKeys() + { + $keys = array(); + foreach ($this->layers as $layer) { + $keys = array_merge($keys, $this->configuration[$layer]); + } + return array_keys($keys); + } + + // }}} + // {{{ remove(key, [layer]) + + /** + * Remove the a config key from a specific config layer. + * + * @param string config key + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function remove($key, $layer = 'user') + { + if (isset($this->configuration[$layer][$key])) { + unset($this->configuration[$layer][$key]); + return true; + } + return false; + } + + // }}} + // {{{ removeLayer(layer) + + /** + * Temporarily remove an entire config layer. USE WITH CARE! + * + * @param string config key + * + * @param string (optional) config layer + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function removeLayer($layer) + { + if (isset($this->configuration[$layer])) { + $this->configuration[$layer] = array(); + return true; + } + return false; + } + + // }}} + // {{{ store([layer]) + + /** + * Stores configuration data in a layer. + * + * @param string config layer to store + * + * @return bool TRUE on success, or PEAR error on failure + * + * @access public + */ + function store($layer = 'user', $data = null) + { + return $this->writeConfigFile(null, $layer, $data); + } + + // }}} + // {{{ toDefault(key) + + /** + * Unset the user-defined value of a config key, reverting the + * value to the system-defined one. + * + * @param string config key + * + * @return bool TRUE on success, FALSE on failure + * + * @access public + */ + function toDefault($key) + { + trigger_error("PEAR_Config::toDefault() deprecated, use PEAR_Config::remove() instead", E_USER_NOTICE); + return $this->remove($key, 'user'); + } + + // }}} + // {{{ definedBy(key) + + /** + * Tells what config layer that gets to define a key. + * + * @param string config key + * + * @return string the config layer, or an empty string if not found + * + * @access public + */ + function definedBy($key) + { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return $layer; + } + } + return ''; + } + + // }}} + // {{{ isDefaulted(key) + + /** + * Tells whether a config value has a system-defined value. + * + * @param string config key + * + * @return bool + * + * @access public + * + * @deprecated + */ + function isDefaulted($key) + { + trigger_error("PEAR_Config::isDefaulted() deprecated, use PEAR_Config::definedBy() instead", E_USER_NOTICE); + return $this->definedBy($key) == 'system'; + } + + // }}} + // {{{ isDefined(key) + + /** + * Tells whether a given key exists as a config value. + * + * @param string config key + * + * @return bool whether exists in this object + * + * @access public + */ + function isDefined($key) + { + foreach ($this->layers as $layer) { + if (isset($this->configuration[$layer][$key])) { + return true; + } + } + return false; + } + + // }}} + // {{{ isDefinedLayer(key) + + /** + * Tells whether a given config layer exists. + * + * @param string config layer + * + * @return bool whether exists in this object + * + * @access public + */ + function isDefinedLayer($layer) + { + return isset($this->configuration[$layer]); + } + + // }}} + // {{{ getLayers() + + /** + * Returns the layers defined (except the 'default' one) + * + * @return array of the defined layers + */ + function getLayers() + { + $cf = $this->configuration; + unset($cf['default']); + return array_keys($cf); + } + + // }}} +} + +?> diff --git a/includes/PEAR/Dependency.php b/includes/PEAR/Dependency.php new file mode 100644 index 0000000..705167a --- /dev/null +++ b/includes/PEAR/Dependency.php @@ -0,0 +1,487 @@ + | +// | Stig Bakken | +// +----------------------------------------------------------------------+ +// +// $Id: Dependency.php,v 1.36.4.1 2004/12/27 07:04:19 cellog Exp $ + +require_once "PEAR.php"; + +define('PEAR_DEPENDENCY_MISSING', -1); +define('PEAR_DEPENDENCY_CONFLICT', -2); +define('PEAR_DEPENDENCY_UPGRADE_MINOR', -3); +define('PEAR_DEPENDENCY_UPGRADE_MAJOR', -4); +define('PEAR_DEPENDENCY_BAD_DEPENDENCY', -5); +define('PEAR_DEPENDENCY_MISSING_OPTIONAL', -6); +define('PEAR_DEPENDENCY_CONFLICT_OPTIONAL', -7); +define('PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL', -8); +define('PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL', -9); + +/** + * Dependency check for PEAR packages + * + * The class is based on the dependency RFC that can be found at + * http://cvs.php.net/cvs.php/pearweb/rfc. It requires PHP >= 4.1 + * + * @author Tomas V.V.Vox + * @author Stig Bakken + */ +class PEAR_Dependency +{ + // {{{ constructor + /** + * Constructor + * + * @access public + * @param object Registry object + * @return void + */ + function PEAR_Dependency(&$registry) + { + $this->registry = &$registry; + } + + // }}} + // {{{ callCheckMethod() + + /** + * This method maps the XML dependency definition to the + * corresponding one from PEAR_Dependency + * + *
+    * $opts => Array
+    *    (
+    *        [type] => pkg
+    *        [rel] => ge
+    *        [version] => 3.4
+    *        [name] => HTML_Common
+    *        [optional] => false
+    *    )
+    * 
+ * + * @param string Error message + * @param array Options + * @return boolean + */ + function callCheckMethod(&$errmsg, $opts) + { + $rel = isset($opts['rel']) ? $opts['rel'] : 'has'; + $req = isset($opts['version']) ? $opts['version'] : null; + $name = isset($opts['name']) ? $opts['name'] : null; + $opt = (isset($opts['optional']) && $opts['optional'] == 'yes') ? + $opts['optional'] : null; + $errmsg = ''; + switch ($opts['type']) { + case 'pkg': + return $this->checkPackage($errmsg, $name, $req, $rel, $opt); + break; + case 'ext': + return $this->checkExtension($errmsg, $name, $req, $rel, $opt); + break; + case 'php': + return $this->checkPHP($errmsg, $req, $rel); + break; + case 'prog': + return $this->checkProgram($errmsg, $name); + break; + case 'os': + return $this->checkOS($errmsg, $name); + break; + case 'sapi': + return $this->checkSAPI($errmsg, $name); + break; + case 'zend': + return $this->checkZend($errmsg, $name); + break; + default: + return "'{$opts['type']}' dependency type not supported"; + } + } + + // }}} + // {{{ checkPackage() + + /** + * Package dependencies check method + * + * @param string $errmsg Empty string, it will be populated with an error message, if any + * @param string $name Name of the package to test + * @param string $req The package version required + * @param string $relation How to compare versions with each other + * @param bool $opt Whether the relationship is optional + * + * @return mixed bool false if no error or the error string + */ + function checkPackage(&$errmsg, $name, $req = null, $relation = 'has', + $opt = false) + { + if (is_string($req) && substr($req, 0, 2) == 'v.') { + $req = substr($req, 2); + } + switch ($relation) { + case 'has': + if (!$this->registry->packageExists($name)) { + if ($opt) { + $errmsg = "package `$name' is recommended to utilize some features."; + return PEAR_DEPENDENCY_MISSING_OPTIONAL; + } + $errmsg = "requires package `$name'"; + return PEAR_DEPENDENCY_MISSING; + } + return false; + case 'not': + if ($this->registry->packageExists($name)) { + $errmsg = "conflicts with package `$name'"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + case 'lt': + case 'le': + case 'eq': + case 'ne': + case 'ge': + case 'gt': + $version = $this->registry->packageInfo($name, 'version'); + if (!$this->registry->packageExists($name) + || !version_compare("$version", "$req", $relation)) + { + $code = $this->codeFromRelation($relation, $version, $req, $opt); + if ($opt) { + $errmsg = "package `$name' version " . $this->signOperator($relation) . + " $req is recommended to utilize some features."; + if ($version) { + $errmsg .= " Installed version is $version"; + } + return $code; + } + $errmsg = "requires package `$name' " . + $this->signOperator($relation) . " $req"; + return $code; + } + return false; + } + $errmsg = "relation '$relation' with requirement '$req' is not supported (name=$name)"; + return PEAR_DEPENDENCY_BAD_DEPENDENCY; + } + + // }}} + // {{{ checkPackageUninstall() + + /** + * Check package dependencies on uninstall + * + * @param string $error The resultant error string + * @param string $warning The resultant warning string + * @param string $name Name of the package to test + * + * @return bool true if there were errors + */ + function checkPackageUninstall(&$error, &$warning, $package) + { + $error = null; + $packages = $this->registry->listPackages(); + foreach ($packages as $pkg) { + if ($pkg == $package) { + continue; + } + $deps = $this->registry->packageInfo($pkg, 'release_deps'); + if (empty($deps)) { + continue; + } + foreach ($deps as $dep) { + if ($dep['type'] == 'pkg' && strcasecmp($dep['name'], $package) == 0) { + if ($dep['rel'] == 'ne' || $dep['rel'] == 'not') { + continue; + } + if (isset($dep['optional']) && $dep['optional'] == 'yes') { + $warning .= "\nWarning: Package '$pkg' optionally depends on '$package'"; + } else { + $error .= "Package '$pkg' depends on '$package'\n"; + } + } + } + } + return ($error) ? true : false; + } + + // }}} + // {{{ checkExtension() + + /** + * Extension dependencies check method + * + * @param string $name Name of the extension to test + * @param string $req_ext_ver Required extension version to compare with + * @param string $relation How to compare versions with eachother + * @param bool $opt Whether the relationship is optional + * + * @return mixed bool false if no error or the error string + */ + function checkExtension(&$errmsg, $name, $req = null, $relation = 'has', + $opt = false) + { + if ($relation == 'not') { + if (extension_loaded($name)) { + $errmsg = "conflicts with PHP extension '$name'"; + return PEAR_DEPENDENCY_CONFLICT; + } else { + return false; + } + } + + if (!extension_loaded($name)) { + if ($relation == 'not') { + return false; + } + if ($opt) { + $errmsg = "'$name' PHP extension is recommended to utilize some features"; + return PEAR_DEPENDENCY_MISSING_OPTIONAL; + } + $errmsg = "'$name' PHP extension is not installed"; + return PEAR_DEPENDENCY_MISSING; + } + if ($relation == 'has') { + return false; + } + $code = false; + if (is_string($req) && substr($req, 0, 2) == 'v.') { + $req = substr($req, 2); + } + $ext_ver = phpversion($name); + $operator = $relation; + // Force params to be strings, otherwise the comparation will fail (ex. 0.9==0.90) + if (!version_compare("$ext_ver", "$req", $operator)) { + $errmsg = "'$name' PHP extension version " . + $this->signOperator($operator) . " $req is required"; + $code = $this->codeFromRelation($relation, $ext_ver, $req, $opt); + if ($opt) { + $errmsg = "'$name' PHP extension version " . $this->signOperator($operator) . + " $req is recommended to utilize some features"; + return $code; + } + } + return $code; + } + + // }}} + // {{{ checkOS() + + /** + * Operating system dependencies check method + * + * @param string $os Name of the operating system + * + * @return mixed bool false if no error or the error string + */ + function checkOS(&$errmsg, $os) + { + // XXX Fixme: Implement a more flexible way, like + // comma separated values or something similar to PEAR_OS + static $myos; + if (empty($myos)) { + include_once "OS/Guess.php"; + $myos = new OS_Guess(); + } + // only 'has' relation is currently supported + if ($myos->matchSignature($os)) { + return false; + } + $errmsg = "'$os' operating system not supported"; + return PEAR_DEPENDENCY_CONFLICT; + } + + // }}} + // {{{ checkPHP() + + /** + * PHP version check method + * + * @param string $req which version to compare + * @param string $relation how to compare the version + * + * @return mixed bool false if no error or the error string + */ + function checkPHP(&$errmsg, $req, $relation = 'ge') + { + // this would be a bit stupid, but oh well :) + if ($relation == 'has') { + return false; + } + if ($relation == 'not') { + $errmsg = 'Invalid dependency - "not" is not allowed for php dependencies, ' . + 'php cannot conflict with itself'; + return PEAR_DEPENDENCY_BAD_DEPENDENCY; + } + if (substr($req, 0, 2) == 'v.') { + $req = substr($req,2, strlen($req) - 2); + } + $php_ver = phpversion(); + $operator = $relation; + if (!version_compare("$php_ver", "$req", $operator)) { + $errmsg = "PHP version " . $this->signOperator($operator) . + " $req is required"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + } + + // }}} + // {{{ checkProgram() + + /** + * External program check method. Looks for executable files in + * directories listed in the PATH environment variable. + * + * @param string $program which program to look for + * + * @return mixed bool false if no error or the error string + */ + function checkProgram(&$errmsg, $program) + { + // XXX FIXME honor safe mode + $exe_suffix = OS_WINDOWS ? '.exe' : ''; + $path_elements = explode(PATH_SEPARATOR, getenv('PATH')); + foreach ($path_elements as $dir) { + $file = $dir . DIRECTORY_SEPARATOR . $program . $exe_suffix; + if (@file_exists($file) && @is_executable($file)) { + return false; + } + } + $errmsg = "'$program' program is not present in the PATH"; + return PEAR_DEPENDENCY_MISSING; + } + + // }}} + // {{{ checkSAPI() + + /** + * SAPI backend check method. Version comparison is not yet + * available here. + * + * @param string $name name of SAPI backend + * @param string $req which version to compare + * @param string $relation how to compare versions (currently + * hardcoded to 'has') + * @return mixed bool false if no error or the error string + */ + function checkSAPI(&$errmsg, $name, $req = null, $relation = 'has') + { + // XXX Fixme: There is no way to know if the user has or + // not other SAPI backends installed than the installer one + + $sapi_backend = php_sapi_name(); + // Version comparisons not supported, sapi backends don't have + // version information yet. + if ($sapi_backend == $name) { + return false; + } + $errmsg = "'$sapi_backend' SAPI backend not supported"; + return PEAR_DEPENDENCY_CONFLICT; + } + + // }}} + // {{{ checkZend() + + /** + * Zend version check method + * + * @param string $req which version to compare + * @param string $relation how to compare the version + * + * @return mixed bool false if no error or the error string + */ + function checkZend(&$errmsg, $req, $relation = 'ge') + { + if (substr($req, 0, 2) == 'v.') { + $req = substr($req,2, strlen($req) - 2); + } + $zend_ver = zend_version(); + $operator = substr($relation,0,2); + if (!version_compare("$zend_ver", "$req", $operator)) { + $errmsg = "Zend version " . $this->signOperator($operator) . + " $req is required"; + return PEAR_DEPENDENCY_CONFLICT; + } + return false; + } + + // }}} + // {{{ signOperator() + + /** + * Converts text comparing operators to them sign equivalents + * + * Example: 'ge' to '>=' + * + * @access public + * @param string Operator + * @return string Sign equivalent + */ + function signOperator($operator) + { + switch($operator) { + case 'lt': return '<'; + case 'le': return '<='; + case 'gt': return '>'; + case 'ge': return '>='; + case 'eq': return '=='; + case 'ne': return '!='; + default: + return $operator; + } + } + + // }}} + // {{{ codeFromRelation() + + /** + * Convert relation into corresponding code + * + * @access public + * @param string Relation + * @param string Version + * @param string Requirement + * @param bool Optional dependency indicator + * @return integer + */ + function codeFromRelation($relation, $version, $req, $opt = false) + { + $code = PEAR_DEPENDENCY_BAD_DEPENDENCY; + switch ($relation) { + case 'gt': case 'ge': case 'eq': + // upgrade + $have_major = preg_replace('/\D.*/', '', $version); + $need_major = preg_replace('/\D.*/', '', $req); + if ($need_major > $have_major) { + $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MAJOR_OPTIONAL : + PEAR_DEPENDENCY_UPGRADE_MAJOR; + } else { + $code = $opt ? PEAR_DEPENDENCY_UPGRADE_MINOR_OPTIONAL : + PEAR_DEPENDENCY_UPGRADE_MINOR; + } + break; + case 'lt': case 'le': case 'ne': + $code = $opt ? PEAR_DEPENDENCY_CONFLICT_OPTIONAL : + PEAR_DEPENDENCY_CONFLICT; + break; + } + return $code; + } + + // }}} +} +?> diff --git a/includes/PEAR/Downloader.php b/includes/PEAR/Downloader.php new file mode 100644 index 0000000..5e16dc5 --- /dev/null +++ b/includes/PEAR/Downloader.php @@ -0,0 +1,680 @@ + | +// | Tomas V.V.Cox | +// | Martin Jansen | +// +----------------------------------------------------------------------+ +// +// $Id: Downloader.php,v 1.17.2.1 2004/10/22 22:54:03 cellog Exp $ + +require_once 'PEAR/Common.php'; +require_once 'PEAR/Registry.php'; +require_once 'PEAR/Dependency.php'; +require_once 'PEAR/Remote.php'; +require_once 'System.php'; + + +define('PEAR_INSTALLER_OK', 1); +define('PEAR_INSTALLER_FAILED', 0); +define('PEAR_INSTALLER_SKIPPED', -1); +define('PEAR_INSTALLER_ERROR_NO_PREF_STATE', 2); + +/** + * Administration class used to download PEAR packages and maintain the + * installed package database. + * + * @since PEAR 1.4 + * @author Greg Beaver + */ +class PEAR_Downloader extends PEAR_Common +{ + /** + * @var PEAR_Config + * @access private + */ + var $_config; + + /** + * @var PEAR_Registry + * @access private + */ + var $_registry; + + /** + * @var PEAR_Remote + * @access private + */ + var $_remote; + + /** + * Preferred Installation State (snapshot, devel, alpha, beta, stable) + * @var string|null + * @access private + */ + var $_preferredState; + + /** + * Options from command-line passed to Install. + * + * Recognized options:
+ * - onlyreqdeps : install all required dependencies as well + * - alldeps : install all dependencies, including optional + * - installroot : base relative path to install files in + * - force : force a download even if warnings would prevent it + * @see PEAR_Command_Install + * @access private + * @var array + */ + var $_options; + + /** + * Downloaded Packages after a call to download(). + * + * Format of each entry: + * + * + * array('pkg' => 'package_name', 'file' => '/path/to/local/file', + * 'info' => array() // parsed package.xml + * ); + * + * @access private + * @var array + */ + var $_downloadedPackages = array(); + + /** + * Packages slated for download. + * + * This is used to prevent downloading a package more than once should it be a dependency + * for two packages to be installed. + * Format of each entry: + * + *
+     * array('package_name1' => parsed package.xml, 'package_name2' => parsed package.xml,
+     * );
+     * 
+ * @access private + * @var array + */ + var $_toDownload = array(); + + /** + * Array of every package installed, with names lower-cased. + * + * Format: + * + * array('package1' => 0, 'package2' => 1, ); + * + * @var array + */ + var $_installed = array(); + + /** + * @var array + * @access private + */ + var $_errorStack = array(); + + // {{{ PEAR_Downloader() + + function PEAR_Downloader(&$ui, $options, &$config) + { + $this->_options = $options; + $this->_config = &$config; + $this->_preferredState = $this->_config->get('preferred_state'); + $this->ui = &$ui; + if (!$this->_preferredState) { + // don't inadvertantly use a non-set preferred_state + $this->_preferredState = null; + } + + $php_dir = $this->_config->get('php_dir'); + if (isset($this->_options['installroot'])) { + if (substr($this->_options['installroot'], -1) == DIRECTORY_SEPARATOR) { + $this->_options['installroot'] = substr($this->_options['installroot'], 0, -1); + } + $php_dir = $this->_prependPath($php_dir, $this->_options['installroot']); + } + $this->_registry = &new PEAR_Registry($php_dir); + $this->_remote = &new PEAR_Remote($config); + + if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { + $this->_installed = $this->_registry->listPackages(); + array_walk($this->_installed, create_function('&$v,$k','$v = strtolower($v);')); + $this->_installed = array_flip($this->_installed); + } + parent::PEAR_Common(); + } + + // }}} + // {{{ configSet() + function configSet($key, $value, $layer = 'user') + { + $this->_config->set($key, $value, $layer); + $this->_preferredState = $this->_config->get('preferred_state'); + if (!$this->_preferredState) { + // don't inadvertantly use a non-set preferred_state + $this->_preferredState = null; + } + } + + // }}} + // {{{ setOptions() + function setOptions($options) + { + $this->_options = $options; + } + + // }}} + // {{{ _downloadFile() + /** + * @param string filename to download + * @param string version/state + * @param string original value passed to command-line + * @param string|null preferred state (snapshot/devel/alpha/beta/stable) + * Defaults to configuration preferred state + * @return null|PEAR_Error|string + * @access private + */ + function _downloadFile($pkgfile, $version, $origpkgfile, $state = null) + { + if (is_null($state)) { + $state = $this->_preferredState; + } + // {{{ check the package filename, and whether it's already installed + $need_download = false; + if (preg_match('#^(http|ftp)://#', $pkgfile)) { + $need_download = true; + } elseif (!@is_file($pkgfile)) { + if ($this->validPackageName($pkgfile)) { + if ($this->_registry->packageExists($pkgfile)) { + if (empty($this->_options['upgrade']) && empty($this->_options['force'])) { + $errors[] = "$pkgfile already installed"; + return; + } + } + $pkgfile = $this->getPackageDownloadUrl($pkgfile, $version); + $need_download = true; + } else { + if (strlen($pkgfile)) { + $errors[] = "Could not open the package file: $pkgfile"; + } else { + $errors[] = "No package file given"; + } + return; + } + } + // }}} + + // {{{ Download package ----------------------------------------------- + if ($need_download) { + $downloaddir = $this->_config->get('download_dir'); + if (empty($downloaddir)) { + if (PEAR::isError($downloaddir = System::mktemp('-d'))) { + return $downloaddir; + } + $this->log(3, '+ tmp dir created at ' . $downloaddir); + } + $callback = $this->ui ? array(&$this, '_downloadCallback') : null; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $file = $this->downloadHttp($pkgfile, $this->ui, $downloaddir, $callback); + $this->popErrorHandling(); + if (PEAR::isError($file)) { + if ($this->validPackageName($origpkgfile)) { + if (!PEAR::isError($info = $this->_remote->call('package.info', + $origpkgfile))) { + if (!count($info['releases'])) { + return $this->raiseError('Package ' . $origpkgfile . + ' has no releases'); + } else { + return $this->raiseError('No releases of preferred state "' + . $state . '" exist for package ' . $origpkgfile . + '. Use ' . $origpkgfile . '-state to install another' . + ' state (like ' . $origpkgfile .'-beta)', + PEAR_INSTALLER_ERROR_NO_PREF_STATE); + } + } else { + return $pkgfile; + } + } else { + return $this->raiseError($file); + } + } + $pkgfile = $file; + } + // }}} + return $pkgfile; + } + // }}} + // {{{ getPackageDownloadUrl() + + function getPackageDownloadUrl($package, $version = null) + { + if ($version) { + $package .= "-$version"; + } + if ($this === null || $this->_config === null) { + $package = "http://pear.php.net/get/$package"; + } else { + $package = "http://" . $this->_config->get('master_server') . + "/get/$package"; + } + if (!extension_loaded("zlib")) { + $package .= '?uncompress=yes'; + } + return $package; + } + + // }}} + // {{{ extractDownloadFileName($pkgfile, &$version) + + function extractDownloadFileName($pkgfile, &$version) + { + if (@is_file($pkgfile)) { + return $pkgfile; + } + // regex defined in Common.php + if (preg_match(PEAR_COMMON_PACKAGE_DOWNLOAD_PREG, $pkgfile, $m)) { + $version = (isset($m[3])) ? $m[3] : null; + return $m[1]; + } + $version = null; + return $pkgfile; + } + + // }}} + + // }}} + // {{{ getDownloadedPackages() + + /** + * Retrieve a list of downloaded packages after a call to {@link download()}. + * + * Also resets the list of downloaded packages. + * @return array + */ + function getDownloadedPackages() + { + $ret = $this->_downloadedPackages; + $this->_downloadedPackages = array(); + $this->_toDownload = array(); + return $ret; + } + + // }}} + // {{{ download() + + /** + * Download any files and their dependencies, if necessary + * + * BC-compatible method name + * @param array a mixed list of package names, local files, or package.xml + */ + function download($packages) + { + return $this->doDownload($packages); + } + + // }}} + // {{{ doDownload() + + /** + * Download any files and their dependencies, if necessary + * + * @param array a mixed list of package names, local files, or package.xml + */ + function doDownload($packages) + { + $mywillinstall = array(); + $state = $this->_preferredState; + + // {{{ download files in this list if necessary + foreach($packages as $pkgfile) { + $need_download = false; + if (!is_file($pkgfile)) { + if (preg_match('#^(http|ftp)://#', $pkgfile)) { + $need_download = true; + } + $pkgfile = $this->_downloadNonFile($pkgfile); + if (PEAR::isError($pkgfile)) { + return $pkgfile; + } + if ($pkgfile === false) { + continue; + } + } // end is_file() + + $tempinfo = $this->infoFromAny($pkgfile); + if ($need_download) { + $this->_toDownload[] = $tempinfo['package']; + } + if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { + // ignore dependencies if there are any errors + if (!PEAR::isError($tempinfo)) { + $mywillinstall[strtolower($tempinfo['package'])] = @$tempinfo['release_deps']; + } + } + $this->_downloadedPackages[] = array('pkg' => $tempinfo['package'], + 'file' => $pkgfile, 'info' => $tempinfo); + } // end foreach($packages) + // }}} + + // {{{ extract dependencies from downloaded files and then download + // them if necessary + if (isset($this->_options['alldeps']) || isset($this->_options['onlyreqdeps'])) { + $deppackages = array(); + foreach ($mywillinstall as $package => $alldeps) { + if (!is_array($alldeps)) { + // there are no dependencies + continue; + } + $fail = false; + foreach ($alldeps as $info) { + if ($info['type'] != 'pkg') { + continue; + } + $ret = $this->_processDependency($package, $info, $mywillinstall); + if ($ret === false) { + continue; + } + if ($ret === 0) { + $fail = true; + continue; + } + if (PEAR::isError($ret)) { + return $ret; + } + $deppackages[] = $ret; + } // foreach($alldeps + if ($fail) { + $deppackages = array(); + } + } + + if (count($deppackages)) { + $this->doDownload($deppackages); + } + } // }}} if --alldeps or --onlyreqdeps + } + + // }}} + // {{{ _downloadNonFile($pkgfile) + + /** + * @return false|PEAR_Error|string false if loop should be broken out of, + * string if the file was downloaded, + * PEAR_Error on exception + * @access private + */ + function _downloadNonFile($pkgfile) + { + $origpkgfile = $pkgfile; + $state = null; + $pkgfile = $this->extractDownloadFileName($pkgfile, $version); + if (preg_match('#^(http|ftp)://#', $pkgfile)) { + return $this->_downloadFile($pkgfile, $version, $origpkgfile); + } + if (!$this->validPackageName($pkgfile)) { + return $this->raiseError("Package name '$pkgfile' not valid"); + } + // ignore packages that are installed unless we are upgrading + $curinfo = $this->_registry->packageInfo($pkgfile); + if ($this->_registry->packageExists($pkgfile) + && empty($this->_options['upgrade']) && empty($this->_options['force'])) { + $this->log(0, "Package '{$curinfo['package']}' already installed, skipping"); + return false; + } + if (in_array($pkgfile, $this->_toDownload)) { + return false; + } + $releases = $this->_remote->call('package.info', $pkgfile, 'releases', true); + if (!count($releases)) { + return $this->raiseError("No releases found for package '$pkgfile'"); + } + // Want a specific version/state + if ($version !== null) { + // Passed Foo-1.2 + if ($this->validPackageVersion($version)) { + if (!isset($releases[$version])) { + return $this->raiseError("No release with version '$version' found for '$pkgfile'"); + } + // Passed Foo-alpha + } elseif (in_array($version, $this->getReleaseStates())) { + $state = $version; + $version = 0; + foreach ($releases as $ver => $inf) { + if ($inf['state'] == $state && version_compare("$version", "$ver") < 0) { + $version = $ver; + break; + } + } + if ($version == 0) { + return $this->raiseError("No release with state '$state' found for '$pkgfile'"); + } + // invalid suffix passed + } else { + return $this->raiseError("Invalid suffix '-$version', be sure to pass a valid PEAR ". + "version number or release state"); + } + // Guess what to download + } else { + $states = $this->betterStates($this->_preferredState, true); + $possible = false; + $version = 0; + $higher_version = 0; + $prev_hi_ver = 0; + foreach ($releases as $ver => $inf) { + if (in_array($inf['state'], $states) && version_compare("$version", "$ver") < 0) { + $version = $ver; + break; + } else { + $ver = (string)$ver; + if (version_compare($prev_hi_ver, $ver) < 0) { + $prev_hi_ver = $higher_version = $ver; + } + } + } + if ($version === 0 && !isset($this->_options['force'])) { + return $this->raiseError('No release with state equal to: \'' . implode(', ', $states) . + "' found for '$pkgfile'"); + } elseif ($version === 0) { + $this->log(0, "Warning: $pkgfile is state '" . $releases[$higher_version]['state'] . "' which is less stable " . + "than state '$this->_preferredState'"); + } + } + // Check if we haven't already the version + if (empty($this->_options['force']) && !is_null($curinfo)) { + if ($curinfo['version'] == $version) { + $this->log(0, "Package '{$curinfo['package']}-{$curinfo['version']}' already installed, skipping"); + return false; + } elseif (version_compare("$version", "{$curinfo['version']}") < 0) { + $this->log(0, "Package '{$curinfo['package']}' version '{$curinfo['version']}' " . + " is installed and {$curinfo['version']} is > requested '$version', skipping"); + return false; + } + } + $this->_toDownload[] = $pkgfile; + return $this->_downloadFile($pkgfile, $version, $origpkgfile, $state); + } + + // }}} + // {{{ _processDependency($package, $info, $mywillinstall) + + /** + * Process a dependency, download if necessary + * @param array dependency information from PEAR_Remote call + * @param array packages that will be installed in this iteration + * @return false|string|PEAR_Error + * @access private + * @todo Add test for relation 'lt'/'le' -> make sure that the dependency requested is + * in fact lower than the required value. This will be very important for BC dependencies + */ + function _processDependency($package, $info, $mywillinstall) + { + $state = $this->_preferredState; + if (!isset($this->_options['alldeps']) && isset($info['optional']) && + $info['optional'] == 'yes') { + // skip optional deps + $this->log(0, "skipping Package '$package' optional dependency '$info[name]'"); + return false; + } + // {{{ get releases + $releases = $this->_remote->call('package.info', $info['name'], 'releases', true); + if (PEAR::isError($releases)) { + return $releases; + } + if (!count($releases)) { + if (!isset($this->_installed[strtolower($info['name'])])) { + $this->pushError("Package '$package' dependency '$info[name]' ". + "has no releases"); + } + return false; + } + $found = false; + $save = $releases; + while(count($releases) && !$found) { + if (!empty($state) && $state != 'any') { + list($release_version, $release) = each($releases); + if ($state != $release['state'] && + !in_array($release['state'], $this->betterStates($state))) + { + // drop this release - it ain't stable enough + array_shift($releases); + } else { + $found = true; + } + } else { + $found = true; + } + } + if (!count($releases) && !$found) { + $get = array(); + foreach($save as $release) { + $get = array_merge($get, + $this->betterStates($release['state'], true)); + } + $savestate = array_shift($get); + $this->pushError( "Release for '$package' dependency '$info[name]' " . + "has state '$savestate', requires '$state'"); + return 0; + } + if (in_array(strtolower($info['name']), $this->_toDownload) || + isset($mywillinstall[strtolower($info['name'])])) { + // skip upgrade check for packages we will install + return false; + } + if (!isset($this->_installed[strtolower($info['name'])])) { + // check to see if we can install the specific version required + if ($info['rel'] == 'eq') { + return $info['name'] . '-' . $info['version']; + } + // skip upgrade check for packages we don't have installed + return $info['name']; + } + // }}} + + // {{{ see if a dependency must be upgraded + $inst_version = $this->_registry->packageInfo($info['name'], 'version'); + if (!isset($info['version'])) { + // this is a rel='has' dependency, check against latest + if (version_compare($release_version, $inst_version, 'le')) { + return false; + } else { + return $info['name']; + } + } + if (version_compare($info['version'], $inst_version, 'le')) { + // installed version is up-to-date + return false; + } + return $info['name']; + } + + // }}} + // {{{ _downloadCallback() + + function _downloadCallback($msg, $params = null) + { + switch ($msg) { + case 'saveas': + $this->log(1, "downloading $params ..."); + break; + case 'done': + $this->log(1, '...done: ' . number_format($params, 0, '', ',') . ' bytes'); + break; + case 'bytesread': + static $bytes; + if (empty($bytes)) { + $bytes = 0; + } + if (!($bytes % 10240)) { + $this->log(1, '.', false); + } + $bytes += $params; + break; + case 'start': + $this->log(1, "Starting to download {$params[0]} (".number_format($params[1], 0, '', ',')." bytes)"); + break; + } + if (method_exists($this->ui, '_downloadCallback')) + $this->ui->_downloadCallback($msg, $params); + } + + // }}} + // {{{ _prependPath($path, $prepend) + + function _prependPath($path, $prepend) + { + if (strlen($prepend) > 0) { + if (OS_WINDOWS && preg_match('/^[a-z]:/i', $path)) { + $path = $prepend . substr($path, 2); + } else { + $path = $prepend . $path; + } + } + return $path; + } + // }}} + // {{{ pushError($errmsg, $code) + + /** + * @param string + * @param integer + */ + function pushError($errmsg, $code = -1) + { + array_push($this->_errorStack, array($errmsg, $code)); + } + + // }}} + // {{{ getErrorMsgs() + + function getErrorMsgs() + { + $msgs = array(); + $errs = $this->_errorStack; + foreach ($errs as $err) { + $msgs[] = $err[0]; + } + $this->_errorStack = array(); + return $msgs; + } + + // }}} +} +// }}} + +?> diff --git a/includes/PEAR/ErrorStack.php b/includes/PEAR/ErrorStack.php new file mode 100644 index 0000000..da52f08 --- /dev/null +++ b/includes/PEAR/ErrorStack.php @@ -0,0 +1,981 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: ErrorStack.php,v 1.7.2.5 2005/01/01 21:26:51 cellog Exp $ + +/** + * Error Stack Implementation + * + * This is an incredibly simple implementation of a very complex error handling + * facility. It contains the ability + * to track multiple errors from multiple packages simultaneously. In addition, + * it can track errors of many levels, save data along with the error, context + * information such as the exact file, line number, class and function that + * generated the error, and if necessary, it can raise a traditional PEAR_Error. + * It has built-in support for PEAR::Log, to log errors as they occur + * + * Since version 0.2alpha, it is also possible to selectively ignore errors, + * through the use of an error callback, see {@link pushCallback()} + * + * Since version 0.3alpha, it is possible to specify the exception class + * returned from {@link push()} + * + * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class. This can + * still be done quite handily in an error callback or by manipulating the returned array + * @author Greg Beaver + * @version PEAR1.3.2 (beta) + * @package PEAR_ErrorStack + * @category Debugging + * @license http://www.php.net/license/3_0.txt PHP License v3.0 + */ + +/** + * Singleton storage + * + * Format: + *
+ * array(
+ *  'package1' => PEAR_ErrorStack object,
+ *  'package2' => PEAR_ErrorStack object,
+ *  ...
+ * )
+ * 
+ * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] + */ +$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array(); + +/** + * Global error callback (default) + * + * This is only used if set to non-false. * is the default callback for + * all packages, whereas specific packages may set a default callback + * for all instances, regardless of whether they are a singleton or not. + * + * To exclude non-singletons, only set the local callback for the singleton + * @see PEAR_ErrorStack::setDefaultCallback() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] + */ +$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array( + '*' => false, +); + +/** + * Global Log object (default) + * + * This is only used if set to non-false. Use to set a default log object for + * all stacks, regardless of instantiation order or location + * @see PEAR_ErrorStack::setDefaultLogger() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] + */ +$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false; + +/** + * Global Overriding Callback + * + * This callback will override any error callbacks that specific loggers have set. + * Use with EXTREME caution + * @see PEAR_ErrorStack::staticPushCallback() + * @access private + * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] + */ +$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); + +/**#@+ + * One of four possible return values from the error Callback + * @see PEAR_ErrorStack::_errorCallback() + */ +/** + * If this is returned, then the error will be both pushed onto the stack + * and logged. + */ +define('PEAR_ERRORSTACK_PUSHANDLOG', 1); +/** + * If this is returned, then the error will only be pushed onto the stack, + * and not logged. + */ +define('PEAR_ERRORSTACK_PUSH', 2); +/** + * If this is returned, then the error will only be logged, but not pushed + * onto the error stack. + */ +define('PEAR_ERRORSTACK_LOG', 3); +/** + * If this is returned, then the error is completely ignored. + */ +define('PEAR_ERRORSTACK_IGNORE', 4); +/** + * If this is returned, then the error is logged and die() is called. + */ +define('PEAR_ERRORSTACK_DIE', 5); +/**#@-*/ + +/** + * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in + * the singleton method. + */ +define('PEAR_ERRORSTACK_ERR_NONCLASS', 1); + +/** + * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()} + * that has no __toString() method + */ +define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2); +/** + * Error Stack Implementation + * + * Usage: + * + * // global error stack + * $global_stack = &PEAR_ErrorStack::singleton('MyPackage'); + * // local error stack + * $local_stack = new PEAR_ErrorStack('MyPackage'); + * + * @copyright 2004 Gregory Beaver + * @package PEAR_ErrorStack + * @license http://www.php.net/license/3_0.txt PHP License + */ +class PEAR_ErrorStack { + /** + * Errors are stored in the order that they are pushed on the stack. + * @since 0.4alpha Errors are no longer organized by error level. + * This renders pop() nearly unusable, and levels could be more easily + * handled in a callback anyway + * @var array + * @access private + */ + var $_errors = array(); + + /** + * Storage of errors by level. + * + * Allows easy retrieval and deletion of only errors from a particular level + * @since PEAR 1.4.0dev + * @var array + * @access private + */ + var $_errorsByLevel = array(); + + /** + * Package name this error stack represents + * @var string + * @access protected + */ + var $_package; + + /** + * Determines whether a PEAR_Error is thrown upon every error addition + * @var boolean + * @access private + */ + var $_compat = false; + + /** + * If set to a valid callback, this will be used to generate the error + * message from the error code, otherwise the message passed in will be + * used + * @var false|string|array + * @access private + */ + var $_msgCallback = false; + + /** + * If set to a valid callback, this will be used to generate the error + * context for an error. For PHP-related errors, this will be a file + * and line number as retrieved from debug_backtrace(), but can be + * customized for other purposes. The error might actually be in a separate + * configuration file, or in a database query. + * @var false|string|array + * @access protected + */ + var $_contextCallback = false; + + /** + * If set to a valid callback, this will be called every time an error + * is pushed onto the stack. The return value will be used to determine + * whether to allow an error to be pushed or logged. + * + * The return value must be one an PEAR_ERRORSTACK_* constant + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @var false|string|array + * @access protected + */ + var $_errorCallback = array(); + + /** + * PEAR::Log object for logging errors + * @var false|Log + * @access protected + */ + var $_logger = false; + + /** + * Error messages - designed to be overridden + * @var array + * @abstract + */ + var $_errorMsgs = array(); + + /** + * Set up a new error stack + * + * @param string $package name of the package this error stack represents + * @param callback $msgCallback callback used for error message generation + * @param callback $contextCallback callback used for context generation, + * defaults to {@link getFileLine()} + * @param boolean $throwPEAR_Error + */ + function PEAR_ErrorStack($package, $msgCallback = false, $contextCallback = false, + $throwPEAR_Error = false) + { + $this->_package = $package; + $this->setMessageCallback($msgCallback); + $this->setContextCallback($contextCallback); + $this->_compat = $throwPEAR_Error; + } + + /** + * Return a single error stack for this package. + * + * Note that all parameters are ignored if the stack for package $package + * has already been instantiated + * @param string $package name of the package this error stack represents + * @param callback $msgCallback callback used for error message generation + * @param callback $contextCallback callback used for context generation, + * defaults to {@link getFileLine()} + * @param boolean $throwPEAR_Error + * @param string $stackClass class to instantiate + * @static + * @return PEAR_ErrorStack + */ + function &singleton($package, $msgCallback = false, $contextCallback = false, + $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack') + { + if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]; + } + if (!class_exists($stackClass)) { + if (function_exists('debug_backtrace')) { + $trace = debug_backtrace(); + } + PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS, + 'exception', array('stackclass' => $stackClass), + 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)', + false, $trace); + } + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] = + &new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error); + } + + /** + * Internal error handler for PEAR_ErrorStack class + * + * Dies if the error is an exception (and would have died anyway) + * @access private + */ + function _handleError($err) + { + if ($err['level'] == 'exception') { + $message = $err['message']; + if (isset($_SERVER['REQUEST_URI'])) { + echo '
'; + } else { + echo "\n"; + } + var_dump($err['context']); + die($message); + } + } + + /** + * Set up a PEAR::Log object for all error stacks that don't have one + * @param Log $log + * @static + */ + function setDefaultLogger(&$log) + { + if (is_object($log) && method_exists($log, 'log') ) { + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; + } elseif (is_callable($log)) { + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log; + } + } + + /** + * Set up a PEAR::Log object for this error stack + * @param Log $log + */ + function setLogger(&$log) + { + if (is_object($log) && method_exists($log, 'log') ) { + $this->_logger = &$log; + } elseif (is_callable($log)) { + $this->_logger = &$log; + } + } + + /** + * Set an error code => error message mapping callback + * + * This method sets the callback that can be used to generate error + * messages for any instance + * @param array|string Callback function/method + */ + function setMessageCallback($msgCallback) + { + if (!$msgCallback) { + $this->_msgCallback = array(&$this, 'getErrorMessage'); + } else { + if (is_callable($msgCallback)) { + $this->_msgCallback = $msgCallback; + } + } + } + + /** + * Get an error code => error message mapping callback + * + * This method returns the current callback that can be used to generate error + * messages + * @return array|string|false Callback function/method or false if none + */ + function getMessageCallback() + { + return $this->_msgCallback; + } + + /** + * Sets a default callback to be used by all error stacks + * + * This method sets the callback that can be used to generate error + * messages for a singleton + * @param array|string Callback function/method + * @param string Package name, or false for all packages + * @static + */ + function setDefaultCallback($callback = false, $package = false) + { + if (!is_callable($callback)) { + $callback = false; + } + $package = $package ? $package : '*'; + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback; + } + + /** + * Set a callback that generates context information (location of error) for an error stack + * + * This method sets the callback that can be used to generate context + * information for an error. Passing in NULL will disable context generation + * and remove the expensive call to debug_backtrace() + * @param array|string|null Callback function/method + */ + function setContextCallback($contextCallback) + { + if ($contextCallback === null) { + return $this->_contextCallback = false; + } + if (!$contextCallback) { + $this->_contextCallback = array(&$this, 'getFileLine'); + } else { + if (is_callable($contextCallback)) { + $this->_contextCallback = $contextCallback; + } + } + } + + /** + * Set an error Callback + * If set to a valid callback, this will be called every time an error + * is pushed onto the stack. The return value will be used to determine + * whether to allow an error to be pushed or logged. + * + * The return value must be one of the ERRORSTACK_* constants. + * + * This functionality can be used to emulate PEAR's pushErrorHandling, and + * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of + * the error stack or logging + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @see popCallback() + * @param string|array $cb + */ + function pushCallback($cb) + { + array_push($this->_errorCallback, $cb); + } + + /** + * Remove a callback from the error callback stack + * @see pushCallback() + * @return array|string|false + */ + function popCallback() + { + if (!count($this->_errorCallback)) { + return false; + } + return array_pop($this->_errorCallback); + } + + /** + * Set a temporary overriding error callback for every package error stack + * + * Use this to temporarily disable all existing callbacks (can be used + * to emulate the @ operator, for instance) + * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG + * @see staticPopCallback(), pushCallback() + * @param string|array $cb + * @static + */ + function staticPushCallback($cb) + { + array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb); + } + + /** + * Remove a temporary overriding error callback + * @see staticPushCallback() + * @return array|string|false + * @static + */ + function staticPopCallback() + { + $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']); + if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) { + $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array(); + } + return $ret; + } + + /** + * Add an error to the stack + * + * If the message generator exists, it is called with 2 parameters. + * - the current Error Stack object + * - an array that is in the same format as an error. Available indices + * are 'code', 'package', 'time', 'params', 'level', and 'context' + * + * Next, if the error should contain context information, this is + * handled by the context grabbing method. + * Finally, the error is pushed onto the proper error stack + * @param int $code Package-specific error code + * @param string $level Error level. This is NOT spell-checked + * @param array $params associative array of error parameters + * @param string $msg Error message, or a portion of it if the message + * is to be generated + * @param array $repackage If this error re-packages an error pushed by + * another package, place the array returned from + * {@link pop()} in this parameter + * @param array $backtrace Protected parameter: use this to pass in the + * {@link debug_backtrace()} that should be used + * to find error context + * @return PEAR_Error|array|Exception + * if compatibility mode is on, a PEAR_Error is also + * thrown. If the class Exception exists, then one + * is returned to allow code like: + * + * throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob'))); + * + * + * The errorData property of the exception class will be set to the array + * that would normally be returned. If a PEAR_Error is returned, the userinfo + * property is set to the array + * + * Otherwise, an array is returned in this format: + * + * array( + * 'code' => $code, + * 'params' => $params, + * 'package' => $this->_package, + * 'level' => $level, + * 'time' => time(), + * 'context' => $context, + * 'message' => $msg, + * //['repackage' => $err] repackaged error array/Exception class + * ); + * + */ + function push($code, $level = 'error', $params = array(), $msg = false, + $repackage = false, $backtrace = false) + { + $context = false; + // grab error context + if ($this->_contextCallback) { + if (!$backtrace) { + $backtrace = debug_backtrace(); + } + $context = call_user_func($this->_contextCallback, $code, $params, $backtrace); + } + + // save error + $time = explode(' ', microtime()); + $time = $time[1] + $time[0]; + $err = array( + 'code' => $code, + 'params' => $params, + 'package' => $this->_package, + 'level' => $level, + 'time' => $time, + 'context' => $context, + 'message' => $msg, + ); + + // set up the error message, if necessary + if ($this->_msgCallback) { + $msg = call_user_func_array($this->_msgCallback, + array(&$this, $err)); + $err['message'] = $msg; + } + + if ($repackage) { + $err['repackage'] = $repackage; + } + $push = $log = true; + $die = false; + // try the overriding callback first + $callback = $this->staticPopCallback(); + if ($callback) { + $this->staticPushCallback($callback); + } + if (!is_callable($callback)) { + // try the local callback next + $callback = $this->popCallback(); + if (is_callable($callback)) { + $this->pushCallback($callback); + } else { + // try the default callback + $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ? + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] : + $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*']; + } + } + if (is_callable($callback)) { + switch(call_user_func($callback, $err)){ + case PEAR_ERRORSTACK_IGNORE: + return $err; + break; + case PEAR_ERRORSTACK_PUSH: + $log = false; + break; + case PEAR_ERRORSTACK_LOG: + $push = false; + break; + case PEAR_ERRORSTACK_DIE: + $die = true; + break; + // anything else returned has the same effect as pushandlog + } + } + if ($push) { + array_unshift($this->_errors, $err); + $this->_errorsByLevel[$err['level']][] = &$this->_errors[0]; + } + if ($log) { + if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) { + $this->_log($err); + } + } + if ($die) { + die(); + } + if ($this->_compat && $push) { + return $this->raiseError($msg, $code, null, null, $err); + } + return $err; + } + + /** + * Static version of {@link push()} + * + * @param string $package Package name this error belongs to + * @param int $code Package-specific error code + * @param string $level Error level. This is NOT spell-checked + * @param array $params associative array of error parameters + * @param string $msg Error message, or a portion of it if the message + * is to be generated + * @param array $repackage If this error re-packages an error pushed by + * another package, place the array returned from + * {@link pop()} in this parameter + * @param array $backtrace Protected parameter: use this to pass in the + * {@link debug_backtrace()} that should be used + * to find error context + * @return PEAR_Error|null|Exception + * if compatibility mode is on, a PEAR_Error is also + * thrown. If the class Exception exists, then one + * is returned to allow code like: + * + * throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob'))); + * + * @static + */ + function staticPush($package, $code, $level = 'error', $params = array(), + $msg = false, $repackage = false, $backtrace = false) + { + $s = &PEAR_ErrorStack::singleton($package); + if ($s->_contextCallback) { + if (!$backtrace) { + if (function_exists('debug_backtrace')) { + $backtrace = debug_backtrace(); + } + } + } + return $s->push($code, $level, $params, $msg, $repackage, $backtrace); + } + + /** + * Log an error using PEAR::Log + * @param array $err Error array + * @param array $levels Error level => Log constant map + * @access protected + */ + function _log($err) + { + if ($this->_logger) { + $logger = &$this->_logger; + } else { + $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']; + } + if (is_a($logger, 'Log')) { + $levels = array( + 'exception' => PEAR_LOG_CRIT, + 'alert' => PEAR_LOG_ALERT, + 'critical' => PEAR_LOG_CRIT, + 'error' => PEAR_LOG_ERR, + 'warning' => PEAR_LOG_WARNING, + 'notice' => PEAR_LOG_NOTICE, + 'info' => PEAR_LOG_INFO, + 'debug' => PEAR_LOG_DEBUG); + if (isset($levels[$err['level']])) { + $level = $levels[$err['level']]; + } else { + $level = PEAR_LOG_INFO; + } + $logger->log($err['message'], $level, $err); + } else { // support non-standard logs + call_user_func($logger, $err); + } + } + + + /** + * Pop an error off of the error stack + * + * @return false|array + * @since 0.4alpha it is no longer possible to specify a specific error + * level to return - the last error pushed will be returned, instead + */ + function pop() + { + return @array_shift($this->_errors); + } + + /** + * Determine whether there are any errors on the stack + * @param string|array Level name. Use to determine if any errors + * of level (string), or levels (array) have been pushed + * @return boolean + */ + function hasErrors($level = false) + { + if ($level) { + return isset($this->_errorsByLevel[$level]); + } + return count($this->_errors); + } + + /** + * Retrieve all errors since last purge + * + * @param boolean set in order to empty the error stack + * @param string level name, to return only errors of a particular severity + * @return array + */ + function getErrors($purge = false, $level = false) + { + if (!$purge) { + if ($level) { + if (!isset($this->_errorsByLevel[$level])) { + return array(); + } else { + return $this->_errorsByLevel[$level]; + } + } else { + return $this->_errors; + } + } + if ($level) { + $ret = $this->_errorsByLevel[$level]; + foreach ($this->_errorsByLevel[$level] as $i => $unused) { + // entries are references to the $_errors array + $this->_errorsByLevel[$level][$i] = false; + } + // array_filter removes all entries === false + $this->_errors = array_filter($this->_errors); + unset($this->_errorsByLevel[$level]); + return $ret; + } + $ret = $this->_errors; + $this->_errors = array(); + $this->_errorsByLevel = array(); + return $ret; + } + + /** + * Determine whether there are any errors on a single error stack, or on any error stack + * + * The optional parameter can be used to test the existence of any errors without the need of + * singleton instantiation + * @param string|false Package name to check for errors + * @param string Level name to check for a particular severity + * @return boolean + * @static + */ + function staticHasErrors($package = false, $level = false) + { + if ($package) { + if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) { + return false; + } + return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level); + } + foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { + if ($obj->hasErrors($level)) { + return true; + } + } + return false; + } + + /** + * Get a list of all errors since last purge, organized by package + * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be + * @param boolean $purge Set to purge the error stack of existing errors + * @param string $level Set to a level name in order to retrieve only errors of a particular level + * @param boolean $merge Set to return a flat array, not organized by package + * @param array $sortfunc Function used to sort a merged array - default + * sorts by time, and should be good for most cases + * @static + * @return array + */ + function staticGetErrors($purge = false, $level = false, $merge = false, + $sortfunc = array('PEAR_ErrorStack', '_sortErrors')) + { + $ret = array(); + if (!is_callable($sortfunc)) { + $sortfunc = array('PEAR_ErrorStack', '_sortErrors'); + } + foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) { + $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level); + if ($test) { + if ($merge) { + $ret = array_merge($ret, $test); + } else { + $ret[$package] = $test; + } + } + } + if ($merge) { + usort($ret, $sortfunc); + } + return $ret; + } + + /** + * Error sorting function, sorts by time + * @access private + */ + function _sortErrors($a, $b) + { + if ($a['time'] == $b['time']) { + return 0; + } + if ($a['time'] < $b['time']) { + return 1; + } + return -1; + } + + /** + * Standard file/line number/function/class context callback + * + * This function uses a backtrace generated from {@link debug_backtrace()} + * and so will not work at all in PHP < 4.3.0. The frame should + * reference the frame that contains the source of the error. + * @return array|false either array('file' => file, 'line' => line, + * 'function' => function name, 'class' => class name) or + * if this doesn't work, then false + * @param unused + * @param integer backtrace frame. + * @param array Results of debug_backtrace() + * @static + */ + function getFileLine($code, $params, $backtrace = null) + { + if ($backtrace === null) { + return false; + } + $frame = 0; + $functionframe = 1; + if (!isset($backtrace[1])) { + $functionframe = 0; + } else { + while (isset($backtrace[$functionframe]['function']) && + $backtrace[$functionframe]['function'] == 'eval' && + isset($backtrace[$functionframe + 1])) { + $functionframe++; + } + } + if (isset($backtrace[$frame])) { + if (!isset($backtrace[$frame]['file'])) { + $frame++; + } + $funcbacktrace = $backtrace[$functionframe]; + $filebacktrace = $backtrace[$frame]; + $ret = array('file' => $filebacktrace['file'], + 'line' => $filebacktrace['line']); + // rearrange for eval'd code or create function errors + if (strpos($filebacktrace['file'], '(') && + preg_match(';^(.*?)\((\d+)\) : (.*?)$;', $filebacktrace['file'], + $matches)) { + $ret['file'] = $matches[1]; + $ret['line'] = $matches[2] + 0; + } + if (isset($funcbacktrace['function']) && isset($backtrace[1])) { + if ($funcbacktrace['function'] != 'eval') { + if ($funcbacktrace['function'] == '__lambda_func') { + $ret['function'] = 'create_function() code'; + } else { + $ret['function'] = $funcbacktrace['function']; + } + } + } + if (isset($funcbacktrace['class']) && isset($backtrace[1])) { + $ret['class'] = $funcbacktrace['class']; + } + return $ret; + } + return false; + } + + /** + * Standard error message generation callback + * + * This method may also be called by a custom error message generator + * to fill in template values from the params array, simply + * set the third parameter to the error message template string to use + * + * The special variable %__msg% is reserved: use it only to specify + * where a message passed in by the user should be placed in the template, + * like so: + * + * Error message: %msg% - internal error + * + * If the message passed like so: + * + * + * $stack->push(ERROR_CODE, 'error', array(), 'server error 500'); + * + * + * The returned error message will be "Error message: server error 500 - + * internal error" + * @param PEAR_ErrorStack + * @param array + * @param string|false Pre-generated error message template + * @static + * @return string + */ + function getErrorMessage(&$stack, $err, $template = false) + { + if ($template) { + $mainmsg = $template; + } else { + $mainmsg = $stack->getErrorMessageTemplate($err['code']); + } + $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg); + if (count($err['params'])) { + foreach ($err['params'] as $name => $val) { + if (is_array($val)) { + // @ is needed in case $val is a multi-dimensional array + $val = @implode(', ', $val); + } + if (is_object($val)) { + if (method_exists($val, '__toString')) { + $val = $val->__toString(); + } else { + PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING, + 'warning', array('obj' => get_class($val)), + 'object %obj% passed into getErrorMessage, but has no __toString() method'); + $val = 'Object'; + } + } + $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg); + } + } + return $mainmsg; + } + + /** + * Standard Error Message Template generator from code + * @return string + */ + function getErrorMessageTemplate($code) + { + if (!isset($this->_errorMsgs[$code])) { + return '%__msg%'; + } + return $this->_errorMsgs[$code]; + } + + /** + * Set the Error Message Template array + * + * The array format must be: + *
+     * array(error code => 'message template',...)
+     * 
+ * + * Error message parameters passed into {@link push()} will be used as input + * for the error message. If the template is 'message %foo% was %bar%', and the + * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will + * be 'message one was six' + * @return string + */ + function setErrorMessageTemplate($template) + { + $this->_errorMsgs = $template; + } + + + /** + * emulate PEAR::raiseError() + * + * @return PEAR_Error + */ + function raiseError() + { + require_once 'PEAR.php'; + $args = func_get_args(); + return call_user_func_array(array('PEAR', 'raiseError'), $args); + } +} +$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack'); +$stack->pushCallback(array('PEAR_ErrorStack', '_handleError')); +?> \ No newline at end of file diff --git a/includes/PEAR/Exception.php b/includes/PEAR/Exception.php new file mode 100644 index 0000000..c735c16 --- /dev/null +++ b/includes/PEAR/Exception.php @@ -0,0 +1,359 @@ + | +// | Hans Lellelid | +// | Bertrand Mansion | +// | Greg Beaver | +// +----------------------------------------------------------------------+ +// +// $Id: Exception.php,v 1.4.2.2 2004/12/31 19:01:52 cellog Exp $ + + +/** + * Base PEAR_Exception Class + * + * WARNING: This code should be considered stable, but the API is + * subject to immediate and drastic change, so API stability is + * at best alpha + * + * 1) Features: + * + * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) + * - Definable triggers, shot when exceptions occur + * - Pretty and informative error messages + * - Added more context info available (like class, method or cause) + * - cause can be a PEAR_Exception or an array of mixed + * PEAR_Exceptions/PEAR_ErrorStack warnings + * - callbacks for specific exception classes and their children + * + * 2) Ideas: + * + * - Maybe a way to define a 'template' for the output + * + * 3) Inherited properties from PHP Exception Class: + * + * protected $message + * protected $code + * protected $line + * protected $file + * private $trace + * + * 4) Inherited methods from PHP Exception Class: + * + * __clone + * __construct + * getMessage + * getCode + * getFile + * getLine + * getTraceSafe + * getTraceSafeAsString + * __toString + * + * 5) Usage example + * + * + * require_once 'PEAR/Exception.php'; + * + * class Test { + * function foo() { + * throw new PEAR_Exception('Error Message', ERROR_CODE); + * } + * } + * + * function myLogger($pear_exception) { + * echo $pear_exception->getMessage(); + * } + * // each time a exception is thrown the 'myLogger' will be called + * // (its use is completely optional) + * PEAR_Exception::addObserver('myLogger'); + * $test = new Test; + * try { + * $test->foo(); + * } catch (PEAR_Exception $e) { + * print $e; + * } + * + * + * @since PHP 5 + * @package PEAR + * @version $Revision: 1.4.2.2 $ + * @author Tomas V.V.Cox + * @author Hans Lellelid + * @author Bertrand Mansion + * + */ +class PEAR_Exception extends Exception +{ + const OBSERVER_PRINT = -2; + const OBSERVER_TRIGGER = -4; + const OBSERVER_DIE = -8; + protected $cause; + private static $_observers = array(); + private static $_uniqueid = 0; + private $_trace; + + /** + * Supported signatures: + * PEAR_Exception(string $message); + * PEAR_Exception(string $message, int $code); + * PEAR_Exception(string $message, Exception $cause); + * PEAR_Exception(string $message, Exception $cause, int $code); + * PEAR_Exception(string $message, array $causes); + * PEAR_Exception(string $message, array $causes, int $code); + */ + public function __construct($message, $p2 = null, $p3 = null) + { + if (is_int($p2)) { + $code = $p2; + $this->cause = null; + } elseif ($p2 instanceof Exception || is_array($p2)) { + $code = $p3; + if (is_array($p2) && isset($p2['message'])) { + // fix potential problem of passing in a single warning + $p2 = array($p2); + } + $this->cause = $p2; + } else { + $code = null; + $this->cause = null; + } + parent::__construct($message, $code); + $this->signal(); + } + + /** + * @param mixed $callback - A valid php callback, see php func is_callable() + * - A PEAR_Exception::OBSERVER_* constant + * - An array(const PEAR_Exception::OBSERVER_*, + * mixed $options) + * @param string $label The name of the observer. Use this if you want + * to remove it later with removeObserver() + */ + public static function addObserver($callback, $label = 'default') + { + self::$_observers[$label] = $callback; + } + + public static function removeObserver($label = 'default') + { + unset(self::$_observers[$label]); + } + + /** + * @return int unique identifier for an observer + */ + public static function getUniqueId() + { + return self::$_uniqueid++; + } + + private function signal() + { + foreach (self::$_observers as $func) { + if (is_callable($func)) { + call_user_func($func, $this); + continue; + } + settype($func, 'array'); + switch ($func[0]) { + case self::OBSERVER_PRINT : + $f = (isset($func[1])) ? $func[1] : '%s'; + printf($f, $this->getMessage()); + break; + case self::OBSERVER_TRIGGER : + $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE; + trigger_error($this->getMessage(), $f); + break; + case self::OBSERVER_DIE : + $f = (isset($func[1])) ? $func[1] : '%s'; + die(printf($f, $this->getMessage())); + break; + default: + trigger_error('invalid observer type', E_USER_WARNING); + } + } + } + + /** + * Return specific error information that can be used for more detailed + * error messages or translation. + * + * This method may be overridden in child exception classes in order + * to add functionality not present in PEAR_Exception and is a placeholder + * to define API + * + * The returned array must be an associative array of parameter => value like so: + *
+     * array('name' => $name, 'context' => array(...))
+     * 
+ * @return array + */ + public function getErrorData() + { + return array(); + } + + /** + * Returns the exception that caused this exception to be thrown + * @access public + * @return Exception|array The context of the exception + */ + public function getCause() + { + return $this->cause; + } + + /** + * Function must be public to call on caused exceptions + * @param array + */ + public function getCauseMessage(&$causes) + { + $trace = $this->getTraceSafe(); + $cause = array('class' => get_class($this), + 'message' => $this->message, + 'file' => 'unknown', + 'line' => 'unknown'); + if (isset($trace[0])) { + if (isset($trace[0]['file'])) { + $cause['file'] = $trace[0]['file']; + $cause['line'] = $trace[0]['line']; + } + } + if ($this->cause instanceof PEAR_Exception) { + $this->cause->getCauseMessage($causes); + } + if (is_array($this->cause)) { + foreach ($this->cause as $cause) { + if ($cause instanceof PEAR_Exception) { + $cause->getCauseMessage($causes); + } elseif (is_array($cause) && isset($cause['message'])) { + // PEAR_ErrorStack warning + $causes[] = array( + 'class' => $cause['package'], + 'message' => $cause['message'], + 'file' => isset($cause['context']['file']) ? + $cause['context']['file'] : + 'unknown', + 'line' => isset($cause['context']['line']) ? + $cause['context']['line'] : + 'unknown', + ); + } + } + } + } + + public function getTraceSafe() + { + if (!isset($this->_trace)) { + $this->_trace = $this->getTrace(); + if (empty($this->_trace)) { + $backtrace = debug_backtrace(); + $this->_trace = array($backtrace[count($backtrace)-1]); + } + } + return $this->_trace; + } + + public function getErrorClass() + { + $trace = $this->getTraceSafe(); + return $trace[0]['class']; + } + + public function getErrorMethod() + { + $trace = $this->getTraceSafe(); + return $trace[0]['function']; + } + + public function __toString() + { + if (isset($_SERVER['REQUEST_URI'])) { + return $this->toHtml(); + } + return $this->toText(); + } + + public function toHtml() + { + $trace = $this->getTraceSafe(); + $causes = array(); + $this->getCauseMessage($causes); + $html = '' . "\n"; + foreach ($causes as $i => $cause) { + $html .= '\n"; + } + $html .= '' . "\n" + . '' + . '' + . '' . "\n"; + + foreach ($trace as $k => $v) { + $html .= '' + . '' + . '' . "\n"; + } + $html .= '' + . '' + . '' . "\n" + . '
' + . str_repeat('-', $i) . ' ' . $cause['class'] . ': ' + . htmlspecialchars($cause['message']) . ' in ' . $cause['file'] . ' ' + . 'on line ' . $cause['line'] . '' + . "
Exception trace
#FunctionLocation
' . $k . ''; + if (!empty($v['class'])) { + $html .= $v['class'] . $v['type']; + } + $html .= $v['function']; + $args = array(); + if (!empty($v['args'])) { + foreach ($v['args'] as $arg) { + if (is_null($arg)) $args[] = 'null'; + elseif (is_array($arg)) $args[] = 'Array'; + elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')'; + elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false'; + elseif (is_int($arg) || is_double($arg)) $args[] = $arg; + else { + $arg = (string)$arg; + $str = htmlspecialchars(substr($arg, 0, 16)); + if (strlen($arg) > 16) $str .= '…'; + $args[] = "'" . $str . "'"; + } + } + } + $html .= '(' . implode(', ',$args) . ')' + . '' . $v['file'] . ':' . $v['line'] . '
' . ($k+1) . '{main} 
'; + return $html; + } + + public function toText() + { + $causes = array(); + $this->getCauseMessage($causes); + $causeMsg = ''; + foreach ($causes as $i => $cause) { + $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': ' + . $cause['message'] . ' in ' . $cause['file'] + . ' on line ' . $cause['line'] . "\n"; + } + return $causeMsg . $this->getTraceAsString(); + } +} + +?> \ No newline at end of file diff --git a/includes/PEAR/Frontend/CLI.php b/includes/PEAR/Frontend/CLI.php new file mode 100644 index 0000000..832ddf0 --- /dev/null +++ b/includes/PEAR/Frontend/CLI.php @@ -0,0 +1,509 @@ + | + +----------------------------------------------------------------------+ + + $Id: CLI.php,v 1.41 2004/02/17 05:49:16 ssb Exp $ +*/ + +require_once "PEAR.php"; + +class PEAR_Frontend_CLI extends PEAR +{ + // {{{ properties + + /** + * What type of user interface this frontend is for. + * @var string + * @access public + */ + var $type = 'CLI'; + var $lp = ''; // line prefix + + var $params = array(); + var $term = array( + 'bold' => '', + 'normal' => '', + ); + + // }}} + + // {{{ constructor + + function PEAR_Frontend_CLI() + { + parent::PEAR(); + $term = getenv('TERM'); //(cox) $_ENV is empty for me in 4.1.1 + if (function_exists('posix_isatty') && !posix_isatty(1)) { + // output is being redirected to a file or through a pipe + } elseif ($term) { + // XXX can use ncurses extension here, if available + if (preg_match('/^(xterm|vt220|linux)/', $term)) { + $this->term['bold'] = sprintf("%c%c%c%c", 27, 91, 49, 109); + $this->term['normal']=sprintf("%c%c%c", 27, 91, 109); + } elseif (preg_match('/^vt100/', $term)) { + $this->term['bold'] = sprintf("%c%c%c%c%c%c", 27, 91, 49, 109, 0, 0); + $this->term['normal']=sprintf("%c%c%c%c%c", 27, 91, 109, 0, 0); + } + } elseif (OS_WINDOWS) { + // XXX add ANSI codes here + } + } + + // }}} + + // {{{ displayLine(text) + + function displayLine($text) + { + trigger_error("PEAR_Frontend_CLI::displayLine deprecated", E_USER_ERROR); + } + + function _displayLine($text) + { + print "$this->lp$text\n"; + } + + // }}} + // {{{ display(text) + + function display($text) + { + trigger_error("PEAR_Frontend_CLI::display deprecated", E_USER_ERROR); + } + + function _display($text) + { + print $text; + } + + // }}} + // {{{ displayError(eobj) + + /** + * @param object PEAR_Error object + */ + function displayError($eobj) + { + return $this->_displayLine($eobj->getMessage()); + } + + // }}} + // {{{ displayFatalError(eobj) + + /** + * @param object PEAR_Error object + */ + function displayFatalError($eobj) + { + $this->displayError($eobj); + exit(1); + } + + // }}} + // {{{ displayHeading(title) + + function displayHeading($title) + { + trigger_error("PEAR_Frontend_CLI::displayHeading deprecated", E_USER_ERROR); + } + + function _displayHeading($title) + { + print $this->lp.$this->bold($title)."\n"; + print $this->lp.str_repeat("=", strlen($title))."\n"; + } + + // }}} + // {{{ userDialog(prompt, [type], [default]) + + function userDialog($command, $prompts, $types = array(), $defaults = array()) + { + $result = array(); + if (is_array($prompts)) { + $fp = fopen("php://stdin", "r"); + foreach ($prompts as $key => $prompt) { + $type = $types[$key]; + $default = @$defaults[$key]; + if ($type == 'password') { + system('stty -echo'); + } + print "$this->lp$prompt "; + if ($default) { + print "[$default] "; + } + print ": "; + $line = fgets($fp, 2048); + if ($type == 'password') { + system('stty echo'); + print "\n"; + } + if ($default && trim($line) == "") { + $result[$key] = $default; + } else { + $result[$key] = $line; + } + } + fclose($fp); + } + return $result; + } + + // }}} + // {{{ userConfirm(prompt, [default]) + + function userConfirm($prompt, $default = 'yes') + { + trigger_error("PEAR_Frontend_CLI::userConfirm not yet converted", E_USER_ERROR); + static $positives = array('y', 'yes', 'on', '1'); + static $negatives = array('n', 'no', 'off', '0'); + print "$this->lp$prompt [$default] : "; + $fp = fopen("php://stdin", "r"); + $line = fgets($fp, 2048); + fclose($fp); + $answer = strtolower(trim($line)); + if (empty($answer)) { + $answer = $default; + } + if (in_array($answer, $positives)) { + return true; + } + if (in_array($answer, $negatives)) { + return false; + } + if (in_array($default, $positives)) { + return true; + } + return false; + } + + // }}} + // {{{ startTable([params]) + + function startTable($params = array()) + { + trigger_error("PEAR_Frontend_CLI::startTable deprecated", E_USER_ERROR); + } + + function _startTable($params = array()) + { + $params['table_data'] = array(); + $params['widest'] = array(); // indexed by column + $params['highest'] = array(); // indexed by row + $params['ncols'] = 0; + $this->params = $params; + } + + // }}} + // {{{ tableRow(columns, [rowparams], [colparams]) + + function tableRow($columns, $rowparams = array(), $colparams = array()) + { + trigger_error("PEAR_Frontend_CLI::tableRow deprecated", E_USER_ERROR); + } + + function _tableRow($columns, $rowparams = array(), $colparams = array()) + { + $highest = 1; + for ($i = 0; $i < sizeof($columns); $i++) { + $col = &$columns[$i]; + if (isset($colparams[$i]) && !empty($colparams[$i]['wrap'])) { + $col = wordwrap($col, $colparams[$i]['wrap'], "\n", 0); + } + if (strpos($col, "\n") !== false) { + $multiline = explode("\n", $col); + $w = 0; + foreach ($multiline as $n => $line) { + if (strlen($line) > $w) { + $w = strlen($line); + } + } + $lines = sizeof($multiline); + } else { + $w = strlen($col); + } + if ($w > @$this->params['widest'][$i]) { + $this->params['widest'][$i] = $w; + } + $tmp = count_chars($columns[$i], 1); + // handle unix, mac and windows formats + $lines = (isset($tmp[10]) ? $tmp[10] : @$tmp[13]) + 1; + if ($lines > $highest) { + $highest = $lines; + } + } + if (sizeof($columns) > $this->params['ncols']) { + $this->params['ncols'] = sizeof($columns); + } + $new_row = array( + 'data' => $columns, + 'height' => $highest, + 'rowparams' => $rowparams, + 'colparams' => $colparams, + ); + $this->params['table_data'][] = $new_row; + } + + // }}} + // {{{ endTable() + + function endTable() + { + trigger_error("PEAR_Frontend_CLI::endTable deprecated", E_USER_ERROR); + } + + function _endTable() + { + extract($this->params); + if (!empty($caption)) { + $this->_displayHeading($caption); + } + if (count($table_data) == 0) { + return; + } + if (!isset($width)) { + $width = $widest; + } else { + for ($i = 0; $i < $ncols; $i++) { + if (!isset($width[$i])) { + $width[$i] = $widest[$i]; + } + } + } + $border = false; + if (empty($border)) { + $cellstart = ''; + $cellend = ' '; + $rowend = ''; + $padrowend = false; + $borderline = ''; + } else { + $cellstart = '| '; + $cellend = ' '; + $rowend = '|'; + $padrowend = true; + $borderline = '+'; + foreach ($width as $w) { + $borderline .= str_repeat('-', $w + strlen($cellstart) + strlen($cellend) - 1); + $borderline .= '+'; + } + } + if ($borderline) { + $this->_displayLine($borderline); + } + for ($i = 0; $i < sizeof($table_data); $i++) { + extract($table_data[$i]); + if (!is_array($rowparams)) { + $rowparams = array(); + } + if (!is_array($colparams)) { + $colparams = array(); + } + $rowlines = array(); + if ($height > 1) { + for ($c = 0; $c < sizeof($data); $c++) { + $rowlines[$c] = preg_split('/(\r?\n|\r)/', $data[$c]); + if (sizeof($rowlines[$c]) < $height) { + $rowlines[$c] = array_pad($rowlines[$c], $height, ''); + } + } + } else { + for ($c = 0; $c < sizeof($data); $c++) { + $rowlines[$c] = array($data[$c]); + } + } + for ($r = 0; $r < $height; $r++) { + $rowtext = ''; + for ($c = 0; $c < sizeof($data); $c++) { + if (isset($colparams[$c])) { + $attribs = array_merge($rowparams, $colparams); + } else { + $attribs = $rowparams; + } + $w = isset($width[$c]) ? $width[$c] : 0; + //$cell = $data[$c]; + $cell = $rowlines[$c][$r]; + $l = strlen($cell); + if ($l > $w) { + $cell = substr($cell, 0, $w); + } + if (isset($attribs['bold'])) { + $cell = $this->bold($cell); + } + if ($l < $w) { + // not using str_pad here because we may + // add bold escape characters to $cell + $cell .= str_repeat(' ', $w - $l); + } + + $rowtext .= $cellstart . $cell . $cellend; + } + if (!$border) { + $rowtext = rtrim($rowtext); + } + $rowtext .= $rowend; + $this->_displayLine($rowtext); + } + } + if ($borderline) { + $this->_displayLine($borderline); + } + } + + // }}} + // {{{ outputData() + + function outputData($data, $command = '_default') + { + switch ($command) { + case 'install': + case 'upgrade': + case 'upgrade-all': + if (isset($data['release_warnings'])) { + $this->_displayLine(''); + $this->_startTable(array( + 'border' => false, + 'caption' => 'Release Warnings' + )); + $this->_tableRow(array($data['release_warnings']), null, array(1 => array('wrap' => 55))); + $this->_endTable(); + $this->_displayLine(''); + } + $this->_displayLine($data['data']); + break; + case 'search': + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); + } + + foreach($data['data'] as $category) { + foreach($category as $pkg) { + $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); + } + }; + $this->_endTable(); + break; + case 'list-all': + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], array('bold' => true), array(1 => array('wrap' => 55))); + } + + foreach($data['data'] as $category) { + foreach($category as $pkg) { + unset($pkg[3]); + unset($pkg[4]); + $this->_tableRow($pkg, null, array(1 => array('wrap' => 55))); + } + }; + $this->_endTable(); + break; + case 'config-show': + $data['border'] = false; + $opts = array(0 => array('wrap' => 30), + 1 => array('wrap' => 20), + 2 => array('wrap' => 35)); + $this->_startTable($data); + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], + array('bold' => true), + $opts); + } + foreach($data['data'] as $group) { + foreach($group as $value) { + if ($value[2] == '') { + $value[2] = ""; + } + $this->_tableRow($value, null, $opts); + } + } + $this->_endTable(); + break; + case 'remote-info': + $data = array( + 'caption' => 'Package details:', + 'border' => false, + 'data' => array( + array("Latest", $data['stable']), + array("Installed", $data['installed']), + array("Package", $data['name']), + array("License", $data['license']), + array("Category", $data['category']), + array("Summary", $data['summary']), + array("Description", $data['description']), + ), + ); + default: { + if (is_array($data)) { + $this->_startTable($data); + $count = count($data['data'][0]); + if ($count == 2) { + $opts = array(0 => array('wrap' => 25), + 1 => array('wrap' => 48) + ); + } elseif ($count == 3) { + $opts = array(0 => array('wrap' => 30), + 1 => array('wrap' => 20), + 2 => array('wrap' => 35) + ); + } else { + $opts = null; + } + if (isset($data['headline']) && is_array($data['headline'])) { + $this->_tableRow($data['headline'], + array('bold' => true), + $opts); + } + foreach($data['data'] as $row) { + $this->_tableRow($row, null, $opts); + } + $this->_endTable(); + } else { + $this->_displayLine($data); + } + } + } + } + + // }}} + // {{{ log(text) + + + function log($text, $append_crlf = true) + { + if ($append_crlf) { + return $this->_displayLine($text); + } + return $this->_display($text); + } + + + // }}} + // {{{ bold($text) + + function bold($text) + { + if (empty($this->term['bold'])) { + return strtoupper($text); + } + return $this->term['bold'] . $text . $this->term['normal']; + } + + // }}} +} + +?> diff --git a/includes/PEAR/Installer.php b/includes/PEAR/Installer.php new file mode 100644 index 0000000..31e2cff --- /dev/null +++ b/includes/PEAR/Installer.php @@ -0,0 +1,1068 @@ + | +// | Tomas V.V.Cox | +// | Martin Jansen | +// +----------------------------------------------------------------------+ +// +// $Id: Installer.php,v 1.150.2.2 2005/02/17 17:47:55 cellog Exp $ + +require_once 'PEAR/Downloader.php'; + +/** + * Administration class used to install PEAR packages and maintain the + * installed package database. + * + * TODO: + * - Check dependencies break on package uninstall (when no force given) + * - add a guessInstallDest() method with the code from _installFile() and + * use that method in Registry::_rebuildFileMap() & Command_Registry::doList(), + * others.. + * + * @since PHP 4.0.2 + * @author Stig Bakken + * @author Martin Jansen + * @author Greg Beaver + */ +class PEAR_Installer extends PEAR_Downloader +{ + // {{{ properties + + /** name of the package directory, for example Foo-1.0 + * @var string + */ + var $pkgdir; + + /** directory where PHP code files go + * @var string + */ + var $phpdir; + + /** directory where PHP extension files go + * @var string + */ + var $extdir; + + /** directory where documentation goes + * @var string + */ + var $docdir; + + /** installation root directory (ala PHP's INSTALL_ROOT or + * automake's DESTDIR + * @var string + */ + var $installroot = ''; + + /** debug level + * @var int + */ + var $debug = 1; + + /** temporary directory + * @var string + */ + var $tmpdir; + + /** PEAR_Registry object used by the installer + * @var object + */ + var $registry; + + /** List of file transactions queued for an install/upgrade/uninstall. + * + * Format: + * array( + * 0 => array("rename => array("from-file", "to-file")), + * 1 => array("delete" => array("file-to-delete")), + * ... + * ) + * + * @var array + */ + var $file_operations = array(); + + // }}} + + // {{{ constructor + + /** + * PEAR_Installer constructor. + * + * @param object $ui user interface object (instance of PEAR_Frontend_*) + * + * @access public + */ + function PEAR_Installer(&$ui) + { + parent::PEAR_Common(); + $this->setFrontendObject($ui); + $this->debug = $this->config->get('verbose'); + //$this->registry = &new PEAR_Registry($this->config->get('php_dir')); + } + + // }}} + + // {{{ _deletePackageFiles() + + /** + * Delete a package's installed files, does not remove empty directories. + * + * @param string $package package name + * + * @return bool TRUE on success, or a PEAR error on failure + * + * @access private + */ + function _deletePackageFiles($package) + { + if (!strlen($package)) { + return $this->raiseError("No package to uninstall given"); + } + $filelist = $this->registry->packageInfo($package, 'filelist'); + if ($filelist == null) { + return $this->raiseError("$package not installed"); + } + foreach ($filelist as $file => $props) { + if (empty($props['installed_as'])) { + continue; + } + $path = $this->_prependPath($props['installed_as'], $this->installroot); + $this->addFileOperation('delete', array($path)); + } + return true; + } + + // }}} + // {{{ _installFile() + + /** + * @param string filename + * @param array attributes from tag in package.xml + * @param string path to install the file in + * @param array options from command-line + * @access private + */ + function _installFile($file, $atts, $tmp_path, $options) + { + // {{{ return if this file is meant for another platform + static $os; + if (isset($atts['platform'])) { + if (empty($os)) { + include_once "OS/Guess.php"; + $os = new OS_Guess(); + } + if (strlen($atts['platform']) && $atts['platform']{0} == '!') { + $negate = true; + $platform = substr($atts['platform'], 1); + } else { + $negate = false; + $platform = $atts['platform']; + } + if ((bool) $os->matchSignature($platform) === $negate) { + $this->log(3, "skipped $file (meant for $atts[platform], we are ".$os->getSignature().")"); + return PEAR_INSTALLER_SKIPPED; + } + } + // }}} + + // {{{ assemble the destination paths + switch ($atts['role']) { + case 'doc': + case 'data': + case 'test': + $dest_dir = $this->config->get($atts['role'] . '_dir') . + DIRECTORY_SEPARATOR . $this->pkginfo['package']; + unset($atts['baseinstalldir']); + break; + case 'ext': + case 'php': + $dest_dir = $this->config->get($atts['role'] . '_dir'); + break; + case 'script': + $dest_dir = $this->config->get('bin_dir'); + break; + case 'src': + case 'extsrc': + $this->source_files++; + return; + default: + return $this->raiseError("Invalid role `$atts[role]' for file $file"); + } + $save_destdir = $dest_dir; + if (!empty($atts['baseinstalldir'])) { + $dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir']; + } + if (dirname($file) != '.' && empty($atts['install-as'])) { + $dest_dir .= DIRECTORY_SEPARATOR . dirname($file); + } + if (empty($atts['install-as'])) { + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file); + } else { + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as']; + } + $orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file; + + // Clean up the DIRECTORY_SEPARATOR mess + $ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR; + list($dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"), + DIRECTORY_SEPARATOR, + array($dest_file, $orig_file)); + $installed_as = $dest_file; + $final_dest_file = $this->_prependPath($dest_file, $this->installroot); + $dest_dir = dirname($final_dest_file); + $dest_file = $dest_dir . DIRECTORY_SEPARATOR . '.tmp' . basename($final_dest_file); + // }}} + + if (!@is_dir($dest_dir)) { + if (!$this->mkDirHier($dest_dir)) { + return $this->raiseError("failed to mkdir $dest_dir", + PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ mkdir $dest_dir"); + } + if (empty($atts['replacements'])) { + if (!file_exists($orig_file)) { + return $this->raiseError("file does not exist", + PEAR_INSTALLER_FAILED); + } + if (!@copy($orig_file, $dest_file)) { + return $this->raiseError("failed to write $dest_file", + PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ cp $orig_file $dest_file"); + if (isset($atts['md5sum'])) { + $md5sum = md5_file($dest_file); + } + } else { + // {{{ file with replacements + if (!file_exists($orig_file)) { + return $this->raiseError("file does not exist", + PEAR_INSTALLER_FAILED); + } + $fp = fopen($orig_file, "r"); + $contents = fread($fp, filesize($orig_file)); + fclose($fp); + if (isset($atts['md5sum'])) { + $md5sum = md5($contents); + } + $subst_from = $subst_to = array(); + foreach ($atts['replacements'] as $a) { + $to = ''; + if ($a['type'] == 'php-const') { + if (preg_match('/^[a-z0-9_]+$/i', $a['to'])) { + eval("\$to = $a[to];"); + } else { + $this->log(0, "invalid php-const replacement: $a[to]"); + continue; + } + } elseif ($a['type'] == 'pear-config') { + $to = $this->config->get($a['to']); + if (is_null($to)) { + $this->log(0, "invalid pear-config replacement: $a[to]"); + continue; + } + } elseif ($a['type'] == 'package-info') { + if (isset($this->pkginfo[$a['to']]) && is_string($this->pkginfo[$a['to']])) { + $to = $this->pkginfo[$a['to']]; + } else { + $this->log(0, "invalid package-info replacement: $a[to]"); + continue; + } + } + if (!is_null($to)) { + $subst_from[] = $a['from']; + $subst_to[] = $to; + } + } + $this->log(3, "doing ".sizeof($subst_from)." substitution(s) for $final_dest_file"); + if (sizeof($subst_from)) { + $contents = str_replace($subst_from, $subst_to, $contents); + } + $wp = @fopen($dest_file, "wb"); + if (!is_resource($wp)) { + return $this->raiseError("failed to create $dest_file: $php_errormsg", + PEAR_INSTALLER_FAILED); + } + if (!fwrite($wp, $contents)) { + return $this->raiseError("failed writing to $dest_file: $php_errormsg", + PEAR_INSTALLER_FAILED); + } + fclose($wp); + // }}} + } + // {{{ check the md5 + if (isset($md5sum)) { + if (strtolower($md5sum) == strtolower($atts['md5sum'])) { + $this->log(2, "md5sum ok: $final_dest_file"); + } else { + if (empty($options['force'])) { + // delete the file + @unlink($dest_file); + return $this->raiseError("bad md5sum for file $final_dest_file", + PEAR_INSTALLER_FAILED); + } else { + $this->log(0, "warning : bad md5sum for file $final_dest_file"); + } + } + } + // }}} + // {{{ set file permissions + if (!OS_WINDOWS) { + if ($atts['role'] == 'script') { + $mode = 0777 & ~(int)octdec($this->config->get('umask')); + $this->log(3, "+ chmod +x $dest_file"); + } else { + $mode = 0666 & ~(int)octdec($this->config->get('umask')); + } + $this->addFileOperation("chmod", array($mode, $dest_file)); + if (!@chmod($dest_file, $mode)) { + $this->log(0, "failed to change mode of $dest_file"); + } + } + // }}} + $this->addFileOperation("rename", array($dest_file, $final_dest_file)); + // Store the full path where the file was installed for easy unistall + $this->addFileOperation("installed_as", array($file, $installed_as, + $save_destdir, dirname(substr($dest_file, strlen($save_destdir))))); + + //$this->log(2, "installed: $dest_file"); + return PEAR_INSTALLER_OK; + } + + // }}} + // {{{ addFileOperation() + + /** + * Add a file operation to the current file transaction. + * + * @see startFileTransaction() + * @var string $type This can be one of: + * - rename: rename a file ($data has 2 values) + * - chmod: change permissions on a file ($data has 2 values) + * - delete: delete a file ($data has 1 value) + * - rmdir: delete a directory if empty ($data has 1 value) + * - installed_as: mark a file as installed ($data has 4 values). + * @var array $data For all file operations, this array must contain the + * full path to the file or directory that is being operated on. For + * the rename command, the first parameter must be the file to rename, + * the second its new name. + * + * The installed_as operation contains 4 elements in this order: + * 1. Filename as listed in the filelist element from package.xml + * 2. Full path to the installed file + * 3. Full path from the php_dir configuration variable used in this + * installation + * 4. Relative path from the php_dir that this file is installed in + */ + function addFileOperation($type, $data) + { + if (!is_array($data)) { + return $this->raiseError('Internal Error: $data in addFileOperation' + . ' must be an array, was ' . gettype($data)); + } + if ($type == 'chmod') { + $octmode = decoct($data[0]); + $this->log(3, "adding to transaction: $type $octmode $data[1]"); + } else { + $this->log(3, "adding to transaction: $type " . implode(" ", $data)); + } + $this->file_operations[] = array($type, $data); + } + + // }}} + // {{{ startFileTransaction() + + function startFileTransaction($rollback_in_case = false) + { + if (count($this->file_operations) && $rollback_in_case) { + $this->rollbackFileTransaction(); + } + $this->file_operations = array(); + } + + // }}} + // {{{ commitFileTransaction() + + function commitFileTransaction() + { + $n = count($this->file_operations); + $this->log(2, "about to commit $n file operations"); + // {{{ first, check permissions and such manually + $errors = array(); + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + if (!file_exists($data[0])) { + $errors[] = "cannot rename file $data[0], doesn't exist"; + } + // check that dest dir. is writable + if (!is_writable(dirname($data[1]))) { + $errors[] = "permission denied ($type): $data[1]"; + } + break; + case 'chmod': + // check that file is writable + if (!is_writable($data[1])) { + $errors[] = "permission denied ($type): $data[1] " . decoct($data[0]); + } + break; + case 'delete': + if (!file_exists($data[0])) { + $this->log(2, "warning: file $data[0] doesn't exist, can't be deleted"); + } + // check that directory is writable + if (file_exists($data[0]) && !is_writable(dirname($data[0]))) { + $errors[] = "permission denied ($type): $data[0]"; + } + break; + } + + } + // }}} + $m = sizeof($errors); + if ($m > 0) { + foreach ($errors as $error) { + $this->log(1, $error); + } + return false; + } + // {{{ really commit the transaction + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + @unlink($data[1]); + @rename($data[0], $data[1]); + $this->log(3, "+ mv $data[0] $data[1]"); + break; + case 'chmod': + @chmod($data[1], $data[0]); + $octmode = decoct($data[0]); + $this->log(3, "+ chmod $octmode $data[1]"); + break; + case 'delete': + @unlink($data[0]); + $this->log(3, "+ rm $data[0]"); + break; + case 'rmdir': + @rmdir($data[0]); + $this->log(3, "+ rmdir $data[0]"); + break; + case 'installed_as': + $this->pkginfo['filelist'][$data[0]]['installed_as'] = $data[1]; + if (!isset($this->pkginfo['filelist']['dirtree'][dirname($data[1])])) { + $this->pkginfo['filelist']['dirtree'][dirname($data[1])] = true; + while(!empty($data[3]) && $data[3] != '/' && $data[3] != '\\' + && $data[3] != '.') { + $this->pkginfo['filelist']['dirtree'] + [$this->_prependPath($data[3], $data[2])] = true; + $data[3] = dirname($data[3]); + } + } + break; + } + } + // }}} + $this->log(2, "successfully committed $n file operations"); + $this->file_operations = array(); + return true; + } + + // }}} + // {{{ rollbackFileTransaction() + + function rollbackFileTransaction() + { + $n = count($this->file_operations); + $this->log(2, "rolling back $n file operations"); + foreach ($this->file_operations as $tr) { + list($type, $data) = $tr; + switch ($type) { + case 'rename': + @unlink($data[0]); + $this->log(3, "+ rm $data[0]"); + break; + case 'mkdir': + @rmdir($data[0]); + $this->log(3, "+ rmdir $data[0]"); + break; + case 'chmod': + break; + case 'delete': + break; + case 'installed_as': + if (isset($this->pkginfo['filelist'])) { + unset($this->pkginfo['filelist'][$data[0]]['installed_as']); + } + if (isset($this->pkginfo['filelist']['dirtree'][dirname($data[1])])) { + unset($this->pkginfo['filelist']['dirtree'][dirname($data[1])]); + while(!empty($data[3]) && $data[3] != '/' && $data[3] != '\\' + && $data[3] != '.') { + unset($this->pkginfo['filelist']['dirtree'] + [$this->_prependPath($data[3], $data[2])]); + $data[3] = dirname($data[3]); + } + } + if (isset($this->pkginfo['filelist']['dirtree']) + && !count($this->pkginfo['filelist']['dirtree'])) { + unset($this->pkginfo['filelist']['dirtree']); + } + break; + } + } + $this->file_operations = array(); + } + + // }}} + // {{{ mkDirHier($dir) + + function mkDirHier($dir) + { + $this->addFileOperation('mkdir', array($dir)); + return parent::mkDirHier($dir); + } + + // }}} + // {{{ download() + + /** + * Download any files and their dependencies, if necessary + * + * @param array a mixed list of package names, local files, or package.xml + * @param PEAR_Config + * @param array options from the command line + * @param array this is the array that will be populated with packages to + * install. Format of each entry: + * + * + * array('pkg' => 'package_name', 'file' => '/path/to/local/file', + * 'info' => array() // parsed package.xml + * ); + * + * @param array this will be populated with any error messages + * @param false private recursion variable + * @param false private recursion variable + * @param false private recursion variable + * @deprecated in favor of PEAR_Downloader + */ + function download($packages, $options, &$config, &$installpackages, + &$errors, $installed = false, $willinstall = false, $state = false) + { + // trickiness: initialize here + parent::PEAR_Downloader($this->ui, $options, $config); + $ret = parent::download($packages); + $errors = $this->getErrorMsgs(); + $installpackages = $this->getDownloadedPackages(); + trigger_error("PEAR Warning: PEAR_Installer::download() is deprecated " . + "in favor of PEAR_Downloader class", E_USER_WARNING); + return $ret; + } + + // }}} + // {{{ install() + + /** + * Installs the files within the package file specified. + * + * @param string $pkgfile path to the package file + * @param array $options + * recognized options: + * - installroot : optional prefix directory for installation + * - force : force installation + * - register-only : update registry but don't install files + * - upgrade : upgrade existing install + * - soft : fail silently + * - nodeps : ignore dependency conflicts/missing dependencies + * - alldeps : install all dependencies + * - onlyreqdeps : install only required dependencies + * + * @return array|PEAR_Error package info if successful + */ + + function install($pkgfile, $options = array()) + { + $php_dir = $this->config->get('php_dir'); + if (isset($options['installroot'])) { + if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { + $options['installroot'] = substr($options['installroot'], 0, -1); + } + $php_dir = $this->_prependPath($php_dir, $options['installroot']); + $this->installroot = $options['installroot']; + } else { + $this->installroot = ''; + } + $this->registry = &new PEAR_Registry($php_dir); + // ==> XXX should be removed later on + $flag_old_format = false; + + if (substr($pkgfile, -4) == '.xml') { + $descfile = $pkgfile; + } else { + // {{{ Decompress pack in tmp dir ------------------------------------- + + // To allow relative package file names + $pkgfile = realpath($pkgfile); + + if (PEAR::isError($tmpdir = System::mktemp('-d'))) { + return $tmpdir; + } + $this->log(3, '+ tmp dir created at ' . $tmpdir); + + $tar = new Archive_Tar($pkgfile); + if (!@$tar->extract($tmpdir)) { + return $this->raiseError("unable to unpack $pkgfile"); + } + + // {{{ Look for existing package file + $descfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; + + if (!is_file($descfile)) { + // ----- Look for old package archive format + // In this format the package.xml file was inside the + // Package-n.n directory + $dp = opendir($tmpdir); + do { + $pkgdir = readdir($dp); + } while ($pkgdir{0} == '.'); + + $descfile = $tmpdir . DIRECTORY_SEPARATOR . $pkgdir . DIRECTORY_SEPARATOR . 'package.xml'; + $flag_old_format = true; + $this->log(0, "warning : you are using an archive with an old format"); + } + // }}} + // <== XXX This part should be removed later on + // }}} + } + + if (!is_file($descfile)) { + return $this->raiseError("no package.xml file after extracting the archive"); + } + + // Parse xml file ----------------------------------------------- + $pkginfo = $this->infoFromDescriptionFile($descfile); + if (PEAR::isError($pkginfo)) { + return $pkginfo; + } + $this->validatePackageInfo($pkginfo, $errors, $warnings); + // XXX We allow warnings, do we have to do it? + if (count($errors)) { + if (empty($options['force'])) { + return $this->raiseError("The following errors where found (use force option to install anyway):\n". + implode("\n", $errors)); + } else { + $this->log(0, "warning : the following errors were found:\n". + implode("\n", $errors)); + } + } + + $pkgname = $pkginfo['package']; + + // {{{ Check dependencies ------------------------------------------- + if (isset($pkginfo['release_deps']) && empty($options['nodeps'])) { + $dep_errors = ''; + $error = $this->checkDeps($pkginfo, $dep_errors); + if ($error == true) { + if (empty($options['soft'])) { + $this->log(0, substr($dep_errors, 1)); + } + return $this->raiseError("$pkgname: Dependencies failed"); + } else if (!empty($dep_errors)) { + // Print optional dependencies + if (empty($options['soft'])) { + $this->log(0, $dep_errors); + } + } + } + // }}} + + // {{{ checks to do when not in "force" mode + if (empty($options['force'])) { + $test = $this->registry->checkFileMap($pkginfo); + if (sizeof($test)) { + $tmp = $test; + foreach ($tmp as $file => $pkg) { + if ($pkg == $pkgname) { + unset($test[$file]); + } + } + if (sizeof($test)) { + $msg = "$pkgname: conflicting files found:\n"; + $longest = max(array_map("strlen", array_keys($test))); + $fmt = "%${longest}s (%s)\n"; + foreach ($test as $file => $pkg) { + $msg .= sprintf($fmt, $file, $pkg); + } + return $this->raiseError($msg); + } + } + } + // }}} + + $this->startFileTransaction(); + + if (empty($options['upgrade'])) { + // checks to do only when installing new packages + if (empty($options['force']) && $this->registry->packageExists($pkgname)) { + return $this->raiseError("$pkgname already installed"); + } + } else { + if ($this->registry->packageExists($pkgname)) { + $v1 = $this->registry->packageInfo($pkgname, 'version'); + $v2 = $pkginfo['version']; + $cmp = version_compare("$v1", "$v2", 'gt'); + if (empty($options['force']) && !version_compare("$v2", "$v1", 'gt')) { + return $this->raiseError("upgrade to a newer version ($v2 is not newer than $v1)"); + } + if (empty($options['register-only'])) { + // when upgrading, remove old release's files first: + if (PEAR::isError($err = $this->_deletePackageFiles($pkgname))) { + return $this->raiseError($err); + } + } + } + } + + // {{{ Copy files to dest dir --------------------------------------- + + // info from the package it self we want to access from _installFile + $this->pkginfo = &$pkginfo; + // used to determine whether we should build any C code + $this->source_files = 0; + + if (empty($options['register-only'])) { + if (!is_dir($php_dir)) { + return $this->raiseError("no script destination directory\n", + null, PEAR_ERROR_DIE); + } + + $tmp_path = dirname($descfile); + if (substr($pkgfile, -4) != '.xml') { + $tmp_path .= DIRECTORY_SEPARATOR . $pkgname . '-' . $pkginfo['version']; + } + + // ==> XXX This part should be removed later on + if ($flag_old_format) { + $tmp_path = dirname($descfile); + } + // <== XXX This part should be removed later on + + // {{{ install files + foreach ($pkginfo['filelist'] as $file => $atts) { + $this->expectError(PEAR_INSTALLER_FAILED); + $res = $this->_installFile($file, $atts, $tmp_path, $options); + $this->popExpect(); + if (PEAR::isError($res)) { + if (empty($options['ignore-errors'])) { + $this->rollbackFileTransaction(); + if ($res->getMessage() == "file does not exist") { + $this->raiseError("file $file in package.xml does not exist"); + } + return $this->raiseError($res); + } else { + $this->log(0, "Warning: " . $res->getMessage()); + } + } + if ($res != PEAR_INSTALLER_OK) { + // Do not register files that were not installed + unset($pkginfo['filelist'][$file]); + } + } + // }}} + + // {{{ compile and install source files + if ($this->source_files > 0 && empty($options['nobuild'])) { + $this->log(1, "$this->source_files source files, building"); + $bob = &new PEAR_Builder($this->ui); + $bob->debug = $this->debug; + $built = $bob->build($descfile, array(&$this, '_buildCallback')); + if (PEAR::isError($built)) { + $this->rollbackFileTransaction(); + return $built; + } + $this->log(1, "\nBuild process completed successfully"); + foreach ($built as $ext) { + $bn = basename($ext['file']); + list($_ext_name, $_ext_suff) = explode('.', $bn); + if ($_ext_suff == '.so' || $_ext_suff == '.dll') { + if (extension_loaded($_ext_name)) { + $this->raiseError("Extension '$_ext_name' already loaded. " . + 'Please unload it in your php.ini file ' . + 'prior to install or upgrade'); + } + $role = 'ext'; + } else { + $role = 'src'; + } + $dest = $ext['dest']; + $this->log(1, "Installing '$ext[file]'"); + $copyto = $this->_prependPath($dest, $this->installroot); + $copydir = dirname($copyto); + if (!@is_dir($copydir)) { + if (!$this->mkDirHier($copydir)) { + return $this->raiseError("failed to mkdir $copydir", + PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ mkdir $copydir"); + } + if (!@copy($ext['file'], $copyto)) { + return $this->raiseError("failed to write $copyto", PEAR_INSTALLER_FAILED); + } + $this->log(3, "+ cp $ext[file] $copyto"); + if (!OS_WINDOWS) { + $mode = 0666 & ~(int)octdec($this->config->get('umask')); + $this->addFileOperation('chmod', array($mode, $copyto)); + if (!@chmod($copyto, $mode)) { + $this->log(0, "failed to change mode of $copyto"); + } + } + $this->addFileOperation('rename', array($ext['file'], $copyto)); + + $pkginfo['filelist'][$bn] = array( + 'role' => $role, + 'installed_as' => $dest, + 'php_api' => $ext['php_api'], + 'zend_mod_api' => $ext['zend_mod_api'], + 'zend_ext_api' => $ext['zend_ext_api'], + ); + } + } + // }}} + } + + if (!$this->commitFileTransaction()) { + $this->rollbackFileTransaction(); + return $this->raiseError("commit failed", PEAR_INSTALLER_FAILED); + } + // }}} + + $ret = false; + // {{{ Register that the package is installed ----------------------- + if (empty($options['upgrade'])) { + // if 'force' is used, replace the info in registry + if (!empty($options['force']) && $this->registry->packageExists($pkgname)) { + $this->registry->deletePackage($pkgname); + } + $ret = $this->registry->addPackage($pkgname, $pkginfo); + } else { + // new: upgrade installs a package if it isn't installed + if (!$this->registry->packageExists($pkgname)) { + $ret = $this->registry->addPackage($pkgname, $pkginfo); + } else { + $ret = $this->registry->updatePackage($pkgname, $pkginfo, false); + } + } + if (!$ret) { + return $this->raiseError("Adding package $pkgname to registry failed"); + } + // }}} + return $pkginfo; + } + + // }}} + // {{{ uninstall() + + /** + * Uninstall a package + * + * This method removes all files installed by the application, and then + * removes any empty directories. + * @param string package name + * @param array Command-line options. Possibilities include: + * + * - installroot: base installation dir, if not the default + * - nodeps: do not process dependencies of other packages to ensure + * uninstallation does not break things + */ + function uninstall($package, $options = array()) + { + $php_dir = $this->config->get('php_dir'); + if (isset($options['installroot'])) { + if (substr($options['installroot'], -1) == DIRECTORY_SEPARATOR) { + $options['installroot'] = substr($options['installroot'], 0, -1); + } + $this->installroot = $options['installroot']; + $php_dir = $this->_prependPath($php_dir, $this->installroot); + } else { + $this->installroot = ''; + } + $this->registry = &new PEAR_Registry($php_dir); + $filelist = $this->registry->packageInfo($package, 'filelist'); + if ($filelist == null) { + return $this->raiseError("$package not installed"); + } + if (empty($options['nodeps'])) { + $depchecker = &new PEAR_Dependency($this->registry); + $error = $depchecker->checkPackageUninstall($errors, $warning, $package); + if ($error) { + return $this->raiseError($errors . 'uninstall failed'); + } + if ($warning) { + $this->log(0, $warning); + } + } + // {{{ Delete the files + $this->startFileTransaction(); + if (PEAR::isError($err = $this->_deletePackageFiles($package))) { + $this->rollbackFileTransaction(); + return $this->raiseError($err); + } + if (!$this->commitFileTransaction()) { + $this->rollbackFileTransaction(); + return $this->raiseError("uninstall failed"); + } else { + $this->startFileTransaction(); + if (!isset($filelist['dirtree']) || !count($filelist['dirtree'])) { + return $this->registry->deletePackage($package); + } + // attempt to delete empty directories + uksort($filelist['dirtree'], array($this, '_sortDirs')); + foreach($filelist['dirtree'] as $dir => $notused) { + $this->addFileOperation('rmdir', array($dir)); + } + if (!$this->commitFileTransaction()) { + $this->rollbackFileTransaction(); + } + } + // }}} + + // Register that the package is no longer installed + return $this->registry->deletePackage($package); + } + + // }}} + // {{{ _sortDirs() + function _sortDirs($a, $b) + { + if (strnatcmp($a, $b) == -1) return 1; + if (strnatcmp($a, $b) == 1) return -1; + return 0; + } + + // }}} + // {{{ checkDeps() + + /** + * Check if the package meets all dependencies + * + * @param array Package information (passed by reference) + * @param string Error message (passed by reference) + * @return boolean False when no error occured, otherwise true + */ + function checkDeps(&$pkginfo, &$errors) + { + if (empty($this->registry)) { + $this->registry = &new PEAR_Registry($this->config->get('php_dir')); + } + $depchecker = &new PEAR_Dependency($this->registry); + $error = $errors = ''; + $failed_deps = $optional_deps = array(); + if (is_array($pkginfo['release_deps'])) { + foreach($pkginfo['release_deps'] as $dep) { + $code = $depchecker->callCheckMethod($error, $dep); + if ($code) { + if (isset($dep['optional']) && $dep['optional'] == 'yes') { + $optional_deps[] = array($dep, $code, $error); + } else { + $failed_deps[] = array($dep, $code, $error); + } + } + } + // {{{ failed dependencies + $n = count($failed_deps); + if ($n > 0) { + for ($i = 0; $i < $n; $i++) { + if (isset($failed_deps[$i]['type'])) { + $type = $failed_deps[$i]['type']; + } else { + $type = 'pkg'; + } + switch ($failed_deps[$i][1]) { + case PEAR_DEPENDENCY_MISSING: + if ($type == 'pkg') { + // install + } + $errors .= "\n" . $failed_deps[$i][2]; + break; + case PEAR_DEPENDENCY_UPGRADE_MINOR: + if ($type == 'pkg') { + // upgrade + } + $errors .= "\n" . $failed_deps[$i][2]; + break; + default: + $errors .= "\n" . $failed_deps[$i][2]; + break; + } + } + return true; + } + // }}} + + // {{{ optional dependencies + $count_optional = count($optional_deps); + if ($count_optional > 0) { + $errors = "Optional dependencies:"; + + for ($i = 0; $i < $count_optional; $i++) { + if (isset($optional_deps[$i]['type'])) { + $type = $optional_deps[$i]['type']; + } else { + $type = 'pkg'; + } + switch ($optional_deps[$i][1]) { + case PEAR_DEPENDENCY_MISSING: + case PEAR_DEPENDENCY_UPGRADE_MINOR: + default: + $errors .= "\n" . $optional_deps[$i][2]; + break; + } + } + return false; + } + // }}} + } + return false; + } + + // }}} + // {{{ _buildCallback() + + function _buildCallback($what, $data) + { + if (($what == 'cmdoutput' && $this->debug > 1) || + ($what == 'output' && $this->debug > 0)) { + $this->ui->outputData(rtrim($data), 'build'); + } + } + + // }}} +} + +// {{{ md5_file() utility function +if (!function_exists("md5_file")) { + function md5_file($filename) { + $fp = fopen($filename, "r"); + if (!$fp) return null; + $contents = fread($fp, filesize($filename)); + fclose($fp); + return md5($contents); + } +} +// }}} + +?> diff --git a/includes/PEAR/Packager.php b/includes/PEAR/Packager.php new file mode 100644 index 0000000..3ed209b --- /dev/null +++ b/includes/PEAR/Packager.php @@ -0,0 +1,165 @@ + | +// | Tomas V.V.Cox | +// +----------------------------------------------------------------------+ +// +// $Id: Packager.php,v 1.53 2004/06/13 14:06:01 pajoye Exp $ + +require_once 'PEAR/Common.php'; +require_once 'System.php'; + +/** + * Administration class used to make a PEAR release tarball. + * + * TODO: + * - add an extra param the dir where to place the created package + * + * @since PHP 4.0.2 + * @author Stig Bakken + */ +class PEAR_Packager extends PEAR_Common +{ + // {{{ constructor + + function PEAR_Packager() + { + parent::PEAR_Common(); + } + + // }}} + // {{{ destructor + + function _PEAR_Packager() + { + parent::_PEAR_Common(); + } + + // }}} + + // {{{ package() + + function package($pkgfile = null, $compress = true) + { + // {{{ validate supplied package.xml file + if (empty($pkgfile)) { + $pkgfile = 'package.xml'; + } + // $this->pkginfo gets populated inside + $pkginfo = $this->infoFromDescriptionFile($pkgfile); + if (PEAR::isError($pkginfo)) { + return $this->raiseError($pkginfo); + } + + $pkgdir = dirname(realpath($pkgfile)); + $pkgfile = basename($pkgfile); + + $errors = $warnings = array(); + $this->validatePackageInfo($pkginfo, $errors, $warnings, $pkgdir); + foreach ($warnings as $w) { + $this->log(1, "Warning: $w"); + } + foreach ($errors as $e) { + $this->log(0, "Error: $e"); + } + if (sizeof($errors) > 0) { + return $this->raiseError('Errors in package'); + } + // }}} + + $pkgver = $pkginfo['package'] . '-' . $pkginfo['version']; + + // {{{ Create the package file list + $filelist = array(); + $i = 0; + + foreach ($pkginfo['filelist'] as $fname => $atts) { + $file = $pkgdir . DIRECTORY_SEPARATOR . $fname; + if (!file_exists($file)) { + return $this->raiseError("File does not exist: $fname"); + } else { + $filelist[$i++] = $file; + if (empty($pkginfo['filelist'][$fname]['md5sum'])) { + $md5sum = md5_file($file); + $pkginfo['filelist'][$fname]['md5sum'] = $md5sum; + } + $this->log(2, "Adding file $fname"); + } + } + // }}} + + // {{{ regenerate package.xml + $new_xml = $this->xmlFromInfo($pkginfo); + if (PEAR::isError($new_xml)) { + return $this->raiseError($new_xml); + } + if (!($tmpdir = System::mktemp(array('-d')))) { + return $this->raiseError("PEAR_Packager: mktemp failed"); + } + $newpkgfile = $tmpdir . DIRECTORY_SEPARATOR . 'package.xml'; + $np = @fopen($newpkgfile, 'wb'); + if (!$np) { + return $this->raiseError("PEAR_Packager: unable to rewrite $pkgfile as $newpkgfile"); + } + fwrite($np, $new_xml); + fclose($np); + // }}} + + // {{{ TAR the Package ------------------------------------------- + $ext = $compress ? '.tgz' : '.tar'; + $dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext; + $tar =& new Archive_Tar($dest_package, $compress); + $tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors + // ----- Creates with the package.xml file + $ok = $tar->createModify(array($newpkgfile), '', $tmpdir); + if (PEAR::isError($ok)) { + return $this->raiseError($ok); + } elseif (!$ok) { + return $this->raiseError('PEAR_Packager: tarball creation failed'); + } + // ----- Add the content of the package + if (!$tar->addModify($filelist, $pkgver, $pkgdir)) { + return $this->raiseError('PEAR_Packager: tarball creation failed'); + } + $this->log(1, "Package $dest_package done"); + if (file_exists("$pkgdir/CVS/Root")) { + $cvsversion = preg_replace('/[^a-z0-9]/i', '_', $pkginfo['version']); + $cvstag = "RELEASE_$cvsversion"; + $this->log(1, "Tag the released code with `pear cvstag $pkgfile'"); + $this->log(1, "(or set the CVS tag $cvstag by hand)"); + } + // }}} + + return $dest_package; + } + + // }}} +} + +// {{{ md5_file() utility function +if (!function_exists('md5_file')) { + function md5_file($file) { + if (!$fd = @fopen($file, 'r')) { + return false; + } + $md5 = md5(fread($fd, filesize($file))); + fclose($fd); + return $md5; + } +} +// }}} + +?> diff --git a/includes/PEAR/Registry.php b/includes/PEAR/Registry.php new file mode 100644 index 0000000..f2510a3 --- /dev/null +++ b/includes/PEAR/Registry.php @@ -0,0 +1,538 @@ + | +// | Tomas V.V.Cox | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: Registry.php,v 1.50.4.3 2004/10/26 19:19:56 cellog Exp $ + +/* +TODO: + - Transform into singleton() + - Add application level lock (avoid change the registry from the cmdline + while using the GTK interface, for ex.) +*/ +require_once "System.php"; +require_once "PEAR.php"; + +define('PEAR_REGISTRY_ERROR_LOCK', -2); +define('PEAR_REGISTRY_ERROR_FORMAT', -3); +define('PEAR_REGISTRY_ERROR_FILE', -4); + +/** + * Administration class used to maintain the installed package database. + */ +class PEAR_Registry extends PEAR +{ + // {{{ properties + + /** Directory where registry files are stored. + * @var string + */ + var $statedir = ''; + + /** File where the file map is stored + * @var string + */ + var $filemap = ''; + + /** Name of file used for locking the registry + * @var string + */ + var $lockfile = ''; + + /** File descriptor used during locking + * @var resource + */ + var $lock_fp = null; + + /** Mode used during locking + * @var int + */ + var $lock_mode = 0; // XXX UNUSED + + /** Cache of package information. Structure: + * array( + * 'package' => array('id' => ... ), + * ... ) + * @var array + */ + var $pkginfo_cache = array(); + + /** Cache of file map. Structure: + * array( '/path/to/file' => 'package', ... ) + * @var array + */ + var $filemap_cache = array(); + + // }}} + + // {{{ constructor + + /** + * PEAR_Registry constructor. + * + * @param string (optional) PEAR install directory (for .php files) + * + * @access public + */ + function PEAR_Registry($pear_install_dir = PEAR_INSTALL_DIR) + { + parent::PEAR(); + $ds = DIRECTORY_SEPARATOR; + $this->install_dir = $pear_install_dir; + $this->statedir = $pear_install_dir.$ds.'.registry'; + $this->filemap = $pear_install_dir.$ds.'.filemap'; + $this->lockfile = $pear_install_dir.$ds.'.lock'; + + // XXX Compatibility code should be removed in the future + // rename all registry files if any to lowercase + if (!OS_WINDOWS && $handle = @opendir($this->statedir)) { + $dest = $this->statedir . DIRECTORY_SEPARATOR; + while (false !== ($file = readdir($handle))) { + if (preg_match('/^.*[A-Z].*\.reg$/', $file)) { + rename($dest . $file, $dest . strtolower($file)); + } + } + closedir($handle); + } + if (!file_exists($this->filemap)) { + $this->rebuildFileMap(); + } + } + + // }}} + // {{{ destructor + + /** + * PEAR_Registry destructor. Makes sure no locks are forgotten. + * + * @access private + */ + function _PEAR_Registry() + { + parent::_PEAR(); + if (is_resource($this->lock_fp)) { + $this->_unlock(); + } + } + + // }}} + + // {{{ _assertStateDir() + + /** + * Make sure the directory where we keep registry files exists. + * + * @return bool TRUE if directory exists, FALSE if it could not be + * created + * + * @access private + */ + function _assertStateDir() + { + if (!@is_dir($this->statedir)) { + if (!System::mkdir(array('-p', $this->statedir))) { + return $this->raiseError("could not create directory '{$this->statedir}'"); + } + } + return true; + } + + // }}} + // {{{ _packageFileName() + + /** + * Get the name of the file where data for a given package is stored. + * + * @param string package name + * + * @return string registry file name + * + * @access public + */ + function _packageFileName($package) + { + return $this->statedir . DIRECTORY_SEPARATOR . strtolower($package) . '.reg'; + } + + // }}} + // {{{ _openPackageFile() + + function _openPackageFile($package, $mode) + { + $this->_assertStateDir(); + $file = $this->_packageFileName($package); + $fp = @fopen($file, $mode); + if (!$fp) { + return null; + } + return $fp; + } + + // }}} + // {{{ _closePackageFile() + + function _closePackageFile($fp) + { + fclose($fp); + } + + // }}} + // {{{ rebuildFileMap() + + function rebuildFileMap() + { + $packages = $this->listPackages(); + $files = array(); + foreach ($packages as $package) { + $version = $this->packageInfo($package, 'version'); + $filelist = $this->packageInfo($package, 'filelist'); + if (!is_array($filelist)) { + continue; + } + foreach ($filelist as $name => $attrs) { + if (isset($attrs['role']) && $attrs['role'] != 'php') { + continue; + } + if (isset($attrs['baseinstalldir'])) { + $file = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; + } else { + $file = $name; + } + $file = preg_replace(',^/+,', '', $file); + $files[$file] = $package; + } + } + $this->_assertStateDir(); + $fp = @fopen($this->filemap, 'wb'); + if (!$fp) { + return false; + } + $this->filemap_cache = $files; + fwrite($fp, serialize($files)); + fclose($fp); + return true; + } + + // }}} + // {{{ readFileMap() + + function readFileMap() + { + $fp = @fopen($this->filemap, 'r'); + if (!$fp) { + return $this->raiseError('PEAR_Registry: could not open filemap', PEAR_REGISTRY_ERROR_FILE, null, null, $php_errormsg); + } + $fsize = filesize($this->filemap); + $rt = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $data = fread($fp, $fsize); + set_magic_quotes_runtime($rt); + fclose($fp); + $tmp = unserialize($data); + if (!$tmp && $fsize > 7) { + return $this->raiseError('PEAR_Registry: invalid filemap data', PEAR_REGISTRY_ERROR_FORMAT, null, null, $data); + } + $this->filemap_cache = $tmp; + return true; + } + + // }}} + // {{{ _lock() + + /** + * Lock the registry. + * + * @param integer lock mode, one of LOCK_EX, LOCK_SH or LOCK_UN. + * See flock manual for more information. + * + * @return bool TRUE on success, FALSE if locking failed, or a + * PEAR error if some other error occurs (such as the + * lock file not being writable). + * + * @access private + */ + function _lock($mode = LOCK_EX) + { + if (!eregi('Windows 9', php_uname())) { + if ($mode != LOCK_UN && is_resource($this->lock_fp)) { + // XXX does not check type of lock (LOCK_SH/LOCK_EX) + return true; + } + if (PEAR::isError($err = $this->_assertStateDir())) { + return $err; + } + $open_mode = 'w'; + // XXX People reported problems with LOCK_SH and 'w' + if ($mode === LOCK_SH || $mode === LOCK_UN) { + if (@!is_file($this->lockfile)) { + touch($this->lockfile); + } + $open_mode = 'r'; + } + + if (!is_resource($this->lock_fp)) { + $this->lock_fp = @fopen($this->lockfile, $open_mode); + } + + if (!is_resource($this->lock_fp)) { + return $this->raiseError("could not create lock file" . + (isset($php_errormsg) ? ": " . $php_errormsg : "")); + } + if (!(int)flock($this->lock_fp, $mode)) { + switch ($mode) { + case LOCK_SH: $str = 'shared'; break; + case LOCK_EX: $str = 'exclusive'; break; + case LOCK_UN: $str = 'unlock'; break; + default: $str = 'unknown'; break; + } + return $this->raiseError("could not acquire $str lock ($this->lockfile)", + PEAR_REGISTRY_ERROR_LOCK); + } + } + return true; + } + + // }}} + // {{{ _unlock() + + function _unlock() + { + $ret = $this->_lock(LOCK_UN); + if (is_resource($this->lock_fp)) { + fclose($this->lock_fp); + } + $this->lock_fp = null; + return $ret; + } + + // }}} + // {{{ _packageExists() + + function _packageExists($package) + { + return file_exists($this->_packageFileName($package)); + } + + // }}} + // {{{ _packageInfo() + + function _packageInfo($package = null, $key = null) + { + if ($package === null) { + return array_map(array($this, '_packageInfo'), + $this->_listPackages()); + } + $fp = $this->_openPackageFile($package, 'r'); + if ($fp === null) { + return null; + } + $rt = get_magic_quotes_runtime(); + set_magic_quotes_runtime(0); + $data = fread($fp, filesize($this->_packageFileName($package))); + set_magic_quotes_runtime($rt); + $this->_closePackageFile($fp); + $data = unserialize($data); + if ($key === null) { + return $data; + } + if (isset($data[$key])) { + return $data[$key]; + } + return null; + } + + // }}} + // {{{ _listPackages() + + function _listPackages() + { + $pkglist = array(); + $dp = @opendir($this->statedir); + if (!$dp) { + return $pkglist; + } + while ($ent = readdir($dp)) { + if ($ent{0} == '.' || substr($ent, -4) != '.reg') { + continue; + } + $pkglist[] = substr($ent, 0, -4); + } + return $pkglist; + } + + // }}} + + // {{{ packageExists() + + function packageExists($package) + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_packageExists($package); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ packageInfo() + + function packageInfo($package = null, $key = null) + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_packageInfo($package, $key); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ listPackages() + + function listPackages() + { + if (PEAR::isError($e = $this->_lock(LOCK_SH))) { + return $e; + } + $ret = $this->_listPackages(); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ addPackage() + + function addPackage($package, $info) + { + if ($this->packageExists($package)) { + return false; + } + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $fp = $this->_openPackageFile($package, 'wb'); + if ($fp === null) { + $this->_unlock(); + return false; + } + $info['_lastmodified'] = time(); + fwrite($fp, serialize($info)); + $this->_closePackageFile($fp); + $this->_unlock(); + return true; + } + + // }}} + // {{{ deletePackage() + + function deletePackage($package) + { + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $file = $this->_packageFileName($package); + $ret = @unlink($file); + $this->rebuildFileMap(); + $this->_unlock(); + return $ret; + } + + // }}} + // {{{ updatePackage() + + function updatePackage($package, $info, $merge = true) + { + $oldinfo = $this->packageInfo($package); + if (empty($oldinfo)) { + return false; + } + if (PEAR::isError($e = $this->_lock(LOCK_EX))) { + return $e; + } + $fp = $this->_openPackageFile($package, 'w'); + if ($fp === null) { + $this->_unlock(); + return false; + } + $info['_lastmodified'] = time(); + if ($merge) { + fwrite($fp, serialize(array_merge($oldinfo, $info))); + } else { + fwrite($fp, serialize($info)); + } + $this->_closePackageFile($fp); + if (isset($info['filelist'])) { + $this->rebuildFileMap(); + } + $this->_unlock(); + return true; + } + + // }}} + // {{{ checkFileMap() + + /** + * Test whether a file belongs to a package. + * + * @param string $path file path, absolute or relative to the pear + * install dir + * + * @return string which package the file belongs to, or an empty + * string if the file does not belong to an installed package + * + * @access public + */ + function checkFileMap($path) + { + if (is_array($path)) { + static $notempty; + if (empty($notempty)) { + $notempty = create_function('$a','return !empty($a);'); + } + $pkgs = array(); + foreach ($path as $name => $attrs) { + if (is_array($attrs) && isset($attrs['baseinstalldir'])) { + $name = $attrs['baseinstalldir'].DIRECTORY_SEPARATOR.$name; + } + $pkgs[$name] = $this->checkFileMap($name); + } + return array_filter($pkgs, $notempty); + } + if (empty($this->filemap_cache) && PEAR::isError($this->readFileMap())) { + return $err; + } + if (isset($this->filemap_cache[$path])) { + return $this->filemap_cache[$path]; + } + $l = strlen($this->install_dir); + if (substr($path, 0, $l) == $this->install_dir) { + $path = preg_replace('!^'.DIRECTORY_SEPARATOR.'+!', '', substr($path, $l)); + } + if (isset($this->filemap_cache[$path])) { + return $this->filemap_cache[$path]; + } + return ''; + } + + // }}} + +} + +?> diff --git a/includes/PEAR/Remote.php b/includes/PEAR/Remote.php new file mode 100644 index 0000000..7b1e314 --- /dev/null +++ b/includes/PEAR/Remote.php @@ -0,0 +1,394 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: Remote.php,v 1.50 2004/06/08 18:03:46 cellog Exp $ + +require_once 'PEAR.php'; +require_once 'PEAR/Config.php'; + +/** + * This is a class for doing remote operations against the central + * PEAR database. + * + * @nodep XML_RPC_Value + * @nodep XML_RPC_Message + * @nodep XML_RPC_Client + */ +class PEAR_Remote extends PEAR +{ + // {{{ properties + + var $config = null; + var $cache = null; + + // }}} + + // {{{ PEAR_Remote(config_object) + + function PEAR_Remote(&$config) + { + $this->PEAR(); + $this->config = &$config; + } + + // }}} + + // {{{ getCache() + + + function getCache($args) + { + $id = md5(serialize($args)); + $cachedir = $this->config->get('cache_dir'); + $filename = $cachedir . DIRECTORY_SEPARATOR . 'xmlrpc_cache_' . $id; + if (!file_exists($filename)) { + return null; + }; + + $fp = fopen($filename, 'rb'); + if (!$fp) { + return null; + } + $content = fread($fp, filesize($filename)); + fclose($fp); + $result = array( + 'age' => time() - filemtime($filename), + 'lastChange' => filemtime($filename), + 'content' => unserialize($content), + ); + return $result; + } + + // }}} + + // {{{ saveCache() + + function saveCache($args, $data) + { + $id = md5(serialize($args)); + $cachedir = $this->config->get('cache_dir'); + if (!file_exists($cachedir)) { + System::mkdir(array('-p', $cachedir)); + } + $filename = $cachedir.'/xmlrpc_cache_'.$id; + + $fp = @fopen($filename, "wb"); + if ($fp) { + fwrite($fp, serialize($data)); + fclose($fp); + }; + } + + // }}} + + // {{{ call(method, [args...]) + + function call($method) + { + $_args = $args = func_get_args(); + + $this->cache = $this->getCache($args); + $cachettl = $this->config->get('cache_ttl'); + // If cache is newer than $cachettl seconds, we use the cache! + if ($this->cache !== null && $this->cache['age'] < $cachettl) { + return $this->cache['content']; + }; + + if (extension_loaded("xmlrpc")) { + $result = call_user_func_array(array(&$this, 'call_epi'), $args); + if (!PEAR::isError($result)) { + $this->saveCache($_args, $result); + }; + return $result; + } + if (!@include_once("XML/RPC.php")) { + return $this->raiseError("For this remote PEAR operation you need to install the XML_RPC package"); + } + array_shift($args); + $server_host = $this->config->get('master_server'); + $username = $this->config->get('username'); + $password = $this->config->get('password'); + $eargs = array(); + foreach($args as $arg) $eargs[] = $this->_encode($arg); + $f = new XML_RPC_Message($method, $eargs); + if ($this->cache !== null) { + $maxAge = '?maxAge='.$this->cache['lastChange']; + } else { + $maxAge = ''; + }; + $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; + if ($proxy = parse_url($this->config->get('http_proxy'))) { + $proxy_host = @$proxy['host']; + $proxy_port = @$proxy['port']; + $proxy_user = @urldecode(@$proxy['user']); + $proxy_pass = @urldecode(@$proxy['pass']); + } + $c = new XML_RPC_Client('/xmlrpc.php'.$maxAge, $server_host, 80, $proxy_host, $proxy_port, $proxy_user, $proxy_pass); + if ($username && $password) { + $c->setCredentials($username, $password); + } + if ($this->config->get('verbose') >= 3) { + $c->setDebug(1); + } + $r = $c->send($f); + if (!$r) { + return $this->raiseError("XML_RPC send failed"); + } + $v = $r->value(); + if ($e = $r->faultCode()) { + if ($e == $GLOBALS['XML_RPC_err']['http_error'] && strstr($r->faultString(), '304 Not Modified') !== false) { + return $this->cache['content']; + } + return $this->raiseError($r->faultString(), $e); + } + + $result = XML_RPC_decode($v); + $this->saveCache($_args, $result); + return $result; + } + + // }}} + + // {{{ call_epi(method, [args...]) + + function call_epi($method) + { + do { + if (extension_loaded("xmlrpc")) { + break; + } + if (OS_WINDOWS) { + $ext = 'dll'; + } elseif (PHP_OS == 'HP-UX') { + $ext = 'sl'; + } elseif (PHP_OS == 'AIX') { + $ext = 'a'; + } else { + $ext = 'so'; + } + $ext = OS_WINDOWS ? 'dll' : 'so'; + @dl("xmlrpc-epi.$ext"); + if (extension_loaded("xmlrpc")) { + break; + } + @dl("xmlrpc.$ext"); + if (extension_loaded("xmlrpc")) { + break; + } + return $this->raiseError("unable to load xmlrpc extension"); + } while (false); + $params = func_get_args(); + array_shift($params); + $method = str_replace("_", ".", $method); + $request = xmlrpc_encode_request($method, $params); + $server_host = $this->config->get("master_server"); + if (empty($server_host)) { + return $this->raiseError("PEAR_Remote::call: no master_server configured"); + } + $server_port = 80; + if ($http_proxy = $this->config->get('http_proxy')) { + $proxy = parse_url($http_proxy); + $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; + $proxy_host = @$proxy['host']; + $proxy_port = @$proxy['port']; + $proxy_user = @urldecode(@$proxy['user']); + $proxy_pass = @urldecode(@$proxy['pass']); + $fp = @fsockopen($proxy_host, $proxy_port); + $use_proxy = true; + } else { + $use_proxy = false; + $fp = @fsockopen($server_host, $server_port); + } + if (!$fp && $http_proxy) { + return $this->raiseError("PEAR_Remote::call: fsockopen(`$proxy_host', $proxy_port) failed"); + } elseif (!$fp) { + return $this->raiseError("PEAR_Remote::call: fsockopen(`$server_host', $server_port) failed"); + } + $len = strlen($request); + $req_headers = "Host: $server_host:$server_port\r\n" . + "Content-type: text/xml\r\n" . + "Content-length: $len\r\n"; + $username = $this->config->get('username'); + $password = $this->config->get('password'); + if ($username && $password) { + $req_headers .= "Cookie: PEAR_USER=$username; PEAR_PW=$password\r\n"; + $tmp = base64_encode("$username:$password"); + $req_headers .= "Authorization: Basic $tmp\r\n"; + } + if ($this->cache !== null) { + $maxAge = '?maxAge='.$this->cache['lastChange']; + } else { + $maxAge = ''; + }; + + if ($use_proxy && $proxy_host != '' && $proxy_user != '') { + $req_headers .= 'Proxy-Authorization: Basic ' + .base64_encode($proxy_user.':'.$proxy_pass) + ."\r\n"; + } + + if ($this->config->get('verbose') > 3) { + print "XMLRPC REQUEST HEADERS:\n"; + var_dump($req_headers); + print "XMLRPC REQUEST BODY:\n"; + var_dump($request); + } + + if ($use_proxy && $proxy_host != '') { + $post_string = "POST http://".$server_host; + if ($proxy_port > '') { + $post_string .= ':'.$server_port; + } + } else { + $post_string = "POST "; + } + + fwrite($fp, ($post_string."/xmlrpc.php$maxAge HTTP/1.0\r\n$req_headers\r\n$request")); + $response = ''; + $line1 = fgets($fp, 2048); + if (!preg_match('!^HTTP/[0-9\.]+ (\d+) (.*)!', $line1, $matches)) { + return $this->raiseError("PEAR_Remote: invalid HTTP response from XML-RPC server"); + } + switch ($matches[1]) { + case "200": // OK + break; + case "304": // Not Modified + return $this->cache['content']; + case "401": // Unauthorized + if ($username && $password) { + return $this->raiseError("PEAR_Remote: authorization failed", 401); + } else { + return $this->raiseError("PEAR_Remote: authorization required, please log in first", 401); + } + default: + return $this->raiseError("PEAR_Remote: unexpected HTTP response", (int)$matches[1], null, null, "$matches[1] $matches[2]"); + } + while (trim(fgets($fp, 2048)) != ''); // skip rest of headers + while ($chunk = fread($fp, 10240)) { + $response .= $chunk; + } + fclose($fp); + if ($this->config->get('verbose') > 3) { + print "XMLRPC RESPONSE:\n"; + var_dump($response); + } + $ret = xmlrpc_decode($response); + if (is_array($ret) && isset($ret['__PEAR_TYPE__'])) { + if ($ret['__PEAR_TYPE__'] == 'error') { + if (isset($ret['__PEAR_CLASS__'])) { + $class = $ret['__PEAR_CLASS__']; + } else { + $class = "PEAR_Error"; + } + if ($ret['code'] === '') $ret['code'] = null; + if ($ret['message'] === '') $ret['message'] = null; + if ($ret['userinfo'] === '') $ret['userinfo'] = null; + if (strtolower($class) == 'db_error') { + $ret = $this->raiseError(PEAR::errorMessage($ret['code']), + $ret['code'], null, null, + $ret['userinfo']); + } else { + $ret = $this->raiseError($ret['message'], $ret['code'], + null, null, $ret['userinfo']); + } + } + } elseif (is_array($ret) && sizeof($ret) == 1 && isset($ret[0]) + && is_array($ret[0]) && + !empty($ret[0]['faultString']) && + !empty($ret[0]['faultCode'])) { + extract($ret[0]); + $faultString = "XML-RPC Server Fault: " . + str_replace("\n", " ", $faultString); + return $this->raiseError($faultString, $faultCode); + } + return $ret; + } + + // }}} + + // {{{ _encode + + // a slightly extended version of XML_RPC_encode + function _encode($php_val) + { + global $XML_RPC_Boolean, $XML_RPC_Int, $XML_RPC_Double; + global $XML_RPC_String, $XML_RPC_Array, $XML_RPC_Struct; + + $type = gettype($php_val); + $xmlrpcval = new XML_RPC_Value; + + switch($type) { + case "array": + reset($php_val); + $firstkey = key($php_val); + end($php_val); + $lastkey = key($php_val); + if ($firstkey === 0 && is_int($lastkey) && + ($lastkey + 1) == count($php_val)) { + $is_continuous = true; + reset($php_val); + $size = count($php_val); + for ($expect = 0; $expect < $size; $expect++, next($php_val)) { + if (key($php_val) !== $expect) { + $is_continuous = false; + break; + } + } + if ($is_continuous) { + reset($php_val); + $arr = array(); + while (list($k, $v) = each($php_val)) { + $arr[$k] = $this->_encode($v); + } + $xmlrpcval->addArray($arr); + break; + } + } + // fall though if not numerical and continuous + case "object": + $arr = array(); + while (list($k, $v) = each($php_val)) { + $arr[$k] = $this->_encode($v); + } + $xmlrpcval->addStruct($arr); + break; + case "integer": + $xmlrpcval->addScalar($php_val, $XML_RPC_Int); + break; + case "double": + $xmlrpcval->addScalar($php_val, $XML_RPC_Double); + break; + case "string": + case "NULL": + $xmlrpcval->addScalar($php_val, $XML_RPC_String); + break; + case "boolean": + $xmlrpcval->addScalar($php_val, $XML_RPC_Boolean); + break; + case "unknown type": + default: + return null; + } + return $xmlrpcval; + } + + // }}} + +} + +?> diff --git a/includes/PEAR/RunTest.php b/includes/PEAR/RunTest.php new file mode 100644 index 0000000..1aa02aa --- /dev/null +++ b/includes/PEAR/RunTest.php @@ -0,0 +1,363 @@ + | +// | Greg Beaver | +// | | +// +----------------------------------------------------------------------+ +// +// $Id: RunTest.php,v 1.3.2.4 2005/02/17 17:47:55 cellog Exp $ +// + +/** + * Simplified version of PHP's test suite + * -- EXPERIMENTAL -- + + Try it with: + + $ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; $o=$t->run("./pear_system.phpt");print_r($o);' + + +TODO: + +Actually finish the development and testing + + */ + +require_once 'PEAR.php'; +require_once 'PEAR/Config.php'; + +define('DETAILED', 1); +putenv("PHP_PEAR_RUNTESTS=1"); + +class PEAR_RunTest +{ + var $_logger; + + /** + * An object that supports the PEAR_Common->log() signature, or null + * @param PEAR_Common|null + */ + function PEAR_RunTest($logger = null) + { + $this->_logger = $logger; + } + + // + // Run an individual test case. + // + + function run($file, $ini_settings = '') + { + $cwd = getcwd(); + $conf = &PEAR_Config::singleton(); + $php = $conf->get('php_bin'); + //var_dump($php);exit; + global $log_format, $info_params, $ini_overwrites; + + $info_params = ''; + $log_format = 'LEOD'; + + // Load the sections of the test file. + $section_text = array( + 'TEST' => '(unnamed test)', + 'SKIPIF' => '', + 'GET' => '', + 'ARGS' => '', + ); + + if (!is_file($file) || !$fp = fopen($file, "r")) { + return PEAR::raiseError("Cannot open test file: $file"); + } + + $section = ''; + while (!feof($fp)) { + $line = fgets($fp); + + // Match the beginning of a section. + if (ereg('^--([A-Z]+)--',$line,$r)) { + $section = $r[1]; + $section_text[$section] = ''; + continue; + } + + // Add to the section text. + $section_text[$section] .= $line; + } + fclose($fp); + + $shortname = str_replace($cwd.'/', '', $file); + $tested = trim($section_text['TEST'])." [$shortname]"; + + $tmp = realpath(dirname($file)); + $tmp_skipif = $tmp . uniqid('/phpt.'); + $tmp_file = ereg_replace('\.phpt$','.php',$file); + $tmp_post = $tmp . uniqid('/phpt.'); + + @unlink($tmp_skipif); + @unlink($tmp_file); + @unlink($tmp_post); + + // unlink old test results + @unlink(ereg_replace('\.phpt$','.diff',$file)); + @unlink(ereg_replace('\.phpt$','.log',$file)); + @unlink(ereg_replace('\.phpt$','.exp',$file)); + @unlink(ereg_replace('\.phpt$','.out',$file)); + + // Check if test should be skipped. + $info = ''; + $warn = false; + if (array_key_exists('SKIPIF', $section_text)) { + if (trim($section_text['SKIPIF'])) { + $this->save_text($tmp_skipif, $section_text['SKIPIF']); + //$extra = substr(PHP_OS, 0, 3) !== "WIN" ? + // "unset REQUEST_METHOD;": ""; + + //$output = `$extra $php $info_params -f $tmp_skipif`; + $output = `$php $info_params -f $tmp_skipif`; + unlink($tmp_skipif); + if (eregi("^skip", trim($output))) { + $skipreason = "SKIP $tested"; + $reason = (eregi("^skip[[:space:]]*(.+)\$", trim($output))) ? eregi_replace("^skip[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; + if ($reason) { + $skipreason .= " (reason: $reason)"; + } + $this->_logger->log(0, $skipreason); + if (isset($old_php)) { + $php = $old_php; + } + return 'SKIPPED'; + } + if (eregi("^info", trim($output))) { + $reason = (ereg("^info[[:space:]]*(.+)\$", trim($output))) ? ereg_replace("^info[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; + if ($reason) { + $info = " (info: $reason)"; + } + } + if (eregi("^warn", trim($output))) { + $reason = (ereg("^warn[[:space:]]*(.+)\$", trim($output))) ? ereg_replace("^warn[[:space:]]*(.+)\$", "\\1", trim($output)) : FALSE; + if ($reason) { + $warn = true; /* only if there is a reason */ + $info = " (warn: $reason)"; + } + } + } + } + + // We've satisfied the preconditions - run the test! + $this->save_text($tmp_file,$section_text['FILE']); + + $args = $section_text['ARGS'] ? ' -- '.$section_text['ARGS'] : ''; + + $cmd = "$php$ini_settings -f $tmp_file$args 2>&1"; + if (isset($this->_logger)) { + $this->_logger->log(2, 'Running command "' . $cmd . '"'); + } + + $savedir = getcwd(); // in case the test moves us around + if (isset($section_text['RETURNS'])) { + ob_start(); + system($cmd, $return_value); + $out = ob_get_contents(); + ob_end_clean(); + @unlink($tmp_post); + $section_text['RETURNS'] = (int) trim($section_text['RETURNS']); + $returnfail = ($return_value != $section_text['RETURNS']); + } else { + $out = `$cmd`; + $returnfail = false; + } + chdir($savedir); + // Does the output match what is expected? + $output = trim($out); + $output = preg_replace('/\r\n/', "\n", $output); + + if (isset($section_text['EXPECTF']) || isset($section_text['EXPECTREGEX'])) { + if (isset($section_text['EXPECTF'])) { + $wanted = trim($section_text['EXPECTF']); + } else { + $wanted = trim($section_text['EXPECTREGEX']); + } + $wanted_re = preg_replace('/\r\n/',"\n",$wanted); + if (isset($section_text['EXPECTF'])) { + $wanted_re = preg_quote($wanted_re, '/'); + // Stick to basics + $wanted_re = str_replace("%s", ".+?", $wanted_re); //not greedy + $wanted_re = str_replace("%i", "[+\-]?[0-9]+", $wanted_re); + $wanted_re = str_replace("%d", "[0-9]+", $wanted_re); + $wanted_re = str_replace("%x", "[0-9a-fA-F]+", $wanted_re); + $wanted_re = str_replace("%f", "[+\-]?\.?[0-9]+\.?[0-9]*(E-?[0-9]+)?", $wanted_re); + $wanted_re = str_replace("%c", ".", $wanted_re); + // %f allows two points "-.0.0" but that is the best *simple* expression + } + /* DEBUG YOUR REGEX HERE + var_dump($wanted_re); + print(str_repeat('=', 80) . "\n"); + var_dump($output); + */ + if (!$returnfail && preg_match("/^$wanted_re\$/s", $output)) { + @unlink($tmp_file); + $this->_logger->log(0, "PASS $tested$info"); + if (isset($old_php)) { + $php = $old_php; + } + return 'PASSED'; + } + + } else { + $wanted = trim($section_text['EXPECT']); + $wanted = preg_replace('/\r\n/',"\n",$wanted); + // compare and leave on success + $ok = (0 == strcmp($output,$wanted)); + if (!$returnfail && $ok) { + @unlink($tmp_file); + $this->_logger->log(0, "PASS $tested$info"); + if (isset($old_php)) { + $php = $old_php; + } + return 'PASSED'; + } + } + + // Test failed so we need to report details. + if ($warn) { + $this->_logger->log(0, "WARN $tested$info"); + } else { + $this->_logger->log(0, "FAIL $tested$info"); + } + + if (isset($section_text['RETURNS'])) { + $GLOBALS['__PHP_FAILED_TESTS__'][] = array( + 'name' => $file, + 'test_name' => $tested, + 'output' => ereg_replace('\.phpt$','.log', $file), + 'diff' => ereg_replace('\.phpt$','.diff', $file), + 'info' => $info, + 'return' => $return_value + ); + } else { + $GLOBALS['__PHP_FAILED_TESTS__'][] = array( + 'name' => $file, + 'test_name' => $tested, + 'output' => ereg_replace('\.phpt$','.log', $file), + 'diff' => ereg_replace('\.phpt$','.diff', $file), + 'info' => $info, + ); + } + + // write .exp + if (strpos($log_format,'E') !== FALSE) { + $logname = ereg_replace('\.phpt$','.exp',$file); + if (!$log = fopen($logname,'w')) { + return PEAR::raiseError("Cannot create test log - $logname"); + } + fwrite($log,$wanted); + fclose($log); + } + + // write .out + if (strpos($log_format,'O') !== FALSE) { + $logname = ereg_replace('\.phpt$','.out',$file); + if (!$log = fopen($logname,'w')) { + return PEAR::raiseError("Cannot create test log - $logname"); + } + fwrite($log,$output); + fclose($log); + } + + // write .diff + if (strpos($log_format,'D') !== FALSE) { + $logname = ereg_replace('\.phpt$','.diff',$file); + if (!$log = fopen($logname,'w')) { + return PEAR::raiseError("Cannot create test log - $logname"); + } + fwrite($log, $this->generate_diff($wanted, $output, + isset($section_text['RETURNS']) ? array(trim($section_text['RETURNS']), + $return_value) : null)); + fclose($log); + } + + // write .log + if (strpos($log_format,'L') !== FALSE) { + $logname = ereg_replace('\.phpt$','.log',$file); + if (!$log = fopen($logname,'w')) { + return PEAR::raiseError("Cannot create test log - $logname"); + } + fwrite($log," +---- EXPECTED OUTPUT +$wanted +---- ACTUAL OUTPUT +$output +---- FAILED +"); + if ($returnfail) { + fwrite($log," +---- EXPECTED RETURN +$section_text[RETURNS] +---- ACTUAL RETURN +$return_value +"); + } + fclose($log); + //error_report($file,$logname,$tested); + } + + if (isset($old_php)) { + $php = $old_php; + } + + return $warn ? 'WARNED' : 'FAILED'; + } + + function generate_diff($wanted, $output, $return_value) + { + $w = explode("\n", $wanted); + $o = explode("\n", $output); + $w1 = array_diff_assoc($w,$o); + $o1 = array_diff_assoc($o,$w); + $w2 = array(); + $o2 = array(); + foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1).$val; + foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1).$val; + $diff = array_merge($w2, $o2); + ksort($diff); + if ($return_value) { + $extra = "##EXPECTED: $return_value[0]\r\n##RETURNED: $return_value[1]"; + } else { + $extra = ''; + } + return implode("\r\n", $diff) . $extra; + } + + // + // Write the given text to a temporary file, and return the filename. + // + + function save_text($filename, $text) + { + if (!$fp = fopen($filename, 'w')) { + return PEAR::raiseError("Cannot open file '" . $filename . "' (save_text)"); + } + fwrite($fp,$text); + fclose($fp); + if (1 < DETAILED) echo " +FILE $filename {{{ +$text +}}} +"; + } + +} +?> \ No newline at end of file diff --git a/includes/tiny_mce/blank.htm b/includes/tiny_mce/blank.htm new file mode 100644 index 0000000..c1ff835 --- /dev/null +++ b/includes/tiny_mce/blank.htm @@ -0,0 +1,9 @@ + + + blank_page + + + + + + diff --git a/includes/tiny_mce/langs/ar.js b/includes/tiny_mce/langs/ar.js new file mode 100644 index 0000000..bb5804c --- /dev/null +++ b/includes/tiny_mce/langs/ar.js @@ -0,0 +1,43 @@ +// arabic lang variables +// Toolbar Items and Context Menu + +tinyMCE.addToLang('',{ +dir : 'rtl', +bold_desc : 'غامق', +italic_desc : 'مائل', +underline_desc : 'تسطير', +striketrough_desc : 'يتوسطه خط', +justifyleft_desc : 'محاذاة إلى اليسار', +justifycenter_desc : 'توسيط', +justifyright_desc : 'محاذاة إلى اليمين', +justifyfull_desc : 'ضبط', +bullist_desc : 'تعداد نقطي', +numlist_desc : 'تعداد رقمي', +outdent_desc : 'إنقاص المسافة البادئة', +indent_desc : 'زيادة المسافة البادئة', +undo_desc : 'تراجع', +redo_desc : 'إعادة', +link_desc : 'إدراج/تحرير رابط', +unlink_desc : 'إزالة رابط', +image_desc : 'إدراج/تحرير صورة', +cleanup_desc : 'Cleanup messy code', +focus_alert : 'A editor instance must be focused before using this command.', +edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?', +insert_link_title : 'إدراج/تحرير رابط', +insert : 'إدراج', +update : 'إدراج', +cancel : 'ألغي', +insert_link_url : 'رابط URL', +insert_link_target : 'الهدف', +insert_link_target_same : 'نفس الإطار', +insert_link_target_blank : 'إطار جديد (_blank)', +insert_image_title : 'إدراج/تحرير صورة', +insert_image_src : 'صورة URL', +insert_image_alt : 'الوصف', +help_desc : 'المساعدة', +bold_img : 'bold.gif', +italic_img : 'italic.gif', +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/ca.js b/includes/tiny_mce/langs/ca.js new file mode 100644 index 0000000..3a896fc --- /dev/null +++ b/includes/tiny_mce/langs/ca.js @@ -0,0 +1,41 @@ +// CA lang variables by Marc Bria + +tinyMCE.addToLang('',{ +bold_desc : 'Negreta', +italic_desc : 'Cursiva', +underline_desc : 'Subratllat', +striketrough_desc : 'Tatxat', +justifyleft_desc : 'Alinear a lŽesquerra', +justifycenter_desc : 'Alinear al centre', +justifyright_desc : 'Alinear a la dreta', +justifyfull_desc : 'Alinear justificat', +bullist_desc : 'Llista sense ordenar', +numlist_desc : 'Llista ordenada', +outdent_desc : 'Disminueix sangria', +indent_desc : 'Augmentar sangria', +undo_desc : 'Desfer', +redo_desc : 'Refer', +link_desc : 'Insertar enllaç', +unlink_desc : 'Treure enllaç', +image_desc : 'Insertar imatge', +cleanup_desc : 'Netejar codi', +focus_alert : 'LŽàrea de lŽeditor ha de ser enfocada abans dŽexecutar aquesta comanda.', +edit_confirm : 'Vols utilitzar el modus WYSIWYG per a aquesta àrea de text?', +insert_link_title : 'Insertar/editar enllaç', +insert : 'Insertar', +update : 'Insertar', +cancel : 'Cancel·lar', +insert_link_url : 'Adreça de lŽenllaç', +insert_link_target : 'Destí', +insert_link_target_same : 'Obrir enllaç a la mateixa finestra', +insert_link_target_blank : 'Obrir enllaç en una finestra nova', +insert_image_title : 'Insertar/editar imatge', +insert_image_src : 'URL de lŽimatge', +insert_image_alt : 'Descripció de la imatge', +help_desc : 'Ajut', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copiar/Tallar/Enganxar no és possible amb Mozilla i Firefox.\nVols més informació sobre aquest problema de seguretat?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/cs.js b/includes/tiny_mce/langs/cs.js new file mode 100644 index 0000000..afcbb9d --- /dev/null +++ b/includes/tiny_mce/langs/cs.js @@ -0,0 +1,52 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * @author Michi + * @author Pavel Novák + * @author Josef Klimosz + * + * $Id: cs.js,v 1.6 2005/10/18 13:59:21 spocke Exp $ + */ + + +tinyMCE.addToLang('',{ +bold_desc : 'Tučně', +italic_desc : 'Kurzíva', +underline_desc : 'PodtrÅŸení', +striketrough_desc : 'PřeÅ¡krtnutí', +justifyleft_desc : 'Zarovnání vlevo', +justifycenter_desc : 'Zarovnání na střed', +justifyright_desc : 'Zarovnání vpravo', +justifyfull_desc : 'Zarovnání do bloku', +bullist_desc : 'Seznam s odráşkami', +numlist_desc : 'ČíslovanÜ seznam', +outdent_desc : 'Sníşit odsazení', +indent_desc : 'ZvÜšit odsazení', +undo_desc : 'Zpět', +redo_desc : 'Znovu', +link_desc : 'VloÅŸit odkaz', +unlink_desc : 'ZruÅ¡it odkaz', +image_desc : 'VloÅŸit obrázek', +cleanup_desc : 'Vyčistit kód', +focus_alert : 'Před pouÅŸitím tohoto příkazu musí bÜt kurzor v okně editoru.', +edit_confirm : 'Chcete pouşít WYSIWYG editaci pro tento text?', +insert_link_title : 'VloÅŸit/upravit odkaz', +insert : 'VloÅŸit', +update : 'Změnit', +cancel : 'ZruÅ¡it', +insert_link_url : 'URL odkazu', +insert_link_target : 'Cíl', +insert_link_target_same : 'Otevřít odkaz ve stejném okně', +insert_link_target_blank : 'Otevřít odkaz v novém okně', +insert_image_title : 'VloÅŸit/upravit obrázek', +insert_image_src : 'URL obrázku', +insert_image_alt : 'Popis obrázku', +help_desc : 'Nápověda', +bold_img : 'bold.gif', +italic_img : 'italic.gif', +underline_img : "underline.gif", +clipboard_msg : 'Funkce Kopírovat/vyjmout/vloÅŸit nejsou pouÅŸitelné v Mozille a Firefoxu.\nChcete více informací o tomto problému?', +popup_blocked : 'Omlouváme se, ale blokovač vyskakovacích oken neumoÅŸnil otevřít okno, které zprostředkovává funkčnost aplikace. Musíte vypnout blokování vyskakovacích oken na tomto webu, abyste vyuÅŸili plné funkčnosti.' +}); + diff --git a/includes/tiny_mce/langs/cy.js b/includes/tiny_mce/langs/cy.js new file mode 100644 index 0000000..2ac5bbc --- /dev/null +++ b/includes/tiny_mce/langs/cy.js @@ -0,0 +1,41 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Bold (Ctrl+B)', +italic_desc : 'Italig (Ctrl+I)', +underline_desc : 'Tanlinellu (Ctrl+U)', +striketrough_desc : 'Llinell drwodd', +justifyleft_desc : 'Unioni i\'r chwith', +justifycenter_desc : 'Unioni i\'r canol', +justifyright_desc : 'Unioni i\'r dde', +justifyfull_desc : 'Unioni llawn', +bullist_desc : 'Rhestr heb drefn', +numlist_desc : 'Rhestr mewn trefn', +outdent_desc : 'Lleihau mewnoliad', +indent_desc : 'Cynyddu mewnoliad', +undo_desc : 'Dadwneud (Ctrl+Z)', +redo_desc : 'Ailwneud (Ctrl+Y)', +link_desc : 'Mewnosod/golygu dolen', +unlink_desc : 'Dadgysylltu', +image_desc : 'Mewnosod/golygu delwedd', +cleanup_desc : 'Tacluso côd', +focus_alert : 'Rhaid rhoi ffocws i\'r golygydd cyn defnyddio\'r gorchymyn hwn.', +edit_confirm : 'Wyt ti eisiau defnyddio\'r dull WYSIWYG ar gyfer yr ardal destun hon?', +insert_link_title : 'Mewnosod/golygu dolen', +insert : 'Mewnosod', +update : 'Diweddaru', +cancel : 'Diddymu', +insert_link_url : 'URL dolen', +insert_link_target : 'Targed', +insert_link_target_same : 'Agor dolen yn yr un ffenest', +insert_link_target_blank : 'Agor dolen mewn ffenest newydd', +insert_image_title : 'Mewnosod/golygu delwedd', +insert_image_src : 'URL delwedd', +insert_image_alt : 'Disgrifiad delwedd', +help_desc : 'Cymorth', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Dyw Copïo/Torri/Gludo ddim ar gael ym Mozilla na Firefox.\nHoffet ti ragor o wybodaeth ynghylch hyn?', +popup_blocked : 'Mae\'n ddrwg gennym, ond mae dy declyn atal ffenestri naid wedi analluogi ffenest sy\'n cynnig nodweddion i\'r rhaglen. Bydd rhaid i ti analluogi atal ffenestri naid ar gyfer y safle hon er mwyn cael y defnydd gorau o\'r rhaglen hwn.' +}); diff --git a/includes/tiny_mce/langs/da.js b/includes/tiny_mce/langs/da.js new file mode 100644 index 0000000..fa1888a --- /dev/null +++ b/includes/tiny_mce/langs/da.js @@ -0,0 +1,41 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +bold_desc : 'Fed', +italic_desc : 'Kursiv', +underline_desc : 'Understreg', +striketrough_desc : 'Gennemstreg', +justifyleft_desc : 'Venstrestil', +justifycenter_desc : 'Centrer', +justifyright_desc : 'Højrestil', +justifyfull_desc : 'Lige margin', +bullist_desc : 'Liste med bullets', +numlist_desc : 'Liste med tal', +outdent_desc : 'Ryk til venstre', +indent_desc : 'Ryk til højre', +undo_desc : 'Fortryd', +redo_desc : 'Gør igen', +link_desc : 'Indsæt link', +unlink_desc : 'Fjern link', +image_desc : 'Indsæt billede', +cleanup_desc : 'Ryd op i koden', +focus_alert : 'Der skal sættes fokus på sessionen, før man kan bruge denne kommando', +edit_confirm : 'Vil du bruge WYSIWYG mode til dette textområde?', +insert_link_title : 'Indsæt eller rediger link', +insert : 'Indsæt', +update : 'Opdater', +cancel : 'Fortryd', +insert_link_url : 'Linkadresse', +insert_link_target : 'Destination', +insert_link_target_same : 'Luk linket op i samme vindue', +insert_link_target_blank : 'Luk linket op i et nyt vindue', +insert_image_title : 'Indsæt / rediger billede', +insert_image_src : 'Billedets adresse', +insert_image_alt : 'Alternativ tekst', +help_desc : 'Hjælp', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Kopier/Klip/Indsæt virker ikke i Mozilla og Firefox.\nVil du vide mere om dette?', +popup_blocked : 'Beklager, men din browser blokerer for pop-up-vinduer. Skal du bruge denne editor fuldt ud, skal pop-up-vinduer være tilladt.' +}); diff --git a/includes/tiny_mce/langs/de.js b/includes/tiny_mce/langs/de.js new file mode 100644 index 0000000..e28f818 --- /dev/null +++ b/includes/tiny_mce/langs/de.js @@ -0,0 +1,41 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Fett', +italic_desc : 'Kursiv', +underline_desc : 'Unterstrichen', +striketrough_desc : 'Durchgestrichen', +justifyleft_desc : 'Linksbündig', +justifycenter_desc : 'Zentriert', +justifyright_desc : 'Rechtsbündig', +justifyfull_desc : 'Blocksatz', +bullist_desc : 'Aufzählungszeichen', +numlist_desc : 'Nummerierung', +outdent_desc : 'Einzug verkleinern', +indent_desc : 'Einzug vergrößern', +undo_desc : 'Rückgängig', +redo_desc : 'Wiederholen', +link_desc : 'Link einfügen/bearbeiten', +unlink_desc : 'Link entfernen', +image_desc : 'Bild einfügen/bearbeiten', +cleanup_desc : 'Unsauberen Code aufräumen', +focus_alert : 'Klicken Sie bitte vor Benutzung dieses Befehls auf das Editorfenster.', +edit_confirm : 'Wollen Sie den WYSIWYG-Modus für dieses Textfeld benutzen?', +insert_link_title : 'Link einfügen/bearbeiten', +insert : 'Einfügen', +update : 'Aktualisieren', +cancel : 'Abbrechen', +insert_link_url : 'Link-URL', +insert_link_target : 'Ziel', +insert_link_target_same : 'Link in gleichen Fester öffnen', +insert_link_target_blank : 'Link in neuen Fenster öffnen', +insert_image_title : 'Bild einfügen/bearbeiten', +insert_image_src : 'Bild-URL', +insert_image_alt : 'Bild-Beschreibung', +help_desc : 'Hilfe', +bold_img : "bold_de_se.gif", +italic_img : "italic_de_se.gif", +underline_img : "underline.gif", +clipboard_msg : 'Kopieren/Ausschneiden/Einfügen ist in Mozilla und Firefox nicht verfügbar.\nWollen Sie mehr Informationen darüber erhalten?', +popup_blocked : 'Ihr Popup-Blocker hat verhindert, dass das Bearbeitungsfenster des Editors geöffnet werden konnte. Bitte deaktivieren Sie den Popup-Schutz für diese Seite.' +}); diff --git a/includes/tiny_mce/langs/el.js b/includes/tiny_mce/langs/el.js new file mode 100644 index 0000000..09a8f8a --- /dev/null +++ b/includes/tiny_mce/langs/el.js @@ -0,0 +1,41 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +bold_desc : 'žíôïíç ãñáöÞ', +italic_desc : 'ÐëÜãéá ãñáöÞ', +underline_desc : 'ÕðïãñÜììéóç', +striketrough_desc : 'ÄéáêñéôÞ äéáãñáöÞ', +justifyleft_desc : 'Óôïß÷éóç áñéóôåñÜ', +justifycenter_desc : 'Óôïß÷éóç óôï êÝíôñï', +justifyright_desc : 'Óôïß÷éóç äåîéÜ', +justifyfull_desc : 'ÐëÞñçò óôïß÷éóç', +bullist_desc : 'Êïõêêßäåò', +numlist_desc : 'Áñßèìçóç', +outdent_desc : 'Ìåßùóç åóï÷Þò', +indent_desc : 'Áýîçóç åóï÷Þò', +undo_desc : 'Áíáßñåóç', +redo_desc : 'Áêýñùóç áíáßñåóçò', +link_desc : 'Äçìéïõñãßá/Äéüñèùóç õðåñ-óýíäåóçò', +unlink_desc : 'ÄéáãñáöÞ õðåñ-óýíäåóçò', +image_desc : 'ÅéóáãùãÞ/Äéüñèùóç åéêüíáò', +cleanup_desc : 'ÊáèÜñéóìá êþäéêá', +focus_alert : 'ÐñÝðåé íá õðÜñ÷åé åíåñãüò êÜðïéïò åðåîåñãáóôÞò êåéìÝíïõ ðñéí íá ÷ñçóéìïðïéÞóåôå áõôÞ ôçí åíôïëÞ.', +edit_confirm : 'ÈÝëåôå íá ÷ñçóéìïðïéÞóåôå ôçí êáôÜóôáóç WYSIWYG ãéá ôï óõãêåêñéìÝíï ðëáßóéï êåéìÝíïõ;', +insert_link_title : 'Äçìéïõñãßá/Äéüñèùóç õðåñ-óýíäåóçò', +insert : 'ÅéóáãùãÞ', +update : 'ÅéóáãùãÞ', +cancel : 'Áêýñùóç', +insert_link_url : 'Äéåýèõíóç', +insert_link_target : 'Óôü÷ïò', +insert_link_target_same : '¢íïéãìá ôçò äéåýèõíóçò óôï ßäéï ðáñÜèõñï', +insert_link_target_blank : '¢íïéãìá ôçò äéåýèõíóçò óå íÝï ðáñÜèõñï', +insert_image_title : 'ÅéóáãùãÞ/Äéüñèùóç åéêüíáò', +insert_image_src : 'Äéåýèõíóç', +insert_image_alt : 'ÐåñéãñáöÞ', +help_desc : 'ÂïÞèåéá', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/en.js b/includes/tiny_mce/langs/en.js new file mode 100644 index 0000000..c7faa24 --- /dev/null +++ b/includes/tiny_mce/langs/en.js @@ -0,0 +1,41 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Bold (Ctrl+B)', +italic_desc : 'Italic (Ctrl+I)', +underline_desc : 'Underline (Ctrl+U)', +striketrough_desc : 'Strikethrough', +justifyleft_desc : 'Align left', +justifycenter_desc : 'Align center', +justifyright_desc : 'Align right', +justifyfull_desc : 'Align full', +bullist_desc : 'Unordered list', +numlist_desc : 'Ordered list', +outdent_desc : 'Outdent', +indent_desc : 'Indent', +undo_desc : 'Undo (Ctrl+Z)', +redo_desc : 'Redo (Ctrl+Y)', +link_desc : 'Insert/edit link', +unlink_desc : 'Unlink', +image_desc : 'Insert/edit image', +cleanup_desc : 'Cleanup messy code', +focus_alert : 'A editor instance must be focused before using this command.', +edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?', +insert_link_title : 'Insert/edit link', +insert : 'Insert', +update : 'Update', +cancel : 'Cancel', +insert_link_url : 'Link URL', +insert_link_target : 'Target', +insert_link_target_same : 'Open link in the same window', +insert_link_target_blank : 'Open link in a new window', +insert_image_title : 'Insert/edit image', +insert_image_src : 'Image URL', +insert_image_alt : 'Image description', +help_desc : 'Help', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/es.js b/includes/tiny_mce/langs/es.js new file mode 100644 index 0000000..1bb2628 --- /dev/null +++ b/includes/tiny_mce/langs/es.js @@ -0,0 +1,50 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + + +tinyMCE.addToLang('',{ +bold_desc : 'Negrita (Ctrl+B)', +italic_desc : 'Cursiva (Ctrl+I)', +underline_desc : 'Subrayado (Ctrl+U)', +striketrough_desc : 'Tachado', +justifyleft_desc : 'Alinear a la izquierda', +justifycenter_desc : 'Alinear al centro', +justifyright_desc : 'Alinear a la derecha', +justifyfull_desc : 'Alinear justificado', +bullist_desc : 'Lista sin ordenar', +numlist_desc : 'Lista ordenada', +outdent_desc : 'Disminuir sangría', +indent_desc : 'Aumentar sangría', +undo_desc : 'Deshacer', +redo_desc : 'Rehacer', +link_desc : 'Insertar enlace', +unlink_desc : 'Quitar enlace', +image_desc : 'Insertar imagen', +cleanup_desc : 'Limpiar codigo', +focus_alert : 'Una instanacia del editor debe ser enfocada antes de usar este comando.', +edit_confirm : '¿Quieres usar el modo WYSIWYG (What You See Is What You Get - "lo que ves es lo que obtienes") para esta area de texto?', +insert_link_title : 'Insertar/editar enlace', +insert : 'Insertar', +update : 'Actualizar', +cancel : 'Cancelar', +insert_link_url : 'Dirección del enlace', +insert_link_target : 'Destino', +insert_link_target_same : 'Abrir enlace en la misma ventana', +insert_link_target_blank : 'Abrir enlace en una ventana nueva', +insert_image_title : 'Insertar/editar imagen', +insert_image_src : 'Dirección de la imagen', +insert_image_alt : 'Descripción de la imagen', +help_desc : 'Ayuda', +bold_img : "bold_es.gif", +italic_img : "italic_es.gif", +underline_img : "underline_es.gif", +clipboard_msg : 'No se pueden utilizar los comandos Copiar / Cortar / Pegar en Mozilla y en Firefox.\r\nUse el teclado Copiar (Ctrl+C) / Cortar (Ctrl+X) / Pegar (Ctrl+V)\r\n¿Quieres obtener más información?', +popup_blocked : 'Lo siento, pero tu bloqueador de popups ha desactivado una ventana que ha lanzado la aplicación. Debes desactivar tu bloqueador de popups para tener toda la funcionalad de la aplicación.' +}); diff --git a/includes/tiny_mce/langs/fa.js b/includes/tiny_mce/langs/fa.js new file mode 100644 index 0000000..cb34669 --- /dev/null +++ b/includes/tiny_mce/langs/fa.js @@ -0,0 +1,46 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +bold_desc : '????', +italic_desc : '????', +underline_desc : '??? ?? ???', +striketrough_desc : '?? ?????', +justifyleft_desc : '?? ???', +justifycenter_desc : '??? ???', +justifyright_desc : '???? ???', +justifyfull_desc : '????? ???', +bullist_desc : '????', +numlist_desc : '???? ????', +outdent_desc : '???? ?????', +indent_desc : '?????? ?????', +undo_desc : '????????', +redo_desc : '????????', +link_desc : '??? ? ?????? ????', +unlink_desc : '??? ????', +image_desc : '??? ? ?????? ???', +cleanup_desc : '??????? ??', +focus_alert : 'A editor instance must be focused before using this command.', +edit_confirm : 'Do you want to use the WYSIWYG mode for this textarea?', +insert_link_title : '??? ? ?????? ????', +insert : ' ????? ', +update : ' ????? ', +cancel : ' ?????? ', +insert_link_url : 'URL ????', +insert_link_target : '????', +insert_link_target_same : '???? ?? ?? ???? ???? ??? ??', +insert_link_target_blank : '???? ?? ?? ???? ???? ??? ??', +insert_image_title : '??? ? ?????? ???', +insert_image_src : 'URL ???', +insert_image_alt : '?????', +help_desc : '??????', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/fi.js b/includes/tiny_mce/langs/fi.js new file mode 100644 index 0000000..dfefb16 --- /dev/null +++ b/includes/tiny_mce/langs/fi.js @@ -0,0 +1,42 @@ +// FI lang variables by Urho Konttori from Absolutions +// Updated by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +bold_desc : 'Lihavoi (Ctrl+B)', +italic_desc : 'Kursivoi (Ctrl+I)', +underline_desc : 'Alleviivaa (Ctrl+U)', +striketrough_desc : 'Yliviivaa', +justifyleft_desc : 'Vasen tasaus', +justifycenter_desc : 'Keskitys', +justifyright_desc : 'Oikea tasaus', +justifyfull_desc : 'Pakotettu tasaus', +bullist_desc : 'Luettelo', +numlist_desc : 'Numeroitu lista', +outdent_desc : 'Poista sisennyt', +indent_desc : 'Sisennys', +undo_desc : 'Peruuta (Ctrl+Z)', +redo_desc : 'Tee uudelleen (Ctrl+Y)', +link_desc : 'Lisää linkki', +unlink_desc : 'Poista linkki', +image_desc : 'Lisää kuva', +cleanup_desc : 'Siisti koodi', +focus_alert : 'Teksinkäsittelyalue täytyy olla valittuna ennen tämän komennon suorittamista.', +edit_confirm : 'Haluatko käyttää WYSIWYG-tilaa tähän tekstialueeseen?', +insert_link_title : 'Lisää/muokkaa linkkiä', +insert : 'Lisää', +update : 'Päivitä', +cancel : 'Peruuta', +insert_link_url : 'Linkin URL', +insert_link_target : 'Kohde', +insert_link_target_same : 'Avaa linkki samassa ikkunassa', +insert_link_target_blank : 'Avaa linkki uudessa ikkunassa', +insert_image_title : 'Lisää/muokkaa kuvaa', +insert_image_src : 'Kuvan URL', +insert_image_alt : 'Kuvan selite', +help_desc : 'Apua', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Leikkaus/Kopiointi/Liitäminen ei onnistu Mozilla eikä Firefox -selaimilla tietoturvasta johtuen. \n Haluatko lisätietoa aiheesta?', +popup_blocked : 'Koneellasi oleva popup-ikkunoiden esto-ohjelma estää tarvittavan ikkunan avaamisen. Sinun pitää sallia popup-ikkunoiden näyttäminen tällä sivustolla ohjelman asetuksista.' +}); diff --git a/includes/tiny_mce/langs/fr.js b/includes/tiny_mce/langs/fr.js new file mode 100644 index 0000000..e9f59c5 --- /dev/null +++ b/includes/tiny_mce/langs/fr.js @@ -0,0 +1,43 @@ +// FR lang variables by Pat Boens +// Modify by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +bold_desc : 'Gras', +italic_desc : 'Italique', +underline_desc : 'Souligné', +striketrough_desc : 'Barré', +justifyleft_desc : 'Aligner à gauche', +justifycenter_desc : 'Centrer', +justifyright_desc : 'Aligner à droite', +justifyfull_desc : 'Justifier', +bullist_desc : 'Liste à puces', +numlist_desc : 'Liste numérotée', +outdent_desc : 'Diminuer le retrait', +indent_desc : 'Augmenter le retrait', +undo_desc : 'Annuler', +redo_desc : 'Restaurer', +link_desc : 'Insérer/Modifier un lien', +unlink_desc : 'Supprimer le lien', +image_desc : 'Insérer/Modifier une image', +cleanup_desc : 'Nettoyer le code', +focus_alert : 'Une instance de l\éditeur doit avoir le focus avant d\'utiliser cette commande.', +edit_confirm : 'Voulez-vous utiliser le mode WYSIWYG pour cette zone d\'édition de texte ?', +insert_link_title : 'Gestionnaire d\'hyperlien', +insert : 'Insérer', +update : 'Appliquer', +cancel : 'Annuler', +insert_link_url : 'Lien URL', +insert_link_target : 'Cible', +insert_link_target_same : 'Ouvrir dans la même fenêtre', +insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre', +insert_image_title : 'Gestionnaire d\'image', +insert_image_src : 'URL de l\'image', +insert_image_alt : 'Équivalent textuel', +help_desc : 'Aide', +bold_img : "bold_fr.gif", +italic_img : "italic.gif", +underline_img : "underline_fr.gif", +clipboard_msg : 'Pour des raisons de sécurité, les fonctions « Copier », « Couper » et « Coller »\nne sont pas disponibles dans Mozilla et Firefox.\n\n\nVoulez-vous plus d\'information à ce sujet?\n', +popup_blocked : 'Désolé, mais votre bloqueur de pop-up empêche le fonctionnement normal de l\'application.\n\n\nPour utiliser cet outil, veuillez régler votre navigateur pour qu\'il accepte les pop-up de ce site.' +}); diff --git a/includes/tiny_mce/langs/fr_ca.js b/includes/tiny_mce/langs/fr_ca.js new file mode 100644 index 0000000..2023bee --- /dev/null +++ b/includes/tiny_mce/langs/fr_ca.js @@ -0,0 +1,40 @@ +// Canadian French lang variables by Virtuelcom + +tinyMCE.addToLang('',{ +bold_desc : 'Gras', +italic_desc : 'Italique', +underline_desc : 'Souligner', +striketrough_desc : 'Barrer', +justifyleft_desc : 'Aligner à gauche', +justifycenter_desc : 'Aligner au centre', +justifyright_desc : 'Aligner à droite', +justifyfull_desc : 'Justifier', +bullist_desc : 'Puces', +numlist_desc : 'Numérotation', +outdent_desc : 'Réduire le retrait', +indent_desc : 'Augmenter le retrait', +undo_desc : 'Annuler la dernière action', +redo_desc : 'Refaire la dernière action annulée', +link_desc : 'Insérer un hyperlien', +unlink_desc : 'Supprimer un hyperlien', +image_desc : 'Insérer une image', +cleanup_desc : 'Nettoyer le code', +focus_alert : 'Un éditeur doit être sélectionné pour utiliser cette fonction.', +edit_confirm : 'Désirez-vous utiliser l\'éditeur pour modifier cette zone?', +insert_link_title : 'Insérer / Modifier un hyperlien', +insert : 'Insérer', +update : 'Insérer', +cancel : 'Annuler', +insert_link_url : 'Adresse URL', +insert_link_target : 'Destination', +insert_link_target_same : 'Ouvrir dans la même fenêtre', +insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre', +insert_image_title : 'Insérer / Modifier une image', +insert_image_src : 'Adresse de l\'image', +insert_image_alt : 'Description de l\'image', +help_desc : 'Aide', +bold_img : "bold_fr.gif", +italic_img : "italic.gif", +underline_img : "underline_fr.gif", +clipboard_msg : 'Copier/Couper/Coller ne sont pas disponibles dans Mozilla et FireFox.\nDésirez-vous consulter de plus amples informations à ce sujet?' +}); diff --git a/includes/tiny_mce/langs/he.js b/includes/tiny_mce/langs/he.js new file mode 100644 index 0000000..e0a0c03 --- /dev/null +++ b/includes/tiny_mce/langs/he.js @@ -0,0 +1,41 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +bold_desc : 'îåãâù (Ctrl+B)', +italic_desc : 'ðèåé (Ctrl+I)', +underline_desc : '÷å úçúé (Ctrl+U)', +striketrough_desc : '÷å çåöä', +justifyleft_desc : 'éùø ìùîàì', +justifycenter_desc : 'éùø ìîøëæ', +justifyright_desc : 'éùø ìéîéï', +justifyfull_desc : 'éùø ìùðé äöããéí', +bullist_desc : 'øùéîä çñøú ñãø', +numlist_desc : 'øùéîä îñåãøú', +outdent_desc : 'ä÷èï ëðéñä', +indent_desc : 'äâãì ëðéñä', +undo_desc : 'áèì (Ctrl+Z)', +redo_desc : 'áöò ùåá (Ctrl+Y)', +link_desc : 'äëðñ/òøåê ÷éùåø', +unlink_desc : 'áèì ÷éùåø', +image_desc : 'äëðñ/òøåê úîåðä', +cleanup_desc : 'ð÷ä ÷åã îáåìâï', +focus_alert : 'éù ìáçåø áùãä òøéëä ìôðé ùðéúï ìäùúîù áô÷åãä æå.', +edit_confirm : 'äàí áøöåðê ìäùúîù áîöá òøéëä òùéøä (WYSIWYG) òáåø ùãä è÷ñè æä?', +insert_link_title : 'äëðñ/òøåê ÷éùåø', +insert : 'äëðñ', +update : 'òãëï', +cancel : 'áèì', +insert_link_url : 'ëúåáú (URL) ä÷éùåø', +insert_link_target : 'éòã', +insert_link_target_same : 'ôúç àú ä÷éùåø áàåúå çìåï', +insert_link_target_blank : 'ôúç àú ä÷éùåø áçìåï çãù', +insert_image_title : 'äëðñ/òøåê úîåðä', +insert_image_src : 'ëúåáú (URL) äúîåðä', +insert_image_alt : 'úéàåø äúîåðä', +help_desc : 'òæøä', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'ôòåìåú äòú÷ä/âæéøä/äãá÷ä àéðï ðúîëåú úçú Mozilla å-Firefox.\näàí áøöåðê ì÷áì îéãò ðåñó àåãåú ðåùà æä?', +popup_blocked : 'ñìéçä, àê ùîðå ìá ëé çåñí äçìåðåú ä÷åôöéí ùìê çñí çìåï ùîäååä çì÷ îäééùåí. úöèøê ìáèì àú çñéîú äçìåðåú ä÷åôöéí áàúø æä ëãé ìðöì ëìé æä áîìåàå.' +}); diff --git a/includes/tiny_mce/langs/hu.js b/includes/tiny_mce/langs/hu.js new file mode 100644 index 0000000..8295d5e --- /dev/null +++ b/includes/tiny_mce/langs/hu.js @@ -0,0 +1,41 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Félkövér', +italic_desc : 'Dölt', +underline_desc : 'Aláhúzott', +striketrough_desc : 'Áthúzott', +justifyleft_desc : 'Balra igazított', +justifycenter_desc : 'Középre igazított', +justifyright_desc : 'Jobbra igazított', +justifyfull_desc : 'Telejesen igazított', +bullist_desc : 'Rendezetlen lista', +numlist_desc : 'Rendezett lista', +outdent_desc : 'Kihúzás', +indent_desc : 'Behúzás', +undo_desc : 'visszavonás', +redo_desc : 'Ismét', +link_desc : 'Link hozzáadása/szerkesztése', +unlink_desc : 'Link megszüntetése', +image_desc : 'Kép beillesztése/szerkesztése', +cleanup_desc : 'Rendetlen kód tisztítása', +focus_alert : 'Egy szerkesztõablakra muszáj fókuszálni ennek a parancsnak a használata elõtt.', +edit_confirm : 'Szeretnéd használni ezt a WYSIWYG módot ehhez a szövegmezõhöz?', +insert_link_title : 'Link beillesztése/szerkesztése', +insert : 'Beillesztés', +update : 'Frissítés', +cancel : 'Mégse', +insert_link_url : 'Link URL', +insert_link_target : 'Cél', +insert_link_target_same : 'Link megnyitása ugyanabban az ablakban', +insert_link_target_blank : 'Link megnyitása új ablakban', +insert_image_title : 'Kép beillesztése/szerkesztése', +insert_image_src : 'Kép URL', +insert_image_alt : 'Kép leírása', +help_desc : 'Súgó', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'A Másolás/Kivágás/Beillesztés nem elérhetõ Mozillában and Firefox-ban.\nSzeretnél több információt errõl a problémáról?', +popup_blocked : 'Sajnálom, de észrevettem, hogy a popup-blokkolód letiltotta az ablakot, ami biztosítja ennek az alkalmazásnak a mûködését. Meg kell szüntetned a popup-blokkolást ennek a segédeszköznek a teljes használatához.' +}); diff --git a/includes/tiny_mce/langs/is.js b/includes/tiny_mce/langs/is.js new file mode 100644 index 0000000..963b202 --- /dev/null +++ b/includes/tiny_mce/langs/is.js @@ -0,0 +1,41 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +bold_desc : 'Feitletrun (Ctrl+B)', +italic_desc : 'Skáletrun (Ctrl+I)', +underline_desc : 'Undirstrikun (Ctrl+U)', +striketrough_desc : 'Strik í gegn', +justifyleft_desc : 'Vinstri jöfnun', +justifycenter_desc : 'Miðju jöfnun', +justifyright_desc : 'Hægri jöfnun', +justifyfull_desc : 'Samfelld jöfnun', +bullist_desc : 'Óraðaður listi', +numlist_desc : 'Raðaður listi', +outdent_desc : 'Útdráttur', +indent_desc : 'Inndráttur', +undo_desc : 'Afturkalla (Ctrl+Z)', +redo_desc : 'Endurkalla (Ctrl+Y)', +link_desc : 'Setja inn/breyta hlekk', +unlink_desc : 'Fjarlægja hlekk', +image_desc : 'Setja inn/breyta mynd', +cleanup_desc : 'Hreinsa ruslkóða', +focus_alert : 'Setja þarf bendil í ritsvæði áður en þessi skipun er notuð.', +edit_confirm : 'Viltu nota WYSIWYG á þessum reit?', +insert_link_title : 'Nýr/breyttur hlekkur', +insert : 'Setja inn', +update : 'Uppfæra', +cancel : 'Hætta við', +insert_link_url : 'Slóð hlekks', +insert_link_target : 'Gluggi', +insert_link_target_same : 'Opna tengil í sama glugga', +insert_link_target_blank : 'Opna tengil í nýjum glugga', +insert_image_title : 'Ný/breytt mynd', +insert_image_src : 'Slóð myndar', +insert_image_alt : 'Lýsing myndar', +help_desc : 'Hjálp', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Afrita/skeyta/líma er ekki leyft í vafranum.\nViltu fá frekari upplýsingar um hvernig á að stilla það?', +popup_blocked : 'Afsakið, gluggavörn vafrans hefur meinað glugga, sem umsjónarkerfið notar, leyfi til þess að opnast. Þú verður að leyfa þessum vef að opna sprettiglugga (popup) til að geta nýtt þennan möguleika.' +}); diff --git a/includes/tiny_mce/langs/it.js b/includes/tiny_mce/langs/it.js new file mode 100644 index 0000000..c4b0905 --- /dev/null +++ b/includes/tiny_mce/langs/it.js @@ -0,0 +1,41 @@ +// Variabili lingua IT - fabrix.xm@lombardiacom.it + +tinyMCE.addToLang('',{ +bold_desc : 'Grassetto', +italic_desc : 'Corsivo', +underline_desc : 'Sottolineato', +striketrough_desc : 'Barrato', +justifyleft_desc : 'Allinea a sinistra', +justifycenter_desc : 'Allinea centrato', +justifyright_desc : 'Allinea a destra', +justifyfull_desc : 'Giustifica', +bullist_desc : 'Lista non ordinata', +numlist_desc : 'Lista ordinata', +outdent_desc : 'Rientra', +indent_desc : 'Indenta', +undo_desc : 'Annulla', +redo_desc : 'Ripeti', +link_desc : 'Inserisci link', +unlink_desc : 'Elimina link', +image_desc : 'Inserisci immagine', +cleanup_desc : 'Pulisci il codice', +focus_alert : 'Una istanza dell\' editor deve essere selezionata prima di usare questo comando.', +edit_confirm : 'Vuoi usare la modalit\u00E0 WYSIWYG per questa textarea?', +insert_link_title : 'Inserisci/modifica link', +insert : 'Inserisci', +update : 'Inserisci', +cancel : 'Cancella', +insert_link_url : 'Link URL', +insert_link_target : 'Target', +insert_link_target_same : 'Apri il link nella stessa finestra', +insert_link_target_blank : 'Apri il link in una nuova finestra', +insert_image_title : 'Inserisci/modifica immagine', +insert_image_src : 'URL immagine', +insert_image_alt : 'Descrizione dell\'immagine', +help_desc : 'Guida', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copia, Taglia e Incolla non sono disponibili in Mozilla e Firefox.\nVuoi maggiori dettegli su questo problema?', +popup_blocked : 'Spiacenti, un sistema di blocco popup ha impedito l\'apertura di una finestra necessaria per il funzionamento dell\'editor. Disabilita il blocco popup per questo sito se vuoi utilizzare tutte le funzionalità.' +}); diff --git a/includes/tiny_mce/langs/ja.js b/includes/tiny_mce/langs/ja.js new file mode 100644 index 0000000..dc796cb --- /dev/null +++ b/includes/tiny_mce/langs/ja.js @@ -0,0 +1,41 @@ +// JP lang variables + +tinyMCE.addToLang('',{ +bold_desc : '$BB@;z(B', +italic_desc : '$BC@~(B', +justifyleft_desc : '$B:85M$a(B', +justifycenter_desc : '$BCf1{9g$o$;(B', +justifyright_desc : '$B1&5M$a(B', +justifyfull_desc : '$B9TB7$((B', +bullist_desc : '$B2U>r=q(B', +numlist_desc : '$BHV9fIU$-2U>r=q(B', +outdent_desc : '$B;z>e$2(B', +indent_desc : '$B;z2<$2(B', +undo_desc : '$B$d$j$J$*$7(B', +redo_desc : '$B:Fe$N$I$3$+$rA*Br$9$kI,MW$,$"$j$^$9!#(B', +edit_confirm : 'WYSIWYG$B%b!<%I$G$3$N%F%-%9%H%(%j%"$rJT=8$7$^$9$+!)(B', +insert_link_title : '$B%j%s%/$NA^F~(B/$BJT=8(B', +insert : '$BA^F~(B', +update : '$BA^F~(B', +cancel : '$BC$7(B', +insert_link_url : '$B%j%s%/@h(BURL', +insert_link_target : '$B%?!<%2%C%H(B', +insert_link_target_same : '$BF1$8Ak$G%j%s%/$r3+$/(B', +insert_link_target_blank : '$B?7$7$$Ak$G%j%s%/$r3+$/(B', +insert_image_title : '$B2hA|$NA^F~(B/$BJT=8(B', +insert_image_src : '$B2hA|$N(BURL', +insert_image_alt : '$B2hA|$N@bL@(B', +help_desc : '$B%X%k%W(B', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/ko.js b/includes/tiny_mce/langs/ko.js new file mode 100644 index 0000000..48d5386 --- /dev/null +++ b/includes/tiny_mce/langs/ko.js @@ -0,0 +1,40 @@ +// KO lang variables by Setzer Gabbiani + +tinyMCE.addToLang('',{ +bold_desc : 'ÁøÇϰÔ', +italic_desc : '±â¿ïÀÓ', +underline_desc : '¹ØÁÙ', +striketrough_desc : '°¡·ÎÁÙ', +justifyleft_desc : '¿ÞÂÊ Á€·Ä', +justifycenter_desc : '°¡¿îµ¥ Á€·Ä', +justifyright_desc : '¿Àž¥ÂÊ Á€·Ä', +justifyfull_desc : 'ŸçÂÊ Á€·Ä', +bullist_desc : 'žñÂ÷ žÅ±â±â', +numlist_desc : '¹øÈ£ žÅ±â±â', +outdent_desc : '³»ŸîŸ²±â', +indent_desc : 'µé¿©Ÿ²±â', +undo_desc : 'œÇÇàÃëŒÒ', +redo_desc : 'ÀçœÇÇà', +link_desc : 'žµÅ© ³Ö±â/°íÄ¡±â', +unlink_desc : 'žµÅ© ÇØÁŠ', +image_desc : '±×ž² ³Ö±â/°íÄ¡±â', +cleanup_desc : 'Äڵ垊 ±ò²ûÇϰÔ', +focus_alert : 'ÀÌ ží·ÉÀ» œÇÇàÇϱâ Àü¿¡ ¹ÝµåœÃ ¿¡µðÅÍ ³»ÀÇ Ÿîµò°¡¿¡ Ä¿Œ­°¡ ÀÖŸîŸß ÇÕŽÏŽÙ.', +edit_confirm : 'ÀÌ ÅØœºÆ® ¹Úœº¿¡Œ­ HTML ¿¡µðÅÍžŠ »ç¿ëÇÏ±æ ¿øÇϜʎϱî?', +insert_link_title : 'žµÅ© ³Ö±â/°íÄ¡±â', +insert : '»ðÀÔ', +update : '»ðÀÔ', +cancel : 'ÃëŒÒ', +insert_link_url : 'URL žµÅ©', +insert_link_target : 'Åž°Ù', +insert_link_target_same : '°°Àº â¿¡Œ­ žµÅ© ¿­±â', +insert_link_target_blank : '»õ â¿¡Œ­ žµÅ© ¿­±â', +insert_image_title : '±×ž² ³Ö±â/°íÄ¡±â', +insert_image_src : '±×ž² URL', +insert_image_alt : '±×ž² Œ³ží', +help_desc : 'µµ¿òž»', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/nb.js b/includes/tiny_mce/langs/nb.js new file mode 100644 index 0000000..8311624 --- /dev/null +++ b/includes/tiny_mce/langs/nb.js @@ -0,0 +1,41 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +bold_desc : 'Fet', +italic_desc : 'Kursiv', +underline_desc : 'Understreking', +striketrough_desc : 'Gjennomstreking', +justifyleft_desc : 'Venstrestill', +justifycenter_desc : 'Sentrer', +justifyright_desc : 'Høyrestill', +justifyfull_desc : 'Blokkjustering', +bullist_desc : 'Punktliste', +numlist_desc : 'Nummerliste', +outdent_desc : 'Reduser innrykk', +indent_desc : 'Øk innrykk', +undo_desc : 'Angre', +redo_desc : 'Gjør om', +link_desc : 'Opprett/endre lenke', +unlink_desc : 'Fjern lenke', +image_desc : 'Sett inn/endre bilde', +cleanup_desc : 'Rens grisete kode', +focus_alert : 'Editoren må være i fokus før du benytter denne kommando.', +edit_confirm : 'Vil du benytte WYSIWYG editoren for dette tekstfelt?', +insert_link_title : 'Opprett/endre lenke', +insert : 'Sett inn', +update : 'Oppdater', +cancel : 'Avbryt', +insert_link_url : 'Lenkens URL', +insert_link_target : 'Vindu', +insert_link_target_same : 'Åpne i samme vindu', +insert_link_target_blank : 'Åpne i nytt vindu', +insert_image_title : 'Opprett/endre bilde', +insert_image_src : 'Bildets URL', +insert_image_alt : 'Bildets beskrivelse', +help_desc : 'Hjelp', +bold_img : 'bold_de_se.gif', +italic_img : 'italic_de_se.gif', +underline_img : 'underline.gif', +clipboard_msg : 'Klipp ut/Kopier/Lim inn fungerer ikke i Mozilla og Firefox. Vil du vite mer om dette?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/nl.js b/includes/tiny_mce/langs/nl.js new file mode 100644 index 0000000..05253a4 --- /dev/null +++ b/includes/tiny_mce/langs/nl.js @@ -0,0 +1,42 @@ +// NL lang variables thanks to "Meint Post" +// Updates by (2.0) Mark van der Sanden + +tinyMCE.addToLang('',{ +bold_desc : 'Vet (Ctrl+B)', +italic_desc : 'Cursief (Ctrl+I)', +underline_desc : 'Onderstrepen (Ctrl+U)', +striketrough_desc : 'Doorhalen', +justifyleft_desc : 'Links uitlijnen', +justifycenter_desc : 'Centreren', +justifyright_desc : 'Rechts uitlijnen', +justifyfull_desc : 'Volledig uitlijnen', +bullist_desc : 'Opsommingstekens', +numlist_desc : 'Genummerde lijst', +outdent_desc : 'Inspringen verkleinen', +indent_desc : 'Inspringen vergroten', +undo_desc : 'Ongedaan maken (Ctrl+Z)', +redo_desc : 'Opnieuw (Ctrl+Y)', +link_desc : 'Hyperlink invoegen/bewerken', +unlink_desc : 'Hyperlink verwijderen', +image_desc : 'Afbeelding invoegen', +cleanup_desc : 'Code opschonen', +focus_alert : 'Klik op de tekst in de editor voor het uitvoeren van dit commando.', +edit_confirm : 'Wilt u de WYSIWYG modus voor deze textarea gebruiken?', +insert_link_title : 'Hyperlink invoegen/bewerken', +insert : 'OK', +update : 'Toepassen', +cancel : 'Annuleren', +insert_link_url : 'URL link', +insert_link_target : 'Bestemming', +insert_link_target_same : 'Open link in hetzelfde venster', +insert_link_target_blank : 'Open link in een nieuw venster', +insert_image_title : 'Afbeelding invoegen/bewerken', +insert_image_src : 'Afbeelding', +insert_image_alt : 'Beschrijving', +help_desc : 'Help', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Kopiëren/knippen/plakken is niet beschikbaar in Mozilla en Firefox.\nWilt u meer informatie over deze kwestie?', +popup_blocked : 'Uw browser heeft zojuist geweigerd een popup-venster te tonen. Waarschijnlijk gebruikt u een poup-blocker die voor deze editor te streng omgaat met popups. Om het venster toch te tonen, zult u uw popup-blocker zo in moeten stellen dat het popups van deze website toestaat.' +}); diff --git a/includes/tiny_mce/langs/nn.js b/includes/tiny_mce/langs/nn.js new file mode 100644 index 0000000..74462e2 --- /dev/null +++ b/includes/tiny_mce/langs/nn.js @@ -0,0 +1,41 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +bold_desc : 'Feit', +italic_desc : 'Kursiv', +underline_desc : 'Understreking', +striketrough_desc : 'Gjennomstreking', +justifyleft_desc : 'Venstrestill', +justifycenter_desc : 'Sentrer', +justifyright_desc : 'Høgrestill', +justifyfull_desc : 'Blokkjustering', +bullist_desc : 'Punktliste', +numlist_desc : 'Nummerliste', +outdent_desc : 'Reduser innrykk', +indent_desc : 'Auk innrykk', +undo_desc : 'Angre', +redo_desc : 'Gjer om', +link_desc : 'Opprett/endre lenke', +unlink_desc : 'Fjern lenke', +image_desc : 'Sett inn/endre bilde', +cleanup_desc : 'Rens grisete kode', +focus_alert : 'Editoren må være i fokus før du benytter denne kommando.', +edit_confirm : 'Vil du benytte WYSIWYG editoren for dette tekstfelt?', +insert_link_title : 'Opprett/endre lenke', +insert : 'Sett inn', +update : 'Oppdater', +cancel : 'Avbryt', +insert_link_url : 'Lenkens URL', +insert_link_target : 'Vindu', +insert_link_target_same : 'Åpne i samme vindauge', +insert_link_target_blank : 'Åpne i nytt vindauge', +insert_image_title : 'Opprett/endre bilde', +insert_image_src : 'Bildets URL', +insert_image_alt : 'Bildets beskrivelse', +help_desc : 'Hjelp', +bold_img : 'bold_de_se.gif', +italic_img : 'italic_de_se.gif', +underline_img : 'underline.gif', +clipboard_msg : 'Klipp ut/Kopier/Lim inn fungerer ikkje i Mozilla og Firefox. Vil du vite meir om dette?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/pl.js b/includes/tiny_mce/langs/pl.js new file mode 100644 index 0000000..4037dba --- /dev/null +++ b/includes/tiny_mce/langs/pl.js @@ -0,0 +1,44 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 26.10.2005 + +tinyMCE.addToLang('',{ +bold_desc : 'Pogrubienie (Ctrl+B)', +italic_desc : 'Pochylenie (Ctrl+I)', +underline_desc : 'Podkre¶lenie (Ctrl+U)', +striketrough_desc : 'Przekre¶lenie', +justifyleft_desc : 'Wyrównaj do lewej', +justifycenter_desc : 'Wyrównaj do ¶rodka', +justifyright_desc : 'Wyrównaj do prawej', +justifyfull_desc : 'Wyrównaj na ca³o¶ci', +bullist_desc : 'Lista nienumerowana', +numlist_desc : 'Lista numerowana', +outdent_desc : 'Zmniejsz wciêcie', +indent_desc : 'Zwiêksz wciêcie', +undo_desc : 'Cofnij (Ctrl+Z)', +redo_desc : 'Ponów (Ctrl+Y)', +link_desc : 'Wstaw/edytuj link', +unlink_desc : 'Usuñ link', +image_desc : 'Wstaw/edytuj obrazek', +cleanup_desc : 'Usuñ zbêdny kod', +focus_alert : 'Instancja edytora musi byæ aktywna przed u¿yciem tego polecenia.', +edit_confirm : 'Czy chcesz u¿yæ edytora WYSIWYG dla tego pola tekstowego?', +insert_link_title : 'Wstaw/edytuj link', +insert : 'Wstaw', +update : 'Aktualizuj', +cancel : 'Anuluj', +insert_link_url : 'URL linku', +insert_link_target : 'Cel', +insert_link_target_same : 'Otwórz link w tym samym oknie', +insert_link_target_blank : 'Otwórz link w nowym oknie', +insert_image_title : 'Wstaw/edytuj obrazek', +insert_image_src : 'URL obrazka', +insert_image_alt : 'Opis obrazka', +help_desc : 'Pomoc', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Kopiuj/Wytnij/Wklej nie jest dostêpne dla przegl±darek Mozilla i Firefox.\nCzy chcesz uzyskaæ o tym wiêcej informacji?', +popup_blocked : 'Niestety, ale odnotowano, ¿e Twoja przegl±darka ma w³±czon± blokadê okienek popup. Musisz wy³±czyæ opcjê blokowania okienek dla tej strony, aby TinyMCE móg³ pracowaæ z pe³n± funkcjonalno¶ci±.' +}); diff --git a/includes/tiny_mce/langs/pt.js b/includes/tiny_mce/langs/pt.js new file mode 100644 index 0000000..9e9cc26 --- /dev/null +++ b/includes/tiny_mce/langs/pt.js @@ -0,0 +1,42 @@ +// PT lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Negrito', +italic_desc : 'Itálico', +underline_desc : 'Sublinhar', +striketrough_desc : 'Riscado', +justifyleft_desc : 'Alinhar á esquerda', +justifycenter_desc : 'Alinhar ao centro', +justifyright_desc : 'Alinhar á direita', +justifyfull_desc : 'Justificado', +bullist_desc : 'Lista não ordenada', +numlist_desc : 'Lista ordenada', +outdent_desc : 'Retirar indentação', +indent_desc : 'Indentar', +undo_desc : 'Desfazer', +redo_desc : 'Refazer', +link_desc : 'Inserir Hiperligação', +unlink_desc : 'Remover hiperligação', +image_desc : 'Inserir Referência a imagem externa', +object_desc : 'Inserir Objecto Multimédia da Galeria', +cleanup_desc : 'Limpeza de código', +focus_alert : 'Uma instância do editor deverá estar seleccionada antes de utilizar este comando.', +edit_confirm : 'Deseja utilizar o modo visual de edição para ezta área de texto?', +insert_link_title : 'Inserir/editar hiperligação', +insert : 'Inserir', +update : 'Actualizar', +cancel : 'Cancelar', +insert_link_url : 'URL de hiperligação', +insert_link_target : 'Destino', +insert_link_target_same : 'Abrir endereço na mesma janela', +insert_link_target_blank : 'Abrir endereço numa nova janela', +insert_image_title : 'Inserir/editar imagem', +insert_image_src : 'Endereço da imagem', +insert_image_alt : 'Descrição alt.', +help_desc : 'Ajuda', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copiar/Cortar/Colar não está disponível em Mozilla and Firefox.\nPretende obter mais informação acerca desta questão?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/pt_br.js b/includes/tiny_mce/langs/pt_br.js new file mode 100644 index 0000000..89cd62d --- /dev/null +++ b/includes/tiny_mce/langs/pt_br.js @@ -0,0 +1,50 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +bold_desc : 'Negrito (Ctrl+B)', +italic_desc : 'Itálico (Ctrl+I)', +underline_desc : 'Sublinhar (Ctrl+U)', +striketrough_desc : 'Riscado', +justifyleft_desc : 'Alinhar à esquerda', +justifycenter_desc : 'Centralizado', +justifyright_desc : 'Alinhar à direita', +justifyfull_desc : 'Justificado', +bullist_desc : 'Lista não ordenada', +numlist_desc : 'Lista ordenada', +outdent_desc : 'Retirar indentação', +indent_desc : 'Indentar', +undo_desc : 'Desfazer (Ctrl+Z)', +redo_desc : 'Refazer (Ctrl+Y)', +link_desc : 'Inserir link', +unlink_desc : 'Remover link', +image_desc : 'Inserir Referência a imagem externa', +object_desc : 'Inserir Objeto Multimídia da Galeria', +cleanup_desc : 'Limpeza de código', +focus_alert : 'Uma instância do editor deverá estar selecionada antes de utilizar este comando.', +edit_confirm : 'Deseja utilizar o Modo Visual (WYSIWYG) de edição para esta área de texto?', +insert_link_title : 'Inserir/editar link', +insert : 'Inserir', +update : 'Atualizar', +cancel : 'Cancelar', +insert_link_url : 'URL do link', +insert_link_target : 'Destino', +insert_link_target_same : 'Abrir link na mesma janela', +insert_link_target_blank : 'Abrir link em uma nova janela', +insert_image_title : 'Inserir/editar imagem', +insert_image_src : 'Endereço (URL) da imagem', +insert_image_alt : 'Descrição da imagem', +help_desc : 'Ajuda', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copiar/Cortar/Colar não está disponível no Mozilla e Firefox.\nPretende obter mais informação sobre esta questão?', +popup_blocked : 'Desculpe, mas sabemos que seu bloqueador de popup desativou uma que permite a funcionabilidade desta aplicação. Você precisa desativar seu bloqueador de popup neste site para que possa ser utilizado todos os recursos desta ferramenta.' +}); diff --git a/includes/tiny_mce/langs/readme.txt b/includes/tiny_mce/langs/readme.txt new file mode 100644 index 0000000..2e1965c --- /dev/null +++ b/includes/tiny_mce/langs/readme.txt @@ -0,0 +1,2 @@ +The language pack codes are based on ISO-639-2 +http://www.loc.gov/standards/iso639-2/englangn.html diff --git a/includes/tiny_mce/langs/ru.js b/includes/tiny_mce/langs/ru.js new file mode 100644 index 0000000..1789b7a --- /dev/null +++ b/includes/tiny_mce/langs/ru.js @@ -0,0 +1,43 @@ +// Russian windows-1251 translation by Vladimir Vitkovsky +// admin@transport.su +// www.webgui.uanet.biz + +tinyMCE.addToLang('',{ +bold_desc : 'Ïîëóæèðíûé', +italic_desc : 'Êóðñèâ', +underline_desc : 'Ïîä÷åðêíóòûé', +striketrough_desc : 'Ïåðå÷åðêíóòûé', +justifyleft_desc : 'Âûðàâíèâàíèå âëåâî', +justifycenter_desc : 'Âûðàâíèâàíèå ïî öåíòðó', +justifyright_desc : 'Âûðàâíèâàíèå âïðàâî', +justifyfull_desc : 'Ðàâíîìåðíîå çàïîëíåíèå', +bullist_desc : 'Ìàðêèðîâàííûé ñïèñîê', +numlist_desc : 'Íóìåðîâàííûé ñïèñîê', +outdent_desc : 'Óìåíüøèòü îòñòóï', +indent_desc : 'Óâåëè÷èòü îòñïóò', +undo_desc : 'Îòìåíèòü', +redo_desc : 'Âåðíóòü', +link_desc : 'Âñòàâèòü/èçìåíèòü ññûëêó', +unlink_desc : 'Óáðàòü ññûëêó', +image_desc : 'Âñòàâèòü/èçìåíèòü èçîáðàæåíèå', +cleanup_desc : 'Ïîä÷èñòèòü èçáûòî÷íûé êîä', +focus_alert : 'Äëÿ èñïîëüçîâàíèÿ äàííîé êîìàíäû Âû äîëæíû íàõîäèòñÿ â ïîëå ðåäàêòîðà.', +edit_confirm : 'Õîòèòå ëè Âû ðåäàêòèðîâàòü â âèçóàëüíîì (WYSIWYG) ðåæèìå?', +insert_link_title : 'Âñòàâèòü/èçìåíèòü ññûëêó', +insert : 'Âñòàâèòü', +update : 'Ïðèìåíèòü', +cancel : 'Îòìåíèòü', +insert_link_url : 'Àäðåñ ññûëêè', +insert_link_target : 'Îòêðûòü â...:', +insert_link_target_same : 'òîì æå îêíå', +insert_link_target_blank : 'íîâîì îêíå', +insert_image_title : 'Âñòàâèòü/èçìåíèòü èçîáðàæåíèå', +insert_image_src : 'Àäðåñ êàðòèíêè', +insert_image_alt : 'Îïèñàíèå êàðòèíêè', +help_desc : 'Ïîìîùü', +bold_img : "bold_ru.gif", +italic_img : "italic_ru.gif", +underline_img : "underline_ru.gif", +clipboard_msg : 'Êîïèðîâàòü/Âûðåçàòü/Âñòàâèòü íåäîñòóïíû äëÿ Mozilla è Firefox.\nÕîòèòå óçíàòü îá ýòîì ïîäðîáíåå?', +popup_blocked : 'Èçâèíèòå, íî â Âàøåì áðàóçåðå çàáëîêèðîâàíû âñïëûâàþùèå îêíà. Äëÿ òîãî, ÷òîáû èìåòü âîçìîæíîñòü âîñïîëüçîâàòüñÿ âñåìè âîçìîæíîñòÿìè ðåäàêòîðà, íåîáõîäèìî îòêëþ÷èòü áëîêèðîâêó âñïëûâàþùèõ îêîí äëÿ ýòîãî ñàéòà.' +}); diff --git a/includes/tiny_mce/langs/ru_KOI8-R.js b/includes/tiny_mce/langs/ru_KOI8-R.js new file mode 100644 index 0000000..135f8e9 --- /dev/null +++ b/includes/tiny_mce/langs/ru_KOI8-R.js @@ -0,0 +1,43 @@ +// Russian KOI8-R translation by Vladimir Vitkovsky +// admin@transport.su +// www.webgui.uanet.biz + +tinyMCE.addToLang('',{ +bold_desc : 'ðÏÌÕÖÉÒÎÙÊ', +italic_desc : 'ëÕÒÓÉ×', +underline_desc : 'ðÏÄÞÅÒËÎÕÔÙÊ', +striketrough_desc : 'ðÅÒÅÞÅÒËÎÕÔÙÊ', +justifyleft_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ×ÌÅ×Ï', +justifycenter_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ÐÏ ÃÅÎÔÒÕ', +justifyright_desc : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ ×ÐÒÁ×Ï', +justifyfull_desc : 'òÁ×ÎÏÍÅÒÎÏÅ ÚÁÐÏÌÎÅÎÉÅ', +bullist_desc : 'íÁÒËÉÒÏ×ÁÎÎÙÊ ÓÐÉÓÏË', +numlist_desc : 'îÕÍÅÒÏ×ÁÎÎÙÊ ÓÐÉÓÏË', +outdent_desc : 'õÍÅÎØÛÉÔØ ÏÔÓÔÕÐ', +indent_desc : 'õ×ÅÌÉÞÉÔØ ÏÔÓÐÕÔ', +undo_desc : 'ïÔÍÅÎÉÔØ', +redo_desc : '÷ÅÒÎÕÔØ', +link_desc : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÓÓÙÌËÕ', +unlink_desc : 'õÂÒÁÔØ ÓÓÙÌËÕ', +image_desc : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ', +cleanup_desc : 'ðÏÄÞÉÓÔÉÔØ ÉÚÂÙÔÏÞÎÙÊ ËÏÄ', +focus_alert : 'äÌÑ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÁÎÎÏÊ ËÏÍÁÎÄÙ ÷Ù ÄÏÌÖÎÙ ÎÁÈÏÄÉÔÓÑ × ÐÏÌÅ ÒÅÄÁËÔÏÒÁ.', +edit_confirm : 'èÏÔÉÔÅ ÌÉ ÷Ù ÒÅÄÁËÔÉÒÏ×ÁÔØ × ×ÉÚÕÁÌØÎÏÍ (WYSIWYG) ÒÅÖÉÍÅ?', +insert_link_title : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÓÓÙÌËÕ', +insert : '÷ÓÔÁ×ÉÔØ', +update : 'ðÒÉÍÅÎÉÔØ', +cancel : 'ïÔÍÅÎÉÔØ', +insert_link_url : 'áÄÒÅÓ ÓÓÙÌËÉ', +insert_link_target : 'ïÔËÒÙÔØ ×...:', +insert_link_target_same : 'ÔÏÍ ÖÅ ÏËÎÅ', +insert_link_target_blank : 'ÎÏ×ÏÍ ÏËÎÅ', +insert_image_title : '÷ÓÔÁ×ÉÔØ/ÉÚÍÅÎÉÔØ ÉÚÏÂÒÁÖÅÎÉÅ', +insert_image_src : 'áÄÒÅÓ ËÁÒÔÉÎËÉ', +insert_image_alt : 'ïÐÉÓÁÎÉÅ ËÁÒÔÉÎËÉ', +help_desc : 'ðÏÍÏÝØ', +bold_img : "bold_ru.gif", +italic_img : "italic_ru.gif", +underline_img : "underline_ru.gif", +clipboard_msg : 'ëÏÐÉÒÏ×ÁÔØ/÷ÙÒÅÚÁÔØ/÷ÓÔÁ×ÉÔØ ÎÅÄÏÓÔÕÐÎÙ ÄÌÑ Mozilla É Firefox.\nèÏÔÉÔÅ ÕÚÎÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ?', +popup_blocked : 'éÚ×ÉÎÉÔÅ, ÎÏ × ÷ÁÛÅÍ ÂÒÁÕÚÅÒÅ ÚÁÂÌÏËÉÒÏ×ÁÎÙ ×ÓÐÌÙ×ÁÀÝÉÅ ÏËÎÁ. äÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÉÍÅÔØ ×ÏÚÍÏÖÎÏÓÔØ ×ÏÓÐÏÌØÚÏ×ÁÔØÓÑ ×ÓÅÍÉ ×ÏÚÍÏÖÎÏÓÔÑÍÉ ÒÅÄÁËÔÏÒÁ, ÎÅÏÂÈÏÄÉÍÏ ÏÔËÌÀÞÉÔØ ÂÌÏËÉÒÏ×ËÕ ×ÓÐÌÙ×ÁÀÝÉÈ ÏËÏÎ ÄÌÑ ÜÔÏÇÏ ÓÁÊÔÁ.' +}); diff --git a/includes/tiny_mce/langs/ru_UTF-8.js b/includes/tiny_mce/langs/ru_UTF-8.js new file mode 100644 index 0000000..1464e56 --- /dev/null +++ b/includes/tiny_mce/langs/ru_UTF-8.js @@ -0,0 +1,43 @@ +// Russian UTF-8 translation by Vladimir Vitkovsky +// admin@transport.su +// www.webgui.uanet.biz + +tinyMCE.addToLang('',{ +bold_desc : 'ППлужОрМый', +italic_desc : 'КурсОв', +underline_desc : 'ППЎчеркМутый', +striketrough_desc : 'ПеречеркМутый', +justifyleft_desc : 'ВыравМОваМОе влевП', +justifycenter_desc : 'ВыравМОваМОе пП цеМтру', +justifyright_desc : 'ВыравМОваМОе вправП', +justifyfull_desc : 'РавМПЌерМПе запПлМеМОе', +bullist_desc : 'МаркОрПваММый спОсПк', +numlist_desc : 'НуЌерПваММый спОсПк', +outdent_desc : 'УЌеМьшОть Птступ', +indent_desc : 'УвелОчОть Птспут', +undo_desc : 'ОтЌеМОть', +redo_desc : 'ВерМуть', +link_desc : 'ВставОть/ОзЌеМОть ссылку', +unlink_desc : 'Убрать ссылку', +image_desc : 'ВставОть/ОзЌеМОть ОзПбражеМОе', +cleanup_desc : 'ППЎчОстОть ОзбытПчМый кПЎ', +focus_alert : 'Для ОспПльзПваМОя ЎаММПй кПЌаМЎы Вы ЎПлжМы МахПЎОтся в пПле реЎактПра.', +edit_confirm : 'ХПтОте лО Вы реЎактОрПвать в вОзуальМПЌ (WYSIWYG) режОЌе?', +insert_link_title : 'ВставОть/ОзЌеМОть ссылку', +insert : 'ВставОть', +update : 'ПрОЌеМОть', +cancel : 'ОтЌеМОть', +insert_link_url : 'АЎрес ссылкО', +insert_link_target : 'Открыть в...:', +insert_link_target_same : 'тПЌ же ПкМе', +insert_link_target_blank : 'МПвПЌ ПкМе', +insert_image_title : 'ВставОть/ОзЌеМОть ОзПбражеМОе', +insert_image_src : 'АЎрес картОМкО', +insert_image_alt : 'ОпОсаМОе картОМкО', +help_desc : 'ППЌПщь', +bold_img : "bold_ru.gif", +italic_img : "italic_ru.gif", +underline_img : "underline_ru.gif", +clipboard_msg : 'КПпОрПвать/Вырезать/ВставОть МеЎПступМы Ўля Mozilla О Firefox.\nХПтОте узМать Пб этПЌ пПЎрПбМее?', +popup_blocked : 'ИзвОМОте, МП в ВашеЌ браузере заблПкОрПваМы всплывающОе ПкМа. Для тПгП, чтПбы ОЌеть вПзЌПжМПсть вПспПльзПваться всеЌО вПзЌПжМПстяЌО реЎактПра, МеПбхПЎОЌП ПтключОть блПкОрПвку всплывающОх ПкПМ Ўля этПгП сайта.' +}); diff --git a/includes/tiny_mce/langs/sk.js b/includes/tiny_mce/langs/sk.js new file mode 100644 index 0000000..0e12b44 --- /dev/null +++ b/includes/tiny_mce/langs/sk.js @@ -0,0 +1,50 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:43 spocke Exp $ + */ + + +tinyMCE.addToLang('',{ +bold_desc : 'Tučné', +italic_desc : 'Kurzivá', +underline_desc : 'Podčiarknutie', +striketrough_desc : 'PreÅ¡krtnutie', +justifyleft_desc : 'Zarovnanie vÄŸavo', +justifycenter_desc : 'Zarovnanie na stred', +justifyright_desc : 'Zarovnanie vpravo', +justifyfull_desc : 'Zarovnanie do bloku', +bullist_desc : 'Zoznam s odráşkami', +numlist_desc : 'ČíslovanÜ zoznam', +outdent_desc : 'SníşiÅ¥ odsadenie', +indent_desc : 'ZvÜšiÅ¥ odsadenie', +undo_desc : 'ZpÀť', +redo_desc : 'Znovu', +link_desc : 'VloÅŸiÅ¥ odkaz', +unlink_desc : 'ZruÅ¡iÅ¥ odkaz', +image_desc : 'VloÅŸiÅ¥ obrázok', +cleanup_desc : 'VyčistiÅ¥ kód', +focus_alert : 'Pred pouÅŸitím tohoto príkazu musí byÅ¥ kurzor v okne editora.', +edit_confirm : 'Chcete pouÅŸiÅ¥ WYSIWYG editáciu pre tento text?', +insert_link_title : 'VloÅŸiÅ¥/upraviÅ¥ odkaz', +insert : 'VloÅŸiÅ¥', +update : 'ZmeniÅ¥', +cancel : 'ZruÅ¡iÅ¥', +insert_link_url : 'URL odkazu', +insert_link_target : 'CieÄŸ', +insert_link_target_same : 'OtvoriÅ¥ odkaz v rovnakom okne', +insert_link_target_blank : 'OtvoriÅ¥ odkaz v novom okne', +insert_image_title : 'VloÅŸiÅ¥/upraviÅ¥ obrázok', +insert_image_src : 'URL obrázku', +insert_image_alt : 'Popis obrázku', +help_desc : 'Nápoveda', +bold_img : 'bold.gif', +italic_img : 'italic.gif', +underline_img : "underline.gif", +clipboard_msg : 'Funkcia KopírovaÅ¥/vysrihnúť/vloÅŸiÅ¥ niesú pouÅŸiteÄŸné v Mozille a Firefoxe.\nChcete viac informácií o tomto probléme?', +popup_blocked : 'Ospravedlňujeme sa, ale blokovač vyskakovacích okien neumoÅŸnil otvoriÅ¥ okno, ktoré zprostredkovává funkčnosÅ¥ aplikáce. Musíte vypnuÅ¥ blokovanie vyskakovacích okien na tomto webe, abyste vyuÅŸili jeho plnú funkčnosÅ¥.' +}); + diff --git a/includes/tiny_mce/langs/sv.js b/includes/tiny_mce/langs/sv.js new file mode 100644 index 0000000..22feb7e --- /dev/null +++ b/includes/tiny_mce/langs/sv.js @@ -0,0 +1,43 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +bold_desc : 'Fet', +italic_desc : 'Kursiv', +underline_desc : 'Understruken', +striketrough_desc : 'Genomstruken', +justifyleft_desc : 'Vänsterjustera', +justifycenter_desc : 'Centrera', +justifyright_desc : 'Högerjustera', +justifyfull_desc : 'Kantjustera', +bullist_desc : 'Punktlista', +numlist_desc : 'Nummerlista', +outdent_desc : 'Utdrag', +indent_desc : 'Indrag', +undo_desc : 'Ångra', +redo_desc : 'Gör om', +link_desc : 'Skapa länk', +unlink_desc : 'Ta bort länk', +image_desc : 'Skapa/redigera bild', +cleanup_desc : 'Rensa skräpkod', +focus_alert : 'Flytta markören till en textyta innan du använder detta kommando.', +edit_confirm : 'Vill du använda WYSIWYG-editorn för detta textfält?', +insert_link_title : 'Skapa/redigera länk', +insert : 'Skapa', +update : 'Uppdatera', +cancel : 'Avbryt', +insert_link_url : 'Länkens URL', +insert_link_target : 'Fönster', +insert_link_target_same : 'Öppna länken i samma fönster', +insert_link_target_blank : 'Öppna länken i ett nytt fönster', +insert_link_delta_width : 20, +insert_link_delta_height : 10, +insert_image_title : 'Skapa/redigera bild', +insert_image_src : 'Bildens URL', +insert_image_alt : 'Bildens beskrivning', +bold_img : 'bold_de_se.gif', +italic_img : 'italic_de_se.gif', +underline_img : "underline.gif", +clipboard_msg : 'Klipput/Kopiera/Klistra fungerar inte Mozilla och Firefox. Vill du veta mer om detta?', +help_desc : "Hjälp", +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/th.js b/includes/tiny_mce/langs/th.js new file mode 100644 index 0000000..3b78806 --- /dev/null +++ b/includes/tiny_mce/langs/th.js @@ -0,0 +1,40 @@ +// TH lang variables Thai contributed by Innozent + +tinyMCE.addToLang('',{ +bold_desc : 'µÑÇ˹Ò', +italic_desc : 'µÑÇéàÍÕ§', +underline_desc : '¢ÕŽàÊé¹ãµé', +striketrough_desc : '¢ÕŽ€ÅèÍÁ', +justifyleft_desc : 'ªÔŽ¢Íº«éÒÂ', +justifycenter_desc : '¡Öè§¡ÅÒ§', +justifyright_desc : 'ªÔŽ¢Íº¢ÇÒ', +justifyfull_desc : 'šÑŽªÔŽ¢Íº', +bullist_desc : 'ÊÑ­ÅѡɳìáÊŽ§ËÑÇ¢éÍÂèÍÂ', +numlist_desc : 'ÅӎѺàÅ¢', +outdent_desc : 'ÅŽ¡ÒÃàÂ×éͧ', +indent_desc : 'àŸÔèÁ¡ÒÃàÂ×éͧ', +undo_desc : 'àÅÔ¡·Ó', +redo_desc : '·ÓãËÁè', +link_desc : 'àŸÔèÁÅÔ§€ì', +unlink_desc : 'źÅÔ§€ì', +image_desc : 'ãÊèÃÙ»', +cleanup_desc : '·Ó€ÇÒÁÊÐÍÒŽ¢éÍ€ÇÒÁ', +focus_alert : 'µéͧàÅ×Í¡¡Åèͧ¢éÍ€ÇÒÁ¡è͹·ÕèšÐãªé€ÓÊÑè§¹Õé', +edit_confirm : '€Ø³µéͧ¡Ò÷ÕèšÐãªé WYSIWYG mode ÊÓËÃѺ¡Åèͧ¢éÍ€ÇÒÁ¹ÕéËÃ×ÍäÁè?', +insert_link_title : 'àŸÔèÁ/á¡éä¢ ÅÔ§€ì', +insert : 'àŸÔèÁ', +cancel : '¡àÅÔ¡', +insert_link_url : 'Link URL', +insert_link_target : 'à»ÔŽÅÔ§€ìã¹', +insert_link_target_same : '˹éÒµèÒ§àŽÕÂǡѹ', +insert_link_target_blank : '˹éÒµèÒ§ãËÁè', +insert_image_title : 'àŸÔèÁ/á¡éä¢ ÃÙ»', +insert_image_src : 'URL ¢Í§ÃÙ»', +insert_image_alt : '€ÓÍžÔºÒÂÃÙ»', +help_desc : 'ªèÇÂàËÅ×Í', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +popup_blocked : 'Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.' +}); diff --git a/includes/tiny_mce/langs/zh_cn.js b/includes/tiny_mce/langs/zh_cn.js new file mode 100644 index 0000000..c7b7545 --- /dev/null +++ b/includes/tiny_mce/langs/zh_cn.js @@ -0,0 +1,41 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +bold_desc : 'ºÚÌå (Ctrl+B)', +italic_desc : 'бÌå (Ctrl+I)', +underline_desc : 'Ï»®Ïß (Ctrl+U)', +striketrough_desc : 'ÉŸ³ýÏß', +justifyleft_desc : '×ó¶ÔÆë', +justifycenter_desc : 'ŸÓÖÐ¶ÔÆë', +justifyright_desc : 'ÓÒ¶ÔÆë', +justifyfull_desc : 'Áœ¶Ë¶ÔÆë', +bullist_desc : 'ÎÞÐòÁбí', +numlist_desc : 'ÓÐÐòÁбí', +outdent_desc : 'ŒõÉÙËõœø', +indent_desc : 'ÔöŒÓËõœø', +undo_desc : '³·Ïû (Ctrl+Z)', +redo_desc : 'ÖØ×ö (Ctrl+Y)', +link_desc : '²åÈë/±àŒ­ ÁŽœÓ', +unlink_desc : 'ÉŸ³ýÁŽœÓ', +image_desc : '²åÈë/±àŒ­ ÍŒÏñ', +cleanup_desc : 'ÉŸ³ýÈßÓàŽúÂë', +focus_alert : 'ÇëÏÈÑ¡Ôñ±àŒ­Çø', +edit_confirm : 'ÄúÏëÔÚ±àŒ­ÇøÓòÉÏʹÓÃËùŒûŒŽËùµÃ±àŒ­Æ÷ÃŽ£¿', +insert_link_title : '²åÈë/±àŒ­ ÁŽœÓ', +insert : '²åÈë', +update : 'žüÐÂ', +cancel : 'È¡Ïû', +insert_link_url : 'ÁŽœÓµØÖ·', +insert_link_target : 'ÁŽœÓÄ¿±ê', +insert_link_target_same : 'ÔÚÍ¬Ò»Ž°¿ÚÖÐŽò¿ªÁŽœÓ', +insert_link_target_blank : 'ÔÚÐÂŽ°¿ÚÖÐŽò¿ªÁŽœÓ', +insert_image_title : '²åÈë/±àŒ­ ÍŒÏñ', +insert_image_src : 'ÍŒÏñµØÖ·', +insert_image_alt : 'ÍŒÏñÃèÊö', +help_desc : '°ïÖú', +bold_img : "bold.gif", +italic_img : "italic.gif", +underline_img : "underline.gif", +clipboard_msg : 'ŒôÇÐ/žŽÖÆ/Õ³Ìù¹ŠÄÜÔÚ Mozilla ºÍ Firefox ä¯ÀÀÆ÷Öв»Ö§³Ö¡£ÄúÏ£Íû»ñµÃžü¶àµÄÐÅÏ¢Âð£¿', +popup_blocked : '¶Ô²»Æð, ÄúµÄä¯ÀÀÆ÷œûÖ¹Á˵¯³öÊœŽ°¿Ú¡£ÎªÁËÈÃÄúʹÓõœ×îÍêÉÆµÄ¹ŠÄÜ£¬Çë¶Ô±ŸÍøÕŸµÄµ¯³öÊœŽ°¿Úœâ³ýœûÖ¹¡£' +}); diff --git a/includes/tiny_mce/langs/zh_tw.js b/includes/tiny_mce/langs/zh_tw.js new file mode 100644 index 0000000..507cdf8 --- /dev/null +++ b/includes/tiny_mce/langs/zh_tw.js @@ -0,0 +1,42 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +bold_desc : '²ÊÅé¡]Ctrl+B¡^', +italic_desc : '±×Åé¡]Ctrl+I¡^', +underline_desc : '¥[©³œu¡]Ctrl+U¡^', +striketrough_desc : '§R°£œu', +justifyleft_desc : 'Ÿa¥ª', +justifycenter_desc : 'žm€€', +justifyright_desc : 'Ÿa¥k', +justifyfull_desc : 'Ÿãœg¹ï»ô', +bullist_desc : '¶µ¥Ø€èŠ¡±øŠC', +numlist_desc : 'œsž¹€èŠ¡±øŠC', +outdent_desc : 'ÂX€jÁY±Æ', +indent_desc : 'Žî€pÁY±Æ', +undo_desc : 'Ž_­ì¡]Ctrl+Z¡^', +redo_desc : '­«œÆ¡]Ctrl+Y¡^', +link_desc : 'Ž¡€J©Îœs¿è³sµ²', +unlink_desc : '§R°£³sµ²', +image_desc : 'Ž¡€J©Îœs¿è¹ÏÀÉ', +cleanup_desc : '²M°£€ŸœX', +focus_alert : 'šÏ¥Îй«ü¥O«e¶·¥ý«ü©wœs¿èŸ¹', +edit_confirm : '­n©óй€åŠr¿é€J°Ï€€±Ä¥Î©Òµø§Y±oŒÒŠ¡¶Ü¡H', +insert_link_title : 'Ž¡€J©Îœs¿è³sµ²', +insert : 'Ž¡€J', +update : '§ó·s', +cancel : 'šú®ø', +insert_link_url : '³sµ²ºô§}', +insert_link_target : '¹ï¶H', +insert_link_target_same : '©óŠPµøµ¡€€¶}±Ò³sµ²', +insert_link_target_blank : '¥H·sµøµ¡€€¶}±Ò³sµ²', +insert_image_title : 'Ž¡€J©Îœs¿è¹ÏÀÉ', +insert_image_src : '¹ÏÀɺô§}', +insert_image_alt : '¹ÏÀÉ»¡©ú', +help_desc : 'šó§U', +bold_img : "bold_tw.gif", +italic_img : "italic_tw.gif", +underline_img : "underline_tw.gif", +clipboard_msg : 'Šb Mozilla ©M Firefox €€µLªkšÏ¥ÎœÆ»s©Î°Å€U©Î¶K€W¥\¯à¡C\n»Ý­n§óŠhÃö©óйªº°T®§¶Ü¡H', +popup_blocked : '³á¡I±zг³]žmžõ²{µøµ¡¹jµŽŸ÷šî¡A€w±N¥\¯àžõ²{µøµ¡µ¹¹jµŽ€F¡C\nœÐœÕŸãžõ²{µøµ¡¹jµŽŸ÷šîªº³]©w¡A€~¯à¥¿±`šÏ¥Îй¥\¯à¡C' +}); \ No newline at end of file diff --git a/includes/tiny_mce/langs/zh_tw_utf8.js b/includes/tiny_mce/langs/zh_tw_utf8.js new file mode 100644 index 0000000..b99d1ba --- /dev/null +++ b/includes/tiny_mce/langs/zh_tw_utf8.js @@ -0,0 +1,42 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +bold_desc : '粗體Ctrl+B', +italic_desc : '斜體Ctrl+I', +underline_desc : '加底線Ctrl+U', +striketrough_desc : '刪陀線', +justifyleft_desc : '靠巊', +justifycenter_desc : '眮䞭', +justifyright_desc : '靠右', +justifyfull_desc : '敎篇對霊', +bullist_desc : '項目方匏條列', +numlist_desc : '線號方匏條列', +outdent_desc : '擎倧瞮排', +indent_desc : '枛小瞮排', +undo_desc : '埩原Ctrl+Z', +redo_desc : '重耇Ctrl+Y', +link_desc : '插入或線茯連結', +unlink_desc : '刪陀連結', +image_desc : '插入或線茯圖檔', +cleanup_desc : '枅陀冗碌', +focus_alert : '䜿甚歀指什前須先指定線茯噚', +edit_confirm : '芁斌歀文字茞入區䞭採甚所芖即埗暡匏嗎', +insert_link_title : '插入或線茯連結', +insert : '插入', +update : '曎新', +cancel : '取消', +insert_link_url : '連結網址', +insert_link_target : '對象', +insert_link_target_same : '斌同芖窗䞭開啟連結', +insert_link_target_blank : '以新芖窗䞭開啟連結', +insert_image_title : '插入或線茯圖檔', +insert_image_src : '圖檔網址', +insert_image_alt : '圖檔說明', +help_desc : '協助', +bold_img : "bold_tw.gif", +italic_img : "italic_tw.gif", +underline_img : "underline_tw.gif", +clipboard_msg : '圚 Mozilla 和 Firefox 䞭無法䜿甚耇補或剪䞋或貌䞊功胜。\n需芁曎倚關斌歀的蚊息嗎', +popup_blocked : '喔悚有蚭眮跳珟芖窗隔絕機制已將功胜跳珟芖窗絊隔絕了。\n請調敎跳珟芖窗隔絕機制的蚭定才胜正垞䜿甚歀功胜。' +}); diff --git a/includes/tiny_mce/license.txt b/includes/tiny_mce/license.txt new file mode 100644 index 0000000..32c3aa4 --- /dev/null +++ b/includes/tiny_mce/license.txt @@ -0,0 +1,437 @@ + GNU LIBRARY GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the library GPL. It is + numbered 2 because it goes with version 2 of the ordinary GPL.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Library General Public License, applies to some +specially designated Free Software Foundation software, and to any +other libraries whose authors decide to use it. You can use it for +your libraries, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the library, or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link a program with the library, you must provide +complete object files to the recipients so that they can relink them +with the library, after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + Our method of protecting your rights has two steps: (1) copyright +the library, and (2) offer you this license which gives you legal +permission to copy, distribute and/or modify the library. + + Also, for each distributor's protection, we want to make certain +that everyone understands that there is no warranty for this free +library. If the library is modified by someone else and passed on, we +want its recipients to know that what they have is not the original +version, so that any problems introduced by others will not reflect on +the original authors' reputations. +. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that companies distributing free +software will individually obtain patent licenses, thus in effect +transforming the program into proprietary software. To prevent this, +we have made it clear that any patent must be licensed for everyone's +free use or not licensed at all. + + Most GNU software, including some libraries, is covered by the ordinary +GNU General Public License, which was designed for utility programs. This +license, the GNU Library General Public License, applies to certain +designated libraries. This license is quite different from the ordinary +one; be sure to read it in full, and don't assume that anything in it is +the same as in the ordinary license. + + The reason we have a separate public license for some libraries is that +they blur the distinction we usually make between modifying or adding to a +program and simply using it. Linking a program with a library, without +changing the library, is in some sense simply using the library, and is +analogous to running a utility program or application program. However, in +a textual and legal sense, the linked executable is a combined work, a +derivative of the original library, and the ordinary General Public License +treats it as such. + + Because of this blurred distinction, using the ordinary General +Public License for libraries did not effectively promote software +sharing, because most developers did not use the libraries. We +concluded that weaker conditions might promote sharing better. + + However, unrestricted linking of non-free programs would deprive the +users of those programs of all benefit from the free status of the +libraries themselves. This Library General Public License is intended to +permit developers of non-free programs to use free libraries, while +preserving your freedom as a user of such programs to change the free +libraries that are incorporated in them. (We have not seen how to achieve +this as regards changes in header files, but we have achieved it as regards +changes in the actual functions of the Library.) The hope is that this +will lead to faster development of free libraries. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, while the latter only +works together with the library. + + Note that it is possible for a library to be covered by the ordinary +General Public License rather than by this special one. +. + GNU LIBRARY GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library which +contains a notice placed by the copyright holder or other authorized +party saying it may be distributed under the terms of this Library +General Public License (also called "this License"). Each licensee is +addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. +. + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. +. + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. +. + 6. As an exception to the Sections above, you may also compile or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + c) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + d) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the source code distributed need not include anything that is normally +distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. +. + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. +. + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Library General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. +. + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS diff --git a/includes/tiny_mce/plugins/_template/editor_plugin.js b/includes/tiny_mce/plugins/_template/editor_plugin.js new file mode 100644 index 0000000..19eefd4 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/editor_plugin.js @@ -0,0 +1,118 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('template', 'en'); // <- Add a comma separated list of all supported languages + +/**** + * Steps for creating a plugin from this template: + * + * 1. Change all "template" to the name of your plugin. + * 2. Remove all the callbacks in this file that you don't need. + * 3. Remove the popup.htm file if you don't need any popups. + * 4. Add your custom logic to the callbacks you needed. + * 5. Write documentation in a readme.txt file on how to use the plugin. + * 6. Upload it under the "Plugins" section at sourceforge. + * + ****/ + +/** + * Gets executed when a editor instance is initialized + */ +function TinyMCE_template_initInstance(inst) { + // You can take out plugin specific parameters + alert("Initialization parameter:" + tinyMCE.getParam("template_someparam", false)); +} + +/** + * Gets executed when a editor needs to generate a button. + */ +function TinyMCE_template_getControlHTML(control_name) { + switch (control_name) { + case "template": + return ''; + } + + return ""; +} + +/** + * Gets executed when a command is called. + */ +function TinyMCE_template_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser. + case "mceTemplate": + // Show UI/Popup + if (user_interface) { + // Open a popup window and send in some custom data in a window argument + var template = new Array(); + + template['file'] = '../../plugins/template/popup.htm'; // Relative to theme + template['width'] = 300; + template['height'] = 200; + + tinyMCE.openWindow(template, {editor_id : editor_id, some_custom_arg : "somecustomdata"}); + + // Let TinyMCE know that something was modified + tinyMCE.triggerNodeChange(false); + } else { + // Do a command this gets called from the template popup + alert("execCommand: mceTemplate gets called from popup."); + } + + return true; + } + + // Pass to next handler in chain + return false; +} + +/** + * Gets executed when the selection/cursor position was changed. + */ +function TinyMCE_template_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + // Deselect template button + tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonNormal'); + + // Select template button if parent node is a strong or b + if (node.parentNode.nodeName == "STRONG" || node.parentNode.nodeName == "B") + tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonSelected'); + + return true; +} + +/** + * Gets executed when contents is inserted / retrived. + */ +function TinyMCE_template_cleanup(type, content) { + switch (type) { + case "get_from_editor": + alert("[FROM] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "insert_to_editor": + alert("[TO] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "get_from_editor_dom": + alert("[FROM] Value DOM Element " + content.innerHTML); + + // Do custom cleanup code here + + break; + + case "insert_to_editor_dom": + alert("[TO] Value DOM Element: " + content.innerHTML); + + // Do custom cleanup code here + + break; + } + + return content; +} diff --git a/includes/tiny_mce/plugins/_template/editor_plugin_src.js b/includes/tiny_mce/plugins/_template/editor_plugin_src.js new file mode 100644 index 0000000..5ae7f7f --- /dev/null +++ b/includes/tiny_mce/plugins/_template/editor_plugin_src.js @@ -0,0 +1,132 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('template', 'en,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl'); // <- Add a comma separated list of all supported languages + +/**** + * Steps for creating a plugin from this template: + * + * 1. Change all "template" to the name of your plugin. + * 2. Remove all the callbacks in this file that you don't need. + * 3. Remove the popup.htm file if you don't need any popups. + * 4. Add your custom logic to the callbacks you needed. + * 5. Write documentation in a readme.txt file on how to use the plugin. + * 6. Upload it under the "Plugins" section at sourceforge. + * + ****/ + +/** + * Information about the plugin. + */ +function TinyMCE_template_getInfo() { + return { + longname : 'Template plugin', + author : 'Your name', + authorurl : 'http://www.yoursite.com', + infourl : 'http://www.yoursite.com/docs/template.html', + version : "1.0" + }; +}; + +/** + * Gets executed when a editor instance is initialized + */ +function TinyMCE_template_initInstance(inst) { + // You can take out plugin specific parameters + alert("Initialization parameter:" + tinyMCE.getParam("template_someparam", false)); +} + +/** + * Gets executed when a editor needs to generate a button. + */ +function TinyMCE_template_getControlHTML(control_name) { + switch (control_name) { + case "template": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceTemplate\', true);return false;'; + return ''; + } + + return ""; +} + +/** + * Gets executed when a command is called. + */ +function TinyMCE_template_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + // Remember to have the "mce" prefix for commands so they don't intersect with built in ones in the browser. + case "mceTemplate": + // Show UI/Popup + if (user_interface) { + // Open a popup window and send in some custom data in a window argument + var template = new Array(); + + template['file'] = '../../plugins/template/popup.htm'; // Relative to theme + template['width'] = 300; + template['height'] = 200; + + tinyMCE.openWindow(template, {editor_id : editor_id, some_custom_arg : "somecustomdata"}); + + // Let TinyMCE know that something was modified + tinyMCE.triggerNodeChange(false); + } else { + // Do a command this gets called from the template popup + alert("execCommand: mceTemplate gets called from popup."); + } + + return true; + } + + // Pass to next handler in chain + return false; +} + +/** + * Gets executed when the selection/cursor position was changed. + */ +function TinyMCE_template_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + // Deselect template button + tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonNormal'); + + // Select template button if parent node is a strong or b + if (node.parentNode.nodeName == "STRONG" || node.parentNode.nodeName == "B") + tinyMCE.switchClassSticky(editor_id + '_template', 'mceButtonSelected'); + + return true; +} + +/** + * Gets executed when contents is inserted / retrived. + */ +function TinyMCE_template_cleanup(type, content) { + switch (type) { + case "get_from_editor": + alert("[FROM] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "insert_to_editor": + alert("[TO] Value HTML string: " + content); + + // Do custom cleanup code here + + break; + + case "get_from_editor_dom": + alert("[FROM] Value DOM Element " + content.innerHTML); + + // Do custom cleanup code here + + break; + + case "insert_to_editor_dom": + alert("[TO] Value DOM Element: " + content.innerHTML); + + // Do custom cleanup code here + + break; + } + + return content; +} diff --git a/includes/tiny_mce/plugins/_template/images/template.gif b/includes/tiny_mce/plugins/_template/images/template.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ab5da4461113d2af579898528246fdbe52ecd00 GIT binary patch literal 87 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*pGzw+SQ`#f{}FJ-?!v#V)e mtsGNfpJeCKSAiOz**>0`XR2{OVa>-G_df0vaY_ */ + +tinyMCE.addToLang('',{ +template_title : 'Dette er bare en pop-up-skabelon', +template_desc : 'Dette er bare en testknap' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/de.js b/includes/tiny_mce/plugins/_template/langs/de.js new file mode 100644 index 0000000..193d5e7 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/de.js @@ -0,0 +1,9 @@ +// DE lang variables + +/* Remember to namespace the language parameters lang__ */ +/* Sprachparameter müssen als lang__ definiert werden */ + +tinyMCE.addToLang('',{ +template_title : 'Dies ist nur ein Beispiel-Popup', +template_desc : 'Dies ist nur ein Beispiel-Button' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/en.js b/includes/tiny_mce/plugins/_template/langs/en.js new file mode 100644 index 0000000..fb1cdc6 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/en.js @@ -0,0 +1,8 @@ +// UK lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'This is just a template popup', +template_desc : 'This is just a template button' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/es.js b/includes/tiny_mce/plugins/_template/langs/es.js new file mode 100644 index 0000000..f5438fa --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/es.js @@ -0,0 +1,14 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +template_title : 'Esto es solo la plantilla de un popup', +template_desc : 'Esto es solo la plantilla de un botón' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/fr.js b/includes/tiny_mce/plugins/_template/langs/fr.js new file mode 100644 index 0000000..4573303 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/fr.js @@ -0,0 +1,9 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 +// Modifié par Normand Lamoureux le 2005-11-12 + +/* N'oubliez pas d'identifer les paramètres de langue ainsi: _ */ + +tinyMCE.addToLang('',{ +template_title : 'Texte qui apparaîtra sous forme de titre dans la fenêtre pop-up de votre plugin', +template_desc : 'Texte qui apparaîtra sous forme d\'info-bulle au survol du bouton de votre plugin' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/fr_ca.js b/includes/tiny_mce/plugins/_template/langs/fr_ca.js new file mode 100644 index 0000000..91c1332 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/fr_ca.js @@ -0,0 +1,8 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +/* Remember to namespace the language parameters _ */ + +tinyMCE.addToLang('',{ +template_title : 'Ceci est un exmple pour le gabarit de popup', +template_desc : 'Ceci est un exmple pour le gabarit d\'un bouton' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/he.js b/includes/tiny_mce/plugins/_template/langs/he.js new file mode 100644 index 0000000..daa3269 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/he.js @@ -0,0 +1,8 @@ +// HE lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'æä ñúí çìåï ÷åôõ ùì äúáðéú', +template_desc : 'æä ñúí ëôúåø ùì äúáðéú' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/hu.js b/includes/tiny_mce/plugins/_template/langs/hu.js new file mode 100644 index 0000000..855fed4 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/hu.js @@ -0,0 +1,8 @@ +// HU lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Ez csak egy példa popup', +template_desc : 'Ez csak egy példa gomb' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/is.js b/includes/tiny_mce/plugins/_template/langs/is.js new file mode 100644 index 0000000..1bac081 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/is.js @@ -0,0 +1,8 @@ +// Iceland lang variables by Johannes Birgir Jensson + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Þetta er sniðmátsgluggi', +template_desc : 'Þetta er sniðmátstakki' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/nb.js b/includes/tiny_mce/plugins/_template/langs/nb.js new file mode 100644 index 0000000..5d8cce4 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/nb.js @@ -0,0 +1,8 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Dette er bare en template popup', +template_desc : 'Dette er bare en template knapp' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/nl.js b/includes/tiny_mce/plugins/_template/langs/nl.js new file mode 100644 index 0000000..4cbf320 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/nl.js @@ -0,0 +1,8 @@ +// NL lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Dit is slechts een voorbeeldpopup', +template_desc : 'Dit is slechts een voorbeeldknop' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/nn.js b/includes/tiny_mce/plugins/_template/langs/nn.js new file mode 100644 index 0000000..d94a712 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/nn.js @@ -0,0 +1,8 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Dette er berre ein template popup', +template_desc : 'Dette er berre ein template knapp' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/pl.js b/includes/tiny_mce/plugins/_template/langs/pl.js new file mode 100644 index 0000000..74114ae --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/pl.js @@ -0,0 +1,8 @@ +// PL lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'To jest szablon okna popup', +template_desc : 'To jest szablon przycisku' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/pt_br.js b/includes/tiny_mce/plugins/_template/langs/pt_br.js new file mode 100644 index 0000000..e258fc9 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/pt_br.js @@ -0,0 +1,13 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +template_title : 'Este é só um modêlo de popup', +template_desc : 'Este é só um modêlo de botão' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/ru.js b/includes/tiny_mce/plugins/_template/langs/ru.js new file mode 100644 index 0000000..50a1702 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/ru.js @@ -0,0 +1,8 @@ +// RU cp1251 lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'Ýòî øàáëîí äëÿ popup', +template_desc : 'Ýòî øàáëîí äëÿ êíîïêè' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/_template/langs/ru_KOI8-R.js new file mode 100644 index 0000000..0a436d8 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/ru_KOI8-R.js @@ -0,0 +1,8 @@ +// RU KOI8-R lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'üÔÏ ÛÁÂÌÏÎ ÄÌÑ popup', +template_desc : 'üÔÏ ÛÁÂÌÏÎ ÄÌÑ ËÎÏÐËÉ' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/_template/langs/ru_UTF-8.js new file mode 100644 index 0000000..4d6a67e --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/ru_UTF-8.js @@ -0,0 +1,8 @@ +// RU UTF-8 lang variables + +/* Remember to namespace the language parameters lang__ */ + +tinyMCE.addToLang('',{ +template_title : 'ЭтП шаблПМ Ўля popup', +template_desc : 'ЭтП шаблПМ Ўля кМПпкО' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/zh_cn.js b/includes/tiny_mce/plugins/_template/langs/zh_cn.js new file mode 100644 index 0000000..1ec1939 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/zh_cn.js @@ -0,0 +1,8 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +/* Remember to namespace the language parameters _ */ + +tinyMCE.addToLang('',{ +template_title : 'ÕâÊÇÒ»žöÄ£°åµ¯³öް¿Ú', +template_desc : 'ÕâÊÇÒ»žöÄ£°å°ŽÅ¥' +}); diff --git a/includes/tiny_mce/plugins/_template/langs/zh_tw.js b/includes/tiny_mce/plugins/_template/langs/zh_tw.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/_template/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/_template/langs/zh_tw_utf8.js new file mode 100644 index 0000000..38a156e --- /dev/null +++ b/includes/tiny_mce/plugins/_template/langs/zh_tw_utf8.js @@ -0,0 +1,7 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +template_title : '暣匏跳珟芖窗', +template_desc : '暣匏按鈕' +}); diff --git a/includes/tiny_mce/plugins/_template/popup.htm b/includes/tiny_mce/plugins/_template/popup.htm new file mode 100644 index 0000000..d46ef7a --- /dev/null +++ b/includes/tiny_mce/plugins/_template/popup.htm @@ -0,0 +1,48 @@ + + + {$lang_template_title} + + + + + +
+

{$lang_template_title}

+ + +
+ The selected element name: +
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/_template/readme.txt b/includes/tiny_mce/plugins/_template/readme.txt new file mode 100644 index 0000000..2ee1505 --- /dev/null +++ b/includes/tiny_mce/plugins/_template/readme.txt @@ -0,0 +1 @@ +This is a template/tutorial plugin that where created to help you in the development of own plugins for TinyMCE. \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advhr/editor_plugin.js b/includes/tiny_mce/plugins/advhr/editor_plugin.js new file mode 100644 index 0000000..cb32092 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advhr','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advhr_getInfo(){return{longname:'Advanced HR',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advhr_getControlHTML(control_name){switch(control_name){case "advhr":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvancedHr\');return false;';return '';}return "";}function TinyMCE_advhr_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvancedHr":var template=new Array();template['file']='../../plugins/advhr/rule.htm';template['width']=270;template['height']=180;template['width']+=tinyMCE.getLang('lang_advhr_delta_width',0);template['height']+=tinyMCE.getLang('lang_advhr_delta_height',0);var size="",width="",noshade="";if(tinyMCE.selectedElement!=null&&tinyMCE.selectedElement.nodeName.toLowerCase()=="hr"){tinyMCE.hrElement=tinyMCE.selectedElement;if(tinyMCE.hrElement){size=tinyMCE.hrElement.getAttribute('size')?tinyMCE.hrElement.getAttribute('size'):"";width=tinyMCE.hrElement.getAttribute('width')?tinyMCE.hrElement.getAttribute('width'):"";noshade=tinyMCE.hrElement.getAttribute('noshade')?tinyMCE.hrElement.getAttribute('noshade'):"";}tinyMCE.openWindow(template,{editor_id:editor_id,size:size,width:width,noshade:noshade,mceDo:'update'});}else{if(tinyMCE.isMSIE){tinyMCE.execInstanceCommand(editor_id,'mceInsertContent',false,'
');}else{tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",size:size,width:width,noshade:noshade,mceDo:'insert'});}}return true;}return false;}function TinyMCE_advhr_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="hr")tinyMCE.switchClassSticky(editor_id+'_advhr','mceButtonSelected');}while((node=node.parentNode));return true;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advhr/editor_plugin_src.js b/includes/tiny_mce/plugins/advhr/editor_plugin_src.js new file mode 100644 index 0000000..883d185 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/editor_plugin_src.js @@ -0,0 +1,75 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('advhr', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_advhr_getInfo() { + return { + longname : 'Advanced HR', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advhr.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_advhr_getControlHTML(control_name) { + switch (control_name) { + case "advhr": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvancedHr\');return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the mceAdvanceHr command. + */ +function TinyMCE_advhr_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceAdvancedHr": + var template = new Array(); + + template['file'] = '../../plugins/advhr/rule.htm'; // Relative to theme + template['width'] = 270; + template['height'] = 180; + + template['width'] += tinyMCE.getLang('lang_advhr_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_advhr_delta_height', 0); + + var size = "", width = "", noshade = ""; + if (tinyMCE.selectedElement != null && tinyMCE.selectedElement.nodeName.toLowerCase() == "hr"){ + tinyMCE.hrElement = tinyMCE.selectedElement; + if (tinyMCE.hrElement) { + size = tinyMCE.hrElement.getAttribute('size') ? tinyMCE.hrElement.getAttribute('size') : ""; + width = tinyMCE.hrElement.getAttribute('width') ? tinyMCE.hrElement.getAttribute('width') : ""; + noshade = tinyMCE.hrElement.getAttribute('noshade') ? tinyMCE.hrElement.getAttribute('noshade') : ""; + } + tinyMCE.openWindow(template, {editor_id : editor_id, size : size, width : width, noshade : noshade, mceDo : 'update'}); + } else { + if (tinyMCE.isMSIE) { + tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false,'
'); + } else { + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", size : size, width : width, noshade : noshade, mceDo : 'insert'}); + } + } + + return true; + } + // Pass to next handler in chain + return false; +} + +function TinyMCE_advhr_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonNormal'); + + if (node == null) + return; + + do { + if (node.nodeName.toLowerCase() == "hr") + tinyMCE.switchClassSticky(editor_id + '_advhr', 'mceButtonSelected'); + } while ((node = node.parentNode)); + + return true; +} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advhr/images/advhr.gif b/includes/tiny_mce/plugins/advhr/images/advhr.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2f8658f463e2a260c22ae8affec1ece193886e3 GIT binary patch literal 153 zcmV;K0A~M3Nk%w1VH5xq0K*0VGD>2SnzBNA;8Vse6Vn)2G_{+hP(f{&eIlJZiD z@^XTb!rK0Vs`8@3@&Et;A^8LW000jFEC2ui02BZe000C=@X1N5y*TU5yZ@jS1PDT$ z1fZ?}K?R1v3{E24f>IpLLLoCp!-h*V90LY|vTz&<3Y;K;WW)lL6ibC7lt!VjcuX#v H%Mk!OxywD6 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/advhr/jscripts/rule.js b/includes/tiny_mce/plugins/advhr/jscripts/rule.js new file mode 100644 index 0000000..2f398bc --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/jscripts/rule.js @@ -0,0 +1,41 @@ +function init() { + var formObj = document.forms[0]; + formObj.width.value = tinyMCE.getWindowArg('width'); + formObj.size.value = tinyMCE.getWindowArg('size'); + formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('mceDo')); + if (tinyMCE.getWindowArg('noshade')) { + formObj.noshade.checked = true; + } + if (tinyMCE.getWindowArg('width').lastIndexOf('%')!=-1) { + formObj.width2.value = "%"; + formObj.width.value = formObj.width.value.substring(0,formObj.width.value.length-1); + } +} + +function insertHR() { + var formObj = document.forms[0]; + var width = formObj.width.value; + var size = formObj.size.value; + var html = ' +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Insertar/Editar Barra Horizontal', +insert_advhr_width : 'Ancho', +insert_advhr_size : 'Alto', +insert_advhr_noshade : 'Sin Sombras' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/fa.js b/includes/tiny_mce/plugins/advhr/langs/fa.js new file mode 100644 index 0000000..ad03383 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/fa.js @@ -0,0 +1,13 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +insert_advhr_desc : '??? ? ?????? ?? ????', +insert_advhr_width : '???', +insert_advhr_size : '??????', +insert_advhr_noshade : '???? ????' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/fi.js b/includes/tiny_mce/plugins/advhr/langs/fi.js new file mode 100644 index 0000000..272fb06 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/fi.js @@ -0,0 +1,8 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Lisää / Muokkaa vaakaviivaa', +insert_advhr_width : 'Leveys', +insert_advhr_size : 'Korkeus', +insert_advhr_noshade : 'Ei varjostusta' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/fr.js b/includes/tiny_mce/plugins/advhr/langs/fr.js new file mode 100644 index 0000000..5f4c372 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/fr.js @@ -0,0 +1,9 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Insérer une règle horizontale stylée', +insert_advhr_width : 'Largeur', +insert_advhr_size : 'Hauteur', +insert_advhr_noshade : 'Sans ombre' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/fr_ca.js b/includes/tiny_mce/plugins/advhr/langs/fr_ca.js new file mode 100644 index 0000000..b277e6e --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/fr_ca.js @@ -0,0 +1,8 @@ +// CA_FR lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Insérer / Modifier Séparateur Horizontal', +insert_advhr_width : 'Largeur', +insert_advhr_size : 'Hauteur', +insert_advhr_noshade : 'Sans ombrage' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/he.js b/includes/tiny_mce/plugins/advhr/langs/he.js new file mode 100644 index 0000000..92a3598 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/he.js @@ -0,0 +1,8 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'äëðñ/òøåê ÷å àåô÷é', +insert_advhr_width : 'øåçá', +insert_advhr_size : 'âåáä', +insert_advhr_noshade : 'ììà öì' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/hu.js b/includes/tiny_mce/plugins/advhr/langs/hu.js new file mode 100644 index 0000000..9a6d66a --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/hu.js @@ -0,0 +1,8 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Vízszintes vonal beillesztése / szerkesztése', +insert_advhr_width : 'Hosszúság', +insert_advhr_size : 'Szélesség', +insert_advhr_noshade : 'Nincs árnyék' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/is.js b/includes/tiny_mce/plugins/advhr/langs/is.js new file mode 100644 index 0000000..7b163a2 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/is.js @@ -0,0 +1,8 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Bæta við/breyta stiku', +insert_advhr_width : 'Breidd', +insert_advhr_size : 'Hæð', +insert_advhr_noshade : 'Enginn skuggi' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/nb.js b/includes/tiny_mce/plugins/advhr/langs/nb.js new file mode 100644 index 0000000..2614768 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/nb.js @@ -0,0 +1,8 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Lage/Redigere horisontal linje', +insert_advhr_width : 'Bredde', +insert_advhr_size : 'Høyde', +insert_advhr_noshade : 'Ingen skygge' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/nl.js b/includes/tiny_mce/plugins/advhr/langs/nl.js new file mode 100644 index 0000000..9825b2b --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/nl.js @@ -0,0 +1,8 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Horizontale lijn invoegen/bewerken', +insert_advhr_width : 'Breedte', +insert_advhr_size : 'Hoogte', +insert_advhr_noshade : 'Geen schaduw' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/nn.js b/includes/tiny_mce/plugins/advhr/langs/nn.js new file mode 100644 index 0000000..1755742 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/nn.js @@ -0,0 +1,8 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Lage/Redigere horisontal linje', +insert_advhr_width : 'Bredde', +insert_advhr_size : 'Høgde', +insert_advhr_noshade : 'Ingen skugge' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/pl.js b/includes/tiny_mce/plugins/advhr/langs/pl.js new file mode 100644 index 0000000..9561583 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/pl.js @@ -0,0 +1,11 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Wstaw/Edytuj poziom± liniê', +insert_advhr_width : 'Szeroko¶æ', +insert_advhr_size : 'Wysoko¶æ', +insert_advhr_noshade : 'Brak cienia' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/pt_br.js b/includes/tiny_mce/plugins/advhr/langs/pt_br.js new file mode 100644 index 0000000..2fc5968 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/pt_br.js @@ -0,0 +1,16 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Inserir / editar Linha Horizontal', +insert_advhr_width : 'Largura', +insert_advhr_size : 'Altura', +insert_advhr_noshade : 'Sem Sombra' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/ru.js b/includes/tiny_mce/plugins/advhr/langs/ru.js new file mode 100644 index 0000000..efbc53b --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/ru.js @@ -0,0 +1,8 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Âñòàâèòü / ðåäàêòèðîâàòü ãîðèçîíòàëüíûé ðàçäåëèòåëü', +insert_advhr_width : 'Øèðèíà', +insert_advhr_size : 'Âûñîòà', +insert_advhr_noshade : 'Áåç òåíè' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js new file mode 100644 index 0000000..cb46c80 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/ru_KOI8-R.js @@ -0,0 +1,8 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : '÷ÓÔÁ×ÉÔØ / ÒÅÄÁËÔÉÒÏ×ÁÔØ ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÒÁÚÄÅÌÉÔÅÌØ', +insert_advhr_width : 'ûÉÒÉÎÁ', +insert_advhr_size : '÷ÙÓÏÔÁ', +insert_advhr_noshade : 'âÅÚ ÔÅÎÉ' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/advhr/langs/ru_UTF-8.js new file mode 100644 index 0000000..d3d7884 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/ru_UTF-8.js @@ -0,0 +1,8 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'ВставОть / реЎактОрПвать гПрОзПМтальМый разЎелОтель', +insert_advhr_width : 'КОрОМа', +insert_advhr_size : 'ВысПта', +insert_advhr_noshade : 'Без теМО' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/sk.js b/includes/tiny_mce/plugins/advhr/langs/sk.js new file mode 100644 index 0000000..60a8449 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/sk.js @@ -0,0 +1,16 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:43 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'VloÅŸiÅ¥/editovaÅ¥ vodorovnÜ oddeÄŸovač', +insert_advhr_width : 'Šírka', +insert_advhr_size : 'VÜška', +insert_advhr_noshade : 'NestieňovaÅ¥' +}); + diff --git a/includes/tiny_mce/plugins/advhr/langs/sv.js b/includes/tiny_mce/plugins/advhr/langs/sv.js new file mode 100644 index 0000000..ed33011 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/sv.js @@ -0,0 +1,8 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Skapa/Redigera horisontell linje', +insert_advhr_width : 'Bredd', +insert_advhr_size : 'Höjd', +insert_advhr_noshade : 'Ingen skugga' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/zh_cn.js b/includes/tiny_mce/plugins/advhr/langs/zh_cn.js new file mode 100644 index 0000000..8a7d79b --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/zh_cn.js @@ -0,0 +1,8 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +insert_advhr_desc : '²åÈë/±àŒ­ ˮƜ±ê³ß', +insert_advhr_width : '¿í¶È', +insert_advhr_size : 'žß¶È', +insert_advhr_noshade : 'ÎÞÒõÓ°' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/zh_tw.js b/includes/tiny_mce/plugins/advhr/langs/zh_tw.js new file mode 100644 index 0000000..8181ddc --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/zh_tw.js @@ -0,0 +1,10 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('',{ +insert_advhr_desc : 'Ž¡€J©Îœs¿è€ô¥­œu', +insert_advhr_width : 'Œe', +insert_advhr_size : '°ª', +insert_advhr_noshade : 'µL³±Œv' +}); diff --git a/includes/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js new file mode 100644 index 0000000..742fa37 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/langs/zh_tw_utf8.js @@ -0,0 +1,10 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('',{ +insert_advhr_desc : '插入或線茯氎平線', +insert_advhr_width : '寬', +insert_advhr_size : '高', +insert_advhr_noshade : '無陰圱' +}); diff --git a/includes/tiny_mce/plugins/advhr/readme.txt b/includes/tiny_mce/plugins/advhr/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/advhr/rule.htm b/includes/tiny_mce/plugins/advhr/rule.htm new file mode 100644 index 0000000..bfabac1 --- /dev/null +++ b/includes/tiny_mce/plugins/advhr/rule.htm @@ -0,0 +1,59 @@ + + + {$lang_insert_link_title} + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + +
{$lang_insert_advhr_desc}
{$lang_insert_advhr_width}: + + +
{$lang_insert_advhr_size}:
+
+ + diff --git a/includes/tiny_mce/plugins/advimage/css/advimage.css b/includes/tiny_mce/plugins/advimage/css/advimage.css new file mode 100644 index 0000000..3ee309a --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/css/advimage.css @@ -0,0 +1,66 @@ +/* CSS file for advimage plugin popup */ + +.mceImageList { + width: 280px; +} + +.mceActionPanel { + margin-top: 7px; +} + +.alignPreview { + border: 1px solid black; + width: 140px; + height: 140px; + overflow: hidden; + padding: 5px; +} + +.checkbox { + border: 0px; +} + +.panel_wrapper div.current { + height: 305px; +} + +#prev { + margin:0px; + border: 1px + solid black; + width: 99%; + height:150px; + overflow: auto; +} + +#align, #classlist { + width: 150px; +} + +#width, #height { + vertical-align: middle; + width: 50px; + text-align: center; +} + +#vspace, #hspace, #border { + vertical-align: middle; + width: 30px; + text-align: center; +} + +#classlist { + width: 180px; +} + +input { + width: 280px; +} + +#constrain, #onmousemovecheck { + width: auto; +} + +#id, #dir, #lang, #usemap, #longdesc { + width: 200px; +} diff --git a/includes/tiny_mce/plugins/advimage/editor_plugin.js b/includes/tiny_mce/plugins/advimage/editor_plugin.js new file mode 100644 index 0000000..3c81a74 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advimage','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advimage_getInfo(){return{longname:'Advanced image',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advimage.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advimage_getControlHTML(control_name){switch(control_name){case "image":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvImage\');return false;';return '';}return "";}function TinyMCE_advimage_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvImage":var template=new Array();template['file']='../../plugins/advimage/image.htm';template['width']=480;template['height']=380;template['width']+=tinyMCE.getLang('lang_advimage_delta_width',0);template['height']+=tinyMCE.getLang('lang_advimage_delta_height',0);var inst=tinyMCE.getInstanceById(editor_id);var elm=inst.getFocusElement();if(elm!=null&&tinyMCE.getAttrib(elm,'class').indexOf('mceItem')!=-1)return true;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;}return false;}function TinyMCE_advimage_cleanup(type,content){switch(type){case "insert_to_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i'; + } + + return ""; +} + +function TinyMCE_advimage_execCommand(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceAdvImage": + var template = new Array(); + + template['file'] = '../../plugins/advimage/image.htm'; + template['width'] = 480; + template['height'] = 380; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_advimage_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_advimage_delta_height', 0); + + var inst = tinyMCE.getInstanceById(editor_id); + var elm = inst.getFocusElement(); + + if (elm != null && tinyMCE.getAttrib(elm, 'class').indexOf('mceItem') != -1) + return true; + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + + return true; + } + + return false; +} + +function TinyMCE_advimage_cleanup(type, content) { + switch (type) { + case "insert_to_editor_dom": + var imgs = content.getElementsByTagName("img"); + for (var i=0; i + + {$lang_insert_image_title} + + + + + + + + +
+ + +
+
+
+ {$lang_advimage_general} + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
+
+ +
+ {$lang_advimage_preview} + +
+
+ +
+
+ {$lang_advimage_tab_appearance} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ {$lang_advimage_example_img} + Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam + nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum + edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam + erat volutpat. +
+
+ x + px +
  + + + + +
+
+ +
+
+
+ +
+
+ {$lang_advimage_swap_image} + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
+ + + + +
 
 
+
+ +
+ {$lang_advimage_misc} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + +
 
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/advimage/images/sample.gif b/includes/tiny_mce/plugins/advimage/images/sample.gif new file mode 100644 index 0000000000000000000000000000000000000000..53bf6890b507741c10910c9e2217ad8247b98e8d GIT binary patch literal 1624 zcmV-e2B-N)Nk%w1VJ!eH0OkMy|NsB}{r&v>{Q3F$`1ttq^YifV@ayaA>FMd_=H}w! z;^5%m-rnBb-QC>W+}qpR+S=OL+1c3G*w@$B*4Eb4)YQ|{)zHw=&d$%x&CScp%gV~i z$;rvc$jHXV#>B+L!^6YE!otD9!N9=4zrVk|y}i7=yt})*y1Kf#xw*Hux3;#nwY9ah zw6wFcv$C?Xv9YnRu&}SMudc4Ht*x!BtgNf6tE#H1si~={sjjD|r>3T+rKP2$q@<&x zqobp!qN1Xqp`oFnrJ$goprE6lpP!zdp`MSWoSd7Ro12@UnwpxLnw^=MnV6WE zmzS58mX?*3mz9;3mX?*2l$4W`lai8@l9G~eg|M^H&l zLpBo?51@vfgB2q_TVh*dNP<;cR$Wg!vYsMHR!qvvOis>GNH`+ zJ3B|tqgANiBSy@x>Q#;x7+DuU7&rwlf#S04)VZvA$XoUy8Y&f7)SqP<}Lw@L# zA(@Cohl`6CZyedUu^BlmK|DG5$Kl2f8z@uCc)^k-3m7$G!njf7$;XhOW>^`rV#UFh zEN#eG;bP?tCs>{+)q)ceg9$aDAaTZ{MGK5rU8ty$qz8){MT#gHGX{#XEJHLonBXFa zj+#9GE&^pq!`qG`K5iiC!gq}sRY|1yD8?j++_^oR0g+)NNtZN`)08!0q=}AA4HhIo zFaa9NYu8%97=oos5f?O`lwre~4VfoIei+FyK|urxj@C(-q(sS(!$5uL3j&jg7&XY% zlr17;3GGL;2K8>CB87G97;W(2VZ((D+3Hz;L;bylfhf(kFNV8at)h;hdM z85WX(#*Hq@@BYePt3t_l{ zCL3|YVWydA0Fz{rTl65n00)c^)^-jJn1c zRVXtA6mkUMEDLU|v7{JK&_IJ2ciiCy7BOT1fdUBh8b=yrbYaCAchCU_7?H`b1`}4q zLB|_mI2!;7W4QCq6F1O+MW||6AwmKafUrReUA&QotxQZI8D$G)AuSVV@X<&A9v;~H zKnWjo&;bljq=29aCeV-t5GBYkL=Q}q(S~FLd2t39MyRmC%_GFHkPc7CfIt8P*emqV z0YK2j9A+kmW^!tn(ZmG+L=6DZR99W}8p9?Utr=#t@rE2=zxf3QQ(JBJ&<{Z2>8EUP zeX1B)2w_3gXV)D-0Tt+=#@cV-0f!PU#MglZ3m6b}0e08zK^x;9(u?Tga{%?&nNTXhcEuM_#J>yL>p*a zuZJ2pliCGSp!Ye8>YFq@)ZOW-uT~OrjFQK!)UyVGFt7ni'); + } +} + +function convertURL(url, node, on_save) { + return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);"); +} + +function getImageSrc(str) { + var pos = -1; + + if (!str) + return ""; + + if ((pos = str.indexOf('this.src=')) != -1) { + var src = str.substring(pos + 10); + + src = src.substring(0, src.indexOf('\'')); + + if (tinyMCE.getParam('convert_urls')) + src = convertURL(src, null, true); + + return src; + } + + return ""; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var action = "insert"; + var html = ""; + + // Image list src + html = getImageListHTML('imagelistsrc','src','onSelectMainImage'); + if (html == "") + document.getElementById("imagelistsrcrow").style.display = 'none'; + else + document.getElementById("imagelistsrccontainer").innerHTML = html; + + // Image list oversrc + html = getImageListHTML('imagelistover','onmouseoversrc'); + if (html == "") + document.getElementById("imagelistoverrow").style.display = 'none'; + else + document.getElementById("imagelistovercontainer").innerHTML = html; + + // Image list outsrc + html = getImageListHTML('imagelistout','onmouseoutsrc'); + if (html == "") + document.getElementById("imagelistoutrow").style.display = 'none'; + else + document.getElementById("imagelistoutcontainer").innerHTML = html; + + // Src browser + html = getBrowserHTML('srcbrowser','src','image','advimage'); + document.getElementById("srcbrowsercontainer").innerHTML = html; + + // Over browser + html = getBrowserHTML('oversrcbrowser','onmouseoversrc','image','advimage'); + document.getElementById("onmouseoversrccontainer").innerHTML = html; + + // Out browser + html = getBrowserHTML('outsrcbrowser','onmouseoutsrc','image','advimage'); + document.getElementById("onmouseoutsrccontainer").innerHTML = html; + + // Longdesc browser + html = getBrowserHTML('longdescbrowser','longdesc','file','advimage'); + document.getElementById("longdesccontainer").innerHTML = html; + + // Resize some elements + if (isVisible('srcbrowser')) + document.getElementById('src').style.width = '260px'; + + if (isVisible('oversrcbrowser')) + document.getElementById('onmouseoversrc').style.width = '260px'; + + if (isVisible('outsrcbrowser')) + document.getElementById('onmouseoutsrc').style.width = '260px'; + + if (isVisible('longdescbrowser')) + document.getElementById('longdesc').style.width = '180px'; + + // Check action + if (elm != null && elm.nodeName == "IMG") + action = "update"; + + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + if (action == "update") { + var src = tinyMCE.getAttrib(elm, 'src'); + var onmouseoversrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover'))); + var onmouseoutsrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout'))); + + src = convertURL(src, elm, true); + + // Use mce_src if found + var mceRealSrc = tinyMCE.getAttrib(elm, 'mce_src'); + if (mceRealSrc != "") { + src = mceRealSrc; + + if (tinyMCE.getParam('convert_urls')) + src = convertURL(src, elm, true); + } + + if (onmouseoversrc != "" && tinyMCE.getParam('convert_urls')) + onmouseoversrc = convertURL(onmouseoversrc, elm, true); + + if (onmouseoutsrc != "" && tinyMCE.getParam('convert_urls')) + onmouseoutsrc = convertURL(onmouseoutsrc, elm, true); + + // Setup form data + var style = tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style")); + + // Store away old size + orgImageWidth = trimSize(getStyle(elm, 'width')) + orgImageHeight = trimSize(getStyle(elm, 'height')); + + formObj.src.value = src; + formObj.alt.value = tinyMCE.getAttrib(elm, 'alt'); + formObj.title.value = tinyMCE.getAttrib(elm, 'title'); + formObj.border.value = trimSize(getStyle(elm, 'border', 'borderWidth')); + formObj.vspace.value = tinyMCE.getAttrib(elm, 'vspace'); + formObj.hspace.value = tinyMCE.getAttrib(elm, 'hspace'); + formObj.width.value = orgImageWidth; + formObj.height.value = orgImageHeight; + formObj.onmouseoversrc.value = onmouseoversrc; + formObj.onmouseoutsrc.value = onmouseoutsrc; + formObj.id.value = tinyMCE.getAttrib(elm, 'id'); + formObj.dir.value = tinyMCE.getAttrib(elm, 'dir'); + formObj.lang.value = tinyMCE.getAttrib(elm, 'lang'); + formObj.longdesc.value = tinyMCE.getAttrib(elm, 'longdesc'); + formObj.usemap.value = tinyMCE.getAttrib(elm, 'usemap'); + formObj.style.value = tinyMCE.serializeStyle(style); + + // Select by the values + if (tinyMCE.isMSIE) + selectByValue(formObj, 'align', getStyle(elm, 'align', 'styleFloat')); + else + selectByValue(formObj, 'align', getStyle(elm, 'align', 'cssFloat')); + + addClassesToList('classlist', 'advimage_styles'); + + selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class')); + selectByValue(formObj, 'imagelistsrc', src); + selectByValue(formObj, 'imagelistover', onmouseoversrc); + selectByValue(formObj, 'imagelistout', onmouseoutsrc); + + updateStyle(); + showPreviewImage(src, true); + changeAppearance(); + + window.focus(); + } else + addClassesToList('classlist', 'advimage_styles'); + + // If option enabled default contrain proportions to checked + if (tinyMCE.getParam("advimage_constrain_proportions", true)) + formObj.constrain.checked = true; + + // Check swap image if valid data + if (formObj.onmouseoversrc.value != "" || formObj.onmouseoutsrc.value != "") + setSwapImageDisabled(false); + else + setSwapImageDisabled(true); +} + +function setSwapImageDisabled(state) { + var formObj = document.forms[0]; + + formObj.onmousemovecheck.checked = !state; + + setBrowserDisabled('overbrowser', state); + setBrowserDisabled('outbrowser', state); + + if (formObj.imagelistover) + formObj.imagelistover.disabled = state; + + if (formObj.imagelistout) + formObj.imagelistout.disabled = state; + + formObj.onmouseoversrc.disabled = state; + formObj.onmouseoutsrc.disabled = state; +} + +function setAttrib(elm, attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value != "") { + elm.setAttribute(attrib, value); + + if (attrib == "style") + attrib = "style.cssText"; + + if (attrib == "longdesc") + attrib = "longDesc"; + + if (attrib == "width") { + attrib = "style.width"; + value = value + "px"; + } + + if (attrib == "height") { + attrib = "style.height"; + value = value + "px"; + } + + if (attrib == "class") + attrib = "className"; + + eval('elm.' + attrib + "=value;"); + } else + elm.removeAttribute(attrib); +} + +function makeAttrib(attrib, value) { + var formObj = document.forms[0]; + var valueElm = formObj.elements[attrib]; + + if (typeof(value) == "undefined" || value == null) { + value = ""; + + if (valueElm) + value = valueElm.value; + } + + if (value == "") + return ""; + + // XML encode it + value = value.replace(/&/g, '&'); + value = value.replace(/\"/g, '"'); + value = value.replace(//g, '&gr;'); + + return ' ' + attrib + '="' + value + '"'; +} + +function insertAction() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var formObj = document.forms[0]; + var src = formObj.src.value; + var onmouseoversrc = formObj.onmouseoversrc.value; + var onmouseoutsrc = formObj.onmouseoutsrc.value; + + if (tinyMCE.getParam("accessibility_warnings")) { + if (formObj.alt.value == "") { + var answer = confirm(tinyMCE.getLang('lang_advimage_missing_alt', '', true)); + if (answer == true) { + formObj.alt.value = " "; + } + } else { + var answer = true; + } + + if (!answer) + return; + } + + if (onmouseoversrc && onmouseoversrc != "") + onmouseoversrc = "this.src='" + convertURL(onmouseoversrc, tinyMCE.imgElement) + "';"; + + if (onmouseoutsrc && onmouseoutsrc != "") + onmouseoutsrc = "this.src='" + convertURL(onmouseoutsrc, tinyMCE.imgElement) + "';"; + + if (elm != null && elm.nodeName == "IMG") { + setAttrib(elm, 'src', convertURL(src, tinyMCE.imgElement)); + setAttrib(elm, 'mce_src', src); + setAttrib(elm, 'alt'); + setAttrib(elm, 'title'); + setAttrib(elm, 'border'); + setAttrib(elm, 'vspace'); + setAttrib(elm, 'hspace'); + setAttrib(elm, 'width'); + setAttrib(elm, 'height'); + setAttrib(elm, 'onmouseover', onmouseoversrc); + setAttrib(elm, 'onmouseout', onmouseoutsrc); + setAttrib(elm, 'id'); + setAttrib(elm, 'dir'); + setAttrib(elm, 'lang'); + setAttrib(elm, 'longdesc'); + setAttrib(elm, 'usemap'); + setAttrib(elm, 'style'); + setAttrib(elm, 'class', getSelectValue(formObj, 'classlist')); + setAttrib(elm, 'align', getSelectValue(formObj, 'align')); + + //tinyMCEPopup.execCommand("mceRepaint"); + + // Repaint if dimensions changed + if (formObj.width.value != orgImageWidth || formObj.height.value != orgImageHeight) + inst.repaint(); + + // Refresh in old MSIE + if (tinyMCE.isMSIE5) + elm.outerHTML = elm.outerHTML; + } else { + var html = "' + + getImageData(src); +} + +function getImageData(src) { + preloadImg = new Image(); + + tinyMCE.addEvent(preloadImg, "load", updateImageData); + tinyMCE.addEvent(preloadImg, "error", resetImageData); + + preloadImg.src = src; +} + +function updateImageData() { + var formObj = document.forms[0]; + + if (formObj.width.value == "") + formObj.width.value = preloadImg.width; + + if (formObj.height.value == "") + formObj.height.value = preloadImg.height; + + updateStyle(); +} + +function resetImageData() { + var formObj = document.forms[0]; + formObj.width.value = formObj.height.value = ""; +} + +function getSelectValue(form_obj, field_name) { + var elm = form_obj.elements[field_name]; + + if (elm == null || elm.options == null) + return ""; + + return elm.options[elm.selectedIndex].value; +} + +function getImageListHTML(elm_id, target_form_element, onchange_func) { + if (typeof(tinyMCEImageList) == "undefined" || tinyMCEImageList.length == 0) + return ""; + + var html = ""; + + html += ''; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +// While loading +preinit(); diff --git a/includes/tiny_mce/plugins/advimage/langs/cs.js b/includes/tiny_mce/plugins/advimage/langs/cs.js new file mode 100644 index 0000000..ccf65c1 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/cs.js @@ -0,0 +1,8 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +insert_image_alt2 : 'Název obrázku', +insert_image_onmousemove : 'Alternativní obrázek', +insert_image_mouseover : 'pøi najetí myši', +insert_image_mouseout : 'pøi odjetí myši' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/cy.js b/includes/tiny_mce/plugins/advimage/langs/cy.js new file mode 100644 index 0000000..a5b4113 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/cy.js @@ -0,0 +1,27 @@ +// UK lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Cyffredinol', +tab_appearance : 'Ymddangosiad', +tab_advanced : 'Uwch', +general : 'Cyffredinol', +title : 'Teitl', +preview : 'Rhagolwg', +constrain_proportions : 'Cadw cymesuredd', +langdir : 'Cyfeiriad iaith', +langcode : 'Côd iaith', +long_desc : 'Dolen disgrifiad hir', +style : 'Arddull', +classes : 'Dosbarthiadau', +ltr : 'Chwith i\'r dde', +rtl : 'Dde i\'r chwith', +id : 'Id', +image_map : 'Map delwedd', +swap_image : 'Cyfnewid delwedd', +alt_image : 'Delwedd amgen', +mouseover : 'llygoden drosodd', +mouseout : 'llygoden allan', +misc : 'Arall', +example_img : 'Delwedd rhagolwg delwedd', +missing_alt : 'Wyt ti\'n sicr eisiau parhau heb gynnwys Disgrifiad Delwedd? Heb un, mae\'n bosib na fydd y ddelwedd yn hygyrch i ddefnyddwyr gydag anableddau, neu rhai gyda phorwr testun, neu sy\'n pori gyda delweddau wedi\'u diffodd.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/da.js b/includes/tiny_mce/plugins/advimage/langs/da.js new file mode 100644 index 0000000..73f5f3e --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/da.js @@ -0,0 +1,26 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('advimage',{ +tab_general : 'Generelt', +tab_appearance : 'Udseende', +tab_advanced : 'Avanceret', +general : 'Generelt', +title : 'Overskrift', +preview : 'Se', +constrain_proportions : 'Fasthold proportioner', +langdir : 'Tekstretning', +langcode : 'Sprogkode', +long_desc : 'Langt beskrivelseslink', +style : 'Style', +classes : 'Klasser', +ltr : 'Venstre til højre', +rtl : 'Højre til venstre', +id : 'Id', +image_map : 'Billedkort', +swap_image : 'Alternativt billede', +alt_image : 'Alternative image', +mouseover : 'ved mouse over', +mouseout : 'ved mouse out', +misc : 'Diverse', +example_img : 'Appearance preview image' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/de.js b/includes/tiny_mce/plugins/advimage/langs/de.js new file mode 100644 index 0000000..531a089 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/de.js @@ -0,0 +1,27 @@ +// DE lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Allgemein', +tab_appearance : 'Erscheinungsbild', +tab_advanced : 'Erweitert', +general : 'Allgemein', +title : 'Titel', +preview : 'Vorschau', +constrain_proportions : 'Verhältnis beibehalten', +langdir : 'Sprachrichtung', +langcode : 'Sprach-Code', +long_desc : 'Link zu ausführlicher Beschreibung', +style : 'CSS-Stil', +classes : 'CSS-Klassen', +ltr : 'Von links nach rechts', +rtl : 'Von rechts nach links', +id : 'ID', +image_map : 'Image Map (Bild mit sensitiven Bereichen)', +swap_image : 'Bild austauschen', +alt_image : 'Alternatives Bild', +mouseover : 'für Mouse-Over', +mouseout : 'für Mouse-Out', +misc : 'Sonstiges', +example_img : 'Erscheinungsbild Vorschau Bild', +missing_alt : 'Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/en.js b/includes/tiny_mce/plugins/advimage/langs/en.js new file mode 100644 index 0000000..a73acd4 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/en.js @@ -0,0 +1,27 @@ +// UK lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'General', +tab_appearance : 'Appearance', +tab_advanced : 'Advanced', +general : 'General', +title : 'Title', +preview : 'Preview', +constrain_proportions : 'Constrain proportions', +langdir : 'Language direction', +langcode : 'Language code', +long_desc : 'Long description link', +style : 'Style', +classes : 'Classes', +ltr : 'Left to right', +rtl : 'Right to left', +id : 'Id', +image_map : 'Image map', +swap_image : 'Swap image', +alt_image : 'Alternative image', +mouseover : 'for mouse over', +mouseout : 'for mouse out', +misc : 'Miscellaneous', +example_img : 'Appearance preview image', +missing_alt : 'Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/es.js b/includes/tiny_mce/plugins/advimage/langs/es.js new file mode 100644 index 0000000..8cdb39f --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/es.js @@ -0,0 +1,35 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('advimage',{ +tab_general : 'General', +tab_appearance : 'Aspecto', +tab_advanced : 'Avanzado', +general : 'General', +title : 'Titulo', +preview : 'Vista previa', +constrain_proportions : 'Bloquear relación de aspecto', +langdir : 'Dirección del texto', +langcode : 'Código del idioma', +long_desc : 'Descripción larga del link', +style : 'Estilo', +classes : 'Clases', +ltr : 'De izquierda a derecha', +rtl : 'De derecha a izquierda', +id : 'Id', +image_map : 'Mapa de la imagen', +swap_image : 'Intercambio de imagen', +alt_image : 'Imagen alternativa', +mouseover : 'Al pasar el ratón por encima de la imagen', +mouseout : 'Al sacar el ratón de la imagen', +misc : 'Misceláneo', +example_img : 'Aspecto vista previa imagen', +missing_alt : '¿Estás seguro de querer continuar sin incluir una descripción de la imagen? Sin ella la imagen puede no ser accesible para ciertos usuarios discapacitados, o para los usuarios que usen navegadores de texto, o para los usuarios que tengan las imagenes desactivadas en su navegador.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/fa.js b/includes/tiny_mce/plugins/advimage/langs/fa.js new file mode 100644 index 0000000..81fbee0 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/fa.js @@ -0,0 +1,13 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +insert_image_alt2 : '????? ???', +insert_image_onmousemove : '??? ???????', +insert_image_mouseover : '??? ??????? ????? ???? ?????? ????', +insert_image_mouseout : '??? ??????? ????? ???? ?????? ????' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/fa_ca.js b/includes/tiny_mce/plugins/advimage/langs/fa_ca.js new file mode 100644 index 0000000..f4dea43 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/fa_ca.js @@ -0,0 +1,8 @@ +// CA_FR lang variables + +tinyMCE.addToLang('',{ +insert_image_alt2 : 'Titre de l\'image', +insert_image_onmousemove : 'Image alternative', +insert_image_mouseover : 'pour le «mouse over»', +insert_image_mouseout : 'pour le «mouse out»' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/fr.js b/includes/tiny_mce/plugins/advimage/langs/fr.js new file mode 100644 index 0000000..f7a5d93 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/fr.js @@ -0,0 +1,47 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('advlink',{ +general_tab : 'Général', +popup_tab : 'Pop-up', +events_tab : 'Événements', +advanced_tab : 'Avancé', +general_props : 'Propriétés générales', +popup_props : 'Propriétés du pop-up', +event_props : 'Événements', +advanced_props : 'Propriétés avancées', +popup_opts : 'Options', +anchor_names : 'Ancres', +target_same : 'Ovrir dans la même fenêtre/cadre', +target_parent : 'Ouvrir dans la fenêtre/cadre parent', +target_top : 'Ouvrir dans la fenêtre principale', +target_blank : 'Ouvrir dans une nouvelle fenêtre', +popup : 'Pop-up Javascript', +popup_url : 'URL du pop-up', +popup_name : 'Nom de la fenêtre', +popup_return : 'Insérer \'return false;\'', +popup_scrollbars : 'Montrer les barres de défilement', +popup_statusbar : 'Montrer la barre de statut', +popup_toolbar : 'Montrer la barre d\'outils', +popup_menubar : 'Montrer la barre de menus', +popup_location : 'Montrer la barre de titre', +popup_resizable : 'Permettre le redimensionnement', +popup_dependent : 'Dépendent (Mozilla/Firefox seulement)', +popup_size : 'Taille', +popup_position : 'Position (X/Y)', +id : 'Id', +style: 'Style en ligne', +classes : 'Classe CSS', +target_name : 'Nom de la cible', +langdir : 'Sens d\'écriture', +target_langcode : 'Code de langue de la cible', +langcode : 'Code de langue du libellé', +encoding : 'Encodage de la cible', +mime : 'Type MIME de la cible', +rel : 'Relation de la page vers la cible', +rev : 'Relation de la cible vers la page', +tabindex : 'Attribut tabindex', +accesskey : 'Attribut accesskey', +ltr : 'Vers la droite', +rtl : 'Vers la gauche' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/fr_ca.js b/includes/tiny_mce/plugins/advimage/langs/fr_ca.js new file mode 100644 index 0000000..f4dea43 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/fr_ca.js @@ -0,0 +1,8 @@ +// CA_FR lang variables + +tinyMCE.addToLang('',{ +insert_image_alt2 : 'Titre de l\'image', +insert_image_onmousemove : 'Image alternative', +insert_image_mouseover : 'pour le «mouse over»', +insert_image_mouseout : 'pour le «mouse out»' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/he.js b/includes/tiny_mce/plugins/advimage/langs/he.js new file mode 100644 index 0000000..b53c62f --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/he.js @@ -0,0 +1,27 @@ +// HE lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'ëììé', +tab_appearance : 'îøàä', +tab_advanced : 'îú÷ãí', +general : 'ëììé', +title : 'ëåúøú', +preview : 'úöåâä î÷ãéîä', +constrain_proportions : 'äâáìú îéîãéí', +langdir : 'ëéååï ùôä', +langcode : '÷åã ùôä', +long_desc : '÷éùåø ìäñáø àøåê', +style : 'ñâðåï', +classes : 'Classéí', +ltr : 'ùîàì ìéîéï', +rtl : 'éîéï ìùîàì', +id : 'Id', +image_map : 'îôú úîåðä', +swap_image : 'äçìôú úîåðä', +alt_image : 'úîåðä çìåôéú', +mouseover : 'ëùñîï äòëáø îòì äúîåðä', +mouseout : 'ëùñîï äòëáø òåæá àú äúîåðä', +misc : 'àçø', +example_img : 'úöåâä î÷ãéîä ùì îøàä', +missing_alt : 'äàí àúä áèåç ùáøöåðê ìäîùéê îáìé ìëìåì úéàåø ùì äúîåðä? ììà úéàåø, éúëï ëé äúîåðä ìà úäéä ðâéùä ìîùúîùéí áòìé îåâáìåéåú, àå ëàìå äîùúîùéí áãôãôï è÷ñèåàìé, àå ùîñééøéí áøùú áìé ìäöéâ úîåðåú.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/hu.js b/includes/tiny_mce/plugins/advimage/langs/hu.js new file mode 100644 index 0000000..48e5d3b --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/hu.js @@ -0,0 +1,27 @@ +// HU lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Általános', +tab_appearance : 'Megjelenés', +tab_advanced : 'Haladó', +general : 'Általános', +title : 'Cím', +preview : 'Elõnézet', +constrain_proportions : 'Arányok kényszerítése', +langdir : 'Szöveg pozíció', +langcode : 'Szöveg kód', +long_desc : 'Hosszú leírás link', +style : 'Stílus', +classes : 'Osztályok', +ltr : 'Balról jobbra', +rtl : 'Jobbról balra', +id : 'Azonosító', +image_map : 'Kép térkép', +swap_image : 'Kép váltás', +alt_image : 'Másik kép', +mouseover : 'egér rámutatásra', +mouseout : 'egér elmozdítására', +misc : 'Egyéb', +example_img : 'Elõnézeti kép megjelenése', +missing_alt : 'Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/is.js b/includes/tiny_mce/plugins/advimage/langs/is.js new file mode 100644 index 0000000..24802c9 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/is.js @@ -0,0 +1,27 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('advimage',{ +tab_general : 'Aðalstillingar', +tab_appearance : 'Útlit', +tab_advanced : 'Flóknari valkostir', +general : 'Helstu upplýsingar', +title : 'Titill', +preview : 'Forskoðun', +constrain_proportions : 'Vernda hlutföll', +langdir : 'Ritháttur tungumáls', +langcode : 'Tungumálskóði', +long_desc : 'Tengill á ítarlýsingu', +style : 'Stíll', +classes : 'Klassi', +ltr : 'Vinstri til hægri', +rtl : 'Hægri til vinstri', +id : 'Id', +image_map : 'Myndarkort', +swap_image : 'Skipta mynd', +alt_image : 'Skiptimynd', +mouseover : 'þegar mús fer yfir', +mouseout : 'þegar mús fer frá', +misc : 'Ýmislegt', +example_img : 'Forskoðunarmynd', +missing_alt : 'Ertu viss um að þú viljir halda áfram án myndarlýsingar? Án hennar munu sumir notendur, eins og fatlaðir eða með gamla vafra ekki geta séð myndina.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/ko.js b/includes/tiny_mce/plugins/advimage/langs/ko.js new file mode 100644 index 0000000..5a270b0 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/ko.js @@ -0,0 +1,8 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +insert_image_alt2 : '±×ž² ÁŠžñ', +insert_image_onmousemove : 'ŽëÃŒ À̹ÌÁö', +insert_image_mouseover : 'ž¶¿ìœºžŠ ¿Ã·ÈÀ» ¶§', +insert_image_mouseout : 'ž¶¿ìœºžŠ ³»·ÈÀ» ¶§' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/nb.js b/includes/tiny_mce/plugins/advimage/langs/nb.js new file mode 100644 index 0000000..38b52eb --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/nb.js @@ -0,0 +1,27 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('advimage',{ +tab_general : 'Generelle innstillinger', +tab_appearance : 'Visuelle innstillinger', +tab_advanced : 'Avanserte innstillinger', +general : 'Generell', +title : 'Tittel', +preview : 'Forhåndsvisning', +constrain_proportions : 'Behold proporsjonene', +langdir : 'Skrift retning', +langcode : 'Språk kode', +long_desc : 'Lang beskrivelse', +style : 'Stil', +classes : 'CSS klasser', +ltr : 'Venstre mot høyre', +rtl : 'Høyre mot venstre', +id : 'Id', +image_map : 'Opprett bilde', +swap_image : 'Bytt bilde', +alt_image : 'Alternativt bilde', +mouseover : 'når pekeren er over', +mouseout : 'når pekeren er utenfor', +misc : 'Annet', +example_img : 'Forhåndsvisnings bilde', +missing_alt : 'Er du sikker på at du vil fortsette uten å sette inn en beskrivelse av bildet?' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/nl.js b/includes/tiny_mce/plugins/advimage/langs/nl.js new file mode 100644 index 0000000..66188c1 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/nl.js @@ -0,0 +1,27 @@ +// NL lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Algemeen', +tab_appearance : 'Beeld', +tab_advanced : 'Geavanceerd', +general : 'Algemeen', +title : 'Titel', +preview : 'Voorbeeld', +constrain_proportions : 'Verhoudingen behouden', +langdir : 'Taalrichting', +langcode : 'Taalcode', +long_desc : 'Link naar lange omschrijving', +style : 'Stijl', +classes : 'Stijlen', +ltr : 'Links naar rechts', +rtl : 'Rechts naar links', +id : 'Id', +image_map : 'Afbeelding opdelen', +swap_image : 'Afbeelding wisselen', +alt_image : 'Alternatieve afbeelding', +mouseover : 'voor muis-over', +mouseout : 'voor muis-uit', +misc : 'Diversen', +example_img : 'Voorbeeld afbeelding', +missing_alt : 'Zonder een beschrijving van de afbeelding, zal de pagina voor mensen met een visuele handicap of met afbeeldingen uitgeschakeld niet toegankelijk zijn. Weet u zeker dat u wilt doorgaan zonder beschrijving?' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/nn.js b/includes/tiny_mce/plugins/advimage/langs/nn.js new file mode 100644 index 0000000..56cabe7 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/nn.js @@ -0,0 +1,27 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('advimage',{ +tab_general : 'Generelle innstillinger', +tab_appearance : 'Visuelle innstillinger', +tab_advanced : 'Avanserte innstillinger', +general : 'Generell', +title : 'Tittel', +preview : 'Forhåndsvisning', +constrain_proportions : 'Behold proporsjonene', +langdir : 'Skrift retning', +langcode : 'Språk kode', +long_desc : 'Lang beskrivelse', +style : 'Stil', +classes : 'CSS klasser', +ltr : 'Venstre mot høgre', +rtl : 'Høgre mot venstre', +id : 'Id', +image_map : 'Opprett bilde', +swap_image : 'Bytt bilde', +alt_image : 'Alternativt bilde', +mouseover : 'når pekeren er over', +mouseout : 'når pekeren er utenfor', +misc : 'Annet', +example_img : 'Forhåndsvisningsbilde', +missing_alt : 'Er du sikker på at du vil fortsette uten å sette inn ein beskrivelse av bildet?' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/pl.js b/includes/tiny_mce/plugins/advimage/langs/pl.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/advimage/langs/pt_br.js b/includes/tiny_mce/plugins/advimage/langs/pt_br.js new file mode 100644 index 0000000..02bae1a --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/pt_br.js @@ -0,0 +1,35 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('advimage',{ +tab_general : 'Geral', +tab_appearance : 'Aparência', +tab_advanced : 'Avançado', +general : 'Geral', +title : 'Título', +preview : 'Visualizar (Preview)', +constrain_proportions : 'Bloquear proporções', +langdir : 'Direção da linguagem', +langcode : 'Código da linguagem', +long_desc : 'Descrição completa do link', +style : 'Estilo', +classes : 'Classes', +ltr : 'Esquerda para direita', +rtl : 'Direita para esquerda', +id : 'Id', +image_map : 'Mapa da imagem', +swap_image : 'Trocar imagem', +alt_image : 'Imagem alternativa', +mouseover : 'para o mouse sobre o link', +mouseout : 'para o mouse fora do link', +misc : 'Miscelânia', +example_img : 'Aparência Visualizar Imagem', +missing_alt : 'Tem certeza que deseja continuar sem incluir uma descrição para imagem? Sem isso a imagem pode não estar acessível para alguns usuários especiáis, ou para aqueles que utilizam um navegador em modo texto, ou para navegadores com imagens desativadas.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/ru.js b/includes/tiny_mce/plugins/advimage/langs/ru.js new file mode 100644 index 0000000..516004c --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/ru.js @@ -0,0 +1,26 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Îñíîâíûå', +tab_appearance : 'Âèçóàëèçàöèÿ', +tab_advanced : 'Ðàñøèðåííûå', +general : 'Ãëàâíûå', +title : 'Çàãîëîâîê', +preview : 'Ïðåäâàðèòåëüíûé ïðîñìîòð', +constrain_proportions : 'Ñîõðàíèòü ïðîïîðöèè', +langdir : 'Îïèñàíèå ÿçûêà', +langcode : 'Êîä ÿçûêà', +long_desc : 'Ïîëíîå îïèñàíèå', +style : 'Ñòèëè', +classes : 'Êëàññû', +ltr : 'Ñëåâà íàïðàâî', +rtl : 'Ñïðàâà íàëåâî', +id : 'Id', +image_map : 'Êàðòà èçîáðàæåíèÿ', +swap_image : 'Ïîäìåíà êàðòèíêè', +alt_image : 'Àëüòåðíàòèâíîå èçîáðàæåíèå', +mouseover : 'ïðè íàâåäåíèè ìûøè', +mouseout : 'êîãäà óâîäèòå ìûøü', +misc : 'Ïðî÷åå', +example_img : 'Âèçóàëèçàöèÿ ðàñïîëîæåíèÿ êàðòèíêè' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js new file mode 100644 index 0000000..97804c5 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/ru_KOI8-R.js @@ -0,0 +1,26 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'ïÓÎÏ×ÎÙÅ', +tab_appearance : '÷ÉÚÕÁÌÉÚÁÃÉÑ', +tab_advanced : 'òÁÓÛÉÒÅÎÎÙÅ', +general : 'çÌÁ×ÎÙÅ', +title : 'úÁÇÏÌÏ×ÏË', +preview : 'ðÒÅÄ×ÁÒÉÔÅÌØÎÙÊ ÐÒÏÓÍÏÔÒ', +constrain_proportions : 'óÏÈÒÁÎÉÔØ ÐÒÏÐÏÒÃÉÉ', +langdir : 'ïÐÉÓÁÎÉÅ ÑÚÙËÁ', +langcode : 'ëÏÄ ÑÚÙËÁ', +long_desc : 'ðÏÌÎÏÅ ÏÐÉÓÁÎÉÅ', +style : 'óÔÉÌÉ', +classes : 'ëÌÁÓÓÙ', +ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï', +rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï', +id : 'Id', +image_map : 'ëÁÒÔÁ ÉÚÏÂÒÁÖÅÎÉÑ', +swap_image : 'ðÏÄÍÅÎÁ ËÁÒÔÉÎËÉ', +alt_image : 'áÌØÔÅÒÎÁÔÉ×ÎÏÅ ÉÚÏÂÒÁÖÅÎÉÅ', +mouseover : 'ÐÒÉ ÎÁ×ÅÄÅÎÉÉ ÍÙÛÉ', +mouseout : 'ËÏÇÄÁ Õ×ÏÄÉÔÅ ÍÙÛØ', +misc : 'ðÒÏÞÅÅ', +example_img : '÷ÉÚÕÁÌÉÚÁÃÉÑ ÒÁÓÐÏÌÏÖÅÎÉÑ ËÁÒÔÉÎËÉ' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/advimage/langs/ru_UTF-8.js new file mode 100644 index 0000000..7504a45 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/ru_UTF-8.js @@ -0,0 +1,26 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'ОсМПвМые', +tab_appearance : 'ВОзуалОзацОя', +tab_advanced : 'РасшОреММые', +general : 'ГлавМые', +title : 'ЗагПлПвПк', +preview : 'ПреЎварОтельМый прПсЌПтр', +constrain_proportions : 'СПхраМОть прПпПрцОО', +langdir : 'ОпОсаМОе языка', +langcode : 'КПЎ языка', +long_desc : 'ППлМПе ПпОсаМОе', +style : 'СтОлО', +classes : 'Классы', +ltr : 'Слева МаправП', +rtl : 'Справа МалевП', +id : 'Id', +image_map : 'Карта ОзПбражеМОя', +swap_image : 'ППЎЌеМа картОМкО', +alt_image : 'АльтерМатОвМПе ОзПбражеМОе', +mouseover : 'прО МавеЎеМОО ЌышО', +mouseout : 'кПгЎа увПЎОте Ќышь', +misc : 'ПрПчее', +example_img : 'ВОзуалОзацОя Ñ€Ð°ÑÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÑ ÐºÐ°Ñ€Ñ‚ОМкО' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/sk.js b/includes/tiny_mce/plugins/advimage/langs/sk.js new file mode 100644 index 0000000..ecb77df --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/sk.js @@ -0,0 +1,16 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + + +tinyMCE.addToLang('',{ +insert_image_alt2 : 'Názov obrázku', +insert_image_onmousemove : 'Alternatívny obrázok', +insert_image_mouseover : 'pri najet? myÅ¡ou', +insert_image_mouseout : 'pri odjet? myÅ¡ou' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/sv.js b/includes/tiny_mce/plugins/advimage/langs/sv.js new file mode 100644 index 0000000..b0a2128 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/sv.js @@ -0,0 +1,27 @@ +// SE lang variables + +tinyMCE.addToLang('advimage',{ +tab_general : 'Generella inställningar', +tab_appearance : 'Visuella inställningar', +tab_advanced : 'Avancerade inställningar', +general : 'Generella', +title : 'Titel', +preview : 'Förhandsgranskning', +constrain_proportions : 'Behåll proportionerna', +langdir : 'Skrift riktning', +langcode : 'Språk kåd', +long_desc : 'Long beskrivning', +style : 'Stil', +classes : 'CSS Classer', +ltr : 'Vänster till höger', +rtl : 'Höger till vänster', +id : 'Id', +image_map : 'Bild karta', +swap_image : 'Byt bild', +alt_image : 'Alternativ bild', +mouseover : 'när pekaren är över', +mouseout : 'när pekaren är utanför', +misc : 'Övrigt', +example_img : 'Förhandsgransknings bild', +missing_alt : 'Är du säker på att du vill fortsätta utan att skriva en bild beskrivning. Utan en alternativ beskrivning är bilden inte handikapanpassad.' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/zh_cn.js b/includes/tiny_mce/plugins/advimage/langs/zh_cn.js new file mode 100644 index 0000000..462e4d0 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/zh_cn.js @@ -0,0 +1,27 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('advimage',{ +tab_general : 'Ò»°ã', +tab_appearance : 'ÏÔÊŸ', +tab_advanced : 'žßŒ¶', +general : 'Ò»°ã', +title : '±êÌâ', +preview : 'Ô€ÀÀ', +constrain_proportions : 'ÔŒÊøÊôÐÔ', +langdir : 'ÊéÐŽ·œÏò', +langcode : 'ÓïÑÔ±àÂë', +long_desc : '³€ÃèÊöÁŽœÓ', +style : '·çžñ', +classes : 'Àà', +ltr : 'ŽÓ×óÖÁÓÒ', +rtl : 'ŽÓÓÒÖÁ×ó', +id : '±íʶ', +image_map : '͌Ƭ¶ÔÓŠ', +swap_image : 'µ÷»»ÍŒÆ¬', +alt_image : 'ºòѡ͌Ƭ', +mouseover : 'Êó±êÔÚÉÏÃæÊ±', +mouseout : 'Êó±êÀ뿪ʱ', +misc : 'ÔÓÏî', +example_img : 'Appearance preview image', +missing_alt : 'ÄúÈ·ÈÏÒªÔÚûÓÐ͌Ƭ˵Ã÷µÄÇé¿öÏÂŒÌÐøÂ𣿠ÕâÑùÆäËû¹Ø±Õ͌Ƭä¯ÀÀµÄÓû§œ«ÎÞ·š×¢ÒⵜÄãÔÚÕâÀïÓÐ͌Ƭ¡£' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/zh_tw.js b/includes/tiny_mce/plugins/advimage/langs/zh_tw.js new file mode 100644 index 0000000..0e12c81 --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/zh_tw.js @@ -0,0 +1,29 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('advimage',{ +tab_general : '€@¯ë', +tab_appearance : '¥~Æ[', +tab_advanced : '¶i¶¥', +general : '€@¯ë', +title : 'ŒÐÃD', +preview : '¹wÄý', +constrain_proportions : '€ñšÒ­­šî', +langdir : '»yš¥¥Îªk', +langcode : '»yœX', +long_desc : '§¹Ÿã»¡©ú³sµ²', +style : 'Š¡ŒË', +classes : '€ÀÃþ', +ltr : '¥Ñ¥ªŠÜ¥k', +rtl : '¥Ñ¥kŠÜ¥ª', +id : 'œsž¹', +image_map : '¹ÏÀɬM®g', +swap_image : '¹ÏÀɥ掫', +alt_image : 'ŽÀ¥N¹ÏÀÉ', +mouseover : '·í·Æ¹«²Ÿ€J', +mouseout : '·í·Æ¹«²Ÿ¥X', +misc : 'Âø¶µ', +example_img : '¥~Æ[ ¹wÄý ¹ÏÀÉ', +missing_alt : 'œT©w­nŠb€£§t¹ÏÀÉ»¡©úªºª¬ªp€UÄ~Äò°õŠæ¶Ü¡H\nšSг¹ÏÀÉ»¡©ú¥i¯à·|ŸÉ­PšºšÇ¹³¬O¥H¯Â€åŠrÂsÄýŸ¹©Î\nÃö³¬ÂsÄýŸ¹¹ÏÀÉÅã²{¥\¯àªº¥Î€áµLªk¶¶§QŪšúžê°T¡C' +}); diff --git a/includes/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js new file mode 100644 index 0000000..f043d6a --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/langs/zh_tw_utf8.js @@ -0,0 +1,29 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('advimage',{ +tab_general : '䞀般', +tab_appearance : '倖觀', +tab_advanced : '進階', +general : '䞀般', +title : '暙題', +preview : '預芜', +constrain_proportions : '比䟋限制', +langdir : '語蚀甚法', +langcode : '語碌', +long_desc : '完敎說明連結', +style : '匏暣', +classes : '分類', +ltr : '由巊至右', +rtl : '由右至巊', +id : '線號', +image_map : '圖檔映射', +swap_image : '圖檔亀換', +alt_image : '替代圖檔', +mouseover : '當滑錠移入', +mouseout : '當滑錠移出', +misc : '雜項', +example_img : '倖觀 é èŠœ åœ–檔', +missing_alt : '確定芁圚䞍含圖檔說明的狀況䞋繌續執行嗎\n沒有圖檔說明可胜會導臎那些像是以玔文字瀏芜噚或\n關閉瀏芜噚圖檔顯珟功胜的甚戶無法順利讀取資蚊。' +}); diff --git a/includes/tiny_mce/plugins/advimage/readme.txt b/includes/tiny_mce/plugins/advimage/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/advimage/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/advlink/css/advlink.css b/includes/tiny_mce/plugins/advlink/css/advlink.css new file mode 100644 index 0000000..246162d --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/css/advlink.css @@ -0,0 +1,35 @@ +/* CSS file for advimage plugin popup */ + +.mceLinkList, .mceAnchorList, #targetlist { + width: 280px; +} + +.mceActionPanel { + margin-top: 7px; +} + +.panel_wrapper div.current { + height: 320px; +} + +#classlist, #title, #href { + width: 280px; +} + +#popupurl, #popupname { + width: 200px; +} + +#popupwidth, #popupheight, #popupleft, #popuptop { + width: 30px; + vertical-align: middle; + text-align: center; +} + +#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey { + width: 200px; +} + +#events_panel input { + width: 200px; +} diff --git a/includes/tiny_mce/plugins/advlink/editor_plugin.js b/includes/tiny_mce/plugins/advlink/editor_plugin.js new file mode 100644 index 0000000..9e2047b --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('advlink','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_advlink_getInfo(){return{longname:'Advanced link',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_advlink_getControlHTML(control_name){switch(control_name){case "link":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvLink\');return false;';return '';}return "";}function TinyMCE_advlink_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceAdvLink":var anySelection=false;var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();if(tinyMCE.selectedElement)anySelection=(tinyMCE.selectedElement.nodeName.toLowerCase()=="img")||(selectedText&&selectedText.length>0);if(anySelection||(focusElm!=null&&focusElm.nodeName=="A")){var template=new Array();template['file']='../../plugins/advlink/link.htm';template['width']=480;template['height']=400;template['width']+=tinyMCE.getLang('lang_advlink_delta_width',0);template['height']+=tinyMCE.getLang('lang_advlink_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});}return true;}return false;}function TinyMCE_advlink_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonDisabled',true);if(node==null)return;if(any_selection)tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonNormal',false);do{if(node.nodeName=="A"&&tinyMCE.getAttrib(node,'href')!="")tinyMCE.switchClassSticky(editor_id+'_advlink','mceButtonSelected',false);}while((node=node.parentNode));return true;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advlink/editor_plugin_src.js b/includes/tiny_mce/plugins/advlink/editor_plugin_src.js new file mode 100644 index 0000000..7c3122c --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/editor_plugin_src.js @@ -0,0 +1,69 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('advlink', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,es,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_advlink_getInfo() { + return { + longname : 'Advanced link', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_advlink.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_advlink_getControlHTML(control_name) { + switch (control_name) { + case "link": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceAdvLink\');return false;'; + return ''; + } + + return ""; +} + +function TinyMCE_advlink_execCommand(editor_id, element, command, user_interface, value) { + switch (command) { + case "mceAdvLink": + var anySelection = false; + var inst = tinyMCE.getInstanceById(editor_id); + var focusElm = inst.getFocusElement(); + + if (tinyMCE.selectedElement) + anySelection = (tinyMCE.selectedElement.nodeName.toLowerCase() == "img") || (selectedText && selectedText.length > 0); + + if (anySelection || (focusElm != null && focusElm.nodeName == "A")) { + var template = new Array(); + + template['file'] = '../../plugins/advlink/link.htm'; + template['width'] = 480; + template['height'] = 400; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_advlink_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_advlink_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + } + + return true; + } + + return false; +} + +function TinyMCE_advlink_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonDisabled', true); + + if (node == null) + return; + + if (any_selection) + tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonNormal', false); + + do { + if (node.nodeName == "A" && tinyMCE.getAttrib(node, 'href') != "") + tinyMCE.switchClassSticky(editor_id + '_advlink', 'mceButtonSelected', false); + } while ((node = node.parentNode)); + + return true; +} diff --git a/includes/tiny_mce/plugins/advlink/jscripts/functions.js b/includes/tiny_mce/plugins/advlink/jscripts/functions.js new file mode 100644 index 0000000..e6b8f29 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/jscripts/functions.js @@ -0,0 +1,564 @@ +/* Functions for the advlink plugin popup */ + +var templates = { + "window.open" : "window.open('${url}','${target}','${options}')" +}; + +function preinit() { + // Initialize + tinyMCE.setWindowArg('mce_windowresize', false); + + // Import external list url javascript + var url = tinyMCE.getParam("external_link_list_url"); + if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); + } +} + +function changeClass() { + var formObj = document.forms[0]; + formObj.classes.value = getSelectValue(formObj, 'classlist'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var formObj = document.forms[0]; + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + var action = "insert"; + var html; + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink'); + document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink'); + document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href'); + document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href'); + document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target'); + + // Link list + html = getLinkListHTML('linklisthref','href'); + if (html == "") + document.getElementById("linklisthrefrow").style.display = 'none'; + else + document.getElementById("linklisthrefcontainer").innerHTML = html; + + // Resize some elements + if (isVisible('hrefbrowser')) + document.getElementById('href').style.width = '260px'; + + if (isVisible('popupurlbrowser')) + document.getElementById('popupurl').style.width = '180px'; + + elm = tinyMCE.getParentElement(elm, "a"); + if (elm != null && elm.nodeName == "A") + action = "update"; + + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + setPopupControlsDisabled(true); + + if (action == "update") { + var href = tinyMCE.getAttrib(elm, 'href'); + + href = convertURL(href, elm, true); + + // Use mce_href if found + var mceRealHref = tinyMCE.getAttrib(elm, 'mce_href'); + if (mceRealHref != "") { + href = mceRealHref; + + if (tinyMCE.getParam('convert_urls')) + href = convertURL(href, elm, true); + } + + var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick')); + + // Setup form data + setFormValue('href', href); + setFormValue('title', tinyMCE.getAttrib(elm, 'title')); + setFormValue('id', tinyMCE.getAttrib(elm, 'id')); + setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style")))); + setFormValue('rel', tinyMCE.getAttrib(elm, 'rel')); + setFormValue('rev', tinyMCE.getAttrib(elm, 'rev')); + setFormValue('charset', tinyMCE.getAttrib(elm, 'charset')); + setFormValue('hreflang', tinyMCE.getAttrib(elm, 'hreflang')); + setFormValue('dir', tinyMCE.getAttrib(elm, 'dir')); + setFormValue('lang', tinyMCE.getAttrib(elm, 'lang')); + setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); + setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); + setFormValue('type', tinyMCE.getAttrib(elm, 'type')); + setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus'))); + setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur'))); + setFormValue('onclick', onclick); + setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick'))); + setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown'))); + setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup'))); + setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover'))); + setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove'))); + setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout'))); + setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress'))); + setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown'))); + setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup'))); + setFormValue('target', tinyMCE.getAttrib(elm, 'target')); + setFormValue('classes', tinyMCE.getAttrib(elm, 'class')); + + // Parse onclick data + if (onclick != null && onclick.indexOf('window.open') != -1) + parseWindowOpen(onclick); + else + parseFunction(onclick); + + // Select by the values + selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir')); + selectByValue(formObj, 'rel', tinyMCE.getAttrib(elm, 'rel')); + selectByValue(formObj, 'rev', tinyMCE.getAttrib(elm, 'rev')); + selectByValue(formObj, 'linklisthref', href); + + if (href.charAt(0) == '#') + selectByValue(formObj, 'anchorlist', href); + + addClassesToList('classlist', 'advlink_styles'); + + selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'), true); + selectByValue(formObj, 'targetlist', tinyMCE.getAttrib(elm, 'target'), true); + } else + addClassesToList('classlist', 'advlink_styles'); + + window.focus(); +} + +function setFormValue(name, value) { + document.forms[0].elements[name].value = value; +} + +function convertURL(url, node, on_save) { + return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);"); +} + +function parseWindowOpen(onclick) { + var formObj = document.forms[0]; + + // Preprocess center code + if (onclick.indexOf('return false;') != -1) { + formObj.popupreturn.checked = true; + onclick = onclick.replace('return false;', ''); + } + + var onClickData = parseLink(onclick); + + if (onClickData != null) { + formObj.ispopup.checked = true; + setPopupControlsDisabled(false); + + var onClickWindowOptions = parseOptions(onClickData['options']); + var url = onClickData['url']; + + if (tinyMCE.getParam('convert_urls')) + url = convertURL(url, null, true); + + formObj.popupname.value = onClickData['target']; + formObj.popupurl.value = url; + formObj.popupwidth.value = getOption(onClickWindowOptions, 'width'); + formObj.popupheight.value = getOption(onClickWindowOptions, 'height'); + + formObj.popupleft.value = getOption(onClickWindowOptions, 'left'); + formObj.popuptop.value = getOption(onClickWindowOptions, 'top'); + + if (formObj.popupleft.value.indexOf('screen') != -1) + formObj.popupleft.value = "c"; + + if (formObj.popuptop.value.indexOf('screen') != -1) + formObj.popuptop.value = "c"; + + formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes"; + formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes"; + formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes"; + formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes"; + formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes"; + formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes"; + formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes"; + + buildOnClick(); + } +} + +function parseFunction(onclick) { + var formObj = document.forms[0]; + var onClickData = parseLink(onclick); + + // TODO: Add stuff here +} + +function getOption(opts, name) { + return typeof(opts[name]) == "undefined" ? "" : opts[name]; +} + +function setPopupControlsDisabled(state) { + var formObj = document.forms[0]; + + formObj.popupname.disabled = state; + formObj.popupurl.disabled = state; + formObj.popupwidth.disabled = state; + formObj.popupheight.disabled = state; + formObj.popupleft.disabled = state; + formObj.popuptop.disabled = state; + formObj.popuplocation.disabled = state; + formObj.popupscrollbars.disabled = state; + formObj.popupmenubar.disabled = state; + formObj.popupresizable.disabled = state; + formObj.popuptoolbar.disabled = state; + formObj.popupstatus.disabled = state; + formObj.popupreturn.disabled = state; + formObj.popupdependent.disabled = state; + + setBrowserDisabled('popupurlbrowser', state); +} + +function parseLink(link) { + link = link.replace(new RegExp(''', 'g'), "'"); + + var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1"); + + // Is function name a template function + var template = templates[fnName]; + if (template) { + // Build regexp + var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi")); + var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\("; + var replaceStr = ""; + for (var i=0; i'); + for (var i=0; i'; + html += ''; + + for (var i=0; i' + name + ''; + } + + html += ''; + + return html; +} + +function insertAction() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var elm = inst.getFocusElement(); + + elm = tinyMCE.getParentElement(elm, "a"); + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + // Create new anchor elements + if (elm == null) { + if (tinyMCE.isSafari) + tinyMCEPopup.execCommand("mceInsertContent", false, '' + inst.getSelectedHTML() + ''); + else + tinyMCEPopup.execCommand("createlink", false, "#mce_temp_url#"); + + var elementArray = tinyMCE.getElementsByAttributeValue(inst.getBody(), "a", "href", "#mce_temp_url#"); + for (var i=0; i' + tinyMCELinkList[i][0] + ''; + + html += ''; + + return html; + + // tinyMCE.debug('-- image list start --', html, '-- image list end --'); +} + +function getTargetListHTML(elm_id, target_form_element) { + var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';'); + var html = ''; + + html += ''; + + return html; +} + +// While loading +preinit(); diff --git a/includes/tiny_mce/plugins/advlink/langs/cs.js b/includes/tiny_mce/plugins/advlink/langs/cs.js new file mode 100644 index 0000000..8ddb7f1 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/cs.js @@ -0,0 +1,28 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_link_target_same : 'Otevřít ve stejném okně/rámu', +insert_link_target_parent : 'Otevřít v rodičovském okně/rámu', +insert_link_target_top : 'Otevřít v nejvyšším rámu (přepíše vÅ¡echny rámy)', +insert_link_target_blank : 'Otevřít v novém okně', +insert_link_target_named : 'Otevřít v okně', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'Popup URL', +insert_link_popup_name : 'Název okna', +insert_link_popup_return : 'VloÅŸit \'return false\'', +insert_link_popup_scrollbars : 'Ukázat posuvníky', +insert_link_popup_statusbar : 'Ukázat stavovÜ řádek', +insert_link_popup_toolbar : 'Ukázat ovládací liÅ¡tu', +insert_link_popup_menubar : 'Ukázat menu', +insert_link_popup_location : 'Ukázat liÅ¡tu umístění', +insert_link_popup_resizable : 'Proměnná velikost okna', +insert_link_popup_size : 'Velikost', +insert_link_popup_position : 'Umístění (X/Y)', +insert_link_popup_missingtarget : 'VloÅŸte název cíle nebo vyberte jinou volbu.' +}); + diff --git a/includes/tiny_mce/plugins/advlink/langs/cy.js b/includes/tiny_mce/plugins/advlink/langs/cy.js new file mode 100644 index 0000000..4a3c326 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/cy.js @@ -0,0 +1,46 @@ +// UK lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'Cyffredinol', +popup_tab : 'Ffenest Naid', +events_tab : 'Digwyddiadau', +advanced_tab : 'Uwch', +general_props : 'Priodoleddau cyffredinol', +popup_props : 'Priodoleddau ffenest naid', +event_props : 'Digwyddiadau', +advanced_props : 'Priodoleddau uwch', +popup_opts : 'Dewisiadau', +anchor_names : 'Angorau', +target_same : 'Agor yn y ffenest / ffrâm yma', +target_parent : 'Agor yn rhiant y ffenest / ffrâm', +target_top : 'Agor yn y ffrâm uchaf (disodli pob ffrâm)', +target_blank : 'Agor mewn ffenest newydd', +popup : 'Ffenest naid Javascript', +popup_url : 'URL ffenest naid', +popup_name : 'Enw ffenest', +popup_return : 'Mewnosod \'return false\'', +popup_scrollbars : 'Dangos bariau sgrolio', +popup_statusbar : 'Dangos bar statws', +popup_toolbar : 'Dangos bariau offer', +popup_menubar : 'Dangos bar dewislen', +popup_location : 'Dangos bar lleoliad', +popup_resizable : 'Caniatáu newid maint y ffenest', +popup_dependent : 'Dibynnol (Mozilla/Firefox yn unig)', +popup_size : 'Maint', +popup_position : 'Lleoliad (X/Y)', +id : 'Id', +style: 'Arddull', +classes : 'Dosbarthiadau', +target_name : 'Enw targed', +langdir : 'Cyfeiriad iaith', +target_langcode : 'Iaith y targed', +langcode : 'Côd iaith', +encoding : 'Amgodio testun y targed', +mime : 'Math MIME y targed', +rel : 'Perthynas tudalen i\'r targed', +rev : 'Perthynas targed i\'r dudalen', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Chwith i\'r dde', +rtl : 'Dde i\'r chwith' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/da.js b/includes/tiny_mce/plugins/advlink/langs/da.js new file mode 100644 index 0000000..aa8e71b --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/da.js @@ -0,0 +1,46 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('advlink',{ +general_tab : 'Generelt', +popup_tab : 'Pop up', +events_tab : 'Events', +advanced_tab : 'Avanceret', +general_props : 'Generelle egenskaber', +popup_props : 'Popup egenskaber', +event_props : 'Events', +advanced_props : 'Advancerede egenskaber', +popup_opts : 'Valgmuligheder', +anchor_names : 'Bogmærker', +target_same : 'Åbn i samme vindue / ramme', +target_parent : 'Åbn i overordnet vindue / ramme', +target_top : 'Åbn i topramme (erstatter alle rammer)', +target_blank : 'Åbn i nyt vindue', +popup : 'Javascript popup', +popup_url : 'Popup adresse', +popup_name : 'Winduets navn', +popup_return : 'Indsæt \'return false\'', +popup_scrollbars : 'Vis scrollbar', +popup_statusbar : 'Vis statuslinje', +popup_toolbar : 'Vis værktøjslinjer', +popup_menubar : 'Vis menulinje', +popup_location : 'Vis adresse', +popup_resizable : 'Gør vinduet skalerbart', +popup_dependent : 'Afhængigt (kun ved Mozilla/Firefox)', +popup_size : 'Størrelse', +popup_position : 'Placering (X/Y)', +id : 'Id', +style: 'Style', +classes : 'Klasser', +target_name : 'Target navn', +langdir : 'Sprogretning', +target_langcode : 'Target sprog', +langcode : 'Sprogkode', +encoding : 'Target karakterkode', +mime : 'Target MIME type', +rel : 'Relation mellem side og target', +rev : 'Relation mellem target og side', +tabindex : 'Tabindex', +accesskey : 'Adgangsnøgle', +ltr : 'Venstre til højre', +rtl : 'Højre til venstre' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/de.js b/includes/tiny_mce/plugins/advlink/langs/de.js new file mode 100644 index 0000000..dd34e5f --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/de.js @@ -0,0 +1,47 @@ +// DE lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'Allgemein', +popup_tab : 'Popup', +events_tab : 'JS-Events', +advanced_tab : 'Erweitert', +general_props : 'Allgemeine Eigenschaften', +popup_props : 'Popup-Eigenschaften', +event_props : 'Javascript-Events', +advanced_props : 'Erweiterte Eigenschaften', +popup_opts : 'Optionen', +anchor_names : 'Anker', +target_same : '_self - In diesem Fenster/Frame öffnen', +target_parent : '_parent - Im Eltern-Fenster/-Frame öffnen', +target_top : '_top - Im Fenster öffnen (ersetzt alle Frames)', +target_blank : '_blank - In neuem Fenster öffnen', +popup : 'Javascript-Popup', +popup_url : 'Popup-URL', +popup_name : 'Popup-Name', +popup_return : 'Mit \'return false\' einfügen', +popup_scrollbars : 'Scrollleisten anzeigen', +popup_statusbar : 'Statuszeilen anzeigen', +popup_toolbar : 'Werkzeugleisten anzeigen', +popup_menubar : 'Menüleiste anzeigen', +popup_location : 'Adresszeile anzeigen', +popup_resizable : 'Fenstergröße veränderbar', +popup_dependent : 'Abhängiges Fenster (Nur Mozilla/Firefox)', +popup_size : 'Größe', +popup_position : 'Position (X/Y)', +id : 'ID', +style: 'CSS-Stil', +classes : 'CSS-Klassen', +target_name : 'Zielname', +langdir : 'Sprachrichtung', +target_langcode : 'Zielsprache', +langcode : 'Sprach-Code', +encoding : 'Zeichenkodierung', +mime : 'MIME-Typ', +rel : 'Verhältnis Seite zu Ziel', +rev : 'Verhältnis Ziel zu Seite', +tabindex : 'Tabulator-Index', +accesskey : 'Tastaturkürzel', +ltr : 'Von links nach rechts', +rtl : 'Von rechts nach links', +delta_width : 10 +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/en.js b/includes/tiny_mce/plugins/advlink/langs/en.js new file mode 100644 index 0000000..933a2c7 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/en.js @@ -0,0 +1,46 @@ +// UK lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'General', +popup_tab : 'Popup', +events_tab : 'Events', +advanced_tab : 'Advanced', +general_props : 'General properties', +popup_props : 'Popup properties', +event_props : 'Events', +advanced_props : 'Advanced properties', +popup_opts : 'Options', +anchor_names : 'Anchors', +target_same : 'Open in this window / frame', +target_parent : 'Open in parent window / frame', +target_top : 'Open in top frame (replaces all frames)', +target_blank : 'Open in new window', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Window name', +popup_return : 'Insert \'return false\'', +popup_scrollbars : 'Show scrollbars', +popup_statusbar : 'Show status bar', +popup_toolbar : 'Show toolbars', +popup_menubar : 'Show menu bar', +popup_location : 'Show location bar', +popup_resizable : 'Make window resizable', +popup_dependent : 'Dependent (Mozilla/Firefox only)', +popup_size : 'Size', +popup_position : 'Position (X/Y)', +id : 'Id', +style: 'Style', +classes : 'Classes', +target_name : 'Target name', +langdir : 'Language direction', +target_langcode : 'Target language', +langcode : 'Language code', +encoding : 'Target character encoding', +mime : 'Target MIME type', +rel : 'Relationship page to target', +rev : 'Relationship target to page', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Left to right', +rtl : 'Right to left' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/es.js b/includes/tiny_mce/plugins/advlink/langs/es.js new file mode 100644 index 0000000..3b848e6 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/es.js @@ -0,0 +1,54 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('advlink',{ +general_tab : 'General', +popup_tab : 'Popup', +events_tab : 'Eventos', +advanced_tab : 'Avanzado', +general_props : 'Propiedades generales', +popup_props : 'Propiedades de la popup', +event_props : 'Eventos', +advanced_props : 'Propiedades avanzadas', +popup_opts : 'Opciones', +anchor_names : 'Anclas', +target_same : 'Abrir en esta ventana/frame', +target_parent : 'Abrir en la ventana/frame padre', +target_top : 'Abrir el frame superior (replaza todos los frames)', +target_blank : 'Abrir en una ventana nueva', +popup : 'Popup con JavaScript', +popup_url : 'Dirección de la popup', +popup_name : 'Nombre de la ventana', +popup_return : 'Insertar \'return false\'', +popup_scrollbars : 'Mostrar barras de scroll', +popup_statusbar : 'Mostrar barra de estado', +popup_toolbar : 'Mostrar barras de tarea', +popup_menubar : 'Mostrar barra de menu', +popup_location : 'Mostrar barra de direcciones', +popup_resizable : 'La ventana puede cambiar de tamaño', +popup_dependent : 'Dependiente (solo Mozilla/Firefox)', +popup_size : 'Tamaño', +popup_position : 'Posición (X/Y)', +id : 'Id', +style: 'Estilo', +classes : 'Clases', +target_name : 'Nombre del target', +langdir : 'Dirección del texto', +target_langcode : 'Idioma del target', +langcode : 'Código del idioma', +encoding : 'Codificación de los carácteres del target', +mime : 'Tipo MIME del target', +rel : 'Relación de la página con el target', +rev : 'Relación del target con la página', +tabindex : 'Indice para la tabulación', +accesskey : 'Tecla de acceso', +ltr : 'de izquierda a derecha', +rtl : 'de derecha a izquierda' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/fa.js b/includes/tiny_mce/plugins/advlink/langs/fa.js new file mode 100644 index 0000000..b2652a0 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/fa.js @@ -0,0 +1,27 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +insert_link_target_same : '?? ???? ???? / ???? ??? ??', +insert_link_target_parent : '?? ???? / ???? ???? ??? ??', +insert_link_target_top : '?? ???? ???? ??? ?? (??? ?????? ?????? ????? ?????)', +insert_link_target_blank : '?? ???? ???? ??? ??', +insert_link_target_named : '?? ????? ??? ??', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'URL ?????', +insert_link_popup_name : '??? ?????', +insert_link_popup_return : '?????? \'return false\'', +insert_link_popup_scrollbars : '????? scrollbars', +insert_link_popup_statusbar : '????? statusbar', +insert_link_popup_toolbar : '????? toolbars', +insert_link_popup_menubar : '????? menubar', +insert_link_popup_location : '????? locationbar', +insert_link_popup_resizable : '???? ????? ?????? ????', +insert_link_popup_size : '??????', +insert_link_popup_position : '?????? (X/Y)', +insert_link_popup_missingtarget : '???? ?? ??? ???? ???? ?????? ???? ?? ??? ??? ???? ????? ????? ?? ?????? ??????.' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/fr.js b/includes/tiny_mce/plugins/advlink/langs/fr.js new file mode 100644 index 0000000..2b11e3d --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/fr.js @@ -0,0 +1,22 @@ +// French lang variables by Laurent Dran + +tinyMCE.addToLang('',{ +insert_link_target_same : 'Ouvre dans la fenętre / Cadre(frame)', +insert_link_target_parent : 'Ouvre dans fenętre parente / Cadres(frame)', +insert_link_target_top : 'Ouvre dans le Top frame (remplace toutes les cadres(frames))', +insert_link_target_blank : 'Ouvre dans la fenętre', +insert_link_target_named : 'Ouvre dans la fenętre', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'URL de la Popup', +insert_link_popup_name : 'Nom de la fenętre', +insert_link_popup_return : 'Insert \'return false\'', +insert_link_popup_scrollbars : 'Montrer la barre de défilement ', +insert_link_popup_statusbar : 'Montrer la barre d\'état', +insert_link_popup_toolbar : 'Montrer la barre d\'outils', +insert_link_popup_menubar : 'Montrer la barre du menu', +insert_link_popup_location : 'Montre la barre d\'adresse', +insert_link_popup_resizable : 'Fabriquer une fenętre redimensionnable', +insert_link_popup_size : 'Taille', +insert_link_popup_position : 'Position (X/Y)', +insert_link_popup_missingtarget : 'Veuillez insérer un nom pour la cible ou choisissez une autre option.' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/fr_ca.js b/includes/tiny_mce/plugins/advlink/langs/fr_ca.js new file mode 100644 index 0000000..09715ea --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/fr_ca.js @@ -0,0 +1,22 @@ +// CA_FR lang variables + +tinyMCE.addToLang('',{ +insert_link_target_same : 'Ouvrir dans la même fenêtre', +insert_link_target_parent : 'Ouvrir dans la fenêtre parent', +insert_link_target_top : 'Ouvrir dans le cadre supérieur', +insert_link_target_blank : 'Ouvrir dans une nouvelle fenêtre', +insert_link_target_named : 'Ouvrir à la destination', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'URL du popup', +insert_link_popup_name : 'Nom de la fenêtre', +insert_link_popup_return : 'Insérer le script \'return false\'', +insert_link_popup_scrollbars : 'Barres de défilement', +insert_link_popup_statusbar : 'Barre de statut', +insert_link_popup_toolbar : 'Barres d\'outils', +insert_link_popup_menubar : 'Barre de menu', +insert_link_popup_location : 'Barre d\'adresse', +insert_link_popup_resizable : 'Fenêtre redimensionnable', +insert_link_popup_size : 'Dimensions', +insert_link_popup_position : 'Position (X/Y)', +insert_link_popup_missingtarget : 'S.v.p., entrer un nom de destination ou choisir une autre option.' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/he.js b/includes/tiny_mce/plugins/advlink/langs/he.js new file mode 100644 index 0000000..ddf2052 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/he.js @@ -0,0 +1,46 @@ +// UK lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'ëììé', +popup_tab : 'çìåï ÷åôõ', +events_tab : 'àøåòéí', +advanced_tab : 'îú÷ãí', +general_props : 'îàôééðéí ëììééí', +popup_props : 'îàôééðé äçìåï ä÷åôõ', +event_props : 'àøåòéí', +advanced_props : 'îàôééðéí îú÷ãîéí', +popup_opts : 'àôùøåéåú', +anchor_names : 'òåâðéí', +target_same : 'ôúç áçìåï æä àå îñâøú æå', +target_parent : 'ôúç áçìåï àå áîñâøú äî÷åøééí', +target_top : 'ôúç áîñâøú äøàùéú (îçìéó àú ëì äîñâøåú)', +target_blank : 'ôúç áçìåï çãù', +popup : 'çìåï ÷åôõ ùì Javascript', +popup_url : 'ëúåáú äçìåï ä÷åôõ', +popup_name : 'ùí äçìåï', +popup_return : 'äëðñ \'return false\'', +popup_scrollbars : 'äöâ ôñé âìéìä', +popup_statusbar : 'äöâ ùåøú îöá', +popup_toolbar : 'äöâ ñøâìé ëìåí', +popup_menubar : 'äöâ àú ùåøú äúôøéèéí', +popup_location : 'äöâ àú ùåøú äëúåáú', +popup_resizable : 'çìåï ùðéúï ìùðåú àú âåãìå', +popup_dependent : 'úìåé (Mozilla/Firefox áìáã)', +popup_size : 'âåãì', +popup_position : 'îé÷åí (X/Y)', +id : 'Id', +style: 'ñâðåï', +classes : 'Classéí', +target_name : 'ùí éòã', +langdir : 'ëéååï ùôä', +target_langcode : 'ùôú éòã', +langcode : '÷åã ùôä', +encoding : '÷éãåã úååéí ùì äéòã', +mime : 'ñåâ MIME ùì äéòã', +rel : 'éçñ ùì ãó ìéòã', +rev : 'éçñ ùì éòã ìãó', +tabindex : 'ñãø èàáéí', +accesskey : 'î÷ù âéùä', +ltr : 'ùîàì ìéîéï', +rtl : 'éîéï ìùîàì' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advlink/langs/hu.js b/includes/tiny_mce/plugins/advlink/langs/hu.js new file mode 100644 index 0000000..d774b3d --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/hu.js @@ -0,0 +1,46 @@ +// HU lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'Általános', +popup_tab : 'Popup', +events_tab : 'Események', +advanced_tab : 'Haladó', +general_props : 'Általános beállítások', +popup_props : 'Popup beállítások', +event_props : 'Események', +advanced_props : 'Haladó beállítások', +popup_opts : 'Opciók', +anchor_names : 'Horgonyok', +target_same : 'Megnyitás ebben az ablakban / keretben', +target_parent : 'Megnyitás a szülõ ablakban / keretben', +target_top : 'Megnyitás felsõ keretben (minden keretet lecserél)', +target_blank : 'Megnyitás új ablakban', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Ablak név', +popup_return : '\'return false\' beszúrása', +popup_scrollbars : 'Görgetõsávok megjelenítése', +popup_statusbar : 'Állapotsor megjelenítése', +popup_toolbar : 'Eszköztárak megjelenítése', +popup_menubar : 'Menüsor megjelenítése', +popup_location : 'Címsáv megjelenítése', +popup_resizable : 'Ablak átméretezhetõvé tétele', +popup_dependent : 'Függõ (csak Mozilla/Firefox)', +popup_size : 'Méret', +popup_position : 'Pozíció (X/Y)', +id : 'Azonosító', +style: 'Stílus', +classes : 'Osztályok', +target_name : 'Cél neve', +langdir : 'Szöveg pozíció', +target_langcode : 'Cél szöveg', +langcode : 'Szöveg kód', +encoding : 'Cél karakter kódolás', +mime : 'Cél MIME típus', +rel : 'Oldal kapcsolata a céllal', +rev : 'Cél kapcsolat az oldallal', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Balról jobbra', +rtl : 'Jobbról balra' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/is.js b/includes/tiny_mce/plugins/advlink/langs/is.js new file mode 100644 index 0000000..bc66375 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/is.js @@ -0,0 +1,46 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('advlink',{ +general_tab : 'Almennt', +popup_tab : 'Sprettigluggi', +events_tab : 'Atburðir', +advanced_tab : 'Sérstillingar', +general_props : 'Almennar stillingar', +popup_props : 'Stillingar sprettiglugga', +event_props : 'Atburðir', +advanced_props : 'Sérstillingar', +popup_opts : 'Valkostir', +anchor_names : 'Akkeri', +target_same : 'Opna í þessum glugga / ramma', +target_parent : 'Opna í glugga / ramma foreldris', +target_top : 'Opna í efsta ramma (kemur í stað allra ramma)', +target_blank : 'Opna í nýjum glugga', +popup : 'Javascript sprettigluggi', +popup_url : 'Slóð sprettiglugga', +popup_name : 'Nafn glugga', +popup_return : 'Setja \'return false\'', +popup_scrollbars : 'Sýna skrunslár', +popup_statusbar : 'Sýna stöðustiku', +popup_toolbar : 'Sýna tólastiku', +popup_menubar : 'Sýna valstiku', +popup_location : 'Sýna slóðarstiku', +popup_resizable : 'Leyfa glugga að breyta stærð', +popup_dependent : 'Háður (eingöngu Mozilla/Firefox)', +popup_size : 'Stærð', +popup_position : 'Staðsetning (X/Y)', +id : 'Id', +style: 'Stíll', +classes : 'Klassi', +target_name : 'Nafn tengils', +langdir : 'Ritháttur tungumáls', +target_langcode : 'Tungumá tengils', +langcode : 'Tungumálskenni', +encoding : 'Textakóðun tengils', +mime : 'MIME-tegund tengils', +rel : 'Tengsl síðu til tengils', +rev : 'Tengsl tengils til síðu', +tabindex : 'Röðun', +accesskey : 'Flýtilykill', +ltr : 'Vinstri til hægri', +rtl : 'Hægri til vinstri' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/ko.js b/includes/tiny_mce/plugins/advlink/langs/ko.js new file mode 100644 index 0000000..bc4bfee --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/ko.js @@ -0,0 +1,21 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +insert_link_target_same : '°°Àº â¿¡Œ­ žµÅ©/ÇÁ·¹ÀÓ ¿­±â', +insert_link_target_parent : 'ºÎžð â¿¡Œ­ žµÅ©/ÇÁ·¹ÀÓ ¿­±â', +insert_link_target_top : 'TOP ÇÁ·¹ÀÓ¿¡Œ­ ¿­±â (žðµç ÇÁ·¹ÀÓÀ» ŽëÃŒ)', +insert_link_target_blank : '»õ â¿¡Œ­ ¿­±â', +insert_link_target_named : '»õ â¿¡Œ­ ¿­±â', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'ÆËŸ÷ URL', +insert_link_popup_name : 'â ÀÌž§', +insert_link_popup_return : '\'return false\' ³Ö±â', +insert_link_popup_scrollbars : 'œºÅ©·Ñ¹ÙžŠ ºž¿©ÁÜ', +insert_link_popup_statusbar : '»óÅÂâÀ» ºž¿©ÁÜ', +insert_link_popup_toolbar : 'Åø¹ÙžŠ ºž¿©ÁÜ', +insert_link_popup_menubar : 'žÞŽº¹ÙžŠ ºž¿©ÁÜ', +insert_link_popup_location : 'À§Ä¡ Ç¥œÃÁÙÀ» ºž¿©ÁÜ', +insert_link_popup_resizable : 'Å©±â Á¶Àý °¡ŽÉÇÑ À©µµ¿ì »ýŒº', +insert_link_popup_size : 'Å©±â', +insert_link_popup_position : 'À§Ä¡ (X/Y)' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/nb.js b/includes/tiny_mce/plugins/advlink/langs/nb.js new file mode 100644 index 0000000..3b15e12 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/nb.js @@ -0,0 +1,46 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('advlink',{ +general_tab : 'Generelle innstillinger', +popup_tab : 'Popup', +events_tab : 'Hendelser', +advanced_tab : 'Avanserte innstillinger', +general_props : 'Generelle innstillinger', +popup_props : 'Popup innstillinger', +event_props : 'Hendelser', +advanced_props : 'Generelle innstillinger', +popup_opts : 'Innstillinger', +anchor_names : 'Bokmerke', +target_same : 'Åpne i samme vindu / ramme', +target_parent : 'Åpne i underliggende vindu / ramme', +target_top : 'Åpne i topprammen (erstatter alle rammer)', +target_blank : 'Åpne i et nytt vindu', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Vindu navn', +popup_return : 'Sett inn \'return false\'', +popup_scrollbars : 'Vis scrollbars', +popup_statusbar : 'Vis status bar', +popup_toolbar : 'Vis toolbars', +popup_menubar : 'Vis meny bar', +popup_location : 'Vis location bar', +popup_resizable : 'Gjør vinduet skalerbart', +popup_dependent : 'Avhengig vindu (Bare i Mozilla/Firefox)', +popup_size : 'St&oring;rrelse', +popup_position : 'Posisjon (X/Y)', +id : 'Id', +style: 'Stil', +classes : 'CSS klasser', +target_name : 'Mål navn', +langdir : 'Skrift retning', +target_langcode : 'Mål språk', +langcode : 'Språk kode', +encoding : 'Tegn konvertering', +mime : 'Målets MIME type', +rel : 'Relasjon side til mål', +rev : 'Relasjon mål til side', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Venstre mot høyre', +rtl : 'Høyre mot venstre' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/nl.js b/includes/tiny_mce/plugins/advlink/langs/nl.js new file mode 100644 index 0000000..3b7fd94 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/nl.js @@ -0,0 +1,46 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +general_tab : 'Algemeen', +popup_tab : 'Popup', +events_tab : 'Gebeurtenissen', +advanced_tab : 'Geavanceerd', +general_props : 'Algemene eigenschappen', +popup_props : 'Popup eigenschappen', +event_props : 'Gebeurtenissen', +advanced_props : 'Geavanceerde eigenschappen', +popup_opts : 'Opties', +anchor_names : 'Bladwijzers', +target_same : 'Openen in dit venster/frame', +target_parent : 'Openen in hgerliggend frame', +target_top : 'Openen in bovenste frame (vervangt alle frames)', +target_blank : 'Openen in nieuw venster', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Vensternaam', +popup_return : 'Voeg \'return false\' toe', +popup_scrollbars : 'Toon scrollbalken', +popup_statusbar : 'Toon statusbalk', +popup_toolbar : 'Toon werkbalk', +popup_menubar : 'Toon menubalk', +popup_location : 'Toon adresbalk', +popup_resizable : 'Maak venster schaalbaar', +popup_dependent : 'Afhankelijk (Mozilla/Firefox only)', +popup_size : 'Afmetingen', +popup_position : 'Positie (x/y)', +id : 'Id', +style: 'Stijl', +classes : 'Stijlen', +target_name : 'Naam doelframe', +langdir : 'Taalrichting', +target_langcode : 'Taal van doel', +langcode : 'Taalcode', +encoding : 'Doel character encoding', +mime : 'Doel MIME type', +rel : 'Relatie van pagina tot doel', +rev : 'Relatie van doel tot pagina', +tabindex : 'Tabindex', +accesskey : 'Toegangstoets', +ltr : 'Links naar rechts', +rtl : 'Rechts naar links' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/nn.js b/includes/tiny_mce/plugins/advlink/langs/nn.js new file mode 100644 index 0000000..895f875 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/nn.js @@ -0,0 +1,46 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('advlink',{ +general_tab : 'Generelle innstillinger', +popup_tab : 'Popup', +events_tab : 'Hendelser', +advanced_tab : 'Avanserte innstillinger', +general_props : 'Generelle innstillinger', +popup_props : 'Popup innstillinger', +event_props : 'Hendelser', +advanced_props : 'Generelle innstillinger', +popup_opts : 'Innstillinger', +anchor_names : 'Bokmerke', +target_same : 'Åpne i samme vindauge / ramme', +target_parent : 'Åpne i underliggende vindauge / ramme', +target_top : 'Åpne i topprammen (erstatter alle rammer)', +target_blank : 'Åpne i eit nytt vindauge', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Vindauge navn', +popup_return : 'Sett inn \'return false\'', +popup_scrollbars : 'Vis scrollbars', +popup_statusbar : 'Vis status bar', +popup_toolbar : 'Vis toolbars', +popup_menubar : 'Vis meny bar', +popup_location : 'Vis location bar', +popup_resizable : 'Gjer vindauget skalerbart', +popup_dependent : 'Avhengig vindauge (Bare i Mozilla/Firefox)', +popup_size : 'Størrelse', +popup_position : 'Posisjon (X/Y)', +id : 'Id', +style: 'Stil', +classes : 'CSS klasser', +target_name : 'Mål navn', +langdir : 'Skrift retning', +target_langcode : 'Mål språk', +langcode : 'Språk kode', +encoding : 'Tekken konvertering', +mime : 'Målets MIME type', +rel : 'Relasjon side til mål', +rev : 'Relasjon mål til side', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Venstre mot høgre', +rtl : 'Høgre mot venstre' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/pl.js b/includes/tiny_mce/plugins/advlink/langs/pl.js new file mode 100644 index 0000000..d40eba2 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/pl.js @@ -0,0 +1,49 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('advlink',{ +general_tab : 'G³ówne ustawienia', +popup_tab : 'Okienko popup', +events_tab : 'Zdarzenia', +advanced_tab : 'Zaawansowane', +general_props : 'G³ówne', +popup_props : 'Ustawienia popup', +event_props : 'Zdarzenia', +advanced_props : 'Zaawansowane opcje', +popup_opts : 'Opcje', +anchor_names : 'Kotwice', +target_same : 'Otwórz w tym oknie / ramce', +target_parent : 'Otwórz w poprzednim oknie / ramce', +target_top : 'Otwórz w g³ównej ramce (zamienia wszystkie ramki)', +target_blank : 'Otwórz w nowym oknie', +popup : 'Okienko popup Javascript', +popup_url : 'URL dla popup', +popup_name : 'Nazwa okna', +popup_return : 'Wstaw \'return false\'', +popup_scrollbars : 'Poka¿ paski przewijania', +popup_statusbar : 'Poka¿ pasek statusu', +popup_toolbar : 'Poka¿ pasek narzêdzi', +popup_menubar : 'Poka¿ pasek menu', +popup_location : 'Poka¿ pasek adresu', +popup_resizable : 'Pozwalaj na zmianê wielko¶ci okna', +popup_dependent : 'Zale¿ne (tylko Mozilla/Firefox)', +popup_size : 'Rozmiar', +popup_position : 'Pozycja (X/Y)', +id : 'Id', +style: 'Styl', +classes : 'Klasa', +target_name : 'Nazwa celu', +langdir : 'Kierunek tekstu', +target_langcode : 'Jêzyk celu', +langcode : 'Kod jêzyka', +encoding : 'Kodowanie znaków celu', +mime : 'Typ MIME celu', +rel : 'Zale¿no¶æ strony do celu', +rev : 'Zale¿no¶æ celu do strony', +tabindex : 'Indeks tabeli', +accesskey : 'Klawisz dostêpu', +ltr : 'Lewy do prawego', +rtl : 'Prawy do lewego' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/pt_br.js b/includes/tiny_mce/plugins/advlink/langs/pt_br.js new file mode 100644 index 0000000..03f9aa5 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/pt_br.js @@ -0,0 +1,54 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('advlink',{ +general_tab : 'Geral', +popup_tab : 'Popup', +events_tab : 'Eventos', +advanced_tab : 'Avançado', +general_props : 'Propriedades Gerais', +popup_props : 'Propriedades do Popup', +event_props : 'Eventos', +advanced_props : 'Propriedades Avançadas', +popup_opts : 'Opções', +anchor_names : 'Âncoras', +target_same : 'Abrir nesta janela / frame', +target_parent : 'Abrir na janela / frame', +target_top : 'Abrir na janela superior (repondo todas as frames)', +target_blank : 'Abrir em uma nova janela', +popup : 'Javascript popup', +popup_url : 'Popup de uma URL', +popup_name : 'Nome da Janela', +popup_return : 'Inserir \'returna falso\'', +popup_scrollbars : 'Mostrar barra de rolagem', +popup_statusbar : 'Mostrar barra de status', +popup_toolbar : 'Mostrar barra de ferramentas', +popup_menubar : 'Mostrar barra do menu', +popup_location : 'Mostrar barra de endereço', +popup_resizable : 'Permite redimensionamento da janela', +popup_dependent : 'Dependente (Somente para Mozilla/Firefox)', +popup_size : 'Tamanho', +popup_position : 'Posição (X/Y)', +id : 'Id', +style: 'Estilo', +classes : 'Classes', +target_name : 'Nome do Destino', +langdir : 'Direção do texto', +target_langcode : 'Idioma do destino', +langcode : 'Código do idioma', +encoding : 'Tipo de codifição de carctere de destino', +mime : 'Tipo de MIME do destino', +rel : 'Relacionamento da página com o destino', +rev : 'Relacionamento do destino com a página', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Esquerda para direita', +rtl : 'Direita para esquerda' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/advlink/langs/ru.js b/includes/tiny_mce/plugins/advlink/langs/ru.js new file mode 100644 index 0000000..7c13c87 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/ru.js @@ -0,0 +1,47 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'Îñíîâíûå', +popup_tab : 'Âñïëûâàþùèå', +events_tab : 'Ñîáûòèÿ', +advanced_tab : 'Ðàñøèðåííûå', +general_props : 'Îñíîâíûå ñâîéñòâà', +popup_props : 'Ñâîéñòâà Popup ýëåìåíòîâ', +event_props : 'Ñîáûòèÿ', +advanced_props : 'Ðàñøèðåííûå íàñòðîéêè', +popup_opts : 'Îïöèè', +anchor_names : 'ßêîðÿ', +target_same : 'Îòêðûâàòü â ýòîì îêíå / ôðåéìå', +target_parent : 'Îòêðûâàòü â ðîäèòåëüñêîì îêíå / ôðåéìå', +target_top : 'Îòêðûâàòü â âåðõíåì ôðåéìå (çàìåíÿòü âñå ôðåéìû)', +target_blank : 'Îòêðûâàòü â íîâîì îêíå', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Èìÿ îêíà', +popup_return : 'Insert \'return false\'', +popup_scrollbars : 'Ïîêàçûâàòü ëèíåéêè ïðîêðóòêè', +popup_statusbar : 'Ïîêàçûâàòü status bar', +popup_toolbar : 'Ïîêàçûâàòü ïàíåëè èíñòðóìåíòîâ', +popup_menubar : 'Ïîêàçûâàòü ïàíåëü ìåíþ', +popup_location : 'Ïîêàçûâàòü location bar', +popup_resizable : 'Ïîçâîëèòü èçìåíÿòü ðàçìåðû îêíà', +popup_dependent : 'Çàâèñèìîñòü (òîëüêî Mozilla/Firefox)', +popup_size : 'Ðàçìåð', +popup_position : 'Ðàñïîëîæåíèå (X/Y)', +id : 'Id', +style: 'Ñòèëü', +classes : 'Êëàññû', +target_name : 'Èìÿ öåëè', +langdir : 'Íàïðàâëåíèå ïèñüìà â ÿçûêå', +target_langcode : 'Öåëåâîé ÿçûê', +langcode : 'Êîä ÿçûêà', +encoding : 'Öåëåâàÿ êîäèðîâêà', +mime : 'Öåëåâîé MIME òèï', +rel : 'Çàâèñèìîñòü page -> target', +rev : 'Çàâèñèìîñòü target -> page', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Ñëåâà íàïðàâî', +rtl : 'Ñïðàâà íàëåâî', +delta_width : 40 +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js new file mode 100644 index 0000000..d6a520a --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/ru_KOI8-R.js @@ -0,0 +1,46 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'ïÓÎÏ×ÎÙÅ', +popup_tab : '÷ÓÐÌÙ×ÁÀÝÉÅ', +events_tab : 'óÏÂÙÔÉÑ', +advanced_tab : 'òÁÓÛÉÒÅÎÎÙÅ', +general_props : 'ïÓÎÏ×ÎÙÅ Ó×ÏÊÓÔ×Á', +popup_props : 'ó×ÏÊÓÔ×Á Popup ÜÌÅÍÅÎÔÏ×', +event_props : 'óÏÂÙÔÉÑ', +advanced_props : 'òÁÓÛÉÒÅÎÎÙÅ ÎÁÓÔÒÏÊËÉ', +popup_opts : 'ïÐÃÉÉ', +anchor_names : 'ñËÏÒÑ', +target_same : 'ïÔËÒÙ×ÁÔØ × ÜÔÏÍ ÏËÎÅ / ÆÒÅÊÍÅ', +target_parent : 'ïÔËÒÙ×ÁÔØ × ÒÏÄÉÔÅÌØÓËÏÍ ÏËÎÅ / ÆÒÅÊÍÅ', +target_top : 'ïÔËÒÙ×ÁÔØ × ×ÅÒÈÎÅÍ ÆÒÅÊÍÅ (ÚÁÍÅÎÑÔØ ×ÓÅ ÆÒÅÊÍÙ)', +target_blank : 'ïÔËÒÙ×ÁÔØ × ÎÏ×ÏÍ ÏËÎÅ', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'éÍÑ ÏËÎÁ', +popup_return : 'Insert \'return false\'', +popup_scrollbars : 'ðÏËÁÚÙ×ÁÔØ ÌÉÎÅÊËÉ ÐÒÏËÒÕÔËÉ', +popup_statusbar : 'ðÏËÁÚÙ×ÁÔØ status bar', +popup_toolbar : 'ðÏËÁÚÙ×ÁÔØ ÐÁÎÅÌÉ ÉÎÓÔÒÕÍÅÎÔÏ×', +popup_menubar : 'ðÏËÁÚÙ×ÁÔØ ÐÁÎÅÌØ ÍÅÎÀ', +popup_location : 'ðÏËÁÚÙ×ÁÔØ location bar', +popup_resizable : 'ðÏÚ×ÏÌÉÔØ ÉÚÍÅÎÑÔØ ÒÁÚÍÅÒÙ ÏËÎÁ', +popup_dependent : 'úÁ×ÉÓÉÍÏÓÔØ (ÔÏÌØËÏ Mozilla/Firefox)', +popup_size : 'òÁÚÍÅÒ', +popup_position : 'òÁÓÐÏÌÏÖÅÎÉÅ (X/Y)', +id : 'Id', +style: 'óÔÉÌØ', +classes : 'ëÌÁÓÓÙ', +target_name : 'éÍÑ ÃÅÌÉ', +langdir : 'îÁÐÒÁ×ÌÅÎÉÅ ÐÉÓØÍÁ × ÑÚÙËÅ', +target_langcode : 'ãÅÌÅ×ÏÊ ÑÚÙË', +langcode : 'ëÏÄ ÑÚÙËÁ', +encoding : 'ãÅÌÅ×ÁÑ ËÏÄÉÒÏ×ËÁ', +mime : 'ãÅÌÅ×ÏÊ MIME ÔÉÐ', +rel : 'úÁ×ÉÓÉÍÏÓÔØ page -> target', +rev : 'úÁ×ÉÓÉÍÏÓÔØ target -> page', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï', +rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/advlink/langs/ru_UTF-8.js new file mode 100644 index 0000000..d64a7f3 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/ru_UTF-8.js @@ -0,0 +1,46 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'ОсМПвМые', +popup_tab : 'ВсплывающОе', +events_tab : 'СПбытОя', +advanced_tab : 'РасшОреММые', +general_props : 'ОсМПвМые свПйства', +popup_props : 'СвПйства Popup элеЌеМтПв', +event_props : 'СПбытОя', +advanced_props : 'РасшОреММые МастрПйкО', +popup_opts : 'ОпцОО', +anchor_names : 'ЯкПря', +target_same : 'Открывать в этПЌ ПкМе / фрейЌе', +target_parent : 'Открывать в рПЎОтельскПЌ ПкМе / фрейЌе', +target_top : 'Открывать в верхМеЌ фрейЌе (заЌеМять все фрейЌы)', +target_blank : 'Открывать в МПвПЌ ПкМе', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'ИЌя ПкМа', +popup_return : 'Insert \'return false\'', +popup_scrollbars : 'ППказывать лОМейкО прПкруткО', +popup_statusbar : 'ППказывать status bar', +popup_toolbar : 'ППказывать паМелО ОМструЌеМтПв', +popup_menubar : 'ППказывать паМель ЌеМю', +popup_location : 'ППказывать location bar', +popup_resizable : 'ППзвПлОть ОзЌеМять разЌеры ПкМа', +popup_dependent : 'ЗавОсОЌПсть (тПлькП Mozilla/Firefox)', +popup_size : 'РазЌер', +popup_position : 'РаспПлПжеМОе (X/Y)', +id : 'Id', +style: 'СтОль', +classes : 'Классы', +target_name : 'ИЌя целО', +langdir : 'НаправлеМОе пОсьЌа в языке', +target_langcode : 'ЊелевПй язык', +langcode : 'КПЎ языка', +encoding : 'Њелевая кПЎОрПвка', +mime : 'ЊелевПй MIME тОп', +rel : 'ЗавОсОЌПсть page -> target', +rev : 'ЗавОсОЌПсть target -> page', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Слева МаправП', +rtl : 'Справа МалевП' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/sk.js b/includes/tiny_mce/plugins/advlink/langs/sk.js new file mode 100644 index 0000000..fecba94 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/sk.js @@ -0,0 +1,30 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_link_target_same : 'Otvoríť v rovnakom okne/ráme', +insert_link_target_parent : 'Otvoríť v rodičovském okne/ráme', +insert_link_target_top : 'OtvoriÅ¥ v najvyššom ráme (prepíše vÅ¡etky rámy)', +insert_link_target_blank : 'Otvoríť v novom okne', +insert_link_target_named : 'Otvoríť v okne', +insert_link_popup : 'JS-Popup', +insert_link_popup_url : 'Popup URL', +insert_link_popup_name : 'Názov okna', +insert_link_popup_return : 'VloÅŸiÅ¥ \'return false\'', +insert_link_popup_scrollbars : 'UkázaÅ¥ posúvníky', +insert_link_popup_statusbar : 'UkázaÅ¥ stavovÜ riadok', +insert_link_popup_toolbar : 'UkázaÅ¥ ovládaciu liÅ¡tu', +insert_link_popup_menubar : 'UkázaÅ¥ menu', +insert_link_popup_location : 'UkázaÅ¥ liÅ¡tu umiestení', +insert_link_popup_resizable : 'Premenlivá veÄŸkosÅ¥ okna', +insert_link_popup_size : 'VelikosÅ¥', +insert_link_popup_position : 'Umiestnenie (X/Y)', +insert_link_popup_missingtarget : 'VloÅŸte názov cieÄŸa alebo vyberte inú voÄŸbu.' +}); + diff --git a/includes/tiny_mce/plugins/advlink/langs/sv.js b/includes/tiny_mce/plugins/advlink/langs/sv.js new file mode 100644 index 0000000..71a351e --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/sv.js @@ -0,0 +1,46 @@ +// UK lang variables + +tinyMCE.addToLang('advlink',{ +general_tab : 'Generella inställningar', +popup_tab : 'Popup', +events_tab : 'Händelser', +advanced_tab : 'Avancerade inställningar', +general_props : 'Generella inställningar', +popup_props : 'Popup inställningar', +event_props : 'Händelser', +advanced_props : 'Generella inställningar', +popup_opts : 'Inställningar', +anchor_names : 'Bokmärken', +target_same : 'Öppna i samma fönster / ram', +target_parent : 'Öppna i underliggande fönster / ram', +target_top : 'Öppna i toppramen (ersätter alla ramar)', +target_blank : 'Öppna i ett nytt fönster', +popup : 'Javascript popup', +popup_url : 'Popup URL', +popup_name : 'Fönster namn', +popup_return : 'Sättin \'return false\'', +popup_scrollbars : 'Visa scrollbars', +popup_statusbar : 'Visa status bar', +popup_toolbar : 'Visa toolbars', +popup_menubar : 'Visa menu bar', +popup_location : 'Visa location bar', +popup_resizable : 'Gör fönstret skalbart', +popup_dependent : 'Beroende fönster (Ändast i Mozilla/Firefox)', +popup_size : 'Storek', +popup_position : 'Position (X/Y)', +id : 'Id', +style: 'Stil', +classes : 'CSS Classer', +target_name : 'Mål namn', +langdir : 'Skrift riktning', +target_langcode : 'Mål språk', +langcode : 'Språk kåd', +encoding : 'Tecken konvertering', +mime : 'Målets MIME typ', +rel : 'Relation sida till mål', +rev : 'Relation mål till sida', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'Vänster till höger', +rtl : 'Höger till vänster' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/zh_cn.js b/includes/tiny_mce/plugins/advlink/langs/zh_cn.js new file mode 100644 index 0000000..e05ad13 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/zh_cn.js @@ -0,0 +1,46 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('advlink',{ +general_tab : 'Ò»°ã', +popup_tab : 'µ¯³ö', +events_tab : 'ÊÂŒþ', +advanced_tab : 'žßŒ¶', +general_props : 'Ò»°ãÊôÐÔ', +popup_props : 'µ¯³öÊôÐÔ', +event_props : 'ÊÂŒþÊôÐÔ', +advanced_props : 'žßŒŒÊôÐÔ', +popup_opts : 'Ñ¡Ïî', +anchor_names : 'êµã', +target_same : 'ÔÚµ±Ç°Ž°¿Ú/¿òŒÜÖÐŽò¿ª', +target_parent : 'ÔÚžžŽ°¿Ú/¿òŒÜÖÐŽò¿ª', +target_top : 'ÔÚ¶¥¶Ëް¿Ú/¿òŒÜÖÐŽò¿ª', +target_blank : 'ÔÚÐÂŽ°¿ÚÖÐŽò¿ª', +popup : 'Javascript µ¯³ö', +popup_url : 'µ¯³öµØÖ·', +popup_name : 'µ¯³öް¿ÚÃû', +popup_return : '²åÈë \'return false\'', +popup_scrollbars : 'ÏÔÊŸ¹ö¶¯Ìõ', +popup_statusbar : 'ÏÔʟ׎̬Ìõ', +popup_toolbar : 'ÏÔÊŸ¹€ŸßÌõ', +popup_menubar : 'ÏÔÊŸ²Ëµ¥Ìõ', +popup_location : 'ÏÔÊŸµØÖ·Ìõ', +popup_resizable : 'ް¿ÚŽóС¿É±ä', +popup_dependent : 'Dependent (œöÏÞÓÚ Mozilla/Firefox)', +popup_size : 'ŽóС', +popup_position : 'λÖà (X/Y)', +id : '±êʶ', +style: 'ÑùÊœ', +classes : 'Àà', +target_name : 'Ä¿±êÃû³Æ', +langdir : 'ÊéÐŽ·œÏò', +target_langcode : 'Ä¿±êÓïÑÔ', +langcode : 'ÓïÑÔ±àÂë', +encoding : 'Ä¿±êÎÄ×Ö±àÂë', +mime : 'Ä¿±ê MIME ÖÖÀà', +rel : 'Ò³ÓëÄ¿±êµÄ¹ØÏµ', +rev : 'Ä¿±êÓëÒ³µÄ¹ØÏµ', +tabindex : 'Tabindex', +accesskey : 'Accesskey', +ltr : 'ŽÓ×óµœÓÒ', +rtl : 'ŽÓÓÒµœ×ó' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/zh_tw.js b/includes/tiny_mce/plugins/advlink/langs/zh_tw.js new file mode 100644 index 0000000..78f1b4c --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/zh_tw.js @@ -0,0 +1,47 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('advlink',{ +general_tab : '€@¯ë', +popup_tab : 'žõ²{µøµ¡', +events_tab : 'šÆ¥ó', +advanced_tab : '¶i¶¥', +general_props : '€@¯ëÄÝ©Ê', +popup_props : 'žõ²{µøµ¡ÄÝ©Ê', +event_props : 'šÆ¥óÄÝ©Ê', +advanced_props : '¶i¶¥ÄÝ©Ê', +popup_opts : '¿ï¶µ', +anchor_names : '³sµ²ÂI', +target_same : '©óйµøµ¡©Î®Ø¬[€€¶}±Ò', +target_parent : '©ó€WŒhµøµ¡©Î®Ø¬[€€¶}±Ò', +target_top : '©ó¥D®Ø¬[€€¶}±Ò¡]·|šú¥N¥þ³¡®Ø¬[¡^', +target_blank : '©ó·sµøµ¡€€¶}±Ò', +popup : 'Javascript žõ²{µøµ¡', +popup_url : 'žõ²{µøµ¡ºô§}', +popup_name : 'µøµ¡ŠWºÙ', +popup_return : 'Ž¡€J "žTŠ^€W­¶"', +popup_scrollbars : 'Åã¥Ü²Ÿ°Ê¶b', +popup_statusbar : 'Åã¥Üª¬ºAŠC', +popup_toolbar : 'Åã¥Ü€ušãŠC', +popup_menubar : 'Åã¥Ü¿ï³æŠC', +popup_location : 'Åã¥ÜŠìžmŠC', +popup_resizable : '¥i€j€p€Æµøµ¡', +popup_dependent : '±qÄݩʡ]¶ÈŸA¥Î Mozilla / Firefox ¡^', +popup_size : '€j€p', +popup_position : 'Šìžm¡] X / Y ¶b¡^', +id : 'œsœX', +style: 'Š¡ŒË', +classes : '€ÀÃþ', +target_name : '¹ï¶HŠWºÙ', +langdir : '»yš¥¥Îªk', +target_langcode : '¹ï¶H»yš¥', +langcode : '»yœX', +encoding : '¹ï¶HŠr€žœsœX', +mime : '¹ï¶H MIME «¬Š¡', +rel : '±Nºô­¶»P¹ï¶H²£¥ÍÃöÁp', +rev : '±N¹ï¶H»Pºô­¶²£¥ÍÃöÁp', +tabindex : 'ŒÐÅÒ¯Á€Þ', +accesskey : 'ŠsšúÁä', +ltr : '¥Ñ¥ªŠÜ¥k', +rtl : '¥Ñ¥kŠÜ¥ª' +}); diff --git a/includes/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js new file mode 100644 index 0000000..6826170 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/langs/zh_tw_utf8.js @@ -0,0 +1,47 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('advlink',{ +general_tab : '䞀般', +popup_tab : '跳珟芖窗', +events_tab : '事件', +advanced_tab : '進階', +general_props : '䞀般屬性', +popup_props : '跳珟芖窗屬性', +event_props : '事件屬性', +advanced_props : '進階屬性', +popup_opts : '遾項', +anchor_names : '連結點', +target_same : '斌歀芖窗或框架䞭開啟', +target_parent : '斌䞊局芖窗或框架䞭開啟', +target_top : '斌䞻框架䞭開啟會取代党郚框架', +target_blank : '斌新芖窗䞭開啟', +popup : 'Javascript 跳珟芖窗', +popup_url : '跳珟芖窗網址', +popup_name : '芖窗名皱', +popup_return : '插入 "犁回䞊頁"', +popup_scrollbars : '顯瀺移動軞', +popup_statusbar : '顯瀺狀態列', +popup_toolbar : '顯瀺工具列', +popup_menubar : '顯瀺遞單列', +popup_location : '顯瀺䜍眮列', +popup_resizable : '可倧小化芖窗', +popup_dependent : '埞屬性僅適甚 Mozilla / Firefox ', +popup_size : '倧小', +popup_position : '䜍眮 X / Y 軞', +id : '線碌', +style: '匏暣', +classes : '分類', +target_name : '對象名皱', +langdir : '語蚀甚法', +target_langcode : '對象語蚀', +langcode : '語碌', +encoding : '對象字元線碌', +mime : '對象 MIME 型匏', +rel : '將網頁與對象產生關聯', +rev : '將對象與網頁產生關聯', +tabindex : '暙籀玢匕', +accesskey : '存取鍵', +ltr : '由巊至右', +rtl : '由右至巊' +}); diff --git a/includes/tiny_mce/plugins/advlink/link.htm b/includes/tiny_mce/plugins/advlink/link.htm new file mode 100644 index 0000000..0533902 --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/link.htm @@ -0,0 +1,334 @@ + + + {$lang_insert_link_title} + + + + + + + + +
+ + +
+
+
+ {$lang_advlink_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
 
 
 
 
+ +
+
+
+ + + +
+
+ {$lang_advlink_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+
+
+ +
+
+ {$lang_advlink_event_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/advlink/readme.txt b/includes/tiny_mce/plugins/advlink/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/advlink/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/autosave/editor_plugin.js b/includes/tiny_mce/plugins/autosave/editor_plugin.js new file mode 100644 index 0000000..cc05008 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('autosave','en,sv,cs,he,nb,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl,pt_br');function TinyMCE_autosave_getInfo(){return{longname:'Auto save',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_autosave_beforeUnloadHandler(){var msg=tinyMCE.getLang("lang_autosave_unload_msg");var anyDirty=false;for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(inst.isDirty())return msg;}return;}window.onbeforeunload=TinyMCE_autosave_beforeUnloadHandler; \ No newline at end of file diff --git a/includes/tiny_mce/plugins/autosave/editor_plugin_src.js b/includes/tiny_mce/plugins/autosave/editor_plugin_src.js new file mode 100644 index 0000000..1a1e082 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/editor_plugin_src.js @@ -0,0 +1,30 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('autosave', 'en,sv,cs,he,nb,hu,de,da,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,pl,pt_br'); + +function TinyMCE_autosave_getInfo() { + return { + longname : 'Auto save', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_autosave.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_autosave_beforeUnloadHandler() { + var msg = tinyMCE.getLang("lang_autosave_unload_msg"); + + var anyDirty = false; + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + if (inst.isDirty()) + return msg; + } + + return; +} + +window.onbeforeunload = TinyMCE_autosave_beforeUnloadHandler; diff --git a/includes/tiny_mce/plugins/autosave/langs/cs.js b/includes/tiny_mce/plugins/autosave/langs/cs.js new file mode 100644 index 0000000..0968543 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/cs.js @@ -0,0 +1,11 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.1 2005/10/18 13:55:41 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Změny, které jste udělal(a) budou ztraceny, jestliÅŸe opustíte tuto stránku.' +}); + diff --git a/includes/tiny_mce/plugins/autosave/langs/cy.js b/includes/tiny_mce/plugins/autosave/langs/cy.js new file mode 100644 index 0000000..181dfe6 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/cy.js @@ -0,0 +1,5 @@ +// EN lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Byddi di\'n colli unrhyw newidiadau os wyt ti\'n gadael y dudalen hon.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/da.js b/includes/tiny_mce/plugins/autosave/langs/da.js new file mode 100644 index 0000000..80a3b81 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/da.js @@ -0,0 +1,5 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'De ændringer, du har lavet, vil gå tabt, hvis du lukker denne side.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/de.js b/includes/tiny_mce/plugins/autosave/langs/de.js new file mode 100644 index 0000000..3e45423 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/de.js @@ -0,0 +1,5 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Alle Veränderungen an dieser Seite werden verlorengehen, wenn Sie diese Seite jetzt verlassen.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/en.js b/includes/tiny_mce/plugins/autosave/langs/en.js new file mode 100644 index 0000000..a184933 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/en.js @@ -0,0 +1,5 @@ +// EN lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/es.js b/includes/tiny_mce/plugins/autosave/langs/es.js new file mode 100644 index 0000000..7524606 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/es.js @@ -0,0 +1,13 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Los cambios que hayas hecho pueden perderse si navegas fuera de esta página.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/fr.js b/includes/tiny_mce/plugins/autosave/langs/fr.js new file mode 100644 index 0000000..eafae80 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/fr.js @@ -0,0 +1,5 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Vos modifications seront perdues si vous quittez cette page.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/he.js b/includes/tiny_mce/plugins/autosave/langs/he.js new file mode 100644 index 0000000..cb77957 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/he.js @@ -0,0 +1,5 @@ +// HE lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'äùéðåééí ùáéöòú éàáãå àí úòæåá àú ãó æä.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/hu.js b/includes/tiny_mce/plugins/autosave/langs/hu.js new file mode 100644 index 0000000..4b178e9 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/hu.js @@ -0,0 +1,5 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'A módosítások el fognak veszni, ha elnavigálsz az oldalról.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/is.js b/includes/tiny_mce/plugins/autosave/langs/is.js new file mode 100644 index 0000000..4af6669 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/is.js @@ -0,0 +1,5 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Breytingarnar sem þú gerðir munu hverfa ef þú flakkar annað.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/nb.js b/includes/tiny_mce/plugins/autosave/langs/nb.js new file mode 100644 index 0000000..b2e276c --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/nb.js @@ -0,0 +1,6 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Forandringene du gjorde forsvinner om du velger å forlate denne siden.' +}); + diff --git a/includes/tiny_mce/plugins/autosave/langs/nl.js b/includes/tiny_mce/plugins/autosave/langs/nl.js new file mode 100644 index 0000000..305f9ff --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/nl.js @@ -0,0 +1,5 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'De gemaakte veranderingen zullen verloren gaan als u naar een andere pagina navigeert.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/nn.js b/includes/tiny_mce/plugins/autosave/langs/nn.js new file mode 100644 index 0000000..245806f --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/nn.js @@ -0,0 +1,6 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Forandringene du gjorde forsvinner om du velger å forlate denne siden.' +}); + diff --git a/includes/tiny_mce/plugins/autosave/langs/pl.js b/includes/tiny_mce/plugins/autosave/langs/pl.js new file mode 100644 index 0000000..82e3e75 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/pl.js @@ -0,0 +1,8 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Zmiany jakie wprowadzi³e¶ zostan± utracone, je¶li opu¶cisz teraz tê stronê.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/pt_br.js b/includes/tiny_mce/plugins/autosave/langs/pt_br.js new file mode 100644 index 0000000..a2f8264 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/pt_br.js @@ -0,0 +1,12 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +autosave_unload_msg : 'As modificações feitas serão perdidas caso você navegue fora desta página.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/ru.js b/includes/tiny_mce/plugins/autosave/langs/ru.js new file mode 100644 index 0000000..b1c98a7 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/ru.js @@ -0,0 +1,5 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Èçìåíåíèÿ íå áóäóò ïîòåðÿíû åñëè Âû óéäžòå ñ ýòîé ñòðàíèöû.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js new file mode 100644 index 0000000..b2aae9a --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/ru_KOI8-R.js @@ -0,0 +1,5 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'éÚÍÅÎÅÎÉÑ ÎÅ ÂÕÄÕÔ ÐÏÔÅÒÑÎÙ ÅÓÌÉ ÷Ù ÕÊÄ£ÔÅ Ó ÜÔÏÊ ÓÔÒÁÎÉÃÙ.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/autosave/langs/ru_UTF-8.js new file mode 100644 index 0000000..9578a14 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/ru_UTF-8.js @@ -0,0 +1,5 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'ИзЌеМеМОя Ме буЎут пПтеряМы еслО Вы уйЎёте с этПй страМОцы.' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/sk.js b/includes/tiny_mce/plugins/autosave/langs/sk.js new file mode 100644 index 0000000..b12904c --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/sk.js @@ -0,0 +1,13 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Zmeny, ktoré ste urobyl(a) budú stratené, ak opustíte túto stránku.' +}); + diff --git a/includes/tiny_mce/plugins/autosave/langs/sv.js b/includes/tiny_mce/plugins/autosave/langs/sv.js new file mode 100644 index 0000000..27b0693 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/sv.js @@ -0,0 +1,6 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Förändringarna du gjorde kommer att gå förlorade om du väljer att lämna denna sida.' +}); + diff --git a/includes/tiny_mce/plugins/autosave/langs/zh_cn.js b/includes/tiny_mce/plugins/autosave/langs/zh_cn.js new file mode 100644 index 0000000..3f3e0ad --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/zh_cn.js @@ -0,0 +1,5 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +autosave_unload_msg : 'Èç¹ûÄúÀ뿪±ŸÒ³£¬ÄúËù×÷µÄÐޞĜ«»áÏûʧ¡£' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/zh_tw.js b/includes/tiny_mce/plugins/autosave/langs/zh_tw.js new file mode 100644 index 0000000..ec2617b --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/zh_tw.js @@ -0,0 +1,6 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +autosave_unload_msg : '©Òг€w§@ªº§ïÅÜ·|Š]±zÂ÷¶}й­¶­±ŠÓŠÛ°Ê©ñ±ó€£ÀxŠs' +}); diff --git a/includes/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js new file mode 100644 index 0000000..2053126 --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/langs/zh_tw_utf8.js @@ -0,0 +1,6 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +autosave_unload_msg : '所有已䜜的改變會因悚離開歀頁面而自動攟棄䞍儲存' +}); diff --git a/includes/tiny_mce/plugins/autosave/readme.txt b/includes/tiny_mce/plugins/autosave/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/autosave/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/contextmenu/css/contextmenu.css b/includes/tiny_mce/plugins/contextmenu/css/contextmenu.css new file mode 100644 index 0000000..1466e0e --- /dev/null +++ b/includes/tiny_mce/plugins/contextmenu/css/contextmenu.css @@ -0,0 +1,60 @@ +.contextMenuIEPopup { + padding: 0px; + margin: 0px; + border: 0px; + overflow: hidden; +} + +.contextMenu { + position: absolute; + cursor: default; + z-index: 1000; + border: 1px solid #D4D0C8; + background-color: #FFFFFF; +} + +.contextMenuItem, .contextMenuItemOver { +} + +.contextMenuItemOver { + background-color: #B6BDD2; +} + +.contextMenuSeparator { + width: 100%; + background-color: #D4D0C8; + border: 0px; +} + +.contextMenuImage, .contextMenuItemDisabled { + border: 0px; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemOver .contextMenuIcon { + background-color: #B6BDD2; +} + +.contextMenuIcon { + background-color: #F0F0EE; +} + +.contextMenuItemDisabled img { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; +} + +.contextMenuText { + font-family: Tahoma, Verdana, Arial, Helvetica; + font-size: 11px; + margin-left: 5px; + margin-right: 10px; +} + +.contextMenuItemDisabled { + color: #AAAAAA; +} diff --git a/includes/tiny_mce/plugins/contextmenu/editor_plugin.js b/includes/tiny_mce/plugins/contextmenu/editor_plugin.js new file mode 100644 index 0000000..dc4567c --- /dev/null +++ b/includes/tiny_mce/plugins/contextmenu/editor_plugin.js @@ -0,0 +1 @@ +if(!tinyMCE.settings['contextmenu_skip_plugin_css'])tinyMCE.loadCSS(tinyMCE.baseURL+"/plugins/contextmenu/css/contextmenu.css");var TinyMCE_contextmenu_contextMenu=null;function TinyMCE_contextmenu_getInfo(){return{longname:'Context menus',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_contextmenu_initInstance(inst){if(tinyMCE.isMSIE5_0&&tinyMCE.isOpera)return;tinyMCE.addEvent(inst.getDoc(),"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(inst.getDoc(),"keydown",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"click",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keypress",TinyMCE_contextmenu_hideContextMenu);tinyMCE.addEvent(document,"keydown",TinyMCE_contextmenu_hideContextMenu);var contextMenu=new ContextMenu({commandhandler:"TinyMCE_contextmenu_commandHandler",spacer_image:tinyMCE.baseURL+"/plugins/contextmenu/images/spacer.gif"});TinyMCE_contextmenu_contextMenu=contextMenu;if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"contextmenu",function(e){TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?inst.contentWindow.event:e,inst);});}else tinyMCE.addEvent(inst.getDoc(),"contextmenu",TinyMCE_contextmenu_onContextMenu);}function TinyMCE_contextmenu_onContextMenu(e){var elm=tinyMCE.isMSIE?e.srcElement:e.target;var targetInst,body;if((body=tinyMCE.getParentElement(elm,"body"))!=null){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;if(body==inst.getBody()){targetInst=inst;break;}}return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE?targetInst.contentWindow.event:e,targetInst);}}function TinyMCE_contextmenu_showContextMenu(e,inst){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}var x,y,elm,contextMenu;var pos=tinyMCE.getAbsPosition(inst.iframeElement);x=tinyMCE.isMSIE?e.screenX:pos.absLeft+(e.pageX-inst.getBody().scrollLeft);y=tinyMCE.isMSIE?e.screenY:pos.absTop+(e.pageY-inst.getBody().scrollTop);elm=tinyMCE.isMSIE?e.srcElement:e.target;contextMenu=TinyMCE_contextmenu_contextMenu;contextMenu.inst=inst;window.setTimeout(function(){var theme=tinyMCE.getParam("theme");contextMenu.clearAll();var sel=inst.getSelectedText().length!=0||elm.nodeName=="IMG";contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_cut_desc","Cut","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_copy_desc","Copy","",!sel);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_paste_desc","Paste","",false);elm=tinyMCE.getParentElement(elm,"img,table,td");if(elm){switch(elm.nodeName){case "IMG":contextMenu.addSeparator();if(tinyMCE.getAttrib(elm,'class').indexOf('mceItemFlash')==0)contextMenu.addItem(tinyMCE.baseURL+"/plugins/flash/images/flash.gif","$lang_flash_props","mceFlash");else contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/image.gif","$lang_image_props_desc",typeof(TinyMCE_advimage_getControlHTML)!="undefined"?"mceAdvImage":"mceImage");break;case "TABLE":case "TD":if(typeof(TinyMCE_table_getControlHTML)!="undefined"){var colspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"colspan");var rowspan=(elm.nodeName=="TABLE")?"":getAttrib(elm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/cut.gif","$lang_table_cut_row_desc","mceTableCutRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/copy.gif","$lang_table_copy_row_desc","mceTableCopyRow");contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_before_desc","mceTablePasteRowBefore","",inst.tableRowClipboard==null);contextMenu.addItem(tinyMCE.baseURL+"/themes/"+theme+"/images/paste.gif","$lang_table_paste_row_after_desc","mceTablePasteRowAfter","",inst.tableRowClipboard==null);contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_props_desc","mceInsertTable");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_cell_props.gif","$lang_table_cell_desc","mceTableCellProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete.gif","$lang_table_del","mceTableDelete");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_row_props.gif","$lang_table_row_desc","mceTableRowProps");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_before.gif","$lang_table_row_before_desc","mceTableInsertRowBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_row_after.gif","$lang_table_row_after_desc","mceTableInsertRowAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_row.gif","$lang_table_delete_row_desc","mceTableDeleteRow");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_before.gif","$lang_table_col_before_desc","mceTableInsertColBefore");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_insert_col_after.gif","$lang_table_col_after_desc","mceTableInsertColAfter");contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_delete_col.gif","$lang_table_delete_col_desc","mceTableDeleteCol");contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_split_cells.gif","$lang_table_split_cells_desc","mceTableSplitCells","",(colspan=="1"&&rowspan=="1"));contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table_merge_cells.gif","$lang_table_merge_cells_desc","mceTableMergeCells","",false);}break;}}else{if(typeof(TinyMCE_table_getControlHTML)!="undefined"){contextMenu.addSeparator();contextMenu.addItem(tinyMCE.baseURL+"/plugins/table/images/table.gif","$lang_table_desc","mceInsertTable","insert");}}contextMenu.show(x,y);},10);tinyMCE.cancelEvent(e);return false;}function TinyMCE_contextmenu_hideContextMenu(){TinyMCE_contextmenu_contextMenu.hide();}function TinyMCE_contextmenu_commandHandler(command,value){TinyMCE_contextmenu_contextMenu.hide();var ui=false;if(command=="mceInsertTable"||command=="mceTableCellProps"||command=="mceTableRowProps"||command=="mceTableMergeCells")ui=true;if(command=="Paste")value=null;TinyMCE_contextmenu_contextMenu.inst.execCommand(command,ui,value);}function ContextMenu(settings){function defParam(key,def_val){settings[key]=typeof(settings[key])!="undefined"?settings[key]:def_val;}var self=this;this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.contextMenuDiv=document.createElement("div");this.contextMenuDiv.className="contextMenu";this.contextMenuDiv.setAttribute("class","contextMenu");this.contextMenuDiv.style.display="none";this.contextMenuDiv.style.position='absolute';this.contextMenuDiv.style.zindex=1000;this.contextMenuDiv.style.left='0px';this.contextMenuDiv.style.top='0px';this.contextMenuDiv.unselectable="on";document.body.appendChild(this.contextMenuDiv);defParam("commandhandler","");defParam("spacer_image","images/spacer.gif");this.items=new Array();this.settings=settings;this.html="";if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){this.pop=window.createPopup();doc=this.pop.document;doc.open();doc.write('');doc.close();}};ContextMenu.prototype.clearAll=function(){this.html="";this.contextMenuDiv.innerHTML="";};ContextMenu.prototype.addSeparator=function(){this.html+='';};ContextMenu.prototype.addItem=function(icon,title,command,value,disabled){if(title.charAt(0)=='$')title=tinyMCE.getLang(title.substring(1));var onMouseDown='';var html='';if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0)onMouseDown='contextMenu.execCommand(\''+command+'\', \''+value+'\');return false;';else onMouseDown=this.settings['commandhandler']+'(\''+command+'\', \''+value+'\');return false;';if(icon=="")icon=this.settings['spacer_image'];if(!disabled)html+='';else html+='';html+='';html+='
';html+=title;html+='
';html+='';this.html+=html;};ContextMenu.prototype.show=function(x,y){if(this.html=="")return;var html='';html+='';html+=this.html;html+='
';this.contextMenuDiv.innerHTML=html;if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera){var width,height;this.contextMenuDiv.style.display="block";width=this.contextMenuDiv.offsetWidth;height=this.contextMenuDiv.offsetHeight;this.contextMenuDiv.style.display="none";this.pop.document.body.innerHTML='
'+html+"
";this.pop.document.tinyMCE=tinyMCE;this.pop.document.contextMenu=this;this.pop.show(x,y,width,height);}else{this.contextMenuDiv.style.left=x+'px';this.contextMenuDiv.style.top=y+'px';this.contextMenuDiv.style.display="block";}};ContextMenu.prototype.hide=function(){if(tinyMCE.isMSIE&&!tinyMCE.isMSIE5_0&&!tinyMCE.isOpera)this.pop.hide();else this.contextMenuDiv.style.display="none";};ContextMenu.prototype.execCommand=function(command,value){eval(this.settings['commandhandler']+"(command, value);");}; \ No newline at end of file diff --git a/includes/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/includes/tiny_mce/plugins/contextmenu/editor_plugin_src.js new file mode 100644 index 0000000..313dd27 --- /dev/null +++ b/includes/tiny_mce/plugins/contextmenu/editor_plugin_src.js @@ -0,0 +1,309 @@ +/* Import plugin specific language pack */ +//tinyMCE.importPluginLanguagePack('contextmenu', 'en,zh_cn,cs,fa,fr_ca,fr,de,nb'); +if (!tinyMCE.settings['contextmenu_skip_plugin_css']) + tinyMCE.loadCSS(tinyMCE.baseURL + "/plugins/contextmenu/css/contextmenu.css"); + +// Global contextmenu class instance +var TinyMCE_contextmenu_contextMenu = null; + +function TinyMCE_contextmenu_getInfo() { + return { + longname : 'Context menus', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_contextmenu.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_contextmenu_initInstance(inst) { + // Is not working on MSIE 5.0 or Opera no contextmenu event + if (tinyMCE.isMSIE5_0 && tinyMCE.isOpera) + return; + + // Add hide event handles + tinyMCE.addEvent(inst.getDoc(), "click", TinyMCE_contextmenu_hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keypress", TinyMCE_contextmenu_hideContextMenu); + tinyMCE.addEvent(inst.getDoc(), "keydown", TinyMCE_contextmenu_hideContextMenu); + tinyMCE.addEvent(document, "click", TinyMCE_contextmenu_hideContextMenu); + tinyMCE.addEvent(document, "keypress", TinyMCE_contextmenu_hideContextMenu); + tinyMCE.addEvent(document, "keydown", TinyMCE_contextmenu_hideContextMenu); + + var contextMenu = new ContextMenu({ + commandhandler : "TinyMCE_contextmenu_commandHandler", + spacer_image : tinyMCE.baseURL + "/plugins/contextmenu/images/spacer.gif" + }); + + // Register global reference + TinyMCE_contextmenu_contextMenu = contextMenu; + + // Attach contextmenu event + if (tinyMCE.isGecko) { + tinyMCE.addEvent(inst.getDoc(), "contextmenu", function(e) {TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? inst.contentWindow.event : e, inst);}); + } else + tinyMCE.addEvent(inst.getDoc(), "contextmenu", TinyMCE_contextmenu_onContextMenu); +} + +function TinyMCE_contextmenu_onContextMenu(e) { + var elm = tinyMCE.isMSIE ? e.srcElement : e.target; + var targetInst, body; + + // Find instance + if ((body = tinyMCE.getParentElement(elm, "body")) != null) { + for (var n in tinyMCE.instances) { + var inst = tinyMCE.instances[n]; + if (!tinyMCE.isInstance(inst)) + continue; + + if (body == inst.getBody()) { + targetInst = inst; + break; + } + } + + return TinyMCE_contextmenu_showContextMenu(tinyMCE.isMSIE ? targetInst.contentWindow.event : e, targetInst); + } +} + +function TinyMCE_contextmenu_showContextMenu(e, inst) { + function getAttrib(elm, name) { + return elm.getAttribute(name) ? elm.getAttribute(name) : ""; + } + + var x, y, elm, contextMenu; + var pos = tinyMCE.getAbsPosition(inst.iframeElement); + + x = tinyMCE.isMSIE ? e.screenX : pos.absLeft + (e.pageX - inst.getBody().scrollLeft); + y = tinyMCE.isMSIE ? e.screenY : pos.absTop + (e.pageY - inst.getBody().scrollTop); + elm = tinyMCE.isMSIE ? e.srcElement : e.target; + contextMenu = TinyMCE_contextmenu_contextMenu; + contextMenu.inst = inst; + + // Mozilla needs some time + window.setTimeout(function () { + var theme = tinyMCE.getParam("theme"); + + contextMenu.clearAll(); + var sel = inst.getSelectedText().length != 0 || elm.nodeName == "IMG"; + + // Default items + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_cut_desc", "Cut", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_copy_desc", "Copy", "", !sel); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_paste_desc", "Paste", "", false); + + // Get element + elm = tinyMCE.getParentElement(elm, "img,table,td"); + if (elm) { + switch (elm.nodeName) { + case "IMG": + contextMenu.addSeparator(); + + // If flash + if (tinyMCE.getAttrib(elm, 'class').indexOf('mceItemFlash') == 0) + contextMenu.addItem(tinyMCE.baseURL + "/plugins/flash/images/flash.gif", "$lang_flash_props", "mceFlash"); + else + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/image.gif", "$lang_image_props_desc", typeof(TinyMCE_advimage_getControlHTML) != "undefined" ? "mceAdvImage" : "mceImage"); + break; + + case "TABLE": + case "TD": + // Is table plugin loaded + if (typeof(TinyMCE_table_getControlHTML) != "undefined") { + var colspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "colspan"); + var rowspan = (elm.nodeName == "TABLE") ? "" : getAttrib(elm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/cut.gif", "$lang_table_cut_row_desc", "mceTableCutRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/copy.gif", "$lang_table_copy_row_desc", "mceTableCopyRow"); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_before_desc", "mceTablePasteRowBefore", "", inst.tableRowClipboard == null); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/paste.gif", "$lang_table_paste_row_after_desc", "mceTablePasteRowAfter", "", inst.tableRowClipboard == null); + +/* contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyleft.gif", "$lang_justifyleft_desc", "JustifyLeft", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifycenter.gif", "$lang_justifycenter_desc", "JustifyCenter", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyright.gif", "$lang_justifyright_desc", "JustifyRight", "", false); + contextMenu.addItem(tinyMCE.baseURL + "/themes/" + theme + "/images/justifyfull.gif", "$lang_justifyfull_desc", "JustifyFull", "", false);*/ + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_props_desc", "mceInsertTable"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_cell_props.gif", "$lang_table_cell_desc", "mceTableCellProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete.gif", "$lang_table_del", "mceTableDelete"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_row_props.gif", "$lang_table_row_desc", "mceTableRowProps"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_before.gif", "$lang_table_row_before_desc", "mceTableInsertRowBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_row_after.gif", "$lang_table_row_after_desc", "mceTableInsertRowAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_row.gif", "$lang_table_delete_row_desc", "mceTableDeleteRow"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_before.gif", "$lang_table_col_before_desc", "mceTableInsertColBefore"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_insert_col_after.gif", "$lang_table_col_after_desc", "mceTableInsertColAfter"); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_delete_col.gif", "$lang_table_delete_col_desc", "mceTableDeleteCol"); + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_split_cells.gif", "$lang_table_split_cells_desc", "mceTableSplitCells", "", (colspan == "1" && rowspan == "1")); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table_merge_cells.gif", "$lang_table_merge_cells_desc", "mceTableMergeCells", "", false); + } + break; + } + } else { + // Add table specific + if (typeof(TinyMCE_table_getControlHTML) != "undefined") { + contextMenu.addSeparator(); + contextMenu.addItem(tinyMCE.baseURL + "/plugins/table/images/table.gif", "$lang_table_desc", "mceInsertTable", "insert"); + } + } + + contextMenu.show(x, y); + }, 10); + + // Cancel default handeling + tinyMCE.cancelEvent(e); + return false; +} + +function TinyMCE_contextmenu_hideContextMenu() { + TinyMCE_contextmenu_contextMenu.hide(); +} + +function TinyMCE_contextmenu_commandHandler(command, value) { + TinyMCE_contextmenu_contextMenu.hide(); + + // UI must be true on these + var ui = false; + if (command == "mceInsertTable" || command == "mceTableCellProps" || command == "mceTableRowProps" || command == "mceTableMergeCells") + ui = true; + + if (command == "Paste") + value = null; + + TinyMCE_contextmenu_contextMenu.inst.execCommand(command, ui, value); +} + +// Context menu class + +function ContextMenu(settings) { + // Default value function + function defParam(key, def_val) { + settings[key] = typeof(settings[key]) != "undefined" ? settings[key] : def_val; + } + + var self = this; + + this.isMSIE = (navigator.appName == "Microsoft Internet Explorer"); + + // Setup contextmenu div + this.contextMenuDiv = document.createElement("div"); + this.contextMenuDiv.className = "contextMenu"; + this.contextMenuDiv.setAttribute("class", "contextMenu"); + this.contextMenuDiv.style.display = "none"; + this.contextMenuDiv.style.position = 'absolute'; + this.contextMenuDiv.style.zindex = 1000; + this.contextMenuDiv.style.left = '0px'; + this.contextMenuDiv.style.top = '0px'; + this.contextMenuDiv.unselectable = "on"; + + document.body.appendChild(this.contextMenuDiv); + + // Setup default values + defParam("commandhandler", ""); + defParam("spacer_image", "images/spacer.gif"); + + this.items = new Array(); + this.settings = settings; + this.html = ""; + + // IE Popup + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + this.pop = window.createPopup(); + doc = this.pop.document; + doc.open(); + doc.write(''); + doc.close(); + } +}; + +ContextMenu.prototype.clearAll = function() { + this.html = ""; + this.contextMenuDiv.innerHTML = ""; +}; + +ContextMenu.prototype.addSeparator = function() { + this.html += ''; +}; + +ContextMenu.prototype.addItem = function(icon, title, command, value, disabled) { + if (title.charAt(0) == '$') + title = tinyMCE.getLang(title.substring(1)); + + var onMouseDown = ''; + var html = ''; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0) + onMouseDown = 'contextMenu.execCommand(\'' + command + '\', \'' + value + '\');return false;'; + else + onMouseDown = this.settings['commandhandler'] + '(\'' + command + '\', \'' + value + '\');return false;'; + + if (icon == "") + icon = this.settings['spacer_image']; + + if (!disabled) + html += ''; + else + html += ''; + + html += ''; + html += '
'; + + // Add text + html += title; + + html += '
'; + html += ''; + + // Add to main + this.html += html; +}; + +ContextMenu.prototype.show = function(x, y) { + if (this.html == "") + return; + + var html = ''; + + html += ''; + html += this.html; + html += '
'; + + this.contextMenuDiv.innerHTML = html; + + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) { + var width, height; + + // Get dimensions + this.contextMenuDiv.style.display = "block"; + width = this.contextMenuDiv.offsetWidth; + height = this.contextMenuDiv.offsetHeight; + this.contextMenuDiv.style.display = "none"; + + // Setup popup and show + this.pop.document.body.innerHTML = '
' + html + "
"; + this.pop.document.tinyMCE = tinyMCE; + this.pop.document.contextMenu = this; + this.pop.show(x, y, width, height); + } else { + this.contextMenuDiv.style.left = x + 'px'; + this.contextMenuDiv.style.top = y + 'px'; + this.contextMenuDiv.style.display = "block"; + } +}; + +ContextMenu.prototype.hide = function() { + if (tinyMCE.isMSIE && !tinyMCE.isMSIE5_0 && !tinyMCE.isOpera) + this.pop.hide(); + else + this.contextMenuDiv.style.display = "none"; +}; + +ContextMenu.prototype.execCommand = function(command, value) { + eval(this.settings['commandhandler'] + "(command, value);"); +}; diff --git a/includes/tiny_mce/plugins/contextmenu/images/spacer.gif b/includes/tiny_mce/plugins/contextmenu/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/contextmenu/readme.txt b/includes/tiny_mce/plugins/contextmenu/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/contextmenu/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/directionality/editor_plugin.js b/includes/tiny_mce/plugins/directionality/editor_plugin.js new file mode 100644 index 0000000..78e1921 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('directionality','en,sv,fr_ca,zh_cn,cs,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_directionality_getInfo(){return{longname:'Directionality',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_directionality.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_directionality_getControlHTML(control_name){switch(control_name){case "ltr":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\');return false;';return '';case "rtl":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\');return false;';return '';}return "";}function TinyMCE_directionality_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceDirectionLTR":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","ltr");tinyMCE.triggerNodeChange(false);return true;case "mceDirectionRTL":var inst=tinyMCE.getInstanceById(editor_id);var elm=tinyMCE.getParentElement(inst.getFocusElement(),"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(elm)elm.setAttribute("dir","rtl");tinyMCE.triggerNodeChange(false);return true;}return false;}function TinyMCE_directionality_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){function getAttrib(elm,name){return elm.getAttribute(name)?elm.getAttribute(name):"";}tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonNormal',false);if(node==null)return;var elm=tinyMCE.getParentElement(node,"p,div,td,h1,h2,h3,h4,h5,h6,pre,address");if(!elm){tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonDisabled',true);return;}var dir=getAttrib(elm,"dir");if(dir=="ltr"||dir=="")tinyMCE.switchClassSticky(editor_id+'_ltr','mceButtonSelected',false);else tinyMCE.switchClassSticky(editor_id+'_rtl','mceButtonSelected',false);return true;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/directionality/editor_plugin_src.js b/includes/tiny_mce/plugins/directionality/editor_plugin_src.js new file mode 100644 index 0000000..2bbdbc0 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/editor_plugin_src.js @@ -0,0 +1,81 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('directionality', 'en,sv,fr_ca,zh_cn,cs,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br'); + +function TinyMCE_directionality_getInfo() { + return { + longname : 'Directionality', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_directionality.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_directionality_getControlHTML(control_name) { + switch (control_name) { + case "ltr": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionLTR\');return false;'; + return ''; + + case "rtl": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceDirectionRTL\');return false;'; + return ''; + } + + return ""; +} + +function TinyMCE_directionality_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceDirectionLTR": + var inst = tinyMCE.getInstanceById(editor_id); + var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); + + if (elm) + elm.setAttribute("dir", "ltr"); + + tinyMCE.triggerNodeChange(false); + return true; + + case "mceDirectionRTL": + var inst = tinyMCE.getInstanceById(editor_id); + var elm = tinyMCE.getParentElement(inst.getFocusElement(), "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); + + if (elm) + elm.setAttribute("dir", "rtl"); + + tinyMCE.triggerNodeChange(false); + return true; + } + + // Pass to next handler in chain + return false; +} + +function TinyMCE_directionality_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + function getAttrib(elm, name) { + return elm.getAttribute(name) ? elm.getAttribute(name) : ""; + } + + tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonNormal', false); + + if (node == null) + return; + + var elm = tinyMCE.getParentElement(node, "p,div,td,h1,h2,h3,h4,h5,h6,pre,address"); + if (!elm) { + tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonDisabled', true); + return; + } + + var dir = getAttrib(elm, "dir"); + if (dir == "ltr" || dir == "") + tinyMCE.switchClassSticky(editor_id + '_ltr', 'mceButtonSelected', false); + else + tinyMCE.switchClassSticky(editor_id + '_rtl', 'mceButtonSelected', false); + + return true; +} diff --git a/includes/tiny_mce/plugins/directionality/images/ltr.gif b/includes/tiny_mce/plugins/directionality/images/ltr.gif new file mode 100644 index 0000000000000000000000000000000000000000..ac8f30c1208e044ac5ed8f4f82c2e513c56c9f4b GIT binary patch literal 155 zcmV;M0A&A1Nk%w1VH5xq0K*0V6B83EOqQXfrM$epT3%aDeA>#+*g!o%lCtD@cz8l? zx@C{wCodDf2?TZ&Ww46PQZJ;6HbgF) J&uDZ606X)4Hvs?u literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/directionality/images/rtl.gif b/includes/tiny_mce/plugins/directionality/images/rtl.gif new file mode 100644 index 0000000000000000000000000000000000000000..0348f9965669dd9cfba3c69d71d20ea3928e46fe GIT binary patch literal 153 zcmV;K0A~M3Nk%w1VH5xq0K*Lc6&4jPQl5&6in_+zPfbr=jNa1D%1Uy=K0H3Nv#n}w zX?>#YH($5z?CQtO-2eapA^8LW000jFEC2ui02BZe000C=@X1N5y*TU5yU$K@847`% z$mA5FC73`GOG9yB3IYHR|EvoJCQ;(~3X4J@W03VE4#r`rF-`^yYR0P4Vz}3jcuX#v H%@F`Q*OWXP literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/directionality/langs/cs.js b/includes/tiny_mce/plugins/directionality/langs/cs.js new file mode 100644 index 0000000..db31af6 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/cs.js @@ -0,0 +1,12 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.1 2005/10/18 13:55:41 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Směr z leva doprava', +directionality_rtl_desc : 'Směr z prava doleva' +}); + diff --git a/includes/tiny_mce/plugins/directionality/langs/cy.js b/includes/tiny_mce/plugins/directionality/langs/cy.js new file mode 100644 index 0000000..56d152c --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/cy.js @@ -0,0 +1,6 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Cyfeiriad chwith i\'r dde', +directionality_rtl_desc : 'Cyfeiriad dde i\'r chwith' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/da.js b/includes/tiny_mce/plugins/directionality/langs/da.js new file mode 100644 index 0000000..7cb8300 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/da.js @@ -0,0 +1,6 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Retning - venstre mod højre', +directionality_rtl_desc : 'Retning - højre mod venstre' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/de.js b/includes/tiny_mce/plugins/directionality/langs/de.js new file mode 100644 index 0000000..b1b691a --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/de.js @@ -0,0 +1,6 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Von links nach rechts', +directionality_rtl_desc : 'Von rechts nach links' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/en.js b/includes/tiny_mce/plugins/directionality/langs/en.js new file mode 100644 index 0000000..1a1aa53 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/en.js @@ -0,0 +1,6 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Direction left to right', +directionality_rtl_desc : 'Direction right to left' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/es.js b/includes/tiny_mce/plugins/directionality/langs/es.js new file mode 100644 index 0000000..f4c7276 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/es.js @@ -0,0 +1,14 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Dirección de izquierda a derecha', +directionality_rtl_desc : 'Dirección de derecha a izquierda' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/fr.js b/includes/tiny_mce/plugins/directionality/langs/fr.js new file mode 100644 index 0000000..c0758d5 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/fr.js @@ -0,0 +1,6 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Vers la droite', +directionality_rtl_desc : 'Vers la gauche' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/fr_ca.js b/includes/tiny_mce/plugins/directionality/langs/fr_ca.js new file mode 100644 index 0000000..2cc0eac --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/fr_ca.js @@ -0,0 +1,6 @@ +// fr_ca lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Direction de la gauche vers la droite', +directionality_rtl_desc : 'Direction de la droite vers la gauche' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/he.js b/includes/tiny_mce/plugins/directionality/langs/he.js new file mode 100644 index 0000000..1e00ed4 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/he.js @@ -0,0 +1,6 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'ëéååï ùîàì ìéîéï', +directionality_rtl_desc : 'ëéååï éîéï ìùîàì' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/hu.js b/includes/tiny_mce/plugins/directionality/langs/hu.js new file mode 100644 index 0000000..1925ea1 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/hu.js @@ -0,0 +1,6 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Elhelyezkedés balról jobbra', +directionality_rtl_desc : 'Elhelyezkedés jobbról balra' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/is.js b/includes/tiny_mce/plugins/directionality/langs/is.js new file mode 100644 index 0000000..d4c5f28 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/is.js @@ -0,0 +1,6 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Frá vinstri til hægri', +directionality_rtl_desc : 'Frá hægri til vinstri' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/nb.js b/includes/tiny_mce/plugins/directionality/langs/nb.js new file mode 100644 index 0000000..0b74169 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/nb.js @@ -0,0 +1,6 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Retning fra venstre mot høyre', +directionality_rtl_desc : 'Retning fra høyre mot venstre' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/nl.js b/includes/tiny_mce/plugins/directionality/langs/nl.js new file mode 100644 index 0000000..eda4e1a --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/nl.js @@ -0,0 +1,6 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Richting links naar rechts', +directionality_rtl_desc : 'Richting rechts naar links' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/nn.js b/includes/tiny_mce/plugins/directionality/langs/nn.js new file mode 100644 index 0000000..3670834 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/nn.js @@ -0,0 +1,6 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Venstre mot høgre', +directionality_rtl_desc : 'Høgre mot venstre' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/pl.js b/includes/tiny_mce/plugins/directionality/langs/pl.js new file mode 100644 index 0000000..a60de3d --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/pl.js @@ -0,0 +1,8 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Kierunek od lewej do prawej', +directionality_rtl_desc : 'Kierunek od prawej do lewej' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/pt_br.js b/includes/tiny_mce/plugins/directionality/langs/pt_br.js new file mode 100644 index 0000000..f3f714d --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/pt_br.js @@ -0,0 +1,13 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Direcionamento da esquerda para direita', +directionality_rtl_desc : 'Direcionamento da direita para esquerda' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/ru.js b/includes/tiny_mce/plugins/directionality/langs/ru.js new file mode 100644 index 0000000..749b692 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/ru.js @@ -0,0 +1,6 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Íàïðàâëåíèå ñëåâà íàïðàâî', +directionality_rtl_desc : 'Íàïðàâëåíèå ñïðàâà íàëåâî' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js new file mode 100644 index 0000000..2057e2e --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/ru_KOI8-R.js @@ -0,0 +1,6 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'îÁÐÒÁ×ÌÅÎÉÅ ÓÌÅ×Á ÎÁÐÒÁ×Ï', +directionality_rtl_desc : 'îÁÐÒÁ×ÌÅÎÉÅ ÓÐÒÁ×Á ÎÁÌÅ×Ï' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/directionality/langs/ru_UTF-8.js new file mode 100644 index 0000000..3cbc24f --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/ru_UTF-8.js @@ -0,0 +1,6 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'НаправлеМОе слева МаправП', +directionality_rtl_desc : 'НаправлеМОе справа МалевП' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/sk.js b/includes/tiny_mce/plugins/directionality/langs/sk.js new file mode 100644 index 0000000..fb4cfb2 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/sk.js @@ -0,0 +1,14 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Smer z ÄŸava doprava', +directionality_rtl_desc : 'Smer z prava doÄŸava' +}); + diff --git a/includes/tiny_mce/plugins/directionality/langs/sv.js b/includes/tiny_mce/plugins/directionality/langs/sv.js new file mode 100644 index 0000000..e43fcf1 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/sv.js @@ -0,0 +1,6 @@ +// SV lang variables + +tinyMCE.addToLang('',{ +directionality_ltr_desc : 'Riktning från vänster till höger', +directionality_rtl_desc : 'Riktning från höger till vänster' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/zh_cn.js b/includes/tiny_mce/plugins/directionality/langs/zh_cn.js new file mode 100644 index 0000000..f083fb1 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/zh_cn.js @@ -0,0 +1,6 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +directionality_ltr_desc : '·œÏòŽÓ×óÍùÓÒ', +directionality_rtl_desc : '·œÏòŽÓÓÒÍù×ó' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/zh_tw.js b/includes/tiny_mce/plugins/directionality/langs/zh_tw.js new file mode 100644 index 0000000..57df12a --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/zh_tw.js @@ -0,0 +1,7 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +directionality_ltr_desc : '¥Ñ¥ª©¹¥k€èŠV', +directionality_rtl_desc : '¥Ñ¥k©¹¥ª€èŠV' +}); diff --git a/includes/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js new file mode 100644 index 0000000..1668d43 --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/langs/zh_tw_utf8.js @@ -0,0 +1,7 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +directionality_ltr_desc : '由巊埀右方向', +directionality_rtl_desc : '由右埀巊方向' +}); diff --git a/includes/tiny_mce/plugins/directionality/readme.txt b/includes/tiny_mce/plugins/directionality/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/directionality/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/emotions/editor_plugin.js b/includes/tiny_mce/plugins/emotions/editor_plugin.js new file mode 100644 index 0000000..68f2c42 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('emotions','en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_emotions_getInfo(){return{longname:'Emotions',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_emotions_getControlHTML(control_name){switch(control_name){case "emotions":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceEmotion\');return false;';return '';}return "";}function TinyMCE_emotions_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceEmotion":var template=new Array();template['file']='../../plugins/emotions/emotions.htm';template['width']=160;template['height']=160;template['width']+=tinyMCE.getLang('lang_emotions_delta_width',0);template['height']+=tinyMCE.getLang('lang_emotions_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/emotions/editor_plugin_src.js b/includes/tiny_mce/plugins/emotions/editor_plugin_src.js new file mode 100644 index 0000000..e9a879f --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/editor_plugin_src.js @@ -0,0 +1,51 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('emotions', 'en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_emotions_getInfo() { + return { + longname : 'Emotions', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_emotions.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +/** + * Returns the HTML contents of the emotions control. + */ +function TinyMCE_emotions_getControlHTML(control_name) { + switch (control_name) { + case "emotions": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceEmotion\');return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the mceEmotion command. + */ +function TinyMCE_emotions_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceEmotion": + var template = new Array(); + + template['file'] = '../../plugins/emotions/emotions.htm'; // Relative to theme + template['width'] = 160; + template['height'] = 160; + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_emotions_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_emotions_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + + return true; + } + + // Pass to next handler in chain + return false; +} diff --git a/includes/tiny_mce/plugins/emotions/emotions.htm b/includes/tiny_mce/plugins/emotions/emotions.htm new file mode 100644 index 0000000..c5d2f81 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/emotions.htm @@ -0,0 +1,40 @@ + + + {$lang_emotions_title} + + + + + +
+
{$lang_emotions_title}:

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang_emotions_cool}{$lang_emotions_cry}{$lang_emotions_embarassed}{$lang_emotions_foot_in_mouth}
{$lang_emotions_frown}{$lang_emotions_innocent}{$lang_emotions_kiss}{$lang_emotions_laughing}
{$lang_emotions_money_mouth}{$lang_emotions_sealed}{$lang_emotions_smile}{$lang_emotions_surprised}
{$lang_emotions_tongue-out}{$lang_emotions_undecided}{$lang_emotions_wink}{$lang_emotions_yell}
+
+ + diff --git a/includes/tiny_mce/plugins/emotions/images/emotions.gif b/includes/tiny_mce/plugins/emotions/images/emotions.gif new file mode 100644 index 0000000000000000000000000000000000000000..26adbe68aad9509fadb09f54e8d21928d036b508 GIT binary patch literal 357 zcmV-r0h<0tNk%w1VH5xq0MrlwCJF+^#>SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0ssI2A^8LW0018VEC2ui02BZe000Hz;3tk`X_io`rY8wSM&@~$5kc(- z5zB>062xUez?lve2Vyf}FeV#>qjEqQ5|YW~;@nOo34>7=S!5Xvg){w>EN&u*p|HVV z6bd`uzA1=B2N?(xb{!3chZqwG8C4$#W_B114-Xsz100$g3yzQyla`vJmmCwFfPxGI z9;BKc0}m68fO8BS0v!pO2^|6)41SIf6b>7e9RSJz9hDmn6h;sSSH}+y0s;=sVFzOn z78(f%p$`lg2niY%V}KS04h2w51r7!ljwlus1{w|y8Vpcimt&fR00;x%YnP*;h!6lf DobY}R literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/readme.txt b/includes/tiny_mce/plugins/emotions/images/readme.txt new file mode 100644 index 0000000..cc2cf3f --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/images/readme.txt @@ -0,0 +1,2 @@ +These emotions where taken from Mozilla Thunderbird. +I hope they don't get angry if I use them here after all this is a open source project aswell. diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-cool.gif b/includes/tiny_mce/plugins/emotions/images/smiley-cool.gif new file mode 100644 index 0000000000000000000000000000000000000000..ba90cc36fb0415d0273d1cd206bff63fd9c91fde GIT binary patch literal 354 zcmV-o0iFIwNk%w1VG;lm0Mr!#3ke00dJfFY%i+lrhK7V(RutUQJhPY;?(XfrsZKgL z7WLQ^zPO&zzav{)SL^9nBOw~z(=orMEH5uC-P_gr`uhCnASMa|$-iRw?m_(dUwU8) zq>Kx}s1_F$4FCWDA^8LW0018VEC2ui01^Na000Hw;3tYzX_jM3Qpv$_M?zI9i5=0S zX-{-uv=l3%&P0s%m9Ox_a(m_c|u z01g3U0`Wll5)poVdma=N8y<3f0Sf~hXmTC}2oxMW4FdxUj+z4<0}lrX2nP=qkDRIt z9Ge*(qzMrj3jrIOjvI{`5eWzt3`G_T8yChG8w(a19SkK12@M(+799Zr9n=~PzBCmA z5)BU-)YKUd4H5!D9|!^o9kWIe9SH(WDHRk92}DZ?3})2$P@$55g90f0N)ZA8JID5J Aw*UYD literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-cry.gif b/includes/tiny_mce/plugins/emotions/images/smiley-cry.gif new file mode 100644 index 0000000000000000000000000000000000000000..74d897a4f6d22e814e2b054e98b8a75fb464b4be GIT binary patch literal 329 zcmV-P0k-}}Nk%w1VG;lm0Mr-&E)xPSit@9T3%;vR+|V+?t0A(pllJjXrMl7n=_A_a za^B+Su$LjvyC3@TIQZNZa##w=!k(SO^P#bO*w(eU#;{U83XFCU_V)J5wrb+;g2vkN z#>U24qVoOvY5)KLA^8LW0018VEC2ui01^Na000HX;3tY$X_jM3QUfCh%s^o(nF++< zc?Th6v=oL>*by8K!mhvwelUXuuW&&U9iGO3hM@>Njw{l^#0q9mWpcefdI;O$;efnY zkd~@r-o$*74FCWI1%d((4+jDz0va0>69^fI6%`W{8w!gU1pyL>prH>E0R<%k6Aq%H z4ij+^9TEwM5P}eh2@)L<~6+>@EpxfA0YrcPNsSu literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-embarassed.gif b/includes/tiny_mce/plugins/emotions/images/smiley-embarassed.gif new file mode 100644 index 0000000000000000000000000000000000000000..963a96b8a7593b1d8bcbab073abe5ee4e539dbf6 GIT binary patch literal 331 zcmV-R0kr-{Nk%w1VG;lm0MrryDh>j~yq&6%75dW~z^P39(NxsGDE{UkxtkIEq(S-a zRKlwv+S=Lr?>hbYY~sQ?c3T&ZcN_Nh_EU3s(>Io6B&>WW`@bsw**)Ocy1bht z{*G6|uwwqUQ2+n{A^8LW0018VEC2ui01^Na000HZ;3tYwX_jM3YQ!c88=*-m*&&bO zILd=`w3KAC;8hxpif*w9ek6oqV-Z0L77fROK$BSR@5BAv-%C>6y>>#+D4e#&nz^qMDItlpp zTG728+|V&?R13PIEBW(C`uh6d*t-1sZ^XQv;oDD}iYLOV7uVO;{`xl4#4tJ{0;h@! z>)kfFn;iS@Hvj+tA^8LW0018VEC2ui01^Na000Hm;3tYuX_jM3Mo7199TGt*Nf;R= zNmOPKwA8_2Q6MTDP6eT`I1VESVj-zGIG(JdB3U44kcdI@;AAq{Gv^^O%%ltj2GdB) z>vIL;d*~=0a|w1Bf^!cF9R~+vb94;_0}TxWlnMrlj2MuVoSYAreF`3(0|pHS8VLgr zi3bP_qZ;q#>Sw62=mns-On=0wransPVevT^YK{Dy(0YY zH)vE6x0?;Wqb>gZas1^OT0si>`ugD5y87}*#H$s=yq(wA*8cf7{`y+(+9J7|9QfT7 z`ROHiU=Y&6FaQ7mA^8LW0018VEC2ui01^Na000Hi;3tYvX_jM3N`@u~nju9hSuh^r zIEcp-wA7(NL0~2d#RP+(G!CPPA>o*KJjv_CkucCA5=K?AfF#RG2V*8BU@jL304|4P z2;PGRF@bj$et;Jf2pR_mVsIA<85|n}kQ*Bq42Ovqj*yy>6P0=h3X&9Z01yyk~2N4w%7#RW^55W%`0vQ+-6(y_*2pqz~90*;x9}yM}%$UI(7t#$D mK_3Se1{4HKM+6iG7EmeH6$V631{L5n)#CyC0qx-*Apkoyg?w!Q literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-innocent.gif b/includes/tiny_mce/plugins/emotions/images/smiley-innocent.gif new file mode 100644 index 0000000000000000000000000000000000000000..334d49e0e60f2997c9ba24071764f95d9e08a5cc GIT binary patch literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryI4TI-%dP0m5~*+Y`T~ z7Rth){q{I_X%*S48uRZ|(b3V&wIKTX`u+WJzo<^$#wuY;3W|Cf{O29IkTAcaE&lpe z+P*^H)-tknA^-pYA^8LW0018VEC2ui01^Na000He;3tYwX_n)75QgVvNQ`6#5gcMm zEEG~blgXokptKAJgCU?%JT?yos!R6cPtcQWh2siHlNI2L}ifQhgX02^InZ2?-ktkqVRyZJY^Trk|lv zovp437?1~d46O)?2(1i+2NDYk8<+_Kil!K!3njA^!I#dL8x<729}*B65mC=m5gHH@ iDi9P3f*VjB3KS4HDb_qqRul{0DIT=Nk%w1VG;lm0Mrx!QauaC#>Vb6G=_5=^YB^9wrc376Sb5I-qJGf@9vZ# z5WlKU(!eVB+7tfnDXp0zyB`?BZ5IChalob*`uh6d*t+@dKGHcU+L|83yq*5~IoH?L zy`?Gp<{bX|SpWb4A^8LW0018VEC2ui01^Na000Hg;3tYyX_jM3R?Bl7&r(q;SsVx< zNd$5fv{ZsKA$SlL3&KN~a1tZRf*~1Ltkx9~2uL3&z-yb0WJDRY082|tP literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-laughing.gif b/includes/tiny_mce/plugins/emotions/images/smiley-laughing.gif new file mode 100644 index 0000000000000000000000000000000000000000..1606c119e75678c4031f384e0d50849906e8f533 GIT binary patch literal 344 zcmV-e0jK^)Nk%w1VG;lm0MruzQauf>s;1-69HWK?p_PpF=Pd8~Ygtcnp*fHAL z**;z>w3iC}`fmL6IkKB1N;3zEa}&zKpsu1;_V)HocR5-{J~BcYvE`YXhBnc@CfU=! za(Ec zG>66zv=rqr;2j)}gKqE$ekcSD?}0=WLB?AWp85)qALd+P=4)6X4oXy{bw2>K^d$ z@6ERvva+(4ib~41YUkTEn1&#?rzrOHT>1I=Y*h`+%*@WtPUPg|!@EEI_d5LgZ>^Og z-qyCjsu$J9F8}}lA^8LW0018VEC2ui01^Na000HT;3tYxX_jM37RWXX8&XUv=@{Oj zX@_Sxw3H&!kzgQ?2LvPOL=>Y5VxieY9+_+eqFEql6OKWXd3Ze8Ggf2Zln@U|mI9d9 zGm^(wVUTA5cYs-V1`2#+a})^z6chrF5`~8k5e6@pmkW`GeGw<069yTQaGnH)s0suV zR|pCd0ZtRCsjM9VB^L+~7X%f*zyuc%2p3=#ycf#L%McYo9|{Z&5D^#_78qL%3{WW( X7Xb)FP6z?UH6ODVz!ev-DIowmgll^P literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-smile.gif b/includes/tiny_mce/plugins/emotions/images/smiley-smile.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6a9e60d5ddd1243fbbf2197b4dc6cd9c1b58b93 GIT binary patch literal 345 zcmV-f0jB;(Nk%w1VG;lm0MrlwCJF+^#>SR<4C>Dj%C>6W(lWoQPVevT^YB^Fy&h6M z4YZgH{O~qtR1(Ci8T;lQ`uh6d*t-7xar*K{#Jrulo-Wtd*44u?{`oh#n;gQXGXDEo z_}UVAU=FH^0ssI2A^8LW0018VEC2ui01^Na000Hn;3tYuX_jM3Mn>j&nGr!MNh}v4 zNyxPjwA7*EKx`%q#$Vl9SM>N9ReH-cn1&^4jYXf0KotqjT;UWC94U(4-NtX4#i!%9}pHA2?&dg3>XLr r8Wuqx2Nnhn1xrT-4h9xbDb^GQ8V(K`1{C5o)#U;I0p5-K5CQ-@9%ySnDDC*4*{OcpiwransPVevTQacIr@mkQp zCf(06s)_=>r7UYx48o@u`uh6d*t-7rH~ji<`P&oj;5Wp)o!8ga`SV6TA_BIW5#ZWV z{`*+__>9}pJ}3JDSl85wB_3Jn)Q o9|so(4+|I^92g4^1{Y8%(iR3pP6ig=HPPY$`~mLZA3^{CJDB=?L;wH) literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif b/includes/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif new file mode 100644 index 0000000000000000000000000000000000000000..2075dc16058f1f17912167675ce5cfb9986fc71d GIT binary patch literal 328 zcmV-O0k{4~Nk%w1VG;lm0Mrx!CJF+^#>SU@3-{U*rx+Q^wrc$ABfqLn@9*x?z8(4X zSW-O=@){bmmI~g|GQXoP);cvj3|f1M8e@{G*!tYaiCEujj1NGxRN#6#tiCETo+{x{Hkzt z5k-kPvcD=V2nbmjCgL6k{uF&2nP-t0s;w<385Nx2oxDb z9T5Pp7qJl?3Kkh9oe2sCr5F$p7zPSlsUH*@54w*83=9Or4;w)r2pcU95(FL|1Th;< aDaRQH4;Tal7#Y$v#?=Au0pHUfApkpvZg^t= literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-undecided.gif b/includes/tiny_mce/plugins/emotions/images/smiley-undecided.gif new file mode 100644 index 0000000000000000000000000000000000000000..bef7e257303f8243c89787e7a7f9955dd1f112e2 GIT binary patch literal 337 zcmV-X0j~Z>Nk%w1VG;lm0MroxDi#99#>R?y8~4}{%C>6#>?OadPVevTr-=vi@LATn z4rERY-qJF+n+?CCE&B3D{{3Shh?>WT0o%`b%*Voqm`dL;(4F35y zc485^n;g!+Bme*aA^8LW0018VEC2ui01^Na000Hf;3tYvX_jM3N=AnuogqakNi<9X zK?&0kwA8^tNn{?C$|IAYI1ZzT!2>}iuMddFK#NEkRl!7%6brJAnUs;)XcnA}TNBSP zxQ9;SvEfwYeSaGd2^|LqU~(QF1qBxr3Ii7x84ZVt8wCTKoSYAqc?p`G2onnpk`IOl z1`HLGj}riN2p1K12N4z&8IBDc6tEWs859;JtRB6>lf+xO9}yT19toMv8wnl`7(pKg j7zPv!OGgY81{hE&(iR3pP6ig;HPPS!_yOwPA0Yrc)=Yf3 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-wink.gif b/includes/tiny_mce/plugins/emotions/images/smiley-wink.gif new file mode 100644 index 0000000000000000000000000000000000000000..9faf1aff8f4b28e02f4f414975fe1859c43b6b54 GIT binary patch literal 351 zcmV-l0igazNk%w1VG;lm0MrryC=CL}#>Sn03F^-g-qAA3wransPV?|t@9*x%vmQ`7 z4E*pcw3rOOq%3t@4*K#({N^40{c-yG`rz2Q!KfI-yq*61HrBop*VoqW<}&{JS@_x# zwwfH#!YTdnIsgCwA^8LW0018VEC2ui01^Na000Ht;3tYwX_jM3P6j6koH0o%Sun&A zMF+tYv=pL2IcOdp&qH&dG!P?+ArV0)J)O=Yk}%LD6Go&#@MJn3he8=)%%lWOM*#pN zEDD9iq9J$@90v~;83`GC4i0+{2OJ0pVtacF5E}yn8<`pmkCBv_pqZEtoPY-l0}P>= z3WE6cr`19U7DgF9{F}at6R35*Q5~ x2OgBy9tRx_7(pKh7zPvsOGgA01{hE&-4zBzP6id}HMp@0Krnzkbss_i06S`>cdh^c literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/emotions/images/smiley-yell.gif b/includes/tiny_mce/plugins/emotions/images/smiley-yell.gif new file mode 100644 index 0000000000000000000000000000000000000000..648e6e879123fe49beebbc1f3635141864a79a9c GIT binary patch literal 336 zcmV-W0k8f?Nk%w1VG;lm0MrryG8O{K#>IbS7WCB_mWF$+hzY-{PWkp(?(Xf;zbH~P z3jOdj?W+^YwrakfE8fyG&5jTBz!3WS`fgM_;MltQ+c}4GO8)(E`S3`@yq&d~5!ct& z)v79NObo)O7XSbNA^8LW0018VEC2ui01^Na000He;3tYwX_jM3QifI(nn6h_*=Wyk zUB{y}v=qYOIUF#R3dZPhAVv~H;(|a2yN_5FH&J0|$eJ3kw4gj1Y?v5d#>LMV12^6BYy$1)ZKA zga!|m2?POz0R)f>4+aPl8KD{gz`+G_9vLMFQU?RU!8uyH9}*i52|cC+7S0YEK_3Vk i1|APfM-Ltb8&4_H83sg61{vHn(cc000qNZzApkp/g, '&gr;'); + + var html = '' + title + ''; + + tinyMCE.execCommand('mceInsertContent', false, html); + tinyMCEPopup.close(); +} diff --git a/includes/tiny_mce/plugins/emotions/langs/cs.js b/includes/tiny_mce/plugins/emotions/langs/cs.js new file mode 100644 index 0000000..d890b92 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/cs.js @@ -0,0 +1,12 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_emotions_title : 'VloÅŸit emotikonu', +emotions_desc : 'Emotikony' +}); + diff --git a/includes/tiny_mce/plugins/emotions/langs/cy.js b/includes/tiny_mce/plugins/emotions/langs/cy.js new file mode 100644 index 0000000..cb20fc2 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/cy.js @@ -0,0 +1,22 @@ +// UK lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Mewnosod gwenoglun', +desc : 'Gwenogluniau', +cool : 'Cŵl', +cry : 'Crïo', +embarassed : 'Cywilydd', +foot_in_mouth : 'Troed yn y ceg', +frown : 'Gwgu', +innocent : 'Diniwed', +kiss : 'Sws', +laughing : 'Chwerthin', +money_mouth : 'Ceg arian', +sealed : 'Seliwyd', +smile : 'Gwên', +surprised : 'Synnu', +tongue_out : 'Tafod allan', +undecided : 'Penagored', +wink : 'Winc', +yell : 'Gwaedd' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/da.js b/includes/tiny_mce/plugins/emotions/langs/da.js new file mode 100644 index 0000000..8dae9e5 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/da.js @@ -0,0 +1,22 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('emotions',{ +title : 'Indsæt smiley', +desc : 'Smileys', +cool : 'Cool', +cry : 'Gråd', +embarassed : 'Forlegen', +foot_in_mouth : 'Foden i munden', +frown : 'Rynket pande', +innocent : 'Uskyldig', +kiss : 'Kys', +laughing : 'Latter', +money_mouth : 'Lækker mund', +sealed : 'Lukket af', +smile : 'Smil', +surprised : 'Overrasket', +tongue_out : 'Ræk tunge', +undecided : 'Usikker', +wink : 'Blink', +yell : 'Råb' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/de.js b/includes/tiny_mce/plugins/emotions/langs/de.js new file mode 100644 index 0000000..636bf80 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/de.js @@ -0,0 +1,22 @@ +// DE lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Insert emotion', +desc : 'Emotions', +cool : 'Cool', +cry : 'Cry', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'Frown', +innocent : 'Innocent', +kiss : 'Kiss', +laughing : 'Laughing', +money_mouth : 'Money mouth', +sealed : 'Sealed', +smile : 'Smile', +surprised : 'Surprised', +tongue_out : 'Tongue out', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/el.js b/includes/tiny_mce/plugins/emotions/langs/el.js new file mode 100644 index 0000000..2f4e0bc --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/el.js @@ -0,0 +1,6 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +insert_emotions_title : 'ÅéóáãùãÞ åíüò åéêïíéäßïõ emoticon', +emotions_desc : 'Åéêïíßäéá emoticons' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/en.js b/includes/tiny_mce/plugins/emotions/langs/en.js new file mode 100644 index 0000000..5d9ee60 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/en.js @@ -0,0 +1,22 @@ +// UK lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Insert emotion', +desc : 'Emotions', +cool : 'Cool', +cry : 'Cry', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'Frown', +innocent : 'Innocent', +kiss : 'Kiss', +laughing : 'Laughing', +money_mouth : 'Money mouth', +sealed : 'Sealed', +smile : 'Smile', +surprised : 'Surprised', +tongue_out : 'Tongue out', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/es.js b/includes/tiny_mce/plugins/emotions/langs/es.js new file mode 100644 index 0000000..633e233 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/es.js @@ -0,0 +1,30 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('emotions',{ +title : 'Intertar emoticono', +desc : 'Emoticonos', +cool : 'Chulo', +cry : 'Llorando', +embarassed : 'Avergonzado', +foot_in_mouth : 'Sin palabras', +frown : 'Triste', +innocent : 'Inocente', +kiss : 'Beso', +laughing : 'Riendo', +money_mouth : 'Forrado', +sealed : 'Boca sellada', +smile : 'Sonriente', +surprised : 'Sorprendido', +tongue_out : 'Burla', +undecided : 'Indeciso', +wink : 'Guiño', +yell : 'Enfadado' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/fa.js b/includes/tiny_mce/plugins/emotions/langs/fa.js new file mode 100644 index 0000000..f1b9c6e --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/fa.js @@ -0,0 +1,11 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +insert_emotions_title : '?????? ????', +emotions_desc : '??????' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/fr.js b/includes/tiny_mce/plugins/emotions/langs/fr.js new file mode 100644 index 0000000..3153e5f --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/fr.js @@ -0,0 +1,22 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('emotions',{ +title : 'Choisir une émoticône', +desc : 'Insérer une émoticône', +cool : 'Cool', +cry : 'Triste', +embarassed : 'Embarrassé', +foot_in_mouth : 'Oups !', +frown : 'Mécontent', +innocent : 'Innocent', +kiss : 'Bisou', +laughing : 'Mort de rire', +money_mouth : 'Sencuré', +sealed : 'Motus', +smile : 'Sourire', +surprised : 'Surprise', +tongue_out : 'Moqueur', +undecided : 'Perplexe', +wink : 'Clin d\'oeil', +yell : 'Horreur !' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/fr_ca.js b/includes/tiny_mce/plugins/emotions/langs/fr_ca.js new file mode 100644 index 0000000..d84cb6f --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/fr_ca.js @@ -0,0 +1,6 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +insert_emotions_title : 'Insérer un émoticon', +emotions_desc : 'Émoticons' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/he.js b/includes/tiny_mce/plugins/emotions/langs/he.js new file mode 100644 index 0000000..cdc18af --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/he.js @@ -0,0 +1,22 @@ +// HE lang variables + +tinyMCE.addToLang('emotions',{ +title : 'äëðñ øâùåï', +desc : 'øâùåðéí', +cool : 'øâåò', +cry : 'áåëä', +embarassed : 'ðáåê', +foot_in_mouth : 'òí äøâì áôä', +frown : 'æåòó', +innocent : 'úîéí', +kiss : 'ðùé÷ä', +laughing : 'öåç÷', +money_mouth : 'ôä ùì ëñó', +sealed : 'àèåí', +smile : 'çéåê', +surprised : 'îåôúò', +tongue_out : 'ìùåï áçåõ', +undecided : 'áìúé äçìèé', +wink : '÷øéöä', +yell : 'öò÷ä' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/hu.js b/includes/tiny_mce/plugins/emotions/langs/hu.js new file mode 100644 index 0000000..da7397f --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/hu.js @@ -0,0 +1,22 @@ +// HU lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Hangulatjel beszúrása', +desc : 'Hangulatjelek', +cool : 'Király', +cry : 'Sírás', +embarassed : 'Zavart', +foot_in_mouth : 'Foot in mouth', +frown : 'Homlokráncolás', +innocent : 'Ártatlan', +kiss : 'Csók', +laughing : 'Nevetés', +money_mouth : 'Pénzéhes', +sealed : 'Elnémult', +smile : 'Mosolygás', +surprised : 'Meglepett', +tongue_out : 'Tongue out', +undecided : 'Határozatlan', +wink : 'Kacsintás', +yell : 'Sikoltás' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/is.js b/includes/tiny_mce/plugins/emotions/langs/is.js new file mode 100644 index 0000000..460a026 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/is.js @@ -0,0 +1,22 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('emotions',{ +title : 'Tilfinningatákn', +desc : 'Tilfinningatákn', +cool : 'Svalur', +cry : 'Gráta', +embarassed : 'Skömmustulegur', +foot_in_mouth : 'Tala af sér', +frown : 'Fýldur', +innocent : 'Saklaus', +kiss : 'Koss', +laughing : 'Hlæjandi', +money_mouth : 'Gráðugur', +sealed : 'Þögull sem gröfin', +smile : 'Brosandi', +surprised : 'Hissa', +tongue_out : 'Ullandi', +undecided : 'Óákveðinn', +wink : 'Glottandi', +yell : 'Öskrandi' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/it.js b/includes/tiny_mce/plugins/emotions/langs/it.js new file mode 100644 index 0000000..59e9b05 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/it.js @@ -0,0 +1,6 @@ +//IT lang variables + +tinyMCE.addToLang('',{ +insert_emotions_title : 'Inserisci una emoticon', +emotions_desc : 'Emoticon' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/ko.js b/includes/tiny_mce/plugins/emotions/langs/ko.js new file mode 100644 index 0000000..25aabd8 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/ko.js @@ -0,0 +1,6 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +insert_emotions_title : 'ÀÌžðÆŒÄÜ ³Ö±â', +emotions_desc : 'ÀÌžðÆŒÄÜ' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/nb.js b/includes/tiny_mce/plugins/emotions/langs/nb.js new file mode 100644 index 0000000..d248bae --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/nb.js @@ -0,0 +1,22 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('emotions',{ +title : 'Lim inn følelse', +desc : 'Følelser', +cool : 'Cool', +cry : 'Gråter', +embarassed : 'Sjenert', +foot_in_mouth : 'Fot i munnen', +frown : 'Lei seg', +innocent : 'Uskyldig', +kiss : 'Kyss', +laughing : 'Ler', +money_mouth : 'Penger i munnen', +sealed : 'Hemmelig', +smile : 'Glad', +surprised : 'Overrasket', +tongue_out : 'Rekke tunge', +undecided : 'Betenkt', +wink : 'Flørt', +yell : 'Skrikende' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/nl.js b/includes/tiny_mce/plugins/emotions/langs/nl.js new file mode 100644 index 0000000..5e0e867 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/nl.js @@ -0,0 +1,22 @@ +// NL lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Emoticon invoegen', +desc : 'Emoticons', +cool : 'Cool', +cry : 'Huilen', +embarassed : 'Verlegen', // embarrassed +foot_in_mouth : 'Eten in mond', // food in mouth? +frown : 'Fronsen', +innocent : 'Onschuldig', +kiss : 'Kus', +laughing : 'Lachend', +money_mouth : 'Geldgezicht', +sealed : 'Verzegeld', +smile : 'Smile', +surprised : 'Verbaasd', +tongue_out : 'Tong uitstekend', +undecided : 'Obepaald', +wink : 'Knipoog', +yell : 'Schreeuwen' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/nn.js b/includes/tiny_mce/plugins/emotions/langs/nn.js new file mode 100644 index 0000000..c1523b1 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/nn.js @@ -0,0 +1,22 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('emotions',{ +title : 'Lim inn følelse', +desc : 'Følelser', +cool : 'Cool', +cry : 'Gråter', +embarassed : 'Sjenert', +foot_in_mouth : 'Fot i munnen', +frown : 'Lei seg', +innocent : 'Uskyldig', +kiss : 'Kyss', +laughing : 'Ler', +money_mouth : 'Penger i munnen', +sealed : 'Hemmelig', +smile : 'Glad', +surprised : 'Overrasket', +tongue_out : 'Rekke tunge', +undecided : 'Betenkt', +wink : 'Flørt', +yell : 'Skrikende' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/pl.js b/includes/tiny_mce/plugins/emotions/langs/pl.js new file mode 100644 index 0000000..305c7a4 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/pl.js @@ -0,0 +1,25 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// lemiel 25.10.2005 + +tinyMCE.addToLang('emotions',{ +title : 'Wstaw emotikonkê', +desc : 'Emotikonki', +cool : 'Super', +cry : 'P³aczê', +embarassed : 'Za¿enowanie', +foot_in_mouth : 'Trzepiê jêzorem', +frown : 'Marszczê brew', +innocent : 'Niewinny', +kiss : 'Poca³unek', +laughing : 'Šmiech', +money_mouth : 'Zasady ¿yciowe', +sealed : 'Zaplombowane usta', +smile : 'U¶miech', +surprised : 'Zaskoczenie', +tongue_out : 'Pokazujê jêzyk', +undecided : 'Niezdecydowanie', +wink : 'Perskie oko', +yell : 'Wycie' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/pt_br.js b/includes/tiny_mce/plugins/emotions/langs/pt_br.js new file mode 100644 index 0000000..111c7c7 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/pt_br.js @@ -0,0 +1,29 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('emotions',{ +title : 'Inserir Emoticons', +desc : 'Emoticons', +cool : 'Legal', +cry : 'Chorando', +embarassed : 'Embaraçado', +foot_in_mouth : 'Falando asneira', +frown : 'Triste', +innocent : 'Inocente', +kiss : 'Beijo', +laughing : 'Rindo', +money_mouth : 'Interesseiro', +sealed : 'Lábios fechados', +smile : 'Sorriso', +surprised : 'Surpreso', +tongue_out : 'Mostrar a língüa', +undecided : 'Indeciso', +wink : 'Piscar', +yell : 'Grito' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/ru.js b/includes/tiny_mce/plugins/emotions/langs/ru.js new file mode 100644 index 0000000..11390c6 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/ru.js @@ -0,0 +1,22 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('emotions',{ +title : 'Âñòàâèòü ñìàéëèê', +desc : 'Ñìàéëèêè', +cool : 'Cool', +cry : 'Ïëà÷', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'Íàõìóðåííîñòü', +innocent : 'Ñâÿòîé', +kiss : 'Ïîöåëóé', +laughing : 'Ñìåõ', +money_mouth : 'Money mouth', +sealed : 'Çàêëååííûé', +smile : 'Óëûáêà', +surprised : 'Ñþðïðèç', +tongue_out : 'Âûñóíóòûé ÿçûê', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js new file mode 100644 index 0000000..ab57dbf --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/ru_KOI8-R.js @@ -0,0 +1,22 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('emotions',{ +title : '÷ÓÔÁ×ÉÔØ ÓÍÁÊÌÉË', +desc : 'óÍÁÊÌÉËÉ', +cool : 'Cool', +cry : 'ðÌÁÞ', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'îÁÈÍÕÒÅÎÎÏÓÔØ', +innocent : 'ó×ÑÔÏÊ', +kiss : 'ðÏÃÅÌÕÊ', +laughing : 'óÍÅÈ', +money_mouth : 'Money mouth', +sealed : 'úÁËÌÅÅÎÎÙÊ', +smile : 'õÌÙÂËÁ', +surprised : 'óÀÒÐÒÉÚ', +tongue_out : '÷ÙÓÕÎÕÔÙÊ ÑÚÙË', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/emotions/langs/ru_UTF-8.js new file mode 100644 index 0000000..5686bf8 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/ru_UTF-8.js @@ -0,0 +1,22 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('emotions',{ +title : 'ВставОть сЌайлОк', +desc : 'СЌайлОкО', +cool : 'Cool', +cry : 'Плач', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'НахЌуреММПсть', +innocent : 'СвятПй', +kiss : 'ППцелуй', +laughing : 'СЌех', +money_mouth : 'Money mouth', +sealed : 'ЗаклееММый', +smile : 'Улыбка', +surprised : 'СюрпрОз', +tongue_out : 'ВысуМутый язык', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/sk.js b/includes/tiny_mce/plugins/emotions/langs/sk.js new file mode 100644 index 0000000..2de5831 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/sk.js @@ -0,0 +1,14 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_emotions_title : 'VloÅŸiÅ¥ emotikonu', +emotions_desc : 'Emotikony' +}); + diff --git a/includes/tiny_mce/plugins/emotions/langs/sv.js b/includes/tiny_mce/plugins/emotions/langs/sv.js new file mode 100644 index 0000000..f339ea9 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/sv.js @@ -0,0 +1,22 @@ +// SE lang variables + +tinyMCE.addToLang('emotions',{ +title : 'Klistra in känsla', +desc : 'Känslor', +cool : 'Cool', +cry : 'Gråter', +embarassed : 'Generad', +foot_in_mouth : 'Fot i munnnen', +frown : 'Ledsen', +innocent : 'Oskyldig', +kiss : 'Kyss', +laughing : 'Skrattande', +money_mouth : 'Penga mun', +sealed : 'Hemlis', +smile : 'Glad', +surprised : 'Förvånad', +tongue_out : 'Räcka ut tungan', +undecided : 'Fundersam', +wink : 'Flört', +yell : 'Skrikandes' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/zh_cn.js b/includes/tiny_mce/plugins/emotions/langs/zh_cn.js new file mode 100644 index 0000000..f920126 --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/zh_cn.js @@ -0,0 +1,22 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('emotions',{ +title : '²åÈë±íÇé', +desc : '±íÇé', +cool : 'Cool', +cry : 'Cry', +embarassed : 'Embarassed', +foot_in_mouth : 'Foot in mouth', +frown : 'Frown', +innocent : 'Innocent', +kiss : 'Kiss', +laughing : 'Laughing', +money_mouth : 'Money mouth', +sealed : 'Sealed', +smile : 'Smile', +surprised : 'Surprised', +tongue_out : 'Tongue out', +undecided : 'Undecided', +wink : 'Wink', +yell : 'Yell' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/emotions/langs/zh_tw.js b/includes/tiny_mce/plugins/emotions/langs/zh_tw.js new file mode 100644 index 0000000..3bb816d --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/zh_tw.js @@ -0,0 +1,23 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('emotions',{ +title : 'Ž¡€Jªí±¡¹Ï¥Ü', +desc : 'ªí±¡¹Ï¥Ü', +cool : '»Å³á', +cry : '€j­ú', +embarassed : 'Šnêɧr', +foot_in_mouth : '¯äŠº€F', +frown : '­ó¡IÃi±o²z§A', +innocent : '§Ú¬OµL¶dªº', +kiss : '¿Ë€@­Ó', +laughing : '€Ó¥i¯º¹Æ', +money_mouth : 'Šn°ª¿³³á', +sealed : '³¬ŒL', +smile : '·L¯º', +surprised : 'Åå³Y', +tongue_out : 'ŠRŠÞÀY', +undecided : '§Ú·Q·Q', +wink : '¯w²Ž', +yell : '°IŠº€F¡ã¡ã' +}); diff --git a/includes/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js new file mode 100644 index 0000000..a77f06a --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/langs/zh_tw_utf8.js @@ -0,0 +1,23 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('emotions',{ +title : '插入衚情圖瀺', +desc : '衚情圖瀺', +cool : '酷喔', +cry : '倧哭', +embarassed : '奜糗呀', +foot_in_mouth : '臭死了', +frown : '哌懶埗理䜠', +innocent : '我是無蟜的', +kiss : '芪䞀個', +laughing : '倪可笑嘍', +money_mouth : '奜高興喔', +sealed : '閉嘎', +smile : '埮笑', +surprised : '驚蚝', +tongue_out : '吐舌頭', +undecided : '我想想', +wink : '眚県', +yell : '衰死了' +}); diff --git a/includes/tiny_mce/plugins/emotions/readme.txt b/includes/tiny_mce/plugins/emotions/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/emotions/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/flash/css/content.css b/includes/tiny_mce/plugins/flash/css/content.css new file mode 100644 index 0000000..9980217 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/css/content.css @@ -0,0 +1,7 @@ +.mceItemFlash { + border: 1px dotted #cc0000; + background-image: url('../images/flash.gif'); + background-position: center; + background-repeat: no-repeat; + background-color: #ffffcc; +} diff --git a/includes/tiny_mce/plugins/flash/css/flash.css b/includes/tiny_mce/plugins/flash/css/flash.css new file mode 100644 index 0000000..2fa558e --- /dev/null +++ b/includes/tiny_mce/plugins/flash/css/flash.css @@ -0,0 +1,11 @@ +.panel_wrapper div.current { + height: 100px; +} + +#width, #height { + width: 50px; +} + +#file { + width: 250px; +} diff --git a/includes/tiny_mce/plugins/flash/editor_plugin.js b/includes/tiny_mce/plugins/flash/editor_plugin.js new file mode 100644 index 0000000..daf0294 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('flash','en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk,pt_br');function TinyMCE_flash_getInfo(){return{longname:'Flash',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_flash.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_flash_initInstance(inst){if(!tinyMCE.settings['flash_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/flash/css/content.css");}function TinyMCE_flash_getControlHTML(control_name){switch(control_name){case "flash":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFlash\');return false;';return '';}return "";}function TinyMCE_flash_parseAttributes(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i','gi'),'');content=content.replace(new RegExp('<[ ]*object','gi'),'','gi'),'');while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs;}var index=0;while((startPos=content.indexOf('=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+=''+content.substring(endPos);content+=contentAfter;index++;startPos++;}var index=0;while((startPos=content.indexOf('=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+=''+content.substring(endPos);content+=contentAfter;index++;startPos++;}break;case "get_from_editor":var startPos=-1;while((startPos=content.indexOf('',startPos);var attribs=TinyMCE_flash_parseAttributes(content.substring(startPos+4,endPos));if(attribs['class']!="mceItemFlash")continue;endPos+=2;var embedHTML='';var wmode=tinyMCE.getParam("flash_wmode","");var quality=tinyMCE.getParam("flash_quality","high");var menu=tinyMCE.getParam("flash_menu","false");embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';embedHTML+='';chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter;}break;}return content;}function TinyMCE_flash_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonNormal');if(node==null)return;do{if(node.nodeName.toLowerCase()=="img"&&tinyMCE.getAttrib(node,'class').indexOf('mceItemFlash')==0)tinyMCE.switchClassSticky(editor_id+'_flash','mceButtonSelected');}while((node=node.parentNode));return true;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/flash/editor_plugin_src.js b/includes/tiny_mce/plugins/flash/editor_plugin_src.js new file mode 100644 index 0000000..2f84737 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/editor_plugin_src.js @@ -0,0 +1,270 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('flash', 'en,de,sv,zh_cn,cs,fa,fr_ca,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk,pt_br'); + +function TinyMCE_flash_getInfo() { + return { + longname : 'Flash', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_flash.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_flash_initInstance(inst) { + if (!tinyMCE.settings['flash_skip_plugin_css']) + tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/flash/css/content.css"); +} + +function TinyMCE_flash_getControlHTML(control_name) { + switch (control_name) { + case "flash": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFlash\');return false;'; + return ''; + } + + return ""; +} + +function TinyMCE_flash_parseAttributes(attribute_string) { + var attributeName = ""; + var attributeValue = ""; + var withInName; + var withInValue; + var attributes = new Array(); + var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g'); + + if (attribute_string == null || attribute_string.length < 2) + return null; + + withInName = withInValue = false; + + for (var i=0; i','gi'),''); + content = content.replace(new RegExp('<[ ]*object','gi'),'','gi'),''); + + // Parse all embed tags + while ((startPos = content.indexOf('', startPos); + var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 6, endPos)); + embedList[embedList.length] = attribs; + } + + // Parse all object tags and replace them with images from the embed data + var index = 0; + while ((startPos = content.indexOf('= embedList.length) + break; + + var attribs = embedList[index]; + + // Find end of object + endPos = content.indexOf('', startPos); + endPos += 9; + + // Insert image + var contentAfter = content.substring(endPos); + content = content.substring(0, startPos); + content += '' + content.substring(endPos); + content += contentAfter; + index++; + + startPos++; + } + + // Parse all embed tags and replace them with images from the embed data + var index = 0; + while ((startPos = content.indexOf('= embedList.length) + break; + + var attribs = embedList[index]; + + // Find end of embed + endPos = content.indexOf('>', startPos); + endPos += 9; + + // Insert image + var contentAfter = content.substring(endPos); + content = content.substring(0, startPos); + content += '' + content.substring(endPos); + content += contentAfter; + index++; + + startPos++; + } + + break; + + case "get_from_editor": + // Parse all img tags and replace them with object+embed + var startPos = -1; + while ((startPos = content.indexOf('', startPos); + var attribs = TinyMCE_flash_parseAttributes(content.substring(startPos + 4, endPos)); + + // Is not flash, skip it + if (attribs['class'] != "mceItemFlash") + continue; + + endPos += 2; + + var embedHTML = ''; + var wmode = tinyMCE.getParam("flash_wmode", ""); + var quality = tinyMCE.getParam("flash_quality", "high"); + var menu = tinyMCE.getParam("flash_menu", "false"); + + // Insert object + embed + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + embedHTML += ''; + + // Insert embed/object chunk + chunkBefore = content.substring(0, startPos); + chunkAfter = content.substring(endPos); + content = chunkBefore + embedHTML + chunkAfter; + } + break; + } + + // Pass through to next handler in chain + return content; +} + +function TinyMCE_flash_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonNormal'); + + if (node == null) + return; + + do { + if (node.nodeName.toLowerCase() == "img" && tinyMCE.getAttrib(node, 'class').indexOf('mceItemFlash') == 0) + tinyMCE.switchClassSticky(editor_id + '_flash', 'mceButtonSelected'); + } while ((node = node.parentNode)); + + return true; +} diff --git a/includes/tiny_mce/plugins/flash/flash.htm b/includes/tiny_mce/plugins/flash/flash.htm new file mode 100644 index 0000000..1e0414b --- /dev/null +++ b/includes/tiny_mce/plugins/flash/flash.htm @@ -0,0 +1,70 @@ + + + {$lang_flash_title} + + + + + + + + +
+ + +
+
+
+ {$lang_flash_general} + + + + + + + + + + + + + + +
+ + + + + +
 
+
 
+ +  x  + +
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/flash/images/flash.gif b/includes/tiny_mce/plugins/flash/images/flash.gif new file mode 100644 index 0000000000000000000000000000000000000000..cb192e6ceda8d19ad8e7d08dd1cfde0aa72ead2a GIT binary patch literal 241 zcmVOzlLa+Za}7>m0&NpCfJ0FQc3~F7DE)S%o1)Qi1n@vxX46qnD4hRS-NE*Pw!4UvE=#^N( literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/flash/jscripts/flash.js b/includes/tiny_mce/plugins/flash/jscripts/flash.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/flash/langs/cs.js b/includes/tiny_mce/plugins/flash/langs/cs.js new file mode 100644 index 0000000..a49fb2a --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/cs.js @@ -0,0 +1,14 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.6 2005/10/18 13:59:42 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_flash : 'Vložit/editovat Flash Movie', +insert_flash_file : 'Flash soubor (.swf)', +insert_flash_size : 'Velikost', +insert_flash_list : 'Seznam', +flash_props : 'Vlastnosti Flash' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/cy.js b/includes/tiny_mce/plugins/flash/langs/cy.js new file mode 100644 index 0000000..a57c08c --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/cy.js @@ -0,0 +1,11 @@ +// UK lang variables + +tinyMCE.addToLang('flash',{ +title : 'Mewnosod/golygu Ffilm Flash', +desc : 'Mewnosod/golygu Ffilm Flash', +file : 'Ffeil Flash (.swf)', +size : 'Maint', +list : 'Ffeiliau Flash', +props : 'Priodoleddau Flash', +general : 'Cyffredinol' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/da.js b/includes/tiny_mce/plugins/flash/langs/da.js new file mode 100644 index 0000000..ad9f1dc --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/da.js @@ -0,0 +1,11 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('flash',{ +title : 'Indsæt / rediger Flash-film', +desc : 'Indsæt / rediger Flash-film', +file : 'Flash-Fil (.swf)', +size : 'Størrelse', +list : 'Flash filer', +props : 'Flash egenskaber', +general : 'Genererelt' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/de.js b/includes/tiny_mce/plugins/flash/langs/de.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/flash/langs/en.js b/includes/tiny_mce/plugins/flash/langs/en.js new file mode 100644 index 0000000..03ccdff --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/en.js @@ -0,0 +1,11 @@ +// UK lang variables + +tinyMCE.addToLang('flash',{ +title : 'Insert / edit Flash Movie', +desc : 'Insert / edit Flash Movie', +file : 'Flash-File (.swf)', +size : 'Size', +list : 'Flash files', +props : 'Flash properties', +general : 'General' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/es.js b/includes/tiny_mce/plugins/flash/langs/es.js new file mode 100644 index 0000000..3e8521b --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/es.js @@ -0,0 +1,19 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('flash',{ +title : 'Insertar / editar pelicula Flash', +desc : 'Insert / edit Flash Movie', +file : 'Fichero Flash (.swf)', +size : 'Tamaño', +list : 'Ficheros Flash', +props : 'Propiedades del Flash', +general : 'General' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/fa.js b/includes/tiny_mce/plugins/flash/langs/fa.js new file mode 100644 index 0000000..f714640 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/fa.js @@ -0,0 +1,13 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +insert_flash : '?????? ? ?????? ???? ???', +insert_flash_file : '???? ??? (.swf)', +insert_flash_size : '?????', +flash_props : 'Flash properties' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/fr.js b/includes/tiny_mce/plugins/flash/langs/fr.js new file mode 100644 index 0000000..0b6f463 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/fr.js @@ -0,0 +1,11 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('flash',{ +title : 'Gestionnaire d\'animation Flash', +desc : 'Insérer une animation Flash', +file : 'Fichier Flash (.swf)', +size : 'Taille', +list : 'Fichiers Flash', +props : 'Propriétés Flash', +general : 'Général' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/fr_ca.js b/includes/tiny_mce/plugins/flash/langs/fr_ca.js new file mode 100644 index 0000000..49439a6 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/fr_ca.js @@ -0,0 +1,9 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +insert_flash : 'Insérer / Modifier une animation Flash', +insert_flash_file : 'Fichier Flash (.swf)', +insert_flash_size : 'Dimension', +insert_flash_list : 'Fichiers Flash', +flash_props : 'Propriétés Flash' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/he.js b/includes/tiny_mce/plugins/flash/langs/he.js new file mode 100644 index 0000000..c17eb03 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/he.js @@ -0,0 +1,11 @@ +// HE lang variables + +tinyMCE.addToLang('flash',{ +title : 'äëðñ/òøåê ñøèåï Flash', +desc : 'äëðñ/òøåê ñøèåï Flash', +file : '÷åáõ Flash (.swf)', +size : 'âåãì', +list : '÷áöé Flash', +props : 'îàôééðé Flash', +general : 'ëììé' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/hu.js b/includes/tiny_mce/plugins/flash/langs/hu.js new file mode 100644 index 0000000..2a5b4e4 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/hu.js @@ -0,0 +1,11 @@ +// HU lang variables + +tinyMCE.addToLang('flash',{ +title : 'Flash animáció beszúrása / szerkesztése', +desc : 'Flash animáció beszúrása / szerkesztése', +file : 'Flash-Fájl (.swf)', +size : 'Méret', +list : 'Flash fájlok', +props : 'Flash tulajdonságok', +general : 'Általános' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/is.js b/includes/tiny_mce/plugins/flash/langs/is.js new file mode 100644 index 0000000..3c5fe28 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/is.js @@ -0,0 +1,11 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('flash',{ +title : 'Bæta við / breyta Flash-mynd', +desc : 'Bæta við / breyta Flash-mynd', +file : 'Flash-skrá (.swf)', +size : 'Stærð', +list : 'Flash skrár', +props : 'Flash stillingar', +general : 'Almennt' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/nb.js b/includes/tiny_mce/plugins/flash/langs/nb.js new file mode 100644 index 0000000..a82f1ee --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/nb.js @@ -0,0 +1,11 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('flash',{ +title : 'Lag/oppdater flash-film', +desc : 'Lag/oppdater flash-film', +file : 'Flash-film (.swf)', +size : 'Størrelse', +list : 'Flash-filer', +props : 'Flash egenskaper', +general : 'Generelle innstillinger' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/nl.js b/includes/tiny_mce/plugins/flash/langs/nl.js new file mode 100644 index 0000000..2813e06 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/nl.js @@ -0,0 +1,11 @@ +// NL lang variables + +tinyMCE.addToLang('flash',{ +title : 'Flash bestand invoegen/bewerken', +desc : 'Flash bestand invoegen/bewerken', +file : 'Flash bestand (.swf)', +size : 'Grootte', +list : 'Flash bestanden', +props : 'Flash eigenschappen', +general : 'Algemeen' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/nn.js b/includes/tiny_mce/plugins/flash/langs/nn.js new file mode 100644 index 0000000..082733c --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/nn.js @@ -0,0 +1,11 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('flash',{ +title : 'Lag/oppdater flash-film', +desc : 'Lag/oppdater flash-film', +file : 'Flash-film (.swf)', +size : 'Størrelse', +list : 'Flash-filer', +props : 'Flash egenskaper', +general : 'Generelle innstillinger' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/pl.js b/includes/tiny_mce/plugins/flash/langs/pl.js new file mode 100644 index 0000000..cb534f7 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/pl.js @@ -0,0 +1,14 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('flash',{ +title : 'Wstaw/edytuj film flash', +desc : 'Wstaw/edytuj film flash', +file : 'Plik flash (.swf)', +size : 'Rozmiar', +list : 'Pliki flash', +props : 'W³a¶ciwo¶ci flash', +general : 'G³ówne' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/pt_br.js b/includes/tiny_mce/plugins/flash/langs/pt_br.js new file mode 100644 index 0000000..2c1a559 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/pt_br.js @@ -0,0 +1,19 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('flash',{ +title : 'Inserir / editar Arquivo Flash', +desc : 'Inserir / editar Arquivo Flash', +file : 'Arquivo Flash (.swf)', +size : 'Tamanho', +list : 'Lista de arquivos Flash', +props : 'Propriedades do Flash', +general : 'Geral' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/ru.js b/includes/tiny_mce/plugins/flash/langs/ru.js new file mode 100644 index 0000000..baea786 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/ru.js @@ -0,0 +1,11 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('flash',{ +title : 'Âñòàâèòü / Ðåäàêòèðîâàòü Flash ðîëèê', +desc : 'Âñòàâèòü / Ðåäàêòèðîâàòü Flash ðîëèê', +file : 'Flash-Ôàéë (.swf)', +size : 'Ðàçìåð', +list : 'Flash ôàéëû', +props : 'Ñâîéñòâà Flash', +general : 'Îñíîâíîå' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/flash/langs/ru_KOI8-R.js new file mode 100644 index 0000000..7ec2751 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/ru_KOI8-R.js @@ -0,0 +1,11 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('flash',{ +title : '÷ÓÔÁ×ÉÔØ / òÅÄÁËÔÉÒÏ×ÁÔØ Flash ÒÏÌÉË', +desc : '÷ÓÔÁ×ÉÔØ / òÅÄÁËÔÉÒÏ×ÁÔØ Flash ÒÏÌÉË', +file : 'Flash-æÁÊÌ (.swf)', +size : 'òÁÚÍÅÒ', +list : 'Flash ÆÁÊÌÙ', +props : 'ó×ÏÊÓÔ×Á Flash', +general : 'ïÓÎÏ×ÎÏÅ' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/flash/langs/ru_UTF-8.js new file mode 100644 index 0000000..f56ef74 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/ru_UTF-8.js @@ -0,0 +1,11 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('flash',{ +title : 'ВставОть / РеЎактОрПвать Flash рПлОк', +desc : 'ВставОть / РеЎактОрПвать Flash рПлОк', +file : 'Flash-Ѐайл (.swf)', +size : 'РазЌер', +list : 'Flash файлы', +props : 'СвПйства Flash', +general : 'ОсМПвМПе' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/sk.js b/includes/tiny_mce/plugins/flash/langs/sk.js new file mode 100644 index 0000000..f16d3dc --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/sk.js @@ -0,0 +1,16 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insert_flash : 'VloÅŸiÅ¥/editovaÅ¥ Flash Movie', +insert_flash_file : 'Flash súbor (.swf)', +insert_flash_size : 'VeÄŸkosÅ¥', +insert_flash_list : 'Zoznam', +flash_props : 'Vlastnosti Flash' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/sv.js b/includes/tiny_mce/plugins/flash/langs/sv.js new file mode 100644 index 0000000..1334d8a --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/sv.js @@ -0,0 +1,11 @@ +// SE lang variables + +tinyMCE.addToLang('flash',{ +title : 'Skapa/uppdatera flash-film', +desc : 'Skapa/uppdatera flash-film', +file : 'Flash-film (.swf)', +size : 'Storlek', +list : 'Flash-filer', +props : 'Flash egenskaper', +general : 'Generella inställningar' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/zh_cn.js b/includes/tiny_mce/plugins/flash/langs/zh_cn.js new file mode 100644 index 0000000..477dc31 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/zh_cn.js @@ -0,0 +1,11 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('flash',{ +title : '²åÈë/±àŒ­ FlashµçÓ°', +desc : 'FlashµçÓ°ÃèÊö', +file : 'Flash²åŒþ(.swf)', +size : '³ßŽç', +list : 'Flash²åŒþÁбí', +props : 'FlashÊôÐÔ', +general : 'Ò»°ã' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/flash/langs/zh_tw.js b/includes/tiny_mce/plugins/flash/langs/zh_tw.js new file mode 100644 index 0000000..bd587eb --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/zh_tw.js @@ -0,0 +1,12 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('flash',{ +title : 'Ž¡€J©Îœs¿è Flash °ÊµeÀÉ', +desc : 'Ž¡€J©Îœs¿è Flash °ÊµeÀÉ', +file : 'Flash °ÊµeÀÉ¡] .swf ¡^', +size : '€j€p', +list : 'Flash °ÊµeÀÉ', +props : 'Flash °ÊµeÀÉÄÝ©Ê', +general : '€@¯ë' +}); diff --git a/includes/tiny_mce/plugins/flash/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/flash/langs/zh_tw_utf8.js new file mode 100644 index 0000000..5161c13 --- /dev/null +++ b/includes/tiny_mce/plugins/flash/langs/zh_tw_utf8.js @@ -0,0 +1,12 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('flash',{ +title : '插入或線茯 Flash 動畫檔', +desc : '插入或線茯 Flash 動畫檔', +file : 'Flash 動畫檔 .swf ', +size : '倧小', +list : 'Flash 動畫檔', +props : 'Flash 動畫檔屬性', +general : '䞀般' +}); diff --git a/includes/tiny_mce/plugins/flash/readme.txt b/includes/tiny_mce/plugins/flash/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/flash/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/fullscreen/editor_plugin.js b/includes/tiny_mce/plugins/fullscreen/editor_plugin.js new file mode 100644 index 0000000..4c6bccd --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('fullscreen','en,sv,cs,fr_ca,zh_cn,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_fullscreen_getInfo(){return{longname:'Fullscreen',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullscreen.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_fullscreen_getControlHTML(control_name){switch(control_name){case "fullscreen":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFullScreen\');return false;';return '';}return "";}function TinyMCE_fullscreen_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceFullScreen":if(tinyMCE.getParam('fullscreen_is_enabled')){window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'),'mceSetContent',false,tinyMCE.getContent(editor_id));top.close();}else{tinyMCE.setWindowArg('editor_id',editor_id);var win=window.open(tinyMCE.baseURL+"/plugins/fullscreen/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);}return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/includes/tiny_mce/plugins/fullscreen/editor_plugin_src.js new file mode 100644 index 0000000..71ea1ff --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/editor_plugin_src.js @@ -0,0 +1,45 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('fullscreen', 'en,sv,cs,fr_ca,zh_cn,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,pl,nl,fr,pt_br'); + +function TinyMCE_fullscreen_getInfo() { + return { + longname : 'Fullscreen', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_fullscreen.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_fullscreen_getControlHTML(control_name) { + switch (control_name) { + case "fullscreen": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceFullScreen\');return false;'; + return ''; + } + + return ""; +} + +function TinyMCE_fullscreen_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceFullScreen": + if (tinyMCE.getParam('fullscreen_is_enabled')) { + // In fullscreen mode + window.opener.tinyMCE.execInstanceCommand(tinyMCE.getParam('fullscreen_editor_id'), 'mceSetContent', false, tinyMCE.getContent(editor_id)); + top.close(); + } else { + tinyMCE.setWindowArg('editor_id', editor_id); + + var win = window.open(tinyMCE.baseURL + "/plugins/fullscreen/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); + } + + return true; + } + + // Pass to next handler in chain + return false; +} + + diff --git a/includes/tiny_mce/plugins/fullscreen/fullscreen.htm b/includes/tiny_mce/plugins/fullscreen/fullscreen.htm new file mode 100644 index 0000000..d85e462 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/fullscreen.htm @@ -0,0 +1,73 @@ + + + {$lang_fullscreen_title} + + + + + + + + + diff --git a/includes/tiny_mce/plugins/fullscreen/images/fullscreen.gif b/includes/tiny_mce/plugins/fullscreen/images/fullscreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..66fa6d92177f171fd42883474b7dd093bd2d339a GIT binary patch literal 198 zcmV;%06G6hNk%w1VH5xq0K*LcGD>2ivBykw!ot@6bd$)Ew*2Dq{%MuzLU-VNrt;$I z{;0?PSAE;|`To-4{r~^~A^8LW000jFEC2ui02BZe000DY@X1N5y*O(ey8oUPG-PQu zh5=L~;SvlX%mSjURO>jy;xC1Q4L8xD48CAu$Z8M;}RUJf0>sOc_ z4h#giNmy{Z(DeG+E>qDAdHB(q-q8pM40A +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +fullscreen_title : 'Pantalla completa', +fullscreen_desc : 'Cambiar a pantalla completa' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/fr.js b/includes/tiny_mce/plugins/fullscreen/langs/fr.js new file mode 100644 index 0000000..912b37e --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/fr.js @@ -0,0 +1,6 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +fullscreen_title : 'Affichage plein écran', +fullscreen_desc : 'Affichage plein écran/normal' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/fullscreen/langs/fr_ca.js b/includes/tiny_mce/plugins/fullscreen/langs/fr_ca.js new file mode 100644 index 0000000..fe86d85 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/fr_ca.js @@ -0,0 +1,6 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +fullscreen_title : 'Mode plein écran', +fullscreen_desc : 'Basculer le mode plein écrans' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/he.js b/includes/tiny_mce/plugins/fullscreen/langs/he.js new file mode 100644 index 0000000..513e0ca --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/he.js @@ -0,0 +1,6 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +fullscreen_title : 'îöá îñê îìà', +fullscreen_desc : 'äçìó îöá îñê îìà' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/hu.js b/includes/tiny_mce/plugins/fullscreen/langs/hu.js new file mode 100644 index 0000000..f135929 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/hu.js @@ -0,0 +1,6 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +fullscreen_title : 'Teljesképernyõs mód', +fullscreen_desc : 'Váltás teljesképernyõs módra' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/is.js b/includes/tiny_mce/plugins/fullscreen/langs/is.js new file mode 100644 index 0000000..ca10ca6 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/is.js @@ -0,0 +1,6 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +fullscreen_title : 'Heilskjár', +fullscreen_desc : 'Skipta í / úr heilskjá' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/nb.js b/includes/tiny_mce/plugins/fullscreen/langs/nb.js new file mode 100644 index 0000000..8c68c35 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/nb.js @@ -0,0 +1,6 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +fullscreen_title : 'Fullskjerm tilstand', +fullscreen_desc : 'Hopp fra/til fullskjermtilstand' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/nl.js b/includes/tiny_mce/plugins/fullscreen/langs/nl.js new file mode 100644 index 0000000..fa19e3f --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/nl.js @@ -0,0 +1,6 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +fullscreen_title : 'Volledig scherm', +fullscreen_desc : 'Volledig scherm aan/uit' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/nn.js b/includes/tiny_mce/plugins/fullscreen/langs/nn.js new file mode 100644 index 0000000..c6ef468 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/nn.js @@ -0,0 +1,6 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +fullscreen_title : 'Fullskjerm tilstand', +fullscreen_desc : 'Hopp fra/til fullskjermtilstand' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/pl.js b/includes/tiny_mce/plugins/fullscreen/langs/pl.js new file mode 100644 index 0000000..51e96e4 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/pl.js @@ -0,0 +1,9 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('',{ +fullscreen_title : 'Tryb pe³noekranowy', +fullscreen_desc : 'Prze³±cz w tryb pe³noekranowy' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/pt_br.js b/includes/tiny_mce/plugins/fullscreen/langs/pt_br.js new file mode 100644 index 0000000..f7e590d --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/pt_br.js @@ -0,0 +1,14 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +fullscreen_title : 'Modo de Janela Inteira (Fullscreen)', +fullscreen_desc : 'Alterar para modo de janela inteira' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/ru.js b/includes/tiny_mce/plugins/fullscreen/langs/ru.js new file mode 100644 index 0000000..9f119c0 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/ru.js @@ -0,0 +1,6 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +fullscreen_title : 'Ïîëíîýêðàííûé ðåæèì', +fullscreen_desc : 'Âêëþ÷èòü ïîëíîýêðàííûé ðåæèì' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js new file mode 100644 index 0000000..7294518 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/ru_KOI8-R.js @@ -0,0 +1,6 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +fullscreen_title : 'ðÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ', +fullscreen_desc : '÷ËÌÀÞÉÔØ ÐÏÌÎÏÜËÒÁÎÎÙÊ ÒÅÖÉÍ' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js new file mode 100644 index 0000000..0c302fe --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/ru_UTF-8.js @@ -0,0 +1,6 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +fullscreen_title : 'ППлМПэкраММый режОЌ', +fullscreen_desc : 'ВключОть пПлМПэкраММый режОЌ' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/sk.js b/includes/tiny_mce/plugins/fullscreen/langs/sk.js new file mode 100644 index 0000000..d0cf501 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/sk.js @@ -0,0 +1,14 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +fullscreen_title : 'Na celú obrazovku', +fullscreen_desc : 'Prepnúť na celú obrazovku' +}); + diff --git a/includes/tiny_mce/plugins/fullscreen/langs/sv.js b/includes/tiny_mce/plugins/fullscreen/langs/sv.js new file mode 100644 index 0000000..dec358e --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/sv.js @@ -0,0 +1,6 @@ +// SV lang variables + +tinyMCE.addToLang('',{ +fullscreen_title : 'Fullskärmsläge', +fullscreen_desc : 'Hoppa från/till fullskärmsläge' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/zh_cn.js b/includes/tiny_mce/plugins/fullscreen/langs/zh_cn.js new file mode 100644 index 0000000..01527b1 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/zh_cn.js @@ -0,0 +1,6 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +fullscreen_title : 'È«ÆÁģʜ', +fullscreen_desc : 'Çл»È«ÆÁģʜ' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/zh_tw.js b/includes/tiny_mce/plugins/fullscreen/langs/zh_tw.js new file mode 100644 index 0000000..400b675 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/zh_tw.js @@ -0,0 +1,7 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +fullscreen_title : '¥þ¿Ã¹õŒÒŠ¡', +fullscreen_desc : 'ÂàŠš¥þ¿Ã¹õŒÒŠ¡' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js new file mode 100644 index 0000000..6b957a7 --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/langs/zh_tw_utf8.js @@ -0,0 +1,7 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +fullscreen_title : '党螢幕暡匏', +fullscreen_desc : '蜉成党螢幕暡匏' +}); diff --git a/includes/tiny_mce/plugins/fullscreen/readme.txt b/includes/tiny_mce/plugins/fullscreen/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/fullscreen/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/iespell/editor_plugin.js b/includes/tiny_mce/plugins/iespell/editor_plugin.js new file mode 100644 index 0000000..9368e44 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('iespell','cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_iespell_getInfo(){return{longname:'IESpell',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_iespell.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_iespell_getControlHTML(control_name){if(control_name=="iespell"&&(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceIESpell\');return false;';return '';}return "";}function TinyMCE_iespell_execCommand(editor_id,element,command,user_interface,value){if(command=="mceIESpell"){try{var ieSpell=new ActiveXObject("ieSpell.ieSpellExtension");ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement);}catch(e){if(e.number==-2146827859){if(confirm(tinyMCE.getLang("lang_iespell_download","",true)))window.open('http://www.iespell.com/download.php','ieSpellDownload','');}else alert("Error Loading ieSpell: Exception "+e.number);}return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/iespell/editor_plugin_src.js b/includes/tiny_mce/plugins/iespell/editor_plugin_src.js new file mode 100644 index 0000000..df170a5 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/editor_plugin_src.js @@ -0,0 +1,49 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('iespell', 'cs,el,en,fr_ca,it,ko,sv,zh_cn,fr,de,pl,pt_br,nl,da,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_iespell_getInfo() { + return { + longname : 'IESpell', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_iespell.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +/** + * Returns the HTML contents of the iespell control. + */ +function TinyMCE_iespell_getControlHTML(control_name) { + // Is it the iespell control and is the brower MSIE. + if (control_name == "iespell" && (tinyMCE.isMSIE && !tinyMCE.isOpera)) { + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceIESpell\');return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the mceIESpell command. + */ +function TinyMCE_iespell_execCommand(editor_id, element, command, user_interface, value) { + // Handle ieSpellCommand + if (command == "mceIESpell") { + try { + var ieSpell = new ActiveXObject("ieSpell.ieSpellExtension"); + ieSpell.CheckDocumentNode(tinyMCE.getInstanceById(editor_id).contentDocument.documentElement); + } catch (e) { + if (e.number == -2146827859) { + if (confirm(tinyMCE.getLang("lang_iespell_download", "", true))) + window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); + } else + alert("Error Loading ieSpell: Exception " + e.number); + } + + return true; + } + + // Pass to next handler in chain + return false; +} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/iespell/images/iespell.gif b/includes/tiny_mce/plugins/iespell/images/iespell.gif new file mode 100644 index 0000000000000000000000000000000000000000..a9a2891891f6c44cb58cec06e1df90154fab728a GIT binary patch literal 124 zcmZ?wbhEHb6k!ly*u=!(3j)h--?(Uy@xY+qK|sTU2^&5zFfb_oWMO1rU}w+)vVkf^ z7#NrxD|X%aXK>0>Hb7yGOru0Qdt8t~Pr`|eUN*M-2T$>5EI)1;e(KzB(FM&H4!CkG acb!zU>toUKL&1g`63e=@%dCAF7_0$Ni7k5o literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/iespell/langs/cs.js b/includes/tiny_mce/plugins/iespell/langs/cs.js new file mode 100644 index 0000000..fe3b535 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/cs.js @@ -0,0 +1,12 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.4 2005/10/18 13:59:42 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +iespell_desc : 'Spustit kontrolu pravopisu', +iespell_download : "ieSpell nedetekován. Klikněte na OK a otevřete stahovací stránku." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/cy.js b/includes/tiny_mce/plugins/iespell/langs/cy.js new file mode 100644 index 0000000..f170bb4 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/cy.js @@ -0,0 +1,7 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Dechrau gwirio sillafu', +iespell_download : "Methwyd canfod ieSpell. Cliciwch OK i fynd i'r dudalen lawrlwytho." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/da.js b/includes/tiny_mce/plugins/iespell/langs/da.js new file mode 100644 index 0000000..d17777f --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/da.js @@ -0,0 +1,7 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +iespell_desc : 'Lav stavekontrol', +iespell_download : "ieSpell kan ikke findes. Klik på OK for at fortsætte til downloadsiden." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/de.js b/includes/tiny_mce/plugins/iespell/langs/de.js new file mode 100644 index 0000000..b8d724b --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/de.js @@ -0,0 +1,7 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Rechtschreibprüfung', +iespell_download : "ieSpell nicht gefunden. Klicken Sie OK, um die Download-Seite aufzurufen." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/el.js b/includes/tiny_mce/plugins/iespell/langs/el.js new file mode 100644 index 0000000..c4d8018 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/el.js @@ -0,0 +1,7 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +iespell_desc : 'Ïñèïãñáöéêüò Ýëåã÷ïò', +iespell_download : "Ôï ðñüãñáììá ieSpell äåí âñÝèçêå. ÐáôÞóôå OK ãéá íá ìåôáâåßôå óôçí éóôïóåëßäá ëÞøçò ôïõ ðñïãñÜììáôïò." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/en.js b/includes/tiny_mce/plugins/iespell/langs/en.js new file mode 100644 index 0000000..119bce9 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/en.js @@ -0,0 +1,7 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Run spell checking', +iespell_download : "ieSpell not detected. Click OK to go to download page." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/es.js b/includes/tiny_mce/plugins/iespell/langs/es.js new file mode 100644 index 0000000..8f680ca --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/es.js @@ -0,0 +1,15 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +iespell_desc : 'Ejecutar corrector ortográfico', +iespell_download : "Corrector ortográfico no detectado. Pulse OK para ir a la página de descarga." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/fr.js b/includes/tiny_mce/plugins/iespell/langs/fr.js new file mode 100644 index 0000000..6846f55 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/fr.js @@ -0,0 +1,7 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +iespell_desc : 'Lancer le vérificateur d\'orthographe', +iespell_download : "Le dictionnaire ieSpell n\'a pas été trouvé.\n\nCliquez sur Ok pour aller au site de téléchargement." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/fr_ca.js b/includes/tiny_mce/plugins/iespell/langs/fr_ca.js new file mode 100644 index 0000000..3585474 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/fr_ca.js @@ -0,0 +1,6 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +iespell_desc : 'Executer le vérificateur d\'orthographe', +iespell_download : "ieSpell n\'a pas été trouvé. Cliquez sur OK pour aller au site de téléchargement." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/he.js b/includes/tiny_mce/plugins/iespell/langs/he.js new file mode 100644 index 0000000..d4a2e2c --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/he.js @@ -0,0 +1,6 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +iespell_desc : 'äôòì áãé÷ú àéåú', +iespell_download : "ìà ðîöà ieSpell. ìçõ òì àéùåø ëãé ìäâéò ìãó ääåøãä." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/hu.js b/includes/tiny_mce/plugins/iespell/langs/hu.js new file mode 100644 index 0000000..92e6ce2 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/hu.js @@ -0,0 +1,7 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Helyesírásellenõrzés indítása', +iespell_download : "ieSpell nem található. Kattints az OK-ra a letöltési oldalhoz." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/is.js b/includes/tiny_mce/plugins/iespell/langs/is.js new file mode 100644 index 0000000..bca7ae2 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/is.js @@ -0,0 +1,7 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +iespell_desc : 'Stafsetningarpúki', +iespell_download : "ieSpell ekki til staðar. Smellið á OK til að sjá niðurhalssíðu." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/it.js b/includes/tiny_mce/plugins/iespell/langs/it.js new file mode 100644 index 0000000..7ec0d49 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/it.js @@ -0,0 +1,7 @@ +// IT lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Avvia il controllo ortografico', +iespell_download : "ieSpell non trovato. Clicca OK per andare alla pagina di download." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/ko.js b/includes/tiny_mce/plugins/iespell/langs/ko.js new file mode 100644 index 0000000..9c75e03 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/ko.js @@ -0,0 +1,7 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'žÂÃã¹ý °Ë»ç œÇÇà', +iespell_download : "ieSpellÀ» ãÀ» Œö ŸøœÀŽÏŽÙ. OKžŠ Ž©ž£žé ŽÙ¿î·Îµå ÆäÀÌÁö·Î À̵¿ÇÕŽÏŽÙ." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/nb.js b/includes/tiny_mce/plugins/iespell/langs/nb.js new file mode 100644 index 0000000..736346f --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/nb.js @@ -0,0 +1,6 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +iespell_desc : 'Kjør rettstavingskontroll', +iespell_download : "ieSpell virker ikke å være installert. Klikk OK for å laste hjem." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/nl.js b/includes/tiny_mce/plugins/iespell/langs/nl.js new file mode 100644 index 0000000..a4563fd --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/nl.js @@ -0,0 +1,6 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +iespell_desc : 'Spellingscontrole', +iespell_download : "ieSpell niet gedetecteerd. Klik op OK om deze te downloaden." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/nn.js b/includes/tiny_mce/plugins/iespell/langs/nn.js new file mode 100644 index 0000000..d056067 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/nn.js @@ -0,0 +1,6 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +iespell_desc : 'Kjør rettstavingskontroll', +iespell_download : "ieSpell virker ikke å være installert. Klikk OK for å laste hjem." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/pl.js b/includes/tiny_mce/plugins/iespell/langs/pl.js new file mode 100644 index 0000000..aa542a6 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/pl.js @@ -0,0 +1,8 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl + +tinyMCE.addToLang('',{ +iespell_desc : 'Uruchom sprawdzanie pisowni', +iespell_download : "Nie wykryto pluginu, kliknij aby przej¶æ do strony z pluginami." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/pt_br.js b/includes/tiny_mce/plugins/iespell/langs/pt_br.js new file mode 100644 index 0000000..b6ad3a4 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/pt_br.js @@ -0,0 +1,14 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +iespell_desc : 'Executar verificação ortográfica', +iespell_download : "Verificador ieSpell não detectado. Click OK para ir à página de download." +}); diff --git a/includes/tiny_mce/plugins/iespell/langs/ru.js b/includes/tiny_mce/plugins/iespell/langs/ru.js new file mode 100644 index 0000000..b3f574d --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/ru.js @@ -0,0 +1,7 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +iespell_desc : 'Çàïóñòèòü ïðîâåðêó îðôîãðàôèè', +iespell_download : "ieSpell íå îáíàðóæåí. íàæìèòå OK, ÷òîáû ïåðåéòè íà ñòðàíèöó çàãðóçêè." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js new file mode 100644 index 0000000..3e064bb --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/ru_KOI8-R.js @@ -0,0 +1,7 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +iespell_desc : 'úÁÐÕÓÔÉÔØ ÐÒÏ×ÅÒËÕ ÏÒÆÏÇÒÁÆÉÉ', +iespell_download : "ieSpell ÎÅ ÏÂÎÁÒÕÖÅÎ. ÎÁÖÍÉÔÅ OK, ÞÔÏÂÙ ÐÅÒÅÊÔÉ ÎÁ ÓÔÒÁÎÉÃÕ ÚÁÇÒÕÚËÉ." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/iespell/langs/ru_UTF-8.js new file mode 100644 index 0000000..a1b247d --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/ru_UTF-8.js @@ -0,0 +1,7 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +iespell_desc : 'ЗапустОть прПверку ПрфПграфОО', +iespell_download : "ieSpell Ме ПбМаружеМ. МажЌОте OK, чтПбы перейтО Ма страМОцу загрузкО." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/sk.js b/includes/tiny_mce/plugins/iespell/langs/sk.js new file mode 100644 index 0000000..305a057 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/sk.js @@ -0,0 +1,14 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +iespell_desc : 'SpustiÅ¥ kontrolu pravopisu', +iespell_download : "ieSpell nedetekovanÜ Kliknite na OK a otvorte stahovaciu stránku." +}); + diff --git a/includes/tiny_mce/plugins/iespell/langs/sv.js b/includes/tiny_mce/plugins/iespell/langs/sv.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/iespell/langs/zh_cn.js b/includes/tiny_mce/plugins/iespell/langs/zh_cn.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/iespell/langs/zh_tw.js b/includes/tiny_mce/plugins/iespell/langs/zh_tw.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js new file mode 100644 index 0000000..0a7b724 --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/langs/zh_tw_utf8.js @@ -0,0 +1,8 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +iespell_desc : '執行拌字檢查', +iespell_download : "無 ieSpell 拌字檢查功胜。點按「確定」埌䞋茉安裝" +}); + diff --git a/includes/tiny_mce/plugins/iespell/readme.txt b/includes/tiny_mce/plugins/iespell/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/iespell/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/inlinepopups/css/inlinepopup.css b/includes/tiny_mce/plugins/inlinepopups/css/inlinepopup.css new file mode 100644 index 0000000..cee335b --- /dev/null +++ b/includes/tiny_mce/plugins/inlinepopups/css/inlinepopup.css @@ -0,0 +1,69 @@ +/* Window classes */ + +.mceWindow { + position: absolute; + left: 0px; + top: 0px; + border: 1px solid black; + background-color: #D4D0C8; +} + +.mceWindowHead { + background-color: #334F8D; + width: 100%; + height: 18px; + cursor: move; + overflow: hidden; +} + +.mceWindowBody { + clear: both; + background-color: white; +} + +.mceWindowStatusbar { + background-color: #D4D0C8; + height: 12px; + border-top: 1px solid black; +} + +.mceWindowTitle { + float: left; + font-family: "MS Sans Serif"; + font-size: 9pt; + font-weight: bold; + line-height: 18px; + color: white; + margin-left: 2px; + overflow: hidden; +} + +.mceWindowHeadTools { + margin-right: 2px; +} + +.mceWindowClose, .mceWindowMinimize, .mceWindowMaximize { + display: block; + float: right; + overflow: hidden; + margin-top: 2px; +} + +.mceWindowClose { + margin-left: 2px; +} + +.mceWindowMinimize { +} + +.mceWindowMaximize { +} + +.mceWindowResize { + display: block; + float: right; + overflow: hidden; + cursor: se-resize; + width: 12px; + height: 12px; +} diff --git a/includes/tiny_mce/plugins/inlinepopups/editor_plugin.js b/includes/tiny_mce/plugins/inlinepopups/editor_plugin.js new file mode 100644 index 0000000..a70f4d7 --- /dev/null +++ b/includes/tiny_mce/plugins/inlinepopups/editor_plugin.js @@ -0,0 +1 @@ +function TinyMCE_inlinepopups_getInfo(){return{longname:'Inline Popups',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_inlinepopups.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};TinyMCE.prototype.orgOpenWindow=TinyMCE.prototype.openWindow;TinyMCE.prototype.openWindow=function(template,args){if(args['inline']!="yes"||tinyMCE.isOpera||tinyMCE.getParam("plugins").indexOf('inlinepopups')==-1){mcWindows.selectedWindow=null;args['mce_inside_iframe']=false;this.orgOpenWindow(template,args);return;}var url,resizable,scrollbars;args['mce_inside_iframe']=true;tinyMCE.windowArgs=args;if(template['file'].charAt(0)!='/'&&template['file'].indexOf('://')==-1)url=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/"+template['file'];else url=template['file'];if(!(width=parseInt(template['width'])))width=320;if(!(height=parseInt(template['height'])))height=200;resizable=(args&&args['resizable'])?args['resizable']:"no";scrollbars=(args&&args['scrollbars'])?args['scrollbars']:"no";height+=18;for(var name in args){if(typeof(args[name])=='function')continue;url=tinyMCE.replaceVar(url,name,escape(args[name]));}var elm=document.getElementById(this.selectedInstance.editorId+'_parent');var pos=tinyMCE.getAbsPosition(elm);pos.absLeft+=Math.round((elm.firstChild.clientWidth/2)-(width/2));pos.absTop+=Math.round((elm.firstChild.clientHeight/2)-(height/2));mcWindows.open(url,mcWindows.idCounter++,"modal=yes,width="+width+",height="+height+",resizable="+resizable+",scrollbars="+scrollbars+",statusbar="+resizable+",left="+pos.absLeft+",top="+pos.absTop);};TinyMCE.prototype.orgCloseWindow=TinyMCE.prototype.closeWindow;TinyMCE.prototype.closeWindow=function(win){if(mcWindows.selectedWindow!=null)mcWindows.selectedWindow.close();else this.orgCloseWindow(win);};TinyMCE.prototype.setWindowTitle=function(win_ref,title){for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(typeof(win)=='function')continue;if(win_ref.name==win.id+"_iframe")window.frames[win.id+"_iframe"].document.getElementById(win.id+'_title').innerHTML=title;}};function MCWindows(){this.settings=new Array();this.windows=new Array();this.isMSIE=(navigator.appName=="Microsoft Internet Explorer");this.isGecko=navigator.userAgent.indexOf('Gecko')!=-1;this.isSafari=navigator.userAgent.indexOf('Safari')!=-1;this.isMac=navigator.userAgent.indexOf('Mac')!=-1;this.isMSIE5_0=this.isMSIE&&(navigator.userAgent.indexOf('MSIE 5.0')!=-1);this.action="none";this.selectedWindow=null;this.lastSelectedWindow=null;this.zindex=100;this.mouseDownScreenX=0;this.mouseDownScreenY=0;this.mouseDownLayerX=0;this.mouseDownLayerY=0;this.mouseDownWidth=0;this.mouseDownHeight=0;this.idCounter=0;};MCWindows.prototype.init=function(settings){this.settings=settings;if(this.isMSIE)this.addEvent(document,"mousemove",mcWindows.eventDispatcher);else this.addEvent(window,"mousemove",mcWindows.eventDispatcher);this.addEvent(document,"mouseup",mcWindows.eventDispatcher);this.doc=document;};MCWindows.prototype.getParam=function(name,default_value){var value=null;value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");return value;};MCWindows.prototype.eventDispatcher=function(e){e=typeof(e)=="undefined"?window.event:e;if(mcWindows.selectedWindow==null)return;if(mcWindows.isGecko&&e.type=="mousedown"){var elm=e.currentTarget;for(var n in mcWindows.windows){var win=mcWindows.windows[n];if(win.headElement==elm||win.resizeElement==elm){win.focus();break;}}}switch(e.type){case "mousemove":mcWindows.selectedWindow.onMouseMove(e);break;case "mouseup":mcWindows.selectedWindow.onMouseUp(e);break;case "mousedown":mcWindows.selectedWindow.onMouseDown(e);break;case "focus":mcWindows.selectedWindow.onFocus(e);break;}};MCWindows.prototype.addEvent=function(obj,name,handler){if(this.isMSIE)obj.attachEvent("on"+name,handler);else obj.addEventListener(name,handler,true);};MCWindows.prototype.cancelEvent=function(e){if(this.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};MCWindows.prototype.parseFeatures=function(opts){opts=opts.toLowerCase();opts=opts.replace(/;/g,",");opts=opts.replace(/[^0-9a-z=,]/g,"");var optionChunks=opts.split(',');var options=new Array();options['left']="10";options['top']="10";options['width']="300";options['height']="300";options['resizable']="yes";options['minimizable']="yes";options['maximizable']="yes";options['close']="yes";options['movable']="yes";options['statusbar']="yes";options['scrollbars']="auto";options['modal']="no";if(opts=="")return options;for(var i=0;i';html+='';html+='';html+='Wrapper iframe';html+='';html+='';html+='';html+='';html+='
';html+='
';html+='
';html+='
';html+='
';html+='
';if(features['statusbar']=="yes"){html+='
';if(features['resizable']=="yes"){if(this.isGecko)html+='
';else html+='
';}html+='
';}html+='
';html+='';html+='';this.createFloatingIFrame(id,features['left'],features['top'],features['width'],features['height'],html);};MCWindows.prototype.setDocumentLock=function(state){if(state){var elm=document.getElementById('mcWindowEventBlocker');if(elm==null){elm=document.createElement("div");elm.id="mcWindowEventBlocker";elm.style.position="absolute";elm.style.left="0px";elm.style.top="0px";document.body.appendChild(elm);}elm.style.display="none";var imgPath=this.getParam("images_path");var width=document.body.clientWidth;var height=document.body.clientHeight;elm.style.width=width;elm.style.height=height;elm.innerHTML='';elm.style.zIndex=mcWindows.zindex-1;elm.style.display="block";}else{var elm=document.getElementById('mcWindowEventBlocker');if(mcWindows.windows.length==0)elm.parentNode.removeChild(elm);else elm.style.zIndex=mcWindows.zindex-1;}};MCWindows.prototype.onLoad=function(name){var win=mcWindows.windows[name];var id="mcWindow_"+name;var wrapperIframe=window.frames[id+"_iframe"].frames[0];var wrapperDoc=window.frames[id+"_iframe"].document;var doc=window.frames[id+"_iframe"].document;var winDiv=document.getElementById("mcWindow_"+name+"_div");var realIframe=window.frames[id+"_iframe"].frames[0];win.id="mcWindow_"+name;win.winElement=winDiv;win.bodyElement=doc.getElementById(id+'_body');win.iframeElement=doc.getElementById(id+'_iframe');win.headElement=doc.getElementById(id+'_head');win.titleElement=doc.getElementById(id+'_title');win.resizeElement=doc.getElementById(id+'_resize');win.containerElement=doc.getElementById(id+'_container');win.left=win.features['left'];win.top=win.features['top'];win.frame=window.frames[id+'_iframe'].frames[0];win.wrapperFrame=window.frames[id+'_iframe'];win.wrapperIFrameElement=document.getElementById(id+"_iframe");mcWindows.addEvent(win.headElement,"mousedown",mcWindows.eventDispatcher);if(win.resizeElement!=null)mcWindows.addEvent(win.resizeElement,"mousedown",mcWindows.eventDispatcher);if(mcWindows.isMSIE){mcWindows.addEvent(realIframe.document,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe.document,"mouseup",mcWindows.eventDispatcher);}else{mcWindows.addEvent(realIframe,"mousemove",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"mouseup",mcWindows.eventDispatcher);mcWindows.addEvent(realIframe,"focus",mcWindows.eventDispatcher);}for(var i=0;i'; + html += ''; + html += ''; + + html += '
'; + html += '
'; + html += '
'; +// html += ' '; +// html += ' '; + html += '
'; + html += '
'; + html += '
'; + + if (features['statusbar'] == "yes") { + html += '
'; + + if (features['resizable'] == "yes") { + if (this.isGecko) + html += '
'; + else + html += '
'; + } + + html += '
'; + } + + html += '
'; + + html += ''; + html += ''; + + // Create iframe + this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html); +}; + +// Blocks the document events by placing a image over the whole document +MCWindows.prototype.setDocumentLock = function(state) { + if (state) { + var elm = document.getElementById('mcWindowEventBlocker'); + if (elm == null) { + elm = document.createElement("div"); + + elm.id = "mcWindowEventBlocker"; + elm.style.position = "absolute"; + elm.style.left = "0px"; + elm.style.top = "0px"; + + document.body.appendChild(elm); + } + + elm.style.display = "none"; + + var imgPath = this.getParam("images_path"); + var width = document.body.clientWidth; + var height = document.body.clientHeight; + + elm.style.width = width; + elm.style.height = height; + elm.innerHTML = ''; + + elm.style.zIndex = mcWindows.zindex-1; + elm.style.display = "block"; + } else { + var elm = document.getElementById('mcWindowEventBlocker'); + + if (mcWindows.windows.length == 0) + elm.parentNode.removeChild(elm); + else + elm.style.zIndex = mcWindows.zindex-1; + } +}; + +// Gets called when wrapper iframe is initialized +MCWindows.prototype.onLoad = function(name) { + var win = mcWindows.windows[name]; + var id = "mcWindow_" + name; + var wrapperIframe = window.frames[id + "_iframe"].frames[0]; + var wrapperDoc = window.frames[id + "_iframe"].document; + var doc = window.frames[id + "_iframe"].document; + var winDiv = document.getElementById("mcWindow_" + name + "_div"); + var realIframe = window.frames[id + "_iframe"].frames[0]; + + // Set window data + win.id = "mcWindow_" + name; + win.winElement = winDiv; + win.bodyElement = doc.getElementById(id + '_body'); + win.iframeElement = doc.getElementById(id + '_iframe'); + win.headElement = doc.getElementById(id + '_head'); + win.titleElement = doc.getElementById(id + '_title'); + win.resizeElement = doc.getElementById(id + '_resize'); + win.containerElement = doc.getElementById(id + '_container'); + win.left = win.features['left']; + win.top = win.features['top']; + win.frame = window.frames[id + '_iframe'].frames[0]; + win.wrapperFrame = window.frames[id + '_iframe']; + win.wrapperIFrameElement = document.getElementById(id + "_iframe"); + + // Add event handlers + mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher); + + if (win.resizeElement != null) + mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher); + + if (mcWindows.isMSIE) { + mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher); + mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher); + } else { + mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher); + mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher); + mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher); + } + + for (var i=0; iutpmhBaYhCPCMFj~25SJyItL8^ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/inlinepopups/images/window_close.gif b/includes/tiny_mce/plugins/inlinepopups/images/window_close.gif new file mode 100644 index 0000000000000000000000000000000000000000..3469e5aea1d1594aded9b9fe41dbf66f7db66e5d GIT binary patch literal 110 zcmZ?wbhEHb6ky8EpFaMT6=+Em0o-!%GKPcq}sebpyqLVpV!VJ~` DxTYg8 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/inlinepopups/images/window_minimize.gif b/includes/tiny_mce/plugins/inlinepopups/images/window_minimize.gif new file mode 100644 index 0000000000000000000000000000000000000000..94f167a4dd150485a7530bdf5d2c9e4dd42f109a GIT binary patch literal 112 zcmZ?wbhEHb6ky';case "inserttime":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertTime\');return false;';return '';}return "";}function TinyMCE_insertdatetime_execCommand(editor_id,element,command,user_interface,value){function addZeros(value,len){value=""+value;if(value.length'; + + case "inserttime": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceInsertTime\');return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the mceInsertDate command. + */ +function TinyMCE_insertdatetime_execCommand(editor_id, element, command, user_interface, value) { + /* Adds zeros infront of value */ + function addZeros(value, len) { + value = "" + value; + + if (value.length < len) { + for (var i=0; i<(len-value.length); i++) + value = "0" + value; + } + + return value; + } + + /* Returns the date object in the specified format */ + function getDateTime(date, format) { + format = tinyMCE.regexpReplace(format, "%D", "%m/%d/%y"); + format = tinyMCE.regexpReplace(format, "%r", "%I:%M:%S %p"); + format = tinyMCE.regexpReplace(format, "%Y", "" + date.getFullYear()); + format = tinyMCE.regexpReplace(format, "%y", "" + date.getYear()); + format = tinyMCE.regexpReplace(format, "%m", addZeros(date.getMonth()+1, 2)); + format = tinyMCE.regexpReplace(format, "%d", addZeros(date.getDate(), 2)); + format = tinyMCE.regexpReplace(format, "%H", "" + addZeros(date.getHours(), 2)); + format = tinyMCE.regexpReplace(format, "%M", "" + addZeros(date.getMinutes(), 2)); + format = tinyMCE.regexpReplace(format, "%S", "" + addZeros(date.getSeconds(), 2)); + format = tinyMCE.regexpReplace(format, "%I", "" + ((date.getHours() + 11) % 12 + 1)); + format = tinyMCE.regexpReplace(format, "%p", "" + (date.getHours() < 12 ? "AM" : "PM")); + format = tinyMCE.regexpReplace(format, "%B", "" + tinyMCE.getLang("lang_inserttime_months_long")[date.getMonth()]); + format = tinyMCE.regexpReplace(format, "%b", "" + tinyMCE.getLang("lang_inserttime_months_short")[date.getMonth()]); + format = tinyMCE.regexpReplace(format, "%A", "" + tinyMCE.getLang("lang_inserttime_day_long")[date.getDay()]); + format = tinyMCE.regexpReplace(format, "%a", "" + tinyMCE.getLang("lang_inserttime_day_short")[date.getDay()]); + format = tinyMCE.regexpReplace(format, "%%", "%"); + + return format; + } + + // Handle commands + switch (command) { + case "mceInsertDate": + tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_dateFormat", tinyMCE.getLang('lang_insertdate_def_fmt')))); + return true; + + case "mceInsertTime": + tinyMCE.execInstanceCommand(editor_id, 'mceInsertContent', false, getDateTime(new Date(), tinyMCE.getParam("plugin_insertdate_timeFormat", tinyMCE.getLang('lang_inserttime_def_fmt')))); + return true; + } + + // Pass to next handler in chain + return false; +} diff --git a/includes/tiny_mce/plugins/insertdatetime/images/insertdate.gif b/includes/tiny_mce/plugins/insertdatetime/images/insertdate.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ad424d3d19b07b05a9a5e6828325dba602bf0ac GIT binary patch literal 287 zcmZ?wbhEHb6k!lyxFW>B%FNo-)U@-!h1l*#K+sgxG=KdOCpWJH7oK&k{F0QClRxK; zUGY6FBdaM3*DEP01;r*^y7l_cpMSIV{WJ1PdiCl@R#_1PZlL&+g^__loIwYq1Y{=z z>zoIweJPpqGFHv=ysdZmz?n>=yO($C_`KCy7oKxXT2e)*CXcnVec1bGEwlY~SW1Ph9k_!1Zx z0ux!;MFks`CnShAGcoZo@HNcp=UBithl#7ca+x@v$Yzn%>>L$UeQJCwVwdu5(%iJ= N=w|H`C)E@gtO1pRV_^UQ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/insertdatetime/images/inserttime.gif b/includes/tiny_mce/plugins/insertdatetime/images/inserttime.gif new file mode 100644 index 0000000000000000000000000000000000000000..6dad3b36d0a89c68b8410a2c11e00b077dc5ad8a GIT binary patch literal 239 zcmZ?wbhEHb6k!lyxFX76WEC`h)AdV_{w3zMwypWp*gG$8(xo+PwyZn(@6)$mn-1NI zPRt6b+BALc^7grBje?3!pS^tO*1wXPzTJBdJ$n1|-`{@@o)HYVf#OdVMg|6P1|5(R zkev*yIS*9(QZnadtXh}zI_|<15m)1lhEqd0Rb*G)$UEe%!DfCXB|P(m22;Dr)fEw{ z0$i#>8, + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d-%m-%Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Insertar fecha', +inserttime_desc : 'Insertar hora', +inserttime_months_long : new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"), +inserttime_months_short : new Array("Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"), +inserttime_day_long : new Array("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"), +inserttime_day_short : new Array("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb", "Dom") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/fa.js b/includes/tiny_mce/plugins/insertdatetime/langs/fa.js new file mode 100644 index 0000000..28990af --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/fa.js @@ -0,0 +1,13 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +dir : 'rtl', +insertdate_desc : '?????? ?????', +inserttime_desc : '?????? ????' +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/fi.js b/includes/tiny_mce/plugins/insertdatetime/langs/fi.js new file mode 100644 index 0000000..c6e504e --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/fi.js @@ -0,0 +1,12 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d.%m.%Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Lisää päivämäärä', +inserttime_desc : 'Lisää kellonaika', +inserttime_months_long : new Array("Tammikuu", "Helmikuu", "Maaliskuu", "Huhtikuu", "Toukokuu", "Kesäkuu", "Heinäkuu", "Elokuu", "Syyskuu", "Lokakuu", "Marraskuu", "Joulukuu"), +inserttime_months_short : new Array("Tammi", "Helmi", "Maalis", "Huhti", "Touko", "Kesä", "Heinä", "Elo", "Syys", "Loka", "Marras", "Joulu"), +inserttime_day_long : new Array("Sunnuntai", "Maanantai", "Tiistai", "Keskiviikko", "Torstai", "Perjantai", "Lauantai"), +inserttime_day_short : new Array("Su", "Ma", "Ti", "Ke", "To", "Pe", "La") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/fr.js b/includes/tiny_mce/plugins/insertdatetime/langs/fr.js new file mode 100644 index 0000000..f7311ed --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/fr.js @@ -0,0 +1,12 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Insérer la date', +inserttime_desc : 'Insérer l\'heure', +inserttime_months_long : new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"), +inserttime_months_short : new Array("Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aoû", "Sep", "Oct", "Nov", "Déc"), +inserttime_day_long : new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"), +inserttime_day_short : new Array("Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/fr_ca.js b/includes/tiny_mce/plugins/insertdatetime/langs/fr_ca.js new file mode 100644 index 0000000..ef288f2 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/fr_ca.js @@ -0,0 +1,10 @@ +// Canadian French lang variables by Virtuelcom + +tinyMCE.addToLang('',{ +insertdate_desc : 'Insérer la date', +inserttime_desc : 'Insérer l\'heure', +inserttime_months_long : new Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"), +inserttime_months_short : new Array("Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aout", "Sep", "Oct", "Nov", "Dec"), +inserttime_day_long : new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"), +inserttime_day_short : new Array("Lun", "Mar", "Mer", "Jeu", "Thu", "Ven", "Sam", "Dim") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/he.js b/includes/tiny_mce/plugins/insertdatetime/langs/he.js new file mode 100644 index 0000000..1d00fd6 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/he.js @@ -0,0 +1,12 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'äëðñ úàøéê', +inserttime_desc : 'äëðñ ùòä', +inserttime_months_long : new Array("éðåàø", "ôáøåàø", "îøõ", "àôøéì", "îàé", "éåðé", "éåìé", "àåëåñè", "ñôèîáø", "àå÷èåáø", "ðåáîáø", "ãöîáø"), +inserttime_months_short : new Array("éðå", "ôáø", "îøõ", "àôø", "îàé", "éåð", "éåì", "àåâ", "ñôè", "àå÷", "ðåá", "ãöî"), +inserttime_day_long : new Array("éåí øàùåï", "éåí ùðé", "éåí ùìéùé", "éåí øáéòé", "éåí çîéùé", "éåí ùéùé", "éåí ùáú", "éåí øàùåï"), +inserttime_day_short : new Array("à'", "á'", "â'", "ã'", "ä'", "å'", "ù'", "à'") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/hu.js b/includes/tiny_mce/plugins/insertdatetime/langs/hu.js new file mode 100644 index 0000000..66c9d38 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/hu.js @@ -0,0 +1,12 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Dátum beszúrása', +inserttime_desc : 'Idõ beszúrása', +inserttime_months_long : new Array("Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December"), +inserttime_months_short : new Array("Jan", "Feb", "Már", "Ápr", "Máj", "Jún", "Júl", "Aug", "Sze", "Okt", "Nov", "Dec"), +inserttime_day_long : new Array("Vasárnap", "Hétfõ", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat", "Vasárnap"), +inserttime_day_short : new Array("Vas", "Hé", "Ke", "Sze", "Csü", "Pén", "Szo", "Vas") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/is.js b/includes/tiny_mce/plugins/insertdatetime/langs/is.js new file mode 100644 index 0000000..e9c981b --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/is.js @@ -0,0 +1,12 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d. %m. %Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Setja inn dagsetningu', +inserttime_desc : 'Setja inn tíma', +inserttime_months_long : new Array("Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"), +inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"), +inserttime_day_long : new Array("Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur", "Sunnudagur"), +inserttime_day_short : new Array("Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau", "Sun") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/it.js b/includes/tiny_mce/plugins/insertdatetime/langs/it.js new file mode 100644 index 0000000..6b86459 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/it.js @@ -0,0 +1,12 @@ +// IT lang variables + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Inserisci data', +inserttime_desc : 'Inserisci ora', +inserttime_months_long : new Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"), +inserttime_months_short : new Array("Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"), +inserttime_day_long : new Array("Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato", "Domenica"), +inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/ko.js b/includes/tiny_mce/plugins/insertdatetime/langs/ko.js new file mode 100644 index 0000000..cedaeaa --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/ko.js @@ -0,0 +1,12 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : '³¯Â¥ ³Ö±â', +inserttime_desc : 'œÃ°£ ³Ö±â', +inserttime_months_long : new Array("1¿ù", "2¿ù", "3¿ù", "4¿ù", "5¿ù", "6¿ù", "7¿ù", "8¿ù", "9¿ù", "10¿ù", "11¿ù", "12¿ù"), +inserttime_months_short : new Array("1¿ù", "2¿ù", "3¿ù", "4¿ù", "5¿ù", "6¿ù", "7¿ù", "8¿ù", "9¿ù", "10¿ù", "11¿ù", "12¿ù"), +inserttime_day_long : new Array("ÀÏ¿äÀÏ", "¿ù¿äÀÏ", "È­¿äÀÏ", "Œö¿äÀÏ", "žñ¿äÀÏ", "±Ý¿äÀÏ", "Åä¿äÀÏ", "ÀÏ¿äÀÏ"), +inserttime_day_short : new Array("ÀÏ", "¿ù", "È­", "Œö", "žñ", "±Ý", "Åä", "ÀÏ") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/nb.js b/includes/tiny_mce/plugins/insertdatetime/langs/nb.js new file mode 100644 index 0000000..3b19236 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/nb.js @@ -0,0 +1,12 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Lim inn dato', +inserttime_desc : 'Lim inn tid', +inserttime_months_long : new Array("Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"), +inserttime_months_short : new Array("Jan","Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"), +inserttime_day_long : new Array("Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag", "Søndag"), +inserttime_day_short : new Array("Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør", "Søn") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/nl.js b/includes/tiny_mce/plugins/insertdatetime/langs/nl.js new file mode 100644 index 0000000..b0f569c --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/nl.js @@ -0,0 +1,12 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d-%m-%Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Datum invoegen', +inserttime_desc : 'Tijd invoegen', +inserttime_months_long : new Array("januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"), +inserttime_months_short : new Array("jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "oct", "nov", "dec"), +inserttime_day_long : new Array("zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag", "zondag"), +inserttime_day_short : new Array("zo", "ma", "di", "wo", "do", "vr", "za", "zo") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/nn.js b/includes/tiny_mce/plugins/insertdatetime/langs/nn.js new file mode 100644 index 0000000..956efbc --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/nn.js @@ -0,0 +1,12 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Lim inn dato', +inserttime_desc : 'Lim inn tid', +inserttime_months_long : new Array("Januar", "Februar", "Mars", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Desember"), +inserttime_months_short : new Array("Jan","Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"), +inserttime_day_long : new Array("Sundag", "Mandag", "Tysdag", "Onsdag", "Torsdag", "Fredag", "Laurdag", "Sundag"), +inserttime_day_short : new Array("Sun", "Man", "Tys", "Ons", "Tor", "Fre", "Laur", "Sun") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/pl.js b/includes/tiny_mce/plugins/insertdatetime/langs/pl.js new file mode 100644 index 0000000..52e6149 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/pl.js @@ -0,0 +1,15 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Wstaw aktualn± datê', +inserttime_desc : 'Wstaw aktualny czas', +inserttime_months_long : new Array("Styczeñ", "Luty", "Marzec", "Kwiecieñ", "Maj", "Czerwiec", "Lipiec", "Sierpieñ", "Wrzesieñ", "PaŒdziernik", "Listopad", "Grudzieñ"), +inserttime_months_short : new Array("Sty", "Lut", "Mar", "Kwi", "Maj", "Czer", "Lip", "Sier", "Wrze", "PaŒ", "List", "Grudz"), +inserttime_day_long : new Array("Niedziela", "Poniedzia³ek", "Wtorek", "Šroda", "Czwartek", "Pi±tek", "Sobota", "Niedziela"), +inserttime_day_short : new Array("Nie", "Pon", "Wto", "Šro", "Czw", "Pi±", "Sob", "Nie") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/pt_br.js b/includes/tiny_mce/plugins/insertdatetime/langs/pt_br.js new file mode 100644 index 0000000..3e7b293 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/pt_br.js @@ -0,0 +1,20 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d/%m/%y', +inserttime_def_fmt : '%H:%M:%S hs', +insertdate_desc : 'Inserir data', +inserttime_desc : 'Inserir hora', +inserttime_months_long : new Array("Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"), +inserttime_months_short : new Array("Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"), +inserttime_day_long : new Array("Domingo", "Segunda-Feira", "Terça-Feira", "Quarta-Feira", "Quinta-Feira", "Sexta-Feira", "Sábado", "Domingo"), +inserttime_day_short : new Array("Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sab", "Dom") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/ru.js b/includes/tiny_mce/plugins/insertdatetime/langs/ru.js new file mode 100644 index 0000000..fb07a7c --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/ru.js @@ -0,0 +1,12 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d %m %Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Âñòàâèòü äàòó', +inserttime_desc : 'Âñòàâèòü âðåìÿ', +inserttime_months_long : new Array("ÿíâàðÿ", "ôåâðàëÿ", "ìàðòà", "àïðåëÿ", "ìàÿ", "èþíÿ", "èþëÿ", "àâãóñòà", "ñåíòÿáðÿ", "îêòÿáðÿ", "íîÿáðÿ", "äåêàáðÿ"), +inserttime_months_short : new Array("ÿíâ", "ôåâ", "ìàðò", "àïð", "ìàé", "èþíü", "èþëü", "àâã", "ñåíò", "îêò", "íáð", "äåê"), +inserttime_day_long : new Array("âîñêðåñåíüå", "ïîíåäåëüíèê", "âòîðíèê", "ñðåäà", "÷åòâåðã", "ïÿòíèöà", "ñóááîòà", "âîñêðåñåíüå"), +inserttime_day_short : new Array("âñê", "ïí", "âò", "ñð", "÷òâ", "ïòí", "ñá", "âñê") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js new file mode 100644 index 0000000..a59d279 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/ru_KOI8-R.js @@ -0,0 +1,12 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d %m %Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : '÷ÓÔÁ×ÉÔØ ÄÁÔÕ', +inserttime_desc : '÷ÓÔÁ×ÉÔØ ×ÒÅÍÑ', +inserttime_months_long : new Array("ÑÎ×ÁÒÑ", "ÆÅ×ÒÁÌÑ", "ÍÁÒÔÁ", "ÁÐÒÅÌÑ", "ÍÁÑ", "ÉÀÎÑ", "ÉÀÌÑ", "Á×ÇÕÓÔÁ", "ÓÅÎÔÑÂÒÑ", "ÏËÔÑÂÒÑ", "ÎÏÑÂÒÑ", "ÄÅËÁÂÒÑ"), +inserttime_months_short : new Array("ÑÎ×", "ÆÅ×", "ÍÁÒÔ", "ÁÐÒ", "ÍÁÊ", "ÉÀÎØ", "ÉÀÌØ", "Á×Ç", "ÓÅÎÔ", "ÏËÔ", "ÎÂÒ", "ÄÅË"), +inserttime_day_long : new Array("×ÏÓËÒÅÓÅÎØÅ", "ÐÏÎÅÄÅÌØÎÉË", "×ÔÏÒÎÉË", "ÓÒÅÄÁ", "ÞÅÔ×ÅÒÇ", "ÐÑÔÎÉÃÁ", "ÓÕÂÂÏÔÁ", "×ÏÓËÒÅÓÅÎØÅ"), +inserttime_day_short : new Array("×ÓË", "ÐÎ", "×Ô", "ÓÒ", "ÞÔ×", "ÐÔÎ", "ÓÂ", "×ÓË") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js new file mode 100644 index 0000000..411c2f7 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/ru_UTF-8.js @@ -0,0 +1,12 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%d %m %Y', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'ВставОть Ўату', +inserttime_desc : 'ВставОть вреЌя', +inserttime_months_long : new Array("яМваря", "февраля", "Ќарта", "апреля", "Ќая", "ОюМя", "Оюля", "августа", "сеМтября", "Пктября", "МПября", "Ўекабря"), +inserttime_months_short : new Array("яМв", "фев", "Ќарт", "апр", "Ќай", "ОюМь", "Оюль", "авг", "сеМт", "Пкт", "Мбр", "Ўек"), +inserttime_day_long : new Array("вПскресеМье", "пПМеЎельМОк", "втПрМОк", "среЎа", "четверг", "пятМОца", "суббПта", "вПскресеМье"), +inserttime_day_short : new Array("вск", "пМ", "вт", "ср", "чтв", "птМ", "сб", "вск") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/sk.js b/includes/tiny_mce/plugins/insertdatetime/langs/sk.js new file mode 100644 index 0000000..56cb2e2 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/sk.js @@ -0,0 +1,20 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'VloÅŸiÅ¥ dátum', +inserttime_desc : 'VloÅŸiÅ¥ čas', +inserttime_months_long : new Array('Január','Február','Marec','Apríl','Máj','Jún','Júl','August','September','Október','November','December'), +inserttime_months_short : new Array('Jan','Feb','Mar','Apr','Máj','Jún','Júl','Aug','Sep','Okt','Nov','Dec'), +inserttime_day_long : new Array('NedeÄŸa','Pondelok','Utorok','Streda','Å tvrtok','Piatok','Sobota','NedeÄŸa'), +inserttime_day_short : new Array('Ne','Po','Ut','St','Å t','Pi','So','Ne') +}); + diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/sv.js b/includes/tiny_mce/plugins/insertdatetime/langs/sv.js new file mode 100644 index 0000000..29c9e4d --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/sv.js @@ -0,0 +1,12 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Klistra in datum', +inserttime_desc : 'Klistra in tid', +inserttime_months_long : new Array("Januari", "Februari", "Mars", "April", "Maj", "Juni", "Juli", "Augusti", "September", "Oktober", "November", "December"), +inserttime_months_short : new Array("Jan","Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"), +inserttime_day_long : new Array("Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag", "Söndag"), +inserttime_day_short : new Array("Sön", "Mån", "Tis", "Ons", "Tor", "Fre", "Lör", "Sön") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/zh_cn.js b/includes/tiny_mce/plugins/insertdatetime/langs/zh_cn.js new file mode 100644 index 0000000..920d90e --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/zh_cn.js @@ -0,0 +1,12 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : '²åÈ뵱ǰÈÕÆÚ', +inserttime_desc : '²åÈ뵱ǰʱŒä', +inserttime_months_long : new Array("Ò»Ô·Ý", "¶þÔ·Ý", "ÈýÔ·Ý", "ËÄÔ·Ý", "ÎåÔ·Ý", "ÁùÔ·Ý", "ÆßÔ·Ý", "°ËÔ·Ý", "ŸÅÔ·Ý", "ʮԷÝ", "ʮһÔ·Ý", "Ê®¶þÔ·Ý"), +inserttime_months_short : new Array("Ò»ÔÂ", "¶þÔÂ", "ÈýÔÂ", "ËÄÔÂ", "ÎåÔÂ", "ÁùÔÂ", "ÆßÔÂ", "°ËÔÂ", "ŸÅÔÂ", "Ê®ÔÂ", "ʮһÔÂ", "Ê®¶þÔÂ"), +inserttime_day_long : new Array("ÐÇÆÚÈÕ", "ÐÇÆÚÒ»", "ÐÇÆÚ¶þ", "ÐÇÆÚÈý", "ÐÇÆÚËÄ", "ÐÇÆÚÎå", "ÐÇÆÚÁù", "ÐÇÆÚÈÕ"), +inserttime_day_short : new Array("ÐÇÆÚÈÕ", "ÐÇÆÚÒ»", "ÐÇÆÚ¶þ", "ÐÇÆÚÈý", "ÐÇÆÚËÄ", "ÐÇÆÚÎå", "ÐÇÆÚÁù", "ÐÇÆÚÈÕ") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw.js b/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw.js new file mode 100644 index 0000000..98dcbb7 --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw.js @@ -0,0 +1,13 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y-%m-%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : 'Ž¡€J€éŽÁ', +inserttime_desc : 'Ž¡€J®É¶¡', +inserttime_months_long : new Array("€@€ë", "€G€ë", "€T€ë", "¥|€ë", "€­€ë", "€»€ë", "€C€ë", "€K€ë", "€E€ë", "€Q€ë", "€Q€@€ë", "€Q€G€ë"), +inserttime_months_short : new Array("€@", "€G", "€T", "¥|", "€­", "€»", "€C", "€K", "€E", "€Q", "€Q€@", "€Q€G"), +inserttime_day_long : new Array("¬PŽÁ€é", "¬PŽÁ€@", "¬PŽÁ€G", "¬PŽÁ€T", "¬PŽÁ¥|", "¬PŽÁ€­", "¬PŽÁ€»", "¬PŽÁ€é"), +inserttime_day_short : new Array("€é", "€@", "€G", "€T", "¥|", "€­", "€»", "€é") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js new file mode 100644 index 0000000..ea7be8e --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/langs/zh_tw_utf8.js @@ -0,0 +1,13 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +insertdate_def_fmt : '%Y/%m/%d', +inserttime_def_fmt : '%H:%M:%S', +insertdate_desc : '插入日期', +inserttime_desc : '插入時間', +inserttime_months_long : new Array("䞀月", "二月", "䞉月", "四月", "五月", "六月", "䞃月", "八月", "九月", "十月", "十䞀月", "十二月"), +inserttime_months_short : new Array("侀", "二", "侉", "四", "五", "六", "䞃", "八", "九", "十", "十䞀", "十二"), +inserttime_day_long : new Array("星期日", "星期䞀", "星期二", "星期䞉", "星期四", "星期五", "星期六", "星期日"), +inserttime_day_short : new Array("日", "侀", "二", "侉", "四", "五", "六", "日") +}); diff --git a/includes/tiny_mce/plugins/insertdatetime/readme.txt b/includes/tiny_mce/plugins/insertdatetime/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/insertdatetime/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/noneditable/css/noneditable.css b/includes/tiny_mce/plugins/noneditable/css/noneditable.css new file mode 100644 index 0000000..2de3b8f --- /dev/null +++ b/includes/tiny_mce/plugins/noneditable/css/noneditable.css @@ -0,0 +1,17 @@ +/* This is the CSS file for the noneditable elements plugin */ + +.mceItemEditable { + /*border: 1px dotted #0000cc;*/ + -moz-user-focus: none; + -moz-user-input: auto; + -moz-user-modify: auto; + -moz-user-select: text; +} + +.mceItemNonEditable { + /*border: 1px dotted #cc0000;*/ + -moz-user-focus: ignore; + /*-moz-user-input: disabled;*/ + -moz-user-modify: read-only; + -moz-user-select: all; +} diff --git a/includes/tiny_mce/plugins/noneditable/editor_plugin.js b/includes/tiny_mce/plugins/noneditable/editor_plugin.js new file mode 100644 index 0000000..37beb47 --- /dev/null +++ b/includes/tiny_mce/plugins/noneditable/editor_plugin.js @@ -0,0 +1 @@ +function TinyMCE_noneditable_getInfo(){return{longname:'Non editable elements',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_noneditable.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_noneditable_initInstance(inst){tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/noneditable/css/noneditable.css");if(tinyMCE.isMSIE5_0)tinyMCE.settings['plugins']=tinyMCE.settings['plugins'].replace(/noneditable/gi,'Noneditable');if(tinyMCE.isGecko){tinyMCE.addEvent(inst.getDoc(),"keyup",TinyMCE_noneditable_fixKeyUp);}}function TinyMCE_noneditable_fixKeyUp(e){var inst=tinyMCE.selectedInstance;var sel=inst.getSel();var rng=inst.getRng();var an=sel.anchorNode;if((e.keyCode==38||e.keyCode==37||e.keyCode==40||e.keyCode==39)&&(elm=TinyMCE_noneditable_isNonEditable(an))!=null){rng=inst.getDoc().createRange();rng.selectNode(elm);rng.collapse(true);sel.removeAllRanges();sel.addRange(rng);tinyMCE.cancelEvent(e);}}function TinyMCE_noneditable_selectAll(e){var inst=tinyMCE.selectedInstance;var sel=inst.getSel();var doc=inst.getDoc();if((elm=TinyMCE_noneditable_isNonEditable(sel.focusNode))!=null){inst.selectNode(elm,false);tinyMCE.cancelEvent(e);return;}if((elm=TinyMCE_noneditable_isNonEditable(sel.anchorNode))!=null){inst.selectNode(elm,false);tinyMCE.cancelEvent(e);return;}}function TinyMCE_noneditable_isNonEditable(elm){var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");if(!elm)return;do{var className=elm.className?elm.className:"";if(className.indexOf(editClass)!=-1)return null;if(className.indexOf(nonEditClass)!=-1)return elm;}while(elm=elm.parentNode);return null;}function TinyMCE_noneditable_cleanup(type,content,inst){switch(type){case "insert_to_editor_dom":var nodes=tinyMCE.getNodeTree(content,new Array(),1);var editClass=tinyMCE.getParam("noneditable_editable_class","mceItemEditable");var nonEditClass=tinyMCE.getParam("noneditable_noneditable_class","mceItemNonEditable");for(var i=0;i","gi"),'<$1class="$2$3$4" contenteditable="true"$5>');content=content.replace(new RegExp("<(.*?)class=\"(.*?)("+nonEditClass+")(.*?)\"(.*?)>","gi"),'<$1class="$2$3$4" contenteditable="false"$5>');}break;case "get_from_editor_dom":if(tinyMCE.getParam("noneditable_leave_contenteditable",false)){var nodes=tinyMCE.getNodeTree(content,new Array(),1);for(var i=0;i", "gi"), '<$1class="$2$3$4" contenteditable="true"$5>'); + content = content.replace(new RegExp("<(.*?)class=\"(.*?)(" + nonEditClass + ")(.*?)\"(.*?)>", "gi"), '<$1class="$2$3$4" contenteditable="false"$5>'); + } + + break; + + case "get_from_editor_dom": + if (tinyMCE.getParam("noneditable_leave_contenteditable", false)) { + var nodes = tinyMCE.getNodeTree(content, new Array(), 1); + + for (var i=0; i + + blank_page + + + + + + + + + diff --git a/includes/tiny_mce/plugins/paste/css/blank.css b/includes/tiny_mce/plugins/paste/css/blank.css new file mode 100644 index 0000000..89b0303 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/css/blank.css @@ -0,0 +1,13 @@ +body { + background-color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} diff --git a/includes/tiny_mce/plugins/paste/css/pasteword.css b/includes/tiny_mce/plugins/paste/css/pasteword.css new file mode 100644 index 0000000..77685fd --- /dev/null +++ b/includes/tiny_mce/plugins/paste/css/pasteword.css @@ -0,0 +1,3 @@ +.sourceIframe { + border: 1px solid #808080; +} diff --git a/includes/tiny_mce/plugins/paste/editor_plugin.js b/includes/tiny_mce/plugins/paste/editor_plugin.js new file mode 100644 index 0000000..ffc2f8d --- /dev/null +++ b/includes/tiny_mce/plugins/paste/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('paste','en,sv,cs,zh_cn,fr_ca,da,he,nb,de,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,pl,nl,fr,pt_br');function TinyMCE_paste_getInfo(){return{longname:'Paste text/word',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_paste.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_paste_initInstance(inst){if(tinyMCE.isMSIE&&tinyMCE.getParam("paste_auto_cleanup_on_paste",false))tinyMCE.addEvent(inst.getBody(),"paste",TinyMCE_paste_handleEvent);}function TinyMCE_paste_handleEvent(e){switch(e.type){case "paste":var html=TinyMCE_paste__clipboardHTML();tinyMCE.execCommand('delete');if(html&&html.length>0)tinyMCE.execCommand('mcePasteWord',false,html);tinyMCE.cancelEvent(e);return false;}return true;}function TinyMCE_paste_getControlHTML(control_name){switch(control_name){case "pastetext":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);return false;';return '';case "pasteword":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);return false;';return '';case "selectall":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');return false;';return '';}return '';}function TinyMCE_paste_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePasteText":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false))TinyMCE_paste__insertText(clipboardData.getData("Text"),true);else{var template=new Array();template['file']='../../plugins/paste/pastetext.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'});}}else TinyMCE_paste__insertText(value['html'],value['linebreaks']);return true;case "mcePasteWord":if(user_interface){if((tinyMCE.isMSIE&&!tinyMCE.isOpera)&&!tinyMCE.getParam('paste_use_dialog',false)){var html=TinyMCE_paste__clipboardHTML();if(html&&html.length>0)TinyMCE_paste__insertWordContent(html);}else{var template=new Array();template['file']='../../plugins/paste/pasteword.htm';template['width']=450;template['height']=400;var plain_text="";tinyMCE.openWindow(template,{editor_id:editor_id,plain_text:plain_text,resizable:"yes",scrollbars:"no",inline:"yes",mceDo:'insert'});}}else TinyMCE_paste__insertWordContent(value);return true;case "mceSelectAll":tinyMCE.execInstanceCommand(editor_id,'selectall');return true;}return false;}function TinyMCE_paste__insertText(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(tinyMCE.getParam("paste_create_paragraphs",true)){var rl=tinyMCE.getParam("paste_replace_list",'\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i

","gi");content=tinyMCE.regexpReplace(content,"\r\r","

","gi");content=tinyMCE.regexpReplace(content,"\n\n","

","gi");if((pos=content.indexOf('

'))!=-1){tinyMCE.execCommand("Delete");var node=tinyMCE.selectedInstance.getFocusElement();var breakElms=new Array();do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="

";before+=content.substring(0,pos);for(var i=0;i";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="

";content=before+content.substring(pos+7)+after;}}if(tinyMCE.getParam("paste_create_linebreaks",true)){content=tinyMCE.regexpReplace(content,"\r\n","
","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi");}}tinyMCE.execCommand("mceInsertRawHTML",false,content);}}function TinyMCE_paste__insertWordContent(content){if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);var rl=tinyMCE.getParam("paste_replace_list",'\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i(.*?)<\/p>','gi'),'

$1

');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)
","gi"),"

"+middot+"$1

");content=content.replace(new RegExp('','gi'),""+bull);content=content.replace(/<\/o:p>/gi,"");content=content.replace(new RegExp('
]*>/gi,"");content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(tinyMCE.getParam("paste_strip_class_attributes","all")){case "all":content=content.replace(/<(\w[^>]*)class=([^|>]*)([^>]*)/gi,"<$1$3");break;case "mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+TinyMCE_paste__reEscape(""+document.location)+'','gi'),'href="'+tinyMCE.settings['document_base_url']);content=content.replace(/<(\w[^>]*)lang=([^|>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/--page break--\s*

 <\/p>/gi,"");content=content.replace(/--page break--/gi,"");if(!tinyMCE.settings['force_p_newlines']){content=content.replace('','','gi');content=content.replace('

','

','gi');}if(!tinyMCE.isMSIE&&!tinyMCE.settings['force_p_newlines']){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(tinyMCE.getParam("paste_convert_middot_lists",true)){var div=document.createElement("div");div.innerHTML=content;var className=tinyMCE.getParam("paste_unindented_list_class","unIndentedList");while(TinyMCE_paste_convertMiddots(div,"--list--"));while(TinyMCE_paste_convertMiddots(div,middot,className));while(TinyMCE_paste_convertMiddots(div,bull));content=div.innerHTML;}if(tinyMCE.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/ <\/h[1-6]>/gi,'

  

');content=content.replace(//gi,'

');content=content.replace(/<\/h[1-6]>/gi,'

');content=content.replace(/ <\/b>/gi,'  ');content=content.replace(/^( )*/gi,'');}content=content.replace(/--list--/gi,"");tinyMCE.execCommand("mceInsertContent",false,content);tinyMCE.execCommand("mceCleanup");}}function TinyMCE_paste__reEscape(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i 0) + tinyMCE.execCommand('mcePasteWord', false, html); + + tinyMCE.cancelEvent(e); + return false; + } + + return true; +} + +function TinyMCE_paste_getControlHTML(control_name) { + switch (control_name) { + case "pastetext": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteText\', true);return false;'; + return ''; + + case "pasteword": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePasteWord\', true);return false;'; + return ''; + + case "selectall": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSelectAll\');return false;'; + return ''; + } + + return ''; +} + +function TinyMCE_paste_execCommand(editor_id, element, command, user_interface, value) { + switch (command) { + case "mcePasteText": + if (user_interface) { + if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) + TinyMCE_paste__insertText(clipboardData.getData("Text"), true); + else { + var template = new Array(); + template['file'] = '../../plugins/paste/pastetext.htm'; // Relative to theme + template['width'] = 450; + template['height'] = 400; + var plain_text = ""; + tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); + } + } else + TinyMCE_paste__insertText(value['html'], value['linebreaks']); + + return true; + + case "mcePasteWord": + if (user_interface) { + if ((tinyMCE.isMSIE && !tinyMCE.isOpera) && !tinyMCE.getParam('paste_use_dialog', false)) { + var html = TinyMCE_paste__clipboardHTML(); + + if (html && html.length > 0) + TinyMCE_paste__insertWordContent(html); + } else { + var template = new Array(); + template['file'] = '../../plugins/paste/pasteword.htm'; // Relative to theme + template['width'] = 450; + template['height'] = 400; + var plain_text = ""; + tinyMCE.openWindow(template, {editor_id : editor_id, plain_text: plain_text, resizable : "yes", scrollbars : "no", inline : "yes", mceDo : 'insert'}); + } + } else + TinyMCE_paste__insertWordContent(value); + + return true; + + case "mceSelectAll": + tinyMCE.execInstanceCommand(editor_id, 'selectall'); + return true; + + } + + // Pass to next handler in chain + return false; +} + +function TinyMCE_paste__insertText(content, bLinebreaks) { + if (content && content.length > 0) { + if (bLinebreaks) { + // Special paragraph treatment + if (tinyMCE.getParam("paste_create_paragraphs", true)) { + var rl = tinyMCE.getParam("paste_replace_list", '\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); + for (var i=0; i

", "gi"); + content = tinyMCE.regexpReplace(content, "\r\r", "

", "gi"); + content = tinyMCE.regexpReplace(content, "\n\n", "

", "gi"); + + // Has paragraphs + if ((pos = content.indexOf('

')) != -1) { + tinyMCE.execCommand("Delete"); + + var node = tinyMCE.selectedInstance.getFocusElement(); + + // Get list of elements to break + var breakElms = new Array(); + + do { + if (node.nodeType == 1) { + // Don't break tables and break at body + if (node.nodeName == "TD" || node.nodeName == "BODY") + break; + + breakElms[breakElms.length] = node; + } + } while(node = node.parentNode); + + var before = "", after = "

"; + before += content.substring(0, pos); + + for (var i=0; i"; + after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; + } + + before += "

"; + content = before + content.substring(pos+7) + after; + } + } + + if (tinyMCE.getParam("paste_create_linebreaks", true)) { + content = tinyMCE.regexpReplace(content, "\r\n", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\r", "
", "gi"); + content = tinyMCE.regexpReplace(content, "\n", "
", "gi"); + } + } + + tinyMCE.execCommand("mceInsertRawHTML", false, content); + } +} + +function TinyMCE_paste__insertWordContent(content) { + if (content && content.length > 0) { + // Cleanup Word content + var bull = String.fromCharCode(8226); + var middot = String.fromCharCode(183); + + var rl = tinyMCE.getParam("paste_replace_list", '\u2122,TM,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(','); + for (var i=0; i(.*?)<\/p>', 'gi'), '

$1

'); + } + + content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--"); + content = content.replace(new RegExp(bull + "(.*?)
", "gi"), "

" + middot + "$1

"); + content = content.replace(new RegExp('', 'gi'), "" + bull); // Covert to bull list + content = content.replace(/<\/o:p>/gi, ""); + content = content.replace(new RegExp('
]*>/gi, ""); + content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3"); + content = content.replace(/<\/?font[^>]*>/gi, ""); + + // Strips class attributes. + switch (tinyMCE.getParam("paste_strip_class_attributes", "all")) { + case "all": + content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3"); + break; + + case "mso": + content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3"); + break; + } + + content = content.replace(new RegExp('href="?' + TinyMCE_paste__reEscape("" + document.location) + '', 'gi'), 'href="' + tinyMCE.settings['document_base_url']); + content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3"); + content = content.replace(/<\\?\?xml[^>]*>/gi, ""); + content = content.replace(/<\/?\w+:[^>]*>/gi, ""); + content = content.replace(/-- page break --\s*

 <\/p>/gi, ""); // Remove pagebreaks + content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks + +// content = content.replace(/\/? */gi, "");   +// content = content.replace(/

 <\/p>/gi, ''); + + if (!tinyMCE.settings['force_p_newlines']) { + content = content.replace('', '' ,'gi'); + content = content.replace('

', '

' ,'gi'); + } + + if (!tinyMCE.isMSIE && !tinyMCE.settings['force_p_newlines']) { + content = content.replace(/<\/?p[^>]*>/gi, ""); + } + + content = content.replace(/<\/?div[^>]*>/gi, ""); + + // Convert all middlot lists to UL lists + if (tinyMCE.getParam("paste_convert_middot_lists", true)) { + var div = document.createElement("div"); + div.innerHTML = content; + + // Convert all middot paragraphs to li elements + var className = tinyMCE.getParam("paste_unindented_list_class", "unIndentedList"); + + while (TinyMCE_paste_convertMiddots(div, "--list--")) ; // bull + while (TinyMCE_paste_convertMiddots(div, middot, className)) ; // Middot + while (TinyMCE_paste_convertMiddots(div, bull)) ; // bull + + content = div.innerHTML; + } + + // Replace all headers with strong and fix some other issues + if (tinyMCE.getParam("paste_convert_headers_to_strong", false)) { + content = content.replace(/ <\/h[1-6]>/gi, '

  

'); + content = content.replace(//gi, '

'); + content = content.replace(/<\/h[1-6]>/gi, '

'); + content = content.replace(/ <\/b>/gi, '  '); + content = content.replace(/^( )*/gi, ''); + } + + content = content.replace(/--list--/gi, ""); // Remove --list-- + + // Insert cleaned content + tinyMCE.execCommand("mceInsertContent", false, content); + tinyMCE.execCommand("mceCleanup"); // Do normal cleanup + } +} + +function TinyMCE_paste__reEscape(s) { + var l = "?.\\*[](){}+^$:"; + var o = ""; + + for (var i=0; i0ondXNk%w1VH5xq0Mrx!1_B0_axV75Hbzor!NSXCdX{^Irr^|uM>8k3npWTE z_STXHS!s#*>!gx|Yo@ZsW>!X~or(6f8HSR!`Stns%~QLpkDHB#_S}MbXH&+{=9Zzh z?#yQR^0wxx1^@s6A^8LW0018VEC2ui02BZe000G};3tk`X`X1RuAgN^Z0kBrb7aot zpjKB$4aY6Okz`JhPDhA2R1%QD;%Mpx9h=D{J24ar3{>0WqA)oAG#Wz^+%kwxLXub< z?1lt;BzPh$atCz>8V3d!dm?>*9R(B<6dDo(2@MAWZAKl9j~5yS02%-jm?It;n*|UH x69x?u000uCBpwzJxT_PPyBcT!B@7V}4-dX-X}~EO7|jFE1FA&_VoEyR91$H zhF*o+yUXv_-t_+d{r~^~A^8LW000jFEC2ui02BZe000Df@X1N5y*TU5>o7+Heg`=$ zM>Vb`J5+6XI1YlG<>HNl6DSIVBbTDA90dXakZ|A{FcP9bO8^|GhK^#QC9Oj(LshaR z2ng_D!6;5z$V3ouMKH9x8G>#F1jS?n3^ffjGze^C6ft%K2nKhF0(nntVhjR`9h;n; H5)lA9u4PUG literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/paste/jscripts/pastetext.js b/includes/tiny_mce/plugins/paste/jscripts/pastetext.js new file mode 100644 index 0000000..624c485 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/jscripts/pastetext.js @@ -0,0 +1,34 @@ +function saveContent() { + if (document.forms[0].htmlSource.value == '') { + tinyMCEPopup.close(); + return false; + } + + tinyMCEPopup.execCommand('mcePasteText', false, { + html : document.forms[0].htmlSource.value, + linebreaks : document.forms[0].linebreaks.checked + }); + + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + resizeInputs(); +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function resizeInputs() { + if (!tinyMCE.isMSIE) { + wHeight = self.innerHeight-80; + wWidth = self.innerWidth-17; + } else { + wHeight = document.body.clientHeight-80; + wWidth = document.body.clientWidth-17; + } + + document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px'; + document.forms[0].htmlSource.style.width = Math.abs(wWidth) + 'px'; +} diff --git a/includes/tiny_mce/plugins/paste/jscripts/pasteword.js b/includes/tiny_mce/plugins/paste/jscripts/pasteword.js new file mode 100644 index 0000000..38813fd --- /dev/null +++ b/includes/tiny_mce/plugins/paste/jscripts/pasteword.js @@ -0,0 +1,46 @@ +function saveContent() { + var html = document.getElementById("frmData").contentWindow.document.body.innerHTML; + + if (html == ''){ + tinyMCEPopup.close(); + return false; + } + + tinyMCEPopup.execCommand('mcePasteWord', false, html); + tinyMCEPopup.close(); +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + // Fix for endless reloading in FF + window.setTimeout('createIFrame();', 10); +} + +function createIFrame() { + document.getElementById('iframecontainer').innerHTML = ''; +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function initIframe(doc) { + var dir = tinyMCE.selectedInstance.settings['directionality']; + doc.body.dir = dir; + resizeInputs(); +} + +function resizeInputs() { + if (!tinyMCE.isMSIE) { + wHeight = self.innerHeight - 80; + wWidth = self.innerWidth - 18; + } else { + wHeight = document.body.clientHeight - 80; + wWidth = document.body.clientWidth - 18; + } + + var elm = document.getElementById('frmData'); + if (elm) { + elm.style.height = Math.abs(wHeight) + 'px'; + elm.style.width = Math.abs(wWidth) + 'px'; + } +} diff --git a/includes/tiny_mce/plugins/paste/langs/cs.js b/includes/tiny_mce/plugins/paste/langs/cs.js new file mode 100644 index 0000000..76c3b00 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/cs.js @@ -0,0 +1,16 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +paste_text_desc : 'VloÅŸit neformátovanÜ text', +paste_text_title : 'PouÅŸij CTRL + V na klávesnici pro vloÅŸení textu do okna.', +paste_text_linebreaks : 'Nechej přeruÅ¡ení řádků', +paste_word_desc : 'VloÅŸit text z aplikace Word', +paste_word_title : 'PouÅŸij CTRL + V na klávesnici pro vloÅŸení textu do okna.', +selectall_desc : 'Označit vÅ¡e' +}); + diff --git a/includes/tiny_mce/plugins/paste/langs/cy.js b/includes/tiny_mce/plugins/paste/langs/cy.js new file mode 100644 index 0000000..757d6b5 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/cy.js @@ -0,0 +1,10 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Gludo fel Testun Plaen', +paste_text_title : 'Defnyddia CTRL+V ar dy fysellfwrdd i ludo\'r testun i fewn i\'r ffenest.', +paste_text_linebreaks : 'Cadw toriadau llinell', +paste_word_desc : 'Gludo o Word', +paste_word_title : 'Defnyddia CTRL+V ar dy fysellfwrdd i ludo\'r testun i fewn i\'r ffenest.', +selectall_desc : 'Dewis Popeth' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/da.js b/includes/tiny_mce/plugins/paste/langs/da.js new file mode 100644 index 0000000..6dbac06 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/da.js @@ -0,0 +1,10 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +paste_text_desc : 'Indsæt som ren tekst', +paste_text_title : 'Brug CTRL+V på tastaturett indsætte teksten i vinduet.', +paste_text_linebreaks : 'Behold linjebrud', +paste_word_desc : 'Indsæt fra Word', +paste_word_title : 'Brug CTRL+V på tastaturett indsætte teksten i vinduet.', +selectall_desc : 'Vælg alt' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/de.js b/includes/tiny_mce/plugins/paste/langs/de.js new file mode 100644 index 0000000..6970228 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/de.js @@ -0,0 +1,10 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Als unformatierten Text einfügen', +paste_text_title : 'Benutzen Sie Strg+V/Apfel-V auf Ihrer Tastatur, um Text in das Fenster einzufügen.', +paste_text_linebreaks : 'Zeilenumbrüche beibehalten', +paste_word_desc : 'Microsoft Word-Text einfügen', +paste_word_title : 'Benutzen Sie Strg+V/Apfel-V auf Ihrer Tastatur, um Text in das Fenster einzufügen.', +selectall_desc : 'Alles auswählen' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/en.js b/includes/tiny_mce/plugins/paste/langs/en.js new file mode 100644 index 0000000..76fce8f --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/en.js @@ -0,0 +1,10 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Paste as Plain Text', +paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.', +paste_text_linebreaks : 'Keep linebreaks', +paste_word_desc : 'Paste from Word', +paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.', +selectall_desc : 'Select All' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/es.js b/includes/tiny_mce/plugins/paste/langs/es.js new file mode 100644 index 0000000..2c2e02a --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/es.js @@ -0,0 +1,12 @@ +// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +paste_text_desc : 'Pegar como texto plano', +paste_text_title : 'Use CTRL+V para pegar el texto en la ventana.', +paste_text_linebreaks : 'Mantener saltos de linea', +paste_word_desc : 'Pegar desde Word', +paste_word_title : 'Use CTRL+V para pegar el texto en la ventana.', +selectall_desc : 'Seleccionar todo' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/fi.js b/includes/tiny_mce/plugins/paste/langs/fi.js new file mode 100644 index 0000000..c6b97ff --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/fi.js @@ -0,0 +1,10 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +paste_text_desc : 'Liitä tavallisena tekstinä', +paste_text_title : 'Paina CTRL+V liittääksesi leikkaamasi/kopioimasi tekstin ikkunaan.', +paste_text_linebreaks : 'Säilytä rivinvaihdot', +paste_word_desc : 'Liitä Wordista', +paste_word_title : 'Paina CTRL+V liittääksesi leikkaamasi/kopioimasi tekstin ikkunaan.', +selectall_desc : 'Valitse kaikki' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/fr.js b/includes/tiny_mce/plugins/paste/langs/fr.js new file mode 100644 index 0000000..1dc855a --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/fr.js @@ -0,0 +1,10 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +paste_text_desc : 'Coller comme du texte', +paste_text_title : 'Faites CTRL+V pour coller le texte dans la fenêtre.', +paste_text_linebreaks : 'Conserver les retours à la ligne', +paste_word_desc : 'Coller depuis Word', +paste_word_title : 'Faites CTRL+V pour coller le texte dans la fenêtre.', +selectall_desc : 'Sélectionner tout' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/fr_ca.js b/includes/tiny_mce/plugins/paste/langs/fr_ca.js new file mode 100644 index 0000000..5183378 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/fr_ca.js @@ -0,0 +1,10 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +paste_text_desc : 'Coller texte seulement', +paste_text_title : 'Utilisez CTRL+V sur votre clavier pour coller le texte dans la fenêtre.', +paste_text_linebreaks : 'Garder les sauts de ligne', +paste_word_desc : 'Coller à partir de Word', +paste_word_title : 'Utilisez CTRL+V sur votre clavier pour coller le texte dans la fenêtre.', +selectall_desc : 'Selectionner tout' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/he.js b/includes/tiny_mce/plugins/paste/langs/he.js new file mode 100644 index 0000000..bdca6d2 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/he.js @@ -0,0 +1,10 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +paste_text_desc : 'äãá÷ ëè÷ñè øâéì', +paste_text_title : 'äùúîù á-CTRL+V ùòì äî÷ìãú ùìê ëãé ìäãáé÷ àú äè÷ñè ìçìåï.', +paste_text_linebreaks : 'ùîåø òì îòáøé ùåøä', +paste_word_desc : 'äãá÷ î-Word', +paste_word_title : 'äùúîù á-CTRL+V ùòì äî÷ìãú ùìê ëãé ìäãáé÷ àú äè÷ñè ìçìåï.', +selectall_desc : 'áçø äëì' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/hu.js b/includes/tiny_mce/plugins/paste/langs/hu.js new file mode 100644 index 0000000..d292534 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/hu.js @@ -0,0 +1,10 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Beillesztés sima szövegként', +paste_text_title : 'Használd a CTRL+V -t a billentyûzeten a szöveg beillesztéséhez az ablakba.', +paste_text_linebreaks : 'Keep linebreaks', +paste_word_desc : 'Beillesztés Word-bõl', +paste_word_title : 'Használd a CTRL+V -t a billentyûzeten a szöveg beillesztéséhez az ablakba.', +selectall_desc : 'Mindet kijelöl' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/is.js b/includes/tiny_mce/plugins/paste/langs/is.js new file mode 100644 index 0000000..5f94a29 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/is.js @@ -0,0 +1,10 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +paste_text_desc : 'Skeyta texta eingöngu', +paste_text_title : 'Notaðu CTRL+V á lyklaborðinu til að skeyta textanum í gluggann.', +paste_text_linebreaks : 'Halda línubilum', +paste_word_desc : 'Skeyta úr Word', +paste_word_title : 'Notaðu CTRL+V á lyklaborðinu til að skeyta textanum í gluggann.', +selectall_desc : 'Velja allt' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/nb.js b/includes/tiny_mce/plugins/paste/langs/nb.js new file mode 100644 index 0000000..7984c1f --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/nb.js @@ -0,0 +1,10 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +paste_text_desc : 'Lim inn som vanlig tekst', +paste_text_title : 'Bruk CTRL+V på tastaturet ditt for å lime inn i dette vinduet.', +paste_text_linebreaks : 'Spar linjebrudd', +paste_word_desc : 'Lim inn fra Office (Word)', +paste_word_title : 'Bruk CTRL+V på tastaturet ditt for å lime inn i dette vinduet.', +selectall_desc : 'Velg alt' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/nl.js b/includes/tiny_mce/plugins/paste/langs/nl.js new file mode 100644 index 0000000..340ce3d --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/nl.js @@ -0,0 +1,10 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Plakken als platte tekst', +paste_text_title : 'Gebruik CTRL+V op uw toetsenbord om de tekst in het venster te plakken.', +paste_text_linebreaks : 'Behoud regeleinden', +paste_word_desc : 'Plakken uit Word', +paste_word_title : 'Gebruik CTRL+V op uw toetsenbord om de tekst in het venster te plakken.', +selectall_desc : 'Alles selecteren' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/nn.js b/includes/tiny_mce/plugins/paste/langs/nn.js new file mode 100644 index 0000000..227456b --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/nn.js @@ -0,0 +1,10 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +paste_text_desc : 'Lim inn som vanleg tekst', +paste_text_title : 'Bruk CTRL+V på tastaturet ditt for å lime inn i dette vindauget.', +paste_text_linebreaks : 'Spar linjebrudd', +paste_word_desc : 'Lim inn frå Office (Word)', +paste_word_title : 'Bruk CTRL+V på tastaturet ditt for å lime inn i dette vindauget.', +selectall_desc : 'Velg alt' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/pl.js b/includes/tiny_mce/plugins/paste/langs/pl.js new file mode 100644 index 0000000..52a29b6 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/pl.js @@ -0,0 +1,12 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl + +tinyMCE.addToLang('',{ +paste_text_desc : 'Wklej jako czysty tekst', +paste_text_title : 'U¿yj CTRL+V na klawiaturze, aby wkleiæ tekst do okna.', +paste_text_linebreaks : 'Zachowaj ³amanie linii', +paste_word_desc : 'Wklej z Worda', +paste_word_title : 'U¿yj CTRL+V na klawiaturze, aby wkleiæ tekst do okna.', +selectall_desc : 'Zaznacz wszystko' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/paste/langs/pt_br.js b/includes/tiny_mce/plugins/paste/langs/pt_br.js new file mode 100644 index 0000000..6cb2949 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/pt_br.js @@ -0,0 +1,17 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +paste_text_desc : 'Colar um texto simples', +paste_text_title : 'Use CTRL+V no seu teclado para colar o texto dentro da janela.', +paste_text_linebreaks : 'Manter quebras de linha', +paste_word_desc : 'Colar do Word', +paste_word_title : 'Use CTRL+V no seu teclado para colar o texto dentro da janela.', +selectall_desc : 'Selecionar tudo' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/ru.js b/includes/tiny_mce/plugins/paste/langs/ru.js new file mode 100644 index 0000000..1c8a9a1 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/ru.js @@ -0,0 +1,10 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Âñòàâèòü êàê ïðîñòîé òåêñò', +paste_text_title : 'Èñïîëüçóéòå CTRL+V äëÿ âñòàâêè òåêñòà â îêîøêî.', +paste_text_linebreaks : 'Ñîõðàíèòü ïåðåíîñû ñòðîê', +paste_word_desc : 'Âñòàâèòü èç Word', +paste_word_title : 'Èñïîëüçóéòå CTRL+V äëÿ âñòàâêè òåêñòà â îêîøêî.', +selectall_desc : 'Âûäåëèòü âñž' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/paste/langs/ru_KOI8-R.js new file mode 100644 index 0000000..465fcac --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/ru_KOI8-R.js @@ -0,0 +1,10 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : '÷ÓÔÁ×ÉÔØ ËÁË ÐÒÏÓÔÏÊ ÔÅËÓÔ', +paste_text_title : 'éÓÐÏÌØÚÕÊÔÅ CTRL+V ÄÌÑ ×ÓÔÁ×ËÉ ÔÅËÓÔÁ × ÏËÏÛËÏ.', +paste_text_linebreaks : 'óÏÈÒÁÎÉÔØ ÐÅÒÅÎÏÓÙ ÓÔÒÏË', +paste_word_desc : '÷ÓÔÁ×ÉÔØ ÉÚ Word', +paste_word_title : 'éÓÐÏÌØÚÕÊÔÅ CTRL+V ÄÌÑ ×ÓÔÁ×ËÉ ÔÅËÓÔÁ × ÏËÏÛËÏ.', +selectall_desc : '÷ÙÄÅÌÉÔØ ×Ó£' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/paste/langs/ru_UTF-8.js new file mode 100644 index 0000000..7d7706c --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/ru_UTF-8.js @@ -0,0 +1,10 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'ВставОть как прПстПй текст', +paste_text_title : 'ИспПльзуйте CTRL+V Ўля вставкО текста в ПкПшкП.', +paste_text_linebreaks : 'СПхраМОть переМПсы стрПк', +paste_word_desc : 'ВставОть Оз Word', +paste_word_title : 'ИспПльзуйте CTRL+V Ўля вставкО текста в ПкПшкП.', +selectall_desc : 'ВыЎелОть всё' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/sk.js b/includes/tiny_mce/plugins/paste/langs/sk.js new file mode 100644 index 0000000..9f82934 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/sk.js @@ -0,0 +1,18 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +paste_text_desc : 'VloÅŸiÅ¥ neformatovanÜ text', +paste_text_title : 'PouÅŸi CTRL + V na klávesnici pre vloÅŸenie textu do okna.', +paste_text_linebreaks : 'Nechaj preruÅ¡enie riadkov', +paste_word_desc : 'VloÅŸiÅ¥ text s aplikáce Word', +paste_word_title : 'PouÅŸi CTRL + V na klávesnici pre vloÅŸenie textu do okna.', +selectall_desc : 'OznačiÅ¥ vÅ¡etko' +}); + diff --git a/includes/tiny_mce/plugins/paste/langs/sv.js b/includes/tiny_mce/plugins/paste/langs/sv.js new file mode 100644 index 0000000..2a84ce1 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/sv.js @@ -0,0 +1,10 @@ +// SV lang variables + +tinyMCE.addToLang('',{ +paste_text_desc : 'Klistra in som vanlig text', +paste_text_title : 'Använd CTRL+V på ditt tangentbord för att klistra in i detta fönster.', +paste_text_linebreaks : 'Spara radbrytningar', +paste_word_desc : 'Klistra in från Word', +paste_word_title : 'Använd CTRL+V på ditt tangentbord för att klistra in i detta fönster.', +selectall_desc : 'Select All' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/zh_cn.js b/includes/tiny_mce/plugins/paste/langs/zh_cn.js new file mode 100644 index 0000000..120e7df --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/zh_cn.js @@ -0,0 +1,10 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +paste_text_desc : '×÷ÎªŽ¿ÎıŸÕ³Ìù', +paste_text_title : 'ʹÓÿìœÝŒü CTRL+V œ«ÎıŸ±ŸÕ³ÌùµœÒÔÏÂŽ°¿ÚÖÐ', +paste_text_linebreaks : '±£Áô»»Ðзû', +paste_word_desc : 'ŽÓWordÕ³Ìù', +paste_word_title : 'ʹÓÿìœÝŒü CTRL+V œ«ÎıŸÕ³ÌùµœÒÔÏÂŽ°¿Ú', +selectall_desc : 'ȫѡ' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/zh_tw.js b/includes/tiny_mce/plugins/paste/langs/zh_tw.js new file mode 100644 index 0000000..74de639 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/zh_tw.js @@ -0,0 +1,11 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +paste_text_desc : '±Ä¯Â€åŠrŒÒŠ¡¶K€W', +paste_text_title : 'šÏ¥ÎÁäœL€Wªº CTRL+V ²ÕŠXÁä±N€åŠr¶K€J§@·~°Ï€€', +paste_text_linebreaks : '«O¯dޫп²Åž¹', +paste_word_desc : 'ŠÛ Word €ºÂà¶K', +paste_word_title : 'šÏ¥ÎÁäœL€Wªº CTRL+V ²ÕŠXÁä±N€åŠr¶K€J§@·~°Ï€€', +selectall_desc : '¥þ¿ï' +}); diff --git a/includes/tiny_mce/plugins/paste/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/paste/langs/zh_tw_utf8.js new file mode 100644 index 0000000..4cbf704 --- /dev/null +++ b/includes/tiny_mce/plugins/paste/langs/zh_tw_utf8.js @@ -0,0 +1,11 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +paste_text_desc : '採玔文字暡匏貌䞊', +paste_text_title : '䜿甚鍵盀䞊的 CTRL+V 組合鍵將文字貌入䜜業區䞭', +paste_text_linebreaks : '保留換行笊號', +paste_word_desc : '自 Word 內蜉貌', +paste_word_title : '䜿甚鍵盀䞊的 CTRL+V 組合鍵將文字貌入䜜業區䞭', +selectall_desc : '党遞' +}); diff --git a/includes/tiny_mce/plugins/paste/pastetext.htm b/includes/tiny_mce/plugins/paste/pastetext.htm new file mode 100644 index 0000000..0b8e85f --- /dev/null +++ b/includes/tiny_mce/plugins/paste/pastetext.htm @@ -0,0 +1,34 @@ + + + {$lang_paste_text_desc} + + + + + + +
+
{$lang_paste_text_desc}
+ +
+ +
+ +
+ +
{$lang_paste_text_title}
+ + + +
+
+ +
+ +
+ +
+
+
+ + \ No newline at end of file diff --git a/includes/tiny_mce/plugins/paste/pasteword.htm b/includes/tiny_mce/plugins/paste/pasteword.htm new file mode 100644 index 0000000..40a86df --- /dev/null +++ b/includes/tiny_mce/plugins/paste/pasteword.htm @@ -0,0 +1,29 @@ + + + + {$lang_paste_word_desc} + + + + + + +
+
{$lang_paste_word_desc}
+ +
{$lang_paste_word_title}
+ +
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/paste/readme.txt b/includes/tiny_mce/plugins/paste/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/paste/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/preview/editor_plugin.js b/includes/tiny_mce/plugins/preview/editor_plugin.js new file mode 100644 index 0000000..caa9945 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('preview','cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_preview_getInfo(){return{longname:'Preview',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_preview.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_preview_getControlHTML(control_name){switch(control_name){case "preview":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePreview\');return false;';return '';}return "";}function TinyMCE_preview_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePreview":var previewPage=tinyMCE.getParam("plugin_preview_pageurl",null);var previewWidth=tinyMCE.getParam("plugin_preview_width","550");var previewHeight=tinyMCE.getParam("plugin_preview_height","600");if(previewPage){var template=new Array();template['file']=previewPage;template['width']=previewWidth;template['height']=previewHeight;tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"yes",inline:"yes",content:tinyMCE.getContent(),content_css:tinyMCE.getParam("content_css")});}else{var win=window.open("","mcePreview","menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width="+previewWidth+",height="+previewHeight);var html="";html+=tinyMCE.getParam('doctype');html+='';html+='';html+=''+tinyMCE.getLang('lang_preview_desc')+'';html+='';html+='';html+='';html+='';html+='';html+=tinyMCE.getContent();html+='';html+='';win.document.write(html);win.document.close();}return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/preview/editor_plugin_src.js b/includes/tiny_mce/plugins/preview/editor_plugin_src.js new file mode 100644 index 0000000..e56df9d --- /dev/null +++ b/includes/tiny_mce/plugins/preview/editor_plugin_src.js @@ -0,0 +1,72 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('preview', 'cs,de,el,en,fr_ca,it,ko,pt,sv,zh_cn,fa,fr,pl,pt_br,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,es,cy,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_preview_getInfo() { + return { + longname : 'Preview', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_preview.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +/** + * Returns the HTML contents of the preview control. + */ +function TinyMCE_preview_getControlHTML(control_name) { + switch (control_name) { + case "preview": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePreview\');return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the mcePreview command. + */ +function TinyMCE_preview_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mcePreview": + var previewPage = tinyMCE.getParam("plugin_preview_pageurl", null); + var previewWidth = tinyMCE.getParam("plugin_preview_width", "550"); + var previewHeight = tinyMCE.getParam("plugin_preview_height", "600"); + + // Use a custom preview page + if (previewPage) { + var template = new Array(); + + template['file'] = previewPage; + template['width'] = previewWidth; + template['height'] = previewHeight; + + tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "yes", inline : "yes", content : tinyMCE.getContent(), content_css : tinyMCE.getParam("content_css")}); + } else { + var win = window.open("", "mcePreview", "menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width=" + previewWidth + ",height=" + previewHeight); + var html = ""; + + html += tinyMCE.getParam('doctype'); + html += ''; + html += ''; + html += '' + tinyMCE.getLang('lang_preview_desc') + ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += tinyMCE.getContent(); + html += ''; + html += ''; + + win.document.write(html); + win.document.close(); + } + + return true; + } + + return false; +} diff --git a/includes/tiny_mce/plugins/preview/example.html b/includes/tiny_mce/plugins/preview/example.html new file mode 100644 index 0000000..7860b7d --- /dev/null +++ b/includes/tiny_mce/plugins/preview/example.html @@ -0,0 +1,13 @@ + + + +Example of a custom preview page + + + + +Editor contents:
+{$content} + + + diff --git a/includes/tiny_mce/plugins/preview/images/preview.gif b/includes/tiny_mce/plugins/preview/images/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..318936eaac98edd0d40334abcd2f7c1c10abaec9 GIT binary patch literal 286 zcmV+(0pb2fNk%w1VH5xq0MrctLNX#=n%>{t-ZHm6e~^^jl|5qG(t>VEt(9$;rn0=h z!9sF^Hceyu{Qa@O*@D`dO0sseucF4-?uW03pRULFzFJ~vZ(3SX#mU#gdO|Xil9ZX3 zZ+Cy;3tk`X`blmtgJ&}spvFxO)+pf z*Yu0)Jeq<*Oi>zw$YY{tU??18WAZRSAc+luBS5_%gFt}U=_CkVMPL9SG->9@i6RJS z282$nbL>vSb9vQ6%F(nbX9-_S>5dgx&$jBi8JKA7wKL7v# literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/preview/langs/cs.js b/includes/tiny_mce/plugins/preview/langs/cs.js new file mode 100644 index 0000000..2176462 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/cs.js @@ -0,0 +1,11 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.4 2005/10/18 13:59:43 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +preview_desc : 'Náhled' +}); + diff --git a/includes/tiny_mce/plugins/preview/langs/cy.js b/includes/tiny_mce/plugins/preview/langs/cy.js new file mode 100644 index 0000000..c238e32 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/cy.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Rhagolwg' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/da.js b/includes/tiny_mce/plugins/preview/langs/da.js new file mode 100644 index 0000000..ddbeab2 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/da.js @@ -0,0 +1,5 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +preview_desc : 'Se siden' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/de.js b/includes/tiny_mce/plugins/preview/langs/de.js new file mode 100644 index 0000000..d90fba2 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/de.js @@ -0,0 +1,5 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Vorschau' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/el.js b/includes/tiny_mce/plugins/preview/langs/el.js new file mode 100644 index 0000000..69a4a23 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/el.js @@ -0,0 +1,5 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +preview_desc : 'Ðñïåðéóêüðçóç éóôïóåëßäáò' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/en.js b/includes/tiny_mce/plugins/preview/langs/en.js new file mode 100644 index 0000000..35918eb --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/en.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Preview' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/es.js b/includes/tiny_mce/plugins/preview/langs/es.js new file mode 100644 index 0000000..7157a08 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/es.js @@ -0,0 +1,7 @@ +// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +preview_desc : 'Vista previa' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/fa.js b/includes/tiny_mce/plugins/preview/langs/fa.js new file mode 100644 index 0000000..84bf304 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/fa.js @@ -0,0 +1,10 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +preview_desc : '??? ?????' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/fr.js b/includes/tiny_mce/plugins/preview/langs/fr.js new file mode 100644 index 0000000..19f36c1 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/fr.js @@ -0,0 +1,6 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +preview_desc : 'Prévisualisation' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/fr_ca.js b/includes/tiny_mce/plugins/preview/langs/fr_ca.js new file mode 100644 index 0000000..04f92dc --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/fr_ca.js @@ -0,0 +1,5 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +preview_desc : 'Prévisualisation' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/he.js b/includes/tiny_mce/plugins/preview/langs/he.js new file mode 100644 index 0000000..d91df61 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/he.js @@ -0,0 +1,5 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +preview_desc : 'úöåâä î÷ãéîä' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/hu.js b/includes/tiny_mce/plugins/preview/langs/hu.js new file mode 100644 index 0000000..2ae20e5 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/hu.js @@ -0,0 +1,5 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Elõnézet' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/is.js b/includes/tiny_mce/plugins/preview/langs/is.js new file mode 100644 index 0000000..46ee048 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/is.js @@ -0,0 +1,5 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +preview_desc : 'Forskoða' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/it.js b/includes/tiny_mce/plugins/preview/langs/it.js new file mode 100644 index 0000000..2fe61bf --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/it.js @@ -0,0 +1,5 @@ +// IT lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Anteprima' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/ko.js b/includes/tiny_mce/plugins/preview/langs/ko.js new file mode 100644 index 0000000..fa26884 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/ko.js @@ -0,0 +1,5 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +preview_desc : '¹Ìž®ºž±â' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/nb.js b/includes/tiny_mce/plugins/preview/langs/nb.js new file mode 100644 index 0000000..00c62cd --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/nb.js @@ -0,0 +1,5 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +preview_desc : 'Forhåndsvisning' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/nl.js b/includes/tiny_mce/plugins/preview/langs/nl.js new file mode 100644 index 0000000..357ebd3 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/nl.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Voorbeeld' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/nn.js b/includes/tiny_mce/plugins/preview/langs/nn.js new file mode 100644 index 0000000..69aaf1c --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/nn.js @@ -0,0 +1,5 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +preview_desc : 'Forhåndsvisning' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/pl.js b/includes/tiny_mce/plugins/preview/langs/pl.js new file mode 100644 index 0000000..5610216 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/pl.js @@ -0,0 +1,7 @@ +// PL lang variables +// fixed by Wooya +// http://www.musion.prv.pl + +tinyMCE.addToLang('',{ +preview_desc : 'Podgl±d' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/preview/langs/pt.js b/includes/tiny_mce/plugins/preview/langs/pt.js new file mode 100644 index 0000000..3a49fe3 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/pt.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +preview_desc : 'Pré-visualização' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/pt_br.js b/includes/tiny_mce/plugins/preview/langs/pt_br.js new file mode 100644 index 0000000..07b11cd --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/pt_br.js @@ -0,0 +1,13 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +preview_desc : 'Visualizar' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/ru.js b/includes/tiny_mce/plugins/preview/langs/ru.js new file mode 100644 index 0000000..fd985ee --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/ru.js @@ -0,0 +1,5 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +preview_desc : 'Ïðåäâàðèòåëüíûé ïðîñìîòð' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/preview/langs/ru_KOI8-R.js new file mode 100644 index 0000000..886054c --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/ru_KOI8-R.js @@ -0,0 +1,5 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +preview_desc : 'ðÒÅÄ×ÁÒÉÔÅÌØÎÙÊ ÐÒÏÓÍÏÔÒ' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/preview/langs/ru_UTF-8.js new file mode 100644 index 0000000..61146b4 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/ru_UTF-8.js @@ -0,0 +1,5 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +preview_desc : 'ПреЎварОтельМый прПсЌПтр' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/sk.js b/includes/tiny_mce/plugins/preview/langs/sk.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/preview/langs/sv.js b/includes/tiny_mce/plugins/preview/langs/sv.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/preview/langs/zh_cn.js b/includes/tiny_mce/plugins/preview/langs/zh_cn.js new file mode 100644 index 0000000..8aeaee3 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/zh_cn.js @@ -0,0 +1,5 @@ +// Simplified Chinese lang variables contributed by cube316 (cube316@etang.com) + +tinyMCE.addToLang('',{ +preview_desc : 'Ô€ÀÀ' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/zh_tw.js b/includes/tiny_mce/plugins/preview/langs/zh_tw.js new file mode 100644 index 0000000..4952091 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/zh_tw.js @@ -0,0 +1,6 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +preview_desc : '¹wÄý' +}); diff --git a/includes/tiny_mce/plugins/preview/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/preview/langs/zh_tw_utf8.js new file mode 100644 index 0000000..fd71081 --- /dev/null +++ b/includes/tiny_mce/plugins/preview/langs/zh_tw_utf8.js @@ -0,0 +1,6 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +preview_desc : '預芜' +}); diff --git a/includes/tiny_mce/plugins/preview/readme.txt b/includes/tiny_mce/plugins/preview/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/preview/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/print/editor_plugin.js b/includes/tiny_mce/plugins/print/editor_plugin.js new file mode 100644 index 0000000..4f565e5 --- /dev/null +++ b/includes/tiny_mce/plugins/print/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('print','en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_print_getInfo(){return{longname:'Print',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_print.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_print_getControlHTML(control_name){switch(control_name){case "print":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePrint\',true);return false;';return '';}return "";}function TinyMCE_print_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mcePrint":tinyMCE.getInstanceById(editor_id).contentWindow.print();return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/print/editor_plugin_src.js b/includes/tiny_mce/plugins/print/editor_plugin_src.js new file mode 100644 index 0000000..4360770 --- /dev/null +++ b/includes/tiny_mce/plugins/print/editor_plugin_src.js @@ -0,0 +1,37 @@ +/* Import theme specific language pack */ +tinyMCE.importPluginLanguagePack('print', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,es,cy,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_print_getInfo() { + return { + longname : 'Print', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_print.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_print_getControlHTML(control_name) { + switch (control_name) { + case "print": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mcePrint\',true);return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the search/replace commands. + */ +function TinyMCE_print_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mcePrint": + tinyMCE.getInstanceById(editor_id).contentWindow.print(); + return true; + } + + // Pass to next handler in chain + return false; +} diff --git a/includes/tiny_mce/plugins/print/images/print.gif b/includes/tiny_mce/plugins/print/images/print.gif new file mode 100644 index 0000000000000000000000000000000000000000..72104d177b7fb10164fe2dcd5c11833af420ed0d GIT binary patch literal 211 zcmV;^04)DUNk%w1VH5xq0K*3W0-^$glB?9%;yO@jtF_9q{sK~CfBXCW68-|a#?oSO ziL%e~l%llZ>Gg7ing9R*A^8LW000jFEC2ui02BZe000Dl@X1N5y*TUrMEc;T3BqBT z4PgiwVSWT5C`y(zC#n*d;5M+t%)nq+5`;vqkun5Sl>{S3U<4crgF(S?7%GgM_|OPs zD* +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +print_desc : 'Imprimir' +}); diff --git a/includes/tiny_mce/plugins/print/langs/fa.js b/includes/tiny_mce/plugins/print/langs/fa.js new file mode 100644 index 0000000..d9b2627 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/fa.js @@ -0,0 +1,10 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +print_desc : '???' +}); diff --git a/includes/tiny_mce/plugins/print/langs/fi.js b/includes/tiny_mce/plugins/print/langs/fi.js new file mode 100644 index 0000000..cc818c4 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/fi.js @@ -0,0 +1,5 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +print_desc : 'Tulosta' +}); diff --git a/includes/tiny_mce/plugins/print/langs/fr.js b/includes/tiny_mce/plugins/print/langs/fr.js new file mode 100644 index 0000000..f2adbbe --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/fr.js @@ -0,0 +1,5 @@ +// French lang variables by Laurent Dran + +tinyMCE.addToLang('',{ +print_desc : 'Imprimer' +}); diff --git a/includes/tiny_mce/plugins/print/langs/fr_ca.js b/includes/tiny_mce/plugins/print/langs/fr_ca.js new file mode 100644 index 0000000..8e9eb33 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/fr_ca.js @@ -0,0 +1,5 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +print_desc : 'Imprimer' +}); diff --git a/includes/tiny_mce/plugins/print/langs/he.js b/includes/tiny_mce/plugins/print/langs/he.js new file mode 100644 index 0000000..9ed6e1e --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/he.js @@ -0,0 +1,5 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +print_desc : 'äãôñ' +}); diff --git a/includes/tiny_mce/plugins/print/langs/hu.js b/includes/tiny_mce/plugins/print/langs/hu.js new file mode 100644 index 0000000..1c732ec --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/hu.js @@ -0,0 +1,5 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +print_desc : 'Nyomtatás' +}); diff --git a/includes/tiny_mce/plugins/print/langs/is.js b/includes/tiny_mce/plugins/print/langs/is.js new file mode 100644 index 0000000..602eace --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/is.js @@ -0,0 +1,5 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +print_desc : 'Prenta' +}); diff --git a/includes/tiny_mce/plugins/print/langs/nb.js b/includes/tiny_mce/plugins/print/langs/nb.js new file mode 100644 index 0000000..b034385 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/nb.js @@ -0,0 +1,5 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +print_desc : 'Skriv ut' +}); diff --git a/includes/tiny_mce/plugins/print/langs/nl.js b/includes/tiny_mce/plugins/print/langs/nl.js new file mode 100644 index 0000000..5bcf970 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/nl.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +print_desc : 'Afdrukken' +}); diff --git a/includes/tiny_mce/plugins/print/langs/nn.js b/includes/tiny_mce/plugins/print/langs/nn.js new file mode 100644 index 0000000..fe91464 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/nn.js @@ -0,0 +1,5 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +print_desc : 'Skriv ut' +}); diff --git a/includes/tiny_mce/plugins/print/langs/pl.js b/includes/tiny_mce/plugins/print/langs/pl.js new file mode 100644 index 0000000..030caf7 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/pl.js @@ -0,0 +1,5 @@ +// PL lang variables + +tinyMCE.addToLang('',{ +print_desc : 'Drukuj' +}); diff --git a/includes/tiny_mce/plugins/print/langs/pt_br.js b/includes/tiny_mce/plugins/print/langs/pt_br.js new file mode 100644 index 0000000..ec56524 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/pt_br.js @@ -0,0 +1,13 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +print_desc : 'Imprimir' +}); diff --git a/includes/tiny_mce/plugins/print/langs/ru.js b/includes/tiny_mce/plugins/print/langs/ru.js new file mode 100644 index 0000000..3285b90 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/ru.js @@ -0,0 +1,5 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +print_desc : 'Ðàñïå÷àòàòü' +}); diff --git a/includes/tiny_mce/plugins/print/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/print/langs/ru_KOI8-R.js new file mode 100644 index 0000000..01e36a0 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/ru_KOI8-R.js @@ -0,0 +1,5 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +print_desc : 'òÁÓÐÅÞÁÔÁÔØ' +}); diff --git a/includes/tiny_mce/plugins/print/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/print/langs/ru_UTF-8.js new file mode 100644 index 0000000..ca5c581 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/ru_UTF-8.js @@ -0,0 +1,5 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +print_desc : 'Распечатать' +}); diff --git a/includes/tiny_mce/plugins/print/langs/sk.js b/includes/tiny_mce/plugins/print/langs/sk.js new file mode 100644 index 0000000..5a56489 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/sk.js @@ -0,0 +1,13 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +print_desc : 'Tlač' +}); + diff --git a/includes/tiny_mce/plugins/print/langs/sv.js b/includes/tiny_mce/plugins/print/langs/sv.js new file mode 100644 index 0000000..7b1057d --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/sv.js @@ -0,0 +1,5 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +print_desc : 'Skriv ut' +}); diff --git a/includes/tiny_mce/plugins/print/langs/zh_cn.js b/includes/tiny_mce/plugins/print/langs/zh_cn.js new file mode 100644 index 0000000..0f52670 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/zh_cn.js @@ -0,0 +1,6 @@ +// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) +//Çë·ÃÎÊ http://www.cube316.net/ ÒÔ»ñÈ¡TinyMCEµÄÖÐÎÄÖ§³Ö + +tinyMCE.addToLang('',{ +print_desc : 'ŽòÓ¡' +}); diff --git a/includes/tiny_mce/plugins/print/langs/zh_tw.js b/includes/tiny_mce/plugins/print/langs/zh_tw.js new file mode 100644 index 0000000..0984d53 --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/zh_tw.js @@ -0,0 +1,6 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +print_desc : 'ŠCŠL' +}); diff --git a/includes/tiny_mce/plugins/print/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/print/langs/zh_tw_utf8.js new file mode 100644 index 0000000..b3fe97c --- /dev/null +++ b/includes/tiny_mce/plugins/print/langs/zh_tw_utf8.js @@ -0,0 +1,6 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +print_desc : '列印' +}); diff --git a/includes/tiny_mce/plugins/print/readme.txt b/includes/tiny_mce/plugins/print/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/print/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/readme.txt b/includes/tiny_mce/plugins/readme.txt new file mode 100644 index 0000000..9192b26 --- /dev/null +++ b/includes/tiny_mce/plugins/readme.txt @@ -0,0 +1 @@ +This is the location you place TinyMCE plugins. diff --git a/includes/tiny_mce/plugins/save/editor_plugin.js b/includes/tiny_mce/plugins/save/editor_plugin.js new file mode 100644 index 0000000..6115379 --- /dev/null +++ b/includes/tiny_mce/plugins/save/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('save','en,sv,zh_cn,cs,fa,fr_ca,fr,de,pl,pt_br,nl,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,da,es,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_save_getInfo(){return{longname:'Save',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_save.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_save_getControlHTML(control_name){switch(control_name){case "save":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSave\');return false;';return '';}return "";}function TinyMCE_save_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceSave":var formObj=tinyMCE.selectedInstance.formElement.form;if(formObj){tinyMCE.triggerSave();for(var i=0;i'; + } + + return ""; +} + +/** + * Executes the save command. + */ +function TinyMCE_save_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceSave": + var formObj = tinyMCE.selectedInstance.formElement.form; + + if (formObj) { + tinyMCE.triggerSave(); + + // Disable all UI form elements that TinyMCE created + for (var i=0; iy!E|{0<7#0>aHWEL6BndDU8;y+&e4jmm66%_}QC6xvn4h#bW3={_x jpoxPV4gmok9t#w=ts@#{Ko1AM7r_@1E5*jg#vuSZ^a*OP literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/save/langs/cs.js b/includes/tiny_mce/plugins/save/langs/cs.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/save/langs/cy.js b/includes/tiny_mce/plugins/save/langs/cy.js new file mode 100644 index 0000000..a7485b1 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/cy.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Cadw' +}); diff --git a/includes/tiny_mce/plugins/save/langs/da.js b/includes/tiny_mce/plugins/save/langs/da.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/plugins/save/langs/de.js b/includes/tiny_mce/plugins/save/langs/de.js new file mode 100644 index 0000000..2ee4530 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/de.js @@ -0,0 +1,5 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Speichern' +}); diff --git a/includes/tiny_mce/plugins/save/langs/en.js b/includes/tiny_mce/plugins/save/langs/en.js new file mode 100644 index 0000000..61a2620 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/en.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Save' +}); diff --git a/includes/tiny_mce/plugins/save/langs/es.js b/includes/tiny_mce/plugins/save/langs/es.js new file mode 100644 index 0000000..b3150b2 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/es.js @@ -0,0 +1,7 @@ +// ES lang variables by Alvaro Velasco and Adolfo Sanz De Diego (asanzdiego) +// Last Updated : October 2005 +// TinyMCE Version : 2.0RC3 + +tinyMCE.addToLang('',{ +save_desc : 'Salvar' +}); diff --git a/includes/tiny_mce/plugins/save/langs/fa.js b/includes/tiny_mce/plugins/save/langs/fa.js new file mode 100644 index 0000000..91f91ae --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/fa.js @@ -0,0 +1,11 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +save_desc : '???' +}); + \ No newline at end of file diff --git a/includes/tiny_mce/plugins/save/langs/fi.js b/includes/tiny_mce/plugins/save/langs/fi.js new file mode 100644 index 0000000..d7e6f55 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/fi.js @@ -0,0 +1,5 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +save_desc : 'Tallenna' +}); diff --git a/includes/tiny_mce/plugins/save/langs/fr.js b/includes/tiny_mce/plugins/save/langs/fr.js new file mode 100644 index 0000000..d8a4a1d --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/fr.js @@ -0,0 +1,6 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +save_desc : 'Enregistrer' +}); diff --git a/includes/tiny_mce/plugins/save/langs/fr_ca.js b/includes/tiny_mce/plugins/save/langs/fr_ca.js new file mode 100644 index 0000000..66d64d0 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/fr_ca.js @@ -0,0 +1,6 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +save_desc : 'Enregistrer' +}); +, \ No newline at end of file diff --git a/includes/tiny_mce/plugins/save/langs/he.js b/includes/tiny_mce/plugins/save/langs/he.js new file mode 100644 index 0000000..a00237d --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/he.js @@ -0,0 +1,5 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +save_desc : 'ùîåø' +}); diff --git a/includes/tiny_mce/plugins/save/langs/hu.js b/includes/tiny_mce/plugins/save/langs/hu.js new file mode 100644 index 0000000..530b556 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/hu.js @@ -0,0 +1,5 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Mentés' +}); diff --git a/includes/tiny_mce/plugins/save/langs/is.js b/includes/tiny_mce/plugins/save/langs/is.js new file mode 100644 index 0000000..eee8aeb --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/is.js @@ -0,0 +1,5 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +save_desc : 'Vista' +}); diff --git a/includes/tiny_mce/plugins/save/langs/nb.js b/includes/tiny_mce/plugins/save/langs/nb.js new file mode 100644 index 0000000..34d9ebe --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/nb.js @@ -0,0 +1,5 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('save',{ +desc : 'Lagre' +}); diff --git a/includes/tiny_mce/plugins/save/langs/nl.js b/includes/tiny_mce/plugins/save/langs/nl.js new file mode 100644 index 0000000..2b6d16b --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/nl.js @@ -0,0 +1,5 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Opslaan' +}); diff --git a/includes/tiny_mce/plugins/save/langs/nn.js b/includes/tiny_mce/plugins/save/langs/nn.js new file mode 100644 index 0000000..f7299eb --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/nn.js @@ -0,0 +1,5 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('save',{ +desc : 'Lagre' +}); diff --git a/includes/tiny_mce/plugins/save/langs/pl.js b/includes/tiny_mce/plugins/save/langs/pl.js new file mode 100644 index 0000000..3fa9e40 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/pl.js @@ -0,0 +1,5 @@ +// PL lang variables + +tinyMCE.addToLang('',{ +save_desc : 'Zachowaj' +}); diff --git a/includes/tiny_mce/plugins/save/langs/pt_br.js b/includes/tiny_mce/plugins/save/langs/pt_br.js new file mode 100644 index 0000000..defaab8 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/pt_br.js @@ -0,0 +1,13 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +save_desc : 'Salvar' +}); diff --git a/includes/tiny_mce/plugins/save/langs/ru.js b/includes/tiny_mce/plugins/save/langs/ru.js new file mode 100644 index 0000000..605199d --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/ru.js @@ -0,0 +1,5 @@ +// RU lang variables cp1251 + +tinyMCE.addToLang('',{ +save_desc : 'Ñîõðàíèòü' +}); diff --git a/includes/tiny_mce/plugins/save/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/save/langs/ru_KOI8-R.js new file mode 100644 index 0000000..aa2cbeb --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/ru_KOI8-R.js @@ -0,0 +1,5 @@ +// RU lang variables KOI8-R + +tinyMCE.addToLang('',{ +save_desc : 'óÏÈÒÁÎÉÔØ' +}); diff --git a/includes/tiny_mce/plugins/save/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/save/langs/ru_UTF-8.js new file mode 100644 index 0000000..358e31d --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/ru_UTF-8.js @@ -0,0 +1,5 @@ +// RU lang variables UTF-8 + +tinyMCE.addToLang('',{ +save_desc : 'СПхраМОть' +}); diff --git a/includes/tiny_mce/plugins/save/langs/sk.js b/includes/tiny_mce/plugins/save/langs/sk.js new file mode 100644 index 0000000..19c9efa --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/sk.js @@ -0,0 +1,13 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +save_desc : 'UloÅŸiÅ¥' +}); + diff --git a/includes/tiny_mce/plugins/save/langs/sv.js b/includes/tiny_mce/plugins/save/langs/sv.js new file mode 100644 index 0000000..7217d64 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/sv.js @@ -0,0 +1,5 @@ +// SV lang variables + +tinyMCE.addToLang('save',{ +desc : 'Spara' +}); diff --git a/includes/tiny_mce/plugins/save/langs/zh_cn.js b/includes/tiny_mce/plugins/save/langs/zh_cn.js new file mode 100644 index 0000000..4210932 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/zh_cn.js @@ -0,0 +1,7 @@ +// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com) +//Çë·ÃÎÊ http://www.cube316.net/ ÒÔ»ñÈ¡TinyMCEµÄÖÐÎÄÖ§³Ö + +tinyMCE.addToLang('',{ +save_desc : '±£Žæ' +}); + \ No newline at end of file diff --git a/includes/tiny_mce/plugins/save/langs/zh_tw.js b/includes/tiny_mce/plugins/save/langs/zh_tw.js new file mode 100644 index 0000000..aed76e4 --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/zh_tw.js @@ -0,0 +1,6 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +save_desc : 'ŠsÀÉ' +}); diff --git a/includes/tiny_mce/plugins/save/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/save/langs/zh_tw_utf8.js new file mode 100644 index 0000000..8922bfe --- /dev/null +++ b/includes/tiny_mce/plugins/save/langs/zh_tw_utf8.js @@ -0,0 +1,6 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +save_desc : '存檔' +}); diff --git a/includes/tiny_mce/plugins/save/readme.txt b/includes/tiny_mce/plugins/save/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/save/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/searchreplace/editor_plugin.js b/includes/tiny_mce/plugins/searchreplace/editor_plugin.js new file mode 100644 index 0000000..9455116 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('searchreplace','en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_searchreplace_getInfo(){return{longname:'Search/Replace',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_searchreplace_getControlHTML(control_name){switch(control_name){case "search":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearch\',true);return false;';return '';case "replace":var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearchReplace\',true);return false;';return '';}return "";}function TinyMCE_searchreplace_execCommand(editor_id,element,command,user_interface,value){function defValue(key,default_value){value[key]=typeof(value[key])=="undefined"?default_value:value[key];}function replaceSel(search_str,str){if(!tinyMCE.isMSIE){var sel=instance.contentWindow.getSelection();var rng=sel.getRangeAt(0);}else{var rng=instance.contentWindow.document.selection.createRange();}if(!tinyMCE.isMSIE){var doc=instance.contentWindow.document;if(str.indexOf(search_str)==-1){rng.deleteContents();rng.insertNode(rng.createContextualFragment(str));rng.collapse(false);}else{doc.execCommand("insertimage",false,"#mce_temp_url#");var elm=tinyMCE.getElementByAttributeValue(doc.body,"img","src","#mce_temp_url#");elm.parentNode.replaceChild(doc.createTextNode(str),elm);}}else{if(rng.item)rng.item(0).outerHTML=str;else rng.pasteHTML(str);}}var instance=tinyMCE.getInstanceById(editor_id);if(!value)value=new Array();defValue("editor_id",editor_id);defValue("searchstring","");defValue("replacestring",null);defValue("replacemode","none");defValue("casesensitive",false);defValue("backwards",false);defValue("wrap",false);defValue("wholeword",false);defValue("inline","yes");switch(command){case "mceResetSearch":tinyMCE.lastSearchRng=null;return true;case "mceSearch":if(user_interface){var template=new Array();if(value['replacestring']!=null){template['file']='../../plugins/searchreplace/replace.htm';template['width']=320;template['height']=120+(tinyMCE.isNS7?20:0);template['width']+=tinyMCE.getLang('lang_searchreplace_replace_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}else{template['file']='../../plugins/searchreplace/search.htm';template['width']=310;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_searchreplace_search_delta_width',0);template['height']+=tinyMCE.getLang('lang_searchreplace_replace_delta_height',0);}tinyMCE.openWindow(template,value);}else{var win=tinyMCE.getInstanceById(editor_id).contentWindow;var doc=tinyMCE.getInstanceById(editor_id).contentWindow.document;var body=tinyMCE.getInstanceById(editor_id).contentWindow.document.body;if(body.innerHTML==""){alert(tinyMCE.getLang('lang_searchreplace_notfound'));return true;}if(value['replacemode']=="current"){replaceSel(value['string'],value['replacestring']);value['replacemode']="none";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}if(tinyMCE.isMSIE){var rng=tinyMCE.lastSearchRng?tinyMCE.lastSearchRng:doc.selection.createRange();var flags=0;if(value['wholeword'])flags=flags|2;if(value['casesensitive'])flags=flags|4;if(!rng.findText){alert('This operation is currently not supported by this browser.');return true;}if(value['replacemode']=="all"){while(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(false);replaceSel(value['string'],value['replacestring']);}alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(rng.findText(value['string'],value['backwards']?-1:1,flags)){rng.scrollIntoView();rng.select();rng.collapse(value['backwards']);tinyMCE.lastSearchRng=rng;}else alert(tinyMCE.getLang('lang_searchreplace_notfound'));}else{if(value['replacemode']=="all"){while(win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))replaceSel(value['string'],value['replacestring']);alert(tinyMCE.getLang('lang_searchreplace_allreplaced'));return true;}if(!win.find(value['string'],value['casesensitive'],value['backwards'],value['wrap'],value['wholeword'],false,false))alert(tinyMCE.getLang('lang_searchreplace_notfound'));}}return true;case "mceSearchReplace":value['replacestring']="";tinyMCE.execInstanceCommand(editor_id,'mceSearch',user_interface,value,false);return true;}return false;}function TinyMCE_searchreplace_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){return true;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/includes/tiny_mce/plugins/searchreplace/editor_plugin_src.js new file mode 100644 index 0000000..b6b0a55 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/editor_plugin_src.js @@ -0,0 +1,195 @@ +/* Import theme specific language pack */ +tinyMCE.importPluginLanguagePack('searchreplace', 'en,sv,zh_cn,fa,fr_ca,fr,de,pl,pt_br,cs,nl,da,he,nb,hu,ru,ru_KOI8-R,ru_UTF-8,nn,fi,cy,es,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_searchreplace_getInfo() { + return { + longname : 'Search/Replace', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_searchreplace.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_searchreplace_getControlHTML(control_name) { + switch (control_name) { + case "search": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearch\',true);return false;'; + return ''; + + case "replace": + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceSearchReplace\',true);return false;'; + return ''; + } + + return ""; +} + +/** + * Executes the search/replace commands. + */ +function TinyMCE_searchreplace_execCommand(editor_id, element, command, user_interface, value) { + function defValue(key, default_value) { + value[key] = typeof(value[key]) == "undefined" ? default_value : value[key]; + } + + function replaceSel(search_str, str) { + // Get current selection + if (!tinyMCE.isMSIE) { + var sel = instance.contentWindow.getSelection(); + var rng = sel.getRangeAt(0); + } else { + var rng = instance.contentWindow.document.selection.createRange(); + } + + // Replace current one + if (!tinyMCE.isMSIE) { + var doc = instance.contentWindow.document; + + // This way works when the replace doesn't contain the search string + if (str.indexOf(search_str) == -1) { + rng.deleteContents(); + rng.insertNode(rng.createContextualFragment(str)); + rng.collapse(false); + } else { + // Insert content ugly way! Needed to move selection to after replace item + doc.execCommand("insertimage", false, "#mce_temp_url#"); + var elm = tinyMCE.getElementByAttributeValue(doc.body, "img", "src", "#mce_temp_url#"); + elm.parentNode.replaceChild(doc.createTextNode(str), elm); + } + } else { + if (rng.item) + rng.item(0).outerHTML = str; + else + rng.pasteHTML(str); + } + } + + var instance = tinyMCE.getInstanceById(editor_id); + + if (!value) + value = new Array(); + + // Setup defualt values + defValue("editor_id", editor_id); + defValue("searchstring", ""); + defValue("replacestring", null); + defValue("replacemode", "none"); + defValue("casesensitive", false); + defValue("backwards", false); + defValue("wrap", false); + defValue("wholeword", false); + defValue("inline", "yes"); + + // Handle commands + switch (command) { + case "mceResetSearch": + tinyMCE.lastSearchRng = null; + return true; + + case "mceSearch": + if (user_interface) { + // Open search dialog + var template = new Array(); + + if (value['replacestring'] != null) { + template['file'] = '../../plugins/searchreplace/replace.htm'; // Relative to theme + template['width'] = 320; + template['height'] = 120 + (tinyMCE.isNS7 ? 20 : 0); + template['width'] += tinyMCE.getLang('lang_searchreplace_replace_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0); + } else { + template['file'] = '../../plugins/searchreplace/search.htm'; // Relative to theme + template['width'] = 310; + template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0); + template['width'] += tinyMCE.getLang('lang_searchreplace_search_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_searchreplace_replace_delta_height', 0); + } + + tinyMCE.openWindow(template, value); + } else { + var win = tinyMCE.getInstanceById(editor_id).contentWindow; + var doc = tinyMCE.getInstanceById(editor_id).contentWindow.document; + var body = tinyMCE.getInstanceById(editor_id).contentWindow.document.body; + + // Whats the point + if (body.innerHTML == "") { + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + return true; + } + + // Handle replace current + if (value['replacemode'] == "current") { + replaceSel(value['string'], value['replacestring']); + + // Search next one + value['replacemode'] = "none"; + tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); + + return true; + } + + if (tinyMCE.isMSIE) { + var rng = tinyMCE.lastSearchRng ? tinyMCE.lastSearchRng : doc.selection.createRange(); + var flags = 0; + + if (value['wholeword']) + flags = flags | 2; + + if (value['casesensitive']) + flags = flags | 4; + + if (!rng.findText) { + alert('This operation is currently not supported by this browser.'); + return true; + } + + // Handle replace all mode + if (value['replacemode'] == "all") { + while (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { + rng.scrollIntoView(); + rng.select(); + rng.collapse(false); + replaceSel(value['string'], value['replacestring']); + } + + alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); + return true; + } + + if (rng.findText(value['string'], value['backwards'] ? -1 : 1, flags)) { + rng.scrollIntoView(); + rng.select(); + rng.collapse(value['backwards']); + tinyMCE.lastSearchRng = rng; + } else + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + } else { + if (value['replacemode'] == "all") { + while (win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) + replaceSel(value['string'], value['replacestring']); + + alert(tinyMCE.getLang('lang_searchreplace_allreplaced')); + return true; + } + + if (!win.find(value['string'], value['casesensitive'], value['backwards'], value['wrap'], value['wholeword'], false, false)) + alert(tinyMCE.getLang('lang_searchreplace_notfound')); + } + } + return true; + + case "mceSearchReplace": + value['replacestring'] = ""; + + tinyMCE.execInstanceCommand(editor_id, 'mceSearch', user_interface, value, false); + return true; + } + + // Pass to next handler in chain + return false; +} + +function TinyMCE_searchreplace_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + return true; +} diff --git a/includes/tiny_mce/plugins/searchreplace/images/replace.gif b/includes/tiny_mce/plugins/searchreplace/images/replace.gif new file mode 100644 index 0000000000000000000000000000000000000000..784c73e2a9bb6cf369146a5ea6b1300262376eed GIT binary patch literal 125 zcmZ?wbhEHb6k!ly*u=`<>+5Tf@nG4qWeF2LOxW<@_Kk}SV4(Pug^_`QjX?**1F23Thj{dMSt5;y`fuDmH}Uz$g$9N~Xo|, + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Buscar', +searchreplace_searchnext_desc : 'Buscar de nuevo', +searchreplace_replace_desc : 'Buscar/Replazar', +searchreplace_notfound : 'La búsqueda ha terminado. No se ha encontrado el elemento buscado.', +searchreplace_search_title : 'Buscar', +searchreplace_replace_title : 'Buscar/Replazar', +searchreplace_allreplaced : 'Todas las ocurrencias del elemento buscado han sido remplazadas.', +searchreplace_findwhat : 'Buscar', +searchreplace_replacewith : 'Replazar con', +searchreplace_direction : 'Dirección', +searchreplace_up : 'Arriba', +searchreplace_down : 'Abajo', +searchreplace_case : 'Búsqueda exacta (mayúsculas y minúsculas)', +searchreplace_findnext : 'Buscar siguiente', +searchreplace_replace : 'Replazar', +searchreplace_replaceall : 'Replazar todo', +searchreplace_cancel : 'Cancelar', +searchreplace_replace_delta_width : 70 +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/fa.js b/includes/tiny_mce/plugins/searchreplace/langs/fa.js new file mode 100644 index 0000000..36e543c --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/fa.js @@ -0,0 +1,26 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +searchreplace_search_desc : '?????', +searchreplace_searchnext_desc : '?????? ????', +searchreplace_replace_desc : '?????/????????', +searchreplace_notfound : '????? ????? ????. ??? ????? ???? ???.', +searchreplace_search_title : '?????', +searchreplace_replace_title : '?????/????????', +searchreplace_allreplaced : '??? ????? ??????? ?????.', +searchreplace_findwhat : '????? ?? ?????', +searchreplace_replacewith : '???????? ??', +searchreplace_direction : '??? ?????', +searchreplace_up : '?? ??? ????', +searchreplace_down : '?? ??? ?????', +searchreplace_case : '????? ???? ???? ? ????', +searchreplace_findnext : '????-????', +searchreplace_replace : '???????-??', +searchreplace_replaceall : '????????-???', +searchreplace_cancel : '??????' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/fi.js b/includes/tiny_mce/plugins/searchreplace/langs/fi.js new file mode 100644 index 0000000..1f24d6d --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/fi.js @@ -0,0 +1,21 @@ +// FI lang variables by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Etsi', +searchreplace_searchnext_desc : 'Etsi uudelleen', +searchreplace_replace_desc : 'Etsi/Korvaa', +searchreplace_notfound : 'Haku on päättynyt. Haettua merkkijonoa ei löytynyt.', +searchreplace_search_title : 'Etsi', +searchreplace_replace_title : 'Etsi/Korvaa', +searchreplace_allreplaced : 'Kaikki esiintyneet hakutermit korvattiin.', +searchreplace_findwhat : 'Etsittävä', +searchreplace_replacewith : 'Korvaava', +searchreplace_direction : 'Suunta', +searchreplace_up : 'Ylös', +searchreplace_down : 'Alas', +searchreplace_case : 'Sama kirjainkoko', +searchreplace_findnext : 'Etsi seuraava', +searchreplace_replace : 'Korvaa', +searchreplace_replaceall : 'Korvaa kaikki', +searchreplace_cancel : 'Peruuta' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/fr.js b/includes/tiny_mce/plugins/searchreplace/langs/fr.js new file mode 100644 index 0000000..1db82d7 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/fr.js @@ -0,0 +1,22 @@ +// Franch lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Rehercher', +searchreplace_searchnext_desc : 'Rehercher suivant', +searchreplace_replace_desc : 'Rechercher/Remplacer', +searchreplace_notfound : 'Recherche complétée. La fin du document a été atteinte.', +searchreplace_search_title : 'Rechercher', +searchreplace_replace_title : 'Rechercher/Remplacer', +searchreplace_allreplaced : 'Action terminée avec succès. Les remplacements\nont été faits dans l\'ensemble du document.', +searchreplace_findwhat : 'Trouver le mot', +searchreplace_replacewith : 'Remplacer avec', +searchreplace_direction : 'Direction', +searchreplace_up : 'Vers le haut', +searchreplace_down : 'Vers le bas', +searchreplace_case : 'Respecter la casse', +searchreplace_findnext : 'Suivant', +searchreplace_replace : 'Remplacer', +searchreplace_replaceall : 'Remplacer tout', +searchreplace_cancel : 'Annuler' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/fr_ca.js b/includes/tiny_mce/plugins/searchreplace/langs/fr_ca.js new file mode 100644 index 0000000..6969dc2 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/fr_ca.js @@ -0,0 +1,21 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Chercher', +searchreplace_searchnext_desc : 'Chercher suivant', +searchreplace_replace_desc : 'Chercher/Remplacer', +searchreplace_notfound : 'La recherche est terminée. Aucune occurence trouvée.', +searchreplace_search_title : 'Chercher', +searchreplace_replace_title : 'Chercher/Remplacer', +searchreplace_allreplaced : 'Toutes les occurences ont été remplacées.', +searchreplace_findwhat : 'Chercher quoi', +searchreplace_replacewith : 'Remplacer par', +searchreplace_direction : 'Direction', +searchreplace_up : 'Monter', +searchreplace_down : 'Descendre', +searchreplace_case : 'Sensible à la case', +searchreplace_findnext : 'Chercher ,suivant', +searchreplace_replace : 'Remplacer', +searchreplace_replaceall : 'Remplacer ,tous', +searchreplace_cancel : 'Annuler' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/he.js b/includes/tiny_mce/plugins/searchreplace/langs/he.js new file mode 100644 index 0000000..44c865f --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/he.js @@ -0,0 +1,21 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'çôù', +searchreplace_searchnext_desc : 'çôù ùåá', +searchreplace_replace_desc : 'çôù/äçìó', +searchreplace_notfound : 'äçéôåù äåùìí. îçøåæú äçéôåù ìà ðîöàä.', +searchreplace_search_title : 'çôù', +searchreplace_replace_title : 'çôù/äçìó', +searchreplace_allreplaced : 'îçøåæú äçéôåù äåçìôä áëì î÷åí áå äéà ðîöàä.', +searchreplace_findwhat : 'îä ìçôù', +searchreplace_replacewith : 'ìäçìéó á-', +searchreplace_direction : 'ëéååï', +searchreplace_up : 'ìîòìä', +searchreplace_down : 'ìîèä', +searchreplace_case : 'äúàí âåãì àåúéåú', +searchreplace_findnext : 'îöà àú äáà', +searchreplace_replace : 'äçìó', +searchreplace_replaceall : 'äçìó äëì', +searchreplace_cancel : 'áèì' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/hu.js b/includes/tiny_mce/plugins/searchreplace/langs/hu.js new file mode 100644 index 0000000..a7317c9 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/hu.js @@ -0,0 +1,21 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Keresés', +searchreplace_searchnext_desc : 'Újra keresés', +searchreplace_replace_desc : 'Keres/Cserél', +searchreplace_notfound : 'A keresés elkészült. A keresési szöveg nem található.', +searchreplace_search_title : 'Keres', +searchreplace_replace_title : 'Keres/Cserél', +searchreplace_allreplaced : 'A kereséséi szöveg minden elõfordulása cserélve lett.', +searchreplace_findwhat : 'Mit keres', +searchreplace_replacewith : 'Mire cserél', +searchreplace_direction : 'Hatókör', +searchreplace_up : 'Fel', +searchreplace_down : 'Le', +searchreplace_case : 'Teljes szó', +searchreplace_findnext : 'Következõt keres', +searchreplace_replace : 'Cserél', +searchreplace_replaceall : 'Mindent cserél', +searchreplace_cancel : 'Mégse' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/is.js b/includes/tiny_mce/plugins/searchreplace/langs/is.js new file mode 100644 index 0000000..e8349fc --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/is.js @@ -0,0 +1,22 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Finna', +searchreplace_searchnext_desc : 'Finna aftur', +searchreplace_replace_desc : 'Finna/skipta', +searchreplace_notfound : 'Leit er lokið. Leitarorð fannst ekki.', +searchreplace_search_title : 'Finna', +searchreplace_replace_title : 'Finna/skipta', +searchreplace_allreplaced : 'Skipt var um öll tilvik.', +searchreplace_findwhat : 'Finna hvar', +searchreplace_replacewith : 'Skipta út fyrir ', +searchreplace_direction : 'Átt', +searchreplace_up : 'Upp', +searchreplace_down : 'Niður', +searchreplace_case : 'Passa há-/lágstafi', +searchreplace_findnext : 'Finna næst', +searchreplace_replace : 'Skipta', +searchreplace_replaceall : 'Skipta öllum', +searchreplace_cancel : 'Hætta við', +searchreplace_replace_delta_width : 30 +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/nb.js b/includes/tiny_mce/plugins/searchreplace/langs/nb.js new file mode 100644 index 0000000..4d8f058 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/nb.js @@ -0,0 +1,21 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Søk', +searchreplace_searchnext_desc : 'Søk igjen', +searchreplace_replace_desc : 'Søk/Erstatt', +searchreplace_notfound : 'Søkingen avsluttet. Fant ikke søkestrengen.', +searchreplace_search_title : 'Søk', +searchreplace_replace_title : 'Søk/Erstatt', +searchreplace_allreplaced : 'Alle treff på søkestrengen erstattes', +searchreplace_findwhat : 'Søk på', +searchreplace_replacewith : 'Erstatt med', +searchreplace_direction : 'Søkeretning', +searchreplace_up : 'Oppover', +searchreplace_down : 'Nedover', +searchreplace_case : 'Skill mellom store og små tegn', +searchreplace_findnext : 'Neste søk', +searchreplace_replace : 'Erstatt', +searchreplace_replaceall : 'Erstatt alle', +searchreplace_cancel : 'Avbryt' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/nl.js b/includes/tiny_mce/plugins/searchreplace/langs/nl.js new file mode 100644 index 0000000..ac0e0b4 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/nl.js @@ -0,0 +1,21 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Zoeken', +searchreplace_searchnext_desc : 'Opnieuw zoeken', +searchreplace_replace_desc : 'Zoeken/Vervangen', +searchreplace_notfound : 'Het doorzoeken van document is voltooid. De gezochte tekst is niet gevonden.', +searchreplace_search_title : 'Zoeken', +searchreplace_replace_title : 'Zoeken/Vervangen', +searchreplace_allreplaced : 'Alle zoekargumenten werden vervangen.', +searchreplace_findwhat : 'Zoeken naar', +searchreplace_replacewith : 'Vervangen door', +searchreplace_direction : 'Richting', +searchreplace_up : 'Omhoog', +searchreplace_down : 'Omlaag', +searchreplace_case : 'Identieke hoofdletters/kleine letters', +searchreplace_findnext : 'Volgende zoeken', +searchreplace_replace : 'Vervangen', +searchreplace_replaceall : 'Alles vervangen', +searchreplace_cancel : 'Annuleren' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/nn.js b/includes/tiny_mce/plugins/searchreplace/langs/nn.js new file mode 100644 index 0000000..80b5475 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/nn.js @@ -0,0 +1,21 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Søk', +searchreplace_searchnext_desc : 'Søk igjen', +searchreplace_replace_desc : 'Søk/Erstatt', +searchreplace_notfound : 'Søkingen avsluttet. Fant ikkje søkestrengen.', +searchreplace_search_title : 'Søk', +searchreplace_replace_title : 'Søk/Erstatt', +searchreplace_allreplaced : 'Alle treff på søkestrengen erstattes', +searchreplace_findwhat : 'Søk på', +searchreplace_replacewith : 'Erstatt med', +searchreplace_direction : 'Søkeretning', +searchreplace_up : 'Oppover', +searchreplace_down : 'Nedover', +searchreplace_case : 'Skill mellom store og små tegn', +searchreplace_findnext : 'Neste søk', +searchreplace_replace : 'Erstatt', +searchreplace_replaceall : 'Erstatt alle', +searchreplace_cancel : 'Avbryt' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/pl.js b/includes/tiny_mce/plugins/searchreplace/langs/pl.js new file mode 100644 index 0000000..70a5a05 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/pl.js @@ -0,0 +1,23 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'ZnajdŒ', +searchreplace_searchnext_desc : 'ZnajdŒ ponownie', +searchreplace_replace_desc : 'ZnajdŒ/Zast±p', +searchreplace_notfound : 'Ukoñczono wyszukiwanie. Poszukiwana fraza nie zosta³a odnaleziona.', +searchreplace_search_title : 'ZnajdŒ', +searchreplace_replace_title : 'ZnajdŒ/Zast±p', +searchreplace_allreplaced : 'Wszystkie wyst±pienia poszukiwanej frazy zosta³y zast±pione. ', +searchreplace_findwhat : 'ZnajdŒ', +searchreplace_replacewith : 'Zast±p', +searchreplace_direction : 'Kierunek', +searchreplace_up : 'Do góry', +searchreplace_down : 'Do do³u', +searchreplace_case : 'Wielko¶æ liter', +searchreplace_findnext : 'ZnajdŒ nastêpny', +searchreplace_replace : 'Zast±p', +searchreplace_replaceall : 'Zast±p wszystkie', +searchreplace_cancel : 'WyjdŒ' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/searchreplace/langs/pt_br.js b/includes/tiny_mce/plugins/searchreplace/langs/pt_br.js new file mode 100644 index 0000000..75e8bee --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/pt_br.js @@ -0,0 +1,29 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Procurar', +searchreplace_searchnext_desc : 'Procurar novamente', +searchreplace_replace_desc : 'Procurar/Substituir', +searchreplace_notfound : 'A procura foi concluída. A expressão procurada não foi encontrada.', +searchreplace_search_title : 'Procurar', +searchreplace_replace_title : 'Procurar/Substituir', +searchreplace_allreplaced : 'Todas as ocorrências encontradas foram substituídas.', +searchreplace_findwhat : 'Procurar por', +searchreplace_replacewith : 'Substituir com', +searchreplace_direction : 'Direção', +searchreplace_up : 'Acima', +searchreplace_down : 'Abaixo', +searchreplace_case : 'Procurar exatamente', +searchreplace_findnext : 'Procurar ,próxima', +searchreplace_replace : 'Substituir', +searchreplace_replaceall : 'Substituir ,tudo', +searchreplace_cancel : 'Cancelar' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/ru.js b/includes/tiny_mce/plugins/searchreplace/langs/ru.js new file mode 100644 index 0000000..ccf4278 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/ru.js @@ -0,0 +1,22 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Íàéòè', +searchreplace_searchnext_desc : 'Íàéòè îïÿòü', +searchreplace_replace_desc : 'Íàéòè/Çàìåíèòü', +searchreplace_notfound : 'Ïîèñê çàâåðøží. Èñêîìîå âûðàæåíèå íå íàéäåíî.', +searchreplace_search_title : 'Íàéòè', +searchreplace_replace_title : 'Íàéòè/Çàìåíèòü', +searchreplace_allreplaced : 'Çàìåíà áûëà âûïîëíåíà âî âñåõ ñëó÷àÿõ ñîâïàäåíèÿ èñêîìîãî âûðàæåíèÿ.', +searchreplace_findwhat : 'Íàéòè ÷òî', +searchreplace_replacewith : 'Çàìåíèòü ÷åì', +searchreplace_direction : 'Íàïðàâëåíèå', +searchreplace_up : 'Ââåðõ', +searchreplace_down : 'Âíèç', +searchreplace_case : 'Ñ ó÷žòîì ðåãèñòðà', +searchreplace_findnext : 'Íàéòè ñëåäóþùåå', +searchreplace_replace : 'Çàìåíèòü', +searchreplace_replaceall : 'Çàìåíèòü âåçäå', +searchreplace_cancel : 'Îòìåíèòü', +searchreplace_replace_delta_width : 150 +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js new file mode 100644 index 0000000..6f2d84a --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/ru_KOI8-R.js @@ -0,0 +1,21 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'îÁÊÔÉ', +searchreplace_searchnext_desc : 'îÁÊÔÉ ÏÐÑÔØ', +searchreplace_replace_desc : 'îÁÊÔÉ/úÁÍÅÎÉÔØ', +searchreplace_notfound : 'ðÏÉÓË ÚÁ×ÅÒÛ£Î. éÓËÏÍÏÅ ×ÙÒÁÖÅÎÉÅ ÎÅ ÎÁÊÄÅÎÏ.', +searchreplace_search_title : 'îÁÊÔÉ', +searchreplace_replace_title : 'îÁÊÔÉ/úÁÍÅÎÉÔØ', +searchreplace_allreplaced : 'úÁÍÅÎÁ ÂÙÌÁ ×ÙÐÏÌÎÅÎÁ ×Ï ×ÓÅÈ ÓÌÕÞÁÑÈ ÓÏ×ÐÁÄÅÎÉÑ ÉÓËÏÍÏÇÏ ×ÙÒÁÖÅÎÉÑ.', +searchreplace_findwhat : 'îÁÊÔÉ ÞÔÏ', +searchreplace_replacewith : 'úÁÍÅÎÉÔØ ÞÅÍ', +searchreplace_direction : 'îÁÐÒÁ×ÌÅÎÉÅ', +searchreplace_up : '÷×ÅÒÈ', +searchreplace_down : '÷ÎÉÚ', +searchreplace_case : 'ó ÕÞ£ÔÏÍ ÒÅÇÉÓÔÒÁ', +searchreplace_findnext : 'îÁÊÔÉ ÓÌÅÄÕÀÝÅÅ', +searchreplace_replace : 'úÁÍÅÎÉÔØ', +searchreplace_replaceall : 'úÁÍÅÎÉÔØ ×ÅÚÄÅ', +searchreplace_cancel : 'ïÔÍÅÎÉÔØ' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js new file mode 100644 index 0000000..79885c5 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/ru_UTF-8.js @@ -0,0 +1,21 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'НайтО', +searchreplace_searchnext_desc : 'НайтО Ппять', +searchreplace_replace_desc : 'НайтО/ЗаЌеМОть', +searchreplace_notfound : 'ППОск завершёМ. ИскПЌПе выражеМОе Ме МайЎеМП.', +searchreplace_search_title : 'НайтО', +searchreplace_replace_title : 'НайтО/ЗаЌеМОть', +searchreplace_allreplaced : 'ЗаЌеМа была выпПлМеМа вП всех случаях сПвпаЎеМОя ОскПЌПгП выражеМОя.', +searchreplace_findwhat : 'НайтО чтП', +searchreplace_replacewith : 'ЗаЌеМОть чеЌ', +searchreplace_direction : 'НаправлеМОе', +searchreplace_up : 'Вверх', +searchreplace_down : 'ВМОз', +searchreplace_case : 'С учётПЌ регОстра', +searchreplace_findnext : 'НайтО ÑÐ»ÐµÐŽÑƒÑŽÑ‰ÐµÐµ', +searchreplace_replace : 'ЗаЌеМОть', +searchreplace_replaceall : 'ЗаЌеМОть Ð²ÐµÐ·ÐŽÐµ', +searchreplace_cancel : 'ОтЌеМОть' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/sk.js b/includes/tiny_mce/plugins/searchreplace/langs/sk.js new file mode 100644 index 0000000..6539956 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/sk.js @@ -0,0 +1,29 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Nájdi', +searchreplace_searchnext_desc : 'Nájdi znova', +searchreplace_replace_desc : 'Nájdi/NahradiÅ¥', +searchreplace_notfound : 'VyhÄŸadávanie ukončené. ReÅ¥azec nemusel byÅ¥ nájdenÜ.', +searchreplace_search_title : 'Nájdi', +searchreplace_replace_title : 'Nájdi/NahradiÅ¥', +searchreplace_allreplaced : 'VÅ¡etky vÜskyty reÅ¥azca boly zmenené.', +searchreplace_findwhat : 'NájsÅ¥', +searchreplace_replacewith : 'NahradiÅ¥', +searchreplace_direction : 'Smer', +searchreplace_up : 'Nahor', +searchreplace_down : 'Dole', +searchreplace_case : 'Presná shoda', +searchreplace_findnext : 'Nájdi Äalší', +searchreplace_replace : 'NahradiÅ¥', +searchreplace_replaceall : 'NahradiÅ¥ vÅ¡etko', +searchreplace_cancel : 'ZruÅ¡iÅ¥' +}); + diff --git a/includes/tiny_mce/plugins/searchreplace/langs/sv.js b/includes/tiny_mce/plugins/searchreplace/langs/sv.js new file mode 100644 index 0000000..87fb12c --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/sv.js @@ -0,0 +1,21 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +searchreplace_search_desc : 'Sök', +searchreplace_searchnext_desc : 'Sök igen', +searchreplace_replace_desc : 'Sök/Ersätt', +searchreplace_notfound : 'Sökningen är slutförd. Söksträngen kunde inte hittas.', +searchreplace_search_title : 'Sök', +searchreplace_replace_title : 'Sök/Ersätt', +searchreplace_allreplaced : 'Alla träffar på söksträngen ersattes', +searchreplace_findwhat : 'Sök på', +searchreplace_replacewith : 'Ersätt med', +searchreplace_direction : 'Sökriktning', +searchreplace_up : 'Uppåt', +searchreplace_down : 'Neråt', +searchreplace_case : 'Matcha gemener/VERSALER', +searchreplace_findnext : 'Sök nästa', +searchreplace_replace : 'Ersätt', +searchreplace_replaceall : 'Ersätt alla', +searchreplace_cancel : 'Avbryt' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/zh_cn.js b/includes/tiny_mce/plugins/searchreplace/langs/zh_cn.js new file mode 100644 index 0000000..33e0da5 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/zh_cn.js @@ -0,0 +1,21 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +searchreplace_search_desc : '²éÕÒ', +searchreplace_searchnext_desc : 'ÔَβéÕÒ', +searchreplace_replace_desc : '²éÕÒ/Ìæ»»', +searchreplace_notfound : 'ËÑË÷Íê±Ï£¬Ã»ÓÐÕÒµœÒª²éÕÒµÄ×Ö·ûŽ®¡£', +searchreplace_search_title : '²éÕÒ', +searchreplace_replace_title : '²éÕÒ/Ìæ»»', +searchreplace_allreplaced : 'ËùÓзûºÏÌõŒþµÄ×Ö·ûŽ®ÒÑÌæ»»Íê±Ï¡£', +searchreplace_findwhat : '²éÕÒ', +searchreplace_replacewith : 'Ìæ»»Îª', +searchreplace_direction : '·œÏò', +searchreplace_up : 'ÏòÉÏ', +searchreplace_down : 'ÏòÏÂ', +searchreplace_case : 'Æ¥ÅäŽóСЎ', +searchreplace_findnext : '²éÕÒÏÂÒ»žö', +searchreplace_replace : 'Ìæ»»', +searchreplace_replaceall : 'È«²¿Ìæ»»', +searchreplace_cancel : 'È¡Ïû' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/zh_tw.js b/includes/tiny_mce/plugins/searchreplace/langs/zh_tw.js new file mode 100644 index 0000000..19e71f2 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/zh_tw.js @@ -0,0 +1,22 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +searchreplace_search_desc : '¬džß', +searchreplace_searchnext_desc : 'ŠAŠž¬džß', +searchreplace_replace_desc : '¬džß©ÎŽÀŽ«', +searchreplace_notfound : '€w§¹Šš¬džß¡CšS§äšì«ü©wªºŠrŠê¡C', +searchreplace_search_title : '¬džß', +searchreplace_replace_title : '¬džß©ÎŽÀŽ«', +searchreplace_allreplaced : '©Òг§äšìªºŠrŠê€w§¹ŠšŽÀŽ«', +searchreplace_findwhat : '§ä€°»ò', +searchreplace_replacewith : 'ŽÀŽ«Šš', +searchreplace_direction : '€èŠV', +searchreplace_up : '©¹€W', +searchreplace_down : 'ŠV€U', +searchreplace_case : '¬Û²Åµ²ªG', +searchreplace_findnext : '¬džß€U­Ó', +searchreplace_replace : 'ŽÀŽ«', +searchreplace_replaceall : '¥þ³¡ŽÀŽ«', +searchreplace_cancel : 'šú®ø' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js new file mode 100644 index 0000000..de30d42 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/langs/zh_tw_utf8.js @@ -0,0 +1,22 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +searchreplace_search_desc : '查詢', +searchreplace_searchnext_desc : '再次查詢', +searchreplace_replace_desc : '查詢或替換', +searchreplace_notfound : '已完成查詢。沒扟到指定的字䞲。', +searchreplace_search_title : '查詢', +searchreplace_replace_title : '查詢或替換', +searchreplace_allreplaced : '所有扟到的字䞲已完成替換', +searchreplace_findwhat : '扟什麌', +searchreplace_replacewith : '替換成', +searchreplace_direction : '方向', +searchreplace_up : '埀䞊', +searchreplace_down : '向䞋', +searchreplace_case : '盞笊結果', +searchreplace_findnext : '查詢䞋個', +searchreplace_replace : '替換', +searchreplace_replaceall : '党郚替換', +searchreplace_cancel : '取消' +}); diff --git a/includes/tiny_mce/plugins/searchreplace/readme.txt b/includes/tiny_mce/plugins/searchreplace/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/searchreplace/replace.htm b/includes/tiny_mce/plugins/searchreplace/replace.htm new file mode 100644 index 0000000..93eda47 --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/replace.htm @@ -0,0 +1,49 @@ + + + {$lang_searchreplace_replace_title} + + + + + +
+ + + + + + + + + + + + + + + +
+ + + + + + + +
+ + + + +
+ + + + + + + +
+
+ + diff --git a/includes/tiny_mce/plugins/searchreplace/search.htm b/includes/tiny_mce/plugins/searchreplace/search.htm new file mode 100644 index 0000000..4cf7fdf --- /dev/null +++ b/includes/tiny_mce/plugins/searchreplace/search.htm @@ -0,0 +1,42 @@ + + + {$lang_searchreplace_search_title} + + + + + +
+ + + + + + + + + + +
 
+ + + + + + + +
+ + + + +
+ + + + + +
+
+ + diff --git a/includes/tiny_mce/plugins/table/cell.htm b/includes/tiny_mce/plugins/table/cell.htm new file mode 100644 index 0000000..e30fb88 --- /dev/null +++ b/includes/tiny_mce/plugins/table/cell.htm @@ -0,0 +1,182 @@ + + + {$lang_table_cell_title} + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/table/css/cell.css b/includes/tiny_mce/plugins/table/css/cell.css new file mode 100644 index 0000000..a47cc1a --- /dev/null +++ b/includes/tiny_mce/plugins/table/css/cell.css @@ -0,0 +1,17 @@ +/* CSS file for cell dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#class { + width: 150px; +} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/table/css/row.css b/includes/tiny_mce/plugins/table/css/row.css new file mode 100644 index 0000000..0e397db --- /dev/null +++ b/includes/tiny_mce/plugins/table/css/row.css @@ -0,0 +1,25 @@ +/* CSS file for row dialog in the table plugin */ + +.panel_wrapper div.current { + height: 200px; +} + +.advfield { + width: 200px; +} + +#action { + margin-bottom: 3px; +} + +#rowtype,#align,#valign,#class,#height { + width: 150px; +} + +#height { + width: 50px; +} + +.col2 { + padding-left: 20px; +} diff --git a/includes/tiny_mce/plugins/table/css/table.css b/includes/tiny_mce/plugins/table/css/table.css new file mode 100644 index 0000000..82bb548 --- /dev/null +++ b/includes/tiny_mce/plugins/table/css/table.css @@ -0,0 +1,13 @@ +/* CSS file for table dialog in the table plugin */ + +.panel_wrapper div.current { + height: 220px; +} + +.advfield { + width: 200px; +} + +#class { + width: 150px; +} diff --git a/includes/tiny_mce/plugins/table/editor_plugin.js b/includes/tiny_mce/plugins/table/editor_plugin.js new file mode 100644 index 0000000..7f531e4 --- /dev/null +++ b/includes/tiny_mce/plugins/table/editor_plugin.js @@ -0,0 +1 @@ +tinyMCE.importPluginLanguagePack('table','en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk');function TinyMCE_table_getInfo(){return{longname:'Tables',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_table_initInstance(inst){if(tinyMCE.isGecko){var doc=inst.getDoc();tinyMCE.addEvent(doc,"mouseup",TinyMCE_table_mouseDownHandler);}inst.tableRowClipboard=null;}function TinyMCE_table_mouseDownHandler(e){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var focusElm=tinyMCE.selectedInstance.getFocusElement();if(elm.nodeName=="BODY"&&(focusElm.nodeName=="TD"||focusElm.nodeName=="TH"||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TD")||(focusElm.parentNode&&focusElm.parentNode.nodeName=="TH"))){window.setTimeout(function(){var tableElm=tinyMCE.getParentElement(focusElm,"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);},10);}}function TinyMCE_table_getControlHTML(control_name){var controls=new Array(['table','table.gif','{$lang_table_desc}','mceInsertTable',true],['delete_col','table_delete_col.gif','{$lang_table_delete_col_desc}','mceTableDeleteCol'],['delete_row','table_delete_row.gif','{$lang_table_delete_row_desc}','mceTableDeleteRow'],['col_after','table_insert_col_after.gif','{$lang_table_col_after_desc}','mceTableInsertColAfter'],['col_before','table_insert_col_before.gif','{$lang_table_col_before_desc}','mceTableInsertColBefore'],['row_after','table_insert_row_after.gif','{$lang_table_row_after_desc}','mceTableInsertRowAfter'],['row_before','table_insert_row_before.gif','{$lang_table_row_before_desc}','mceTableInsertRowBefore'],['row_props','table_row_props.gif','{$lang_table_row_desc}','mceTableRowProps',true],['cell_props','table_cell_props.gif','{$lang_table_cell_desc}','mceTableCellProps',true],['split_cells','table_split_cells.gif','{$lang_table_split_cells_desc}','mceTableSplitCells',true],['merge_cells','table_merge_cells.gif','{$lang_table_merge_cells_desc}','mceTableMergeCells',true]);for(var i=0;i4?but[4]:false)+(but.length>5?', \''+but[5]+'\'':'')+');return false;';if(but[0]==control_name&&(tinyMCE.isMSIE||!tinyMCE.settings['button_tile_map']))return '';else if(but[0]==control_name)return '';}if(control_name=="tablecontrols"){var html="";html+=tinyMCE.getControlHTML("table");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_props");html+=tinyMCE.getControlHTML("cell_props");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("row_before");html+=tinyMCE.getControlHTML("row_after");html+=tinyMCE.getControlHTML("delete_row");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("col_before");html+=tinyMCE.getControlHTML("col_after");html+=tinyMCE.getControlHTML("delete_col");html+=tinyMCE.getControlHTML("separator");html+=tinyMCE.getControlHTML("split_cells");html+=tinyMCE.getControlHTML("merge_cells");return html;}return "";}function TinyMCE_table_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceInsertTable":case "mceTableRowProps":case "mceTableCellProps":case "mceTableSplitCells":case "mceTableMergeCells":case "mceTableInsertRowBefore":case "mceTableInsertRowAfter":case "mceTableDeleteRow":case "mceTableInsertColBefore":case "mceTableInsertColAfter":case "mceTableDeleteCol":case "mceTableCutRow":case "mceTableCopyRow":case "mceTablePasteRowBefore":case "mceTablePasteRowAfter":case "mceTableDelete":var inst=tinyMCE.getInstanceById(editor_id);inst.execCommand('mceBeginUndoLevel');TinyMCE_table_doExecCommand(editor_id,element,command,user_interface,value);inst.execCommand('mceEndUndoLevel');return true;}return false;}function TinyMCE_table_doExecCommand(editor_id,element,command,user_interface,value){var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();var trElm=tinyMCE.getParentElement(focusElm,"tr");var tdElm=tinyMCE.getParentElement(focusElm,"td,th");var tableElm=tinyMCE.getParentElement(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i0&&inArray(ar[i],v))return true;if(ar[i]==v)return true;}return false;}function makeTD(){var newTD=doc.createElement("td");newTD.innerHTML=" ";}function getColRowSpan(td){var colspan=tinyMCE.getAttrib(td,"colspan");var rowspan=tinyMCE.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan};}function getCellPos(grid,td){for(var y=0;y1){for(var i=x;i1)td.rowSpan=sd.rowspan+1;lastElm=td;}deleteMarked(tableElm);}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node;}return null;}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td);}while((td=nexttd)!=null);}}while((tr=next)!=null);}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD);}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1;}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true;}lastTDElm=tdElm;}}deleteMarked(tableElm);cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;inst.selectNode(getCell(grid,cpos.rowindex,0),true,true);break;case "mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);newTD.innerHTML=" ";newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD);}else tdElm.colSpan++;lastTDElm=tdElm;}}break;case "mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if(grid.length>1&&grid[0].length<=1){tableElm.parentNode.removeChild(tableElm);return true;}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm);}lastTDElm=tdElm;}}cpos.cellindex--;if(cpos.cellindex<0)cpos.cellindex=0;inst.selectNode(getCell(grid,0,cpos.cellindex),true,true);break;case "mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");break;case "mceTableMergeCells":var rows=new Array();var sel=inst.getSel();var grid=getTableGrid(tableElm);if(tinyMCE.isMSIE||sel.rangeCount==1){if(user_interface){var template=new Array();var sp=getColRowSpan(tdElm);template['file']='../../plugins/table/merge_cells.htm';template['width']=250;template['height']=105+(tinyMCE.isNS7?25:0);template['width']+=tinyMCE.getLang('lang_table_merge_cells_delta_width',0);template['height']+=tinyMCE.getLang('lang_table_merge_cells_delta_height',0);tinyMCE.openWindow(template,{editor_id:inst.editorId,inline:"yes",action:"update",numcols:sp.colspan,numrows:sp.rowspan});return true;}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y0)rows[rows.length]=rowCells;}}}else{var cells=new Array();var sel=inst.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i0)rows[rows.length]=rowCells;}var curRow=new Array();var lastTR=null;for(var y=0;ycolSpan)colSpan=rowColSpan;lastRowSpan=-1;}var lastColSpan=-1;for(var x=0;xrowSpan)rowSpan=colRowSpan;lastColSpan=-1;}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm;}if(tdElm.rowSpan>1)tdElm.rowSpan--;}}}}break;}tableElm=tinyMCE.getParentElement(inst.getFocusElement(),"table");tinyMCE.handleVisualAid(tableElm,true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);tinyMCE.triggerNodeChange();inst.repaint();}return true;}return false;}function TinyMCE_table_handleNodeChange(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){var colspan="1",rowspan="1";var inst=tinyMCE.getInstanceById(editor_id);tinyMCE.switchClassSticky(editor_id+'_table','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonDisabled',true);if(tinyMCE.getParentElement(node,"tr"))tinyMCE.switchClassSticky(editor_id+'_row_props','mceButtonSelected',false);if(tdElm=tinyMCE.getParentElement(node,"td,th")){tinyMCE.switchClassSticky(editor_id+'_cell_props','mceButtonSelected',false);tinyMCE.switchClassSticky(editor_id+'_row_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_row_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_row','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_before','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_col_after','mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_delete_col','mceButtonNormal',false);colspan=tinyMCE.getAttrib(tdElm,"colspan");rowspan=tinyMCE.getAttrib(tdElm,"rowspan");colspan=colspan==""?"1":colspan;rowspan=rowspan==""?"1":rowspan;if(colspan!="1"||rowspan!="1")tinyMCE.switchClassSticky(editor_id+'_split_cells','mceButtonNormal',false);}if(tinyMCE.getParentElement(node,"table")){tinyMCE.switchClassSticky(editor_id+'_table','mceButtonSelected');tinyMCE.switchClassSticky(editor_id+'_merge_cells','mceButtonNormal',false);}} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/table/editor_plugin_src.js b/includes/tiny_mce/plugins/table/editor_plugin_src.js new file mode 100644 index 0000000..96bc815 --- /dev/null +++ b/includes/tiny_mce/plugins/table/editor_plugin_src.js @@ -0,0 +1,1041 @@ +/* Import plugin specific language pack */ +tinyMCE.importPluginLanguagePack('table', 'en,ar,cs,da,de,el,es,fi,fr_ca,hu,it,ja,ko,nl,nb,pl,pt,pt_br,sv,tw,zh_cn,fr,de,he,nb,ru,ru_KOI8-R,ru_UTF-8,nn,cy,is,zh_tw,zh_tw_utf8,sk'); + +function TinyMCE_table_getInfo() { + return { + longname : 'Tables', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_table.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +function TinyMCE_table_initInstance(inst) { + if (tinyMCE.isGecko) { + var doc = inst.getDoc(); + tinyMCE.addEvent(doc, "mouseup", TinyMCE_table_mouseDownHandler); + } + + inst.tableRowClipboard = null; +} + +function TinyMCE_table_mouseDownHandler(e) { + var elm = tinyMCE.isMSIE ? event.srcElement : e.target; + var focusElm = tinyMCE.selectedInstance.getFocusElement(); + + // If press on special Mozilla create TD/TR thingie + if (elm.nodeName == "BODY" && (focusElm.nodeName == "TD" || focusElm.nodeName == "TH" || (focusElm.parentNode && focusElm.parentNode.nodeName == "TD") ||(focusElm.parentNode && focusElm.parentNode.nodeName == "TH") )) { + window.setTimeout(function() { + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + }, 10); + } +} + +/** + * Returns the HTML contents of the table control. + */ +function TinyMCE_table_getControlHTML(control_name) { + var controls = new Array( + ['table', 'table.gif', '{$lang_table_desc}', 'mceInsertTable', true], + ['delete_col', 'table_delete_col.gif', '{$lang_table_delete_col_desc}', 'mceTableDeleteCol'], + ['delete_row', 'table_delete_row.gif', '{$lang_table_delete_row_desc}', 'mceTableDeleteRow'], + ['col_after', 'table_insert_col_after.gif', '{$lang_table_col_after_desc}', 'mceTableInsertColAfter'], + ['col_before', 'table_insert_col_before.gif', '{$lang_table_col_before_desc}', 'mceTableInsertColBefore'], + ['row_after', 'table_insert_row_after.gif', '{$lang_table_row_after_desc}', 'mceTableInsertRowAfter'], + ['row_before', 'table_insert_row_before.gif', '{$lang_table_row_before_desc}', 'mceTableInsertRowBefore'], + ['row_props', 'table_row_props.gif', '{$lang_table_row_desc}', 'mceTableRowProps', true], + ['cell_props', 'table_cell_props.gif', '{$lang_table_cell_desc}', 'mceTableCellProps', true], + ['split_cells', 'table_split_cells.gif', '{$lang_table_split_cells_desc}', 'mceTableSplitCells', true], + ['merge_cells', 'table_merge_cells.gif', '{$lang_table_merge_cells_desc}', 'mceTableMergeCells', true]); + + // Render table control + for (var i=0; i 4 ? but[4] : false) + (but.length > 5 ? ', \'' + but[5] + '\'' : '') + ');return false;'; + + if (but[0] == control_name && (tinyMCE.isMSIE || !tinyMCE.settings['button_tile_map'])) + return ''; + else if (but[0] == control_name) + return ''; + } + + // Special tablecontrols + if (control_name == "tablecontrols") { + var html = ""; + + html += tinyMCE.getControlHTML("table"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_props"); + html += tinyMCE.getControlHTML("cell_props"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("row_before"); + html += tinyMCE.getControlHTML("row_after"); + html += tinyMCE.getControlHTML("delete_row"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("col_before"); + html += tinyMCE.getControlHTML("col_after"); + html += tinyMCE.getControlHTML("delete_col"); + html += tinyMCE.getControlHTML("separator"); + html += tinyMCE.getControlHTML("split_cells"); + html += tinyMCE.getControlHTML("merge_cells"); + + return html; + } + + return ""; +} + +/** + * Executes the table commands. + */ +function TinyMCE_table_execCommand(editor_id, element, command, user_interface, value) { + // Is table command + switch (command) { + case "mceInsertTable": + case "mceTableRowProps": + case "mceTableCellProps": + case "mceTableSplitCells": + case "mceTableMergeCells": + case "mceTableInsertRowBefore": + case "mceTableInsertRowAfter": + case "mceTableDeleteRow": + case "mceTableInsertColBefore": + case "mceTableInsertColAfter": + case "mceTableDeleteCol": + case "mceTableCutRow": + case "mceTableCopyRow": + case "mceTablePasteRowBefore": + case "mceTablePasteRowAfter": + case "mceTableDelete": + var inst = tinyMCE.getInstanceById(editor_id); + + inst.execCommand('mceBeginUndoLevel'); + TinyMCE_table_doExecCommand(editor_id, element, command, user_interface, value); + inst.execCommand('mceEndUndoLevel'); + + return true; + } + + // Pass to next handler in chain + return false; +} + +/** + * Executes the table commands. + */ +function TinyMCE_table_doExecCommand(editor_id, element, command, user_interface, value) { + var inst = tinyMCE.getInstanceById(editor_id); + var focusElm = inst.getFocusElement(); + var trElm = tinyMCE.getParentElement(focusElm, "tr"); + var tdElm = tinyMCE.getParentElement(focusElm, "td,th"); + var tableElm = tinyMCE.getParentElement(focusElm, "table"); + var doc = inst.contentWindow.document; + var tableBorder = tableElm ? tableElm.getAttribute("border") : ""; + + // Get first TD if no TD found + if (trElm && tdElm == null) + tdElm = trElm.cells[0]; + + // ------- Inner functions --------- + function inArray(ar, v) { + for (var i=0; i 0 && inArray(ar[i], v)) + return true; + + // Found value + if (ar[i] == v) + return true; + } + + return false; + } + + function makeTD() { + var newTD = doc.createElement("td"); + newTD.innerHTML = " "; + } + + function getColRowSpan(td) { + var colspan = tinyMCE.getAttrib(td, "colspan"); + var rowspan = tinyMCE.getAttrib(td, "rowspan"); + + colspan = colspan == "" ? 1 : parseInt(colspan); + rowspan = rowspan == "" ? 1 : parseInt(rowspan); + + return {colspan : colspan, rowspan : rowspan}; + } + + function getCellPos(grid, td) { + for (var y=0; y 1) { // Remove due to colspan + for (var i=x; i 1) + td.rowSpan = sd.rowspan + 1; + + lastElm = td; + } + + deleteMarked(tableElm); + } + } + + function prevElm(node, name) { + while ((node = node.previousSibling) != null) { + if (node.nodeName == name) + return node; + } + + return null; + } + + function nextElm(node, names) { + var namesAr = names.split(','); + + while ((node = node.nextSibling) != null) { + for (var i=0; i 1) { + do { + var nexttd = nextElm(td, "TD,TH"); + + if (td._delete) + td.parentNode.removeChild(td); + } while ((td = nexttd) != null); + } + } while ((tr = next) != null); + } + + function addRows(td_elm, tr_elm, rowspan) { + // Add rows + td_elm.rowSpan = 1; + var trNext = nextElm(tr_elm, "TR"); + for (var i=1; i 1) { + var newTD = cells[x].cloneNode(true); + var sd = getColRowSpan(cells[x]); + + newTD.rowSpan = sd.rowspan - 1; + + var nextTD = nextTR.cells[x]; + + if (nextTD == null) + nextTR.appendChild(newTD); + else + nextTR.insertBefore(newTD, nextTD); + } + } + + // Delete cells + var lastTDElm = null; + for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd.rowspan > 1) { + tdElm.rowSpan = sd.rowspan - 1; + } else { + trElm = tdElm.parentNode; + + if (trElm.parentNode) + trElm._delete = true; + } + + lastTDElm = tdElm; + } + } + + deleteMarked(tableElm); + + cpos.rowindex--; + if (cpos.rowindex < 0) + cpos.rowindex = 0; + + inst.selectNode(getCell(grid, cpos.rowindex, 0), true, true); + break; + + case "mceTableInsertColBefore": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + tdElm.parentNode.insertBefore(newTD, tdElm); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + break; + + case "mceTableInsertColAfter": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] == 1) { + var newTD = doc.createElement(tdElm.nodeName); + + newTD.innerHTML = " "; + newTD.rowSpan = tdElm.rowSpan; + + var nextTD = nextElm(tdElm, "TD,TH"); + if (nextTD == null) + tdElm.parentNode.appendChild(newTD); + else + nextTD.parentNode.insertBefore(newTD, nextTD); + } else + tdElm.colSpan++; + + lastTDElm = tdElm; + } + } + break; + + case "mceTableDeleteCol": + if (!trElm || !tdElm) + return true; + + var grid = getTableGrid(tableElm); + var cpos = getCellPos(grid, tdElm); + var lastTDElm = null; + + // Only one col, remove whole table + if (grid.length > 1 && grid[0].length <= 1) { + tableElm.parentNode.removeChild(tableElm); + return true; + } + + // Delete cells + for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) { + if (tdElm != lastTDElm) { + var sd = getColRowSpan(tdElm); + + if (sd['colspan'] > 1) + tdElm.colSpan = sd['colspan'] - 1; + else { + if (tdElm.parentNode) + tdElm.parentNode.removeChild(tdElm); + } + + lastTDElm = tdElm; + } + } + + cpos.cellindex--; + if (cpos.cellindex < 0) + cpos.cellindex = 0; + + inst.selectNode(getCell(grid, 0, cpos.cellindex), true, true); + break; + + case "mceTableSplitCells": + if (!trElm || !tdElm) + return true; + + var spandata = getColRowSpan(tdElm); + + var colspan = spandata["colspan"]; + var rowspan = spandata["rowspan"]; + + // Needs splitting + if (colspan > 1 || rowspan > 1) { + // Generate cols + tdElm.colSpan = 1; + for (var i=1; i 1) + addRows(newTD, trElm, rowspan); + } + + addRows(tdElm, trElm, rowspan); + } + + // Apply visual aids + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + break; + + case "mceTableMergeCells": + var rows = new Array(); + var sel = inst.getSel(); + var grid = getTableGrid(tableElm); + + if (tinyMCE.isMSIE || sel.rangeCount == 1) { + if (user_interface) { + // Setup template + var template = new Array(); + var sp = getColRowSpan(tdElm); + + template['file'] = '../../plugins/table/merge_cells.htm'; + template['width'] = 250; + template['height'] = 105 + (tinyMCE.isNS7 ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_table_merge_cells_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_table_merge_cells_delta_height', 0); + + // Open window + tinyMCE.openWindow(template, {editor_id : inst.editorId, inline : "yes", action : "update", numcols : sp.colspan, numrows : sp.rowspan}); + + return true; + } else { + var numRows = parseInt(value['numrows']); + var numCols = parseInt(value['numcols']); + var cpos = getCellPos(grid, tdElm); + + if (("" + numRows) == "NaN") + numRows = 1; + + if (("" + numCols) == "NaN") + numCols = 1; + + // Get rows and cells + var tRows = tableElm.rows; + for (var y=cpos.rowindex; y 0) + rows[rows.length] = rowCells; + } + + //return true; + } + } else { + var cells = new Array(); + var sel = inst.getSel(); + var lastTR = null; + var curRow = null; + var x1 = -1, y1 = -1, x2, y2; + + // Only one cell selected, whats the point? + if (sel.rangeCount < 2) + return true; + + // Get all selected cells + for (var i=0; i 0) + rows[rows.length] = rowCells; + } + + // Find selected cells in grid and box + var curRow = new Array(); + var lastTR = null; + for (var y=0; y colSpan) + colSpan = rowColSpan; + + lastRowSpan = -1; + } + + // Validate vertical and get total rowspan + var lastColSpan = -1; + for (var x=0; x rowSpan) + rowSpan = colRowSpan; + + lastColSpan = -1; + } + + // Setup td + tdElm = rows[0][0]; + tdElm.rowSpan = rowSpan; + tdElm.colSpan = colSpan; + + // Merge cells + for (var y=0; y 0)) + tdElm.innerHTML += html; + + // Not current cell + if (rows[y][x] != tdElm && !rows[y][x]._deleted) { + var cpos = getCellPos(grid, rows[y][x]); + var tr = rows[y][x].parentNode; + + tr.removeChild(rows[y][x]); + rows[y][x]._deleted = true; + + // Empty TR, remove it + if (!tr.hasChildNodes()) { + tr.parentNode.removeChild(tr); + + var lastCell = null; + for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) { + if (cellElm != lastCell && cellElm.rowSpan > 1) + cellElm.rowSpan--; + + lastCell = cellElm; + } + + if (tdElm.rowSpan > 1) + tdElm.rowSpan--; + } + } + } + } + + break; + } + + tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + tinyMCE.handleVisualAid(tableElm, true, tinyMCE.settings['visual'], tinyMCE.selectedInstance); + tinyMCE.triggerNodeChange(); + inst.repaint(); + } + + return true; + } + + // Pass to next handler in chain + return false; +} + +function TinyMCE_table_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) { + var colspan = "1", rowspan = "1"; + + var inst = tinyMCE.getInstanceById(editor_id); + + // Reset table controls + tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonDisabled', true); + + // Within a tr element + if (tinyMCE.getParentElement(node, "tr")) + tinyMCE.switchClassSticky(editor_id + '_row_props', 'mceButtonSelected', false); + + // Within a td element + if (tdElm = tinyMCE.getParentElement(node, "td,th")) { + tinyMCE.switchClassSticky(editor_id + '_cell_props', 'mceButtonSelected', false); + tinyMCE.switchClassSticky(editor_id + '_row_before', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_row_after', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_delete_row', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_col_before', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_col_after', 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_delete_col', 'mceButtonNormal', false); + + colspan = tinyMCE.getAttrib(tdElm, "colspan"); + rowspan = tinyMCE.getAttrib(tdElm, "rowspan"); + + colspan = colspan == "" ? "1" : colspan; + rowspan = rowspan == "" ? "1" : rowspan; + + if (colspan != "1" || rowspan != "1") + tinyMCE.switchClassSticky(editor_id + '_split_cells', 'mceButtonNormal', false); + } + + // Within table + if (tinyMCE.getParentElement(node, "table")) { + tinyMCE.switchClassSticky(editor_id + '_table', 'mceButtonSelected'); + tinyMCE.switchClassSticky(editor_id + '_merge_cells', 'mceButtonNormal', false); + } +} diff --git a/includes/tiny_mce/plugins/table/images/buttons.gif b/includes/tiny_mce/plugins/table/images/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..bfc1568bec918f0cf2bde452fef29209a1e61525 GIT binary patch literal 1356 zcmV-S1+)4`Nk%w1VcY-|0OcA00s;bJdYt0o;zD}j5-wV@rB|ZD`$A%pt)rr{m{M|^ z?4q;6^5T-Ra$LmEvd;aJx&CE;vtx3ExVyl2kFwauX!7^|v%b=Tul`br@G?qb*N1K5 z@BTtna-z1<($(ams=|Vr!lJtJa)6VPqOuYa5>jS@f~xXTaihYrdV-Ro)X>XflI}8A zjQ{`uA^8LW002J#EC2ui0Nel+000L6z@KnPEEEW}ShMmH zLSse*1u6y*D>iMKi)UoZGCNB|=E|2jXvR$WmSxy!L4NqlWbwjvnpUz7e`~d0{f+^@}fWQTQ*$^9hNYD^L2ZJb) zODGn3g~M~-J&~ai8#;miOJe~<5#AFE!0^C{C_cag4-cTAS~w;?FwKfBzW757|J6qy z2nJxV(_!_bBm#i-2?!(+C88(*0va?|qY^YI(1sGgRA?bsBTOWbhFfyjr4tQ3^u&jc zIT1rLXr`IW0=D3o(mKir&={LVxG92g#2M#<2Z-1i;7B3JQYT9fXfT2c0La+_ok`Hp z0|gXN2TKSzC?KT@m@?QQ6PpgvsS=)j)LGLeCrsK#JR1}wpeLt`AMS_G>#;THf$ zK7^1$1&GiZ0Db~?w5ut!YA^w7u*%wKVxl4uYN$36QG#VR5VixePfSZgwcBCqL}igo zCd9K()BwW-6QH2~E*z_5V2iovPSdU_HHe@aj|Sx6kq;>-AOa%w-W#m0{qkA_yy>pX zE;rN(@o5r@pp!%mjkT}>#SS%GRK*u_%&9L`3PVI@anvB*5=NzjLM{s^a)P@?q^!Zp zb2*n{-~KVbcY!SYp;z>-j#Ir7xiUj4jtk6mGB;Ip^^U`N6#0a4} zUa^=?to_g2~h3+KzIM(yqDEw{v33+VWCfYLcq*{{H^LvU=X>{iCqL z#mds6qN19*_y7O^A^8LW0018VEC2ui02BZe000G?;3tk`X`X1B5)?(KB@00mJQCSN zE9B*0hM>X2$p{t>MWmN#dOXbs;)npedOjg>x~OhU6O8zQIdH3l0a%P7cOqTD;bAdt z9{7i*gQ;>J6LlpUY-9lzat#_A1ttt^9EFODjU@vQ92^px5)&Jr43#7UY!VHM8yXcA lp(dna6O$XO2?L@dmz|!U8w?Bswyp)k#Kpum$jK!k06V*Ud_@2N literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_cell_props.gif b/includes/tiny_mce/plugins/table/images/table_cell_props.gif new file mode 100644 index 0000000000000000000000000000000000000000..bee7ed652f83476471ca0c0cfa5f2b72c6f98fc8 GIT binary patch literal 189 zcmV;u07CyqNk%w1VH5xq0K*6XGD>2SrMS}4+=8g`!qMXL>f*A!(w4mb{r>)O6%hbCQiN7b literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_delete.gif b/includes/tiny_mce/plugins/table/images/table_delete.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a00e6ad66aa907381ff742dfcb6aa2e2ec3df17 GIT binary patch literal 372 zcmZ?wbhEHb6k!lyxXJ(m|NsC0^y%lMRiD=FywtS()2v-TmLL0b@8#d4r!Jkk_37m0 zM~gQcGWJTIwCYe$T-JmI8#W!fv~uABRt5$QCMID*=gj%{@86?GkAPN#oj^XJ z_>+Z^fkBHw2V?}uPYi4m9i|p|=t%XSSWnQADz=v_wHnRY+F7p1ZrJmz#y(t)Zk*lZk_e*Nv}? zvvK;2S*`-yoScFy1X+02@GWu?C=+Cw&cngQwa#s0G0Os;9qa<@otLayy@rR6PvG!w R-U}BmUG%+r&B>9$8UT)8gMR=3 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_delete_col.gif b/includes/tiny_mce/plugins/table/images/table_delete_col.gif new file mode 100644 index 0000000000000000000000000000000000000000..91f53af02aacbe33b04f782efb164560887d3bfe GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Fa0s;azZ{ony{xV8pTyKn*qO$Jn>V2Z^b%c^$j^>)S z^85Syjgq3Ovcf`IasU7TA^8LW000jFEC2ui02BZe000C~@X1N5y*TU5Yg=F;j03m~ z*9S7AQZ5E+6`;WiE*xJ4;S4OrVLD zq^HC5lAo_~pYs0x{r~^~A^8LW000jFEC2ui02BZe000D7@X1N5y*TU5>G|Nna879^ z3V9~RxRnWO7y-xJIHT+-78`=#Vo@mc9)Jo^FeDZl1O#9@r7(*PC}E43Bq@Wics$6M ZU5s;*CQxUf_d3_{csz*D~813(lGjTD@2z{n9^mxAJO7)Ys5OF}UnY`dU@qbmky T#N$E3kp`{PZ$%b~i~s;TfG0;) literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_insert_row_after.gif b/includes/tiny_mce/plugins/table/images/table_insert_row_after.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c14466138007454958671320914d9a7d8a6db5 GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Od0s;b3hwZ}J{xV8pU2lbto3eVM^5XCQa(@5FN<(eWPqQV3Ig1XGua#QiUNM~QhRb*u41x>1^iLw6v{&bt_E>x1D!Tyq@xq`0#T6LwOvdL|b z(z4F}lDPhYn!-Y4ng9R*A^8LW000jFEC2ui02BZe000DY@X1N5y*TU5Y5HK87$oTl zLW8cziUMcq3atxINz(*;fcy>zVR(}yP=SSVxhOap#m7;QWHz6J=oGb%7 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_row_props.gif b/includes/tiny_mce/plugins/table/images/table_row_props.gif new file mode 100644 index 0000000000000000000000000000000000000000..e5c7cc37aaded685d68a6f1d0f5f204415258489 GIT binary patch literal 187 zcmV;s07U;sNk%w1VH5xq0K*CZGD>2SrMS}5-GZj_!qMXH@&2N=(w4mbqOihJVuJnt z{^sQ3lB)8xz|uleasU7TA^8LW000jFEC2ui02BZe000DN@X1N5y*TU5EBnkKj-9KxjG%0%ik9LBwDPfF*DxWw(Ncc#J3` p0@_Nzrf3x2h<5?KWxL^Wx|%>X2mX2#XaIzThJ+o7ii;Hy06QxAQu6=+ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/images/table_split_cells.gif b/includes/tiny_mce/plugins/table/images/table_split_cells.gif new file mode 100644 index 0000000000000000000000000000000000000000..8ccb1b5f89d35619c9fe7a81957305c93f3ed8fc GIT binary patch literal 210 zcmV;@04@JVNk%w1VH5xq0K)FI0=7!2VKkqmrb#i?scsvdKbY znlMRZVtuQCnZ&Zr{r~^~A^8LW000jFEC2ui02BZe000Dk@X1N5y*TU5Y5HK893<%p zLW8c%iY{mB3dRgiNz(*8!x#pIfU#7qN5Q2I~2E2l>h($ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/plugins/table/jscripts/cell.js b/includes/tiny_mce/plugins/table/jscripts/cell.js new file mode 100644 index 0000000..d0768a0 --- /dev/null +++ b/includes/tiny_mce/plugins/table/jscripts/cell.js @@ -0,0 +1,249 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor') + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style")); + + // Get table cell data + var celltype = tdElm.nodeName.toLowerCase(); + var align = tinyMCE.getAttrib(tdElm, 'align'); + var valign = tinyMCE.getAttrib(tdElm, 'valign'); + var width = trimSize(getStyle(tdElm, 'width', 'width')); + var height = trimSize(getStyle(tdElm, 'height', 'height')); + var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor')); + var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor')); + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false); + var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");; + var id = tinyMCE.getAttrib(tdElm, 'id'); + var lang = tinyMCE.getAttrib(tdElm, 'lang'); + var dir = tinyMCE.getAttrib(tdElm, 'dir'); + var scope = tinyMCE.getAttrib(tdElm, 'scope'); + + // Setup form + addClassesToList('class', 'table_cell_styles'); + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.backgroundimage.value = backgroundimage; + formObj.width.value = width; + formObj.height.value = height; + formObj.id.value = id; + formObj.lang.value = lang; + formObj.style.value = tinyMCE.serializeStyle(st); + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'valign', valign); + selectByValue(formObj, 'class', className); + selectByValue(formObj, 'celltype', celltype); + selectByValue(formObj, 'dir', dir); + selectByValue(formObj, 'scope', scope); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); +} + +function updateAction() { + tinyMCEPopup.restoreSelection(); + + var inst = tinyMCE.selectedInstance; + var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th"); + var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr"); + var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + var formObj = document.forms[0]; + + inst.execCommand('mceBeginUndoLevel'); + + switch (getSelectValue(formObj, 'action')) { + case "cell": + var celltype = getSelectValue(formObj, 'celltype'); + var scope = getSelectValue(formObj, 'scope'); + + if (tinyMCE.getParam("accessibility_warnings")) { + if (celltype == "th" && scope == "") + var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true)); + else + var answer = true; + + if (!answer) + return; + } + + updateCell(tdElm); + break; + + case "row": + var cell = trElm.firstChild; + + if (cell.nodeName != "TD" && cell.nodeName != "TH") + cell = nextCell(cell); + + do { + cell = updateCell(cell, true); + } while ((cell = nextCell(cell)) != null); + + break; + + case "all": + var rows = tableElm.getElementsByTagName("tr"); + + for (var i=0; i/g, '&gr;'); + + return ' ' + attrib + '="' + value + '"'; +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); + document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor'); + document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); + + var cols = 2, rows = 2, border = 0, cellpadding = "", cellspacing = ""; + var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; + var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = ""; + var inst = tinyMCE.selectedInstance; + var formObj = document.forms[0]; + var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table"); + + tinyMCE.tableElm = elm; + action = tinyMCE.getWindowArg('action'); + if (action == null) + action = tinyMCE.tableElm ? "update" : "insert"; + + if (tinyMCE.tableElm && action != "insert") { + var rowsAr = tinyMCE.tableElm.rows; + var cols = 0; + for (var i=0; i cols) + cols = rowsAr[i].cells.length; + + cols = cols; + rows = rowsAr.length; + + st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style")); + border = trimSize(getStyle(elm, 'border', 'borderWidth')); + cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', ""); + cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', ""); + width = trimSize(getStyle(elm, 'width', 'width')); + height = trimSize(getStyle(elm, 'height', 'height')); + bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor')); + bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor')); + align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align); + className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false); + id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id'); + summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary'); + style = tinyMCE.serializeStyle(st); + dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir'); + lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang'); + background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + + orgTableWidth = width; + orgTableHeight = height; + + action = "update"; + } + + addClassesToList('class', "table_styles"); + + // Update form + selectByValue(formObj, 'align', align); + selectByValue(formObj, 'class', className); + formObj.cols.value = cols; + formObj.rows.value = rows; + formObj.border.value = border; + formObj.cellpadding.value = cellpadding; + formObj.cellspacing.value = cellspacing; + formObj.width.value = width; + formObj.height.value = height; + formObj.bordercolor.value = bordercolor; + formObj.bgcolor.value = bgcolor; + formObj.id.value = id; + formObj.summary.value = summary; + formObj.style.value = style; + formObj.dir.value = dir; + formObj.lang.value = lang; + formObj.backgroundimage.value = background; + formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); + + updateColor('bordercolor_pick', 'bordercolor'); + updateColor('bgcolor_pick', 'bgcolor'); + + // Resize some elements + if (isVisible('backgroundimagebrowser')) + document.getElementById('backgroundimage').style.width = '180px'; + + // Disable some fields in update mode + if (action == "update") { + formObj.cols.disabled = true; + formObj.rows.disabled = true; + } +} + +function changedSize() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + var width = formObj.width.value; + if (width != "") + st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : ""; + else + st['width'] = ""; + + var height = formObj.height.value; + if (height != "") + st['height'] = getCSSSize(height); + else + st['height'] = ""; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBackgroundImage() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedBorder() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + // Update border width if the element has a color + if (formObj.border.value != "" && formObj.bordercolor.value != "") + st['border-width'] = formObj.border.value + "px"; + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedColor() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + st['background-color'] = formObj.bgcolor.value; + + if (formObj.bordercolor.value != "") { + st['border-color'] = formObj.bordercolor.value; + + // Add border-width if it's missing + if (!st['border-width']) + st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px"; + } + + formObj.style.value = tinyMCE.serializeStyle(st); +} + +function changedStyle() { + var formObj = document.forms[0]; + var st = tinyMCE.parseStyle(formObj.style.value); + + if (st['background-image']) + formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); + else + formObj.backgroundimage.value = ''; + + if (st['width']) + formObj.width.value = trimSize(st['width']); + + if (st['height']) + formObj.height.value = trimSize(st['height']); + + if (st['background-color']) { + formObj.bgcolor.value = st['background-color']; + updateColor('bgcolor_pick','bgcolor'); + } + + if (st['border-color']) { + formObj.bordercolor.value = st['border-color']; + updateColor('bordercolor_pick','bordercolor'); + } +} diff --git a/includes/tiny_mce/plugins/table/langs/ar.js b/includes/tiny_mce/plugins/table/langs/ar.js new file mode 100644 index 0000000..e115c98 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ar.js @@ -0,0 +1,43 @@ +// Arabic lang variables + +tinyMCE.addToLang('',{ +table_desc : 'إدراج/تحرير جدول', +table_insert_row_before_desc : 'Insert row before', +table_insert_row_after_desc : 'Insert row after', +table_delete_row_desc : 'حذف صفوف', +table_insert_col_before_desc : 'Insert column before', +table_insert_col_after_desc : 'Insert column after', +table_delete_col_desc : 'حذف أعمدة', +insert_table_title : 'إدراج/تحرير جدول', +insert_table_width : 'العرض', +insert_table_height : 'الارتفاع', +insert_table_cols : 'أعمدة', +insert_table_rows : 'صفوف', +insert_table_cellspacing : 'تباعد الخلايا', +insert_table_cellpadding : 'المسافة البادئة', +insert_table_border : 'سمك الحدود', +insert_table_align : 'المحاذاة', +insert_table_align_default : 'Default', +insert_table_align_left : 'يسار', +insert_table_align_right : 'يمين', +insert_table_align_middle : 'وسط', +insert_table_class : 'Class', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/cs.js b/includes/tiny_mce/plugins/table/langs/cs.js new file mode 100644 index 0000000..9193a0b --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/cs.js @@ -0,0 +1,49 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.10 2005/10/18 13:59:43 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +table_desc : 'VloÅŸit novou tabulku', +table_insert_row_before_desc : 'VloÅŸit řádek před', +table_insert_row_after_desc : 'VloÅŸit řádek po', +table_delete_row_desc : 'Smazat řádek', +table_insert_col_before_desc : 'VloÅŸit sloupec před', +table_insert_col_after_desc : 'VloÅŸit sloupec po', +table_delete_col_desc : 'Odstranit sloupec', +insert_table_title : 'VloÅŸit/upravit tabulku', +insert_table_width : 'Šířka', +insert_table_height : 'VÜška', +insert_table_cols : 'Sloupce', +insert_table_rows : 'Řádky', +insert_table_cellspacing : 'Vnější okraj buněk', +insert_table_cellpadding : 'Vnitřní okraj buněk', +insert_table_border : 'Rámeček', +insert_table_align : 'Zarovnání', +insert_table_align_default : 'VÜchozí', +insert_table_align_left : 'Vlevo', +insert_table_align_right : 'Vpravo', +insert_table_align_middle : 'Na střed', +insert_table_class : 'Třída', +table_row_title : 'Vlastnosti řádku', +table_cell_title : 'Vlastnosti buňky', +table_row_desc : 'Vlastnosti řádku', +table_cell_desc : 'Vlastnosti řádku', +insert_table_valign : 'Vertikální zarovnání', +insert_table_align_top : 'Nahoru', +insert_table_align_bottom : 'Dolů', +table_props_desc : 'Vlastnosti tabulky', +table_bordercolor : 'Barva rámečku', +table_bgcolor : 'Barva pozadí', +table_merge_cells_title : 'Sloučit buňky', +table_split_cells_desc : 'Rozdělit buňky', +table_merge_cells_desc : 'Sloučit buňky', +table_cut_row_desc : 'Vyjmout řádek', +table_copy_row_desc : 'Kopírovat řádek', +table_paste_row_before_desc : 'VloÅŸit řádek před', +table_paste_row_after_desc : 'VloÅŸit řádek za', +table_insert_desc : 'VloÅŸit tabulku' +}); + diff --git a/includes/tiny_mce/plugins/table/langs/cy.js b/includes/tiny_mce/plugins/table/langs/cy.js new file mode 100644 index 0000000..fa3d3b1 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/cy.js @@ -0,0 +1,76 @@ +// UK lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Cyffredinol', +advanced_tab : 'Uwch', +general_props : 'Priodoleddau cyffredinol', +advanced_props : 'Priodoleddau uwch', +desc : 'Mewnosod tabl newydd', +row_before_desc : 'Mewnosod rhes cyn', +row_after_desc : 'Mewnosod rhes ar ôl', +delete_row_desc : 'Dileu rhes', +col_before_desc : 'Mewnosod colofn cyn', +col_after_desc : 'Mewnosod colofn ar ôl', +delete_col_desc : 'Dileu colofn', +rowtype : 'Rhan tabl y rhes', +title : 'Mewnosod/golygu tabl', +width : 'Lled', +height : 'Uchder', +cols : 'Colofnau', +rows : 'Rhesi', +cellspacing : 'Bylchu celloedd', +cellpadding : 'Padio celliodd', +border : 'Ffin', +align : 'Unioni', +align_default : 'Arferol', +align_left : 'Chwith', +align_right : 'Dde', +align_middle : 'Canol', +row_title : 'Priodoleddau rhes tabl', +cell_title : 'Priodoleddau cell tabl', +cell_type : 'Math cell', +row_desc : 'Priodoleddau rhes tabl', +cell_desc : 'Priodoleddau cell tabl', +valign : 'Unioni fertigol', +align_top : 'Brig', +align_bottom : 'Gwaelod', +props_desc : 'Priodoleddau tabl', +bordercolor : 'Lliw ffin', +bgcolor : 'Lliw cefndir', +merge_cells_title : 'Uno celloedd tabl', +split_cells_desc : 'Rhannu celloedd tabl', +merge_cells_desc : 'Uno celloedd tabl', +cut_row_desc : 'Torri rhes tabl', +copy_row_desc : 'Copïo rhes tabl', +paste_row_before_desc : 'Gludo rhes tabl cyn', +paste_row_after_desc : 'Gludo rhes tabl ar ôl', +id : 'Id', +style: 'Arddull', +langdir : 'Cyfeiriad iaith', +langcode : 'Côd iaith', +mime : 'Math MIME y targed', +ltr : 'Chwith i\'r dde', +rtl : 'Dde i\'r chwith', +bgimage : 'Delwedd cefndir', +summary : 'Crynodeb', +td : "Data", +th : "Pennawd", +cell_cell : 'Diweddaru\'r gell bresennoll', +cell_row : 'Diweddaru holl gelloedd y rhes', +cell_all : 'Diweddaru holl gelloedd y tabl', +row_row : 'Diweddaru\'r rhes presennol', +row_odd : 'Diweddaru rhesi odrif y tabl', +row_even : 'Diweddaru rhesi eilrif y tabl', +row_all : 'Diweddaru holl rhesi\'r tabl', +thead : 'Pennawd Tabl', +tbody : 'Corff Tabl', +tfoot : 'Troedyn Tabl', +del : 'Dileu tabl', +scope : 'Maes', +row : 'Rhes', +col : 'Colofn', +rowgroup : 'Grŵp Rhesi', +colgroup : 'Grŵp Colofnau', +missing_scope: 'Wyt ti\'n sicr eisiau parhau heb gynnwys maes ar gyfer y cell pennawd tabl hwn? Heb un, gallai fod yn anodd i rai defnyddwyr gydag anableddau ddeall cynnwys neu ddata y tabl.', +cellprops_delta_width : 50 +}); diff --git a/includes/tiny_mce/plugins/table/langs/da.js b/includes/tiny_mce/plugins/table/langs/da.js new file mode 100644 index 0000000..0edaa88 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/da.js @@ -0,0 +1,69 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('table',{ +general_tab : 'Generelt', +advanced_tab : 'Avanceret', +general_props : 'Generelle egenskaber', +advanced_props : 'Avancerede egenskaber', +desc : 'Indsætter ny tabel', +row_before_desc : 'Indsæt række foran', +row_after_desc : 'Indsæt række efter', +delete_row_desc : 'Slet række', +col_before_desc : 'Indsæt kolonne foran', +col_after_desc : 'Indsæt kolonner efter', +delete_col_desc : 'Fjern kolonne', +rowtype : 'Række i tabeldelen', +title : 'Indsæt eller rediger tabel', +width : 'Bredde', +height : 'Højde', +cols : 'Kolonner', +rows : 'Rækker', +cellspacing : 'Cellemargin', +cellpadding : 'Indvendig margin', +border : 'Kant', +align : 'Justering', +align_default : 'Standard', +align_left : 'Venstre', +align_right : 'Højre', +align_middle : 'Centreret', +row_title : 'Rækkeegenskaber', +cell_title : 'Celleegenskaber', +cell_type : 'Celletype', +row_desc : 'Rækkeegenskaber', +cell_desc : 'Celleegenskaber', +valign : 'Vertikal justering', +align_top : 'Top', +align_bottom : 'Bund', +props_desc : 'Tabelegenskaber', +bordercolor : 'Kantfarve', +bgcolor : 'Baaggrundfarve', +merge_cells_title : 'Flet celler', +split_cells_desc : 'Del celler', +merge_cells_desc : 'Flet celler', +cut_row_desc : 'Del kolonne', +copy_row_desc : 'Kopier kolonne', +paste_row_before_desc : 'Indsæt kolonne foran', +paste_row_after_desc : 'Indsæt kolonne efter', +id : 'Tabel-Id', +style: 'Style', +langdir : 'Tekstretning', +langcode : 'Sprogkode', +mime : 'Target MIME type', +ltr : 'Venstre til højre', +rtl : 'Højre til venstre', +bgimage : 'Baggrundbillede', +summary : 'Opsummering', +td : "Data", +th : "Overskrift", +cell_cell : 'Opdater aktuel celle', +cell_row : 'Opdater alle celler i kolonnen', +cell_all : 'Opdater alle celler i tabellen', +row_row : 'Opdater aktuel kolonne', +row_odd : 'Opdater ulige kolonner i tabellen', +row_even : 'Opdater lige kolonner i tabellen', +row_all : 'Opdater alle kolonner i tabellen', +thead : 'Tabeloverskrift', +tbody : 'Tabelindhold', +tfoot : 'Tabelfodnote', +del : 'Slet tabel' +}); diff --git a/includes/tiny_mce/plugins/table/langs/de.js b/includes/tiny_mce/plugins/table/langs/de.js new file mode 100644 index 0000000..38de52a --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/de.js @@ -0,0 +1,76 @@ +// DE lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Allgemein', +advanced_tab : 'Erweitert', +general_props : 'Allgemeine Eigenschaften', +advanced_props : 'Erweiterte Eigenschaften', +desc : 'Neue Tabelle einfügen', +row_before_desc : 'Zeile oberhalb einfügen', +row_after_desc : 'Zeile unterhalb einfügen', +delete_row_desc : 'Zeile löschen', +col_before_desc : 'Spalte nach links einfügen', +col_after_desc : 'Spalte nach rechts einfügen', +delete_col_desc : 'Spalte löschen', +rowtype : 'Zeile in Tabellen-Teil', +title : 'Tabelle hinzufügen/bearbeiten', +width : 'Breite', +height : 'Höhe', +cols : 'Spalten', +rows : 'Zeilen', +cellspacing : 'Zellenabstand', +cellpadding : 'Zellenauffüllung', +border : 'Rahmen', +align : 'Ausrichtung', +align_default : 'Standard', +align_left : 'Links', +align_right : 'Rechts', +align_middle : 'Zentriert', +row_title : 'Zeileneigenschaften', +cell_title : 'Zelleneigenschaften', +cell_type : 'Zellentyp', +row_desc : 'Zeileneigenschaften', +cell_desc : 'Zelleneigenschaften', +valign : 'Vertikale Ausrichtung', +align_top : 'Oben', +align_bottom : 'Unten', +props_desc : 'Tabelleneigenschaften', +bordercolor : 'Rahmenfarbe', +bgcolor : 'Hintergrundfarbe', +merge_cells_title : 'Zellen zusammenfügen', +split_cells_desc : 'Zelle teilen', +merge_cells_desc : 'Zellen zusammenfügen', +cut_row_desc : 'Zeile ausschneiden', +copy_row_desc : 'Zeile kopieren', +paste_row_before_desc : 'Zeile oberhalb einfügen', +paste_row_after_desc : 'Zeile unterhalb einfügen', +id : 'ID', +style: 'CSS-Stil', +langdir : 'Sprachrichtung', +langcode : 'Sprachcode', +mime : 'MIME-Typ', +ltr : 'Von links nach rechts', +rtl : 'Von rechts nach links', +bgimage : 'Hintergrundfarbe', +summary : 'Zusammenfassung', +td : "Daten", +th : "Kopfzeile", +cell_cell : 'Diese Zelle aktualisieren', +cell_row : 'Alle Zellen in dieser Zeile aktualisieren', +cell_all : 'Alle Zellen in dieser Tabelle aktualisieren', +row_row : 'Diese Zeile aktualisieren', +row_odd : 'Ungerade Zeilen aktualisieren', +row_even : 'Gerade Zeilen aktualisieren', +row_all : 'Alle Zeilen in dieser Tabelle aktualisieren', +thead : 'Tabellenkopf', +tbody : 'Tabellenkörper', +tfoot : 'Tabellenfuß', +del : 'Tabelle löschen', +scope : 'Scope', +row : 'Row', +col : 'Col', +rowgroup : 'Row Group', +colgroup : 'Col Group', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.', +table_delta_width : 45 +}); diff --git a/includes/tiny_mce/plugins/table/langs/el.js b/includes/tiny_mce/plugins/table/langs/el.js new file mode 100644 index 0000000..51fb895 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/el.js @@ -0,0 +1,43 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +table_desc : 'ÅéóáãùãÞ ðßíáêá', +table_insert_row_before_desc : 'ÅéóáãùãÞ ãñáììÞò åðÜíù', +table_insert_row_after_desc : 'ÅéóáãùãÞ ãñáììÞò êÜôù', +table_delete_row_desc : 'ÄéáãñáöÞ ãñáììÞò', +table_insert_col_before_desc : 'ÅéóáãùãÞ óôÞëçò áñéóôåñÜ', +table_insert_col_after_desc : 'ÅéóáãùãÞ óôÞëçò äåîéÜ', +table_delete_col_desc : 'ÄéáãñáöÞ óôÞëçò', +insert_table_title : 'ÅéóáãùãÞ/Äéüñèùóç ðßíáêá', +insert_table_width : 'ÐëÜôïò', +insert_table_height : 'Ÿøïò', +insert_table_cols : 'ÓôÞëåò', +insert_table_rows : 'ÃñáììÝò', +insert_table_cellspacing : 'ÄéÜóôé÷ï', +insert_table_cellpadding : 'ÃÝìéóìá', +insert_table_border : 'Ðåñßãñáììá', +insert_table_align : 'Óôïß÷éóç', +insert_table_align_default : 'Ðñïêáè.', +insert_table_align_left : 'ÁñéóôåñÜ', +insert_table_align_right : 'ÄåîéÜ', +insert_table_align_middle : 'Óôï êÝíôñï', +insert_table_class : 'ÊëÜóç', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/en.js b/includes/tiny_mce/plugins/table/langs/en.js new file mode 100644 index 0000000..b061b34 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/en.js @@ -0,0 +1,75 @@ +// UK lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'General', +advanced_tab : 'Advanced', +general_props : 'General properties', +advanced_props : 'Advanced properties', +desc : 'Inserts a new table', +row_before_desc : 'Insert row before', +row_after_desc : 'Insert row after', +delete_row_desc : 'Delete row', +col_before_desc : 'Insert column before', +col_after_desc : 'Insert column after', +delete_col_desc : 'Remove column', +rowtype : 'Row in table part', +title : 'Insert/Modify table', +width : 'Width', +height : 'Height', +cols : 'Columns', +rows : 'Rows', +cellspacing : 'Cellspacing', +cellpadding : 'Cellpadding', +border : 'Border', +align : 'Alignment', +align_default : 'Default', +align_left : 'Left', +align_right : 'Right', +align_middle : 'Center', +row_title : 'Table row properties', +cell_title : 'Table cell properties', +cell_type : 'Cell type', +row_desc : 'Table row properties', +cell_desc : 'Table cell properties', +valign : 'Vertical alignment', +align_top : 'Top', +align_bottom : 'Bottom', +props_desc : 'Table properties', +bordercolor : 'Border color', +bgcolor : 'Background color', +merge_cells_title : 'Merge table cells', +split_cells_desc : 'Split table cells', +merge_cells_desc : 'Merge table cells', +cut_row_desc : 'Cut table row', +copy_row_desc : 'Copy table row', +paste_row_before_desc : 'Paste table row before', +paste_row_after_desc : 'Paste table row after', +id : 'Id', +style: 'Style', +langdir : 'Language direction', +langcode : 'Language code', +mime : 'Target MIME type', +ltr : 'Left to right', +rtl : 'Right to left', +bgimage : 'Background image', +summary : 'Summary', +td : "Data", +th : "Header", +cell_cell : 'Update current cell', +cell_row : 'Update all cells in row', +cell_all : 'Update all cells in table', +row_row : 'Update current row', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'Update all rows in table', +thead : 'Table Head', +tbody : 'Table Body', +tfoot : 'Table Foot', +del : 'Delete table', +scope : 'Scope', +row : 'Row', +col : 'Col', +rowgroup : 'Row Group', +colgroup : 'Col Group', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/es.js b/includes/tiny_mce/plugins/table/langs/es.js new file mode 100644 index 0000000..133ad7b --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/es.js @@ -0,0 +1,84 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('table',{ +general_tab : 'General', +advanced_tab : 'Avanzado', +general_props : 'Propiedades generales', +advanced_props : 'Propiedades avanzadas', +desc : 'Insertar/Modificar tabla', +row_before_desc : 'Insertar una fila antes', +row_after_desc : 'Insert una fila después', +delete_row_desc : 'Eliminar fila', +col_before_desc : 'Insertar una columna antes', +col_after_desc : 'Insertar una columna después', +delete_col_desc : 'Eliminar columna', +rowtype : 'File en parte de tabla', +title : 'Insertar/Modificar tabla', +width : 'Ancho', +height : 'ALto', +cols : 'Columnas', +rows : 'Filas', +cellspacing : 'Espacio entre celdas', +cellpadding : 'Borde interior de las celdas', +border : 'Borde', +align : 'Alineación horizontal', +align_default : 'Defecto', +align_left : 'Izquierda', +align_right : 'Derecha', +align_middle : 'Centrado', +row_title : 'Propiedades de la fila', +cell_title : 'Propiedades de la celda', +cell_type : 'Tipo de celda', +row_desc : 'Propiedades de la fila', +cell_desc : 'Propiedades de la celda', +valign : 'Alineación vertical', +align_top : 'Arriba', +align_bottom : 'Abajo', +props_desc : 'Propiedades de la tabla', +bordercolor : 'Color del borde', +bgcolor : 'Color del fondo', +merge_cells_title : 'Combinar celdas', +split_cells_desc : 'Dividir celdas', +merge_cells_desc : 'Combinar celdas', +cut_row_desc : 'Cortar fila', +copy_row_desc : 'Copiar fila', +paste_row_before_desc : 'Pegar fila antes', +paste_row_after_desc : 'Pegar fila después', +id : 'Id', +style: 'Estilo', +langdir : 'Dirección del texto', +langcode : 'Código del idioma', +mime : 'Tipo MIME del target', +ltr : 'De izquierda a derecha', +rtl : 'De derecha a izquierda', +bgimage : 'Imagen de fondo', +summary : 'Resumen', +td : "Datos", +th : "Cabecera", +cell_cell : 'Actualizar la celda actual', +cell_row : 'Actualizar todas las celdas de la fila', +cell_all : 'Actualizar todas las celdas de la tabla', +row_row : 'Actualizar la fila actual', +row_odd : 'Actualizar las filas impares de la tabla', +row_even : 'Actualizar las filas pares de la tabla', +row_all : 'Actualizar todas las filas de la tabla', +thead : 'Cabecera de la tabla', +tbody : 'Cuerpo de la tabla', +tfoot : 'Pie de la tabla', +del : 'Eliminar tabla', +scope : 'Alcance', +row : 'Fila', +col : 'Columna', +rowgroup : 'Grupo de filas', +colgroup : 'Grupo de columnas', +missing_scope: '¿Estás seguro que quieres continuar sin especificar el alcance para esta celda de tipo cabecera? Sin ello, puede dificultar a algunos usuarios con discapacidades el poder entender el contenido o los datos mostrados en la tabla.', +cellprops_delta_width : 55 +}); diff --git a/includes/tiny_mce/plugins/table/langs/fa.js b/includes/tiny_mce/plugins/table/langs/fa.js new file mode 100644 index 0000000..0069d61 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/fa.js @@ -0,0 +1,47 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +table_desc : '??? ???? ????', +table_insert_row_before_desc : '??? ??? ???? ??? ?? ??? ????', +table_insert_row_after_desc : '??? ??? ???? ?? ?? ??? ????', +table_delete_row_desc : '??? ???', +table_insert_col_before_desc : '??? ???? ???? ??? ?? ???? ????', +table_insert_col_after_desc : '??? ???? ???? ?? ?? ???? ????', +table_delete_col_desc : '??? ????', +insert_table_title : '??? ? ?????? ????', +insert_table_width : '???', +insert_table_height : '??????', +insert_table_cols : '????? ??????', +insert_table_rows : '????? ?????', +insert_table_cellspacing : '????? ?? ???? ????', +insert_table_cellpadding : '????? ??? ?? ?????? ????', +insert_table_border : '?????', +insert_table_align : '??? ???? ????', +insert_table_align_default : '??? ???', +insert_table_align_left : '??', +insert_table_align_right : '????', +insert_table_align_middle : '???', +insert_table_class : '????', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/fi.js b/includes/tiny_mce/plugins/table/langs/fi.js new file mode 100644 index 0000000..4ab6903 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/fi.js @@ -0,0 +1,77 @@ +// FI lang variables by Urho Konttori from Absolutions +// Updated by Tuomo Aura, Ateco.fi + +tinyMCE.addToLang('table',{ +general_tab : 'Yleiset', +advanced_tab : 'Edistyneemmät', +general_props : 'Yleisasetukset', +advanced_props : 'Edistyneemmät asetukset', +desc : 'Lisää uusi taulukko', +row_before_desc : 'Lisää rivi edelle', +row_after_desc : 'Lisää rivi jälkeen', +delete_row_desc : 'Poista rivi', +col_before_desc : 'Lisää sarake edelle', +col_after_desc : 'Lisää sarake jälkeen', +delete_col_desc : 'Poista sarake', +rowtype : 'Row in table part', +title : 'Lisää/Muokkaa taulukkoa', +width : 'Leveys', +height : 'Korkeus', +cols : 'Saraketta', +rows : 'Riviä', +cellspacing : 'Cellspacing', +cellpadding : 'Cellpadding', +border : 'Reuna', +align : 'Asettelu', +align_default : 'Oletus', +align_left : 'Vasen', +align_right : 'Oikea', +align_middle : 'Keskelle', +row_title : 'Rivin ominaisuudet', +cell_title : 'Sarakkeen ominaisuudet', +cell_type : 'Solun tyyppi', +row_desc : 'Rivin ominaisuudet', +cell_desc : 'Solun ominaisuudet', +valign : 'Pystysuora asettelu', +align_top : 'Yläreuna', +align_bottom : 'Alareuna', +props_desc : 'Taulukon ominaisuudet', +bordercolor : 'Reunan väri', +bgcolor : 'Taustaväri', +merge_cells_title : 'Yhdistä taulukon solut', +split_cells_desc : 'Erota taulukon solut', +merge_cells_desc : 'Yhdistä taulukon solut', +cut_row_desc : 'Leikkaa taulukon rivi', +copy_row_desc : 'Kopioi taulukon rivi', +paste_row_before_desc : 'Liitä taulukon rivi edelle', +paste_row_after_desc : 'Liitä taulukon rivi jälkeen', +id : 'Id', +style: 'Tyyli', +langdir : 'Kielen suunta', +langcode : 'Kielikoodi', +mime : 'Kohteen MIME-tyyppi', +ltr : 'Vasemmalta oikealle', +rtl : 'Oikealta vasemmalle', +bgimage : 'Taustakuva', +summary : 'Yhteenveto', +td : "Data", +th : "Otsikko", +cell_cell : 'Päivitä kyseinen solu', +cell_row : 'Päivitä kaikki solut rivissä', +cell_all : 'Päivitä kaikki solut taulukossa', +row_row : 'Päivitä kyseinen rivi', +row_odd : 'Päivitä parittomat rivit', +row_even : 'Päivitä parilliset rivit', +row_all : 'Päivitä kaikki rivit', +thead : 'Table Head', +tbody : 'Table Body', +tfoot : 'Table Foot', +del : 'Poista taulukko', +scope : 'Scope', +row : 'Rivi', +col : 'Sarake', +rowgroup : 'Riviryhmä', +colgroup : 'Sarakeryhmä', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.', +cellprops_delta_width : 50 +}); diff --git a/includes/tiny_mce/plugins/table/langs/fr.js b/includes/tiny_mce/plugins/table/langs/fr.js new file mode 100644 index 0000000..87502a8 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/fr.js @@ -0,0 +1,77 @@ +// French lang variables by Laurent Dran +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('table',{ +general_tab : 'Général', +advanced_tab : 'Avancé', +general_props : 'Propriétés générales', +advanced_props : 'Propriétés avancées', +desc : 'Insérer/Modifier un tableau', +row_before_desc : 'Insérer une rangée avant', +row_after_desc : 'Insérer une rangée après', +delete_row_desc : 'Effacer la rangée', +col_before_desc : 'Insérer une colonne avant', +col_after_desc : 'Insérer une colonne après', +delete_col_desc : 'Effacer la colonne', +rowtype : 'Type de rangée', +title : 'Gestionnaire de tableau', +width : 'Largeur', +height : 'Hauteur', +cols : 'Colonnes', +rows : 'Rangées', +cellspacing : 'Entre les cellules', +cellpadding : 'Marges intérieures', +border : 'Bordures', +align : 'Alignement horizontal', +align_default : 'Par défault', +align_left : 'À gauche', +align_right : 'À droite', +align_middle : 'Centré', +row_title : 'Propriétés des rangées', +cell_title : 'Propriétés des cellules', +cell_type : 'Type', +row_desc : 'Propriétés des rangées', +cell_desc : 'Propriétés des cellules', +valign : 'Alignement vertical', +align_top : 'Haut', +align_bottom : 'Bas', +props_desc : 'Propriétés du tableau', +bordercolor : 'Couleur des bordures', +bgcolor : 'Couleur d\'arrière-plan', +merge_cells_title : 'Fusionner les cellules', +split_cells_desc : 'Scinder les cellules', +merge_cells_desc : 'Fusionner les cellules', +cut_row_desc : 'Éliminer la rangée', +copy_row_desc : 'Copier la rangée', +paste_row_before_desc : 'Coller la rangée avant', +paste_row_after_desc : 'Coller la rangée après', +id : 'Id', +style: 'Style en ligne', +langdir : 'Sens d\'écriture', +langcode : 'Code de langue', +mime : 'Type MIME de la cible', +ltr : 'Vers la droite', +rtl : 'Vers la gauche', +bgimage : 'Image d\'arrière-plan', +summary : 'Descriptif', +td : "Donnée", +th : "En-tête", +cell_cell : 'Appliquer à la cellule', +cell_row : 'Appliquer à toute la rangée', +cell_all : 'Appliquer à tout le tableau', +row_row : 'Appliquer à la rangée', +row_odd : 'Appliquer aux rangées pair', +row_even : 'Appliquer aux rangées impair', +row_all : 'Appliquer à toutes les rangées', +thead : 'En-tête', +tbody : 'Corps', +tfoot : 'Pied', +del : 'Effacer le tableau', +scope : 'Attribut scope', +row : 'Rangée', +col : 'Colonne', +rowgroup : 'Groupe de rangées', +colgroup : 'Groupe de colonnes', +missing_scope: 'Les attributs scope rendraient votre tableau de données plus\naccessible à certains groupes d\'utilisateurs.\n\nÊtes-vous sûr de ne pas vouloir spécifier\nd\'attribut scope aux cellules d\'en-tête ?\n\n', +cellprops_delta_width : 50 +}); diff --git a/includes/tiny_mce/plugins/table/langs/fr_ca.js b/includes/tiny_mce/plugins/table/langs/fr_ca.js new file mode 100644 index 0000000..4a5d142 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/fr_ca.js @@ -0,0 +1,43 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +table_desc : 'Insérer un nouveau tableau', +table_insert_row_before_desc : 'Insérer une ligne avant', +table_insert_row_after_desc : 'Insérer une ligne après', +table_delete_row_desc : 'Supprimer la ligne', +table_insert_col_before_desc : 'Insérer une colonne avant', +table_insert_col_after_desc : 'Insérer une colonne après', +table_delete_col_desc : 'Supprimer la colonne', +insert_table_title : 'Insérer/Modifier le tableau', +insert_table_width : 'Largeur', +insert_table_height : 'Hauteur', +insert_table_cols : 'Colonnes', +insert_table_rows : 'Lignes', +insert_table_cellspacing : 'Cellspacing', +insert_table_cellpadding : 'Cellpadding', +insert_table_border : 'Bordure', +insert_table_align : 'Alignement', +insert_table_align_default : 'Défaut', +insert_table_align_left : 'Gauche', +insert_table_align_right : 'Droit', +insert_table_align_middle : 'Milieu', +insert_table_class_name : 'Classe CSS', +table_row_title : 'Propriétés de ligne', +table_cell_title : 'Propriétés de cellule', +table_row_desc : 'Propriétés de ligne', +table_cell_desc : 'Propriétés de cellule', +insert_table_valign : 'Alignement vertical', +insert_table_align_top : 'Haut', +insert_table_align_bottom : 'Bas', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/he.js b/includes/tiny_mce/plugins/table/langs/he.js new file mode 100644 index 0000000..c866915 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/he.js @@ -0,0 +1,75 @@ +// HE lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'ëììé', +advanced_tab : 'îú÷ãí', +general_props : 'îàôééðéí ëììééí', +advanced_props : 'îàôééðéí îú÷ãîéí', +desc : 'îëðéñ èáìä çãùä', +row_before_desc : 'äëðñ ùåøä ìôðé', +row_after_desc : 'äëðñ ùåøä àçøé', +delete_row_desc : 'îç÷ ùåøä', +col_before_desc : 'äëðñ èåø ìôðé', +col_after_desc : 'äëðñ èåø àçøé', +delete_col_desc : 'îç÷ èåø', +rowtype : 'ùåøä áçì÷ ùì äèáìä', +title : 'äëðñ/ùðä èáìä', +width : 'øåçá', +height : 'âåáä', +cols : 'èåøéí', +rows : 'ùåøåú', +cellspacing : 'øéååç áéï úàéí', +cellpadding : 'øéôåã úàéí', +border : 'âáåì', +align : 'éùåø', +align_default : 'áøéøú îçãì', +align_left : 'ùîàì', +align_right : 'éîéï', +align_middle : 'îøëæ', +row_title : 'îàôééðé ùåøä áèáìä', +cell_title : 'îàôééðé úà áèáìä', +cell_type : 'ñåâ úà', +row_desc : 'îàôééðé ùåøä áèáìä', +cell_desc : 'îàôééðé úà áèáìä', +valign : 'éùåø àðëé', +align_top : 'ìîòìä', +align_bottom : 'ìîèä', +props_desc : 'îàôééðé èáìä', +bordercolor : 'öáò âáåì', +bgcolor : 'öáò ø÷ò', +merge_cells_title : 'îæâ úàéí áèáìä', +split_cells_desc : 'ôöì úàéí áèáìä', +merge_cells_desc : 'îæâ úàéí áèáìä', +cut_row_desc : 'âæåø ùåøä îäèáìä', +copy_row_desc : 'äòú÷ ùåøä îäèáìä', +paste_row_before_desc : 'äãá÷ ùåøä ìôðé', +paste_row_after_desc : 'äãá÷ ùåøä àçøé', +id : 'Id', +style: 'ñâðåï', +langdir : 'ëéååï ùôä', +langcode : '÷åã ùôä', +mime : 'ñåâ MIME ùì äéòã', +ltr : 'ùîàì ìéîéï', +rtl : 'éîéï ìùîàì', +bgimage : 'úîåðú ø÷ò', +summary : 'ñéëåí', +td : "îéãò", +th : "ëåúøú", +cell_cell : 'òãëï úà ðåëçé', +cell_row : 'òãëï àú ëì äúàéí áùåøä', +cell_all : 'òãëï àú ëì äúàéí áèáìä', +row_row : 'òãëï ùåøä ðåëçéú', +row_odd : 'òãëï ùåøåú àé-æåâéåú áèáìä', +row_even : 'òãëï ùåøåú æåâéåú áèáìä', +row_all : 'òãëï àú ëì äùåøåú áèáìä', +thead : 'ëåúøú äèáìä', +tbody : 'âåó äèáìä', +tfoot : 'ñéëåí äèáìä', +del : 'îç÷ èáìä', +scope : 'úçåí', +row : 'ùåøä', +col : 'èåø', +rowgroup : '÷áåöú ùåøåú', +colgroup : '÷áåöú èåøéí', +missing_scope: 'äàí àúä áèåç ùáøöåðê ìäîùéê îáìé ìöééï àú úçåí äëåúøú ùì äèáìä? áìé ëåúøú îåâãøú, éúëï ëé îùúîùéí áòìé îåâáìåéåú éú÷ùå ìäáéï àú äúåëï àå äîéãò äîåöâéí áèáìä.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/hu.js b/includes/tiny_mce/plugins/table/langs/hu.js new file mode 100644 index 0000000..526b771 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/hu.js @@ -0,0 +1,75 @@ +// HU lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Általános', +advanced_tab : 'Haladó', +general_props : 'Általános beállítások', +advanced_props : 'Haladó beállítások', +desc : 'Új táblázat beszúrása', +row_before_desc : 'Sor beszúrása elé', +row_after_desc : 'Sor beszúrása mögé', +delete_row_desc : 'Sor törlése', +col_before_desc : 'Oszlop beszúrása elé', +col_after_desc : 'Oszlop beszúrása mögé', +delete_col_desc : 'Oszlop törlése', +rowtype : 'Sor a táblázatrészben', +title : 'Táblázat beszúrása/módosítása', +width : 'Hosszúság', +height : 'Szélesség', +cols : 'Oszlopok', +rows : 'Sorok', +cellspacing : 'Cellaköz', +cellpadding : 'Cellakitöltés', +border : 'Keret', +align : 'Elhelyezkedés', +align_default : 'alapértelmezett', +align_left : 'Bal', +align_right : 'Jobb', +align_middle : 'Közép', +row_title : 'Táblázat sor tulajdonságai', +cell_title : 'Táblázat cella tulajdonságai', +cell_type : 'Cella típus', +row_desc : 'Táblázat sor tulajdonságai', +cell_desc : 'Táblázat cella tulajdonságai', +valign : 'Függõleges elhelyezkedés', +align_top : 'Felül', +align_bottom : 'Alul', +props_desc : 'Táblázat tulajdonságai', +bordercolor : 'Keret szín', +bgcolor : 'Háttér szín', +merge_cells_title : 'Tábla celláinak egyesítése', +split_cells_desc : 'Tábla celláinak felosztása', +merge_cells_desc : 'Tábla celláinak egyesítése', +cut_row_desc : 'Táblázat sor kivágása', +copy_row_desc : 'Táblázat sor másolása', +paste_row_before_desc : 'Táblázat sor beillesztése elé', +paste_row_after_desc : 'Táblázat sor beillesztése mögé', +id : 'Azonodító', +style: 'Stílus', +langdir : 'Szövegpozíció', +langcode : 'Szöveg kód', +mime : 'Cél MIME típus', +ltr : 'Balról jobbra', +rtl : 'Jobbról balra', +bgimage : 'Háttérkép', +summary : 'Összefoglaló', +td : "Adat", +th : "Fejléc", +cell_cell : 'Aktuális cella frissítése', +cell_row : 'Minden cella frissítése a sorban', +cell_all : 'Minden cella frissítése a táblában', +row_row : 'Aktuális sor frissítése', +row_odd : 'Páratlan sorok frissítése a táblában', +row_even : 'páros sorok frissítése a táblában', +row_all : 'Minden sor frissítése a táblában', +thead : 'Táblázat fejléc', +tbody : 'Táblázat test', +tfoot : 'Tálázat lábléc', +del : 'Tábla törlése', +scope : 'Scope', +row : 'Row', +col : 'Col', +rowgroup : 'Row Group', +colgroup : 'Col Group', +missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/is.js b/includes/tiny_mce/plugins/table/langs/is.js new file mode 100644 index 0000000..1d64862 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/is.js @@ -0,0 +1,76 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('table',{ +general_tab : 'Almennt', +advanced_tab : 'Sértækt', +general_props : 'Almennar stillingar', +advanced_props : 'Sértækar stillingar', +desc : 'Setja inn nýja töflu', +row_before_desc : 'Bæta röð við fyrir framan', +row_after_desc : 'Bæta röð við fyrir aftan', +delete_row_desc : 'Eyða röð', +col_before_desc : 'Bæta dálk við fyrir framan', +col_after_desc : 'Bæta dálk við fyrir aftan', +delete_col_desc : 'Eyða dálki', +rowtype : 'Röð í töfluhluta', +title : 'Bæta við/breyta töflu', +width : 'Breidd', +height : 'Hæð', +cols : 'Dálkar', +rows : 'Raðir', +cellspacing : 'Reitabil', +cellpadding : 'Reitabólstrun', +border : 'Rammi', +align : 'Textastilling', +align_default : 'Sjálfgild', +align_left : 'Vinstri', +align_right : 'Hægri', +align_middle : 'Miðja', +row_title : 'Stillingar töfluraðar', +cell_title : 'Stillingar töfludálks', +cell_type : 'Reitartegund', +row_desc : 'Stillingar töfluraðar', +cell_desc : 'Stillingar töflureits', +valign : 'Lóðrétt stilling', +align_top : 'Efst', +align_bottom : 'Neðst', +props_desc : 'Stillingar töflu', +bordercolor : 'Rammalitur', +bgcolor : 'Bakgrunnslitur', +merge_cells_title : 'Sameina töflureiti', +split_cells_desc : 'Tvístra töflureitum', +merge_cells_desc : 'Sameina töflureiti', +cut_row_desc : 'Klippa töfluröð', +copy_row_desc : 'Afrita töfluröð', +paste_row_before_desc : 'Skeyta töfluröð fyrir ofan', +paste_row_after_desc : 'Skeyta töfluröð fyrir neðan', +id : 'Id', +style: 'Stíll', +langdir : 'Ritháttur tungumáls', +langcode : 'Tungumálskenni', +mime : 'MIME-tegund tengils', +ltr : 'Vinstri til hægri', +rtl : 'Hægri til vinstri', +bgimage : 'Bakgrunnsmynd', +summary : 'Samantekt', +td : "Gögn", +th : "Haus", +cell_cell : 'Uppfæra núverandi reit', +cell_row : 'Uppfæra alla reiti í röðinni', +cell_all : 'Uppfæra alla reiti töflunnar', +row_row : 'Uppfæra núverandi röð', +row_odd : 'Uppfæra oddatöluraðir', +row_even : 'Uppfæra jafntöluraðir', +row_all : 'Uppfæra allar raðir', +thead : 'Haus töflu', +tbody : 'Meginmál töflu', +tfoot : 'Fótur töflu', +del : 'Eyða töflu', +scope : 'Gildissvið', +row : 'Röð', +col : 'Dálkur', +rowgroup : 'Raðahópur', +colgroup : 'Dálkahópur', +missing_scope: 'Viltu halda áfram án þess að tilgreina gildissvið fyrir haus töflu? Án þess gæti það valdið sumum notendum, til dæmis sjónskertum, vandkvæðum við að skilja innihald töflunnar.', +cellprops_delta_width : 55 +}); diff --git a/includes/tiny_mce/plugins/table/langs/it.js b/includes/tiny_mce/plugins/table/langs/it.js new file mode 100644 index 0000000..dc04f60 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/it.js @@ -0,0 +1,43 @@ +// Variabili di lingua IT - fabrix.xm@lombardiacom.it + +tinyMCE.addToLang('',{ +table_desc : 'Inserisci una nuova tabella', +table_insert_row_before_desc : 'Inserisci una riga prima', +table_insert_row_after_desc : 'Inserisci una riga dopo', +table_delete_row_desc : 'Cancella riga', +table_insert_col_before_desc : 'Inserisci colonna prima', +table_insert_col_after_desc : 'Inserisci colonna dopo', +table_delete_col_desc : 'Rimuovi colonna', +insert_table_title : 'Inserisci/modifica tabella', +insert_table_width : 'Larghezza', +insert_table_height : 'Altezza', +insert_table_cols : 'Colonne', +insert_table_rows : 'Righe', +insert_table_cellspacing : 'Cellspacing', +insert_table_cellpadding : 'Cellpadding', +insert_table_border : 'Bordo', +insert_table_align : 'Allineamento', +insert_table_align_default : 'Default', +insert_table_align_left : 'Sinistra', +insert_table_align_right : 'Destra', +insert_table_align_middle : 'Centro', +insert_table_class : 'Classe', +table_row_title : 'Proprietà della riga', +table_cell_title : 'Proprietà della cella', +table_row_desc : 'Proprietà della riga', +table_cell_desc : 'Proprietà della cella', +insert_table_valign : 'Allineamento verticale', +insert_table_align_top : 'In alto', +insert_table_align_bottom : 'In basso', +table_props_desc : 'Proprietà della tabella', +table_bordercolor : 'Colore bordo', +table_bgcolor : 'Colore sfondo', +table_merge_cells_title : 'Unisci celle', +table_split_cells_desc : 'Dividi celle', +table_merge_cells_desc : 'Unisci le celle', +table_cut_row_desc : 'Taglia riga', +table_copy_row_desc : 'Copia riga', +table_paste_row_before_desc : 'Incolla riga prima', +table_paste_row_after_desc : 'Incolla riga dopo', +table_insert_desc : 'Inserisci una nuova tabella' +}); diff --git a/includes/tiny_mce/plugins/table/langs/ja.js b/includes/tiny_mce/plugins/table/langs/ja.js new file mode 100644 index 0000000..8b19fd0 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ja.js @@ -0,0 +1,43 @@ +// JP lang variables + +tinyMCE.addToLang('',{ +table_desc : '$B%F!<%V%k(B', +table_insert_row_before_desc : '$B9TA^F~(B($BA0(B)', +table_insert_row_after_desc : '$B9TA^F~(B($B8e(B)', +table_delete_row_desc : '$B9T:o=|(B', +table_insert_col_before_desc : '$BNsA^F~(B($BA0(B)', +table_insert_col_after_desc : '$BNsA^F~(B($B8e(B)', +table_delete_col_desc : '$BNs:o=|(B', +insert_table_title : '$B%F!<%V%k$NA^F~(B/$BJT=8(B', +insert_table_cols : '$BNs?t(B', +insert_table_rows : '$B9T?t(B', +insert_table_cellspacing : '$B%;%kM>Gr(B', +insert_table_cellpadding : '$B%;%k5M$a(B', +insert_table_align : '$B0LCVD4@0(B', +insert_table_align_default : '$B0EL[(B', +insert_table_align_left : '$B:85M$a(B', +insert_table_align_right : '$B1&5M$a(B', +insert_table_align_middle : '$BCf1{4s$;(B', +insert_table_width : '$BI}(B', +insert_table_height : '$B9b$5(B', +insert_table_border : '$B6-3&@~(B', +insert_table_class : '$B%/%i%9(B', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/ko.js b/includes/tiny_mce/plugins/table/langs/ko.js new file mode 100644 index 0000000..edf946a --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ko.js @@ -0,0 +1,43 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +table_desc : 'Ç¥ ³Ö±â', +table_insert_row_before_desc : 'ŸÕ¿¡ Çà ³Ö±â', +table_insert_row_after_desc : 'µÚ¿¡ Çà ³Ö±â', +table_delete_row_desc : 'Çà Áö¿ì±â', +table_insert_col_before_desc : 'ŸÕ¿¡ ¿­ ³Ö±â', +table_insert_col_after_desc : 'µÚ¿¡ ¿­ ³Ö±â', +table_delete_col_desc : '¿­ Áö¿ì±â', +insert_table_title : 'Ç¥ ³Ö±â/°íÄ¡±â', +insert_table_width : '³Êºñ', +insert_table_height : '³ôÀÌ', +insert_table_cols : 'Çà', +insert_table_rows : '¿­', +insert_table_cellspacing : 'Œ¿ °£°Ý', +insert_table_cellpadding : 'Œ¿ ¿©¹é', +insert_table_border : 'Å׵Ξ®', +insert_table_align : 'Á€·Ä', +insert_table_align_default : '±âº»°ª', +insert_table_align_left : '¿ÞÂÊ', +insert_table_align_right : '¿Àž¥ÂÊ', +insert_table_align_middle : '°¡¿îµ¥', +insert_table_class : 'Ŭ·¡œº', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/nb.js b/includes/tiny_mce/plugins/table/langs/nb.js new file mode 100644 index 0000000..29bbd40 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/nb.js @@ -0,0 +1,75 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('table',{ +general_tab : 'Generelt', +advanced_tab : 'Avansert', +general_props : 'Generelle egenskaper', +advanced_props : 'Avanserte egenskaper', +desc : 'Opprett/endre tabell', +row_before_desc : 'Opprett rad foran', +row_after_desc : 'Opprett rad etter', +delete_row_desc : 'Fjern rad', +col_before_desc : 'Opprett kolonne foran', +col_after_desc : 'Opprett kolonne etter', +delete_col_desc : 'Fjern kolonne', +rowtype : 'Rad i tabell', +title : 'Opprett/endre tabell', +width : 'Bredde', +height : 'Høyde', +cols : 'Kolonner', +rows : 'Rader', +cellspacing : 'Celle mellomrom', +cellpadding : 'Celle fylling', +border : 'Rammebredde', +align : 'Justering', +align_default : 'Ingen', +align_left : 'Venstre', +align_right : 'Høyre', +align_middle : 'Midtstilt', +row_title : 'tabell rad egenskaper', +cell_title : 'tabell celle egenskaper', +cell_type : 'Celle type', +row_desc : 'tabell rad egenskaper', +cell_desc : 'tabell celle egenskaper', +valign : 'Vertikal justering', +align_top : 'Topp', +align_bottom : 'Bunn', +props_desc : 'tabell egenskaper', +bordercolor : 'Rammefarge', +bgcolor : 'Bakgrunnsfarge', +merge_cells_title : 'Slå sammen tabell celler', +split_cells_desc : 'Splitt tabell celler', +merge_cells_desc : 'Slå sammen tabell celler', +cut_row_desc : 'Fjern tabell rad', +copy_row_desc : 'Kopier tabell rad', +paste_row_before_desc : 'Lim inn tabell rad foran', +paste_row_after_desc : 'Lim inn tabell rad etter', +id : 'Id', +style: 'Stil', +langdir : 'Språk retning', +langcode : 'Språk kode', +mime : 'Målets MIME type', +ltr : 'Venstre mot høyre', +rtl : 'Høyre mot venstre', +bgimage : 'Bakgrunnsbilde', +summary : 'Sum', +td : "Data", +th : "Overskrift", +cell_cell : 'Oppdater valgt celle', +cell_row : 'Oppdater alle celler i raden', +cell_all : 'Oppdater alle celler i tabellen', +row_row : 'Oppdater valgt rad', +row_odd : 'Oppdater ulike rader i tabellen', +row_even : 'Oppdater like rader i tabellen', +row_all : 'Oppdater alle rader i tabellen', +thead : 'Tabell Hode', +tbody : 'Tabell Kropp', +tfoot : 'Tabell Fot', +del : 'Slett tabell', +scope : 'Hensikt', +row : 'Rad', +col : 'Kolonne', +rowgroup : 'Rad gruppe', +colgroup : 'Kolonne gruppe', +missing_scope: 'Er du sikker på at du vil fortsette uten å oppgi hensikten med denne tabellens hode celle.' +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/table/langs/nl.js b/includes/tiny_mce/plugins/table/langs/nl.js new file mode 100644 index 0000000..30aeb6e --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/nl.js @@ -0,0 +1,75 @@ +// NL lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Algemeen', +advanced_tab : 'Geavanceerd', +general_props : 'Algemene eigenschappen', +advanced_props : 'Geavanceerde eigenschappen', +desc : 'Nieuwe tabel invoegen', +row_before_desc : 'Rij boven invoegen', +row_after_desc : 'Rij onder invoegen', +delete_row_desc : 'Rij verwijderen', +col_before_desc : 'Kolom links invoegen', +col_after_desc : 'Kolom rechts invoegen', +delete_col_desc : 'Kolom verwijderen', +rowtype : 'Row in table part', +title : 'Tabel invoegen/bewerken', +width : 'Breedte', +height : 'Hoogte', +cols : 'Kolommen', +rows : 'Rijen', +cellspacing : 'Ruimte om cel', +cellpadding : 'Ruimte in cel', +border : 'Rand', +align : 'Uitlijning', +align_default : 'Standaard', +align_left : 'Links', +align_right : 'Rechts', +align_middle : 'Centreren', +row_title : 'Tabelrij-eigenschappen', +cell_title : 'Tabelcel-eigenschappen', +cell_type : 'Celtype', +row_desc : 'Tabelrij-eigenschappen', +cell_desc : 'Tabelcel-eigenschappen', +valign : 'Verticale uitlijning', +align_top : 'Boven', +align_bottom : 'Onder', +props_desc : 'Tabeleigenschappen', +bordercolor : 'Randkleur', +bgcolor : 'Achtergrondkleur', +merge_cells_title : 'Tabelcellen samenvoegen', +split_cells_desc : 'Tabelcellen splitsen', +merge_cells_desc : 'Tabelcellen samenvoegen', +cut_row_desc : 'Tabelrij knippen', +copy_row_desc : 'Tebelrij kopiëren', +paste_row_before_desc : 'Tabelrij boven plakken', +paste_row_after_desc : 'tabelrij onder plakken', +id : 'Id', +style: 'Stijl', +langdir : 'Taalrichting', +langcode : 'Taalcode', +mime : 'MIME type', +ltr : 'Links naar rechts', +rtl : 'Rechts naar links', +bgimage : 'Achtergrondafbeelding', +summary : 'Samenvatting', +td : "Data", +th : "Kop", +cell_cell : 'Huidige cel bijwerken', +cell_row : 'Alle cellen in rij bijwerken', +cell_all : 'Alle cellen in tabel bijwerken', +row_row : 'Huidige rij bijwerken', +row_odd : 'Oneven rijen in tabel bijwerken', +row_even : 'Even rijen in tabel bijwerken', +row_all : 'Alle rijen in tabel bijwerken', +thead : 'Tabel-kop', +tbody : 'Tabel-body', +tfoot : 'Tabel-voet', +del : 'Tabel verwijderen', +scope : 'Bereik', +row : 'Rij', +col : 'Kolom', +rowgroup : 'Rijgroep', +colgroup : 'Kolomgroep', +missing_scope: 'Zonder een bereik van een tabelkop, is het moeilijk voor mensen met een visuele handicap deze pagina te begrijpen. Weet u zeker dat u zonder bereik verder wilt gaan?' +}); diff --git a/includes/tiny_mce/plugins/table/langs/nn.js b/includes/tiny_mce/plugins/table/langs/nn.js new file mode 100644 index 0000000..659f1ee --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/nn.js @@ -0,0 +1,76 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('table',{ +general_tab : 'Generelt', +advanced_tab : 'Avansert', +general_props : 'Generelle egenskaper', +advanced_props : 'Avanserte egenskaper', +desc : 'Opprett/endre tabell', +row_before_desc : 'Opprett rad foran', +row_after_desc : 'Opprett rad etter', +delete_row_desc : 'Fjern rad', +col_before_desc : 'Opprett kolonne foran', +col_after_desc : 'Opprett kolonne etter', +delete_col_desc : 'Fjern kolonne', +rowtype : 'Rad i tabell', +title : 'Opprett/endre tabell', +width : 'Bredde', +height : 'Høgde', +cols : 'Kolonner', +rows : 'Rader', +cellspacing : 'Celle mellomrom', +cellpadding : 'Celle fylling', +border : 'Rammebredde', +align : 'Justering', +align_default : 'Ingen', +align_left : 'Venstre', +align_right : 'Høgre', +align_middle : 'Midtstilt', +row_title : 'tabell rad egenskaper', +cell_title : 'tabell celle egenskaper', +cell_type : 'Celle type', +row_desc : 'tabell rad egenskaper', +cell_desc : 'tabell celle egenskaper', +valign : 'Vertikal justering', +align_top : 'Topp', +align_bottom : 'Bunn', +props_desc : 'tabell egenskaper', +bordercolor : 'Rammefarge', +bgcolor : 'Bakgrunnsfarge', +merge_cells_title : 'Slå sammen tabell celler', +split_cells_desc : 'Splitt tabell celler', +merge_cells_desc : 'Slå sammen tabell celler', +cut_row_desc : 'Fjern tabell rad', +copy_row_desc : 'Kopier tabell rad', +paste_row_before_desc : 'Lim inn tabell rad foran', +paste_row_after_desc : 'Lim inn tabell rad etter', +id : 'Id', +style: 'Stil', +langdir : 'Språk retning', +langcode : 'Språk kode', +mime : 'Målets MIME type', +ltr : 'Venstre mot høgre', +rtl : 'Høgre mot venstre', +bgimage : 'Bakgrunnsbilde', +summary : 'Sum', +td : "Data", +th : "Overskrift", +cell_cell : 'Oppdater valgt celle', +cell_row : 'Oppdater alle celler i raden', +cell_all : 'Oppdater alle celler i tabellen', +row_row : 'Oppdater valgt rad', +row_odd : 'Oppdater ulike rader i tabellen', +row_even : 'Oppdater like rader i tabellen', +row_all : 'Oppdater alle rader i tabellen', +thead : 'Tabell Hode', +tbody : 'Tabell Kropp', +tfoot : 'Tabell Fot', +del : 'Slett tabell', +scope : 'Hensikt', +row : 'Rad', +col : 'Kolonne', +rowgroup : 'Rad gruppe', +colgroup : 'Kolonne gruppe', +missing_scope: 'Er du sikker på at du vil fortsette uten å oppgi hensikten med denne tabellens hode celle.', +cellprops_delta_width : 30 +}); \ No newline at end of file diff --git a/includes/tiny_mce/plugins/table/langs/pl.js b/includes/tiny_mce/plugins/table/langs/pl.js new file mode 100644 index 0000000..67948ea --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/pl.js @@ -0,0 +1,78 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl + +tinyMCE.addToLang('table',{ +general_tab : 'G³ówne ustawienia', +advanced_tab : 'Zaawansowane', +general_props : 'G³ówne ustawienia', +advanced_props : 'Zaawansowane ustawienia', +desc : 'Wstawia now± tabelê', +row_before_desc : 'Wstaw wiersz przed', +row_after_desc : 'Wstaw wiersz za', +delete_row_desc : 'Usuñ wiersz', +col_before_desc : 'Wstaw kolumnê przed', +col_after_desc : 'Wstaw kolumnê za', +delete_col_desc : 'Usuñ kolumnê', +rowtype : 'Wiersz w czê¶ci tabeli', +title : 'Wstaw/Zmieñ tabelê', +width : 'Szeroko¶æ', +height : 'Wysoko¶æ', +cols : 'Kolumn', +rows : 'Wierszy', +cellspacing : 'Odstêpy miêdzy komórkami', +cellpadding : 'Margines wewn±trz komórek', +border : 'Ramka', +align : 'Wyrównanie', +align_default : 'Domy¶lne', +align_left : 'Lewo', +align_right : 'Prawo', +align_middle : 'Šrodek', +row_title : 'W³a¶ciwo¶ci wiersza', +cell_title : 'W³a¶ciwo¶ci komórki', +cell_type : 'Typ komórki', +row_desc : 'W³a¶ciwo¶ci wiersza', +cell_desc : 'W³a¶ciwo¶ci komórki', +valign : 'Wyrównanie pionowe', +align_top : 'Do góry', +align_bottom : 'Do do³u', +props_desc : 'W³a¶ciwo¶ci tabeli', +bordercolor : 'Kolor ramki', +bgcolor : 'Kolor t³a', +merge_cells_title : 'Po³±cz komórki', +split_cells_desc : 'Rozdziel komórki', +merge_cells_desc : 'Po³±cz komórki', +cut_row_desc : 'Wytnij wiersz', +copy_row_desc : 'Kopiuj wiersz', +paste_row_before_desc : 'Wklej wiersz przed', +paste_row_after_desc : 'Wklej wiersz za', +id : 'Id', +style: 'Styl', +langdir : 'Kierunek tekstu', +langcode : 'Kod jêzyka', +mime : 'Docelowy typ MIME', +ltr : 'Lewy do prawego', +rtl : 'Prawy do lewego', +bgimage : 'Obrazek t³a', +summary : 'Podsumowanie', +td : "Dane", +th : "Nag³ówek", +cell_cell : 'Aktualizuj bie¿±c± komórkê', +cell_row : 'Aktualizuj wszystkie komórki w wierszu', +cell_all : 'Aktualizuj wszystkie komórki w tabeli', +row_row : 'Aktualizuj bierz±c± komórkê', +row_odd : 'Aktualizuj nieparzyste komórki w tabeli', +row_even : 'Aktualizuj parzyste komórki w tabeli', +row_all : 'Aktualizuj wszystkie komórki w tabeli', +thead : 'Nag³ówek tabeli', +tbody : 'Cia³o tabeli', +tfoot : 'Stopka tabeli', +del : 'Usuñ tabelê', +scope : 'Zasiêg', +row : 'Wiersz', +col : 'Kolumna', +rowgroup : 'Grupa wiersza', +colgroup : 'Grupa kolumny', +missing_scope: 'Czy jeste¶ pewien, ¿e chcesz kontynuowaæ bez sprecyzowania zasiêgu dla nag³ówka tej tabeli? Bez tego, niektórzy u¿ytkownicy mog± mieæ problem ze zrozumieniem zawarto¶ci tej tabeli, je¿eli maj± w³±czone jakie¶ ograniczenia w przegl±darkach.', +cellprops_delta_width : 70 +}); diff --git a/includes/tiny_mce/plugins/table/langs/pt.js b/includes/tiny_mce/plugins/table/langs/pt.js new file mode 100644 index 0000000..d123992 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/pt.js @@ -0,0 +1,84 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('table',{ +general_tab : 'Geral', +advanced_tab : 'Avançado', +general_props : 'Propriedades Gerais', +advanced_props : 'Propriedades Avançadas', +desc : 'Inserir uma nova tabela', +row_before_desc : 'Inserir uma linha antes', +row_after_desc : 'Inserir uma linha depois', +delete_row_desc : 'Apagar linha', +col_before_desc : 'Inserir uma coluna antes', +col_after_desc : 'Inserir uma coluna depois', +delete_col_desc : 'Remover coluna', +rowtype : 'Linhas na tabela parcial', +title : 'Inserir/Modificar Tabela', +width : 'Largura', +height : 'Altura', +cols : 'Colunas', +rows : 'Linhas', +cellspacing : 'Espaçamento das células', +cellpadding : 'Margem interna', +border : 'Borda', +align : 'Alinhamento', +align_default : 'Padrão', +align_left : 'Esquerda', +align_right : 'Direita', +align_middle : 'Centrado', +row_title : 'Propriedades das linha', +cell_title : 'Propriedades da célula', +cell_type : 'Tipo de célula', +row_desc : 'Propriedades das linhas', +cell_desc : 'Propriedades da célula', +valign : 'Alinhamento vertical', +align_top : 'Superior', +align_bottom : 'Inferior', +props_desc : 'Propriedades da tabela', +bordercolor : 'Côr da borda', +bgcolor : 'Côr do fundo', +merge_cells_title : 'Juntar células', +merge_cells_desc : 'Juntar células da tabela', +split_cells_title : 'Separar células', +split_cells_desc : 'Separar células', +cut_row_desc : 'Apagar linha', +copy_row_desc : 'Copiar linha', +paste_row_before_desc : 'Colar linha antes', +paste_row_after_desc : 'Colar linha depois', +id : 'Id', +style: 'Estilo', +langdir : 'Direção do texto', +langcode : 'Código do idioma', +mime : 'Tipo de MIME do objeto', +ltr : 'Esquerda para direita', +rtl : 'Direita para esquerda', +bgimage : 'Imagem de fundo', +summary : 'Sumário', +td : "Dados", +th : "Cabeçalho", +cell_cell : 'Atulizar célula atual', +cell_row : 'Atualizar todas as cédulas na linha', +cell_all : 'Atualizar todas as cédulas da tabela', +row_row : 'Atualizar linha atual', +row_odd : 'Atualizar linhas ímpares na tabela', +row_even : 'Atualizar linhas pares na tabela', +row_all : 'Atualizar todas as linhas na tabela', +thead : 'Cabeçalho da tabela', +tbody : 'Corpo da tabela', +tfoot : 'Rodapé da tabela', +del : 'Apagar tabela', +dir : 'Direção', +scope : 'Escopo', +row : 'Linha', +col : 'Coluna', +rowgroup : 'Grupo de linhas', +colgroup : 'Grupo de colunas', +missing_scope: 'Tem certeza que deseja continuar sem especificar um escopo para este célula de cabeçalho. Sem isso talvez seja difícil para alguns usuários especiais entender ou conteúdo ou visualizar a tabela.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/pt_br.js b/includes/tiny_mce/plugins/table/langs/pt_br.js new file mode 100644 index 0000000..e341833 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/pt_br.js @@ -0,0 +1,85 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('table',{ +general_tab : 'Geral', +advanced_tab : 'Avançado', +general_props : 'Propriedades Gerais', +advanced_props : 'Propriedades Avançadas', +desc : 'Inserir uma nova tabela', +row_before_desc : 'Inserir uma linha antes', +row_after_desc : 'Inserir uma linha depois', +delete_row_desc : 'Apagar linha', +col_before_desc : 'Inserir uma coluna antes', +col_after_desc : 'Inserir uma coluna depois', +delete_col_desc : 'Remover coluna', +rowtype : 'Linhas na tabela parcial', +title : 'Inserir/Modificar Tabela', +width : 'Largura', +height : 'Altura', +cols : 'Colunas', +rows : 'Linhas', +cellspacing : 'Espaçamento das células', +cellpadding : 'Margem interna', +border : 'Borda', +align : 'Alinhamento', +align_default : 'Padrão', +align_left : 'Esquerda', +align_right : 'Direita', +align_middle : 'Centrado', +row_title : 'Propriedades das linha', +cell_title : 'Propriedades da célula', +cell_type : 'Tipo de célula', +row_desc : 'Propriedades das linhas', +cell_desc : 'Propriedades da célula', +valign : 'Alinhamento vertical', +align_top : 'Superior', +align_bottom : 'Inferior', +props_desc : 'Propriedades da tabela', +bordercolor : 'Côr da borda', +bgcolor : 'Côr do fundo', +merge_cells_title : 'Juntar células', +merge_cells_desc : 'Juntar células da tabela', +split_cells_title : 'Separar células', +split_cells_desc : 'Separar células', +cut_row_desc : 'Apagar linha', +copy_row_desc : 'Copiar linha', +paste_row_before_desc : 'Colar linha antes', +paste_row_after_desc : 'Colar linha depois', +id : 'Id', +style: 'Estilo', +langdir : 'Direção do texto', +langcode : 'Código do idioma', +mime : 'Tipo de MIME do objeto', +ltr : 'Esquerda para direita', +rtl : 'Direita para esquerda', +bgimage : 'Imagem de fundo', +summary : 'Sumário', +td : "Dados", +th : "Cabeçalho", +cell_cell : 'Atulizar célula atual', +cell_row : 'Atualizar todas as cédulas na linha', +cell_all : 'Atualizar todas as cédulas da tabela', +row_row : 'Atualizar linha atual', +row_odd : 'Atualizar linhas ímpares na tabela', +row_even : 'Atualizar linhas pares na tabela', +row_all : 'Atualizar todas as linhas na tabela', +thead : 'Cabeçalho da tabela', +tbody : 'Corpo da tabela', +tfoot : 'Rodapé da tabela', +del : 'Apagar tabela', +dir : 'Direção', +scope : 'Escopo', +row : 'Linha', +col : 'Coluna', +rowgroup : 'Grupo de linhas', +colgroup : 'Grupo de colunas', +missing_scope: 'Tem certeza que deseja continuar sem especificar um escopo para este célula de cabeçalho. Sem isso talvez seja difícil para alguns usuários especiais entender ou conteúdo ou visualizar a tabela.', +cellprops_delta_width : 55 +}); diff --git a/includes/tiny_mce/plugins/table/langs/readme.txt b/includes/tiny_mce/plugins/table/langs/readme.txt new file mode 100644 index 0000000..e32bcf0 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/readme.txt @@ -0,0 +1,4 @@ +Theme specific language packs. + +The language pack codes are based on ISO-639-2 +http://www.loc.gov/standards/iso639-2/englangn.html diff --git a/includes/tiny_mce/plugins/table/langs/ru.js b/includes/tiny_mce/plugins/table/langs/ru.js new file mode 100644 index 0000000..58dfee3 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ru.js @@ -0,0 +1,77 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Îñíîâíûå', +advanced_tab : 'Ðàñøèðåííûå', +general_props : 'Îñíîâíûå ñâîéñòâà', +advanced_props : 'Ðàñøèðåííûå ñâîéñòâà', +desc : 'Âñòàâèòü íîâóþ òàáëèöó', +row_before_desc : 'Âñòàâèòü ñòðîêó ïåðåä', +row_after_desc : 'Âñòàâèòü ñòðîêó ïîñëå', +delete_row_desc : 'Óäàëèòü ñòðîêó', +col_before_desc : 'Âñòàâèòü êîëîíêó ïåðåä', +col_after_desc : 'Âñòàâèòü êîëîíêó ïîñëå', +delete_col_desc : 'Óäàëèòü êîëîíêó', +rowtype : 'Ñòðîêà â ÷àñòè òàáëèöû', +title : 'Âñòàâèòü/Èçìåíèòü òàáëèöó', +width : 'Øèðèíà', +height : 'Âûñîòà', +cols : 'Êîëîíêè', +rows : 'Ñòðîêè', +cellspacing : 'Ðàññòîÿíèå ìåæäó ÿ÷åéêàìè', +cellpadding : 'Îòñòóï â ÿ÷åéêàõ', +border : 'Ãðàíèöà', +align : 'Âûðàâíèâàíèå', +align_default : 'Ïî-óìîë÷àíèþ', +align_left : 'Âñåâî', +align_right : 'Âïðàâî', +align_middle : 'Ïî öåíòðó', +row_title : 'Ñâîéñòâà ñòðîêè òàáëèöû', +cell_title : 'Ñâîéñòâà ÿ÷åéêè òàáëèöû', +cell_type : 'Òèï ÿ÷åéêè', +row_desc : 'Ñâîéñòâà ñòðîêè òàáëèöû', +cell_desc : 'Ñâîéñòâà ÿ÷åéêè òàáëèöû', +valign : 'Âåðòèêàëüíîå âûðàâíèâàíèå', +align_top : 'Ïî âåðõó', +align_bottom : 'Ïî íèçó', +props_desc : 'Ñâîéñòâà òàáëèöû', +bordercolor : 'Öâåò ðàìêè', +bgcolor : 'Öâåò ôîíà', +merge_cells_title : 'Îáúåäèíèòü ÿ÷åéêè òàáëèöû', +split_cells_desc : 'Ðàçäåëèòü ÿ÷åéêè òàáëèöû', +merge_cells_desc : 'Îáúåäèíèòü ÿ÷åéêè òàáëèöû', +cut_row_desc : 'Âûëåçàòü ñòðîêó òàáëèöû', +copy_row_desc : 'Ñêîïèðîâàòü ñòðîêó òàáëèöû', +paste_row_before_desc : 'Âñòàâèòü ñòðîêó òàáëèöû ïåðåä', +paste_row_after_desc : 'Âñòàâèòü ñòðîêó òàáëèöû ïîñëå', +id : 'Id', +style: 'Ñòèëü', +langdir : 'Îïèñàíèå ÿçûêà', +langcode : 'Êîä ÿçûêà', +mime : 'Öåëåâîé MIME òèï', +ltr : 'Ñëåâà íàïðàâî', +rtl : 'Ñïðàâà íàëåâî', +bgimage : 'Ôîíîâîå èçîáðàæåíèå', +summary : 'Êðàòêîå îïèñàíèå', +td : "Òåëî", +th : "Çàãîëîâîê", +cell_cell : 'Îáíîâèòü òåêóùóþ ÿ÷åéêó', +cell_row : 'Îáíîâèòü òåêóùóþ ñòðîêó', +cell_all : 'Îáíîâèòü âñå ÿ÷åéêè â òàáëèöå', +row_row : 'Îáíîâèòü òåêóùóþ ñòðîêó', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'Îáíîâèòü âñå ñòðîêè â òàáëèöå', +thead : 'Çàãîëîâîê òàáëèöû', +tbody : 'Òåëî òàáëèöû', +tfoot : 'Ôóòåð òàáëèöû', +del : 'Óäàëèòü òàáëèöó', +scope : 'Ãðàíèöû', +row : 'Ñòðîêà', +col : 'Êîëîíêà', +rowgroup : 'Ãðóïïà ñòðîê', +colgroup : 'Ãðóïïà êîëîíîê', +missing_scope: 'Âû óâåðåíû, ÷òî õîòèòå ïðîäîëæàòü íå îáîçíà÷èâ ãðàíèöû ÿ÷ååê øàïêè òàáëèöû? Áåç ýòîãî, âîçìîæíî, íåêîòîðûì ïîëüçîâàòåëÿì áóäåò çàòðóäíèòåëüíî ïîíÿòü, ÷òî çà äàííûå íàõîäÿòñÿ â òàáëèöå.', +table_delta_width : 30, +cellprops_delta_width : 130 +}); diff --git a/includes/tiny_mce/plugins/table/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/table/langs/ru_KOI8-R.js new file mode 100644 index 0000000..f9bcc48 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ru_KOI8-R.js @@ -0,0 +1,75 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'ïÓÎÏ×ÎÙÅ', +advanced_tab : 'òÁÓÛÉÒÅÎÎÙÅ', +general_props : 'ïÓÎÏ×ÎÙÅ Ó×ÏÊÓÔ×Á', +advanced_props : 'òÁÓÛÉÒÅÎÎÙÅ Ó×ÏÊÓÔ×Á', +desc : '÷ÓÔÁ×ÉÔØ ÎÏ×ÕÀ ÔÁÂÌÉÃÕ', +row_before_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÐÅÒÅÄ', +row_after_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÐÏÓÌÅ', +delete_row_desc : 'õÄÁÌÉÔØ ÓÔÒÏËÕ', +col_before_desc : '÷ÓÔÁ×ÉÔØ ËÏÌÏÎËÕ ÐÅÒÅÄ', +col_after_desc : '÷ÓÔÁ×ÉÔØ ËÏÌÏÎËÕ ÐÏÓÌÅ', +delete_col_desc : 'õÄÁÌÉÔØ ËÏÌÏÎËÕ', +rowtype : 'óÔÒÏËÁ × ÞÁÓÔÉ ÔÁÂÌÉÃÙ', +title : '÷ÓÔÁ×ÉÔØ/éÚÍÅÎÉÔØ ÔÁÂÌÉÃÕ', +width : 'ûÉÒÉÎÁ', +height : '÷ÙÓÏÔÁ', +cols : 'ëÏÌÏÎËÉ', +rows : 'óÔÒÏËÉ', +cellspacing : 'òÁÓÓÔÏÑÎÉÅ ÍÅÖÄÕ ÑÞÅÊËÁÍÉ', +cellpadding : 'ïÔÓÔÕÐ × ÑÞÅÊËÁÈ', +border : 'çÒÁÎÉÃÁ', +align : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ', +align_default : 'ðÏ-ÕÍÏÌÞÁÎÉÀ', +align_left : '÷ÓÅ×Ï', +align_right : '÷ÐÒÁ×Ï', +align_middle : 'ðÏ ÃÅÎÔÒÕ', +row_title : 'ó×ÏÊÓÔ×Á ÓÔÒÏËÉ ÔÁÂÌÉÃÙ', +cell_title : 'ó×ÏÊÓÔ×Á ÑÞÅÊËÉ ÔÁÂÌÉÃÙ', +cell_type : 'ôÉÐ ÑÞÅÊËÉ', +row_desc : 'ó×ÏÊÓÔ×Á ÓÔÒÏËÉ ÔÁÂÌÉÃÙ', +cell_desc : 'ó×ÏÊÓÔ×Á ÑÞÅÊËÉ ÔÁÂÌÉÃÙ', +valign : '÷ÅÒÔÉËÁÌØÎÏÅ ×ÙÒÁ×ÎÉ×ÁÎÉÅ', +align_top : 'ðÏ ×ÅÒÈÕ', +align_bottom : 'ðÏ ÎÉÚÕ', +props_desc : 'ó×ÏÊÓÔ×Á ÔÁÂÌÉÃÙ', +bordercolor : 'ã×ÅÔ ÒÁÍËÉ', +bgcolor : 'ã×ÅÔ ÆÏÎÁ', +merge_cells_title : 'ïÂßÅÄÉÎÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ', +split_cells_desc : 'òÁÚÄÅÌÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ', +merge_cells_desc : 'ïÂßÅÄÉÎÉÔØ ÑÞÅÊËÉ ÔÁÂÌÉÃÙ', +cut_row_desc : '÷ÙÌÅÚÁÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ', +copy_row_desc : 'óËÏÐÉÒÏ×ÁÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ', +paste_row_before_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ ÐÅÒÅÄ', +paste_row_after_desc : '÷ÓÔÁ×ÉÔØ ÓÔÒÏËÕ ÔÁÂÌÉÃÙ ÐÏÓÌÅ', +id : 'Id', +style: 'óÔÉÌØ', +langdir : 'ïÐÉÓÁÎÉÅ ÑÚÙËÁ', +langcode : 'ëÏÄ ÑÚÙËÁ', +mime : 'ãÅÌÅ×ÏÊ MIME ÔÉÐ', +ltr : 'óÌÅ×Á ÎÁÐÒÁ×Ï', +rtl : 'óÐÒÁ×Á ÎÁÌÅ×Ï', +bgimage : 'æÏÎÏ×ÏÅ ÉÚÏÂÒÁÖÅÎÉÅ', +summary : 'ëÒÁÔËÏÅ ÏÐÉÓÁÎÉÅ', +td : "ôÅÌÏ", +th : "úÁÇÏÌÏ×ÏË", +cell_cell : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÑÞÅÊËÕ', +cell_row : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÓÔÒÏËÕ', +cell_all : 'ïÂÎÏ×ÉÔØ ×ÓÅ ÑÞÅÊËÉ × ÔÁÂÌÉÃÅ', +row_row : 'ïÂÎÏ×ÉÔØ ÔÅËÕÝÕÀ ÓÔÒÏËÕ', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'ïÂÎÏ×ÉÔØ ×ÓÅ ÓÔÒÏËÉ × ÔÁÂÌÉÃÅ', +thead : 'úÁÇÏÌÏ×ÏË ÔÁÂÌÉÃÙ', +tbody : 'ôÅÌÏ ÔÁÂÌÉÃÙ', +tfoot : 'æÕÔÅÒ ÔÁÂÌÉÃÙ', +del : 'õÄÁÌÉÔØ ÔÁÂÌÉÃÕ', +scope : 'çÒÁÎÉÃÙ', +row : 'óÔÒÏËÁ', +col : 'ëÏÌÏÎËÁ', +rowgroup : 'çÒÕÐÐÁ ÓÔÒÏË', +colgroup : 'çÒÕÐÐÁ ËÏÌÏÎÏË', +missing_scope: '÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ÐÒÏÄÏÌÖÁÔØ ÎÅ ÏÂÏÚÎÁÞÉ× ÇÒÁÎÉÃÙ ÑÞÅÅË ÛÁÐËÉ ÔÁÂÌÉÃÙ? âÅÚ ÜÔÏÇÏ, ×ÏÚÍÏÖÎÏ, ÎÅËÏÔÏÒÙÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ ÂÕÄÅÔ ÚÁÔÒÕÄÎÉÔÅÌØÎÏ ÐÏÎÑÔØ, ÞÔÏ ÚÁ ÄÁÎÎÙÅ ÎÁÈÏÄÑÔÓÑ × ÔÁÂÌÉÃÅ.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/table/langs/ru_UTF-8.js new file mode 100644 index 0000000..2cfb752 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/ru_UTF-8.js @@ -0,0 +1,75 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'ОсМПвМые', +advanced_tab : 'РасшОреММые', +general_props : 'ОсМПвМые свПйства', +advanced_props : 'РасшОреММые свПйства', +desc : 'ВставОть МПвую таблОцу', +row_before_desc : 'ВставОть стрПку переЎ', +row_after_desc : 'ВставОть стрПку пПсле', +delete_row_desc : 'УЎалОть стрПку', +col_before_desc : 'ВставОть кПлПМку переЎ', +col_after_desc : 'ВставОть кПлПМку пПсле', +delete_col_desc : 'УЎалОть кПлПМку', +rowtype : 'СтрПка в частО таблОцы', +title : 'ВставОть/ИзЌеМОть таблОцу', +width : 'КОрОМа', +height : 'ВысПта', +cols : 'КПлПМкО', +rows : 'СтрПкО', +cellspacing : 'РасстПяМОе ЌежЎу ячейкаЌО', +cellpadding : 'Отступ в ячейках', +border : 'ГраМОца', +align : 'ВыравМОваМОе', +align_default : 'ПП-уЌПлчаМОю', +align_left : 'ВсевП', +align_right : 'ВправП', +align_middle : 'ПП цеМтру', +row_title : 'СвПйства стрПкО таблОцы', +cell_title : 'СвПйства ячейкО таблОцы', +cell_type : 'ТОп ячейкО', +row_desc : 'СвПйства стрПкО таблОцы', +cell_desc : 'СвПйства ячейкО таблОцы', +valign : 'ВертОкальМПе выравМОваМОе', +align_top : 'ПП верху', +align_bottom : 'ПП МОзу', +props_desc : 'СвПйства таблОцы', +bordercolor : 'Њвет раЌкО', +bgcolor : 'Њвет фПМа', +merge_cells_title : 'ОбъеЎОМОть ячейкО таблОцы', +split_cells_desc : 'РазЎелОть ячейкО таблОцы', +merge_cells_desc : 'ОбъеЎОМОть ячейкО таблОцы', +cut_row_desc : 'Вылезать стрПку таблОцы', +copy_row_desc : 'СкПпОрПвать стрПку таблОцы', +paste_row_before_desc : 'ВставОть стрПку таблОцы переЎ', +paste_row_after_desc : 'ВставОть стрПку таблОцы пПсле', +id : 'Id', +style: 'СтОль', +langdir : 'ОпОсаМОе языка', +langcode : 'КПЎ языка', +mime : 'ЊелевПй MIME тОп', +ltr : 'Слева МаправП', +rtl : 'Справа МалевП', +bgimage : 'ЀПМПвПе ОзПбражеМОе', +summary : 'КраткПе ПпОсаМОе', +td : "ТелП", +th : "ЗагПлПвПк", +cell_cell : 'ОбМПвОть текущую ячейку', +cell_row : 'ОбМПвОть текущую стрПку', +cell_all : 'ОбМПвОть все ячейкО в таблОце', +row_row : 'ОбМПвОть текущую стрПку', +row_odd : 'Update odd rows in table', +row_even : 'Update even rows in table', +row_all : 'ОбМПвОть все стрПкО в таблОце', +thead : 'ЗагПлПвПк таблОцы', +tbody : 'ТелП таблОцы', +tfoot : 'Ѐутер таблОцы', +del : 'УЎалОть таблОцу', +scope : 'ГраМОцы', +row : 'СтрПка', +col : 'КПлПМка', +rowgroup : 'Группа стрПк', +colgroup : 'Группа кПлПМПк', +missing_scope: 'Вы увереМы, чтП хПтОте прПЎПлжать Ме ПбПзМачОв граМОцы ячеек шапкО таблОцы? Без этПгП, вПзЌПжМП, МекПтПрыЌ пПльзПвателяЌ буЎет затруЎМОтельМП пПМять, чтП за ЎаММые МахПЎятся в таблОце.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/sk.js b/includes/tiny_mce/plugins/table/langs/sk.js new file mode 100644 index 0000000..0bc7e8a --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/sk.js @@ -0,0 +1,51 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:44 spocke Exp $ + */ + +tinyMCE.addToLang('',{ +table_desc : 'VloÅŸiÅ¥ novú tabuÄŸku', +table_insert_row_before_desc : 'VloÅŸiÅ¥ riadok pred', +table_insert_row_after_desc : 'VloÅŸiÅ¥ riadok po', +table_delete_row_desc : 'ZmazaÅ¥ riadok', +table_insert_col_before_desc : 'VloÅŸiÅ¥ stĺpec pred', +table_insert_col_after_desc : 'VloÅŸiÅ¥ stĺpec po', +table_delete_col_desc : 'OdstrániÅ¥ stĺpec', +insert_table_title : 'VloÅŸiÅ¥/upraviÅ¥ tabuÄŸku', +insert_table_width : 'Šírka', +insert_table_height : 'VÜška', +insert_table_cols : 'Stĺpce', +insert_table_rows : 'Riadky', +insert_table_cellspacing : 'Vonkajší okraj buniek', +insert_table_cellpadding : 'VnutornÜ okraj buniek', +insert_table_border : 'Riadok', +insert_table_align : 'Zarovnanie', +insert_table_align_default : 'VÜchodzie', +insert_table_align_left : 'VÄŸavo', +insert_table_align_right : 'Vpravo', +insert_table_align_middle : 'Na stred', +insert_table_class : 'Trieda', +table_row_title : 'Vlastnosti riadku', +table_cell_title : 'Vlastnosti bunky', +table_row_desc : 'Vlastnosti riadku', +table_cell_desc : 'Vlastnosti riadku', +insert_table_valign : 'Vertikálne zarovnávanie', +insert_table_align_top : 'Nahor', +insert_table_align_bottom : 'Dole', +table_props_desc : 'Vlastnosti tabuÄŸky', +table_bordercolor : 'Farba rámčeku', +table_bgcolor : 'Farba pozadia', +table_merge_cells_title : 'ZlúčiÅ¥ bunky', +table_split_cells_desc : 'RozdeliÅ¥ bunky', +table_merge_cells_desc : 'ZlúčiÅ¥ bunky', +table_cut_row_desc : 'VyňaÅ¥ riadok', +table_copy_row_desc : 'KopírovaÅ¥ riadok', +table_paste_row_before_desc : 'VloÅŸiÅ¥ riadok pred', +table_paste_row_after_desc : 'VloÅŸiÅ¥ riadok za', +table_insert_desc : 'VloÅŸiÅ¥ tabuÄŸku' +}); + diff --git a/includes/tiny_mce/plugins/table/langs/sv.js b/includes/tiny_mce/plugins/table/langs/sv.js new file mode 100644 index 0000000..094b56b --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/sv.js @@ -0,0 +1,76 @@ +// UK lang variables + +tinyMCE.addToLang('table',{ +general_tab : 'Generella inställningar', +advanced_tab : 'Avancerade inställningar', +general_props : 'Generella inställningar', +advanced_props : 'Avancerade inställningar', +desc : 'Skapa ny tabell', +before_desc : 'Skapa rad före', +after_desc : 'Skapa rad efter', +row_before_desc : 'Skapa rad före', +row_after_desc : 'Skapa rad efter', +delete_row_desc : 'Ta bort rad', +col_before_desc : 'Skapa kolumn före', +col_after_desc : 'Skapa kolumn efter', +delete_col_desc : 'Ta bort kolumn', +rowtype : 'Rad typ', +title : 'Skapa/redigera ny tabell', +width : 'Bredd', +height : 'Höjd', +cols : 'Columner', +rows : 'Rader', +cellspacing : 'Cellmellanrum', +cellpadding : 'Cellutfyllnad', +border : 'Ram', +align : 'Justering', +align_default : 'Ingen', +align_left : 'Vänster', +align_right : 'Höger', +align_middle : 'Mitten', +row_title : 'Tabell radsinställningar', +cell_title : 'Tabell cellsinställningar', +cell_type : 'Cell typ', +row_desc : 'Tabell rads inställningar', +cell_desc : 'Tabell cells inställningar', +valign : 'Vertical justering', +align_top : 'Toppen', +align_bottom : 'Botten', +props_desc : 'Tabell inställningar', +bordercolor : 'Ram färg', +bgcolor : 'Bakgrundsfärg', +merge_cells_title : 'Sammanfoga tabell celler', +split_cells_desc : 'Delaupp tabell celler', +merge_cells_desc : 'Sammanfoga tabell celler', +cut_row_desc : 'Klipput tabell rad', +copy_row_desc : 'Kopiera tabell rad', +paste_row_before_desc : 'Klistra in tabell rad före', +paste_row_after_desc : 'Klistra in tabell rad efter', +id : 'Id', +style: 'Stil', +langdir : 'Skrift riktning', +langcode : 'Språk kåd', +ltr : 'Vänster till höger', +rtl : 'Höger till vänster', +bgimage : 'Bakgrundsbild', +summary : 'Sammanfattning', +td : "Data", +th : "Huvud", +cell_cell : 'Updatera nuvarande cell', +cell_row : 'Updatera alla celler i raden', +cell_all : 'Updatera alla celler t tabellen', +row_row : 'Updatera nuvarande rad', +row_odd : 'Updatera udda rader i tabellen', +row_even : 'Updatera jämna rader i tabellen', +row_all : 'Updatera alla rader i tabellen', +thead : 'Tabell Huvud', +tbody : 'Tabell Kropp', +tfoot : 'Tabell Fot', +del : 'Tabort tabell', +scope : 'Scope', +row : 'Rad', +col : 'Kolumn', +rowgroup : 'Rad grupp', +colgroup : 'Kolumn grupp', +missing_scope: 'Är du säker på att du vill fortsätta utan att specifisera ett scope, utan denna kan det bli svårt för handikappade att förstå tabellen.' +}); diff --git a/includes/tiny_mce/plugins/table/langs/tw.js b/includes/tiny_mce/plugins/table/langs/tw.js new file mode 100644 index 0000000..450d538 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/tw.js @@ -0,0 +1,43 @@ +// TW lang variables contributed by Jim Kou + +tinyMCE.addToLang('',{ +insert_table_align : '¹ï»ô', +insert_table_align_default : 'ŒÐ·Ç', +insert_table_align_left : '»ô¥ª', +insert_table_align_middle : 'žm€€', +insert_table_align_right : '»ô¥k', +insert_table_border : '®Øœu', +insert_table_cellpadding : 'ŠrÅé»PÀxŠs®æ¶¡»Ø', +insert_table_cellspacing : 'ÀxŠs®æ¶¡»Ø', +insert_table_class : 'ŒËŠ¡', +insert_table_cols : 'Šæ', +insert_table_height : '°ª«×', +insert_table_rows : 'ŠC', +insert_table_title : 'ªí®æŒÐÃD', +insert_table_width : 'Œe«×', +table_delete_col_desc : '§R°£€@ŠæÀxŠs®æ', +table_delete_row_desc : '§R°£€@ŠCÀxŠs®æ', +table_desc : 'ªí®æ', +table_insert_col_after_desc : '·sŒW€@ŠæÀxŠs®æ(«á)', +table_insert_col_before_desc : '·sŒW€@ŠæÀxŠs®æ(«e)', +table_insert_row_after_desc : '·sŒW€@ŠCÀxŠs®æ(«á)', +table_insert_row_before_desc : '·sŒW€@ŠCÀxŠs®æ(«e)', +table_row_title : 'Table row properties', +table_cell_title : 'Table cell properties', +table_row_desc : 'Table row properties', +table_cell_desc : 'Table cell properties', +insert_table_valign : 'Vertical alignment', +insert_table_align_top : 'Top', +insert_table_align_bottom : 'Bottom', +table_props_desc : 'Table properties', +table_bordercolor : 'Border color', +table_bgcolor : 'Bg color', +table_merge_cells_title : 'Merge table cells', +table_split_cells_desc : 'Split table cells', +table_merge_cells_desc : 'Merge table cells', +table_cut_row_desc : 'Cut table row', +table_copy_row_desc : 'Copy table row', +table_paste_row_before_desc : 'Paste table row before', +table_paste_row_after_desc : 'Paste table row after', +table_insert_desc : 'Insert a new table' +}); diff --git a/includes/tiny_mce/plugins/table/langs/zh_cn.js b/includes/tiny_mce/plugins/table/langs/zh_cn.js new file mode 100644 index 0000000..f0ed8cd --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/zh_cn.js @@ -0,0 +1,75 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('table',{ +general_tab : 'Ò»°ã', +advanced_tab : 'žßŒ¶', +general_props : 'Ò»°ãÊôÐÔ', +advanced_props : 'žßŒŒÊôÐÔ', +desc : '²åÈëÒ»žöбí', +row_before_desc : 'Ïòǰ²åÈëÒ»ÐÐ', +row_after_desc : 'Ïòºó²åÈëÒ»ÐÐ', +delete_row_desc : 'ÉŸ³ýÐÐ', +col_before_desc : 'Ïò×ó²åÈëÒ»ÁÐ', +col_after_desc : 'ÏòÓÒ²åÈëÒ»ÁÐ', +delete_col_desc : 'ÉŸ³ýÁÐ', +rowtype : 'ÐÐÖÖÀà', +title : '²åÈë/ÐÞžÄ ±í', +width : '¿í', +height : 'žß', +cols : 'ÁÐÊý', +rows : 'ÐÐÊý', +cellspacing : 'µ¥Ôªžñ¿ÕŒä', +cellpadding : 'µ¥ÔªžñÌî³ä', +border : '±ß¿ò', +align : '¶ÔÆë', +align_default : 'ĬÈÏ', +align_left : 'ŸÓ×ó', +align_right : 'ŸÓÓÒ', +align_middle : 'ŸÓÖÐ', +row_title : 'ÐбêÌâ', +cell_title : 'µ¥Ôªžñ±êÌâ', +cell_type : 'µ¥ÔªžñÖÖÀà', +row_desc : 'ÐÐÃèÊö', +cell_desc : 'µ¥ÔªžñÃèÊö', +valign : '޹ֱ¶ÔÆë', +align_top : '¶¥¶Ë', +align_bottom : 'µ×¶Ë', +props_desc : '±íÊôÐÔ', +bordercolor : '±ß¿òÑÕÉ«', +bgcolor : '±³Ÿ°ÑÕÉ«', +merge_cells_title : 'ºÏ²¢±íÖе¥Ôªžñ±êÌâ', +split_cells_desc : '·ÖÀà±íÖе¥ÔªžñÃèÊö', +merge_cells_desc : 'ºÏ²¢±íÖе¥ÔªžñÃèÊö', +cut_row_desc : 'ŒôÇÐÐÐ', +copy_row_desc : 'žŽÖÆÐÐ', +paste_row_before_desc : 'ÏòǰճÌùÒ»ÐÐ', +paste_row_after_desc : 'ÏòºóÕ³ÌùÒ»ÐÐ', +id : '±íʶ', +style: 'ÑùÊœ', +langdir : 'ÊéÐŽ·œÏò', +langcode : 'ÓïÑÔ±àÂë', +mime : 'Ä¿±ê MIME ÖÖÀà', +ltr : 'ŽÓ×óµœÓÒ', +rtl : 'ŽÓÓÒµœ×ó', +bgimage : '±³Ÿ°ÍŒÆ¬', +summary : 'Сœá', +td : "ÊýŸÝ", +th : "ҳÌ", +cell_cell : 'žüе±Ç°µ¥Ôªžñ', +cell_row : 'žüÐÂÐÐÖÐËùÓе¥Ôªžñ', +cell_all : 'žüбíÖÐËùÓе¥Ôªžñ', +row_row : 'žüе±Ç°ÐÐ', +row_odd : 'žüÐÂÆæÊýÐÐ', +row_even : 'žüÐÂÅŒÊýÐÐ', +row_all : 'žüбíÖÐËùÓÐÐÐ', +thead : '±íÍ·', +tbody : '±íÖÐ', +tfoot : '±íβ', +del : 'ÉŸ³ý±í', +scope : 'ÇøÓò', +row : 'ÐÐ', +col : 'ÁÐ', +rowgroup : 'ÐÐŒ¯ÍÅ', +colgroup : 'ÁÐŒ¯ÍÅ', +missing_scope: 'ÄúÈ·ÈÏÒªÔÚûÓÐÉùÃ÷±àŒ­ÇøÓòʱŒÌÐøÂð£¿Ã»ÓÐÉùÃ÷±àŒ­ÇøÓòœ«Ê¹ÔĶÁÕß¿ŽÆðÀŽºÜ·ÑÁŠ¡£' +}); diff --git a/includes/tiny_mce/plugins/table/langs/zh_tw.js b/includes/tiny_mce/plugins/table/langs/zh_tw.js new file mode 100644 index 0000000..c17723a --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/zh_tw.js @@ -0,0 +1,76 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('table',{ +general_tab : '€@¯ë', +advanced_tab : '¶i¶¥', +general_props : '€@¯ëÄÝ©Ê', +advanced_props : '¶i¶¥ÄÝ©Ê', +desc : 'Ž¡€J·sªí®æ', +row_before_desc : 'Šb€§«eŽ¡€JŠC', +row_after_desc : 'Šb€§«áŽ¡€JŠC', +delete_row_desc : '§R°£ŠC', +col_before_desc : 'Šb€§«eŽ¡€JŠæ', +col_after_desc : 'Šb€§«áŽ¡€JŠæ', +delete_col_desc : '§R°£Šæ', +rowtype : 'ªí®æ€€ªºŠC', +title : 'Ž¡€J©ÎœÕŸãªí®æ', +width : 'Œe', +height : '°ª', +cols : 'Šæ', +rows : 'ŠC', +cellspacing : 'ÀxŠs®æ®æœu¶¡¶Z', +cellpadding : 'ÀxŠs®æ€º€å»P®æœu¶¡¶Z', +border : '®Øœu', +align : 'Šìžm', +align_default : '€º©w', +align_left : 'Ÿa¥ª', +align_right : 'Ÿa¥k', +align_middle : 'žm€€', +row_title : 'ŠCÄÝ©Ê', +cell_title : 'ÀxŠs®æÄÝ©Ê', +cell_type : 'ÀxŠs®æÃþ«¬', +row_desc : 'ŠCÄÝ©Ê', +cell_desc : 'ÀxŠs®æÄÝ©Ê', +valign : '««ªœŠìžm', +align_top : '³»ºÝ', +align_bottom : '©³³¡', +props_desc : 'ªí®æÄÝ©Ê', +bordercolor : '®ØœuÃCŠâ', +bgcolor : '­IŽºÃCŠâ', +merge_cells_title : 'ŠXšÖÀxŠs®æ', +split_cells_desc : '€À³ÎÀxŠs®æ', +merge_cells_desc : 'ŠXšÖÀxŠs®æ', +cut_row_desc : '°Å€UŠC', +copy_row_desc : 'œÆ»sŠC', +paste_row_before_desc : 'Šb€§«e¶K€WŠC', +paste_row_after_desc : 'Šb€§«á¶K€WŠC', +id : 'œsœX', +style: 'Š¡ŒË', +langdir : '»yš¥¥Îªk', +langcode : '»yœX', +mime : '¹ï¶H MIME Ãþ«¬', +ltr : '¥Ñ¥ªŠÜ¥k', +rtl : '¥Ñ¥kŠÜ¥ª', +bgimage : '­IŽº¹ÏÀÉ', +summary : '€@Äý', +td : "žê®Æ", +th : "ŒÐÀY", +cell_cell : '§ó·s©ÒŠbªºÀxŠs®æ', +cell_row : '§ó·sŠC€ºªºÀxŠs®æ', +cell_all : '§ó·sªí®æ€€ªºÀxŠs®æ', +row_row : '§ó·s©ÒŠbªºŠC', +row_odd : '§ó·sªí®æ€€ªº©_ŒÆŠC', +row_even : '§ó·sªí®æ€€ªº°žŒÆŠC', +row_all : '§ó·sªí®æ€€ªºŠC', +thead : 'ªí®æŒÐÀY', +tbody : 'ªí®æ¹êÅé', +tfoot : 'ªí®æ©³³¡', +del : '§R°£ªí®æ', +scope : 'œd³ò', +row : 'ŠC', +col : 'Šæ', +rowgroup : 'žsŠC', +colgroup : 'žsŠæ', +missing_scope: 'œT©w­nŠbšSг¹ïйªí®æŒÐÀY³]©wœd³ò€UÄ~Äò°õŠæ¶Ü¡H\n€£¥[¥H³]©wªºžÜ¡A¥i¯à·|ŸÉ­P¬YšÇšÏ¥ÎªÌµLªk¶¶§QŪšúªí®æ€€ªº³¡¥÷©Î¬OŸãÅéžê°T¡C' +}); diff --git a/includes/tiny_mce/plugins/table/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/table/langs/zh_tw_utf8.js new file mode 100644 index 0000000..ae0a4f9 --- /dev/null +++ b/includes/tiny_mce/plugins/table/langs/zh_tw_utf8.js @@ -0,0 +1,76 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('table',{ +general_tab : '䞀般', +advanced_tab : '進階', +general_props : '䞀般屬性', +advanced_props : '進階屬性', +desc : '插入新衚栌', +row_before_desc : '圚之前插入列', +row_after_desc : '圚之埌插入列', +delete_row_desc : '刪陀列', +col_before_desc : '圚之前插入行', +col_after_desc : '圚之埌插入行', +delete_col_desc : '刪陀行', +rowtype : '衚栌䞭的列', +title : '插入或調敎衚栌', +width : '寬', +height : '高', +cols : '行', +rows : '列', +cellspacing : '儲存栌栌線間距', +cellpadding : '儲存栌內文與栌線間距', +border : '框線', +align : '䜍眮', +align_default : '內定', +align_left : '靠巊', +align_right : '靠右', +align_middle : '眮䞭', +row_title : '列屬性', +cell_title : '儲存栌屬性', +cell_type : '儲存栌類型', +row_desc : '列屬性', +cell_desc : '儲存栌屬性', +valign : '垂盎䜍眮', +align_top : '頂端', +align_bottom : '底郚', +props_desc : '衚栌屬性', +bordercolor : '框線顏色', +bgcolor : '背景顏色', +merge_cells_title : '合䜵儲存栌', +split_cells_desc : '分割儲存栌', +merge_cells_desc : '合䜵儲存栌', +cut_row_desc : '剪䞋列', +copy_row_desc : '耇補列', +paste_row_before_desc : '圚之前貌䞊列', +paste_row_after_desc : '圚之埌貌䞊列', +id : '線碌', +style: '匏暣', +langdir : '語蚀甚法', +langcode : '語碌', +mime : '對象 MIME 類型', +ltr : '由巊至右', +rtl : '由右至巊', +bgimage : '背景圖檔', +summary : '䞀芜', +td : "資料", +th : "暙頭", +cell_cell : '曎新所圚的儲存栌', +cell_row : '曎新列內的儲存栌', +cell_all : '曎新衚栌䞭的儲存栌', +row_row : '曎新所圚的列', +row_odd : '曎新衚栌䞭的奇敞列', +row_even : '曎新衚栌䞭的偶敞列', +row_all : '曎新衚栌䞭的列', +thead : '衚栌暙頭', +tbody : '衚栌寊體', +tfoot : '衚栌底郚', +del : '刪陀衚栌', +scope : '範圍', +row : '列', +col : '行', +rowgroup : '矀列', +colgroup : '矀行', +missing_scope: '確定芁圚沒有對歀衚栌暙頭蚭定範圍䞋繌續執行嗎\n䞍加以蚭定的話可胜會導臎某些䜿甚者無法順利讀取衚栌䞭的郚仜或是敎體資蚊。' +}); diff --git a/includes/tiny_mce/plugins/table/merge_cells.htm b/includes/tiny_mce/plugins/table/merge_cells.htm new file mode 100644 index 0000000..82628ee --- /dev/null +++ b/includes/tiny_mce/plugins/table/merge_cells.htm @@ -0,0 +1,37 @@ + + + {$lang_table_merge_cells_title} + + + + + + +
+
+ {$lang_table_merge_cells_title} + + + + + + + + + +
{$lang_table_cols}: +
{$lang_table_rows}:
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/table/readme.txt b/includes/tiny_mce/plugins/table/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/table/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/plugins/table/row.htm b/includes/tiny_mce/plugins/table/row.htm new file mode 100644 index 0000000..43c8bca --- /dev/null +++ b/includes/tiny_mce/plugins/table/row.htm @@ -0,0 +1,159 @@ + + + {$lang_table_row_title} + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/table/table.htm b/includes/tiny_mce/plugins/table/table.htm new file mode 100644 index 0000000..17fb5a8 --- /dev/null +++ b/includes/tiny_mce/plugins/table/table.htm @@ -0,0 +1,155 @@ + + + {$lang_table_title} + + + + + + + + +
+ + +
+
+
+ {$lang_table_general_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+ {$lang_table_advanced_props} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + +
 
+
+ + + + + +
 
+
+ + + + + +
 
+
+
+
+
+ +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/plugins/zoom/editor_plugin.js b/includes/tiny_mce/plugins/zoom/editor_plugin.js new file mode 100644 index 0000000..6aaad52 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/editor_plugin.js @@ -0,0 +1,6 @@ +function TinyMCE_zoom_getInfo(){return{longname:'Zoom',author:'Moxiecode Systems',authorurl:'http://tinymce.moxiecode.com',infourl:'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};};function TinyMCE_zoom_getControlHTML(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0||tinyMCE.isOpera)return "";switch(control_name){case "zoom":return '';}return "";}function TinyMCE_zoom_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true;}return false;} \ No newline at end of file diff --git a/includes/tiny_mce/plugins/zoom/editor_plugin_src.js b/includes/tiny_mce/plugins/zoom/editor_plugin_src.js new file mode 100644 index 0000000..cfab4b1 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/editor_plugin_src.js @@ -0,0 +1,47 @@ +/* Import plugin specific language pack */ + +function TinyMCE_zoom_getInfo() { + return { + longname : 'Zoom', + author : 'Moxiecode Systems', + authorurl : 'http://tinymce.moxiecode.com', + infourl : 'http://tinymce.moxiecode.com/tinymce/docs/plugin_zoom.html', + version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion + }; +}; + +/** + * Returns the HTML contents of the zoom control. + */ +function TinyMCE_zoom_getControlHTML(control_name) { + if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera) + return ""; + + switch (control_name) { + case "zoom": + return ''; + } + + return ""; +} + +/** + * Executes the mceZoom command. + */ +function TinyMCE_zoom_execCommand(editor_id, element, command, user_interface, value) { + // Handle commands + switch (command) { + case "mceZoom": + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value; + tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value; + return true; + } + + // Pass to next handler in chain + return false; +} diff --git a/includes/tiny_mce/plugins/zoom/langs/es.js b/includes/tiny_mce/plugins/zoom/langs/es.js new file mode 100644 index 0000000..738f983 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/es.js @@ -0,0 +1,3 @@ +// Español por matiasl-AR + +tinyMCELang['lang_zoom_prefix'] = 'Aumento de Tamaño'; \ No newline at end of file diff --git a/includes/tiny_mce/plugins/zoom/langs/fr.js b/includes/tiny_mce/plugins/zoom/langs/fr.js new file mode 100644 index 0000000..a5f23c1 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/fr.js @@ -0,0 +1,3 @@ +// Traduit par Normand Lamoureux le 2005-11-12 + +tinyMCELang['lang_zoom_prefix'] = 'Augmenter la taille'; \ No newline at end of file diff --git a/includes/tiny_mce/plugins/zoom/langs/he.js b/includes/tiny_mce/plugins/zoom/langs/he.js new file mode 100644 index 0000000..9625c40 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/he.js @@ -0,0 +1,5 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +zoom_prefix : 'æåí' +}); diff --git a/includes/tiny_mce/plugins/zoom/langs/pt_br.js b/includes/tiny_mce/plugins/zoom/langs/pt_br.js new file mode 100644 index 0000000..c42819b --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/pt_br.js @@ -0,0 +1,10 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCELang['lang_zoom_prefix'] = 'Aumentar de Tamanho'; \ No newline at end of file diff --git a/includes/tiny_mce/plugins/zoom/langs/ru.js b/includes/tiny_mce/plugins/zoom/langs/ru.js new file mode 100644 index 0000000..eddfb70 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/ru.js @@ -0,0 +1,5 @@ +// RU cp1251 lang variables + +tinyMCE.addToLang('',{ +zoom_prefix : 'ìàñøòàá' +}); diff --git a/includes/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js b/includes/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js new file mode 100644 index 0000000..62e35e5 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/ru_KOI8-R.js @@ -0,0 +1,5 @@ +// RU KOI8-R lang variables + +tinyMCE.addToLang('',{ +zoom_prefix : 'ÍÁÓÛÔÁÂ' +}); diff --git a/includes/tiny_mce/plugins/zoom/langs/ru_UTF-8.js b/includes/tiny_mce/plugins/zoom/langs/ru_UTF-8.js new file mode 100644 index 0000000..15975a3 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/ru_UTF-8.js @@ -0,0 +1,5 @@ +// RU UTF-8 lang variables + +tinyMCE.addToLang('',{ +zoom_prefix : 'Ќасштаб' +}); diff --git a/includes/tiny_mce/plugins/zoom/langs/zh_tw.js b/includes/tiny_mce/plugins/zoom/langs/zh_tw.js new file mode 100644 index 0000000..2784585 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/zh_tw.js @@ -0,0 +1,6 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +zoom_prefix : '©ñ€j' +}); diff --git a/includes/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js b/includes/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js new file mode 100644 index 0000000..e35f781 --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/langs/zh_tw_utf8.js @@ -0,0 +1,6 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + +tinyMCE.addToLang('',{ +zoom_prefix : '攟倧' +}); diff --git a/includes/tiny_mce/plugins/zoom/readme.txt b/includes/tiny_mce/plugins/zoom/readme.txt new file mode 100644 index 0000000..6bc6d7d --- /dev/null +++ b/includes/tiny_mce/plugins/zoom/readme.txt @@ -0,0 +1 @@ +Check the TinyMCE documentation for details on this plugin. diff --git a/includes/tiny_mce/themes/advanced/about.htm b/includes/tiny_mce/themes/advanced/about.htm new file mode 100644 index 0000000..b4ea37b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/about.htm @@ -0,0 +1,53 @@ + + + {$lang_about_title} + + + + + + + + + +
+
+

{$lang_about_title}

+

Version: {$tinymce_version} ({$tinymce_releasedate})

+

TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL + by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.

+

Copyright © 2005, Moxiecode Systems AB, All rights reserved.

+

For more information about this software visit the TinyMCE website.

+ +
+
+ +
+
+

{$lang_loaded_plugins}

+ +
+
+ +

 

+
+
+ +
+
+
+
+ +
+
+ +
+
+ + diff --git a/includes/tiny_mce/themes/advanced/anchor.htm b/includes/tiny_mce/themes/advanced/anchor.htm new file mode 100644 index 0000000..988bcb6 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/anchor.htm @@ -0,0 +1,33 @@ + + + {$lang_insert_anchor_title} + + + + + +
+ + + + + + + + + +
{$lang_insert_anchor_title}
{$lang_insert_anchor_name}:
+ +
+
+ +
+ +
+ +
+
+ +
+ + diff --git a/includes/tiny_mce/themes/advanced/charmap.htm b/includes/tiny_mce/themes/advanced/charmap.htm new file mode 100644 index 0000000..fbd472b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/charmap.htm @@ -0,0 +1,53 @@ + + + {$lang_theme_charmap_title} + + + + + + + + + + + + + + + + + +
{$lang_theme_charmap_title}
+ + + + + + + + + +
 
 
+
+ + + + + + + + + + + + + + + + +
HTML-Code
 
 
NUM-Code
 
+
+ + + diff --git a/includes/tiny_mce/themes/advanced/color_picker.htm b/includes/tiny_mce/themes/advanced/color_picker.htm new file mode 100644 index 0000000..02ba220 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/color_picker.htm @@ -0,0 +1,13 @@ + + + {$lang_theme_colorpicker_title} + + + + + +
+ +
+ + diff --git a/includes/tiny_mce/themes/advanced/css/editor_content.css b/includes/tiny_mce/themes/advanced/css/editor_content.css new file mode 100644 index 0000000..91b9588 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/css/editor_content.css @@ -0,0 +1,55 @@ +/* This file contains the CSS data for the editable area(iframe) of TinyMCE */ +/* You can extend this CSS by adding your own CSS file with the the content_css option */ + +body { + background-color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB !important; +} + +.mceItemAnchor { + width: 12px; + line-height: 6px; + overflow: hidden; + padding-left: 12px; + background-image: url('../images/anchor_symbol.gif'); + background-position: bottom; + background-repeat: no-repeat; +} + +/* Important is needed in Gecko browsers inorder to style links */ +/* +a { + color: green !important; +} +*/ + +/* Style selection range colors in Gecko browsers */ +/* +::-moz-selection { + background-color: red; + color: green; +} +*/ diff --git a/includes/tiny_mce/themes/advanced/css/editor_popup.css b/includes/tiny_mce/themes/advanced/css/editor_popup.css new file mode 100644 index 0000000..5c31f10 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/css/editor_popup.css @@ -0,0 +1,319 @@ +/* This file contains the CSS data for all popups in TinyMCE */ + +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; + margin: 8px; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0px solid #808080; +} + +#insert { + font-weight: bold; + width: 90px; + height: 21px; + border: 0px; + background-image: url('../images/insert_button_bg.gif'); + cursor: pointer; +} + +#cancel { + font-weight: bold; + width: 90px; + height: 21px; + border: 0px; + background-image: url('../images/cancel_button_bg.gif'); + cursor: pointer; +} + +/* Mozilla only style */ +html>body #insert, html>body #cancel { + padding-bottom: 2px; +} + +.title { + font-size: 12px; + font-weight: bold; + color: #2B6FB6; +} + +table.charmap { + border-style: solid; + border-width: 1px; + border-color: #AAAAAA; +} + +td.charmap, td.charmapOver { + color: #000000; + border-color: #AAAAAA; + border-style: solid; + border-width: 1px; + text-align: center; + font-size: 12px; +} + +td.charmapOver { + background-color: #CCCCCC; + cursor: arrow; +} + +a.charmap { + color: #000000; + text-decoration: none +} + +.wordWrapCode { + vertical-align: middle; + border: 1px none #000000; + background-color: transparent; +} + +input.radio { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +input.checkbox { + border: 1px none #000000; + background-color: transparent; + vertical-align: middle; +} + +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { + margin-left: 1px; +} + +.mceButtonNormal { + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: arrow; +} + +.mceButtonOver { + border: 1px solid #0A246A; + cursor: arrow; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: arrow; + border: 1px solid #0A246A; + background-color: #8592B5; +} + +.mceButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border-top: 1px solid; + border-left: 1px solid; + border-bottom: 1px solid; + border-right: 1px solid; + border-color: #F0F0EE; + cursor: arrow; +} + +.mceActionPanel { + margin-top: 5px; +} + +/* Tabs classes */ + +.tabs { + float: left; + width: 100%; + line-height: normal; + background-image: url("../images/xp/tabs_bg.gif"); +} + +.tabs ul { + margin: 0; + padding: 0px 0px 0; + list-style: none; +} + +.tabs li { + float: left; + background: url("../images/xp/tab_bg.gif") no-repeat left top; + margin: 0; + margin-left: 0px; + margin-right: 2px; + padding: 0 0 0 10px; + line-height: 18px; +} + +.tabs li.current { + background: url("../images/xp/tab_sel_bg.gif") no-repeat left top; + margin-right: 2px; +} + +.tabs span { + float: left; + display: block; + background: url("../images/xp/tab_end.gif") no-repeat right top; + padding: 0px 10px 0px 0px; +} + +.tabs .current span { + background: url("../images/xp/tab_sel_end.gif") no-repeat right top; +} + +.tabs a { + text-decoration: none; + font-family: Verdana, Arial; + font-size: 10px; +} + +.tabs a:link, .tabs a:visited, .tabs a:hover { + color: black; +} + +.tabs a:hover { +} + +.tabs .current { +} + +.tabs .current a, .tabs .current a:link, .tabs .current a:visited { +} + +.panel_wrapper div.panel { + display: none; +} + +.panel_wrapper div.current { + display: block; + width: 100%; + height: 300px; + overflow: visible; /* Should be auto but that breaks Safari */ +} + +.panel_wrapper { + border: 1px solid #919B9C; + border-top: 0px; + padding: 10px; + padding-top: 5px; + clear: both; + background-color: white; +} + +fieldset { + border: 1px solid #919B9C; + font-family: Verdana, Arial; + font-size: 10px; + padding: 0px; + margin: 0px; + padding: 4px; +} + +legend { + color: #2B6FB6; + font-weight: bold; +} + +.properties { + width: 100%; +} + +.properties .column1 { +} + +.properties .column2 { + text-align: left; +} + +a:link, a:visited { + color: black; +} + +a:hover { + color: #2B6FB6; +} + +#plugintable thead { + font-weight: bold; + background-color: #DDDDDD; +} + +#plugintable, #about #plugintable td { + border: 1px solid #919B9C; +} + +#plugintable { + width: 99%; + margin-top: 10px; +} + +#pluginscontainer { + height: 290px; + overflow: auto; +} + +/* MSIE Specific styles */ + +* html .panel_wrapper { + width: 100%; +} + +.column { + float: left; +} + +h1, h2, h3, h4 { + color: #2B6FB6; + margin: 0px; + padding: 0px; + padding-top: 5px; +} + +h3 { + font-size: 14px; +} + +/* Disables the advanced tab in the table plugin. */ +/* +#table #advanced_tab { + display: none; +} +*/ + +/* Disables the border input field and label in the table plugin. */ +/* +#table #border, #table #borderlabel { + display: none; +} +*/ diff --git a/includes/tiny_mce/themes/advanced/css/editor_ui.css b/includes/tiny_mce/themes/advanced/css/editor_ui.css new file mode 100644 index 0000000..a8d680d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/css/editor_ui.css @@ -0,0 +1,173 @@ +/* This file contains the CSS data for the editor UI of TinyMCE instances */ + +.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover { + border: 0px; margin: 0px; padding: 0px; background: transparent; +} + +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceSeparatorLine, .mceButtonDisabled, .mceButtonSelected { + border: 0px; margin: 0px; padding: 0px; background: transparent; + margin-top: 1px; + margin-left: 1px; + padding: 0px; +} + +.mceButtonNormal { + border: 1px solid #F0F0EE !important; + cursor: arrow; +} + +.mceButtonOver { + border: 1px solid #0A246A !important; + cursor: arrow; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: arrow; + border: 1px solid #0A246A !important; + background-color: #8592B5; +} + +.mceButtonSelected { + border: 1px solid #C0C0BB !important; + cursor: arrow; +} + +.mceButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border: 1px solid #F0F0EE !important; + cursor: arrow; +} + +.mceSeparator { + border-top: 1px solid buttonhighlight; + border-left: 1px solid buttonhighlight; + border-bottom: 1px solid buttonshadow; + border-right: 1px solid buttonshadow; + margin-right: 2px; + margin-left: 2px; +} + +.mceSeparatorLine { + margin:2px; + margin-left: 4px; + background-color: #F0F0EE; + border-top: 1px solid buttonshadow; + border-left: 1px solid buttonshadow; + border-bottom: 1px solid buttonhighlight; + border-right: 1px solid buttonhighlight; + width: 0px; + height: 15px; +} + +.mceSelectList { + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + font-size: 7pt !important; + font-weight: normal; + margin-top: 3px; + padding: 0px; + display: inline; + vertical-align: top; + background-color: #F0F0EE +} + +.mceLabel, .mceLabelDisabled { + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + font-size: 9pt; +} + +.mceLabel { + color: #000000; +} + +.mceLabelDisabled { + cursor: text; + color: #999999; +} + +.mceEditor { + background: #F0F0EE; + border: 1px solid #cccccc; + padding: 0px; + margin: 0px; +} + +.mceEditorArea { + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + background: #FFFFFF; + padding: 0px; + margin: 0px; +} + +.mceToolbarTop, .mceToolbarBottom { + background: #F0F0EE; + line-height: 1px; + font-size: 1px; +} + +.mceToolbarTop { + border-bottom: 1px solid #cccccc; +} + +.mceToolbarBottom { + border-top: 1px solid #cccccc; +} + +.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar { + height: 20px; +} + +.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText { + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + font-size: 9pt; + padding: 2px; + line-height: 16px; + overflow: visible; +} + +.mceStatusbarTop { + border-bottom: 1px solid #cccccc; +} + +.mceStatusbarBottom { + border-top: 1px solid #cccccc; +} + +.mceStatusbar { + border-bottom: 1px solid #cccccc; +} + +.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover { + text-decoration: none; + font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; + font-size: 9pt; + color: #000000; +} + +.mcePathItem:hover { + text-decoration: underline; +} + +.mceStatusbarPathText { + float: left; +} + +.mceStatusbarResize { + float: right; + background-image: url('../images/statusbar_resize.gif'); + background-repeat: no-repeat; + width: 11px; + height: 20px; + cursor: se-resize; +} + +.mceResizeBox { + width: 10px; + height: 10px; + display: none; + border: 1px dotted gray; + margin: 0px; + padding: 0px; +} diff --git a/includes/tiny_mce/themes/advanced/docs/cs/about.htm b/includes/tiny_mce/themes/advanced/docs/cs/about.htm new file mode 100644 index 0000000..a1c6dff --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/about.htm @@ -0,0 +1,31 @@ + + +O TinyMCE + + + + + + + + + + + + +
+
+TinyMCE je malý WYSIWYG editor pro webové prohlíŸeèe jako jsou MSIE nebo Mozilla, +kterým lze HTML obsah upravovat mnohem jednodu¹eji. Obsahuje bìŸné funkce, +jeŸ lze nalézt ve vìt¹inì textových editorù, proto by jeho pouŸívání nemìlo být sloŸité.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/cs/common_buttons.htm new file mode 100644 index 0000000..d306276 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/common_buttons.htm @@ -0,0 +1,170 @@ + + +BìŸná tlaèítka + + + + + + + + + + + + +
+
+NíŸe je krátce popsáno kaŸdé tlaèítko. + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Zkopíruje aktuálnì vybraný obsah do schránky. (Ctrl+C)
Vyjme aktuálnì vybraný obsah do schránky. (Ctrl+X)
VloŸí obsah schránky do okna editoru. (Ctrl+P)
Ztuèní text.
Naformátuje text kurzívou.
Podtrhne text.
Pøe¹krtne text.
Zarovná vlevo.
Zarovná na støed.
Zarovná vpravo.
Zarovná do bloku.
Neøazený seznam/seznam s odráŸky.
Øazený seznam/èíslovaný seznam.
Pøedsadí/sníŸí odsazení.
Odsadí/zvý¹í odsazení.
Vrátí zpìt naposledy provedenou akci.
Obnoví poslední akci.
VloŸí nový odkaz, více o této funkci v èásti VloŸit odkaz.
Zru¹í odkaz v aktuálním výbìru/odstranit v¹echny vybrané odkazy.
VloŸí nový obrázek, více o této funkci v èásti VloŸit obrázek.
Vyèistí kód/odstraní nechtìné formátování. Tato funkce se hodí kdyŸ + kopírujete obsah napøíklad z kanceláøského balíku.
Zobrazí tuto nápovìdu.
Otevøe editor s HTML zdrojem.
Do aktuální pozice vloŸí novou 2x2 tabulku.
Pøidá øádek pøed aktuální.
Pøidá øádek pod aktuální.
Odstraní øádek.
Pøidá sloupec pøed aktuální.
Pøidá sloupec za aktuální.
Odstraní aktuální sloupec.
Pøidá nový vodorovný oddìlovaè.
Odstraní z výbìru formátování.
Vytvoøí z vybraného textu dolní index.
Vytvoøí z vybraného textu horní index.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png b/includes/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9ea983036b347646ccda7ac3f26723c4a3cf43 GIT binary patch literal 4799 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png b/includes/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png new file mode 100644 index 0000000000000000000000000000000000000000..94a0c2e5a4206226b83753c42c7dfe08bcb288a0 GIT binary patch literal 3833 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/cs/index.htm b/includes/tiny_mce/themes/advanced/docs/cs/index.htm new file mode 100644 index 0000000..12eea5b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/index.htm @@ -0,0 +1,26 @@ + + +Nápovìda + + + + + + + + + + +
+
+Kliknutím na odkazy níŸe zvolte poŸadovanou èást nápovìdy. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm new file mode 100644 index 0000000..71f421d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm @@ -0,0 +1,66 @@ + + +Tlaèítko vloŸit obrázek + + + + + + + + + + + + +
+
+Tlaèítko vloŸit obrázek otevøe následující okno.
+
+
+
+Jen vloŸte URL obrázku, který chcete pøidat a zadáte jeho popis, jenŸ bude +zobrazován jako alternativní popisek obrázku.
+
+Popis políèek:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
URL obrázkuURL/cesta k obrázku.
Popis obrázkuAlternativní popis toho, co je na obrázku.
Rozmìry©íøka/vý¹ka obrázku.
ZarovnáníZarovnání obrázku, vhodné pro obtékání obrázku textem.
RámeèekTlou¹»ka rámeèku.
Vertikální okrajVertikální okraj, vhodné pro zalomení textu kolem obrázku.
Horizontální okrajHorizontální okraj, vhodné pro zalomení textu kolem obrázku.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm new file mode 100644 index 0000000..7d62b62 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Tlaèítko vloŸit odkaz + + + + + + + + + + + + +
+
+Toto tlaèítko otevøe nové okno s moŸností vloŸení/úpravy odkazu.
+
+
+
+V tomto oknì jsou dvì políèka. "URL odkazu" je adresa stránky, na +kterou odkazujeme. "Cíl" urèuje, jak má být odkazovaná stránka otevøena.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm new file mode 100644 index 0000000..dc7a96d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm @@ -0,0 +1,68 @@ + + +Tlaèítko vloŸit tabulku + + + + + + + + + + + + +
+
+Tlaèítko vloŸit tabulku otevøe následující okno, v nìmŸ mùŸete definovat novou tabulku.
+
+
+
+Popis políèek:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SloupcePoèet sloupcù v tabulce.
ØádkyPoèet øádkù v tabulce.
Vnitøní okraj bunìkVnitøní okraj bunìk tabulky.
Vnìj¹í okraj bunìkVnitøní okraj bunìk tabulky.
ZarovnáníZarovnání tabulky.
RámeèekTlou¹»ka rámeèku tabulky.
©íøka©íøka tabulky v pixelech.
Vý¹kaVý¹ka tabulky v pixelech.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/cs/style.css b/includes/tiny_mce/themes/advanced/docs/cs/style.css new file mode 100644 index 0000000..59c464d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/cs/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: 0; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/da/about.htm b/includes/tiny_mce/themes/advanced/docs/da/about.htm new file mode 100644 index 0000000..6d87515 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/about.htm @@ -0,0 +1,31 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE er et kompakt WYSIWYG editeringsmodul, der kan anvendes i browsere som MS Internet +Explorer eller Mozilla. Modulet gør det muligt for dig at redigere HTML-indhold +på en mere brugervenlig måde. Den er forsynet med de samme funktioner, som man +finder i de fleste tekstbehandlingssystemer og skulle ikke være svær at anvende.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/da/common_buttons.htm new file mode 100644 index 0000000..707c777 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/common_buttons.htm @@ -0,0 +1,162 @@ + + +Common buttons + + + + + + + + + + + +
+
+Herunder finder du en beskrivelse af de enkelte knapper.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bold text iconFed tekst (Ctrl+B).
Italic text iconKursiv (Ctrl+I).
Underline text icon.Understregning (Ctrl+U).
Strikethrough text icon.Gennemstregning.
Align left icon.Juster til venstre.
Align center icon.Centrer.
Align right icon.Juster til højre.
Align full icon.Lige højre margen.
Unordered list/bullet list icon.Uordnet list med bullets.
Ordered list/numbered list icon.Ordnet liste med tal
Outdent/decrease indentation icon.Flyt tekst til venstre.
Indent/increase indentation icon.Flyt tekst til højre.
Undo the last operation.Fortryd sidste valg (Ctrl+Z).
Redo the last operation icon.Gentag sidste valg (Ctrl+Y).
Insert a new link icon.Indsæt nyt link - læs mere om denne funktion i afsnittet Indsættelse + af link.
Unlinks the current selection icon.Fjern aktuelt valgte link(s).
Insert a new anchor icon.Indsæt nyt bogmærke - læs mere om denne funktion i afsnittet om + Bogmærker.
Insert a new image icon.Indsæt nyt billede - læs mere om denne funktion i afsnittet om + Billedbehandling.
Cleanup code icon.Ryd op i koden / fjern uønsket formatering. Denne funktion er brugbar, + når man indsætter tekst f. eks. fra et office-produkt.
Show help icon.Viser dette hjælpevindue.
Source code editor icon.Åbner editoren til redigering af HTML-kode.
Insert table icon.Indsætter en ny tabel, hvor cursoren aktuelt er anbragt.
Adds a row above icon.Tilføjer en række over den aktuelle.
Adds a row under icon.Tilføjer en række under den aktuelle.
Remove row icon.Fjerner en række.
Add column before icon.Tilføjer en kolonne før den aktuelle.
Add column after icon.Tilføjer en kolonne efter den aktuelle.
Remove column icon.Fjerner den aktuelle kolonne.
Insert horizontal ruler icon.Indsætter en vandret streg
Remove formatting icon.Fjerner al formatering fra den aktuelt valgte tekst.
Subscript icon.Sætter det valgte som sænket skrift.
Superscript icon.Sætter det valgte som hævet skrift.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm b/includes/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm new file mode 100644 index 0000000..28cf3fa --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/create_accessible_content.htm @@ -0,0 +1,76 @@ + + +Insert table button + + + + + + + + + + + +
+

TinyMCE kan producere HTML, der vil være tilgængeligt for alle brugere, også +dem med handicaps, som anvender forskellige hjælpeteknikker. Den kan også skabe +indhold, der er tilgængeligt for brugere, som anvender tekstbaserede browsere +eller dem, der browser uden at vise billederne frem på siderne. 

+ +

Ting du selv kan gøre, for at gøre dine tekste tilgængelige:

+
    +
  1. Lav en billedbeskrivelse: Blinde brugere eller andre, som +ikke er i stand til at se billeder, er helt afhængige af billedbeskrivelsen +eller alt-teksten, som erstatter selve billedet. Hvis et billede ingen betydning +har - dvs. hvis det blot fungerer som dekoration eller som et blankt område, så +lad billedbeskrivelsen stå tom.  Så vil TinyMCE indsætte et tomt alt-felt, +der vil tvinge hjælpeprogrammerne til at ignorere billedet.

  2. + +
  3. Tilføj udstrækning til en tabels overskriftsceller: I den +dialog, som gør det muligt at styre en tabels attributter, bør man angive en +overskrifts udstrækning. Det vil fungere sådan, at overskriften automatisk +knyttes til alle værdier i tabellen, hvilket gør det nemmere for blinde brugere +at forstå, hvad indholdet i den enkelte celle betyder. 

  4. + +
  5. Strukturer indholdet med fornuftige overskrifter: Vælg +standardformaterede overskrifter (som f. eks. H1-6) for at lave overskrifter til +dit indhold - går det i stedet for at lave dine egne standarder. Blinde brugere +anvender en læser, der kan genkende disse standardformater og på den måde lave +en indholdsfortegnelse over siden. På den måde kan en blind bruger lettere +bevæge sig rundt på siden og springe fra afsnit til afsnit.
    + 
  6. + +
  7. Husk at lave alternativt indhold: Lav en alternativ side +der repræsenterer ikke-HTML-formateret indhold - så som Flash, Java applets +eller indlejrede videosekvenser. Denne kan laves som et stykke statisk grafik +kombineret med en beskrivelse af billedet og en beskrivelse af det indhold, som  +ville være dukket op, hvis man havde set siden på normal vis. En alternativ +HTML-side kan også laves, hvorefter man så kan lægge et link på til den ved +siden af Falsh-referencen eller referencen til Java appletten. På denne måde +sikrer du, at indholdet også er tilgængeligt for folk, som bruger +hjælpeteknologier, som ikke er i stand til at vise eller afvikle dit indhold +eller som mangler den relevante player eller plugin.

  8. + +
  9. Kontroller tilgængeligheden: Når AChecker plugin'en er +installeret sammen med TinyMCE, kan du blot trykke på den relevante knap for at +blive adviseret om mulige tilgængelighedsproblemer.

  10. + +
+ +

Besøg ACheckers +hjemmeside for at se yderligere informationer om, hvordan man skaber +indhold, som alle brugere kan tilgå.
+

+ +
+ + + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/da/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b5f528dd57cae8e062919a66b0ff7fcf8f3bc42 GIT binary patch literal 5189 zcmV-L6uRq2Nk%w1VM+mu0QUd@H&l@lEO0qilOsNVFindaHh4i^nHDj05GrpUI(!r_ za}OzQrpoXNBx(yKYi5SIC`5!jS(O+wc1dTTm%8JFrP7M5*m|4FS$M8BQjd0*$5mBT z=;+h``|#@O>def{hpE;xP>o@MwWZ1MmAK&!C~YJ_fOC|^AUu7Ow%}WOucF57OlzZ* zw&0}4?rx62QE;bCYowvX>r85*c$vv8NQW{`j8k!_FH4CuP>z71&z->NKwX$paj0pE zye&zHq{#21$L&sRq?EVen7rhKrqiFo>V2NfQE#UjHF%J+-E@`3GEa?lmc|`9dpK2* zrOEF^Vw{Vv*__V48cJ%W#pxN@<~n zsMJnvrBH9C0A|c`lfyqtRHdBxl zFm#Qu+mEu`CPIROqtR4yshGRuX^FcMEpd*p+f{U`Cqjd5kGv^Gg(pLU88mmC!01S3 zpJ<4>VuH3?day-fos6#9fTGZuyya?&y^pcnB|w2?g}6OhmVBMeXNS5IE^=vtn#p8@xFtb?7czBwoy$gJoo$W3h^p6Mf3qq^g%B%mTzjybzvr605p*>rcFHDMBd9Qt+&3AWqElP-Sk;0I( z-5xo6E=q}UlEZhH$d{pUziytuto-k+j}!kHAxMsSGA;4JT}sxZ;L}hHsC- zGc(Nb@$mp=nVFfH004k9Gc%x*O#}o4z`(%&%$Wc)nKNe0UteD{=KnxIK!AXN)X>NP z00960|M2kcA^8LV00000EC2ui07?Oi000R80Qm_VNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGZNIt&!5MSAVZ2ANwTELlPFWFT*BcR3xlMp%jWXM1X0Dva~1XRJ|EJ6fX z)6SqV!^1$9EM216ilWLFAvnuSO_(4J%%B-8Vh9n#Mavi@FnZiDrzz5>J8v9`1BU@a zH5I9dDOzM_%CTTq_=rHIY>gaUu^v4CpmpjNCm*h!;VJa%#fx(5AbrW!t&E-%OQffv2Za)dSExbcS$tRR!gBo$Op1T)Zt(FO>~0JDV!7T_YqD$Q8p$t#yA zp$$269Fjr{Ly(ZpHxy8?2@$Or1Bf8Sl(NGfMi{|H95OUw$O=KY00a~xFreg;Og8D{ zlTbz(B|k>##MCwFWT~Z=PC+FVRaRl86<1z?B^Fs`p`{jEZowrNU3TH67hiq>CKzFc zA*L8(jzK0FWtL&48E2k>CK_p`p{5#ZuE8c7ZMNa28*jb=CmeCcA*UR3&Os*~b=G00 z9e3V=Cmwm`p{E{u?!hM?efHu1ryqa*0Vp7W1|p~+gAPI{A%zxVs3C_Qf+!-1CZeb! zi!Q<_BaJrVs3VU)0x2YsMj|QYw%m3LC6zfLwbV5vy|aN*PenCVRaa%TRaakyHC9rnq8@FUB}yjW_1FV~;-uIb@MXCdt4``k<|(+6;hu)Rq2p zAotuIywkzC4W#=eyJEioTc*5d*1IOYZtfeWzjOwCC&79i+^52THasZAhEANQ#f)bB zD94h1T&c*Imb@v-o~|6K%cRD9D$T0i+^Wv7_B<=lwho=E(Yz-8E7QV0U98l|R=q6N z&Tbv8*VKl6E!oxStrnem=UubTI^ zsV|)V$oX%b0(+FF!F(qCC&Pk1T&TpP@ra@>)+miZs$-J^nWaXSDU)$3WuIc1s9sho znW3s?tHN11J`y`w{j63(!&T9Cg*0C+Em%$?R@9C~HDz6`Sz3cu*QNzFYmF^iW{ciJ zpeK-h`0$56?4kAloF}~@VozL3fk*ec*MV`gqXQp!$2HF70FZ#GU1NfmndX%yd$GkM zg@d2`5@)AG*v}(4@JRmrw6H)qj8G9f6b}T5IgB}KW0CS0r9vhgk2KH`9>IV|N(ZWz zjS6O_npvuB#;O;1L_QvgmCry@I}v(>guPN4u$ne3s2OW&O7Mu)m=zKkO6zOY5*xP4 zM!h0N4~VeT$@GZGkAC!nAhs0Z^{Rx#2EZc}eqaYX@?5R8Ss^Ewx

E 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/da/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdc617eab3be256173af047822671023c41d53c7 GIT binary patch literal 7195 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 AEdT%j literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/da/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..23b38145bf569162ff30de7dfec7bb8a31058700 GIT binary patch literal 10359 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/da/index.htm b/includes/tiny_mce/themes/advanced/docs/da/index.htm new file mode 100644 index 0000000..e010ef7 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/index.htm @@ -0,0 +1,28 @@ + + +Help Index + + + + + + + + + +


+
+Klik på et link herunder for at springe til en hjælpetekst. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm new file mode 100644 index 0000000..cd66eb3 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/insert_anchor_button.htm @@ -0,0 +1,33 @@ + + +Insert anchor button + + + + + + + + + + + +
+
+Denne knap åbner et nyt vindue, som rummer bogmærkefunktionen.
+
+Anchor dialog/window
+
+Der er kun et enkelt felt i dette vindue - i det skriver du navnet på dit +bogmærke. Husk at to bogmærker ikke kan hedde det samme.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/da/insert_image_button.htm new file mode 100644 index 0000000..1c58b3c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/insert_image_button.htm @@ -0,0 +1,67 @@ + + +Insert image button + + + + + + + + + + + +
+
+Knappen "Indsæt billede" åbner et vindue, der ser ud som nedenfor.
+
+Insert image dialog/window
+
+Her indskriver man ganske enkelt adressen på det billede, man vil linke til samt +en billedbeskrivelse. Denne beskrivelse bliver derefter vist som den alternative +tekstbeskrivelse af billedet.
+
+Feltbeskrivelser:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Image URL Adressen på eller stien til billedet.
Image description Alternativ tekstbeskrivelse af billedet.
DimentionsBilledets bredde / højde.
AlignmentBilledets justering - brugbar når der skal sættes tekst på plads omkring + et billede.
BorderRamme bredde.
VSpaceVertikal margen - brugbart når billedet skal placeres i en tekst.
HSpaceHorisontal margen - brugbart når billedet skal placeres i en tekst.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/da/insert_link_button.htm new file mode 100644 index 0000000..a2c3bfc --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Insert link button + + + + + + + + + + + +
+
+Denne knap åbner et nyt vindue, som rummer linkfunktionen.
+
+Insert link dialog/window
+
+Der er to felter i dette vindue. I det første skal man indskrive adressen på +linket - i det andet det "target", som linket skal pege på - dvs. hvordan linket +åbnes, når brugeren trykker på det.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/da/insert_table_button.htm new file mode 100644 index 0000000..0934b70 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/insert_table_button.htm @@ -0,0 +1,72 @@ + + +Insert table button + + + + + + + + + + + +
+
+Trykker man på indsæt tabel knappen åbnes det vindue, som du kan se herunder. I +dette vindue kan du oprette nye tabeller.
+
+
+
+Feltbeskrivelser:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolonnerAntal kolonner i tabellen.
RækkerAntal rækker i tabellen.
CellemarginTabellens cellemargin.
Indvendig marginIndvendig margin i cellerne.
JusteringTabellens justering.
KantKantbredden i tabellen.
BreddeTabellens bredde i pixels.
HøjdeTabellens højde i pixels.
KlasseStyle eller stylesheet klasse for tabellen.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/da/style.css b/includes/tiny_mce/themes/advanced/docs/da/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/da/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/de/about.htm b/includes/tiny_mce/themes/advanced/docs/de/about.htm new file mode 100644 index 0000000..2074efe --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/about.htm @@ -0,0 +1,31 @@ + + +Über TinyMCE + + + + + + + + + + + +
+
+TinyMCE ist ein kompakter WYSIWYG-Editor für Webbrowser wie MSIE oder Mozilla +der es Ihnen ermöglicht HTML-Inhalte auf eine benutzerfreundliche Weise zu +editieren. Es verfügt über die wichtigsten Funktionen die in den meisten +Textverarbeitungen vorkommen und sollte einfach zu benutzen sein.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/de/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/de/common_buttons.htm new file mode 100644 index 0000000..d86831e --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/common_buttons.htm @@ -0,0 +1,107 @@ + + +Allgemeine Schaltflächen + + + + + + + + + + + +
+
+Untenstehend eine kurze Beschreibung jeder Schaltfläche.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fetter Text.
Kursiver Text.
Unterstrichener Text.
Durchgestrichener Text.
Linksbündig.
Zentriert.
Rechtsbündig.
Blocksatz.
Unsortierte Liste / Punktierte Liste.
Sortierte Liste / Nummerierte Liste.
Einzug verkleinern.
Einzug vergrössern.
Letzte Aktion rückgängig machen.
Letzte Aktion wiederholen.
Einen neuen Hyperlink einfügen, lesen Sie mehr über diese Funktion im Kapitel Hyperlink einfügen.
Den gegenwärtige markierten Hyperlink entfernen / Alle gegenwärtig markierten Hyperlinks entfernen.
Ein neues Bild einfügen, lesen Sie mehr über diese Funktion im Kapitel Bild einfügen.
unsauberen Code aufräumen / Entfernt ungewollte Formatierungen. Diese Funktion ist nützlich, + wenn Sie beispielsweise Inhalte aus einem Office Produkt kopieren.
Zeigt diese Hilfe an.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..751de28166262c14abe87713103afce2e741864b GIT binary patch literal 4822 zcmV;{5-IIRNk%w1VO{~I0OkMy0002t;_IlXy8r-yGc#sp|Nk>HGtbi9nVFe!Z)DJ0 zV1|Z+cQ_5N4T~0L=gA=hmE_zN$P`@~f6^ZI7loM8m|^>YI$h#L*=sHvjwZ zw6@3Ow-Qn=@_3`iG##CA}GtBq*_<(=_%g)$F9vZE##^-f%`rNlO zX8)O)W&mc)vbE5_!O`#T?ss>RRaI5h*4<`iX8-^HoTRzTnP!-nr+0UE*dGX3PLHndEV8YjuzDfOVP7%)GwT{=cO4jD*(KMgB@AtX9%;Riq_nnU4Wn^Y%e!RWS-rncbU19Qxf$4mB%T!r~iLmsFefsOSx4XpV z=IyGjxzf?&?X;UyB_QBzY5&ZbYjc$Cmx}6nbG5C-?CR>s$=mtqww08t@PvH#l!T0g zod2JV|Ns900000000000000000000000000000000000000000A^8LW6aaJpEC2ui z0A2y606+)-fH#7IR)vO#h>41ejE#R7r3} z7Nb&6g$F3-HZDRfEes4LEgo!a5fMK$=jRR%8U6eE{7~%6ATZ#-d<6*}TxhT%!GsAJ zW{?O`qC$rh_i4OHkYhxL6+vbUh_EEWjT-?@B-sz*N{$Epi6nWjWKEMeO%iGIq^HlH zKz$N9CkBhr8wiXlRf=?}m~$3*@BmSzYKl`Ss%qt7A>V;QAx?=MOSY`pvuM+P>c>{C z+qZE4C>oFt6t5zwd>cgW6PdRySDAytw(U?Y=yID+`xkiA5Ofu@#Dym z>+Zd|^XKHyqf4Joy}I?<%X#~L-WmV^(B4CbmodKl_tECTpHENze0%lq-^*t|Uc7ty z>)qQ|@BKUe`0UM>UwqdUXdrgGHTTTxBSfP$oR%zvxv)$<2YyF9~9%*0JR-$TQLdW8aXr`&=nrPPOnwB48nOv8w zoyq2%c;>06SZ?MPC600iD(IkB!Z~GXcDCppo_!MPC~1kl1%OzS(p9O9jjm>>Ymwf0 zXDvKeY>n~JLHs;oknYOAouDywX-&T8wexP~_24Ie0RLkB%PamBF27HjOW z$R?}ovdlK??6c5DEA6z@R%`9G*k-FOvrqKU!3|1$z}XWVNMWuN13X|v2_+Qpf(RRk zz{U@$oGZmZGMPKjz5LkAZwCGb{I9_J@*@+#`x30Mzy>G0@WTZI{P4c}Kx}dUz!gWV z@x>h5i|8NXPv&}~k5w#cx#EujKwAXHX?6Hd>vjt1^o`oP; z1TXyWHw53i1ya{ghzUB(;QaH@M=$;K)K_o)_1I^x{r22<@BR1ShcEvB_~e)Wy$&W& znCtrN!&+79^r~#n-ZbiS;)aO3}0uzc7$Up`nkURjo zPl+Blpawc{fdM*T1P3Um0&?(!AY_mSLkJsEmFk2jOd(uOg_;rSk4_MbVS5BP!v&tG zKm45Xs<(i#sG$2!{aNM_W|mRb|W8{kk7mAX_Q z2O&s664H=}ETmbSILGAl5s`j`KmrTC z;D&nI^PVg~!W=B{1|M+X05K>8xmIV24Q${AFEHo^XkdVbuI`}_ji^K?O3{j1^r9He zs75!+(T;lbqZcjNQbtNrqqMAMFbji9ZO2mDsZ^z6sF?*;K+_cnA_ZH>X-=8-iT5cOjN@fuY3_Ef3jD{fc+wd%oEVpXVewW>1l8dnWA zR<`U-aAA!cRsBV z%#h-^s4-S*V(3RyKwyT-R`wK@tt<$Z#ugM5q6VM^Z3$}N9S@k6saCs3XlpPK(6;uq z{9tWtTN~QFW7zQi`(AT^{u|0EpK&eTiy27wZeS~QG>f%;2L+eHDJqXqe|W8 z(zdq4<%bdmq68(ZWV_nsE_cD3f$o}@yys1?deuvW3mE1G8i=oaHK3RyT%cr15QBM< zvR+>y;Jo@(f(3-fgQML*Dm);XRDx##^D55@A#le34roB(3R{@M&d9KaH_YJ$m9ub~@4pn)DSfSZNX=FoPAu4-PkI=?ku!)b}&bt5H4c3WEAL zkFF984fyF>6EWAm4)*;1v`1kZTUNj>;v<9q$!sw)k~E^$PYz{>#VW#(+B#Zxv$x$u zR00Y_Q|w|C!|kOjX`9>VKH;-RlWZcMJKgYRl(&n0?0T=N-S*D+gYd2IejAA2A$)hd z2cD*NbBNe+!rvDqC~Ilw4~AWOH3aj6L5QbF;x()`qzKOO6dGJt2tO3BH7LVcKYV{D z_s_+>v_BHDygXQx_@@Ql@tWV|yLa6YlS#Q%UDWPr7nK&Z%bO z+}|_@=F|V&$4#2W>S}s=zqLInMScS7ZUOtvhc5EdRQ(i{O#2}<3CXozk}O)+_p%j9 z_qBW7?QDO0Cebo=rt{J1N>@$Pf7$o{Gk!bph_?{Z6VG_tEWYuOkImyFPkGi%zVet4 zBC&1G`ObSjF3cH3AwKYi8k_#~s87A>SI_#^yZ-gCkG2{`R=f{Tn{88PUJN zS0ZRY0QyV(;v4_?$WOlVm(Tp>JOBC6kG}M$PyOl}KL8C70l0|C87PEd3|CM=?#EC5 z@|*ws=uf};WgJc-xc~j|kAFF5j7~Aw|Ni*TKRaja1Pl28{{R?({^tZLa0O!!22fB4 zF%Sc+umeNl3lJEA5;%brSb-LJfw=HjCw5rK5CA8(PSM~6Nst8EP=eYpf?f~~DsTY- zWd#FuGXhRs0DDa1!@3PHRCidXfp$#R2$F&@Io&Wb~AEgGy708Yq&aXNKtPX zQ5wMkZ5W3iwT5=+QF#bad#HmB;D&1WhdvmHf+&ZD$Wi#kd_;g!FGVvFg#a(LgdAW2 zK{GTrl{5yHG(*6J93WH+xPSxT0!@%m8&Coe@GeYs51$wVQw3K8v5Kt753o3kv^a~e zSc|xri?Eng8BmMTG7!#UR{XFn#nOtz(hts}i@Df}wkV6rSc@gIGSZkbEwg}PAT>x) z76`C4Vz7V~Pz7c%1>!jW1w=Cl<0y_*U;&@#Sys>k7x0cdkOM)0R0ahvY#;(xV-Ga& zj_)Wp!YEgflL7pA0a?|LkzxL4uFsesa*TukTNll4w;Yvxe^qqksHa2 z966B}X^|qyj~d~SbcIzFNs%b2k<`_Z54n-bWsw6hk~ArjL~sCYkdr#OlRTM|2hd&@ zpgTvA6eZOZN+AaC7!}}{Sq7E@nPmo5VFCQu1Lc4_Cr|R&+_0WwV!GX_gKUm{Bzm zDPlqm~2UxdYP7s8JLt=nLpVEHA$1?lsh5NnMl!@pb46v37W8T08zmM zT47*SKr~yy6<_&TBUJ*X059^Ak4?1{17Q@oxtsie1-zL7xY?Wgpqs*3oWPlzzG<9$ zm7K@v0L0mx%JrPg$(zhsoycjOD4Cqn`J38_oxoXABSl@=SzXcDEU=(5yT1Ww1{)qsqRTNmjJ4=uSWiSZCLp(Q72F7Cn zO7UPJPz*cp0~UIr7*(mJiwTCLW4t=O8a+PbaW+O6LD zt>7B}uHrhbDsQsae3~FuJ9VKm^ZKVN_qBruaK9o`pS6x+OLTB zuK=rb0z0rqSFi@_Z_##gr6wO_@@WreBK>1)x3Oyq)UXL#8lpxZv_?ZRM{y13AGWqd zE@x^NYqIu{a#s`{BwMoYL9!ovZS=aZn#O7ZbZV(KYB+1N4##plo3i$^vkfG)_qwq^ zYe5Z5v_gBcBRfGkd$K|MwCK^aP}^&jN3%N1a2^YBQme9BtF^Hp$gj={z@+RlXXoE-p zs*F1bg{MbES3h9FK8xG9jQhBr1a4!pxs$tcUsNTPYq_I}xv2!VBqwg=c5&Cnxfv3= zqWgKIdw2>*ZY9^bT%>W>79pl)LB zzW=kn(&4`En{M%Ix)`)@o?AuZR=e}zx&3>)0-U=$lD`Uk1N+Mw1uSj_TpIin!Srju z6pXtGyuk0!%L*YrcrhM(ROI}b$SOQahGrB_9<2;c4^_npc1}+cXdVVM?-AIi{f>E z1W1d*#a+xvH>?(2M@UzU#f20|UyQ|O{B>Wv#c2V=rEzvfoOfEBNmjIXaEGpQx5agr zNMwA)Ol)_2jCWw{C+k|gL3|d2Ovh~8#$~+7M|=uNY;TXWNnQ8IkKD+Dl*Mib$x!UL zQd}o_QpR>M$@S*LN(9Fn7s7h%d8$0aSDU!7?5;9A%SBYnwmd|*oXa7!%e?$SzWmFE zCdYRuJk8Wx&DMO)*qqJUyv^L)&EEVo&EOo);ylje wT+ZG6Cj!t3>b%bE+|KU&&hQ-1@;uLmAOO5U&-k3r`n=El+|T~Z34s6rJJoPzqW}N^ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif b/includes/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..14871d7d2f27d6a667ed61aa19c503df6ce3201a GIT binary patch literal 5135 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/de/index.htm b/includes/tiny_mce/themes/advanced/docs/de/index.htm new file mode 100644 index 0000000..cb84977 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/index.htm @@ -0,0 +1,24 @@ + + +Inhaltsverzeichnis der Hilfe + + + + + + + + + +
+
+Klicken Sie auf die untenstehenden Links um die verschiedenen Bereiche der Hilfe zu betrachten. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/de/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/de/insert_image_button.htm new file mode 100644 index 0000000..4707d9c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/insert_image_button.htm @@ -0,0 +1,33 @@ + + +Schaltfläche Bild einfügen + + + + + + + + + + + +
+
+Die Schaltfläche "Bild einfügen" öffnet das unten gezeigte Fenster.
+
+
+
+Sie geben einfach die URL zu dem Bild ein, das Sie verknüpfen möchten und eine +Beschreibung des Bildes, welche dann als alternative Textbeschreibung verwendet wird. +
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/de/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/de/insert_link_button.htm new file mode 100644 index 0000000..d705865 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Schaltfläche Hyperlink einfügen + + + + + + + + + + + +
+
+Diese Schaltfläche öffnet das Fenster für die "Hyperlink einfügen / bearbeiten"-Funktion.
+
+
+
+Zwei Felder sind in diesem Fenster auszufüllen. Das Erste, "Hyperlink URL", ist für +die URL der Verknüpfung. Das "Ziel" erlaubt Ihnen auszuwählen wie die Verknüpfung +geöffnet werden soll. +
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/de/style.css b/includes/tiny_mce/themes/advanced/docs/de/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/de/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/en/about.htm b/includes/tiny_mce/themes/advanced/docs/en/about.htm new file mode 100644 index 0000000..b3e4342 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/about.htm @@ -0,0 +1,31 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla +that enables you to edit HTML contents in a more user friendly way. It has common +features that are found in most word processors and should not be difficult to +use.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/en/common_buttons.htm new file mode 100644 index 0000000..73ca8b5 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/common_buttons.htm @@ -0,0 +1,162 @@ + + +Common buttons + + + + + + + + + + + +
+
+Below is a short description about each button. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bold text iconBold text style (Ctrl+B).
Italic text iconItalic text style (Ctrl+I).
Underline text icon.Underline text style (Ctrl+U).
Strikethrough text icon.Strikethrough text style.
Align left icon.Align left.
Align center icon.Align center.
Align right icon.Align right.
Align full icon.Align full.
Unordered list/bullet list icon.Unordered list/bullet list.
Ordered list/numbered list icon.Ordered list/numbered list
Outdent/decrease indentation icon.Outdent/decrease indentation.
Indent/increase indentation icon.Indent/increase indentation.
Undo the last operation.Undo the last operation (Ctrl+Z).
Redo the last operation icon.Redo the last operation (Ctrl+Y).
Insert a new link icon.Insert a new link, read more about this function in the Insert + link section.
Unlinks the current selection icon.Unlinks the current selection/removes all selected links.
Insert a new anchor icon.Insert a new anchor, read more about this function in the Insert anchor section.
Insert a new image icon.Insert a new image, read more about this function in the Insert + image section.
Cleanup code icon.Cleanup code/Removes unwanted formating. This function is useful when + you copy contents from for example a office product.
Show help icon.Shows this help window.
Source code editor icon.Opens HTML source code editor.
Insert table icon.Inserts a new table at the current location.
Adds a row above icon.Adds a row above the current one.
Adds a row under icon.Adds a row under the current one.
Remove row icon.Removes the row.
Add column before icon.Adds a column before the current one.
Add column after icon.Adds a column after the current one.
Remove column icon.Removes the current column.
Insert horizontal ruler icon.Inserts a new horizontal ruler
Remove formatting icon.Removes formatting from the selection.
Subscript icon.Makes the selection to be subscript.
Superscript icon.Makes the selection to be superscripted.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm b/includes/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm new file mode 100644 index 0000000..eacfbe2 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm @@ -0,0 +1,45 @@ + + +Insert table button + + + + + + + + + + + +
+

TinyMCE can create HTML content that will be accessible to all users, including those with disabilities using assistive technologies, as well as those using text-based browsers, or those browsing the Web with images turned off.

+ +

Things you can do to make your content accessible:

+
    +
  1. Include an Image Description: Blind users, or others who are unable to view images, will rely on the Image Description (or Alt text) to take the place of the image. If an image contains no meaning, such as a decoration or a spacer image, leave the Image Description empty. TinyMCE will then insert an empty Alt text attribute that will force assistive technologies to ignore the image.

  2. + +
  3. Add Scope to data table header cells: In the table cell editor dialog window, choose a Scope when creating Header cells so the column or row label in that cell becomes explicitely associated with its data cells. Table cell headers will then be announced with each data cell, making it easier for blind users using a screen reader to understand what the content of each cell represents.

  4. + +
  5. Structure content with properly nested headings: In the format selection menu choose Heading 1 to Heading 6 to represent headings in your content, rather than using other font formating options. Blind users using a screen reader can then extract the headings from the page to generate a summary of the content it contains, and use those headings to navigate quickly to subsections within the page.

  6. + +
  7. Include alternate content: Create an alternate page for non-HTML content such as Flash, Java applets, or embedded movies. This might be a static image, with a description of the image, and a description of the content that would have appeared in its place. An alternate HTML page could also be created, and a link to it included next to the non-HTML object. This will ensure that the content will be accessible to users of assistive technologies that can not view or play the content, and ensure the content will be available to those who do not have the appropriate plugin or helper application installed.

  8. + +
  9. Check accessbility: When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.

  10. + +
+ +

See the AChecker Web Site for further details about creating content that will be accessible to all users.
+

+ +
+ + + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b5f528dd57cae8e062919a66b0ff7fcf8f3bc42 GIT binary patch literal 5189 zcmV-L6uRq2Nk%w1VM+mu0QUd@H&l@lEO0qilOsNVFindaHh4i^nHDj05GrpUI(!r_ za}OzQrpoXNBx(yKYi5SIC`5!jS(O+wc1dTTm%8JFrP7M5*m|4FS$M8BQjd0*$5mBT z=;+h``|#@O>def{hpE;xP>o@MwWZ1MmAK&!C~YJ_fOC|^AUu7Ow%}WOucF57OlzZ* zw&0}4?rx62QE;bCYowvX>r85*c$vv8NQW{`j8k!_FH4CuP>z71&z->NKwX$paj0pE zye&zHq{#21$L&sRq?EVen7rhKrqiFo>V2NfQE#UjHF%J+-E@`3GEa?lmc|`9dpK2* zrOEF^Vw{Vv*__V48cJ%W#pxN@<~n zsMJnvrBH9C0A|c`lfyqtRHdBxl zFm#Qu+mEu`CPIROqtR4yshGRuX^FcMEpd*p+f{U`Cqjd5kGv^Gg(pLU88mmC!01S3 zpJ<4>VuH3?day-fos6#9fTGZuyya?&y^pcnB|w2?g}6OhmVBMeXNS5IE^=vtn#p8@xFtb?7czBwoy$gJoo$W3h^p6Mf3qq^g%B%mTzjybzvr605p*>rcFHDMBd9Qt+&3AWqElP-Sk;0I( z-5xo6E=q}UlEZhH$d{pUziytuto-k+j}!kHAxMsSGA;4JT}sxZ;L}hHsC- zGc(Nb@$mp=nVFfH004k9Gc%x*O#}o4z`(%&%$Wc)nKNe0UteD{=KnxIK!AXN)X>NP z00960|M2kcA^8LV00000EC2ui07?Oi000R80Qm_VNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGZNIt&!5MSAVZ2ANwTELlPFWFT*BcR3xlMp%jWXM1X0Dva~1XRJ|EJ6fX z)6SqV!^1$9EM216ilWLFAvnuSO_(4J%%B-8Vh9n#Mavi@FnZiDrzz5>J8v9`1BU@a zH5I9dDOzM_%CTTq_=rHIY>gaUu^v4CpmpjNCm*h!;VJa%#fx(5AbrW!t&E-%OQffv2Za)dSExbcS$tRR!gBo$Op1T)Zt(FO>~0JDV!7T_YqD$Q8p$t#yA zp$$269Fjr{Ly(ZpHxy8?2@$Or1Bf8Sl(NGfMi{|H95OUw$O=KY00a~xFreg;Og8D{ zlTbz(B|k>##MCwFWT~Z=PC+FVRaRl86<1z?B^Fs`p`{jEZowrNU3TH67hiq>CKzFc zA*L8(jzK0FWtL&48E2k>CK_p`p{5#ZuE8c7ZMNa28*jb=CmeCcA*UR3&Os*~b=G00 z9e3V=Cmwm`p{E{u?!hM?efHu1ryqa*0Vp7W1|p~+gAPI{A%zxVs3C_Qf+!-1CZeb! zi!Q<_BaJrVs3VU)0x2YsMj|QYw%m3LC6zfLwbV5vy|aN*PenCVRaa%TRaakyHC9rnq8@FUB}yjW_1FV~;-uIb@MXCdt4``k<|(+6;hu)Rq2p zAotuIywkzC4W#=eyJEioTc*5d*1IOYZtfeWzjOwCC&79i+^52THasZAhEANQ#f)bB zD94h1T&c*Imb@v-o~|6K%cRD9D$T0i+^Wv7_B<=lwho=E(Yz-8E7QV0U98l|R=q6N z&Tbv8*VKl6E!oxStrnem=UubTI^ zsV|)V$oX%b0(+FF!F(qCC&Pk1T&TpP@ra@>)+miZs$-J^nWaXSDU)$3WuIc1s9sho znW3s?tHN11J`y`w{j63(!&T9Cg*0C+Em%$?R@9C~HDz6`Sz3cu*QNzFYmF^iW{ciJ zpeK-h`0$56?4kAloF}~@VozL3fk*ec*MV`gqXQp!$2HF70FZ#GU1NfmndX%yd$GkM zg@d2`5@)AG*v}(4@JRmrw6H)qj8G9f6b}T5IgB}KW0CS0r9vhgk2KH`9>IV|N(ZWz zjS6O_npvuB#;O;1L_QvgmCry@I}v(>guPN4u$ne3s2OW&O7Mu)m=zKkO6zOY5*xP4 zM!h0N4~VeT$@GZGkAC!nAhs0Z^{Rx#2EZc}eqaYX@?5R8Ss^Ewx

E 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdc617eab3be256173af047822671023c41d53c7 GIT binary patch literal 7195 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 AEdT%j literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..6a032c5ae8dfcf3fad7ed65c814c2b1a1e88d25d GIT binary patch literal 7094 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/en/index.htm b/includes/tiny_mce/themes/advanced/docs/en/index.htm new file mode 100644 index 0000000..478011d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/index.htm @@ -0,0 +1,27 @@ + + +Help Index + + + + + + + + + +


+
+Click the links below to go to the different help sections. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm new file mode 100644 index 0000000..ee1c23a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm @@ -0,0 +1,32 @@ + + +Insert anchor button + + + + + + + + + + + +
+
+This button opens a new window with the insert/edit anchor function.
+
+Anchor dialog/window
+
+There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/en/insert_image_button.htm new file mode 100644 index 0000000..9aa5c33 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/insert_image_button.htm @@ -0,0 +1,65 @@ + + +Insert image button + + + + + + + + + + + +
+
+The insert image button opens the window shown below.
+
+Insert image dialog/window
+
+You simply enter a URL to the image you want to link to and enter a image description, +this is then displayed as an alternative text descripton of the image on the page.
+
+Field descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Image URL URL/path to the image.
Image description Alternative description of image contents.
DimentionsImage width/height.
AlignmentImage alignment, useful when wrapping text around images.
BorderBorder thickness.
VSpaceVertical space, useful when wrapping text around images.
HSpaceHorizontal space, useful when wrapping text around images.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/en/insert_link_button.htm new file mode 100644 index 0000000..2f17d46 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/insert_link_button.htm @@ -0,0 +1,33 @@ + + +Insert link button + + + + + + + + + + + +
+
+This button opens a new window with the insert/edit link function.
+
+Insert link dialog/window
+
+There are two fields in this window the first one "Link URL" is the +URL of the link. The target enables you to select how the link is to be opened.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/en/insert_table_button.htm new file mode 100644 index 0000000..2f1e1eb --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/insert_table_button.htm @@ -0,0 +1,71 @@ + + +Insert table button + + + + + + + + + + + +
+
+The insert table button opens the window shown below. This action enables you to create tables.
+
+Image of table window
+
+Field descriptions:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColumnsNumber of columns in the table.
RowsNumber of rows in the new table.
CellpaddingCellpadding of the table .
CellspacingCellspacing of the table .
AlignmentTable alignment .
BorderBorder thinkness of table.
WidthWidth in pixels of table .
HeightHeight in pixels of table.
ClassStyle or CSS class of table.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/en/style.css b/includes/tiny_mce/themes/advanced/docs/en/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/en/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/es/about.htm b/includes/tiny_mce/themes/advanced/docs/es/about.htm new file mode 100644 index 0000000..ebbb77b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/about.htm @@ -0,0 +1,28 @@ + + +Acerca de TinyMCE + + + + + + + + + + + +
+
+TinyMCE es un editor WYSIWYG para navegadores como MSIE o Mozilla que te permite editar el contenido HTML de una manera más amigable. Tiene la mayoría de las opciones de un procesador de texto y no debería ser dificil de usar.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/es/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/es/common_buttons.htm new file mode 100644 index 0000000..ade7897 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/common_buttons.htm @@ -0,0 +1,155 @@ + + +Botones de uso común + + + + + + + + + + + +
+
+Pequeña descripción de cada botoón. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Texto en negrita.
Texto en cursiva.
Texto subrayado.
Texto tachado.
Alinear a la izquierda.
Alinear al centro.
Alinear a la derecha.
Alinear justificado.
Lista desordenada/lista por puntos.
Lista ordenada/lista numerada
Disminuir la sangría.
Aumentar la sangría.
Deshacer la última operación.
Rehacer la última operación.
Insertar un enlace, más información en insertar enlace.
Quita el enlace al texto seleccionado.
Insertar un imagen, más información en insertar imagen.
Limpiar código, esta función es útil cuando copias el código de otra página.
Muestra esta ventana de ayuda.
Abre el editor de HTML.
Inserta una nueva tabla de 2x2.
Añade una fila encima.
Añade una fila debajo.
Elimina una fila.
Añade una columna antes de la actual .
Añade una columna después de la actual.
Elimina la columna actual.
Inserta un separador horizontal
Elimina el formato de la selección.
Subíndice.
Superíndice.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..cdc617eab3be256173af047822671023c41d53c7 GIT binary patch literal 7195 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 AEdT%j literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e8497f75e25c308ea813ea7a24d2ce0461d579f GIT binary patch literal 6747 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 + +Índice de la ayuda + + + + + + + + + +
+
+Selecciona una sección para ver la ayuda. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/es/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/es/insert_image_button.htm new file mode 100644 index 0000000..1d66e70 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/insert_image_button.htm @@ -0,0 +1,64 @@ + + +Insertar imagen + + + + + + + + + + + +
+
+El botón insertar imagen abre la siguiente ventana.
+
+
+
+Tu sólo tienes que escribir la URL de la imagen que quieres que aparezca y escribir una descripción de esta, esta descripción aparecera como un texto alternativo que describa la imagen.
+
+Descripción de los campos:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Image URL URL de la imagen.
Image description Descripción alternativa del contenido de la imagen.
DimentionsAltura/anchura de la imagen.
AlignmentAlineamiento, útil cuando colocas texto alrededor de la imagen.
BorderAnchura del borde.
VSpaceEspacio vertical, útil cuando colocas texto alrededor de la imagen.
HSpaceEspacio horizontal, útil cuando colocas texto alrededor de la imagen.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/es/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/es/insert_link_button.htm new file mode 100644 index 0000000..d34b39d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/insert_link_button.htm @@ -0,0 +1,32 @@ + + +Insertar enlaces + + + + + + + + + + + +
+
+Este botón abre una nueva ventana con la función insertar/editar enlace.
+
+
+
+Hay dos campos en esta ventana, el primero "Link URL" es donde hay que escribir la dirección del enlace. El segundo "Target" indica cómo se abrirá el enlace.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/es/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/es/insert_table_button.htm new file mode 100644 index 0000000..3f9998b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/insert_table_button.htm @@ -0,0 +1,67 @@ + + +Insertar tabla + + + + + + + + + + + +
+
+El botón insertar tabla abre la siguiente ventana. Esta acci&ocaute;n te permite crear tablas.
+
+
+
+Descripción de los campos:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColumnsNúmero de columnas.
RowsNAúmero de filas.
CellpaddingDesplazamiento entre celdas .
CellspacingEspacio entre celdas .
AlignmentAlineamiento de la tabla.
BorderAnchura del borde de la tabla.
WidthAnchura de la tabla en pixels .
HeightAltura de la tabla en pixels.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/es/style.css b/includes/tiny_mce/themes/advanced/docs/es/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/es/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/about.htm b/includes/tiny_mce/themes/advanced/docs/fi/about.htm new file mode 100644 index 0000000..5ddee2b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/about.htm @@ -0,0 +1,28 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE on pieni WYSIWYG sisällönmuokkausohjain webbiselaimille kuten MSIE tai Mozilla joka mahdollistaa HTML sisällön muokkauksen käyttäjäystävällisellä tavalla. Se tarjoaa yleiset tekstinkäsittelyohjelmien tarjoamat toiminnot eikä ole vaikea käyttää.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/fi/common_buttons.htm new file mode 100644 index 0000000..4a93ad2 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/common_buttons.htm @@ -0,0 +1,156 @@ + + +Common buttons + + + + + + + + + + + +
+
+Alla on lyhyt selostus kaikista toimintonapeista. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Lihavointi.
Kursivointi.
Alleviivaus.
Yliviivaus.
vasen tasaus.
Keskitys.
Oikea tasaus.
Pakotettu tasaus.
Järjestämätön lista.
Järjestetty lista/numeroitu lista
Poista / vähennä sisennystä.
Sisennä.
Peruuta viimeinen muutos.
Tee uudelleen viimeinen peruutettu muutos.
Lisää linkki. Lisätietoa tästä toiminnosta lisää linkki -osiosta.
Poista linkki valitusta tekstistä.
Lisää kuva. Lue lisää tästä toiminnosta lisää kuva -osiosta.
Siisti koodi. Tämä toiminto on käytännöllinen kun liität tekstiä toimistosovelluksista.
Näyttäää tämän apuikkunan.
Avaa HTML lähdekoodieditorin.
Lisää tualu. Lue lisää tästä toiminnosta lisää taulu -osiosta.
Lisää rivi valitun rivin edelle.
Lisää rivi valitun rivin jälkeen.
Poista valittu rivi.
Lisää saraka valitun sarakkeen jälkeen.
Lisää sarake valitun sarakkeen edelle.
Poistaa valitun sarakkeen.
Lisää vaakaviiva.
Poista muotoilu valitusta tekstistä.
Tekee valitusta tekstistä alamääreistä.
Tekee valitusta tekstistä ylämääreistä.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..29dc616254731f3819dfe58cfe2210feb75202cd GIT binary patch literal 8825 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 vzXRl$M(rSLOHk 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 R-}uJ#ra5itNZTVI06Uk)tIPlZ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..b24364695f6bd0eb18c5687796c953dfbf5a54f1 GIT binary patch literal 8442 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 + +Apua sisällysluettelo + + + + + + + + + +
+
+Napsauta alla olevista linkeistä mennäksesi eri osa-alueisiin. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm new file mode 100644 index 0000000..7a119c4 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm @@ -0,0 +1,65 @@ + + +Insert image button + + + + + + + + + + + +
+
+Lisää linkki -nappi avaa alla näkyvän ikkunan.
+
+
+
+Kirjoita haluamasi kuvan URL osoite ja lisää kuvalle selite. Selite näytetään vaihtoehtoisena selitteenä sivulla. +
+
+Kenttien selitykset:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kuvan URLKuvan URL tai polku.
Kuvan seliteVaihtoehtoinen selite kuvan sisällöstä.
UlottuvuudetKuvan leveys ja korkeus.
AsetteluKuvan asettelu, käytännöllinen kun halutaan tekstin rivittyvän kuvan ympärille.
ReunaKuvaa ympäröivän reunan leveys.
PystyväliPystyväli, käytännöllinen kun halutaan tekstin rivittyvän kuvan ympärille.
VaakaväliVaakaväli, useful when wrapping text around images.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm new file mode 100644 index 0000000..3605517 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm @@ -0,0 +1,35 @@ + + +Insert link button + + + + + + + + + + + +
+
+Tämä nappi avaa uuden ikkunan jossa on linkin lisäys- ja muokkaustoiminnallisuus.
+
+
+
+ +Tässä ikkunassa on kaksi kenttää. Ensimmäinen kenttä, "Linkin URL", on linkin osoittama URL -osoite. +Toinen kenttä, "kohde", vaikuttaa siihen miten linkki avataan. +The target enables you to select how the link is to be opened.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm new file mode 100644 index 0000000..b43df36 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm @@ -0,0 +1,67 @@ + + +Insert table button + + + + + + + + + + + +
+
+Lisää taulu -nappi avaa alla näkyvän ikkunan. Tämä toimonto mahdollistaa taulujen luonnin.
+
+
+
+Kenttien selitteet:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SarakkeetTaulussa olevien saraakkeiden määrä.
RivitTaulussa olevien rivien määrä.
Solun reunan ja sisällön väliTaulun sisällä olevan solun reunan ja sisällön väli.
Solujen väliTaulun sisällä olevien solujen väli.
AsetteluTaulun asettelu.
ReunaReunan leveys.
LeveysTaulun leveys pikseleinä.
KorkeusTaulun korkeus pikseleinä.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fi/style.css b/includes/tiny_mce/themes/advanced/docs/fi/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fi/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/about.htm b/includes/tiny_mce/themes/advanced/docs/fr/about.htm new file mode 100644 index 0000000..ea3b69d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/about.htm @@ -0,0 +1,32 @@ + + +À propos de TinyMCE + + + + + + + + + + + +
+
+TinyMCE est un petit éditeur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui +vous permet de manipuler du contenu HTML d'une façon plus intuitive. +Il est simple d'utilisation et possède les fonctionalités ls plus répendues que l'on peut retrouver dans +les traitements de texte. +
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/fr/common_buttons.htm new file mode 100644 index 0000000..cd8c1f1 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/common_buttons.htm @@ -0,0 +1,160 @@ + + +Outils communs + + + + + + + + + + + +
+
+Ci-dessous une courte description de chacuns des outils. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Met le texte sélectionné en gras.
Met le texte sélectionné en italique.
Souligne le texte sélectionné.
Barre le texte sélectionné.
Alignement à gauche.
Alignement au centré.
Alignement à droite.
Texte justifié.
Liste à puces.
Liste numérotée
Réduit l'indentation.
Augmente l'indentation.
Annule la dernière opération.
Refait la dernière opération annulée.
Insère ou modifie un hyperlien. Allez à la page + Outil d'ajout d'hyperliens pour plus de détails.
Efface les hyperliens qui sont sélectionées.
Insère ou modifie une image. Allez à la page + Outil d'ajout d'images pour plus de détails.
Nettoie le code et retire les paramètres non désirés. Cet outil + est très utile lorsque vous copiez du contenu provenant de logiciels + de bureatique.
Affiche cette page d'aide.
Ouvre un éditeur permettant de modifier le code HTML.
Insère un nouveau tableau à la position actuelle. Allez à la page + Outil d'ajout de tableau pour plus de détails.
Ajoute une ligne au tableau avant la ligne courante.
Ajoute une ligne au tableau après la ligne courante.
Supprime la ligne courante.
Ajoute une colonne au tableau avant la colonne courante.
Ajoute une colonne au tableau après la colonne courante.
Supprime la colonne courante.
Insère un séparateur horizontal.
Supprime les formattages du texte sélectionné.
Transforme le texte sélectionné en texte souscrit.
Transforme le texte sélectionné en indice supérieur.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..4ee31bdf0d569b8e958d939683be68f6b97837e5 GIT binary patch literal 38920 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a265223cc3ff0faee302da526b1573979013a72 GIT binary patch literal 32353 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 SXPqt-n + +Table des matières de l'aide + + + + + + + + + +
+
+Faites votre sélection parmis les thèmes suivants: + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm new file mode 100644 index 0000000..95324db --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm @@ -0,0 +1,66 @@ + + +Outil d'ajout d'images + + + + + + + + + + + +
+
+L'outil d'ajout d'images ouvre la fenêtre ci-dessous.
+
+
+
+Vous entrez tout simplement l'adresse de l'image que vous désirez ajouter et +entrez une description facultative. La description sera affichée en texte alternatif +sur l'image lorsqu'elle sera publiée.
+
+Description des champs:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adresse de l'image Adresse URL de l'image à insérer.
Description de l'image Description alternative de l'image.
DimensionsLargeur et Hauteur de l'image en pixel.
AlignementAlignement de l'image. Très utile pour faire contourner le texte autour des images.
BordureÉpaisseur en pixel de la bordure.
VSpaceEspacement vertical. Très utile pour faire contourner le texte autour des images.
HSpaceEspacement horizontal. Très utile pour faire contourner le texte autour des images.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm new file mode 100644 index 0000000..723216d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Outil d'ajout d'hyperliens + + + + + + + + + + + +
+
+L'outil d'ajout d'hyperlien ouvre la fenêtre ci-dessous.
+
+
+
+Il y a deux champs dans cette fenêtre. L'Adresse URL est l'adresse +de l'hyperlien. La destination vous permet de choisir de quelle façon +l'hyperlien sera ouvert.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm new file mode 100644 index 0000000..59e554b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm @@ -0,0 +1,71 @@ + + +Outil d'ajout de tableau + + + + + + + + + + + +
+
+L'outil d'ajout de tableau ouvre la fenêtre ci-dessous. Elle vous permet de créer dfes talbeaux.
+
+
+
+Description des champs:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColonnesNombre de colonnes du tableau.
LignesNombre de lignes du tableau.
CellpaddingMarge à l'intérieur des cellules du tableau.
CellspacingEspacement entre les cellules du tableau.
AlignementAlignement du tableau.
BordureÉpaisseur des bordures du tableau.
LargeurLargeur en pixel du tableau.
HauteurHauteur en pixel du tableau.
Classe CSSNom de la classe CSS pour appliquer un style.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr/style.css b/includes/tiny_mce/themes/advanced/docs/fr/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/about.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/about.htm new file mode 100644 index 0000000..ea3b69d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/about.htm @@ -0,0 +1,32 @@ + + +À propos de TinyMCE + + + + + + + + + + + +
+
+TinyMCE est un petit éditeur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui +vous permet de manipuler du contenu HTML d'une façon plus intuitive. +Il est simple d'utilisation et possède les fonctionalités ls plus répendues que l'on peut retrouver dans +les traitements de texte. +
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm new file mode 100644 index 0000000..cd8c1f1 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm @@ -0,0 +1,160 @@ + + +Outils communs + + + + + + + + + + + +
+
+Ci-dessous une courte description de chacuns des outils. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Met le texte sélectionné en gras.
Met le texte sélectionné en italique.
Souligne le texte sélectionné.
Barre le texte sélectionné.
Alignement à gauche.
Alignement au centré.
Alignement à droite.
Texte justifié.
Liste à puces.
Liste numérotée
Réduit l'indentation.
Augmente l'indentation.
Annule la dernière opération.
Refait la dernière opération annulée.
Insère ou modifie un hyperlien. Allez à la page + Outil d'ajout d'hyperliens pour plus de détails.
Efface les hyperliens qui sont sélectionées.
Insère ou modifie une image. Allez à la page + Outil d'ajout d'images pour plus de détails.
Nettoie le code et retire les paramètres non désirés. Cet outil + est très utile lorsque vous copiez du contenu provenant de logiciels + de bureatique.
Affiche cette page d'aide.
Ouvre un éditeur permettant de modifier le code HTML.
Insère un nouveau tableau à la position actuelle. Allez à la page + Outil d'ajout de tableau pour plus de détails.
Ajoute une ligne au tableau avant la ligne courante.
Ajoute une ligne au tableau après la ligne courante.
Supprime la ligne courante.
Ajoute une colonne au tableau avant la colonne courante.
Ajoute une colonne au tableau après la colonne courante.
Supprime la colonne courante.
Insère un séparateur horizontal.
Supprime les formattages du texte sélectionné.
Transforme le texte sélectionné en texte souscrit.
Transforme le texte sélectionné en indice supérieur.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..71f417908f20d86f2be4fe7ac03f26a9b6b5f9c8 GIT binary patch literal 12662 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..1a265223cc3ff0faee302da526b1573979013a72 GIT binary patch literal 32353 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 SXPqt-n + +Table des matières de l'aide + + + + + + + + + +
+
+Faites votre sélection parmis les thèmes suivants: + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm new file mode 100644 index 0000000..a9e8e83 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm @@ -0,0 +1,32 @@ + + +Outil d'ajout d'ancres + + + + + + + + + + + +
+
+L'outil d'ajout d'ancres ouvre la fenêtre ci-dessous.
+
+
+
+Il y a un seul champ dans cette fenêtre, c'est le nom de cette ancre. Rappelez-vous, les noms doivent être unique dans la page.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm new file mode 100644 index 0000000..95324db --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm @@ -0,0 +1,66 @@ + + +Outil d'ajout d'images + + + + + + + + + + + +
+
+L'outil d'ajout d'images ouvre la fenêtre ci-dessous.
+
+
+
+Vous entrez tout simplement l'adresse de l'image que vous désirez ajouter et +entrez une description facultative. La description sera affichée en texte alternatif +sur l'image lorsqu'elle sera publiée.
+
+Description des champs:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adresse de l'image Adresse URL de l'image à insérer.
Description de l'image Description alternative de l'image.
DimensionsLargeur et Hauteur de l'image en pixel.
AlignementAlignement de l'image. Très utile pour faire contourner le texte autour des images.
BordureÉpaisseur en pixel de la bordure.
VSpaceEspacement vertical. Très utile pour faire contourner le texte autour des images.
HSpaceEspacement horizontal. Très utile pour faire contourner le texte autour des images.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm new file mode 100644 index 0000000..723216d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Outil d'ajout d'hyperliens + + + + + + + + + + + +
+
+L'outil d'ajout d'hyperlien ouvre la fenêtre ci-dessous.
+
+
+
+Il y a deux champs dans cette fenêtre. L'Adresse URL est l'adresse +de l'hyperlien. La destination vous permet de choisir de quelle façon +l'hyperlien sera ouvert.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm new file mode 100644 index 0000000..59e554b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm @@ -0,0 +1,71 @@ + + +Outil d'ajout de tableau + + + + + + + + + + + +
+
+L'outil d'ajout de tableau ouvre la fenêtre ci-dessous. Elle vous permet de créer dfes talbeaux.
+
+
+
+Description des champs:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColonnesNombre de colonnes du tableau.
LignesNombre de lignes du tableau.
CellpaddingMarge à l'intérieur des cellules du tableau.
CellspacingEspacement entre les cellules du tableau.
AlignementAlignement du tableau.
BordureÉpaisseur des bordures du tableau.
LargeurLargeur en pixel du tableau.
HauteurHauteur en pixel du tableau.
Classe CSSNom de la classe CSS pour appliquer un style.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/fr_ca/style.css b/includes/tiny_mce/themes/advanced/docs/fr_ca/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/fr_ca/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/about.htm b/includes/tiny_mce/themes/advanced/docs/hu/about.htm new file mode 100644 index 0000000..c6bffff --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/about.htm @@ -0,0 +1,28 @@ + + +Über TinyMCE + + + + + + + + + + + +
+
+A TinyMCE egy kompakt WYSIWYG-szerkesztő az MSIE-hoz és a Mozillához hasonló webböngészők számára, mely lehetőséget nyújt önnek a HTML tartalmak egyszerű szerkesztésére. A legtöbb szövegszerkesztőben elérhető funkciókat nyújtja egyszerűen kezelhető formában.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/hu/common_buttons.htm new file mode 100644 index 0000000..fec961c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/common_buttons.htm @@ -0,0 +1,106 @@ + + +Allgemeine Schaltflächen + + + + + + + + + + + +
+
+Untenstehend eine kurze Beschreibung jeder Schaltfläche.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Félkövér szöveg.
Dõlt szöveg .
Aláhúzott szöveg .
Áthúzott szöveg .
Balra igazítás .
Középre igazítás .
Jobbra igazíás .
Sorkizárt.
Felsorolás / pontozott lista.
Felsorolás / számozott lista.
Behúzás balra .
behúzás jobbra .
Utolsó parancs visszavonása .
Utolsó parancs ismétlése .
Új link beillesztése, bõvebb információért olvassa el a Link beillesztését.
A kijelölt link eltávolítása / Az összes kijelölt link eltávolítása.
Egy új kép beillesztése, bõvebb információért olvassa el a Kép beillesztését .
Kód tisztítása / Eltávolítja a nemkívánt formázásokat. Ez a funkció akkor hasznos, ha például Office dokumentumból másol tartalmat.
Ennek a segítségnek az elérése.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..a60e1fa8d8a92292e17c6fcf1877b8722c297a77 GIT binary patch literal 5486 zcmd6p_fr!H(|{?0p{UsDpjbfgq?`zd9NzgV2rBBSp$Zlb5Eb-Jk)nX~gbryW5PCua zgh)xFwbY=psmH;q|`n`y;+*p4pw*nVs1mc4zj6{dJ2=ULMj#QqxlZOSqI7 zT*~{WEGgFRo;`ca{>9tOjAiEi)7=LT9z1^h*c%S_-rWs+{p|hw_u=7E;o;#iF)$@%Yiv>CsWq=;-Vi9yf-^kCm2=jfuv_X2Dn+Df5xH6vA^N%IYkAGQT=Xb4(xa&)t z^<}PDys^2t^*?NHZSQPv@BGW|wq!@L%YyH2E${BacXxOHZ@>N@C!>F7`}Y>401~Nm zg(KozbmM2h;d5?uLT+=cir!76T}56iNY%_wK)*ZIkjzjV7|F*LFw*t!m$)&Ag&k1i zr%a^%m!i%ri?_1^#@Ew1>T*{<8aGZ4mV4QypOj-%V!swU<=;fztSafp0l)YOnN_&K za^1{x7n$uXu@Qf$?KB<5-S4Ui7-ym!YRZJvz{{;oYoJu;NI!=)lk{T3Xmi|QLk||I zV!S;?&mr59Oq}e1nY|cdaVy|9g`3$sQu#-7&)7s^JUS^=bAyDZ9oe_2)eC&m+qt1m zYR&5*Epvd*Z5nBLKmN1EV;jv4KRvxXhn(A2C7(;o*LHyzIf{W_(epJ)#@ zW*QV@PEMp;+pjR8uXjyVUQh19n`=j$epidQf81DQG85>HorJi(6HP)rV+^KX&mg{2 zaGxT^qB2Gh}HQ~Q7KStW0N&(yY9!dS^q;TB*Z~j7IyNa!C zk+P;|Stq#0csufS+mME1c$Cm1)_Re1@7yg)gEeAM@50KkE zBxnW1>yOd(WCC>=t;gT$I-N?^Poo2bZ&DYk-7?(XNR1_guw=?Lzc$GoH1;$-uI}Uc zrqk@J|68^-6#TZ!a@S~;ZF~G>CHuzr?YF)57dltJnqA)aPtUcj(6{~f|Jt`IAGJKX zHs~3acdW ztm>(h2H8E8+lr?zm^qO&FCO;Tn1J3Xvz$`*U)-2PzhB&#$@=RRd8Xh~_U3G1K6`Vv z=>Fp79R9CYTl1CEbykCZtBYGp4ePhfM`^fJb3Xmi$ky^3@N%2hr#&)sVfZ{sSvO)k zuw6s%h|P+ZG%%b+YCq*ca0EhMey1a zqvm|#AutZ0`c&G$!Fh9kg^fIcpmMP}SN;|7i)I-iR$@cT-5)~#U02c_YbO|0$+T$E zQ}2m$FnXer8+7fgRchQ_THbyfto6(`-8(jpS+r9XTgcs|4OPE0JI=p2b#(l zI!P&;^qbzKjj7B&%{hHuq2;c5o_9f??YT$3%=;z1nFR3ZbI-9%=e!k2xn|+{$7BcK zSXyQs{`oJDxDJoy(=+Rlg};1YI6hHKhm?Yg3_@m@ZjwWYF6$!GLPqCxe_Lf&K(R%; zJv$)5OBS;2ZE+UJ{^y}Ba=P-_i7w;4R`!RL~R`*ig^%b06!(9JO{T{fi zGT-2q==vjDJbh#}dQ;@*9)R)wKC-Hn#*uMJtiu7BwlXRWPEqE6$K*bf zavSCSairm4g?y;(@dYfmhiQuJj_l}I~x)sqG`2LszELvLGIDBy|GiIK;XyoVZzLNAvcI^Cx z;I1r>AH+f0*v0bD9;M+`_F&yy>FZDtb!cboQLSX>LiiHjV|^CduyDHkqY~0nvhu!R zr}mf7gYzEpu0gVYh#L=_ArTaP#Lep3P4ak<*S0SUxsyCGf9CQ~J0MEcc-|h-Am<3zsa}Z`ef0D02GB4Q^)* zN9w>k!sqd-#O}B=zaB8}etPwAaAf@LUki?Q&bWfnfSa($H9~{$?ctY-H}#tUq1HqX z*k<2BJDt>cw~71fdER9)7gg?Dx%=pA@IX=98t!7ioZEMo!7Hm52_I@-0F|}|+RT4c zfVBL**Lj1r+U6Apw)}ndvN+Xj^UBAy3(qcv3|2_0Nfo93&$EJM&0&qo%C*&sm@VOK zb)!5RwfN8bAg?7z4fcZjo-_Jab?*U44TZWY`o_6{JexIoXybCs4YZs}GO2|-xSZg+ zJ*Hf))^>^gEh%JsT=xK(F1c}gB`s@vLjTT(=1WqakJB0qen}>GcoC#yz6d7o#ani& zee~5;kyda3P`YEa|2`>owQrw}nlXgE3NslIIVD@k!fvmXxQ2-?QYiy9?6tCxojK0~ zR8ITtAH=Mkd7r;F<=s*utEoE+0k5e_=7iO%_MOGoIa|FqbY;~>MrHs9Xd@uoDDBm- zJ&rnX<6~Xow#$-lDaqF3FV1W*T_r29F51+kt_^mGPbBsOv#dcCe_Mq^Rq5%4T#KC)MbC7SVqKqaOxE17XoFq-Zxzw1+s_ zQ#Iy^Ma(l`jCW9s*G!a7xJ*m9jM{QcfNJa;i`c(`vG0OngJ7}2q}WhS>_>5IxN2Oa zMO+jxE=C+HVKl_(qvO=1q?5#PDXQ^l7V#Otct}t@3>J?d#UnZK+2VM#YC@hxLIE%V zIincQi2(zo@!bh!;sk;!h-d+-1cIuAKqMH5LITk^pgJ+AK^5F&0dB#7Fqk+T5X>Zj zSsXB14DMDJe;`idxE1c&a)%l^v9-xsj@?mbNz@EY?pu^C3;2p{NZ{GvcNlC8zzOCP_E7PcgPk zH~*0S9hh!GPPY~%12&SbsAc?)O|-Jixc(ud6_{a1&Tu4yZgMl6)G{l?8TXtso$NE2 z04XUn$OR5^XDB}2$n4aI)Y(B=eIV>O$U`^?D9Uu@COpGJD)pfis*uMpm0Oo>)W?>;H1sIA9 zjZ=Uk$?$Sjgr^!J#~u;ri@?KS*bj&@GNRl7QNe&!86e*IA}Zq%WH=(tG9%^#sLmeI zrj|uF$ZC(zVp$^S22j!llI@$t_<-!kB6~Lwt`a!Bkc=dVP})P-919>OvrhC+@U z6HWP$J!p_SO-6rrMjm4#h$6I_BJ!X*@~Q#)Eg7|e&Hk>IL%^bkeNm(yovfQjBm$-B$_`EeI( zD&%EYroJmF45Fk4Q;PRx+~Swc|95v_2QF1YGo90`G=P;fLJuJRlh zJ)3q|D!j!7-xiF&ZzA1*C<(E`(>L+m>ZRMo_(oOyc@e%BQOcu~{&}^u!KZXrEseu0 zop31=%$C;MVgIB+-98}d6(I8#Wm8t=tA6;ISha!L6oX5xxVxy)t4#`|(T z-$dsG_>N1_60>YSwM=P_Fr-S@<63bHbX30MXAAUzVTHCv@wPfqXjgIEm3U_Eh}v8R ztE5nZkf613Mu$CV7jRi@!e;C%8m5h+`P(iKF`bETY9pcG|M!n0D+T{Ay!Q3x7T;$&*WGb}@_o>zaRA5-voJD){f(nI0WH)KgaY>ChS|9FctHc#nKbNWV zBKs}3cFv-b8{* zEh>RDG^$Ma6-pYFK5CU_hKXDJdgbl zxkkC|#uJ)}s>sGUYGWyOh7rwPx!%s6de6G`Pq)^(gyvEl#bvwHiPq{dPyKzn^+_lJ-$8yF z+SbNz^|5ZdNo$MZx4jB23D9iMvugi)9-HFV8mx(nqqc{ES|#2zkfVQvtpI<0tHnzh z{25#s7D^8{0)re0(T?y`|MFx_a3)e&N>?Qd{0W6Tn(hcYyUm~{&?7YH6mfNy+EJ8% z>3WrkU>(f`Q=M`%WxYCT@YPT}{r)KP-e`xjbcef12hOD<2i(E;V?I}A)Up^l6->5f zM=zd1ckC>sF;NUgzjEijtE@8DjtUy1oz^LEW7CnHg6$*BP--29If?A(o$qMZ?9?^s zT2*EVdGtFc*rTCc66?-g|1K%vkvRcvLBQ(ShAW`Dx%kem?QWhwdmPtw`$X5l#15G- z_C8e4-MihE0#J!^SCfB_?7kj?QMcm>2}|Fh=hoF;y?tFLQN6~cy*i^k&PMcFBwM4l z`?yw5jZx1)Xy>oDx{c0%RnhAEEwN_;++!x}p>BiVZskKpnQ-eqPp_{SB%K43wUc@$toxaJ-)X}E*nE3{usxu(#y70}m4Ev?6gCJom`NE7)xv(< z8BA2?M4~WJ?wsggPF!tqLM_L-q%A3toT$ZpV9CvJFHQ;LCcoe!Ix~<$uH6O~{W2r( z3h#GkUXd^zgW_E#^YCHmDk4SV6@H~VzdDRhLh&iJe43D7x5IDH5;R>Aw73h}!US}b zpfR!VmO#LEFQcm}XFeyy^|=cN!h{@@kXI`d2!%sC!V#^Zu`5Fp?n6^yLo=wMS@)q# z6=jgB^0L7bHV?_Srh+N%}V%>=H(8zwt Rh>G^;A)8UYmWtHn{{oZ!j5h!P literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif b/includes/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e72357bb6a56444bf8e24ac27656eae74cec74ea GIT binary patch literal 5762 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/hu/index.htm b/includes/tiny_mce/themes/advanced/docs/hu/index.htm new file mode 100644 index 0000000..47e5029 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/index.htm @@ -0,0 +1,24 @@ + + +Inhaltsverzeichnis der Hilfe + + + + + + + + + +
+
+Kattintson az alábbi linkekre a segítség különbözõ részeinek eléréséhez. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm new file mode 100644 index 0000000..351e7d0 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm @@ -0,0 +1,32 @@ + + +Schaltfläche Bild einfügen + + + + + + + + + + + +
+
+A Kép beillesztése gomb az alábbi ablakot nyitja meg. +
+
+
+
+Egyszerűen meg kell adni a beilleszteni kívánt kép elérésének URL-jét, valamint egy rövd leírást, mely alternatív szövegként kerül megjelenítésre (pl. nem grafikus böngészőkben).
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm new file mode 100644 index 0000000..ca67885 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm @@ -0,0 +1,31 @@ + + +Schaltfläche Hyperlink einfügen + + + + + + + + + + + +
+
+A Link beillesztése gomb az alábbi ablakot nyitja meg.
+
+
+
+Két mezőt kell kitöltenie ebben az ablakban. Az első - "Link URL" - a hivatkozás URL-je. A második lehetőséget ad Önnek a hivatkoztás megjelenítésének kiválasztásához.
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/hu/style.css b/includes/tiny_mce/themes/advanced/docs/hu/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/hu/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/images/table.gif b/includes/tiny_mce/themes/advanced/docs/images/table.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8a00544a9980d38c44d5fe8e9a8457be8339834 GIT binary patch literal 1018 zcmeH`!D|yi6vijCX;K?;HK|5XNfs0Yg$)+cs)rOqvff5dHHc2Uv)oRl&oNM zL_v>pGsp4dsvwhU>0X4Xh+Wac9CC=o!gvw&;JEQG@DJ$6$B*y9ySxux{Y-6ku9*Wl z&;cV^mgTqzF2D-Ju^=LJ*5Me*7UC50Cy+D9dr10NaI7en0;v!yiHT1LWt4Ho80`td zH0fy?J20##7#A#vDOn&n7d(iA=0Y-IcxbrPf)f!?@szE;c^>s&MB!_#s1QkQn7rM&uZWEuIkdp$R4&n$wy)0vxLV{8?)r-!}Ci)!@%sw>sSn!}>!G{SeK1|r~VZn+68+II6u;asm10Ob=_wF-@g9v?#;*dZ@+%|{O#+PpFh6;{Q2Y8&mX^k|N8U$_y7O@!A=+@ zMnhm=LO}5+3o`?QHiHhxdQhHV;HYB==aBK(u;5@bhp<-6i46*DqFMnSA1*XHGjymj z$?Op*WNGP=)SJbz@M1!Xh>C;FgAEIv8ibYXrszl~ z&MaaYDh9g*7@JwyXK1-BXgI*Il2h;pPeZ6;LmS)vCRL5HH(U%EXSsA%Z__>8z+epk DI%10H literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/images/table_delete_row.gif b/includes/tiny_mce/themes/advanced/docs/images/table_delete_row.gif new file mode 100644 index 0000000000000000000000000000000000000000..1997065fb2b447f498ab7fda4b7e21dcbb25dc81 GIT binary patch literal 942 zcmZ?wbhEHb6k!lyXlDQc1CIoUh=PEGhJcKQgo1{IiU|b`3j#VmBuw~FFylkPf)5Q7 z7Bo!QFk!}m2{SfKSg@gC#fJ$SK1|s0VZn+63pO0su;ai2Ap5|F4JUx;|A7nt58U{F z;lck0FaAIH@c#o4{rLYMi2nZv+crv!hQJ^S0mYvz%nS@F3_2h;f${_cM>m5fhm6OD z1qYisgtcN$Ojy9mEvgi>fT8hWN4JEt$%Yw%N7~tCoGZROc*x+)p`mC~@Svg5n~l@8 z>cxRXXEq)or2`@y3m*9JNg2eP*va6?$lx(i=t)DOQwuAXkirbBgarR4#!XpwwGCZQ}j-u$i5iXM38c!-9o(cUMTVu`pNz0PJ9X!TQ3xphWMO7tP+`ykxe1gf7&uxPJUL`M zHY_;U%pokNQs8*7k%5a_=z@SE(i5MkXeC zPNt5?0yW=8hN62%Dla%PGcz-pWCS=goN5wqs`((G@bc1P7WEc}kBSW;s{+{lBo>-5 iu&xUgtrHbga%dGy+03=YpedVyC-?NbIlm1R7_0$Wk9qk3 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif b/includes/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d1ff37afea7bb2e67952400e00184aa275d6764 GIT binary patch literal 935 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82Q3xphWMO7tP+`ykxe1gf7&uxOJUL`M zHY_;U%)u+PW5EN5h88YU7mp7DN{(zYMmj4p0u!3~q*V&u{5arzY@(RFO-4h5!|^7D zIH?}ZVugm;rn%2dUMy&AWMq^w(NJJWb>vXAtKet|SsBK;hMu<;?0m9#Rd5 h!d40F?cxwzaHwNr1Z$MUMpFj1Z7JoaTqOh;tN|1Me9r&? literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif b/includes/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3aa15f93a9d50777ca3a3b2309fc807ceabc57a GIT binary patch literal 928 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82Q3xphWMO7tP+`ykxe1gf7&vMfJUL`M zHY_;U%)uMAz#x%{g`JbTZ-#`DOLGT{dj|*Oqh`h)X6?Ek4-y$X8X1FD*?2NJv$hH7 z&6{JfXpzqZDa$&I13@aDj5?v~Qf7WQ*v!VmA#i}h;Q=$htVPBS0l|h)240Jt69SHm a!Hpb79uX5BFnBXLF$=_=o|fvsU=08}a&%e% literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif b/includes/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3271e54937cb8dbfb435ee8bc2d02157cff1448 GIT binary patch literal 928 zcmZ?wbhEHb6k!lyXlDQc1CNA&goc2OhJ=EKgo+6T6%!mP9uzc82Q3xphWMO7tP+`ykxe1gf7&vMfJUL`M zHY_;U%pt55lkwqTGaC=w17?0%i;Nu$1RC5Kcr9{H2skpjHgXtwL`-~0*X=}WE7QHI{4WtnErk^c$i_Har&nt0T0z!7V6jbF?3B; b3|uVFrNMjfN;AWXK;{oIr@tjQFjxZsoSk_C literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/it/about.htm b/includes/tiny_mce/themes/advanced/docs/it/about.htm new file mode 100644 index 0000000..ea448cb --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/about.htm @@ -0,0 +1,37 @@ + + + Informazioni su TinyMCE + + + + + + + + + + + +
+
+TinyMCE è un piccolo WYSIWYG (What You See Is What You Get, +quello che vedi è quello che ottieni) editor per i web browser +come MSIE o Mozilla che permette di editare HTML in modo comodo. Ha le +funzionalità comuni di molti word processor e non dovrebbe +essere difficile da usare.
+
+
+ + + + + + + + +
+
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/it/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/it/common_buttons.htm new file mode 100644 index 0000000..c27cce6 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/common_buttons.htm @@ -0,0 +1,180 @@ + + + Pulsanti comuni + + + + + + + + + + + +
+
+Di seguito una breve descrizione di ogni pulsante.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Testo grassetto.
Testo corsivo.
Testo sottolineato.
Testo barrato.
Allinea a sinistra.
Allinea al centro.
Allinea a destra.
Giustifica.
Lista non ordinata.
Lista ordianta.
+
Diminuisci l'indentazione.
+
Aumenta l'indentazione.
Annulla l'ultima operazione.
Ripeti l'ultima operazione.
Inserieci un nuovo collegamento, maggiori informazioni su +questa funzione nella Sezione +'Inserisci un collegamento'
Rimuovi tutti i collegamenti selezionati
+
Inserisci una nuova àncora, maggiori informazioni su +questa funzione nella Sezione 'Inserisci un'àncora'.
Inserieci una nuova immagine, maggiori informazioni su questa +funzione nella Sezione 'Inserisci +una immagine'.
Ripulisci il codice/rimuovi la formattazione non voluta. +Questa funzione è utile quando si copia per esempio da un +programma office
+
Mostra questa guida
+
Apre l'editor del sorgente HTML.
Inserisce una nuova tabella 2x2 alla posizione corrente.
Aggiunge una riga sopra quella corrente.
Aggiunge una roga sotto quella corrente.
Rimuove la riga corrente.
Aggiunge una colonna prima di quella corrente.
Aggiunge una colonna dopo quella corrente.
Rimuove la colonna corrente.
Inserisce una nuova riga orizzontale.
Rimuove la formattazione dalla selezione.
Formatta la selezione come pedice.
Formatta la selezione come apice.
+
+
+ + + + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc9fc9d4a5e19f6f7c5e29bcb8e8f1fdd54d44ab GIT binary patch literal 5336 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cb25cf59f7c75bf4dadfa6de5164b42b3c9b3cc GIT binary patch literal 7379 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 F06X$-YIgtt literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/it/index.htm b/includes/tiny_mce/themes/advanced/docs/it/index.htm new file mode 100644 index 0000000..4193600 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/index.htm @@ -0,0 +1,30 @@ + + + Indice della guida + + + + + + + + + + + +
+
+Seleziona un argomento:
+ +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm new file mode 100644 index 0000000..aab9135 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm @@ -0,0 +1,32 @@ + + +Bottone 'Inserisci àncora' + + + + + + + + + + + +
+
+Questo bottone apre una nuova finestra che permette di aggiungere o modificare un'àncora
+
+
+
+C'è un solo campo in questa finestra, dove devi inserire il nome del tuo punto di àncoraggio. Ricorda che il nome dell' àncora deve essere univoco.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/it/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/it/insert_image_button.htm new file mode 100644 index 0000000..8a7eabd --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/insert_image_button.htm @@ -0,0 +1,66 @@ + + +Pulsante 'Inserisci immagine' + + + + + + + + + + + +
+
+Il pulsante 'inserisci immagine' apre la finestra mostrata qui sotto.
+
+
+
+Si inserisce semplicemente l'url dell'immagine che si vuole collegare e una descrizione di quell'immagine, +che sarà mostrato come testo alternativo dell'immagine sulla pagina. +
+
+Descrizione dei parametri:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
URL immagine URL/indirizzo dell'immagine.
Descrizione dell'immagine Descrizione alternativa del contenuto dell'immagine.
DimensioniLarghezza/Altezza dell'immagine.
AllineamentoAllineamento dell'immagine, utile quando si inserisce del testo attorno all'immagine.
BordoSpessore del bordo.
Spazio verticaleSpazio verticale, utile quando si inserisce del testo attorno all'immagine.
Spazio orizzontaleSpazio orizzontale, utile quando si inserisce del testo attorno all'immagine.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/it/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/it/insert_link_button.htm new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/themes/advanced/docs/it/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/it/insert_table_button.htm new file mode 100644 index 0000000..7720f95 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/insert_table_button.htm @@ -0,0 +1,71 @@ + + +Pulsante 'Inserisci tabella' + + + + + + + + + + + +
+
+Il pulsante 'Inserisci tabella' apre la finestra mostrata qui sotto. Questa azione permette di creare tabelle.
+
+
+
+Descrizione dei parametri:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ColonneNumero di colonne nella nuova tabella.
RigheNumero di righe nella nuova tabella.
CellpaddingSpazio tra il bordo di una cella e il suo contenuto.
CellspacingSpazio tra le celle della tabella.
AllineamentoAllineamento della tabella.
BordoSpessore del bordo della tabella.
LarghezzaLarghezza, in pixel, della tabella.
AltezzaAltezza, in pixel, della tabella.
ClasseStile o classe CSS della tabella.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/it/style.css b/includes/tiny_mce/themes/advanced/docs/it/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/it/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/about.htm b/includes/tiny_mce/themes/advanced/docs/nb/about.htm new file mode 100644 index 0000000..9541380 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/about.htm @@ -0,0 +1,32 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE er en liten WYSIWYG-editor for weblesere som +f.eks. MSIE, Mozilla og Firefox og gjør det mulig å redigere +HTML-innhold på et mer anvendervennlig vis. +Applikasjonen har funksjoner som ligner dem man finner i vanlige tekstbehandlere +og burde ikke være spesielt vanskelig å benytte.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/nb/common_buttons.htm new file mode 100644 index 0000000..f6bea80 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/common_buttons.htm @@ -0,0 +1,163 @@ + + +Vanlige knapper + + + + + + + + + + + +
+
+Nedenfor finner du en kort beskrivelse av hver knapp/funksjon.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fet tekst.
Kursiv tekst.
Understreket tekst.
Gjennomstreket tekst.
Rett venstremarg.
Sentrer.
Rett høyremarg.
Rette marger.
Punktliste.
Nummerliste
Reduser innrykk.
Øk innrykk.
Angre seneste endring.
Gjør om seneste endring.
Lage/Redigere lenke, lær mer om denne funksjonen i + kapittelet Lage/Redigere lenke.
Ta bort lenker fra markerte lenker.
Lage/Redigere anker, lær mer om denne funksjonen i + kapittelet Lage/Redigere anker.
Lage/Redigere bilde, lær mer om denne funksjonen i + kapittelet Lage/Redigere bilde.
Rense/Ordne koden. Denne funksjonen tar bort unødvendig + formatering. Bør anvendes når man f.eks. kopierer tekst + fra Office-program.
Viser denne hjelp.
Åpner en HTML-kodeeditor.
Lager en ny tabell (2x2).
Lager en rad ovenfor den nåværende raden.
Lager en rad under den nåværende raden.
Tar bort en rad.
Lager en kolonne før den nåværende kolonnen.
Lager en kolonne etter den nåværende kolonnen.
Tar bort en kolonne.
Lager en horisontal linje.
Tar bort formatering fra markert område.
Lager nedsenket tekst.
Lager opphøyd tekst.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/nb/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c38437e26bcc84145d6a6e994ff1f0bdbbf0538 GIT binary patch literal 5229 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 CMam2S literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif b/includes/tiny_mce/themes/advanced/docs/nb/images/insert_link_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a56e79c4d9f735f162fb69fb9b49ec05f17fc0d GIT binary patch literal 5767 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 F06XoAmZ<;$ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/nb/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8b69ef02a40913b8a94c28f4df060c27f2859d2 GIT binary patch literal 7099 zcmV;s8${$sNk%w1VN?O-0QUd@RdcEgCv13`$Qd+uIaZP^NQX30jxI`xBtU^dUYR#k zkQ6R*Av}H;F?Aa@c_Tl75-o8LDQ-YOK&Hy@3M6W4i@jNRu635i3ngnPM1&_pgFIQ4 zlC|HLy5k)KHS2TY9h{ zJAI_c?su5Tl(yi0pw4KByGCT57czBYgSJ?At)j;5U3{^f!00+xls#LPrpfSckimtg z)PA4Mh^p71#OsZ(+MK`Vo4@BnV4Fi>n~$>He4flUQ;=45tXFodfuqoKl*BMii!x7) zN@<~(yW~M%np}IZo4)2kV44#ya($l7Pi>`Baj9HGkWrVnLp3Q2Cyo9CFT6wRL zwBC-f+**3CgQe0OH+iMW?;<^afuhiSoy-7c%z2v0M`fNqTbG)><|96TV1TrLpw4ZL zznZ<}MPr>|fwfF(qfKk0p~UQuvD`gcmJus(qsHx|$nPLLeWAtdhpE7Xm=!Q|I#-jP!s(T`;$MHWQE;a!Muv&2*DFVcl(*q;kHKt= zzE5tYi>}#mlEYGPrx7f0Gf$09Y@}s{xO0@na+1T7w%{K+e1)geM`fQsT$gc?!b)hN zf}_!NmBo&*+mW;0X^Ff$Sd<<*dnrYQO>Cr%uiI>nyJ?BLZjZo%q|ueQ;gGZ4gr?IC zCv6%vcTjGoF-?mzP>pwYcQ#UwdYj5)gSRnGjE1Pxn7rgBLV{$3w}+|KGiLuaQjea& z>3^ZmVuH4SqR(A@vYEW)oxNP z00960|M2kcA^8LV00000EC2ui08|0x000R80Qm_VNU)&6g9sBUT*$DY!-o(fN}Ncs zqQ#3CGdh&O&!5MSAVZ2ANwTELlPFWFT*O@oFE8Gb1WHL5@X5+n|sJEzVGGigs)HEU)d+p{DJ6i^~SfRm11 z8#d_K(WaIrO9>K4sZzv9iWGDN&0s@IQiu?@pp;8z=MJz|SWYc_1WFa6Ea(6LSSL=& zk}WnYSO7DI#S|?#yk&CqsSunx;kecRh-Qt8s}COz4U#d8mzN3^Ov#Z$h*+r}jclcY z1*yraTo+tWLJ2PjAix^XKr_M!X&`aM4>82CO*d#TflD!De1Xg?K1_2BAb|iO3J4%X zg32XA1fz=>c^q-fE@5!MK`bzkVvHw?bkIQ*)O<6C8&nW6L=M_$(@7$g1cApNH}GMI z3w@Zu!vs`TY2}qzW~t?tTk>O+PE0vt&X{D9=@e8_QDqfYT5;tSSYnZ77FuetQDzxtnsMeCXrhs38fvPs<{E6W(PkTNy7A^4aKaI1 z9CFGr=Nxp>QD+@?+HvO{c;b=&XC8X$vF9Fq^3i7>e){p}AAkZ9Xdr?LGUyjX( zh8l9{A&4T9Xd;R#vgjg=GSX-xjym$_BalK8X(WG0s@yjXCbv%yPF4^RhQBFC*N)qt@O{L!xyn9rb{+wX=;U~Ovg1r>ro94c3`uk?UauQtU!FVdX zXTyF%9O%S^T6}26igMiO$B>FVX~~wNoaxG(y8LO(qS9RI&8X_UYR|3$9qZ7v8hvZh zx-#AC)4)nSY}LkMo$S`kdi`wJ(vn^6+1RSRZQI_$9q!!Z+I?=`e>a4aP7L8xe)YB6vz!t5sQOj)CN}IOW)~&aJOK#(;o4N3ouDzMBZvxqe7Pq*?EVj>z z>~r6j;-!>$(2ss6z(zYxfP!~8!(LAbN&o!uzkk6=U~?*%oe-9%x+E|p4E)@nDi%SH zkdA^Ka}>xTH8M(>%m^MynWk6OX#IROJ!?1HF8Y+iZ zLslLyhp?0-G-&C=2zdm0Le!-{cv-z80yBF{BxV$h`NSM}gl@_lUlpCH5NLX7B>SM| z7kRqPYi5(1fg58|Fc6P<*rR^_P(v5YsR9+400ryxM?3wu3XgOJBx4Cloj`KHGuZP1 z_?(130Rxgjg~SPlWJO3Y0}{`8WCQ*n4M;W!$&btiBp?I{s6cX@h)z^@JOfD~KvGJ7 zm>@Q4@u5g(8+4J7^n34wSBl4F_F9~BA-hd?4Ckf6vTV(`ZiLZU5@6!Rl-v#CFD zDn2UzHuH+;3#vhMTTPxCwWvsa9~qr-4{V(AjQ_CeRkQk$s`$?%00fIiXyB2vc%*=g z@JOEgv8S}I)gy!PNC7>_WNLK5Q7I}EX6lb)%Jw5Uwe9+ziN&ApR;W832yla|R0`~49`!J; z;o9L36|}i9Rbj zu;GrXnqay5%a=#y=n;Q;M7sXKvX&j-5w~b}F5JDRKh)}vF#Cg_V=nV~&zxp|Sa8je z^2llEYbpDB#5Vc0WS#v{yE}6-cPl)wDF5u(K(A-e5%$M~{ed6MDw@$89;t^*3Te z?dvGRaeu>pu0ObP>`hF!y2`k2v$N|Dxp4Q(`K)#Z!0SNro}-Z4_J?}?!Cr4G@~)#1 z_k8{F=9HZqzy6r>y4!8o0>>K%{_xqW=-ps{JlG#dD>Q|h=8-1++aDY5@P`W?VoF;Y z2q*R>YForaa4a%)=I$+^KwpBrCh+~IQ+veZDL21 zgL8U>IdS0+dcrV$@-TpcZJ}c*7&AfZHBcACNUOtFu5(|p<0&wMNuyFTrs8$V*Fvun zG_s;m!b3x=WIQOnJ;)BxvLqxq~JxCNx+QUR{ zgM{A`MLA|_d!v7zcs`$~e?t|D()52trWDSA0;;%*tT=jG2s!Wcg_R?Q5ZFhXQ-Ohm zfopg%h!Rk5s7P^WP$JktlT?BZg@U$YGl%tcF6cWMC5Wj+JT}xy$fHA3LoAEvJUtja zL&Q=JH-wZJQ{3Z3NvMgn#fcJ-j_SCM?AVU(xQ1`{Tcx&f?NXCAnI!=K*c3W>Ci%jJk@Ju7WI5QC zITNTropXT*xr+c*Iu!(r1r>r3NsM;bDHW-Qx3i3XC`vHcksC#Wg-DGcm4nzgciWg! zKp2TGg*{5-l1FG`O1OzMd6RN!lfp$5c6pb0nU{LGmwY)9V?>I88JL1On1orFhIyEX znV5>Xn2gz&j`^67DO5*+6Y^M@mU)?&nVFionVi{~p81)e8JeOwnxt8pnmL*9f)oF+ znylHHuKAj<8Jn^>o3vS*wt1VlnVY(~o4nbZzWJNL8JxoDny87I!+D&@nVibGoXpvr z&iS0eS)4)zozz*K)_I-SnVs5so6`9%+xeZ~8J^<*IiBSC58bJn<(Z!9xt{FVp0RnJ z65yWlIiK`dpU(-O_L-mhxu5(woA}wE02-hI%AWr@pay!N2wI&5nxG8YpbqMr3;LiE zI-wNWnh{!|7@DC6dZ8NHp&pu_9QvUmI-=?sq9l5vD5{+%nxZV)qRqLYE*hgU3Y;)H zqc(b@wppV%x}!YGnmXE}Kx(5u8l*(pqC;w%*yNl^`kPC-q~YnLwArNnP^2X)nbXOe zjW?yM38l&@rHzN1QVN}1`kG@Jn_)_&<$0v638h+Ero-u^aH^%X>88v{r&}tgQQD?> zil*VIrgsXPXZjCcdZ(|}nuBVnavG;=TBwWv%BXS5sDcWqN$RD08mW#dsfTK*iK?f3 zN}hgdsbo5(WqPJ#%B70>r;&=Pq{^wO+NzYgr=?n{uF9&bimIL3r&j8nSbC_Ls;RWP zsgT;Lgo>%E`m4oytin31mCB}rTC1~atGD`{pNgn@%B;xhtk62Cc$%fg`mD3stlP?} zh`OlPTCJA~tvimc;GuE}bv@G7qOYNzQ6ou3-6_3EwI zDzE*Tr~_ND*~+i_+O6?wum75z)0(CD`mL`@t*2VC7K^d-%B#f6v4DE9zKXF28?oCt zt-asKc3bQtwv-OFyI@`1D$+JEiv}wAo@hP-ME1*Do zv`QzrK+pmi$~cdN8}8xwuYoO!#Z`T4gn5x58{tKw<6FM+tq z8L)(FriJ?vuLijGS+laKxZ%0Bm3z2kD_rcFn{7Iqn!BE7+YglMx%G*#NXnk4o4Sqr zxqn%-x+$uzDXCi;xnGK@%!;t1`ukxQr~YrMJpyVV)Is_V9(OS_`Wrn;NE z)XTbpO1;;cz1a(=z*)D#JG}J&iMiW5z13^I)akvJOP!Fby{xOe?n}Pg+pNeLx8DoC z^QpYUioNEFzt~B?d@H-D3B6znzrWkQ#rwY6Tf7O(o1AO6mwUhjjJ*n6y2{zW|Es=l zJHWcjz4^<&5!}Js+Pxl;rOkW4hT5pWn!*xH!O3~LjaR~Wo53W?xGv$iK}*9eVZ+Ed zxcrI3ETO|a>%%Jn#KXzM`zgdKLBu(W#3`Y~Tr0yPDz;(!wE%3KTYJUeX~bB(#r_G! zT>Qm?>&0L^#>c6}WDLe;e8yay#%hekY~03M`^Ip5wQ@YiQ(MRGDaC3_#Tfj&Ey~0< z5whuoo!ToRA`uais?mCT!3%)c6Z!WBHone3jN zOrDnvR8@SXyIQ)V+`6|b!NFO|A`!~k8LVXL%1k=HpnS@@x|`L8y8p)Dd%hmhNwv52h9L*jqo9Il)5A4q4yU!5p%OPCP)?2#wtj@Lh%pkkZ0qv+C zEYHDg&$&#z(A=c@8_+1c!uosBwmHzc9J-y!_Nj9m9TXol+gMGW!out)W?sq+8w9RxQ&kD%O5m)i1i#7^=rl%hpPL)pi`$ zx{1eft+aGq*G7BScpbEQz1Kb4*M6O|fF0N_JJ^IBv4(xv>6+M!E4Gg9iT(0 zS=p7@5iaW1V;#VM+&6;^6AzISnT^(A4A*e$*`Mta9dQ$){l}!eoRbZn=abs19eKOe z+GYLPkE_-dI@`3(5=X&fm@S@P?a9WSn`T|wWX;P`-PFZBoWAW3o%`D)5!@X&+%rwf zwL8=LjNFv}i%se4yvse+xB1-H8Qs!N-6mn({)gSYiOuEB-M*}wuRFppoYtnj-8x;U z;Oe_JP1NT7n&|z#FZ|u$J;Dbr-P3&%>^+6J{oWJ&sG=(2gj=mQ{mmI|-x^-S8!f;c z4bb!5z6JcjJk7wUz2O9o;wqlr8@}Gol%4y@zi4-U7wjkUZ@q3EsNCb5}qKEtuT!?Ql2`_PvbvFK&Z$KuW9DQfGsF4?`V z*kc^q%uc1w{_I2=?a~gU)L!j8dhOVbquRdhLb~kUuC?7B?lC&<%lp`1d$j1D?ywE+ z4tmeTeAd5B(64Fk=S$u6j-&9-%=nGzx<2pnPTTozq3$l<$F0ox{-6QAocq4b{ch~h z``mIa+X>&E|9rj2yzrk4@X8JG8eH5H|D6q=&Z2zqQJS73kIx-n>L2dkpbFp^-oF+9 z&z={5t{q(B=RNbgo!{mCu~bgc+L`hLf1KQk(MGND!YT9*&+?t@zEdvd2+#2}kIWxU z=RvRYvd;6YeC7QN^x3KO7Ekpeo#P^p^}Me2a~ktFt-`jvyk=jXHE+&L|JR~F`hs2hreD~opZbWs`g*(WurHXx-t4a5pOk6YxZjz%zQvZ$ z_oXaziO}k z#S<&{ZQq{Hj}p^;=BeHNF;4y95AO7A_3ByvCV~DTvHhNI+upzYaqRxL3lRMT{_FRT zpuvL(6)t4h(BVUf4EIU!SJC1{j28Q06e!T&#*Z33R@?|O{+x5d;at(f$UMDM$^ufND<{-rzEe2ggVkHUW`3kc6>RO?qS4<%dVBcSSM1r za+4xeytFCctb3{I<;(Xk=9FFszicbB@@dqm)dFqITIfKc1tTX_jq@`9Xs28~Ru$j*l;Yc>DKr=zs+aAKsezb?h{gyUw27d35mMf$k$;-h6rM-PNz( z-gf=<@8ad-mQdgRef;U)?_b_ND1YPjp>99|3pDUR1Y7b4Kn82`&#eYkn{Pr2@rv+5 z#U8|PLk>Iia3>8v6mdinI}EWz6jN03x)WD)@kJQtYB5F{YqW8u8E@2a#~O3w@kby_ z^f5>xi@b11h|W`TNhX_g@;oD>tm#QAtE@67B%7;HzI~+hGRZB&>k_9d9oi>MF~3w( zA~d5LlPA`cW2#Lz*R<21GwJ;8O`FPWC{N5j+mg>ay#y3GLBS*cRJ%C2oAV^CI%{*$ zLXA9>BfJttNmEKA@{`TXIMZ~(PAd)a(yKHbHPn+zedyDLP?c2F+^C9lD^5-QQr3_* z^DNSmJi}E`R~>>?Azp!e(RaLnOWzZNyhm{pm*;1XDgFd+PtBOUi#@Pvn_brrmNPNcV?@z{t;`fyS9;Qufu*3 zY_ZEmk!-Wm{t#`o+s2S>x8nv7Zn^7Lk8Zp3W)5$?`*zS|2>lj(L;n&q{BXn*SA22C z8+ZJ1$Rn40a+b6W`f|)O*L-u%JFjqR%0m}@bka*V{dCkPj|pnlTX+3+*khM{cG_#V l{q`#J(|vc|d-wf!;DZ-_c;bsU{&?h*SAKcso5wF806Se1i30!t literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nb/index.htm b/includes/tiny_mce/themes/advanced/docs/nb/index.htm new file mode 100644 index 0000000..53a0389 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/index.htm @@ -0,0 +1,27 @@ + + +Hjelp Index + + + + + + + + + +
+
+Klikk på lenkene nedenfor for å gå til de ulike +hjelp-kapitlene. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm new file mode 100644 index 0000000..3cacca7 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/insert_anchor_button.htm @@ -0,0 +1,34 @@ + + +Lage/Redigere anker + + + + + + + + + + + +
+
+Denne funksjon åpner et nytt vindu lik det nedenfor.
+
+
+
+Dette vinduet har et felt som man skal fylle i med et unikt +navn, denne funksjon gjør det mulig å skape +ankerpunkter/bokmerker.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm new file mode 100644 index 0000000..4f7635d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/insert_image_button.htm @@ -0,0 +1,71 @@ + + +Lage/Redigere bilde + + + + + + + + + + + +
+
+Funksjonen "Lage/Redigere bilde" åpner et nytt vindu som ser ut som +bildet nedenfor.
+
+
+
+I dette vinduet skriver du inn URL:en til bildet du vil lenke til +samt en bildebeskrivelse, denne beskrivelsen kommer til å vises som en alternativ +tekst til bildet.
+
+Feltforklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bildets URL URL/søkevei til bildet.
Bildets beskrivelseBildets beskrivelse, denne beskrivelsen kommer til å vises som en + alternativ tekst til bildet.
DimensjonerBildets bredde og høyde.
JusteringBildets justering, kan være anvendelig når man vil at + tekst skal flyte rundt bildet.
RammeBilderammens bredde.
Vertikalt tomrom Vertikalt tomrom , kan væra anvendelig når man vil + at tekst skal flyte rundt bildet.
Horisontalt tomromHorisontalt tomrom, kan være anvendelig når man vil + at tekst skal flyte rundt bildet.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm new file mode 100644 index 0000000..861c018 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/insert_link_button.htm @@ -0,0 +1,33 @@ + + +Lage/Redigere lenke + + + + + + + + + + + +
+
+Denne funksjon åpner et nytt vindu lik det nedenfor.
+
+
+
+Dette vinduet har to felt, lenkens URL/addresse samt hvordan lenken +skal åpnes.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm new file mode 100644 index 0000000..0b27188 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/insert_table_button.htm @@ -0,0 +1,72 @@ + + +Lage/Redigere tabell + + + + + + + + + + + +
+
+Lage tabell-knappen åpner et nytt vindu, ved hjelp av +dette vinduet kan du lage tabeller.
+
+
+
+Feltforklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolonnerAntall kolonner i tabellen.
RaderAntall rader i tabellen.
CelleutfyllingAntall pixler utfylling i hver celle.
CellemellomromAntall pixler mellomrom mellom cellene.
JusteringTabellens justering.
RammebreddeRammens bredde.
BreddeBredde i pixler.
HøydeHøyde i pixler.
StilStilmal på tabellen.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nb/style.css b/includes/tiny_mce/themes/advanced/docs/nb/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nb/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/about.htm b/includes/tiny_mce/themes/advanced/docs/nl/about.htm new file mode 100644 index 0000000..e5146fb --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/about.htm @@ -0,0 +1,31 @@ + + +Over TinyMCE + + + + + + + + + + + +
+
+TinyMCE is een kleine What-You-See-Is-What-You-Get (WYSIWYG) +editor voor teksten. De bediening vindt plaats in de web browser, zoals MSIE of Mozilla. +Het werken met deze editor is eenvoudig, omdat de bediening veel lijkt op het werken +met teksten in (office-)tekstverwerkers. +

+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/nl/common_buttons.htm new file mode 100644 index 0000000..7a684a4 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/common_buttons.htm @@ -0,0 +1,188 @@ + + +Functies van TinyMCE + + + + + + + + + + + +
+
+Het werken met de editor komt sterk overeen met wat u gewend bent van uw tekstverwerker: +Dubbel-klik op een woord in de tekst, of trek een kader met de muis terwijl u +de linkerknop inhoudt om een gedeelte van de tekst te kiezen. Het aldus gemarkeerde woord of +tekstfragment noemen we 'selecteerd'. Met de knoppen en stijl-keuzelijsten +in de editor kunt u hiervan vervolgens de opmaak aanpassen of (indien deze reeds was toegekend) verwijderen. +

+De meeste functies voert u eenvoudig uit door het klikken +van de knoppen (buttons) boven het tekstvenster in de editor. Hieronder vindt u van elk van deze +knoppen een beknopte beschrijving. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Gekozen tekstfragment 'Vet' (Bold) maken.
Gekozen tekstfragment 'Cursief' (Italic) maken.
Gekozen tekstfragment 'Onderstrepen' (Underline).
Gekozen tekstfragment 'Doorstrepen' (Strikethrough).
Gekozen tekstfragment naar links uitlijnen.
Gekozen tekstfragment centreren.
Gekozen tekstfragment naar rechts uitlijnen.
Gekozen tekstfragment 'uitvullen' tot complete regels.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Gekozen tekstfragment omzetten naar ongeordende (bullet-)lijst of opsomming.
Gekozen tekstfragment omzetten naar doorgenummerde lijst.
Inspringniveau van het gekozen tekstfragment verkleinen.
Inspringniveau van het gekozen tekstfragment vergroten.
De laaste bewerking ongedaan maken. De toetscombinatie CRTL-Z doet hetzelfde.
De laatste bewerking opnieuw uitvoeren.
Invoegen van een Link (Cross-Link) via dialoogmenu.
+ Zie de beschrijving bij Links en verwijzingen in tekst invoegen.
Verwijdert alle gevonden Links (Cross-Links) uit de tekstselectie.
Anker aan de tekstselectie toekennen of wijzigen.
+ Zie de beschrijving bij Anker Toevoegen.
Voegt een afbeelding in.
+ Zie de beschrijving bij Afbeeldingen invoegen.
Schoont ongewenste opmaak en codering van de tekstselectie op. Deze functie is erg nuttig na het + overkopiëren van teksten vanuit uw (Office-)tekstverwerker.
Toont dit helpvenster met uitleg van alle functionaliteit van de editor.
Opent het venster met de HTML-broncode voor het direct maken van wijzigingen + in de achterliggende pagina-codering. Kennis van de HTML-taal is vereist.
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Voegt een nieuwe tabel met 2 rijen en kolommen in op de huidige positie in te tekst.
Voegt een nieuwe rij toe aan de tabel boven de huidige.
Voegt een nieuwe rij toe aan de tabel onder de huidige.
Verwijdert de huidige rij uit de tabel.
Voegt een nieuwe kolom toe aan de tabel voor de huidige.
Voegt een nieuwe kolom toe aan de tabel achter de huidige.
Verwijdert de huidige kolom uit de tabel.
Voegt een horizontale lijn in de tekst toe.
Verwijdert alle tekst-opmaak van de tekstselectie.
Toon of verberg hulplijnen voor tabellen in het tekstvenster.
Verandert het gekozen tekstfragment in Subscript.
Verandert het gekozen tekstfragment in Superscript.
De Karaktertabel maakt het eenvoudig invoegen van bijzondere karakters mogelijk.
+ Zie de beschrijving bij Bijzondere karakers in de tekst invoegen.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif b/includes/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..db933dc9e65c954dcdc97e09048d15d26478e2fe GIT binary patch literal 16012 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 G0suP!I-~Fa literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..17dde58b7de1577b8ad6fe3abad9e84971eada60 GIT binary patch literal 4031 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif b/includes/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..05354a4ef24e945c8c6fd5078eca0a6070be289b GIT binary patch literal 8363 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 R^;na2S)27)FLDR~06Xz*j?Dl7 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e65679dde336b2bd9227f37dd9f9f3eb7ca011bc GIT binary patch literal 7337 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 PrZSx=O>3IF5C8x>C=Hx) literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nl/index.htm b/includes/tiny_mce/themes/advanced/docs/nl/index.htm new file mode 100644 index 0000000..6e27526 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/index.htm @@ -0,0 +1,27 @@ + + +Help Index + + + + + + + + + +
+
+Klik op de onderwerpen in onderstaande inhoudsopgave voor meer informatie. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm new file mode 100644 index 0000000..7600c2a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm @@ -0,0 +1,37 @@ + + +Ankers in de tekst gebruiken + + + + + + + + + +
+
+Met de knop 'Invoegen Anker' kunt u in de tekst z.g. HTML-ankers invoegen en +aanpassen. Deze ankers maken het mogelijk snel naar bepaalde tekstfragmenten te springen. +Door het toevoegen van de ankernaam (voorafgegaan door een '#') +aan de link naar een pagina (Zie 'Links en verwijzingen in tekst invoegen') +kan op deze wijze desgewenst direct naar een bepaalde passage in een pagina worden doorgelinkt. +

+Voor het toevoegen of aanpassen van een anker wordt onderstaand dialoogvenster getoond.
+
+
+
+Bij het veld 'Anker naam' kan de gewenste naam van het anker worden ingevuld. +Let op: Binnen een complete pagina binnen uw website dient de naam van dit anker uniek zijn.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm new file mode 100644 index 0000000..bca6a16 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm @@ -0,0 +1,65 @@ + + +Afbeeldingen invoegen + + + + + + + + + + + +
+
+Voer simpelweg de URL van de afbeelding en de beschrijving in. +De omschrijvende tekst wordt in sommige browsers bij de muiswijzer getoond +wanneer deze boven de afbeelding wordt stilgehouden. +De knop 'Afbeelding Invoegen' opent onderstaand dialoogvenster.
+
+
+
+Omschrijving van de velden:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AfbeeldingIn dit veld dient u een complete URL op te geven van de afbeelding.
BeschrijvingOmschrijvende tekst die in sommige browsers bij de muiswijzer wordt getoond wanneer deze boven de afbeelding wordt stilgehouden.
UitlijningUit de lijst kan worden gekozen op welke wijze de afbeelding in de tekst wordt ingebed.
AfmetingenDe breedte en hoogte van de afbeelding in pixels. Laat deze velden leeg als de originele afmetingen gewenst zijn.
OmrandingDe dikte (in pixels) van de omranding om de afbeelding.
Verticale margeDe verticale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.
Horizontale margeDe horizontale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm new file mode 100644 index 0000000..ce5e71c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm @@ -0,0 +1,35 @@ + + +Links en verwijzingen in tekst invoegen + + + + + + + + + + + +
+
+De knop 'Link Invoegen' leidt u naar onderstaand dialoogvenster waarmee u eenvoudig +een Link (Cross-Link) kunt aanbrengen in uw teksten. +

+
+
+Bij 'Link URL' dient de de url van +de link te worden ingevuld (desgewenst voorafgegaan door 'http://' voor een externe +website), bij 'target' kan worden bepaald hoe de link moet openen. +
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm b/includes/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm new file mode 100644 index 0000000..ae5245a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm @@ -0,0 +1,32 @@ + + +Bijzondere karakers in de tekst invoegen + + + + + + + + + +
+
+Met de knop 'Bijzondere Karakters' kunt u in de tekst bijzondere karakters, die soms +op het toetsenbord lastig te vinden zijn, invoegen. +

+Voor het invoegen van een deze karakters wordt onderstaand keuzevenster getoond. +Door het eenvoudigweg klikken op het gewenste karakter in het overzicht, wordt het op de huidige positie in de tekst ingevoegd.
+
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm new file mode 100644 index 0000000..00858ea --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm @@ -0,0 +1,73 @@ + + +Tabellen invoegen en aanpassen + + + + + + + + + + + +
+
+De knop 'Invoegen Tabel' stelt u in staat op de huidige plek een nieuwe tabel +in uw tekst in te voegen en opent onderstaand dialoogvenster.
+
+
+
+Omschrijving van de velden:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolommenHet gewenste aantal kolommen in de tabel.
RijenHet gewenste aantal rijen in de tabel.
CelvullingDe 'Celvulling' (Cellpadding)
+ De opvulmarge rondom binnen elke cel in de tabel in pixels.
CelafstandDe 'Celafstand' (Cellspacing)
+ De ruimte tussen de cellen onderling binnen de tabel in pixels.
PositioneringDe positionering van de tabel in de paragraaf.
OmrandingDe dikte in pixels van de omranding van de tabel.
BreedteDe breedte van de tabel (in pixels of percentuele notatie).
HoogteDe breedte van de tabel (in pixels of percentuele notatie).
CSS-StijlOptionele stijlkeuze uit de voor de website aangemaakte Cascading Style Sheet (CSS).
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nl/style.css b/includes/tiny_mce/themes/advanced/docs/nl/style.css new file mode 100644 index 0000000..9444101 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nl/style.css @@ -0,0 +1,28 @@ +/* body { background-color: #FFFFFF; } */ +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/about.htm b/includes/tiny_mce/themes/advanced/docs/nn/about.htm new file mode 100644 index 0000000..894df99 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/about.htm @@ -0,0 +1,32 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE er ein liten WYSIWYG-editor for weblesere som +f.eks. MSIE, Mozilla og Firefox og gjer det mulig å redigere +HTML-innhald på eit meir anvendervennlig vis. +Applikasjonen har funksjoner som likner dem man finner i vanlege tekstbehandlere +og burde ikkje vere spesielt vanskelig å benytte.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/nn/common_buttons.htm new file mode 100644 index 0000000..e31fba3 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/common_buttons.htm @@ -0,0 +1,163 @@ + + +Vanlege knapper + + + + + + + + + + + +
+
+Nedanfor finner du ein kort beskrivelse av kvar knapp/funksjon.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Feit tekst.
Kursiv tekst.
Understreket tekst.
Gjennomstreket tekst.
Rett venstremarg.
Sentrer.
Rett høgremarg.
Rette marger.
Punktliste.
Nummerliste
Reduser innrykk.
Auk innrykk.
Angre seinaste endring.
Gjer om seinaste endring.
Lage/Redigere lenke, lær meir om denne funksjonen i + kapittelet Lage/Redigere lenke.
Ta bort lenker frå markerte lenker.
Lage/Redigere anker, lær meir om denne funksjonen i + kapittelet Lage/Redigere anker.
Lage/Redigere bilde, lær meir om denne funksjonen i + kapittelet Lage/Redigere bilde.
Rense/Ordne koden. Denne funksjonen tar bort unødvendig + formatering. Bør anvendes når man f.eks. kopierer tekst + frå Office-program.
Viser denne hjelp.
Åpner ein HTML-kodeeditor.
Lager ein ny tabell (2x2).
Lager ei rad ovenfor den noverande raden.
Lager ei rad under den noverande raden.
Tar bort ei rad.
Lager ei kolonne før den noverande kolonnen.
Lager ei kolonne etter den noverande kolonnen.
Tar bort ei kolonne.
Lager ei horisontal linje.
Tar bort formatering frå markert område.
Lager nedsenket tekst.
Lager opphøgd tekst.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif b/includes/tiny_mce/themes/advanced/docs/nn/images/html_source_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..db933dc9e65c954dcdc97e09048d15d26478e2fe GIT binary patch literal 16012 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 G0suP!I-~Fa literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/nn/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c38437e26bcc84145d6a6e994ff1f0bdbbf0538 GIT binary patch literal 5229 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 CMam2S literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif b/includes/tiny_mce/themes/advanced/docs/nn/images/insert_link_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a56e79c4d9f735f162fb69fb9b49ec05f17fc0d GIT binary patch literal 5767 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 F06XoAmZ<;$ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif b/includes/tiny_mce/themes/advanced/docs/nn/images/insert_specchar_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..986fa51d3ccdc966896e9464e5559dd0257d354e GIT binary patch literal 10407 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 R^;na2S)27)FLDR~06Xz*j?Dl7 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/nn/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8b69ef02a40913b8a94c28f4df060c27f2859d2 GIT binary patch literal 7099 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/nn/index.htm b/includes/tiny_mce/themes/advanced/docs/nn/index.htm new file mode 100644 index 0000000..d3dc3f0 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/index.htm @@ -0,0 +1,27 @@ + + +Hjelp Index + + + + + + + + + +
+
+Klikk på lenkene nedanfor for å gå til dei ulike +hjelp-kapitlene. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm new file mode 100644 index 0000000..7a3678f --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/insert_anchor_button.htm @@ -0,0 +1,34 @@ + + +Lage/Redigere anker + + + + + + + + + + + +
+
+Denne funksjon åpner eit nytt vindauge lik det nedanfor.
+
+
+
+Dette vindauget har eit felt som man skal fylle i med eit unikt +navn, denne funksjon gjer det mulig å skape +ankerpunkter/bokmerker.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm new file mode 100644 index 0000000..5e262bb --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/insert_image_button.htm @@ -0,0 +1,71 @@ + + +Lage/Redigere bilde + + + + + + + + + + + +
+
+Funksjonen "Lage/Redigere bilde" åpner eit nytt vindauge som ser ut som +bildet nedanfor.
+
+
+
+I dette vindauget skriver du inn URL:en til bildet du vil lenke til +samt ein bildebeskrivelse, denne beskrivelsen kommer til å vises som ein alternativ +tekst til bildet.
+
+Feltforklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bildets URL URL/søkevei til bildet.
Bildets beskrivelseBildets beskrivelse, denne beskrivelsen kommer til å vises som ein + alternativ tekst til bildet.
DimensjonerBildets bredde og høgde.
JusteringBildets justering, kan vere anvendelig når man vil at + tekst skal flyte rundt bildet.
RammeBilderammens bredde.
Vertikalt tomrom Vertikalt tomrom , kan vere anvendelig når man vil + at tekst skal flyte rundt bildet.
Horisontalt tomromHorisontalt tomrom, kan vere anvendelig når man vil + at tekst skal flyte rundt bildet.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm new file mode 100644 index 0000000..fcda64e --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/insert_link_button.htm @@ -0,0 +1,33 @@ + + +Lage/Redigere lenke + + + + + + + + + + + +
+
+Denne funksjon åpner eit nytt vindauge lik det nedanfor.
+
+
+
+Dette vindauget har to felt, lenkens URL/addresse samt hvordan lenken +skal åpnes.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm new file mode 100644 index 0000000..4c4dfb3 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/insert_table_button.htm @@ -0,0 +1,72 @@ + + +Lage/Redigere tabell + + + + + + + + + + + +
+
+Lage tabell-knappen åpner et nytt vindauge, ved hjelp av +dette vindauget kan du lage tabeller.
+
+
+
+Feltforklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolonnerAntall kolonner i tabellen.
RaderAntall rader i tabellen.
CelleutfyllingAntall pixler utfylling i kvar celle.
CellemellomromAntall pixler mellomrom mellom cellene.
JusteringTabellens justering.
RammebreddeRammens bredde.
BreddeBredde i pixler.
HøgdeHøgde i pixler.
StilStilmal på tabellen.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/nn/style.css b/includes/tiny_mce/themes/advanced/docs/nn/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/nn/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/about.htm b/includes/tiny_mce/themes/advanced/docs/pl/about.htm new file mode 100644 index 0000000..394bb7d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/about.htm @@ -0,0 +1,33 @@ + + + + +O TinyMCE + + + + + + + + + + + +
+
+TinyMCE jest ma³ym edytorem WYSWIWYG dla przegl±darek internetowych takich jak MSIE +lub Mozilla, pozwalaj±cym na edytowanie zawarto¶ci strony HTML w sposób przyjazny dla +u¿ytkownika. Posiada szeref funkcji znanych z popularnych edytorów tekstu, wiêc powinien +byæ ³atwy w u¿yciu.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/pl/common_buttons.htm new file mode 100644 index 0000000..c928755 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/common_buttons.htm @@ -0,0 +1,164 @@ + + + + +Wa¿niejsze przyciski + + + + + + + + + + + +
+
+Poni¿ej znajduje siê krótki opis ka¿dego przycisku +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Pogrubienie tekstu.
Pochylenie tekstu.
Podkre¶lenie tekstu.
Przekre¶lenie tekstu.
Wyrównanie do lewej
Wy¶rodkowanie.
Wyrównanie do prawej.
Wyjustowanie.
Lista nieuporz±dkowana/lista punktów.
Lista uporz±dkowana/lista ponumerowana
Wysuniêcie/zmniejsz wciêcie.
Wciêcie/zwiêksz wciêcie.
Cofniêcie ostatnio wykonanej czynno¶ci
Ponowienie ostatnio wykonanej czynno¶ci
Wstawienie nowego ³±cza, przeczytaj wiêcej o tej funkcji sekcji Wstaw + ³±cze.
Usuniêcie ³±cz z zaznaczonej czê¶ci/usuniêcie wszystkich zaznaczonych ³±cz.
Wstawienie nowego zakotwiczenia, przeczytaj wiêcej o tej funkcji w sekcji Wstaw zakotwiczenie.
Wstawienie nowego zdjêcia, przeczytaj wiêcej o tej funkcji w sekcji Wstaw + zdjêcie.
Oczyszczenie kodu/usuniêcie niechcianeg formatowania. Ta funkcja jest pomocna kiedy + kopiujesz zawarto¶æ np. z worda.
Pokazanie tego okna pomocy.
Otwarcie edytora kodu HTML.
Wstawienie nowej tabeli 2x2 w bie¿±cej pozycji.
Wstawienie wiersza ponad aktualnie zaznaczonym.
Wstawienie wiersz poni¿ej aktualnie zaznaczonego.
Usuniêcie wiersza.
Wstawienie kolumny przed aktualnie zaznaczon±.
Wstawienie kolumny za aktualnie zaznaczon±.
Usuniêcie kolumny.
Wstawienie poziomej linii.
Usuniêcie formatowania z zaznaczonej czê¶ci.
Przekszta³cenie w indeks dolny.
Przekszta³cenie w indeks górny.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..c2e08332b6700db03ac9b17d746899737beaf762 GIT binary patch literal 5401 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 aKrH9Vm=9K~W> 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..b02e34edadfb9f7b66651d1a7d92b8aaadba0a3e GIT binary patch literal 7418 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/pl/index.htm b/includes/tiny_mce/themes/advanced/docs/pl/index.htm new file mode 100644 index 0000000..5ba989b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/index.htm @@ -0,0 +1,28 @@ + + + + +Spis pomocy + + + + + + + + + +
+
+Aby zobaczyæ poszczególne sekcje pomocy kliknij jeden z poni¿szych linków + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm new file mode 100644 index 0000000..3adfc24 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm @@ -0,0 +1,33 @@ + + + + +Przycisk "Wstaw zakotwiczenie" + + + + + + + + + +
+
+Ten przycisk otwiera nowe okno z funkcj± wstawienia/edycja zakotwiczenia.
+
+
+
+Jest tylko jedno pole w tym oknie, nale¿y tam wpisaæ nazwê punktu zakotwiczenia. Nale¿y pamiêtaæ, ¿e nazwa musi byæ +unikatowa, nie powtarzaj±ca siê. +

+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm new file mode 100644 index 0000000..f496579 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm @@ -0,0 +1,65 @@ + + + + +Przycisk "Wstaw zdjêcie" + + + + + + + + + +
+
+Przycisk "Wstaw zdjêcie" otwiera okno pokazane poni¿ej.
+
+
+
+Nale¿y podaæ adres URL lub scie¿kê dostêpu do zdjêcia które ma byæ wstawione i podaæ krótki opis +zdjêcia, jest on wy¶wietlany jako alternatyny tekstowy opis zdjêcia umieszczonego na stronie. +

+Opis pól:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adres URL lub ¶cie¿ka dostêpu do zdjêciaURL/scie¿ka dostêpu do zdjêcia.
Opis zdjêciaTekst opisuj±cy zdjêcia.
WymiaryD³ugo¶æ/szeroko¶æ zdjêcia .
WyrównanieWyrównanie zdjêcia, u¿yteczne przy zawijaniu tekstu wokó³ zdjêcia.
KrawêdzieGrubo¶æ krawêdzi.
Odstêp poziomyOdstêp poziomy, pomocne przy zawijaniu tesktu wokó³ zdjêcia.
Odstêp pionowyOdstêp pionowy, pomocne przy zawijaniu tesktu wokó³ zdjêcia.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm new file mode 100644 index 0000000..bca81c0 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm @@ -0,0 +1,35 @@ + + + + +Przycisk "Wstaw ³±cze" + + + + + + + + + + + +
+
+Ten przycisk otwiera nowe okno, pozwalaj±ce na wstawienie lub edytowanie ³±cza.
+
+
+
+S± dwa pola w tym oknie, pierwsze "Adres URL" jest adresem URL ³±cza +. "Cel" umo¿liwia ustalenie jak ³±cze ma byæ otwarte.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm new file mode 100644 index 0000000..70c8720 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm @@ -0,0 +1,73 @@ + + + + +Przycisk "Wstaw tabelê" + + + + + + + + + + + +
+
+Przycisk "Wstaw tabelê" otwiera okno pokazane poni¿ej. Mo¿na w ten sposób stworzyæ now± tabelê.
+
+
+
+Opis pól:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolumnyLiczba kolumn w tabeli.
WierszeLiczba wierszy w tabeli.
CellpaddingOdleg³o¶æ akapitu od krawêdzi komórki tabeli.
CellspacingSzeroko¶æ krawêdzi komórek tabeli.
WyrównanieWyrównanie tabeli.
KrawêdzieGrubo¶æ krawêdzi tabeli.
Szeroko¶æSzeroko¶æ tabeli w pikselach.
Wysoko¶æWysoko¶æ tabeli w pikselach.
KlasaStyl lub klasa CSS tabeli.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/pl/style.css b/includes/tiny_mce/themes/advanced/docs/pl/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/pl/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/about.htm b/includes/tiny_mce/themes/advanced/docs/sk/about.htm new file mode 100644 index 0000000..bffe540 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/about.htm @@ -0,0 +1,32 @@ + + +O TinyMCE + + + + + + + + + + + + +
+
+TinyMCE je malÜ WYSIWYG editor pre webovské prehliadačeᅵ ako sú MSIE nebo Mozilla, +ktorÜm je moşné upravovať obsah HTML omnoho jednoduchšie. Obsahuje beşné funkcie, +ktoré je moşné nájsť vo vÀčšine textovÜch editorov, preto by jeho pouşívanie nemalo +byť zloşité
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/sk/common_buttons.htm new file mode 100644 index 0000000..d432452 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/common_buttons.htm @@ -0,0 +1,170 @@ + + +Bᅵᅵtlaᅵtka + + + + + + + + + + + + +
+
+Nişšie je popísané kaşdé tlačitko. + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Kopíruje aktuálne vybranÜ obsah do schránky. (Ctrl+C)
Odstráni aktuálne vybranÜ obsah do schránky. (Ctrl+X)
Vloşí obsah schránky do okna editoru. (Ctrl+P)
Zhrubne text.
Naformatuje text kurzívou.
Podčiarkne text.
Preškrtne text.
Zarovná vğavo.
Zarovná na sted.
Zarovná vpravo.
Zarovná do bloku.
Zoznam s odráşkami.
ČíslovanÜ zoznam.
Predsadí/zníşi odsadenie
Odsadenie/zvÜši odsadenie
Vráti spÀť naposledy vykonanú akciu.
ObnovÜ poslednú akciu.
Vloşí novÜ odkaz, viac o tejto funkcií v častiVloşiť odkaz.
Zruši odkaz v aktuálnom vÜbere/odstráni všetky vybrané odkazy.
Vloşí novÜ obrázok, viac o tejto funkcii v častiVloşiť obrázok.
Vyčistí kód/odstráni nechcené formatovanie. Táto funkcia sa hodí keď kopírujete + obsah napríklad z kancelárskeho balíka.
Zobrazí túto nápovedu.
OtevorÜ editor s HTML zdrojom.
Do aktuálnej pozície vloşí novú 2x2 tabulku.
Pridá riadok pred akruálny.
Pridá riadok po aktuálny.
Odstráni riadok.
Pridá stĺpec pred aktuálny.
Pridá stĺpec za aktuálny.
Odstráni aktuálny stĺpec.
Pridá novÜ vodorovnÜ oddeğovač.
Odstráni z vÜberu formatovanie.
VytvorÜ z vybraného textu dolnÜ index.
VytvorÜ z vybreného textu hornÜ index.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png b/includes/tiny_mce/themes/advanced/docs/sk/images/insert_image_window.png new file mode 100644 index 0000000000000000000000000000000000000000..5d9ea983036b347646ccda7ac3f26723c4a3cf43 GIT binary patch literal 4799 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png b/includes/tiny_mce/themes/advanced/docs/sk/images/insert_link_window.png new file mode 100644 index 0000000000000000000000000000000000000000..94a0c2e5a4206226b83753c42c7dfe08bcb288a0 GIT binary patch literal 3833 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/sk/index.htm b/includes/tiny_mce/themes/advanced/docs/sk/index.htm new file mode 100644 index 0000000..da708a6 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/index.htm @@ -0,0 +1,26 @@ + + +Nᅵovᅵa + + + + + + + + + + +
+
+Kliknutím na odkaz zvolíte poşadovanú voğbu. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm new file mode 100644 index 0000000..2f5a1a5 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/insert_image_button.htm @@ -0,0 +1,66 @@ + + +Tlaᅵtko vloit obrᅵek + + + + + + + + + + + + +
+
+Tlačitko vloşiť obrázok otvorÜ následujúce okno.
+
+
+
+Iba vloşte URL obrázku, ktorÜ chcete pridať a zadajte jeho popis, ten bude +zobrazovanÜ ako alternatívny popisok obrázku.
+
+Popis poloÅŸiek:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
URL obrázkuURL/cesta k obrázku.
Popis obrázkuAlternatívny popis toho, co je na obrázku.
Rozmeryšírka/vÜška obrázku.
ZarovnávanieZarovnávanie obrázku, vhodné pre obtekanie obrázku textom.
RamčekHrúbka ramčeku.
Vertikálny okrajVertikálny okraj, vhodné pre zalomenie textu okolo obrázku.
Horizontálny okrajHorizontány okraj, vhodné pre zalomenie textu okolo obrázku.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm new file mode 100644 index 0000000..8a00a7c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/insert_link_button.htm @@ -0,0 +1,34 @@ + + +Tlaᅵtko vloit odkaz + + + + + + + + + + + + +
+
+Toto tlačitko otvorÜ nové okno s moşnosťou vloşiť/upraviť odkaz.
+
+
+
+V tomto okne sú dve poloşky. "URL odkazu" je adresa stráky, na +ktorú odkazujeme. "Cieğ" určuje, ako mÎşe byť odkazovaná stránka otvorená.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm new file mode 100644 index 0000000..9984739 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/insert_table_button.htm @@ -0,0 +1,68 @@ + + +Tlaᅵtko vloit tabulku + + + + + + + + + + + + +
+
+Tlačítko vloÅŸiÅ¥ tabuÄŸku otvorÜ následujúce okno, vňom mÃŽÅŸete definovaÅ¥ novú tabuÄŸku.
+
+
+
+Popis poloÅŸiek:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StĺpcePočet stĺpcov v tabuğke.
RiadkyPočet riadkov v tabuğke.
VnútornÜ okraj bunkyVnútornÜ okraj bunky.
VnútornÜ okraj tabuğkyᅵVnútornÜ okraj tabuğky.
ZarovnanieZarovnať tabuğky.
RiadokHrúbka riadku tabuğky.
ŠírkaŠírka tabuğky v pixelech.
VÜškakaVÜška tabuğky v pixelech.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sk/style.css b/includes/tiny_mce/themes/advanced/docs/sk/style.css new file mode 100644 index 0000000..59c464d --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sk/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: 0; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/about.htm b/includes/tiny_mce/themes/advanced/docs/sv/about.htm new file mode 100644 index 0000000..2468489 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/about.htm @@ -0,0 +1,32 @@ + + +About TinyMCE + + + + + + + + + + + +
+
+TinyMCE är en liten WYSIWYG-editor för webläsare som +MSIE och Mozilla vilken möjliggör för användare att redigera +HTML-innehåll på ett mer användarvänligt sätt. +Applikationen har funktioner som liknar dem man finner i vanliga ordbehandlare +och borde inte vara speciellt svårt att använda.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/sv/common_buttons.htm new file mode 100644 index 0000000..c785329 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/common_buttons.htm @@ -0,0 +1,163 @@ + + +Common buttons + + + + + + + + + + + +
+
+Nedan finner du en kort beskrivning av varje knapp/funktion.
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Fet text.
Kursiv text.
Understruken text.
Genomstruken text.
Rak vänstermarginal.
Centrera.
Rak högermarginal.
Raka marginaler.
Punktlista.
Numrerad lista
Minska indrag.
Öka utdrag.
Ångra senaste ändringen.
Gör om senaste ändringen.
Skapa/Redigera länk, läs mer om denna funktion i + kapitlet Skapa/Redigera länk.
Ta bort länkar från markerade länkar.
Skapa/Redigera ankare, lär mer om denna funktion i + kapitlet Skapa/Redigera ankare.
Skapa/Redigera bild, lär mer om denna funktion i + kapitlet Skapa/Redigera bild.
Rensa/Städa kåden. Denna funktion tar bort onödig + formatering. Bör användas när man t.ex. kopierar text + från Office-program.
Visad denna hjälp.
Öppnar en HTML-käkodseditor .
Skapar en ny tabell (2x2) .
Skapar en rad ovanför den nuvarande raden .
Skapar en rad under den nuvarande raden .
Tar bort en rad.
Skapar en kolumn före den nuvarande kolumnen.
Skapar en kolumn efter den nuvarande kolumnen.
Tar bort en kolumn.
Skapar en horisontell linje.
Tar bort formatering från markerat område.
Skapar nedsänkt text.
Skapar upphöjd text.
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..1c38437e26bcc84145d6a6e994ff1f0bdbbf0538 GIT binary patch literal 5229 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 CMam2S literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif b/includes/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..2a56e79c4d9f735f162fb69fb9b49ec05f17fc0d GIT binary patch literal 5767 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 F06XoAmZ<;$ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e8b69ef02a40913b8a94c28f4df060c27f2859d2 GIT binary patch literal 7099 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 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/sv/index.htm b/includes/tiny_mce/themes/advanced/docs/sv/index.htm new file mode 100644 index 0000000..35b4e50 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/index.htm @@ -0,0 +1,27 @@ + + +Help Index + + + + + + + + + +
+
+Klicka på länkarna nedan för att gå till olika +hjälp-kapitel. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm new file mode 100644 index 0000000..a43eedd --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm @@ -0,0 +1,34 @@ + + +Skapa/Redigera länk + + + + + + + + + + + +
+
+Denna funktion öppnar ett nytt fönster liknande det nedan.
+
+
+
+Detta fönster har ett fält som man skall fylla i med ett unik +namn, denna funktion gör det möjligt att skapa +ankarpunkter/bokmärken.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm new file mode 100644 index 0000000..bdf4c9b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm @@ -0,0 +1,71 @@ + + +Skapa/Redigera bild + + + + + + + + + + + +
+
+Funktionen "Skapa/Redigera bild" öppnar ett nytt fönster som ser ut som +bilden nedan.
+
+
+
+I detta fönster skriver du in URL:en till bilden du vill länka till +samt en bildbeskrivning, denna beskrivning kommer att visas som en alternativ +text till bilden.
+
+Fältförklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Bilderns URL URL/sökväg till bilden.
Bildens beskrivningBildens beskrivning, denna beskrivning kommer att visas som en + alternativ text till bilden.
DimensionerBildens bredd och höjd.
JusteringBildens justering, kan vara användbart när man vill att + text skall flyta runt bilden.
RamBildramens bredd.
Vertikalt tomrum Vertikalt tomrum , kan vara användbart när man vill + att text skall flyta runt bilden.
Horizontellt tomromHorisontellt tomrum, kan vara användbart när man vill + att text skall flyta runt bilden.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm new file mode 100644 index 0000000..d5790b6 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm @@ -0,0 +1,33 @@ + + +Skapa/Redigera länk + + + + + + + + + + + +
+
+Denna funktion öppnar ett nytt fönster liknande det nedan.
+
+
+
+Detta fönster har två fält länkens URL/adress samt hur länken +skall öppnas.
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm new file mode 100644 index 0000000..d2746c9 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm @@ -0,0 +1,72 @@ + + +Skapa/Redigera tabell + + + + + + + + + + + +
+
+Skapa tabell-knappen öppnar ett nytt fönster, med hjälp av +detta fönster kan du skapa tabeller.
+
+
+
+Fältförklaring:
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KolumnerAntal kolumner i tabellen.
RaderAntal rader i tabellen .
CellutfyllnadAntal pixlars utfyllnad i varje cell.
CellmellanrumAntal pixlars mellanrum mellan cellerna.
JusteringTabellens justering.
RambreddRamens bredd .
BreddBredd i pixlar.
HöjdHöjd i pixlar.
StilStilmall på tabellen.
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/sv/style.css b/includes/tiny_mce/themes/advanced/docs/sv/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/sv/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/about.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/about.htm new file mode 100644 index 0000000..c5a662f --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/about.htm @@ -0,0 +1,29 @@ + + +¹ØÓÚTinyMCE + + + + + + + + + + + + +
+
+TinyMCEÊÇÒ»ÖÖÊÊÓÃÓÚMSIEºÍMozillaµÈä¯ÀÀÆ÷µÄÇáÁ¿Œ¶ËùŒûŒŽËùµÃ±àŒ­Æ÷£¬ÒÔžüŒÓÓѺõķœÊœ¹©Óû§±àŒ­HTMLÄÚÈÝ¡£ËüŸßÓЎ󲿷ÖÎÄ×ÖŽŠÀíÆ÷Ëù³£ŒûµÄ¹ŠÄÜ£¬²¢ÇÒÒ×ÓÚʹÓá£
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm new file mode 100644 index 0000000..93ec412 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm @@ -0,0 +1,160 @@ + + +³£ÓðŽÅ¥ + + + + + + + + + + + + +
+
+ÒÔÏÂÊÇÿžö°ŽÅ¥µÄŒò¶Ì˵Ã÷ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ŽÖÌåÎÄ×ÖÑùÊœ
бÌåÎÄ×ÖÑùÊœ
Ï»®ÏßÎÄ×ÖÑùÊœ
ÉŸ³ýÏßÎÄ×ÖÑùÊœ
×ó¶ÔÆë
ŸÓÖÐ¶ÔÆë
ÓÒ¶ÔÆë
Áœ¶Ë¶ÔÆë
ÎÞÐòÁбí
ÓÐÐòÁбí
ŒõÉÙËõœøÁ¿
ÔöŒÓËõœøÁ¿
³·ÏûÉÏÒ»²Ù×÷
ÖØ×öÉÏÒ»²Ù×÷
²åÈëÐÂÁŽœÓ£¬µã»÷ ²åÈëÁŽœÓ°ŽÅ¥ ÕœÚÒԲ鿎žü¶àÄÚÈÝ¡£
ÉŸ³ýµ±Ç°Ñ¡¶šµÄÁŽœÓ/ÒÆ³ýÈ«²¿Ñ¡¶šµÄÁŽœÓ
²åÈëÐÂêµã£¬µã»÷ ²åÈëêµã°ŽÅ¥ ÕœÚÒԲ鿎žü¶àÄÚÈÝ¡£
²åÈëÐÂÍŒÏñ£¬µã»÷ ²åÈëÍŒÏñ°ŽÅ¥ ÕœÚÒԲ鿎žü¶àÄÚÈÝ¡£
ÇåÀíŽúÂë/Çå³ýËùÓв»ÐèÒªµÄžñÊœ¡£ŽË¹ŠÄÜÔÚÄãŽÓofficeµÈ²úÆ·ÖОŽÖÆÄÚÈÝœøÀ޵ÄʱºòÌØ±ðÓÐÓá£
ÏÔÊŸŽË°ïÖúް¿Ú
Žò¿ªHTMLŽúÂë±àŒ­Æ÷
ÔÚµ±Ç°Î»ÖòåÈëÒ»ÕÅ2¡Á2µÄ±ížñ
ÔÚµ±Ç°ÐеÄÇ°Ãæ²åÈëÐÂÐÐ
ÔÚµ±Ç°ÐеĺóÃæ²åÈëÐÂÐÐ
ÉŸ³ýµ±Ç°ÐÐ
ÔÚµ±Ç°ÁеÄÇ°Ãæ²åÈëÐÂÁÐ
ÔÚµ±Ç°ÁеĺóÃæ²åÈëÐÂÁÐ
ÉŸ³ýµ±Ç°ÁÐ
²åÈëˮƜÏß
ÒÆ³ýËùÑ¡ÎÄ×ֵĞñÊœ
œ«ËùÑ¡ÎÄ×Ö×öΪϱê
œ«ËùÑ¡ÎÄ×Ö×öΪÉϱê
+
+
+ + + + + + + + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif b/includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b676e5167e07a7bd8e164030b71ec51fc64d5d6 GIT binary patch literal 7560 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 E0B=V|7ytkO literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif b/includes/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif new file mode 100644 index 0000000000000000000000000000000000000000..e9d114b0388cb2ac534ab2ff756d1261fc2d694a GIT binary patch literal 19062 zcmV)bK&ih+Nk%v~VN?O{0OkMy1OfyEf&>I+oP>e|L_$QI&ddY?garNsL}HwTf`kNS z%nTxIWP-HR(#&*rbcCYJBtnEVGBjkGoK$k8G*XO=vfTXsoD?#2#KOdEj=VH7WK3$L zEJ}oQmc(3otUOwjl)B^`I((eM>g;@;%mgx=q{{64`t(FzoJ?k%Y>K>G zcC0*Bl$5gE95QrtlEgGljC`8R6e?`Ynq*W~R0PiaoSK|8X3S)UwEWJTgr?LiLWERy ztTa}XY?8!OZlo+ujC7jBTz<4XUX+}=?A&fl(yU)Hgps&bOZ(j z1cHQ|nq&k5{6uD)gocC+CT!&9)MS3Ngrd|`a;!8`l+4b|Y>vcCZlo+qj9hxOe4@;x z%JlsH{7hz~6e@IFUR-4U{4{3#WQM#fMuc>l%sgJ4oWA5FK76Fc?2NA5^z!sHGR%~= z41ejE#*wz5@MI(M@-$BO_)ahv{BsxnP3ANSF^6D?BOyX83DJh3!Zr{fLV(Z%LK=$@ zyjb*-hJzQ69=*sAB0~m+l3FOFq`>lr3koh=xcuPagUt^ra28Qf1i?-OK!J`yFs102 zDJwRN*}$~vhAu&%Le0`;LKdr5TlmoGVXKcX9>99=K%^`KvqTuEMYEOx8Zz%uq9A#*D@$B1<*_21{iyJit77z@sw{5Y0|$N_;ea8Qy+B*~zKNe;dw;SV2BSkp~6t-;fV2&fQLP)H$g)KMEG#Z(th z1+hU?K~R;&ixc>eg%32+$dy=Om30MKL|l>9k8Ba~R$MH&#exoVT_eTEtdZ=|VaYj3#L+HA4ahTCp*`o_kc!VPyE z8^|4}oEs=Cw_J47p5wKK#7*&p-7gln_Gs zF|^+j09Hg1MjTiq;DKq#;Dt!DHh9uWGQ6~sgfP|Qt4%otyOW0>BCvvpQyi7lQckUS zqEuZ_6@*nVW}(%!TZIJ{SUUFDqgvpyVNM_Hq@gFpis%XdQd20kfhSF=*hMPSX5q<; z)~YhrSaDwg_Z8r_#a7*N^3cMyZuaOfI=G3|0*hylbL(awil(FWdKoF{vMhu-{s4ZLv8sITN?P`~T zGbkYiTfl(>SY`@&c!CTyqZxYc;RzV9=K?#Ej~IToic=8{Y0dM5fHJbQS;^pOB9WRZ zu4Xlt%;Z8`6P60V2fh`MVnnOx0#sHMmG`{}Z7rCQ+Q8z8FZeNTub3N=jC8jE-eoTt z_=_T=WSGFkYcY>8!Ql?qr3Y3fUp!#kXF?OX$f*hcavp3`!7LX-IVfy5OmJA8@T4a< zgzh*ND;;!D*8l(j0EV@^<)U79!v;*s90rg;0pbt`GbjKKDNsTQf@p(Dt>YEG!w2w$ zw~v5K@pz;-0?-=L2L3qj6BN-R^rGhqsZmcAKfqp0wnmd+b#GX(SV6Kp!L0L%;Y2}r z-zsdhl~s_%6ZR8BT0C(Ux47jkMzULy(1n-2ED}nAab#fq6hm2gMN*QJnV@CDG$sp*Ml_#XO`AkX(ibQ!rK;@Q=knxA5g-AU$`L`Jm}5Fx zTEmt#m7y~L1-k~k@RttQ!5MbA!x9+vsF6~tE6}4UQcQKK#B0I@toe$fiGg{aIGPv& zM9x=Ct*oTT8cf)l#C0N0zNHs?)WF`h4FY#t#fTAa+3LmQ$1goDw$P${@ z&2Nfxi(e&$te*D8RFJWZG9kqWw7j7rgl(Sg4Rea5Vnt#h;t?r-Ou^i@@m;U?SPYNWthiF^XY~MKLQGFho$JoWabPDtwyKY>;3B zTl5D@I>OxW<~JYKQ^j7%!Z5TD1<>#`0HkqK7W1;j1BinLTAgZF!y3m)rS%b4E`}xI zTF7GX)HQt;0wi0vAz8#?S1)p)WP_2)3i|Fjt0so5y@b5m>t3+n8ou<>)hKTKM2hr^ z*Y{ZkZ8P$LDaN8-ftp*OtMIR!iB!lX>8)=Cgc7_S+2_Wn!NKDy|WfQtui4mhJtlo z6%b1(*Ivr_?0L@>c_LbNbYFdaFadJA0^RpJY+K@jB)k1D-iVxcy9hI-J*%Mu3*Hjq z{EY<(Yi7csIdtAdI?~IHFoX>!{0JddY2TpGIEcqWfHF&skW(v0YUdCKj#2_*00%~O zT*#$krcfU906f!#4^RYTsAoL%@p`W(Yzfh15#eMLF?$1|5kB`3Rfc;eQ9Y^PY&LNr zXv95V!*n0=Mx;>xB2DppVybz<;!K0pLQNCaQ^b*W%b+$U#aR~L0*V2N~K z2DEm3=4bP=eqJI$m7!6cb$9YNIR(QSt6_im*KoOELckF*5;tO_11K%T92rLqbXbSf zKtrSU3|r7Buoi26$a&4wGU8D)gvcJ2@52(iv{15_-C@P}TO|8ceO*U*0&?=XB zi3b7_3Bmyi(jd0N64;|oz=uZNBW*n46HUinLHK=sfg1xT_G?K2$_(}Lx~LuAeab|o_LrN$pI6& zn2SmO0YZ>Y&lZ_KFqxBC1Qb#Pn3!^6l5gp{|9Ofw<=y`zTunuyf|8PJTu8Jt4^1TBi3$f=w%+MLY!oX|P{ zozhtW)LET83LCItmFU=EEOmHZSpXt-F-V#y1u&k8(xgs$C=EabUyG9;#HTBcf>rE40ea+;=cnvZV^r+8|ndFrKh z%BOewr+yl!eLARnTBv~9rFY7wit43wdJW@%9ZH}C4(Nc&B&n5JV{mY(mRe(+YN?cJ zsmhe8ks7L)TB(|fsU?u9rJAa%N~x_Xsi|72lZ}}Vs?6H1*;=ih+N%ni zu^U^j@OrS^im?aVvKhOr5R0$;dap0bu?_I3&|tI1IFy09k;tlj#r#j2?^E3?*GwAgC2(0Z(4>#@~ZvnTtsVcW85 zE3gggvFR$ZM=Pwx+O;eDv?lAVl{&B3fwp*ivM-yrty;K(YqSh&T>eV`vY*PgtZJ|R z3aw46xSdM2!TPFAOSTAGu0}hlom#3f3$s*((P-#W4#OR~fowR~H%j|;U)8@m|$ zs`%Qjge$liYq<8>tg0Ko>T0%JJH8<7zaxyXUyH&moVvrSvG@!BwsTv$z6-pNDz)|6 z!y+rYsVl?&YD=8@X+rx1L@d0-YfF`y#7XR}NQ_%0@WedqzEcbUpF65fjKv;YwpBZ| z&5OVDd#>Z#yXh;!v%9O1i?Wd0uNND*{42M_d%Pq(zxc|$cdV)ZE2W*V1##=bbbGJ+ z>$S@&x6k@%xTUQR%*5fVOib*^007Ch^aPK4#Y%w4Pq4XHjL4rx$&f6`OiZpm8^mIp z$EN$kB}>9W?6Ao?w1```ntQ@2>$d!=x}6KU_Z!D)JjX>#yj`oaJlg;qoVw_%zF`c< z`Wv}Xyv5*}tV!&ysmjQg%*jODuta>#TpYg{3&~kb%{BJ_%na+jD2&E#oW|yh!<8Gt zf4sGxYr@NV%vRjSrJS;5+pn~YyF#qB>x!%d3&0IP!K*9CbnC7MoX+WNyVN|%4{XT` zt*Vz-#76wcr2A=+`pA+C%ACxs3C*<4E6~SlzNbsOvs}K^ip*Nux(bY};Csud9Ji&+ z%A@#j0Qz^E&*;k>zh z%f|t1yirZcQG3sgY|RO6(Mc`MxGK?`oY2z@%2S;G$pw4Je|>p~P0>NC#`!F|xQy0? zi@3$iymlPN0z0j(E51rx!m8Y`7W>)MOU5;Ax-{L^zZ|PN+_PuBx4T=vW4+hu%G6Dr z+f57A;9AXro!in3&PP4AZSB-ajN4pX)lmDzb&IyniozZH)meS2y&TSfe7)(+yJ-#G zi>t^uOWHl{&gL7qr|Z9atcSQ7+a_JHjcc($+qn1I*rsYrnJUo^9m$t!*iDSz-YVDu zyW33sY4;uAh#bbzi@LSl(xYw9W=p=fY}=0Ox>sAnp-s$iYqeVo(&!4h<2>7E+`l*- zyj^U}g*>--Jjk3{*jH@HpIoU(Y^}ci+eH2U1e6R1*bLk%Jgm$7&0O5HFAmjf%-rqF z&J?TG(XGmbEYtNn+J~Fn@4MX*Zs2yi)uxTJ$h+PF9oFalw_W|ysrkgX4W$Z1ZhRD9-W&d3kF<}6L)n@q`oeb{o|=Gj}ticG^t9@h+xzOB8s9qiKZ z`q?iW#uo101Wm&&Ji=sc%&Tq1Anx9;EzGS<$n@Ocb)3JwOS&{Z>XD48G_C}vzSDMo z*bRH?W}fChTdbpQsjL3LvpVaUYUZ%&>ZD%dY)j$woVFZZ%(iRg=1tw=e6#y()`RQO z9__xo>)gy8+WZ^q2At)<{=0Vl&j1Vm=*g_WHT|`@T;%Xg$fLXJ`^(FG&C)R}#xC5p zNiON$9o>Jv;FGTGzDvHae7;~z!zta&J599;EXxjF@K&qtmCnKg{i&J0%}Y+{mW{jQ zExy%lz#7cew0qWtUhENmv&ZYo=1#ZJ`^Sb`>@ZEwQtiLCp18gXvm3nO?u_mGjMSh# z=q5hb*Dmp1i>m%yxzsDp6R*~_?D3+_()dg0dEMS%ZRw?**MFYD>8h`ytn~8Cu4c{I zrv2@|jMu;3#hokV=S=45YJbsN zzp@)Y-IaX77w)}S>(d-x!}m-7zm;vy_sg1f&Ls99o}xac^!Xb4F;NqYJSs!HjpTG|QgnaN6c$rx&h zC)GHy&>+@uikSWE zUE4hysZD&_3M{;CPdf@)*x!ij-Xvy-bP;5>4IHvo?wsvY=T4hLXWk65%Z7>(zh$Fr zwL2&eq%K7OzcGZ?5mTj#qE^mArK$lHb7Ho<+jWf9x_=1+<^mWglsrfjfe!Qt>(aEP z`5cZM3U#E$pt+c z$!`x~8rvF{rL$PH?CI=Axa7Zr(!gC~R3et-LX#s?zHFJ7uZxG@{Vj@#VPT5bqLB`` zk@3rBmRnbTjoD=X$9rwF^2GMlWw=N(Y1%Zq31@9hU7w+@nyi}2;*Q-WY^aWQXqeWH zTEA}HEY8ODbXF8txMM%f5i@=_OjP+orP$kJ?`l5TY~j#?OZO=s(%o};n@t`3pL3)E z){KAF6b4Z=_KEUXNGzq|kYlJ!XbOcEGQ`&_^EE^bXex~*8c8{w7MgKil_z0^Dqc9@ zRL6yP-h)^b1C&-V&BUK<2M#ygVO_ykj6qas1fW9jI0oHu8h!|e0|`6{Wt37*Nu`tz zBB{(y*tnvVZYAzUWJVS;7MNB|R*7bsP*ULl6-&AE;b}!#R90smj#CbQzr3^>XcQ#} zXG(4X=o*p#$^{1@lW?sUmn2k(0coU?PD*K|k|sc?I7?>IlyLdPxy?L9?nzsKRYmit zrK+xaDJMV1_tAiV61a<*hV+&rSGv+jU#ZPqve!|R4P?z;1}$V>vfja$0ISZb>gItb zrBW+C!#w1iW=+MF9)z7LSVFVUjw>k@oD$n3adWO)--`_RZ*lp#(fh#&NAvk1X{?IjBs6;)XvBuu`8*sn^cWhKU;VG-wU?i99thwE0 zYj3*$5W)DFMIc|-@6dj^IN{PvubM#3>UOv8wmw0(XHf9wmDA0k#)y!Xf_n7`(HlvshD+4ricdg$Surx6{pK@lfmg$a3xFeb%A}2p@6f!=9 z`9&UqxV;V{>0I?8q9yB*8n|^LW;WrHX!6$!1*R-8kpP-0E9W!WO@k;FQDBxpw6u%` zaCrII5=%a{Av%q%AV?FKB_4=M8J3`lK`E9cV!6k!32}dHxy{k+G?sXTQBMv3I+zPT zcgfI&E)j;fpDMLBLHbd|kO-s4at6bs5-2R098^#N-96wa`;MOI!B>@0xKyRbb+vp%Vnx0IIl%!#!q$L@rJ9zqqV1roOV`kNt zR?5nwAyuO{1@VNa;?R0IS*#%-+hr~mX8KuH!0E-EEZL{v5{6RlCI6l~%! zD@avZDFK6E4Prd_0;{qj5P8>#+pQJ~tc3ECdEX2f3amuCtUl^2+9|BZ} z$2%hOW~RJA5{XQ>v1N|}nJg-jR8kJ02WJlkT3vD^rxPuz`Pilwv~ot9KdB=^Nr*PC zs%Dab>g~-O764{8C^AvY2)@to<;^GJT#kf@o~%SYUFg-1nOto zmDR?uwn8pj(9Go0#m8z2d%}%W_wZ%e8I>hxic*q;h8W+F5KOYObd!AOW?lVyW=;cj zs8J2I5~QKkIh1@HR<>0}zgIzXu`m+Ph==l&9+imG3k20s*|VY* zs?b0Oks}xrd~Cr03uR(jR-FcWukcy9!ErgTiTs?|%hqwpqk7zIans06r_`rU{zfB7 zY{GUCWl@syKh^bL8ix6({NPA@Da!ZeMlN%(l;8NiQvyG;ETo|L) z4CdMXuiLZ;;DxV-RP+cpF9F?Hy7_IeL=Us6DjnpLUwNw$dh{eiM<2ml`p;}Gx`T4v zTo#7=S3Z`Jl5-`rK;0op}#aeAynwsz{6N^GMjeQa(|dXtj>wV!&;mTB+tFYQlnO!crq-ThJC}>h&$; z@i6w*8Wg8mO4EWpxF&7#PAJxB-)1}$(^^U(a}y&z>XS(~mor6@gO4y`79>K|&}hgd zS98@~!?S3Ll~jw@boO>;%(ZF@rwq%cYy1`eRvh>u704@&Gc`uBNgL=OJaUEX$8uP9 zV(eiO4Iv_#Hebh=W}?+zPE%~k(rED1ee=;bf%S3M*H@UOhC%df9H%H{m4B7h4)E7) zi#BKo^@$M13U*^R4beaiRUlhbPIL1T(FIT^vm4Kai4PZs?6F&lU`l%PFB|hbeUme; zI7?#nW@aZ(yRu|w#SGlVcB*!TAGj+L13}MoL(iiz(Q|KJ_I9791d}K{Sadw;r9Wf@ zB3q>%`qCk$G($O;GKIj6n?qTZ$Xl|ee>=h_h(>4Bv?S=2EKXQWc@i9Qwh zYp|A&pTLz8lt>NKF@;b;0g{p37+bmoXh{)B5$0D5G?L9HWE#3H>rVjyZO+ zHk|DwSN`aiRp?#VcO!TqhAf1Po^*Dthg;G!l+c4tO%yqPc|C%df|5X)OhX0eBq5k7 zgmBh@w&p;I1VwISO3*iFQxu;i<6lqLYJWptgqA$hcaP_@oXA;^2X%9|*;X(GQ(@tp zvvWwf^P7OOZCa($&FZsC(9 zAbb>ZhgpPeU^hAq!7~{nRW?OTM3X}mbQH7bLF_l63p1Zg=_BaEZU%Qek$6+OV?7wd zR;Wl!^%14yGNssyHB34|DbW^wrds3lXJdB&FP_m>Zm zc=XVtm2`&k<%YJXa$}+{NA@YemY72&BqN5a&oZUE7npLmr^42xrJ8W35{~xeA`VcK zWy*C@+_ht)!uxFtf?dPeROxYjx-8Zxg?M^E&&UO5RkFsMSD@n3yrwuEUO z;dh^(*K^;MW`l`DnRz`iLT#hAv}@U70+A>@H+SUGY*H5%2bkNo|u7ZgvQFpPzkw3||JQO$?>}{4vt}>Ue zayu_sdR=Vxoznt1`Qm1(8Ijw8f9pYDRtv)~EW=FOTAPtm0r$A`27Q^ydOeJWg?V-0 zBZg~BTP}N_1q>PmSB1wVG7*e0K~i5UyJKEAkq;6q(1)54sKtH9#rSg_vZo#+*t_E! zagIp;Y=>ZYVr;ESXLimsi!u2yf?#cT#IBGFoSVWSkF~yK5_oGyuZXIgj!S*#N63Yo z3>V^VB$8H=*Ecw*lX8TAwkOG>=UGV1tFE@ULFf)j+$+5XgK$bCTk&&bk-caGdl+|p z=@%9g5*e-R%C8K|u`J88?8;7SstYKFYw06)gn5LTy@OoH!qP`UxQ=XVqovyw9=w2~ zbdAI2a}r2Usko!w@==IKV5>j{39y1b$j#lX&EM=K;SA2>+$@=yVhJ*i%d48$M`>KF z#fk%38N98Qh|H-Vd}SEA19vn~c_i#3n`mqn#+rd0xOt?J5#>Mt39Zlz&Cm_)&<_p& z(Ge}t3w;g&4Hd2Ruq!rQ_Xi`}?9FJBVfe{q?whJ@Y{kh;l{LI)c&1o9XFPUBFQg~I z6n8lgdd`+G6E!J34Zzbq?bAO^6IduMAWRCaYfQH_AK|(%u&BB8{Bd;_Jr+yKmHD<(Jdc3{CF<)G7>a}Fth)@hyAkdguk5CP{fniW=Ylg4)c*lfVC zuT4|1HkW|a+}AOT(sgDaEPN9;s;v= zJe>eRjbcwM*#P;RlS4W22nl)3Doibl_SzYq#g1dM zMk+ZK`P*%@y$4MIdQ>}vNA{TWEQbmo0RHW3Hu7g$C8uUA|gxndV-&=^;4X_1U;NL&p z+2`<6=hX~_^gQReHC+0$W4j7 zEWAU=m*)hWjWov_4#(G=O@T~7s^mr{aW!5P--u+217lNSQQy6d-;}cd+-8jq4M2@O zJ>X)1U#7-0z7Ri?F;UVham*9#;2dBXuiO z2s+P!O-+Dj(n;lo+V~$pQ&r-`R)Zl`hkjL@V2vOnARZLv$F1C$-d_EU<{4AtoJ{~* zz~K6J!Z)#pR8D z<)w6?z6@C{F5|{s>G{3v&F#|w;L`xU=CuTBSH7MX^`hdWxD4t4?cL}wFe?)HS~o z1$I;4Bur4HMhc$Z@*=JK9Z9-!9Q4VC<6XJsF4gDW9baO<+Lt;MYzo$BLzFP$N6Al+ z@a0eRKG0J`0(14UaR~ZO=8*K_|AXfxgV_Ln<2{Yzo?W6s&hU;{-DlNN&-n1}n0aRg zhIf{nDy5prtQ@|wpl<1t5~dR?+D&&k_D}^^QDqA&iYStQfsWGh_YLz#e(6L{QZ(<} zoh|K3m|XXBq$`?HH--9=zmLH1;A5_rX2^kYHgKEC^sz1fGx&UPyY#$Rmu|)C(tIdv z#A~~{f<2k<@BMB?Yfml>K;!@Y_B9UO&=h(ncH6z$(zJlut8$Z8C%l$RFROX+REc2T z;lz%%iYFL#O&-E}xOfGApu*Ymmc1|yKqYPRB={fgY;JRSmTi~}2udYNN^paNg(Yx= ziBw{bkdcy;l#vM~hlYfTg@T=#iJzT|gNvJ*gruT~gAG&!4Pp(4shyssqKm4kh>VJy znx&b;qqwM^jGMQkx4N{UxU|kn2?Ukb*xA~V1l``>;ILxSzk;Tr=f<9-hR)N)zU>a% z^paGz%*wmIxy!ug?GT}Ir=)=caSc+@0=B9lyJGGClJ(kGiytRo7&V#F1&tZQf%+8s zqOzr=$&)Bks$9vkrOT9JHum~-?3XD}<|Oj#nCP4mDpVW*6$&(H(V|3+B0Wl!7%`3J zqS3Uat{kI*&sx2TH7h4aWmP>|Ocqrp)nE~QB3rv_q1ay1qQWa%uddy@mE`us)$^>a znou#;I+phDTD`~~hKhI9u*h0c!A_f~7i2_(2pig@nzI=?ntb(gswjDL+PDHOa*Q~2 z)mKnB6ZcC!`jo%C8~ab=ag-d?P@@I|>+(b|Tp3SRBN$h0Di z3!I^H?7BTy6jm1B&UI7Sd4GnuTsq~UH9jZ*A5h=LW5HQRpN?F)c+(;AcNJ}qp%)-Q zkS%7FFsLlJPJDl*7FA$sb06ihyx*_4rM$ldhadTM=?B6JN# zG~8xRorX_Uf!Vm*Z#prg+b~$=B+zI+3K`FgF=mxyeYP$1+l3%@wquII!QskwiNST4 zWycN3R!8M{r_)Y6j>r*vsP*NRVC?}0mz$0G;~RU`@w3lv<-LcPPlS1CpKL>hxYuog z7D|?kj$Jn-igKOlm4v8ZwqbK0xwp)VOinhKVL%!~qgaks3aV^hwFMAgP<^Iqj6%LP z7$^bp=$mb-sRN^-(Lo3jE2k!d->)y3v8BD zV(MF*NC={wZg$9LuRZejL{nyO$4yBsNI4yx5SR`V+4I;)zr(A|n0z9!`lPJ}^zyak zlmK3MU4pN-_G({(1eYszG3jv!^xjDsmmg6#RR3Jn1QjCp6{D6ua|r%f}n<%BS@OC_L@ znk5yaG#tvO`hl^f71O3fA<@my1aMK#wBHp=*by|Ev=`OXxW)q@&kt_P{C1QG2gD#z(3jfzfL5`vdJ z2YE<@4stRH zwU=NGtJcE*_#^?Q45CQ2M}E}lr;4qy8S!C76hA3Q;C8h@$HA;A|Cyr!-Vrp0r5?Os z=~{PS^q{MQ?UWkIRg?bIy>&h5AQagT%4QT>TTHGcVk4eeGQ*jQJCa#|`OA_*mcYbt ztdvr#Uz*zXyu}HqdY4L0+8PNuzGB*9tJc(KD3ZR_1+htUi5`ZswLHr!)kU-`Nh%yx z#TnKY0-rS;89EdIPslM*5$p*ZLzWRNO`|4Q{Kme*3yA5RRT2F{*ziE)a`1Z6TLf5$ z9OHPtI(Dd*bLDZau;1ZL(JjHOiq%qStZA2RqlC6 zlJ4O@1BM&ib;+t>$xvo^lei+fwsOUq7>zCKN6XPJK{IR3I`F(rGvDt+ETXk{Qw`vB z<+U}b=5=PV`6l|kmcv?NP#%d1>!v1oan)1VMG3twwlb_H*Pcg%C+h8&^2TXNE;j-> zBkYUuMHpxu_e8PN8zG{4vk-holXqr2bt5ahGNkfT=hWSUQiM9yI*L+;qVS|NT;U5p zO4DAw)xlj0w^1^#%UIoPfH3^yOJT~xLGJLT$Wev_tKhZ2tBF7>ip?1Fb_BDXv~9=# zT-c@=BJ>)0o*(@cCm)^9^Pr|5vJTX+#np^X<0PtjC&yvz#$TLb{=b(4j+MPy)Lix* zSwRVQVLZ`XYzBTk^;xpMMYYhGWX1MeTXdP@5hktv{ZOI*O{{wacG9Wlbz}SPp0(y2 zxTO_l%%Lr++p)|j|JB;Jw0W^hbRM_W?P#hI?&s1eA>TIN(ay8xcM8hszDo2eVWz6+ zf5ebRp9sNqB*^#(H~U+2ece9tCbUP&^i3Jw)d40p&tyiPjTgTyPD8WulMkbH zJNJ&Yj&;!aT=Os{43q2JPbL*zQPh&fQtr;qY!k05*x|Z&+J0%-Y4^XI0~S92$bX6$ zr$>Jm)_?v6vK1z7m>hLlJ?<8DKkIQjoPlkW0a~gfc@YL!FhpvL(PS7VYuy)p-!d;x@C^fpBtS#^EY0m~KIIPve0uDU&8QH*}X2 zBrfM!0hKK2XKf^ufWF5@vNL@wG7-a}DWbE4qtk>-h%FWoKU#8nTVh4zLqEp#B8SF; z05OCOgF6+pbCm=@j{$*ea&vw)aXo`rSA!@2kwf1zD^GViZ&QbMc!zMq3t__^;wM|; zXF!6-L<~5E%|s5=rX>WI091td2+~K4N^0= zuz#XBilkVIrg(~|NQ&oSTAL6q5+;c_mvu9!dRHelpCwr*QadCF9(MfjncS{VlWnq#wOnuaIwT$ zh**O)PO z`3)r-xIpXnxD_Jwj6; zaD{#sX?Ph)iF7hvdUHP1ahEC>8SA7I&U6tw)=N1AANIF;N>+X5(2`!+LtG(~kO`C3 zkdqoTlyU=yvIdkz`Fs1ZNm558S@JU3$zFA0>u$#WQLXX-1044#SGHI6M08sv7jOP|U za|C4y6IyZQc&vAnqUn94$vPI+QHaxQvMGq@;|l}^U#y@=71Wa}r$?Hk2)9`e>Y1L8 zFjs^0o54ww!U>baIa%PvZbWz>6W3~~_GJkYH9jbgaszomGl~0led3j$iiJ2#rwLz0 zUnivmqeX@jDo$J28RuCSy(tDux}M1Nn4u)1^f_bsSD4r1hTn!J>ysXO^j~iXnt`&3 zv?GA*;BqD`rHJP&X|^!xGM#@C zO}*q}o+M(%6s-BeqoRA3s!zm7M>6T%NApX~j zu7`~O0bqfYMcu`W*kyAqW1Xv}jCOW98rNoOGG9W9VnO_`!KR3B7#?rvNxJu>WElkTY-m`lZa0h2rhAWSlmg0o~Q&mi?*tIt=r0{+S)+C z`4YrwMY_lzsCS|TVmQ0_Zb1a2Db{`J#HsrEe5$q~a-@PUx`9^;Fej^KOQmZK=#Ff< zMWx!9m`jb~a39Kuu`HLGdvu9tXP8XIgWJitdseV%cR^D%E&g|XAC#sd%V~3$CZp7k z?6Z-qPz}DjLJ8Rol!+}@IC&m>G%m9Lnh;ZK!xvep3xc(1fZ@aw9QBaDho1r`y1XhQ zQA-#r`J#0CS&BdsFOk3syub|X5-}k*pGtTvpNM0cp=nuJ z`FGe`K=+wzP;#zFSe|s+7USEP73DBD_(C;0jO_HjB{^0!Lw2}3mtU4Y)RMmnI&cw$ zZ%oA;q4%7`B7c}BOf}5IEwXlorkocDY-{*^8+&dH$bE!(T2J?@0+vRxStHp&IbQ6% zM%hFvNjo5nyYKgfVkc!N`kZ_xe;(X?Pg%I8a=MEq#fxWd??5Qi>UI@+P%N8+h6crL zh_o6Dg<-Zir}DQ^L$-O78U8~5xLM1zx)+zrBeEvRUum;@$T@-DqO0olg7||UXNIPI z=73EbZP97OyJ#Lx0bLz5Gyn`l6s*PjN*hc$Rp;``O1Y7MNFq7MCx(^}l#(gc*1Xxr zx9IA$OdEst*gN;AnB0dUz*?N_ODLPxYOcpAL)Rm2l}>+qys-8RH%gHqNuavsqJ8L} zQj>Xbr-q`U7}2$#BA{c_MyeDW1HY~$a#@8!Eq;*RshZig=rfFM^ zHWq8w%mOyHH^d;gTrTqQDPk4UhuKKq6s*JtNQ_6)5OTA>#%FRAh6a^rmb201Qq%C3 zoz5JF1hkj4^NW>QUY17xq{dpOZ;FUUdDMtF$-CD~qzBUtlW787m)D2B7CO7?MzH~lx_bzrmNXhP~mW~@>@hZI1 zR3wTWezD}Ymnn|F3Zo~>36^cy4q#sFdXlZz9VAj=gUd2fiI~odj;OLj`qe#nm&ac7 z#6-u3Fvr3o&C}yKs_u5FhP$`g%iGB{YC5`!fvitcrp}d$aJIZ$*IcVp4F^Z1t>C)0 zd^!o5r4BM(%k)bB#4LJN#k<*X`C|XLXZbnQ4H}r5piQAf3F2Me4i+mUEWynDd~4PU z^a+Wq=9w!whWKof(2cFDx}N^+Pj87MyDf|2c~6w_gU9_fD5hKgm#*SPcBu`Uk@TVa zP2S&H-e$HmOdYAP1I`>x2wQOAjL|+D2T~S|Z_}XP;Ci_YJK>KIM@`dT5tu$;#-gP1 z!;V*^g=14bqnTplT19?IC*GSYzNZY!O;fXguqnu(HLJ={;}Jlt$48VZngJjR-}Q8e zOlt8KGaPG)`TdjM$ccrf}tl{_R*^>*n2WhS{JYJlr_S zEc9tkg{?K~%P7QGY{5`U9tz>AdJSd<;Q#6I1=EB(aW+Js05L|ArccSgKjK&2im!OOm6=0{Y~;*PC;c9Y)fw# z?N=N46?(SJkf;3g7F5Q^C&qAv^`cQn@$T*Y{qQ9p@oIwd0K7>2r|)(r2ozi9DQmh} z4|=E__$IF9hz{hlp6LC?&-rLyM?Os*6^yr{_;x?RHVoi3Kb<*u#U&I`*6Q==$>Iv) z;zi7dLYDUKj`TL(g#hMVWk1_k;~{O&>GLk(a&OJ%9!Stc>9YDw7s9z2c8RZiaaO!@ zI)tkqGLoEM^|LJr`SJdAIQT74&3^_n($EYpn1D za@HFi|JxNzL;s_R(|*?t&GmdF^+1a4OIjW>6NeLHiEbAd$=mN3%R=5 zih8;md^#-5dTgAW{0n+&*(p8k3F>?uiLIS&%^fS-yOluDAl5+3eOjFE47%>DoURy6 zT|b@h7|BX}9BMjz%hjQN#*Pu|rEi}+WV?XHGnNSAGD;GKMNDOJ;zf$7l+d#WQWL&` zib&=wIML+ElEL7iYA~)`16>Avy%UBD9Y0#S7?$`LGUz9Yxg>?^sqbJ?ZzZt}R9dho z|16&HP=Z@T6`(4trm}kN3U<~opg}~@0C04wq05fJu`7tiB;O;i`47#)E&!a)N6@2)fV$20u zyB^q@a-&I#8aSvslV!trP>Ycc#%yPT;lzs@AMOBog5=DXJ8$m5Wmj3PwC>*gwYtJ* z`yflT$f_G8ROHo}=UyKD`Sk49yXXEqK6Lr?=Qr=RG(WKY`1vngc91c2$>f`O)Jf%C zf?s*p)Lq@_Bua#{iKWn0Iyo5Ng$f2J8iXEBrHm?lO-SNDCQ5i>i72k9Vv8xh|HvYY z6KaT#G2-C1l4Djqh8Z%k!ItAml4+(HUPc~yq>ntBq-1Q7!B%9HLcYeAj!0gKWtLiQ z$z_*behDU!RuTeJ1P!E+n~_9TY1Ng;xTB_+JCfv1op#=7XPZ_^iR6lnO>5aZkp+nVNSX!r=*JdC#We63MG?1 z>N#qxvd&6tt(XR>#DHjWCnS@Cs~CiwANOO z?X}uw%WY(@)^^*aeU4frt>xP4rl)wZCMUXBp6hPB^3F?dlDeLw4zHma|9U51a3Y$o zdZ|XrsCmfps@{(5EgJB@?Fq~;!4gkQam5x-+%QW6n$tkX9(Rnv$0CpHamWprOmfO9 zgS>LfE{lxv%O{sCbIms2jC0O9@62=0KF{27xM;#mG|NEC9P`LAFJ1J{A16(7)HQEm zGt@wvjJ45OJI!_1UVrVf)gD`Fj&jGHU0ia`p-r6HYO}pI+-BD|x7%mi{r24)+a34Z zbf+zM;B~Lfcj0CmPWa)9C(bzHjxYXrndoKG(>%Of~x?vu^V1 z%5`r4?Xdd~zyRJ3eqtaSOtt`k<#nunqw`n-JNCepC9r=B92xW2H^1^d@O2bap2wCW z1`He^03**kJ`XxWSKc@Q6;-;S(2l!9ODKi%qnn|MP-~NHgA0kUm`B&^p(# z1dwoqQV2j6rGP^|BJztptY9ZUX-4V2aFnEM8T`&<8yU8)ix2GL4~@u5Cqi(65$xg) zIT_0&MsShqtEDH$#>yKS@s$$C7WpgXDShbgdC~<@rQ-K9OU+b3ilyc}Wol zpou_hJxFvLweqDs)ulv~no!^R!lccy zfEuNyJMpamz^ApkXPCJ7&#z@*_6op(j+Q3Xp- zxN3HkC=;hq5o%3s77?Us<)%+vsY?gO6Sdvk>mOMQOCqimurh&($HrPhEgFD?nGM-7 zWf|JZf_Ah?lo|?;cHHC|ce&0}ZgZK7Tx;S77yv)p~JP|e%BBa+m^Brb8z=4x9LgVU=jZn2AX zc0QS;X2vwGv5lqCu^a1n$2{(_kALiAve|dOMD}EngLvd58+pk{X0no-4CN literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/index.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/index.htm new file mode 100644 index 0000000..8a349fe --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/index.htm @@ -0,0 +1,27 @@ + + +°ïÖúË÷Òý + + + + + + + + + + +
+
+Çëµã»÷ÒÔÏÂÁŽœÓÀŽ²é¿Ž°ïÖúÄÚÈÝÖеIJ»Í¬ÕœÚ. + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm new file mode 100644 index 0000000..1b59cb5 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm @@ -0,0 +1,31 @@ + + +²åÈëêµã°ŽÅ¥ + + + + + + + + + + + + +
+
ŽË°ŽÅ¥»áŽò¿ª²åÈë/±àŒ­ÃªµãµÄ¶Ô»°Ž°¿Ú£º
+
+
+
ް¿ÚÖÐÖ»ÓÐÒ»žöÎıŸÓò£¬Äã¿ÉÒÔÔÚŽËÊäÈëêµãÃû³Æ£¬ÐèҪעÒâµÄÊÇêµãÃû³Æ±ØÐëÊÇΚһµÄ¡£
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm new file mode 100644 index 0000000..8c63d85 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm @@ -0,0 +1,63 @@ + + +²åÈëÍŒÏñ°ŽÅ¥ + + + + + + + + + + + + +
+
µã»÷²åÈë͌Ƭ°ŽÅ¥ºó»áŽò¿ªÒÔÏÂŽ°¿Ú£º
+
+
+
ÄãÖ»ÐèŒòµ¥µÄÊäÈëÐèÒªÁ¬œÓµÄÍŒÏñµØÖ·Œ°ÍŒÏñÃèÊö£šÍŒÏñµÄÌæŽúÎÄ×Ö£©
+
+²ÎÊý˵Ã÷£º
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÍŒÏñµØÖ·Òª²åÈëµÄ͌ƬµÄURL
ÍŒÏñÃèÊö͌ƬÄÚÈݵÄÌæŽúÎÄ×ÖÃèÊö
άÊýÍŒÏñ¿í¶ÈÓëžß¶È
¶ÔÆë·œÊœÍŒÏñµÄ¶ÔÆë·œÊœ£¬ÔÚÎÄ×Ö»·ÈÆÍŒÏñÊ±ÌØ±ðÓÐÓá£
±ß¿òÍŒÏñ±ß¿òµÄºñ¶È
ˮƜŒäŸàÍŒÏñˮƜŒäŸà£¬ÔÚÎÄ×Ö»·ÈÆÍŒÏñÊ±ÌØ±ðÓÐÓá£
޹ֱŒäŸàÍŒÏñ޹ֱŒäŸà£¬ÔÚÎÄ×Ö»·ÈÆÍŒÏñÊ±ÌØ±ðÓÐÓá£
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm new file mode 100644 index 0000000..61adc2c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm @@ -0,0 +1,32 @@ + + +²åÈëÁŽœÓ°ŽÅ¥ + + + + + + + + + + + + +
+
ŽË°ŽÅ¥»áŽò¿ª²åÈë/±àŒ­ÁŽœÓµÄ¶Ô»°Ž°¿Ú£º
+
+
+
ް¿ÚÖÐÓÐÁœžö±íµ¥Óò£¬µÚÒ»žöÊÇÁŽœÓµÄµØÖ·£¬µÚ¶þžöÊÇÁŽœÓµÄŽò¿ª·œÊœ¡£ +
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm new file mode 100644 index 0000000..40b6468 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm @@ -0,0 +1,71 @@ + + +²åÈë±ížñ°ŽÅ¥ + + + + + + + + + + + + +
+
µã»÷²åÈë±ížñ°ŽÅ¥»áŽò¿ªÒÔÏÂŽ°¿Ú£¬ŽË²Ù×÷ÔÊÐíÄ㎎œš±ížñ¡£
+
+
+
+²ÎÊý˵Ã÷£º
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ÁÐÊý±ížñÁÐÊý
ÐÐÊý±ížñÐÐÊý
Ìî³ä±ížñµ¥ÔªžñµÄÌî³äÖµ
ŒäŸà±ížñµ¥ÔªžñŒäŸà
¶ÔÆë·œÊœ±ížñ¶ÔÆë·œÊœ
±ß¿ò±ížñ±ß¿ò¿í¶È
¿í¶È±ížñ¿í¶È£¬ÒÔÏóËØÎªµ¥Î»¡£
žß¶È±ížñžß¶È£¬ÒÔÏóËØÎªµ¥Î»¡£
ÀàÃû±ížñcssÑùÊœÃû
+
+
+
+ + + + + + +
+ + diff --git a/includes/tiny_mce/themes/advanced/docs/zh_cn/style.css b/includes/tiny_mce/themes/advanced/docs/zh_cn/style.css new file mode 100644 index 0000000..975bc5a --- /dev/null +++ b/includes/tiny_mce/themes/advanced/docs/zh_cn/style.css @@ -0,0 +1,28 @@ +body { background-color: #FFFFFF; } +body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; } +.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; } +.subtitle { font-size: 12px; font-weight: bold; } + +.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; } +.step_ol, .step_li { margin-left: 11 px; line-height: 16px; } +img { border: #000000 solid 1px; } + +a:visited { color: #666666; text-decoration: underline; } +a:active { color: #666666; text-decoration: underline; } +a:hover { color: #666666; text-decoration: underline; } +a { color: #666666; text-decoration: underline; } + +.pageheader { border: #E0E0E0 solid 1px; } +.pagefooter { border: #E0E0E0 solid 1px; } +.sample { background-color: #FFFFFF; border: #000000 solid 1px; } +.samplecontent { font-size: 10px; } + +.code { background-color: #FFFFFF; border: #000000 solid 1px; } +.codecontent { font-size: 10px; } +.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold } +.codecontent a { color: #666666; text-decoration: none; font-weight: bold } + +hr { height: 1px; } + diff --git a/includes/tiny_mce/themes/advanced/editor_template.js b/includes/tiny_mce/themes/advanced/editor_template.js new file mode 100644 index 0000000..22ff502 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/editor_template.js @@ -0,0 +1,12 @@ +tinyMCE.importThemeLanguagePack('advanced');var TinyMCE_advanced_autoImportCSSClasses=true;var TinyMCE_advanced_resizer=new Object();var TinyMCE_advanced_buttons=[['bold','{$lang_bold_img}','{$lang_bold_desc}','Bold'],['italic','{$lang_italic_img}','{$lang_italic_desc}','Italic'],['underline','{$lang_underline_img}','{$lang_underline_desc}','Underline'],['strikethrough','strikethrough.gif','{$lang_striketrough_desc}','Strikethrough'],['justifyleft','justifyleft.gif','{$lang_justifyleft_desc}','JustifyLeft'],['justifycenter','justifycenter.gif','{$lang_justifycenter_desc}','JustifyCenter'],['justifyright','justifyright.gif','{$lang_justifyright_desc}','JustifyRight'],['justifyfull','justifyfull.gif','{$lang_justifyfull_desc}','JustifyFull'],['bullist','bullist.gif','{$lang_bullist_desc}','InsertUnorderedList'],['numlist','numlist.gif','{$lang_numlist_desc}','InsertOrderedList'],['outdent','outdent.gif','{$lang_outdent_desc}','Outdent'],['indent','indent.gif','{$lang_indent_desc}','Indent'],['cut','cut.gif','{$lang_cut_desc}','Cut'],['copy','copy.gif','{$lang_copy_desc}','Copy'],['paste','paste.gif','{$lang_paste_desc}','Paste'],['undo','undo.gif','{$lang_undo_desc}','Undo'],['redo','redo.gif','{$lang_redo_desc}','Redo'],['link','link.gif','{$lang_link_desc}','mceLink',true],['unlink','unlink.gif','{$lang_unlink_desc}','unlink'],['image','image.gif','{$lang_image_desc}','mceImage',true],['cleanup','cleanup.gif','{$lang_cleanup_desc}','mceCleanup'],['help','help.gif','{$lang_help_desc}','mceHelp'],['code','code.gif','{$lang_theme_code_desc}','mceCodeEditor'],['hr','hr.gif','{$lang_theme_hr_desc}','inserthorizontalrule'],['removeformat','removeformat.gif','{$lang_theme_removeformat_desc}','removeformat'],['sub','sub.gif','{$lang_theme_sub_desc}','subscript'],['sup','sup.gif','{$lang_theme_sup_desc}','superscript'],['forecolor','forecolor.gif','{$lang_theme_forecolor_desc}','mceForeColor',true],['backcolor','backcolor.gif','{$lang_theme_backcolor_desc}','mceBackColor',true],['charmap','charmap.gif','{$lang_theme_charmap_desc}','mceCharMap'],['visualaid','visualaid.gif','{$lang_theme_visualaid_desc}','mceToggleVisualAid'],['anchor','anchor.gif','{$lang_theme_anchor_desc}','mceInsertAnchor'],['newdocument','newdocument.gif','{$lang_newdocument_desc}','mceNewDocument']];function TinyMCE_advanced_getControlHTML(button_name){var buttonTileMap=new Array('anchor.gif','backcolor.gif','bullist.gif','justifycenter.gif','charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif','cut.gif','forecolor.gif','justifyfull.gif','help.gif','hr.gif','image.gif','indent.gif','justifyleft.gif','link.gif','numlist.gif','outdent.gif','paste.gif','redo.gif','removeformat.gif','justifyright.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif','unlink.gif','visualaid.gif');for(var i=0;i4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '';}}}var cmd='tinyMCE.execInstanceCommand(\'{$editor_id}\',\''+but[3]+'\','+(but.length>4?but[4]:false)+(but.length>5?',\''+but[5]+'\'':'')+')';return '';}}switch(button_name){case "formatselect":var html='';return html;case "styleselect":return '';case "fontselect":var fontHTML='';return fontHTML;case "fontsizeselect":return '';case "|":case "separator":return '';case "spacer":return '';case "rowseparator":return '
';}return "";}function TinyMCE_advanced_execCommand(editor_id,element,command,user_interface,value){switch(command){case "mceForeColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=tinyMCE.getAttrib(elm,"color");if(inputColor=='')inputColor=elm.style.color;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"forecolor",input_color:inputColor});return true;case "mceBackColor":var template=new Array();var elm=tinyMCE.selectedInstance.getFocusElement();var inputColor=elm.style.backgroundColor;if(!inputColor)inputColor="#000000";template['file']='color_picker.htm';template['width']=220;template['height']=190;template['width']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",command:"HiliteColor",input_color:inputColor});return true;case "mceColorPicker":if(user_interface){var template=new Array();var inputColor=value['document'].getElementById(value['element_id']).value;template['file']='color_picker.htm';template['width']=220;template['height']=190;template['close_previous']="no";template['width']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height',0);if(typeof(value['store_selection'])=="undefined")value['store_selection']=true;tinyMCE.lastColorPickerValue=value;tinyMCE.openWindow(template,{editor_id:editor_id,mce_store_selection:value['store_selection'],inline:"yes",command:"mceColorPicker",input_color:inputColor});}else{var savedVal=tinyMCE.lastColorPickerValue;var elm=savedVal['document'].getElementById(savedVal['element_id']);elm.value=value;eval('elm.onchange();');}return true;case "mceCodeEditor":var template=new Array();template['file']='source_editor.htm';template['width']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_width",500));template['height']=parseInt(tinyMCE.getParam("theme_advanced_source_editor_height",400));tinyMCE.openWindow(template,{editor_id:editor_id,resizable:"yes",scrollbars:"no",inline:"yes"});return true;case "mceCharMap":var template=new Array();template['file']='charmap.htm';template['width']=550+(tinyMCE.isOpera?40:0);template['height']=250;template['width']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_charmap_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceInsertAnchor":var template=new Array();template['file']='anchor.htm';template['width']=320;template['height']=90+(tinyMCE.isNS7?30:0);template['width']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_width',0);template['height']+=tinyMCE.getLang('lang_theme_advanced_anchor_delta_height',0);tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes"});return true;case "mceNewDocument":if(confirm(tinyMCE.getLang('lang_newdocument')))tinyMCE.execInstanceCommand(editor_id,'mceSetContent',false,'');return true;}return false;}function TinyMCE_advanced_getEditorTemplate(settings,editorId){function removeFromArray(in_array,remove_array){var outArray=new Array();for(var i=0;i 

';var layoutManager=tinyMCE.getParam("theme_advanced_layout_manager","SimpleLayout");var styleSelectHTML='';if(settings['theme_advanced_styles']){var stylesAr=settings['theme_advanced_styles'].split(';');for(var i=0;i'+key+'';}TinyMCE_advanced_autoImportCSSClasses=false;}switch(layoutManager){case "SimpleLayout":var toolbarHTML="";var toolbarLocation=tinyMCE.getParam("theme_advanced_toolbar_location","bottom");var toolbarAlign=tinyMCE.getParam("theme_advanced_toolbar_align","center");var pathLocation=tinyMCE.getParam("theme_advanced_path_location","none");var statusbarLocation=tinyMCE.getParam("theme_advanced_statusbar_location",pathLocation);var defVals={theme_advanced_buttons1:"bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,separator,sub,sup,separator,charmap"};toolbarHTML+='';for(var i=1;i<100;i++){var def=defVals["theme_advanced_buttons"+i];var buttons=tinyMCE.getParam("theme_advanced_buttons"+i,def==null?'':def,true,',');if(buttons.length==0)break;buttons=removeFromArray(buttons,tinyMCE.getParam("theme_advanced_disable","",true,','));buttons=addToArray(buttons,tinyMCE.getParam("theme_advanced_buttons"+i+"_add","",true,','));buttons=addToArray(tinyMCE.getParam("theme_advanced_buttons"+i+"_add_before","",true,','),buttons);for(var b=0;b0){toolbarHTML+="
";deltaHeight-=23;}}toolbarHTML+='';template['html']='';if(toolbarLocation=="top"){template['html']+='';}if(statusbarLocation=="top"){template['html']+='';deltaHeight-=23;}template['html']+='';if(toolbarLocation=="bottom"){template['html']+='';}if(toolbarLocation=="external"){var bod=document.body;var elm=document.createElement("div");toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCE.settings);toolbarHTML=tinyMCE.replaceVars(toolbarHTML,tinyMCELang);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,'style_select_options',styleSelectHTML);toolbarHTML=tinyMCE.replaceVar(toolbarHTML,"editor_id",editorId);toolbarHTML=tinyMCE.applyTemplate(toolbarHTML);elm.className="mceToolbarExternal";elm.id=editorId+"_toolbar";elm.innerHTML='
'+toolbarHTML+'
'+statusbarHTML+'
'+toolbarHTML+'
'+toolbarHTML+'
';bod.appendChild(elm);deltaHeight=0;tinyMCE.getInstanceById(editorId).toolbarElement=elm;}else{tinyMCE.getInstanceById(editorId).toolbarElement=null;}if(statusbarLocation=="bottom"){template['html']+=''+statusbarHTML+'';deltaHeight-=23;}template['html']+='';break;case "RowLayout":template['html']='';var containers=tinyMCE.getParam("theme_advanced_containers","",true,",");var defaultContainerCSS=tinyMCE.getParam("theme_advanced_containers_default_class","container");var defaultContainerAlign=tinyMCE.getParam("theme_advanced_containers_default_align","center");for(var i=0;i';}else if(containers[i]=="mceElementpath"||containers[i]=="mceStatusbar"){var pathClass="mceStatusbar";if(i==containers.length-1){pathClass="mceStatusbarBottom";}else if(i==0){pathClass="mceStatusbar";}else{deltaHeight-=2;}template['html']+='';deltaHeight-=22;}else{var curContainer=tinyMCE.getParam("theme_advanced_container_"+containers[i],"",true,',');var curContainerHTML="";var curAlign=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align",defaultContainerAlign);var curCSS=tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class",defaultContainerCSS);for(var j=0;j0){curContainerHTML+="
";deltaHeight-=23;}template['html']+='
';}}template['html']+='
\ + \ +
'+statusbarHTML+'
'+curContainerHTML+'
';break;case "BorderLayout":break;case "CustomLayout":var customLayout=tinyMCE.getParam("theme_advanced_custom_layout","");if(customLayout!=""&&eval("typeof("+customLayout+")")!="undefined"){template=eval(customLayout+"(template);");}break;default:alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!');break;}if(resizing)template['html']+='';template['html']=tinyMCE.replaceVar(template['html'],'style_select_options',styleSelectHTML);template['delta_width']=0;template['delta_height']=deltaHeight;return template;}function TinyMCE_advanced_setResizing(e,editor_id,state){e=typeof(e)=="undefined"?window.event:e;var resizer=TinyMCE_advanced_resizer;var editorContainer=document.getElementById(editor_id+'_parent');var editorArea=document.getElementById(editor_id+'_parent').firstChild;var resizeBox=document.getElementById(editor_id+'_resize_box');var inst=tinyMCE.getInstanceById(editor_id);if(state){var width=editorArea.clientWidth;var height=editorArea.clientHeight;resizeBox.style.width=width+"px";resizeBox.style.height=height+"px";resizer.iframeWidth=inst.iframeElement.clientWidth;resizer.iframeHeight=inst.iframeElement.clientHeight;editorArea.style.display="none";resizeBox.style.display="block";if(!resizer.eventHandlers){if(tinyMCE.isMSIE)tinyMCE.addEvent(document,"mousemove",TinyMCE_advanced_resizeEventHandler);else tinyMCE.addEvent(window,"mousemove",TinyMCE_advanced_resizeEventHandler);tinyMCE.addEvent(document,"mouseup",TinyMCE_advanced_resizeEventHandler);resizer.eventHandlers=true;}resizer.resizing=true;resizer.downX=e.screenX;resizer.downY=e.screenY;resizer.width=parseInt(resizeBox.style.width);resizer.height=parseInt(resizeBox.style.height);resizer.editorId=editor_id;resizer.resizeBox=resizeBox;resizer.horizontal=tinyMCE.getParam("theme_advanced_resize_horizontal",true);}else{resizer.resizing=false;resizeBox.style.display="none";editorArea.style.display=tinyMCE.isMSIE?"block":"table";tinyMCE.execCommand('mceResetDesignMode');}}function TinyMCE_advanced_initInstance(inst){if(tinyMCE.getParam("theme_advanced_resizing",false)){if(tinyMCE.getParam("theme_advanced_resizing_use_cookie",true)){var w=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_width");var h=TinyMCE_advanced_getCookie("TinyMCE_"+inst.editorId+"_height");TinyMCE_advanced_resizeTo(inst,w,h,tinyMCE.getParam("theme_advanced_resize_horizontal",true));}}}function TinyMCE_advanced_setCookie(name,value,expires,path,domain,secure){var curCookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+escape(path):"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"");document.cookie=curCookie;}function TinyMCE_advanced_getCookie(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)return null;}else begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)end=dc.length;return unescape(dc.substring(begin+prefix.length,end));}function TinyMCE_advanced_resizeTo(inst,w,h,set_w){var editorContainer=document.getElementById(inst.editorId+'_parent');var tableElm=editorContainer.firstChild;var iframe=inst.iframeElement;if(w==null||w=="null"){set_w=false;w=0;}if(h==null||h=="null")return;w=parseInt(w);h=parseInt(h);if(tinyMCE.isGecko){w+=2;h+=2;}var dx=w-tableElm.clientWidth;var dy=h-tableElm.clientHeight;w=w<1?30:w;h=h<1?30:h;if(set_w)tableElm.style.width=w+"px";tableElm.style.height=h+"px";iw=iframe.clientWidth+dx;ih=iframe.clientHeight+dy;iw=iw<1?30:iw;ih=ih<1?30:ih;if(tinyMCE.isGecko){iw-=2;ih-=2;}if(set_w)iframe.style.width=iw+"px";iframe.style.height=ih+"px";if(set_w){var tableBodyElm=tableElm.firstChild;var minIframeWidth=tableBodyElm.scrollWidth;if(inst.iframeElement.clientWidth=0;i--){var nodeName=path[i].nodeName.toLowerCase();var nodeData="";if(nodeName=="b"){nodeName="strong";}if(nodeName=="i"){nodeName="em";}if(nodeName=="span"){var cn=tinyMCE.getAttrib(path[i],"class");if(cn!=""&&cn.indexOf('mceItem')==-1)nodeData+="class: "+cn+" ";var st=tinyMCE.getAttrib(path[i],"style");if(st!=""){st=tinyMCE.serializeStyle(tinyMCE.parseStyle(st));nodeData+="style: "+st+" ";}}if(nodeName=="font"){if(tinyMCE.getParam("convert_fonts_to_spans"))nodeName="span";var face=tinyMCE.getAttrib(path[i],"face");if(face!="")nodeData+="font: "+face+" ";var size=tinyMCE.getAttrib(path[i],"size");if(size!="")nodeData+="size: "+size+" ";var color=tinyMCE.getAttrib(path[i],"color");if(color!="")nodeData+="color: "+color+" ";}if(getAttrib(path[i],'id')!=""){nodeData+="id: "+path[i].getAttribute('id')+" ";}var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1)nodeData+="class: "+className+" ";if(getAttrib(path[i],'src')!=""){var src=tinyMCE.getAttrib(path[i],"mce_src");if(src=="")src=tinyMCE.getAttrib(path[i],"src");nodeData+="src: "+src+" ";}if(getAttrib(path[i],'href')!=""){var href=tinyMCE.getAttrib(path[i],"mce_href");if(href=="")href=tinyMCE.getAttrib(path[i],"href");nodeData+="href: "+href+" ";}if(nodeName=="img"&&tinyMCE.getAttrib(path[i],"class").indexOf('mceItemFlash')!=-1){nodeName="flash";nodeData="src: "+path[i].getAttribute('title');}if(nodeName=="a"&&(anchor=tinyMCE.getAttrib(path[i],"name"))!=""){nodeName="a";nodeName+="#"+anchor;nodeData="";}if(getAttrib(path[i],'name').indexOf("mce_")!=0){var className=tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i],"class"),false);if(className!=""&&className.indexOf('mceItem')==-1){nodeName+="."+className;}}var cmd='tinyMCE.execInstanceCommand(\''+editor_id+'\',\'mceSelectNodeDepth\',false,\''+i+'\');';html+=''+nodeName+'';if(i>0){html+=" » ";}}pathElm.innerHTML=''+tinyMCE.getLang('lang_theme_path')+": "+html+' ';}tinyMCE.switchClassSticky(editor_id+'_justifyleft','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyright','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifycenter','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_justifyfull','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sub','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_sup','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_link','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_unlink','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_image','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_hr','mceButtonNormal');if(node.nodeName=="A"&&tinyMCE.getAttrib(node,"class").indexOf('mceItemAnchor')!=-1)tinyMCE.switchClassSticky(editor_id+'_anchor','mceButtonSelected');var anchorLink=tinyMCE.getParentElement(node,"a","href");if(anchorLink||any_selection){tinyMCE.switchClassSticky(editor_id+'_link',anchorLink?'mceButtonSelected':'mceButtonNormal',false);tinyMCE.switchClassSticky(editor_id+'_unlink',anchorLink?'mceButtonSelected':'mceButtonNormal',false);}tinyMCE.switchClassSticky(editor_id+'_visualaid',visual_aid?'mceButtonSelected':'mceButtonNormal',false);if(undo_levels!=-1){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonDisabled',true);tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonDisabled',true);}if(tinyMCE.getParentElement(node,"li,blockquote")){tinyMCE.switchClassSticky(editor_id+'_outdent','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index0)){tinyMCE.switchClassSticky(editor_id+'_redo','mceButtonNormal',false);}if(undo_index!=-1&&(undo_index>0&&undo_levels>0)){tinyMCE.switchClassSticky(editor_id+'_undo','mceButtonNormal',false);}var selectElm=document.getElementById(editor_id+"_styleSelect");if(selectElm){TinyMCE_advanced_setupCSSClasses(editor_id);classNode=node;breakOut=false;var index=0;do{if(classNode&&classNode.className){for(var i=0;i");else selectByValue(selectElm,"");}var selectElm=document.getElementById(editor_id+"_fontNameSelect");if(selectElm){if(!tinyMCE.isSafari&&!(tinyMCE.isMSIE&&!tinyMCE.isOpera)){var face=inst.queryCommandValue('FontName');face=face==null||face==""?"":face;selectByValue(selectElm,face,face!="");}else{var elm=tinyMCE.getParentElement(node,"font","face");if(elm){var family=tinyMCE.getAttrib(elm,"face");if(family=='')family=''+elm.style.fontFamily;if(!selectByValue(selectElm,family,family!=""))selectByValue(selectElm,"");}else selectByValue(selectElm,"");}}var selectElm=document.getElementById(editor_id+"_fontSizeSelect");if(selectElm){if(!tinyMCE.isSafari&&!tinyMCE.isOpera){var size=inst.queryCommandValue('FontSize');selectByValue(selectElm,size==null||size==""?"0":size);}else{var elm=tinyMCE.getParentElement(node,"font","size");if(elm){var size=tinyMCE.getAttrib(elm,"size");if(size==''){var sizes=new Array('','8px','10px','12px','14px','18px','24px','36px');size=''+elm.style.fontSize;for(var i=0;i0){selectElm.setAttribute('cssImported','true');}}}; \ No newline at end of file diff --git a/includes/tiny_mce/themes/advanced/editor_template_src.js b/includes/tiny_mce/themes/advanced/editor_template_src.js new file mode 100644 index 0000000..b04d44f --- /dev/null +++ b/includes/tiny_mce/themes/advanced/editor_template_src.js @@ -0,0 +1,1208 @@ +/* Import theme specific language pack */ +tinyMCE.importThemeLanguagePack('advanced'); + +// Variable declarations +var TinyMCE_advanced_autoImportCSSClasses = true; +var TinyMCE_advanced_resizer = new Object(); +var TinyMCE_advanced_buttons = [ + // Control id, button img, button title, command, user_interface, value + ['bold', '{$lang_bold_img}', '{$lang_bold_desc}', 'Bold'], + ['italic', '{$lang_italic_img}', '{$lang_italic_desc}', 'Italic'], + ['underline', '{$lang_underline_img}', '{$lang_underline_desc}', 'Underline'], + ['strikethrough', 'strikethrough.gif', '{$lang_striketrough_desc}', 'Strikethrough'], + ['justifyleft', 'justifyleft.gif', '{$lang_justifyleft_desc}', 'JustifyLeft'], + ['justifycenter', 'justifycenter.gif', '{$lang_justifycenter_desc}', 'JustifyCenter'], + ['justifyright', 'justifyright.gif', '{$lang_justifyright_desc}', 'JustifyRight'], + ['justifyfull', 'justifyfull.gif', '{$lang_justifyfull_desc}', 'JustifyFull'], + ['bullist', 'bullist.gif', '{$lang_bullist_desc}', 'InsertUnorderedList'], + ['numlist', 'numlist.gif', '{$lang_numlist_desc}', 'InsertOrderedList'], + ['outdent', 'outdent.gif', '{$lang_outdent_desc}', 'Outdent'], + ['indent', 'indent.gif', '{$lang_indent_desc}', 'Indent'], + ['cut', 'cut.gif', '{$lang_cut_desc}', 'Cut'], + ['copy', 'copy.gif', '{$lang_copy_desc}', 'Copy'], + ['paste', 'paste.gif', '{$lang_paste_desc}', 'Paste'], + ['undo', 'undo.gif', '{$lang_undo_desc}', 'Undo'], + ['redo', 'redo.gif', '{$lang_redo_desc}', 'Redo'], + ['link', 'link.gif', '{$lang_link_desc}', 'mceLink', true], + ['unlink', 'unlink.gif', '{$lang_unlink_desc}', 'unlink'], + ['image', 'image.gif', '{$lang_image_desc}', 'mceImage', true], + ['cleanup', 'cleanup.gif', '{$lang_cleanup_desc}', 'mceCleanup'], + ['help', 'help.gif', '{$lang_help_desc}', 'mceHelp'], + ['code', 'code.gif', '{$lang_theme_code_desc}', 'mceCodeEditor'], + ['hr', 'hr.gif', '{$lang_theme_hr_desc}', 'inserthorizontalrule'], + ['removeformat', 'removeformat.gif', '{$lang_theme_removeformat_desc}', 'removeformat'], + ['sub', 'sub.gif', '{$lang_theme_sub_desc}', 'subscript'], + ['sup', 'sup.gif', '{$lang_theme_sup_desc}', 'superscript'], + ['forecolor', 'forecolor.gif', '{$lang_theme_forecolor_desc}', 'mceForeColor', true], + ['backcolor', 'backcolor.gif', '{$lang_theme_backcolor_desc}', 'mceBackColor', true], + ['charmap', 'charmap.gif', '{$lang_theme_charmap_desc}', 'mceCharMap'], + ['visualaid', 'visualaid.gif', '{$lang_theme_visualaid_desc}', 'mceToggleVisualAid'], + ['anchor', 'anchor.gif', '{$lang_theme_anchor_desc}', 'mceInsertAnchor'], + ['newdocument', 'newdocument.gif', '{$lang_newdocument_desc}', 'mceNewDocument'] +]; + +/** + * Returns HTML code for the specificed control. + */ +function TinyMCE_advanced_getControlHTML(button_name) +{ + var buttonTileMap = new Array('anchor.gif','backcolor.gif','bullist.gif','justifycenter.gif', + 'charmap.gif','cleanup.gif','code.gif','copy.gif','custom_1.gif', + 'cut.gif','forecolor.gif','justifyfull.gif','help.gif','hr.gif', + 'image.gif','indent.gif','justifyleft.gif','link.gif','numlist.gif', + 'outdent.gif','paste.gif','redo.gif','removeformat.gif', + 'justifyright.gif','strikethrough.gif','sub.gif','sup.gif','undo.gif', + 'unlink.gif','visualaid.gif'); + + // Lookup button in button list + for (var i=0; i 4 ? but[4] : false) + (but.length > 5 ? ',\'' + but[5] + '\'' : '') + ')'; + return ''; + } + } + } + + // Old style + var cmd = 'tinyMCE.execInstanceCommand(\'{$editor_id}\',\'' + but[3] + '\',' + (but.length > 4 ? but[4] : false) + (but.length > 5 ? ',\'' + but[5] + '\'' : '') + ')'; + return ''; + } + } + + // Custom controlls other than buttons + switch (button_name) + { + case "formatselect": + var html = ''; + //formatselect + return html; + + case "styleselect": + //styleselect + return ''; + + case "fontselect": + var fontHTML = ''; + return fontHTML; + + case "fontsizeselect": + //fontsizeselect + return ''; + + case "|": + case "separator": + return ''; + + case "spacer": + return ''; + + case "rowseparator": + return '
'; + } + + return ""; +} + +/** + * Theme specific exec command handeling. + */ +function TinyMCE_advanced_execCommand(editor_id, element, command, user_interface, value) +{ + switch (command) + { + case "mceForeColor": + var template = new Array(); + var elm = tinyMCE.selectedInstance.getFocusElement(); + var inputColor = tinyMCE.getAttrib(elm, "color"); + + if (inputColor == '') + inputColor = elm.style.color; + + if (!inputColor) + inputColor = "#000000"; + + template['file'] = 'color_picker.htm'; + template['width'] = 220; + template['height'] = 190; + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "forecolor", input_color : inputColor}); + return true; + + case "mceBackColor": + var template = new Array(); + var elm = tinyMCE.selectedInstance.getFocusElement(); + var inputColor = elm.style.backgroundColor; + + if (!inputColor) + inputColor = "#000000"; + + template['file'] = 'color_picker.htm'; + template['width'] = 220; + template['height'] = 190; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_backcolor_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", command : "HiliteColor", input_color : inputColor}); + //mceBackColor + return true; + + case "mceColorPicker": + if (user_interface) { + var template = new Array(); + var inputColor = value['document'].getElementById(value['element_id']).value; + + template['file'] = 'color_picker.htm'; + template['width'] = 220; + template['height'] = 190; + template['close_previous'] = "no"; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_colorpicker_delta_height', 0); + + if (typeof(value['store_selection']) == "undefined") + value['store_selection'] = true; + + tinyMCE.lastColorPickerValue = value; + tinyMCE.openWindow(template, {editor_id : editor_id, mce_store_selection : value['store_selection'], inline : "yes", command : "mceColorPicker", input_color : inputColor}); + } else { + var savedVal = tinyMCE.lastColorPickerValue; + var elm = savedVal['document'].getElementById(savedVal['element_id']); + elm.value = value; + eval('elm.onchange();'); + } + return true; + + case "mceCodeEditor": + var template = new Array(); + + template['file'] = 'source_editor.htm'; + template['width'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_width", 500)); + template['height'] = parseInt(tinyMCE.getParam("theme_advanced_source_editor_height", 400)); + + tinyMCE.openWindow(template, {editor_id : editor_id, resizable : "yes", scrollbars : "no", inline : "yes"}); + //mceCodeEditor + return true; + + case "mceCharMap": + var template = new Array(); + + template['file'] = 'charmap.htm'; + template['width'] = 550 + (tinyMCE.isOpera ? 40 : 0); + template['height'] = 250; + + template['width'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_charmap_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + //mceCharMap + return true; + + case "mceInsertAnchor": + var template = new Array(); + + template['file'] = 'anchor.htm'; + template['width'] = 320; + template['height'] = 90 + (tinyMCE.isNS7 ? 30 : 0); + + template['width'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_theme_advanced_anchor_delta_height', 0); + + tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes"}); + return true; + + case "mceNewDocument": + if (confirm(tinyMCE.getLang('lang_newdocument'))) + tinyMCE.execInstanceCommand(editor_id, 'mceSetContent', false, ''); + + return true; + } + + // Default behavior + return false; +} + +/** + * Editor instance template function. + */ +function TinyMCE_advanced_getEditorTemplate(settings, editorId) +{ + function removeFromArray(in_array, remove_array) + { + var outArray = new Array(); + + for (var i=0; i 

'; + var layoutManager = tinyMCE.getParam("theme_advanced_layout_manager", "SimpleLayout"); + + // Setup style select options -- MOVED UP FOR EXTERNAL TOOLBAR COMPATABILITY! + var styleSelectHTML = ''; + if (settings['theme_advanced_styles']) { + var stylesAr = settings['theme_advanced_styles'].split(';'); + + for (var i=0; i' + key + ''; + } + + TinyMCE_advanced_autoImportCSSClasses = false; + } + + switch(layoutManager) { + case "SimpleLayout" : //the default TinyMCE Layout (for backwards compatibility)... + var toolbarHTML = ""; + var toolbarLocation = tinyMCE.getParam("theme_advanced_toolbar_location", "bottom"); + var toolbarAlign = tinyMCE.getParam("theme_advanced_toolbar_align", "center"); + var pathLocation = tinyMCE.getParam("theme_advanced_path_location", "none"); // Compatiblity + var statusbarLocation = tinyMCE.getParam("theme_advanced_statusbar_location", pathLocation); + var defVals = { + theme_advanced_buttons1 : "bold,italic,underline,strikethrough,separator,justifyleft,justifycenter,justifyright,justifyfull,separator,styleselect,formatselect", + theme_advanced_buttons2 : "bullist,numlist,separator,outdent,indent,separator,undo,redo,separator,link,unlink,anchor,image,cleanup,help,code", + theme_advanced_buttons3 : "hr,removeformat,visualaid,separator,sub,sup,separator,charmap" + }; + + // Add accessibility control + toolbarHTML += ''; + + // Render rows + for (var i=1; i<100; i++) { + var def = defVals["theme_advanced_buttons" + i]; + + var buttons = tinyMCE.getParam("theme_advanced_buttons" + i, def == null ? '' : def, true, ','); + if (buttons.length == 0) + break; + + buttons = removeFromArray(buttons, tinyMCE.getParam("theme_advanced_disable", "", true, ',')); + buttons = addToArray(buttons, tinyMCE.getParam("theme_advanced_buttons" + i + "_add", "", true, ',')); + buttons = addToArray(tinyMCE.getParam("theme_advanced_buttons" + i + "_add_before", "", true, ','), buttons); + + for (var b=0; b 0) { + toolbarHTML += "
"; + deltaHeight -= 23; + } + } + + // Add accessibility control + toolbarHTML += ''; + + // Setup template html + template['html'] = ''; + + if (toolbarLocation == "top") + { + template['html'] += ''; + } + + if (statusbarLocation == "top") + { + template['html'] += ''; + deltaHeight -= 23; + } + + template['html'] += ''; + + if (toolbarLocation == "bottom") + { + template['html'] += ''; + } + + // External toolbar changes + if (toolbarLocation == "external") + { + var bod = document.body; + var elm = document.createElement ("div"); + + toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCE.settings); + toolbarHTML = tinyMCE.replaceVars(toolbarHTML, tinyMCELang); + toolbarHTML = tinyMCE.replaceVar(toolbarHTML, 'style_select_options', styleSelectHTML); + toolbarHTML = tinyMCE.replaceVar(toolbarHTML, "editor_id", editorId); + toolbarHTML = tinyMCE.applyTemplate(toolbarHTML); + + elm.className = "mceToolbarExternal"; + elm.id = editorId+"_toolbar"; + elm.innerHTML = '
' + toolbarHTML + '
' + statusbarHTML + '
' + toolbarHTML + '
'+toolbarHTML+'
'; + bod.appendChild (elm); + // bod.style.marginTop = elm.offsetHeight + "px"; + + deltaHeight = 0; + tinyMCE.getInstanceById(editorId).toolbarElement = elm; + + //template['html'] = '
'+toolbarHTML+'
' + template["html"]; + } + else + { + tinyMCE.getInstanceById(editorId).toolbarElement = null; + } + + if (statusbarLocation == "bottom") + { + template['html'] += '' + statusbarHTML + ''; + deltaHeight -= 23; + } + + template['html'] += ''; + //"SimpleLayout" + break; + + case "RowLayout" : //Container Layout - containers defined in "theme_advanced_containers" are rendered from top to bottom. + template['html'] = ''; + + var containers = tinyMCE.getParam("theme_advanced_containers", "", true, ","); + var defaultContainerCSS = tinyMCE.getParam("theme_advanced_containers_default_class", "container"); + var defaultContainerAlign = tinyMCE.getParam("theme_advanced_containers_default_align", "center"); + + //Render Containers: + for (var i = 0; i < containers.length; i++) + { + if (containers[i] == "mceEditor") //Exceptions for mceEditor and ... + { + template['html'] += ''; + } + else if (containers[i] == "mceElementpath" || containers[i] == "mceStatusbar") // ... mceElementpath: + { + var pathClass = "mceStatusbar"; + + if (i == containers.length-1) + { + pathClass = "mceStatusbarBottom"; + } + else if (i == 0) + { + pathClass = "mceStatusbar"; + } + else + { + deltaHeight-=2; + } + + template['html'] += ''; + deltaHeight -= 22; + } + else //Render normal Container: + { + var curContainer = tinyMCE.getParam("theme_advanced_container_"+containers[i], "", true, ','); + var curContainerHTML = ""; + var curAlign = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_align", defaultContainerAlign); + var curCSS = tinyMCE.getParam("theme_advanced_container_"+containers[i]+"_class", defaultContainerCSS); + + for (var j=0; j 0) + { + curContainerHTML += "
"; + deltaHeight -= 23; + } + + template['html'] += '
'; + } + } + + template['html'] += '
\ + \ +
' + statusbarHTML + '
' + curContainerHTML + '
'; + //RowLayout + break; + + case "BorderLayout" : //will be like java.awt.BorderLayout of SUN Java... + // Not implemented yet... + break; + + case "CustomLayout" : //User defined layout callback... + var customLayout = tinyMCE.getParam("theme_advanced_custom_layout",""); + + if (customLayout != "" && eval("typeof(" + customLayout + ")") != "undefined") + { + template = eval(customLayout + "(template);"); + } + break; + + default: + alert('UNDEFINED LAYOUT MANAGER! PLEASE CHECK YOUR TINYMCE CONFIG!'); + //CustomLayout + break; + } + + if (resizing) + template['html'] += ''; + + template['html'] = tinyMCE.replaceVar(template['html'], 'style_select_options', styleSelectHTML); + template['delta_width'] = 0; + template['delta_height'] = deltaHeight; + + return template; +} + +/** + * Starts/stops the editor resizing. + */ +function TinyMCE_advanced_setResizing(e, editor_id, state) { + e = typeof(e) == "undefined" ? window.event : e; + + var resizer = TinyMCE_advanced_resizer; + var editorContainer = document.getElementById(editor_id + '_parent'); + var editorArea = document.getElementById(editor_id + '_parent').firstChild; + var resizeBox = document.getElementById(editor_id + '_resize_box'); + var inst = tinyMCE.getInstanceById(editor_id); + + if (state) { + // Place box over editor area + var width = editorArea.clientWidth; + var height = editorArea.clientHeight; + + resizeBox.style.width = width + "px"; + resizeBox.style.height = height + "px"; + + resizer.iframeWidth = inst.iframeElement.clientWidth; + resizer.iframeHeight = inst.iframeElement.clientHeight; + + // Hide editor and show resize box + editorArea.style.display = "none"; + resizeBox.style.display = "block"; + + // Add event handlers, only once + if (!resizer.eventHandlers) { + if (tinyMCE.isMSIE) + tinyMCE.addEvent(document, "mousemove", TinyMCE_advanced_resizeEventHandler); + else + tinyMCE.addEvent(window, "mousemove", TinyMCE_advanced_resizeEventHandler); + + tinyMCE.addEvent(document, "mouseup", TinyMCE_advanced_resizeEventHandler); + + resizer.eventHandlers = true; + } + + resizer.resizing = true; + resizer.downX = e.screenX; + resizer.downY = e.screenY; + resizer.width = parseInt(resizeBox.style.width); + resizer.height = parseInt(resizeBox.style.height); + resizer.editorId = editor_id; + resizer.resizeBox = resizeBox; + resizer.horizontal = tinyMCE.getParam("theme_advanced_resize_horizontal", true); + } else { + resizer.resizing = false; + resizeBox.style.display = "none"; + editorArea.style.display = tinyMCE.isMSIE ? "block" : "table"; + tinyMCE.execCommand('mceResetDesignMode'); + } +} + +function TinyMCE_advanced_initInstance(inst) { + if (tinyMCE.getParam("theme_advanced_resizing", false)) { + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var w = TinyMCE_advanced_getCookie("TinyMCE_" + inst.editorId + "_width"); + var h = TinyMCE_advanced_getCookie("TinyMCE_" + inst.editorId + "_height"); + + TinyMCE_advanced_resizeTo(inst, w, h, tinyMCE.getParam("theme_advanced_resize_horizontal", true)); + } + } +} + +function TinyMCE_advanced_setCookie(name, value, expires, path, domain, secure) { + var curCookie = name + "=" + escape(value) + + ((expires) ? "; expires=" + expires.toGMTString() : "") + + ((path) ? "; path=" + escape(path) : "") + + ((domain) ? "; domain=" + domain : "") + + ((secure) ? "; secure" : ""); + + document.cookie = curCookie; +} + +function TinyMCE_advanced_getCookie(name) { + var dc = document.cookie; + var prefix = name + "="; + var begin = dc.indexOf("; " + prefix); + + if (begin == -1) { + begin = dc.indexOf(prefix); + + if (begin != 0) + return null; + } else + begin += 2; + + var end = document.cookie.indexOf(";", begin); + + if (end == -1) + end = dc.length; + + return unescape(dc.substring(begin + prefix.length, end)); +} + +function TinyMCE_advanced_resizeTo(inst, w, h, set_w) { + var editorContainer = document.getElementById(inst.editorId + '_parent'); + var tableElm = editorContainer.firstChild; + var iframe = inst.iframeElement; + + if (w == null || w == "null") { + set_w = false; + w = 0; + } + + if (h == null || h == "null") + return; + + w = parseInt(w); + h = parseInt(h); + + if (tinyMCE.isGecko) { + w += 2; + h += 2; + } + + var dx = w - tableElm.clientWidth; + var dy = h - tableElm.clientHeight; + + w = w < 1 ? 30 : w; + h = h < 1 ? 30 : h; + + if (set_w) + tableElm.style.width = w + "px"; + + tableElm.style.height = h + "px"; + + iw = iframe.clientWidth + dx; + ih = iframe.clientHeight + dy; + + iw = iw < 1 ? 30 : iw; + ih = ih < 1 ? 30 : ih; + + if (tinyMCE.isGecko) { + iw -= 2; + ih -= 2; + } + + if (set_w) + iframe.style.width = iw + "px"; + + iframe.style.height = ih + "px"; + + // Is it to small, make it bigger again + if (set_w) { + var tableBodyElm = tableElm.firstChild; + var minIframeWidth = tableBodyElm.scrollWidth; + if (inst.iframeElement.clientWidth < minIframeWidth) { + dx = minIframeWidth - inst.iframeElement.clientWidth; + + inst.iframeElement.style.width = (iw + dx) + "px"; + } + } +} + +/** + * Handles resizing events. + */ +function TinyMCE_advanced_resizeEventHandler(e) { + var resizer = TinyMCE_advanced_resizer; + + // Do nothing + if (!resizer.resizing) + return; + + e = typeof(e) == "undefined" ? window.event : e; + + var dx = e.screenX - resizer.downX; + var dy = e.screenY - resizer.downY; + var resizeBox = resizer.resizeBox; + var editorId = resizer.editorId; + + switch (e.type) { + case "mousemove": + var w, h; + + w = resizer.width + dx; + h = resizer.height + dy; + + w = w < 1 ? 1 : w; + h = h < 1 ? 1 : h; + + if (resizer.horizontal) + resizeBox.style.width = w + "px"; + + resizeBox.style.height = h + "px"; + break; + + case "mouseup": + TinyMCE_advanced_setResizing(e, editorId, false); + TinyMCE_advanced_resizeTo(tinyMCE.getInstanceById(editorId), resizer.width + dx, resizer.height + dy, resizer.horizontal); + + // Expire in a month + if (tinyMCE.getParam("theme_advanced_resizing_use_cookie", true)) { + var expires = new Date(); + expires.setTime(expires.getTime() + 3600000 * 24 * 30); + + // Set the cookies + TinyMCE_advanced_setCookie("TinyMCE_" + editorId + "_width", "" + (resizer.horizontal ? resizer.width + dx : ""), expires); + TinyMCE_advanced_setCookie("TinyMCE_" + editorId + "_height", "" + (resizer.height + dy), expires); + } + break; + } +} + +/** + * Insert link template function. + */ +function TinyMCE_advanced_getInsertLinkTemplate() +{ + var template = new Array(); + + template['file'] = 'link.htm'; + template['width'] = 330; + template['height'] = 170 + (tinyMCE.isMSIE ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_link_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_link_delta_height', 0); + + return template; +}; + +/** + * Insert image template function. + */ +function TinyMCE_advanced_getInsertImageTemplate() { + var template = new Array(); + + template['file'] = 'image.htm?src={$src}'; + template['width'] = 340; + template['height'] = 250 + (tinyMCE.isMSIE ? 25 : 0); + + // Language specific width and height addons + template['width'] += tinyMCE.getLang('lang_insert_image_delta_width', 0); + template['height'] += tinyMCE.getLang('lang_insert_image_delta_height', 0); + + return template; +}; + +/** + * Node change handler. + */ +function TinyMCE_advanced_handleNodeChange(editor_id, node, undo_index, undo_levels, visual_aid, any_selection, setup_content) { + function selectByValue(select_elm, value, first_index) { + first_index = typeof(first_index) == "undefined" ? false : true; + + if (select_elm) { + for (var i=0; i=0; i--) { + var nodeName = path[i].nodeName.toLowerCase(); + var nodeData = ""; + + if (nodeName == "b") { + nodeName = "strong"; + } + + if (nodeName == "i") { + nodeName = "em"; + } + + if (nodeName == "span") { + var cn = tinyMCE.getAttrib(path[i], "class"); + if (cn != "" && cn.indexOf('mceItem') == -1) + nodeData += "class: " + cn + " "; + + var st = tinyMCE.getAttrib(path[i], "style"); + if (st != "") { + st = tinyMCE.serializeStyle(tinyMCE.parseStyle(st)); + nodeData += "style: " + st + " "; + } + } + + if (nodeName == "font") { + if (tinyMCE.getParam("convert_fonts_to_spans")) + nodeName = "span"; + + var face = tinyMCE.getAttrib(path[i], "face"); + if (face != "") + nodeData += "font: " + face + " "; + + var size = tinyMCE.getAttrib(path[i], "size"); + if (size != "") + nodeData += "size: " + size + " "; + + var color = tinyMCE.getAttrib(path[i], "color"); + if (color != "") + nodeData += "color: " + color + " "; + } + + if (getAttrib(path[i], 'id') != "") { + nodeData += "id: " + path[i].getAttribute('id') + " "; + } + + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) + nodeData += "class: " + className + " "; + + if (getAttrib(path[i], 'src') != "") { + var src = tinyMCE.getAttrib(path[i], "mce_src"); + + if (src == "") + src = tinyMCE.getAttrib(path[i], "src"); + + nodeData += "src: " + src + " "; + } + + if (getAttrib(path[i], 'href') != "") { + var href = tinyMCE.getAttrib(path[i], "mce_href"); + + if (href == "") + href = tinyMCE.getAttrib(path[i], "href"); + + nodeData += "href: " + href + " "; + } + + if (nodeName == "img" && tinyMCE.getAttrib(path[i], "class").indexOf('mceItemFlash') != -1) { + nodeName = "flash"; + nodeData = "src: " + path[i].getAttribute('title'); + } + + if (nodeName == "a" && (anchor = tinyMCE.getAttrib(path[i], "name")) != "") { + nodeName = "a"; + nodeName += "#" + anchor; + nodeData = ""; + } + + if (getAttrib(path[i], 'name').indexOf("mce_") != 0) { + var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(path[i], "class"), false); + if (className != "" && className.indexOf('mceItem') == -1) { + nodeName += "." + className; + } + } + + var cmd = 'tinyMCE.execInstanceCommand(\'' + editor_id + '\',\'mceSelectNodeDepth\',false,\'' + i + '\');'; + html += '' + nodeName + ''; + + if (i > 0) { + html += " » "; + } + } + + pathElm.innerHTML = '' + tinyMCE.getLang('lang_theme_path') + ": " + html + ' '; + } + + // Reset old states + tinyMCE.switchClassSticky(editor_id + '_justifyleft', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_justifyright', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_justifycenter', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_justifyfull', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_sub', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_sup', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_link', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_unlink', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_image', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_hr', 'mceButtonNormal'); + + if (node.nodeName == "A" && tinyMCE.getAttrib(node, "class").indexOf('mceItemAnchor') != -1) + tinyMCE.switchClassSticky(editor_id + '_anchor', 'mceButtonSelected'); + + // Get link + var anchorLink = tinyMCE.getParentElement(node, "a", "href"); + + if (anchorLink || any_selection) + { + tinyMCE.switchClassSticky(editor_id + '_link', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false); + tinyMCE.switchClassSticky(editor_id + '_unlink', anchorLink ? 'mceButtonSelected' : 'mceButtonNormal', false); + } + + // Handle visual aid + tinyMCE.switchClassSticky(editor_id + '_visualaid', visual_aid ? 'mceButtonSelected' : 'mceButtonNormal', false); + + if (undo_levels != -1) + { + tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonDisabled', true); + tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonDisabled', true); + } + + // Within li, blockquote + if (tinyMCE.getParentElement(node, "li,blockquote")) + { + tinyMCE.switchClassSticky(editor_id + '_outdent', 'mceButtonNormal', false); + } + + // Has redo levels + if (undo_index != -1 && (undo_index < undo_levels-1 && undo_levels > 0)) + { + tinyMCE.switchClassSticky(editor_id + '_redo', 'mceButtonNormal', false); + } + + // Has undo levels + if (undo_index != -1 && (undo_index > 0 && undo_levels > 0)) + { + tinyMCE.switchClassSticky(editor_id + '_undo', 'mceButtonNormal', false); + } + + // Select class in select box + var selectElm = document.getElementById(editor_id + "_styleSelect"); + + if (selectElm) + { + TinyMCE_advanced_setupCSSClasses(editor_id); + + classNode = node; + breakOut = false; + var index = 0; + + do + { + if (classNode && classNode.className) + { + for (var i=0; i"); + else + selectByValue(selectElm, ""); + } + + // Select fontselect + var selectElm = document.getElementById(editor_id + "_fontNameSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !(tinyMCE.isMSIE && !tinyMCE.isOpera)) { + var face = inst.queryCommandValue('FontName'); + + face = face == null || face == "" ? "" : face; + + selectByValue(selectElm, face, face != ""); + } else { + var elm = tinyMCE.getParentElement(node, "font", "face"); + + if (elm) { + var family = tinyMCE.getAttrib(elm, "face"); + + if (family == '') + family = '' + elm.style.fontFamily; + + if (!selectByValue(selectElm, family, family != "")) + selectByValue(selectElm, ""); + } else + selectByValue(selectElm, ""); + } + } + + // Select fontsize + var selectElm = document.getElementById(editor_id + "_fontSizeSelect"); + if (selectElm) { + if (!tinyMCE.isSafari && !tinyMCE.isOpera) { + var size = inst.queryCommandValue('FontSize'); + selectByValue(selectElm, size == null || size == "" ? "0" : size); + } else { + var elm = tinyMCE.getParentElement(node, "font", "size"); + if (elm) { + var size = tinyMCE.getAttrib(elm, "size"); + + if (size == '') { + var sizes = new Array('', '8px', '10px', '12px', '14px', '18px', '24px', '36px'); + + size = '' + elm.style.fontSize; + + for (var i=0; i 0) { + selectElm.setAttribute('cssImported', 'true'); + } + } +}; diff --git a/includes/tiny_mce/themes/advanced/image.htm b/includes/tiny_mce/themes/advanced/image.htm new file mode 100644 index 0000000..62a1487 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/image.htm @@ -0,0 +1,91 @@ + + + {$lang_insert_image_title} + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang_insert_image_title}
{$lang_insert_image_src}: + + + + +
 
{$lang_insert_image_alt}:
{$lang_insert_image_align}:
{$lang_insert_image_dimensions}: + x +
{$lang_insert_image_border}:
{$lang_insert_image_vspace}:
{$lang_insert_image_hspace}:
+
+
+ + diff --git a/includes/tiny_mce/themes/advanced/images/anchor.gif b/includes/tiny_mce/themes/advanced/images/anchor.gif new file mode 100644 index 0000000000000000000000000000000000000000..34ab71534b74e1f8eb01a822d2073cde4cd878cb GIT binary patch literal 171 zcmV;c095}+Nk%w1VH5xq0K*0VDLrY1lc!y3io(UtI8lV8tiaOK*3t6qtjy*E#3&d$!w&zD+OKB~ULl7eEw((m;2 z^kQ<7@$qtYhNk=Uwg3PCA^8LW000jFEC2ui02BZe000DA@X1N5y*TU5`(_{rgp5Wq zV<-tiQw0DJpz-{)hcHm#IKm8pA~9I(Ca@SvR8S0cm6VSWFgTt^N>UaxG!szEiFzP_ cvz1f8Q5b|bYX=qJK_CnUx@XVt`!Nv!J5VM>-~a#s literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bold.gif b/includes/tiny_mce/themes/advanced/images/bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6a9cc2cd4117526156fa29c06156ba5971823c4 GIT binary patch literal 76 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*&Mzw-23{>3a?E=Bm(Rqw7V Z4AWqey4jFcx$b3$*C(Ir-+DzDtN~+a79aos literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bold_de_se.gif b/includes/tiny_mce/themes/advanced/images/bold_de_se.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b129de25e916946792c89f08a7b30b2f9dc8b72 GIT binary patch literal 73 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*UAzw-23e#sdnZdC`i8W!&j Xl@)6cxHjEB<6*$FFxbIg;(p2 i&djr5P5jX#dNVh}IZO5VUiUMXvRj`2I%m$xU=0AHn;dum literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bold_fr.gif b/includes/tiny_mce/themes/advanced/images/bold_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..2816454515a2b3d031ee1762f9308db99e9d3940 GIT binary patch literal 78 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*yKzw-23e%TquY+VNzx0~n3 bPUX;xQ|oohT$M9BQ$Xt4x8CPfj11NQWJeUX literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bold_ru.gif b/includes/tiny_mce/themes/advanced/images/bold_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..e000d461c96188c26fe081920ba332593e5b60ca GIT binary patch literal 77 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNeI`y fv!S2m6KACKPM+Zyy|O9RI8W2_`nTTOtPIuwq8S!> literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bold_tw.gif b/includes/tiny_mce/themes/advanced/images/bold_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..82085432c622fb9b195d45480ce0c00f80d24027 GIT binary patch literal 207 zcmV;=05JbYNk%w1VH5xq0J9DNySuyH-QDi)?jj;0%*@PHRaKdpnGq2YcXxM0L_~;) zh%+-YW@csp00960{{R30A^8LW000gEEC2ui02BZe000Dh(8)=wy*N7}G;WM{HHkzh zs6t%9fi%d0HcQepm#{3&(I_#A0+$;m0FJ}}WxKp?w}cH!tRNB$k|H1#RxPhVL6BGg z09nkC_M1X4*#RtJD4)}o#(?mXbR9t%Fa-%dPzMPG0V6gC3@He52a9TEFU_>xB^?a&6>B~^ R#bfrS$(b43?=Ue~0{~-MC*lAA literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/bullist.gif b/includes/tiny_mce/themes/advanced/images/bullist.gif new file mode 100644 index 0000000000000000000000000000000000000000..6e19467c70e337bbfb2a3fe3eff1bc3acab0eaec GIT binary patch literal 108 zcmZ?wbhEHb6k!ly*u>1h#Kfdz)l@%W&!*iMf|{-?85Jc}En;9`Q2fcl$iTqPpaWzB zRf;e$FdJ6vy7SNAl;>@M#YT=zObHxz&I%bBUa^s_ M6r5P1!pL9^0IPo@`~Uy| literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/buttons.gif b/includes/tiny_mce/themes/advanced/images/buttons.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d5e08b5e6c88ac89d270bdcb9b052d22b9116a9 GIT binary patch literal 3286 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 LuapS@VB7x#nmUU0 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/cancel_button_bg.gif b/includes/tiny_mce/themes/advanced/images/cancel_button_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..4b4aeefcbbba8ed33383d99e3ad38a2b9683044e GIT binary patch literal 677 zcmV;W0$Tk?Nk%w1VOjtc0K@)fLs#+_}=< z+2GjQ)C|ia%M}g|2-*$|4jAv++6)X8?f3NB2<-a^7%Bu**N)yjcm?$#=+|zcKYj)I zIjF!OVTE%a3KYO_;R1$_A3cH`Nit-~lPFRDiUhfmW6G2Q3W(6yv1UzC}*s)i?z8nAt58I(vAO9Tu2JqX_n^*5Vy?OEB-=jZ2zyA2} z=ksr%;9UfV@9G68;D7`cXyAbe9{8UkfB!Y;;DZoGDB*+@R%juG3|^?=h8%WSVGAIJ LDB_4Bh5!IN$Y@?j literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/charmap.gif b/includes/tiny_mce/themes/advanced/images/charmap.gif new file mode 100644 index 0000000000000000000000000000000000000000..3cdc4ac9134258a9a1a83b6afd5c7055bebbcbf9 GIT binary patch literal 245 zcmVJ7UM8qsvB8x<;Dr zSg7=Nn%Hi7)&KwiA^8LW0018VEC2ui02BZe000GY;3tk`X`X1RuI#x~)x&X5LaDKL zBuP+gmjjC8P!LL;h9PruTqdW2VQ_jhm?kOJM8RlI0sywOkQfrBgdlP}Q6Q310n$b# v>y*a!grF>@BLxiv8314c77P(14Hy;xh9(V(3=AWV77>droSmMZC?Nnljc8>f literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/cleanup.gif b/includes/tiny_mce/themes/advanced/images/cleanup.gif new file mode 100644 index 0000000000000000000000000000000000000000..16491f6cfcf3e1123f08352c895f8010f791c469 GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VH5xq0MrlwMm#2xdP3^ge4>(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/close.gif b/includes/tiny_mce/themes/advanced/images/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..679ca2aa47644793fc7096142233af6d18cfc9ac GIT binary patch literal 102 zcmZ?wbhEHb6ky1B=+vSZwA88iSX|!)1|*>PlZBCifrUW_BnDE;z-;WX>&`!e zQ=Y5$?qJ;7tnMTs#JpKBeE~;8w4TG9b-KTcEEZl{H}m}(h0KD}68$HZ6lMA_FjxZs D>4hO7 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/color.gif b/includes/tiny_mce/themes/advanced/images/color.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ecd5743b64464068d80fe0c306375bc0f36a3f9 GIT binary patch literal 125 zcmZ?wbhEHb6k!lxSi}GV|NsBLa^b|RS+g7*9Dr=F7=z+Z7DfgJRt6mq7o?Vf*~wzp z9Utctp08V)UYxZ)DHzz35?MDRW1X_prZuwmzXRH=pKYwZWOr?gDO&r}E WQznT77&6ApIg)ei@KZGg25SKIc`;M~ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/copy.gif b/includes/tiny_mce/themes/advanced/images/copy.gif new file mode 100644 index 0000000000000000000000000000000000000000..dc146865c5952aa48b82fc54677db621322465b9 GIT binary patch literal 263 zcmV+i0r>t$Nk%w1VH5xq0MrKnGD>2SrMb<|)0(p4GF`Q=%=coD-uwLia-!n0ztXb8 z>SB7D(cbRC&Eb``_99D}N_N7cveI&z@*+Zl!qxWT>hhwp!g8A0g0kXLg3_YG@}jE3 za+1=5r|rPV)BpegA^8LW0018VEC2ui02BZe000Gq;3tk`X`X1Rt}Ll2NgN5Sa@>ct z&})Jp0ne^?pcEK^!b{_DFiw_VrSR(z8m7&Gi9u+7k^;d~3fw9c#^BIo7zl(%`OrmN z*0>5KA}5&{3=It(2OS6o85w+K0F8|tI1CgD7JVrO2Z)Io8#2N9wc8v&jt5O5Ex Ns}n7+u(2f}06RB$bN>JU literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/custom_1.gif b/includes/tiny_mce/themes/advanced/images/custom_1.gif new file mode 100644 index 0000000000000000000000000000000000000000..4cbccdadf60dfccaf532fd56a567c47b131f80a8 GIT binary patch literal 76 zcmZ?wbhEHb6k!lySjfQ8(7@2Zz`(%B2qYALvH&S21|1+9C@TVF%TDQEdHOB?;yGKQ b7!RD8^=Ve+T!9>q%7xRawyuk2V6X-NXyp|c literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/cut.gif b/includes/tiny_mce/themes/advanced/images/cut.gif new file mode 100644 index 0000000000000000000000000000000000000000..4e9a70b6e297cfa0744d581c42868b35b0a7a204 GIT binary patch literal 187 zcmV;s07U;sNk%w1VH5xq0K*3W0z;>dm7`y6hp@H0TzRe{O`Us&m(k6|m7uZ$S-vl0 zv81W9YJ#%8z`z1cvH$=8A^8LW000jFEC2ui02BZe000DN@X1N5y*RH`2hYzS9F#DC z&mja;FrrU@G*7b_@UslKvE>g#z<@B2axx(c_%I2W2u49rARu4_N5ZktItZW!fI&z+ p0E8?Jvj7|jibsJV{#*tC#rVODXii?U706WgML@)pV literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/forecolor.gif b/includes/tiny_mce/themes/advanced/images/forecolor.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5e381425fe0f58a146d8d68141686aa517c3391 GIT binary patch literal 272 zcmV+r0q_1tNk%w1VH5xq0MrHmVgdq!0s^>+A(FDP-mWX|+>7q%%Knm4;nJw;$6E00 zq5^UP@!4qj@34~ELeii*Vv@1~0%EdyB3-fv0%8IZO0wc20s(+4wP$kLBD|J7 zDvko>y+!`AasU7TA^8LW0018VEC2ui02BZe000Gz;3tk`X`X1Rsz$-QOtXFlqcphk z8fksw4TYkR;GGIL&%qNEW(vkqtZ}da8Ux6n@PL|Z4NSmNfK(!kj37En{Dy_fq91iUI{G1P_oC3mgd#5-J3RFrN~4DUKZp W2^|}!GYA_35_SkPxVgGBApkpwVP<>) literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/help.gif b/includes/tiny_mce/themes/advanced/images/help.gif new file mode 100644 index 0000000000000000000000000000000000000000..51a1ee42073402ce787b60d151219ef7ce367615 GIT binary patch literal 295 zcmV+?0oeXWNk%w1VH5xq0Mrfu6i>3FyW3udp6K!Ub&;kbTH+f8tqUysbN$lQ^w;v!hW z!pq(wXY{hj_W%F@A^8LW0018VEC2ui02BZe000G~;3tk`X`X1Ru1KI+h83(|W>rq^ zR7RF&f!#zRnN$X{6T;$HBo?`WVllvQOo2)zp>TL49!J8HVVDe#NumhpbS0R9z=Ux~ zAoz}Cx7j!jCJ$n5dR`j5{)+~RJ$w}+Xh M?UBc{1V#pH0B+0Sa+3=zxSlW-zei2b}a=z4u4c+1=|M6#AZUG%OY1V6F^WxI(BULHv>RQKq-j zt7NjCDogO`gJ_lySi|J(sDATCUOUsGgu4xU7+ORVU(d1bXgSWKeMyMJ iI-K#xts6OY)eP+JZLJ;d&BZ;{lKm4VP7)Gium%8};6e`o literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/indent.gif b/includes/tiny_mce/themes/advanced/images/indent.gif new file mode 100644 index 0000000000000000000000000000000000000000..acd315bb16c47c2f1679bdf440b511497f9d633b GIT binary patch literal 112 zcmV-$0FVDiNk%w1VH5xq0I~!C0s;a%TAPZd(ouxs%G2Opda$m#$^ZZWA^8LW000L7 zEC2ui02BZe0009uc)HyFFv__Ay%A`;yT;Qn5S6zzgeZ{axrjp`gM=IyhY1x0spz0f SC)ctBGpEmS`C~dK2>?4to+ugs literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/insert_button_bg.gif b/includes/tiny_mce/themes/advanced/images/insert_button_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..69c131ce2992df593b0f4299bca3b823819bfafa GIT binary patch literal 703 zcmV;w0zmyoNk%w1VOjtc0K@s=_xSkz{{8#>`}z9$_xShz{{8*^{QUg;`}_L%`1kks_WJqx{r&y?{QUd-`}+F& z`T6KpoHUDH@N+q;kn@I-kkc5K66DuS_Z6KrDKY7RyI09*;fWvU%-gtB;niQErU0 zm*isj!{r@5Xn}%*gn@BrfQ5mHij9PfUyfe}2OBRWtq`cJq8+WUnh>9$sjjjey0H)tuAaQc9f1|Fwgs1#2OS*J)Y8+b*w@wD)!H1| z*x};Wufcfgl`*#qaLw)i7 z zoH>KW+zFGYhMgLD9zY-h0fGes24t9!p{j-j6DCB>;GpUR4OAyM=(>QbRjLa#3_uGO z>HrN@Gf0g)AZ^&Gar5dmTXybOr%e$Eh>L-6)xsGhB#tWqL*v4b9V>pE7=z`>iZc|> ztl2VQ$DKVp7OfcZVa0#}IK>dbvVaB+6ueeo*>VKfu`$SQfI)y|-o6|7?%lifYXPr$ z!>-Mob%f^%8bpZhntE^Fvsq(UkUGIr1<%7n7f-%?_yFe9t6xtZ{rU9?5{QT&pnm=7 z5zyOrUtfX!=lcb?pMU?kmmhlI6)505fd}4aAAtcXfPj1e&?n%97-p#9h8%WyVSMw& lC*p`CmT2OMD5j|5iYbQ3;)^iGD5Huk)M(?4INlfn06R=DYYYGY literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/italic.gif b/includes/tiny_mce/themes/advanced/images/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bb330bd0bbf61fdb5ce86388ecbeae16465bc17 GIT binary patch literal 79 zcmZ?wbhEHb6k!lySjfl#1T8Hs)z#IEjEssuS%3n}3_2iDkURsE!kqq_+b+wcJF`jEB<5wG8q|kK!gZ`FaraVVo(3d({K5uXIu`5a6TsH a;#+zDYvZ#Uy^qv#6FHB6^105+U=0A})fi&{ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/italic_ru.gif b/includes/tiny_mce/themes/advanced/images/italic_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2bb69a725e823b8e671f0640098c4fa80939b2f GIT binary patch literal 78 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgh1^shYqmVdFy0;Z@$ hzTc5`u943p7fMVz+n$-ed(#4|tKWK`2QxBQ0|3J`7vul{ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/italic_tw.gif b/includes/tiny_mce/themes/advanced/images/italic_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f6eeaa2b2111e9995584a66644dacd01ebf33e4 GIT binary patch literal 274 zcmZ?wbhEHb6k!lyI3mCxFE7u}&!3;4KY#xG^XJd|`}?n7zdk-bUSD7T{rmU(_wT=d z|9*dee|>$uy}dmH1H=FS|A8d&K=CIFBLjl~gAPaw$W8{sAA<=#Bx}ZV~!Miqw UgwLW=vT`Q(s%`JMrCAxQ0qpY;qW}N^ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/justifyright.gif b/includes/tiny_mce/themes/advanced/images/justifyright.gif new file mode 100644 index 0000000000000000000000000000000000000000..e4cea971489cf2526bd45b5044e6d3435741f830 GIT binary patch literal 70 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz$Dw#zw-23e&HEgu66Wp{rQ%^ UM8cwz_vB2umD}FE7Gtmm0QJ%n+yDRo literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/link.gif b/includes/tiny_mce/themes/advanced/images/link.gif new file mode 100644 index 0000000000000000000000000000000000000000..1accf426260eabe2f3113bab599ee26991407576 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K)|U7cWe7jH1WO&q7mgq_fHP{QhovkA|48(BJg3yUmlM zwNqn#%+lYo$Ksc#!~g&QA^8LW000jFEC2ui02BZe000DB@X1N5y*TU5yZ;lDIEo`Y zBB>;nh!jN=5Xl<{ELAJRLi`OvPeCwL9EE`(0V^O727v-Gs1O*6fC9h;473EtqJph4 d4hzK!aZXzV=z)RofG^|2SqO#J~;-aN z((?HJ(%tf+t-`|0-T(jqA^8LW000jFEC2ui02BZe000D6@X1N5y*TTfdRNNeY>8o> z4KQZPc^-wzx@G{}*+AEJzAuCxrm-U+gcqV~fj9y(hozB$v;>w-LA7!<0TB$xmeMs$ Y1>z^>8fd%Q>Wl40uW#=7ygmW|J7pwMu>b%7 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/numlist.gif b/includes/tiny_mce/themes/advanced/images/numlist.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2683522f4fbca7c59cdce63c7ac20211e006f49 GIT binary patch literal 111 zcmV-#0FeJjNk%w1VH5xq0I~%D0s;a&S(>c5(MoQ;hMLOK*yvJx*8l(jA^8LW000L7 zEC2ui02BZe0009tc)HyFFv>|=F}0bofd8LU3_`XHL13_jZKS5jZLdL qklCGA#V($?Eohv$~E=l}o!A^8LW000L7 zEC2ui02BZe0009sc)HyFFv__Ay%A`;yT+FxC|=hX#Xykdw-jk0V}u~DM=9B?30|g_ Q>jw#1h)7a$IY|HjJN(2Zp#T5? literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/paste.gif b/includes/tiny_mce/themes/advanced/images/paste.gif new file mode 100644 index 0000000000000000000000000000000000000000..1b45000a0140b8f9e04c933154c915f4322d7533 GIT binary patch literal 286 zcmV+(0pb2fNk%w1VH5xq0Mr}+LNg;3tk`X`X1Rt{>*It?NM0VL6(E zVp#@75XZ#A7$__!UdC~NbOwn>K!P;!f|hLd!H_&o5ubBI-bl_Ku=A;)xD5t@Ks^{# z+MN7ifk2od9Tj&Q6dVnQ7YGCeB^rSW3L6F-dlv)<1qEp%4jqtY1`CG`6a;PnBn}E^ kX95eB1O$f^sHqkY9smLtZoQ`}2mr#v!!X9j$Rr^EJMbBDr~m)} literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/redo.gif b/includes/tiny_mce/themes/advanced/images/redo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3af90697f0b74d0b6b07b585614a6dc67ff87f1d GIT binary patch literal 169 zcmV;a09OA;Nk%w1VH5xq0K*FaEl-kjqwqa)*O$8QUUsNeit)O{)H!9gj;!cSf8=SD z@4U+CH(H=qeZQ%{>Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/removeformat.gif b/includes/tiny_mce/themes/advanced/images/removeformat.gif new file mode 100644 index 0000000000000000000000000000000000000000..0fa3cb79734b6ddadaded7a30dbbab4cdf7ee11a GIT binary patch literal 168 zcmV;Z09XG3d^!9RvqL!@E;^*>mjX*~6o0ZXGB7YP=m6OaAbAERg(>|jPrv0~%%#ha d_MXKm)lqT2YSDtso)?w9Z@gz^T^C`n1_07v8bkm9 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/strikethrough.gif b/includes/tiny_mce/themes/advanced/images/strikethrough.gif new file mode 100644 index 0000000000000000000000000000000000000000..3264635918e2237257811a745f3a7e31b4369432 GIT binary patch literal 83 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*jFzw-23{>5`RB^ury^=8j) h^eUTr??>*V8C&%_D;C}?e9svC>)iK$`!yICtN}048)X0h literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/sub.gif b/includes/tiny_mce/themes/advanced/images/sub.gif new file mode 100644 index 0000000000000000000000000000000000000000..4d7ce30ff9147412d24dafd5ebeef67479edfa58 GIT binary patch literal 148 zcmV;F0Biq8Nk%w1VH5xq0K*9Y0|NsxQi79`kcOJVNJU7aqM%ZC%4un5GBq-gVG=Kt8X#(^7ugLSm;_S64DJ zGIDZqhMK}68X{71!TeAXEkg0%mX10Jt7ez-i0vdcUU#06Sc5 BF?Rp} literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/table.gif b/includes/tiny_mce/themes/advanced/images/table.gif new file mode 100644 index 0000000000000000000000000000000000000000..2911830c3cd9cfb588114b40205ac316ded37716 GIT binary patch literal 287 zcmV+)0pR{eNk%w1VH5xq0Mr-&4-XG=a&q$Gl8~UV)yls!N@Iej^5Wv+vYk|?#{7~x zGT6sxlB&Y;^7(>_g2~h3+KzIM(yqDEw{v33+VWCfYLcq*{{H^LvU=X>{iCqL z#mds6qN19*_y7O^A^8LW0018VEC2ui02BZe000G?;3tk`X`X1B5)?(KB@00mJQCSN zE9B*0hM>X2$p{t>MWmN#dOXbs;)npedOjg>x~OhU6O8zQIdH3l0a%P7cOqTD;bAdt z9{7i*gQ;>J6LlpUY-9lzat#_A1ttt^9EFODjU@vQ92^px5)&Jr43#7UY!VHM8yXcA lp(dna6O$XO2?L@dmz|!U8w?Bswyp)k#Kpum$jK!k06V*Ud_@2N literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/table_delete_col.gif b/includes/tiny_mce/themes/advanced/images/table_delete_col.gif new file mode 100644 index 0000000000000000000000000000000000000000..91f53af02aacbe33b04f782efb164560887d3bfe GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Fa0s;azZ{ony{xV8pTyKn*qO$Jn>V2Z^b%c^$j^>)S z^85Syjgq3Ovcf`IasU7TA^8LW000jFEC2ui02BZe000C~@X1N5y*TU5Yg=F;j03m~ z*9S7AQZ5E+6`;WiE*xJ4;S4OrVLD zq^HC5lAo_~pYs0x{r~^~A^8LW000jFEC2ui02BZe000D7@X1N5y*TU5>G|Nna879^ z3V9~RxRnWO7y-xJIHT+-78`=#Vo@mc9)Jo^FeDZl1O#9@r7(*PC}E43Bq@Wics$6M ZU5s;*CQxUf_d3_{csz*D~813(lGjTD@2z{n9^mxAJO7)Ys5OF}UnY`dU@qbmky T#N$E3kp`{PZ$%b~i~s;TfG0;) literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/table_insert_row_after.gif b/includes/tiny_mce/themes/advanced/images/table_insert_row_after.gif new file mode 100644 index 0000000000000000000000000000000000000000..b9c14466138007454958671320914d9a7d8a6db5 GIT binary patch literal 163 zcmV;U09^k^Nk%w1VH5xq0K*Od0s;b3hwZ}J{xV8pU2lbto3eVM^5XCQa(@5FN<(eWPqQV3Ig1XGua#QiUNM~QhRb*u41x>)iK!0SpY*0G3P}*Z=?k literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/underline_es.gif b/includes/tiny_mce/themes/advanced/images/underline_es.gif new file mode 100644 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/underline_fr.gif b/includes/tiny_mce/themes/advanced/images/underline_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/underline_ru.gif b/includes/tiny_mce/themes/advanced/images/underline_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..b78e2a498fb9406ef378d7c543756db552d87cba GIT binary patch literal 77 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNK2Ny ft@O9qnGc`Wq;$3l?I>E+zBOCw^tWDnRt9STq^=gR literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/underline_tw.gif b/includes/tiny_mce/themes/advanced/images/underline_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..b715390484c95c3d3311012dd541e2b46a2f4a78 GIT binary patch literal 245 zcmZ?wbhEHb6k!lyI3mihYSpUH(9n19-U$i{mY0{GIdf*_%$df<#%XD3=g*&4Qc`;V z{=J%-nvai9ety1-i;KOzeMd*f{{8!R@7~S8!0`Y7e;|nmDE?$&WMB|w&;h9d*~!3K zl%U#|k~uHKi*I6=T}Ytl*F$OTQv9tdV6_n`zCQJ Ua|%tL!OK2l4tMK(4MhfP08!6P_5c6? literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/undo.gif b/includes/tiny_mce/themes/advanced/images/undo.gif new file mode 100644 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk2euEN*a>RflBvc=VMi?aIs{*Scsi=V=*#PZ+j z{;astf|jzv(Biz+@&Et;A^8LW000jFEC2ui02BZe000Dg@X1N5y*TU5Y5N}`E=ypZ zo?#$r>naM6uI>xVQ-d%k;xmkbaDbB#Q~{NMWoQ&&iQ?mEND2guCgGWgQWh%TE;t;R zrC?g~sYnb2jsrT}bhh1bIVEWT3JYd|XL~9PPy-4A2LldqQhZ!)ii>%V0GF7VnjM^- Io)i%PJHdZeUH||9 literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/xp/tab_bg.gif b/includes/tiny_mce/themes/advanced/images/xp/tab_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..897a01f2baea1ae5f61f642f508c27f356b35260 GIT binary patch literal 694 zcmV;n0!jTxNk%w1VUPh50K@Fo9O z^8Eb#`uh6u@89F;?DO;Q@$v2O@aq2l{`U6r`uh3s@ay>a_VV)W^z`ua^X~Tc^Y!)d z@$u}Dr?mh7{{R30A^8LV00000EC2ui0FVI^000I5U_%&PX`X1Ru59bRa4gSsZQppV z?|kpu1Vq9^EE3jl(HgoTEOh>41ejE#aB*8r|OC z;Njxq>Ry;kxw7TUm@{kM z%(=7Y&!9t#9!C>oFt6t5TbcX>0AjqCgySDAyxO3~?&AYen-@t=y!-i+yC*K5ef#nAwj*aBzkGe++J%)n_rHGi z_~ZNgpFh5P|L(<$r}sa8c>VI(gJ+NLe*5z2!~0iHAKiNQ_Sx$f58u3gI&t|H25dm_ zCkt3u2SkGGWMEZW;Gomm$lxyIF~cPBOsnm+7=M9lPo_41opD-0LNQ51q(`+gvyFkl F8UVy~RVDxc literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif b/includes/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif new file mode 100644 index 0000000000000000000000000000000000000000..9dc8abe1a4f20643367ea9548fa2d93be7f0fb0b GIT binary patch literal 428 zcmV;d0aN}*Nk%w1VJrbC0J8u9k(-?1#*X>8IO~@#-Jw(NpE2?8-}$*X|HwS%i!A@g zJpcdy{QUj^0000000000A^8LV00000EC2ui04xD0000F4(1ekyy*TU5yZ>M)j$~<` zXsV(?aUgIk&vb3yc&_h!@BhG{a7Zi;2?B+3$!t2G(5Q4uty-_xtai)odcR%(V@xia z&uH^v&2GEj@VIuMl4*~XmY0~BntqX! zo@AS$qNAjxdYzx1rmL*2u8ydwlCQM2wzqGwvV^$3zQ3WmyOhAi#>ard!)M6N&d+hm z%Vp5j*2mJ*W7pi>w%OX=;^U>@)8y#sm*(2-?(gvN^7Hid)9m*7`uqI-{{IZ{0USuM zpuvOl1R`9>u%W|(3Li?GNU@@fG5cC(oZi'; + html += '' + tinyMCE.getLang('lang_author') + ''; + html += '' + tinyMCE.getLang('lang_version') + ''; + html += ''; + html += ''; + html += ''; + + for (var i=0; i' + info.longname + ''; + else + html += '' + info.longname + ''; + + if (info.authorurl != null && info.authorurl != '') + html += '' + info.author + ''; + else + html += '' + info.author + ''; + + html += '' + info.version + ''; + html += ''; + } + + html += ''; + html += ''; + + tcont.innerHTML = html; +} + +function getPluginInfo(name) { + var fn = eval('tinyMCEPopup.windowOpener.TinyMCE_' + name + '_getInfo'); + + if (typeof(fn) != 'undefined') + return fn(); + + return { + longname : name, + authorurl : '', + infourl : '', + author : '--', + version : '--' + }; +} + +function insertHelpIFrame() { + var html = ''; + + document.getElementById('iframecontainer').innerHTML = html; + + html = ''; + html += 'Got Moxie? '; + html += 'Hosted By Sourceforge '; + html += 'Also on freshmeat '; + + document.getElementById('buttoncontainer').innerHTML = html; +} diff --git a/includes/tiny_mce/themes/advanced/jscripts/anchor.js b/includes/tiny_mce/themes/advanced/jscripts/anchor.js new file mode 100644 index 0000000..a89f972 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/jscripts/anchor.js @@ -0,0 +1,59 @@ +var action, element; + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name"); + var img = inst.getFocusElement(); + action = 'insert'; + + if (anchor != null) { + element = anchor; + action = "update"; + } + + if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") { + element = img; + action = "update"; + } + + if (action == "update") + document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name"); + + document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); +} + +function insertAnchor() { + var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')); + var name = document.forms[0].anchorName.value; + + tinyMCEPopup.execCommand("mceBeginUndoLevel"); + + if (action == "update") { + if (element.nodeName == "IMG") + element.setAttribute("title", name); + else + element.setAttribute("name", name); + } else { + var rng = inst.getRng(); + + if (rng.collapse) + rng.collapse(false); + + name = name.replace(/&/g, '&'); + name = name.replace(/\"/g, '"'); + name = name.replace(//g, '&gr;'); + + html = ''; + + tinyMCEPopup.execCommand("mceInsertContent", false, html); + tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst); + } + + tinyMCEPopup.execCommand("mceEndUndoLevel"); + + tinyMCE.triggerNodeChange(); + tinyMCEPopup.close(); +} diff --git a/includes/tiny_mce/themes/advanced/jscripts/charmap.js b/includes/tiny_mce/themes/advanced/jscripts/charmap.js new file mode 100644 index 0000000..2f758cf --- /dev/null +++ b/includes/tiny_mce/themes/advanced/jscripts/charmap.js @@ -0,0 +1,324 @@ +function init() { + tinyMCEPopup.resizeToInnerSize(); +} + +var charmap = new Array(); + +// for mor details please see w3c.org +// now here is the complete list ;) + +charmap = [ + [' ', ' ', true, 'no-break space'], + ['&', '&', true, 'ampersand'], + ['"', '"', true, 'quotation mark'], +// finance + ['¢', '¢', true, 'cent sign'], + ['€', '€', true, 'euro sign'], + ['£', '£', true, 'pound sign'], + ['¥', '¥', true, 'yen sign'], +// signs + ['©', '©', true, 'copyright sign'], + ['®', '®', true, 'registered sign'], + ['™', '™', true, 'trade mark sign'], + ['‰', '‰', true, 'per mille sign'], + ['µ', 'µ', true, 'micro sign'], + ['·', '·', true, 'middle dot'], + ['•', '•', true, 'bullet'], + ['…', '…', true, 'three dot leader'], + ['′', '′', true, 'minutes / feet'], + ['″', '″', true, 'seconds / inches'], + ['§', '§', true, 'section sign'], + ['¶', '¶', true, 'paragraph sign'], + ['ß', 'ß', true, 'sharp s / ess-zed'], +// quotations + ['‹', '‹', true, 'single left-pointing angle quotation mark'], + ['›', '›', true, 'single right-pointing angle quotation mark'], + ['«', '«', true, 'left pointing guillemet'], + ['»', '»', true, 'right pointing guillemet'], + ['‘', '‘', true, 'left single quotation mark'], + ['’', '’', true, 'right single quotation mark'], + ['“', '“', true, 'left double quotation mark'], + ['”', '”', true, 'right double quotation mark'], + ['‚', '‚', true, 'single low-9 quotation mark'], + ['„', '„', true, 'double low-9 quotation mark'], + ['<', '<', true, 'less-than sign'], + ['>', '>', true, 'greater-than sign'], + ['≤', '≤', true, 'less-than or equal to'], + ['≥', '≥', true, 'greater-than or equal to'], + ['–', '–', true, 'en dash'], + ['—', '—', true, 'em dash'], + ['¯', '¯', true, 'macron'], + ['‾', '‾', true, 'overline'], + ['¤', '¤', true, 'currency sign'], + ['¦', '¦', true, 'broken bar'], + ['¨', '¨', true, 'diaeresis'], + ['¡', '¡', true, 'inverted exclamation mark'], + ['¿', '¿', true, 'turned question mark'], + ['ˆ', 'ˆ', true, 'circumflex accent'], + ['˜', '˜', true, 'small tilde'], + ['°', '°', true, 'degree sign'], + ['−', '−', true, 'minus sign'], + ['±', '±', true, 'plus-minus sign'], + ['÷', '÷', true, 'division sign'], + ['⁄', '⁄', true, 'fraction slash'], + ['×', '×', true, 'multiplication sign'], + ['¹', '¹', true, 'superscript one'], + ['²', '²', true, 'superscript two'], + ['³', '³', true, 'superscript three'], + ['¼', '¼', true, 'fraction one quarter'], + ['½', '½', true, 'fraction one half'], + ['¾', '¾', true, 'fraction three quarters'], +// math / logical + ['ƒ', 'ƒ', true, 'function / florin'], + ['∫', '∫', true, 'integral'], + ['∑', '∑', true, 'n-ary sumation'], + ['∞', '∞', true, 'infinity'], + ['√', '√', true, 'square root'], + ['∼', '∼', false,'similar to'], + ['≅', '≅', false,'approximately equal to'], + ['≈', '≈', true, 'almost equal to'], + ['≠', '≠', true, 'not equal to'], + ['≡', '≡', true, 'identical to'], + ['∈', '∈', false,'element of'], + ['∉', '∉', false,'not an element of'], + ['∋', '∋', false,'contains as member'], + ['∏', '∏', true, 'n-ary product'], + ['∧', '∧', false,'logical and'], + ['∨', '∨', false,'logical or'], + ['¬', '¬', true, 'not sign'], + ['∩', '∩', true, 'intersection'], + ['∪', '∪', false,'union'], + ['∂', '∂', true, 'partial differential'], + ['∀', '∀', false,'for all'], + ['∃', '∃', false,'there exists'], + ['∅', '∅', false,'diameter'], + ['∇', '∇', false,'backward difference'], + ['∗', '∗', false,'asterisk operator'], + ['∝', '∝', false,'proportional to'], + ['∠', '∠', false,'angle'], +// undefined + ['´', '´', true, 'acute accent'], + ['¸', '¸', true, 'cedilla'], + ['ª', 'ª', true, 'feminine ordinal indicator'], + ['º', 'º', true, 'masculine ordinal indicator'], + ['†', '†', true, 'dagger'], + ['‡', '‡', true, 'double dagger'], +// alphabetical special chars + ['À', 'À', true, 'A - grave'], + ['Á', 'Á', true, 'A - acute'], + ['Â', 'Â', true, 'A - circumflex'], + ['Ã', 'Ã', true, 'A - tilde'], + ['Ä', 'Ä', true, 'A - diaeresis'], + ['Å', 'Å', true, 'A - ring above'], + ['Æ', 'Æ', true, 'ligature AE'], + ['Ç', 'Ç', true, 'C - cedilla'], + ['È', 'È', true, 'E - grave'], + ['É', 'É', true, 'E - acute'], + ['Ê', 'Ê', true, 'E - circumflex'], + ['Ë', 'Ë', true, 'E - diaeresis'], + ['Ì', 'Ì', true, 'I - grave'], + ['Í', 'Í', true, 'I - acute'], + ['Î', 'Î', true, 'I - circumflex'], + ['Ï', 'Ï', true, 'I - diaeresis'], + ['Ð', 'Ð', true, 'ETH'], + ['Ñ', 'Ñ', true, 'N - tilde'], + ['Ò', 'Ò', true, 'O - grave'], + ['Ó', 'Ó', true, 'O - acute'], + ['Ô', 'Ô', true, 'O - circumflex'], + ['Õ', 'Õ', true, 'O - tilde'], + ['Ö', 'Ö', true, 'O - diaeresis'], + ['Ø', 'Ø', true, 'O - slash'], + ['Œ', 'Œ', true, 'ligature OE'], + ['Š', 'Š', true, 'S - caron'], + ['Ù', 'Ù', true, 'U - grave'], + ['Ú', 'Ú', true, 'U - acute'], + ['Û', 'Û', true, 'U - circumflex'], + ['Ü', 'Ü', true, 'U - diaeresis'], + ['Ý', 'Ý', true, 'Y - acute'], + ['Ÿ', 'Ÿ', true, 'Y - diaeresis'], + ['Þ', 'Þ', true, 'THORN'], + ['à', 'à', true, 'a - grave'], + ['á', 'á', true, 'a - acute'], + ['â', 'â', true, 'a - circumflex'], + ['ã', 'ã', true, 'a - tilde'], + ['ä', 'ä', true, 'a - diaeresis'], + ['å', 'å', true, 'a - ring above'], + ['æ', 'æ', true, 'ligature ae'], + ['ç', 'ç', true, 'c - cedilla'], + ['è', 'è', true, 'e - grave'], + ['é', 'é', true, 'e - acute'], + ['ê', 'ê', true, 'e - circumflex'], + ['ë', 'ë', true, 'e - diaeresis'], + ['ì', 'ì', true, 'i - grave'], + ['í', 'í', true, 'i - acute'], + ['î', 'î', true, 'i - circumflex'], + ['ï', 'ï', true, 'i - diaeresis'], + ['ð', 'ð', true, 'eth'], + ['ñ', 'ñ', true, 'n - tilde'], + ['ò', 'ò', true, 'o - grave'], + ['ó', 'ó', true, 'o - acute'], + ['ô', 'ô', true, 'o - circumflex'], + ['õ', 'õ', true, 'o - tilde'], + ['ö', 'ö', true, 'o - diaeresis'], + ['ø', 'ø', true, 'o slash'], + ['œ', 'œ', true, 'ligature oe'], + ['š', 'š', true, 's - caron'], + ['ù', 'ù', true, 'u - grave'], + ['ú', 'ú', true, 'u - acute'], + ['û', 'û', true, 'u - circumflex'], + ['ü', 'ü', true, 'u - diaeresis'], + ['ý', 'ý', true, 'y - acute'], + ['þ', 'þ', true, 'thorn'], + ['ÿ', 'ÿ', true, 'y - diaeresis'], +// ['Α', 'Α', true, 'Alpha'], + ['Β', 'Β', true, 'Beta'], + ['Γ', 'Γ', true, 'Gamma'], + ['Δ', 'Δ', true, 'Delta'], + ['Ε', 'Ε', true, 'Epsilon'], + ['Ζ', 'Ζ', true, 'Zeta'], + ['Η', 'Η', true, 'Eta'], + ['Θ', 'Θ', true, 'Theta'], + ['Ι', 'Ι', true, 'Iota'], + ['Κ', 'Κ', true, 'Kappa'], + ['Λ', 'Λ', true, 'Lambda'], + ['Μ', 'Μ', true, 'Mu'], + ['Ν', 'Ν', true, 'Nu'], + ['Ξ', 'Ξ', true, 'Xi'], + ['Ο', 'Ο', true, 'Omicron'], + ['Π', 'Π', true, 'Pi'], + ['Ρ', 'Ρ', true, 'Rho'], + ['Σ', 'Σ', true, 'Sigma'], + ['Τ', 'Τ', true, 'Tau'], + ['Υ', 'Υ', true, 'Upsilon'], + ['Φ', 'Φ', true, 'Phi'], + ['Χ', 'Χ', true, 'Chi'], + ['Ψ', 'Ψ', true, 'Psi'], + ['Ω', 'Ω', true, 'Omega'], + ['α', 'α', true, 'alpha'], + ['β', 'β', true, 'beta'], + ['γ', 'γ', true, 'gamma'], + ['δ', 'δ', true, 'delta'], + ['ε', 'ε', true, 'epsilon'], + ['ζ', 'ζ', true, 'zeta'], + ['η', 'η', true, 'eta'], + ['θ', 'θ', true, 'theta'], + ['ι', 'ι', true, 'iota'], + ['κ', 'κ', true, 'kappa'], + ['λ', 'λ', true, 'lambda'], + ['μ', 'μ', true, 'mu'], + ['ν', 'ν', true, 'nu'], + ['ξ', 'ξ', true, 'xi'], + ['ο', 'ο', true, 'omicron'], + ['π', 'π', true, 'pi'], + ['ρ', 'ρ', true, 'rho'], + ['ς', 'ς', true, 'final sigma'], + ['σ', 'σ', true, 'sigma'], + ['τ', 'τ', true, 'tau'], + ['υ', 'υ', true, 'upsilon'], + ['φ', 'φ', true, 'phi'], + ['χ', 'χ', true, 'chi'], + ['ψ', 'ψ', true, 'psi'], + ['ω', 'ω', true, 'omega'], +// symbols + ['ℵ', 'ℵ', false,'alef symbol'], + ['ϖ', 'ϖ', false,'pi symbol'], + ['ℜ', 'ℜ', false,'real part symbol'], + ['ϑ','ϑ', false,'theta symbol'], + ['ϒ', 'ϒ', false,'upsilon - hook symbol'], + ['℘', '℘', false,'Weierstrass p'], + ['ℑ', 'ℑ', false,'imaginary part'], +// arrows + ['←', '←', true, 'leftwards arrow'], + ['↑', '↑', true, 'upwards arrow'], + ['→', '→', true, 'rightwards arrow'], + ['↓', '↓', true, 'downwards arrow'], + ['↔', '↔', true, 'left right arrow'], + ['↵', '↵', false,'carriage return'], + ['⇐', '⇐', false,'leftwards double arrow'], + ['⇑', '⇑', false,'upwards double arrow'], + ['⇒', '⇒', false,'rightwards double arrow'], + ['⇓', '⇓', false,'downwards double arrow'], + ['⇔', '⇔', false,'left right double arrow'], + ['∴', '∴', false,'therefore'], + ['⊂', '⊂', false,'subset of'], + ['⊃', '⊃', false,'superset of'], + ['⊄', '⊄', false,'not a subset of'], + ['⊆', '⊆', false,'subset of or equal to'], + ['⊇', '⊇', false,'superset of or equal to'], + ['⊕', '⊕', false,'circled plus'], + ['⊗', '⊗', false,'circled times'], + ['⊥', '⊥', false,'perpendicular'], + ['⋅', '⋅', false,'dot operator'], + ['⌈', '⌈', false,'left ceiling'], + ['⌉', '⌉', false,'right ceiling'], + ['⌊', '⌊', false,'left floor'], + ['⌋', '⌋', false,'right floor'], + ['⟨', '〈', false,'left-pointing angle bracket'], + ['⟩', '〉', false,'right-pointing angle bracket'], + ['◊', '◊', true,'lozenge'], + ['♠', '♠', false,'black spade suit'], + ['♣', '♣', true, 'black club suit'], + ['♥', '♥', true, 'black heart suit'], + ['♦', '♦', true, 'black diamond suit'], + [' ', ' ', false,'en space'], + [' ', ' ', false,'em space'], + [' ', ' ', false,'thin space'], + ['‌', '‌', false,'zero width non-joiner'], + ['‍', '‍', false,'zero width joiner'], + ['‎', '‎', false,'left-to-right mark'], + ['‏', '‏', false,'right-to-left mark'], + ['­', '­', false,'soft hyphen'] +]; + +function renderCharMapHTML() { + var charsPerRow = 20, tdWidth=20, tdHeight=20; + var html = ''; + var cols=-1; + for (var i=0; i' + + charmap[i][1] + + ''; + if ((cols+1) % charsPerRow == 0) + html += ''; + } + } + if (cols % charsPerRow > 0) { + var padd = charsPerRow - (cols % charsPerRow); + for (var i=0; i '; + } + html += '
'; + document.write(html); +} + +function insertChar(chr) { + tinyMCEPopup.execCommand('mceInsertContent', false, '\&#' + chr + ';'); + + // Refocus in window + if (tinyMCEPopup.isWindow) + window.focus(); +} + +function previewChar(codeA, codeB, codeN) { + var elmA = document.getElementById('codeA'); + var elmB = document.getElementById('codeB'); + var elmV = document.getElementById('codeV'); + var elmN = document.getElementById('codeN'); + + if (codeA=='#160;') { + elmV.innerHTML = '__'; + } else { + elmV.innerHTML = '&' + codeA; + } + + elmB.innerHTML = '&' + codeA; + elmA.innerHTML = '&' + codeB; + elmN.innerHTML = codeN; +} diff --git a/includes/tiny_mce/themes/advanced/jscripts/color_picker.js b/includes/tiny_mce/themes/advanced/jscripts/color_picker.js new file mode 100644 index 0000000..1d585aa --- /dev/null +++ b/includes/tiny_mce/themes/advanced/jscripts/color_picker.js @@ -0,0 +1,107 @@ +function init() { + if (tinyMCE.isMSIE) + tinyMCEPopup.resizeToInnerSize(); +} + +function selectColor() { + var color = document.getElementById("selectedColorBox").value; + + tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color); + tinyMCEPopup.close(); +} + +function showColor(color) { + document.getElementById("selectedColor").style.backgroundColor = color; + document.getElementById("selectedColorBox").value = color; +} + +var colors = new Array( + "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033", + "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099", + "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff", + "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033", + "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399", + "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff", + "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333", + "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399", + "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff", + "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633", + "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699", + "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff", + "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633", + "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999", + "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff", + "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933", + "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999", + "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff", + "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33", + "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99", + "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff", + "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33", + "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99", + "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff", + "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33", + "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99", + "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff" +); + +function convertRGBToHex(col) { + var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); + + var rgb = col.replace(re, "$1,$2,$3").split(','); + if (rgb.length == 3) { + r = parseInt(rgb[0]).toString(16); + g = parseInt(rgb[1]).toString(16); + b = parseInt(rgb[2]).toString(16); + + r = r.length == 1 ? '0' + r : r; + g = g.length == 1 ? '0' + g : g; + b = b.length == 1 ? '0' + b : b; + + return "#" + r + g + b; + } + + return col; +} + +function convertHexToRGB(col) { + if (col.indexOf('#') != -1) { + col = col.replace(new RegExp('[^0-9A-F]', 'gi'), ''); + + r = parseInt(col.substring(0, 2), 16); + g = parseInt(col.substring(2, 4), 16); + b = parseInt(col.substring(4, 6), 16); + + return "rgb(" + r + "," + g + "," + b + ")"; + } + + return col; +} + +function renderColorMap() { + var html = ""; + var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color')); + + html += '' + + ''; + for (var i=0; i' + + '' + + '' + colors[i] +  ''; + if ((i+1) % 18 == 0) + html += ''; + } + html += '' + + '
' + + '' + + '' + + '
' + + '' + + '' + + '' + + '
' + + '' + + '
'; + + document.write(html); +} \ No newline at end of file diff --git a/includes/tiny_mce/themes/advanced/jscripts/image.js b/includes/tiny_mce/themes/advanced/jscripts/image.js new file mode 100644 index 0000000..c98eaba --- /dev/null +++ b/includes/tiny_mce/themes/advanced/jscripts/image.js @@ -0,0 +1,81 @@ +var url = tinyMCE.getParam("external_image_list_url"); +if (url != null) { + // Fix relative + if (url.charAt(0) != '/' && url.indexOf('://') == -1) + url = tinyMCE.documentBasePath + "/" + url; + + document.write(''); +} + +function insertImage() { + var src = document.forms[0].src.value; + var alt = document.forms[0].alt.value; + var border = document.forms[0].border.value; + var vspace = document.forms[0].vspace.value; + var hspace = document.forms[0].hspace.value; + var width = document.forms[0].width.value; + var height = document.forms[0].height.value; + var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value; + + tinyMCEPopup.restoreSelection(); + tinyMCE.insertImage(src, alt, border, hspace, vspace, width, height, align); + tinyMCEPopup.close(); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + for (var i=0; i'); +} + +function init() { + tinyMCEPopup.resizeToInnerSize(); + + document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link'); + + var formObj = document.forms[0]; + + for (var i=0; i 0) { + var formObj = document.forms[0]; + + for (var i=0; i', 'gi'),'\n'); + html = tinyMCE.regexpReplace(html, '
','
\n','gi'); + html = tinyMCE.regexpReplace(html, '\n\n','\n','gi'); + return html; +} + +function onLoadInit() { + tinyMCEPopup.resizeToInnerSize(); + + document.forms[0].htmlSource.value = fixContent(tinyMCE.getContent(tinyMCE.getWindowArg('editor_id'))); + resizeInputs(); + setWrap('off'); +} + +function setWrap(val) { + // hard soft off + document.forms[0].htmlSource.wrap = val; +} + +function toggleWordWrap(elm) { + if (elm.checked) + setWrap('soft'); + else + setWrap('off'); +} + +var wHeight=0, wWidth=0, owHeight=0, owWidth=0; + +function resizeInputs() { + if (!tinyMCE.isMSIE) { + wHeight = self.innerHeight-80; + wWidth = self.innerWidth-16; + } else { + wHeight = document.body.clientHeight - 80; + wWidth = document.body.clientWidth - 16; + } + + document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px'; + document.forms[0].htmlSource.style.width = Math.abs(wWidth) + 'px'; +} + +function renderWordWrap() { + if (tinyMCE.isMSIE) + document.write(''); +} diff --git a/includes/tiny_mce/themes/advanced/langs/ar.js b/includes/tiny_mce/themes/advanced/langs/ar.js new file mode 100644 index 0000000..84a2b08 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ar.js @@ -0,0 +1,63 @@ +// Arabic lang variables + +tinyMCE.addToLang('',{ +theme_style_select : 'تصاميم', +theme_code_desc : 'شفرة المصدر', +theme_code_title : 'شفرة المصدر', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'منخفض', +theme_sup_desc : 'مرتفع', +theme_hr_desc : 'إدراج خط فاصل', +theme_removeformat_desc : 'إزالة التنسيقات', +theme_custom1_desc : 'Your custom description here', +insert_image_border : 'سمك الحدود', +insert_image_dimensions : 'المواصفات', +insert_image_vspace : 'تباعد عمودي', +insert_image_hspace : 'تباعد أفقي', +insert_image_align : 'محاذاة', +insert_image_align_default : 'Default', +insert_image_align_baseline : 'على السطر', +insert_image_align_top : 'أعلى', +insert_image_align_middle : 'وسط', +insert_image_align_bottom : 'أسفل', +insert_image_align_texttop : 'أعلى النص', +insert_image_align_absmiddle : 'وسط السطر', +insert_image_align_absbottom : 'أسفل النص', +insert_image_align_left : 'يسار', +insert_image_align_right : 'يمين', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'Paragraph', +theme_div : 'Div', +theme_address : 'Address', +theme_pre : 'Preformatted', +theme_h1 : 'Heading 1', +theme_h2 : 'Heading 2', +theme_h3 : 'Heading 3', +theme_h4 : 'Heading 4', +theme_h5 : 'Heading 5', +theme_h6 : 'Heading 6', +theme_colorpicker_title : 'لون النص', +theme_colorpicker_apply : 'Apply', +theme_forecolor_desc : 'لون النص', +theme_backcolor_desc : 'Select background color', +theme_charmap_title : 'إدراج رمز..ِ', +theme_charmap_desc : 'إدراج رمز..ِ', +theme_visualaid_desc : 'Toggle guidelines/invisible elements', +insert_anchor_title : 'Insert/edit anchor', +insert_anchor_name : 'Anchor name', +theme_anchor_desc : 'Insert/edit anchor', +theme_insert_link_titlefield : 'Title', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/ca.js b/includes/tiny_mce/themes/advanced/langs/ca.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/themes/advanced/langs/cs.js b/includes/tiny_mce/themes/advanced/langs/cs.js new file mode 100644 index 0000000..09f15b6 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/cs.js @@ -0,0 +1,70 @@ +/** + * Czech lang variables + * encoding: utf-8 + * + * $Id: cs.js,v 1.10 2005/10/18 13:55:39 spocke Exp $ + */ + + +tinyMCE.addToLang('',{ +theme_style_select : 'Styly', +theme_code_desc : 'Zobrazit HTML', +theme_code_title : 'Editace HTML', +theme_code_wordwrap : 'Bez dělení slov', +theme_sub_desc : 'Dolní index', +theme_sup_desc : 'Horní index', +theme_hr_desc : 'VloÅŸit vodorovnÜ oddělovač', +theme_removeformat_desc : 'ZruÅ¡it formátování', +theme_custom1_desc : 'LibovolnÜ popisek', +insert_image_border : 'Rámeček', +insert_image_dimensions : 'Rozměry', +insert_image_vspace : 'Vertikální okraj', +insert_image_hspace : 'Horizontální okraj', +insert_image_align : 'Zarovnání', +insert_image_align_default : 'VÜchozí', +insert_image_align_baseline : 'Na účaří', +insert_image_align_top : 'Nahoru', +insert_image_align_middle : 'Na střed', +insert_image_align_bottom : 'Dolů', +insert_image_align_texttop : 'Nejvyšší bod textu', +insert_image_align_absmiddle : 'Střed řádku', +insert_image_align_absbottom : 'Spodek řádku', +insert_image_align_left : 'Vlevo', +insert_image_align_right : 'Vpravo', +theme_font_size : '-- Velikost textu --', +theme_fontdefault : '-- Písmo --', +theme_block : '-- Formát --', +theme_paragraph : 'Odstavec', +theme_div : 'Div', +theme_address : 'Adresa', +theme_pre : 'Předformát', +theme_h1 : 'Nadpis 1', +theme_h2 : 'Nadpis 2', +theme_h3 : 'Nadpis 3', +theme_h4 : 'Nadpis 4', +theme_h5 : 'Nadpis 5', +theme_h6 : 'Nadpis 6', +theme_colorpicker_title : 'VÜběr barvy', +theme_colorpicker_apply : 'Vybrat', +theme_forecolor_desc : 'Barva popředí', +theme_backcolor_desc : 'Barva pozadí', +theme_charmap_title : 'VÜběr znaku', +theme_charmap_desc : 'VloÅŸit znak', +theme_visualaid_desc : 'Zapnout značky/neviditelné prvky', +insert_anchor_title : 'VloÅŸení/editace záloÅŸky', +insert_anchor_name : 'Název', +theme_anchor_desc : 'VloÅŸit/editovat záloÅŸku', +theme_insert_link_titlefield : 'Název', +theme_clipboard_msg : 'Funkce Kopírovat/vyjmout/vloÅŸit nejsou pouÅŸitelné v Mozille a Firefoxu.\nChcete více informací o tomto problému?', +theme_path : 'Cesta', +cut_desc : 'Vyjmout', +copy_desc : 'Kopírovat', +paste_desc : 'VloÅŸit', +link_list : 'Seznam', +image_list : 'Seznam', +browse : 'Procházet', +image_props_desc : 'Vlastnosti obrázku', +newdocument_desc : 'NovÜ dokument', +newdocument : 'Jste si opravdu jistÜ(á), ÅŸe chcete vymazat veÅ¡kerÜ obsah?' +}); + diff --git a/includes/tiny_mce/themes/advanced/langs/cy.js b/includes/tiny_mce/themes/advanced/langs/cy.js new file mode 100644 index 0000000..a8b4993 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/cy.js @@ -0,0 +1,76 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- Arddulliau --', +theme_code_desc : 'Golygu côd HTML', +theme_code_title : 'Golygydd Côd HTML', +theme_code_wordwrap : 'Amlapio geiriau', +theme_sub_desc : 'Is-sgript', +theme_sup_desc : 'Uwch-sgript', +theme_hr_desc : 'Mewnosod llinell llorweddol', +theme_removeformat_desc : 'Diddymu fformatio', +theme_custom1_desc : 'Dy ddisgrifiad fan hyn', +insert_image_border : 'Ymyl', +insert_image_dimensions : 'Meintiau', +insert_image_vspace : 'Gofod fertigol', +insert_image_hspace : 'Gofod llorweddol', +insert_image_align : 'Unioniad', +insert_image_align_default : '-- Heb ddewis --', +insert_image_align_baseline : 'Gwaelodlin', +insert_image_align_top : 'Brig', +insert_image_align_middle : 'Canol', +insert_image_align_bottom : 'Gwaelod', +insert_image_align_texttop : 'Brig Testun', +insert_image_align_absmiddle : 'Canol Union', +insert_image_align_absbottom : 'Gwaelod Union', +insert_image_align_left : 'Chwith', +insert_image_align_right : 'Dde', +theme_font_size : '-- Maint ffont --', +theme_fontdefault : '-- Teulu ffont --', +theme_block : '-- Fformat --', +theme_paragraph : 'Paragraff', +theme_div : 'Div', +theme_address : 'Cyfeiriad', +theme_pre : 'Rhag-fformatiwyd', +theme_h1 : 'Pennawd 1', +theme_h2 : 'Pennawd 2', +theme_h3 : 'Pennawd 3', +theme_h4 : 'Pennawd 4', +theme_h5 : 'Pennawd 5', +theme_h6 : 'Pennawd 6', +theme_colorpicker_title : 'Dewis lliw', +theme_colorpicker_apply : 'Gosod', +theme_forecolor_desc : 'Dewis lliw testun', +theme_backcolor_desc : 'Dewis lliw cefndir', +theme_charmap_title : 'Dewis llythyren arbennig', +theme_charmap_desc : 'Gosod llythyren arbennig', +theme_visualaid_desc : 'Gwrthdroi canllawiau/elfennau anweledig', +insert_anchor_title : 'Mewnosod/golygu angor', +insert_anchor_name : 'Enw angor', +theme_anchor_desc : 'Mewnosod/golygu angor', +theme_insert_link_titlefield : 'Teitl', +theme_clipboard_msg : 'Dyw Copïo/Torri/Gludo ddim ar gael ym Mozilla na Firefox.\nHoffet ti ragor o wybodaeth ynghylch hyn?', +theme_path : 'Llwybr', +cut_desc : 'Torri', +copy_desc : 'Copïo', +paste_desc : 'Gludo', +link_list : 'Rhestr dolenni', +image_list : 'Rhestr delweddau', +browse : 'Pori', +image_props_desc : 'Priodoleddau delwedd', +newdocument_desc : 'Dogfen newydd', +class_name : 'Dosbarth', +newdocument : 'Wyt ti\'n sicr eisiau clirio\'r holl gynnwys?', +about_title : 'Ynglŷn â TinyMCE', +about : 'Ynglŷn â', +license : 'Trwydded', +plugins : 'Ategynnau', +plugin : 'Ategyn', +author : 'Awdur', +version : 'Fersiwn', +loaded_plugins : 'Ategynnau gweithredol', +help : 'Cymorth', +not_set : '-- Heb ddewis --', +close : 'Cau', +toolbar_focus : 'Neidio i fotymau offer - Alt+Q, Neidio i\'r golygydd - Alt+Z, Neidio i lwybr y elfen - Alt+X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/da.js b/includes/tiny_mce/themes/advanced/langs/da.js new file mode 100644 index 0000000..fb28a37 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/da.js @@ -0,0 +1,75 @@ +// DK lang variables contributed by Jan Moelgaard + +tinyMCE.addToLang('',{ +theme_style_select : '-- Styles --', +theme_code_desc : 'Rediger HTML kode', +theme_code_title : 'HTML Kodeeditor', +theme_code_wordwrap : 'Ombrydning', +theme_sub_desc : 'Sænket skrift', +theme_sup_desc : 'Hævet skrift', +theme_hr_desc : 'Indsæt horisontal linje', +theme_removeformat_desc : 'Fjern formatering', +theme_custom1_desc : 'Indsæt din egen beskrivelse her', +insert_image_border : 'Kant', +insert_image_dimensions : 'Dimensioner', +insert_image_vspace : 'Flyt til venstre', +insert_image_hspace : 'Flyt til højre', +insert_image_align : 'Justering', +insert_image_align_default : 'Standard', +insert_image_align_baseline : 'Bundlinje', +insert_image_align_top : 'Top', +insert_image_align_middle : 'Midt i', +insert_image_align_bottom : 'I bunden', +insert_image_align_texttop : 'I toppen af teksten', +insert_image_align_absmiddle : 'Absolut midte', +insert_image_align_absbottom : 'Absolut bund', +insert_image_align_left : 'Venstre', +insert_image_align_right : 'Højre', +theme_font_size : '-- Font størrelse --', +theme_fontdefault : '-- Font gruppe --', +theme_block : '-- Typografi --', +theme_paragraph : 'Afsnit', +theme_div : 'Div', +theme_address : 'Addresse', +theme_pre : 'Præformateret', +theme_h1 : 'Overskrift 1', +theme_h2 : 'Overskrift 2', +theme_h3 : 'Overskrift 3', +theme_h4 : 'Overskrift 4', +theme_h5 : 'Overskrift 5', +theme_h6 : 'Overskrift 6', +theme_colorpicker_title : 'Vælg en farve', +theme_colorpicker_apply : 'Anvend', +theme_forecolor_desc : 'Vælg forgrundsfarve', +theme_backcolor_desc : 'Vælg baggrundsfarve', +theme_charmap_title : 'Vælg specialkarakter', +theme_charmap_desc : 'Indsæt specialkarakter', +theme_visualaid_desc : 'Slå linjer/usynlige elementer til og fra', +insert_anchor_title : 'Indsæt/rediger bogmærke', +insert_anchor_name : 'Bogmærkets navn', +theme_anchor_desc : 'Indsæt/rediger bogmærke', +theme_insert_link_titlefield : 'Title', +theme_clipboard_msg : 'Kopier/Klip/Indsæt virker ikke i Mozilla og Firefox.\nVil du vide mere om dette?', +theme_path : 'Sti', +cut_desc : 'Klip', +copy_desc : 'Kopier', +paste_desc : 'Indsæt', +link_list : 'Linkliste', +image_list : 'Billedliste', +browse : 'Gennemse', +image_props_desc : 'Billedegenskaber', +newdocument_desc : 'Nyt dokument', +class_name : 'Klasse', +newdocument : 'Er du sikker på, at du vil slette alt?', +about_title : 'Om TinyMCE', +about : 'Om', +license : 'Licens', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Forfatter', +version : 'Version', +loaded_plugins : 'Indlæste plugins', +help : 'Hjælp', +not_set : '-- Ikke defineret --', +close : 'Luk' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/de.js b/includes/tiny_mce/themes/advanced/langs/de.js new file mode 100644 index 0000000..1e1cabf --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/de.js @@ -0,0 +1,76 @@ +// DE lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- CSS-Stile --', +theme_code_desc : 'HTML-Quelltext editieren', +theme_code_title : 'HTML-Quelltexteditor', +theme_code_wordwrap : 'Zeilenumbruch', +theme_sub_desc : 'Tiefergestellt', +theme_sup_desc : 'Hochgestellt', +theme_hr_desc : 'Horizontalen Balken einfügen', +theme_removeformat_desc : 'Formatierung löschen', +theme_custom1_desc : 'Eigene Beschreibung', +insert_image_border : 'Rahmen', +insert_image_dimensions : 'Größe', +insert_image_vspace : 'Vertikaler Raum', +insert_image_hspace : 'Horizontaler Raum', +insert_image_align : 'Ausrichtung', +insert_image_align_default : '-- Nicht festgelegt --', +insert_image_align_baseline : 'Grundlinie', +insert_image_align_top : 'Oben', +insert_image_align_middle : 'Mitte', +insert_image_align_bottom : 'Unten', +insert_image_align_texttop : 'Mit dem Text', +insert_image_align_absmiddle : 'Absolute mittig', +insert_image_align_absbottom : 'Absolut unten', +insert_image_align_left : 'Links', +insert_image_align_right : 'Rechts', +theme_font_size : '-- Schriftgröße --', +theme_fontdefault : '-- Schriftfamilie --', +theme_block : '-- Format --', +theme_paragraph : 'Absatz', +theme_div : 'Block', +theme_address : 'Adresse', +theme_pre : 'Vorformatiert', +theme_h1 : 'Überschrift 1', +theme_h2 : 'Überschrift 2', +theme_h3 : 'Überschrift 3', +theme_h4 : 'Überschrift 4', +theme_h5 : 'Überschrift 5', +theme_h6 : 'Überschrift 6', +theme_colorpicker_title : 'Farbe auswählen', +theme_colorpicker_apply : 'Farbe festlegen', +theme_forecolor_desc : 'Schriftfarbe auswählen', +theme_backcolor_desc : 'Hintergrundfarbe auswählen', +theme_charmap_title : 'Sonderzeichen einfügen', +theme_charmap_desc : 'Sonderzeichen einfügen', +theme_visualaid_desc : 'Hilfslinen/Unsichtbare Elemente anzeigen', +insert_anchor_title : 'Anker einfügen/bearbeiten', +insert_anchor_name : 'Ankername', +theme_anchor_desc : 'Anker einfügen/bearbeiten', +theme_insert_link_titlefield : 'Titel', +theme_clipboard_msg : 'Zwischenablagefunktionen sind in Mozilla und Firefox nicht verfügbar.\nWünschen Sie hierzu weitere Informationen?', +theme_path : 'Pfad', +cut_desc : 'Ausschneiden', +copy_desc : 'Kopieren', +paste_desc : 'Einfügen', +link_list : 'Hyperlink-Liste', +image_list : 'Bild-Liste', +browse : 'Durchsuchen', +image_props_desc : 'Bildeigenschaften', +newdocument_desc : 'Neues Dokument', +class_name : 'CSS-Klasse', +newdocument : 'Sind Sie sicher, dass Sie alle Inhalte löschen wollen?', +about_title : 'Über TinyMCE', +about : 'Über', +license : 'Lizenz', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Autor', +version : 'Version', +loaded_plugins : 'Geladene Plugins', +help : 'Hilfe', +not_set : '-- Nicht festgelegt --', +close : 'Schließen', +toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/el.js b/includes/tiny_mce/themes/advanced/langs/el.js new file mode 100644 index 0000000..d5c5b89 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/el.js @@ -0,0 +1,64 @@ +// Greek lang variables by Jacaranda Bill + +tinyMCE.addToLang('',{ +theme_style_select : 'ÈÝìáôá', +theme_code_desc : 'Åðåîåñãáóßá HTML êþäéêá', +theme_code_title : 'ÅðåîåñãáóôÞò HTML', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'Äåßêôçò', +theme_sup_desc : 'ÅêèÝôçò', +theme_hr_desc : 'ÅéóáãùãÞ ïñéæüíôéáò ãñáììÞò', +theme_removeformat_desc : 'ÁðáëïéöÞ ìïñöïðïßçóçò', +theme_custom1_desc : 'ÐåñéãñáöÞ', +insert_image_border : 'Ðåñßãñáììá', +insert_image_dimensions : 'ÄéáóôÜóåéò', +insert_image_vspace : 'ÊÜè. ðåñéèþñéï', +insert_image_hspace : 'Ïñéæ. ðåñéèþñéï', +insert_image_align : 'Óôïß÷éóç', +insert_image_align_default : 'ÐñïêáèïñéóìÝíç', +insert_image_align_baseline : 'Óå åõèõãñÜììéóç ìå ôï êåßìåíï', +insert_image_align_top : 'ÐÜíù', +insert_image_align_middle : 'Óôï êÝíôñï', +insert_image_align_bottom : 'ÊÜôù', +insert_image_align_texttop : 'Ôï êåßìåíï ðÜíù', +insert_image_align_absmiddle : 'Áðüëõôá óôï êÝíôñï', +insert_image_align_absbottom : 'Áðüëõôá êÜôù', +insert_image_align_left : 'ÁñéóôåñÜ', +insert_image_align_right : 'ÄåîéÜ', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'ÐáñÜãñáöïò', +theme_div : 'Div', +theme_address : 'Äéåýèõíóç', +theme_pre : 'Preformatted', +theme_h1 : 'Åðéêåöáëßäá 1', +theme_h2 : 'Åðéêåöáëßäá 2', +theme_h3 : 'Åðéêåöáëßäá 3', +theme_h4 : 'Åðéêåöáëßäá 4', +theme_h5 : 'Åðéêåöáëßäá 5', +theme_h6 : 'Åðéêåöáëßäá 6', +theme_colorpicker_title : '×ñþìáôá', +theme_colorpicker_apply : 'ÅöáñìïãÞ', +theme_forecolor_desc : 'ÅðéëïãÞ ÷ñþìáôïò ãñáììáôïóåéñÜò', +theme_backcolor_desc : 'Select background color', +theme_charmap_title : 'ÅðéëïãÞ åéäéêïý ÷áñáêôÞñá', +theme_charmap_desc : 'ÅéóáãùãÞ åéäéêïý ÷áñáêôÞñá', +theme_visualaid_desc : 'ÅìöÜíéóç/Áðüêñõøç ãñáììþí', +insert_anchor_title : 'ÅéóáãùãÞ/Äéüñèùóç Üãêõñáò', +insert_anchor_name : 'Ïíïìáóßá Üãêõñáò', +theme_anchor_desc : 'ÅéóáãùãÞ/Äéüñèùóç Üãêõñáò', +theme_insert_link_titlefield : 'Ôßôëïò', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +class_name : 'ÊëÜóç', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/en.js b/includes/tiny_mce/themes/advanced/langs/en.js new file mode 100644 index 0000000..71184f7 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/en.js @@ -0,0 +1,76 @@ +// UK lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- Styles --', +theme_code_desc : 'Edit HTML Source', +theme_code_title : 'HTML Source Editor', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'Subscript', +theme_sup_desc : 'Superscript', +theme_hr_desc : 'Insert horizontal ruler', +theme_removeformat_desc : 'Remove formatting', +theme_custom1_desc : 'Your custom description here', +insert_image_border : 'Border', +insert_image_dimensions : 'Dimensions', +insert_image_vspace : 'Vertical space', +insert_image_hspace : 'Horizontal space', +insert_image_align : 'Alignment', +insert_image_align_default : '-- Not set --', +insert_image_align_baseline : 'Baseline', +insert_image_align_top : 'Top', +insert_image_align_middle : 'Middle', +insert_image_align_bottom : 'Bottom', +insert_image_align_texttop : 'TextTop', +insert_image_align_absmiddle : 'Absolute Middle', +insert_image_align_absbottom : 'Absolute Bottom', +insert_image_align_left : 'Left', +insert_image_align_right : 'Right', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'Paragraph', +theme_div : 'Div', +theme_address : 'Address', +theme_pre : 'Preformatted', +theme_h1 : 'Heading 1', +theme_h2 : 'Heading 2', +theme_h3 : 'Heading 3', +theme_h4 : 'Heading 4', +theme_h5 : 'Heading 5', +theme_h6 : 'Heading 6', +theme_colorpicker_title : 'Select a color', +theme_colorpicker_apply : 'Apply', +theme_forecolor_desc : 'Select text color', +theme_backcolor_desc : 'Select background color', +theme_charmap_title : 'Select custom character', +theme_charmap_desc : 'Insert custom character', +theme_visualaid_desc : 'Toggle guidelines/invisible elements', +insert_anchor_title : 'Insert/edit anchor', +insert_anchor_name : 'Anchor name', +theme_anchor_desc : 'Insert/edit anchor', +theme_insert_link_titlefield : 'Title', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +class_name : 'Class', +newdocument : 'Are you sure you want clear all contents?', +about_title : 'About TinyMCE', +about : 'About', +license : 'License', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Author', +version : 'Version', +loaded_plugins : 'Loaded plugins', +help : 'Help', +not_set : '-- Not set --', +close : 'Close', +toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/es.js b/includes/tiny_mce/themes/advanced/langs/es.js new file mode 100644 index 0000000..01dd981 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/es.js @@ -0,0 +1,101 @@ +/** + * ES lang variables + * + * Authors : Alvaro Velasco, + * Adolfo Sanz De Diego (asanzdiego) , + * Carlos C Soto (eclipxe) + * Last Updated : October 17, 2005 + * TinyMCE Version : 2.0RC3 + */ + +tinyMCE.addToLang('',{ +theme_style_select : '-- Estilos --', +theme_code_desc : 'Editar código HTML', +theme_code_title : 'Editor código HTML', +theme_code_wordwrap : 'Ajuste de línea', +theme_sub_desc : 'Subíndice', +theme_sup_desc : 'Superíndice', +theme_hr_desc : 'Insertar una barra horizontal', +theme_removeformat_desc : 'Quitar formato', +theme_custom1_desc : 'Tu descripción aquí', +insert_image_border : 'Borde', +insert_image_dimensions : 'Dimensiones', +insert_image_vspace : 'Espacio vertical', +insert_image_hspace : 'Espacio horizontal', +insert_image_align : 'Alineación', +insert_image_align_default : '-- Por defecto --', +insert_image_align_baseline : 'Linea base', +insert_image_align_top : 'Arriba', +insert_image_align_middle : 'Centrado', +insert_image_align_bottom : 'Abajo', +insert_image_align_texttop : 'Texto arriba', +insert_image_align_absmiddle : 'Centrado total', +insert_image_align_absbottom : 'Abajo total', +insert_image_align_left : 'Izquierda', +insert_image_align_right : 'Derecha', +theme_font_size : '-- Tamaño del texto --', +theme_fontdefault : '-- Tipo de fuente --', +theme_block : '-- Formato del texto --', +theme_paragraph : 'Párrafo', +theme_div : 'Capa', +theme_address : 'Dirección', +theme_pre : 'Preformateado', +theme_h1 : 'Título 1', +theme_h2 : 'Título 2', +theme_h3 : 'Título 3', +theme_h4 : 'Título 4', +theme_h5 : 'Título 5', +theme_h6 : 'Título 6', +theme_colorpicker_title : 'Selecciona un color', +theme_colorpicker_apply : 'Aplicar', +theme_forecolor_desc : 'Selecciona un color para el texto', +theme_backcolor_desc : 'Selecciona un color de fondo', +theme_charmap_title : 'Selecciona un carácter especial', +theme_charmap_desc : 'Inserta un carácter especial', +theme_charmap_all_title : 'Todos', +theme_charmap_all_desc : 'Todos los caracteres', +theme_charmap_alpha_title : 'Alfabéticos', +theme_charmap_alpha_desc : 'Caracteres alfabéticos', +theme_charmap_arrows_title : 'Flechas', +theme_charmap_arrows_desc : 'Caracteres de flechas', +theme_charmap_greek_title : 'Griegos', +theme_charmap_greek_desc : 'Caracteres Griegos', +theme_charmap_math_title : 'Mathemáticos', +theme_charmap_math_desc : 'Caracteres mathemáticos', +theme_charmap_misc_title : 'Misceláneos', +theme_charmap_misc_desc : 'Caracteres misceláneos', +theme_charmap_money_title : 'Monedas', +theme_charmap_money_desc : 'Caracteres de monedas', +theme_charmap_quotaion_title : 'Comillas', +theme_charmap_quotaion_desc : 'Caracteres de comillas', +theme_visualaid_desc : 'Cambiar las líneas de ayuda por elementos invisibles', +insert_anchor_title : 'Insertar/editar ancla', +insert_anchor_name : 'Nombre del ancla', +theme_anchor_desc : 'Insertar/editar ancla', +theme_insert_link_titlefield : 'Título', +theme_clipboard_msg : 'No se pueden utilizar los comandos Copiar / Cortar / Pegar en Mozilla y en Firefox.\r\nUse el teclado Copiar (Ctrl+C) / Cortar (Ctrl+X) / Pegar (Ctrl+V)\r\n¿Quieres obtener más información?', +theme_path : 'Ruta', +cut_desc : 'Cortar (Ctrl+X)', +copy_desc : 'Copiar (Ctrl+C)', +paste_desc : 'Pegar (Ctrl+V)', +link_list : 'Lista de enlaces', +image_list : 'Lista de imágenes', +browse : 'Navegar', +image_props_desc : 'Propiedades de la imagen', +newdocument_desc : 'Nuevo documento', +class_name : 'Clase', +newdocument : '¿Estás seguro de que quieres borrar todo el contenido?', +about_title : 'Acerca de TinyMCE', +about : 'Acerca', +license : 'Licencia', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Autor', +version : 'Versión', +loaded_plugins : 'Plugins cargados', +help : 'Ayuda', +not_set : '-- Por defecto --', +close : 'Cerrar', +toolbar_focus : 'Saltar a la barra de herramientas - Alt+Q, Saltar al editor - Alt+Z, Saltar al elemento de la ruta - Alt+X', +theme_advanced_anchor_delta_width : 20 +}); diff --git a/includes/tiny_mce/themes/advanced/langs/fa.js b/includes/tiny_mce/themes/advanced/langs/fa.js new file mode 100644 index 0000000..9982791 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/fa.js @@ -0,0 +1,65 @@ +// IR lang variables +// Persian (Farsi) language pack (for IRAN) +// By: Morteza Zafari +// Lost@LostLord.com +// http://www.LostLord.com + +tinyMCE.addToLang('',{ +dir : 'rtl', +theme_style_select : '????', +theme_code_desc : '?????? ????', +theme_code_title : 'HTML ???????? ????', +theme_code_wordwrap : '?? ???', +theme_sub_desc : '??? ????', +theme_sup_desc : '???? ????', +theme_hr_desc : '??? ?? ????', +theme_removeformat_desc : '??? ?? ??? ???? ????', +theme_custom1_desc : 'Your custom description here', +insert_image_border : '?????', +insert_image_dimensions : '?????', +insert_image_vspace : '????? ?????', +insert_image_hspace : '????? ????', +insert_image_align : '??? ????????', +insert_image_align_default : '??? ???', +insert_image_align_baseline : '?? ????', +insert_image_align_top : '????', +insert_image_align_middle : '???', +insert_image_align_bottom : '?????', +insert_image_align_texttop : '????? ???', +insert_image_align_absmiddle : '??? ????', +insert_image_align_absbottom : '????? ????', +insert_image_align_left : '??', +insert_image_align_right : '????', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : '????????', +theme_div : 'Div', +theme_address : '????', +theme_pre : '?? ??? ????? ???', +theme_h1 : '???? 1', +theme_h2 : '???? 2', +theme_h3 : '???? 3', +theme_h4 : '???? 4', +theme_h5 : '???? 5', +theme_h6 : '???? 6', +theme_colorpicker_title : '??? ?? ?????? ????', +theme_colorpicker_apply : '?????', +theme_forecolor_desc : '?????? ??? ???', +theme_backcolor_desc : '?????? ??? ?????', +theme_charmap_title : '?????? ??????? ????', +theme_charmap_desc : '??? ??????? ????', +theme_visualaid_desc : '????? ???? ???? ? ????? ??????', +insert_anchor_title : '??? ? ?????? Anchor', +insert_anchor_name : '??? Anchor', +theme_anchor_desc : '??? ? ?????? Anchor', +theme_insert_link_titlefield : '?????', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : '????', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/fi.js b/includes/tiny_mce/themes/advanced/langs/fi.js new file mode 100644 index 0000000..e69de29 diff --git a/includes/tiny_mce/themes/advanced/langs/fr.js b/includes/tiny_mce/themes/advanced/langs/fr.js new file mode 100644 index 0000000..bf16316 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/fr.js @@ -0,0 +1,78 @@ +// Canadian French lang variables by Virtuelcom +// Modify by Laurent Dran 13-02-2006 +// Modifié par Normand Lamoureux le 2005-11-12 + +tinyMCE.addToLang('',{ +theme_style_select : '-- Style --', +theme_code_desc : 'Afficher le code source', +theme_code_title : 'Édititon du code source', +theme_code_wordwrap : 'Retour à la ligne automatique', +theme_sub_desc : 'Indice', +theme_sup_desc : 'Exposant', +theme_hr_desc : 'Insérer une règle horizontale ordinaire', +theme_removeformat_desc : 'Supprimer le formattage', +theme_custom1_desc : 'Votre description personnalisée ici', +insert_image_border : 'Bordure', +insert_image_dimensions : 'Dimensions', +insert_image_vspace : 'Espacement vertical', +insert_image_hspace : 'Espacement horizontal', +insert_image_align : 'Alignement', +insert_image_align_default : '-- Indéfini --', +insert_image_align_baseline : 'Ligne de base', +insert_image_align_top : 'Haut', +insert_image_align_middle : 'Milieu', +insert_image_align_bottom : 'Bas', +insert_image_align_texttop : 'Haut du texte', +insert_image_align_absmiddle : 'Milieu absolu', +insert_image_align_absbottom : 'Bas absolu', +insert_image_align_left : 'En flottement à gauche', +insert_image_align_right : 'En flottement à droite', +theme_font_size : '-- Taille --', +theme_fontdefault : '-- Police --', +theme_block : '-- Bloc de texte --', +theme_paragraph : 'Paragraphe', +theme_div : 'Div', +theme_address : 'Infos sur l\'auteur', +theme_pre : 'Texte préformaté', +theme_h1 : 'Titre de niveau 1', +theme_h2 : 'Titre de niveau 2', +theme_h3 : 'Titre de niveau 3', +theme_h4 : 'Titre de niveau 4', +theme_h5 : 'Titre de niveau 5', +theme_h6 : 'Titre de niveau 6', +theme_colorpicker_title : 'Choisir une couleur', +theme_colorpicker_apply : 'Appliquer', +theme_forecolor_desc : 'Couleur du texte', +theme_backcolor_desc : 'Couleur d\'arrière-plan', +theme_charmap_title : 'Sélectionner un charactère spécial', +theme_charmap_desc : 'Insérer un charactère spécial', +theme_visualaid_desc : 'Activer/Désactiver les lignes guides et les éléments invisibles', +insert_anchor_title : 'Gestionnaire d\'ancre', +insert_anchor_name : 'Nom de l\'ancre', +theme_anchor_desc : 'Insérer/Modifier une ancre', +theme_insert_link_titlefield : 'Info-bulle', +theme_clipboard_msg : 'Pour des raisons de sécurité, les fonctions « Copier », « Couper » et « Coller »\nne sont pas disponibles dans Mozilla et Firefox.\n\n\nVoulez-vous plus d\'information à ce sujet?\n', +theme_path : 'Élément(s) en cours ', +cut_desc : 'Couper', +copy_desc : 'Copier', +paste_desc : 'Coller', +link_list : 'Lien de la liste', +image_list : 'Image de la liste', +browse : 'Naviguer', +image_props_desc : 'Propriétés de l\'image', +newdocument_desc : 'Nouveau document', +class_name : 'Classe CSS', +newdocument : 'Êtes-vous sûr de vouloir supprimer tout le contenu ?', +about_title : 'À propos de TinyMCE', +about : 'À propos', +license : 'License', +plugins : 'Extensions', +plugin : 'Extension', +author : 'Auteur', +version : 'Version', +loaded_plugins : 'Extensions installées', +help : 'Aide', +not_set : '-- Indéfini --', +close : 'Fermer', +toolbar_focus : 'Atteindre la barre d\'outils (Alt+Q), Atteindre l\'éditeur (Alt-Z), Atteindre l\'élément en cours (Alt-X)' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/fr_ca.js b/includes/tiny_mce/themes/advanced/langs/fr_ca.js new file mode 100644 index 0000000..52a155c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/fr_ca.js @@ -0,0 +1,64 @@ +// Canadian French lang variables by Virtuelcom last modification: 2005-06-15 + +tinyMCE.addToLang('',{ +theme_style_select : '-- Styles --', +theme_code_desc : 'Modifier le code source HTML', +theme_code_title : 'Éditeur de code source HTML', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'Souscrit', +theme_sup_desc : 'Indice supérieur', +theme_hr_desc : 'Insérer un séparateur horizontal', +theme_removeformat_desc : 'Supprimer le formattage', +theme_custom1_desc : 'Votre description personnalisée ici', +insert_image_border : 'Bordure', +insert_image_dimensions : 'Dimensions', +insert_image_vspace : 'VSpace', +insert_image_hspace : 'HSpace', +insert_image_align : 'Alignement', +insert_image_align_default : 'Défaut', +insert_image_align_baseline : 'Baseline', +insert_image_align_top : 'Haut', +insert_image_align_middle : 'Milieu', +insert_image_align_bottom : 'Bas', +insert_image_align_texttop : 'TextTop', +insert_image_align_absmiddle : 'Milieu absolu', +insert_image_align_absbottom : 'Bas absolu', +insert_image_align_left : 'Gauche', +insert_image_align_right : 'Droit', +theme_font_size : 'Taille', +theme_fontdefault : '-- Police --', +theme_block : '-- Format --', +theme_paragraph : 'Paragraphe', +theme_div : 'Div', +theme_address : 'Addresse', +theme_pre : 'Préformatté', +theme_h1 : 'Entête 1', +theme_h2 : 'Entête 2', +theme_h3 : 'Entête 3', +theme_h4 : 'Entête 4', +theme_h5 : 'Entête 5', +theme_h6 : 'Entête 6', +theme_colorpicker_title : 'Choisir une couleur', +theme_colorpicker_apply : 'Appliquer', +theme_forecolor_desc : 'Choisir la couleur d\'avant plan', +theme_backcolor_desc : 'Choisir une couleur d\'arrière plan', +theme_charmap_title : 'Sélectionner un charactère spécial', +theme_charmap_desc : 'Insérer un charactère spécial', +theme_visualaid_desc : 'Active/Désactive les lignes guides et les éléments invisibles', +insert_anchor_title : 'Insérer/Modifier une ancre', +insert_anchor_name : 'Nom de l\'ancre', +theme_anchor_desc : 'Insérer / Modifier une ancre', +theme_insert_link_titlefield : 'Titre', +theme_clipboard_msg : 'Copier/Couper/Coller ne sont pas disponibles dans Mozilla et FireFox.\nDésirez-vous consulter de plus amples informations à ce sujet?', +theme_path : 'Chemin', +cut_desc : 'Couper', +copy_desc : 'Copier', +paste_desc : 'Coller', +link_list : 'Liste de liens', +image_list : 'Liste d\'images', +browse : 'Sélectionner', +image_props_desc : 'Propriétés de l\'image', +newdocument_desc : 'Nouveau Document', +class_name : 'Classe', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/he.js b/includes/tiny_mce/themes/advanced/langs/he.js new file mode 100644 index 0000000..0e8ec02 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/he.js @@ -0,0 +1,76 @@ +// HE lang variables by Liron Newman, http://eesh.net + +tinyMCE.addToLang('',{ +theme_style_select : '-- ñéâðåðåú --', +theme_code_desc : 'òøåê àú ÷åã ä-HTML', +theme_code_title : 'òåøê ÷åã HTML', +theme_code_wordwrap : 'âìéùú ùåøåú', +theme_sub_desc : 'ëúá úçúé', +theme_sup_desc : 'ëúá òéìé', +theme_hr_desc : 'äëðñ ÷å àåô÷é', +theme_removeformat_desc : 'äñø òéöåá', +theme_custom1_desc : 'äúéàåø ùìê ëàï', +insert_image_border : 'âáåì', +insert_image_dimensions : 'îéîãéí', +insert_image_vspace : 'çìì àðëé', +insert_image_hspace : 'çìì àåô÷é', +insert_image_align : 'ééùåø', +insert_image_align_default : 'áøéøú îçãì', +insert_image_align_baseline : 'ì÷å äáñéñ', +insert_image_align_top : 'ìîòìä', +insert_image_align_middle : 'ìàîöò', +insert_image_align_bottom : 'ìîèä', +insert_image_align_texttop : 'ìøàù äè÷ñè', +insert_image_align_absmiddle : 'ìàîöò îåçìè', +insert_image_align_absbottom : 'ì÷öä úçúåï îåçìè', +insert_image_align_left : 'ìùîàì', +insert_image_align_right : 'ìéîéï', +theme_font_size : 'âåãì âåôï', +theme_fontdefault : '-- îùôçú âåôðéí --', +theme_block : '-- òéöåá --', +theme_paragraph : 'ôñ÷ä', +theme_div : '÷èò', +theme_address : 'ëúåáú', +theme_pre : 'îòåöá îøàù', +theme_h1 : 'ëåúøú 1', +theme_h2 : 'ëåúøú 2', +theme_h3 : 'ëåúøú 3', +theme_h4 : 'ëåúøú 4', +theme_h5 : 'ëåúøú 5', +theme_h6 : 'ëåúøú 6', +theme_colorpicker_title : 'áçø öáò', +theme_colorpicker_apply : 'äçì', +theme_forecolor_desc : 'áçø öáò è÷ñè', +theme_backcolor_desc : 'áçø öáò ø÷ò', +theme_charmap_title : 'áçø úå îéåçã', +theme_charmap_desc : 'äëðñ úå îéåçã', +theme_visualaid_desc : 'äçìó îöá ÷ååéí îðçéí/øëéáéí áìúé-ðøàéí', +insert_anchor_title : 'äëðñ/òøåê òåâï', +insert_anchor_name : 'ùí äòåâï', +theme_anchor_desc : 'äëðñ/òøåê òåâï', +theme_insert_link_titlefield : 'ëåúøú', +theme_clipboard_msg : 'ôòåìåú äòú÷ä/âæéøä/äãá÷ä àéðï ðúîëåú úçú Mozilla å-Firefox.\näàí áøöåðê ì÷áì îéãò ðåñó àåãåú ðåùà æä?', +theme_path : 'ðúéá', +cut_desc : 'âæåø', +copy_desc : 'äòú÷', +paste_desc : 'äãá÷', +link_list : 'øùéîú ÷éùåøéí', +image_list : 'øùéîú úîåðåú', +browse : 'ñééø', +image_props_desc : 'îàôééðé úîåðä', +newdocument_desc : 'îñîê çãù', +class_name : 'îçì÷ä', +newdocument : 'äàí àúä áèåç ùáøöåðê ìð÷åú àú ëì äúåëï?', +about_title : 'àåãåú TinyMCE', +about : 'àåãåú', +license : 'øéùéåï', +plugins : 'úåñôéí', +plugin : 'úåñó', +author : 'îçáø', +version : 'âøñä', +loaded_plugins : 'úåñôéí ôòéìéí', +help : 'òæøä', +not_set : '-- ìà îåâãø --', +close : 'ñâéøä', +toolbar_focus : 'òáåø àì ëôúåøé äëìéí - Alt+Q, òáåø àì äòåøê - Alt-Z, òáåø àì ðúéá òéöåá - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/hu.js b/includes/tiny_mce/themes/advanced/langs/hu.js new file mode 100644 index 0000000..2dce5e9 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/hu.js @@ -0,0 +1,75 @@ +// HU lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- Stílusok --', +theme_code_desc : 'HTML forrás szerkesztése', +theme_code_title : 'HTML forrás szerkesztõ', +theme_code_wordwrap : 'Sortördelés', +theme_sub_desc : 'Alsóindex', +theme_sup_desc : 'Felsõindex', +theme_hr_desc : 'Vizszíntes vonal beszúrása', +theme_removeformat_desc : 'Formázás eltávolítása', +theme_custom1_desc : 'Az egyéni leírásod jön ide', +insert_image_border : 'Keret', +insert_image_dimensions : 'Kiterjedés', +insert_image_vspace : 'Függõleges terület', +insert_image_hspace : 'Vizszintes terület', +insert_image_align : 'Elhelyezkedés', +insert_image_align_default : '-- Nincs beállítva --', +insert_image_align_baseline : 'Baseline', +insert_image_align_top : 'Felül', +insert_image_align_middle : 'Középen', +insert_image_align_bottom : 'Alul', +insert_image_align_texttop : 'Szövegfelett', +insert_image_align_absmiddle : 'Abszolút közép', +insert_image_align_absbottom : 'Abszolút alatt', +insert_image_align_left : 'Balra', +insert_image_align_right : 'Jobbra', +theme_font_size : '-- Betûméret --', +theme_fontdefault : '-- Betûcsalád --', +theme_block : '-- Formátum --', +theme_paragraph : 'Bekezdés', +theme_div : 'Div', +theme_address : 'Cím', +theme_pre : 'Elõreformázott', +theme_h1 : 'Fejléc 1', +theme_h2 : 'Fejléc 2', +theme_h3 : 'Fejléc 3', +theme_h4 : 'Fejléc 4', +theme_h5 : 'Fejléc 5', +theme_h6 : 'Fejléc 6', +theme_colorpicker_title : 'Színválasztás', +theme_colorpicker_apply : 'Alkalmaz', +theme_forecolor_desc : 'Szövegszín választás', +theme_backcolor_desc : 'Háttérszín választás', +theme_charmap_title : 'Egyéni karakter választás', +theme_charmap_desc : 'Egyéni karakter beszúrás', +theme_visualaid_desc : 'Sorjelölõk/láthatatlan elemek kapcsolása', +insert_anchor_title : 'Horgony nbeillesztése/szerkesztése', +insert_anchor_name : 'Horgony név', +theme_anchor_desc : 'Horgony nbeillesztése/szerkesztése', +theme_insert_link_titlefield : 'Cím', +theme_clipboard_msg : 'A Másolás/Kivágás/Beillesztés nem elérhetõ Mozillában and Firefox-ban.\nSzeretnél több információt errõl a problémáról?', +theme_path : 'Útvonal', +cut_desc : 'Kivágás', +copy_desc : 'Másolás', +paste_desc : 'Beillesztés', +link_list : 'Link lista', +image_list : 'Kép lista', +browse : 'Tallózás', +image_props_desc : 'Kép tulajdonságai', +newdocument_desc : 'Új dokumentum', +class_name : 'Osztály', +newdocument : 'Biztos hogy törölni akarod az összes tartalmat?', +about_title : 'TinyMCE névjegye', +about : 'Névjegy', +license : 'Licensz', +plugins : 'Bõvítmények', +plugin : 'Bõvítmény', +author : 'Szerzõ', +version : 'Verzió', +loaded_plugins : 'Betöltött bõvítmények', +help : 'Súgó', +not_set : '-- Nincs beállítva --', +close : 'Bezárás' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/is.js b/includes/tiny_mce/themes/advanced/langs/is.js new file mode 100644 index 0000000..a46059e --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/is.js @@ -0,0 +1,76 @@ +// Iceland lang variables by Johannes Birgir Jensson + +tinyMCE.addToLang('',{ +theme_style_select : '-- Stílar --', +theme_code_desc : 'Breyta HTML kóða', +theme_code_title : 'HTML kóðaritill', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'Lágskrift', +theme_sup_desc : 'Háskrift', +theme_hr_desc : 'Setja inn stiku', +theme_removeformat_desc : 'Fjarlægja textasnið', +theme_custom1_desc : 'Þín lýsing hér', +insert_image_border : 'Rammi', +insert_image_dimensions : 'Víddir', +insert_image_vspace : 'Bil fyrir ofan og neðan', +insert_image_hspace : 'Bil til vinstri og hægri', +insert_image_align : 'Jöfnun', +insert_image_align_default : '-- Ekki valin --', +insert_image_align_baseline : 'Sama lína', +insert_image_align_top : 'Uppi', +insert_image_align_middle : 'Miðja', +insert_image_align_bottom : 'Niðri', +insert_image_align_texttop : 'Texti efst', +insert_image_align_absmiddle : 'Alveg í miðju', +insert_image_align_absbottom : 'Alveg neðst', +insert_image_align_left : 'Vinstri', +insert_image_align_right : 'Hægri', +theme_font_size : '-- Textastærð --', +theme_fontdefault : '-- Leturgerð --', +theme_block : '-- Textasnið --', +theme_paragraph : 'Málsgrein', +theme_div : 'Div', +theme_address : 'Heimilisfang', +theme_pre : 'Ritvél', +theme_h1 : 'Haus 1', +theme_h2 : 'Haus 2', +theme_h3 : 'Haus 3', +theme_h4 : 'Haus 4', +theme_h5 : 'Haus 5', +theme_h6 : 'Haus 6', +theme_colorpicker_title : 'Veldu lit', +theme_colorpicker_apply : 'Staðfesta', +theme_forecolor_desc : 'Veldu textalit', +theme_backcolor_desc : 'Veldu bakgrunnslit', +theme_charmap_title : 'Veldu sérstaf', +theme_charmap_desc : 'Setja sérstaf inn', +theme_visualaid_desc : 'Sýna/fela töflur, akkeri og fleira', +insert_anchor_title : 'Setja inn/breyta akkeri', +insert_anchor_name : 'Heiti akkeris', +theme_anchor_desc : 'Setja inn/breyta akkeri', +theme_insert_link_titlefield : 'Titill', +theme_clipboard_msg : 'Afrita/klippa/líma er ekki virkt í Mozilla og Firefox.\nViltu fá upplýsingar um hvernig þú getur kveikt á þeim?', +theme_path : 'Slóð', +cut_desc : 'Klippa', +copy_desc : 'Afrita', +paste_desc : 'Skeyta', +link_list : 'Tenglalisti', +image_list : 'Myndalisti', +browse : 'Vafra', +image_props_desc : 'Stillingar myndar', +newdocument_desc : 'Nýtt skjal', +class_name : 'Class', +newdocument : 'Ertu viss um að þú viljir hreinsa allt burtu?', +about_title : 'Um TinyMCE', +about : 'Um', +license : 'Leyfi', +plugins : 'Viðbætur', +plugin : 'Viðbót', +author : 'Höfundur', +version : 'Útgáfa', +loaded_plugins : 'Virkar viðbætur', +help : 'Hjálp', +not_set : '-- Ekki valið --', +close : 'Loka', +toolbar_focus : 'Flýtilykill fyrir takka - Alt+Q, Flýtilykill fyrir ritil - Alt-Z, Flýtilykill fyrir slóð - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/it.js b/includes/tiny_mce/themes/advanced/langs/it.js new file mode 100644 index 0000000..fcb79c7 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/it.js @@ -0,0 +1,64 @@ +// Variabili di lingua IT - fabrix.xm@lombardiacom.it + +tinyMCE.addToLang('',{ +theme_style_select : 'Stili', +theme_code_desc : 'Edita il sorgente HTML', +theme_code_title : 'Editor Sorgente HTML', +theme_code_wordwrap : 'Word wrap', +theme_sub_desc : 'Pedice', +theme_sup_desc : 'Apice', +theme_hr_desc : 'Inserisci linea orizzontale', +theme_removeformat_desc : 'Rimuovi formattazione', +theme_custom1_desc : 'Scrivi qui la tua descrizione personalizzata', +insert_image_border : 'Bordo', +insert_image_dimensions : 'Dimensioni', +insert_image_vspace : 'Spazio verticale', +insert_image_hspace : 'Spazio orizzontale', +insert_image_align : 'Allineamento', +insert_image_align_default : 'Default', +insert_image_align_baseline : 'Baseline', +insert_image_align_top : 'Superiore', +insert_image_align_middle : 'Centrale', +insert_image_align_bottom : 'Inferiore', +insert_image_align_texttop : 'TextTop', +insert_image_align_absmiddle : 'Centro assoluto', +insert_image_align_absbottom : 'Inferiore assoluto', +insert_image_align_left : 'Sinistra', +insert_image_align_right : 'Destra', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'Paragrafo', +theme_div : 'Div', +theme_address : 'Indirizzo', +theme_pre : 'Preformattato', +theme_h1 : 'Intestazione 1', +theme_h2 : 'Intestazione 2', +theme_h3 : 'Intestazione 3', +theme_h4 : 'Intestazione 4', +theme_h5 : 'Intestazione 5', +theme_h6 : 'Intestazione 6', +theme_colorpicker_title : 'Seleziona un colore', +theme_colorpicker_apply : 'Applica', +theme_forecolor_desc : 'Seleziona il colore', +theme_backcolor_desc : 'Seleziona il colore di sfondo', +theme_charmap_title : 'Seleziona un carattere custom', +theme_charmap_desc : 'Inserisci un carattere custom', +theme_visualaid_desc : 'Mostra/nascondi linee guida e elementi invisibili', +insert_anchor_title : 'Inserisci/modifica àncora', +insert_anchor_name : 'Nome àncora', +theme_anchor_desc : 'Inserisci/modifica àncora', +theme_insert_link_titlefield : 'Titolo', +theme_clipboard_msg : 'Copia, Taglia e Incolla non sono disponibili in Mozilla e Firefox.\nVuoi maggiori dettegli su questo problema?', +theme_path : 'Percorso', +cut_desc : 'Taglia', +copy_desc : 'Copia', +paste_desc : 'Incolla', +link_list : 'Lista link', +image_list : 'Lista immagini', +browse : 'Sfoglia', +image_props_desc : 'Proprietà dell\'immagine', +newdocument_desc : 'Nuovo documento', +class_name : 'Classe', +newdocument : 'Sicuro di voler cancellare l\'intero contenuto?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/ja.js b/includes/tiny_mce/themes/advanced/langs/ja.js new file mode 100644 index 0000000..2d0d349 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ja.js @@ -0,0 +1,62 @@ +// JP lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '$B%9%?%$%k(B', +theme_paragraph : '$BJ8L.(B', +theme_address : '$B%"%I%l%9(B', +theme_pre : '$B@07A:Q$_(B', +theme_h1 : 'H1', +theme_h2 : 'H2', +theme_h3 : 'H3', +theme_h4 : 'H4', +theme_h5 : 'H5', +theme_h6 : 'H6', +theme_div : 'Div', +insert_anchor_title : '$B%"%s%+!<$NA^F~(B/$BJT=8(B', +insert_anchor_name : '$B%"%s%+!<$NL>A0(B', +theme_anchor_desc : '$B%"%s%+!<$NA^F~(B/$BJT=8(B', +theme_code_desc : 'HTML$B$ND>@\JT=8(B', +theme_code_title : 'HTML$B$NJT=8(B', +theme_code_wordwrap : 'Word wrap', +theme_hr_desc : '$B?eJ?@~(B', +theme_removeformat_desc : '$B@07A>pJs:o=|(B', +theme_visualaid_desc : '$BJd=u>pJs$N;k3P2=(B($B%H%0%k(B)', +theme_sub_desc : '$BE:;z2<(B', +theme_sup_desc : '$BE:;z>e(B', +theme_charmap_desc : '$BFCGr(B', +insert_image_hspace : '$B2#M>Gr(B', +insert_image_align : '$B0LCV9g$o$;(B', +insert_image_align_default : '$B0EL[(B', +insert_image_align_baseline : '$B4p=`@~(B', +insert_image_align_top : '$B>e(B', +insert_image_align_middle : '$BCf(B', +insert_image_align_bottom : '$B2<(B', +insert_image_align_texttop : '$BJ8;z$N>e(B', +insert_image_align_absmiddle : '$B@dBP$KCf(B', +insert_image_align_absbottom : '$B@dBP$K2<(B', +insert_image_align_left : '$B:8(B', +insert_image_align_right : '$B1&(B', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_colorpicker_title : '$B?\'$N;XDj(B', +theme_colorpicker_apply : '$BE,MQ(B', +theme_forecolor_desc : '$BA07J?\'(B', +theme_backcolor_desc : 'Select background color', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +class_name : '$B%/%i%9(B', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/ko.js b/includes/tiny_mce/themes/advanced/langs/ko.js new file mode 100644 index 0000000..fc48ea1 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ko.js @@ -0,0 +1,65 @@ +// KO lang variables + +tinyMCE.addToLang('',{ +theme_style_select : 'œºÅžÀÏ', +theme_code_desc : 'HTML ŒÒœº °íÄ¡±â', +theme_code_title : 'HTML ŒÒœº ÆíÁý±â', +theme_code_wordwrap : 'Word wrap', +theme_code_save : 'ÀúÀå', +theme_sub_desc : 'ŸÆ·¡Ã·ÀÚ', +theme_sup_desc : 'À§Ã·ÀÚ', +theme_hr_desc : '°¡·ÎÁÙ ³Ö±â', +theme_removeformat_desc : 'ŒÓŒº Áö¿ì±â', +theme_custom1_desc : 'Your custom description here', +insert_image_border : 'Å׵Ξ®', +insert_image_dimensions : 'Å©±â', +insert_image_vspace : 'ŒŒ·Î ¿©¹é', +insert_image_hspace : '°¡·Î ¿©¹é', +insert_image_align : 'Á€·Ä', +insert_image_align_default : '±âº»°ª', +insert_image_align_baseline : 'Baseline', +insert_image_align_top : 'Top', +insert_image_align_middle : 'Middle', +insert_image_align_bottom : 'Bottom', +insert_image_align_texttop : 'TextTop', +insert_image_align_absmiddle : 'Absolute Middle', +insert_image_align_absbottom : 'Absolute Bottom', +insert_image_align_left : 'Left', +insert_image_align_right : 'Right', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'ŽÜ¶ô', +theme_div : 'Div', +theme_address : 'ÁÖŒÒ', +theme_pre : 'Œ­œÄ ÀÖÀœ', +theme_h1 : 'ÁŠžñ 1', +theme_h2 : 'ÁŠžñ 2', +theme_h3 : 'ÁŠžñ 3', +theme_h4 : 'ÁŠžñ 4', +theme_h5 : 'ÁŠžñ 5', +theme_h6 : 'ÁŠžñ 6', +theme_colorpicker_title : '»ö»ó Œ±ÅÃ', +theme_colorpicker_apply : 'Àû¿ë', +theme_forecolor_desc : '±ÛÀÚ »ö»ó', +theme_backcolor_desc : 'Select background color', +theme_charmap_title : 'Select custom character', +theme_charmap_desc : 'Insert custom character', +theme_visualaid_desc : 'Toggle guidelines/invisible elements', +insert_anchor_title : 'ŸÞÄ¿ ³Ö±â/°íÄ¡±â', +insert_anchor_name : 'ŸÞÄ¿ ÀÌž§', +theme_anchor_desc : 'ŸÞÄ¿ ³Ö±â/°íÄ¡±â', +theme_insert_link_titlefield : 'ÁŠžñ', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +class_name : 'Ŭ·¡œº', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/nb.js b/includes/tiny_mce/themes/advanced/langs/nb.js new file mode 100644 index 0000000..c08b0e5 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/nb.js @@ -0,0 +1,77 @@ +// nb = Norwegian (bokmål) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +theme_style_select : 'Stiler', +theme_code_desc : 'Redigere HTML Koden', +theme_code_title : 'HTML Kildekode Redigering', +theme_code_wordwrap : 'Ord deling', +theme_sub_desc : 'Nedsenket skrift', +theme_sup_desc : 'Opphøyd skrift', +theme_hr_desc : 'Sett inn horisontal linje', +theme_removeformat_desc : 'Fjern formatering', +theme_custom1_desc : 'Din spesialfunksjons beskrivelse her', +insert_image_border : 'Ramme', +insert_image_dimensions : 'Dimensjoner', +insert_image_vspace : 'Vertikalt tomrom', +insert_image_hspace : 'Horisontalt tomrom', +insert_image_align : 'Justering', +insert_image_align_default : 'Intet', +insert_image_align_baseline : 'Bunnlinjen', +insert_image_align_top : 'Lengst opp', +insert_image_align_middle : 'Midten', +insert_image_align_bottom : 'Lengst ned', +insert_image_align_texttop : 'Tekstens topp', +insert_image_align_absmiddle : 'Absolutt midten', +insert_image_align_absbottom : 'Absolutt lengst ned', +insert_image_align_left : 'Venstre', +insert_image_align_right : 'Høyre', +insert_image_delta_width : 30, +insert_image_delta_height : 10, +theme_font_size : '-- Font størrelse --', +theme_fontdefault : '-- Font familie --', +theme_block : '-- Format --', +theme_paragraph : 'Paragraf', +theme_div : 'Div', +theme_address : 'Adresse', +theme_pre : 'Pre-formattert', +theme_h1 : 'Overskrift 1', +theme_h2 : 'Overskrift 2', +theme_h3 : 'Overskrift 3', +theme_h4 : 'Overskrift 4', +theme_h5 : 'Overskrift 5', +theme_h6 : 'Overskrift 6', +theme_colorpicker_title : 'Velg en farge', +theme_colorpicker_apply : 'Bruk', +theme_forecolor_desc : 'Velg forgrunnsfarge', +theme_backcolor_desc : 'Velg bakgrunnsfarge', +theme_charmap_title : 'Velg spesialtegn', +theme_charmap_desc : 'Sett inn spesialtegn', +theme_visualaid_desc : 'Slå av/på usynlige elementer', +insert_anchor_title : 'Opprette/endre anker', +insert_anchor_name : 'Ankernavn', +theme_anchor_desc : 'Opprette/endre anker', +theme_insert_link_titlefield : 'Tittel', +theme_clipboard_msg : 'Kopier/Klipp ut/Lim inn er ikke tilgjengelig i Mozilla/Firefox.\nVil du ha mere informasjon om dette?', +theme_path : 'Søkevei', +cut_desc : 'Klipp ut', +copy_desc : 'Kopier', +paste_desc : 'Lim inn', +link_list : 'Lenke liste', +image_list : 'Bilde liste', +browse : 'Bla gjennom', +image_props_desc : 'Bilde egenskaper', +newdocument_desc : 'Nytt dokument', +class_name : 'Stil', +newdocument : 'Er du sikker på at du vil tømme hele redigeringsområdet?', +about_title : 'Om TinyMCE', +about : 'Om', +license : 'Lisens', +plugins : 'Innstikksprogrammer', +plugin : 'Innstikksprogram', +author : 'Utviklere', +version : 'Versjon', +loaded_plugins : 'Lastet innstikksprogram', +help : 'Hjelp', +not_set : '-- Ikke satt --', +close : 'Stopp' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/nl.js b/includes/tiny_mce/themes/advanced/langs/nl.js new file mode 100644 index 0000000..7d58347 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/nl.js @@ -0,0 +1,76 @@ +// NL lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- Stijlen --', +theme_code_desc : 'HTML bron bewerken', +theme_code_title : 'HTML code-editor', +theme_code_wordwrap : 'Terugloop', +theme_sub_desc : 'Subscript', +theme_sup_desc : 'Superscript', +theme_hr_desc : 'Horizontale lijn invoegen', +theme_removeformat_desc : 'Opmaak verwijderen', +theme_custom1_desc : 'Tik hier een omschrijving', +insert_image_border : 'Rand', +insert_image_dimensions : 'Afmetingen', +insert_image_vspace : 'Verticale marge', +insert_image_hspace : 'Horizontale marge', +insert_image_align : 'Uitlijning', +insert_image_align_default : '-- geen --', +insert_image_align_baseline : 'Basislijn', +insert_image_align_top : 'Boven', +insert_image_align_middle : 'Midden', +insert_image_align_bottom : 'Onder', +insert_image_align_texttop : 'Bovenkant tekst', +insert_image_align_absmiddle : 'Absoluut midden', +insert_image_align_absbottom : 'Absoluut onder', +insert_image_align_left : 'Links', +insert_image_align_right : 'Rechts', +theme_font_size : '-- Lettergrootte --', +theme_fontdefault : '-- Lettertype --', +theme_block : '-- Paragraaf --', +theme_paragraph : 'Paragraaf', +theme_div : 'Blok', +theme_address : 'Adres', +theme_pre : 'Opgemaakt', +theme_h1 : 'Kop 1', +theme_h2 : 'Kop 2', +theme_h3 : 'Kop 3', +theme_h4 : 'Kop 4', +theme_h5 : 'Kop 5', +theme_h6 : 'Kop 6', +theme_colorpicker_title : 'Selecteer een kleur', +theme_colorpicker_apply : 'Toepassen', +theme_forecolor_desc : 'Een tekstkleur selecteren', +theme_backcolor_desc : 'Een achtergrondkleur selecteren', +theme_charmap_title : 'Speciale tekens invoegen', +theme_charmap_desc : 'Speciale tekens invoegen', +theme_visualaid_desc : 'Onzichtbare elementen en hulplijnen aan/uit', +insert_anchor_title : 'Bladwijzer invoegen/bewerken', +insert_anchor_name : 'Bladwijzer naam', +theme_anchor_desc : 'Bladwijzer invoegen/bewerken', +theme_insert_link_titlefield : 'titel', +theme_clipboard_msg : 'Kopiëren/Knippen/Plakken is uit veiligheidsoverwegingen niet direct beschikbaar in Mozilla en Firefox.\nWilt u meer informatie over deze kwestie?', +theme_path : 'Pad', +cut_desc : 'Knippen', +copy_desc : 'Kopiëren', +paste_desc : 'Plakken', +link_list : 'Hyperlinklijst', +image_list : 'Afbeeldinglijst', +browse : 'Bladeren', +image_props_desc : 'Eigenschappen van afbeelding', +newdocument_desc : 'Nieuw document', +class_name : 'Stijl', +newdocument : 'Weet u zeker dat u de hele inhoud wilt wissen?', +about_title : 'Over TinyMCE', +about : 'Over', +license : 'Licentie', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Author', +version : 'Versie', +loaded_plugins : 'Ingeladen plugins', +help : 'Help', +not_set : '-- geen --', +close : 'Sluiten', +toolbar_focus : 'Ga naar werkbalk knoppen - Alt+Q, Ga naar editor - Alt-Z, Ga naar pad - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/nn.js b/includes/tiny_mce/themes/advanced/langs/nn.js new file mode 100644 index 0000000..9090a45 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/nn.js @@ -0,0 +1,77 @@ +// nn = Norwegian (nynorsk) lang variables by Knut B. Jacobsen + +tinyMCE.addToLang('',{ +theme_style_select : 'Stiler', +theme_code_desc : 'Redigere HTML Koden', +theme_code_title : 'HTML Kildekode Redigering', +theme_code_wordwrap : 'Ord deling', +theme_sub_desc : 'Nedsenket skrift', +theme_sup_desc : 'Opphøgd skrift', +theme_hr_desc : 'Sett inn horisontal linje', +theme_removeformat_desc : 'Fjern formatering', +theme_custom1_desc : 'Din spesialfunksjons beskrivelse her', +insert_image_border : 'Ramme', +insert_image_dimensions : 'Dimensjoner', +insert_image_vspace : 'Vertikalt tomrom', +insert_image_hspace : 'Horisontalt tomrom', +insert_image_align : 'Justering', +insert_image_align_default : 'Intet', +insert_image_align_baseline : 'Bunnlinjen', +insert_image_align_top : 'Lengst opp', +insert_image_align_middle : 'Midten', +insert_image_align_bottom : 'Lengst ned', +insert_image_align_texttop : 'Tekstens topp', +insert_image_align_absmiddle : 'Absolutt midten', +insert_image_align_absbottom : 'Absolutt lengst ned', +insert_image_align_left : 'Venstre', +insert_image_align_right : 'Høgre', +insert_image_delta_width : 30, +insert_image_delta_height : 10, +theme_font_size : '-- Font størrelse --', +theme_fontdefault : '-- Font familie --', +theme_block : '-- Format --', +theme_paragraph : 'Paragraf', +theme_div : 'Div', +theme_address : 'Adresse', +theme_pre : 'Pre-formattert', +theme_h1 : 'Overskrift 1', +theme_h2 : 'Overskrift 2', +theme_h3 : 'Overskrift 3', +theme_h4 : 'Overskrift 4', +theme_h5 : 'Overskrift 5', +theme_h6 : 'Overskrift 6', +theme_colorpicker_title : 'Velg en farge', +theme_colorpicker_apply : 'Bruk', +theme_forecolor_desc : 'Velg forgrunnsfarge', +theme_backcolor_desc : 'Velg bakgrunnsfarge', +theme_charmap_title : 'Velg spesialtegn', +theme_charmap_desc : 'Sett inn spesialtegn', +theme_visualaid_desc : 'Slå av/på usynlige elementer', +insert_anchor_title : 'Opprette/endre anker', +insert_anchor_name : 'Ankernavn', +theme_anchor_desc : 'Opprette/endre anker', +theme_insert_link_titlefield : 'Tittel', +theme_clipboard_msg : 'Kopier/Klipp ut/Lim inn er ikke tilgjengelig i Mozilla/Firefox.\nVil du ha mere informasjon om dette?', +theme_path : 'Søkevei', +cut_desc : 'Klipp ut', +copy_desc : 'Kopier', +paste_desc : 'Lim inn', +link_list : 'Lenke liste', +image_list : 'Bilde liste', +browse : 'Bla gjennom', +image_props_desc : 'Bilde egenskaper', +newdocument_desc : 'Nytt dokument', +class_name : 'Stil', +newdocument : 'Er du sikker på at du vil tømme hele redigeringsområdet?', +about_title : 'Om TinyMCE', +about : 'Om', +license : 'Lisens', +plugins : 'Innstikksprogrammer', +plugin : 'Innstikksprogram', +author : 'Utviklere', +version : 'Versjon', +loaded_plugins : 'Lastet innstikksprogram', +help : 'Hjelp', +not_set : '-- Ikkje satt --', +close : 'Stopp' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/pl.js b/includes/tiny_mce/themes/advanced/langs/pl.js new file mode 100644 index 0000000..b479e5e --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/pl.js @@ -0,0 +1,79 @@ +// PL lang variables +// fixed by Wooya +// http://www.mfusion.prv.pl +// fixed by lemiel 14.11.2005 + +tinyMCE.addToLang('',{ +theme_style_select : 'Styl', +theme_code_desc : 'Edytuj zródd³o html', +theme_code_title : 'Edytor zród³a html', +theme_code_wordwrap : 'Zawijanie wierszy', +theme_sub_desc : 'Nadpisywanie', +theme_sup_desc : 'Podpisywanie', +theme_hr_desc : 'Wstaw poziom± liniê', +theme_removeformat_desc : 'Usuñ formatowanie', +theme_custom1_desc : 'Wstaw w³asny opis', +insert_image_border : 'Ramka', +insert_image_dimensions : 'Wymiary', +insert_image_vspace : 'Pionowy odstêp', +insert_image_hspace : 'Poziomy odstêp', +insert_image_align : 'Otaczanie', +insert_image_align_default : 'Domy¶lne', +insert_image_align_baseline : 'Do linii bazowej', +insert_image_align_top : 'Górne', +insert_image_align_middle : 'Šrodkowe', +insert_image_align_bottom : 'Dolne', +insert_image_align_texttop : 'Tekst powy¿ej', +insert_image_align_absmiddle : 'Absolutny ¶rodek', +insert_image_align_absbottom : 'Absolutny dó³', +insert_image_align_left : 'Lewe', +insert_image_align_right : 'Prawe', +theme_font_size : '-- Rozmiar czcionki --', +theme_fontdefault : '-- Rodzina czcionki --', +theme_block : '-- Format --', +theme_paragraph : '-- Paragraf --', +theme_div : 'Div', +theme_address : 'Adres', +theme_pre : 'Preformatowanie', +theme_h1 : 'Nag³ówek 1', +theme_h2 : 'Nag³ówek 2', +theme_h3 : 'Nag³ówek 3', +theme_h4 : 'Nag³ówek 4', +theme_h5 : 'Nag³ówek 5', +theme_h6 : 'Nag³ówek 6', +theme_colorpicker_title : 'Wybierz kolor', +theme_colorpicker_apply : 'Wybierz', +theme_forecolor_desc : 'Wybierz kolor tekstu', +theme_backcolor_desc : 'Wybierz kolor t³a', +theme_charmap_title : 'Wybierz znak', +theme_charmap_desc : 'Wstaw znak', +theme_visualaid_desc : 'Prze³±cz linie prowadz±ce/niewidoczne elementy', +insert_anchor_title : 'Kotwica', +insert_anchor_name : 'Nazwa kotwicy', +theme_anchor_desc : 'Wstaw/Edytuj kotwicê', +theme_insert_link_titlefield : 'Tytu³', +theme_clipboard_msg : 'Kopiuj/Edytuj/Wklej nie jest dostêpne w przegl±darkach Mozilla i Firefox.\nPotrzebujesz wiêcej informacji na ten temat?', +theme_path : 'Œcie¿ka', +cut_desc : 'Wytnij', +copy_desc : 'Kopiuj', +paste_desc : 'Wklej', +link_list : 'Lista linków', +image_list : 'Lista obrazków', +browse : 'Przegl±daj', +image_props_desc : 'W³a¶ciwosci obrazka', +newdocument_desc : 'Nowy dokument', +class_name : 'Klasa', +newdocument : 'Czy jeste¶ pewien, ¿e chcesz wyczy¶ciæ zawarto¶æ tego dokumentu?', +about_title : 'O TinyMCE ...', +about : 'O ...', +license : 'Licencja', +plugins : 'Pluginy', +plugin : 'Plugin', +author : 'Autor', +version : 'Wersja', +loaded_plugins : 'Za³adowane pluginy', +help : 'Pomoc', +not_set : '-- Nie wybrano --', +close : 'Zamknij', +toolbar_focus : 'Skocz do przycisków narzêdzi - Alt+Q, Skocz do edytora - Alt-Z, Skocz do ¶cie¿ki elementu - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/pt.js b/includes/tiny_mce/themes/advanced/langs/pt.js new file mode 100644 index 0000000..60778b8 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/pt.js @@ -0,0 +1,65 @@ +// PT lang variables + +tinyMCE.addToLang('',{ +theme_style_select : 'Estilos CSS', +theme_code_desc : 'Editar Fonte HTML', +theme_code_title : 'Editor de fonte HTML', +theme_code_save : 'Guardar', +theme_code_wordwrap : 'Translinear palavras', +theme_sub_desc : 'Subscrito', +theme_sup_desc : 'Superscrito', +theme_hr_desc : 'Inserir linha horizontal', +theme_removeformat_desc : 'Remover formatação', +theme_custom1_desc : 'Descrição customizada aqui', +insert_image_border : 'Borda', +insert_image_dimensions : 'Dimensões', +insert_image_vspace : 'Espaçamento Vert.', +insert_image_hspace : 'Espaçamento Horiz.', +insert_image_align : 'Alinhamento', +insert_image_align_default : 'Por omissão', +insert_image_align_baseline : 'Linha de base', +insert_image_align_top : 'Topo', +insert_image_align_middle : 'Centrado', +insert_image_align_bottom : 'Fundo', +insert_image_align_texttop : 'Topo do Texto', +insert_image_align_absmiddle : 'Centrado absoluto', +insert_image_align_absbottom : 'Fundo absoluto', +insert_image_align_left : 'Esquerda', +insert_image_align_right : 'Direita', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_paragraph : 'Parágrafo', +theme_div : 'Bloco HTML', +theme_address : 'Morada', +theme_pre : 'Pré formatado', +theme_h1 : 'Título 1', +theme_h2 : 'Título 2', +theme_h3 : 'Título 3', +theme_h4 : 'Título 4', +theme_h5 : 'Título 5', +theme_h6 : 'Título 6', +theme_colorpicker_title : 'Seleccione uma côr', +theme_colorpicker_apply : 'Aplicar', +theme_forecolor_desc : 'Seleccione côr da frente', +theme_backcolor_desc : 'Select background color', +theme_charmap_title : 'Seleccione símbolo customizado', +theme_charmap_desc : 'Inserir símbolo customizado', +theme_visualaid_desc : 'Ligar/Desligar guias/elementos invisíveis', +insert_anchor_title : 'Inserir/editar âncora', +insert_anchor_name : 'Nome da âncora', +theme_anchor_desc : 'Inserir/editar âncora', +theme_insert_link_titlefield : 'Título', +theme_clipboard_msg : 'Copiar/Cortar/Colar não está disponível em Mozilla e Firefox.\nPretende obter mais informação acerca deste assunto?', +theme_path : 'Path', +cut_desc : 'Cortar', +copy_desc : 'Copiar', +paste_desc : 'Colar', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +class_name : 'Classe de CSS', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/pt_br.js b/includes/tiny_mce/themes/advanced/langs/pt_br.js new file mode 100644 index 0000000..105e4a4 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/pt_br.js @@ -0,0 +1,115 @@ +/** + * pt_br lang variables + * Brazilian Portuguese + * + * Authors : ???? + * Revision and modifications: + * Marcio Barbosa (mpg) + * Last Updated : November 26, 2005 + * TinyMCE Version : 2.0RC4 + */ +tinyMCE.addToLang('',{ +theme_style_select : 'Estilos', +theme_code_desc : 'Editar Código HTML', +theme_code_title : 'Editor de Código HTML', +theme_code_wordwrap : 'Quebrar Linhas', +theme_sub_desc : 'Subscrito', +theme_sup_desc : 'Subrescrito', +theme_hr_desc : 'Inserir linha horizontal', +theme_removeformat_desc : 'Remover formatação', +theme_custom1_desc : 'Sua descrição personalizada aqui', +insert_image_border : 'Borda', +insert_image_dimensions : 'Dimensões', +insert_image_vspace : 'Espaço Vertical', +insert_image_hspace : 'Espaço Horizontal', +insert_image_align : 'Alinhamento', +insert_image_align_default : 'Padrão', +insert_image_align_baseline : 'Linha base', +insert_image_align_top : 'Topo', +insert_image_align_middle : 'Centro', +insert_image_align_bottom : 'Fundo', +insert_image_align_texttop : 'Texto ao Topo', +insert_image_align_absmiddle : 'Centro Absoluto', +insert_image_align_absbottom : 'Fundo Absoluto', +insert_image_align_left : 'Esquerda', +insert_image_align_right : 'Direita', +theme_font_size : '-- Corpo --', +theme_fontdefault : '-- Tipo de Fonte --', +theme_block : '-- Formato --', +theme_paragraph : 'Parágrafo', +theme_div : 'Div', +theme_address : 'Endereço', +theme_pre : 'Pré-formatado', +theme_h1 : 'Cabeçalho 1', +theme_h2 : 'Cabeçalho 2', +theme_h3 : 'Cabeçalho 3', +theme_h4 : 'Cabeçalho 4', +theme_h5 : 'Cabeçalho 5', +theme_h6 : 'Cabeçalho 6', +theme_colorpicker_title : 'Selecionar côr', +theme_colorpicker_apply : 'Aplicar', +theme_forecolor_desc : 'Selecionar côr do texto', +theme_backcolor_desc : 'Selecionar côr de fundo', +theme_charmap_title : 'Selecionar caracter especial', +theme_charmap_desc : 'Inserir caracter especial', +theme_charmap_alpha_desc : 'Caracteres alfabéticos', +theme_charmap_arrows_title : 'Flechas', +theme_charmap_arrows_desc : 'Caracteres de flechas', +theme_charmap_greek_title : 'Gregos', +theme_charmap_greek_desc : 'Caracteres Gregos', +theme_charmap_math_title : 'Mathematicos', +theme_charmap_math_desc : 'Caracteres mathematicos', +theme_charmap_misc_title : 'Diversos', +theme_charmap_misc_desc : 'Caracteres diversos', +theme_charmap_money_title : 'Moedas', +theme_charmap_money_desc : 'Caracteres de moedas', +theme_charmap_quotaion_title : 'Apóstrofes', +theme_charmap_quotaion_desc : 'Caracteres de Apóstrofe', +theme_visualaid_desc : 'Trocar as linhas de ajuda por elementos invisíveis', +insert_anchor_title : 'Inserir/editar âncora', +insert_anchor_name : 'Nome da âncora', +theme_anchor_desc : 'Inserir/editar âncora', +theme_insert_link_titlefield : 'Título', +theme_clipboard_msg : 'Não se pode utiliza os comando de Copiar / Cortar / Colar no Mozilla e Firefox.\r\nUse o teclado para Copiar (Ctrl+C) / Cortar (Ctrl+X) / Colar (Ctrl+V)\r\nQuer obter mais informação?', +theme_path : 'Rota', +cut_desc : 'Cortar (Ctrl+X)', +copy_desc : 'Copiar (Ctrl+C)', +paste_desc : 'Colar (Ctrl+V)', +link_list : 'Lista de links', +image_list : 'Lista de imagens', +browse : 'Navegar', +image_props_desc : 'Propriedades da imagem', +newdocument_desc : 'Novo documento', +class_name : 'Classe', +newdocument : 'Tem certesa que deseja apagar todo o conteúdo?', +about_title : 'Sobre o TinyMCE', +about : 'Sobre', +license : 'Licença', +plugins : 'Plugins', +plugin : 'Plugin', +author : 'Autor', +version : 'Versão', +loaded_plugins : 'Plugins carregados', +help : 'Ajuda', +not_set : '-- Por padrão --', +close : 'Fechar', +toolbar_focus : 'Ir para a barra de ferramentas - Alt+Q, Ir para o editor - Alt+Z, Ir para o elemento de destino - Alt+X', +theme_visualaid_desc : 'Tornar linhas visíveis/invisíveis', +insert_anchor_title : 'Inserir/editar âncora', +insert_anchor_name : 'Nome da âncora', +theme_anchor_desc : 'Inserir/editar âncora', +theme_insert_link_titlefield : 'Título', +theme_clipboard_msg : 'Copiar/Recortar/Colar não é permitido no Mozilla e Firefox.\nQuer mais informações sobre isso?', +theme_path : 'Caminho', +cut_desc : 'Recortar', +copy_desc : 'Copiar', +paste_desc : 'Colar', +link_list : 'Lista de Links', +image_list : 'Lista de Imagens', +browse : 'Navegar', +image_props_desc : 'Propriedades da Imagem', +newdocument_desc : 'Novo Documento', +class_name : 'Classe', +newdocument : 'Tem certeza que deseja limpar todo o conteúdo?', +theme_advanced_anchor_delta_width : 20 +}); diff --git a/includes/tiny_mce/themes/advanced/langs/readme.txt b/includes/tiny_mce/themes/advanced/langs/readme.txt new file mode 100644 index 0000000..e32bcf0 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/readme.txt @@ -0,0 +1,4 @@ +Theme specific language packs. + +The language pack codes are based on ISO-639-2 +http://www.loc.gov/standards/iso639-2/englangn.html diff --git a/includes/tiny_mce/themes/advanced/langs/ru.js b/includes/tiny_mce/themes/advanced/langs/ru.js new file mode 100644 index 0000000..0ecf8fc --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ru.js @@ -0,0 +1,76 @@ +// Russian lang variables cp1251 + +tinyMCE.addToLang('',{ +theme_style_select : '-- Ñòèëè --', +theme_code_desc : 'Ðåäàêòèðîâàòü HTML êîäû', +theme_code_title : 'Ðåäàêòîð HTML êîäîâ', +theme_code_wordwrap : 'Ïåðåíîñ ïî ñëîâàì', +theme_sub_desc : 'Íèæíèé èíäåêñ', +theme_sup_desc : 'Âåðõíèé èíäåêñ', +theme_hr_desc : 'Âñòàâèòü ãîðèçîíòàëüíûé ðàçäåëèòåëü', +theme_removeformat_desc : 'Óáðàòü ôîðìàòèðîâàíèå', +theme_custom1_desc : 'Âàøå ïðîèçâîëüíîå îïèñàíèå', +insert_image_border : 'Ðàìêà', +insert_image_dimensions : 'Ðàçìåðû', +insert_image_vspace : 'Âåðòèêàëüíûé îòñòóï', +insert_image_hspace : 'Ãîðèçîíòàëüíûé îòñòóï', +insert_image_align : 'Âûðàâíèâàíèå', +insert_image_align_default : '-- Íå çàäàíî --', +insert_image_align_baseline : 'Ïî áàçîâîé ëèíèè', +insert_image_align_top : 'Ïî âåðõó', +insert_image_align_middle : 'Ïîñðåäèíå', +insert_image_align_bottom : 'Ïî íèçó', +insert_image_align_texttop : 'Ïî âåðõó òåêñòà', +insert_image_align_absmiddle : 'Àáñîëþòíî ïîñðåäèíå', +insert_image_align_absbottom : 'Àáñîëþòíî ñâåðõó', +insert_image_align_left : 'Âëåâî', +insert_image_align_right : 'Âïðàâî', +theme_font_size : '-- Ðàçìåð øðèôòà --', +theme_fontdefault : '-- Ñåìåéñòâî øðèôòîâ --', +theme_block : '-- Ôîðìàò --', +theme_paragraph : 'Àáçàö', +theme_div : 'Div', +theme_address : 'Ñòèëü àäðåñà', +theme_pre : ':`Ïðåäâàðèòåëüíî ôîðìàòèðîâàííûé', +theme_h1 : 'Çàãîëîâîê 1', +theme_h2 : 'Çàãîëîâîê 2', +theme_h3 : 'Çàãîëîâîê 3', +theme_h4 : 'Çàãîëîâîê 4', +theme_h5 : 'Çàãîëîâîê 5', +theme_h6 : 'Çàãîëîâîê 6', +theme_colorpicker_title : 'Âûáðàòü öâåò', +theme_colorpicker_apply : 'Ïðèìåíèòü', +theme_forecolor_desc : 'Âûáðàòü öâåò òåêñòà', +theme_backcolor_desc : 'Âûáðàòü öâåò ôîíà', +theme_charmap_title : 'Âûáîð ïðîèçâîëüíîãî ñèìâîëà', +theme_charmap_desc : 'Âñòàâèòü ïðîèçâîëüíûé ñèìâîë', +theme_visualaid_desc : 'Ïîêàçàòü ãðàíèöû ñêðûòûõ ýëåìåíòîâ', +insert_anchor_title : 'Âñòàâèòü/ðåäàêòèðîâàòü ÿêîðü', +insert_anchor_name : 'Èìÿ ÿêîðÿ', +theme_anchor_desc : 'Âñòàâèòü/ðåäàêòèðîâàòü ÿêîðü', +theme_insert_link_titlefield : 'Çàãîëîâîê', +theme_clipboard_msg : 'Êîïèðîâàòü/Âûðåçàòü/Âñòàâèòü íåäîñòóïíû äëÿ Mozilla è Firefox.\nÕîòèòå óçíàòü îá ýòîì ïîäðîáíåå?', +theme_path : 'Ïóòü', +cut_desc : 'Âûðåçàòü', +copy_desc : 'Êîïèðîâàòü', +paste_desc : 'Âñòàâèòü', +link_list : 'Ïåðå÷àíü ññûëîê', +image_list : 'Ïåðå÷åíü êàðòèíîê', +browse : 'Ïîäîáðàòü', +image_props_desc : 'Ñâîéñòâà êàðòèíêè', +newdocument_desc : 'Íîâûé äîêóìåíò', +class_name : 'Êëàññ', +newdocument : 'Âû óâåðåíû, ÷òî õîòèòå î÷èñòèòü âñž ñîäåðæèìîå?', +about_title : 'Î TinyMCE', +about : 'Î TinyMCE', +license : 'Ëèöåíçèÿ', +plugins : 'Ïëàãèíû', +plugin : 'Ïëàãèí', +author : 'Àâòîð', +version : 'Âåðñèÿ', +loaded_plugins : 'Çàãðóæåííûå ïëàãèíû', +help : 'Ïîìîùü', +not_set : '-- íå óñòàíîâëåíî --', +close : 'Çàêðûòü', +toolbar_focus : 'Ïåðåìåñòèòü ôîêóñ íà ïàíåëü èíñòðóìåíòîâ - Alt+Q, Ïåðåìåñòèòü ôîêóñ â ðåäàêòîð - Alt-Z, Ïåðåìåñòèòü ôîêóñ íà ýëåìåíò ïóòè - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/ru_KOI8-R.js b/includes/tiny_mce/themes/advanced/langs/ru_KOI8-R.js new file mode 100644 index 0000000..d0b65bc --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ru_KOI8-R.js @@ -0,0 +1,76 @@ +// Russian lang variables KOI8-R + +tinyMCE.addToLang('',{ +theme_style_select : '-- óÔÉÌÉ --', +theme_code_desc : 'òÅÄÁËÔÉÒÏ×ÁÔØ HTML ËÏÄÙ', +theme_code_title : 'òÅÄÁËÔÏÒ HTML ËÏÄÏ×', +theme_code_wordwrap : 'ðÅÒÅÎÏÓ ÐÏ ÓÌÏ×ÁÍ', +theme_sub_desc : 'îÉÖÎÉÊ ÉÎÄÅËÓ', +theme_sup_desc : '÷ÅÒÈÎÉÊ ÉÎÄÅËÓ', +theme_hr_desc : '÷ÓÔÁ×ÉÔØ ÇÏÒÉÚÏÎÔÁÌØÎÙÊ ÒÁÚÄÅÌÉÔÅÌØ', +theme_removeformat_desc : 'õÂÒÁÔØ ÆÏÒÍÁÔÉÒÏ×ÁÎÉÅ', +theme_custom1_desc : '÷ÁÛÅ ÐÒÏÉÚ×ÏÌØÎÏÅ ÏÐÉÓÁÎÉÅ', +insert_image_border : 'òÁÍËÁ', +insert_image_dimensions : 'òÁÚÍÅÒÙ', +insert_image_vspace : '÷ÅÒÔÉËÁÌØÎÙÊ ÏÔÓÔÕÐ', +insert_image_hspace : 'çÏÒÉÚÏÎÔÁÌØÎÙÊ ÏÔÓÔÕÐ', +insert_image_align : '÷ÙÒÁ×ÎÉ×ÁÎÉÅ', +insert_image_align_default : '-- îÅ ÚÁÄÁÎÏ --', +insert_image_align_baseline : 'ðÏ ÂÁÚÏ×ÏÊ ÌÉÎÉÉ', +insert_image_align_top : 'ðÏ ×ÅÒÈÕ', +insert_image_align_middle : 'ðÏÓÒÅÄÉÎÅ', +insert_image_align_bottom : 'ðÏ ÎÉÚÕ', +insert_image_align_texttop : 'ðÏ ×ÅÒÈÕ ÔÅËÓÔÁ', +insert_image_align_absmiddle : 'áÂÓÏÌÀÔÎÏ ÐÏÓÒÅÄÉÎÅ', +insert_image_align_absbottom : 'áÂÓÏÌÀÔÎÏ Ó×ÅÒÈÕ', +insert_image_align_left : '÷ÌÅ×Ï', +insert_image_align_right : '÷ÐÒÁ×Ï', +theme_font_size : '-- òÁÚÍÅÒ ÛÒÉÆÔÁ --', +theme_fontdefault : '-- óÅÍÅÊÓÔ×Ï ÛÒÉÆÔÏ× --', +theme_block : '-- æÏÒÍÁÔ --', +theme_paragraph : 'áÂÚÁÃ', +theme_div : 'Div', +theme_address : 'óÔÉÌØ ÁÄÒÅÓÁ', +theme_pre : ':`ðÒÅÄ×ÁÒÉÔÅÌØÎÏ ÆÏÒÍÁÔÉÒÏ×ÁÎÎÙÊ', +theme_h1 : 'úÁÇÏÌÏ×ÏË 1', +theme_h2 : 'úÁÇÏÌÏ×ÏË 2', +theme_h3 : 'úÁÇÏÌÏ×ÏË 3', +theme_h4 : 'úÁÇÏÌÏ×ÏË 4', +theme_h5 : 'úÁÇÏÌÏ×ÏË 5', +theme_h6 : 'úÁÇÏÌÏ×ÏË 6', +theme_colorpicker_title : '÷ÙÂÒÁÔØ Ã×ÅÔ', +theme_colorpicker_apply : 'ðÒÉÍÅÎÉÔØ', +theme_forecolor_desc : '÷ÙÂÒÁÔØ Ã×ÅÔ ÔÅËÓÔÁ', +theme_backcolor_desc : '÷ÙÂÒÁÔØ Ã×ÅÔ ÆÏÎÁ', +theme_charmap_title : '÷ÙÂÏÒ ÐÒÏÉÚ×ÏÌØÎÏÇÏ ÓÉÍ×ÏÌÁ', +theme_charmap_desc : '÷ÓÔÁ×ÉÔØ ÐÒÏÉÚ×ÏÌØÎÙÊ ÓÉÍ×ÏÌ', +theme_visualaid_desc : 'ðÏËÁÚÁÔØ ÇÒÁÎÉÃÙ ÓËÒÙÔÙÈ ÜÌÅÍÅÎÔÏ×', +insert_anchor_title : '÷ÓÔÁ×ÉÔØ/ÒÅÄÁËÔÉÒÏ×ÁÔØ ÑËÏÒØ', +insert_anchor_name : 'éÍÑ ÑËÏÒÑ', +theme_anchor_desc : '÷ÓÔÁ×ÉÔØ/ÒÅÄÁËÔÉÒÏ×ÁÔØ ÑËÏÒØ', +theme_insert_link_titlefield : 'úÁÇÏÌÏ×ÏË', +theme_clipboard_msg : 'ëÏÐÉÒÏ×ÁÔØ/÷ÙÒÅÚÁÔØ/÷ÓÔÁ×ÉÔØ ÎÅÄÏÓÔÕÐÎÙ ÄÌÑ Mozilla É Firefox.\nèÏÔÉÔÅ ÕÚÎÁÔØ Ï ÜÔÏÍ ÐÏÄÒÏÂÎÅÅ?', +theme_path : 'ðÕÔØ', +cut_desc : '÷ÙÒÅÚÁÔØ', +copy_desc : 'ëÏÐÉÒÏ×ÁÔØ', +paste_desc : '÷ÓÔÁ×ÉÔØ', +link_list : 'ðÅÒÅÞÁÎØ ÓÓÙÌÏË', +image_list : 'ðÅÒÅÞÅÎØ ËÁÒÔÉÎÏË', +browse : 'ðÏÄÏÂÒÁÔØ', +image_props_desc : 'ó×ÏÊÓÔ×Á ËÁÒÔÉÎËÉ', +newdocument_desc : 'îÏ×ÙÊ ÄÏËÕÍÅÎÔ', +class_name : 'ëÌÁÓÓ', +newdocument : '÷Ù Õ×ÅÒÅÎÙ, ÞÔÏ ÈÏÔÉÔÅ ÏÞÉÓÔÉÔØ ×Ó£ ÓÏÄÅÒÖÉÍÏÅ?', +about_title : 'ï TinyMCE', +about : 'ï TinyMCE', +license : 'ìÉÃÅÎÚÉÑ', +plugins : 'ðÌÁÇÉÎÙ', +plugin : 'ðÌÁÇÉÎ', +author : 'á×ÔÏÒ', +version : '÷ÅÒÓÉÑ', +loaded_plugins : 'úÁÇÒÕÖÅÎÎÙÅ ÐÌÁÇÉÎÙ', +help : 'ðÏÍÏÝØ', +not_set : '-- ÎÅ ÕÓÔÁÎÏ×ÌÅÎÏ --', +close : 'úÁËÒÙÔØ', +toolbar_focus : 'ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ ÎÁ ÐÁÎÅÌØ ÉÎÓÔÒÕÍÅÎÔÏ× - Alt+Q, ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ × ÒÅÄÁËÔÏÒ - Alt-Z, ðÅÒÅÍÅÓÔÉÔØ ÆÏËÕÓ ÎÁ ÜÌÅÍÅÎÔ ÐÕÔÉ - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/ru_UTF-8.js b/includes/tiny_mce/themes/advanced/langs/ru_UTF-8.js new file mode 100644 index 0000000..201f81f --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/ru_UTF-8.js @@ -0,0 +1,76 @@ +// Russian lang variables UTF-8 + +tinyMCE.addToLang('',{ +theme_style_select : '-- СтОлО --', +theme_code_desc : 'РеЎактОрПвать HTML кПЎы', +theme_code_title : 'РеЎактПр HTML кПЎПв', +theme_code_wordwrap : 'ПереМПс пП слПваЌ', +theme_sub_desc : 'НОжМОй ОМЎекс', +theme_sup_desc : 'ВерхМОй ОМЎекс', +theme_hr_desc : 'ВставОть гПрОзПМтальМый разЎелОтель', +theme_removeformat_desc : 'Убрать фПрЌатОрПваМОе', +theme_custom1_desc : 'Ваше прПОзвПльМПе ПпОсаМОе', +insert_image_border : 'РаЌка', +insert_image_dimensions : 'РазЌеры', +insert_image_vspace : 'ВертОкальМый Птступ', +insert_image_hspace : 'ГПрОзПМтальМый Птступ', +insert_image_align : 'ВыравМОваМОе', +insert_image_align_default : '-- Не заЎаМП --', +insert_image_align_baseline : 'ПП базПвПй лОМОО', +insert_image_align_top : 'ПП верху', +insert_image_align_middle : 'ППсреЎОМе', +insert_image_align_bottom : 'ПП МОзу', +insert_image_align_texttop : 'ПП верху текста', +insert_image_align_absmiddle : 'АбсПлютМП пПсреЎОМе', +insert_image_align_absbottom : 'АбсПлютМП сверху', +insert_image_align_left : 'ВлевП', +insert_image_align_right : 'ВправП', +theme_font_size : '-- РазЌер шрОфта --', +theme_fontdefault : '-- СеЌействП шрОфтПв --', +theme_block : '-- ЀПрЌат --', +theme_paragraph : 'Абзац', +theme_div : 'Div', +theme_address : 'СтОль аЎреса', +theme_pre : ':`ПреЎварОтельМП фПрЌатОрПваММый', +theme_h1 : 'ЗагПлПвПк 1', +theme_h2 : 'ЗагПлПвПк 2', +theme_h3 : 'ЗагПлПвПк 3', +theme_h4 : 'ЗагПлПвПк 4', +theme_h5 : 'ЗагПлПвПк 5', +theme_h6 : 'ЗагПлПвПк 6', +theme_colorpicker_title : 'Выбрать цвет', +theme_colorpicker_apply : 'ПрОЌеМОть', +theme_forecolor_desc : 'Выбрать цвет текста', +theme_backcolor_desc : 'Выбрать цвет фПМа', +theme_charmap_title : 'ВыбПр прПОзвПльМПгП сОЌвПла', +theme_charmap_desc : 'ВставОть прПОзвПльМый сОЌвПл', +theme_visualaid_desc : 'ППказать граМОцы скрытых элеЌеМтПв', +insert_anchor_title : 'ВставОть/реЎактОрПвать якПрь', +insert_anchor_name : 'ИЌя якПря', +theme_anchor_desc : 'ВставОть/реЎактОрПвать якПрь', +theme_insert_link_titlefield : 'ЗагПлПвПк', +theme_clipboard_msg : 'КПпОрПвать/Вырезать/ВставОть МеЎПступМы Ўля Mozilla О Firefox.\nХПтОте узМать Пб этПЌ пПЎрПбМее?', +theme_path : 'Путь', +cut_desc : 'Вырезать', +copy_desc : 'КПпОрПвать', +paste_desc : 'ВставОть', +link_list : 'ПеречаМь ссылПк', +image_list : 'ПеречеМь картОМПк', +browse : 'ППЎПбрать', +image_props_desc : 'СвПйства картОМкО', +newdocument_desc : 'НПвый ЎПкуЌеМт', +class_name : 'Класс', +newdocument : 'Вы увереМы, чтП хПтОте ПчОстОть всё сПЎержОЌПе?', +about_title : 'О TinyMCE', +about : 'О TinyMCE', +license : 'ЛОцеМзОя', +plugins : 'ПлагОМы', +plugin : 'ПлагОМ', +author : 'АвтПр', +version : 'ВерсОя', +loaded_plugins : 'ЗагружеММые плагОМы', +help : 'ППЌПщь', +not_set : '-- Ме устаМПвлеМП --', +close : 'Закрыть', +toolbar_focus : 'ПереЌестОть фПкус Ма паМель ОМструЌеМтПв - Alt+Q, ПереЌестОть фПкус в реЎактПр - Alt-Z, ПереЌестОть фПкус Ма элеЌеМт путО - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/sk.js b/includes/tiny_mce/themes/advanced/langs/sk.js new file mode 100644 index 0000000..f7c56c8 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/sk.js @@ -0,0 +1,72 @@ +/** + * Slovak lang variables + * encoding: utf-8 + * + * @author Vladimir VASIL vvasil@post.sk + * + * $Id: sk.js,v 1.1 2005/11/22 20:56:45 spocke Exp $ + */ + + +tinyMCE.addToLang('',{ +theme_style_select : 'Å tÜly', +theme_code_desc : 'ZobraziÅ¥ HTML', +theme_code_title : 'Editácia HTML', +theme_code_wordwrap : 'Bez delení slov', +theme_sub_desc : 'DolnÜ index', +theme_sup_desc : 'HornÜ index', +theme_hr_desc : 'VloÅŸiÅ¥ vodorovnÜ oddeÄŸovač', +theme_removeformat_desc : 'ZruÅ¡iÅ¥ formátovanie', +theme_custom1_desc : 'ÄœubovolnÜ popisok', +insert_image_border : 'Rámček', +insert_image_dimensions : 'Rozmery', +insert_image_vspace : 'VertikálnÜ okraj', +insert_image_hspace : 'HorizontálnÜ okraj', +insert_image_align : 'Zarovnánie', +insert_image_align_default : 'VÜchozi', +insert_image_align_baseline : 'Na čiare', +insert_image_align_top : 'Nahor', +insert_image_align_middle : 'Na stred', +insert_image_align_bottom : 'Dole', +insert_image_align_texttop : 'Najvyšší bod textu', +insert_image_align_absmiddle : 'Stred riadku', +insert_image_align_absbottom : 'Spodok riadku', +insert_image_align_left : 'VÄŸavo', +insert_image_align_right : 'Vpravo', +theme_font_size : '-- VeÄŸkosÅ¥ textu --', +theme_fontdefault : '-- Písmo --', +theme_block : '-- Formát --', +theme_paragraph : 'Odstavec', +theme_div : 'Div', +theme_address : 'Adresa', +theme_pre : 'Predformát', +theme_h1 : 'Nádpis 1', +theme_h2 : 'Nádpis 2', +theme_h3 : 'Nádpis 3', +theme_h4 : 'Nádpis 4', +theme_h5 : 'Nádpis 5', +theme_h6 : 'Nádpis 6', +theme_colorpicker_title : 'VÜber farby', +theme_colorpicker_apply : 'VybraÅ¥', +theme_forecolor_desc : 'Farba popredia', +theme_backcolor_desc : 'Farba pozadia', +theme_charmap_title : 'VÜber znaku', +theme_charmap_desc : 'VloÅŸiÅ¥ znak', +theme_visualaid_desc : 'Zapnúť značky/neviditeÄŸné prvky', +insert_anchor_title : 'VloÅŸenie/editácia záloÅŸky', +insert_anchor_name : 'Názov', +theme_anchor_desc : 'VloÅŸiÅ¥/editovaÅ¥ záloÅŸku', +theme_insert_link_titlefield : 'Názov', +theme_clipboard_msg : 'Funkcie KopírovaÅ¥/vystrihnúť/vloÅŸiÅ¥ niesú pouÅŸiteÄŸné v Mozille a Firefoxe.\nChcete viac informacií o tomto probléme?', +theme_path : 'Cesta', +cut_desc : 'Vystrihnúť', +copy_desc : 'KopírovaÅ¥', +paste_desc : 'VloÅŸiÅ¥', +link_list : 'Zoznam', +image_list : 'Zoznam', +browse : 'PrechádzaÅ¥', +image_props_desc : 'Vlastnosti obrázku', +newdocument_desc : 'NovÜ dokument', +newdocument : 'Ste si istÜ(á), ÅŸe chcete vymazaÅ¥ vÅ¡etok obsah?' +}); + diff --git a/includes/tiny_mce/themes/advanced/langs/sv.js b/includes/tiny_mce/themes/advanced/langs/sv.js new file mode 100644 index 0000000..d1d3b7c --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/sv.js @@ -0,0 +1,77 @@ +// SE lang variables + +tinyMCE.addToLang('',{ +theme_style_select : '-- Stilar --', +theme_code_desc : 'Editera HTML-koden', +theme_code_title : 'HTML-källkodseditor', +theme_code_wordwrap : 'Automatiskt radbyte', +theme_sub_desc : 'Nedsänkt text', +theme_sup_desc : 'Upphöjd text', +theme_hr_desc : 'Sätt in horisontell linje', +theme_removeformat_desc : 'Ta bort formatering', +theme_custom1_desc : 'Din specialbeskriving här', +insert_image_border : 'Ram', +insert_image_dimensions : 'Dimensioner', +insert_image_vspace : 'Vertikalt tomrum', +insert_image_hspace : 'Horisontellt tomrum', +insert_image_align : 'Justering', +insert_image_align_default : 'Ingen', +insert_image_align_baseline : 'Bottenlinjen', +insert_image_align_top : 'Längst upp', +insert_image_align_middle : 'Mitten', +insert_image_align_bottom : 'Längst ner', +insert_image_align_texttop : 'Textens top', +insert_image_align_absmiddle : 'Absoluta mitten', +insert_image_align_absbottom : 'Absolut längst ner', +insert_image_align_left : 'Vänster', +insert_image_align_right : 'Höger', +insert_image_delta_width : 30, +insert_image_delta_height : 10, +theme_font_size : '-- Fontstorlek --', +theme_fontdefault : '-- Font familj --', +theme_block : '-- Stycke --', +theme_paragraph : 'Paragraf', +theme_div : 'Div', +theme_address : 'Adress', +theme_pre : 'Förformatterad', +theme_h1 : 'Rubrik 1', +theme_h2 : 'Rubrik 2', +theme_h3 : 'Rubrik 3', +theme_h4 : 'Rubrik 4', +theme_h5 : 'Rubrik 5', +theme_h6 : 'Rubrik 6', +theme_colorpicker_title : 'Välj en färg', +theme_colorpicker_apply : 'Verkställ', +theme_forecolor_desc : 'Välj förgrundsfärg', +theme_backcolor_desc : 'Välj bakgrundsfärg', +theme_charmap_title : 'Välj specialtecken', +theme_charmap_desc : 'Sätt in specialtecken', +theme_visualaid_desc : 'Slå av/på osynliga element', +insert_anchor_title : 'Skapa/redigera ankare', +insert_anchor_name : 'Ankarnamn', +theme_anchor_desc : 'Skapa/redigera ankare', +theme_insert_link_titlefield : 'Titel', +theme_clipboard_msg : 'Klipput/Kopiera/Klistra fungerar inte Mozilla och Firefox. Vill du veta mer om detta?', +theme_path : 'Sökväg', +cut_desc : 'Klipp ut', +copy_desc : 'Kopiera', +paste_desc : 'Klistra in', +link_list : 'Länkar', +image_list : 'Bilder', +browse : 'Bläddra', +image_props_desc : 'Bild egenskaper', +newdocument_desc : 'Nytt dokument', +class_name : 'Stil', +newdocument : 'Är du säker på att du vill tömma hela redigerings ytan?', +about_title : 'Om TinyMCE', +about : 'Om', +license : 'Licens', +plugins : 'Insticksprogram', +plugin : 'Insticksprogram', +author : 'Utvecklare', +version : 'Version', +loaded_plugins : 'Laddade insticksprogram', +help : 'Hjälp', +not_set : '-- Inte satt --', +close : 'Stäng' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/tw.js b/includes/tiny_mce/themes/advanced/langs/tw.js new file mode 100644 index 0000000..be4a76b --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/tw.js @@ -0,0 +1,91 @@ +// TW lang variables contributed by Jim Kou + +tinyMCE.addToLang('',{ +bold_desc : '²ÊÅé', +bold_img : "bold.gif", +bullist_desc : '²Åž¹¶µ¥Ø', +cancel : 'šú®ø', +cleanup_desc : '²M°£', +help_desc : '»²§U»¡©ú', +image_desc : '¹Ï€ù', +indent_desc : 'ÁY±Æ', +insert : '·sŒW', +insert_anchor_name : 'ŒÐµùŠWºÙ', +insert_anchor_title : '·sŒWŒÐµù', +insert_image_align : '¹ï»ô', +insert_image_align_absbottom : '±jšî»ô€U', +insert_image_align_absmiddle : '±jšîžm€€', +insert_image_align_baseline : '°ò·Çœu', +insert_image_align_bottom : '»ô€U', +insert_image_align_default : 'ŒÐ·Ç', +insert_image_align_left : '»ô¥ª', +insert_image_align_middle : 'žm€€', +insert_image_align_right : '»ô¥k', +insert_image_align_texttop : '€åŠr€W€è', +insert_image_align_top : '»ô€W', +insert_image_alt : '¹Ï€ù»¡©ú', +insert_image_border : '¥~®Ø', +insert_image_dimensions : '€Ø€o', +insert_image_hspace : '€ô¥­¶¡»Ø', +insert_image_src : '¹Ï€ùšÓ·œ', +insert_image_title : '·sŒW¹Ï€ù', +insert_image_vspace : '««ªœ¶¡»Ø', +insert_link_target : '¥ØŒÐ', +insert_link_target_blank : 'Åã¥Ü©ó·sµøµ¡€€', +insert_link_target_same : 'Åã¥Ü©óŠP€@µøµ¡€€', +insert_link_title : '·sŒW¶W³sµ²', +insert_link_url : '¶W³sµ²', +italic_desc : '±×Åé', +italic_img : "italic.gif", +justifycenter_desc : '»ô€€', +justifyfull_desc : '¶ñº¡', +justifyleft_desc : '»ô¥ª', +justifyright_desc : '»ô¥k', +link_desc : '«Ø¥ß³sµ²', +numlist_desc : 'ŒÆŠr¶µ¥Ø', +outdent_desc : '¥Y±Æ', +redo_desc : '­«°µ', +striketrough_desc : '§R°£œu', +theme_address : 'Ša§}', +theme_anchor_desc : 'ŒÐµù', +theme_charmap_desc : '¯S®íŠr€ž', +theme_charmap_title : '¯S®íŠr€ž²M³æ', +theme_code_desc : 'Åã¥Ü HTML ­ì©lœX', +theme_code_wordwrap : 'Word wrap', +theme_code_title : 'HTML ­ì©lœX', +theme_colorpicker_apply : 'Åܧó', +theme_colorpicker_title : 'ÃCŠâ', +theme_font_size : '-- Font size --', +theme_fontdefault : '-- Font family --', +theme_block : '-- Format --', +theme_forecolor_desc : 'Šr«¬ÃCŠâ', +theme_backcolor_desc : 'Select background color', +theme_h1 : 'ŒÐÃD1', +theme_h2 : 'ŒÐÃD2', +theme_h3 : 'ŒÐÃD3', +theme_h4 : 'ŒÐÃD4', +theme_h5 : 'ŒÐÃD5', +theme_h6 : 'ŒÐÃD6', +theme_hr_desc : '·sŒWŸîœu', +theme_paragraph : '¬qžš', +theme_pre : '€º©w®æŠ¡', +theme_removeformat_desc : '²M°£®æŠ¡³]©w', +theme_style_select : 'ŒËŠ¡', +theme_sub_desc : '€UŒÐ', +theme_sup_desc : '€WŒÐ', +theme_visualaid_desc : 'Åã¥Ü/ÁôÂëD¥iš£ªº€ž¯À', +underline_desc : '©³œu', +undo_desc : 'Ž_­ì', +unlink_desc : 'šú®ø³sµ²', +theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?', +theme_path : 'Path', +cut_desc : 'Cut', +copy_desc : 'Copy', +paste_desc : 'Paste', +link_list : 'Link list', +image_list : 'Image list', +browse : 'Browse', +image_props_desc : 'Image properties', +newdocument_desc : 'New document', +newdocument : 'Are you sure you want clear all contents?' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/zh_cn.js b/includes/tiny_mce/themes/advanced/langs/zh_cn.js new file mode 100644 index 0000000..0f42280 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/zh_cn.js @@ -0,0 +1,76 @@ +// Simplified Chinese lang variables contributed by tom_cat (thomaswangyang@gmail.com) + +tinyMCE.addToLang('',{ +theme_style_select : '-- žñÊœ --', +theme_code_desc : '±àŒ­HTMLÔŽŽúÂë', +theme_code_title : 'HTMLÔŽŽúÂë±àŒ­Æ÷', +theme_code_wordwrap : '×Ô¶¯»»ÐÐ', +theme_sub_desc : 'ϱê', +theme_sup_desc : 'Éϱê', +theme_hr_desc : '²åÈëˮƜÏß', +theme_removeformat_desc : 'ÒÆ³ýžñÊœ', +theme_custom1_desc : 'ÕâÀïÌîÐŽÓû§×Ô¶šÒåÃèÊö', +insert_image_border : '±ß¿ò', +insert_image_dimensions : 'άÊý', +insert_image_vspace : '޹ֱŒäŸà', +insert_image_hspace : 'ˮƜŒäŸà', +insert_image_align : '¶ÔÆë·œÊœ', +insert_image_align_default : '-- ĬÈÏ --', +insert_image_align_baseline : '»ùÏß', +insert_image_align_top : '¶¥¶Ë', +insert_image_align_middle : 'ŸÓÖÐ', +insert_image_align_bottom : 'µ×²¿', +insert_image_align_texttop : 'ÎÄ×ÖÉÏ·œ', +insert_image_align_absmiddle : 'Ÿø¶ÔŸÓÖÐ', +insert_image_align_absbottom : 'Ÿø¶Ôµ×²¿', +insert_image_align_left : '×ó¶ÔÆë', +insert_image_align_right : 'ÓÒ¶ÔÆë', +theme_font_size : '-- ×ֺŠ--', +theme_fontdefault : '-- ×ÖÌå --', +theme_block : '-- žñÊœ --', +theme_paragraph : '¶ÎÂä', +theme_div : '²ã', +theme_address : 'µØÖ·', +theme_pre : 'Ô€žñÊœ»¯', +theme_h1 : '±êÌâ 1', +theme_h2 : '±êÌâ 2', +theme_h3 : '±êÌâ 3', +theme_h4 : '±êÌâ 4', +theme_h5 : '±êÌâ 5', +theme_h6 : '±êÌâ 6', +theme_colorpicker_title : 'Ñ¡ÔñÑÕÉ«', +theme_colorpicker_apply : 'ÓŠÓÃ', +theme_forecolor_desc : 'Ñ¡ÔñÎÄ×ÖÑÕÉ«', +theme_backcolor_desc : 'Ñ¡Ôñ±³Ÿ°ÑÕÉ«', +theme_charmap_title : 'Ñ¡ÔñÌØÊâ·ûºÅ', +theme_charmap_desc : '²åÈëÌØÊâ·ûºÅ', +theme_visualaid_desc : '¿ª¹Ø²»¿ÉŒûÔªËØ', +insert_anchor_title : '²åÈë/±àŒ­ êµã', +insert_anchor_name : 'êµãÃû³Æ', +theme_anchor_desc : '²åÈë/±àŒ­ êµã', +theme_insert_link_titlefield : '±êÌâ', +theme_clipboard_msg : 'ŒôÇÐ/žŽÖÆ/Õ³Ìù¹ŠÄÜÔÚ Mozilla ºÍ Firefox ä¯ÀÀÆ÷Öв»Ö§³Ö¡£\nÄúÏ£Íû»ñµÃžü¶àµÄÐÅÏ¢Âð£¿', +theme_path : '·Ÿ¶', +cut_desc : 'ŒôÇÐ', +copy_desc : 'žŽÖÆ', +paste_desc : 'Õ³Ìù', +link_list : 'ÁŽœÓÁбí', +image_list : 'ÍŒÏñÁбí', +browse : 'ä¯ÀÀ', +image_props_desc : 'ÍŒÏñÊôÐÔ', +newdocument_desc : 'МšŒäµµ', +class_name : 'Àà', +newdocument : 'ÄúÈ·ÈÏÒªÇå³ýËùÓÐÄÚÈÝÂð£¿', +about_title : '¹ØÓÚ TinyMCE', +about : '¹ØÓÚ', +license : 'ÊÚÈšÊé', +plugins : 'ËùÓвåŒþ', +plugin : '²åŒþ', +author : '×÷Õß', +version : '°æ±Ÿ', +loaded_plugins : '¶ÁÈ¡²åŒþ', +help : '°ïÖú', +not_set : '-- ¿ÕÉè¶š --', +close : '¹Ø±Õ', +toolbar_focus : 'Ìøµœ¹€Ÿß°ŽÅ¥ - Alt+Q, Ìøµœ±àŒ­Æ÷ - Alt-Z, ÌøµœÔªËØÂ·Ÿ¶ - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/zh_tw.js b/includes/tiny_mce/themes/advanced/langs/zh_tw.js new file mode 100644 index 0000000..231cebd --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/zh_tw.js @@ -0,0 +1,78 @@ +// Traditional Chinese BIG-5; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// ÁcÅ退€å BIG-5 ¡FŒÆŠìÀ³¥Î§{»s§@¡F twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('',{ +theme_style_select : '-- Š¡ŒË --', +theme_code_desc : 'œs¿è HTML œX', +theme_code_title : 'HTML œXœs¿èŸ¹', +theme_code_wordwrap : 'ŠrµüÀô¶', +theme_sub_desc : '€UŒÐ', +theme_sup_desc : '€WŒÐ', +theme_hr_desc : 'Ž¡€J€ô¥­œu', +theme_removeformat_desc : '²M°£®æŠ¡³]©w', +theme_custom1_desc : 'ŠÛ­q»¡©úŠbй¿é€J', +insert_image_border : '®Øœu', +insert_image_dimensions : '€Ø€o', +insert_image_vspace : '¹Ï¹³€W€U°Œ¶¡¶Z', +insert_image_hspace : '¹Ï¹³¥ª¥kÃä¶¡¶Z', +insert_image_align : '««ªœ¹ï»ô', +insert_image_align_default : '-- ¥Œ³]žm --', +insert_image_align_baseline : '©³œu', +insert_image_align_top : '³»ºÝ', +insert_image_align_middle : '€€œu', +insert_image_align_bottom : '©³³¡', +insert_image_align_texttop : '€åŠr³»ºÝ', +insert_image_align_absmiddle : 'µŽ¹ï€€œu', +insert_image_align_absbottom : 'µŽ¹ï©³³¡', +insert_image_align_left : '¥ª', +insert_image_align_right : '¥k', +theme_font_size : '-- ŠrÅé€j€p --', +theme_fontdefault : '-- ŠrÅé¿ïŸÜ --', +theme_block : '-- ®æŠ¡ --', +theme_paragraph : '¬qžš', +theme_div : '€À¬É', +theme_address : 'Šìžm', +theme_pre : '€º©w®æŠ¡', +theme_h1 : 'ŒÐÃD€@', +theme_h2 : 'ŒÐÃD€G', +theme_h3 : 'ŒÐÃD€T', +theme_h4 : 'ŒÐÃD¥|', +theme_h5 : 'ŒÐÃD€­', +theme_h6 : 'ŒÐÃD€»', +theme_colorpicker_title : '¿ïšúÃCŠâ', +theme_colorpicker_apply : '®M¥Î', +theme_forecolor_desc : '¿ïšú€åŠrÃCŠâ', +theme_backcolor_desc : '¿ïšú­IŽºÃCŠâ', +theme_charmap_title : '¿ïšúŠÛ­qŠr€ž', +theme_charmap_desc : 'Ž¡€JŠÛ­qŠr€ž', +theme_visualaid_desc : '€ÁŽ««ü¥Ü©Î«D¥iš£€ž¥ó', +insert_anchor_title : 'Ž¡€J©Îœs¿è³sµ²ÂI', +insert_anchor_name : '³sµ²ÂIŠWºÙ', +theme_anchor_desc : 'Ž¡€J©Îœs¿è³sµ²ÂI', +theme_insert_link_titlefield : 'ŒÐÃD', +theme_clipboard_msg : 'Šb Mozilla ©M Firefox €€µLªkšÏ¥ÎœÆ»s©Î°Å€U©Î¶K€W¥\¯à¡C\n»Ý­n§óŠhÃö©óйªº°T®§¶Ü¡H', +theme_path : 'žô®|', +cut_desc : '°Å€U', +copy_desc : 'œÆ»s', +paste_desc : '¶K€W', +link_list : '³sµ²ŠCªí', +image_list : '¹ÏÀÉŠCªí', +browse : 'ÂsÄý', +image_props_desc : '¹ÏÀÉÄÝ©Ê', +newdocument_desc : '·s€å¥ó', +class_name : '€ÀÃþ', +newdocument : 'œT©w­n²M°£¥þ³¡€º®e¡H', +about_title : 'Ãö©ó TinyMCE', +about : 'Ãö©ó', +license : '±ÂÅv', +plugins : 'À³¥Î®M¥ó', +plugin : 'À³¥Î®M¥ó', +author : '§@ªÌ', +version : 'ª©¥»', +loaded_plugins : '€wžü€JÀ³¥Î®M¥ó', +help : 'šó§U', +not_set : '-- ¥Œ³]žm --', +close : 'Ãö³¬', +toolbar_focus : '§Ö³t±Ò¥Î€ušã¯Ã - Alt+Q¡F§Ö³t±Ò¥Îœs¿èŸ¹ - Alt-Z¡F§Ö³t²ŸŠÜ€ž¥óžô®| - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/langs/zh_tw_utf8.js b/includes/tiny_mce/themes/advanced/langs/zh_tw_utf8.js new file mode 100644 index 0000000..dc45ecc --- /dev/null +++ b/includes/tiny_mce/themes/advanced/langs/zh_tw_utf8.js @@ -0,0 +1,78 @@ +// Traditional Chinese UTF-8; Twapweb Site translated; twapweb_AT_gmail_DOT_com +// 繁體䞭文 UTF-8 敞䜍應甚坊補䜜 twapweb_AT_gmail_DOT_com + + +tinyMCE.addToLang('',{ +theme_style_select : '-- 匏暣 --', +theme_code_desc : '線茯 HTML 碌', +theme_code_title : 'HTML 碌線茯噚', +theme_code_wordwrap : '字詞環繞', +theme_sub_desc : '䞋暙', +theme_sup_desc : '䞊暙', +theme_hr_desc : '插入氎平線', +theme_removeformat_desc : '枅陀栌匏蚭定', +theme_custom1_desc : '自蚂說明圚歀茞入', +insert_image_border : '框線', +insert_image_dimensions : '尺寞', +insert_image_vspace : '圖像䞊䞋偎間距', +insert_image_hspace : '圖像巊右邊間距', +insert_image_align : '垂盎對霊', +insert_image_align_default : '-- 未蚭眮 --', +insert_image_align_baseline : '底線', +insert_image_align_top : '頂端', +insert_image_align_middle : 'äž­ç·š', +insert_image_align_bottom : '底郚', +insert_image_align_texttop : '文字頂端', +insert_image_align_absmiddle : '絕對䞭線', +insert_image_align_absbottom : '絕對底郚', +insert_image_align_left : 'å·Š', +insert_image_align_right : '右', +theme_font_size : '-- 字體倧小 --', +theme_fontdefault : '-- 字體遞擇 --', +theme_block : '-- 栌匏 --', +theme_paragraph : '段萜', +theme_div : '分界', +theme_address : '䜍眮', +theme_pre : '內定栌匏', +theme_h1 : '暙題䞀', +theme_h2 : '暙題二', +theme_h3 : '暙題䞉', +theme_h4 : '暙題四', +theme_h5 : '暙題五', +theme_h6 : '暙題六', +theme_colorpicker_title : '遞取顏色', +theme_colorpicker_apply : '套甚', +theme_forecolor_desc : '遞取文字顏色', +theme_backcolor_desc : '遞取背景顏色', +theme_charmap_title : '遞取自蚂字元', +theme_charmap_desc : '插入自蚂字元', +theme_visualaid_desc : '切換指瀺或非可芋元件', +insert_anchor_title : '插入或線茯連結點', +insert_anchor_name : '連結點名皱', +theme_anchor_desc : '插入或線茯連結點', +theme_insert_link_titlefield : '暙題', +theme_clipboard_msg : '圚 Mozilla 和 Firefox 䞭無法䜿甚耇補或剪䞋或貌䞊功胜。\n需芁曎倚關斌歀的蚊息嗎', +theme_path : '路埑', +cut_desc : '剪䞋', +copy_desc : '耇補', +paste_desc : '貌䞊', +link_list : '連結列衚', +image_list : '圖檔列衚', +browse : '瀏芜', +image_props_desc : '圖檔屬性', +newdocument_desc : '新文件', +class_name : '分類', +newdocument : '確定芁枅陀党郚內容', +about_title : '關斌 TinyMCE', +about : '關斌', +license : '授權', +plugins : '應甚套件', +plugin : '應甚套件', +author : '䜜者', +version : '版本', +loaded_plugins : '已茉入應甚套件', +help : '協助', +not_set : '-- 未蚭眮 --', +close : '關閉', +toolbar_focus : '快速啟甚工具玐 - Alt+Q快速啟甚線茯噚 - Alt-Z快速移至元件路埑 - Alt-X' +}); diff --git a/includes/tiny_mce/themes/advanced/link.htm b/includes/tiny_mce/themes/advanced/link.htm new file mode 100644 index 0000000..a279b13 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/link.htm @@ -0,0 +1,92 @@ + + + {$lang_insert_link_title} + + + + + + +
+ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{$lang_insert_link_title}
{$lang_insert_link_url}: + + + + +
 
{$lang_insert_link_target}:
{$lang_theme_insert_link_titlefield}:
{$lang_class_name}: +   
+
+
+ + diff --git a/includes/tiny_mce/themes/advanced/source_editor.htm b/includes/tiny_mce/themes/advanced/source_editor.htm new file mode 100644 index 0000000..fd00d52 --- /dev/null +++ b/includes/tiny_mce/themes/advanced/source_editor.htm @@ -0,0 +1,30 @@ + + + + {$lang_theme_code_title} + + + + + +
+
{$lang_theme_code_title}
+ +
+ +
+ + + +
+
+ +
+ +
+ +
+
+
+ + diff --git a/includes/tiny_mce/themes/simple/css/editor_content.css b/includes/tiny_mce/themes/simple/css/editor_content.css new file mode 100644 index 0000000..ac7e5a7 --- /dev/null +++ b/includes/tiny_mce/themes/simple/css/editor_content.css @@ -0,0 +1,27 @@ +body { + background-color: #FFFFFF; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +pre { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +.mceVisualAid { + border: 1px dashed #BBBBBB; +} diff --git a/includes/tiny_mce/themes/simple/css/editor_popup.css b/includes/tiny_mce/themes/simple/css/editor_popup.css new file mode 100644 index 0000000..c6cab79 --- /dev/null +++ b/includes/tiny_mce/themes/simple/css/editor_popup.css @@ -0,0 +1,41 @@ +body { + background-color: #F0F0EE; + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; + scrollbar-3dlight-color: #F0F0EE; + scrollbar-arrow-color: #676662; + scrollbar-base-color: #F0F0EE; + scrollbar-darkshadow-color: #DDDDDD; + scrollbar-face-color: #E0E0DD; + scrollbar-highlight-color: #F0F0EE; + scrollbar-shadow-color: #F0F0EE; + scrollbar-track-color: #F5F5F5; +} + +td { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 11px; +} + +input { + background: #FFFFFF; + border: 1px solid #cccccc; +} + +td, input, select, textarea { + font-family: Verdana, Arial, Helvetica, sans-serif; + font-size: 10px; +} + +input, select, textarea { + border: 1px solid #808080; +} + +.input_noborder { + border: 0px solid #808080; +} + +.title { + font-size: 12px; + font-weight: bold; +} \ No newline at end of file diff --git a/includes/tiny_mce/themes/simple/css/editor_ui.css b/includes/tiny_mce/themes/simple/css/editor_ui.css new file mode 100644 index 0000000..b24f485 --- /dev/null +++ b/includes/tiny_mce/themes/simple/css/editor_ui.css @@ -0,0 +1,92 @@ +.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected { + margin-top: 1px; + margin-left: 1px; +} + +.mceButtonNormal { + border: 1px solid #F0F0EE !important; + cursor: arrow; +} + +.mceButtonOver { + border: 1px solid #0A246A; + cursor: arrow; + background-color: #B6BDD2; +} + +.mceButtonDown { + cursor: arrow; + border: 1px solid #0A246A; + background-color: #8592B5; +} + +.mceButtonSelected { + border: 1px solid; + border-color: #C0C0BB; + cursor: arrow; +} + +.mceButtonDisabled { + filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); + -moz-opacity:0.3; + opacity: 0.3; + border: 1px solid #F0F0EE !important; + cursor: arrow; +} + +.mceSeparator { + border-top: 1px solid buttonhighlight; + border-left: 1px solid buttonhighlight; + border-bottom: 1px solid buttonshadow; + border-right: 1px solid buttonshadow; + margin-right: 2px; + margin-left: 2px; +} + +.mceSeparatorLine { + margin:2px; + margin-left: 4px; + background-color: #F0F0EE; + border-top: 1px solid buttonshadow; + border-left: 1px solid buttonshadow; + border-bottom: 1px solid buttonhighlight; + border-right: 1px solid buttonhighlight; + width: 0px; + height: 15px; +} + +.mceSelectList { + font-family: "MS Sans Serif"; + font-size: 7pt; + font-weight: normal; + margin-top: 2px; +} + +.mceLabel, .mceLabelDisabled { + font-family: "MS Sans Serif"; + font-size: 9pt; +} + +.mceLabel { + color: #000000; +} + +.mceLabelDisabled { + cursor: text; + color: #999999; +} + +.mceEditor { + background: #F0F0EE; + border: 1px solid #cccccc; +} + +.mceEditorArea { + font-family: "MS Sans Serif"; + background: #FFFFFF; +} + +.mceToolbar { + background: #F0F0EE; + border-top: 1px solid #cccccc; +} \ No newline at end of file diff --git a/includes/tiny_mce/themes/simple/editor_template.js b/includes/tiny_mce/themes/simple/editor_template.js new file mode 100644 index 0000000..b4266d8 --- /dev/null +++ b/includes/tiny_mce/themes/simple/editor_template.js @@ -0,0 +1,20 @@ +function TinyMCE_simple_getEditorTemplate(){var template=new Array();template['html']='\ +\ +\ +\ +
\ +IFRAME\ +
\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +
';template['delta_width']=0;template['delta_height']=-20;return template;}function TinyMCE_simple_handleNodeChange(editor_id,node){tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;}}while((node=node.parentNode)!=null);} \ No newline at end of file diff --git a/includes/tiny_mce/themes/simple/editor_template_src.js b/includes/tiny_mce/themes/simple/editor_template_src.js new file mode 100644 index 0000000..1101d82 --- /dev/null +++ b/includes/tiny_mce/themes/simple/editor_template_src.js @@ -0,0 +1,70 @@ +function TinyMCE_simple_getEditorTemplate() { + var template = new Array(); + + template['html'] = '\ +\ +\ +\ +
\ +IFRAME\ +
\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +\ +
'; + + template['delta_width'] = 0; + template['delta_height'] = -20; + + return template; +} + +function TinyMCE_simple_handleNodeChange(editor_id, node) { + // Reset old states + tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal'); + tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal'); + + // Handle elements + do { + switch (node.nodeName.toLowerCase()) { + case "b": + case "strong": + tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected'); + break; + + case "i": + case "em": + tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected'); + break; + + case "u": + tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected'); + break; + + case "strike": + tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected'); + break; + + case "ul": + tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected'); + break; + + case "ol": + tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected'); + break; + } + } while ((node = node.parentNode) != null); +} diff --git a/includes/tiny_mce/themes/simple/images/bold.gif b/includes/tiny_mce/themes/simple/images/bold.gif new file mode 100644 index 0000000000000000000000000000000000000000..d6a9cc2cd4117526156fa29c06156ba5971823c4 GIT binary patch literal 76 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*&Mzw-23{>3a?E=Bm(Rqw7V Z4AWqey4jFcx$b3$*C(Ir-+DzDtN~+a79aos literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/bold_de_se.gif b/includes/tiny_mce/themes/simple/images/bold_de_se.gif new file mode 100644 index 0000000000000000000000000000000000000000..9b129de25e916946792c89f08a7b30b2f9dc8b72 GIT binary patch literal 73 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*UAzw-23e#sdnZdC`i8W!&j Xl@)6cxH+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNeI`y fv!S2m6KACKPM+Zyy|O9RI8W2_`nTTOtPIuwq8S!> literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/bold_tw.gif b/includes/tiny_mce/themes/simple/images/bold_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..82085432c622fb9b195d45480ce0c00f80d24027 GIT binary patch literal 207 zcmV;=05JbYNk%w1VH5xq0J9DNySuyH-QDi)?jj;0%*@PHRaKdpnGq2YcXxM0L_~;) zh%+-YW@csp00960{{R30A^8LW000gEEC2ui02BZe000Dh(8)=wy*N7}G;WM{HHkzh zs6t%9fi%d0HcQepm#{3&(I_#A0+$;m0FJ}}WxKp?w}cH!tRNB$k|H1#RxPhVL6BGg z09nkC_M1X4*#RtJD4)}o#(?mXbR9t%Fa-%dPzMPG0V6gC3@He52a91h#Kfdz)l@%W&!*iMf|{-?85Jc}En;9`Q2fcl$iTqPpaWzB zRf;e$FdJ6vy7SNAl;>@M#YT=zObHxz&I%bBUa^s_ M6r5P1!pL9^0IPo@`~Uy| literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/cleanup.gif b/includes/tiny_mce/themes/simple/images/cleanup.gif new file mode 100644 index 0000000000000000000000000000000000000000..16491f6cfcf3e1123f08352c895f8010f791c469 GIT binary patch literal 256 zcmV+b0ssC-Nk%w1VH5xq0MrlwMm#2xdP3^ge4>(aXJcF2&#c0@g7@*TXJyAiI+Bx- z!osRT%E{EUw6tz+enw7G^6K)^$d=yS-J+Ue{{6y&f`-z%VxXFs!L^y{+>(HFVv>^L zOipLAk}~7mu>b%7A^8LW0018VEC2ui02BZe000Gj;3tk`X`X1RuBfCa3_CK)hB&I! z?6jS5DV>BNxhN371`1>FG$6!^gQF}JB8CHn;<-pFjYq{)@NCbANaf;iJjfX><#5Od z41@~dZSq94bpiqw6C4j!WCnJE77HB!h$k2WjE(>oEEpP%kC-wT1Ob;aBcK|jsHv(a GApkq`d~Wvu literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/italic.gif b/includes/tiny_mce/themes/simple/images/italic.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bb330bd0bbf61fdb5ce86388ecbeae16465bc17 GIT binary patch literal 79 zcmZ?wbhEHb6k!lySjfl#1T8Hs)z#IEjEssuS%3n}3_2iDkURsE!kqq_+b+wcJF`+8$Fz@Ye(g^_`QkwFK@28xR?Ffgh1^shYqmVdFy0;Z@$ hzTc5`u943p7fMVz+n$-ed(#4|tKWK`2QxBQ0|3J`7vul{ literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/italic_tw.gif b/includes/tiny_mce/themes/simple/images/italic_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..4f6eeaa2b2111e9995584a66644dacd01ebf33e4 GIT binary patch literal 274 zcmZ?wbhEHb6k!lyI3mCxFE7u}&!3;4KY#xG^XJd|`}?n7zdk-bUSD7T{rmU(_wT=d z|9*dee|>$uy}dmH1H=FS|A8d&K=CIFBLjl~gAPaw$W8{sAA<=#Bx}ZV~!Miqwc5(MoQ;hMLOK*yvJx*8l(jA^8LW000L7 zEC2ui02BZe0009tc)HyFFv>|=F}0bofd8LU3_`XHL13Hq)$A^8LW000jFEC2ui02BZe000D5@X1N5y*TU5@mkK(Nsfb@ zh`52taWqPx3Yb$cP21Nib_4)BqDn)z literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/spacer.gif b/includes/tiny_mce/themes/simple/images/spacer.gif new file mode 100644 index 0000000000000000000000000000000000000000..388486517fa8da13ebd150e8f65d5096c3e10c3a GIT binary patch literal 43 ncmZ?wbhEHbWMp7un7{x9ia%KxMSyG_5FaGNz{KRj$Y2csb)f_x literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/strikethrough.gif b/includes/tiny_mce/themes/simple/images/strikethrough.gif new file mode 100644 index 0000000000000000000000000000000000000000..3264635918e2237257811a745f3a7e31b4369432 GIT binary patch literal 83 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*jFzw-23{>5`RB^ury^=8j) h^eUTr??>*V8C&%_D;C}?e9svC>)iK$`!yICtN}048)X0h literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/underline.gif b/includes/tiny_mce/themes/simple/images/underline.gif new file mode 100644 index 0000000000000000000000000000000000000000..1dfeb5f6d06e21a25615a9eb0cbd2a74ab0efa42 GIT binary patch literal 88 zcmZ?wbhEHb6k!lySjfl#1l85mjEo?b;!hSJ#l)Zk5(UXKFlkQdUwQg1zxWJ?3%{OS koDe;yao*!zU(QKMRZNWnGjv6-o@%}Q>)iK!0SpY*0G3P}*Z=?k literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/underline_fr.gif b/includes/tiny_mce/themes/simple/images/underline_fr.gif new file mode 100644 index 0000000000000000000000000000000000000000..551d9148d302c5f58b3b20d2c6a642450889a7ef GIT binary patch literal 79 zcmZ?wbhEHb6k!lyn83&Y1dNP~ia%L^OhyJB5FaGNz@*mGzw-23e(4zsAr}6}u9vvi dPIT?{=$xyxd19dGtWDy_KKDM~70ke34FHj_7K8u* literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/underline_ru.gif b/includes/tiny_mce/themes/simple/images/underline_ru.gif new file mode 100644 index 0000000000000000000000000000000000000000..b78e2a498fb9406ef378d7c543756db552d87cba GIT binary patch literal 77 zcmZ?wbhEHb6k!lyn83i`>+8$Fz@Ye(g^_`QkwFK@28xR?Ffgg~^shYqmVYseNK2Ny ft@O9qnGc`Wq;$3l?I>E+zBOCw^tWDnRt9STq^=gR literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/underline_tw.gif b/includes/tiny_mce/themes/simple/images/underline_tw.gif new file mode 100644 index 0000000000000000000000000000000000000000..b715390484c95c3d3311012dd541e2b46a2f4a78 GIT binary patch literal 245 zcmZ?wbhEHb6k!lyI3mihYSpUH(9n19-U$i{mY0{GIdf*_%$df<#%XD3=g*&4Qc`;V z{=J%-nvai9ety1-i;KOzeMd*f{{8!R@7~S8!0`Y7e;|nmDE?$&WMB|w&;h9d*~!3K zl%U#|k~uHKi*I6=T}Ytl*F$OTQv9tdV6_n`zCQJ Ua|%tL!OK2l4tMK(4MhfP08!6P_5c6? literal 0 HcmV?d00001 diff --git a/includes/tiny_mce/themes/simple/images/undo.gif b/includes/tiny_mce/themes/simple/images/undo.gif new file mode 100644 index 0000000000000000000000000000000000000000..520796d69defa118055d191eec33cc67f7551710 GIT binary patch literal 175 zcmV;g08sx&Nk%w1VH5xq0K*FaI$fTWtk6Go+_}Zyr?=K#e#T#ZwX4DHa-Hu#XSz{; z-OtzKVv^{Tv+z=g@&Et;A^8LW000jFEC2ui02BZe000DB@X1N5y*TU5^*Z3vJx60U zVAe<_A|#2DUTDd{g#kDRhWrRvKmt&#E(`|)VHiweM~gz>Krlp-Snncu!2ps)!r>e} d2m*##Qg9H=3xcDt9yk');this.defParam("font_size_classes",'');this.defParam("font_size_style_values",'xx-small,x-small,small,medium,large,x-large,xx-large');this.defParam("event_elements",'a,img');this.defParam("convert_urls",true);this.defParam("table_inline_editing",false);this.defParam("object_resizing",true);if(this.isMSIE&&this.settings['browsers'].indexOf('msie')==-1)return;if(this.isGecko&&this.settings['browsers'].indexOf('gecko')==-1)return;if(this.isSafari&&this.settings['browsers'].indexOf('safari')==-1)return;if(this.isOpera&&this.settings['browsers'].indexOf('opera')==-1)return;var baseHREF=tinyMCE.settings['document_base_url'];var h=document.location.href;var p=h.indexOf('://');if(p>0&&document.location.protocol!="file:"){p=h.indexOf('/',p+3);h=h.substring(0,p);if(baseHREF.indexOf('://')==-1)baseHREF=h+baseHREF;tinyMCE.settings['document_base_url']=baseHREF;tinyMCE.settings['document_base_prefix']=h;}if(baseHREF.indexOf('?')!=-1)baseHREF=baseHREF.substring(0,baseHREF.indexOf('?'));this.settings['base_href']=baseHREF.substring(0,baseHREF.lastIndexOf('/'))+"/";theme=this.settings['theme'];this.blockRegExp=new RegExp("^(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|blockquote|center|dl|dir|fieldset|form|noscript|noframes|menu|isindex)$","i");this.posKeyCodes=new Array(13,45,36,35,33,34,37,38,39,40);this.uniqueURL='http://tinymce.moxiecode.cp/mce_temp_url';this.uniqueTag='';this.settings['theme_href']=tinyMCE.baseURL+"/themes/"+theme;if(!tinyMCE.isMSIE)this.settings['force_br_newlines']=false;if(tinyMCE.getParam("content_css",false)){var cssPath=tinyMCE.getParam("content_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['content_css']=this.documentBasePath+"/"+cssPath;else this.settings['content_css']=cssPath;}else this.settings['content_css']='';if(tinyMCE.getParam("popups_css",false)){var cssPath=tinyMCE.getParam("popups_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['popups_css']=this.documentBasePath+"/"+cssPath;else this.settings['popups_css']=cssPath;}else this.settings['popups_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_popup.css";if(tinyMCE.getParam("editor_css",false)){var cssPath=tinyMCE.getParam("editor_css","");if(cssPath.indexOf('://')==-1&&cssPath.charAt(0)!='/')this.settings['editor_css']=this.documentBasePath+"/"+cssPath;else this.settings['editor_css']=cssPath;}else this.settings['editor_css']=tinyMCE.baseURL+"/themes/"+theme+"/css/editor_ui.css";if(tinyMCE.settings['debug']){var msg="Debug: \n";msg+="baseURL: "+this.baseURL+"\n";msg+="documentBasePath: "+this.documentBasePath+"\n";msg+="content_css: "+this.settings['content_css']+"\n";msg+="popups_css: "+this.settings['popups_css']+"\n";msg+="editor_css: "+this.settings['editor_css']+"\n";alert(msg);}this._initCleanup();if(this.configs.length==0){if(this.isSafari&&this.getParam('safari_warning',true))alert("Safari support is very limited and should be considered experimental.\nSo there is no need to even submit bugreports on this early version.\nYou can disable this message by setting: safari_warning option to false");tinyMCE.addEvent(window,"load",TinyMCE.prototype.onLoad);if(tinyMCE.isMSIE){if(tinyMCE.settings['add_unload_trigger']){tinyMCE.addEvent(window,"unload",TinyMCE.prototype.unloadHandler);tinyMCE.addEvent(window.document,"beforeunload",TinyMCE.prototype.unloadHandler);}}else{if(tinyMCE.settings['add_unload_trigger'])tinyMCE.addEvent(window,"unload",function(){tinyMCE.triggerSave(true,true);});}}this.loadScript(tinyMCE.baseURL+'/themes/'+this.settings['theme']+'/editor_template'+tinyMCE.srcMode+'.js');this.loadScript(tinyMCE.baseURL+'/langs/'+this.settings['language']+'.js');this.loadCSS(this.settings['editor_css']);var themePlugins=tinyMCE.getParam('plugins','',true,',');if(this.settings['plugins']!=''){for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.loadCSS=function(url){for(var i=0;i');this.loadedFiles[this.loadedFiles.length]=url;};TinyMCE.prototype.importCSS=function(doc,css_file){if(css_file=='')return;if(typeof(doc.createStyleSheet)=="undefined"){var elm=doc.createElement("link");elm.rel="stylesheet";elm.href=css_file;if((headArr=doc.getElementsByTagName("head"))!=null&&headArr.length>0)headArr[0].appendChild(elm);}else var styleSheet=doc.createStyleSheet(css_file);};TinyMCE.prototype.confirmAdd=function(e,settings){var elm=tinyMCE.isMSIE?event.srcElement:e.target;var elementId=elm.name?elm.name:elm.id;tinyMCE.settings=settings;if(!elm.getAttribute('mce_noask')&&confirm(tinyMCELang['lang_edit_confirm']))tinyMCE.addMCEControl(elm,elementId);elm.setAttribute('mce_noask','true');};TinyMCE.prototype.updateContent=function(form_element_name){var formElement=document.getElementById(form_element_name);for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();if(inst.formElement==formElement){var doc=inst.getDoc();tinyMCE._setHTML(doc,inst.formElement.value);if(!tinyMCE.isMSIE)doc.body.innerHTML=tinyMCE._cleanupHTML(inst,doc,this.settings,doc.body,inst.visualAid);}}};TinyMCE.prototype.addMCEControl=function(replace_element,form_element_name,target_document){var id="mce_editor_"+tinyMCE.idCounter++;var inst=new TinyMCEControl(tinyMCE.settings);inst.editorId=id;this.instances[id]=inst;inst.onAdd(replace_element,form_element_name,target_document);};TinyMCE.prototype.triggerSave=function(skip_cleanup,skip_callback){for(var n in tinyMCE.instances){var inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst))continue;inst.switchSettings();tinyMCE.settings['preformatted']=false;if(typeof(skip_cleanup)=="undefined")skip_cleanup=false;if(typeof(skip_callback)=="undefined")skip_callback=false;tinyMCE._setHTML(inst.getDoc(),inst.getBody().innerHTML);if(inst.settings['cleanup']==false){tinyMCE.handleVisualAid(inst.getBody(),true,false,inst);tinyMCE._setEventsEnabled(inst.getBody(),true);}tinyMCE._customCleanup(inst,"submit_content_dom",inst.contentWindow.document.body);var htm=skip_cleanup?inst.getBody().innerHTML:tinyMCE._cleanupHTML(inst,inst.getDoc(),this.settings,inst.getBody(),this.visualAid,true);htm=tinyMCE._customCleanup(inst,"submit_content",htm);if(tinyMCE.settings["encoding"]=="xml"||tinyMCE.settings["encoding"]=="html")htm=tinyMCE.convertStringToXML(htm);if(!skip_callback&&tinyMCE.settings['save_callback']!="")var content=eval(tinyMCE.settings['save_callback']+"(inst.formTargetElementId,htm,inst.getBody());");if((typeof(content)!="undefined")&&content!=null)htm=content;htm=tinyMCE.regexpReplace(htm,"(","(","gi");htm=tinyMCE.regexpReplace(htm,")",")","gi");htm=tinyMCE.regexpReplace(htm,";",";","gi");htm=tinyMCE.regexpReplace(htm,""",""","gi");htm=tinyMCE.regexpReplace(htm,"^","^","gi");if(inst.formElement)inst.formElement.value=htm;}};TinyMCE.prototype._setEventsEnabled=function(node,state){var events=new Array('onfocus','onblur','onclick','ondblclick','onmousedown','onmouseup','onmouseover','onmousemove','onmouseout','onkeypress','onkeydown','onkeydown','onkeyup');var evs=tinyMCE.settings['event_elements'].split(',');for(var y=0;y","gi");content=tinyMCE.regexpReplace(content,"\r","
","gi");content=tinyMCE.regexpReplace(content,"\n","
","gi");}content=tinyMCE.storeAwayURLs(content);content=tinyMCE._customCleanup(inst,"insert_to_editor",content);if(tinyMCE.isMSIE){window.setInterval('try{tinyMCE.getCSSClasses(document.frames["'+editor_id+'"].document, "'+editor_id+'");}catch(e){}',500);if(tinyMCE.settings["force_br_newlines"])document.frames[editor_id].document.styleSheets[0].addRule("p","margin: 0px;");var body=document.frames[editor_id].document.body;tinyMCE.addEvent(body,"beforepaste",TinyMCE.prototype.eventPatch);tinyMCE.addEvent(body,"beforecut",TinyMCE.prototype.eventPatch);body.editorId=editor_id;}content=tinyMCE.cleanupHTMLCode(content);if(!tinyMCE.isMSIE){var contentElement=inst.getDoc().createElement("body");var doc=inst.getDoc();contentElement.innerHTML=content;if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt'])content=content.replace(new RegExp('<>','g'),"");if(tinyMCE.settings['cleanup_on_startup'])tinyMCE.setInnerHTML(inst.getBody(),tinyMCE._cleanupHTML(inst,doc,this.settings,contentElement));else{content=tinyMCE.regexpReplace(content,"","","gi");content=tinyMCE.regexpReplace(content,"","
","gi");content=tinyMCE.regexpReplace(content,"","","gi");tinyMCE.setInnerHTML(inst.getBody(),content);}inst.convertAllRelativeURLs();}else{if(tinyMCE.settings['cleanup_on_startup']){tinyMCE._setHTML(inst.getDoc(),content);eval('try {tinyMCE.setInnerHTML(inst.getBody(), tinyMCE._cleanupHTML(inst, inst.contentDocument, this.settings, inst.getBody()));} catch(e) {}');}else tinyMCE._setHTML(inst.getDoc(),content);}var parentElm=document.getElementById(inst.editorId+'_parent');if(parentElm.lastChild.nodeName=="INPUT")inst.formElement=tinyMCE.isGecko?parentElm.firstChild:parentElm.lastChild;else inst.formElement=tinyMCE.isGecko?parentElm.previousSibling:parentElm.nextSibling;tinyMCE.handleVisualAid(inst.getBody(),true,tinyMCE.settings['visual'],inst);tinyMCE.executeCallback('setupcontent_callback','_setupContent',0,editor_id,inst.getBody(),inst.getDoc());if(!tinyMCE.isMSIE)TinyMCE.prototype.addEventHandlers(editor_id);if(tinyMCE.isMSIE)tinyMCE.addEvent(inst.getBody(),"blur",TinyMCE.prototype.eventPatch);tinyMCE.selectedInstance=inst;tinyMCE.selectedElement=inst.contentWindow.document.body;if(!inst.isHidden())tinyMCE.triggerNodeChange(false,true);tinyMCE._customCleanup(inst,"insert_to_editor_dom",inst.getBody());tinyMCE._customCleanup(inst,"setup_content_dom",inst.getBody());tinyMCE._setEventsEnabled(inst.getBody(),false);tinyMCE.cleanupAnchors(inst.getDoc());if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(inst.getDoc());inst.startContent=tinyMCE.trim(inst.getBody().innerHTML);inst.undoLevels[inst.undoLevels.length]=inst.startContent;tinyMCE.operaOpacityCounter=-1;};TinyMCE.prototype.cleanupHTMLCode=function(s){s=s.replace(//gi,'

 

');s=s.replace(/

\s*<\/p>/gi,'

 

');s=s.replace(/<(h[1-6]|p|div|address|pre|form|table|li|ol|ul|td|b|em|strong|i|strike|u|span|a|ul|ol|li|blockquote)([a-z]*)([^\\|>]*?)\/>/gi,'<$1$2$3>');s=s.replace(new RegExp('\\s+><\/(img|br|hr)>/gi,'<$1$2 />');if(tinyMCE.isMSIE)s=s.replace(/

<\/p>/gi,"


");s=s.replace(new RegExp('(href=\"?)(\\s*?#)','gi'),'$1'+tinyMCE.settings['document_base_url']+"#");return s;};TinyMCE.prototype.storeAwayURLs=function(s){s=s.replace(new RegExp('mce_src\\s*=\\s*\"[^ >\"]*\"','gi'),'');s=s.replace(new RegExp('mce_href\\s*=\\s*\"[^ >\"]*\"','gi'),'');s=s.replace(new RegExp('src\\s*=\\s*\"([^ >\"]*)\"','gi'),'src="$1" mce_src="$1"');s=s.replace(new RegExp('href\\s*=\\s*\"([^ >\"]*)\"','gi'),'href="$1" mce_href="$1"');return s;};TinyMCE.prototype.cancelEvent=function(e){if(tinyMCE.isMSIE){e.returnValue=false;e.cancelBubble=true;}else e.preventDefault();};TinyMCE.prototype.removeTinyMCEFormElements=function(form_obj){if(typeof(form_obj)=="undefined"||form_obj==null)return;if(form_obj.nodeName!="FORM"){if(form_obj.form)form_obj=form_obj.form;else form_obj=tinyMCE.getParentElement(form_obj,"form");}if(form_obj==null)return;for(var i=0;i");rng.collapse(false);rng.select();tinyMCE.execCommand("mceAddUndoLevel");tinyMCE.triggerNodeChange(false);return false;}}if(e.keyCode==8||e.keyCode==46){tinyMCE.selectedElement=e.target;tinyMCE.linkElement=tinyMCE.getParentElement(e.target,"a");tinyMCE.imgElement=tinyMCE.getParentElement(e.target,"img");tinyMCE.triggerNodeChange(false);}return false;break;case "keyup":case "keydown":if(e.target.editorId)tinyMCE.selectedInstance=tinyMCE.instances[e.target.editorId];else return;if(tinyMCE.selectedInstance)tinyMCE.selectedInstance.switchSettings();var inst=tinyMCE.selectedInstance;if(tinyMCE.isGecko&&tinyMCE.settings['force_p_newlines']&&(e.keyCode==8||e.keyCode==46)&&!e.shiftKey){if(tinyMCE.selectedInstance._handleBackSpace(e.type)){tinyMCE.execCommand("mceAddUndoLevel");e.preventDefault();return false;}}tinyMCE.selectedElement=null;tinyMCE.selectedNode=null;var elm=tinyMCE.selectedInstance.getFocusElement();tinyMCE.linkElement=tinyMCE.getParentElement(elm,"a");tinyMCE.imgElement=tinyMCE.getParentElement(elm,"img");tinyMCE.selectedElement=elm;if(tinyMCE.isGecko&&e.type=="keyup"&&e.keyCode==9)tinyMCE.handleVisualAid(tinyMCE.selectedInstance.getBody(),true,tinyMCE.settings['visual'],tinyMCE.selectedInstance);if(tinyMCE.isMSIE&&e.type=="keydown"&&e.keyCode==13)tinyMCE.enterKeyElement=tinyMCE.selectedInstance.getFocusElement();if(tinyMCE.isMSIE&&e.type=="keyup"&&e.keyCode==13){var elm=tinyMCE.enterKeyElement;if(elm){var re=new RegExp('^HR|IMG|BR$','g');var dre=new RegExp('^H[1-6]$','g');if(!elm.hasChildNodes()&&!re.test(elm.nodeName)){if(dre.test(elm.nodeName))elm.innerHTML="  ";else elm.innerHTML=" ";}}}var keys=tinyMCE.posKeyCodes;var posKey=false;for(var i=0;i-1)suffix='?rnd='+this.operaOpacityCounter++;element.src=tinyMCE.baseURL+"/themes/"+tinyMCE.getParam("theme")+"/images/opacity.png"+suffix;element.style.backgroundImage="url('"+element.mceOldSrc+"')";}else{if(element.mceOldSrc){element.src=element.mceOldSrc;element.parentNode.style.backgroundImage="";element.mceOldSrc=null;}}}}};TinyMCE.prototype.restoreClass=function(element){if(element!=null&&element.oldClassName&&!element.classLock){element.className=element.oldClassName;element.oldClassName=null;}};TinyMCE.prototype.setClassLock=function(element,lock_state){if(element!=null)element.classLock=lock_state;};TinyMCE.prototype.addEvent=function(obj,name,handler){if(tinyMCE.isMSIE){obj.attachEvent("on"+name,handler);}else obj.addEventListener(name,handler,false);};TinyMCE.prototype.submitPatch=function(){tinyMCE.removeTinyMCEFormElements(this);tinyMCE.triggerSave();this.mceOldSubmit();tinyMCE.isNotDirty=true;};TinyMCE.prototype.onLoad=function(){for(var c=0;c0)return;if(val.indexOf('%')==-1)val+='px';break;case "vspace":case "hspace":elm.style.marginTop=val+"px";elm.style.marginBottom=val+"px";elm.removeAttribute(attrib);return;case "align":if(elm.nodeName=="IMG"){if(tinyMCE.isMSIE)elm.style.styleFloat=val;else elm.style.cssFloat=val;}else elm.style.textAlign=val;elm.removeAttribute(attrib);return;}if(val!=''){eval('elm.style.'+style+' = val;');elm.removeAttribute(attrib);}}}else{if(style=='')return;var val=eval('elm.style.'+style)==''?tinyMCE.getAttrib(elm,attrib):eval('elm.style.'+style);val=val==null?'':''+val;switch(attrib){case "background":if(val.indexOf('url')==-1&&val!='')val="url('"+val+"');";if(val!=''){elm.style.backgroundImage=val;elm.removeAttribute(attrib);}return;case "border":case "width":case "height":val=val.replace('px','');break;case "align":if(tinyMCE.getAttrib(elm,'align')==''){if(elm.nodeName=="IMG"){if(tinyMCE.isMSIE&&elm.style.styleFloat!=''){val=elm.style.styleFloat;style='styleFloat';}else if(tinyMCE.isGecko&&elm.style.cssFloat!=''){val=elm.style.cssFloat;style='cssFloat';}}}break;}if(val!=''){elm.removeAttribute(attrib);elm.setAttribute(attrib,val);eval('elm.style.'+style+' = "";');}}};TinyMCE.prototype._cleanupAttribute=function(valid_attributes,element_name,attribute_node,element_node){var attribName=attribute_node.nodeName.toLowerCase();var attribValue=attribute_node.nodeValue;var attribMustBeValue=null;var verified=false;if(attribName.indexOf('moz_')!=-1)return null;if(!tinyMCE.cleanup_on_save&&(attribName=="mce_href"||attribName=="mce_src"))return{name:attribName,value:attribValue};if(tinyMCE.cleanup_verify_html&&!verified){for(var i=1;i1)val="url('"+eval(tinyMCE.getParam('urlconverter_callback')+"(m[1], null, true);")+"')";}if(tinyMCE.getParam("force_hex_style_colors"))val=tinyMCE.convertRGBToHex(val,true);if(val!="url('')")str+=key.toLowerCase()+": "+val+"; ";}}if(new RegExp('; $').test(str))str=str.substring(0,str.length-2);return str;};TinyMCE.prototype.convertRGBToHex=function(s,k){if(s.toLowerCase().indexOf('rgb')!=-1){var re=new RegExp("(.*?)rgb\\s*?\\(\\s*?([0-9]+).*?,\\s*?([0-9]+).*?,\\s*?([0-9]+).*?\\)(.*?)","gi");var rgb=s.replace(re,"$1,$2,$3,$4,$5").split(',');if(rgb.length==5){r=parseInt(rgb[1]).toString(16);g=parseInt(rgb[2]).toString(16);b=parseInt(rgb[3]).toString(16);r=r.length==1?'0'+r:r;g=g.length==1?'0'+g:g;b=b.length==1?'0'+b:b;s="#"+r+g+b;if(k)s=rgb[0]+s+rgb[4];}}return s;};TinyMCE.prototype.convertHexToRGB=function(s){if(s.indexOf('#')!=-1){s=s.replace(new RegExp('[^0-9A-F]','gi'),'');return "rgb("+parseInt(s.substring(0,2),16)+","+parseInt(s.substring(2,4),16)+","+parseInt(s.substring(4,6),16)+")";}return s;};TinyMCE.prototype._verifyClass=function(node){if(tinyMCE.isGecko){var className=node.getAttribute('class');if(!className)return false;}if(tinyMCE.isMSIE)var className=node.getAttribute('className');if(tinyMCE.cleanup_verify_css_classes&&tinyMCE.cleanup_on_save){var csses=tinyMCE.getCSSClasses();nonDefinedCSS=true;for(var c=0;c'+output;}}var re=new RegExp("^(TABLE|TD|TR)$");if(re.test(node.nodeName)){if((node.nodeName!="TABLE"||tinyMCE.cleanup_inline_styles)&&(width=tinyMCE.getAttrib(node,"width"))!=''){node.style.width=width.indexOf('%')!=-1?width:width.replace(/[^0-9]/gi,'')+"px";node.removeAttribute("width");}if((node.nodeName=="TABLE"&&!tinyMCE.cleanup_inline_styles)&&node.style.width!=''){tinyMCE.setAttrib(node,"width",node.style.width.replace('px',''));node.style.width='';}if((height=tinyMCE.getAttrib(node,"height"))!=''){height=""+height;node.style.height=height.indexOf('%')!=-1?height:height.replace(/[^0-9]/gi,'')+"px";node.removeAttribute("height");}}if(tinyMCE.cleanup_inline_styles){var re=new RegExp("^(TABLE|TD|TR|IMG|HR)$");if(re.test(node.nodeName)&&tinyMCE.getAttrib(node,"class").indexOf('mceItem')==-1){tinyMCE._moveStyle(node,'width','width');tinyMCE._moveStyle(node,'height','height');tinyMCE._moveStyle(node,'borderWidth','border');tinyMCE._moveStyle(node,'','vspace');tinyMCE._moveStyle(node,'','hspace');tinyMCE._moveStyle(node,'textAlign','align');tinyMCE._moveStyle(node,'backgroundColor','bgColor');tinyMCE._moveStyle(node,'borderColor','borderColor');tinyMCE._moveStyle(node,'backgroundImage','background');if(tinyMCE.isMSIE5)node.outerHTML=node.outerHTML;}else if(tinyMCE.isBlockElement(node))tinyMCE._moveStyle(node,'textAlign','align');if(node.nodeName=="FONT")tinyMCE._moveStyle(node,'color','color');}if(elementValidAttribs){for(var a=1;a"+node.innerHTML+"";if(elementName=="table"&&!node.hasChildNodes())return "";if(node.attributes.length>0){var lastAttrib="";for(var i=0;i"+this.convertStringToXML(String.fromCharCode(160))+"";if(tinyMCE.isMSIE&&elementName=="script")return "<"+elementName+elementAttribs+">"+node.text+"";if(node.hasChildNodes()){if(!(elementName=="span"&&elementAttribs==""&&tinyMCE.getParam("trim_span_elements"))){if(elementName=="p"&&tinyMCE.cleanup_force_br_newlines)output+="";else output+="<"+elementName+elementAttribs+">";}for(var i=0;i
";else output+="";}}else{if(!nonEmptyTag){if(openTag)output+="<"+elementName+elementAttribs+">";else output+="<"+elementName+elementAttribs+" />";}}return output;case 3:if(node.parentNode.nodeName=="SCRIPT"||node.parentNode.nodeName=="NOSCRIPT"||node.parentNode.nodeName=="STYLE")return node.nodeValue;return this.convertStringToXML(node.nodeValue);case 8:return "";default:return "[UNKNOWN NODETYPE "+node.nodeType+"]";}};TinyMCE.prototype.convertStringToXML=function(html_data){var output="";for(var i=0;i127)output+='&#'+chr+";";else output+=String.fromCharCode(chr);continue;}if(tinyMCE.settings['entity_encoding']=="raw"){output+=String.fromCharCode(chr);continue;}if(typeof(tinyMCE.settings['cleanup_entities']["c"+chr])!='undefined'&&tinyMCE.settings['cleanup_entities']["c"+chr]!='')output+='&'+tinyMCE.settings['cleanup_entities']["c"+chr]+';';else output+=''+String.fromCharCode(chr);}return output;};TinyMCE.prototype._getCleanupElementName=function(chunk){var pos;if(chunk.charAt(0)=='+')chunk=chunk.substring(1);if(chunk.charAt(0)=='-')chunk=chunk.substring(1);if((pos=chunk.indexOf('/'))!=-1)chunk=chunk.substring(0,pos);if((pos=chunk.indexOf('['))!=-1)chunk=chunk.substring(0,pos);return chunk;};TinyMCE.prototype._initCleanup=function(){var validElements=tinyMCE.settings["valid_elements"];validElements=validElements.split(',');var extendedValidElements=tinyMCE.settings["extended_valid_elements"];extendedValidElements=extendedValidElements.split(',');for(var i=0;i/gi,'>');return html;}if(on_save&&tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertFontsToSpans(doc);tinyMCE._customCleanup(inst,on_save?"get_from_editor_dom":"insert_to_editor_dom",doc.body);var n=doc.getElementsByTagName("font");for(var i=0;i[ \n\r]*[ \n\r]*

','
','gi'));tinyMCE.setInnerHTML(element,tinyMCE.regexpReplace(element.innerHTML,'','','gi'));}var html=this.cleanupNode(element);if(tinyMCE.settings['debug'])tinyMCE.debug("Cleanup process executed in: "+(new Date().getTime()-startTime)+" ms.");html=tinyMCE.regexpReplace(html,'


','
');html=tinyMCE.regexpReplace(html,'

 


 

','
');html=tinyMCE.regexpReplace(html,'\\s*
\\s*',' ');html=tinyMCE.regexpReplace(html,'

\\s*
\\s*

','

 

');html=tinyMCE.regexpReplace(html,'

\\s* \\s*
\\s* \\s*

','

 

');html=tinyMCE.regexpReplace(html,'

\\s* \\s*
\\s*

','

 

');html=tinyMCE.regexpReplace(html,'

\\s*
\\s* \\s*

','

 

');html=html.replace(new RegExp('(.*?)','gi'),'$1');if(!tinyMCE.isMSIE)html=html.replace(new RegExp('','g'),"");if(tinyMCE.settings['remove_linebreaks'])html=html.replace(new RegExp('\r|\n','g'),' ');if(tinyMCE.getParam('apply_source_formatting')){html=html.replace(new RegExp('<(p|div)([^>]*)>','g'),"\n<$1$2>\n");html=html.replace(new RegExp('<\/(p|div)([^>]*)>','g'),"\n\n");html=html.replace(new RegExp('
','g'),"
\n");}if(tinyMCE.settings['force_br_newlines']){var re=new RegExp('

 

','g');html=html.replace(re,"
");}if(tinyMCE.isGecko&&tinyMCE.settings['remove_lt_gt']){var re=new RegExp('<>','g');html=html.replace(re,"");}html=tinyMCE._customCleanup(inst,on_save?"get_from_editor":"insert_to_editor",html);var chk=tinyMCE.regexpReplace(html,"[ \t\r\n]","").toLowerCase();if(chk=="
"||chk=="
"||chk=="

 

"||chk=="

 

"||chk=="

")html="";if(tinyMCE.settings["preformatted"])return "
"+html+"
";return html;};TinyMCE.prototype.insertLink=function(href,target,title,onclick,style_class){tinyMCE.execCommand('mceBeginUndoLevel');if(this.selectedInstance&&this.selectedElement&&this.selectedElement.nodeName.toLowerCase()=="img"){var doc=this.selectedInstance.getDoc();var linkElement=tinyMCE.getParentElement(this.selectedElement,"a");var newLink=false;if(!linkElement){linkElement=doc.createElement("a");newLink=true;}var mhref=href;var thref=eval(tinyMCE.settings['urlconverter_callback']+"(href, linkElement);");mhref=tinyMCE.getParam('convert_urls')?href:mhref;tinyMCE.setAttrib(linkElement,'href',thref);tinyMCE.setAttrib(linkElement,'mce_href',mhref);tinyMCE.setAttrib(linkElement,'target',target);tinyMCE.setAttrib(linkElement,'title',title);tinyMCE.setAttrib(linkElement,'onclick',onclick);tinyMCE.setAttrib(linkElement,'class',style_class);if(newLink){linkElement.appendChild(this.selectedElement.cloneNode(true));this.selectedElement.parentNode.replaceChild(linkElement,this.selectedElement);}return;}if(!this.linkElement&&this.selectedInstance){if(tinyMCE.isSafari){tinyMCE.execCommand("mceInsertContent",false,''+this.selectedInstance.getSelectedHTML()+'');}else this.selectedInstance.contentDocument.execCommand("createlink",false,tinyMCE.uniqueURL);tinyMCE.linkElement=this.getElementByAttributeValue(this.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);var elementArray=this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body,"a","href",tinyMCE.uniqueURL);for(var i=0;i';tinyMCE.execCommand("mceInsertContent",false,html);}else{if(!this.imgElement&&this.selectedInstance){if(tinyMCE.isSafari)tinyMCE.execCommand("mceInsertContent",false,'');else this.selectedInstance.contentDocument.execCommand("insertimage",false,tinyMCE.uniqueURL);tinyMCE.imgElement=this.getElementByAttributeValue(this.selectedInstance.contentDocument.body,"img","src",tinyMCE.uniqueURL);}}if(this.imgElement){var needsRepaint=false;var msrc=src;src=eval(tinyMCE.settings['urlconverter_callback']+"(src, tinyMCE.imgElement);");if(tinyMCE.getParam('convert_urls'))msrc=src;if(onmouseover&&onmouseover!="")onmouseover="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseover, tinyMCE.imgElement);")+"';";if(onmouseout&&onmouseout!="")onmouseout="this.src='"+eval(tinyMCE.settings['urlconverter_callback']+"(onmouseout, tinyMCE.imgElement);")+"';";if(typeof(title)=="undefined")title=alt;if(width!=this.imgElement.getAttribute("width")||height!=this.imgElement.getAttribute("height")||align!=this.imgElement.getAttribute("align"))needsRepaint=true;tinyMCE.setAttrib(this.imgElement,'src',src);tinyMCE.setAttrib(this.imgElement,'mce_src',msrc);tinyMCE.setAttrib(this.imgElement,'alt',alt);tinyMCE.setAttrib(this.imgElement,'title',title);tinyMCE.setAttrib(this.imgElement,'align',align);tinyMCE.setAttrib(this.imgElement,'border',border,true);tinyMCE.setAttrib(this.imgElement,'hspace',hspace,true);tinyMCE.setAttrib(this.imgElement,'vspace',vspace,true);tinyMCE.setAttrib(this.imgElement,'width',width,true);tinyMCE.setAttrib(this.imgElement,'height',height,true);tinyMCE.setAttrib(this.imgElement,'onmouseover',onmouseover);tinyMCE.setAttrib(this.imgElement,'onmouseout',onmouseout);if(width&&width!="")this.imgElement.style.pixelWidth=width;if(height&&height!="")this.imgElement.style.pixelHeight=height;if(needsRepaint)tinyMCE.selectedInstance.repaint();}tinyMCE.execCommand('mceEndUndoLevel');};TinyMCE.prototype.getElementByAttributeValue=function(node,element_name,attrib,value){var elements=this.getElementsByAttributeValue(node,element_name,attrib,value);if(elements.length==0)return null;return elements[0];};TinyMCE.prototype.getElementsByAttributeValue=function(node,element_name,attrib,value){var elements=new Array();if(node&&node.nodeName.toLowerCase()==element_name){if(node.getAttribute(attrib)&&node.getAttribute(attrib).indexOf(value)!=-1)elements[elements.length]=node;}if(node&&node.hasChildNodes()){for(var x=0,n=node.childNodes.length;x=strTok2.length){for(var i=0;i=strTok2.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(strTok1.length=strTok1.length||strTok1[i]!=strTok2[i]){breakPoint=i+1;break;}}}if(breakPoint==1)return targetURL.path;for(var i=0;i<(strTok1.length-(breakPoint-1));i++)outPath+="../";for(var i=breakPoint-1;i=0;i--){if(baseURLParts[i].length==0)continue;newBaseURLParts[newBaseURLParts.length]=baseURLParts[i];}baseURLParts=newBaseURLParts.reverse();var newRelURLParts=new Array();var numBack=0;for(var i=relURLParts.length-1;i>=0;i--){if(relURLParts[i].length==0||relURLParts[i]==".")continue;if(relURLParts[i]=='..'){numBack++;continue;}if(numBack>0){numBack--;continue;}newRelURLParts[newRelURLParts.length]=relURLParts[i];}relURLParts=newRelURLParts.reverse();var len=baseURLParts.length-numBack;var absPath=(len<=0?"":"/")+baseURLParts.slice(0,len).join('/')+"/"+relURLParts.join('/');var start="",end="";relURL.protocol=baseURL.protocol;relURL.host=baseURL.host;relURL.port=baseURL.port;if(relURL.path.charAt(relURL.path.length-1)=="/")absPath+="/";relURL.path=absPath;return TinyMCE.prototype.serializeURL(relURL);};TinyMCE.prototype.getParam=function(name,default_value,strip_whitespace,split_chr){var value=(typeof(this.settings[name])=="undefined")?default_value:this.settings[name];if(value=="true"||value=="false")return(value=="true");if(strip_whitespace)value=tinyMCE.regexpReplace(value,"[ \t\r\n]","");if(typeof(split_chr)!="undefined"&&split_chr!=null){value=value.split(split_chr);var outArray=new Array();for(var i=0;i0);if(tinyMCE.settings['custom_undo_redo']){undoIndex=inst.undoIndex;undoLevels=inst.undoLevels.length;}tinyMCE.executeCallback('handleNodeChangeCallback','_handleNodeChange',0,editorId,elm,undoIndex,undoLevels,inst.visualAid,anySelection,setup_content);}}if(this.selectedInstance&&(typeof(focus)=="undefined"||focus))this.selectedInstance.contentWindow.focus();};TinyMCE.prototype._customCleanup=function(inst,type,content){var customCleanup=tinyMCE.settings['cleanup_callback'];if(customCleanup!=""&&eval("typeof("+customCleanup+")")!="undefined")content=eval(customCleanup+"(type, content, inst);");var plugins=tinyMCE.getParam('plugins','',true,',');for(var i=0;i0)className+=" ";className+=classNames[i];}return className;};TinyMCE.prototype.handleVisualAid=function(el,deep,state,inst){if(!el)return;var tableElement=null;switch(el.nodeName){case "TABLE":var oldW=el.style.width;var oldH=el.style.height;var bo=tinyMCE.getAttrib(el,"border");bo=bo==""||bo=="0"?true:false;tinyMCE.setAttrib(el,"class",tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el,"class"),state&&bo));el.style.width=oldW;el.style.height=oldH;for(var y=0;y0){tinyMCE.setAttrib(s[i],'size',fSize);s[i].style.fontSize='';}var fFace=s[i].style.fontFamily;if(fFace!=null&&fFace!=""){tinyMCE.setAttrib(s[i],'face',fFace);s[i].style.fontFamily='';}var fColor=s[i].style.color;if(fColor!=null&&fColor!=""){tinyMCE.setAttrib(s[i],'color',tinyMCE.convertRGBToHex(fColor));s[i].style.color='';}}};TinyMCE.prototype.convertFontsToSpans=function(doc){var sizes=tinyMCE.getParam('font_size_style_values').replace(/\s+/,'').split(',');var h=doc.body.innerHTML;h=h.replace(/0&&fSize<8){if(fsClasses!=null)tinyMCE.setAttrib(s[i],'class',fsClasses[fSize-1]);else s[i].style.fontSize=sizes[fSize-1];}s[i].removeAttribute('size');}if(fFace!=""){s[i].style.fontFamily=fFace;s[i].removeAttribute('face');}if(fColor!=""){s[i].style.color=fColor;s[i].removeAttribute('color');}}};TinyMCE.prototype.setInnerHTML=function(e,h){if(tinyMCE.isMSIE&&!tinyMCE.isOpera){e.innerHTML=tinyMCE.uniqueTag+h;e.firstChild.removeNode(true);}else{h=this.fixGeckoBaseHREFBug(1,e,h);e.innerHTML=h;this.fixGeckoBaseHREFBug(2,e,h);}};TinyMCE.prototype.fixGeckoBaseHREFBug=function(m,e,h){if(tinyMCE.isGecko){if(m==1){h=h.replace(/\ssrc=/gi," xsrc=");h=h.replace(/\shref=/gi," xhref=");return h;}else{if(h.indexOf(' xsrc')!=-1){var n=e.getElementsByTagName("img");for(var i=0;i=0;x--)tinyMCE.insertAfter(cn[x],an[i]);}}};TinyMCE.prototype._setHTML=function(doc,html_content){html_content=tinyMCE.cleanupHTMLCode(html_content);try{tinyMCE.setInnerHTML(doc.body,html_content);}catch(e){if(this.isMSIE)doc.body.createTextRange().pasteHTML(html_content);}if(tinyMCE.isMSIE&&tinyMCE.settings['fix_content_duplication']){var paras=doc.getElementsByTagName("P");for(var i=0;i<\/o:p>","
");html=tinyMCE.regexpReplace(html," <\/o:p>","");html=tinyMCE.regexpReplace(html,"","");html=tinyMCE.regexpReplace(html,"

<\/p>","");html=tinyMCE.regexpReplace(html,"

<\/p>\r\n

<\/p>","");html=tinyMCE.regexpReplace(html,"

 <\/p>","
");html=tinyMCE.regexpReplace(html,"

\s*(

\s*)?","

");html=tinyMCE.regexpReplace(html,"<\/p>\s*(<\/p>\s*)?","

");}tinyMCE.setInnerHTML(doc.body,html);}tinyMCE.cleanupAnchors(doc);if(tinyMCE.getParam("convert_fonts_to_spans"))tinyMCE.convertSpansToFonts(doc);};TinyMCE.prototype.getImageSrc=function(str){var pos=-1;if(!str)return "";if((pos=str.indexOf('this.src='))!=-1){var src=str.substring(pos+10);src=src.substring(0,src.indexOf('\''));return src;}return "";};TinyMCE.prototype._getElementById=function(element_id){var elm=document.getElementById(element_id);if(!elm){for(var j=0;j0){for(var x=0;x0)tinyMCE.cssClasses=output;return output;};TinyMCE.prototype.regexpReplace=function(in_str,reg_exp,replace_str,opts){if(in_str==null)return in_str;if(typeof(opts)=="undefined")opts='g';var re=new RegExp(reg_exp,opts);return in_str.replace(re,replace_str);};TinyMCE.prototype.trim=function(str){return str.replace(/^\s*|\s*$/g,"");};TinyMCE.prototype.cleanupEventStr=function(str){str=""+str;str=str.replace('function anonymous()\n{\n','');str=str.replace('\n}','');str=str.replace(/^return true;/gi,'');return str;};TinyMCE.prototype.getAbsPosition=function(node){var pos=new Object();pos.absLeft=pos.absTop=0;var parentNode=node;while(parentNode){pos.absLeft+=parentNode.offsetLeft;pos.absTop+=parentNode.offsetTop;parentNode=parentNode.offsetParent;}return pos;};TinyMCE.prototype.getControlHTML=function(control_name){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_getControlHTML";if(eval("typeof("+templateFunction+")")!='undefined'){var html=eval(templateFunction+"('"+control_name+"');");if(html!="")return tinyMCE.replaceVar(html,"pluginurl",tinyMCE.baseURL+"/plugins/"+themePlugins[i]);}}return eval('TinyMCE_'+tinyMCE.settings['theme']+"_getControlHTML"+"('"+control_name+"');");};TinyMCE.prototype._themeExecCommand=function(editor_id,element,command,user_interface,value){var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined'){if(eval(templateFunction+"(editor_id, element, command, user_interface, value);"))return true;}}templateFunction='TinyMCE_'+tinyMCE.settings['theme']+"_execCommand";if(eval("typeof("+templateFunction+")")!='undefined')return eval(templateFunction+"(editor_id, element, command, user_interface, value);");return false;};TinyMCE.prototype._getThemeFunction=function(suffix,skip_plugins){if(skip_plugins)return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;var themePlugins=tinyMCE.getParam('plugins','',true,',');var templateFunction;for(var i=themePlugins.length;i>=0;i--){templateFunction='TinyMCE_'+themePlugins[i]+suffix;if(eval("typeof("+templateFunction+")")!='undefined')return templateFunction;}return 'TinyMCE_'+tinyMCE.settings['theme']+suffix;};TinyMCE.prototype.isFunc=function(func_name){if(func_name==null||func_name=="")return false;return eval("typeof("+func_name+")")!="undefined";};TinyMCE.prototype.exec=function(func_name,args){var str=func_name+'(';for(var i=3;i';document.body.appendChild(debugDiv);elm=document.getElementById("tinymce_debug");}var args=this.debug.arguments;for(var i=0;i1&&tinyMCE.currentConfig!=this.settings['index']){tinyMCE.settings=this.settings;tinyMCE.currentConfig=this.settings['index'];}};TinyMCEControl.prototype.convertAllRelativeURLs=function(){var body=this.getBody();var elms=body.getElementsByTagName("img");for(var i=0;i0)rng.selectNodeContents(nodes[0]);else rng.selectNodeContents(node);}else rng.selectNode(node);if(collapse){if(!to_start&&node.nodeType==3){rng.setStart(node,node.nodeValue.length);rng.setEnd(node,node.nodeValue.length);}else rng.collapse(to_start);}sel.removeAllRanges();sel.addRange(rng);}this.scrollToNode(node);tinyMCE.selectedElement=null;if(node.nodeType==1)tinyMCE.selectedElement=node;};TinyMCEControl.prototype.scrollToNode=function(node){var pos=tinyMCE.getAbsPosition(node);var doc=this.getDoc();var scrollX=doc.body.scrollLeft+doc.documentElement.scrollLeft;var scrollY=doc.body.scrollTop+doc.documentElement.scrollTop;var height=tinyMCE.isMSIE?document.getElementById(this.editorId).style.pixelHeight:this.targetElement.clientHeight;if(!tinyMCE.settings['auto_resize']&&!(pos.absTop>scrollY&&pos.absTop<(scrollY-25+height)))this.contentWindow.scrollTo(pos.absLeft,pos.absTop-height+25);};TinyMCEControl.prototype.getBody=function(){return this.getDoc().body;};TinyMCEControl.prototype.getDoc=function(){return this.contentWindow.document;};TinyMCEControl.prototype.getWin=function(){return this.contentWindow;};TinyMCEControl.prototype.getSel=function(){if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return this.getDoc().selection;var sel=this.contentWindow.getSelection();if(tinyMCE.isSafari&&!sel.getRangeAt){var newSel=new Object();var doc=this.getDoc();function getRangeAt(idx){var rng=new Object();rng.startContainer=this.focusNode;rng.endContainer=this.anchorNode;rng.commonAncestorContainer=this.focusNode;rng.createContextualFragment=function(html){if(html.charAt(0)=='<'){var elm=doc.createElement("div");elm.innerHTML=html;return elm.firstChild;}return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!");};rng.deleteContents=function(){doc.execCommand("Delete",false,"");};return rng;}newSel.focusNode=sel.baseNode;newSel.focusOffset=sel.baseOffset;newSel.anchorNode=sel.extentNode;newSel.anchorOffset=sel.extentOffset;newSel.getRangeAt=getRangeAt;newSel.text=""+sel;newSel.realSelection=sel;newSel.toString=function(){return this.text;};return newSel;}return sel;};TinyMCEControl.prototype.getRng=function(){var sel=this.getSel();if(sel==null)return null;if(tinyMCE.isMSIE&&!tinyMCE.isOpera)return sel.createRange();if(tinyMCE.isSafari){var rng=this.getDoc().createRange();var sel=this.getSel().realSelection;rng.setStart(sel.baseNode,sel.baseOffset);rng.setEnd(sel.extentNode,sel.extentOffset);return rng;}return this.getSel().getRangeAt(0);};TinyMCEControl.prototype._insertPara=function(e){function isEmpty(para){function isEmptyHTML(html){return html.replace(new RegExp('[ \t\r\n]+','g'),'').toLowerCase()=="";}if(para.getElementsByTagName("img").length>0)return false;if(para.getElementsByTagName("table").length>0)return false;if(para.getElementsByTagName("hr").length>0)return false;var nodes=tinyMCE.getNodeTree(para,new Array(),3);for(var i=0;i <"+blockName+"> ";paraAfter=body.childNodes[1];}this.selectNode(paraAfter,true,true);return true;}if(startChop.nodeName==blockName)rngBefore.setStart(startChop,0);else rngBefore.setStartBefore(startChop);rngBefore.setEnd(startNode,startOffset);paraBefore.appendChild(rngBefore.cloneContents());rngAfter.setEndAfter(endChop);rngAfter.setStart(endNode,endOffset);var contents=rngAfter.cloneContents();if(contents.firstChild&&contents.firstChild.nodeName==blockName){paraAfter.innerHTML=contents.firstChild.innerHTML;}else paraAfter.appendChild(contents);if(isEmpty(paraBefore))paraBefore.innerHTML=" ";if(isEmpty(paraAfter))paraAfter.innerHTML=" ";var rng=doc.createRange();if(!startChop.previousSibling&&startChop.parentNode.nodeName.toUpperCase()==blockName){rng.setStartBefore(startChop.parentNode);}else{if(rngBefore.startContainer.nodeName.toUpperCase()==blockName&&rngBefore.startOffset==0)rng.setStartBefore(rngBefore.startContainer);else rng.setStart(rngBefore.startContainer,rngBefore.startOffset);}if(!endChop.nextSibling&&endChop.parentNode.nodeName.toUpperCase()==blockName)rng.setEndAfter(endChop.parentNode);else rng.setEnd(rngAfter.endContainer,rngAfter.endOffset);rng.deleteContents();rng.insertNode(paraAfter);rng.insertNode(paraBefore);paraAfter.normalize();paraBefore.normalize();this.selectNode(paraAfter,true,true);return true;};TinyMCEControl.prototype._handleBackSpace=function(evt_type){var doc=this.getDoc();var sel=this.getSel();if(sel==null)return false;var rng=sel.getRangeAt(0);var node=rng.startContainer;var elm=node.nodeType==3?node.parentNode:node;if(node==null)return;if(elm&&elm.nodeName==""){var para=doc.createElement("p");while(elm.firstChild)para.appendChild(elm.firstChild);elm.parentNode.insertBefore(para,elm);elm.parentNode.removeChild(elm);var rng=rng.cloneRange();rng.setStartBefore(node.nextSibling);rng.setEndAfter(node.nextSibling);rng.extractContents();this.selectNode(node.nextSibling,true,true);}var para=tinyMCE.getParentBlockElement(node);if(para!=null&¶.nodeName.toLowerCase()=='p'&&evt_type=="keypress"){var htm=para.innerHTML;var block=tinyMCE.getParentBlockElement(node);if(htm==""||htm==" "||block.nodeName.toLowerCase()=="li"){var prevElm=para.previousSibling;while(prevElm!=null&&prevElm.nodeType!=1)prevElm=prevElm.previousSibling;if(prevElm==null)return false;var nodes=tinyMCE.getNodeTree(prevElm,new Array(),3);var lastTextNode=nodes.length==0?null:nodes[nodes.length-1];if(lastTextNode!=null)this.selectNode(lastTextNode,true,false,false);para.parentNode.removeChild(para);return true;}}return false;};TinyMCEControl.prototype._insertSpace=function(){return true;};TinyMCEControl.prototype.autoResetDesignMode=function(){if(!tinyMCE.isMSIE&&tinyMCE.settings['auto_reset_designmode']&&this.isHidden())eval('try { this.getDoc().designMode = "On"; } catch(e) {}');};TinyMCEControl.prototype.isHidden=function(){if(tinyMCE.isMSIE)return false;var sel=this.getSel();return(!sel||!sel.rangeCount||sel.rangeCount==0);};TinyMCEControl.prototype.isDirty=function(){return this.startContent!=tinyMCE.trim(this.getBody().innerHTML)&&!tinyMCE.isNotDirty;};TinyMCEControl.prototype._mergeElements=function(scmd,pa,ch,override){if(scmd=="removeformat"){pa.className="";pa.style.cssText="";ch.className="";ch.style.cssText="";return;}var st=tinyMCE.parseStyle(tinyMCE.getAttrib(pa,"style"));var stc=tinyMCE.parseStyle(tinyMCE.getAttrib(ch,"style"));var className=tinyMCE.getAttrib(pa,"class");className+=" "+tinyMCE.getAttrib(ch,"class");if(override){for(var n in st){if(typeof(st[n])=='function')continue;stc[n]=st[n];}}else{for(var n in stc){if(typeof(stc[n])=='function')continue;st[n]=stc[n];}}tinyMCE.setAttrib(pa,"style",tinyMCE.serializeStyle(st));tinyMCE.setAttrib(pa,"class",tinyMCE.trim(className));ch.className="";ch.style.cssText="";ch.removeAttribute("class");ch.removeAttribute("style");};TinyMCEControl.prototype.setUseCSS=function(b){var doc=this.getDoc();try{doc.execCommand("useCSS",false,!b);}catch(ex){}try{doc.execCommand("styleWithCSS",false,b);}catch(ex){}if(!tinyMCE.getParam("table_inline_editing"))try{doc.execCommand('enableInlineTableEditing',false,"false");}catch(ex){}if(!tinyMCE.getParam("object_resizing"))try{doc.execCommand('enableObjectResizing',false,"false");}catch(ex){}};TinyMCEControl.prototype.execCommand=function(command,user_interface,value){var doc=this.getDoc();var win=this.getWin();var focusElm=this.getFocusElement();if(this.lastSafariSelection&&!new RegExp('mceStartTyping|mceEndTyping|mceBeginUndoLevel|mceEndUndoLevel|mceAddUndoLevel','gi').test(command)){this.moveToBookmark(this.lastSafariSelection);tinyMCE.selectedElement=this.lastSafariSelectedElement;}if(!tinyMCE.isMSIE&&!this.useCSS){this.setUseCSS(false);this.useCSS=true;}this.contentDocument=doc;if(tinyMCE._themeExecCommand(this.editorId,this.getBody(),command,user_interface,value))return;if(focusElm&&focusElm.nodeName=="IMG"){var align=focusElm.getAttribute('align');var img=command=="JustifyCenter"?focusElm.cloneNode(false):focusElm;switch(command){case "JustifyLeft":if(align=='left')img.removeAttribute('align');else img.setAttribute('align','left');var div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case "JustifyCenter":img.removeAttribute('align');var div=tinyMCE.getParentElement(focusElm,"div");if(div&&div.style.textAlign=="center"){if(div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);}else{var div=this.getDoc().createElement("div");div.style.textAlign='center';div.appendChild(img);focusElm.parentNode.replaceChild(div,focusElm);}this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;case "JustifyRight":if(align=='right')img.removeAttribute('align');else img.setAttribute('align','right');var div=focusElm.parentNode;if(div&&div.nodeName=="DIV"&&div.childNodes.length==1&&div.parentNode)div.parentNode.replaceChild(img,div);this.selectNode(img);this.repaint();tinyMCE.triggerNodeChange();return;}}if(tinyMCE.settings['force_br_newlines']){var alignValue="";if(doc.selection.type!="Control"){switch(command){case "JustifyLeft":alignValue="left";break;case "JustifyCenter":alignValue="center";break;case "JustifyFull":alignValue="justify";break;case "JustifyRight":alignValue="right";break;}if(alignValue!=""){var rng=doc.selection.createRange();if((divElm=tinyMCE.getParentElement(rng.parentElement(),"div"))!=null)divElm.setAttribute("align",alignValue);else if(rng.pasteHTML&&rng.htmlText.length>0)rng.pasteHTML('
'+rng.htmlText+"
");tinyMCE.triggerNodeChange();return;}}}switch(command){case "mceRepaint":this.repaint();return true;case "mceStoreSelection":this.selectionBookmark=this.getBookmark();return true;case "mceRestoreSelection":this.moveToBookmark(this.selectionBookmark);return true;case "InsertUnorderedList":case "InsertOrderedList":var tag=(command=="InsertUnorderedList")?"ul":"ol";if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,"<"+tag+">
  •  
  • <"+tag+">");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case "Strikethrough":if(tinyMCE.isSafari)this.execCommand("mceInsertContent",false,""+this.getSelectedHTML()+"");else this.getDoc().execCommand(command,user_interface,value);tinyMCE.triggerNodeChange();break;case "mceSelectNode":this.selectNode(value);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=value;break;case "FormatBlock":if(value==null||value==""){var elm=tinyMCE.getParentElement(this.getFocusElement(),"p,div,h1,h2,h3,h4,h5,h6,pre,address");if(elm)this.execCommand("mceRemoveNode",false,elm);}else this.getDoc().execCommand("FormatBlock",false,value);tinyMCE.triggerNodeChange();break;case "mceRemoveNode":if(!value)value=tinyMCE.getParentElement(this.getFocusElement());if(tinyMCE.isMSIE){value.outerHTML=value.innerHTML;}else{var rng=value.ownerDocument.createRange();rng.setStartBefore(value);rng.setEndAfter(value);rng.deleteContents();rng.insertNode(rng.createContextualFragment(value.innerHTML));}tinyMCE.triggerNodeChange();break;case "mceSelectNodeDepth":var parentNode=this.getFocusElement();for(var i=0;parentNode;i++){if(parentNode.nodeName.toLowerCase()=="body")break;if(parentNode.nodeName.toLowerCase()=="#text"){i--;parentNode=parentNode.parentNode;continue;}if(i==value){this.selectNode(parentNode,false);tinyMCE.triggerNodeChange();tinyMCE.selectedNode=parentNode;return;}parentNode=parentNode.parentNode;}break;case "SetStyleInfo":var rng=this.getRng();var sel=this.getSel();var scmd=value['command'];var sname=value['name'];var svalue=value['value']==null?'':value['value'];var wrapper=value['wrapper']?value['wrapper']:"span";var parentElm=null;var invalidRe=new RegExp("^BODY|HTML$","g");var invalidParentsRe=tinyMCE.settings['merge_styles_invalid_parents']!=''?new RegExp(tinyMCE.settings['merge_styles_invalid_parents'],"gi"):null;if(tinyMCE.isMSIE){if(rng.item)parentElm=rng.item(0);else{var pelm=rng.parentElement();var prng=doc.selection.createRange();prng.moveToElementText(pelm);if(rng.htmlText==prng.htmlText||rng.boundingWidth==0){if(invalidParentsRe==null||!invalidParentsRe.test(pelm.nodeName))parentElm=pelm;}}}else{var felm=this.getFocusElement();if(sel.isCollapsed||(/td|tr|tbody|table/ig.test(felm.nodeName)&&sel.anchorNode==felm.parentNode))parentElm=felm;}if(parentElm&&!invalidRe.test(parentElm.nodeName)){if(scmd=="setstyle")tinyMCE.setStyleAttrib(parentElm,sname,svalue);if(scmd=="setattrib")tinyMCE.setAttrib(parentElm,sname,svalue);if(scmd=="removeformat"){parentElm.style.cssText='';tinyMCE.setAttrib(parentElm,'class','');}var ch=tinyMCE.getNodeTree(parentElm,new Array(),1);for(var z=0;z=0;i--){var elm=nodes[i];var isNew=tinyMCE.getAttrib(elm,"mce_new")=="true";elm.removeAttribute("mce_new");if(elm.childNodes&&elm.childNodes.length==1&&elm.childNodes[0].nodeType==1){this._mergeElements(scmd,elm,elm.childNodes[0],isNew);continue;}if(elm.parentNode.childNodes.length==1&&!invalidRe.test(elm.nodeName)&&!invalidRe.test(elm.parentNode.nodeName)){if(invalidParentsRe==null||!invalidParentsRe.test(elm.parentNode.nodeName))this._mergeElements(scmd,elm.parentNode,elm,false);}}var nodes=doc.getElementsByTagName(wrapper);for(var i=nodes.length-1;i>=0;i--){var elm=nodes[i];var isEmpty=true;var tmp=doc.createElement("body");tmp.appendChild(elm.cloneNode(false));tmp.innerHTML=tmp.innerHTML.replace(new RegExp('style=""|class=""','gi'),'');if(new RegExp('','gi').test(tmp.innerHTML)){for(var x=0;x0){value=tinyMCE.replaceVar(value,"selection",selectedText);tinyMCE.execCommand('mceInsertContent',false,value);}tinyMCE.triggerNodeChange();break;case "mceSetAttribute":if(typeof(value)=='object'){var targetElms=(typeof(value['targets'])=="undefined")?"p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address":value['targets'];var targetNode=tinyMCE.getParentElement(this.getFocusElement(),targetElms);if(targetNode){targetNode.setAttribute(value['name'],value['value']);tinyMCE.triggerNodeChange();}}break;case "mceSetCSSClass":this.execCommand("SetStyleInfo",false,{command:"setattrib",name:"class",value:value});break;case "mceInsertRawHTML":var key='tiny_mce_marker';this.execCommand('mceBeginUndoLevel');this.execCommand('mceInsertContent',false,key);var scrollX=this.getDoc().body.scrollLeft+this.getDoc().documentElement.scrollLeft;var scrollY=this.getDoc().body.scrollTop+this.getDoc().documentElement.scrollTop;var html=this.getBody().innerHTML;if((pos=html.indexOf(key))!=-1)tinyMCE.setInnerHTML(this.getBody(),html.substring(0,pos)+value+html.substring(pos+key.length));this.contentWindow.scrollTo(scrollX,scrollY);this.execCommand('mceEndUndoLevel');break;case "mceInsertContent":var insertHTMLFailed=false;this.getWin().focus();if(tinyMCE.isGecko||tinyMCE.isOpera){try{if(value.indexOf('<')==-1){var r=this.getRng();var n=this.getDoc().createTextNode(tinyMCE.entityDecode(value));var s=this.getSel();var r2=r.cloneRange();s.removeAllRanges();r.deleteContents();r.insertNode(n);r2.selectNode(n);r2.collapse(false);s.removeAllRanges();s.addRange(r2);}else{value=tinyMCE.fixGeckoBaseHREFBug(1,this.getDoc(),value);this.getDoc().execCommand('inserthtml',false,value);tinyMCE.fixGeckoBaseHREFBug(2,this.getDoc(),value);}}catch(ex){insertHTMLFailed=true;}if(!insertHTMLFailed){tinyMCE.triggerNodeChange();return;}}if(tinyMCE.isOpera&&insertHTMLFailed){this.getDoc().execCommand("insertimage",false,tinyMCE.uniqueURL);var ar=tinyMCE.getElementsByAttributeValue(this.getBody(),"img","src",tinyMCE.uniqueURL);ar[0].outerHTML=value;return;}if(!tinyMCE.isMSIE){var isHTML=value.indexOf('<')!=-1;var sel=this.getSel();var rng=this.getRng();if(isHTML){if(tinyMCE.isSafari){var tmpRng=this.getDoc().createRange();tmpRng.setStart(this.getBody(),0);tmpRng.setEnd(this.getBody(),0);value=tmpRng.createContextualFragment(value);}else value=rng.createContextualFragment(value);}else{var el=document.createElement("div");el.innerHTML=value;value=el.firstChild.nodeValue;value=doc.createTextNode(value);}if(tinyMCE.isSafari&&!isHTML){this.execCommand('InsertText',false,value.nodeValue);tinyMCE.triggerNodeChange();return true;}else if(tinyMCE.isSafari&&isHTML){rng.deleteContents();rng.insertNode(value);tinyMCE.triggerNodeChange();return true;}rng.deleteContents();if(rng.startContainer.nodeType==3){var node=rng.startContainer.splitText(rng.startOffset);node.parentNode.insertBefore(value,node);}else rng.insertNode(value);if(!isHTML){sel.selectAllChildren(doc.body);sel.removeAllRanges();var rng=doc.createRange();rng.selectNode(value);rng.collapse(false);sel.addRange(rng);}else rng.collapse(false);}else{var rng=doc.selection.createRange();var c=value.indexOf('"; + + default: // Unknown + return "[UNKNOWN NODETYPE " + node.nodeType + "]"; + } +}; + +TinyMCE.prototype.convertStringToXML = function(html_data) { + var output = ""; + + for (var i=0; i 127) + output += '&#' + chr + ";"; + else + output += String.fromCharCode(chr); + + continue; + } + + // Raw entities + if (tinyMCE.settings['entity_encoding'] == "raw") { + output += String.fromCharCode(chr); + continue; + } + + // Named entities + if (typeof(tinyMCE.settings['cleanup_entities']["c" + chr]) != 'undefined' && tinyMCE.settings['cleanup_entities']["c" + chr] != '') + output += '&' + tinyMCE.settings['cleanup_entities']["c" + chr] + ';'; + else + output += '' + String.fromCharCode(chr); + } + + return output; +}; + +TinyMCE.prototype._getCleanupElementName = function(chunk) { + var pos; + + if (chunk.charAt(0) == '+') + chunk = chunk.substring(1); + + if (chunk.charAt(0) == '-') + chunk = chunk.substring(1); + + if ((pos = chunk.indexOf('/')) != -1) + chunk = chunk.substring(0, pos); + + if ((pos = chunk.indexOf('[')) != -1) + chunk = chunk.substring(0, pos); + + return chunk; +}; + +TinyMCE.prototype._initCleanup = function() { + // Parse valid elements and attributes + var validElements = tinyMCE.settings["valid_elements"]; + validElements = validElements.split(','); + + // Handle extended valid elements + var extendedValidElements = tinyMCE.settings["extended_valid_elements"]; + extendedValidElements = extendedValidElements.split(','); + for (var i=0; i/gi, '>'); + + return html; + } + + if (on_save && tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertFontsToSpans(doc); + + // Call custom cleanup code + tinyMCE._customCleanup(inst, on_save ? "get_from_editor_dom" : "insert_to_editor_dom", doc.body); + + // Move bgcolor to style + var n = doc.getElementsByTagName("font"); + for (var i=0; i[ \n\r]*[ \n\r]*

    ', '
    ', 'gi')); + tinyMCE.setInnerHTML(element, tinyMCE.regexpReplace(element.innerHTML, '', '', 'gi')); + } + + var html = this.cleanupNode(element); + + if (tinyMCE.settings['debug']) + tinyMCE.debug("Cleanup process executed in: " + (new Date().getTime()-startTime) + " ms."); + + // Remove pesky HR paragraphs and other crap + html = tinyMCE.regexpReplace(html, '


    ', '
    '); + html = tinyMCE.regexpReplace(html, '

     


     

    ', '
    '); + html = tinyMCE.regexpReplace(html, '\\s*
    \\s*', ' '); + html = tinyMCE.regexpReplace(html, '

    \\s*
    \\s*

    ', '

     

    '); + html = tinyMCE.regexpReplace(html, '

    \\s* \\s*
    \\s* \\s*

    ', '

     

    '); + html = tinyMCE.regexpReplace(html, '

    \\s* \\s*
    \\s*

    ', '

     

    '); + html = tinyMCE.regexpReplace(html, '

    \\s*
    \\s* \\s*

    ', '

     

    '); + + // Remove empty anchors + html = html.replace(new RegExp('(.*?)', 'gi'), '$1'); + + // Remove some mozilla crap + if (!tinyMCE.isMSIE) + html = html.replace(new RegExp('', 'g'), ""); + + if (tinyMCE.settings['remove_linebreaks']) + html = html.replace(new RegExp('\r|\n', 'g'), ' '); + + if (tinyMCE.getParam('apply_source_formatting')) { + html = html.replace(new RegExp('<(p|div)([^>]*)>', 'g'), "\n<$1$2>\n"); + html = html.replace(new RegExp('<\/(p|div)([^>]*)>', 'g'), "\n\n"); + html = html.replace(new RegExp('
    ', 'g'), "
    \n"); + } + + if (tinyMCE.settings['force_br_newlines']) { + var re = new RegExp('

     

    ', 'g'); + html = html.replace(re, "
    "); + } + + if (tinyMCE.isGecko && tinyMCE.settings['remove_lt_gt']) { + // Remove weridness! + var re = new RegExp('<>', 'g'); + html = html.replace(re, ""); + } + + // Call custom cleanup code + html = tinyMCE._customCleanup(inst, on_save ? "get_from_editor" : "insert_to_editor", html); + + // Emtpy node, return empty + var chk = tinyMCE.regexpReplace(html, "[ \t\r\n]", "").toLowerCase(); + if (chk == "
    " || chk == "
    " || chk == "

     

    " || chk == "

     

    " || chk == "

    ") + html = ""; + + if (tinyMCE.settings["preformatted"]) + return "
    " + html + "
    "; + + return html; +}; + +TinyMCE.prototype.insertLink = function(href, target, title, onclick, style_class) { + tinyMCE.execCommand('mceBeginUndoLevel'); + + if (this.selectedInstance && this.selectedElement && this.selectedElement.nodeName.toLowerCase() == "img") { + var doc = this.selectedInstance.getDoc(); + var linkElement = tinyMCE.getParentElement(this.selectedElement, "a"); + var newLink = false; + + if (!linkElement) { + linkElement = doc.createElement("a"); + newLink = true; + } + + var mhref = href; + var thref = eval(tinyMCE.settings['urlconverter_callback'] + "(href, linkElement);"); + mhref = tinyMCE.getParam('convert_urls') ? href : mhref; + + tinyMCE.setAttrib(linkElement, 'href', thref); + tinyMCE.setAttrib(linkElement, 'mce_href', mhref); + tinyMCE.setAttrib(linkElement, 'target', target); + tinyMCE.setAttrib(linkElement, 'title', title); + tinyMCE.setAttrib(linkElement, 'onclick', onclick); + tinyMCE.setAttrib(linkElement, 'class', style_class); + + if (newLink) { + linkElement.appendChild(this.selectedElement.cloneNode(true)); + this.selectedElement.parentNode.replaceChild(linkElement, this.selectedElement); + } + + return; + } + + if (!this.linkElement && this.selectedInstance) { + if (tinyMCE.isSafari) { + tinyMCE.execCommand("mceInsertContent", false, '' + this.selectedInstance.getSelectedHTML() + ''); + } else + this.selectedInstance.contentDocument.execCommand("createlink", false, tinyMCE.uniqueURL); + + tinyMCE.linkElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + var elementArray = this.getElementsByAttributeValue(this.selectedInstance.contentDocument.body, "a", "href", tinyMCE.uniqueURL); + + for (var i=0; i'; + + tinyMCE.execCommand("mceInsertContent", false, html); + } else { + if (!this.imgElement && this.selectedInstance) { + if (tinyMCE.isSafari) + tinyMCE.execCommand("mceInsertContent", false, ''); + else + this.selectedInstance.contentDocument.execCommand("insertimage", false, tinyMCE.uniqueURL); + + tinyMCE.imgElement = this.getElementByAttributeValue(this.selectedInstance.contentDocument.body, "img", "src", tinyMCE.uniqueURL); + } + } + + if (this.imgElement) { + var needsRepaint = false; + var msrc = src; + + src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, tinyMCE.imgElement);"); + + if (tinyMCE.getParam('convert_urls')) + msrc = src; + + if (onmouseover && onmouseover != "") + onmouseover = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseover, tinyMCE.imgElement);") + "';"; + + if (onmouseout && onmouseout != "") + onmouseout = "this.src='" + eval(tinyMCE.settings['urlconverter_callback'] + "(onmouseout, tinyMCE.imgElement);") + "';"; + + // Use alt as title if it's undefined + if (typeof(title) == "undefined") + title = alt; + + if (width != this.imgElement.getAttribute("width") || height != this.imgElement.getAttribute("height") || align != this.imgElement.getAttribute("align")) + needsRepaint = true; + + tinyMCE.setAttrib(this.imgElement, 'src', src); + tinyMCE.setAttrib(this.imgElement, 'mce_src', msrc); + tinyMCE.setAttrib(this.imgElement, 'alt', alt); + tinyMCE.setAttrib(this.imgElement, 'title', title); + tinyMCE.setAttrib(this.imgElement, 'align', align); + tinyMCE.setAttrib(this.imgElement, 'border', border, true); + tinyMCE.setAttrib(this.imgElement, 'hspace', hspace, true); + tinyMCE.setAttrib(this.imgElement, 'vspace', vspace, true); + tinyMCE.setAttrib(this.imgElement, 'width', width, true); + tinyMCE.setAttrib(this.imgElement, 'height', height, true); + tinyMCE.setAttrib(this.imgElement, 'onmouseover', onmouseover); + tinyMCE.setAttrib(this.imgElement, 'onmouseout', onmouseout); + + // Fix for bug #989846 - Image resize bug + if (width && width != "") + this.imgElement.style.pixelWidth = width; + + if (height && height != "") + this.imgElement.style.pixelHeight = height; + + if (needsRepaint) + tinyMCE.selectedInstance.repaint(); + } + + tinyMCE.execCommand('mceEndUndoLevel'); +}; + +TinyMCE.prototype.getElementByAttributeValue = function(node, element_name, attrib, value) { + var elements = this.getElementsByAttributeValue(node, element_name, attrib, value); + if (elements.length == 0) + return null; + + return elements[0]; +}; + +TinyMCE.prototype.getElementsByAttributeValue = function(node, element_name, attrib, value) { + var elements = new Array(); + + if (node && node.nodeName.toLowerCase() == element_name) { + if (node.getAttribute(attrib) && node.getAttribute(attrib).indexOf(value) != -1) + elements[elements.length] = node; + } + + if (node && node.hasChildNodes()) { + for (var x=0, n=node.childNodes.length; x= strTok2.length) { + for (var i=0; i= strTok2.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (strTok1.length < strTok2.length) { + for (var i=0; i= strTok1.length || strTok1[i] != strTok2[i]) { + breakPoint = i + 1; + break; + } + } + } + + if (breakPoint == 1) + return targetURL.path; + + for (var i=0; i<(strTok1.length-(breakPoint-1)); i++) + outPath += "../"; + + for (var i=breakPoint-1; i=0; i--) { + if (baseURLParts[i].length == 0) + continue; + + newBaseURLParts[newBaseURLParts.length] = baseURLParts[i]; + } + baseURLParts = newBaseURLParts.reverse(); + + // Merge relURLParts chunks + var newRelURLParts = new Array(); + var numBack = 0; + for (var i=relURLParts.length-1; i>=0; i--) { + if (relURLParts[i].length == 0 || relURLParts[i] == ".") + continue; + + if (relURLParts[i] == '..') { + numBack++; + continue; + } + + if (numBack > 0) { + numBack--; + continue; + } + + newRelURLParts[newRelURLParts.length] = relURLParts[i]; + } + + relURLParts = newRelURLParts.reverse(); + + // Remove end from absolute path + var len = baseURLParts.length-numBack; + var absPath = (len <= 0 ? "" : "/") + baseURLParts.slice(0, len).join('/') + "/" + relURLParts.join('/'); + var start = "", end = ""; + + // Build output URL + relURL.protocol = baseURL.protocol; + relURL.host = baseURL.host; + relURL.port = baseURL.port; + + // Re-add trailing slash if it's removed + if (relURL.path.charAt(relURL.path.length-1) == "/") + absPath += "/"; + + relURL.path = absPath; + + return TinyMCE.prototype.serializeURL(relURL); +}; + +TinyMCE.prototype.getParam = function(name, default_value, strip_whitespace, split_chr) { + var value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; + + // Fix bool values + if (value == "true" || value == "false") + return (value == "true"); + + if (strip_whitespace) + value = tinyMCE.regexpReplace(value, "[ \t\r\n]", ""); + + if (typeof(split_chr) != "undefined" && split_chr != null) { + value = value.split(split_chr); + var outArray = new Array(); + + for (var i=0; i 0); + + if (tinyMCE.settings['custom_undo_redo']) { + undoIndex = inst.undoIndex; + undoLevels = inst.undoLevels.length; + } + + tinyMCE.executeCallback('handleNodeChangeCallback', '_handleNodeChange', 0, editorId, elm, undoIndex, undoLevels, inst.visualAid, anySelection, setup_content); + } + } + + if (this.selectedInstance && (typeof(focus) == "undefined" || focus)) + this.selectedInstance.contentWindow.focus(); +}; + +TinyMCE.prototype._customCleanup = function(inst, type, content) { + // Call custom cleanup + var customCleanup = tinyMCE.settings['cleanup_callback']; + if (customCleanup != "" && eval("typeof(" + customCleanup + ")") != "undefined") + content = eval(customCleanup + "(type, content, inst);"); + + // Trigger plugin cleanups + var plugins = tinyMCE.getParam('plugins', '', true, ','); + for (var i=0; i 0) + className += " "; + + className += classNames[i]; + } + + return className; +}; + +TinyMCE.prototype.handleVisualAid = function(el, deep, state, inst) { + if (!el) + return; + + var tableElement = null; + + switch (el.nodeName) { + case "TABLE": + var oldW = el.style.width; + var oldH = el.style.height; + var bo = tinyMCE.getAttrib(el, "border"); + + bo = bo == "" || bo == "0" ? true : false; + + tinyMCE.setAttrib(el, "class", tinyMCE.getVisualAidClass(tinyMCE.getAttrib(el, "class"), state && bo)); + + el.style.width = oldW; + el.style.height = oldH; + + for (var y=0; y 0) { + tinyMCE.setAttrib(s[i], 'size', fSize); + s[i].style.fontSize = ''; + } + + var fFace = s[i].style.fontFamily; + if (fFace != null && fFace != "") { + tinyMCE.setAttrib(s[i], 'face', fFace); + s[i].style.fontFamily = ''; + } + + var fColor = s[i].style.color; + if (fColor != null && fColor != "") { + tinyMCE.setAttrib(s[i], 'color', tinyMCE.convertRGBToHex(fColor)); + s[i].style.color = ''; + } + } +}; + +TinyMCE.prototype.convertFontsToSpans = function(doc) { + var sizes = tinyMCE.getParam('font_size_style_values').replace(/\s+/, '').split(','); + + var h = doc.body.innerHTML; + h = h.replace(/ 0 && fSize < 8) { + if (fsClasses != null) + tinyMCE.setAttrib(s[i], 'class', fsClasses[fSize-1]); + else + s[i].style.fontSize = sizes[fSize-1]; + } + + s[i].removeAttribute('size'); + } + + if (fFace != "") { + s[i].style.fontFamily = fFace; + s[i].removeAttribute('face'); + } + + if (fColor != "") { + s[i].style.color = fColor; + s[i].removeAttribute('color'); + } + } +}; + +/* +TinyMCE.prototype.applyClassesToFonts = function(doc, size) { + var f = doc.getElementsByTagName("font"); + for (var i=0; i=0; x--) + tinyMCE.insertAfter(cn[x], an[i]); + } + } +}; + +TinyMCE.prototype._setHTML = function(doc, html_content) { + // Force closed anchors open + //html_content = html_content.replace(new RegExp('', 'gi'), ''); + + html_content = tinyMCE.cleanupHTMLCode(html_content); + + // Try innerHTML if it fails use pasteHTML in MSIE + try { + tinyMCE.setInnerHTML(doc.body, html_content); + } catch (e) { + if (this.isMSIE) + doc.body.createTextRange().pasteHTML(html_content); + } + + // Content duplication bug fix + if (tinyMCE.isMSIE && tinyMCE.settings['fix_content_duplication']) { + // Remove P elements in P elements + var paras = doc.getElementsByTagName("P"); + for (var i=0; i<\/o:p>", "
    "); + html = tinyMCE.regexpReplace(html, " <\/o:p>", ""); + html = tinyMCE.regexpReplace(html, "", ""); + html = tinyMCE.regexpReplace(html, "

    <\/p>", ""); + html = tinyMCE.regexpReplace(html, "

    <\/p>\r\n

    <\/p>", ""); + html = tinyMCE.regexpReplace(html, "

     <\/p>", "
    "); + html = tinyMCE.regexpReplace(html, "

    \s*(

    \s*)?", "

    "); + html = tinyMCE.regexpReplace(html, "<\/p>\s*(<\/p>\s*)?", "

    "); + } + + // Always set the htmlText output + tinyMCE.setInnerHTML(doc.body, html); + } + + tinyMCE.cleanupAnchors(doc); + + if (tinyMCE.getParam("convert_fonts_to_spans")) + tinyMCE.convertSpansToFonts(doc); +}; + +TinyMCE.prototype.getImageSrc = function(str) { + var pos = -1; + + if (!str) + return ""; + + if ((pos = str.indexOf('this.src=')) != -1) { + var src = str.substring(pos + 10); + + src = src.substring(0, src.indexOf('\'')); + + return src; + } + + return ""; +}; + +TinyMCE.prototype._getElementById = function(element_id) { + var elm = document.getElementById(element_id); + if (!elm) { + // Check for element in forms + for (var j=0; j 0) { + for (var x=0; x 0) + tinyMCE.cssClasses = output; + + return output; +}; + +TinyMCE.prototype.regexpReplace = function(in_str, reg_exp, replace_str, opts) { + if (in_str == null) + return in_str; + + if (typeof(opts) == "undefined") + opts = 'g'; + + var re = new RegExp(reg_exp, opts); + return in_str.replace(re, replace_str); +}; + +TinyMCE.prototype.trim = function(str) { + return str.replace(/^\s*|\s*$/g, ""); +}; + +TinyMCE.prototype.cleanupEventStr = function(str) { + str = "" + str; + str = str.replace('function anonymous()\n{\n', ''); + str = str.replace('\n}', ''); + str = str.replace(/^return true;/gi, ''); // Remove event blocker + + return str; +}; + +TinyMCE.prototype.getAbsPosition = function(node) { + var pos = new Object(); + + pos.absLeft = pos.absTop = 0; + + var parentNode = node; + while (parentNode) { + pos.absLeft += parentNode.offsetLeft; + pos.absTop += parentNode.offsetTop; + + parentNode = parentNode.offsetParent; + } + + return pos; +}; + +TinyMCE.prototype.getControlHTML = function(control_name) { + var themePlugins = tinyMCE.getParam('plugins', '', true, ','); + var templateFunction; + + // Is it defined in any plugins + for (var i=themePlugins.length; i>=0; i--) { + templateFunction = 'TinyMCE_' + themePlugins[i] + "_getControlHTML"; + if (eval("typeof(" + templateFunction + ")") != 'undefined') { + var html = eval(templateFunction + "('" + control_name + "');"); + if (html != "") + return tinyMCE.replaceVar(html, "pluginurl", tinyMCE.baseURL + "/plugins/" + themePlugins[i]); + } + } + + return eval('TinyMCE_' + tinyMCE.settings['theme'] + "_getControlHTML" + "('" + control_name + "');"); +}; + +TinyMCE.prototype._themeExecCommand = function(editor_id, element, command, user_interface, value) { + var themePlugins = tinyMCE.getParam('plugins', '', true, ','); + var templateFunction; + + // Is it defined in any plugins + for (var i=themePlugins.length; i>=0; i--) { + templateFunction = 'TinyMCE_' + themePlugins[i] + "_execCommand"; + if (eval("typeof(" + templateFunction + ")") != 'undefined') { + if (eval(templateFunction + "(editor_id, element, command, user_interface, value);")) + return true; + } + } + + // Theme funtion + templateFunction = 'TinyMCE_' + tinyMCE.settings['theme'] + "_execCommand"; + if (eval("typeof(" + templateFunction + ")") != 'undefined') + return eval(templateFunction + "(editor_id, element, command, user_interface, value);"); + + // Pass to normal + return false; +}; + +TinyMCE.prototype._getThemeFunction = function(suffix, skip_plugins) { + if (skip_plugins) + return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix; + + var themePlugins = tinyMCE.getParam('plugins', '', true, ','); + var templateFunction; + + // Is it defined in any plugins + for (var i=themePlugins.length; i>=0; i--) { + templateFunction = 'TinyMCE_' + themePlugins[i] + suffix; + if (eval("typeof(" + templateFunction + ")") != 'undefined') + return templateFunction; + } + + return 'TinyMCE_' + tinyMCE.settings['theme'] + suffix; +}; + + +TinyMCE.prototype.isFunc = function(func_name) { + if (func_name == null || func_name == "") + return false; + + return eval("typeof(" + func_name + ")") != "undefined"; +}; + +TinyMCE.prototype.exec = function(func_name, args) { + var str = func_name + '('; + + // Add all arguments + for (var i=3; i 1 && tinyMCE.currentConfig != this.settings['index']) { + tinyMCE.settings = this.settings; + tinyMCE.currentConfig = this.settings['index']; + } +}; + +TinyMCEControl.prototype.convertAllRelativeURLs = function() { + var body = this.getBody(); + + // Convert all image URL:s to absolute URL + var elms = body.getElementsByTagName("img"); + for (var i=0; i 0) + rng.selectNodeContents(nodes[0]); + else + rng.selectNodeContents(node); + } else + rng.selectNode(node); + + if (collapse) { + // Special treatment of textnode collapse + if (!to_start && node.nodeType == 3) { + rng.setStart(node, node.nodeValue.length); + rng.setEnd(node, node.nodeValue.length); + } else + rng.collapse(to_start); + } + + sel.removeAllRanges(); + sel.addRange(rng); + } + + this.scrollToNode(node); + + // Set selected element + tinyMCE.selectedElement = null; + if (node.nodeType == 1) + tinyMCE.selectedElement = node; +}; + +TinyMCEControl.prototype.scrollToNode = function(node) { + // Scroll to node position + var pos = tinyMCE.getAbsPosition(node); + var doc = this.getDoc(); + var scrollX = doc.body.scrollLeft + doc.documentElement.scrollLeft; + var scrollY = doc.body.scrollTop + doc.documentElement.scrollTop; + var height = tinyMCE.isMSIE ? document.getElementById(this.editorId).style.pixelHeight : this.targetElement.clientHeight; + + // Only scroll if out of visible area + if (!tinyMCE.settings['auto_resize'] && !(pos.absTop > scrollY && pos.absTop < (scrollY - 25 + height))) + this.contentWindow.scrollTo(pos.absLeft, pos.absTop - height + 25); +}; + +TinyMCEControl.prototype.getBody = function() { + return this.getDoc().body; +}; + +TinyMCEControl.prototype.getDoc = function() { + return this.contentWindow.document; +}; + +TinyMCEControl.prototype.getWin = function() { + return this.contentWindow; +}; + +TinyMCEControl.prototype.getSel = function() { + if (tinyMCE.isMSIE && !tinyMCE.isOpera) + return this.getDoc().selection; + + var sel = this.contentWindow.getSelection(); + + // Fake getRangeAt + if (tinyMCE.isSafari && !sel.getRangeAt) { + var newSel = new Object(); + var doc = this.getDoc(); + + function getRangeAt(idx) { + var rng = new Object(); + + rng.startContainer = this.focusNode; + rng.endContainer = this.anchorNode; + rng.commonAncestorContainer = this.focusNode; + rng.createContextualFragment = function (html) { + // Seems to be a tag + if (html.charAt(0) == '<') { + var elm = doc.createElement("div"); + + elm.innerHTML = html; + + return elm.firstChild; + } + + return doc.createTextNode("UNSUPPORTED, DUE TO LIMITATIONS IN SAFARI!"); + }; + + rng.deleteContents = function () { + doc.execCommand("Delete", false, ""); + }; + + return rng; + } + + // Patch selection + + newSel.focusNode = sel.baseNode; + newSel.focusOffset = sel.baseOffset; + newSel.anchorNode = sel.extentNode; + newSel.anchorOffset = sel.extentOffset; + newSel.getRangeAt = getRangeAt; + newSel.text = "" + sel; + newSel.realSelection = sel; + + newSel.toString = function () {return this.text;}; + + return newSel; + } + + return sel; +}; + +TinyMCEControl.prototype.getRng = function() { + var sel = this.getSel(); + if (sel == null) + return null; + + if (tinyMCE.isMSIE && !tinyMCE.isOpera) + return sel.createRange(); + + if (tinyMCE.isSafari) { + var rng = this.getDoc().createRange(); + var sel = this.getSel().realSelection; + + rng.setStart(sel.baseNode, sel.baseOffset); + rng.setEnd(sel.extentNode, sel.extentOffset); + + return rng; + } + + return this.getSel().getRangeAt(0); +}; + +TinyMCEControl.prototype._insertPara = function(e) { + function isEmpty(para) { + function isEmptyHTML(html) { + return html.replace(new RegExp('[ \t\r\n]+', 'g'), '').toLowerCase() == ""; + } + + // Check for images + if (para.getElementsByTagName("img").length > 0) + return false; + + // Check for tables + if (para.getElementsByTagName("table").length > 0) + return false; + + // Check for HRs + if (para.getElementsByTagName("hr").length > 0) + return false; + + // Check all textnodes + var nodes = tinyMCE.getNodeTree(para, new Array(), 3); + for (var i=0; i <" + blockName + "> "; + paraAfter = body.childNodes[1]; + } + + this.selectNode(paraAfter, true, true); + + return true; + } + + // Place first part within new paragraph + if (startChop.nodeName == blockName) + rngBefore.setStart(startChop, 0); + else + rngBefore.setStartBefore(startChop); + + rngBefore.setEnd(startNode, startOffset); + paraBefore.appendChild(rngBefore.cloneContents()); + + // Place secound part within new paragraph + rngAfter.setEndAfter(endChop); + rngAfter.setStart(endNode, endOffset); + var contents = rngAfter.cloneContents(); + + if (contents.firstChild && contents.firstChild.nodeName == blockName) { +/* var nodes = contents.firstChild.childNodes; + for (var i=0; i 0) + rng.pasteHTML('
    ' + rng.htmlText + "
    "); + + tinyMCE.triggerNodeChange(); + return; + } + } + } + + switch (command) { + case "mceRepaint": + this.repaint(); + return true; + + case "mceStoreSelection": + this.selectionBookmark = this.getBookmark(); + return true; + + case "mceRestoreSelection": + this.moveToBookmark(this.selectionBookmark); + return true; + + case "InsertUnorderedList": + case "InsertOrderedList": + var tag = (command == "InsertUnorderedList") ? "ul" : "ol"; + + if (tinyMCE.isSafari) + this.execCommand("mceInsertContent", false, "<" + tag + ">
  •  
  • <" + tag + ">"); + else + this.getDoc().execCommand(command, user_interface, value); + + tinyMCE.triggerNodeChange(); + break; + + case "Strikethrough": + if (tinyMCE.isSafari) + this.execCommand("mceInsertContent", false, "" + this.getSelectedHTML() + ""); + else + this.getDoc().execCommand(command, user_interface, value); + + tinyMCE.triggerNodeChange(); + break; + + case "mceSelectNode": + this.selectNode(value); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = value; + break; + + case "FormatBlock": + if (value == null || value == "") { + var elm = tinyMCE.getParentElement(this.getFocusElement(), "p,div,h1,h2,h3,h4,h5,h6,pre,address"); + + if (elm) + this.execCommand("mceRemoveNode", false, elm); + } else + this.getDoc().execCommand("FormatBlock", false, value); + + tinyMCE.triggerNodeChange(); + + break; + + case "mceRemoveNode": + if (!value) + value = tinyMCE.getParentElement(this.getFocusElement()); + + if (tinyMCE.isMSIE) { + value.outerHTML = value.innerHTML; + } else { + var rng = value.ownerDocument.createRange(); + rng.setStartBefore(value); + rng.setEndAfter(value); + rng.deleteContents(); + rng.insertNode(rng.createContextualFragment(value.innerHTML)); + } + + tinyMCE.triggerNodeChange(); + + break; + + case "mceSelectNodeDepth": + var parentNode = this.getFocusElement(); + for (var i=0; parentNode; i++) { + if (parentNode.nodeName.toLowerCase() == "body") + break; + + if (parentNode.nodeName.toLowerCase() == "#text") { + i--; + parentNode = parentNode.parentNode; + continue; + } + + if (i == value) { + this.selectNode(parentNode, false); + tinyMCE.triggerNodeChange(); + tinyMCE.selectedNode = parentNode; + return; + } + + parentNode = parentNode.parentNode; + } + + break; + + case "SetStyleInfo": + var rng = this.getRng(); + var sel = this.getSel(); + var scmd = value['command']; + var sname = value['name']; + var svalue = value['value'] == null ? '' : value['value']; + //var svalue = value['value'] == null ? '' : value['value']; + var wrapper = value['wrapper'] ? value['wrapper'] : "span"; + var parentElm = null; + var invalidRe = new RegExp("^BODY|HTML$", "g"); + var invalidParentsRe = tinyMCE.settings['merge_styles_invalid_parents'] != '' ? new RegExp(tinyMCE.settings['merge_styles_invalid_parents'], "gi") : null; + + // Whole element selected check + if (tinyMCE.isMSIE) { + // Control range + if (rng.item) + parentElm = rng.item(0); + else { + var pelm = rng.parentElement(); + var prng = doc.selection.createRange(); + prng.moveToElementText(pelm); + + if (rng.htmlText == prng.htmlText || rng.boundingWidth == 0) { + if (invalidParentsRe == null || !invalidParentsRe.test(pelm.nodeName)) + parentElm = pelm; + } + } + } else { + var felm = this.getFocusElement(); + if (sel.isCollapsed || (/td|tr|tbody|table/ig.test(felm.nodeName) && sel.anchorNode == felm.parentNode)) + parentElm = felm; + } + + // Whole element selected + if (parentElm && !invalidRe.test(parentElm.nodeName)) { + if (scmd == "setstyle") + tinyMCE.setStyleAttrib(parentElm, sname, svalue); + + if (scmd == "setattrib") + tinyMCE.setAttrib(parentElm, sname, svalue); + + if (scmd == "removeformat") { + parentElm.style.cssText = ''; + tinyMCE.setAttrib(parentElm, 'class', ''); + } + + // Remove style/attribs from all children + var ch = tinyMCE.getNodeTree(parentElm, new Array(), 1); + for (var z=0; z=0; i--) { + var elm = nodes[i]; + var isNew = tinyMCE.getAttrib(elm, "mce_new") == "true"; + + elm.removeAttribute("mce_new"); + + // Is only child a element + if (elm.childNodes && elm.childNodes.length == 1 && elm.childNodes[0].nodeType == 1) { + //tinyMCE.debug("merge1" + isNew); + this._mergeElements(scmd, elm, elm.childNodes[0], isNew); + continue; + } + + // Is I the only child + if (elm.parentNode.childNodes.length == 1 && !invalidRe.test(elm.nodeName) && !invalidRe.test(elm.parentNode.nodeName)) { + //tinyMCE.debug("merge2" + isNew + "," + elm.nodeName + "," + elm.parentNode.nodeName); + if (invalidParentsRe == null || !invalidParentsRe.test(elm.parentNode.nodeName)) + this._mergeElements(scmd, elm.parentNode, elm, false); + } + } + + // Remove empty wrappers + var nodes = doc.getElementsByTagName(wrapper); + for (var i=nodes.length-1; i>=0; i--) { + var elm = nodes[i]; + var isEmpty = true; + + // Check if it has any attribs + var tmp = doc.createElement("body"); + tmp.appendChild(elm.cloneNode(false)); + + // Is empty span, remove it + tmp.innerHTML = tmp.innerHTML.replace(new RegExp('style=""|class=""', 'gi'), ''); + //tinyMCE.debug(tmp.innerHTML); + if (new RegExp('', 'gi').test(tmp.innerHTML)) { + for (var x=0; x 0) { + value = tinyMCE.replaceVar(value, "selection", selectedText); + tinyMCE.execCommand('mceInsertContent', false, value); + } + + tinyMCE.triggerNodeChange(); + break; + + case "mceSetAttribute": + if (typeof(value) == 'object') { + var targetElms = (typeof(value['targets']) == "undefined") ? "p,img,span,div,td,h1,h2,h3,h4,h5,h6,pre,address" : value['targets']; + var targetNode = tinyMCE.getParentElement(this.getFocusElement(), targetElms); + + if (targetNode) { + targetNode.setAttribute(value['name'], value['value']); + tinyMCE.triggerNodeChange(); + } + } + break; + + case "mceSetCSSClass": + this.execCommand("SetStyleInfo", false, {command : "setattrib", name : "class", value : value}); + break; + + case "mceInsertRawHTML": + var key = 'tiny_mce_marker'; + + this.execCommand('mceBeginUndoLevel'); + + // Insert marker key + this.execCommand('mceInsertContent', false, key); + + // Store away scroll pos + var scrollX = this.getDoc().body.scrollLeft + this.getDoc().documentElement.scrollLeft; + var scrollY = this.getDoc().body.scrollTop + this.getDoc().documentElement.scrollTop; + + // Find marker and replace with RAW HTML + var html = this.getBody().innerHTML; + if ((pos = html.indexOf(key)) != -1) + tinyMCE.setInnerHTML(this.getBody(), html.substring(0, pos) + value + html.substring(pos + key.length)); + + // Restore scoll pos + this.contentWindow.scrollTo(scrollX, scrollY); + + this.execCommand('mceEndUndoLevel'); + + break; + + case "mceInsertContent": + var insertHTMLFailed = false; + this.getWin().focus(); + + if (tinyMCE.isGecko || tinyMCE.isOpera) { + try { + // Is plain text or HTML + if (value.indexOf('<') == -1) { + var r = this.getRng(); + var n = this.getDoc().createTextNode(tinyMCE.entityDecode(value)); + var s = this.getSel(); + var r2 = r.cloneRange(); + + // Insert text at cursor position + s.removeAllRanges(); + r.deleteContents(); + r.insertNode(n); + + // Move the cursor to the end of text + r2.selectNode(n); + r2.collapse(false); + s.removeAllRanges(); + s.addRange(r2); + } else { + value = tinyMCE.fixGeckoBaseHREFBug(1, this.getDoc(), value); + this.getDoc().execCommand('inserthtml', false, value); + tinyMCE.fixGeckoBaseHREFBug(2, this.getDoc(), value); + } + } catch (ex) { + insertHTMLFailed = true; + } + + if (!insertHTMLFailed) { + tinyMCE.triggerNodeChange(); + return; + } + } + + // Ugly hack in Opera due to non working "inserthtml" + if (tinyMCE.isOpera && insertHTMLFailed) { + this.getDoc().execCommand("insertimage", false, tinyMCE.uniqueURL); + var ar = tinyMCE.getElementsByAttributeValue(this.getBody(), "img", "src", tinyMCE.uniqueURL); + ar[0].outerHTML = value; + return; + } + + if (!tinyMCE.isMSIE) { + var isHTML = value.indexOf('<') != -1; + var sel = this.getSel(); + var rng = this.getRng(); + + if (isHTML) { + if (tinyMCE.isSafari) { + var tmpRng = this.getDoc().createRange(); + + tmpRng.setStart(this.getBody(), 0); + tmpRng.setEnd(this.getBody(), 0); + + value = tmpRng.createContextualFragment(value); + } else + value = rng.createContextualFragment(value); + } else { + // Setup text node + var el = document.createElement("div"); + el.innerHTML = value; + value = el.firstChild.nodeValue; + value = doc.createTextNode(value); + } + + // Insert plain text in Safari + if (tinyMCE.isSafari && !isHTML) { + this.execCommand('InsertText', false, value.nodeValue); + tinyMCE.triggerNodeChange(); + return true; + } else if (tinyMCE.isSafari && isHTML) { + rng.deleteContents(); + rng.insertNode(value); + tinyMCE.triggerNodeChange(); + return true; + } + + rng.deleteContents(); + + // If target node is text do special treatment, (Mozilla 1.3 fix) + if (rng.startContainer.nodeType == 3) { + var node = rng.startContainer.splitText(rng.startOffset); + node.parentNode.insertBefore(value, node); + } else + rng.insertNode(value); + + if (!isHTML) { + // Removes weird selection trails + sel.selectAllChildren(doc.body); + sel.removeAllRanges(); + + // Move cursor to end of content + var rng = doc.createRange(); + + rng.selectNode(value); + rng.collapse(false); + + sel.addRange(rng); + } else + rng.collapse(false); + } else { + var rng = doc.selection.createRange(); + var c = value.indexOf('";break;case 9:for(var i=0;i + + + + Library zXml + + + + +

    Library zXml

    +

    Introduction

    + +

    zXml is an open source (LGPL) JavaScript library designed to equalize differences
    + in XML and XMLHttp features across browsers. Using this library allows you to
    + avoid code forks by utilizing simple, cross-browser methods to perform common
    + XML-based operations.

    +

    Work on this library inspired by the article, A + Cross-Browser DOM Document Wrapper.

    +

    Classes

    + +

    zXmlDom

    +

    The zXmlDom class is used to create cross-browser XML DOM document + objects using a common interface.

    +

    zXmlHttp

    +

    The zXmlHttp class is used to create cross-browser XMLHttp objects + using a common interface.

    +

    zXmlSerializer

    +

    The zXmlSerializer class is a cross-browser version of Mozilla's + built-in XMLSerializer object, which can be used to serialize XML + DOM documents to text.

    +

    +

    zXPath

    +

    The zXPath class is used to perform cross-browser XPath evaluations + on DOM documents.

    +

    zXslt

    +

    The zXslt class is used to perform cross-browser XSLT transformations.

    + + + diff --git a/includes/zXml/doc/zXMLSerializer.htm b/includes/zXml/doc/zXMLSerializer.htm new file mode 100644 index 0000000..3bfca0d --- /dev/null +++ b/includes/zXml/doc/zXMLSerializer.htm @@ -0,0 +1,109 @@ + + + + + Class zXMLSerializer + + + +

    Class zXMLSerializer

    +
      +
    • Object
    • +
        + +
      • zXMLSerializer
      • +
      +
    +

    Description

    + +

    The zXmlSerializer class is a cross-browser version of Mozilla's + built-in XMLSerializer object, which can be used to serialize XML + DOM documents to text.

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    + +

    Method Summary

    + + + + + + +
    StringserializeToString(Node + oNode)
    + Returns a string representation of the XML node.
    + + +

    Method Detail

    + + +

    serializeToString

    + +

    public String serializeToString(Node oNode)

    + +

    Returns a string representation of the XML node.

    +

    Arguments:

    +
      +
    • oNode - The node to serialize.
    • +
    +

    Returns:

    +

    A string representation of the XML node.

    + + + diff --git a/includes/zXml/doc/zXPath.htm b/includes/zXml/doc/zXPath.htm new file mode 100644 index 0000000..d9d4ecf --- /dev/null +++ b/includes/zXml/doc/zXPath.htm @@ -0,0 +1,169 @@ + + + + + Class zXPath + + + + +

    Class zXPath

    +
      +
    • Object
    • +
        + +
      • zXPath
      • +
      +
    +

    Description

    + +

    The zXPath class is used to perform cross-browser XPath evaluations + on DOM documents.

    +

    This class equalizes the differences between Internet Explorer and Mozilla + implementations (other browsers don't support JavaScript-based XPath).

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    + +

    Method Summary

    + + + + + + + + + + + + + + + + + + +
    static ArrayselectNodes(Node + oRefNode, String sXPath)
    + Returns all nodes matching the XPath expression.
    static ArrayselectNodes(Node + oRefNode, String sXPath, Object oXmlNs)
    + Returns all nodes matching the XPath expression.
    static NodeselectSingleNode(Node + oRefNode, String sXPath)
    + Gets the first node matching the XPath expression.
    static NodeselectSingleNode(Node + oRefNode, String sXPath, Object oXmlNs)
    + Gets the first node matching the XPath expression.
    + + +

    Method Detail

    + + +

    selectNodes

    + +

    public static Array selectNodes(Node oRefNode, String sXPath)

    + +

    Returns all nodes matching the XPath expression.

    +

    Arguments:

    +
      +
    • oRefNode - The reference node for the XPath evaluation.
    • +
    • sXPath - The XPath expression to run.
    • +
    +

    Returns:

    +

    An array containing all nodes that match the XPath expression (an empty array + if no matches are found).

    +
    +

    selectNodes

    +

    public static Array selectNodes(Node oRefNode, String sXPath, Object + oXmlNs)

    +

    Returns all nodes matching the XPath expression.

    +

    Arguments:

    +
      +
    • oRefNode - The reference node for the XPath evaluation.
    • +
    • sXPath - The XPath expression to run.
    • +
    • oXmlNs - The XML namespaces used in the XPath expression.
    • +
    +

    Returns:

    +

    An array containing all nodes that match the XPath expression (an empty array + if no matches are found).

    +
    +

    selectSingleNode

    +

    public static Node selectNodes(Node oRefNode, String sXPath)

    +

    Returns the first node matching the XPath expression.

    +

    Arguments:

    +
      +
    • oRefNode - The reference node for the XPath evaluation.
    • +
    • sXPath - The XPath expression to run.
    • +
    +

    Returns:

    +

    The first node matching the XPath expression.

    +
    +

    selectSingleNode

    +

    public static Node selectSingleNode(Node oRefNode, String sXPath, Object + oXmlNs)

    +

    Returns the first node matching the XPath expression.

    +

    Arguments:

    +
      +
    • oRefNode - The reference node for the XPath evaluation.
    • +
    • sXPath - The XPath expression to run.
    • +
    • oXmlNs - The XML namespaces used in the XPath expression.
    • +
    +

    Returns:

    +

    The first node matching the XPath expression.

    + + + diff --git a/includes/zXml/doc/zXml.htm b/includes/zXml/doc/zXml.htm new file mode 100644 index 0000000..9f27dbb --- /dev/null +++ b/includes/zXml/doc/zXml.htm @@ -0,0 +1,168 @@ + + + + + Class zXmlDom + + + + +

    Class zXmlDom

    +
      +
    • Object
    • +
        + +
      • zXmlDom
      • +
      +
    +

    Description

    + +

    The zXml class is used to house basic settings for the zXml library. + It contains hints as to what DOM and XMLHttp implementations to use as well + as all of the ActiveX signatures used by Internet Explorer for XML operations. +

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    +

    Field Summary

    + + + + + + + + + + + + + + + + + +
    booleancancelable
    + Indicates whether or not the event's default action can be cancelled.
    zEventTargettarget
    + The object that fired the event.
    longtimeStamp
    + The time that the event occurred in milliseconds since midnight, January 1, 1970.
    Stringtype
    + The type of event that was fired (i.e., "click").
    +

    Constructor Summary

    + + + + +
    zEvent()
    + Creates a new instance of zEvent.
    +

    Method Summary

    + + + + + + + + + +
    voidinitEvent(String type, boolean cancelable)
    + Initializes the event's type and cancelable fields to + the specified values.
    voidpreventDefault()
    + Prevents the default action for an event (only if the event is cancelable).
    + +

    Field Detail

    + +

    cancelable

    +

    public boolean cancelable

    +

    Indicates whether or not the event's default action can be cancelled.

    +
    +

    target

    +

    public zEventTarget target

    +

    The object that fired the event.

    +
    +

    timeStamp

    +

    public long timeStamp

    +

    The time that the event occurred in milliseconds since midnight, January 1, 1970.

    +
    +

    type

    +

    public String type

    +

    The type of event that was fired (i.e., "click").

    + +

    Constructor Detail

    + +

    zEvent

    +

    public zEvent()

    +

    Creates a new instance of zEvent.

    + +

    Method Detail

    + +

    initEvent

    +

    public void initEvent(String type, boolean cancelable)

    +

    Initializes the event's type and cancelable fields to + the specified values.

    +

    Arguments:

    +
      +
    • type - the type of event that has occurred.
    • +
    • cancelable - whether or not the default action of the event can be cancelled.
    • +
    +
    +

    preventDefault

    +

    public void preventDefault()

    +

    Prevents the default action of an event if the event is cancelable.

    + + + diff --git a/includes/zXml/doc/zXmlDom.htm b/includes/zXml/doc/zXmlDom.htm new file mode 100644 index 0000000..59c2bb5 --- /dev/null +++ b/includes/zXml/doc/zXmlDom.htm @@ -0,0 +1,108 @@ + + + + + Class zXmlDom + + + + +

    Class zXmlDom

    +
      +
    • Object
    • +
        + +
      • zXmlDom
      • +
      +
    +

    Description

    + +

    The zXmlDom class is used to create cross-browser XML DOM document + objects using a common interface.

    +

    This class equalizes the differences between browser implementations of XML + DOM documents.

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    + +

    Method Summary

    + + + + + + +
    static XMLDocumentcreateDocument()
    + Creates an XML DOM document.
    + + +

    Method Detail

    + + +

    createDocument

    + +

    public static XMLDocument createDocument()

    + +

    Creates an XML DOM document.

    + +

    Returns:

    +

    An XML DOM document.

    + + + + diff --git a/includes/zXml/doc/zXmlHttp.htm b/includes/zXml/doc/zXmlHttp.htm new file mode 100644 index 0000000..7e1ed2b --- /dev/null +++ b/includes/zXml/doc/zXmlHttp.htm @@ -0,0 +1,108 @@ + + + + + Class zXmlHttp + + + + +

    Class zXmlHttp

    +
      +
    • Object
    • +
        + +
      • zXmlHttp
      • +
      +
    +

    Description

    + +

    The zXmlHttp class is used to create cross-browser XMLHttp objects + using a common interface.

    +

    This class equalizes the differences between browser implementations of XMLHttp + objects.

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    + +

    Method Summary

    + + + + + + +
    static XMLHttpcreateRequest()
    + Creates an XMLHttp object.
    + + +

    Method Detail

    + + +

    createRequest

    + +

    public static XMLHttp createRequest()

    + +

    Creates an XMLHttp object.

    + +

    Returns:

    +

    An XMLHttp object.

    + + + + diff --git a/includes/zXml/doc/zXslt.htm b/includes/zXml/doc/zXslt.htm new file mode 100644 index 0000000..82b0a89 --- /dev/null +++ b/includes/zXml/doc/zXslt.htm @@ -0,0 +1,112 @@ + + + + + Class zXslt + + + + +

    Class zXslt

    +
      +
    • Object
    • +
        + +
      • zXslt
      • +
      +
    +

    Description

    + +

    The zXslt class is used to perform cross-browser XSLT transformations.

    +

    This class equalizes the differences between Internet Explorer and Mozilla + implementations (other browsers don't support JavaScript-based XSLT).

    +

    Author:

    +

    Nicholas C. Zakas, http://www.nczonline.net/

    +

    Version:

    +

    1.0

    +

    Since:

    +

    1.0

    + +

    Method Summary

    + + + + + + +
    static StringtransformToText(XMLDocument + oXml, XMLDocument oXslt)
    + Transforms an XML document using an XSLT document.
    + + +

    Method Detail

    + + +

    transformToText

    + +

    public static String transformToText(XMLDocument oXml, XMLDocument oXslt)

    + +

    Transforms an XML document using an XSLT document.

    +

    Arguments:

    +
      +
    • oXml - The XML DOM document to transform.
    • +
    • oXslt - An XML DOM document loaded with XSLT.
    • +
    +

    Returns:

    +

    A string containing the transformation.

    + + + + diff --git a/includes/zXml/examples/Examples to come.txt b/includes/zXml/examples/Examples to come.txt new file mode 100644 index 0000000..3bdc90f --- /dev/null +++ b/includes/zXml/examples/Examples to come.txt @@ -0,0 +1 @@ +Examples to come... \ No newline at end of file diff --git a/includes/zXml/src/test.htm b/includes/zXml/src/test.htm new file mode 100644 index 0000000..e1830be --- /dev/null +++ b/includes/zXml/src/test.htm @@ -0,0 +1,14 @@ + + + + +Page title + + + + + + + + + diff --git a/includes/zXml/src/zxml.src.js b/includes/zXml/src/zxml.src.js new file mode 100644 index 0000000..796ce0d --- /dev/null +++ b/includes/zXml/src/zxml.src.js @@ -0,0 +1,453 @@ +/*------------------------------------------------------------------------------ + * JavaScript zXml Library + * Version 1.0 + * by Nicholas C. Zakas, http://www.nczonline.net/ + * Copyright (c) 2004-2005 Nicholas C. Zakas. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + *------------------------------------------------------------------------------ + */ + + +var zXml = { + useActiveX: (typeof ActiveXObject != "undefined"), + useDom: document.implementation && document.implementation.createDocument, + useXmlHttp: (typeof XMLHttpRequest != "undefined") +}; + +zXml.ARR_XMLHTTP_VERS = ["MSXML2.XmlHttp.5.0", "MSXML2.XmlHttp.4.0", + "MSXML2.XmlHttp.3.0", "MSXML2.XmlHttp", + "Microsoft.XmlHttp"]; + +zXml.ARR_DOM_VERS = ["MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", + "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", + "Microsoft.XmlDom"]; + +/** + * Static class for handling XMLHttp creation. + * @class + * @scope public + */ +function zXmlHttp() { +} + +/** + * Creates an XMLHttp object. + * @static + * @scope public + * @return An XMLHttp object. + */ +zXmlHttp.createRequest = function ()/*:XMLHttp*/ { + + if (zXml.useXmlHttp) { + return new XMLHttpRequest(); + } else if (zXml.useActiveX) { + + if (!zXml.XMLHTTP_VER) { + for (var i=0; i < zXml.ARR_XMLHTTP_VERS.length; i++) { + try { + new ActiveXObject(zXml.ARR_XMLHTTP_VERS[i]); + zXml.XMLHTTP_VER = zXml.ARR_XMLHTTP_VERS[i]; + break; + } catch (oError) { + } + } + } + + if (zXml.XMLHTTP_VER) { + return new ActiveXObject(zXml.XMLHTTP_VER); + } else { + throw new Error("Could not create XML HTTP Request."); + } + } else { + throw new Error("Your browser doesn't support an XML HTTP Request."); + } + +}; + +/** + * Indicates if XMLHttp is available. + * @static + * @scope public + * @return True if XMLHttp is available, false if not. + */ +zXmlHttp.isSupported = function ()/*:Boolean*/ { + return zXml.useXmlHttp || zXml.useActiveX; +}; + + +/** + * Static class for handling XML DOM creation. + * @class + * @scope public + */ +function zXmlDom() { + +} + +/** + * Creates an XML DOM document. + * @static + * @scope public + * @return An XML DOM document. + */ +zXmlDom.createDocument = function () /*:XMLDocument*/{ + + if (zXml.useDom) { + + var oXmlDom = document.implementation.createDocument("","",null); + + oXmlDom.parseError = { + valueOf: function () { return this.errorCode; }, + toString: function () { return this.errorCode.toString() } + }; + + oXmlDom.__initError__(); + + oXmlDom.addEventListener("load", function () { + this.__checkForErrors__(); + this.__changeReadyState__(4); + }, false); + + return oXmlDom; + + } else if (zXml.useActiveX) { + if (!zXml.DOM_VER) { + for (var i=0; i < zXml.ARR_DOM_VERS.length; i++) { + try { + new ActiveXObject(zXml.ARR_DOM_VERS[i]); + zXml.DOM_VER = zXml.ARR_DOM_VERS[i]; + break; + } catch (oError) { + } + } + } + + if (zXml.DOM_VER) { + return new ActiveXObject(zXml.DOM_VER); + } else { + throw new Error("Could not create XML DOM document."); + } + } else { + throw new Error("Your browser doesn't support an XML DOM document."); + } + +}; + +/** + * Indicates if an XML DOM is available. + * @static + * @scope public + * @return True if XML DOM is available, false if not. + */ +zXmlDom.isSupported = function ()/*:Boolean*/ { + return zXml.useDom || zXml.useActiveX; +}; + +//Code to make Mozilla DOM documents act more like MS DOM documents. +var oMozDocument = null; +if (typeof XMLDocument != "undefined") { + oMozDocument = XMLDocument; +} else if (typeof Document != "undefined") { + oMozDocument = Document; +} + +if (oMozDocument && !window.opera) { + + oMozDocument.prototype.readyState = 0; + oMozDocument.prototype.onreadystatechange = null; + + oMozDocument.prototype.__changeReadyState__ = function (iReadyState) { + this.readyState = iReadyState; + + if (typeof this.onreadystatechange == "function") { + this.onreadystatechange(); + } + }; + + oMozDocument.prototype.__initError__ = function () { + this.parseError.errorCode = 0; + this.parseError.filepos = -1; + this.parseError.line = -1; + this.parseError.linepos = -1; + this.parseError.reason = null; + this.parseError.srcText = null; + this.parseError.url = null; + }; + + oMozDocument.prototype.__checkForErrors__ = function () { + + if (this.documentElement.tagName == "parsererror") { + + var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column (\d+):([\s\S]*?)(?:\-*\^)/; + + reError.test(this.xml); + + this.parseError.errorCode = -999999; + this.parseError.reason = RegExp.$1; + this.parseError.url = RegExp.$2; + this.parseError.line = parseInt(RegExp.$3); + this.parseError.linepos = parseInt(RegExp.$4); + this.parseError.srcText = RegExp.$5; + } + }; + + oMozDocument.prototype.loadXML = function (sXml) { + + this.__initError__(); + + this.__changeReadyState__(1); + + var oParser = new DOMParser(); + var oXmlDom = oParser.parseFromString(sXml, "text/xml"); + + while (this.firstChild) { + this.removeChild(this.firstChild); + } + + for (var i=0; i < oXmlDom.childNodes.length; i++) { + var oNewNode = this.importNode(oXmlDom.childNodes[i], true); + this.appendChild(oNewNode); + } + + this.__checkForErrors__(); + + this.__changeReadyState__(4); + + }; + + oMozDocument.prototype.__load__ = oMozDocument.prototype.load; + + oMozDocument.prototype.load = function (sURL) { + this.__initError__(); + this.__changeReadyState__(1); + this.__load__(sURL); + }; + + Node.prototype.__defineGetter__("xml", function () { + var oSerializer = new XMLSerializer(); + return oSerializer.serializeToString(this, "text/xml"); + }); + + Node.prototype.__defineGetter__("text", function () { + var sText = ""; + for (var i = 0; i < this.childNodes.length; i++) { + if (this.childNodes[i].hasChildNodes()) { + sText += this.childNodes[i].text; + } else { + sText += this.childNodes[i].nodeValue; + } + } + return sText; + + }); + +} + +/** + * Static class for handling XSLT transformations. + * @class + * @scope public + */ +function zXslt() { +} + +/** + * Transforms an XML DOM to text using an XSLT DOM. + * @static + * @scope public + * @param oXml The XML DOM to transform. + * @param oXslt The XSLT DOM to use for the transformation. + * @return The transformed version of the string. + */ +zXslt.transformToText = function (oXml /*:XMLDocument*/, oXslt /*:XMLDocument*/)/*:String*/ { + if (typeof XSLTProcessor != "undefined") { + var oProcessor = new XSLTProcessor(); + oProcessor.importStylesheet(oXslt); + + var oResultDom = oProcessor.transformToDocument(oXml); + var sResult = oResultDom.xml; + + if (sResult.indexOf(" -1) { + sResult = sResult.substring(sResult.indexOf(">") + 1, + sResult.lastIndexOf("<")); + } + + return sResult; + } else if (zXml.useActiveX) { + return oXml.transformNode(oXslt); + } else { + throw new Error("No XSLT engine found."); + } +}; + +/** + * Static class for handling XPath evaluation. + * @class + * @scope public + */ +function zXPath() { + +} + +/** + * Selects the first node matching a given XPath expression. + * @static + * @scope public + * @param oRefNode The node from which to evaluate the expression. + * @param sXPath The XPath expression. + * @param oXmlNs An object containing the namespaces used in the expression. Optional. + * @return An XML node matching the expression or null if no matches found. + */ +zXPath.selectNodes = function (oRefNode, sXPath, sXmlNs) { + if (typeof XPathEvaluator != "undefined") { + + oXmlNs = oXmlNs || {}; + + var nsResolver = function (sPrefix) { + return oXmlNs[sPrefix]; + }; + + var oEvaluator = new XPathEvaluator(); + var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver, + XPathResult.ORDERED_NODE_ITERATOR_TYPE, + null); + + var aNodes = new Array; + + if (oResult != null) { + var oElement = oResult.iterateNext(); + while(oElement) { + aNodes.push(oElement); + oElement = oResult.iterateNext(); + } + } + + return aNodes; + + } else if (zXml.useActiveX) { + if (oXmlNs) { + var sXmlNs = ""; + for (var sProp in oXmlNs) { + sXmlNs += "xmlns:" + sProp + "=" + oXmlNs[sProp] + " "; + } + oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs); + } + return oRefNode.selectNodes(sXPath); + } else { + throw new Error("No XPath engine found."); + } + +}; + +/** + * Selects the first node matching a given XPath expression. + * @static + * @scope public + * @param oRefNode The node from which to evaluate the expression. + * @param sXPath The XPath expression. + * @param oXmlNs An object containing the namespaces used in the expression. + * @return An XML node matching the expression or null if no matches found. + */ +zXPath.selectSingleNode = function (oRefNode, sXPath, oXmlNs) { + if (typeof XPathEvaluator != "undefined") { + + oXmlNs = oXmlNs || {}; + + var nsResolver = function (sPrefix) { + return oXmlNs[sPrefix]; + }; + + var oEvaluator = new XPathEvaluator(); + var oResult = oEvaluator.evaluate(sXPath, oRefNode, nsResolver, + XPathResult.FIRST_ORDERED_NODE_TYPE, null); + + if (oResult != null) { + return oResult.singleNodeValue; + } else { + return null; + } + + } else if (zXML.useActiveX) { + if (oXmlNs) { + var sXmlNs = ""; + for (var sProp in oXmlNs) { + sXmlNs += "xmlns:" + sProp + "=" + oXmlNs[sProp] + " "; + } + oRefNode.ownerDocument.setProperty("SelectionNamespaces", sXmlNs); + } + return oRefNode.selectSingleNode(sXPath); + } else { + throw new Error("No XPath engine found.") + } + +}; + +/** + * General purpose XML serializer. + * @class + */ +function zXMLSerializer() { + +} + +/** + * Serializes the given XML node into an XML string. + * @param oNode The XML node to serialize. + * @return An XML string. + */ +zXMLSerializer.prototype.serializeToString = function (oNode /*:Node*/)/*:String*/ { + + var sXml = ""; + + switch (oNode.nodeType) { + case 1: //element + sXml = "<" + oNode.tagName; + + for (var i=0; i < oNode.attributes.length; i++) { + sXml += " " + oNode.attributes[i].name + "=\"" + oNode.attributes[i].value + "\""; + } + + sXml += ">"; + + for (var i=0; i < oNode.childNodes.length; i++){ + sXml += this.serializeToString(oNode.childNodes[i]); + } + + sXml += ""; + break; + + case 3: //text node + sXml = oNode.nodeValue; + break; + case 4: //cdata + sXml = ""; + break; + case 7: //processing instruction + sXml = ""; + break; + case 8: //comment + sXml = ""; + break; + case 9: //document + for (var i=0; i < oNode.childNodes.length; i++){ + sXml += this.serializeToString(oNode.childNodes[i]); + } + break; + + } + + return sXml; +}; \ No newline at end of file diff --git a/includes/zXml/zxml.js b/includes/zXml/zxml.js new file mode 100644 index 0000000..1de855c --- /dev/null +++ b/includes/zXml/zxml.js @@ -0,0 +1,2 @@ +var zXml={useActiveX:(typeof ActiveXObject!="undefined"),useDom:document.implementation&&document.implementation.createDocument,useXmlHttp:(typeof XMLHttpRequest!="undefined")};zXml.ARR_XMLHTTP_VERS=["MSXML2.XmlHttp.5.0","MSXML2.XmlHttp.4.0","MSXML2.XmlHttp.3.0","MSXML2.XmlHttp","Microsoft.XmlHttp"];zXml.ARR_DOM_VERS=["MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument","Microsoft.XmlDom"];;function zXmlHttp(){}zXmlHttp.createRequest=function(){if(zXml.useXmlHttp){return new XMLHttpRequest();}else if(zXml.useActiveX){if(!zXml.XMLHTTP_VER){for(var i=0;i([\s\S]*?)Location:([\s\S]*?)Line Number(\d+),Column(\d+):([\s\S]*?)(?:\-*\^)/;reError.test(this.xml);this.parseError.errorCode=-999999;this.parseError.reason=RegExp.$1;this.parseError.url=RegExp.$2;this.parseError.line=parseInt(RegExp.$3);this.parseError.linepos=parseInt(RegExp.$4);this.parseError.srcText=RegExp.$5;}};oMozDocument.prototype.loadXML=function(sXml){this.__initError__();this.__changeReadyState__(1);var oParser=new DOMParser();var oXmlDom=oParser.parseFromString(sXml,"text/xml");while(this.firstChild){this.removeChild(this.firstChild);}for(var i=0;i-1){sResult=sResult.substring(sResult.indexOf(">")+1,sResult.lastIndexOf("<"));}return sResult;;}else if(zXml.useActiveX){return oXml.transformNode(oXslt);}else{throw new Error("No XSLT engine found.");}};function zXPath(){}zXPath.selectNodes=function(oRefNode,sXPath,sXmlNs){if(typeof XPathEvaluator!="undefined"){oXmlNs=oXmlNs||{};var nsResolver=function(sPrefix){return oXmlNs[sPrefix];};var oEvaluator=new XPathEvaluator();var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsResolver,XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);var aNodes=new Array;if(oResult!=null){var oElement=oResult.iterateNext();while(oElement){aNodes.push(oElement);oElement=oResult.iterateNext();}}return aNodes;}else if(zXml.useActiveX){if(oXmlNs){var sXmlNs="";for(var sProp in oXmlNs){sXmlNs+="xmlns:"+sProp+"="+oXmlNs[sProp]+" ";}oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);};return oRefNode.selectNodes(sXPath);}else{throw new Error("No XPath engine found.");}};zXPath.selectSingleNode=function(oRefNode,sXPath,oXmlNs){if(typeof XPathEvaluator!="undefined"){;oXmlNs=oXmlNs||{};var nsResolver=function(sPrefix){return oXmlNs[sPrefix];};var oEvaluator=new XPathEvaluator();var oResult=oEvaluator.evaluate(sXPath,oRefNode,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE,null);if(oResult!=null){return oResult.singleNodeValue;}else{return null;};}else if(zXML.useActiveX){if(oXmlNs){var sXmlNs="";for(var sProp in oXmlNs){sXmlNs+="xmlns:"+sProp+"="+oXmlNs[sProp]+" ";}oRefNode.ownerDocument.setProperty("SelectionNamespaces",sXmlNs);};return oRefNode.selectSingleNode(sXPath);}else{throw new Error("No XPath engine found.");}};function zXMLSerializer(){}zXMLSerializer.prototype.serializeToString=function(oNode){var sXml="";switch(oNode.nodeType){case 1:sXml="<"+oNode.tagName;for(var i=0;i";for(var i=0;i";break;case 3:sXml=oNode.nodeValue;break;case 4:sXml="";break;case 7:sXml="";break;case 8:sXml="";break;case 9:for(var i=0;i__construct($id, $data); + } + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($this->id == NULL){//New action + if ($data == NULL){ + error("Action: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->name = $data['name']; + $this->text = $data['text']; + } + + public function store(){ + $action = scriptParam("action"); + if ($action == "register-action"){ + $this->id = getNextId("din_action"); + $sql = sprintf("INSERT INTO din_action VALUES " . + " (%s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("New action registered and stored."); + $sql = "INSERT INTO din_actiongrouprelationship VALUES + ($this->id, 3)"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Action granted to administrator group."); + }else { + error("Grant action: " . $result->toString()); + } + }else { + error("New action: " . $result->toString()); + } + + }else {//Update + $sql = sprintf("UPDATE din_action SET + name = %s, + text = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Action updated."); + }else { + error("Update action: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT a.* + FROM din_action a + WHERE a.id = $this->id"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + }else { + error("Actions: " . $result->toString()); + } + } + } + + public function delete($id){ + $conn = db_connect(); + + $sql = "DELETE FROM din_action + WHERE id = $id + LIMIT 1"; + $result =& $conn->query($sql); + if (DB::isError($result) == true){ + error("Action: " . $result->toString()); + }else { + notify("Action deleted."); + } + + } + + public function display(){ + displayOptionsMenu($this->id, "action"); +?> +

    name"; ?>

    + +

    text); ?>

    +
     
    + + + + name; ?> + text); ?> + id, ACTION, "action", "view-edit-options-action"); ?> + + + \ No newline at end of file diff --git a/inside/ActionGroupRelationship.php b/inside/ActionGroupRelationship.php new file mode 100644 index 0000000..ac7e13f --- /dev/null +++ b/inside/ActionGroupRelationship.php @@ -0,0 +1,94 @@ +__construct($action_id, $group_id); + } + public function __construct($action_id = NULL, $group_id = NULL){ + $this->conn =& DB_connect(); + + $this->action_id = $action_id; + $this->group_id = $group_id; + $action = scriptParam("action"); + + if ($action == "register-actiongrouprelationship" || $action == "update-group"){ + + }else { + $data = $this->_retrieveData(); + $this->action_name = $data['action_name']; + $this->group_name = $data['group_name']; + } + } + + public function store(){ + $sql = sprintf("INSERT INTO din_actiongrouprelationship + (action_id, group_id) + VALUES + (%s, %s)", + $this->conn->quoteSmart($this->action_id), + $this->conn->quoteSmart($this->group_id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if (scriptParam("action") == "register-actiongrouprelationship"){ + notify("New actiongrouprelationship registered and stored."); + } + }else { + error("New action: " . $result->toString()); + } + } + + public function _retrieveData(){ + $sql = "SELECT a.name AS action_name, g.name AS group_name + FROM din_actiongrouprelationship agr, din_action a, din_group g + WHERE agr.action_id = $this->action_id + AND agr.group_id = $this->group_id + AND agr.action_id = a.id + AND agr.group_id = g.id"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("ActionGroupRelationships: " . $result->toString()); + } + } + + public function delete(){ + $sql = "DELETE FROM din_actiongrouprelationship + WHERE action_id = $this->action_id + AND group_id = $this->group_id + LIMIT 1"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("ActionGroupRelationship deleted."); + }else { + error($result->toString()); + } + } + + public function displayList(){ + ?> + + action_name"; ?> + group_name"; ?> + + + diff --git a/inside/ActionGroupRelationships.php b/inside/ActionGroupRelationships.php new file mode 100644 index 0000000..db85f65 --- /dev/null +++ b/inside/ActionGroupRelationships.php @@ -0,0 +1,88 @@ +__construct(); + } + + function __construct(){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("ActionGroupRelationships: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + } + + public function getJoinedList($group_id, $type = "array", $exclude = 1){ + $exclude_statement = ""; + if (is_array($exclude)) { + foreach ($exclude as $e) { + if ($e != 0) { + $exclude_statement .= "AND a.id NOT IN (SELECT action_id FROM din_actiongrouprelationship agr WHERE agr.group_id = $e)\n"; + } + } + }else { + $exclude_statement = "AND a.id NOT IN (SELECT action_id FROM din_actiongrouprelationship agr WHERE agr.group_id = $exclude)"; + } + + $sql = "SELECT agr.group_id, a.id AS action_id, a.name AS action_name + FROM din_group g, din_action a LEFT JOIN din_actiongrouprelationship agr + ON a.id = agr.action_id + AND agr.group_id = $group_id + WHERE g.id = $group_id + $exclude_statement + ORDER BY a.name"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $list = Array(); + while ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $list["names"][] = $row->action_id; + $list["labels"][] = $row->action_name; + $list["checked"][] = ($row->group_id == NULL) ? false : true; + } + return $list; + }else { + error($result->toString()); + } + } + + public function getList(){ + $sql = "SELECT action_id, group_id + FROM din_actiongrouprelationship"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->relations = $result; + }else { + error($result->toString()); + } + return $this->relations; + } + + public function displayList($limit = 25){ + $this->getList(); + if ($this->relations->numRows() > 0){ +?> + + + + + +relations->fetchRow(DB_FETCHMODE_OBJECT)){ + $rel = new ActionGroupRelationship($row->action_id, $row->group_id); + $rel->displayList(); + } + print("
    handlinggruppe
    "); + }else { + print("

    Ingen forhold registrert.

    "); + } + } + +} +?> \ No newline at end of file diff --git a/inside/ActionParser.php b/inside/ActionParser.php new file mode 100644 index 0000000..c2b73d9 --- /dev/null +++ b/inside/ActionParser.php @@ -0,0 +1,1205 @@ +__construct(); + } + + function __construct() { + $this->action = scriptParam('action'); + } + + public function performAction() { + //Actions that don't require login + switch ($this->action) { + case 'order-password' : + $this->_orderPassword(); + break; + case 'email-lookup' : + $this->_emailLookup(); + break; + default : + break; + } + + if (isAdmin()) { + //On-the-fly generation of files + if (scriptParam('page') == 'display-user-expiries' && isset ($_POST['format']) && $_POST['format'] == 'file') { + $users = new Users(); + $users->displayExpiryList(scriptParam('groupid'), scriptParam('limit'), scriptParam('expiry'), scriptParam('format')); + } + } + + //Actions that require that the user is logged in and has the right privileges + if (checkAuth('perform-' . $this->action) || checkResponsible()) { + switch ($this->action) { + case 'log-in' : + $this->_logIn(); + break; + + case 'log-out' : + $this->_logOut(); + break; + + case 'update-password' : + $this->_updatePassword(); + break; + + case 'payex-transaction' : + $this->_payexTransaction(); + break; + + case 'register-job' : + $this->_registerJob(); + break; + + case 'update-job' : + $this->_updateJob(); + break; + + case 'delete-job' : + $this->_deleteJob(); + break; + + case 'register-barshift' : + $this->_registerBarShift(); + break; + + case 'update-barshift' : + $this->_updateBarShift(); + break; + + case 'repeat-barshift' : + $this->_repeatBarShift(); + break; + + case 'copy-barshift' : + $this->_copyBarShift(); + break; + + case 'delete-barshift' : + $this->_deleteBarShift(); + break; + + case 'register-barshiftworker' : + $this->_registerBarshiftWorker(); + break; + + case 'register-barshiftworker-self' : + $this->_registerBarshiftWorkerSelf(); + break; + + case 'delete-barshiftworker' : + $this->_deleteBarShiftWorker(); + break; + + case 'register-division' : + $this->_registerDivision(); + break; + + case 'update-division' : + $this->_updateDivision(); + break; + + case 'delete-division' : + $this->_deleteDivision(); + break; + + case 'register-position' : + $this->_registerPosition(); + break; + + case 'update-position' : + $this->_updatePosition(); + break; + + case 'delete-position' : + $this->_deletePosition(); + break; + + case 'register-article' : + $this->_registerArticle(); + break; + + case 'update-article' : + $this->_updateArticle(); + break; + + case 'delete-article' : + $this->_deleteArticle(); + break; + + case 'register-event' : + $this->_registerEvent(); + break; + + case 'update-event' : + $this->_updateEvent(); + break; + + case 'repeat-event' : + $this->_repeatEvent(); + break; + + case 'copy-event' : + $this->_copyEvent(); + break; + + case 'delete-event' : + $this->_deleteEvent(); + break; + + case 'register-eventcomment' : + $this->_registerEventComment(); + break; + + case 'delete-eventcomment' : + $this->_deleteEventComment(); + break; + + case 'register-concert' : + $this->_registerConcert(); + break; + + case 'update-concert' : + $this->_updateConcert(); + break; + + case 'register-concertreport' : + $this->_registerConcertReport(); + break; + + case 'update-concertreport' : + $this->_updateConcertReport(); + break; + + case 'repeat-concert' : + $this->_repeatConcert(); + break; + + case 'copy-concert' : + $this->_copyConcert(); + break; + + case 'delete-concert' : + $this->_deleteConcert(); + break; + + case 'register-weekprogram' : + $this->_registerWeekProgram(); + break; + + case 'register-programselection' : + $this->_registerProgramSelection(); + break; + + case 'update-programselection' : + $this->_updateProgramSelection(); + break; + + case 'upload-document' : + $this->_uploadDocument(); + break; + + case 'update-document' : + $this->_updateDocument(); + break; + + case 'delete-document' : + $this->_deleteDocument(); + break; + + case 'register-user' : + $this->_registerUser(); + break; + + case 'update-user' : + $this->_updateUser(); + break; + + case 'delete-user' : + $this->_deleteUser(); + break; + + case 'change-username' : + $this->_changeUsername(); + break; + + case 'update-user-expiry' : + $this->_updateUserExpiry(); + break; + + case 'update-user-last-sticker' : + $this->_updateUserLastSticker(); + break; + + case 'update-current-user' : + $this->_updateUser(true); + break; + + case 'update-user-division-request' : + $this->_updateUserDivisionRequest(); + break; + + case 'register-membership' : + $this->_registerMembership(); + break; + + case 'register-membership-payex' : + $this->_registerMembershipPayex(); + break; + + case 'register-membership-bankpayment' : + $this->_registerUserMembershipBankpayment(); + break; + + case 'renew-membership' : + $this->_renewMembership(); + break; + + case 'payex-test-transaction' : + $this->_payexTestTransaction(); + break; + + case 'cart-add-product' : + $this->_cartAddProduct(); + break; + + case 'update-cart' : + $this->_updateCart(); + break; + + case 'cart-checkout' : + $this->_cartCheckout(); + break; + + case 'transaction-return' : + $this->_transactionReturn(); + break; + + case 'delete-order' : + $this->_deleteOrder(); + break; + + case 'grant-cardno' : + $this->_grantCardno(); + break; + + case 'update-user-hascard' : + $this->_updateUserHasCard(); + break; + + case 'register-group' : + $this->_registerGroup(); + break; + + case 'update-group' : + $this->_updateGroup(); + break; + + case 'delete-group' : + $this->_deleteGroup(); + break; + + case 'register-action' : + $this->_registerAction(); + break; + + case 'update-action' : + $this->_updateAction(); + break; + + case 'delete-action' : + $this->_deleteAction(); + break; + + case 'register-actiongrouprelationship' : + $this->_registerActionGroupRelationship(); + break; + + case 'register-usergrouprelationship' : + $this->_registerUserGroupRelationship(); + break; + + case 'delete-usergrouprelationship' : + $this->_deleteUserGroupRelationship(); + break; + + case 'switch-formtype' : + $this->_switchFormtype(); + break; + + case 'switch-tinymce-theme' : + $this->_switchTinyMCETheme(); + break; + + case 'register-documentcategory' : + $this->_registerDocumentCategory(); + break; + + case 'update-documentcategory' : + $this->_updateDocumentCategory(); + break; + + case 'delete-documentcategory' : + $this->_deleteDocumentCategory(); + break; + + case 'register-eventcategory' : + $this->_registerEventCategory(); + break; + + case 'update-eventcategory' : + $this->_updateEventCategory(); + break; + + case 'delete-eventcategory' : + $this->_deleteEventCategory(); + break; + + case 'register-jobcategory' : + $this->_registerJobCategory(); + break; + + case 'update-jobcategory' : + $this->_updateJobCategory(); + break; + + case 'delete-jobcategory' : + $this->_deleteJobCategory(); + break; + + case 'register-product' : + $this->_registerProduct(); + break; + + case 'update-product' : + $this->_updateProduct(); + break; + + case 'delete-product' : + $this->_deleteProduct(); + break; + + case 'register-bugreport' : + $this->_registerBugReport(); + break; + + case 'update-bugreport-status' : + $this->_updateBugReportStatus(); + break; + + case 'delete-bugreport' : + $this->_deleteBugReport(); + break; + } + + } else + if ($this->action == 'register-user') { + if ($this->_registerUser()) { + $GLOBALS['extraScriptParams']['password'] = scriptParam('password1'); + $this->_logIn(); + } + } + } + + public function _orderPassword() { + $conn = db_connect(); + $userid = trim(scriptParam('userid')); + if (is_numeric($userid)) { + $sql = "SELECT firstname, lastname, username, email + FROM din_user + WHERE id = $userid"; + } else { + $sql = "SELECT firstname, lastname, username, email + FROM din_user + WHERE email = '$userid'"; + } + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + notify('Tjenesten er midlertidig utilgjengelig, vennligst forsøk igjen senere.'); + return false; + } + if ($result->numRows() > 0) { + $row = $result->fetchRow(DB_FETCHMODE_OBJECT); + if ($row->email == '') { + notify('Ingen epostadresse er registrert på din bruker.'); + return false; + } + $newPassword = generatePassword(); + if (is_numeric($userid)) { + $sql = 'UPDATE din_user SET ' . + " password = PASSWORD('$newPassword'), " . + ' passwordReset = 1 ' . + 'WHERE' . + " id = $userid"; + } else { + $sql = 'UPDATE din_user SET ' . + " password = PASSWORD('$newPassword'), " . + ' passwordReset = 1 ' . + 'WHERE' . + " email = '$userid'"; + } + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + notify('Tjenesten er midlertidig utilgjengelig, vennligst forsøk igjen senere.'); + return false; + } + $sendto = $row->email; + $subject = 'Brukernavn og passord for Studentersamfundet Inside'; + $message = "Hei, $row->firstname $row->lastname!\n " . + "\n" . + "\nDu har bestilt nytt brukernavn og passord til Studentersamfundet Inside. " . + "\n" . + "\nDitt brukernavn er: $row->username" . + "\nDitt passord er: $newPassword" . + "\n" . + "\nNår du logger på vil du bli bedt om å endre passord til noe som er lettere å huske. Du kan også endre brukernavnet ditt." . + "\n" . + "\nhttp://www.studentersamfundet.no/inside/index.php#login" . + "\n" . + "\nmvh" . + "\nStudentersamfundet Inside"; + $headers = 'From: dns.inside@studentersamfundet.no' . "\r\n"; + if (mail($sendto, $subject, $message, $headers)) { + notify('Nytt brukernavn og passord er sendt til din registrerte epostadresse. Bruk skjemaet under for å logge deg inn.'); + } else { + notify('Det oppstod en feil under sending av epost. Vennligst kontakt' . 'webansvarlig.'); + } + } else { + if (is_numeric($userid)) { + notify('Kortnummeret er er ikke registrert i databasen. Vennligst registrér deg først.'); + } else { + notify('Ingen bruker er registrert på epostadressen du oppgav.'); + } + } + } + + public function _updatePassword() { + $password1 = scriptParam('password1'); + $password2 = scriptParam('password2'); + if (strlen($password1) < 4) { + notify('Passordet ditt må være minst fire tegn.'); + $GLOBALS['extraScriptParams']['page'] = 'reset-password'; + return; + } else { + if ($password1 != $password2) { + notify('Passordene du tastet inn var forskjellige.'); + $GLOBALS['extraScriptParams']['page'] = 'reset-password'; + return; + } else { + $conn = db_connect(); + $sql = sprintf("UPDATE din_user SET + password = PASSWORD(%s), + passwordReset = %s + WHERE + id = %s", $conn->quoteSmart($password1), $conn->quoteSmart(0), $conn->quoteSmart(getCurrentUser())); + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + notify('Nytt passord er lagret.'); + } else { + $GLOBALS['extraScriptParams']['page'] = 'reset-password'; + notify('Problemer med lagring passord, vennligst prøv igjen senere. Inntil videre gjelder ditt gamle passord.'); + } + } + } + } + + function _emailLookup() { + $conn = db_connect(); + $email = trim(scriptParam('email')); + if ($email == '') { + notify('Du oppga ingen epostadresse. Bruk skjemaet under for å registrere deg eller gå tilbake og prøv igjen.'); + $GLOBALS['extraScriptParams']['page'] = 'register-user'; + return false; + } + $sql = "SELECT firstname, lastname, username, email + FROM din_user + WHERE email = '$email'"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + notify("Tjenesten er midlertidig utilgjengelig, vennligst forsøk igjen senere."); + return false; + } + if ($result->numRows() > 0) { + $row = $result->fetchRow(DB_FETCHMODE_OBJECT); + $newPassword = generatePassword(); + $sql = "UPDATE din_user SET " . + " password = PASSWORD('$newPassword'), " . + " passwordReset = 1 " . + "WHERE" . + " email = '$email'"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + notify("Tjenesten er midlertidig utilgjengelig, vennligst forsøk igjen senere."); + return false; + } + $sendto = $row->email; + $subject = "Brukernavn og passord for Studentersamfundets medlemsider"; + $message = "Hei, $row->firstname $row->lastname!\n " . + "\n" . + "\nDu er registrert i Studentersamfundets medlemsdatabase. Følg linken under og logg på med følgende informasjon: " . + "\n" . + "\nDitt brukernavn er: $row->username" . + "\nDitt passord er: $newPassword" . + "\n" . + "\nNår du logger på vil du bli bedt om å endre passord til noe som er lettere å huske. Du kan også endre brukernavnet ditt. " . + "\n" . + "\nEtter at dette er gjort vil du finne en link for registrering av fornyet medlemskap." . + "\n" . + "\nhttp://www.studentersamfundet.no/inside#login" . + "\n" . + "\nmvh" . + "\nStudentersamfundet"; + $headers = 'From: medlemskort@studentersamfundet.no' . "\r\n"; + if (mail($sendto, $subject, $message, $headers)) { + notify("Din epostadresse er registrert i systemet vårt."); + notify("En epost er sendt til deg med brukernavn og passord. Logg på for å registrere fornyelse av medlemskap."); + } else { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt " . "webansvarlig."); + } + } else { + notify("Ingen bruker er registrert på epostadressen du oppga. Bruk skjemaet under for å registrere deg."); + $GLOBALS['extraScriptParams']['page'] = 'register-user'; + } + } + + public function _logIn() { + $conn = db_connect(); + + $sql = sprintf("SELECT id, passwordReset FROM din_user " . + "WHERE username = %s " . + "AND password = PASSWORD(%s)", $conn->quoteSmart(scriptParam('username')), $conn->quoteSmart(scriptParam('password'))); + + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + $row = $result->fetchRow(DB_FETCHMODE_ASSOC); + $_SESSION['valid-user'] = $row['id']; + if ($row['passwordReset'] == 1) { + $GLOBALS['extraScriptParams']['page'] = "reset-password"; + } + } else { + notify("Problemer med innlogging."); + } + } + } + + public function _logOut() { + unset ($_SESSION['valid-user']); + session_destroy(); + notify("Du er nå logget ut. Logg inn på nytt eller gå videre til Studentersamfundets forside."); + } + + public function _registerJob() { + $job = new Job(NULL, $_REQUEST); + $job->store(); + } + + public function _updateJob() { + $jobId = scriptParam("jobid"); + $job = new JOb($jobId, $_REQUEST); + $job->store(); + } + + public function _deleteJob() { + Job :: delete(scriptParam("jobid")); + } + + public function _registerBarShift() { + $barshift = new BarShift(NULL, $_REQUEST); + $barshift->store(); + } + + public function _updateBarShift() { + $barshiftid = scriptParam("barshiftid"); + $barshift = new barshift($barshiftid, $_REQUEST); + $barshift->store(); + } + + public function _repeatBarShift() { + $barshiftid = scriptParam("barshiftid"); + $barshift = new BarShift($barshiftid); + $barshift->repeat($_REQUEST); + } + + public function _copyBarShift() { + $barshiftid = scriptParam("barshiftid"); + $barshift = new BarShift($barshiftid); + $barshift->copy($_REQUEST); + } + + public function _deleteBarShift() { + BarShift :: delete(scriptParam("barshiftid")); + } + + public function _registerBarShiftWorker() { + $barshift_id = scriptParam("barshiftid"); + $user_id = scriptParam("userid"); + $bsw = new BarShiftWorker($barshift_id, $user_id); + $bsw->store(); + } + + public function _registerBarShiftWorkerSelf() { + $barshift_id = scriptParam("barshiftid"); + $user_id = getCurrentUser(); + $GLOBALS['extraScriptParams']['action'] = "register-barshiftworker"; + $bsw = new BarShiftWorker($barshift_id, $user_id); + $bsw->store(); + } + + public function _deleteBarShiftWorker() { + BarShiftWorker :: delete(scriptParam("barshiftid"), scriptParam("userid")); + } + public function _registerDivision() { + $division = new Division(NULL, $_REQUEST); + $division->store(); + } + + public function _updateDivision() { + $divisionId = scriptParam("divisionid"); + $division = new Division($divisionId, $_REQUEST); + $division->store(); + } + + public function _deleteDivision() { + Division :: delete(scriptParam("divisionid")); + } + + public function _registerPosition() { + $position = new Position(NULL, $_REQUEST); + $position->store(); + } + + public function _updatePosition() { + $positionId = scriptParam("positionid"); + $position = new Position($positionId, $_REQUEST); + $position->store(); + } + + public function _deletePosition() { + Position :: delete(scriptParam("positionid")); + } + + public function _registerEvent() { + $event = new Event(NULL, $_REQUEST); + $event->store(); + } + + public function _updateEvent() { + $eventId = scriptParam("eventid"); + $event = new Event($eventId, $_REQUEST); + $event->store(); + } + + public function _repeatEvent() { + $eventId = scriptParam("eventid"); + $event = new Event($eventId); + $event->repeat($_REQUEST); + } + + public function _copyEvent() { + $eventId = scriptParam("eventid"); + $event = new Event($eventId); + $event->copy($_REQUEST); + } + + public function _deleteEvent() { + Event :: delete(scriptParam("eventid")); + } + + public function _registerEventComment() { + $eventComment = new EventComment(NULL, $_REQUEST); + $eventComment->store(); + } + + public function _updateEventComment() { + $eventCommentId = scriptParam("eventcommentid"); + $eventComment = new EventComment($eventCommentId, $_REQUEST); + $eventComment->store(); + } + + public function _deleteEventComment() { + EventComment :: delete(scriptParam("eventcommentid")); + } + + public function _registerConcert() { + $concert = new Concert(NULL, $_REQUEST); + $concert->store(); + } + + public function _updateConcert() { + $concertId = scriptParam("concertid"); + $concert = new Concert($concertId, $_REQUEST); + $concert->store(); + } + + public function _registerConcertReport() { + $report = new ConcertReport(NULL, $_REQUEST); + $report->store(); + } + + public function _updateConcertReport() { + $reportId = scriptParam("concertreportid"); + $report = new ConcertReport($reportId, $_REQUEST); + $report->store(); + } + + public function _repeatConcert() { + $concertId = scriptParam("concertid"); + $concert = new Concert($concertId); + $concert->repeat($_REQUEST); + } + + public function _copyConcert() { + $concertId = scriptParam("concertid"); + $concert = new Concert($concertId); + $concert->copy($_REQUEST); + } + + public function _deleteConcert() { + Concert :: delete(scriptParam("concertid")); + } + + public function _registerWeekProgram() { + $prog = new WeekProgram(NULL, $_REQUEST); + $prog->store(); + } + + public function _registerProgramSelection() { + $prog = new ProgramSelection(NULL, $_REQUEST); + $prog->store(); + } + + public function _updateProgramSelection() { + $id = scriptParam("programselectionid"); + $prog = new ProgramSelection($id, $_REQUEST); + $prog->store(); + } + + public function _uploadDocument() { + $document = new Document(); + $document->store($_FILES); + } + + public function _updateDocument() { + Document :: update($_REQUEST); + } + + public function _deleteDocument() { + Document :: delete(scriptParam("documentid")); + } + + public function _registerUser() { + $user = new User(NULL, $_REQUEST); + if ($user->id != -1) { + if ($user->store()) { + if (isset ($_REQUEST['nordea'])) { + $lead = Array ( + "firstname" => $user->firstname, + "lastname" => $user->lastname, + "email" => $user->email, + "phonenumber" => $user->phonenumber + ); + $nordea = new Nordea(NULL, $lead); + $nordea->store(); + } + + return true; + } + } + $GLOBALS['extraScriptParams']['page'] = "register-user"; + return false; + } + + public function _updateUser($onlyCurrentUser = false) { + $userId = scriptParam("userid"); + if ($onlyCurrentUser == true) { + if ($userId != getCurrentUser()) { + notify("Du har ikke tilgang til å endre denne brukeren."); + return false; + } + } + $user = new User($userId, $_REQUEST); + $user->store(); + } + + public function _deleteUser() { + User :: delete(scriptParam('userid')); + } + + public function _changeUsername($onlyCurrentUser = false) { + $userId = scriptParam("userid"); + if ($onlyCurrentUser == true) { + if ($userId != getCurrentUser()) { + notify("Du har ikke tilgang til å endre denne brukeren."); + return false; + } + } + $user = new User($userId); + $user->changeUsername(scriptParam("username"), scriptParam("password")); + } + + public function _registerMembership() { + $cardno = scriptParam("cardno"); + $password = scriptParam("verificationCode"); + if (checkPassword($cardno, $password)) { + $user = new User(scriptParam("userid")); + if ($user->cardno != NULL) { + $this->_renewMembership(); + return; + } + if ($user->registerMembership($cardno) == true) { + notify("Betalt medlemskap er registrert. Medlemskort vil bli produsert og sendt til din registrerte adresse."); + } else { + $GLOBALS['extraScriptParams']['page'] = "register-membership"; + } + } else { + notify("Kortnummer og kortkode passer ikke sammen. Kortnummeret er det som står på kodelappen, ikke det som står på medlemskortet ditt. Vi gjør også oppmerksom på det skilles mellom store og små bokstaver."); + $GLOBALS['extraScriptParams']['page'] = "register-membership"; + $GLOBALS['extraScriptParams']['report-bug'] = "register-membership"; + } + } + + public function _registerMembershipPayex() { + $user = new User(scriptParam("userid")); + $cardno = $user->cardno; + $expires = $user->expires; + if ($cardno == NULL) { + if (!$user->registerMembershipPayex()) { + return false; + } + } else { + if (!$user->renewMembershipPayex()) { + return false; + } + } + $payment = new Payment(NULL, $_POST); + if ($payment->status == "FAILURE") { + $GLOBALS['extraScriptParams']['page'] = "register-membership"; + if ($cardno == NULL) { + $user->setCardno("NULL"); + } + $user->setExpires($expires); + } else { + $GLOBALS['extraScriptParams']['page'] = "register-payex-transaction-confirm"; + $GLOBALS['extraScriptParams']['transactionid'] = $payment->transaction_id; + } + } + + public function _renewMembership() { + $cardno = scriptParam("cardno"); + $password = scriptParam("verificationCode"); + if ($cardno == "") { + notify("Du må taste inn et kortnummer."); + $GLOBALS['extraScriptParams']['page'] = "renew-membership"; + return false; + } + if (!validCardno($cardno)) { + notify("Aktiveringsnummeret er allerede registrert."); + $GLOBALS['extraScriptParams']['page'] = "renew-membership"; + return false; + } + if (checkPassword($cardno, $password)) { + $user = new User(scriptParam("userid")); + if ($user->renewMembership($cardno) == true) { + notify("Fornyelse av medlemskap er registrert. Nytt oblat vil bli sendt til din registrerte adresse."); + } else { + $GLOBALS['extraScriptParams']['page'] = "renew-membership"; + } + } else { + notify("Feil aktiveringskode. Kontroller koden og forsøk igjen. Vi gjør oppmerksom på at det er forskjell på store og små bokstaver."); + $GLOBALS['extraScriptParams']['page'] = "renew-membership"; + $GLOBALS['extraScriptParams']['report-bug'] = "renew-membership"; + } + } + + public function _cartCheckout() { + $order_id = scriptParam("order_id"); + $order = new Order($order_id); + if ($order->user_id != getCurrentUser()) { + notify("Ugyldig ordrenummer. Gå tilbake og prøv igjen."); + return; + } + + $payment = new Payment(); + $payment->executeRedirect(scriptParam('transaction_id_string'), $order_id); + } + + public function _transactionReturn() { + $orderRef = scriptParam('orderRef'); + $transaction_id = scriptParam('transactionid'); + $transaction = new Transaction($transaction_id); + $payment = new Payment(); + if ($payment->completeTransaction($orderRef, $transaction_id)) { + $order_id = $transaction->order_id; + $order = new Order($order_id); + $order->setStatus(4); + $order->performOperations(); + $GLOBALS['extraScriptParams']['page'] = "transaction-confirmation"; + $GLOBALS['extraScriptParams']['transactionid'] = $transaction_id; + } + } + + public function _payexTransaction() { + $payment = new Payment(NULL, $_POST); + if ($payment->status == "FAILURE") { + //notify("failure"); + } else { + //notify("success"); + $GLOBALS['extraScriptParams']['page'] = "transaction-confirmation"; + $GLOBALS['extraScriptParams']['transactionid'] = $payment->transaction_id; + } + } + + public function _payexTestTransaction() { + $payment = new Payment(NULL, $_POST); + } + + public function _cartAddProduct() { + $user = new User(getCurrentUser()); + $order_id = $user->getOrderId(); + if ($order_id == NULL) { + $order = new Order(); + $order->store(); + //$GLOBALS['extraScriptParams']["order_id"] = $order->id; + //@ setcookie(getCurrentUser() . "[order_id]", $order->id); + } else { + $order = new Order($order_id); + } + if ($order->addOrderItem($_POST)) { + notify("Produkt lagt i handlekurv."); + } + } + + public function _updateCart() { + $keys = array_keys($_POST); + foreach ($keys as $k) { + if (strstr($k, "orderitem")) { + $item_id = substr($k, 9); + $qty = $_POST[$k]; + if ($qty == 0) { + OrderItem :: delete($item_id); + } else { + $item = new OrderItem($item_id); + $item->setQuantity($qty); + + $comment = scriptParam("ordercomment$item_id"); + $item->setComment($comment); + } + } + } + notify("Handlekurven er oppdatert."); + } + + public function _deleteOrder() { + Order :: delete(scriptParam("order_id")); + } + + public function _grantCardno() { + $user = new User(scriptParam("userid")); + $user->grantCardno(); + } + + public function _updateUserHasCard() { + $user = new User(scriptParam("userid")); + $user->setHasCard(1); + } + + public function _updateUserDivisionRequest() { + $user = new User(scriptParam("userid")); + $user->updateDivisionRequest(scriptParam("divrequest")); + } + + public function _updateUserExpiry() { + $user = new User(scriptParam("userid")); + $user->updateExpiry(scriptParam("newExpiryDate")); + } + + public function _updateUserLastSticker() { + $user = new User(scriptParam("userid")); + $user->updateLastSticker(scriptParam("newExpiryDate")); + } + + public function _registerGroup() { + $groupId = scriptParam("groupid"); + $group = new Group($groupId, $_REQUEST); + $group->store(); + } + + public function _updateGroup() { + $groupId = scriptParam("groupid"); + $group = new Group($groupId, $_REQUEST); + $group->store($_POST); + } + + public function _deleteGroup() { + Group :: delete(scriptParam("groupid")); + } + + public function _registerAction() { + $actionId = scriptParam("actionid"); + $action = new Action($actionId, $_REQUEST); + $action->store(); + } + + public function _updateAction() { + $actionId = scriptParam("actionid"); + $action = new Action($actionId, $_REQUEST); + $action->store(); + } + + public function _deleteAction() { + Action :: delete(scriptParam("actionid")); + } + + public function _registerActionGroupRelationship() { + $actionId = scriptParam("actionid"); + $groupId = scriptParam("groupid"); + $rel = new ActionGroupRelationship($actionId, $groupId); + $rel->store(); + } + + public function _registerUserGroupRelationship() { + $userId = scriptParam("userid"); + $groupId = scriptParam("groupid"); + $users = scriptParam("users"); + if (!empty ($users)) { + $users = explode("\n", $users); + foreach ($users as $u) { + if (is_numeric(trim($u))) { + $userId = getUseridFromCardno($u); + } else { + $userId = getUseridFromEmail(trim($u)); + } + if ($userId != false) { + $rel = new UserGroupRelationship($userId, $groupId); + $rel->store(); + } + } + } else + if (!empty ($userId)) { + $rel = new UserGroupRelationship($userId, $groupId); + $rel->store(); + } + } + + public function _registerArticle() { + $article = new Article(NULL, $_REQUEST); + $article->store(); + } + + public function _updateArticle() { + $articleId = scriptParam("articleid"); + $article = new Article($articleId, $_REQUEST); + $article->store(); + } + + public function _deleteArticle() { + Article :: delete(scriptParam("articleid")); + } + + public function _deleteUserGroupRelationship() { + UserGroupRelationship :: delete(scriptParam("userid"), scriptParam("groupid")); + } + + public function _switchFormtype() { + if (isset ($_SESSION['formtype'])) { + $_SESSION['formtype'] = ($_SESSION['formtype'] == "fieldset") ? "table" : "fieldset"; + } else { + $_SESSION['formtype'] = "table"; + } + $url = $_SERVER['HTTP_REFERER']; + + $pos = strpos($url, "action"); + if ($pos === false) { + header("Location: $url"); + } + } + + public function _switchTinyMCETheme() { + if (isset ($_SESSION['tinyMCE']['theme'])) { + $_SESSION['tinyMCE']['theme'] = ($_SESSION['tinyMCE']['theme'] == "simple") ? "advanced" : "simple"; + } else { + $_SESSION['tinyMCE']['theme'] = "simple"; + } + $url = $_SERVER['HTTP_REFERER']; + + $pos = strpos($url, "action"); + if ($pos === false) { + header("Location: $url"); + } + } + public function _registerDocumentCategory() { + $docCat = new DocumentCategory(NULL, $_REQUEST); + $docCat->store(); + } + + public function _updateDocumentCategory() { + $documentCategory = new DocumentCategory(scriptParam("documentcategoryid"), $_REQUEST); + $documentCategory->store(); + } + + public function _deleteDocumentCategory() { + DocumentCategory :: delete(scriptParam("documentcategoryid")); + } + + public function _registerEventCategory() { + $eventCat = new EventCategory(NULL, $_REQUEST); + $eventCat->store(); + } + + public function _updateEventCategory() { + $eventCategory = new EventCategory(scriptParam("eventcategoryid"), $_REQUEST); + $eventCategory->store(); + } + + public function _deleteEventCategory() { + EventCategory :: delete(scriptParam("eventcategoryid")); + } + + public function _registerJobCategory() { + $jobCat = new JobCategory(NULL, $_REQUEST); + $jobCat->store(); + } + + public function _updateJobCategory() { + $jobCategory = new JobCategory(scriptParam("jobcategoryid"), $_REQUEST); + $jobCategory->store(); + } + + public function _deleteJobCategory() { + JobCategory :: delete(scriptParam("jobcategoryid")); + } + + public function _registerProduct() { + $product = new Product(NULL, $_REQUEST); + $product->store(); + } + + public function _updateProduct() { + $product = new Product(scriptParam("productid"), $_REQUEST); + $product->store(); + } + + public function _deleteProduct() { + Product :: delete(scriptParam("productid")); + } + + public function _registerBugReport() { + $bug = new BugReport(NULL, $_REQUEST); + $bug->store(); + } + + public function _updateBugReportStatus() { + $bug = new BugReport(scriptParam("bugreportid"), NULL); + $bug->setStatus($_REQUEST); + } + + public function _deleteBugReport() { + BugReport :: delete(scriptParam("bugreportid")); + } + +} +?> \ No newline at end of file diff --git a/inside/Actions.php b/inside/Actions.php new file mode 100644 index 0000000..bb58652 --- /dev/null +++ b/inside/Actions.php @@ -0,0 +1,56 @@ +__construct(); + } + + function __construct(){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("Actions: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + + $sql = "SELECT id, name + FROM din_action + ORDER BY name ASC"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->actions = $result; + }else { + error($result->toString()); + } + } + + public function getList(){ + return $this->actions; + } + + public function displayList($limit = 25){ + if ($this->actions->numRows() > 0){ +?> + + + + + + +actions->fetchRow(DB_FETCHMODE_OBJECT)){ + $action = new Action($row->id); + $action->displayList(); + } + print("
    handlingbeskrivelse 
    "); + }else { + print("

    Ingen handlinger registrert.

    "); + } + } + +} +?> \ No newline at end of file diff --git a/inside/Article.php b/inside/Article.php new file mode 100644 index 0000000..9632647 --- /dev/null +++ b/inside/Article.php @@ -0,0 +1,270 @@ +conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New article + if ($data == NULL){ + error('Article: No data supplied.'); + }else { + $this->author = getCurrentUserName(); + $this->updated_by = getCurrentUserName(); + + + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + $this->updated_by = getCurrentUserName(); + + //primary attachment + if($_FILES['attachment1']['error'] != 4){ + $temp_name = new_file($_FILES['attachment1'], 'nyheter'); + rename_file($temp_name, $this->id, 'nyheter'); + $this->attachment1 = $this->id.substr($temp_name, -4); + }else { + $this->attachment1 = 0; + } + + //secondary attachment + if($_FILES['attachment2']['error'] != 4){ + $temp_name = new_file($_FILES['attachment2'], 'nyheter'); + rename_file($temp_name, $this->id.'_2', 'nyheter'); + $this->attachment2 = $this->id.'_2'.substr($temp_name, -4); + }else { + $this->attachment2 = 0; + } + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->date = $data['date']; + $this->attachment1 = $data['attachment1']; + $this->attachment2 = $data['attachment2']; + $this->author = $data['author']; + $this->updated_by = $data['updated_by']; + $this->updated_at = $data['updated_at']; + } + } + //Common initializations + $this->title = $data['title']; + $this->intro = stripcslashes($data['intro']); + $this->text = stripcslashes($data['text']); + $this->caption1 = $data['caption1']; + $this->caption2 = $data['caption2']; + $this->expires = $data['expires']; + } + + public function store(){ + if ($this->id == NULL){ + $this->id = getNextId("nyhet"); + $sql = "INSERT INTO nyhet VALUES " . + " (%s, %s, %s, %s, '', %s, '', %s, NOW(), %s, %s, NOW(), %s)"; + $sql = sprintf($sql, + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->caption1), + $this->conn->quoteSmart($this->caption2), + $this->conn->quoteSmart($this->author), + $this->conn->quoteSmart($this->updated_by), + $this->conn->quoteSmart($this->expires) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + + //primary attachment + if($_FILES['attachment1']['error'] != 4){ + $temp_name = new_file($_FILES['attachment1'], 'nyheter'); + rename_file($temp_name, $this->id, 'nyheter'); + $this->attachment1 = $this->id.substr($temp_name, -4); + }else { + $this->attachment1 = 0; + } + + //secondary attachment + if($_FILES['attachment2']['error'] != 4){ + $temp_name = new_file($_FILES['attachment2'], 'nyheter'); + rename_file($temp_name, $this->id.'_2', 'nyheter'); + $this->attachment2 = $this->id.'_2'.substr($temp_name, -4); + }else { + $this->attachment2 = 0; + } + $this->_storeFilenames(); + + $GLOBALS['extraScriptParams']['articleid'] = $this->id; + notify("Nyhet er lagret."); + }else { + error("New article: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE nyhet SET + tittel = %s, + ingress = %s, + tekst = %s, + utgar = %s, + caption1 = %s, + caption2 = %s, + sistEndretAv = %s, + sistEndret = NOW() + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->expires), + $this->conn->quoteSmart($this->caption1), + $this->conn->quoteSmart($this->caption2), + $this->conn->quoteSmart($this->updated_by), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Nyhet oppdatert."); + $this->_storeFilenames(); + }else { + error("New event: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT " . + " tittel AS title, ". + " ingress AS intro, ". + " tekst AS text, ". + " vedlegg AS attachment1, ". + " caption1, ". + " vedlegg2 AS attachment2, ". + " caption2, ". + " dato AS date, ". + " forfatter AS author, ". + " sistEndretAv AS updated_by, ". + " sistEndret AS updated_at, ". + " utgar AS expires " . + "FROM nyhet WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Articles: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM nyhet + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Nyhet slettet."); + }else { + error($result->toString()); + } + } + + public function display(){ +?> +
    +id, ARTICLE, "article", "view-edit-options-article"); + + print('
    '); + if ($this->attachment1 != 0){ + print('
    '); + print(''); + print(''.$this->caption1.''); + print('
    '); + } + + if ($this->attachment2 != 0){ + print('
    '); + print(''); + print(''.$this->caption2.''); + print('
    '); + } + print('
    '); + + + //$text = str_replace("[img2]", $this->_text_insert_attachment($this->attachment2, $this->caption2), $this->text); + $text = str_replace('[img2]', '', $this->text); + +?> +

    title; ?>

    +

    date); ?>

    + +

    intro); ?>

    +

    + + + + title; ?> + intro); ?> + author; ?> + date, "td"); ?> + expires, "td"); ?> + id, ARTICLE, "article", "view-edit-options-article"); ?> + + + +  '; + if (!empty($caption)){ + $string .= ''.$caption.''; + } + $string .= "
    \n"; + } + return $string; + } + + private function _storeFilenames() { + if ($this->attachment1 != 0) { + $sql = "UPDATE nyhet SET vedlegg = '$this->attachment1' WHERE id = $this->id"; + $result = $this->conn->query($sql); + } + if ($this->attachment2 != 0) { + $sql = "UPDATE nyhet SET vedlegg2 = '$this->attachment2' WHERE id = $this->id"; + $result = $this->conn->query($sql); + } + } +} + +?> \ No newline at end of file diff --git a/inside/Articles.php b/inside/Articles.php new file mode 100644 index 0000000..45c6bd9 --- /dev/null +++ b/inside/Articles.php @@ -0,0 +1,49 @@ +conn = db_connect(); + } + + public function displayList($limit = 25){ + $sql = "SELECT id + FROM nyhet + ORDER BY dato DESC LIMIT $limit"; + if ($this->conn == false){ + return false; + } + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ + print("

    Antall treff: ".$result->numRows()."

    "); +?> + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $article = new Article($row['id']); + $article->displayList(); + } + print("
    tittelintroforfatterpublisertutgår 
    "); + }else { + print("

    Ingen nyheter er registrert.

    "); + } + }else { + error("Articles: " . $result->toString()); + } + } +} + + +?> \ No newline at end of file diff --git a/inside/BarShift.php b/inside/BarShift.php new file mode 100644 index 0000000..64c2711 --- /dev/null +++ b/inside/BarShift.php @@ -0,0 +1,442 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New BarShift + if ($data == NULL){ + error("BarShift: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->location_name = $data['location_name']; + } + } + //Common initializations + $this->date = $data['date']; + $this->start = formatTime($data['start']); + $this->end = formatTime($data['end']); + $this->location_id = $data['location_id']; + $this->title = $data['title']; + $this->num_workers = (is_numeric($data['num_workers']))? $data['num_workers'] : 0; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId("din_barshift"); + $sql = sprintf("INSERT INTO din_barshift + (id, date, location_id, start, end, num_workers, title) + VALUES + (%s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->date), + $this->conn->quoteSmart($this->location_id), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->num_workers), + $this->conn->quoteSmart($this->title) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['barshiftid'] = $this->id; + $sql = sprintf("INSERT INTO din_barshiftupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart(scriptParam('barshiftid')), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Bar shift registered.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Ny barvakt er registert."); + }else { + $this->conn->rollback(); + error("New Bar Shift: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New Bar Shift: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New Bar Shift: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_barshift SET + date = %s, + location_id = %s, + start = %s, + end = %s, + num_workers = %s," . + " title = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->date), + $this->conn->quoteSmart($this->location_id), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->num_workers), + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $sql = sprintf("INSERT INTO din_barshiftupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Bar shift updated.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Barvakt oppdatert."); + }else { + $this->conn->rollback(); + error("New BarShift: " . $result->toString()); + } + }else { + error("Update BarShift: " . $result->toString()); + } + }else { + error("Update BarShift: " . $result->toString()); + } + } + } + + public function repeat($data){ + $frequency = $data['frequency']; + $count = $data['count']; + for ($i = 0; $i < $count; $i++){ + $id = getNextId("din_barshift"); + $date = get_repeat_date($this->date, $i + 1, $frequency); + $sql = sprintf("INSERT INTO din_barshift + (id, date, location_id, start, end, num_workers, title) + VALUES + (%s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart($date), + $this->conn->quoteSmart($this->location_id), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->num_workers), + $this->conn->quoteSmart($this->title) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $sql = sprintf("INSERT INTO din_barshiftupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Bar shift registered (repeat).") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Barvakt repetert."); + }else { + $this->conn->rollback(); + error("New BarShift: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New BarShift: " . $result->toString()); + } + }else { + error("New BarShift: " . $result->toString()); + } + } + } + + public function copy($data){ + $id = getNextId("din_barshift"); + $sql = sprintf("INSERT INTO din_barshift + (id, date, location_id, start, end, num_workers, title) + VALUES + (%s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart($data['new-date']), + $this->conn->quoteSmart($this->location_id), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->num_workers), + $this->conn->quoteSmart($this->title) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $sql = sprintf("INSERT INTO din_barshiftupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Bar shift registered (copy).") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Barvakt kopiert."); + $GLOBALS['extraScriptParams']['barshiftid'] = $id; + }else { + $this->conn->rollback(); + error("New BarShift: " . $result->toString()); + } + } + }else { + notify("Problemer med kopiering av barvakt."); + error("New BarShift: " . $result->toString()); + } + } + + + public function _retrieveData(){ + $sql = "SELECT b.*, l.navn AS location_name + FROM din_barshift b, lokaler l " . + "WHERE b.id = $this->id + AND b.location_id = l.id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("BarShifts: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_barshift + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Barvakt slettet."); + if (scriptParam("barshift-overview") != "") { + $GLOBALS['extraScriptParams']['page'] = scriptParam("barshift-overview"); + } + }else { + error($result->toString()); + notify("Barvakten kan ikke slettes. Dette er en feil. Vennligst rapporter problemet med skjemaet under:"); + reportBug("delete-barshift"); + } + } + + public function display(){ +?> +
    +id, BARSHIFT, "barshift", "view-edit-options-barshift"); +?> +

    title." - ". $this->location_name; ?>

    +

    date); ?>

    +

    start." - ".$this->end; ?>

    +

    _getSumWorkers()." av ".$this->num_workers." vakter er dekket."; ?>

    + getList(13);//13 == Tappetårnet + + $userid = scriptParam("userid"); + if ($userid != ""){ + $cur = $userid; + }else { + $cur = getCurrentUser(); + } + + $title = "register bar shift worker"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-barshiftworker&page=display-barshift"; + $fields = Array(Array("label" => "barshiftidid", "type" => "hidden", + "attributes" => Array("name" => "barshiftid", "value" => "$this->id")), + Array("label" => "sett opp", "type" => "select", + "attributes" => Array("name" => "userid", "values" => $userList, + "currentValue" => $cur)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + } + + $this->_displayWorkerList(); + + if (checkAuth("view-register-barshift")){ + ?>

    Repetisjon og kopiering kopierer bare informasjon om vakten, ikke de som er satt opp på vakt.

    "daily", "title" => "daglig"), + Array("id" => "weekly", "title" => "ukentlig"), + Array("id" => "biweekly", "title" => "annenhver uke"), + Array("id" => "monthlyDate", "title" => "månedlig"), + Array("id" => "annual", "title" => "årlig") + ); + + $title = "repeat bar shift"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=repeat-barshift&page=display-barshift"; + $fields = Array(Array("label" => "barshiftidid", "type" => "hidden", + "attributes" => Array("name" => "barshiftid", "value" => "$this->id")), + Array("label" => "gjenta vakt", "type" => "select", + "attributes" => Array("name" => "frequency", "values" => $freqOptions, + "value" => $freqOptions[0])), + Array("label" => "antall ganger", "type" => "text", + "attributes" => Array("name" => "count", "size" => 3, "maxlength" => 3, + "value" => 0)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + + $title = "copy bar shift"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=copy-barshift&page=display-barshift"; + $fields = Array(Array("label" => "barshiftid", "type" => "hidden", + "attributes" => Array("name" => "barshiftid", "value" => "$this->id")), + Array("label" => "kopier til", "type" => "date", + "attributes" => Array("name" => "new-date", "value" => "$this->date")) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + } + + ?> +
    + +_getSumWorkers(); + + ?> + = $this->num_workers) print 'class="barshift-full"'; ?>> + title; ?> + location_name; ?> + date, "td"); ?> + start); ?> + end); ?> + num_workers; ?> + id, BARSHIFT, "barshift", "view-edit-options-barshift"); + } ?> + + +_getSumWorkers(); + if ($this->barShiftIsFull()){ + $full = "full"; + }else { + $full = "not-full"; + } + ?> + +
    +

    start." - ".$this->end." (".$this->_getSumWorkers()."/".$this->num_workers.")";?>

    +

    + title." - ".$this->location_name; ?> + + +

    + displayCalendarListByBarshift($this->id); + + if (!$this->_getIsUserWorking(getCurrentUser())){?> + + sett opp meg! + + + +
    +displayListByBarshift($this->id); + } + + + public + function _getSumWorkers(){ + if (!empty($this->sum_workers)) { + return $this->sum_workers; + } + $sql = "SELECT COUNT(*) AS workers " . + "FROM din_barshiftworker " . + "WHERE barshift_id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $this->sum_workers = $row->workers; + return $row->workers; + } + }else { + error($result->toString()); + } + } + + public + function _getIsUserWorking($user_id){ + $sql = "SELECT user_id " . + "FROM din_barshiftworker " . + "WHERE barshift_id = $this->id " . + "AND user_id = $user_id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ + return true; + } + }else { + error($result->toString()); + } + return false; + } + + public + function barShiftIsFull(){ + if ($this->_getSumWorkers() >= $this->num_workers) { + return true; + } + return false; + } +} +?> \ No newline at end of file diff --git a/inside/BarShiftWorker.php b/inside/BarShiftWorker.php new file mode 100644 index 0000000..413665a --- /dev/null +++ b/inside/BarShiftWorker.php @@ -0,0 +1,101 @@ +__construct($barshift_id, $user_id); + } + public function __construct($barshift_id = NULL, $user_id = NULL){ + $this->conn = DB_connect(); + + $this->barshift_id = $barshift_id; + $this->user_id = $user_id; + $action = scriptParam("action"); + + if ($action == "register-barshiftworker"){ + + }else { + $data = $this->_retrieveData(); + $this->barshift_title= $data['barshift_title']; + $this->user_name = $data['user_name']; + $this->registered = $data['registered']; + } + } + + public function store(){ + $action = scriptParam("action"); + if ($action == "register-barshiftworker"){ + $sql = sprintf("INSERT INTO din_barshiftworker + (barshift_id, user_id, registered) + VALUES + (%s, %s, NOW())", + $this->conn->quoteSmart($this->barshift_id), + $this->conn->quoteSmart($this->user_id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Barvakt er registrert."); + }else { + $user = new User($this->user_id); + notify("$user->firstname $user->lastname er allerede satt opp på denne vakten."); + error("New barshiftworker: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT bsw.*, b.title AS barshift_title, CONCAT(u.firstname, ' ', u.lastname) AS user_name + FROM din_barshiftworker bsw, din_barshift b, din_user u + WHERE bsw.barshift_id = $this->barshift_id + AND bsw.user_id = $this->user_id + AND bsw.barshift_id = b.id + AND bsw.user_id = u.id"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("BarShiftWorkers: " . $result->toString()); + } + } + + public + function delete($barshift_id, $user_id){ + $conn = db_connect(); + $sql = "DELETE FROM din_barshiftworker + WHERE barshift_id = $barshift_id + AND user_id = $user_id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Oppsatt barvakt slettet."); + }else { + error($result->toString()); + } + } + + public function displayList(){ + ?> + + barshift_name; ?> + user_name; ?> + + + \ No newline at end of file diff --git a/inside/BarShiftWorkers.php b/inside/BarShiftWorkers.php new file mode 100644 index 0000000..238f82c --- /dev/null +++ b/inside/BarShiftWorkers.php @@ -0,0 +1,120 @@ +__construct(); + } + + function __construct(){ + $this->conn = DB_connect(); + } + + public + function _getListByUser($user_id){ + $sql = "SELECT * FROM din_barshiftworker " . + "WHERE user_id = $user_id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + return $result; + }else { + error("BarShiftWorkers: " . $result->toString()); + } + } + + public + function _getListByBarShift($barshift_id){ + $sql = "SELECT * FROM din_barshiftworker " . + "WHERE barshift_id = $barshift_id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + return $result; + }else { + error("BarShiftWorkers: " . $result->toString()); + } + } + + public + function displayListByUser($user_id){ + $list = $this->_getListByUser($user_id); + + if ($result->numRows() > 0){ + $user = new User($user_id); +?> +

    Vakter for firstname." ".$user->lastname; ?>

    + + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $barshift = new BarShift($row['id']); + $barshift->displayList(); + } + print("
    tittelsteddatostartsluttledige 
    "); + }else { + print("

    Ingen vakter registrert.

    "); + } + } + + public + function displayListByBarShift($barshift_id){ + $list = $this->_getListByBarShift($barshift_id); + + if ($list->numRows() > 0){ +?> +

    På jobb:

    + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->user_id); + ?> + + + + + $barshift_id, "user_id" => $user->id), BARSHIFTWORKER, "barshiftworker", "view-edit-options-barshiftworker", false, "barshift"); + }?> + + "); + } + } + + public + function displayCalendarListByBarShift($barshift_id){ + $list = $this->_getListByBarShift($barshift_id); + + if ($list->numRows() > 0){ + print('
      '); + while ($row =& $list->fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->user_id); + print "
    • ".$user->firstname." ".$user->lastname." - ".formatPhone($user->phonenumber)."
    • "; + } + print("
    "); + } + } +} +?> \ No newline at end of file diff --git a/inside/BarShifts.php b/inside/BarShifts.php new file mode 100644 index 0000000..a6047d3 --- /dev/null +++ b/inside/BarShifts.php @@ -0,0 +1,65 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getListMonth($year, $month){ + $nextMonth = date("Y-m", strtotime("+1 month", strtotime("$year-$month-01"))); + $sql = "SELECT id, title, DAYOFMONTH(date) AS date, num_workers + FROM din_barshift + WHERE date >= '$year-$month-01' + AND date < '$nextMonth-01' + ORDER BY date, start ASC"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("BarShifts: " . $result->toString()); + } + } + + public function displayList($selection = "0000-00-00"){ + $sql = "SELECT id FROM din_barshift + WHERE date >= $selection + ORDER BY date, start ASC"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ +?> +

    Antall vakter: numRows(); ?>

    +
    navntelefonregistrert 
    firstname." ".$user->lastname; ?>phonenumber); ?>registered); ?>
    + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $barshift = new BarShift($row['id']); + $barshift->displayList(); + } + print("
    tittelsteddatostartsluttstatus 
    "); + }else { + print("

    Ingen vakter registrert.

    "); + } + }else { + error("BarShifts: " . $result->toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/BugReport.php b/inside/BugReport.php new file mode 100644 index 0000000..73acb60 --- /dev/null +++ b/inside/BugReport.php @@ -0,0 +1,219 @@ +__construct($id, $data); + } + + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + $this->id = $id; + + if ($id == NULL){//New job + if ($data == NULL){ + error("Bugreport: No data supplied."); + }else { + + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->date = $data['date']; + $this->active = $data['active']; + $this->status_comment = stripcslashes($data['status_comment']); + } + } + //Common initializations + $this->title = stripcslashes($data['title']); + $this->comment = $data['comment']; + $this->type = $data['type']; + $this->filename = $data['filename']; + $this->query = $data['query']; + $this->referer = $data['referer']; + $this->useragent = $data['useragent']; + $this->user_id = $data['user_id']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId("din_bugreport"); + $sql = sprintf("INSERT INTO din_bugreport VALUES + (%s, NOW(), %s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->type), + $this->conn->quoteSmart($this->filename), + $this->conn->quoteSmart($this->query), + $this->conn->quoteSmart($this->referer), + $this->conn->quoteSmart($this->useragent), + $this->conn->quoteSmart($this->user_id), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->title) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['bugreportid'] = $this->id; + if ($this->conn->commit()){ + notify("Feilmelding er registrert."); + }else { + $this->conn->rollback(); + error("New bug report: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New bug report: " . $result->toString()); + } + } else { + $sql = sprintf("UPDATE din_bugreport SET + title = %s, + comment = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Feilmelding oppdatert."); + }else { + $this->conn->rollback(); + error("Update bug report: " . $result->toString()); + } + }else { + error("Update bug report: " . $result->toString()); + } + } + } + + public + function setStatus($data) { + $sql = sprintf("UPDATE din_bugreport SET + active = %s, + status_comment = %s + WHERE + id = %s", + $this->conn->quoteSmart($data['active']), + $this->conn->quoteSmart($data['status_comment']), + $this->conn->quoteSmart($this->id) + ); + $result =& $this->conn->query($sql); + + if (DB::isError($result) == true){ + error("Bug report-status: " . $result->toString()); + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_bugreport dc + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Bug report: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_bugreport + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Feilmelding slettet."); + }else { + error($result->toString()); + } + } + + public + function displayList(){ + $user = new User($this->user_id); + ?> + + title; ?> + comment); ?> + firstname $user->lastname"; ?> + + +
    +id, BUGREPORT, "bugreport", "view-edit-options-bugreport", false); + ?> +

    Feilmelding: title; ?>

    +

    Kommentar:

    +

    comment); ?>

    +

    Registrert: date; ?>

    +

    Fil: filename; ?>

    +

    Query: query ;?>

    +

    URL: referer ;?>

    +

    Nettleser: useragent ;?>

    + user_id); + ?> +

    Bruker: + firstname $user->lastname";?>

    + + 0, "title" => "avsluttet"), + Array("id" => 1, "title" => "åpen") + ); + + + $title = "status på feilmeldingen"; + $id = "bugreport-comment"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-bugreport-status&page=display-bugreport"; + $fields = Array(); + + $fields[] = Array("label" => "bugreportid", "type" => "hidden", + "attributes" => Array("name" => "bugreportid", "value" => $this->id)); + + $fields[] = Array("label" => "status", "type" => "select", + "attributes" => Array("name" => "active", "values" => $statuses, + "currentValue" => $this->active)); + + $fields[] = Array("label" => "kommentar", "type" => "textarea", + "attributes" => Array("name" => "status_comment", + "value" => $this->status_comment, + "rows" => 7, "cols" => 50)); + + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display(); + ?> +
    + \ No newline at end of file diff --git a/inside/BugReports.php b/inside/BugReports.php new file mode 100644 index 0000000..09d5948 --- /dev/null +++ b/inside/BugReports.php @@ -0,0 +1,58 @@ +__construct($selection); + } + + function __construct($selection = "all"){ + $this->conn =& db_connect(); + + switch ($selection) { + case "all": + $cond = ""; + break; + + case "new": + $cond = "WHERE active = 1"; + break; + + case "old": + $cond = "WHERE active != 1"; + + default: + $cond = ""; + } + $sql = "SELECT id FROM din_bugreport $cond"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->bugs = $result; + } + } + + public + function getList(){ + return $this->bugs; + } + + public + function displayList(){ + ?> + + + + + + +bugs->fetchRow(DB_FETCHMODE_OBJECT)){ + $bug = new BugReport($row->id); + $bug->displayList(); + } + print("
    titlecommentuser
    "); + } +} +?> \ No newline at end of file diff --git a/inside/Calendar.php b/inside/Calendar.php new file mode 100644 index 0000000..770710d --- /dev/null +++ b/inside/Calendar.php @@ -0,0 +1,210 @@ +__construct($type); + } + + public function __construct($type){ + $this->type = $type; + } + + public function display($year, $month){ + $previousYear = $year -1 . $month; + $previousMonth = date("Ym", strtotime("-1 month", strtotime("$year-$month-01"))); + $nextMonth = date("Ym", strtotime("+1 month", strtotime("$year-$month-01"))); + $nextYear = $year +1 . $month; + + $fDate = "$year-$month-01"; + switch ($this->type){ + case 'events': + $events = new Events(); + $list = $events->getListMonth($year, $month); + break; + + case 'concerts': + $concerts = new Concerts(); + $list = $concerts->getListMonth($year, $month); + break; + + case 'all': + $endMonth = date("Y-m", strtotime("+1 month", strtotime("$year-$month-01"))); + $sql = "SELECT id, name, DAYOFMONTH(time) AS date, 'event' AS type, time + FROM din_event + WHERE time >= '$year-$month-01' + AND time < '$endMonth-01' + UNION " . + "SELECT id, tittel AS name, DAYOFMONTH(tid) AS date, 'concert' AS type, tid AS time + FROM program + WHERE tid >= '$year-$month-01' + AND tid < '$endMonth-01' + ORDER BY time ASC"; + $conn = db_connect(); + $list =& $conn->query($sql); + break; + + case 'barshifts': + $barshifts = new BarShifts(); + $list = $barshifts->getListMonth($year, $month); + break; + + default: + return; + } + + $dayOfWeek = date("w", strtotime("$year-$month-01")); + if ($dayOfWeek == "0"){ + $dayOfWeek = 7; + } + $lastDayOfMonth = date("t", strtotime("$year-$month-01")); + $weekNumber = date("W", strtotime("$year-$month-01")); + +?> +
    + + +

    +
    + _displayCalendarOptions(); ?> + + + + + + + + + + + + + + +fetchRow(DB_FETCHMODE_ORDERED); + while ($date <= $lastDayOfMonth){ + printOpenActiveDay($date); + while ($row != NULL && $row[2] == $date){ + switch ($this->type){ + case 'events': +?> +
    + + + + +
    + +
    + + + + +
    + +
    + + + +
    +displayCalendar($year, $month); + break; + + } + $row = $list->fetchRow(DB_FETCHMODE_ORDERED); + } + printCloseActiveDay(); + $date++; + if ($i++ % 7 == 1){ + $weekNumber = date("W", strtotime("$year-$month-$date")); + print(""); + } + } + + $date = 1; + while ($i++ % 7 != 1){ + printPassiveDay($date++); + } + printPassiveDay($date++); + +?> + + +
    UkeMandagTirsdagOnsdagTorsdagFredagLørdagSøndag
    ".$weekNumber."
    +type){ + case 'events': + break; + + case 'concerts': + break; + + case 'all': + ?> +
    +
    + +
    + +
    +
    +
    + \ No newline at end of file diff --git a/inside/Categories.php b/inside/Categories.php new file mode 100644 index 0000000..255889e --- /dev/null +++ b/inside/Categories.php @@ -0,0 +1,35 @@ +toString()); + exit(); + }else { + $this->conn = $conn; + } + + $sql = "SELECT id, title FROM tf_article_category"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->categories = $result; + } + } + + public function getCategories(){ + return $this->categories; + } + +} +?> \ No newline at end of file diff --git a/inside/Concert.php b/inside/Concert.php new file mode 100644 index 0000000..d51c932 --- /dev/null +++ b/inside/Concert.php @@ -0,0 +1,646 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect("dns"); + + $this->id = $id; + + if ($id == NULL){//New concert + if ($data == NULL){ + notify("Concert: No data supplied."); + } else { + if (isset ($data['user_id_responsible'])) { + $this->user_id_responsible = $data['user_id_responsible']; + + if ($user = new User($this->user_id_responsible)) { + $this->user_name_responsible = $user->firstname . " " . $user->lastname; + $this->user_phone_responsible = $user->phonenumber; + $this->user_email_responsible = $user->email; + } + } + $this->links = $data['links']; + } + }else {//ID set, existing concert + if ($data != NULL){//UPDATE + if($_FILES['userfile']['error'] != 4){ + $temp_name = new_file($_FILES['userfile'], "program"); + rename_file($temp_name, $this->id, "program"); + $this->picture = $this->id.substr($temp_name, -4); + } else { + $this->picture = $data['picture'];; + } + $this->links = $data['links']; + }else {//RETRIEVE + $data = $this->_retrieveData(); + $this->venue_name = $data['venue_name']; + $this->host_name = $data['host_name']; + $this->picture = $data['picture']; + } + } + //Common initializations + $this->name = stripslashes($data['name']); + $this->intro = stripslashes($data['intro']); + $this->text = stripslashes($data['text']); + $this->name_en = stripslashes($data['name_en']); + $this->intro_en = stripslashes($data['intro_en']); + $this->text_en = stripslashes($data['text_en']); + $this->host_id = $data['host_id']; + $this->time = substr($data['time'], 0, 16); + $this->concertcategory_id = $data['concertcategory_id']; + $this->venue_id = $data['venue_id']; + $this->comment = stripslashes($data['comment']); + $this->priceNormal = $data['priceNormal']; + $this->priceConcession = $data['priceConcession']; + $this->ticketLink = $data['ticketLink']; + $this->facebookLink = $data['facebookLink']; + $this->user_name_ext_contact = $data['user_name_ext_contact']; + $this->user_phone_ext_contact = $data['user_phone_ext_contact']; + $this->user_email_ext_contact = $data['user_email_ext_contact']; + $this->user_role_ext_contact = $data['user_role_ext_contact']; + + if (isset($data['viewWeekprogram'])) { + $this->viewWeekprogram = $data['viewWeekprogram']; + } else { + $this->viewWeekprogram = 1; + } + + if (isset($data['needPosters'])) { + $this->needPosters = ($data['needPosters'] == 'poster-true')? 'Ja' : 'Nei'; + } else { + $this->needPosters = 'Nei'; + } + } + + public + function store(){ + if ($this->id == NULL){ + if (!$this->_validate()){ + $GLOBALS['extraScriptParams']['page'] = "register-concert"; + return false; + } + $this->id = getNextId("program"); + if($_FILES['userfile']['error'] != 4){ + $temp_name = new_file($_FILES['userfile'], "program"); + rename_file($temp_name, $this->id, "program"); + $this->picture = $this->id.substr($temp_name, -4); + } else { + $this->picture = "0"; + } + $sql = sprintf("INSERT INTO program + (id, tittel, tittel_en, ingress, ingress_en, type, arr, tid, tekst, tekst_en, kommentar, + sted, vpris, mpris, billett, ansv, ansv_tlf, ansv_epost, + ekst_navn, ekst_tlf, ekst_epost, ekst_rolle, plakat_behov, vedlegg, linker, facebook, visUkeprogram) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, + %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, '%s')", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->name_en), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->intro_en), + $this->conn->quoteSmart($this->concertcategory_id), + $this->conn->quoteSmart($this->host_id), + $this->conn->quoteSmart($this->time), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->text_en), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->venue_id), + $this->conn->quoteSmart($this->priceNormal), + $this->conn->quoteSmart($this->priceConcession), + $this->conn->quoteSmart($this->ticketLink), + $this->conn->quoteSmart($this->user_name_responsible), + $this->conn->quoteSmart($this->user_phone_responsible), + $this->conn->quoteSmart($this->user_email_responsible), + $this->conn->quoteSmart($this->user_name_ext_contact), + $this->conn->quoteSmart($this->user_phone_ext_contact), + $this->conn->quoteSmart($this->user_email_ext_contact), + $this->conn->quoteSmart($this->user_role_ext_contact), + $this->conn->quoteSmart($this->needPosters), + $this->conn->quoteSmart($this->picture), + $this->conn->quoteSmart($this->links), + $this->conn->quoteSmart($this->facebookLink), + "1" + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Nytt arrangement er registrert."); + $GLOBALS['extraScriptParams']['concertid'] = $this->id; + }else { + error("New concert: " . $result->toString()); + notify("Problemer med registrering av konsert."); + } + } else { + if (!$this->_validate()){ + $GLOBALS['extraScriptParams']['page'] = "edit-concert"; + return false; + } + $sql = sprintf("UPDATE program SET + tittel = %s, + tittel_en = %s, + ingress = %s, + ingress_en = %s, + type = %s, + arr = %s, + tid = %s, + tekst = %s, + tekst_en = %s, + kommentar = %s, + sted = %s, + vpris = %s, + mpris = %s, + billett = %s, + facebook = %s, + ansv = %s, + ansv_tlf = %s, + ansv_epost = %s, + ekst_navn = %s, + ekst_tlf = %s, + ekst_epost = %s, + ekst_rolle = %s, + plakat_behov = %s, + linker = %s, + vedlegg = %s, + visUkeprogram = '%s' + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->name_en), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->intro_en), + $this->conn->quoteSmart($this->concertcategory_id), + $this->conn->quoteSmart($this->host_id), + $this->conn->quoteSmart($this->time), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->text_en), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->venue_id), + $this->conn->quoteSmart($this->priceNormal), + $this->conn->quoteSmart($this->priceConcession), + $this->conn->quoteSmart($this->ticketLink), + $this->conn->quoteSmart($this->facebookLink), + $this->conn->quoteSmart($this->user_name_responsible), + $this->conn->quoteSmart($this->user_phone_responsible), + $this->conn->quoteSmart($this->user_email_responsible), + $this->conn->quoteSmart($this->user_name_ext_contact), + $this->conn->quoteSmart($this->user_phone_ext_contact), + $this->conn->quoteSmart($this->user_email_ext_contact), + $this->conn->quoteSmart($this->user_role_ext_contact), + $this->conn->quoteSmart($this->needPosters), + $this->conn->quoteSmart($this->links), + $this->conn->quoteSmart($this->picture), + $this->viewWeekprogram, + $this->conn->quoteSmart($this->id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Arrangement oppdatert."); + }else { + error("Update concert: " . $result->toString()); + notify("Problemer med oppdatering av arrangement."); + } + + } + } + + public + function _validate(){ + $valid = true; + if($this->name == '') { + notify("Tittel må angis."); + $valid = false; + } + if($this->intro == '') { + notify("Ingress må angis."); + $valid = false; + } + if (date("Y", strtotime($this->time)) < 2000){ + notify("Ugyldig årstall."); + $valid = false; + } + return $valid; + } + + public function repeat($data){ + $frequency = $data['frequency']; + $count = $data['count']; + for ($i = 0; $i < $count; $i++){ + $date = get_repeat_date($this->time, $i + 1, $frequency); + $sql = sprintf("INSERT INTO program + (id, tittel, tittel_en, ingress, ingress_en, type, arr, tid, tekst, tekst_en, kommentar, + sted, vpris, mpris, billett, ansv, ansv_tlf, ansv_epost, + ekst_navn, ekst_tlf, ekst_epost, ekst_rolle, plakat_behov, vedlegg, linker) + VALUES + (NULL, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, + %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->name_en), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->intro_en), + $this->conn->quoteSmart($this->concertcategory_id), + $this->conn->quoteSmart($this->host_id), + $this->conn->quoteSmart($date), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->text_en), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->venue_id), + $this->conn->quoteSmart($this->priceNormal), + $this->conn->quoteSmart($this->priceConcession), + $this->conn->quoteSmart($this->ticketLink), + $this->conn->quoteSmart($this->user_name_responsible), + $this->conn->quoteSmart($this->user_phone_responsible), + $this->conn->quoteSmart($this->user_email_responsible), + $this->conn->quoteSmart($this->user_name_ext_contact), + $this->conn->quoteSmart($this->user_phone_ext_contact), + $this->conn->quoteSmart($this->user_email_ext_contact), + $this->conn->quoteSmart($this->user_role_ext_contact), + $this->conn->quoteSmart($this->needPosters), + $this->conn->quoteSmart($this->picture), + $this->conn->quoteSmart($this->getLinks()) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Repetisjon av arrangement registrert."); + }else { + error("New concert: " . $result->toString()); + notify("Arrangementet lot seg ikke repetere."); + reportBug("arrangement"); + } + } + } + + public function copy($data){ + $id = getNextId("program"); + $sql = sprintf("INSERT INTO program + (id, tittel, tittel_en, ingress, ingress_en, type, arr, tid, tekst, tekst_en, kommentar, + sted, vpris, mpris, billett, ansv, ansv_tlf, ansv_epost, + ekst_navn, ekst_tlf, ekst_epost, ekst_rolle, plakat_behov, vedlegg, linker) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, + %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->name_en), + $this->conn->quoteSmart($this->intro), + $this->conn->quoteSmart($this->intro_en), + $this->conn->quoteSmart($this->concertcategory_id), + $this->conn->quoteSmart($this->host_id), + $this->conn->quoteSmart(scriptParam("newDate")), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->text_en), + $this->conn->quoteSmart($this->comment), + $this->conn->quoteSmart($this->venue_id), + $this->conn->quoteSmart($this->priceNormal), + $this->conn->quoteSmart($this->priceConcession), + $this->conn->quoteSmart($this->ticketLink), + $this->conn->quoteSmart($this->user_name_responsible), + $this->conn->quoteSmart($this->user_phone_responsible), + $this->conn->quoteSmart($this->user_email_responsible), + $this->conn->quoteSmart($this->user_name_ext_contact), + $this->conn->quoteSmart($this->user_phone_ext_contact), + $this->conn->quoteSmart($this->user_email_ext_contact), + $this->conn->quoteSmart($this->user_role_ext_contact), + $this->conn->quoteSmart($this->needPosters), + $this->conn->quoteSmart($this->picture), + $this->conn->quoteSmart($this->getLinks()) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Arrangement kopiert."); + $GLOBALS['extraScriptParams']['concertid'] = $id; + }else { + error("New concert: " . $result->toString()); + notify("Problemer med kopiering av arrangement."); + reportBug("arrangement"); + } + } + + + public function _retrieveData(){ + $sql = "SELECT + c.tittel AS name, + c.tittel_en AS name_en, + c.ingress AS intro, + c.ingress_en AS intro_en, + c.tekst AS text, + c.tekst_en AS text_en, + c.type AS concertcategory_id, + c.arr AS host_id, + d.name AS host_name, + c.tid AS time, + c.sted AS venue_id, + v.navn AS venue_name, + c.kommentar AS comment, + c.billett AS ticketLink, + c.facebook AS facebookLink, + c.vpris AS priceNormal, + c.mpris AS priceConcession, + c.vedlegg AS picture, + c.ekst_navn AS user_name_ext_contact, + c.ekst_tlf AS user_phone_ext_contact, + c.ekst_epost AS user_email_ext_contact, + c.ekst_rolle AS user_role_ext_contact, + c.plakat_behov AS needPosters, + c.visUkeprogram AS viewWeekprogram + FROM program c, lokaler v, din_division d + WHERE c.id = $this->id + AND c.sted = v.id + AND c.arr = d.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + }else { + notify("Ingen arrangementsdata er registrert."); + notify($sql); + error($this->id); + } + }else { + error("Concerts: " . $result->toString()); + notify("Problemer med henting av arrangementsdata."); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM program + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Arrangement slettet."); + }else { + error($result->toString()); + notify("Feil under sletteing av arrangement."); + } + } + + public function display(){ + //$this->_markAsRead(); + $links = $this->getLinks("DB"); +?> +
    +id, CONCERT, "concert", "view-edit-options-concert"); + + if ($this->picture != 0){ + print('
    \"pressebilde\"
    '); + } +?>

    name; ?>

    +

    time); ?>, venue_name; ?>

    +

    intro); ?>

    +

    text); ?>

    + + +

    relevante linker:

    +

    + + +

    + Billettpris: priceNormal; ?>,- +

    +

    + Medlemspris: priceConcession; ?>,- +

    +

    + Arrangør: + + host_name; ?> + +

    +
     
    +
    + _displayReport(); + + $freqOptions = Array(Array("id" => "daily", "title" => "daglig"), + Array("id" => "weekly", "title" => "ukentlig"), + Array("id" => "biweekly", "title" => "annenhver uke"), + Array("id" => "monthlyDate", "title" => "månedlig"), + Array("id" => "annual", "title" => "årlig") + ); + + $title = "repeat concert"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=repeat-concert&page=display-concerts"; + $fields = Array(Array("label" => "concertid", "type" => "hidden", + "attributes" => Array("name" => "concertid", "value" => "$this->id")), + Array("label" => "gjenta aktivitet", "type" => "select", + "attributes" => Array("name" => "frequency", "values" => $freqOptions, + "value" => $freqOptions[0])), + Array("label" => "antall ganger", "type" => "text", + "attributes" => Array("name" => "count", "size" => 3, "maxlength" => 3, + "value" => 0)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + + $title = "copy concert"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=copy-concert&page=display-concert"; + $fields = Array(Array("label" => "concertid", "type" => "hidden", + "attributes" => Array("name" => "concertid", "value" => "$this->id")), + Array("label" => "kopier til", "type" => "datetime", + "attributes" => Array("name" => "newDate", "value" => "$this->time")) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + } + ?> +
     
    + +_readByCurrentUser(); + ?> + + name; ?> + concertcategory_id; ?> + venue_name; ?> + host_name; ?> + time, "td"); ?> + id, CONCERT, "concert", "view-edit-options-concert"); ?> + + + + vis arrangementsrapport + "); + } + } + + public function getLinks($type = "text"){ + $sql = "SELECT linker AS url FROM program WHERE id = $this->id"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $row =& $result->fetchRow(DB_FETCHMODE_ORDERED); + return $row[0]; + }else { + error("Linker: " . $result->toString()); + } + + $sql = "SELECT url FROM program_linker + WHERE parent_id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($type == "DB"){ + return $result; + }else if ($type == "text"){ + $a = ""; + while ($row =& $result->fetchRow(DB_FETCHMODE_ORDERED)){ + $a .= $row[0]."\r\n"; + } + return $a; + } + }else { + error("Linker: " . $result->toString()); + } + } + + public function _markAsRead(){ + if ($this->_readByCurrentUser() == true){ + return; + } + + $user = getCurrentUser(); + if ($user == false){ + return; + } + + $sql = sprintf("INSERT INTO din_concertread VALUES + (%s, %s, NOW())", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) == true){ + notify($result->toString()); + } + } + + public function _readByCurrentUser(){ + $user = getCurrentUser(); + if ($user == false){ + return false; + } + + $sql = sprintf("SELECT id FROM din_concertread + WHERE id = %s + AND userId = %s", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if($result->numRows() > 0){ + return true; + } + }else { + error($result->toString()); + } + return false; + } + + +} + +?> diff --git a/inside/ConcertCategories.php b/inside/ConcertCategories.php new file mode 100644 index 0000000..5af057f --- /dev/null +++ b/inside/ConcertCategories.php @@ -0,0 +1,24 @@ +__construct(); + } + + function __construct(){ + if (isset($_SESSION['concert']['categories'])){ + $this->categories = $_SESSION['concert']['categories']; + }else { + $this->categories = getEnumValues("type", "program", "dns"); + $_SESSION['concert']['categories'] = $this->categories; + } + } + + public function getCategories(){ + return $this->categories; + } + +} +?> \ No newline at end of file diff --git a/inside/ConcertReport.php b/inside/ConcertReport.php new file mode 100644 index 0000000..3163698 --- /dev/null +++ b/inside/ConcertReport.php @@ -0,0 +1,156 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect("dns"); + + $this->id = $id; + + if ($id == NULL){//New concert + if ($data == NULL){ + notify("ConcertReport: No data supplied."); + }else { + $this->concert_id = $data['concertid']; + + } + }else {//ID set, existing concert + if ($data != NULL){//UPDATE + + }else {//RETRIEVE + $data = $this->_retrieveData(); + $this->concert_id = $data['concert_id']; + + } + } + //Common initializations + $this->visitors = $data['visitors']; + $this->marketing_comment = stripslashes($data['marketing_comment']); + $this->production_comment = stripslashes($data['production_comment']); + $this->result = $data['result']; + } + + public + function store(){ + if ($this->id == NULL){ + $this->id = getNextId("din_concert_report"); + + $sql = sprintf("INSERT INTO din_concert_report + (id, concert_id, visitors, marketing_comment, production_comment, + result) + VALUES + (%s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->concert_id), + $this->conn->quoteSmart($this->visitors), + $this->conn->quoteSmart($this->marketing_comment), + $this->conn->quoteSmart($this->production_comment), + $this->conn->quoteSmart($this->result) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) == true){ + error("New ConcertReport: " . $result->toString()); + notify("Problemer med registrering av arrangementsrapport."); + return false; + }else { + notify("Ny arrangementsrapport er registrert."); + $GLOBALS['extraScriptParams']['concertreportid'] = $this->id; + } + }else { + $sql = sprintf("UPDATE din_concert_report SET + visitors = %s, + marketing_comment = %s, + production_comment = %s, + result = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->visitors), + $this->conn->quoteSmart($this->marketing_comment), + $this->conn->quoteSmart($this->production_comment), + $this->conn->quoteSmart($this->result), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) == true){ + error("Update ConcertReport: " . $result->toString()); + notify("Problemer med oppdatering av arrangementsrapport."); + }else { + notify("Arrangementsrapport oppdatert."); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_concert_report cr + WHERE cr.id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + }else { + //notify("Ingen rapportdata er registrert."); + } + }else { + error("ConcertReports: " . $result->toString()); + notify("Problemer med henting av arrangementsrapport."); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_concert_report + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Arrangementsrapport slettet."); + }else { + error($result->toString()); + notify("Feil under sletting av arrangementsrapport."); + } + } + + public function display(){ +?> +
    +

    Arrangementsrapport

    +id, CONCERTREPORT, "concertreport", "view-edit-options-concertreport", true, "display-concert"); +?> +

    + Besøkende: visitors; ?> +

    +

    + Resultat: result; ?> +

    +

    Om markedsføringen

    +

    marketing_comment); ?>

    +

    Om produksjonen

    +

    production_comment); ?>

    +
    +
     
    + + \ No newline at end of file diff --git a/inside/Concerts.php b/inside/Concerts.php new file mode 100644 index 0000000..79a5a87 --- /dev/null +++ b/inside/Concerts.php @@ -0,0 +1,136 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getList($start_date, $picture = false){ + if ($picture) { + $condition = "AND vedlegg != '0'"; + }else { + $condition = ""; + } + $sql = "SELECT id + FROM program + WHERE tid >= '$start_date' " . + "$condition + ORDER BY tid ASC"; + if ($this->conn == false){ + return false; + } + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Concerts: " . $result->toString()); + } + } + + public function getListWeek($start, $end){ + + $sql = "SELECT id + FROM program + WHERE tid >= '$start' " . + "AND tid <= '$end' + ORDER BY tid ASC"; + if ($this->conn == false){ + return false; + } + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Concerts: " . $result->toString()); + } + } + + public function getListMonth($year, $month){ + $nextMonth = date("Y-m", strtotime("+1 month", strtotime("$year-$month-01"))); + $sql = "SELECT id, tittel, DAYOFMONTH(tid) AS date + FROM program + WHERE tid >= '$year-$month-01' + AND tid < '$nextMonth-01' + ORDER BY tid ASC"; + if ($this->conn == false){ + return false; + } + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Concerts: " . $result->toString()); + } + } + + public function getListSelection($start, $end, $type){ + if ($type == "Billett") { + $condition = "AND billett != '' "; + }else { + $condition = "AND type = '$type' "; + } + + $sql = "SELECT id + FROM program + WHERE tid >= '$start' " . + "AND tid <= '$end' " . + "$condition " . + "AND vedlegg != '0' + ORDER BY tid ASC"; + if ($this->conn == false){ + return false; + } + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Concerts: " . $result->toString()); + } + } + + public + function displayList($selection = "0000-00-00"){ + $sql = "SELECT id AS concertId FROM program + WHERE tid > $selection + ORDER BY tid ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ + print("

    Antall treff: ".$result->numRows()."

    "); +?> + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $concert = new Concert($row['concertId']); + $concert->displayList(); + } + print("
    titteltypestedarrangørdato 
    "); + }else { + print("

    Ingen arrangementer er registrert.

    "); + } + }else { + error("Concerts: " . $result->toString()); + } + + } + +} + + +?> \ No newline at end of file diff --git a/inside/Division.php b/inside/Division.php new file mode 100644 index 0000000..0af9970 --- /dev/null +++ b/inside/Division.php @@ -0,0 +1,229 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New division + if ($data == NULL){ + error("Division: No data supplied."); + }else { + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + if($_FILES['userfile']['error'] != 4){ + $temp_name = new_file($_FILES, "foreninger"); + rename_file($temp_name, $this->id, "foreninger"); + $this->picture = $this->conn->quoteSmart($this->id.substr($temp_name, -4)); + }else { + $this->picture = "picture"; + } + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->name_contact = $data['name_contact']; + $this->divisioncategory_title = $data['divisioncategory_title']; + $this->picture = $data['picture']; + } + } + //Common initializations + $this->name = $data['name']; + $this->text = $data['text']; + $this->phone = $data['phone']; + $this->email = $data['email']; + $this->office = $data['office']; + $this->user_id_contact = $data['user_id_contact']; + $this->url = $data['url']; + $this->divisioncategory_id = $data['divisioncategory_id']; + } + + public function store(){ + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO din_division + (id, name, text, phone, email, office, + user_id_contact, url, divisioncategory_id) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->phone), + $this->conn->quoteSmart($this->email), + $this->conn->quoteSmart($this->office), + $this->conn->quoteSmart($this->user_id_contact), + $this->conn->quoteSmart($this->url), + $this->conn->quoteSmart($this->divisioncategory_id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("New division registered and stored."); + }else { + error("New division: " . $result->toString()); + } + + }else { + $sql = sprintf("UPDATE din_division SET + name = %s, + text = %s, + phone = %s, + email = %s, + office = %s, + user_id_contact = %s, + url = %s, + divisioncategory_id = %s, " . + "picture = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->phone), + $this->conn->quoteSmart($this->email), + $this->conn->quoteSmart($this->office), + $this->conn->quoteSmart($this->user_id_contact), + $this->conn->quoteSmart($this->url), + $this->conn->quoteSmart($this->divisioncategory_id), + $this->picture, + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Forening oppdatert."); + }else { + error("Update division: " . $result->toString()); + } + + } + } + + public function _retrieveData(){ + $sql = "SELECT d.*, CONCAT(u.firstname, ' ', u.lastname) AS name_contact, + dc.title AS divisioncategory_title + FROM din_division d, din_user u, din_divisioncategory dc + WHERE d.id = $this->id + AND d.user_id_contact = u.id + AND d.divisioncategory_id = dc.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + $row['text'] = stripslashes($row['text']); + return $row; + } + }else { + error("Division: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_division + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + if ($conn->affectedRows() > 0){ + notify("Foreningen er slettet."); + }else { + notify("Ugyldig foreningsid, ingen handling utført."); + } + }else { + if ($result->getCode() == -3){ + notify("Det er brukergrupper knyttet til denne foreningen. Disse må slettes først."); + }else { + error($result->toString()); + } + } + } + + public + function getNoAdminGroup(){ + $sql = "SELECT d.id AS group_id FROM din_group d, din_division dd " . + "WHERE d.division_id=dd.id " . + "AND dd.id = $this->id " . + "AND d.admin = 0 " . + "LIMIT 1"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)){ + return $row->group_id; + }else { + return false; + } + }else { + error("no-admin-group: " . $result->toString()); + return false; + } + } + + public function display(){ +?> +
    +id, DIVISION, "division", "view-edit-options-division"); + + if ($this->picture != 0){ + print("picture."&maxwidth=200\" alt=\"\" />"); + } + +?> +

    name; ?>

    +

    divisioncategory_title; ?>

    +

    text); ?>

    +

    Telefon: phone); ?>

    +

    Epost: email; ?>

    +

    Hjemmeside: url; ?>

    +

    Kontornummer: office; ?>

    +

    Kontaktperson: + name_contact; ?> +

    + +
    + + + + name; ?> + phone; ?> + email; ?> + name_contact; ?> + + id, DIVISION, "division", "view-edit-options-division"); ?> + + + \ No newline at end of file diff --git a/inside/DivisionCategories.php b/inside/DivisionCategories.php new file mode 100644 index 0000000..ebadfc1 --- /dev/null +++ b/inside/DivisionCategories.php @@ -0,0 +1,42 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + + $sql = "SELECT id, title FROM din_divisioncategory"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->categories = $result; + } + } + + public function getCategories(){ + return $this->categories; + } + + public function displayList(){ + ?> + + + + + +categories->fetchRow(DB_FETCHMODE_ASSOC)){ + $divisionCat = new DivisionCategory($row['id']); + $divisionCat->displayList(); + } + print("
    foreningstyper 
    "); + } + +} +?> \ No newline at end of file diff --git a/inside/Divisions.php b/inside/Divisions.php new file mode 100644 index 0000000..9545d4a --- /dev/null +++ b/inside/Divisions.php @@ -0,0 +1,113 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getList(){ + if (isAdmin(getCurrentUser()) || checkAuth("all-divisions")){ + $sql = "SELECT d.id, d.name " . + "FROM din_division d"; + }else if (loggedIn()){ + $sql = sprintf("SELECT d.id, d.name " . + "FROM din_division d, din_usergrouprelationship ugr, din_group g ". + "WHERE g.division_id = d.id " . + "AND g.admin = 1 " . + "AND ugr.group_id = g.id " . + "AND ugr.user_id = %s", + getCurrentUser()); + }else { + $sql = sprintf("SELECT d.id, d.name " . + "FROM din_division d " . + "WHERE d.hidden != 1 " . + "ORDER BY d.name"); + } + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("Divisions: " . $result->toString()); + } + } + + public + function getListAll(){ + $sql = "SELECT d.id, d.name " . + "FROM din_division d"; + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("Divisions: " . $result->toString()); + } + } + + public + function getListAllWithPositions(){ + $sql = "SELECT d.id, CONCAT(d.name, ' (', COUNT(p.id), ')') AS name " . + "FROM din_division d LEFT JOIN din_position p " . + "ON p.division_id = d.id " . + "GROUP BY d.id " . + "ORDER BY d.name"; + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("Divisions: " . $result->toString()); + } + } + + public function display(){ + $sql = "SELECT id FROM din_division + ORDER BY name ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + while ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + + displayOptionsMenu($row['id'], "division"); + $division = new Division($row['id']); + $division->display(); + } + }else { + error("Divisions: " . $result->toString()); + } + } + + public function displayList(){ + $sql = "SELECT id FROM din_division + ORDER BY name ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){?> + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $division = new Division($row['id']); + $division->displayList(); + } + print("
    foreningtelefonepostkontaktperson
    "); + }else { + error("Divisions: " . $result->toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/Document.php b/inside/Document.php new file mode 100644 index 0000000..3e2a3c5 --- /dev/null +++ b/inside/Document.php @@ -0,0 +1,144 @@ +__construct($id, $documentData); + } + + public function __construct($id = NULL, $documentData = NULL){ + $this->conn = db_connect(); + + if ($id != NULL){ + $this->id = $id; + if ($data = $this->_retrieveData()){ + $this->type = $data->type; + $this->name = $data->name; + $this->size = $data->size; + $this->date = $data->date; + $this->tags = $data->tags; + $this->documentcategory_id = $data->documentcategory_id; + $this->documentcategory_title = $data->documentcategory_title; + } + } + } + + public function store($files){ + if ($files != NULL){ + $SrcPathFile = $_FILES["file"]["tmp_name"]; + $SrcFileType = $_FILES["file"]["type"]; + $DstFileName = $_FILES["file"]["name"]; + + clearstatcache(); + + // File Processing + if (file_exists($SrcPathFile)) { + // Insert into file table + $fileid = getNextId("din_document"); + $sql = sprintf("INSERT INTO din_document + (id, type, name, size, date, documentcategory_id, tags) + VALUES (%s, %s, %s, %s, NOW(), %s, %s)", + $this->conn->quoteSmart($fileid), + $this->conn->quoteSmart($SrcFileType), + $this->conn->quoteSmart($DstFileName), + $this->conn->quoteSmart(filesize($SrcPathFile)), + $this->conn->quoteSmart(scriptParam("documentcategoryid")), + $this->conn->quoteSmart(strtolower(scriptParam("tags")))); + + $result =& $this->conn->query($sql); + if (DB::isError($result) == true){ + error("Document: " . $result->toString()); + }else { + // Insert into the filedata table + $fp = fopen($SrcPathFile, "rb"); + while (!feof($fp)) { + // Make the data mysql insert safe + $binarydata = fread($fp, 65535); + $sql = sprintf("INSERT INTO din_documentdata (document_id, data) VALUES (%s, %s)", + $this->conn->quoteSmart($fileid), + $this->conn->quoteSmart($binarydata) + ); + $result =& $this->conn->query($sql); + if (DB::isError($result) == true){ + error("Document: " . $result->toString()); + } + } + fclose($fp); + notify("Document uploaded!"); + } + } + }else { + error("Document: no file supplied"); + } + } + + public function _retrieveData(){ + $sql = "SELECT d.*, dc.title AS documentcategory_title + FROM din_document d, din_documentcategory dc + WHERE d.id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row = $result->fetchRow(DB_FETCHMODE_OBJECT)){ + return $row; + }else { + error("Document: document not found."); + } + }else { + error("Document: " . $result->toString()); + } + } + + public function update($data){ + $conn = db_connect(); + + if (isset($data['documentid'])){ + $sql = sprintf("UPDATE din_document SET + name = %s, + documentcategory_id = %s, + date = NOW(), " . + "tags = %s + WHERE + id = %s", + $conn->quoteSmart($data['name'] . $data['tag']), + $conn->quoteSmart($data['documentcategory_id']), + $conn->quoteSmart(strtolower($data['tags'])), + $conn->quoteSmart($data['documentid']) + ); + $result =& $conn->query($sql); + if (DB::isError($result) == true){ + error("Document: " . $result->toString()); + }else { + notify("Document updated."); + } + } + } + + public function delete($id){ + $conn = db_connect(); + + $sql = "DELETE FROM din_document + WHERE id = $id + LIMIT 1"; + $result =& $conn->query($sql); + if (DB::isError($result) == true){ + error("Document: " . $result->toString()); + }else { + notify("Document deleted."); + } + + } +} +?> \ No newline at end of file diff --git a/inside/DocumentCategories.php b/inside/DocumentCategories.php new file mode 100644 index 0000000..1560163 --- /dev/null +++ b/inside/DocumentCategories.php @@ -0,0 +1,48 @@ +__construct(); + } + + function __construct(){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("DocumentCategories: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + + $sql = "SELECT id, title FROM din_documentcategory ORDER BY title ASC"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->categories = $result; + } + } + + public function getList(){ + return $this->categories; + } + + public function displayList(){ + ?> + + + + + +categories->fetchRow(DB_FETCHMODE_ASSOC)){ + $docCat = new DocumentCategory($row['id']); + $docCat->displayList(); + } + print("
    dokumenttyper 
    "); + } + +} +?> \ No newline at end of file diff --git a/inside/DocumentCategory.php b/inside/DocumentCategory.php new file mode 100644 index 0000000..8970009 --- /dev/null +++ b/inside/DocumentCategory.php @@ -0,0 +1,125 @@ +__construct($id, $data); + } + + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + $this->id = $id; + + if ($id == NULL){//New event + if ($data == NULL){ + error("DocumentCategory: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->title = $data['title']; + $this->text = $data['text']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId('din_documentcategory'); + $sql = sprintf("INSERT INTO din_documentcategory VALUES + (%s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(scriptParam("title")), + $this->conn->quoteSmart(scriptParam("text")) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['documentcategoryid'] = $this->id; + if ($this->conn->commit()){ + notify("New Document Category registered and stored."); + }else { + $this->conn->rollback(); + error("New Document Category: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New Document Category: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_documentcategory SET + title = %s, + text = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Document Category updated."); + }else { + $this->conn->rollback(); + error("New Document Category: " . $result->toString()); + } + }else { + error("Update Document Category: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_documentcategory dc + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Document category: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_documentcategory + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Document category deleted."); + }else { + error($result->toString()); + } + } + + public function displayList(){ + + ?> + + title; ?> + text); ?> + id, DOCCAT, + "documentcategory", "view-edit-options-documentCategory"); ?> + + + \ No newline at end of file diff --git a/inside/Documents.php b/inside/Documents.php new file mode 100644 index 0000000..c6b2033 --- /dev/null +++ b/inside/Documents.php @@ -0,0 +1,149 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public + function display($limit = 5, $selection = "0000-00-00"){ + + $sql = "SELECT id FROM din_document + ORDER BY date DESC + WHERE date > $selection + LIMIT $limit"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + while ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + + displayOptionsMenu($row['id'], "document"); + $document = new Document($row['id']); + $document->display(); + } + + }else { + error("Documents: " . $result->toString()); + } + + } + + public + function displayList($category = 0){ + if ($category > 0){ + $cat_condition = "AND d.documentcategory_id = $category"; + }else { + $cat_condition = ""; + } + $sql = "SELECT d.*, dc.title AS category + FROM din_document d, din_documentcategory dc + WHERE d.documentcategory_id = dc.id " . + "$cat_condition " . + "ORDER BY name ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ +?> + + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){?> + + + + + + + id, DOCUMENT, "document", "view-edit-options-document"); ?> + + +"); + }else { + print("

    Ingen dokumenter registrert.

    "); + } + }else { + error("Documents: " . $result->toString()); + } + + } + + + public + function displayListTag($tag = NULL){ + if ($tag == NULL){ + return false; + } + $sql = "SELECT d.*, dc.title AS category + FROM din_document d, din_documentcategory dc + WHERE d.documentcategory_id = dc.id " . + "AND tags LIKE '%$tag%' " . + "ORDER BY name ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ +?> +
    tittelkategoritagsendretstørrelse 
    name; ?>category; ?>_tags_to_links($row->tags); ?>date, "td"); ?>size/1024); ?>
    + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){?> + + + + + + + id, DOCUMENT, "document", "view-edit-options-document"); ?> + + +"); + }else { + print("

    Ingen dokumenter registrert.

    "); + } + }else { + error("Documents: " . $result->toString()); + } + + } + + public + function _tags_to_links($tags){ + $tags = explode(" ", $tags); + $tag_list = ""; + foreach ($tags as $tag){ + $tag_list .= "$tag "; + } + return $tag_list; + } + +} + + +?> \ No newline at end of file diff --git a/inside/Errors.php b/inside/Errors.php new file mode 100644 index 0000000..9e9cf43 --- /dev/null +++ b/inside/Errors.php @@ -0,0 +1,39 @@ + +
    +

    Feilmeldinger

    +
      +$msg\n"); + }else { + foreach ($GLOBALS['errors'] as $e){ + print("
    • $e
    • \n"); + } + }?> +
    +
    + \ No newline at end of file diff --git a/inside/Event.php b/inside/Event.php new file mode 100644 index 0000000..1776645 --- /dev/null +++ b/inside/Event.php @@ -0,0 +1,388 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New event + if ($data == NULL){ + error("Event: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->eventcategory_title = $data['eventcategory_title']; + $this->name_responsible = $data['name_responsible']; + } + } + //Common initializations + $this->name = $data['name']; + $this->text = $data['text']; + $this->time = substr($data['time'], 0, 16); + $this->location = $data['location']; + $this->eventcategory_id = $data['eventcategory_id']; + $this->user_id_responsible = $data['user_id_responsible']; + $this->targetGroup = $data['targetGroup']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId("din_event"); + $sql = sprintf("INSERT INTO din_event + (id, name, text, time, location, eventcategory_id, user_id_responsible, targetGroup) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->time), + $this->conn->quoteSmart($this->location), + $this->conn->quoteSmart($this->eventcategory_id), + $this->conn->quoteSmart($this->user_id_responsible), + $this->conn->quoteSmart($this->targetGroup) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['eventid'] = $this->id; + $sql = sprintf("INSERT INTO din_eventupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart(scriptParam('eventid')), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Event registered.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("New event registered and stored."); + }else { + $this->conn->rollback(); + error("New event: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New event: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New event: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_event SET + name = %s, + text = %s, + time = %s, + location = %s, + eventcategory_id = %s, + user_id_responsible = %s, + targetGroup = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->time), + $this->conn->quoteSmart($this->location), + $this->conn->quoteSmart($this->eventcategory_id), + $this->conn->quoteSmart($this->user_id_responsible), + $this->conn->quoteSmart($this->targetGroup), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $sql = sprintf("INSERT INTO din_eventupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Event updated.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Event updated."); + }else { + $this->conn->rollback(); + error("New event: " . $result->toString()); + } + }else { + error("Update event: " . $result->toString()); + } + }else { + error("Update event: " . $result->toString()); + } + } + } + + public function repeat($data){ + $frequency = $data['frequency']; + $count = $data['count']; + for ($i = 0; $i < $count; $i++){ + $date = get_repeat_date($this->time, $i + 1, $frequency); + $sql = sprintf("INSERT INTO din_event + (id, name, text, time, location, eventcategory_id, user_id_responsible, targetGroup) + VALUES + (NULL, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($date), + $this->conn->quoteSmart($this->location), + $this->conn->quoteSmart($this->eventcategory_id), + $this->conn->quoteSmart($this->user_id_responsible), + $this->conn->quoteSmart($this->targetGroup) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Event repeated."); + }else { + error("New event: " . $result->toString()); + } + } + } + + public function copy($data){ + $id = getNextId("din_event"); + $sql = sprintf("INSERT INTO din_event + (id, name, text, time, location, eventcategory_id, user_id_responsible, targetGroup) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($data['newDate']), + $this->conn->quoteSmart($this->location), + $this->conn->quoteSmart($this->eventcategory_id), + $this->conn->quoteSmart($this->user_id_responsible), + $this->conn->quoteSmart($this->targetGroup) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Aktivitet kopiert."); + $GLOBALS['extraScriptParams']['eventid'] = $id; + }else { + notify("Problemer med kopiering av aktivitet."); + error("New event: " . $result->toString()); + } + } + + + public function _retrieveData(){ + $sql = "SELECT e.*, ec.title AS eventcategory_title, + CONCAT(u.firstName, ' ', u.lastName) AS name_responsible + FROM din_eventcategory ec, din_event e LEFT JOIN din_user u + ON e.user_id_responsible = u.id + WHERE e.id = $this->id + AND e.eventcategory_id = ec.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Events: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_event + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Event deleted."); + }else { + error($result->toString()); + } + } + + public function display(){ + $this->_markAsRead(); +?> +
    +id, EVENT, "event", "view-edit-options-event"); +?> +

    name; ?>

    +

    time); ?>

    + +

    text); ?>

    + +

    Deltakere:

    +

    targetGroup); ?>

    +

    Arrangementsansvarlig:

    +

    name_responsible); ?>

    +

    Sted:

    +

    location; ?>

    + "daily", "title" => "daglig"), + Array("id" => "weekly", "title" => "ukentlig"), + Array("id" => "biweekly", "title" => "annenhver uke"), + Array("id" => "monthlyDate", "title" => "månedlig"), + Array("id" => "annual", "title" => "årlig") + ); + + $title = "repeat event"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=repeat-event&page=display-events"; + $fields = Array(Array("label" => "eventid", "type" => "hidden", + "attributes" => Array("name" => "eventid", "value" => "$this->id")), + Array("label" => "gjenta aktivitet", "type" => "select", + "attributes" => Array("name" => "frequency", "values" => $freqOptions, + "value" => $freqOptions[0])), + Array("label" => "antall ganger", "type" => "text", + "attributes" => Array("name" => "count", "size" => 3, "maxlength" => 3, + "value" => 0)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + + $title = "copy event"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=copy-event&page=display-event"; + $fields = Array(Array("label" => "eventid", "type" => "hidden", + "attributes" => Array("name" => "eventid", "value" => "$this->id")), + Array("label" => "kopier til", "type" => "datetime", + "attributes" => Array("name" => "newDate", "value" => "$this->time")) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + } + + //display comments + $comments = new EventComments(); + $list = $comments->getList($this->id); + if ($list->numRows() > 0){ + ?> +
    +

    kommentarer og spørsmål:

    +fetchRow(DB_FETCHMODE_OBJECT)){ + $comment = new EventComment($row->id); + $comment->display(); + }?> +
    + + "eventid", "type" => "hidden", + "attributes" => Array("name" => "event_id", "value" => "$this->id")), + Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 50)), + Array("label" => "tekst", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 6)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + + ?> +
    + +_readByCurrentUser(); + ?> + + + + + + + id, EVENT, "event", "view-edit-options-event"); ?> + + +_readByCurrentUser() == true){ + return; + } + + $user = getCurrentUser(); + if ($user == false){ + return; + } + + $sql = sprintf("INSERT INTO din_eventread VALUES + (%s, %s, NOW())", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Event marked as read."); + }else { + error($result->toString()); + } + } + + public function _readByCurrentUser(){ + $user = getCurrentUser(); + if ($user == false){ + return false; + } + + $sql = sprintf("SELECT event_id FROM din_eventread + WHERE event_id = %s + AND user_id = %s", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if($result->numRows() > 0){ + return true; + } + }else { + error($result->toString()); + } + return false; + } + + +} + +?> \ No newline at end of file diff --git a/inside/EventCategories.php b/inside/EventCategories.php new file mode 100644 index 0000000..1af816d --- /dev/null +++ b/inside/EventCategories.php @@ -0,0 +1,42 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + + $sql = "SELECT id, title FROM din_eventcategory"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->categories = $result; + } + } + + public function getCategories(){ + return $this->categories; + } + + public function displayList(){ + ?> +
    tittelkategoritagsendretstørrelse 
    name; ?>category; ?>_tags_to_links($row->tags); ?>date, "td"); ?>size/1024); ?>
    + name; ?>eventcategory_title; ?>name_responsible); ?>time, "td"); ?>
    + + + + +categories->fetchRow(DB_FETCHMODE_ASSOC)){ + $eventCat = new EventCategory($row['id']); + $eventCat->displayList(); + } + print("
    aktivitetstyper 
    "); + } + +} +?> \ No newline at end of file diff --git a/inside/EventCategory.php b/inside/EventCategory.php new file mode 100644 index 0000000..b6d865f --- /dev/null +++ b/inside/EventCategory.php @@ -0,0 +1,125 @@ +__construct($id, $data); + } + + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + $this->id = $id; + + if ($id == NULL){//New event + if ($data == NULL){ + error("EventCategory: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->title = $data['title']; + $this->text = $data['text']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId("din_eventcategory"); + $sql = sprintf("INSERT INTO din_eventcategory VALUES + (%s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(scriptParam("title")), + $this->conn->quoteSmart(scriptParam("text")) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['eventcategoryid'] = $this->id; + if ($this->conn->commit()){ + notify("New Event Category registered and stored."); + }else { + $this->conn->rollback(); + error("New Event Category: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New Event Category: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_eventcategory SET + title = %s, + text = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Event Category updated."); + }else { + $this->conn->rollback(); + error("New Event Category: " . $result->toString()); + } + }else { + error("Update Event Category: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_eventcategory dc + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Event category: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_eventcategory + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Event category deleted."); + }else { + error($result->toString()); + } + } + + public function displayList(){ + + ?> + + title; ?> + text); ?> + id, EVENTCAT, + "eventcategory", "view-edit-options-eventcategory"); ?> + + + \ No newline at end of file diff --git a/inside/EventComment.php b/inside/EventComment.php new file mode 100644 index 0000000..3d7fb58 --- /dev/null +++ b/inside/EventComment.php @@ -0,0 +1,153 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New eventComment + if ($data == NULL){ + error("EventComment: No data supplied."); + }else { + $this->user_id_author = getCurrentUser(); + $this->date = NULL; + + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->user_id_author = $data['user_id_author']; + $this->name_author = $data['name_author']; + $this->date = substr($data['date'], 0, 16); + } + } + //Common initializations + $this->title = $data['title']; + $this->text = $data['text']; + $this->event_id = $data['event_id']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO din_eventcomment + (id, event_id, title, + text, user_id_author, date) + VALUES + (%s, %s, %s, %s, %s, NOW())", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->event_id), + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->user_id_author) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['eventid'] = $this->event_id; + if ($this->conn->commit()){ + notify("New eventComment registered and stored."); + }else { + $this->conn->rollback(); + error("New eventComment: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New eventComment: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_eventcomment SET + title = %s, + text = %s, + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("EventComment updated."); + }else { + $this->conn->rollback(); + error("New eventComment: " . $result->toString()); + } + }else { + error("Update eventComment: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT ec.*, CONCAT(u.firstname, ' ', u.lastname) AS name_author + FROM din_eventcomment ec, din_user u + WHERE ec.id = $this->id + AND ec.user_id_author = u.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("EventComments: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_eventcomment + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("EventComment deleted."); + }else { + error($result->toString()); + } + } + + public function display(){ +?> +
    +id, EVENTCOMMENT, "eventcomment", "view-edit-options-eventcomment"); +?> +
    +

    Lagt inn av:

    +

    name_author; ?>

    +

    date); ?>

    +
    +
    +

    title; ?>

    +

    text); ?>

    +
    +
    + \ No newline at end of file diff --git a/inside/EventComments.php b/inside/EventComments.php new file mode 100644 index 0000000..4c51a03 --- /dev/null +++ b/inside/EventComments.php @@ -0,0 +1,29 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getList($eventId){ + $sql = "SELECT id + FROM din_eventcomment + WHERE event_id = $eventId + ORDER BY date ASC"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Eventcomments: " . $result->toString()); + } + } +} + + +?> \ No newline at end of file diff --git a/inside/Events.php b/inside/Events.php new file mode 100644 index 0000000..1adb9f8 --- /dev/null +++ b/inside/Events.php @@ -0,0 +1,66 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getListMonth($year, $month){ + $nextMonth = date("Y-m", strtotime("+1 month", strtotime("$year-$month-01"))); + $sql = "SELECT id, name, DAYOFMONTH(time) AS date + FROM din_event + WHERE time >= '$year-$month-01' + AND time < '$nextMonth-01' + ORDER BY time ASC"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Events: " . $result->toString()); + } + } + + public function displayList($selection = "0000-00-00"){ + $sql = "SELECT id FROM din_event + WHERE time > $selection + ORDER BY time ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ +?> + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $event = new Event($row['id']); + $event->displayList(); + } + print("
     titteltypeansvarligdato 
    "); + }else { + print("

    Ingen aktiviteter registrert.

    "); + } + }else { + error("Events: " . $result->toString()); + } + + } + +} + + +?> \ No newline at end of file diff --git a/inside/Form.php b/inside/Form.php new file mode 100644 index 0000000..dc9daa8 --- /dev/null +++ b/inside/Form.php @@ -0,0 +1,613 @@ +__construct($title, $enctype, $method, $action, $fields, $id, $readonly); + } + + function __construct($title, $enctype, $method, $action, $fields, $id = NULL, $readonly = false){ + $this->id = $id; + $this->title = $title; + $this->enctype = $enctype; + $this->fields = $fields; + $this->method = $method; + $this->action = $action; + $this->readonly = $readonly; + } + + function display($type = NULL){?> +
    + + + + +
    id != NULL) ? print "id=\"$this->id\"" : print ""?> enctype != NULL) ? print "enctype=\"$this->enctype\"" : print ""?> method="method; ?>" action="action; ?>"> + + + + +fields as $row){ + if ($row['type'] == 'hidden'){?> + + + + + + + + + + + +
    title; ?>
    _displayFormField($row['type'], $row['attributes']); ?>
     readonly == true){ + $attributes['disabled'] = true; + }else { + $attributes['disabled'] = false; + } + $this->_displayFormField('submit', $attributes); ?>
    +
    + +
    id != NULL) ? print "id=\"$this->id\"" : print ""?> enctype != NULL) ? print "enctype=\"$this->enctype\"" : print ""?> method="method; ?>" action="action; ?>"> +
    + title; ?> + fields as $row){ + if ($row['type'] != 'hidden'){?> +
    +
    +
    + _displayFormField($row['type'], $row['attributes']); + if ($row['type'] != 'hidden'){?> + +
    + + +_displayFormField('submit'); ?> +
    +
    + +
    id != NULL) ? print "id=\"$this->id\"" : print ""?> enctype != NULL) ? print "enctype=\"$this->enctype\"" : print ""?> method="method; ?>" action="action; ?>"> +
    + + title; ?> + fields as $row){ + if ($row['type'] != 'hidden'){?> + + _displayFormField($row['type'], $row['attributes']); + if ($row['type'] != 'hidden'){?> + + +_displayFormField('submit'); ?> +
    +
    + +
    +".$attributes['comment']."\n"); + } + + switch ($type){ + + case "text": + $this->_displayText($attributes); + break; + + case "password": + $this->_displayPassword($attributes); + break; + + case "datetime": + $this->_displayDatetime($attributes); + break; + + case "date": + $this->_displayDate($attributes); + break; + + case "time": + $this->_displayTime($attributes); + break; + + case "hidden": + $this->_displayHidden($attributes); + break; + + case "file": + $this->_displayFile($attributes); + break; + + case "textarea": + $this->_displayTextarea($attributes); + break; + + case "select": + $this->_displaySelect($attributes); + break; + + case "radio": + $this->_displayRadio($attributes); + break; + + case "checkbox": + $this->_displayCheckbox($attributes); + break; + + case "checkbox-list": + $this->_displayCheckboxList($attributes); + break; + + case "comment": + $this->_displayComment($attributes); + break; + + case "multilist": + $this->_displayMultilist($attributes); + break; + + case "submit": + $this->_displaySubmit($attributes); + break; + + case "cart_product": + $this->_displayCartProduct($attributes); + break; + } + + if (isset($attributes['help'])) { + print(" hjelp? "); + } + } + + public + function _displayText($attributes) { + if (isset($attributes['readonly']) && $attributes['readonly'] == true){ + print("
    "); + if (isset($attributes['value'])){ + print($attributes['value']); + } + print("
    "); + return; + } + print(""); + if (isset($attributes['tag'])){ + print(""); + print($attributes['tag']); + } + if (isset($attributes['repeatable'])){ + print("ny link"); + } + } + + public + function _displayPassword($attributes) { + print(""); + + } + + public + function _displayDatetime($attributes) { + print(" (yyyy-mm-dd hh:mm)"); + + } + + public + function _displayDate($attributes) { + print(" (yyyy-mm-dd)"); + } + + public + function _displayTime($attributes) { + print(" (hh:mm)"); + + } + + public + function _displayHidden($attributes) { + print(""); + } + + public + function _displayRadio($attributes) { + for ($i = 0; $i < count($attributes['values']); $i++){ + $value = $attributes['values'][$i]; + $label = $attributes['labels'][$i]; + if (isset($attributes['value']) && $attributes['value'] == $value){ + print(" + \n"); + }else { + print(" + \n"); + } + } + } + + public + function _displayCheckbox($attributes) { + $name = $attributes['name']; + $label = $attributes['label']; + $checked = $attributes['checked']; + if ($checked == true){ + print("
    \n"); + }else { + print("
    \n"); + } + } + + public + function _displayCheckboxList($attributes) { + $list = $attributes['options']; + $name_prefix = $attributes['name']; + for ($i = 0; $i < sizeof($list['names']); $i++) { + $name = $name_prefix.$list['names'][$i]; + $label = $list['labels'][$i]; + $checked = $list['checked'][$i]; + if ($checked == true){ + print("
    \n"); + }else { + print("
    \n"); + } + } + } + + public + function _displayMultilist($attributes) { + ?> +
    +
    + +
    +
      +fetchRow(DB_FETCHMODE_ORDERED)){ + if ($currentDiv != $row[0]){ + if ($currentDiv != NULL){ + print("
    \n"); + print("\n"); + } + $currentDiv = $row[0]; + print("
  • $row[1]\n"); + print("
      \n"); + } + ?> +
    • + \n\n"); +?> + +
    +
  • + "); + if (is_array($attributes['values'])){ + foreach ($attributes['values'] as $row){ + $value_id = $row['id']; + $value = $row['title']; + if (isset($attributes['currentValue']) && $attributes['currentValue'] == $value_id){ + print(" + "); + }else { + print(" + "); + } + } + }else if (is_a($attributes['values'], /* instanceof*/ "DB_Result")){//DB + if (isset($attributes['nullPossible']) && $attributes['nullPossible'] == true){ + if ($attributes['currentValue'] == NULL){ + print(" + "); + }else { + print(" + "); + } + + } + while($row =& $attributes['values']->fetchRow(DB_FETCHMODE_ORDERED)){ + $value_id = $row[0]; + $value = $row[1]; + if (isset($attributes['currentValue']) && $attributes['currentValue'] == $value_id){ + print(" + "); + }else { + print(" + "); + } + } + } + print("\n"); + } + + public + function _displayFile($attributes) { + print(""); + print(""); + } + + public + function _displayTextarea($attributes) { + print(""); + if (isset($attributes['value'])){ + print($attributes['value']); + } + print(""); + if (isset($attributes['maxlength']) && + !isset($attributes['nocounter'])){?> + + "); + } + + public + function _displayCartProduct($attributes) { + $id_att = Array("name" => "product_id", "value" => $attributes['product_id']); + $id_type = "hidden"; + $this->_displayFormField($id_type, $id_att); + + $order_id_att = Array("name" => "order_id", "value" => $attributes['order_id']); + $order_type = "hidden"; + $this->_displayFormField($order_type, $order_id_att); + + $qty_type = "text"; + $qty_att = Array("name" => "quantity", "size" => 1, "value" => 1); + print("legg "); + $this->_displayFormField($qty_type, $qty_att); + print(" stk i handlekurv
    "); + if ($attributes['allow_comment'] == 1) { + print("kommentar til denne bestillingen:
    "); + $comment_type = "textarea"; + $comment_att = Array("name" => "comment", "rows" => 2, "cols" => 60); + $this->_displayFormField($comment_type, $comment_att); + print("
    "); + } + } + +} + + + +?> \ No newline at end of file diff --git a/inside/Group.php b/inside/Group.php new file mode 100644 index 0000000..f5bfb77 --- /dev/null +++ b/inside/Group.php @@ -0,0 +1,187 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + print("error: ".$conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + + $this->id = $id; + + if ($this->id == NULL){//New group + if ($data == NULL){ + error("Group: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->name = $data['name']; + $this->text = ($data['text']) ? $data['text'] : "..."; + $this->division_id = ($data['division_id'] == "") ? NULL : $data['division_id']; + $this->admin = $data['admin']; + $this->mailinglist = $data['mailinglist']; + } + + public function store($actions = NULL){ + $action = scriptParam("action"); + if ($action == "register-group"){ + $sql = sprintf("INSERT INTO din_group + (name, text, division_id, admin, mailinglist) + VALUES + (%s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->division_id), + $this->conn->quoteSmart($this->admin), + $this->conn->quoteSmart($this->mailinglist) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("New group registered and stored."); + }else { + error("New group: " . $result->toString()); + } + + }else {//Update + $sql = sprintf("UPDATE din_group SET + name = %s, + text = %s, + division_id = %s, + admin = %s, + mailinglist = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->division_id), + $this->conn->quoteSmart($this->admin), + $this->conn->quoteSmart($this->mailinglist), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + + //actions + $sql = "DELETE FROM din_actiongrouprelationship " . + "WHERE group_id = $this->id"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $keys = array_keys($actions); + foreach ($keys as $a) { + $prefix = substr($a, 0, 7); + $value = substr($a, 7); + if ($prefix == "actions") { + $agr = new ActionGroupRelationship($value, $this->id); + $agr->store(); + } + } + }else { + error("ActionGroup-delete: " . $result->toString()); + } + notify("Group updated."); + }else { + error("Update group: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT g.* + FROM din_group g + WHERE g.id = $this->id"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + }else { + error("Groups: " . $result->toString()); + } + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_group WHERE id = $id LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Group deleted."); + }else { + error($result->toString()); + } + } + + public function display(){ + displayOptionsMenu($this->id, GROUP, "group"); +?> +

    name"; ?>

    + +

    text); ?>

    +
     
    + + + + + name; ?> + + _getGroupMemberCount(); ?> + id, GROUP, "group", "view-edit-options-group"); ?> + + +id"; + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ORDERED)){ + return $row[0]; + }else { + error("Count groupmembers: " . $result->toString()); + } + } + } + + public + function isAdmin(){ + return $this->admin; + } +} + +?> \ No newline at end of file diff --git a/inside/Groups.php b/inside/Groups.php new file mode 100644 index 0000000..1d0e7b1 --- /dev/null +++ b/inside/Groups.php @@ -0,0 +1,75 @@ +__construct($restriction); + } + + function __construct($restriction = NULL){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("Groups: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + + if (!checkAuth("view-protected-users")){ + $condition = "AND id != 1"; + }else { + $condition = ""; + } + if (isAdmin() == true || checkAuth("view-protected-users")){ + $sql = "SELECT id, name FROM din_group"; + }else if ($restriction == "admin-only"){ + $sql = sprintf("SELECT DISTINCT g.id, g.name FROM din_group g, din_group g2, din_division d, din_usergrouprelationship ugr " . + "WHERE g.division_id = d.id " . + "AND g2.division_id = d.id " . + "AND ugr.group_id = g2.id " . + "AND g2.admin = 1 " . + "AND ugr.user_id = %s " . + "ORDER BY name", + getCurrentUser()); + }else { + $sql = "SELECT id, name " . + "FROM din_group " . + "WHERE id != 1 " . + "ORDER BY name"; + } + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->groups = $result; + }else { + error($result->toString()); + } + } + + public function getList(){ + return $this->groups; + } + + public function displayList($limit = 25){ + if ($this->groups->numRows() > 0){ +?> + + + + + + +groups->fetchRow(DB_FETCHMODE_OBJECT)){ + $group = new Group($row->id); + $group->displayList(); + } + print("
    gruppenavnmedlemmer 
    "); + }else { + print("

    Ingen grupper registrert.

    "); + } + } + +} +?> diff --git a/inside/Job.php b/inside/Job.php new file mode 100644 index 0000000..539050f --- /dev/null +++ b/inside/Job.php @@ -0,0 +1,303 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New job + if ($data == NULL){ + error("Job: No data supplied."); + }else { + $this->registered = date("Y-m-d H:i:s"); + $this->user_id_registered = getCurrentUser(); + $this->published = date("Y-m-d H:i:s"); + $this->position_id = (isset($data['positionid'])) ? $data['positionid'] : 0; + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + if ($data == NULL){ + notify("Stillingen du søkte er ikke tilgjengelig. Bruk skjemaet under om du vil rapportere problemet."); + displayBugReportForm("job"); + $this->id = NULL; + } + $this->jobcategory_title = $data['jobcategory_title']; + $this->registered = $data['registered']; + $this->user_id_registered = $data['user_id_registered']; + $this->published = $data['published']; + $this->position_id = (isset($data['position_id'])) ? $data['position_id'] : 0; + + } + } + //Common initializations + $this->name = stripcslashes($data['name']); + $this->text = stripcslashes($data['text']); + $this->jobcategory_id = $data['jobcategory_id']; + $this->contactInfo = $data['contactInfo']; + $this->expires = $data['expires']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId("din_job"); + $sql = sprintf("INSERT INTO din_job + (id, name, text, jobcategory_id, contactInfo, + registered, user_id_registered, published, + expires, position_id) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->jobcategory_id), + $this->conn->quoteSmart($this->contactInfo), + $this->conn->quoteSmart($this->registered), + $this->conn->quoteSmart($this->user_id_registered), + $this->conn->quoteSmart($this->published), + $this->conn->quoteSmart($this->expires), + $this->conn->quoteSmart($this->position_id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['jobid'] = $this->id; + + $sql = sprintf("INSERT INTO din_jobupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Job registered.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("New job registered and stored."); + }else { + $this->conn->rollback(); + error("New jobb: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New job: " . $result->toString()); + } + }else { + error("New job: " . $result->toString()); + } + + }else { + $sql = sprintf("UPDATE din_job SET + name = %s, + text = %s, + jobcategory_id = %s, + contactInfo = %s, + expires = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->jobcategory_id), + $this->conn->quoteSmart($this->contactInfo), + $this->conn->quoteSmart($this->expires), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $sql = sprintf("INSERT INTO din_jobupdate + VALUES (NULL, NOW(), %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(getCurrentUser()), + $this->conn->quoteSmart("Job updated.") + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Job updated."); + }else { + $this->conn->rollback(); + error("Update job: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("Update job: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("Update job: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT j.*, jc.title AS jobcategory_title + FROM din_job j, din_jobcategory jc + WHERE j.id = $this->id + AND j.jobcategory_id = jc.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Jobs: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_job + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Job deleted."); + }else { + error($result->toString()); + } + } + + public function display(){ + if ($this->id == NULL){ + return false; + } + $this->_markAsRead(); +?> +
    +
    + Publisert: published); ?> + Utgår: expires); ?> +
    + +id, JOB, "job", "view-edit-options-job"); +?> +

    name; ?>

    + +

    text); ?>

    +

    kontaktinfo:

    +

    contactInfo); ?>

    +
    + +_readByCurrentUser(); + $division = $this->_getLinkedToPosDivName(); + ?> + + + + name; ?> + jobcategory_title; ?> + + published, "td"); ?> + expires, "td"); ?> + id, JOB, "job", "view-edit-options-job"); ?> + + +position_id > 0){ + $sql = "SELECT d.name + FROM din_position p, din_division d + WHERE $this->position_id = p.id + AND p.division_id = d.id"; + $result = $this->conn->query($sql); + if (DB::isError($result) == true){ + notify("Job: " . $result->toString()); + return "utilgjengelig"; + }else { + if ($row =& $result->fetchRow(DB_FETCHMODE_ORDERED)){ + return $row[0]; + }else { + return "utilgjengelig"; + } + } + }else { + return "uspesifisert"; + } + } + + public function _markAsRead(){ + if ($this->_readByCurrentUser() == true){ + return; + } + + $user = getCurrentUser(); + if ($user == false){ + return; + } + + $sql = sprintf("INSERT INTO din_jobread VALUES + (%s, %s, NOW())", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Job marked as read."); + }else { + error($result->toString()); + } + } + + public function _readByCurrentUser(){ + $user = getCurrentUser(); + if ($user == false){ + return false; + } + + $sql = sprintf("SELECT job_id FROM din_jobread + WHERE job_id = %s + AND user_id = %s", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($user) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if($result->numRows() > 0){ + return true; + } + }else { + error($result->toString()); + } + return false; + } + + +} + +?> \ No newline at end of file diff --git a/inside/JobCategories.php b/inside/JobCategories.php new file mode 100644 index 0000000..d2752c0 --- /dev/null +++ b/inside/JobCategories.php @@ -0,0 +1,47 @@ +__construct(); + } + + function __construct(){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("JobCategories: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + + $sql = "SELECT id, title FROM din_jobcategory"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->categories = $result; + } + } + + public function getCategories(){ + return $this->categories; + } + + public function displayList(){ + ?> + + + + + +categories->fetchRow(DB_FETCHMODE_ASSOC)){ + $jobCat = new JobCategory($row['id']); + $jobCat->displayList(); + } + print("
    stillingstyper 
    "); + } +} +?> \ No newline at end of file diff --git a/inside/JobCategory.php b/inside/JobCategory.php new file mode 100644 index 0000000..82cc0da --- /dev/null +++ b/inside/JobCategory.php @@ -0,0 +1,125 @@ +__construct($id, $data); + } + + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + $this->id = $id; + + if ($id == NULL){//New job + if ($data == NULL){ + error("JobCategory: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->title = $data['title']; + $this->text = $data['text']; + } + + public function store(){ + $this->conn->autoCommit(false); + if ($this->id == NULL){ + $this->id = getNextId('din_jobcategory'); + $sql = sprintf("INSERT INTO din_jobcategory VALUES + (%s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart(scriptParam("title")), + $this->conn->quoteSmart(scriptParam("text")) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $GLOBALS['extraScriptParams']['jobcategoryid'] = $this->id; + if ($this->conn->commit()){ + notify("New Job Category registered and stored."); + }else { + $this->conn->rollback(); + error("New Job Category: " . $result->toString()); + } + }else { + $this->conn->rollback(); + error("New Job Category: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE din_jobcategory SET + title = %s, + text = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if ($this->conn->commit()){ + notify("Job Category updated."); + }else { + $this->conn->rollback(); + error("New Job Category: " . $result->toString()); + } + }else { + error("Update Job Category: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_jobcategory dc + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Job category: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_jobcategory + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + notify("Job category deleted."); + }else { + error($result->toString()); + } + } + + public function displayList(){ + + ?> + + title; ?> + text); ?> + id, JOBCAT, + "jobcategory", "view-edit-options-jobcategory"); ?> + + + \ No newline at end of file diff --git a/inside/Jobs.php b/inside/Jobs.php new file mode 100644 index 0000000..78059ed --- /dev/null +++ b/inside/Jobs.php @@ -0,0 +1,74 @@ +__construct($selection); + } + + function __construct($selection = "0000-00-00"){ + $this->conn = db_connect(); + } + + public function display($selection = "0000-00-00"){ + $sql = "SELECT id FROM din_job + ORDER BY published DESC + WHERE expires > $selection"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){ + while ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + displayOptionsMenu($row['id'], "job"); + $job = new Job($row['id']); + $job->display(); + } + }else { + print("Ingen stillinger er registrert."); + } + }else { + error("Jobs: " . $result->toString()); + } + + } + + public function displayList($selection = "0000-00-00"){ + $sql = "SELECT id FROM din_job + WHERE expires > $selection + ORDER BY published DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($result->numRows() > 0){?> +

    Antall treff: numRows(); ?>

    + + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $job = new Job($row['id']); + $job->displayList(); + } + print("
     titteltypeforeningpublisertutgår
    "); + }else { + error("Jobs: " . $result->toString()); + } + + } + +} + + +?> diff --git a/inside/Locations.php b/inside/Locations.php new file mode 100644 index 0000000..c1b9b23 --- /dev/null +++ b/inside/Locations.php @@ -0,0 +1,43 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect("dns"); + $sql = "SELECT id AS locationId, navn AS locationTitle + FROM lokaler + ORDER BY navn ASC"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->locations = $result; + } + } + + public function getList(){ + return $this->locations; + } + + public function displayList(){ + ?> + + + + + +locations->fetchRow(DB_FETCHMODE_ASSOC)){ + $loc = new Location($row['locationId']); + $loc->displayList(); + } + print("
    lokaler 
    "); + } + +} +?> \ No newline at end of file diff --git a/inside/Messages.php b/inside/Messages.php new file mode 100644 index 0000000..d94847a --- /dev/null +++ b/inside/Messages.php @@ -0,0 +1,37 @@ + +
    +

    Beskjeder

    + +
      +$msg\n"); + }else { + foreach ($GLOBALS['messages'] as $e){ + print("
    • $e
    • \n"); + } + }?> +
    +
    + \ No newline at end of file diff --git a/inside/Navigation.php b/inside/Navigation.php new file mode 100644 index 0000000..d13f1d5 --- /dev/null +++ b/inside/Navigation.php @@ -0,0 +1,282 @@ + + + diff --git a/inside/Nordea.php b/inside/Nordea.php new file mode 100644 index 0000000..f6b374e --- /dev/null +++ b/inside/Nordea.php @@ -0,0 +1,156 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New Nordea-lead + if ($data == NULL){ + error("Nordea-lead: No data supplied."); + } + }else {//ID set, existing lead + if ($data != NULL){//Update existing lead + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->firstname = $data['firstname']; + $this->lastname = $data['lastname']; + $this->email = $data['email']; + $this->phonenumber = $data['phonenumber']; + } + + public function store(){ + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO din_nordea + (id, firstname, lastname, email, phonenumber) + VALUES + (%s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->firstname), + $this->conn->quoteSmart($this->lastname), + $this->conn->quoteSmart($this->email), + $this->conn->quoteSmart($this->phonenumber) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Ønske om å bli kontakt av Nordea er registrert."); + $sendto = "student@nordea.no"; + $subject = "Nytt lead fra Studentersamfundet"; + $message = "Dette er en autogenerert epost som blir sendt hver gang et nytt medlem har haket av for ønske om å bli kontaktet av Nordea. Denne personen har nettopp kjøpt medlemskap i Studentersamfundet og registrert seg på nettsidene våre." . + "\n" . + "\nEt nytt lead er registrert:" . + "\n" . + "\n$this->firstname $this->lastname" . + "\n" . + "\nEpost: $this->email". + "\nTelefon: $this->phonenumber" . + "\n" . + "\nmvh" . + "\nStudentersamfundet"; + $headers = 'From: nordea@studentersamfundet.no'."\r\n"; + $headers .= 'Cc: support@studentersamfundet.no'."\r\n"; + mail($sendto, $subject, $message, $headers); + + }else { + error("New nordea: " . $result->toString()); + notify("Problemer med å registrere Nordealead."); + } + + }else { + //Not finished + $sql = sprintf("UPDATE din_nordea SET + name = %s, + text = %s, + phone = %s, + email = %s, + office = %s, + user_id_contact = %s, + url = %s, + nordeacategory_id = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->phone), + $this->conn->quoteSmart($this->email), + $this->conn->quoteSmart($this->office), + $this->conn->quoteSmart($this->user_id_contact), + $this->conn->quoteSmart($this->url), + $this->conn->quoteSmart($this->nordeacategory_id), + $this->conn->quoteSmart($this->id) + ); + +// $result = $this->conn->query($sql); +// if (DB::isError($result) != true){ +// notify("Nordea-lead oppdatert."); +// }else { +// error("Update nordea lead: " . $result->toString()); +// } + + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_nordea + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + $row['text'] = stripslashes($row['text']); + return $row; + } + }else { + error("nordea: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_nordea + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + if ($conn->affectedRows() > 0){ + notify("Nordea-lead slettet."); + }else { + notify("Ugyldig lead-id, ingen handling utført."); + } + } + } + + public function display(){ + + } + + public function displayList(){ + + } + +} + +?> \ No newline at end of file diff --git a/inside/Order.php b/inside/Order.php new file mode 100644 index 0000000..b605d98 --- /dev/null +++ b/inside/Order.php @@ -0,0 +1,316 @@ +__construct($id, $data); + } + + public + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){// Order + $this->order_status_id = 1;//New empty order created + $this->comment = "Order created."; + $this->user_id = getCurrentUser(); + + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->user_id = $data['user_id']; + $this->timestamp = $data['timestamp']; + $this->order_status_id = $data['order_status_id']; + $this->order_status_value = $data['order_status_value']; + $this->comment = $data['comment']; + + } + } + //Common initializations + } + + public + function store(){ + if ($this->id == NULL){ + $this->id = getNextId("din_order"); + $sql = sprintf("INSERT INTO din_order + (id, user_id, timestamp, comment) + VALUES + (%s, %s, NOW(), %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->user_id), + $this->conn->quoteSmart($this->comment) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Ny ordre lagret."); + }else { + error("New order: " . $result->toString()); + } + } + } + + public + function setStatus($value) { + $sql = "UPDATE din_order SET + order_status_id = $value + WHERE " . + " id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Orderstatus oppdatert ($value)"); + }else { + error("Set status - order: " . $result->toString()); + } + } + + public + function addOrderItem($data) { + $data['order_id'] = $this->id; + $data['discount'] = 0; + $item = new OrderItem(NULL, $data); + $item->store(); + return true; + //$this->_updateTotalPrice(); + } + + public + function _updateTotalPrice(){ + + } + + public + function _retrieveData(){ + $sql = "SELECT o.*, os.value AS order_status_value + FROM din_order o, din_order_status os + WHERE o.id = $this->id " . + "AND o.order_status_id = os.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Order: " . $result->toString()); + } + } + + public + /*static*/ + function delete($id){ + $order = new Order($id); + $order->setStatus(5); + } + + public + function getItems() { + $sql = "SELECT oi.id " . + "FROM din_order_item oi " . + "WHERE oi.order_id = $this->id"; + $result =& $this->conn->query($sql); + return $result; + } + + public + function calculateTotalAmount() { + $items = $this->getItems(); + $amount = 0; + + while ($row =& $items->fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + $product = new Product($item->product_id); + $amount = $amount + $item->quantity * $product->price; + } + return $amount; + } + + public + function display(){ + $items = $this->getItems(); +?> +
    +

    Din handlekurv

    +numRows() > 0){?> + +
    +
    + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + $item->displayList(); + } + ?> + + + + +
    vareprisantall
    +

    Har du gjort endringer? oppdatér

    +
    +

    Handle mer? tilbake til produkter

    + +
    +
    + +
    +

    Er du ferdig? gå til betaling

    +
    + toString()); + } +?> +
    + +getItems(); + ?> +
    +

    Handlekurv #id; ?>

    + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + $item->displayShortList(); + } + ?> + + + + +
    vareprisantall
    +

    Ordrestatus: order_status_value; ?> + order_status_id < 3) { ?> +

    + rediger ordre + slett ordre + gå til betaling +

    + toString()); + } +?> +
    +getItems(); + $text = ""; + while ($row =& $items->fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + $text .= $item->getConfirmationText(); + } + return $text; + } + + public + function displayConfirmation(){ + $items = $this->getItems(); +?> +numRows() > 0){?> + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + $item->displayShortList(); + } + ?> + + + + +
    vareprisantall
    + toString()); + } + } + + public function performOperations() { + $items = $this->getItems(); + while ($row =& $items->fetchRow(DB_FETCHMODE_ASSOC)){ + $item = new OrderItem($row['id']); + + if ($item->product_id == 1) { + // new membership + $user = new User($this->user_id); + $cardno = $user->cardno; + if ($cardno == NULL) { + if (!$user->registerMembershipPayex()){ + return false; + } + } else { + if(!$user->renewMembershipPayex()){ + return false; + } + } + } elseif ($item->product_id == 12) { + // send new membercard + $user = new User($this->user_id); + if (!$user->renewMembercardPayex()) { + return false; + } + } + } + } +} + +?> \ No newline at end of file diff --git a/inside/OrderItem.php b/inside/OrderItem.php new file mode 100644 index 0000000..db9fba9 --- /dev/null +++ b/inside/OrderItem.php @@ -0,0 +1,197 @@ +__construct($id, $data); + } + + public + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){// OrderItem + + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + //Common initializations + $this->product_id = $data['product_id']; + $this->quantity = $data['quantity']; + $this->order_id = $data['order_id']; + $this->discount = $data['discount']; + $this->comment = isset($data['comment']) ? $data['comment'] : ''; + } + + public function store(){ + if ($this->id == NULL){ + $this->id = getNextId("din_order_item"); + $sql = sprintf("INSERT INTO din_order_item + (id, product_id, quantity, order_id, discount, comment) + VALUES + (%s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->product_id), + $this->conn->quoteSmart($this->quantity), + $this->conn->quoteSmart($this->order_id), + $this->conn->quoteSmart($this->discount), + $this->conn->quoteSmart($this->comment) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Nytt ordreelement lagret."); + }else { + error("New order_item: " . $result->toString()); + } + } + } + + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_order_item t + WHERE t.id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("OrderItem: " . $result->toString()); + } + } + + public + function setQuantity($value) { + $sql = "UPDATE din_order_item SET + quantity = $value + WHERE " . + " id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Orderstatus oppdatert ($value)"); + }else { + error("Set quantity - order_item: " . $result->toString()); + } + } + + public + function setComment($value) { + $sql = "UPDATE din_order_item SET + comment = '$value' + WHERE " . + " id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Orderstatus oppdatert ($value)"); + }else { + error("Set comment - order_item: " . $result->toString()); + } + } + + public + /*static*/ + function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_order_item + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + if ($conn->affectedRows() > 0){ + //notify("Varen er slettet fra handlekurven."); + }else { + //notify("Ugyldig order_itemid, ingen handling utført."); + } + }else { + error($result->toString()); + } + } + + public function display(){ + $product = new Product($this->product_id); +?> +
    +

    Ordrebekreftelse

    +

    Ditt kjøp er gjennomført. På kontoutskriften din vil det stå Payex AS.

    +

    Ordren har referansen #id;?>.

    + + + + + + + + +
    produktpris
    title; ?>
    description; ?>
    price); ?>
    + +

    Du vil få tilsendt medlemskort i posten i løpet av 6-12 dager.

    +

    Om du allerede har medlemskort vil du kun få tilsendt nytt oblat for inneværende år.

    +

    For spørsmål vedrørende medlemskapet eller transaksjonen kan du kontakte support@studentersamfundet.no.

    + +
    + +product_id); + ?> + + title; ?>
    + description); ?>
    + allow_comment == 1) { ?> + Kommentar:
    + + + + price); ?> + + +product_id); + ?> + + title; ?> + price); ?> + quantity; ?> + +product_id); + $text = $this->quantity . " " . $product->title . " á " . formatPrice($product->price) . "\n"; + return $text; + } +} + +?> \ No newline at end of file diff --git a/inside/OrderStatuses.php b/inside/OrderStatuses.php new file mode 100644 index 0000000..944b2e7 --- /dev/null +++ b/inside/OrderStatuses.php @@ -0,0 +1,27 @@ +__construct(); + } + + function __construct(){ + $this->conn =& db_connect(); + } + + public + function getList(){ + $sql = "SELECT * FROM din_order_status"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error($result->toString()); + } + } +} +?> diff --git a/inside/Page.php b/inside/Page.php new file mode 100644 index 0000000..d116ef8 --- /dev/null +++ b/inside/Page.php @@ -0,0 +1,3094 @@ +__construct(); + } + + function __construct(){ + $this->page_title = "Studentersamfundet Inside"; + $this->page = scriptParam("page"); + $this->section = getSectionFromPage($this->page);//scriptParam("section"); + if (isset($_SESSION['theme'])){ + $this->theme = $_SESSION['theme']; + }else { + $this->theme = 'screen.css'; + } + } + + public function display(){ + $this->_displayHeader(); + ?> + +
    + +_displayNavigation(); +?> +
    + 0){ + Errors::display(); + } + if ($GLOBALS['msg_counter'] > 0){ + Messages::display(); + } + if (isset($GLOBALS['extraScriptParams']['report-bug'])){ + displayBugReportForm($GLOBALS['extraScriptParams']['report-bug']); + } + + $GLOBALS['beginHTML'] = true; + + + if (!isset($_SESSION['valid-user'])){ + if ($this->page == 'register-user'){ + $this->_registerUser(); + }else { + displayLogin(); + } + }else { + ?> + +page) || checkResponsible()){ + + //Determine what page to display + switch ($this->page) { + case "welcome": + $this->_displayWelcome(); + break; + + case "home": + $this->_displayHome(); + break; + + case "reset-password": + $this->_resetPassword(); + break; + + case "display-article": + $this->_displayArticle(); + break; + + case "display-articles": + $this->_displayArticles(); + break; + + case "register-article": + $this->_registerArticle(); + break; + + case "edit-article": + $this->_editArticle(); + break; + + case "display-jobs": + $this->_displayJobs("NOW()"); + break; + + case "display-jobs-archive": + $this->_displayJobs("0000-00-00"); + break; + + case "display-job": + $this->_displayJob(); + break; + + case "register-job": + $this->_registerJob(); + break; + + case "edit-job": + $this->_editJob(); + break; + + case "display-barshifts": + $this->_displayBarShifts("NOW()"); + break; + + case "display-barshifts-calendar": + $this->_displayBarShiftsCalendar(); + break; + + case "display-barshift": + $this->_displayBarShift(); + break; + + case "register-barshift": + $this->_registerBarShift(); + break; + + case "edit-barshift": + $this->_editBarShift(); + break; + + case "display-divisions": + $this->_displayDivisions(); + break; + + case "display-division": + $this->_displayDivision(); + break; + + case "register-division": + $this->_registerDivision(); + break; + + case "edit-division": + $this->_editDivision(); + break; + + case "display-positions": + $this->_displayPositions("NOW()"); + break; + + case "display-positions-archive": + $this->_displayPositions("0000-00-00"); + break; + + case "display-position": + $this->_displayPosition(); + break; + + case "register-position": + $this->_registerPosition(); + break; + + case "edit-position": + $this->_editPosition(); + break; + + case "display-events": + $this->_displayEvents("NOW()"); + break; + + case "display-events-archive": + $this->_displayEvents("0000-00-00"); + break; + + case "display-events-calendar": + $this->_displayEventsCalendar(); + break; + + case "display-event": + $this->_displayEvent(); + break; + + case "register-event": + $this->_registerEvent(); + break; + + case "edit-event": + $this->_editEvent(); + break; + + case "display-concerts": + $this->_displayConcerts("NOW()"); + break; + + case "display-concerts-calendar": + $this->_displayConcertsCalendar(); + break; + + case "display-concert": + $this->_displayConcert(); + break; + + case "register-concert": + $this->_registerConcert(); + break; + + case "edit-concert": + $this->_editConcert(); + break; + + case "edit-concertreport": + $this->_editConcertReport(); + break; + + case "display-all-calendar": + $this->_displayAllCalendar(); + break; + + case "week-program": + $this->_displayWeekProgram(); + break; + + case "program-selection": + $this->_displayProgramSelection(); + break; + + case "edit-program-selection": + $this->_editProgramSelection(); + break; + + case "display-documents": + $this->_displayDocuments(); + break; + + case "upload-document": + $this->_uploadDocument(); + break; + + case "edit-document": + $this->_editDocument(); + break; + + case "display-groups": + $this->_displayGroups(); + break; + + case "register-group": + $this->_registerGroup(); + break; + + case "display-group": + case "edit-group": + $this->_editGroup(); + break; + + case "display-actions": + $this->_displayActions(); + break; + + case "register-action": + $this->_registerAction(); + break; + + case "display-action": + case "edit-action": + $this->_editAction(); + break; + + case "display-actiongrouprelationships": + $this->_displayActionGroupRelationships(); + break; + + case "register-actiongrouprelationship": + $this->_registerActionGroupRelationship(); + break; + + case "display-division-requests": + $this->_displayDivisionRequests(); + break; + + case "display-usergrouprelationships": + $this->_displayUserGroupRelationships(); + break; + + case "register-usergrouprelationship": + $this->_registerUserGroupRelationship(); + break; + + case "display-users": + $this->_displayUsers(); + break; + + case "display-user-expiries": + $this->_displayUserExpiries(); + break; + + case "display-users-study-place": + $this->_displayUsersStudyPlace(); + break; + + case "register-user-ea-update": + $this->_registerUserEAUpdate(); + break; + + case "register-membership-bankpayment": + $this->_registerUserMembershipBankpayment(); + break; + + case "register-user": + $this->_registerUser(); + break; + + case "display-current-user": + $this->_editUser(getCurrentUser()); + break; + + case "display-user": + case "edit-user": + $this->_editUser(); + break; + + case "change-username": + $this->_changeUsername(); + break; + + case "register-membership": + $this->_registerMembership(); + break; + + case "renew-membership": + $this->_renewMembership(); + break; + + case "register-membership-payex-confirm": + $this->_registerMembershipPayexConfirm(); + break; + + case "payex-form": + $this->_payexForm(); + break; + + case "register-documentcategory": + $this->_registerDocumentCategory(); + break; + + case "edit-documentcategory": + $this->_editDocumentCategory(); + break; + + case "register-eventcategory": + $this->_registerEventCategory(); + break; + + case "edit-eventcategory": + $this->_editEventCategory(); + break; + + case "register-jobcategory": + $this->_registerJobCategory(); + break; + + case "edit-jobcategory": + $this->_editJobCategory(); + break; + + case "display-product": + $this->_displayProduct(); + break; + + case "display-products": + case "register-product": + $this->_registerProduct(); + break; + + case "edit-product": + $this->_editProduct(); + break; + + case "display-bugreport": + $this->_displayBugReport(); + break; + + case "display-bugreports": + $this->_displayBugReports(); + break; + + case "buy-ticket-galla": + $this->_buyTicketGalla(); + break; + + case "display-webshop": + $this->_displayWebshop(); + break; + + case "display-sales": + $this->_displaySales(); + break; + + case "display-sales-item": + $this->_displaySalesItem(); + break; + + case "display-cart": + $this->_displayCart(); + break; + + case "display-carts": + $this->_displayCarts(); + break; + + case "cart-checkout": + $this->_cartCheckout(); + break; + + case "transaction-confirmation": + $this->_transactionConfirmation(); + break; + + case "display-sms-log": + $this->_displaySmsLog(); + break; + + default: + $this->_displayHome(); + } + + }else { + $this->_displayAccessDenied(); + } + } +?> +
    +Script execution: $time seconds || support
    \n"); + +?> + + + + + + + + + + + + + + + + + + + + + + + + + + + <?php print $this->page_title; ?> + + + +display(); + } + + public + function _displayWelcome(){ + print "

    Velkommen til Studentersamfundets Intranett.

    \n"; + } + + public + function _displayHome(){ + $user = new User(getCurrentUser()); +?> +
    +

    Velkommen til Studentersamfundets medlemssider!

    +
    +

    Du er logget inn som .

    +

    membershipStatus()?>

    + + +

    Kjøp medlemskap for neste år allerede nå!

    +

    Kjøp direkte med kredittkort eller registrér medlemskap kjøpt i bar nå!

    + + +

    Registrér eller kjøp medlemskap

    + +

    Registrér eller kjøp medlemskap

    + +

    Oppdatér din brukerinformasjon

    +

    Endre brukernavn

    + + +

    Du har ikke registrert medlemskort

    +

    Om du har kjøpt medlemskap må du registrere kortnummer og kode.

    +

    Du kan også kjøpe medlemskap med VISA-kort.

    + +

    Medlemskapet ditt er utgått!

    +

    Om du har kjøpt medlemskap i en av barene på huset må du aktivere medlemskapet ditt med aktiveringsnummer og aktiveringskode!

    +

    Du kan også kjøpe medlemskap med VISA-kort.

    + +
    +

    Hva vil du gjøre?

    + + + +

    For administrator

    + + "søk etter medlem", "type" => "text", + "attributes" => Array("name" => "search")); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display("horizontal"); + } +?> + + +
    + + +
    +

    Du har ikke tilgang til å se denne siden. Om du tror du skulle hatt tilgang, vennligst kontakt support.

    + +

    Det kan også hende at siden du forsøkte å besøke ikke er publisert ennå.

    +
    + +Passordet ditt er nettopp blitt resatt. Bruk skjemaet under til å endre passordet til noe som er lettere å huske.

    "); + $title = "endre passord"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-password"; + $fields = Array(); + + $fields[] =Array("label" => "nytt passord", "type" => "password", + "attributes" => Array("name" => "password1")); + $fields[] =Array("label" => "gjenta passord", "type" => "password", + "attributes" => Array("name" => "password2")); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + } + + public function _displayJobs($selection = "0000-00-00"){ + $jobs = new Jobs(); + $jobs->displayList($selection); + } + + public function _displayJob(){ + $jobId = scriptParam("jobid"); + $job = new Job($jobId); + $job->display(); + } + + public function _registerJob(){ + $posId = scriptParam("positionid"); + if (!empty($posId)){ + $pos = new Position($posId); + } + + $positions = new Positions(); + $posList = $positions->getList(); + + $jobCat = new JobCategories(); + $categories = $jobCat->getCategories(); + + $user = new User(getCurrentUser()); + $contactInfo = $user->getContactInfo(); + + print("

    Merk: stillinger som ikke er basert på stillingsbeskrivelser vil ikke vises på /jobb-sidene.

    "); + + $title = "registrér stillingsutlysning"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-job&page=display-job"; + $fields = array(); + + if (!isset($pos)){ + $fields[] = Array("label" => "positionid", "type" => "hidden", + "attributes" => Array("name" => "positionid")); + $fields[] = Array("label" => "eksisterende stilling?", "type" => "radio", + "attributes" => Array("name" => "linkedToPos", "values" => Array("job-true", "job-false"), + "labels" => Array("ja", "nei"), + "value" => "job-false")); + $fields[] = Array("label" => "→", "type" => "multilist", + "attributes" => Array("name" => "positionList", "disabled" => true, + "values" => $posList)); + $comment = NULL; + }else { + $fields[] = Array("label" => "positionid", "type" => "hidden", + "attributes" => Array("name" => "positionid", "value" => "$posId")); + + $comment ="

    $pos->name i $pos->division_name

    \n +Teksten under er hentet fra kunnskapsdatabasen. Du står fritt til å endre den etter eget ønske. Endringer som gjøres i kunnskapsdatabasen etter denne utlysningen er registrert vil ikke gjenspeiles her. Stillingen er imidlertid knyttet opp mot stillingsbeskrivelsen, og vil bli annosert sammen med denne også."; + } + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => (isset($pos->name)) ? $pos->name : "")); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 12, "comment" => $comment, + "class" => "mceEditor", + "value" => (isset($pos->text)) ? $pos->text : "")); + $fields[] = Array("label" => "utgår", "type" => "datetime", + "attributes" => Array("name" => "expires")); + $fields[] = Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "jobcategory_id", "values" => $categories)); + $fields[] = Array("label" => "kontaktinfo", "type" => "textarea", + "attributes" => Array("name" => "contactInfo", + "comment" => "Epostadresser blir automatisk gjort om til linker ved visning.", + "cols" => 70, "rows" => 4, + "value" => $contactInfo)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editJob(){ + $jobCat = new JobCategories(); + $categories = $jobCat->getCategories(); + + $jobId = scriptParam("jobid"); + $job = new Job($jobId); + $title = "redigér stillingsutlysning"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-job&page=display-job"; + $fields = Array(Array("label" => "jobid", "type" => "hidden", + "attributes" => Array("name" => "jobid", "value" => "$jobId")), + Array("label" => "stilling", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $job->name)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 15, + "class" => "mceEditor", + "value" => $job->text)), + Array("label" => "utgår", "type" => "datetime", + "attributes" => Array("name" => "expires", + "value" => substr($job->expires, 0, 16))), + Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "jobcategory_id", "values" => $categories, + "currentValue" => $job->jobcategory_id)), + Array("label" => "kontaktinfo", "type" => "textarea", + "attributes" => Array("name" => "contactInfo", "cols" => 70, "rows" => 4, + "value" => $job->contactInfo)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayBarShifts($selection = "0000-00-00"){ + $barshifts = new BarShifts(); + $barshifts->displayList($selection); + } + + public function _displayBarshiftsCalendar(){ + $calendar = new Calendar("barshifts"); + $month = scriptParam("month"); + if (!empty($month)){ + $year = substr($month, 0, 4); + $month = substr($month, 4, 2); + }else { + $year = date("Y"); + $month = date("m"); + } + $calendar->display($year, $month); + } + + public function _displayBarShift(){ + $barshiftId = scriptParam("barshiftid"); + $barshift = new BarShift($barshiftId); + $barshift->display(); + } + + public function _registerBarShift(){ + + $locs = new Locations(); + $locations = $locs->getList(); + + + $title = "registrregistrérr barvakt"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-barshift&page=display-barshift"; + $fields = array(); + + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "title" ,"size" => 50, "maxlength" => 255)); + $fields[] = Array("label" => "sted", "type" => "select", + "attributes" => Array("name" => "location_id", "values" => $locations)); + $fields[] = Array("label" => "dato", "type" => "date", + "attributes" => Array("name" => "date")); + $fields[] = Array("label" => "start", "type" => "time", + "attributes" => Array("name" => "start")); + $fields[] = Array("label" => "slutt", "type" => "time", + "attributes" => Array("name" => "end")); + $fields[] = Array("label" => "antall folk", "type" => "text", + "attributes" => Array("name" => "num_workers" ,"size" => 3, "maxlength" => 3)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editBarShift(){ + $locs = new Locations(); + $locations = $locs->getList(); + + $barshiftid = scriptParam("barshiftid"); + $barshift = new BarShift($barshiftid); + $title = "redigér barvakt"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-barshift&page=display-barshift"; + $fields = Array(); + + $fields[] = Array("label" => "barshiftid", "type" => "hidden", + "attributes" => Array("name" => "barshiftid", "value" => $barshiftid)); + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "title" ,"size" => 50, "maxlength" => 255, + "value" => $barshift->title)); + $fields[] = Array("label" => "sted", "type" => "select", + "attributes" => Array("name" => "location_id", "values" => $locations, + "currentValue" => $barshift->location_id)); + $fields[] = Array("label" => "dato", "type" => "date", + "attributes" => Array("name" => "date", + "value" => $barshift->date)); + $fields[] = Array("label" => "start", "type" => "time", + "attributes" => Array("name" => "start", + "value" => formatTime($barshift->start))); + $fields[] = Array("label" => "slutt", "type" => "time", + "attributes" => Array("name" => "end", + "value" => formatTime($barshift->end))); + $fields[] = Array("label" => "antall folk", "type" => "text", + "attributes" => Array("name" => "num_workers" ,"size" => 3, "maxlength" => 3, + "value" => $barshift->num_workers)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayDivisions(){ + $divisions = new Divisions(); + $divisions->displayList(); + } + + public function _displayDivision(){ + $divisionId = scriptParam("divisionid"); + $division = new Division($divisionId); + if ($division->name != NULL){ + $division->display(); + }else { + error(DIVISION . ": no division found"); + } + } + + public function _registerDivision(){ + $divCatList = new DivisionCategories(); + $divCats = $divCatList->getCategories(); + $userList = new Users(); + $users = $userList->getList(); + + $title = "registrér ny forening eller nytt utvalg"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-division&page=display-divisions"; + $fields = Array(Array("label" => "foreningsnavn", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50)), + Array("label" => "type", "type" => "select", + "attributes" => Array("name" => "divisioncategory_id", "values" => $divCats)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 10, + "class" => "mceEditor")), + Array("label" => "telefon", "type" => "text", + "attributes" => Array("name" => "phone", "size" => 8, "maxlength" => 8)), + Array("label" => "epost", "type" => "text", + "attributes" => Array("name" => "email", "size" => 50, "maxlength" => 120)), + Array("label" => "hjemmeside", "type" => "text", + "attributes" => Array("name" => "url", "size" => 50, "maxlength" => 120)), + Array("label" => "kontor", "type" => "text", + "attributes" => Array("name" => "office", "size" => 3, "maxlength" => 3)), + Array("label" => "kontaktperson", "type" => "select", + "attributes" => Array("name" => "user_id_contact", "values" => $users)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editDivision(){ + $divCatList = new DivisionCategories(); + $divCats = $divCatList->getCategories(); + $userList = new Users(); + $users = $userList->getList(); + + $divId = scriptParam("divisionid"); + $div = new Division($divId); + $title = "endre forening eller utvalg"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=update-division&page=display-division"; + + $fields = Array(); + + $fields[] = Array("label" => "divisionid", "type" => "hidden", + "attributes" => Array("name" => "divisionid", "value" => "$divId")); + $fields[] = Array("label" => "foreningsnavn", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $div->name)); + $fields[] = Array("label" => "type", "type" => "select", + "attributes" => Array("name" => "divisioncategory_id", "values" => $divCats, + "currentValue" => $div->divisioncategory_id)); + + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 15, + "class" => "mceEditor", + "value" => $div->text)); + $fields[] = Array("label" => "telefon", "type" => "text", + "attributes" => Array("name" => "phone", "size" => 8, "maxlength" => 8, + "value" => $div->phone)); + $fields[] = Array("label" => "epost", "type" => "text", + "attributes" => Array("name" => "email", "size" => 50, "maxlength" => 120, + "value" => $div->email)); + $fields[] = Array("label" => "hjemmeside", "type" => "text", + "attributes" => Array("name" => "url", "size" => 50, "maxlength" => 120, + "value" => $div->url)); + $fields[] = Array("label" => "kontor", "type" => "text", + "attributes" => Array("name" => "office", "size" => 3, "maxlength" => 3, + "value" => $div->office)); + $fields[] = Array("label" => "kontaktperson", "type" => "select", + "attributes" => Array("name" => "user_id_contact", "values" => $users, + "currentValue" => $div->user_id_contact)); + $fields[] =Array("label" => "bilde", "type" => "file", + "attributes" => Array("name" => "userfile", "size" => 55)); + + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayPositions($selection = "0000-00-00"){ + $division = scriptParam("divisionid"); + $divList = new Divisions(); + $divs = $divList->getListAllWithPositions(); + + $current = scriptParam("divisionid"); + + $title = "vis stillingsbeskrivelser"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-positions"; + $fields = Array(); + + $fields[] = Array("label" => "Vis stillingsbeskrivelser fra ", "type" => "select", + "attributes" => Array("name" => "divisionid", "values" => $divs, + "currentValue" => $current)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + if (!empty($current)){ + $positions = new Positions(); + $positions->displayList($current); + } + } + + public function _displayPosition(){ + $positionId = scriptParam("positionid"); + $position = new Position($positionId); + $position->display(); + } + + public function _displayUsersStudyPlace() { + $users = new Users(); + $users->displayUsersStudyPlaceList(); + } + + public function _registerPosition(){ + $divList = new Divisions(); + $divisions = $divList->getList(); + + $title = "registrér stillingsbeskrivelse"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-position&page=display-positions"; + $fields = Array(Array("label" => "stilling", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 10, + "class" => "mceEditor")), + Array("label" => "foreningstilknytning", "type" => "select", + "attributes" => Array("name" => "division_id", "values" => $divisions)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editPosition(){ + $divList = new Divisions(); + $divisions = $divList->getList(); + + $positionId = scriptParam("positionid"); + $position = new Position($positionId); + $title = "oppdatér stillingsbeskrivlse"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-position&page=display-position"; + $fields = Array(Array("label" => "positionid", "type" => "hidden", + "attributes" => Array("name" => "positionid", "value" => "$positionId")), + Array("label" => "stilling", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $position->name)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 10, + "class" => "mceEditor", + "value" => $position->text)), + Array("label" => "foreningstilknytnig", "type" => "select", + "attributes" => Array("name" => "division_id", "values" => $divisions, + "currentValue" => $position->division_id)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayEvents($selection = "0000-00-00"){ + $events = new Events(); + $events->displayList($selection); + } + + public function _displayEventsCalendar(){ + $calendar = new Calendar("events"); + $month = scriptParam("month"); + if (!empty($month)){ + $year = substr($month, 0, 4); + $month = substr($month, 4, 2); + }else { + $year = date("Y"); + $month = date("m"); + } + $calendar->display($year, $month); + } + + public function _displayEvent(){ + $eventId = scriptParam("eventid"); + $event = new Event($eventId); + $event->display(); + } + + public function _registerEvent(){ + $eventCat = new EventCategories(); + $categories = $eventCat->getCategories(); + $userList = new Users(); + $users = $userList->getList(); + + $title = "registrér aktivitet"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-event&page=display-event"; + $fields = Array(Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 7, + "class" => "mceEditor", +)), + Array("label" => "dato og tid", "type" => "datetime", + "attributes" => Array("name" => "time")), + Array("label" => "sted", "type" => "text", + "attributes" => Array("name" => "location" ,"size" => 50, "maxlength" => 50)), + Array("label" => "deltakere", "type" => "textarea", + "attributes" => Array("name" => "targetGroup", "cols" => 70, "rows" => 2, + "comment" => "Hvem kan/bør delta?", "maxlength" => 255)), + Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "eventcategory_id", "values" => $categories)), + Array("label" => "ansvarlig", "type" => "select", + "attributes" => Array("name" => "user_id_responsible", "values" => $users, + "currentValue" => getCurrentUser())) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editEvent(){ + $eventCat = new EventCategories(); + $categories = $eventCat->getCategories(); + $userList = new Users(); + $users = $userList->getList(); + + $eventId = scriptParam("eventid"); + $event = new Event($eventId); + $title = "oppdatér aktivitet"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-event&page=display-event"; + $fields = Array(Array("label" => "eventid", "type" => "hidden", + "attributes" => Array("name" => "eventid", "value" => "$eventId")), + Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $event->name)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 7, + "class" => "mceEditor", + "value" => $event->text)), + Array("label" => "dato og tid", "type" => "datetime", + "attributes" => Array("name" => "time", + "value" => $event->time)), + Array("label" => "sted", "type" => "text", + "attributes" => Array("name" => "location" ,"size" => 50, "maxlength" => 50, + "value" => $event->location)), + Array("label" => "deltakere", "type" => "textarea", + "attributes" => Array("name" => "targetGroup", "cols" => 70, "rows" => 2, + "value" => $event->targetGroup, + "comment" => "Hvem kan/bør delta?", "maxlength" => 255)), + Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "eventcategory_id", "values" => $categories, + "currentValue" => $event->eventcategory_id)), + Array("label" => "ansvarlig", "type" => "select", + "attributes" => Array("name" => "user_id_responsible", "values" => $users, + "currentValue" => $event->user_id_responsible)) + + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayConcerts($selection = "0000-00-00"){ + $concerts = new Concerts(); + $concerts->displayList($selection); + } + + public function _displayConcertsCalendar(){ + $calendar = new Calendar("concerts"); + $month = scriptParam("month"); + if (!empty($month)){ + $year = substr($month, 0, 4); + $month = substr($month, 4, 2); + }else { + $year = date("Y"); + $month = date("m"); + } + $calendar->display($year, $month); + } + + public function _displayConcert(){ + $concertId = scriptParam("concertid"); + $concert = new Concert($concertId); + $concert->display(); + } + + public function _registerConcert(){ + $concertCat = new ConcertCategories(); + $categories = $concertCat->getCategories(); + $venueList = new Locations(); + $venues = $venueList->getList(); + $divList = new Divisions(); + $divs = $divList->getList(); + $userList = new Users(); + $users = $userList->getList(2, -1); + + $title = "Registrér arrangement"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=register-concert&page=display-concert"; + $fields = Array(); + + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 55, + "maxlength" => 80, "class" => "title")); + $fields[] = Array("label" => "engelsk tittel", "type" => "text", + "attributes" => Array("name" => "name_en" ,"size" => 55, + "maxlength" => 80, "class" => "title")); + $fields[] = Array("label" => "ingress", "type" => "textarea", + "attributes" => Array("name" => "intro", "cols" => 70, "rows" => 3, + "maxlength" => 255)); + $fields[] = Array("label" => "engelsk ingress", "type" => "textarea", + "attributes" => Array("name" => "intro_en", "cols" => 70, "rows" => 3, + "maxlength" => 255)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("comment" => + "Bruk link-knappen for å legge inn linker eller epostadresser.", + "name" => "text", "cols" => 70, "rows" => 15, + "class" => "mceEditor")); + $fields[] = Array("label" => "engelsk beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text_en", "cols" => 70, "rows" => 15, + "class" => "mceEditor")); + $fields[] = Array("label" => "dato og tid", "type" => "datetime", + "attributes" => Array("name" => "time")); + $fields[] = Array("label" => "arrangør", "type" => "select", + "attributes" => Array("name" => "host_id", "values" => $divs )); + $fields[] = Array("label" => "sted", "type" => "select", + "attributes" => Array("name" => "venue_id", "values" => $venues)); + $fields[] = Array("label" => "type", "type" => "select", + "attributes" => Array("name" => "concertcategory_id", "values" => $categories)); + $fields[] = Array("label" => "billettpris", "type" => "text", + "attributes" => Array("name" => "priceNormal" ,"size" => 4, "maxlength" => 5)); + $fields[] = Array("label" => "medlemspris", "type" => "text", + "attributes" => Array("name" => "priceConcession" ,"size" => 4, "maxlength" => 5)); + $fields[] = Array("label" => "linker", "type" => "textarea", + "attributes" => Array("comment" => + "én link per linje. Linker kan også inkluderes direkte i teksten over.", + "name" => "links", "cols" => 70, "rows" => 3)); + $fields[] =Array("label" => "bilde", "type" => "file", + "attributes" => Array("comment" => "Arrangementer under STUDiO bør ha bilder på minst 600*300px. Disse vil automatisk bli klippet til formatet 2:1 ved visning på studioweb.no.", + "name" => "userfile", "size" => 55)); + $fields[] = Array("label" => "billettservice-link", "type" => "text", + "attributes" => Array("name" => "ticketLink" ,"size" => 50, "maxlength" => 255)); + $fields[] = Array("label" => "facebook-link", "type" => "text", + "attributes" => Array("name" => "facebookLink" ,"size" => 50, "maxlength" => 60)); + $fields[] = Array("label" => "ekstern kontakt", "type" => "text", + "attributes" => Array("name" => "user_name_ext_contact" ,"size" => 50, "maxlength" => 50, + "help" => "Ekstern kontakt er en person det kan være nyttig å kontakte i forbindelse med for eksempel markedsføring. Dette kan være manager, forlag, plateselskap osv. Disse feltene kan godt stå tomme.")); + $fields[] = Array("label" => "→ telefon", "type" => "text", + "attributes" => Array("name" => "user_phone_ext_contact" ,"size" => 10, "maxlength" => 12)); + $fields[] = Array("label" => "→ epost", "type" => "text", + "attributes" => Array("name" => "user_email_ext_contact" ,"size" => 50, "maxlength" => 120)); + $fields[] = Array("label" => "→ rolle", "type" => "text", + "attributes" => Array("name" => "user_role_ext_contact" ,"size" => 50, "maxlength" => 120)); + $fields[] = Array("label" => "kommentar", "type" => "textarea", + "attributes" => Array("comment" => + "Kommentarer er til internt bruk, og vil ikke vises på hovedsidene.", + "name" => "comment", "cols" => 70, "rows" => 3)); + + print("

    NYHET: Nå kan dere registrere engelsk utgave av tittel, ingress og tekst!

    "); + print("

    STUDiO 2007 kommer til å ha nettsider på både norsk og engelsk. Det er derfor viktig at alle arrangementer i denne perioden også har tekst på engelsk!

    "); + print("

    På sikt vil også studentersamfundet.no foreligge på flere språk.

    "); + print("

    Nytt format på bilder

    "); + print("

    STUDiO 2007 vil også bruke et annet format på bilder (2:1), alle bilder som lastes opp bør derfor være minst 600*300px, og med det viktigste innholdet vertikalt sentrert.

    "); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editConcert(){ + $concertCat = new ConcertCategories(); + $categories = $concertCat->getCategories(); + $venueList = new Locations(); + $venues = $venueList->getList(); + $divList = new Divisions(); + $divs = $divList->getList(); + $userList = new Users(); + $users = $userList->getList(); + + $concertId = scriptParam("concertid"); + $concert = new Concert($concertId); + + $title = "oppdatér arrangement"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=update-concert&page=display-concert"; + $fields = Array(); + + $fields[] = Array("label" => "concertid", "type" => "hidden", + "attributes" => Array("name" => "concertid", "value" => "$concertId")); + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 55, "maxlength" => 80, + "class" => "title", "value" => $concert->name)); + $fields[] = Array("label" => "engelsk tittel", "type" => "text", + "attributes" => Array("name" => "name_en" ,"size" => 55, "maxlength" => 80, + "class" => "title", "value" => $concert->name_en)); + $fields[] = Array("label" => "ingress", "type" => "textarea", + "attributes" => Array("name" => "intro", "cols" => 70, "rows" => 3, + "maxlength" => 255, + "value" => $concert->intro)); + $fields[] = Array("label" => "engelsk ingress", "type" => "textarea", + "attributes" => Array("name" => "intro_en", "cols" => 70, "rows" => 3, + "maxlength" => 255, + "value" => $concert->intro_en)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("comment" => + "Bruk link-knappen for å legge inn linker eller epostadresser.
    ", + "name" => "text", "cols" => 70, "rows" => 15, + "class" => "mceEditor", + "value" => stripSlashes($concert->text))); + $fields[] = Array("label" => "engelsk beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text_en", "cols" => 70, "rows" => 15, + "class" => "mceEditor", + "value" => stripSlashes($concert->text_en))); + $fields[] = Array("label" => "dato og tid", "type" => "datetime", + "attributes" => Array("name" => "time", + "value" => $concert->time)); + $fields[] = Array("label" => "arrangør", "type" => "select", + "attributes" => Array("name" => "host_id", "values" => $divs, + "currentValue" => $concert->host_id)); + $fields[] = Array("label" => "sted", "type" => "select", + "attributes" => Array("name" => "venue_id", "values" => $venues, + "currentValue" => $concert->venue_id)); + $fields[] = Array("label" => "type", "type" => "select", + "attributes" => Array("name" => "concertcategory_id", "values" => $categories, + "currentValue" => $concert->concertcategory_id)); + $fields[] = Array("label" => "billettpris", "type" => "text", + "attributes" => Array("name" => "priceNormal" ,"size" => 4, "maxlength" => 5, + "value" => $concert->priceNormal)); + $fields[] = Array("label" => "medlemspris", "type" => "text", + "attributes" => Array("name" => "priceConcession" ,"size" => 4, "maxlength" => 5, + "value" => $concert->priceConcession)); + $fields[] =Array("label" => "bilde", "type" => "file", + "attributes" => Array("comment" => "Arrangementer under STUDiO bør ha bilder på minst 600*300px. Disse vil automatisk bli klippet til formatet 2:1 ved visning på studioweb.no.", + "name" => "userfile", "size" => 55)); + + $fields[] = Array("label" => "linker", "type" => "textarea", + "attributes" => Array("comment" => + "én link per linje. Linker kan også inkluderes direkte i teksten over.", + "name" => "links", "cols" => 70, "rows" => 3, + "value" => $concert->getLinks("text"))); + $fields[] = Array("label" => "billettservice-link", "type" => "text", + "attributes" => Array("name" => "ticketLink" ,"size" => 50, "maxlength" => 255, + "value" => $concert->ticketLink)); + $fields[] = Array("label" => "facebook-link", "type" => "text", + "attributes" => Array("name" => "facebookLink" ,"size" => 50, "maxlength" => 60, + "value" => $concert->facebookLink)); + $fields[] = Array("label" => "ekstern kontakt", "type" => "text", + "attributes" => Array("name" => "user_name_ext_contact" ,"size" => 50, "maxlength" => 50, + "value" => $concert->user_name_ext_contact, + "help" => "Ekstern kontakt er en person det kan være nyttig å kontakte i forbindelse med for eksempel markedsføring. Dette kan være manager, forlag, plateselskap osv. Disse feltene kan godt stå tomme.")); + $fields[] = Array("label" => "→ telefon", "type" => "text", + "attributes" => Array("name" => "user_phone_ext_contact" ,"size" => 10, "maxlength" => 12, + "value" => $concert->user_phone_ext_contact)); + $fields[] = Array("label" => "→ epost", "type" => "text", + "attributes" => Array("name" => "user_email_ext_contact" ,"size" => 50, "maxlength" => 120, + "value" => $concert->user_email_ext_contact)); + $fields[] = Array("label" => "→ rolle", "type" => "text", + "attributes" => Array("name" => "user_role_ext_contact" ,"size" => 50, "maxlength" => 120, + "value" => $concert->user_role_ext_contact)); + $fields[] = Array("label" => "kommentar", "type" => "textarea", + "attributes" => Array("comment" => + "Kommentarer er til internt bruk, og vil ikke vises på hovedsidene.", + "name" => "comment", "cols" => 70, "rows" => 3, + "value" => $concert->comment)); + $fields[] = Array("label" => "viewWeekprogram", "type" => "hidden", + "attributes" => Array("name" => "viewWeekprogram", + "value" => $concert->viewWeekprogram)); + + print("

    Nå kan dere registrere engelsk utgave av tittel, ingress og tekst!

    "); + print("

    På sikt vil studentersamfundet.no foreligge på flere språk.

    "); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public + function _editConcertReport() { + $report = new ConcertReport(scriptParam("concertreportid")); + + $title = "registrér arrangementsrapport"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-concertreport&page=display-concert&concertid=$report->concert_id"; + $fields = Array(); + + $fields[] = Array("label" => "concertreportid", "type" => "hidden", + "attributes" => Array("name" => "concertreportid", "value" => $report->id)); + + $fields[] = Array("label" => "besøkende", "type" => "text", + "attributes" => Array("name" => "visitors","size" => 4, + "maxlength" => 4, + "value" => $report->visitors)); + $fields[] = Array("label" => "resultat", "type" => "text", + "attributes" => Array("name" => "result","size" => 7, + "maxlength" => 8, + "value" => $report->result)); + $fields[] = Array("label" => "markedsføring", "type" => "textarea", + "attributes" => Array("name" => "marketing_comment", "cols" => 70, + "rows" => 15, "class" => "mceEditor", + "value" => $report->marketing_comment)); + + $fields[] = Array("label" => "produksjon", "type" => "textarea", + "attributes" => Array("name" => "production_comment", "cols" => 70, + "rows" => 15, "class" => "mceEditor", + "value" => $report->production_comment)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayAllCalendar(){ + $calendar = new Calendar("all"); + $month = scriptParam("month"); + if (!empty($month)){ + $year = substr($month, 0, 4); + $month = substr($month, 4, 2); + }else { + $year = date("Y"); + $month = date("m"); + } + $calendar->display($year, $month); + } + + public function _displayWeekProgram(){ + $title = "ny uke"; + $enctype = NULL; + $method = "post"; + $action = "index.php?section=concerts&page=week-program&action=register-weekprogram"; + $fields = Array(); + + $fields[] = Array("label" => "år", "type" => "text", + "attributes" => Array("name" => "year", "size" => 4, "maxlength" => 4, "value" => date("Y") )); + + $fields[] = Array("label" => "uke", "type" => "text", + "attributes" => Array("name" => "week", "size" => 2, "maxlength" => 2, "value" => date("W") )); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + $list = new WeekPrograms(); + $list->displayList(); + + } + + public function _displayProgramSelection(){ + $title = "registrer programutvalg"; + $enctype = NULL; + $method = "post"; + $action = "index.php?section=concerts&page=program-selection&action=register-programselection"; + $fields = Array(); + + $fields[] = Array("label" => "fortekst", "type" => "textarea", + "attributes" => Array("name" => "pretext", "cols" => 70, "rows" => 10, + "class" => "mceEditor")); + $fields[] = Array("label" => "start", "type" => "date", + "attributes" => Array("name" => "start", "value" => date("Y-m-d") )); + $fields[] = Array("label" => "slutt", "type" => "date", + "attributes" => Array("name" => "end", "value" => date("Y-m-d") )); + $fields[] = Array("label" => "type", "type" => "text", + "attributes" => Array("name" => "type" ,"size" => 12, "maxlength" => 24, + "value" => "Konsert", "tag" => "Skriv 'Billett' for å vise alle med billett")); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + $list = new ProgramsSelection(); + $list->displayList(); + + } + + public function _editProgramSelection(){ + $progid = scriptParam("programselectionid"); + $prog = new ProgramSelection($progid); + + $title = "endre programutvalg"; + $enctype = NULL; + $method = "post"; + $action = "index.php?section=concerts&page=program-selection&action=update-programselection"; + $fields = Array(); + + $fields[] = Array("label" => "programselectionid", "type" => "hidden", + "attributes" => Array("name" => "programselectionid", "value" => $progid)); + $fields[] = Array("label" => "fortekst", "type" => "textarea", + "attributes" => Array("name" => "pretext", "cols" => 70, "rows" => 10, + "class" => "mceEditor", "value" => $prog->pretext)); + $fields[] = Array("label" => "start", "type" => "date", + "attributes" => Array("name" => "start", "value" => date("Y-m-d"), + "value" => $prog->start)); + $fields[] = Array("label" => "slutt", "type" => "date", + "attributes" => Array("name" => "end", "value" => date("Y-m-d"), + "value" => $prog->end)); + $fields[] = Array("label" => "type", "type" => "text", + "attributes" => Array("name" => "type" ,"size" => 12, "maxlength" => 24, + "value" => $prog->type)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayDocuments(){ + $doccatlist = new DocumentCategories(); + $doccats = $doccatlist->getList(); + + $current = scriptParam("documentcategoryid"); + $currentTag = scriptParam("documenttag"); + + $title = "vis dokumenter"; + $enctype = NULL; + $method = "post"; + $action = "index.php?section=documents&page=display-documents"; + $fields = Array(); + + $fields[] = Array("label" => "Vis dokumenter av typen ", "type" => "select", + "attributes" => Array("name" => "documentcategoryid", "values" => $doccats, + "currentValue" => $current)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + $title = "søk på tagger"; + $enctype = NULL; + $method = "post"; + $action = "index.php?section=documents&page=display-documents"; + $fields = Array(); + + $fields[] = Array("label" => "Vis dokumenter merket ", "type" => "text", + "attributes" => Array("name" => "documenttag", + "value" => $currentTag)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + if ($current >= 0){ + $documents = new Documents(); + $documents->displayList($current); + } + if (!empty($currentTag)){ + $documents = new Documents(); + $documents->displayListTag($currentTag); + } + + } + + + public function _displayDocument(){ + $documentId = scriptParam("documentid"); + $document = new Document($documentId); + $document->display(); + } + + public function _uploadDocument(){ + $documentCat = new DocumentCategories(); + $categories = $documentCat->getList(); + + $title = "last opp dokument"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=upload-document&page=display-documents"; + $fields = Array(); + $fields[] = Array("label" => "dokument", "type" => "file", + "attributes" => Array("name" => "file", "size" => 55)); + $fields[] = Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "documentcategoryid", + "values" => $categories)); + $fields[] = Array("label" => "tags", "type" => "text", + "attributes" => Array("name" => "tags" ,"size" => 50, "maxlength" => 255)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editDocument(){ + $documentCat = new DocumentCategories(); + $categories = $documentCat->getList(); + + $documentId = scriptParam("documentid"); + $document = new Document($documentId); + $title = "oppdatér dokumentinfo"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-document&page=display-documents"; + $fields = Array(); + + $fields[] = Array("label" => "documentid", "type" => "hidden", + "attributes" => Array("name" => "documentid", "value" => "$documentId")); + $fields[] = Array("label" => "tittel", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => get_file_basename($document->name), + "tag" => get_file_suffix($document->name))); + $fields[] = Array("label" => "kategori", "type" => "select", + "attributes" => Array("name" => "documentcategory_id", + "values" => $categories, + "currentValue" => $document->documentcategory_id)); + $fields[] = Array("label" => "tags", "type" => "text", + "attributes" => Array("name" => "tags" ,"size" => 50, "maxlength" => 255, + "value" => $document->tags)); + + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayGroups(){ + $groups = new Groups(); + $groups->displayList(); + } + + public function _displayGroup(){ + $groupid = scriptParam("groupid"); + $group = new Group($groupid); + $group->display(); + } + + public function _registerGroup(){ + $divs = new Divisions(); + $divList = $divs->getList(); + + $title = "registrér gruppe"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-group&page=display-groups"; + $fields = Array(); + + $fields[] = Array("label" => "gruppenavn", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 3)); + $fields[] = Array("label" => "epostliste", "type" => "text", + "attributes" => Array("name" => "mailinglist" ,"size" => 50, "maxlength" => 50)); + $fields[] = Array("label" => "forening", "type" => "select", + "attributes" => Array("name" => "division_id", + "values" => $divList, "nullPossible" => true)); + $fields[] = Array("label" => "foreningsmoderator", "type" => "radio", + "attributes" => Array("name" => "admin", "values" => Array(1, 0), + "labels" => Array("ja", "nei"), + "value" => "nei", + "comment" => "Foreningsmoderator kan endre og slette alle elementer som er tilknyttet foreningen.")); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editGroup(){ + $groupid = scriptParam("groupid"); + $group = new Group($groupid); + $exclude = Array(); + $exclude[] = ($groupid == 1) ? 0 : 1;//If not group "alle", hide actions from "alle" + $exclude[] = ($groupid > 2) ? 2 : NULL; //If not group "aktive", hide acions from "aktive" + if ($group->isAdmin() == true) { //if group is related to "foreningsstyre", hide "foreningsstyre" + $exclude[] = 61; + } + + $divs = new Divisions(); + $divList = $divs->getList(); + $rels = new ActionGroupRelationships(); + $list = $rels->getJoinedList($groupid, "array", $exclude); + + $title = "oppdatér gruppe"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-group&page=display-group"; + $fields = Array(); + + $fields[] = Array("label" => "groupid", "type" => "hidden", + "attributes" => Array("name" => "groupid", "value" => "$groupid")); + $fields[] = Array("label" => "gruppenavn", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $group->name)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 7, + "value" => $group->text)); + $fields[] = Array("label" => "epostliste", "type" => "text", + "attributes" => Array("name" => "mailinglist" ,"size" => 50, "maxlength" => 50, + "value" => $group->mailinglist)); + $fields[] = Array("label" => "forening", "type" => "select", + "attributes" => Array("name" => "division_id", "currentValue" => $group->division_id, + "values" => $divList, "nullPossible" => true)); + $fields[] = Array("label" => "foreningsmoderator", "type" => "radio", + "attributes" => Array("name" => "admin", "values" => Array(1, 0), + "labels" => Array("ja", "nei"), + "value" => $group->admin, + "comment" => "Foreningsmoderator kan endre og slette alle elementer som er tilknyttet foreningen.")); + $fields[] = Array("label" => "tilgang", "type" => "checkbox-list", + "attributes" => Array("name" => "actions", + "options" => $list, + "comment" => "Viser kun handlinger som ikke gruppen får gjennom andre grupper den automatisk er medlem av.")); + + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayActions(){ + $actions = new Actions(); + $actions->displayList(); + } + + public function _displayAction(){ + $actionid = scriptParam("actionid"); + $action = new Action($actionid); + $action->display(); + } + + public function _registerAction(){ + + $title = "registrér handling"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-action&page=display-actions"; + $fields = Array(Array("label" => "handling", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 3)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editAction(){ + $actionid = scriptParam("actionid"); + $action1 = new Action($actionid); + + $title = "oppdatér handling"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-action&page=display-action"; + $fields = Array(Array("label" => "actionid", "type" => "hidden", + "attributes" => Array("name" => "actionid", "value" => "$actionid")), + Array("label" => "handling", "type" => "text", + "attributes" => Array("name" => "name" ,"size" => 50, "maxlength" => 50, + "value" => $action1->name)), + Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 7, + "value" => $action1->text)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayActionGroupRelationships(){ + $relations = new ActionGroupRelationships(); + $relations->displayList(); + } + + public function _registerActionGroupRelationship(){ + $actionList = new Actions(); + $actions = $actionList->getList(); + $groupList = new Groups(); + $groups = $groupList->getList(); + + + $title = "knytt handling til gruppe "; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-actiongrouprelationship&page=register-actiongrouprelationship"; + $fields = Array(Array("label" => "handling", "type" => "select", + "attributes" => Array("name" => "actionid", "values" => $actions)), + Array("label" => "gruppe", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayArticles(){ + $articles = new Articles(); + $articles->displayList(); + } + + public function _displayArticle(){ + $articleid = scriptParam("articleid"); + $article = new Article($articleid); + $article->display(); + } + + public function _registerArticle(){ + $title = "registrér nyhet"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=register-article&page=display-article"; + $fields = Array(); + + $fields[] = Array("label" => "title", "type" => "text", + "attributes" => Array("name" => "title", "class" => "title", "size" => 50, "maxlength" => 60)); + $fields[] = Array("label" => "ingress", "type" => "textarea", + "attributes" => Array("name" => "intro", "cols" => 70, "rows" => 3, "maxlength" => 255)); + $fields[] = Array("label" => "tekst", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 10, + "class" => "mceEditor")); + /** + * Hvis value ikke er gitt, blir dagens dato satt. + * Hvor? Aner ikke! + * --Thomas Misund Hansen, 2009-06-09 + */ + $fields[] = Array("label" => "utgår", "type" => "date", + "attributes" => Array("name" => "expires", "value" => "2029-01-01")); + $fields[] =Array("label" => "hovedbilde", "type" => "file", + "attributes" => Array("name" => "attachment1", "size" => 55)); + $fields[] = Array("label" => "billedtekst", "type" => "textarea", + "attributes" => Array("name" => "caption1", "cols" => 70, "rows" => 2, "maxlength" => 120)); + $fields[] =Array("label" => "ekstra bilde", "type" => "file", + "attributes" => Array("name" => "attachment2", "size" => 55)); + $fields[] = Array("label" => "billedtekst", "type" => "textarea", + "attributes" => Array("name" => "caption2", "cols" => 70, "rows" => 2, "maxlength" => 120)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editArticle(){ + $articleid = scriptParam("articleid"); + $article = new Article($articleid); + + $title = "endre nyhet"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=update-article&page=display-article"; + $fields = Array(); + + $fields[] = Array("label" => "articleid", "type" => "hidden", + "attributes" => Array("name" => "articleid", "value" => $articleid)); + $fields[] = Array("label" => "title", "type" => "text", + "attributes" => Array("name" => "title", "class" => "title", "size" => 50, "maxlength" => 60, + "value" => $article->title)); + $fields[] = Array("label" => "ingress", "type" => "textarea", + "attributes" => Array("name" => "intro", "cols" => 70, "rows" => 3, "maxlength" => 255, + "value" => $article->intro)); + $fields[] = Array("label" => "tekst", "type" => "textarea", + "attributes" => Array("name" => "text", "cols" => 70, "rows" => 10, + "class" => "mceEditor", + "value" => $article->text)); + $fields[] = Array("label" => "utgår", "type" => "date", + "attributes" => Array("name" => "expires", "value" => $article->expires)); + $fields[] =Array("label" => "hovedbilde", "type" => "file", + "attributes" => Array("name" => "attachment1", "size" => 55)); + $fields[] = Array("label" => "billedtekst", "type" => "textarea", + "attributes" => Array("name" => "caption1", "cols" => 70, "rows" => 2, "maxlength" => 120, + "value" => $article->caption1)); + $fields[] =Array("label" => "ekstra bilde", "type" => "file", + "attributes" => Array("name" => "attachment2", "size" => 55)); + $fields[] = Array("label" => "billedtekst", "type" => "textarea", + "attributes" => Array("name" => "caption2", "cols" => 70, "rows" => 2, "maxlength" => 120, + "value" => $article->caption2)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _displayDivisionRequests(){ + $users = new Users(); + $users->displayDivisionRequests(); + } + + public function _displayUsergroupRelationships(){ + $groupList = new Groups("admin-only"); + $groups = $groupList->getList(); + $limits = Array(Array("id" => 15, "title" => 15), + Array("id" => 25, "title" => 25), + Array("id" => 50, "title" => 50), + Array("id" => 100, "title" => 100), + Array("id" => 10000, "title" => "alle") + ); + + $current = scriptParam("groupid"); + if (empty($current)){ + $current = 2; + } + + $limit = scriptParam("limit"); + if (empty($limit)){ + $limit = 25; + } + + $title = "vis gruppemedlemmer"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-usergrouprelationships"; + $fields = Array(Array("label" => "vis", "type" => "select", + "attributes" => Array("name" => "limit", "values" => $limits, "currentValue" => $limit)), + Array("label" => "fra", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups, "currentValue" => $current)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + $relations = new UserGroupRelationships(); + $relations->displayList($current, $limit); + } + + public function _registerUserGroupRelationship(){ + $userlist = new Users(); + $users = $userlist->getList(-2, 0); + + $groups = Array(Array("id" => 2, "title" => "Aktiv")); + + $title = "registrér medlem som aktiv"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-usergrouprelationship&page=register-usergrouprelationship"; + $fields = Array(Array("label" => "medlem", "type" => "select", + "attributes" => Array("name" => "userid", "values" => $users)), + Array("label" => "gruppe", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups)) + ); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + $userlist = new Users(); + $users = $userlist->getList(2); + $groupList = new Groups("admin-only"); + $groups = $groupList->getList(); + $currentUser = scriptParam("userid"); + + $title = "registrér aktivt medlem i ny gruppe"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-usergrouprelationship&page=register-usergrouprelationship"; + $fields = Array(); + + $fields[] = Array("label" => "medlem", "type" => "select", + "attributes" => Array("name" => "userid", "values" => $users, + "currentValue" => $currentUser)); + $fields[] = Array("label" => "gruppe", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + $groupList = new Groups("admin-only"); + $groups = $groupList->getList(); + + $title = "masseregistrér medlemmer i ny gruppe"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=register-usergrouprelationship&page=register-usergrouprelationship"; + $fields = Array(); + + $fields[] = Array("label" => "kortnummer/epost", "type" => "textarea", + "attributes" => Array("name" => "users", "cols" => 70, "rows" => 15, + "comment" => "Tast inn kortnummer eller epost for å legge til flere brukere i samme gruppe på én gang. Én per linje.")); + $fields[] = Array("label" => "gruppe", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups)); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + } + + public function _displayUsers(){ + $group = scriptParam("groupid"); + $groupList = new Groups(); + $groups = $groupList->getList(); + $limits = Array(Array("id" => 15, "title" => 15), + Array("id" => 25, "title" => 25), + Array("id" => 50, "title" => 50), + Array("id" => 100, "title" => 100), + Array("id" => 10000, "title" => "alle") + ); + $addressStatus = Array(Array("id" => -1, "title" => "alle"), + Array("id" => 1, "title" => "gyldig adresse"), + Array("id" => 2, "title" => "ukjent adressestatus"), + Array("id" => 10, "title" => "gyldige og ukjente"), + Array("id" => 0, "title" => "ugyldig addresse")); + + $limit = scriptParam("limit"); + if (empty($limit)){ + $limit = 15; + } + $current = scriptParam("groupid"); + if (empty($current)){ + $current = 2; + } + $addressStatusCurrent = scriptParam("validaddress"); + + $title = "vis brukere"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-users"; + $fields = Array(); + + $fields[] = Array("label" => "vis", "type" => "select", + "attributes" => Array("name" => "limit", "values" => $limits, + "currentValue" => $limit)); + $fields[] = Array("label" => "fra", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups, + "currentValue" => $current)); + $fields[] = Array("label" => "postadressestatus", "type" => "select", + "attributes" => Array("name" => "validaddress", "values" => $addressStatus, + "currentValue" => $addressStatusCurrent)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + + $search = scriptParam("search"); + if (empty($search)){ + $search = ""; + } + + $title = "søk etter bruker"; + $id = "usersearch"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-users"; + $fields = Array(); + + $fields[] = Array("label" => "søk på navn, kortnr eller e-post", "type" => "text", + "attributes" => Array("name" => "search", "value" => $search)); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display("horizontal"); + + + if (!empty($search)){ + $limit = -1; + $users = new Users(); + $users->displayList($search, $limit, true, $addressStatusCurrent); + print("nytt søk"); + }else if (!empty($group)){ + $users = new Users(); + $users->displayList($group, $limit, false, $addressStatusCurrent); + } + + } + + public function _displayUserExpiries(){ + $group = scriptParam("groupid"); + $expiry = scriptParam("expiry"); + $groupList = new Groups(); + $groups = $groupList->getList(); + $formats = Array(Array("id" => "screen", "title" => "vis"), + Array("id" => "file", "title" => "last ned") + ); + $limits = Array(Array("id" => 15, "title" => 15), + Array("id" => 25, "title" => 25), + Array("id" => 50, "title" => 50), + Array("id" => 100, "title" => 100), + Array("id" => 10000, "title" => "alle") + ); + $expiries = Array(Array("id" => 'all', "title" => "uansett"), + Array("id" => 'lifetime', "title" => "livsvarig medlemskap"), + Array("id" => '0000-00-00', "title" => "ugyldig utløpsår"), + Array("id" => 'expired', "title" => "utløpt medlemskap"), + Array("id" => 'valid', "title" => "gyldig medlemskap"), + Array("id" => 'no-cardno', "title" => "ikke kjøpt medlemskap (etter H05)"), + Array("id" => 'no-card', "title" => "ikke fått medlemskort"), + Array("id" => 'no-sticker', "title" => "har kort, mangler oblat"), + ); + + $format = scriptParam("format"); + if (empty($format)){ + $format = "screen"; + } + $limit = scriptParam("limit"); + if (empty($limit)){ + $limit = 15; + } + $current = scriptParam("groupid"); + if (empty($current)){ + $current = 2; + } + $curExp = scriptParam("expiry"); + if (empty($curExp)){ + $curExp= NULL; + } + + $title = "vis brukere"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-user-expiries"; + $fields = Array(); + + $fields[] = Array("label" => "", "type" => "select", + "attributes" => Array("name" => "format", "values" => $formats, + "currentValue" => $format)); + $fields[] = Array("label" => "", "type" => "select", + "attributes" => Array("name" => "limit", "values" => $limits, + "currentValue" => $limit)); + $fields[] = Array("label" => "fra", "type" => "select", + "attributes" => Array("name" => "groupid", "values" => $groups, + "currentValue" => $current)); + $fields[] = Array("label" => "med", "type" => "select", + "attributes" => Array("name" => "expiry", "values" => $expiries, + "currentValue" => $curExp)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + + $search = scriptParam("search"); + if (empty($search)){ + $search = ""; + } + + $title = "søk etter bruker"; + $id = "usersearch"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-user-expiries"; + $fields = Array(); + + $fields[] = Array("label" => "søk etter medlem", "type" => "text", + "attributes" => Array("name" => "search", "value" => $search)); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display("horizontal"); + + if (isAdmin()){ + $code_search = scriptParam("code_search"); + if (empty($code_search)){ + $code_search = ""; + } + $title = "slå opp kortkode"; + $id = "cardcode"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-user-expiries"; + $fields = Array(); + + $fields[] = Array("label" => "slå opp kode", "type" => "text", + "attributes" => Array("name" => "code_search", "value" => $code_search)); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display("horizontal"); + + if ($code_search != ""){ + displayCode($code_search); + } + } + + if ($search != ""){ + $users = new Users(); + $users->displayExpiryListSearch($search); + }else if (!empty($expiry) && $format != "file"){ + $users = new Users(); + $users->displayExpiryList($group, $limit, $expiry, $format); + } + + + } + + public function _registerUserMembershipBankpayment() { + if (checkAuth("view-register-membership-bankpayment")) { + if (isset($_POST["banktext"])) { + $users = new Users(); + if($users->parseMembershipPaymentsFromBank($_POST["banktext"])) { + return true; + } + } + + $title = "Registrere betalte medlemskap fra faktura med KID"; + $id = "membership-bankpayment"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=register-membership-bankpayment"; + $fields = Array(); + + $fields[] = @Array("label" => "sett inn fil mottatt fra bank", + "type" => "textarea", + "attributes" => Array("name" => "banktext", + "cols" => 100, + "rows" => 20, + "value" => $_POST["banktext"])); + $fields[] = @Array("label" => "", + "type" => "checkbox", + "attributes" => Array("name" => "parseonly", + "label" => " analyser filen uten å oppdatere medlemskapsdatabasen", + "checked" => true)); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display(); + + return true; + } + + return false; + } + + public function _registerUserEAUpdate() { + if (checkAuth("view-register-user-ea-update")) { + if (isset($_POST["eatext"])) { + $users = new Users(); + if($users->parseEAfile($_POST["eatext"])) { + return true; + } + } + + $title = "Registrere adresseoppdatering mottatt gjennom EA"; + $id = "eaupdate"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=register-user-ea-update"; + $fields = Array(); + + $fields[] = @Array("label" => "sett inn CVS fil", + "type" => "textarea", + "attributes" => Array("name" => "eatext", + "cols" => 100, + "rows" => 20, + "value" => $_POST["eatext"])); + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display(); + + return true; + } + + return false; + } + + public function _displayUser(){ + $userId = scriptParam("userid"); + $user = new User($userId); + $user->display(); + } + + public function _registerUser(){ + $placesOfStudy = new PlacesOfStudy(); + $pos = $placesOfStudy->getList(); + $divisions = new Divisions(); + $divs = $divisions->getList(); + $groups = new Groups("admin-only"); + $groups = $groups->getList(); + $data = $_POST; //Error during register, old values needed to avoid retyping + + if (!isset($_SESSION['valid-user'])){?> +

    Ved å registrere deg kan du aktivere eller kjøpe medlemskap.

    +

    Alle feltene må fylles ut.

    + + "fornavn", "type" => "text", + "attributes" => Array("name" => "firstname" ,"size" => 50, "maxlength" => 50, + "value" => (isset($data['firstname'])) ? $data['firstname'] : "")); + $fields[] = Array("label" => "etternavn", "type" => "text", + "attributes" => Array("name" => "lastname" ,"size" => 50, "maxlength" => 50, + "value" => (isset($data['lastname'])) ? $data['lastname'] : "")); + $fields[] = Array("label" => "ønsket brukernavn", "type" => "text", + "attributes" => Array("name" => "username" ,"size" => 12, "maxlength" => 12, + "onchange" => "checkUsername(this.value)", + "value" => (isset($data['username'])) ? $data['username'] : "")); + $fields[] = Array("label" => "ønsket passord", "type" => "password", + "attributes" => Array("name" => "password1")); + $fields[] = Array("label" => "gjenta passord", "type" => "password", + "attributes" => Array("name" => "password2")); + $fields[] = Array("label" => "utenlandsk adresse?", "type" => "checkbox", + "attributes" => Array("name" => "addresstype", "label" => " hak av for å registrere utenlandsk adresse", + "checked" => (isset($data['addresstype'])) ? "checked" : "")); + $fields[] = Array("label" => "gateadresse", "type" => "textarea", + "attributes" => Array("name" => "street", "cols" => 70, "rows" => 3, + "value" => (isset($data['street'])) ? $data['street'] : "", + "maxlength" => 255, "nocounter" => true)); + $fields[] = Array("label" => "postnummer", "type" => "text", + "attributes" => Array("name" => "zipcode" ,"size" => 4, + "maxlength" => 4, + "onchange" => "checkZip(this);", + "onblur" => "checkZip(this);", + "value" => (isset($data['zipcode'])) ? $data['zipcode'] : "")); + $fields[] = Array("label" => "poststed", "type" => "text", + "attributes" => Array("name" => "postarea", "readonly" => "readonly", + "readonly" => true)); + $fields[] = Array("label" => "by", "type" => "text", + "attributes" => Array("name" => "city" ,"size" => 50, "maxlength" => 50, + "value" => (isset($data['city'])) ? $data['city'] : "")); + $fields[] = Array("label" => "stat", "type" => "text", + "attributes" => Array("name" => "state" ,"size" => 50, "maxlength" => 50, + "value" => (isset($data['state'])) ? $data['state'] : "")); + $fields[] = Array("label" => "land", "type" => "text", + "attributes" => Array("name" => "country" ,"size" => 50, "maxlength" => 50, + "id" => "country", + "value" => (isset($data['country'])) ? $data['country'] : "")); + $fields[] = Array("label" => "telefon", "type" => "text", + "attributes" => Array("name" => "phonenumber" ,"size" => 16, "maxlength" => 16, + "value" => (isset($data['phonenumber'])) ? $data['phonenumber'] : "")); + $fields[] = Array("label" => "epost", "type" => "text", + "attributes" => Array("name" => "email" ,"size" => 50, "maxlength" => 120, + "value" => (isset($data['email'])) ? $data['email'] : "")); + $fields[] = Array("label" => "fødselsdato", "type" => "date", + "attributes" => Array("name" => "birthdate", + "value" => (isset($data['birthdate'])) ? $data['birthdate'] : "yyyy-mm-dd")); + $fields[] = Array("label" => "studiested", "type" => "select", + "attributes" => Array("name" => "placeOfStudy", "values" => $pos, + "currentValue" => (isset($data['placeOfStudy'])) ? $data['placeOfStudy'] : "")); + if (!isset($_SESSION['valid-user'])) { + $fields[] = Array("label" => "aktiv i en forening?", "type" => "checkbox", + "attributes" => Array("name" => "active", + "label" => " hak av om du er eller vil bli aktiv i en forening på Studentersamfundet", + "checked" => (isset($data['active'])) ? "checked" : "")); + $fields[] = Array("label" => "forening", "type" => "select", + "attributes" => Array("name" => "division", "values" => $divs, + "currentValue" => (isset($data['division'])) ? $data['division'] : "")); + + } else { + $fields[] = Array("label" => "legg til i gruppe?", "type" => "checkbox", + "attributes" => Array("name" => "group", + "label" => " hak av for å registrere bruker i en gruppe", + "checked" => (isset($data['group'])) ? "checked" : "")); + $fields[] = Array("label" => "gruppe", "type" => "select", + "attributes" => Array("name" => "group_id", "values" => $groups, + "currentValue" => (isset($data['group_id'])) ? $data['group_id'] : "")); + } + $form = new Form($title, $enctype, $method, $action, $fields, $id); + $form->display(); + } + + public function _editUser($id = NULL){ + $placesOfStudy = new PlacesOfStudy(); + $pos = $placesOfStudy->getList(); + $cardValues = Array(Array("id" => 0, "title" => "nei"), + Array("id" => 1, "title" => "ja")); + $addressValues = Array(Array("id" => 0, "title" => "Ugyldig"), + Array("id" => 1, "title" => "Gyldig"), + Array("id" => 2, "title" => "Ukjent")); + + if ($id == NULL){ + $userId = scriptParam("userid"); + $tag = ""; + }else { + $userId = $id; + $tag = "current-"; + } + $user = new User($userId); + + if (checkAuth("perform-update-user") || $tag == "current-" || checkResponsible()){ + $readonly = false; + }else { + $readonly = true; + } + + + $title = "$user->firstname $user->lastname - brukerinformasjon"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-".$tag."user&page=display-".$tag."user"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "readonly" => true, + "size" => strlen($user->id), + "value" => "$userId")); + $fields[] = Array("label" => "kortnummer", "type" => "text", + "attributes" => Array("name" => "cardno", "readonly" => true, + "size" => strlen($user->cardno), + "value" => $user->cardno)); + $fields[] = Array("label" => "brukernavn", "type" => "text", + "attributes" => Array("name" => "username", "readonly" => true, + "size" => strlen($user->username), + "value" => $user->username)); + $fields[] = Array("label" => "fornavn", "type" => "text", + "attributes" => Array("name" => "firstname" ,"size" => 50, "maxlength" => 50, + "readonly" => $readonly, "value" => $user->firstname)); + $fields[] = Array("label" => "etternavn", "type" => "text", + "attributes" => Array("name" => "lastname" ,"size" => 50, "maxlength" => 50, + "readonly" => $readonly, "value" => $user->lastname)); + $fields[] = Array("label" => "utenlandsk adresse?", "type" => "checkbox", + "attributes" => Array("name" => "addresstype", "label" => " hak av for å registrere utenlandsk adresse", + "readonly" => $readonly, "checked" => $user->addresstype == "int" ? "checked" : "")); + $fields[] = Array("label" => "gateadresse", "type" => "textarea", + "attributes" => Array("name" => "street", "cols" => 70, "rows" => 3, + "maxlength" => 255, "nocounter" => true, + "readonly" => $readonly, "value" => $user->street)); + $fields[] = Array("label" => "postnummer", "type" => "text", + "attributes" => Array("name" => "zipcode", "size" => 4, "maxlength" => 4, + "onchange" => "checkZip(this);", + "onblur" => "checkZip(this);", + "readonly" => $readonly, "value" => $user->zipcode)); + $fields[] = Array("label" => "poststed", "type" => "text", + "attributes" => Array("name" => "postarea", "readonly" => "readonly", + "size" => strlen($user->postarea) + 1, + "readonly" => "readonly", "value" => $user->postarea)); + $fields[] = Array("label" => "by", "type" => "text", + "attributes" => Array("name" => "city" ,"size" => 50, "maxlength" => 50, + "readonly" => $readonly, "value" => $user->city)); + $fields[] = Array("label" => "stat", "type" => "text", + "attributes" => Array("name" => "state" ,"size" => 50, "maxlength" => 50, + "readonly" => $readonly, "value" => $user->state)); + $fields[] = Array("label" => "land", "type" => "text", + "attributes" => Array("name" => "country" ,"size" => 50, "maxlength" => 50, + "readonly" => $readonly, "value" => $user->country)); + + if (isAdmin() || checkAuth("perform-update-user-hascard")) { + $fields[] = Array("label" => "adressestatus", + "type" => "select", + "attributes" => Array("name" => "valid_address", + "disabled" => $readonly, + "values" => $addressValues, + "currentValue" => $user->validAddress)); + } + + if ($user->validAddress == 0) { + $validAddressMessage = "Postadressen er merket som ugyldig, vennligst undersøk om det er riktig adresse"; + $fields[] = Array("label" => "adressestatus", + "type" => "text", + "attributes" => Array("name" => "addressestatus", "readonly" => true, + "size" => strlen($validAddressMessage), + "value" => $validAddressMessage)); + } + + $fields[] = Array("label" => "telefon", "type" => "text", + "attributes" => Array("name" => "phonenumber" ,"size" => 16, "maxlength" => 16, + "readonly" => $readonly, "value" => $user->phonenumber)); + $fields[] = Array("label" => "epost", "type" => "text", + "attributes" => Array("name" => "email" ,"size" => 50, "maxlength" => 120, + "readonly" => $readonly, "value" => $user->email)); + $fields[] = Array("label" => "fødselsdato", "type" => "date", + "attributes" => Array("name" => "birthdate", + "readonly" => $readonly, "value" => $user->birthdate)); + $fields[] = Array("label" => "studiested", "type" => "select", + "attributes" => Array("name" => "placeOfStudy", "values" => $pos, + "disabled" => $readonly, "currentValue" => $user->placeOfStudy)); + if(isAdmin() || checkAuth("perform-update-user-hascard")){ + $fields[] = Array("label" => "har medlemskort", "type" => "select", + "attributes" => Array("name" => "hasCard", "values" => $cardValues, + "disabled" => $readonly, "currentValue" => $user->hasCard)); + }else { + $fields[] = Array("label" => "har medlemskort", "type" => "hidden", + "attributes" => Array("name" => "hasCard", + "disabled" => $readonly, "value" => $user->hasCard)); + + } + + $form = new Form($title, $enctype, $method, $action, $fields, NULL, $readonly); + $form->display(); + +?> + vis grupper + + + vis endringer + + slett bruker + "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "size" => 10, "maxlength" => 12, + "value" => $user->id)); + $fields[] = Array("label" => "brukernavn", "type" => "text", + "attributes" => Array("name" => "username", "size" => 12, "maxlength" => 12, + "value" => $user->username, + "help" => "Om brukernavnet er i bruk på forumet kreves det at du oppgir samme passord som på forumet for å verifisere at det er ditt brukernavn.")); + $fields[] = Array("label" => "passord", "type" => "password", + "attributes" => Array("name" => "password")); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + + public function _registerDocumentCategory(){ + $docCats = new DocumentCategories(); + $docCats->displayList(); + + print("
     
    "); + + $title = "registrér dokumenttype"; + $enctype = NULL; + $method = "post"; + $action = "javascript: addCategory('document');"; + $fields = Array(); + + $fields[] = Array("label" => "dokumenttype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 50)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editDocumentCategory(){ + $title = "oppdatér dokumenttype"; + $documentcat = new DocumentCategory(scriptParam("documentcategoryid")); + + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-documentcategory&page=register-documentcategory"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "documentcategoryid", "size" => 50, "maxlength" => 25, + "value" => $documentcat->id)); + $fields[] = Array("label" => "stillingstype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 25, + "value" => $documentcat->title)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70, + "value" => $documentcat->text)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _registerEventCategory(){ + $eventCats = new EventCategories(); + $eventCats->displayList(); + + print("
     
    "); + + $title = "registrér aktivitetstype"; + $enctype = NULL; + $method = "post"; + $action = "javascript: addCategory('event');"; + $fields = Array(); + + $fields[] = Array("label" => "aktivitetstype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 50)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editEventCategory(){ + $title = "oppdatér aktivitetstype"; + $eventcat = new EventCategory(scriptParam("eventcategoryid")); + + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-eventcategory&page=register-eventcategory"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "eventcategoryid", "size" => 50, "maxlength" => 25, + "value" => $eventcat->id)); + $fields[] = Array("label" => "stillingstype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 25, + "value" => $eventcat->title)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70, + "value" => $eventcat->text)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _registerJobCategory(){ + $jobCats = new JobCategories(); + $jobCats->displayList(); + + print("
     
    "); + + $title = "registrér stillingstype"; + $enctype = NULL; + $method = "post"; + $action = "javascript: addCategory('job');"; + $fields = Array(); + + $fields[] = Array("label" => "stillingstype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 25)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editJobCategory(){ + $title = "oppdatér stillingstype"; + $jobcat = new JobCategory(scriptParam("jobcategoryid")); + + $enctype = NULL; + $method = "post"; + $action = "index.php?action=update-jobcategory&page=register-jobcategory"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "jobcategoryid", "size" => 50, "maxlength" => 25, + "value" => $jobcat->id)); + $fields[] = Array("label" => "stillingstype", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 25, + "value" => $jobcat->title)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "text", "rows" => 5, "cols" => 70, + "value" => $jobcat->text)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + private function _displayProduct() { + ?> +

    tilbake til produkter

    + display(); + } + + + public function _registerProduct(){ + $products = new Products(); + $products->displayList(); + + $comment_options = array( + array('id' => '0', 'title' => 'Ikke tillat kommentar'), + array('id' => '1', 'title' => 'Tillat kommentar') + ); + + $display_options = array( + array('id' => '1', 'title' => 'Vis i butikk'), + array('id' => '0', 'title' => 'Ikke vis i butikk') + ); + + print("
     
    "); + + $title = "registrér produkt"; + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=register-product&page=register-product"; + $fields = Array(); + + $fields[] = Array("label" => "produktnavn", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 255)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "description", "rows" => 5, "cols" => 70)); + $fields[] = Array("label" => "pris", "type" => "text", + "attributes" => Array("name" => "price", "size" => 4, "maxlength" => 4)); + $fields[] = Array("label" => "kommentarfelt", "type" => "select", + "attributes" => Array("name" => "allow_comment", + "values" => $comment_options, + "help" => "Dette feltet angir om kunder kan legge til kommentarer ved kjøp. Bruk dette dersom man skal oppgi for eksempel størrelser.")); + $fields[] = Array("label" => "vis i butikk", "type" => "select", + "attributes" => Array("name" => "display_in_shop", + "values" => $display_options, + "help" => "Dette feltet angir om produktet skal vises i nettbutikken. Dette gjelder de fleste produkter. Noen produkter (for eksempel medlemskap) skal normalt ikke vises i butikken, men kun være tilgjengelig gjennom andre sider. Dette feltet kan også brukes for å midlertidig fjerne produkter fra butikken.")); + $fields[] =Array("label" => "bilde", "type" => "file", + "attributes" => Array("name" => "userfile", "size" => 55)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + } + + public function _editProduct(){ + $title = "oppdatér produkt"; + $product = new Product(scriptParam("productid")); + $comment_options = array( + array('id' => '0', 'title' => 'Ikke tillat kommentar'), + array('id' => '1', 'title' => 'Tillat kommentar') + ); + + $display_options = array( + array('id' => '0', 'title' => 'Ikke vis i butikk'), + array('id' => '1', 'title' => 'Vis i butikk') + ); + + $enctype = "multipart/form-data"; + $method = "post"; + $action = "index.php?action=update-product&page=register-product"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "productid", "size" => 50, "maxlength" => 25, + "value" => $product->id)); + $fields[] = Array("label" => "produktnavn", "type" => "text", + "attributes" => Array("name" => "title", "size" => 50, "maxlength" => 255, + "value" => $product->title)); + $fields[] = Array("label" => "beskrivelse", "type" => "textarea", + "attributes" => Array("name" => "description", "rows" => 5, "cols" => 70, + "value" => $product->description)); + $fields[] = Array("label" => "pris", "type" => "text", + "attributes" => Array("name" => "price", "size" => 4, "maxlength" => 4, + "value" => $product->price)); + $fields[] = Array("label" => "kommentarfelt", "type" => "select", + "attributes" => Array("name" => "allow_comment", + "currentValue" => $product->allow_comment, "values" => $comment_options, + "help" => "Dette feltet angir om kunder kan legge til kommentarer ved kjøp. Bruk dette dersom man skal oppgi for eksempel størrelser.")); + $fields[] = Array("label" => "vis i butikk", "type" => "select", + "attributes" => Array("name" => "display_in_shop", + "currentValue" => $product->display_in_shop, "values" => $display_options, + "help" => "Dette feltet angir om produktet skal vises i nettbutikken. Dette gjelder de fleste produkter. Noen produkter (for eksempel medlemskap) skal normalt ikke vises i butikken, men kun være tilgjengelig gjennom andre sider. Dette feltet kan også brukes for å midlertidig fjerne produkter fra butikken.")); + $fields[] =Array("label" => "bilde", "type" => "file", + "attributes" => Array("name" => "userfile", "size" => 55)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + + $product->displayBuyers(); + } + + public + function _registerMembership(){ + ?> +

    Har du kjøpt medlemskap i en av barene på Studentersamfundet?

    +

    Du skal ha fått med et eget kort med aktiveringsnummer og aktiveringspassord.

    + + "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "size" => 12, "maxlength" => 10, + "value" => getCurrentUser())); + $fields[] = Array("label" => "aktiveringsnummer", "type" => "text", + "attributes" => Array("name" => "cardno", "size" => 12, "maxlength" => 10)); + $fields[] = Array("label" => "aktiveringspassord", "type" => "text", + "attributes" => Array("name" => "verificationCode", "size" => 12, "maxlength" => 20)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + if (checkAuth("view-register-membership-payex")) { + ?> +
    +

    Vil du betale med VISA-kort?

    + display(); + } + } + + public + function _renewMembership(){ + $title = "aktiver medlemskap"; + + $enctype = NULL; + $method = "post"; + $action = "index.php?action=renew-membership"; + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "size" => 12, "maxlength" => 10, + "value" => getCurrentUser())); + $fields[] = Array("label" => "aktiveringsnummer", "type" => "text", + "attributes" => Array("name" => "cardno", "size" => 12, "maxlength" => 10, + "comment" => "Bruk aktiveringsnummeret på arket du fikk da du kjøpte medlemskapet ditt.")); + $fields[] = Array("label" => "aktiveringskode", "type" => "text", + "attributes" => Array("name" => "verificationCode", "size" => 12, "maxlength" => 20)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + if (checkAuth("view-register-membership-payex")) { + ?> +
    +

    Vil du betale med VISA-kort?

    + display(); + } + + } + + public + function _payexForm($title = "test payex", $type = NULL, $value = NULL, $product_id = NULL){ + + $enctype = NULL; + $method = "post"; + if ($type == "membership") { + $action = "index.php?action=register-membership-payex"; + $product_id = 1; + }else if ($type ="galla"){ + $action = "index.php?action=payex-transaction"; + + } + + if ($product_id != NULL){ + $product = new Product($product_id); + } + + $trans_id = createTransactionId(); + + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "size" => 12, "maxlength" => 10, + "value" => getCurrentUser())); + $fields[] = Array("label" => "product id", "type" => "hidden", + "attributes" => Array("name" => "productid", "size" => 12, "maxlength" => 10, + "value" => $product_id)); + $fields[] = Array("label" => "trans id", "type" => "hidden", + "attributes" => Array("name" => "transactionid", "size" => 12, "maxlength" => 20, + "value" => $trans_id)); + if ($value == NULL) { + if ($product != NULL){ + $fields[] = Array("label" => "beløp", "type" => "text", + "attributes" => Array("name" => "amount", "size" => 5, "maxlength" => 5, + "value" => $product->price, "readonly" => "readonly")); + }else { + $fields[] = Array("label" => "beløp", "type" => "text", + "attributes" => Array("name" => "amount", "size" => 5, "maxlength" => 5)); + } + }else { + $fields[] = Array("label" => "beløp", "type" => "text", + "attributes" => Array("name" => "amount", "size" => 5, "maxlength" => 5, + "value" => $value, "readonly" => "readonly")); + } + + $fields[] = Array("label" => "VISA-kortnummer", "type" => "text", + "attributes" => Array("name" => "cardNumber", "size" => 16, "maxlength" => 16)); + $fields[] = Array("label" => "utløpsmåned", "type" => "text", + "attributes" => Array("name" => "cardNumberExpireMonth", "size" => 2, "maxlength" => 2)); + $fields[] = Array("label" => "utløpsår", "type" => "text", + "attributes" => Array("name" => "cardNumberExpireYear", "size" => 2, "maxlength" => 2)); + $fields[] = Array("label" => "cvc", "type" => "text", + "attributes" => Array("name" => "cardNumberCVC", "size" => 3, "maxlength" => 3)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + ?> +

    Betalingen håndteres av Payex.

    + display(); + } + + public + function _transactionConfirmation() { + $trans = new Transaction(scriptParam("transactionid")); + $trans->displayConfirmation(); + } + + public + function _displayBugReports(){ + ?> +

    + vis alle + vis behandlede + vis ikke behandlede +

    + displayList(); + } + + public + function _displayBugReport(){ + $bugId = scriptParam("bugreportid"); + $bug = new BugReport($bugId); + $bug->display(); + } + + public + function _buyTicketGalla(){ + ?> +
    +

    Galla lørdag 30. september 2006

    +

    Nu er det atter tid for at feire os selv. Den 2re Oktober i det Herrens aar 1813 blev Det Norske Studentersamfund stiftet av 13 studenter ved det Kongelige Frederiks Universitet, og denne vor Fødselsdag ønsker vi at skal blive høstens vakreste Eventyr...

    +

    Av denne Grund haver vi den Glede at invitere Dig, kiære Medlem, til Gallamiddag den 30te September paa vaart vakre Hus. Aftenen vil begynne kl. 18:13 med en Mottakelse i Biblioteket, hvoretter en femretters Midag, med baade taler og sang, vil blive servert i Betong. Derefter gaar turen atter til BokCaféen og Biblioteket, hvor dansen vil gaa ut i de sene Nattestimer.

    +

    Vi haaper De vil beære Os med Deres tilstedevaerelse paa denne Gledens Dag.

    +
    +

    Praktisk om påmelding:

    +

    Påmelding er bindene, og billetten vil ikke bli refundert.

    +

    Du kan kjøpe fler billetter på en gang. I så fall må du bruke kommentarfeltet til å skrive hvem du kjøper billett til.

    +

    Om du har spesielle behov i forbindelse med maten kan du også skrive det her.

    + display(); + ?> +
    displayShopProducts(); + } + + public function _displaySales(){ + $products = new Products(); + $products->displayList(); + } + + public function _displaySalesItem(){ + $product = new Product(scriptParam('productid')); + $product->displayBuyers(); + } + + public + function _displayCart(){ + $order_id = scriptParam("order_id"); + if (!empty($order_id)){ + $order = new Order($order_id); + if ($order->user_id != getCurrentUser()) { + notify("Ugyldig ordrenummer. Gå tilbake og prøv igjen."); + return; + } + $order->display(); + }else { + print("

    Ingen aktive handlekurverer registert.

    "); + $user = new User(getCurrentUser()); + $user->displayOrders(); + } + } + + public + function _displayCarts(){ + $order_status = scriptParam("orderstatus"); + $order_status_list = new OrderStatuses(); + $list = $order_status_list->getList(); + + $status= scriptParam("orderstatus"); + if (empty($status)){ + $status = 1; + } + + $title = "vis handlekurver med status"; + $enctype = NULL; + $method = "post"; + $action = "index.php?page=display-carts"; + $fields = Array(); + + $fields[] = Array("label" => "vis handlekurver med status", "type" => "select", + "attributes" => Array("name" => "orderstatus", "values" => $list, + "currentValue" => $status)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + + $user = new User(getCurrentUser()); + $user->displayOrders($status); + } + + public + function _cartCheckout(){ + $order_id = scriptParam("order_id"); + $order = new Order($order_id); + if ($order->user_id != getCurrentUser()) { + notify("Ugyldig ordrenummer. Gå tilbake og prøv igjen."); + return; + } + + $order->displayShortList(); + + $title = "Utfør betaling"; + $enctype = NULL; + $method = "post"; + $action = "index.php?action=cart-checkout"; + + + $trans_id = createTransactionId(); + $value = $order->calculateTotalAmount(); + + $fields = Array(); + + $fields[] = Array("label" => "id", "type" => "hidden", + "attributes" => Array("name" => "userid", "size" => 12, "maxlength" => 10, + "value" => getCurrentUser())); + $fields[] = Array("label" => "order id", "type" => "hidden", + "attributes" => Array("name" => "order_id", "size" => 12, "maxlength" => 10, + "value" => $order_id)); + $fields[] = Array("label" => "trans id", "type" => "hidden", + "attributes" => Array("name" => "transactionid", "size" => 12, "maxlength" => 20, + "value" => $trans_id)); + $fields[] = Array("label" => "beløp", "type" => "text", + "attributes" => Array("name" => "amount", "size" => 5, "maxlength" => 5, + "value" => $value, "readonly" => "readonly")); + $fields[] = Array("label" => "VISA-kortnummer", "type" => "text", + "attributes" => Array("name" => "cardNumber", "size" => 16, "maxlength" => 16)); + $fields[] = Array("label" => "utløpsmåned", "type" => "text", + "attributes" => Array("name" => "cardNumberExpireMonth", "size" => 2, "maxlength" => 2)); + $fields[] = Array("label" => "utløpsår", "type" => "text", + "attributes" => Array("name" => "cardNumberExpireYear", "size" => 2, "maxlength" => 2)); + $fields[] = Array("label" => "cvc", "type" => "text", + "attributes" => Array("name" => "cardNumberCVC", "size" => 3, "maxlength" => 3, + "help" => "CVC-koden finner du på baksiden av VISA-kortet ditt, som oftest i signaturfeltet. Det er de tre siste sifrene som skal brukes.")); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display(); + ?> +

    Betalingen håndteres av Payex.

    + toString()); + } + + $sql = "SELECT * FROM din_sms_received ORDER BY date"; + $result = $conn->query($sql); + if (DB::isError($result) == true){ + error($result->toString()); + return false; + } + if ($result->numRows() > 0) { +?> +

    Mottatte SMS

    +

    Antall treff: numRows()); ?>

    + + + + + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + } + print "
    smsiduseridgsmshortnokodeordmessageaction performeddatesimulation
    " . $row->smsid . "" . $row->userid . "" . $row->gsm . "" . $row->shortno . "" . $row->codeword . "" . $row->message . "" . $row->action . "" . $row->date . "" . $row->simulation . "
    "; + } else { + print "

    Ingen SMS registrert.

    "; + } + + + $sql = "SELECT * FROM din_sms_sent ORDER BY date"; + $result = $conn->query($sql); + if (DB::isError($result) == true){ + error($result->toString()); + return false; + } + if ($result->numRows() > 0) { +?> +

    Sendte SMS

    +

    Antall treff: numRows()); ?>

    + + + + + + + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print ""; + print "\n"; + } + print "
    smsidresponse toeurobate msgidsenderreceivermessagecodewordbilling priceuse dlrdatesimulation
    " . $row->smsid . "" . $row->response_to . "" . $row->msgid . "" . $row->sender . "" . $row->receiver . "" . $row->message . "" . $row->codeword . "" . ($row->billing_price)/100 . ",-" . $row->use_dlr . "" . $row->date . "" . $row->simulation . "
    "; + } else { + print "

    Ingen SMS registrert.

    "; + } + } +} + +?> diff --git a/inside/Payment.php b/inside/Payment.php new file mode 100644 index 0000000..e6f644d --- /dev/null +++ b/inside/Payment.php @@ -0,0 +1,138 @@ +initPayex(); + } + + private function initPayex() { + //From setupexample + define('PAYEX_PXPARTNER_WSDL', 'https://external.payex.com/pxorder/pxpartner.asmx?WSDL'); + define('PAYEX_PXPRINT_WSDL', 'https://external.payex.com/pxorder/pxprint.asmx?WSDL'); + define('PAYEX_PXDEPOSIT_WSDL', 'https://external.payex.com/pxorder/pxdeposit.asmx?WSDL'); + define('PAYEX_PXACCOUNT_WSDL', 'https://external.payex.com/pxorder/pxaccount.asmx?WSDL'); + define('PAYEX_PXORDER_WSDL', 'https://external.payex.com/pxorder/pxorder.asmx?WSDL'); + define('PAYEX_PXCLIENT_WSDL', 'https://external.payex.com/pxclient/pxclient.asmx?WSDL'); + define('PAYEX_PXMERCHANT_WSDL', 'https://external.payex.com/pxmerchant/pxmerchant.asmx?WSDL'); + define('PAYEX_PXSUBSCRIPTION_WSDL', 'https://external.payex.com/pxsubscription/pxsubscription.asmx?WSDL'); + define('PAYEX_PXAGREEMENT_WSDL', 'https://external.payex.com/pxagreement/pxagreement.asmx?WSDL'); + + define('PAYEX_PXORDER_URL', 'https://account.payex.com/pxorder.asp'); // url to redirect user to + define('PAYEX_ACCOUNTNUMBER', 20180218); // payex merchant account number + define('PAYEX_ENCRYPTIONKEY', 'vy8wMAvJjvW4RaCEWJFf'); // payex encryption key + // end setup + require_once ('../payex2/payex_pxorder.php'); // Include the Payex PxOrder implementation + $this->payex = new PayexPxOrder(); // Make an instance of the PayexPxOrder class + + $this->user_email = false; + + } + + public function executeRedirect($transaction_id_string, $order_id){ + //init order + $order = new Order($order_id); + $this->amount = $order->calculateTotalAmount(); + if (Transaction :: isFreeIdString($transaction_id_string)) { + $trans_data = Array("id_string" => $transaction_id_string, + "user_id" => getCurrentUser(), + "order_id" => $order_id, + "status" => "PENDING", + "amount" => $this->amount); + $transaction = new Transaction(NULL, $trans_data); + $transaction->store(); + $transaction_id = $transaction->id; + }else { + notify("Transaksjonen er allerede forsøkt gjennomført. Dette skyldes sannsynligvis at du har trykket to ganger på 'submit'-knappen."); + return; + } + + + // set the parameters for Initialize + $purchaseOperation = 'SALE'; // 1-phased transaction + $orderID = $transaction->id; //Order id, generated from database + $productNumber = 'Handlevogn #'.$order->id; //Order id + $price = $this->amount * 100; + $priceArgList = 'VISA=%s,MC=%s'; // No CPA, VISA, MasterCard, SMS + $priceArgList = sprintf($priceArgList, $price, $price); + $description = "Kjøp fra Studentersamfundet.no"; + $returnURL = 'https://www.studentersamfundet.no/inside/index.php?action=transaction-return&transactionid='.$transaction_id; // ReturnURL + + // Run Initialize. Check return-value + if ( $this->payex->InitializeBasic( + $purchaseOperation, $orderID, $productNumber, $priceArgList, + $description, $returnURL) ) { + $orderRef = $this->payex->getOrderRef(); // get the orderRef + $this->payex->redirect($orderRef); // redirect the user + } else { + echo 'Initialize() failed.
    '; + echo 'Code: '.$this->payex->getcode().' '; + echo 'Description: '. $this->payex->getdescription().'
    '; + } + return false; + } + + public function completeTransaction($orderRef, $transaction_id) { + if ( $this->payex->Complete($orderRef) ) { + + /* + Transaction statuses (defined in payex_defines.php): + 0=Sale, 1=Initialize, 2=Credit, 3=Authorize, 4=Cancel, 5=Failure, 6=Capture + */ + //notify($this->payex->getTransactionStatus()); + if (!($this->payex->getTransactionStatus() == PAYEX_TRANSACTIONSTATUS_SALE || + $this->payex->getTransactionStatus() == PAYEX_TRANSACTIONSTATUS_CAPTURE) ) + { + notify("Betalingen er ikke riktig gjennomført. Vennligst ta kontakt med support om du tror dette skyldes en feil."); + return false; + } + + $transaction = new Transaction($transaction_id); + $transaction->setStatus("OK"); + notify("Betalingen er gjennomført. En kvittering er blitt sendt til din registrerte epostadresse."); + if (!$this->user_email) { // get user mail from current user + $user = new User(getCurrentUser()); + $this->user_email = $user->email; + } + $this->_sendConfirmationMail($transaction_id); + return true; + }else { + notify("Betalingen er ikke riktig gjennomført. Vennligst ta kontakt med support om du tror dette skyldes en feil."); + return false; + } + } + + public function setUserEmail ($newmail) { + $this->user_email = $newmail; + } + + public function _sendConfirmationMail ($transaction_id) { + $sendto = $this->user_email; + $transaction = new Transaction($transaction_id); + $order = new Order($transaction->order_id); + $subject = "=?iso8859-1?Q?[$transaction->id] Kvittering for kj=F8p p=E5 studentersamfundet.no?="; + $message = "Hei!\n\n" . + "Du har nettopp gjennomført et kjøp på studentersamfundet.no. Transaksjonen har referansen $transaction->id.\n\n" . + "Du har kjøpt:\n" . + $order->getConfirmationText()."\n" . + "Prisen for dette er NOK $transaction->amount,-\n" . + "Beløpet er blitt belastet ditt VISA-kort. På kontoutskriften vil det stå Payex AS.\n\n" . + "For spørsmål angående dette kan du svare på denne eposten. Se forøvrig http://www.studentersamfundet.no/kontakt.php for ytterligere kontaktinformasjon.\n\n" . + "Med vennlig hilsen\n" . + "Det Norske Studentersamfund\n\n"; + $headers = "From: Det Norske Studentersamfund \r\n"; + + mail($sendto, $subject, $message, $headers); + } + +} +?> \ No newline at end of file diff --git a/inside/Payment_backup.php b/inside/Payment_backup.php new file mode 100644 index 0000000..3eaa32f --- /dev/null +++ b/inside/Payment_backup.php @@ -0,0 +1,111 @@ +__construct($id, $data); + } + + public + function __construct($id = NULL, $data = NULL) { + $this->conn = db_connect(); + + $this->id = $id; + $this->status = "FAILURE"; + + $product = new Product($data['productid']); + if (Transaction :: isFreeIdString($data['transactionid'])) { + $trans_data = Array("id_string" => $data['transactionid'], + "user_id" => getCurrentUser(), + "product_id" => $product->id, + "status" => "PENDING"); + $transaction = new Transaction(NULL, $trans_data); + $transaction->store(); + }else { + notify("Transaksjonen er allerede gjennomført. Dette skyldes sannsynligvis at du har trykket to ganger på 'submit'-knappen."); + return; + } + + $amount = $product->price * 100; + + require_once ('../payex/payex_pxorder.php'); // Include the Payex PxOrder implementation + + $payex = new PayexPxOrder(); // Make an instance of the PayexPxOrder class + + $enc_key = PAYEX_ENCRYPTIONKEY; + + $accountNumber = PAYEX_ACCOUNTNUMBER; //Our merchant id + $purchaseOperation = "SALE"; //Type of pruchase, always SALE + $orderID = $transaction->id; //Order id, generated from database + + $productNumber = $product->id; //Product id + $priceArgList = "VISA=$amount"; //Price list, as of now only VISA is supported + $descripion = $product->description; + $returnURL = "https://www.studentersamfundet.no/inside/index.php?page=payex-form"; + + $payex->InitializeBasic($purchaseOperation, $orderID, $productNumber, $priceArgList, $descripion, $returnURL); + + if ($payex->code == 'OK') { + //notify("Kontakt med betalingsserver er etablert."); + }else { + notify("Problemer med å oppnå kontakt med betalingsserver, vennligst prøv igjen senere."); + return; + } + + $orderRef = $payex->orderRef; + $userType = PAYEX_USERTYPE_EMAIL; + $user = new User(getCurrentUser()); + $userRef = $user->email; + $cardNumber = $data['cardNumber']; //test: "4925000000000004"; + $cardNumberExpireMonth = $data['cardNumberExpireMonth']; //test: "08"; + $cardNumberExpireYear = $data['cardNumberExpireYear']; //test: "08"; + $cardNumberCVC = $data['cardNumberCVC']; //test: "123"; + + //SaleCC for direct creditcard + $payex->SaleCC($orderRef, $userType, $userRef, $cardNumber, $cardNumberExpireMonth, $cardNumberExpireYear, $cardNumberCVC); + + if ($payex->code == 'OK') { + $this->status = "OK"; + $this->transaction_id = $transaction->id; + $transaction->setStatus("OK"); + notify("Betalingen er gjennomført. En kvittering er blitt sendt til din registrerte epostadresse."); + $this->user_email = $userRef; + $this->_sendConfirmationMail(); + }else { + $transaction->setStatus("FAILURE"); + error("Teknisk kode: " . $payex->getCode() . " - ". $payex->getDescription()); + notify("Problemer med betaling. Vennligst påse at du har tastet inn riktig VISA-informasjon."); + return; + } + } + + public + function _sendConfirmationMail () { + $sendto = $this->user_email; + $transaction = new Transaction($this->transaction_id); + $product = new Product($transaction->product_id); + $subject = "[$transaction->id]Kvittering for kjøp på studentersamfundet.no"; + $message = "Hei!\n\n" . + "Du har nettopp gjennomført et kjøp på studentersamfundet.no. Ordren har referansen $transaction->id.\n\n" . + "Du har kjøpt:\n" . + "$product->title\n" . + "$product->description\n\n" . + "Prisen for dette er NOK $product->price,-\n" . + "Beløpet er blitt belastet ditt VISA-kort. På kontoutskriften vil det stå Payex AS.\n\n" . + "For spørsmål angående dette kan du svare på denne eposten. Se forøvrig http://www.studentersamfundet.no/kontakt.php for ytterligere kontaktinformasjon.\n\n"; + $headers = 'From: Det Norske Studentersamfund '."\r\n"; + mail($sendto, $subject, $message, $headers); + } + +} +?> \ No newline at end of file diff --git a/inside/PlacesOfStudy.php b/inside/PlacesOfStudy.php new file mode 100644 index 0000000..d20af00 --- /dev/null +++ b/inside/PlacesOfStudy.php @@ -0,0 +1,68 @@ +__construct(); + } + + function __construct(){ + $this->conn = DB_connect("dns"); + + $minId = 1; + if (loggedIn()){ + $user = new User(getCurrentUser()); + if ($user->placeOfStudy == 1){ + $minId = 0; + } + } + + $sql = "SELECT id, navn AS name " . + "FROM studiesteder " . + "WHERE id > $minId " . + "ORDER BY name ASC"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->users = $result; + }else { + error($result->toString()); + } + } + + public function getList(){ + return $this->users; + } + + public function displayList($limit = 25){ + if ($this->users->numRows() > 0){ +?> + + + + + + +users->fetchRow(DB_FETCHMODE_OBJECT)){ +?> + + + + userId, "user"); ?> + + + +"); + }else { + print("

    Ingen medlemmer registrert.

    "); + } + } + +} +?> \ No newline at end of file diff --git a/inside/Position.php b/inside/Position.php new file mode 100644 index 0000000..2b12d42 --- /dev/null +++ b/inside/Position.php @@ -0,0 +1,177 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New position + if ($data == NULL){ + error("Position: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->division_name = $data['division_name']; + } + } + //Common initializations + $this->name = $data['name']; + $this->text = $data['text']; + $this->division_id = $data['division_id']; + } + + public function store(){ + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO din_position + (id, name, text, division_id) + VALUES + (%s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->division_id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Stillingen $this->name er registrert."); + }else { + error("New position: " . $result->toString()); + } + + }else { + $sql = sprintf("UPDATE din_position SET + name = %s, + text = %s, + division_id = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->name), + $this->conn->quoteSmart($this->text), + $this->conn->quoteSmart($this->division_id), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify(POSITION . " " . UPDATED); + }else { + error("Update position: " . $result->toString()); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT p.*, d.name AS division_name + FROM din_position p, din_division d + WHERE p.id = $this->id + AND p.division_id = d.id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Position: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_position + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + //if ($result->affectedRows() > 0){ + notify("Position deleted."); + // }else { + //notify("Position: invalid id."); + // } + }else { + error($result->toString()); + } + } + + public function display(){ + $ads = $this->_getCurrentAds(); +?> +
    +id, POSITION, "position", "view-edit-options-position"); +?> +

    name; ?> i division_name; ?>

    + +

    text); ?>

    +numRows() > 0){?> +

    Denne stillingen er for øyeblikket utlyst:

    + + +
    + + + + + + id, POSITION, "position", "view-edit-options-position"); ?> + + +id + AND j.expires > NOW()"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + }else { + error("Position: " . $result->toString()); + } + } + +} + +?> \ No newline at end of file diff --git a/inside/Positions.php b/inside/Positions.php new file mode 100644 index 0000000..18a7d9c --- /dev/null +++ b/inside/Positions.php @@ -0,0 +1,81 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getList($division = NULL){ + if ($division != NULL){ + $condition = "AND p.division_id = $division"; + }else { + $condition = ""; + } + $sql = "SELECT d.id AS divId, d.name AS divName, p.id AS positionId, p.name AS positionName " . + "FROM din_position p, din_division d " . + "WHERE p.division_id = d.id " . + "$condition" . + "ORDER BY d.name ASC"; + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("Positions: " . $result->toString()); + return false; + } + } + + public function getPositionsAsArray(){ + if ($list = $this->getPositions()){ + $pos = Array(); + while ($row =& $list->fetchRow(DB_FETCHMODE_ASSOC)){ + $div = $row['divId']; + + $pos[] = Array("id" => $row['positionId'], + "title" => $row['positionName'], + "parent" => $row['positionDivId']); + } + return $pos; + } + } + + public function displayList($division){ + $sql = "SELECT p.id FROM din_position p, din_division d " . + "WHERE p.division_id = d.id " . + "AND p.division_id = $division " . + "ORDER BY d.name ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if($result->numRows() > 0){ +?> +
    idnavn 
    + userId; ?> + name; ?>
    division_name; ?>name; ?>
    + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $position = new Position($row['id']); + $position->displayList(); + } + print("
    foreningstilling 
    "); + }else {?> +

    Ingen stillingsbeskrivelser er registrert ennå.

    +toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/Product.php b/inside/Product.php new file mode 100644 index 0000000..17d5977 --- /dev/null +++ b/inside/Product.php @@ -0,0 +1,337 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New division + if ($data == NULL){ + error("Product: No data supplied."); + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + if($_FILES['userfile']['error'] != 4){ + $temp_name = new_file($_FILES['userfile'], 'products'); + rename_file($temp_name, $this->id, 'products'); + $this->picture = $this->id.substr($temp_name, -4); + }else { + $this->picture = 0; + } + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->picture = $data['picture']; + } + } + //Common initializations + $this->title = $data['title']; + $this->description = $data['description']; + $this->price = $data['price']; + $this->allow_comment = $data['allow_comment']; + $this->display_in_shop = $data['display_in_shop']; + + } + + public function store(){ + if ($this->id == NULL){ + $this->id = getNextId("din_product"); + $sql = sprintf("INSERT INTO din_product + (id, title, description, price, allow_comment, display_in_shop) + VALUES + (%s, %s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->description), + $this->conn->quoteSmart($this->price), + $this->conn->quoteSmart($this->allow_comment), + $this->conn->quoteSmart($this->display_in_shop) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + if($_FILES['userfile']['error'] != 4){ + $temp_name = new_file($_FILES['userfile'], 'products'); + rename_file($temp_name, $this->id, 'products'); + $this->picture = $this->id.substr($temp_name, -4); + }else { + $this->picture = 0; + } + + $this->_storeFilenames(); + notify("Nytt produkt lagret."); + }else { + error("New product: " . $result->toString()); + } + + }else { + $sql = sprintf("UPDATE din_product SET + title = %s, + description = %s, + price = %s, + allow_comment = %s, + display_in_shop = %s + WHERE + id = %s", + $this->conn->quoteSmart($this->title), + $this->conn->quoteSmart($this->description), + $this->conn->quoteSmart($this->price), + $this->conn->quoteSmart($this->allow_comment), + $this->conn->quoteSmart($this->display_in_shop), + $this->conn->quoteSmart($this->id) + ); + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->_storeFilenames(); + notify("Produkt oppdatert."); + }else { + notify("Problemer med lagring av produkt. Ingen endringer utført."); + error("Update product: " . $result->toString()); + } + } + } + + private function _storeFilenames() { + if ($this->picture != 0) { + $sql = "UPDATE din_product "; + $sql .= "SET picture = '$this->picture' "; + $sql .= "WHERE id = $this->id"; + $result = $this->conn->query($sql); + } + } + + public function _retrieveData(){ + $sql = "SELECT * "; + $sql .= "FROM din_product p "; + $sql .= "WHERE p.id = $this->id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true) { + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)) { + return $row; + } + } else { + error("Product: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_product "; + $sql .= "WHERE id = $id "; + $sql .= "LIMIT 1"; + + $result = $conn->query($sql); + + if (DB::isError($result) != true) { + if ($conn->affectedRows() > 0) { + notify("Produktet er slettet."); + } else { + notify("Ugyldig produktid, ingen handling utført."); + } + } else { + error($result->toString()); + } + } + + // return number of sold items + public function getNumSold() { + $sql = "SELECT SUM(oi.quantity) AS num "; + $sql .= "FROM din_product p, din_order_item oi, din_order o "; + $sql .= "WHERE oi.product_id = p.id AND oi.order_id = o.id AND o.order_status_id = 4 AND p.id = $this->id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true) { + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)) { + if ($row['num'] > 0) return $row['num']; + else return 0; + } + } else { + error("Product: " . $result->toString()); + } + } + + // is it in shop ? + public function getDisplay() { + if ($this->display_in_shop) return "Ja"; + return "Nei"; + } + + // return number of items not marked as delivered + public function getNumNew(){ + $sql = "SELECT COUNT(*) AS num "; + $sql .= "FROM din_product p, din_order_item oi, din_order o "; + $sql .= "WHERE oi.product_id = p.id AND oi.order_id = o.id AND o.order_status_id = 4 AND p.id = $this->id AND order_deliverystatus_id='0'"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true) { + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)) { + return $row['num']; + } + } else { + error("Product: " . $result->toString()); + } + } + + public function display(){ +?> +
    + picture != 0){ + print('
    '); + print(''); + print('
    '); + } + ?> +

    title; ?>

    +

    description); ?>

    +

    Pris: price); ?>

    +
    + "", "type" => "cart_product", + "attributes" => Array("name" => "cart_product", "product_id" => $this->id, "order_id" => $order_id, "allow_comment" => $this->allow_comment)); + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("horizontal"); + ?> +
    + + +
    + picture != 0){ + print('
    '); + print(''); + print('
    '); + } + ?> +

    title; ?>

    +

    Pris: price); ?>

    +
    +
    + + + + title; ?> + description); ?> + price); ?> + getDisplay();?> + getNumSold(); ?> + getNumNew(); ?> + id, PRODUCT, "product", "view-edit-options-product"); ?> + +id"; + + $result =& $this->conn->query($sql); + + if (DB::isError($result) == true){ + notify('Liste over kjøpere er ikke tilgjengelig.'); + error('List buyers: ' . $result->toString()); + } + ?> + + + + + + + + + + fetchRow(DB_FETCHMODE_ASSOC)){ + $user = new User($row['id']); + ?> + + + + + + + + + +
    #kjøperantallstatusendre statusdato
    getName(); ?>
    +
    +
    + + + +
    +
    + \ No newline at end of file diff --git a/inside/Products.php b/inside/Products.php new file mode 100644 index 0000000..0f8869e --- /dev/null +++ b/inside/Products.php @@ -0,0 +1,102 @@ +__construct(); + } + + function __construct(){ + $this->conn = db_connect(); + } + + public function getList(){ + $sql = "SELECT p.id, p.title " . + "FROM din_product d"; + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("Products: " . $result->toString()); + } + } + + public function display(){ + $sql = "SELECT id FROM din_product + ORDER BY title ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + while ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + + displayOptionsMenu($row['id'], "product"); + $product = new Product($row['id']); + $product->display(); + } + }else { + error("Products: " . $result->toString()); + } + } + + public function displayList(){ + $sql = "SELECT id FROM din_product + ORDER BY display_in_shop DESC, title ASC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){?> + + + + + + + + + + +fetchRow(DB_FETCHMODE_ASSOC)){ + $product = new Product($row['id']); + $product->displayList(); + } + print("
    produktnavnbeskrivelseprisaktivsolgtnye
    "); + } else { + error("Products: " . $result->toString()); + } + } + + public function displayShopProducts(){ + $sql = "SELECT id FROM din_product WHERE display_in_shop = 1 + ORDER BY id DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){?> +
    +

    Produkter tilgjengelig for kjøp:

    +displayListShop(); + } else { + $product = new Product(12); + $product->displayListShop(); + } + + // List opp produkter + while ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + $product = new Product($row['id']); + $product->displayListShop(); + } + + ?>
    toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/ProgramSelection.php b/inside/ProgramSelection.php new file mode 100644 index 0000000..a214090 --- /dev/null +++ b/inside/ProgramSelection.php @@ -0,0 +1,148 @@ +__construct($id, $data); + } + + public function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New ProgramSelection + if ($data == NULL){ + error("ProgramSelection: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + } + } + + //Common initializations + $this->start = $data['start']; + $this->end = $data['end']; + $this->pretext = ($data['pretext'] == NULL)? '' : $data['pretext']; + $this->type = $data['type']; + } + + public function store(){ + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO programselection + (id, pretext, start, end, type) + VALUES + (%s, %s, %s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->pretext), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->type) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Programutvalg er registrert."); + }else { + error("New ProgramSelection: " . $result->toString()); + } + }else { + $sql = sprintf("UPDATE programselection SET " . + " pretext = %s, " . + " start = %s, " . + " end = %s, " . + " type = %s " . + "WHERE " . + " id = %s", + $this->conn->quoteSmart($this->pretext), + $this->conn->quoteSmart($this->start), + $this->conn->quoteSmart($this->end), + $this->conn->quoteSmart($this->type), + $this->conn->quoteSmart($this->id) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Programutvalg er oppdatert."); + }else { + error("Update ProgramSelection: " . $result->toString()); + } + + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM programselection + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("ProgramSelection: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM programselection + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + //if ($result->affectedRows() > 0){ + notify("ProgramSelection deleted."); + // }else { + //notify("ProgramSelection: invalid id."); + // } + }else { + error($result->toString()); + } + } + + public function display(){ +?> +
    +id, PROGRAMSELECTION, "program selection", "view-edit-options-programselection"); +?> +
    + + + + #id; ?> + start;?> + end;?> + type;?> + endre + vis html + vis tekst + + + \ No newline at end of file diff --git a/inside/ProgramsSelection.php b/inside/ProgramsSelection.php new file mode 100644 index 0000000..4c9834d --- /dev/null +++ b/inside/ProgramsSelection.php @@ -0,0 +1,61 @@ +__construct($limit); + } + + function __construct($limit = 5){ + $this->conn = db_connect(); + } + + public function display(){ + $sql = "SELECT id FROM programselection + ORDER BY id DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + while ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $programselection = new ProgramSelection($row->id); + $programselection->display(); + } + }else { + error("ProgramsSelection: " . $result->toString()); + } + + } + + public function displayList(){ + $sql = "SELECT id FROM programselection " . + "ORDER BY id DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if($result->numRows() > 0){ +?> + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + $programselection = new ProgramSelection($row->id); + $programselection->displayList(); + } + print("
    idfratiltype 
    "); + }else {?> +

    Ingen programutvalg er registrert ennå.

    +toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/Transaction.php b/inside/Transaction.php new file mode 100644 index 0000000..da291f4 --- /dev/null +++ b/inside/Transaction.php @@ -0,0 +1,156 @@ +__construct($id, $data); + } + + public + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){// Transaction + if ($data == NULL){ + error("Transaction: No data supplied."); + return; + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->timestamp = $data['timestamp']; + } + } + //Common initializations + $this->id_string = $data['id_string']; + $this->user_id = $data['user_id']; + $this->order_id = $data['order_id']; + $this->status = $data['status']; + $this->amount = $data['amount']; + } + + public function store(){ + if ($this->id == NULL){ + $this->id = getNextId("din_transaction"); + $sql = sprintf("INSERT INTO din_transaction + (id, id_string, user_id, order_id, timestamp, status, amount) + VALUES + (%s, %s, %s, %s, NOW(), %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->id_string), + $this->conn->quoteSmart($this->user_id), + $this->conn->quoteSmart($this->order_id), + $this->conn->quoteSmart($this->status), + $this->conn->quoteSmart($this->amount) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Ny transaksjon lagret."); + }else { + error("New transaction: " . $result->toString()); + } + } + } + + public + function setStatus($value) { + $sql = "UPDATE din_transaction SET + status = '$value' + WHERE " . + " id = $this->id"; + + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + //notify("Transaksjonsstatus oppdatert ($value)"); + }else { + error("Set status - transaction: " . $result->toString()); + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM din_transaction t + WHERE t.id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("Transaction: " . $result->toString()); + } + } + + public + /*static*/ + function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM din_transaction + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + if ($conn->affectedRows() > 0){ + notify("Transaksjonen er slettet."); + }else { + notify("Ugyldig transaksjonsid, ingen handling utført."); + } + }else { + error($result->toString()); + } + } + + public + /*static*/ + function isFreeIdString($string) { + $conn = db_connect(); + $sql = "SELECT id FROM din_transaction + WHERE id_string = '$string'"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + if ($result->numRows() == 0){ + return true; + } + }else { + error($result->toString()); + } + return false; + } + + public + function displayConfirmation() { + $order = new Order($this->order_id); + ?> +

    Følgende bestilling er registrert og belastet ditt VISA-kort:

    +

    Transaksjonen har referansen id; ?>.

    + displayConfirmation(); + ?> + +

    På kontoutskriften vil det stå Payex AS.

    +

    For spørsmål angående dette kan du kontakte support@studentersamfundet.no.

    +

    Se forøvrig våre kontaktsider for ytterligere kontaktinformasjon.

    + \ No newline at end of file diff --git a/inside/User.php b/inside/User.php new file mode 100644 index 0000000..799281b --- /dev/null +++ b/inside/User.php @@ -0,0 +1,1437 @@ +__construct($id, $data); + } + + public function __construct($id, $data = NULL) { + $conn = & DB :: connect(getDSN()); + if (DB :: isError($conn)) { + print ("error: " . $conn->toString()); + exit (); + } else { + $this->conn = $conn; + } + + $action = scriptParam("action"); + $this->id = $id; + + if ($id == NULL) { //New user + if ($data == NULL) { + error("User: No data supplied."); + $this->id = -1; + return false; + } else { + $this->username = stripcslashes($data['username']); + if (strlen($data['password1']) < 4) { + notify("Passordet må være minst 4 tegn."); + $this->id = -1; + return false; + } else { + if ($data['password1'] != $data['password2']) { + notify("Passordene var ikke like."); + $this->id = -1; + return false; + } else { + $this->password = $data['password1']; + if (!isAdmin()) { + switch (checkForumUsername($data['username'], $this->password)) { + case "wrong-password" : + notify("Brukernavnet er allerede i bruk på forumet. " . "Om du selv har dette brukernavnet må du oppgi " . "riktig passord."); + $this->id = -1; + return false; + } + } + } + } + + $this->addresstype = isset ($data['addresstype']) ? "int" : "no"; + + if (isDate($data['birthdate'])) { + $this->birthdate = $data['birthdate']; + } else { + notify("Ugyldig fødselsdato: " . $data['birthdate']); + $this->id = -1; + return false; + } + + if (isset ($data['active'])) { + $this->division_id_request = $data['division']; + } else { + $this->division_id_request = NULL; + } + if (isset ($data['group'])) { + $this->group_id = $data['group_id']; + } else { + $this->group_id = NULL; + } + } + } else { //ID set, existing user + if ($data != NULL) { + //Update existing user + $this->addresstype = isset ($data['addresstype']) ? "int" : "no"; + } else { + //Retrieve data from backend for display or other actions + if ($data = $this->_retrieveData()) { + $this->username = stripcslashes($data['username']); + $this->cardno = $data['cardno']; + $this->expires = $data['expires']; + $this->division_id_request = $data['division_id_request']; + $this->lastSticker = $data['lastSticker']; + $this->addresstype = $data['addresstype']; + } else { + // not successful + return false; + } + } + + $this->birthdate = $data['birthdate']; + $this->hasCard = $data['hasCard']; + $this->validAddress = $data['valid_address']; + } + + //Common initializations + $this->firstname = stripcslashes($data['firstname']); + $this->lastname = stripcslashes($data['lastname']); + if (empty ($data['street'])) { + $data['street'] = "-"; + } + $this->street = stripcslashes($data['street']); + if (empty ($data['zipcode'])) { + $data['zipcode'] = "-"; + } + $this->zipcode = $data['zipcode']; + if ($this->addresstype == "no") { + if ($action != "register-user") { + if (empty ($data['postarea'])) { + $data['postarea'] = "-"; + } + $this->postarea = $data['postarea']; + } + } else { + $this->city = $data['city']; + $this->state = $data['state']; + $this->country = $data['country']; + } + if ($data['phonenumber'] == "00000000" || $data['phonenumber'] == "") { + $data['phonenumber'] = "-"; + } + $this->phonenumber = $data['phonenumber']; + $this->email = $data['email']; + $this->placeOfStudy = $data['placeOfStudy']; + return true; + } + + public function store() { + if (!$this->_validate()) { + return false; + } + $action = scriptParam("action"); + if ($action == "register-user") { + + $this->conn->autoCommit(false); + $this->id = getNextId("din_user"); + $sql = sprintf("INSERT INTO din_user " . + " (id, username, password, firstname, " . + " lastname, addresstype, email, birthdate, " . + " placeOfStudy, division_id_request) " . "VALUES " . " (%s, %s, PASSWORD(%s), %s, %s, %s, %s, " . " %s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->username), $this->conn->quoteSmart($this->password), $this->conn->quoteSmart($this->firstname), $this->conn->quoteSmart($this->lastname), $this->conn->quoteSmart($this->addresstype), $this->conn->quoteSmart($this->email), $this->conn->quoteSmart($this->birthdate), $this->conn->quoteSmart($this->placeOfStudy), $this->conn->quoteSmart(($this->division_id_request == NULL) ? NULL : $this->division_id_request)); + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + if ($result->getCode() == -5) { + $err = $this->_findConstraintViolation(); + notify("Denne epostadressen eller brukernavnet er allerede registrert."); + $GLOBALS['extraScriptParams']['page'] = "register-user"; //Swap page + } else { + error("New user: " . $result->toString()); + notify("Problem under registrering av ny bruker."); + } + return false; + } + if ($this->addresstype == "no") { + $sql = sprintf("INSERT INTO din_useraddressno " . + " (user_id, street, zipcode) " . + "VALUES " . + " (%s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->street), $this->conn->quoteSmart($this->zipcode)); + } else { + $sql = sprintf("INSERT INTO din_useraddressint " . " (user_id, street, zipcode, city, state, country) " . "VALUES " . " (%s, %s, %s, %s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->street), $this->conn->quoteSmart($this->zipcode), $this->conn->quoteSmart($this->city), $this->conn->quoteSmart($this->state), $this->conn->quoteSmart($this->country)); + } + + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + $this->conn->rollback(); + if ($result->getCode() == -3) { + error("Ugyldig postnummer." . $result->toString()); + notify("Ugyldig postnummer."); + } else { + error("New user (address): " . $result->toString()); + } + return false; + } + + // Mark address as valid + $this->setAddressStatus(1); + + $sql = sprintf("INSERT INTO din_userphonenumber VALUES (%s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->phonenumber)); + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + $this->conn->rollback(); + error("New user (phonenumber): " . $result->toString()); + return false; + } + + //Group relationships + $groupRel = new UserGroupRelationship($this->id, 1); + $groupRel->store(); + if ($this->group_id > 1) { + $groupRel = new UserGroupRelationship($this->id, $this->group_id); + $groupRel->store(); + } + + //Register cardnumber as used + if ($this->cardno != NULL) { + if (!$this->_registerUsedCardno($this->cardno)) { + notify("Kortnummeret er allerede registrert."); + $this->conn->rollback(); + return false; + } + } + + //Logging + $sql = sprintf("INSERT INTO din_userupdate " . "VALUES (NULL, NOW(), %s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart("User registered."), $this->conn->quoteSmart((getCurrentUser() == 0) ? $this->id : getCurrentUser())); + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + $this->conn->rollback(); + error("New user (userUpdate): " . $result->toString()); + return false; + } else { + if ($this->conn->commit()) { + $GLOBALS['extraScriptParams']['userid'] = $this->id; + if (loggedIn()) { + notify("Ny bruker er registrert"); + } else { + notify("Din bruker er registrert."); + send_welcome_mail($this); + $GLOBALS['extraScriptParams']['page'] = "register-membership"; + } + return true; + } else { + $this->conn->rollback(); + } + } + + } else { //Update + $this->conn->autoCommit(false); + $sql = sprintf("UPDATE din_user SET " . " firstname = %s, " . " lastname = %s, " . " addresstype = %s, " . " email = %s, " . " birthdate = %s, " . " placeOfStudy = %s, " . " hasCard = %s " . "WHERE " . " id = %s", $this->conn->quoteSmart($this->firstname), $this->conn->quoteSmart($this->lastname), $this->conn->quoteSmart($this->addresstype), $this->conn->quoteSmart($this->email == "" ? NULL : $this->email), $this->conn->quoteSmart($this->birthdate), $this->conn->quoteSmart($this->placeOfStudy), $this->conn->quoteSmart($this->hasCard), $this->conn->quoteSmart($this->id)); + + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("Update user: " . $result->toString()); + notify("Feil under oppdatering av kontaktinfo."); + return false; + } + + // Slett adressen hvis den kun består av en x. + // Brukeren får da en mail med informasjon om å oppdatere adressen sin. + if (substr($this->street, 0, 1) == 'x') { + $link = substr($this->street, 2); + if ($this->_deleteAddress($link)) { + notify("Adresse slettet."); + } + } else { + if ($this->addresstype == "no") { + $sql = sprintf("REPLACE INTO din_useraddressno VALUES (%s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->street), $this->conn->quoteSmart($this->zipcode)); + } else { + $sql = sprintf("REPLACE INTO din_useraddressint VALUES (%s, %s, %s, %s, %s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->street), $this->conn->quoteSmart($this->zipcode), $this->conn->quoteSmart($this->city), $this->conn->quoteSmart($this->state), $this->conn->quoteSmart($this->country)); + } + + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + $this->conn->rollback(); + if ($result->getCode() == -3) { + notify("Ugyldig postnummer! Endringer er ikke lagret."); + } else { + notify("Feil med adressen. Endringer er ikke lagret."); + error("New user (address): " . $result->toString()); + } + return false; + } + + // ugly fix ... set address manual if the user is admin + if (isAdmin()) { + $this->setAddressStatus($this->validAddress); + } else { + // mark address as valid + $this->setAddressStatus(1); + } + } + $sql = "DELETE FROM din_userphonenumber WHERE user_id = $this->id"; + $this->conn->query($sql); + $sql = sprintf("INSERT INTO din_userphonenumber VALUES (%s, %s)", $this->conn->quoteSmart($this->id), $this->conn->quoteSmart($this->phonenumber)); + + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("New user (phonenumber): " . $result->toString()); + return false; + } + + if ($result = $this->conn->commit()) { + $this->_registerUpdate("Brukerinformasjon oppdatert"); + notify("Brukerinformasjon oppdatert."); + } else { + error("User rollback; " . $result->toString()); + $this->conn->rollback(); + } + } + } + + public function _validate() { + $valid = true; + if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $this->email)) { + notify("Ugyldig format på epostadresse."); + $valid = false; + } + return $valid; + } + + public function _retrieveData() { + $sql = "SELECT u.*, up.number AS phonenumber " . "FROM din_user u LEFT JOIN din_userphonenumber up " . "ON u.id = up.user_id " . "WHERE u.id = $this->id"; + $result = & $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($row = & $result->fetchRow(DB_FETCHMODE_ASSOC)) { + if ($row['addresstype'] == "no") { + $sql = "SELECT ua.street, ua.zipcode, pn.poststed AS postarea " . "FROM din_useraddressno ua, postnummer pn " . "WHERE ua.user_id = $this->id " . "AND ua.zipcode = pn.postnummer"; + } else { + $sql = "SELECT street, zipcode, city, state, country " . "FROM din_useraddressint " . "WHERE user_id = $this->id"; + } + $result = & $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($row2 = & $result->fetchRow(DB_FETCHMODE_ASSOC)) { + $row = $row + $row2; + } + return $row; + } else { + error("Users: " . $result->toString()); + return false; + } + } else { + error("Users: invalid userid"); + return false; + } + } + } + + // Fetch the postarea of a given zipcode + public function getPostarea ($zipcode = null) { // = $this->zipcode) { + if ($zipcode == null) $zipcode = $this->zipcode; + + $sql = "SELECT poststed AS postarea FROM postnummer WHERE postnummer=\"$zipcode\""; + $result = & $this->conn->query($sql); + if (DB :: isError($result) != true) { + $row = & $result->fetchRow(DB_FETCHMODE_ASSOC); + return $row["postarea"]; + } + return false; + } + + public function changeUsername($username, $password) { + switch (checkForumUsername($username, $password)) { + case "wrong-password" : + notify("Brukernavnet er allerede i bruk på forumet. " . "Om du selv har dette brukernavnet må du oppgi " . "riktig passord."); + return false; + + case "not-used" : + case "auth-ok" : + $sql = "UPDATE din_user SET " . " username = '$username' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + if ($result->getCode() == -5) { + $err = $this->_findConstraintViolation(); + error("Change username: $err already registered."); + notify("Brukernavnet er opptatt."); + $GLOBALS['extraScriptParams']['page'] = "change-username"; //Swap page + } else { + error("Change username: " . $result->toString()); + notify("Problem under endring av brukernavn."); + } + return false; + } else { + $this->_registerUpdate("Brukernavn endret til $username"); + notify("Brukernavn endret."); + } + } + } + + public function getRegistered() { + $sql = "SELECT uu.date FROM din_user u, din_userupdate uu + WHERE uu.user_id_updated=u.id AND u.id = $this->id + ORDER BY uu.date ASC LIMIT 1"; + $result = & $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("Get user registered: " . $result->toString()); + return false; + } + + if ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + return $row->date; + } + + } + + public function getLastUpdate() { + $sql = "SELECT uu.date FROM din_user u, din_userupdate uu + WHERE uu.user_id_updated=u.id AND u.id = $this->id + ORDER BY uu.date DESC LIMIT 1"; + $result = & $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("Get user last update: " . $result->toString()); + return false; + } + + if ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + return $row->date; + } + } + + public function getOrderId() { + $sql = "SELECT id FROM din_order " . + "WHERE user_id = $this->id " . + "AND order_status_id < 3 " . + "ORDER BY timestamp DESC LIMIT 1"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + return null; + } + + if ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)) { + return $row->id; + }else { + return null; + } + } + + public function getName() { + return trim($this->firstname.' '.$this->lastname); + } + + public function getContactInfo() { + $c = "$this->firstname $this->lastname\n"; + $c .= "$this->phonenumber\n"; + $c .= "$this->email"; + return $c; + } + + public function _findConstraintViolation() { + $sql = "SELECT id FROM din_user WHERE id = $this->id"; + $result = $this->conn->query($sql); + if ($result->numRows() > 0) { + return "id"; + } + $sql = "SELECT id FROM din_user WHERE username = '$this->username'"; + $result = $this->conn->query($sql); + if ($result->numRows() > 0) { + return "brukernavnet"; + } + } + + public function displayGroups() { + $sql = "SELECT g.id, g.name " . "FROM din_group g, din_usergrouprelationship ugr " . "WHERE ugr.user_id = $this->id " . "AND ugr.group_id = g.id " . "ORDER BY g.name ASC "; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("Vis gruppemedlemskap: " . $result->toString()); + notify("Informasjon om gruppemedlemskap utilgjengelig."); + return false; + } + + print (""); + print (""); + while ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + print (""); + if ($row->id != 1) { + displayOptionsMenuTable(Array ( + "user_id" => $this->id, + "group_id" => $row->id + ), USERGROUPRELATIONSHIP, "usergrouprelationship", "view-edit-options-usergrouprelationship", NULL, "display-user"); + } else { + print (""); + } + print (""); + } + print ("
    Grupper brukeren er medlem av
    $row->name
    "); + } + + public function displayOrders($status = 1) { + $sql = "SELECT id FROM din_order WHERE user_id = $this->id AND order_status_id = $status"; + $result = & $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("Display orders: " . $result->toString()); + return false; + } + + if ($result->numRows() == 0) { + print ("

    Ingen handlekurver funnet"); + return false; + } + while ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + $order = new Order($row->id); + $edit = true; + $order->displayShortList($edit); + } + + } + + public function registerMembership($cardno) { + if ($this->cardno != NULL) { + notify("Du har prøvd å registrere nytt medlemskort, selv om du allerede har et registrert medlemskort. Vennligst kontakt administrator om du tror dette er en feil."); + return false; + } + $sql = "SELECT id " . "FROM din_user " . "WHERE cardno = $cardno"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + notify("Kortnummeret er allerede i bruk. Vennligst kontrollér nummeret."); + return false; + } + + $expires = $this->getExpiryDate(); + + $sql = "UPDATE din_user SET " . " cardno = $cardno, " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + $this->_registerUpdate("Medlemskap registrert."); + $sql = "INSERT INTO din_usedcardno VALUES ( " . " $cardno, NOW())"; + $result = $this->conn->query($sql); + return true; + } else { + error($result->toString()); + notify("En ukjent feil oppstod. Vennligst kontakt administrator."); + } + } else { + error($result->toString()); + notify("En ukjent feil oppstod. Vennligst kontakt administrator."); + } + } + + function registerMembershipPayex() { + return $this->grantCardno("payex"); + } + + public function renewMembership($cardno) { + $expires = $this->getExpiryDate(); + if ($expires <= $this->expires) { + notify("Du har allerede gyldig medlemskap for dette året."); + return false; + } + $this->conn->autoCommit(false); + if ($this->_registerUsedCardno($cardno) == true) { + $sql = "UPDATE din_user SET " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error($result->toString()); + return false; + } + $this->_registerUpdate("Medlemskap fornyet."); + if ($result = $this->conn->commit()) { + return true; + } else { + notify("Problemer med registrering av fornyet medlemskap"); + error("Kortnummer: " . $result->toString()); + return false; + } + } else { + notify("En ukjent feil oppstod. Vennligst kontakt administrator."); + } + } + + public function renewMembershipPayex() { + $expires = $this->getExpiryDate(); + if ($expires <= $this->expires) { + notify("Du har allerede gyldig medlemskap for dette året."); + return false; + } + $this->conn->autoCommit(false); + $sql = "UPDATE din_user SET " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error($result->toString()); + return false; + } + $this->_registerUpdate("Medlemskap fornyet med Payex."); + if ($result = $this->conn->commit()) { + notify("Medlemskap fornyet."); + return true; + } else { + notify("Problemer med registrering av fornyet medlemskap"); + error("Kortnummer: " . $result->toString()); + return false; + } + } + + public function renewMembershipEurobate() { + $expires = $this->getExpiryDate(); + if ($expires <= $this->expires) { + // har allerede gyldig medlemskap + return false; + } + $this->conn->autoCommit(false); + $sql = "UPDATE din_user SET " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB::isError($result) == true) { + return false; + } + $this->_registerUpdate("Medlemskap fornyet med SMS."); + if ($result = $this->conn->commit()) { + return true; + } else { + return false; + } + } + + /** + * Bankbetaling med KID + */ + public function renewMembershipBankpayment() { + if (false and $this->isHonorMember()) { + notify($this->id . ", " . $this->getName() . " er livsvarig medlem. Medlemskapet vil ikke bli oppdater."); + return false; + } else { + $expires = $this->getExpiryDate(); + if ($expires <= $this->expires) { + $newexpires = date("Y-m-d", strtotime("+1 year", strtotime($expires))); + notify($this->id . ", " . $this->getName() . " har allerede gyldig medlemskap for dette året. Har utløpsdato " . $this->expires . ", men ny ble prøvd satt til " . $expires . ". Personen vil få satt ny utløpsdate på medlemskapet til " . $newexpires); + $expires = $newexpires; + } + $this->conn->autoCommit(false); + $sql = "UPDATE din_user SET " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error($result->toString()); + return false; + } + + if ($result = $this->conn->commit()) { + // send mail to the user + $this->sendRenewedMembershipRegisteredNotifyMail(); + + $this->_registerUpdate("Medlemskap fornyet med KID-betaling til bank."); + notify($this->id . ", " . $this->getName() . ": medlemskap fornyet fram til " . $expires . "."); + return true; + } else { + notify($this->id . ", " . $this->getName() . ": Problemer med registrering av fornyet medlemskap"); + error("Kortnummer: " . $result->toString()); + return false; + } + } + } + + /* Order new membercard if old one is lost */ + public function renewMembercardPayex() { + $expires = $this->getExpiryDate(); + if ($expires > $this->expires) { + notify("Du har ikke gyldig medlemskap for dette året."); + return false; + } + $this->conn->autoCommit(false); + $sql = "UPDATE din_user SET " . " hasCard = '0' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error($result->toString()); + return false; + } + $this->_registerUpdate("Nytt medlemskort bestilt med Payex."); + if ($result = $this->conn->commit()) { + notify("Medlemskortet er lagt i produksjonskøen."); + return true; + } else { + notify("Problemer med registrering av bestillingen."); + error("Kortnummer: " . $result->toString()); + return false; + } + } + + public static function delete($id) { + $conn = db_connect(); + $sql = "DELETE FROM din_user WHERE id = $id LIMIT 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + notify("Bruker slettet."); + } else { + error($result->toString()); + } + } + + public function updateExpiry($newDate) { + if ($newDate == 'lifetime') { + $sql = "UPDATE din_user SET expires = NULL WHERE id = $this->id LIMIT 1"; + } else { + $sql = "UPDATE din_user SET expires = '$newDate-12-31' WHERE id = $this->id LIMIT 1"; + } + $conn = db_connect(); + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + $this->_registerUpdate("Utløpsdato oppdatert til " . $newDate); + notify("Utløpsdato oppdatert."); + } else { + error($result->toString()); + } + } + + public function updateLastSticker($newDate) { + $sql = "UPDATE din_user SET lastSticker = '$newDate' WHERE id = $this->id LIMIT 1"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + $this->_registerUpdate("Oppdatert oblat til " . $newDate); + $this->lastSticker = $newDate; + notify("Oblat oppdatert."); + + // Assume that a letter is sent to the registered address. + // We mark the address as valid, and will update it as invalid if the letter is not delivered + $this->setAddressStatus(1); + } else { + error($result->toString()); + } + } + + public function displayList() { + print "\n"; + print " " . $this->cardno . "\n"; + print " "; + if ($this->hasExpired()) { + print 'nei'; + } else { + print 'ja'; + } + print "\n"; + + print " id . "\" title=\"mer informasjon om " . + $this->firstname . " " . $this->lastname . "\">" . + $this->firstname . "\n"; + + print "" . $this->lastname . "\n"; + + print "" . prepareForHTML($this->email) . "\n"; + + print ""; + print $this->phonenumber; + if ($this->phonenumber != "-") { + print "phonenumber . "\" " . + "title=\"ring til " . $this->firstname . " " . $this->lastname . "\">"; + print "\"ringfirstname . " " . $this->lastname . "\" />"; + print ""; + } + print "\n"; + + print ""; + $this->_printGroups(", "); + print "\n"; + + print "\n"; + } + + public function displayDivReqList() { + if ($this->division_id_request != NULL) { + $div = new Division($this->division_id_request); + } else { + return false; + } + + print "\n"; + + print " id . "\" title=\"mer informasjon om " . $this->firstname . " " . $this->lastname . "\">"; + print $this->firstname; + print "\n"; + + print "" . $this->lastname . "\n"; + + print "" . prepareForHTML($this->email) . "\n"; + + print "" . $div->name . "\n"; + + print "" . $this->getRegistered() . "\n"; + + print ""; + print "

    id . "\" method=\"post\">"; + print "
    "; + print ""; + print ""; + print ""; + print "
    "; + print "
    "; + print "\n"; + + print "\n"; + } + + public function isMember() { + if ($this->cardno == NULL) { + return false; + } else { + return true; + } + } + + public function isActive() { + $sql = "SELECT group_id " . "FROM din_usergrouprelationship " . "WHERE user_id = $this->id "; + $result = $this->conn->query($sql); + + if (DB :: isError($result) == true) { + error("isActive: " . $result->toString()); + return false; + } + if ($result->numRows() > 1) { + return true; + } else { + return false; + } + } + + public function getNumProductsBought($product_id = 0) { + $sql = "SELECT SUM(oi.quantity) AS num FROM din_user u, din_order o, din_order_item oi " . + "WHERE o.user_id = u.id AND oi.order_id = o.id AND oi.product_id = 2 AND o.order_status_id = 4 AND u.id = $this->id"; + $result = $this->conn->query($sql); + + if (DB :: isError($result) == true) { + error("isActive: " . $result->toString()); + return 0; + } + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + return $row[0]; + } else { + return false; + } + } + + public function hasExpired() { + if ($this->expires == NULL) { + return false; + } else + if ($this->expires > date("Y-m-d")) { + return false; + } else { + return true; + } + } + + public function getExpiryDate() { + if (date("Y-m-d") > date("Y-11-15")) { + return date("Y", strtotime("+1 year")) . "-12-31"; + } else { + return date("Y") . "-12-31"; + } + } + + public function _registerUsedCardno($cardno) { + $sql = "INSERT INTO din_usedcardno VALUES ( " . " $cardno, NOW())"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + return true; + } else { + error("Registrér kortnummer: " . $result->toString()); + notify("Kortnummeret er allerede registrert."); + } + } + + public function grantCardno($src = NULL) { + $sql = "SELECT value FROM din_settings " . "WHERE name = 'next_online_cardno'"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("grantCardno: " . $result->toString()); + return false; + } + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + $cardno = $row[0]; + } + + $expires = $this->getExpiryDate($cardno); + $sql = "UPDATE din_user SET " . " cardno = $cardno, " . " expires = '$expires' " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + $this->cardno = $cardno; + $this->expires = $expires; + notify("$this->firstname $this->lastname er tildelt medlemskortnummer $cardno"); + $this->_registerUpdate("Bruker tildelt kortnummer. $src"); + + $sql = "UPDATE din_settings SET value = value + 1 WHERE name = 'next_online_cardno'"; + $this->_registerUsedCardno($cardno); + $result = $this->conn->query($sql); + return true; + } else { + error("Registrér kortnummer: " . $result->toString()); + notify("Problemer med registrering av kortnummer."); + return false; + } + } + + public function setHasCard($value) { + $sql = "UPDATE din_user SET hasCard = $value " . + "WHERE id = $this->id"; + $result = $this->conn->query($sql); + + if (DB :: isError($result) != true) { + $value = ($value == 0) ? "mangler medlemskort" : "har medlemskort"; + + $this->_registerUpdate("Medlemskortstatus endret til $value"); + notify("Medlemskortstatus for " . $this->firstname . " " . $this->lastname . " er endret til " . $value . ""); + User :: updateLastSticker(date("Y")); + } + } + + /** + * changes validity status of users address + * values can be: + * 0 - not valid address + * 1 - valid address + * 2 - status of address unknown + * + * @param integer $value + * @return boolean + **/ + public function setAddressStatus($value) { + // check for valid input value + if (is_numeric($value) && $value >= 0 && $value <=2) { + $sql = "UPDATE din_user SET " . + "valid_address = '$value' " . + "WHERE " . + "id = $this->id"; + $result = $this->conn->query($sql); + + if (DB :: isError($result) != true) { + $this->validAddress = $value; + + switch ($value) { + case 1: + $valuetext = "gyldig"; break; + case 2: + $valuetext = "ukjent"; break; + default: + $valuetext = "ugyldig"; break; + } + // store update + $this->_registerUpdate("Adressestatus satt til $valuetext."); + + // done + return true; + } else { + notify("Problemer med registreringen av adressestatus"); + return false; + } + } else { + notify("Ugyldig adressestatusverdi: " . $value); + return false; + } + return false; + } + + public function getAddressStatus() { + switch ($this->validAddress) { + case 1: + return "gyldig"; break; + case 2: + return "ukjent"; break; + default: + return "ugyldig"; break; + } + } + + public function isHonorMember () { + if ($this->expires == NULL) return true; + return false; + } + + public function setCardno($value) { + $sql = "UPDATE din_user SET cardno = $value " . + "WHERE id = $this->id"; + $result = $this->conn->query($sql); + + if (DB :: isError($result) != true) { + $value = ($value == "NULL") ? "NULL" : $value; + $this->_registerUpdate("Medlemskortnummer endret til $value"); + notify("Medlemskortnummer for $this->firstname $this->lastname er endret til $value"); + } + } + + public function setExpires($value) { + $sql = "UPDATE din_user SET expires = '$value' " . + "WHERE id = $this->id"; + $result = $this->conn->query($sql); + + if (DB :: isError($result) != true) { + $this->_registerUpdate("Utløpsdato endret til $value"); + notify("Utløpsdato for $this->firstname $this->lastname er endret til $value"); + } + } + + public function updateDivisionRequest($value) { + if (empty ($value)) { + notify("Ugyldig verdi."); + return false; + } + if ($this->division_id_request != NULL) { + $div = new Division($this->division_id_request); + } + $sql = "UPDATE din_user SET " . " division_id_request = NULL " . "WHERE " . " id = $this->id"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($value == "reject") { + $this->_registerUpdate("Aktivforespørsel avvist"); + notify("Forespørsel fra $this->firstname $this->lastname om å bli registrert som aktiv i $div->name er avslått."); + } else { + if ($value == "accept") { + $ugr = new UserGroupRelationship($this->id, 2); + $ugr->store(); + $group_id = $div->getNoAdminGroup(); + if ($group_id != NULL) { + $ugr2 = new UserGroupRelationship($this->id, $group_id); + $ugr2->store(); + } + $this->_registerUpdate("Aktivforespørsel godkjent"); + notify("Forespørsel fra $this->firstname $this->lastname om å bli registrert som aktiv i $div->name er godkjent."); + } + } + } else { + error("user-div-req: " . $result->toString()); + notify("Behandling av forespørsel ble ikke utført."); + } + } + + public function _printGroups($sep) { + $sql = "SELECT g.id, g.name " . "FROM din_group g, din_usergrouprelationship ugr " . "WHERE ugr.user_id = $this->id " . "AND ugr.group_id = g.id " . "ORDER BY g.name ASC "; + $result = $this->conn->query($sql); + + if (DB :: isError($result) != true) { + if ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + print ($row->name); + } + while ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + print ($sep . $row->name); + } + return true; + } else { + error("Vis gruppemedlemskap: " . $result->toString()); + notify("Informasjon om gruppemedlemskap utilgjengelig."); + } + } + + public function _deleteAddress($link = null) { + if ($this->addresstype == 'no') { + $sql = "DELETE FROM din_useraddressno WHERE user_id = $this->id"; + } else { + $sql = "DELETE FROM din_useraddressint WHERE user_id = $this->id"; + } + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + error("User delete address: " . $result->toString()); + return false; + } else { + $this->setAddressStatus(0); + $this->_sendWrongAddressMail($link); + $this->_registerUpdate('Adresse slettet.'); + return true; + } + } + + public function displayExpiryListSingle() { + print "\n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + print " \n"; + + $this->displayExpiryList(); + + print "
    idkortnrfornavnetternavnutløpsårendre tiloblatendre til
    \n"; + } + + public function writeExpiryListFile($expiry = NULL) { + print $this->id . ";"; + print $this->cardno . ";"; + print $this->firstname .";"; + print $this->lastname . ";"; + print strip_nl($this->street) . ";"; + print $this->zipcode . ";"; + print $this->postarea . ";"; + print $this->getAddressStatus() . ";"; + print $this->email . ";"; + print $this->phonenumber . ";"; + print $this->birthdate . ";"; + print $this->expires . ";"; + print $this->lastSticker . ";"; + print $this->getRegistered() . ";"; + print $this->getLastUpdate(); + print "\r\n"; + } + + public function displayExpiryList($expiry = NULL) { + print "\n"; + print " " . $this->id . "\n"; + print " id . "_cardno\">". $this->cardno . "\n"; + print " id . "\" title=\"mer informasjon om " . $this->firstname . " " . $this->lastname . "\">" . $this->firstname . "\n"; + print " " . $this->lastname . "\n"; + + print " id . "_expires\">"; + if ($this->expires == '0000-00-00') { + print "0"; + } else { + if ($this->expires == NULL) { + print "livsvarig"; + } else { + print (date("Y", strtotime($this->expires))); + } + } + print " \n"; + + print " "; + if ($this->cardno != NULL) { + if ($expiry == "no-card") { + print "
    id . "_hascard_form\" " . + "action=\"javascript: setHasCard('" . $this->id . "')\" " . + "method=\"post\">"; + } else { + print "id . "')\" method=\"get\">"; + } + } else { + print "id . "_cardno_form\" " . + "action=\"javascript: grantCardNumber('" . $this->id . "')\" " . "method=\"post\">"; + } + print "
    "; + if ($this->cardno != NULL) { + if ($expiry == "no-card") { + print "\n"; + print "\n"; + } else { +?> + + + +\n"; + print "\n"; + } + print "
    "; + print "
    "; + print "\n"; + + print " id . "_laststicker\">"; + print ($this->lastSticker == '0000') ? "" : $this->lastSticker; + print "\n"; + + print " "; + print "
    id . "')\" method=\"post\">"; + print "
    "; + print ""; + print ""; + print ""; + print "
    "; + print "
    "; + print "\n"; + + print " " . $this->getRegistered() . "\n"; + print " " . $this->getLastUpdate(); "\n"; + print "\n"; + } + + public function _registerUpdate($message) { + $sql = "INSERT INTO din_userupdate VALUES (" . + "NULL, " . + "NOW( ), " . + $this->id . ", " . + $this->conn->quoteSmart($message) . ", " . + ((getCurrentUser() == 0) ? $this->id : getCurrentUser()) . + ")"; + $result = $this->conn->query($sql); + if (DB :: isError($result) == true) { + $this->conn->rollback(); + error("Database error (User::_registerUpdate()): " . $result->toString()); + return false; + } else { + $this->conn->commit(); + } + } + + public function displayUpdates() { + $sql = "SELECT d.*, CONCAT(d1.firstname, ' ', d1.lastname) AS updater " . "FROM din_userupdate d, din_user d1 " . "WHERE user_id_updated = $this->id " . "AND d.user_id_updated_by=d1.id ORDER BY date DESC"; + + $result = & $this->conn->query($sql); + if (DB :: isError($result) != true) { + print ""; + print ""; + + while ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + print ""; + } + print "
    Liste over endringer
    " . formatDatetimeYearShort($row->date) . "$row->comment $row->updater
    "; + } else { + error("Users: " . $result->toString()); + } + } + + public function resetPassword() { + $newPassword = generatePassword(); + $sql = "UPDATE din_user SET " . " password = PASSWORD('$newPassword'), " . " passwordReset = 1 " . "WHERE" . " id = $userid"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + error("ResetPassword: " . $result->toString()); + notify("Tjenesten er midlertidig utilgjengelig, vennligst forsøk igjen senere."); + return false; + } else { + $this->_registerUpdate('Brukernavn og nytt passord sendt til bruker.'); + return true; + } + } + + public function _sendPassword() { + $sendto = $this->email; + $subject = "Brukernavn og passord for Studentersamfundet Inside"; + $message = "Hei, $this->firstname $this->lastname!\n " . "\n" . "\nHer er din innloggingsinformasjon til Studentersamfundets medlemsider. " . "\n" . "\nDitt brukernavn er: $row->username" . "\nDitt passord er: $newPassword" . "\n" . "\nNår du logger på vil du bli bedt om å endre passord til noe som er lettere å huske." . "\n" . "\nhttps://www.studentersamfundet.no/inside" . "\n" . "\nmvh" . "\n\nDet Norske Studentersamfund."; + $headers = 'From: Det Norske Studentersamfund ' . "\r\n"; + if (mail($sendto, $subject, $message, $headers)) { + notify("Nytt brukernavn og passord er sendt til din registrerte epostadresse. Bruk skjemaet under for å logge deg inn."); + } else { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt" . + "webansvarlig."); + } + } + + // Send mail with notification of card delivery + public function sendCardProducedNotifyMail () { + $sendto = $this->email; + + $subject = "Medlemskortet ditt er produsert"; + $message = "Hei, " . $this->firstname . " " . $this->lastname . "!" . + "\n\n" . + "Vi har nå produsert ditt medlemskortet i Det Norske Studentersamfund, " . + "og det blir sendt fra oss i løpet av kort tid. \n" . + "\n" . + "Brevet blir sendt med A-post til adressen \"" . + $this->street . ", " . $this->zipcode . " " . $this->postarea . + "\" innen to virkedager, så du burde motta medlemskortet ditt om ca. " . + "tre arbeidsdager fra i dag.\n" . + "\n" . + "Vi har en del problemer med at Posten ikke får levert sendingene våre. " . + "For å være sikker på å få medlemskortet ditt MÅ du ha navn på postkassen din, " . + "gjerne så tydelig at postbudet klarer å lese det. " . + "Det hjelper også Posten veldig at du er registrert på adressen, det gjøres " . + "ved å melde flytting hos Posten. " . + "Dette kan gjøres her: " . + "https://adresseendring.posten.no/Adresser/FormNewAdresseEndring . " . + "Flytting er spesielt smart hvis du bor i en oppgang med mange " . + "postkasser (store blokker), eller deler postkasse med mange mennesker " . + "(typisk kollektiv).\n" . + "\n\n" . + "Mvh\n\n" . + "Ledergruppen for medlemskapsordningen\n" . + "medlemskap@studentersamfundet.no\n" . + "Det Norske Studentersamfund\n\n"; + + $headers = 'From: Det Norske Studentersamfund ' . "\r\n"; + + if (!mail($sendto, $subject, $message, $headers)) { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt" . "webansvarlig."); + } + } + + // Send mail with notification of card delivery + public function sendRenewedMembershipRegisteredNotifyMail () { + $sendto = $this->email; + + $subject = "Medlemsskapet ditt i Det Norske Studentersamfund er registrert som fornyet"; + $message = "Hei, " . $this->firstname . " " . $this->lastname . "!" . + "\n\n" . + "Vi har registrert at du har fornyet medlemsskapet ditt i Det Norske Studentersamfund, " . + "og ny oblat til ditt medlemskort vil bli sendt fra oss i løpet av kort tid. \n" . + "\n" . + "Brevet vil bli sendt til adressen \"" . + $this->street . ", " . $this->zipcode . " " . $this->postarea . + "\". Hvis dette er feil addresse kan du gå på vår webside og endre addressen: https://www.studentersamfundet.no/inside/ .\n" . + "\n" . + "Vi har en del problemer med at Posten ikke får levert sendingene våre. " . + "For å være sikker på å få medlemskortet ditt MÅ du ha navn på postkassen din, " . + "gjerne så tydelig at postbudet klarer å lese det. " . + "Det hjelper også Posten veldig at du er registrert på adressen, det gjøres " . + "ved å melde flytting hos Posten. " . + "Dette kan gjøres her: " . + "https://adresseendring.posten.no/Adresser/FormNewAdresseEndring . " . + "Flytting er spesielt smart hvis du bor i en oppgang med mange " . + "postkasser (store blokker), eller deler postkasse med mange mennesker " . + "(typisk kollektiv).\n" . + "\n\n" . + "Mvh\n\n" . + "Ledergruppen for medlemskapsordningen\n" . + "medlemskap@studentersamfundet.no\n" . + "Det Norske Studentersamfund\n\n"; + + $headers = 'From: Det Norske Studentersamfund ' . "\r\n"; + + if (!mail($sendto, $subject, $message, $headers)) { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt" . "webansvarlig."); + } + } + + public function sendNewAddressMail ($newstreet, $newzipcode) { + $sendto = $this->email; + + $subject = "Du er registrert med feil postadresse"; + $message = "Hei, " . $this->firstname . " " . $this->lastname . "!" . + "\n\n" . + "Vi har sendt ut en postsending til deg, og fått beskjed fra posten " . + "om at du har flyttet fra \"" . + $this->street . ", " . $this->zipcode . " " . $this->postarea . + "\" til \"" . + $newstreet . ", " . $newzipcode . " " . $this->getPostarea($newzipcode) . + "\".\n" . + "Brevet er vidresendt til denne nye adressen. " . + "Hvis du ikke har mottatt dette brevet, eller ikke har flyttet kan " . + "du logge inn på våre medlemsider og oppdatere din adresse. " . + "Logg inn på denne siden: " . + "https://www.studentersamfundet.no/inside - ditt brukernavn er " . + "\"" . $this->username . "\".\n" . + "\n" . + "Hvis du ikke har mottat medlemskortet vil vi at du svarer på denne " . + "e-posten etter du har oppdatert din adresse og ber om å få tilsendt " . + "nytt medlemskort.\n" . + "\n\n\n" . + "Mvh\n\n" . + "Ledergruppen for medlemskapsordningen\n" . + "medlemskap@studentersamfundet.no\n" . + "Det Norske Studentersamfund\n\n"; + + $headers = 'From: Det Norske Studentersamfund ' . "\r\n"; + + if (mail($sendto, $subject, $message, $headers)) { + notify("Melding om ny adresse er sendt til $this->email"); + } else { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt" . "webansvarlig."); + } + } + + public function _sendWrongAddressMail($link = null) { + $sendto = $this->email; + $linkMessage = ""; + if ($link) { + $linkMessage = "Brevet vi har forsøkt å sende kan du også " . + "lese på nett fra denne adressen:\n$link\n\n"; + } + $subject = "Postforsendelse er ikke kommet frem til addressen din"; + $message = "Hei, " . $this->firstname . " " . $this->lastname . "!" . + "\n\n" . + "Vi har sendt ut en postsending til deg, og fått beskjed fra Posten ". + "om at du var ukjent på din oppgitte adresse. \n" . + "Vi sendte brevet til følgende adresse: \"" . $this->street . ", " . + $this->zipcode . " " . $this->postarea . "\". " . + "På grunn av tilbakemeldingen om at du er ukjent på adressen ". + "er brevet så blitt makulert av Posten, på oppdrag av oss." . + "\n" . + $linkMessage . + "\n" . + "Hvis du ikke har mottat medlemskortet eller oblatet ditt er det " . + "mest sannsynlig det som var i denne postforsendelsen. Hvis du fortsatt " . + "bor på adressen over, eller har meldt flytting fra denne adressen må " . + "du klage til Posten, enten på telefon 810 00 710, eller gjennom skjemaet " . + "du finner på denne siden: http://www.posten.no/Kundeservice .\n" . + "Be om svar på epost og videresend denne til medlemskap@studentersamfundet.no " . + "så sender vi deg et nytt medlemskort kostnadsfritt. \n" . + "\n". + "Hvis du derimot har oppgitt feil adresse, eller har flyttet uten å " . + "melde flytting må du logge inn på våre medlemsider, oppdatere adressen " . + "din og bestille nytt kort i nettbutikken. Da vil du automatisk få tilsendt " . + "nytt kort. Vi må ta 35 kroner for å dekke våre kostnader. " . + "Våre medlemsider finner du på https://www.studentersamfundet.no/inside/ ." . + "Ditt brukernavn er \"" . $this->username . "\". \n". + "\n\n\n" . + "Mvh\n\n" . + "Ledergruppen for medlemskapsordningen\n" . + "medlemskap@studentersamfundet.no\n" . + "Det Norske Studentersamfund\n\n"; + + $headers = 'From: Det Norske Studentersamfund ' . "\r\n"; + + if (mail($sendto, $subject, $message, $headers)) { + notify("Melding om ugyldig adresse er sendt til $this->email"); + } else { + notify("Det oppstod en feil under sending av epost. Vennligst kontakt" . "webansvarlig."); + } + } + + /* + * Print the status of the user's membership + * return: string + */ + public function membershipStatus() { + //print "'" . $this->expires . "','" . $this->hasCard . "'"; + if ($this->expires == "0000-00-00") + return "Du har ikke registrert medlemskap."; + elseif ($this->expires == "") + return "Du har livsvarig medlemskap."; + elseif (strtotime($this->expires) < strtotime("now")) + return "Du har ikke registrert gyldig medlemskap i år (medlemskapet ditt gikk ut " . date("d.m.Y", strtotime($this->expires)) . ")."; + elseif (strtotime($this->expires) > strtotime("now")) { + if ($this->hasCard == "1") { + if ($this->lastSticker < date("Y", strtotime($this->expires))) { + return "Du har aktivert medlemskapet ditt, og det vil bli sendt oblat til å klistre på medlemskortet ditt."; + } else { + return "Du har gyldig medlemskap (gyldig til " . date("d. m. Y", strtotime($this->expires)) . ")."; + } + } elseif ($this->hasCard == "0") { + return "Medlemskapet ditt er registrert, og medlemskortet ditt for " . date("Y", strtotime($this->expires)) . " produseres. Det tar normalt rundt to uker fra medlemskapet er registrert til du mottar ditt medlemskort."; + } + } + + return "Ukjent medlemskapsstatus"; + } +} +?> \ No newline at end of file diff --git a/inside/UserGroupRelationship.php b/inside/UserGroupRelationship.php new file mode 100644 index 0000000..3a4422c --- /dev/null +++ b/inside/UserGroupRelationship.php @@ -0,0 +1,163 @@ +__construct($user_id, $group_id); + } + + public + function __construct($user_id = NULL, $group_id = NULL) { + + $conn = & DB :: connect(getDSN()); + if (DB :: isError($conn)) { + print ("error: ".$conn->toString()); + exit (); + } else { + $this->conn = $conn; + } + + $this->user_id = $user_id; + $this->group_id = $group_id; + $action = scriptParam("action"); + + $data = $this->_retrieveData(); + $this->user_name = $data['username']; + $this->group_name = $data['name']; + } + + public + function store() { + $sql = sprintf("INSERT INTO din_usergrouprelationship "." (user_id, group_id) "."VALUES "." (%s, %s)", $this->conn->quoteSmart($this->user_id), $this->conn->quoteSmart($this->group_id)); + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + $user = new User($this->user_id); + $group = new Group($this->group_id); + notify("Bruker $user->firstname $user->lastname"." registrert i gruppen $group->name."); + $this->_checkActive(); + $this->_checkMod(); + subscribe_mailinglist($this->user_id, $this->group_id); + } else + if ($result->getCode() == -5) { + notify("$this->user_name er allerede medlem i gruppen $this->group_name."); + } else { + notify("Problem med registrering av gruppemedlemskap."); + error("Register user in group: ".$result->toString()); + } + } + + public + function _retrieveData() { + $sql = "SELECT CONCAT(u.firstname, ' ', u.lastname) AS username, g.name + FROM din_usergrouprelationship ugr, din_user u, din_group g + WHERE ugr.user_id = $this->user_id + AND ugr.group_id = $this->group_id + AND ugr.user_id = u.id + AND ugr.group_id = g.id"; + $result = & $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($row = & $result->fetchRow(DB_FETCHMODE_ASSOC)) { + return $row; + } + } else { + error("UserGroupRelationships: ".$result->toString()); + } + } + + public + function delete($user_id, $group_id) { + $conn = db_connect(); + $sql = "DELETE FROM din_usergrouprelationship + WHERE user_id = $user_id + AND group_id = $group_id + LIMIT 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + notify("Gruppemedlemskap slettet."); + unsubscribe_mailinglist($user_id, $group_id); + + //Update moderator status + $group = new Group($group_id); + if ($group->admin == 1) { + $sql = "SELECT * "."FROM din_group g, din_usergrouprelationship ugr "."WHERE ugr.user_id = $user_id "."AND ugr.group_id = g.id "."AND g.admin = 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() == 0) { + UserGroupRelationship :: delete($user_id, 61); + } + } else { + error("UserGroupRelationships - admin: ".$result->toString()); + } + } + } else { + error($result->toString()); + } + } + + public + function displayList() { +?> + + user_name; ?> + group_name"; ?> + group_id != 1) { + displayOptionsMenuTable(Array("user_id" => $this->user_id, "group_id" => $this->group_id), USERGROUPRELATIONSHIP, "usergrouprelationship", "view-edit-options-usergrouprelationship", false); + } +?> + + +group_id > 2) { + $sql = "SELECT * "."FROM din_usergrouprelationship ugr "."WHERE ugr.user_id = $this->user_id "."AND ugr.group_id = 2"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() == 0) { + $newRel = new UserGroupRelationship($this->user_id, 2); + $newRel->store(); + } + } else { + error("UserGroupRelationships - admin: ".$result->toString()); + } + } + } + + public + function _checkMod() { + $group = new Group($this->group_id); + if ($group->admin == 1) { + $sql = "SELECT * "."FROM din_usergrouprelationship ugr "."WHERE ugr.user_id = $this->user_id "."AND ugr.group_id = 61"; + $result = $this->conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() == 0) { + $newRel = new UserGroupRelationship($this->user_id, 61); + $newRel->store(); + } + } else { + error("UserGroupRelationships - admin: ".$result->toString()); + } + } + } + + +} +?> \ No newline at end of file diff --git a/inside/UserGroupRelationships.php b/inside/UserGroupRelationships.php new file mode 100644 index 0000000..018e3ea --- /dev/null +++ b/inside/UserGroupRelationships.php @@ -0,0 +1,79 @@ +__construct(); + } + + function __construct(){ + $conn =& DB::connect(getDSN()); + if (DB::isError($conn)){ + error("UserGroupRelationships: " . $conn->toString()); + exit(); + }else { + $this->conn = $conn; + } + } + + public function getJoinedList($group_id, $type = "array"){ + $sql = "SELECT ugr.group_id, g.name, u.id, u.username + FROM din_group g, din_user a LEFT JOIN din_usergrouprelationship ugr + ON u.user_id = ugr.user_id + AND ugr.group_id = $group_id + WHERE g.id = $group_id + ORDER BY u.firstname, u.lastname"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $list = Array(); + while ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $list["names"][] = $row->user_id; + $list["labels"][] = $row->userName; + $list["checked"][] = ($row->group_id == NULL) ? false : true; + } + return $list; + }else { + error($result->toString()); + } + } + + public function getList($group, $limit){ + $sql = "SELECT user_id, group_id + FROM din_usergrouprelationship + WHERE group_id = $group + LIMIT $limit"; + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->relations = $result; + }else { + error($result->toString()); + } + return $this->relations; + } + + public function displayList($group = 2, $limit = 25){ + $this->getList($group, $limit); + if ($this->relations->numRows() > 0){ +?> + + + + + + +relations->fetchRow(DB_FETCHMODE_OBJECT)){ + $rel = new UserGroupRelationship($row->user_id, $row->group_id); + $rel->displayList(); + } + print("
    medlemgruppe
    "); + }else { + print("

    Ingen gruppemedlemmer er registrert.

    "); + } + } + +} +?> \ No newline at end of file diff --git a/inside/Users.php b/inside/Users.php new file mode 100644 index 0000000..51cb757 --- /dev/null +++ b/inside/Users.php @@ -0,0 +1,557 @@ +__construct(); + } + + public function __construct(){ + $this->conn = db_connect(); + } + + public function getList($selection = 2, $limit = -1, $search = false, $addressStatus = -1){ + if ($limit > 0){ + $limit = "LIMIT $limit"; + }else { + $limit = ""; + } + // If addressstatus != -1, limit to a certain value of valid_address field + if (!isset($addressStatus)) $addressStatus = -1; + if ($addressStatus == 10) { + $sqladdresslimit = "AND u.valid_address > 0 "; + } elseif ($addressStatus >= 0) { + $sqladdresslimit = "AND u.valid_address = $addressStatus "; + } else { + $sqladdresslimit = ""; + } + + if ($search != true){ + if ($selection < 0){ + $sql = "SELECT DISTINCT u.id, concat(u.firstName, ' ', u.lastName) AS name " . + "FROM din_user u LEFT JOIN din_usergrouprelationship ugr " . + "ON u.id = ugr.user_id " . + "AND ugr.group_id = ABS($selection) " . + "WHERE ugr.user_id IS NULL " . + $sqladdresslimit . + "ORDER BY name ASC " . + "$limit"; + }else { + $sql = "SELECT DISTINCT u.id, concat(u.firstName, ' ', u.lastName) AS name " . + "FROM din_user u, din_usergrouprelationship ugr " . + "WHERE u.id != 0 " . + "AND u.id = ugr.user_id " . + "AND ugr.group_id = $selection " . + $sqladdresslimit . + "ORDER BY name ASC " . + "$limit"; + } + }else { + $selection = strtoupper($selection); + if (is_numeric($selection)){ + $sql = "SELECT DISTINCT u.id + FROM din_user u + WHERE u.cardno = $selection"; + }else { + // Add wildcards around and between words + $selection = "%" . str_replace(" ", "% %", $selection) . "%"; + + $sql = "SELECT DISTINCT u.id + FROM din_user u + WHERE CONCAT(UPPER(u.firstName), ' ', UPPER(u.lastName)) LIKE '$selection' + OR CONCAT(UPPER(u.firstName), ' ', UPPER(u.lastName)) LIKE '$selection' + OR UPPER(u.username) LIKE '$selection' + OR UPPER(u.email) LIKE '$selection' + $sqladdresslimit + ORDER BY u.firstname, u.lastname ASC + $limit"; + } + } + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->users = $result; + }else { + error($result->toString()); + } + return $this->users; + } + + public + function displayExpiryList($selection = 2, $limit = 25, $expiry = '0000-00-00', $format = "screen"){ + switch ($expiry){ + case 'lifetime': + $expression = "expires IS NULL"; + break; + case '0000-00-00': + $expression = "expires = '0000-00-00'"; + break; + case 'expired': + $expression ="expires > '0000-00-00' AND expires < NOW()"; + break; + case 'valid': + $expression ="expires > NOW()"; + break; + case 'no-cardno': + $expression = "u.cardno IS NULL"; + break; + case 'no-card': + $expression = "u.hasCard = 0 AND u.cardno IS NOT NULL"; + break; + case 'no-sticker': + $expression = "u.hasCard = 1 AND u.expires > NOW() AND u.lastSticker < YEAR(u.expires)"; + break; + case 'all': + $expression = '1'; + break; + } + $sql = "SELECT u.id + FROM din_user u, din_usergrouprelationship ugr + WHERE $expression + AND u.id = ugr.user_id + AND ugr.group_id = $selection + LIMIT $limit"; + $result = $this->conn->query($sql); + if (DB::isError($result) == true) { + error($result->toString()); + return false; + } + if ($format == "screen"){ + if ($result->numRows() > 0){ +?> +

    Antall treff: numRows()); ?>

    + + + + + + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->id); + $user->displayExpiryList($expiry); + } + print("
    idkortnrfornavnetternavnutløpsåroblatendre tilregistrertsist endret
    "); + }else { + print("

    Ingen medlemmer registrert.

    "); + } + }else if ($format == "file"){ + if ($result->numRows() > 0) { + header('Content-type: text/plain'); + header('Content-Disposition: attachment; filename="brukerliste.txt"'); + print "id;cardno;firstname;lastname;street;zipcode;postarea;addressStatus;"; + print "email;phoneno;birthdate;expires;lastSticker;registered;lastUpdate\r\n"; + while ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->id); + $user->writeExpiryListFile($expiry); + } + exit; + } else { + notify("Ingen medlemmer registrert"); + } + } + } + + public function displayExpiryListSearch($search){ + + $selection = strtoupper($search); + if (is_numeric($selection)){ + $sql = "SELECT DISTINCT u.id + FROM din_user u + WHERE u.cardno = $selection " . + "OR u.id = $selection"; + }else { + $sql = "SELECT DISTINCT u.id + FROM din_user u + WHERE CONCAT(UPPER(u.firstName), ' ', UPPER(u.lastName), ' ', UPPER(u.username), ' ', UPPER(u.email)) LIKE '%$selection%' + ORDER BY u.firstname, u.lastname ASC"; + } + $result = $this->conn->query($sql); + if (DB::isError($result) == true){ + error($result->toString()); + return false; + } + if ($result->numRows() > 0){ +?> +

    Antall treff: numRows()); ?>

    + + + + + + + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->id); + $user->displayExpiryList(); + } + print("
    idkortnrfornavnetternavnutløpsårendre tiloblatendre tilregistrertsist endret
    "); + }else { + print("

    Ingen medlemmer registrert.

    "); + } + } + + + public function displayList($selection = 2, $limit = 25, $search = false, $addressStatus = -1){ + $this->getList($selection, $limit, $search, $addressStatus); + if ($this->users->numRows() > 0){ +?> +

    Antall treff: users->numRows()); ?>

    + + + + + + + + + + +users->fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->id); + $user->displayList(); + } + print("
    #medlemfornavnetternavneposttelefongrupper
    "); + }else { + print("

    Ingen medlemmer funnet innenfor valgte søk.

    "); + } + } + + public function getDivisionRequestList(){ + if (isAdmin()){ + $sql = "SELECT d.id " . + "FROM din_user d, din_division dd " . + "WHERE d.division_id_request IS NOT NULL " . + "AND dd.id=d.division_id_request"; + }else { + $currentUser = getCurrentUser(); + $sql = "SELECT udr.id + FROM din_group g, din_user u, din_usergrouprelationship ugr, din_division d, din_user udr + WHERE u.id = ugr.user_id +AND ugr.group_id = g.id +AND u.id = $currentUser +AND g.admin = 1 +AND g.division_id = d.id +AND udr.division_id_request = d.id"; + } + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + $this->users = $result; + }else { + error($result->toString()); + } + return $this->users; + } + + + public function displayDivisionRequests(){ + $this->getDivisionRequestList(); + if ($this->users->numRows() > 0){ +?> +

    Disse medlemmene har haket av for at de var aktive i din forening da de registrerte seg. Sjekk om dette stemmer. Dersom du ikke tror de er aktive kan du gjerne kontakte dem og høre om de vil bli aktive!

    +

    Antall treff: users->numRows()); ?>

    + + + + + + + + + +users->fetchRow(DB_FETCHMODE_OBJECT)){ + $user = new User($row->id); + $user->displayDivReqList(); + } + print("
    fornavnetternavnepostforeningbruker registrert
    "); + }else { + print("

    Ingen forespørseler registrert.

    "); + } + } + + /** + * Get number of users with study place affiliations + * + * @param none + * @return mixed array + **/ + public function getUsersStudyPlaceList($year = null) { + if ($year) { + $user = new User(1); + $sql = "SELECT s.navn AS studyPlace, COUNT(*) AS count FROM din_user u INNER JOIN studiesteder s ON u.placeOfStudy=s.id WHERE u.expires='" . $user->getExpiryDate() . "' GROUP BY placeOfStudy ORDER BY studyPlace"; + } else { + $sql = "SELECT s.navn AS studyPlace, COUNT(*) AS count FROM din_user u INNER JOIN studiesteder s ON u.placeOfStudy=s.id GROUP BY placeOfStudy ORDER BY studyPlace"; + } + + $result = $this->conn->query($sql); + if (DB::isError($result) != true) { + $this->usersStudyPlaceList = $result; + } else { + error($result->toString()); + } + return $this->usersStudyPlaceList; + } + + /** + * Get max number of users for one study place affiliations + * + * @param none + * @return mixed array + **/ + public function getMaxUsersStudyPlace($year = null) { + if ($year) { + $user = new User(1); + $sql = "SELECT COUNT(*) AS count FROM din_user WHERE expires='" . $user->getExpiryDate() . "' GROUP BY placeOfStudy ORDER BY count DESC LIMIT 1"; + } else { + $sql = "SELECT COUNT(*) AS count FROM din_user GROUP BY placeOfStudy ORDER BY count DESC LIMIT 1"; + } + + $result = $this->conn->query($sql); + if (DB::isError($result) != true) { + $this->usersStudyPlaceMax = $result->fetchRow(DB_FETCHMODE_OBJECT); + $this->usersStudyPlaceMax = $this->usersStudyPlaceMax->count; + } else { + error($result->toString()); + } + return $this->usersStudyPlaceMax; + } + + /** + * List number of users with study place affiliations + * + * @param none + * @return none + **/ + public function displayUsersStudyPlaceList() { + if (isset($_GET['year'])) $year = $_GET['year']; + else $year = null; + if (!isset($this->usersStudyPlaceList)) $this->getUsersStudyPlaceList($year); + + print "

    Oversikt over hvor medlemmene har registrert at de studerer

    \n"; + + print "

    "; + print "Vis alle | "; + print "inneværende år"; + print "

    "; + + if ($year) { + print "

    Viser oversikt over studiestuder for alle som har betalt medlemskap i nåværende år.

    "; + } else { + print "

    Viser alle medlemmer som noensinne har registrert seg.

    "; + } + + $n = 0; + if ($this->usersStudyPlaceList->numRows() > 0) { + $scalefactor = 600/($this->getMaxUsersStudyPlace($year)); + print ""; + print ""; + print ""; + print ""; + print "\n"; + + while ($row =& $this->usersStudyPlaceList->fetchRow(DB_FETCHMODE_OBJECT)) { + print ""; + print ""; + print ""; + print ""; + print "\n"; + $n += $row->count; + } + print "\n"; + print "
    StudiestedAntall
    " . $row->studyPlace . "" . $row->count . "count)*$scalefactor . "\">
    Sum$n
    "; + } else { + print "

    Det er ingen registrerte medlemmer i valgt periode.

    "; + } + } + + /** + * Import membership payments from file recieved from our bank + **/ + public function parseMembershipPaymentsFromBank ($bankfile) { + $payment_lines = split("\n", $bankfile); + + $i = 1; + $n = 0; + + if (isset($_POST["parseonly"])) { + print "

    Resultater av fil-analysen

    \n"; + print "

    For å registrere medlemskapene i databasen, gå nederst på denne siden.

    \n"; + } + + // read each line + foreach ($payment_lines as $payment_line) { + $payment_line = rtrim($payment_line); + + if (substr($payment_line,6,2) == "30") { + // KID betaling + $n++; + $payment = array(); + $payment["date"] = mktime(0,0,0, substr($payment_line,17,2), + substr($payment_line,15,2), + substr($payment_line,19,2)); + $payment["amount"] = intval(substr($payment_line,40,7)) . "," . substr($payment_line,47,2); + $payment["info"] = substr($payment_line,49,25); + $payment["zeroes"] = substr($payment_line,49,4); + $payment["kundenr"] = intval(substr($payment_line,53,10)); + $payment["fakturanr"] = intval(substr($payment_line,63,10)); + $payment["CRC"] = substr($payment_line,73,1); + + $payment_user = new User($payment["kundenr"]); + + if (isset($_POST["parseonly"])) { + print "Fant KID-betaling på linje " . $i . ". Beløp " . $payment["amount"] . " ble betalt inn " . date("d.m.Y", $payment["date"]) . "
    \n"; + print "Medlemsnr: " . $payment["kundenr"] . ", ". $payment_user->getName() . ", fakturanr: " . $payment["fakturanr"] . ", kontrollsiffer: " . $payment["CRC"] . ".
    \n"; + if ($payment_user->isHonorMember()) { + print "" . $payment_user->getName() . " er livsvarig medlem.
    \n"; + } elseif ($payment_user->isMember()) { + print "" . $payment_user->getName() . " er allerede medlem. Medlemsskapet vil bli satt til å være gyldig i ett år ekstra.
    \n"; + } + print "
    \n"; + } else { + $payment_user->renewMembershipBankpayment(); + } + } + + $i++; + } + print "
    Fant totalt $n betalinger i filen.
    "; + if ($n > 0) { + if (isset($_POST["parseonly"])) { + print "Oppdateringen av medlemskapene er ikke lagret. For å lagre oppdateringen må du velge å ikke analysere filen uten å oppdatere medlemskapsdatabasen nederst på denne siden.
    \n"; + } else { + print "Databasen er oppdatert med nytt medlemskap på personene.
    \n"; + } + } + } + + /** + * Update addresses from a CSV file recieved through EA + * + * @param string eafile + * @return boolean + **/ + public function parseEAfile ($eafile) { + $ealines = split("\n", $eafile); + + // read each line + foreach ($ealines as $line) { + $line = rtrim($line); + //$line = utf8_decode($line); + //print $line; + $eaentry = split(";", $line); + + // reset variables + $address = ""; + $postno = ""; + $city = ""; + $country = ""; + $valid_address = 0; + + if (is_numeric($eaentry[0])) { + $user = @new User($eaentry[0]); + if ($user->_retrieveData()) { + // parse from different address caretgories + switch ($eaentry[1]) { + case "GV": + print "Gate/vei"; + $address = $eaentry[2]; + if (strlen($eaentry[3]) > 0) $address .= " " . ereg_replace("^0*", "", $eaentry[3]); + if (strlen($eaentry[4]) > 0) $address .= " " . $eaentry[4]; + if (strlen($eaentry[5]) > 0) $address .= ", oppg. " . $eaentry[5]; + $postno = $eaentry[10]; + $valid_address = 1; + break; + case "ST": + print "Stedsnavn"; + $address = $eaentry[7]; + $postno = $eaentry[10]; + $valid_address = 1; + break; + case "PB": + print "Postboks"; + $address = "Pb. " . $eaentry[6]; + if (strlen($eaentry[7]) > 0) $address .= " " . $eaentry[7]; + $postno = $eaentry[10]; + $valid_address = 1; + break; + case "SB": + print "Serviceboks"; + $address = "Serviceboks " . $eaentry[6]; + if (strlen($eaentry[7]) > 0) $address .= " " . $eaentry[7]; + $postno = $eaentry[10]; + $valid_address = 1; + break; + case "PS": + print "Postnummer"; + $postno = $eaentry[10]; + $valid_address = 1; + break; + case "UT": + print "Utenlandsk adresse"; + $address = $eaentry[8]; + if (strlen($eaentry[9]) > 0) $address .= "\n" . $eaentry[9]; + $postno = $eaentry[10]; + $city = $eaentry[11]; + $country = $eaentry[12]; + $valid_address = 1; + break; + default: + print "Retur: " . $eaentry[13]; + // mark address as invalid; + $valid_address = 0; + break; + } + + // update address if new address data exists + if (strlen($address . $postno) > 0) { + if ($eaentry[1] == "UT") { // foreign address + $user->_registerUpdate("EA-oppdatering, gammel adresse: " . $user->street . ", " . $user->zipcode . " " . $user->city . ", " . $user->country); + $user->addresstype = "int"; + $user->street = $address; + $user->zipcode = $postno; + $user->city = $city; + $user->state = ""; + $user->country = $country; + $user->setAddressStatus($valid_address); + $user->store(); + } else { // norwegian address + $user->sendNewAddressMail($address, $postno); + $user->_registerUpdate("EA-oppdatering, gammel adresse: " . $user->street . ", " . $user->zipcode . " " . $user->postarea); + $user->addresstype = "no"; + $user->street = $address; + $user->zipcode = $postno; + $user->setAddressStatus($valid_address); + $user->store(); + } + } else { + $user->_registerUpdate("EA-oppdatering, gammel adresse: " . $user->street . ", " . $user->zipcode . " " . $user->city . " satt som ugyldig"); + $user->setAddressStatus($valid_address); + $user->_sendWrongAddressMail(); + print "Gammel adresse markert ugyldig.
    \n"; + } + } else { + error("Ugyldig bruker-id " . $eaentry[0] . ", addressen ble ikke importert"); + } + } + } + return false; + } +} +?> \ No newline at end of file diff --git a/inside/WeekProgram.php b/inside/WeekProgram.php new file mode 100644 index 0000000..88e98b2 --- /dev/null +++ b/inside/WeekProgram.php @@ -0,0 +1,149 @@ +__construct($id, $data); + } + + public + function __construct($id = NULL, $data = NULL){ + $this->conn = db_connect(); + + $this->id = $id; + + if ($id == NULL){//New WeekProgram + if ($data == NULL){ + error("WeekProgram: No data supplied."); + }else { + //All relevant values are common + } + }else {//ID set, existing article + if ($data != NULL){//Update existing article + + }else {//Retrieve data from backend for display or other actions + $data = $this->_retrieveData(); + $this->gig1 = $data['gig1']; + $this->gig2 = $data['gig2']; + $this->gig3 = $data['gig3']; + $this->pretext = ($data['pretext'] == NULL)? '' : $data['pretext']; + $this->posttext = ($data['posttext'] == NULL)? '' : $data['posttext']; + } + } + + //Common initializations + $this->week = $data['week']; + $this->year = $data['year']; + } + + public + function store(){ + if ($this->id == NULL){ + $sql = sprintf("INSERT INTO weekprogram + (id, week, year) + VALUES + (%s, %s, %s)", + $this->conn->quoteSmart($this->id), + $this->conn->quoteSmart($this->week), + $this->conn->quoteSmart($this->year) + ); + $result = $this->conn->query($sql); + if (DB::isError($result) != true){ + notify("Ukesprogram er registrert."); + }else { + error("New WeekProgram: " . $result->toString()); + notify("Program for denne uken finnes allerede."); + } + } + } + + public function _retrieveData(){ + $sql = "SELECT * + FROM weekprogram + WHERE id = $this->id"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if ($row =& $result->fetchRow(DB_FETCHMODE_ASSOC)){ + return $row; + } + }else { + error("WeekProgram: " . $result->toString()); + } + } + + public function delete($id){ + $conn = db_connect(); + $sql = "DELETE FROM weekprogram + WHERE id = $id + LIMIT 1"; + $result = $conn->query($sql); + if (DB::isError($result) != true){ + //if ($result->affectedRows() > 0){ + notify("WeekProgram deleted."); + // }else { + //notify("WeekProgram: invalid id."); + // } + }else { + error($result->toString()); + } + } + + public function display(){ +?> +
    +id, WEEKPROGRAM, "weekprogram", "view-edit-options-weekprogram"); +?> +
    + + + + Uke week . " - " . $this->year; ?> + _firstDay();?> + _lastDay();?> + vis + endre + tekst + print + universitas (onsdag - onsdag) + + +week - 1; + return date("d. M", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $this->year")))); + } + + public + function _lastDay(){ + $week = $this->week; + return date("d. M", strtotime("last sunday", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $this->year"))))); + //return date("d. M", strtotime("+$week week", strtotime("sunday", strtotime(" 1$this->year")))); + } + +} + +?> \ No newline at end of file diff --git a/inside/WeekPrograms.php b/inside/WeekPrograms.php new file mode 100644 index 0000000..043619b --- /dev/null +++ b/inside/WeekPrograms.php @@ -0,0 +1,98 @@ +__construct($limit); + } + + function __construct($limit = 5){ + $this->conn = db_connect(); + } + + public function getList($division = NULL){ + if ($division != NULL){ + $condition = "AND p.division_id = $division"; + }else { + $condition = ""; + } + $sql = "SELECT d.id AS divId, d.name AS divName, p.id AS positionId, p.name AS weekprogramName " . + "FROM weekprogram p, din_division d " . + "WHERE p.division_id = d.id " . + "$condition" . + "ORDER BY d.name ASC"; + + $result =& $this->conn->query($sql); + if (DB::isError($result) != true){ + return $result; + } else { + error("WeekPrograms: " . $result->toString()); + return false; + } + } + + public function getWeekProgramsAsArray(){ + if ($list = $this->getWeekPrograms()){ + $pos = Array(); + while ($row =& $list->fetchRow(DB_FETCHMODE_ASSOC)){ + $div = $row['divId']; + + $pos[] = Array("id" => $row['weekprogramId'], + "title" => $row['weekprogramName'], + "parent" => $row['weekprogramDivId']); + } + return $pos; + } + } + + + + public function display(){ + $sql = "SELECT id FROM weekprogram + ORDER BY year DESC, week DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + while ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $weekprogram = new WeekProgram($row->id); + $weekprogram->display(); + } + }else { + error("WeekPrograms: " . $result->toString()); + } + + } + + public function displayList(){ + $sql = "SELECT id FROM weekprogram " . + "ORDER BY year DESC, week DESC"; + $result =& $this->conn->query($sql); + + if (DB::isError($result) != true){ + if($result->numRows() > 0){ +?> + + + + + + + +fetchRow(DB_FETCHMODE_OBJECT)){ + $weekprogram = new WeekProgram($row->id); + $weekprogram->displayList(); + } + print("
    ukefratil 
    "); + }else {?> +

    Ingen ukesprogram er registrert ennå.

    +toString()); + } + } +} +?> \ No newline at end of file diff --git a/inside/XMLCatRequest.js b/inside/XMLCatRequest.js new file mode 100644 index 0000000..0d9f420 --- /dev/null +++ b/inside/XMLCatRequest.js @@ -0,0 +1,80 @@ +function makeCatRequest(url) { + if(window.XMLHttpRequest){ + request = new XMLHttpRequest(); + } + else if(window.ActiveXObject){ + request = new ActiveXObject("MSXML2.XMLHTTP"); + } + sendCatRequest(url); +} + +function sendCatRequest(url){ + request.onreadystatechange = catOnResponse; + request.open("GET", url, true); + request.send(null); +} + +function checkCatReadyState(obj){ + if(obj.readyState == 0) { document.getElementById('statusField').innerHTML = "Sender forespørsel..."; } + if(obj.readyState == 1) { document.getElementById('statusField').innerHTML = "Henter data..."; } + if(obj.readyState == 2) { document.getElementById('statusField').innerHTML = "Laster data..."; } + if(obj.readyState == 3) { document.getElementById('statusField').innerHTML = "Data lastet ferdig..."; } + if(obj.readyState == 4) { + if(obj.status == 200) { + return true; + }else if(obj.status == 404) { + // Add a custom message or redirect the user to another page + document.getElementById('statusField').innerHTML = "File not found"; + }else { + document.getElementById('statusField').innerHTML = "There was a problem retrieving the XML."; + } + } +} + +function catOnResponse() { + if(checkCatReadyState(request)){ + //alert(request.responseXML); + //alert(request.responseText); + var response = request.responseXML.documentElement; + var type = response.getElementsByTagName('actiontype')[0].firstChild.data; + var cat_type = response.getElementsByTagName('cat-type')[0].firstChild.data; + if (response.getElementsByTagName('id')[0].firstChild != null){ + var id = response.getElementsByTagName('id')[0].firstChild.data; + }else { + document.getElementById('statusField').innerHTML = "Kategorien finnes fra før."; + return; + } + var table = document.getElementById(cat_type + '-cat-list'); + + if (type == 'add'){ + var title = response.getElementsByTagName('title')[0].firstChild.data; + document.getElementById('statusField').innerHTML = "Kategorien " + title + " er lagt til. Om den ikke vises over, forsøk å laste siden på nytt (F5)"; + var text = response.getElementsByTagName('text')[0].firstChild.data; + var edit_href = response.getElementsByTagName('edit-href')[0].firstChild.data; + var edit_text = response.getElementsByTagName('edit-text')[0].firstChild.data; + var delete_href = response.getElementsByTagName('delete-href')[0].firstChild.data; + var delete_text = response.getElementsByTagName('delete-text')[0].firstChild.data; + var r = document.createElement("tr"); + r.setAttribute('id', cat_type +'category' + id); + r.insertCell(0); + r.cells[0].appendChild(document.createTextNode(title)); + r.insertCell(1); + r.cells[1].appendChild(document.createTextNode(text)); + r.insertCell(2); + var aEdit = document.createElement("a"); + aEdit.setAttribute('href', edit_href); + aEdit.appendChild(document.createTextNode(edit_text)); + r.cells[2].appendChild(aEdit); + r.insertCell(3); + var aDelete = document.createElement("a"); + aDelete.setAttribute('href', delete_href); + aDelete.appendChild(document.createTextNode(delete_text)); + r.cells[3].appendChild(aDelete); + table.tBodies[0].appendChild(r); + }else if (type == 'remove'){ + document.getElementById('statusField').innerHTML = "Kategori slettet."; + var r = document.getElementById(cat_type + 'category' + id); + table.tBodies[0].removeChild(r); + } + } +} \ No newline at end of file diff --git a/inside/XMLRequest.js b/inside/XMLRequest.js new file mode 100644 index 0000000..a2d324e --- /dev/null +++ b/inside/XMLRequest.js @@ -0,0 +1,46 @@ +function makeRequest(url) { + if(window.XMLHttpRequest) { + request = new XMLHttpRequest(); + }else if(window.ActiveXObject){ + request = new ActiveXObject("MSXML2.XMLHTTP"); + } + sendRequest(url); +} + +function sendRequest(url) { + request.onreadystatechange = onResponse; + request.open("GET", url, true); + request.send(null); +} + +function checkReadyState(obj) { + if(obj.readyState == 0) { document.getElementById('notice').innerHTML = "Sender foresp?rsel..."; } + if(obj.readyState == 1) { document.getElementById('notice').innerHTML = "Henter data..."; } + if(obj.readyState == 2) { document.getElementById('notice').innerHTML = "Laster data..."; } + if(obj.readyState == 3) { document.getElementById('notice').innerHTML = "Data lastet ferdig..."; } + if(obj.readyState == 4) { + if(obj.status == 200) { + return true; + }else if(obj.status == 404) { + // Add a custom message or redirect the user to another page + document.getElementById('notice').innerHTML = "File not found"; + }else { + document.getElementById('notice').innerHTML = "There was a problem retrieving the XML."; + } + } +} + +function onResponse(){ + if(checkReadyState(request)){ + //alert(request.responseXML); + //alert(request.responseText); + var response = request.responseXML.documentElement; + var posId = response.getElementsByTagName('positionid')[0].firstChild.data; + var title = response.getElementsByTagName('title')[0].firstChild.data; + var text = response.getElementsByTagName('text')[0].firstChild.data; + document.getElementById('positionid').value = posId; + document.getElementById('name').value = title; + document.getElementById('text').value = text; + tinyMCE.updateContent('text'); + } +} \ No newline at end of file diff --git a/inside/XMLUsernameRequest.js b/inside/XMLUsernameRequest.js new file mode 100644 index 0000000..78bbc70 --- /dev/null +++ b/inside/XMLUsernameRequest.js @@ -0,0 +1,42 @@ +function makeUsernameRequest(url) { + if(window.XMLHttpRequest){ + request = new XMLHttpRequest(); + } + else if(window.ActiveXObject){ + request = new ActiveXObject("MSXML2.XMLHTTP"); + } + sendUsernameRequest(url); +} + +function sendUsernameRequest(url){ + request.onreadystatechange = usernameOnResponse; + request.open("GET", url, true); + request.send(null); +} + +function checkUsernameReadyState(obj){ + if(obj.readyState == 4) { + if(obj.status == 200){ + return true; + } + else if(obj.status == 404){ + // Add a custom message or redirect the user to another page + alert("error checking username"); + }else{ + alert("There was a problem retrieving the XML."); + } + return false; + } +} + +function usernameOnResponse() { + if(checkUsernameReadyState(request)){ + //alert(request.responseXML); + //alert(request.responseText); + var response = request.responseXML.documentElement; + var status = response.getElementsByTagName('status')[0].firstChild.data; + if (status == "false") { + alert("Dette brukernavnet er i bruk på forumet.\n\nOm du har denne brukeren på forumet, kan du bruke samme brukernavn også på Inside.\n\nFor å bekrefte at dette er ditt brukernavn må du skrive inn samme passord som du har på forumet.\n\nOm dette ikke er ditt brukernavn må du velge et annet.\n\nBåde brukernavn og passord kan endres senere."); + } + } +} \ No newline at end of file diff --git a/inside/XMLZipRequest.js b/inside/XMLZipRequest.js new file mode 100644 index 0000000..d29d71e --- /dev/null +++ b/inside/XMLZipRequest.js @@ -0,0 +1,47 @@ +function makeZipRequest(url) { + if(window.XMLHttpRequest){ + request = new XMLHttpRequest(); + } + else if(window.ActiveXObject){ + request = new ActiveXObject("MSXML2.XMLHTTP"); + } + sendZipRequest(url); +} + +function sendZipRequest(url){ + request.onreadystatechange = zipOnResponse; + request.open("GET", url, true); + request.send(null); +} + +function checkZipReadyState(obj){ + if(obj.readyState == 0) { document.getElementById('postarea').innerHTML = "Sender foresp?rsel..."; } + if(obj.readyState == 1) { document.getElementById('postarea').innerHTML = "Henter data..."; } + if(obj.readyState == 2) { document.getElementById('postarea').innerHTML = "Laster data..."; } + if(obj.readyState == 3) { document.getElementById('postarea').innerHTML = "Data lastet ferdig..."; } + if(obj.readyState == 4) { + if(obj.status == 200){ + return true; + } + else if(obj.status == 404){ + // Add a custom message or redirect the user to another page + document.getElementById('postarea').innerHTML = "File not found"; + }else{ + document.getElementById('postarea').innerHTML = "There was a problem retrieving the XML."; + } + return false; + } +} + +function zipOnResponse() { + if(checkZipReadyState(request)){ + //alert(request.responseXML); + //alert(request.responseText); + var response = request.responseXML.documentElement; + var postarea = response.getElementsByTagName('postarea')[0].firstChild.data; + document.getElementById('postarea').innerHTML = postarea; + if (postarea == "ugyldig postnummer"){ + document.getElementById("zipcode").focus(); + } + } +} \ No newline at end of file diff --git a/inside/ajax.js b/inside/ajax.js new file mode 100644 index 0000000..111198f --- /dev/null +++ b/inside/ajax.js @@ -0,0 +1,213 @@ +function requestConcertInfo(callerid, target, programid) { + var iId = document.getElementById(callerid).value; + var pattern = /\d+/; + var match = pattern.exec(callerid); + var gigNo = parseInt(match[0]); + + var oXmlHttp = zXmlHttp.createRequest(); + oXmlHttp.open("get", "getconcertinfo.php?gigid=" + iId + "&store=" + gigNo + "&programid=" + programid, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + displayConcertInfo(oXmlHttp.responseText, target); + }else { + displayConcertInfo("An error occured: " + oXmlHttp.statusText, target); + } + } + }; + oXmlHttp.send(null); +} + +function grantCardNumber(userid) { + var form = document.getElementById("user_"+userid+"_cardno_form"); + form.style.display = "none"; + + var oXmlHttp = zXmlHttp.createRequest(); + var sURL = "grantcardno.php?userid=" + userid; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseXML); + //alert(oXmlHttp.responseText); + var response = oXmlHttp.responseXML.documentElement; + var cardno = response.getElementsByTagName('cardno')[0].firstChild.data; + var expires = response.getElementsByTagName('expires')[0].firstChild.data; + document.getElementById('user_'+userid+'_cardno').innerHTML = cardno; + document.getElementById('user_'+userid+'_expires').innerHTML = expires; + + form.parentNode.innerHTML = "Kortnummer "+cardno+" er tildelt"; + }else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +function setHasCard(userid) { + var form = document.getElementById("user_"+userid+"_hascard_form"); + form.style.display = "none"; + + var oXmlHttp = zXmlHttp.createRequest(); + var sURL = "sethascard.php?userid=" + userid; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseXML); + //alert(oXmlHttp.responseText); + var response = oXmlHttp.responseXML.documentElement; + var lastSticker = response.getElementsByTagName('laststicker')[0].firstChild.data; + document.getElementById('user_'+userid+'_laststicker').innerHTML = lastSticker; + + form.parentNode.innerHTML = "Medlemskort er produsert"; + }else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +function updateUserExpiry(userid) { + var input = document.getElementById("newExpiryDate_"+userid); + var value = input.value; + var v = document.getElementById("user_"+userid+"_expires"); + v.innerHTML = value; + + var oXmlHttp = zXmlHttp.createRequest(); + var sURL = "updateuserexpiry.php?userid=" + userid + "&value="+value; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseXML); + //alert(oXmlHttp.responseText); + //var response = oXmlHttp.responseXML.documentElement; + }else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +function updateLastSticker(userid) { + var input = document.getElementById("newStickerDate_"+userid); + var value = input.value; + var v = document.getElementById("user_"+userid+"_laststicker"); + v.innerHTML = value; + + var oXmlHttp = zXmlHttp.createRequest(); + var sURL = "updatelaststicker.php?userid=" + userid + "&value="+value; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseXML); + //alert(oXmlHttp.responseText); + //var response = oXmlHttp.responseXML.documentElement; + }else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +/*********************************** + * set order status to delivered + ***********************************/ +function setOrderDeliveryStatus(orderid) { + var form = document.getElementById("order_"+orderid+"_update_form"); + form.style.display = "none"; + var input = document.getElementById("newDeliveryStatus_"+orderid); + var value = input.value; + + var oXmlHttp = zXmlHttp.createRequest(); + var sURL = "setorderdelivery.php?orderid=" + orderid + "&newstatusid=" + value; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4) { + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseXML); + //alert(oXmlHttp.responseText); + var response = oXmlHttp.responseXML.documentElement; + var status = response.getElementsByTagName('deliverystatus')[0].firstChild.data; + + if (status == 1) { + document.getElementById('order_'+orderid+'_deliverystatus').innerHTML = "levert"; + form.parentNode.innerHTML = "Orderen er levert"; + } else { + document.getElementById('order_'+orderid+'_deliverystatus').innerHTML = "ikke levert"; + form.parentNode.innerHTML = "Orderen er ikke levert"; + } + } else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +function setWeekText(sText, iId, sType) { + + var oXmlHttp = zXmlHttp.createRequest(); + sText = escape(sText); + var sURL = "setweekprogramtext.php?wid=" + iId + "&text=" + sText + "&type=" + sType; + oXmlHttp.open("get", sURL, true); + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + //alert(oXmlHttp.responseText); + }else { + alert("An error occured: " + oXmlHttp.statusText); + } + } + }; + oXmlHttp.send(null); +} + +function displayConcertInfo(sText, target) { + var divConcertInfo = document.getElementById(target); + divConcertInfo.innerHTML = sText; +} + +function saveResult(sMessage) { + var divStatus = document.getElementById("divStatus"); + divStatus.innerHTML = "Request completed: " + sMessage; +} + +function getRequestBody(oForm) { + var aParams = new Array(); + + for (var i = 0; i < oForm.elements.length; i++){ + var sParam = encodeURIComponent(oForm.elements[i].name); + sParam += "="; + sParam += encodeURIComponent(oForm.elements[i].value); + aParams.push(sParam); + } + return aParams.join("&"); +} + +function sendRequest() { + var oForm = document.forms[0]; + var sBody = getRequestBody(oForm); + + var oXmlHttp = zXmlHttp.createRequest(); + oXmlHttp.open("post", oForm.action, true); + oXmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + + oXmlHttp.onreadystatechange = function() { + if (oXmlHttp.readyState == 4){ + if (oXmlHttp.status == 200) { + saveResult(oXmlHttp.responseText); + }else { + saveResult("An error occured: " + oXmlHttp.statusText); + } + } + + }; + oXmlHttp.send(sBody); +} diff --git a/inside/ajax.php b/inside/ajax.php new file mode 100644 index 0000000..bfb2d09 --- /dev/null +++ b/inside/ajax.php @@ -0,0 +1,117 @@ +'); + +$conn = db_connect(); + +$action = $_REQUEST['action']; +if ($action == 'checkZip'){ + + $zip = $_REQUEST['zip']; + if ($zip != "") { + $sql = "SELECT poststed AS postarea + FROM din_postnummer + WHERE postnummer = $zip"; + + $result = $conn->query($sql); + if ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ + $zip = $row->postarea; + }else { + $zip = "ugyldig postnummer"; + } + }else { + $zip = "ugyldig postnummer"; + } +?> + + + +performAction(); + $cat = new DocumentCategory(scriptParam("documentcategoryid")); + $type = "document"; + + printAddCatXML($type, $cat); + +}else if ($action == 'delete-documentcategory'){ + $ap = new ActionParser(); + $ap->performAction(); + $type = "document"; + printRemoveCatXML($type); + +}else if ($action == 'register-eventcategory'){ + $ap = new ActionParser(); + $ap->performAction(); + $cat = new EventCategory(scriptParam("eventcategoryid")); + $type = "event"; + + printAddCatXML($type, $cat); + +}else if ($action == 'delete-eventcategory'){ + $ap = new ActionParser(); + $ap->performAction(); + $type = "event"; + printRemoveCatXML($type); + +}else if ($action == 'register-jobcategory'){ + $ap = new ActionParser(); + $ap->performAction(); + $cat = new JobCategory(scriptParam("jobcategoryid")); + $type = "job"; + printAddCatXML($type, $cat); + +}else if ($action == 'delete-jobcategory'){ + $ap = new ActionParser(); + $ap->performAction(); + $type = "job"; + printRemoveCatXML($type); + +}else if ($action == 'checkUsername') { + $username = $_REQUEST['username']; + $conn = db_connect("forum"); + $sql = sprintf("SELECT user_id FROM phpbb_users u "."WHERE username = '%s' ", $username); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + $status = "true"; + }else { + $status = "false"; + } +?> + + + + + add + + id; ?> + <?php print $cat->title; ?> + text; ?> + id, $type."category"); ?> + + id, $type."category"); ?> + + + + + remove + + + + \ No newline at end of file diff --git a/inside/checkZip.php b/inside/checkZip.php new file mode 100644 index 0000000..85a0d99 --- /dev/null +++ b/inside/checkZip.php @@ -0,0 +1,28 @@ +'); + + $conn = db_connect(); + + $zip = $_REQUEST['zip']; + + $sql = "SELECT poststed AS postarea + FROM din_postnummer + WHERE postnummer = $zip"; + + $result = $conn->query($sql); + if ($row =& $result->fetchRow(DB_FETCHMODE_OBJECT)){ +?> + postarea; ?> + + + ugyldig postnummer + + diff --git a/inside/credentials-sample.php b/inside/credentials-sample.php new file mode 100644 index 0000000..2d616f7 --- /dev/null +++ b/inside/credentials-sample.php @@ -0,0 +1,27 @@ + diff --git a/inside/file.php b/inside/file.php new file mode 100644 index 0000000..b08affa --- /dev/null +++ b/inside/file.php @@ -0,0 +1,59 @@ +query($sql); +if (DB::isError($result) == true){ + print("Document: " . $result->toString()); +} + +if ($result->numRows() != 1) { + print("Not a valid file id!"); +} + +$FileObj = $result->fetchRow(DB_FETCHMODE_OBJECT); +// Pull the list of file inodes +$sql = "SELECT id FROM din_documentdata + WHERE document_id = $id + ORDER BY id"; +$result =& $conn->query($sql); +if (DB::isError($result) == true){ + print("Document: " . $result->toString()); +} + +while ($cur = $result->fetchRow(DB_FETCHMODE_OBJECT)) { + $nodelist[] = $cur->id; +} + +// Send down the header to the client +header("Pragma: public"); +header("Cache-Control: cache, must-revalidate"); +header("Expires: 0"); +header("Content-Type: $FileObj->type"); +header("Content-Length: " . $FileObj->size); +$FileObj->name = utf8_encode($FileObj->name); +header("Content-Disposition: attachment; filename=\"$FileObj->name\""); +header("Content-Transfer-Encoding: binary"); + +// Loop thru and stream the nodes 1 by 1 +for ($i = 0 ; $i < count($nodelist) ; $i++) { + $sql = "SELECT data FROM din_documentdata WHERE id = $nodelist[$i]"; + $result =& $conn->query($sql); + if (DB::isError($result) == true){ + print("Document: " . $result->toString()); + } else { + $DataObj =& $result->fetchRow(DB_FETCHMODE_OBJECT); + print $DataObj->data; + } +} + +?> \ No newline at end of file diff --git a/inside/finder.js b/inside/finder.js new file mode 100644 index 0000000..1aa6525 --- /dev/null +++ b/inside/finder.js @@ -0,0 +1,117 @@ +/* + * ul2finder + * written by Christian Heilmann (http://icant.co.uk) + * turns the nested list with the ID "finder" into a dynamic list + * uses the CSS classes defined in the variables + */ +function ul2finder() +{ + // Define variables used and classes to be applied/removed + var i,uls,als,finder; + var parentClass='parent'; + var showClass='shown'; + var hideClass='hidden'; + var openClass='open'; + + // check if our finder list exists, if not, stop all activities + finder=document.getElementById('finder'); + if(!finder){return;} + + // add the class domenabled to the body + cssjs('add',document.body,'domenabled') + + // loop through all lists inside finder, position and hide them + // by applying the class hidden + uls=document.getElementById('finder').getElementsByTagName('ul'); + for(i=0;i size){ + alert("Max "+size+" characters!"); + element.focus(); + return false; + }else { + return true; + } +} + +function validateDatetime(id){ + var element = document.getElementById(id); + var date = element.value; + + var reg = /^(19|20\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|[3][01])\s(([01][0-9]|[2][0-3]):[0-5][0-9])$/g; + var found = date.match(reg); + if (found != null){ + return true; + }else { + alert("Ugyldig tidsformat!\n\nAngi tid som yyyy-mm-dd hh:mm\n\n" + + "F. eks.: 2005-10-02 18:13\n\nVennligst ogs? p?se at verdiene er gyldige."); + element.focus(); + return false; + } +} + +function validateDate(id){ + var element = document.getElementById(id); + var date = element.value; + + if (date.length == 8) { + date = date.substr(0, 4) + "-" + date.substr(4, 2) + "-" + date.substr(6, 2); + element.value = date; + } + + var reg = /^((19|20)\d{2})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|[3][01])$/g; + var found = date.match(reg); + if (found != null){ + return true; + }else { + alert("Ugyldig tidsformat!\n\nAngi tid som yyyy-mm-dd\n\n" + + "F. eks.: 2005-10-02\n\nVennligst ogs? p?se at verdiene er gyldige."); + element.focus(); + return false; + } +} + +function validateTime(id){ + var element = document.getElementById(id); + var time = element.value; + var error = false; + + if (time.length == 1) { + if (isNaN(time)){ + error = true; + }else { + time = "0" + time + ":00"; + element.value = time; + } + }else if (time.length == 2) { + if (isNaN(time) || time >= 24){ + error = true; + }else { + time = time + ":00"; + element.value = time; + } + }else if (time.length == 4) { + if (isNaN(time)){ + error = true; + }else { + if (time.substr(2, 2) > 59){ + time = time.substr(0,2) + "59"; + } + time = time.substr(0, 2) + ":" + time.substr(2, 2); + element.value = time; + + } + }else if (time.length == 5) { + if (isNaN(time.substr(0, 2)) || isNaN(time.substr(3, 2))){ + error = true; + }else { + if (time.substr(3, 2) > 59){ + time = time.substr(0,2) + ":59"; + } + time = time.substr(0, 2) + ":" + time.substr(3, 2); + element.value = time; + } + }else { + error = true; + } + + if (!error){ + return true; + }else { + alert("Ugyldig tidsformat!\n\nAngi tid som hh:mm\n\n" + + "F. eks.: 18:13\n\nVennligst også påse at verdiene er gyldige."); + element.focus(); + return false; + } +} + +function validateEmpty(id, tekst){ + var element = document.getElementById(id); + if (element.value.length == 0){ + alert(tekst+" must be filled in!"); + element.focus(); + return false; + }else { + return true; + } +} + +function validateAllFieldsNotEmpty(id){ + var fields = document.getElementById(id).getElementsByTagName('input'); + var errorMsg = ''; + for (var i = 0; i < fields.length; i++){ + if (fields[i].value == ''){ + errorMsg += fields[i].getAttribute('name') + " m? angis\n"; + } + } + + if (errorMsg != ''){ + alert(errorMsg); + return false; + }else { + return true; + } +} + +function checkUsername(username){ + makeUsernameRequest("ajax.php?action=checkUsername&username=" + username); +} + +function checkZip(zipCode){ + var t = document.getElementById("addresstype").checked; + if (t){ + return true; + }else { + var z = zipCode.value; + makeZipRequest("ajax.php?action=checkZip&zip=" + z); + } +} + +function addCategory(type){ + var title = document.getElementById("title").value; + var text = document.getElementById("text").value; + var url = "ajax.php?action=register-" + type + "category&title=" + title + "&text=" + text; + makeCatRequest(url); +} + +function deleteObject(type, id){ + var url = "ajax.php?action=delete-" + type + "&" + type + "id=" + id; + makeCatRequest(url); +} + +function textCounter(field, id, maxlimit) { + var c = document.getElementById(id); + var f = document.getElementById(field); + if (c != null){ + c.value = maxlimit - f.value.length; + } +} + +function validateURL(element){ + var str = element.value; + if (element.value.substr(0, 7) == "http://"){ + //alert("URL skal ikke starte med 'http://'!"); + element.value = element.value.substr(7, element.value.length); + } +} + +function toggleDisplay(id){ + var element = document.getElementById(id); + if (element.style.display == "none"){ + element.style.display = '';//default + }else { + element.style.display = "none"; + } +} + +function toggleDisplayObject(element){ + if (element.style.display == "none"){ + element.style.display = '';//default + }else { + element.style.display = "none"; + } +} + +function toggleElements(tag, className, caller) { + if (caller.checked) { + var value = ""; + }else { + var value = "none"; + } + var elements = document.getElementsByTagName(tag); + for (var i = 0; i < elements.length; i++) { + if (elements[i].className == className) { + elements[i].style.display = value; + } + } +} + +function toggleText(oObject, tA, tB) { + if (oObject.innerHTML == tA) { + oObject.innerHTML = tB; + }else { + oObject.innerHTML = tA; + } +} + +function formFieldShowHelp(oEvent, oField, tMessage) { + + var oTd = oField.parentNode; + oTd.style.position = "relative"; + var oDiv = document.createElement("div"); + oDiv.innerHTML = tMessage + '
    X
    '; + oDiv.className = "formHelpMessage"; + if (oEvent.pageY) { + var iTop = oEvent.pageY - 10; + var iLeft = oEvent.pageX - 10; + oDiv.style.position = "absolute"; + oDiv.style.top = iTop+"px"; + oDiv.style.left = iLeft+"px"; + }else { + oDiv.style.position = "relative"; + } + + oTd.appendChild(oDiv); +} + +function formFieldHideHelp(oField) { + var oTd = oField.parentNode; + oTd.removeChild(oTd.lastChild); +} + +function ajaxFindUser(oField) { + var divParent = oField.parentNode; + divParent.style.position = "relative"; + var oDiv = document.createElement("div"); + + oDiv.innerHTML = oField.value + '
    X
    '; + oDiv.className = "formHelpMessage"; + oDiv.style.position = "absolute"; + oDiv.style.top = "27px"; + oDiv.style.left = "100px"; + + divParent.appendChild(oDiv); +} + +function StringBuffer() { + this.__strings__ = new Array; +} + +StringBuffer.prototype.append = function(str){ + this.__strings__.push(str); +}; + +StringBuffer.prototype.toString = function(){ + return this.__strings__.join(""); +}; \ No newline at end of file diff --git a/inside/functions.php b/inside/functions.php new file mode 100644 index 0000000..518c6fd --- /dev/null +++ b/inside/functions.php @@ -0,0 +1,1532 @@ +getCode() == -24) { + error("Databasen er for øyeblikket utilgjengelig, vennligst forsøk igjen siden."); + return false; + } + else { + error("Database error: " . $conn->toString()); + return false; + } + } + else { + $GLOBALS['db_conn'][$host] = & $conn; + } + } + return $GLOBALS['db_conn'][$host]; +} + +function retrieveValues($obj, $values) { + $vars = get_class_vars(get_class($obj)); + for ($i = 0; $i < count($vars); $i++) { + eval ("\$obj->" . key($vars) . " = \$values['" . key($vars) . "'];"); + next($vars); + } +} + +// script_param() extracts an input parameter from the script execution +// environment. If extra backslashes were added due to magic_quotes_gpc being +// enabled, it strips them using the remove_backslashes() function. +// track_vars is assumed to be enabled, but nothing is assumed about +// magic_quotes_gpc, and the function does not require register_globals to +// be enabled. + +// remove_backslashes() takes into account whether the value is a scalar or +// an array. It is recursive in case you create a form that takes advantage +// of the ability to created nested input parameters in PHP 4 and up. + +// +function remove_backslashes($val) { + if (!is_array($val)) { + $val = stripslashes($val); + } + else { + reset($val); + while (list ($k, $v) = each($val)) { + $val[$k] = remove_backslashes($v); + } + } + return ($val); +} + +function scriptParam($name) { + if (isset ($val)) + unset ($val); + if (isset ($GLOBALS['extraScriptParams'][$name])) { + $val = $GLOBALS['extraScriptParams'][$name]; + } + else + if (isset ($_POST[$name])) { + $val = $_POST[$name]; + } + else + if (isset ($_GET[$name])) { + $val = $_GET[$name]; + } + else + if (isset ($_COOKIE[getCurrentUser()][$name])) { + $val = $_COOKIE[getCurrentUser()][$name]; + } + if (isset ($val) && get_magic_quotes_gpc()) { + $val = remove_backslashes($val); + } + // return @$val rather than $val to prevent "undefined value" + // messages in case $val is unset and warnings are enabled + return (@ $val); +} + +function getCurrentUser() { + if (isset ($_SESSION['valid-user'])) { + return $_SESSION['valid-user']; + } + else { + return 0; + } +} + +function getUseridFromCardno($cardno) { + $conn = db_connect(); + $sql = sprintf("SELECT id FROM din_user u " . "WHERE cardno = %s ", $cardno); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + return false; + } + else { + $row = & $result->fetchRow(DB_FETCHMODE_ORDERED); + return $row[0]; + } +} + +function getUseridFromEmail($email) { + $conn = db_connect(); + $sql = sprintf("SELECT id FROM din_user u " . "WHERE email = '%s' ", $email); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + return false; + } + else { + $row = & $result->fetchRow(DB_FETCHMODE_ORDERED); + return $row[0]; + } +} + +function getUseridFromPhone($phoneno) { + $conn = db_connect(); + $sql = sprintf("SELECT user_id FROM din_userphonenumber u " . "WHERE number = '%s' or number = '+47%s'", $phoneno, $phoneno); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + return false; + } + else { + $row = & $result->fetchRow(DB_FETCHMODE_ORDERED); + return $row[0]; + } +} + +function checkForumUsername($username, $password) { + $conn = db_connect("forum"); + $sql = sprintf("SELECT user_id FROM phpbb_users u " . "WHERE username = '%s' ", $username); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + return "not-used"; + } + else { + $sql = sprintf("SELECT user_id FROM phpbb_users u " . "WHERE username = '%s' " . "AND user_password = '%s'", $username, md5($password)); + $result = & $conn->query($sql); + if ($result->numRows() == 0) { + return "wrong-password"; + } + else { + return "auth-ok"; + } + } +} + +function isAdmin($id = NULL) { + $conn = db_connect(); + + if ($id == NULL) { + $id = getCurrentUser(); + } + + $sql = "SELECT ugr.user_id + FROM din_usergrouprelationship ugr + WHERE ugr.user_id = $id + AND ugr.group_id = 3"; + + $result = & $conn->query($sql); + if (DB :: isError($result) == true) { + error("Brukergrupper: " . $result->toString()); + } + else { + if ($result->numRows() > 0) { + return true; + } + } + return false; +} + +function isBoardmember($id = NULL) { + $conn = db_connect(); + + if ($id == NULL) { + $id = getCurrentUser(); + } + + $sql = "SELECT ugr.user_id + FROM din_usergrouprelationship ugr + WHERE ugr.user_id = $id + AND ugr.group_id = 61"; + + $result = & $conn->query($sql); + if (DB :: isError($result) == true) { + error("Brukergrupper: " . $result->toString()); + } + else { + if ($result->numRows() > 0) { + return true; + } + } + return false; +} + +function isMember($id = NULL) { + if ($id == NULL) { + $id = getCurrentUser(); + } + $user = new User($id); + return $user->isMember(); +} + +function isActive($id = NULL) { + if ($id == NULL) { + $id = getCurrentUser(); + } + $user = new User($id); + return $user->isActive(); +} + +function membershipExpired($id = NULL) { + if ($id == NULL) { + $id = getCurrentUser(); + } + $user = new User($id); + return $user->hasExpired(); +} + +function membershipNextYear($id = NULL) { + if (date("Y-m-d") > date("Y-11-15")) { //Only valid if after given date + if ($id == NULL) { + $id = getCurrentUser(); + } + $user = new User($id); + return $user->expires != date("Y") . "-12-31"; + } + else { + return true; + } +} + +function validCardno($cardno) { + $cardno = trim($cardno); + $conn = db_connect(); + $sql = "SELECT id + FROM din_usedcardno + WHERE id = $cardno"; + $result = & $conn->query($sql); + if (DB :: isError($result) == true) { + error("Aktiveringsnummer: " . $result->toString()); + } + else { + if ($result->numRows() == 0) { + return true; + } + } + return false; +} + +function loggedIn() { + return getCurrentUser(); +} + +function getCurrentUserName() { + $id = getCurrentUser(); + if ($id > 0) { + $conn = db_connect(); + $sql = "SELECT username FROM din_user WHERE id = $id"; + + $result = & $conn->query($sql); + if (DB :: isError($result) == true) { + error("Username: " . $result->toString()); + } + else { + if ($result->numRows() > 0) { + $row = & $result->fetchRow(DB_FETCHMODE_ORDERED); + return $row[0]; + } + } + } +} + +function getUserIP() { + return $_SERVER['REMOTE_ADDR']; +} + +function getSectionFromPage($page) { + global $sections; + if (isset ($sections[$page])) { + return $sections[$page]; + } + else { + return "quick"; + } +} + +function script_name() { + if (isset ($_SERVER["PHP_SELF"])) { + return ($_SERVER["PHP_SELF"]); + } +} + +/** + * Returns path to script + */ +function scriptPath() { + $file = str_replace('\\', '/', __FILE__); + return substr($file, 0, strrpos($file, "/")); +} + +function handle_error($errno, $errstr, $errfile, $errline, $errcontext) { + error("$errno: $errstr"); +} + +function error($msg) { + Errors :: addError($msg); +} + +function notify($msg) { + Messages :: addMSG($msg); +} + +function isDate($date) { + return (preg_match("/(19|20)\d\d[-](0[1-9]|1[012])[-](0[1-9]|[12][0-9]|3[01])/i", $date)); +} + +//Global function for formating datetime +function formatDatetime($datetime, $type = "general") { + $locale = Array ( + 'no_NO', + 'nor_nor' + ); + setlocale(LC_TIME, $locale); + if ($type == "td") { + return strftime("%d/%m-%y", strtotime($datetime)); + } + else { + return strftime("%A %d. %B %Y, kl. %H:%M", strtotime($datetime)); + } +} + +function formatDatetimeShort($datetime, $type = "general") { + if ($type == "td") { + return strftime("%d/%m-%y", strtotime($datetime)); + } + else { + return strftime("%d. %b. kl. %H:%M", strtotime($datetime)); + } +} + +function formatDatetimeYearShort($datetime, $type = "general") { + + return strftime("%y - %d. %b kl. %H:%M", strtotime($datetime)); + +} + +function formatDate($datetime, $type = "general") { + if ($type == "td") { + return strftime("%d/%m-%y", strtotime($datetime)); + } + else { + return strftime("%d. %B, %Y", strtotime($datetime)); + } +} + +function formatTime($time) { + return strftime("%H:%M", strtotime($time)); +} + +function formatPrice($price) { + return "NOK " . $price . ",-"; +} + +function formatPhone($number) { + $new = preg_replace("/(\d{2})(\d{2})(\d{2})(\d{2})/", "\\1 \\2 \\3 \\4", $number); + return $new; +} +/* + *Function for handling uploaded files. + */ +function new_file($file, $dir) { + $newFile = $file['tmp_name']; + $newFile_name = "xxx" . $file['name']; //Tempname with suffix to prevent overwriting existing files + $newFile_size = $file['size']; + $newFile_type = $file['type']; + $newFile_error = $file['error']; + + if ($newFile_error > 0) { + switch ($newFile_error) { + case 1 : + error("Upload_max_fileszie breached (ini)"); + break; + case 2 : + error("Upload max_file_size breached (html)"); + break; + case 3 : + error("Upload not completed"); + break; + case 4 : + error("No file uploaded"); + break; + } + return false; + + } + else { + + $imagesize = getimagesize($newFile); + switch ($imagesize[2]) { + case 1 : + case 2 : + case 3 : + $f = true; + break; + default : + error("Invalid format. Only jpeg, png and gif are supported in this version."); + return false; + } + + if ($f) { + if ($dir == 'products') { + $dir = 'images/products/'; + }else { + $dir = "../../httpdocs/bilder/$dir/"; + } + $upFile = $dir.$newFile_name; + + if (is_uploaded_file($newFile)) { + if ($newFile_type == "IMAGE") { + if ($imagesize[0] > 1280 || $imagesize[1] > 1280) { + $maxwidth = 1280; + $maxheight = 1280; + $quality = 100; + picResizeImage($newFile, $maxwidth, $maxheight, $quality); + } + } + + if (!move_uploaded_file($newFile, $upFile)) { + error("Error moving file!"); + return false; + } + else { + return $newFile_name; + } + } + } + } +} + +function rename_file($old_name, $id, $dir, $report = true) { + if ($dir == 'products') { + $dir = 'images/products/'; + }else { + $dir = "../../httpdocs/bilder/$dir/"; + } + + $old_name = $dir.$old_name; + $new_name = $dir.$id.substr($old_name, -4); + deleteFile($new_name, false); + if (rename($old_name, $new_name)) { + return true; + } + else { + if ($report == true) { + error("Could not rename file."); + } + return false; + } +} + +function deleteFile($file, $report = true) { + if (file_exists($file)) { + if (unlink($file)) { + if ($report == true) { + notify("File deleted."); + } + return true; + } + else { + return false; + } + } + else { + if ($report == true) { + notify("No file to delete."); + } + return true; + } +} + +function picResizeImage($image, $maxwidth = NULL, $maxheight = NULL, $quality = NULL) { + + list ($width, $height, $format) = getimagesize($image); + + // Define content type and load source + switch ($format) { + case 0 : + break; + case 1 : + $source = imagecreatefromgif($image); + break; + case 2 : + $source = imagecreatefromjpeg($image); + break; + case 3 : + $source = imagecreatefrompng($image); + break; + } + + if (isset ($maxwidth) && isset ($maxheight)) { + // Get new sizes + if ($width < $maxwidth) { + $newwidth = $width; + $newheight = $height; + } + else { + $div = $maxwidth / $width; + $newwidth = $width * $div; + $newheight = $height * $div; + } + if ($newheight > $maxheight) { + $div = $maxheight / $newheight; + $newwidth = $newwidth * $div; + $newheight = $newheight * $div; + } + } + else + if (isset ($maxwidth)) { + // Get new sizes + if ($width < $maxwidth) { + $newwidth = $width; + $newheight = $height; + } + else { + $div = $maxwidth / $width; + $newwidth = $width * $div; + $newheight = $height * $div; + } + } + else + if (isset ($maxheight)) { + // Get new sizes + if ($height < $maxheight) { + $newwidth = $width; + $newheight = $height; + } + else { + $div = $maxheight / $height; + $newwidth = $width * $div; + $newheight = $height * $div; + } + } + + // Load new image + if ($format != 2) { + $newimage = imagecreate($newwidth, $newheight); + $color = ImageColorAllocate($newimage, 255, 255, 255); + imagefill($newimage, 0, 0, $color); + } + else { + $newimage = imagecreatetruecolor($newwidth, $newheight); + } + // Resize image + imagecopyresized($newimage, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); + + // Output image + switch ($format) { + case 0 : + break; + case 1 : + imagegif($newimage, $image); + break; + case 2 : + imagejpeg($newimage, $image, $quality); + break; + case 3 : + imagepng($newimage, $image); + break; + } +} + +function checkAuth($actionName = NULL) { + + if ($actionName != NULL) { + if (isset ($_SESSION['valid-user'])) { + $user_id = $_SESSION['valid-user']; + } + else + if ($actionName == 'perform-log-in' || $actionName == 'perform-order-code') { + return true; + } + else { + return false; + } + + if (isset ($_SESSION[$actionName]) && $_SESSION[$actionName] == true) { + //return true; + } + + $conn = db_connect(); + + $sql = "SELECT ugr.user_id + FROM din_usergrouprelationship ugr, din_group g, + din_actiongrouprelationship agr, din_action a + WHERE ugr.group_id = g.id + AND g.id = agr.group_id + AND agr.action_id = a.id + AND a.name = '$actionName' + AND ugr.user_id = $user_id"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + $_SESSION[$actionName] = true; + return true; + } + else { + $_SESSION[$actionName] = false; + } + } + return false; + } + else { + return true; + } +} + +function checkPassword($userid, $verificationCode) { + if (trim($verificationCode) == substr(crypt(trim($userid), 1813), 2, 6)) { + return true; + } + else { + return false; + } +} + +function displayCode($code) { + print "

    " . getCode($code) . "

    "; +} + +function getCode($code) { + return substr(crypt(trim($code), 1813), 2, 6); +} + + +function generatePassword() { + $seed = rand(1, 2000); + $password = substr(crypt($seed, 666), 2, 6); + return $password; +} + +function createTransactionId() { + $id = getCurrentUser() . "-" . date("YmdHis"); + return $id; +} + +/** + * Function for deciding if the current user is responsible + * for the type of object referenced in $_GET or $_POST variables. + ***/ +function checkResponsible() { + $subject = $_REQUEST; + ob_start(); + var_dump($subject); + $subject = ob_get_clean(); + if (strstr($subject, "id") != false) { + $pattern = "/\w+id/"; + $matches = Array (); + preg_match($pattern, $subject, $matches); + $typeid = $matches[0]; + $id = scriptParam($typeid); + if ($id == NULL) { + return false; + } + $type = str_replace("id", "", $typeid); + } + else { + return false; + } + + $user = getCurrentUser(); + + $conn = db_connect(); + if ($type == "job") { + $sql = "SELECT id + FROM din_job + WHERE id = $id + AND user_id_registered = $user"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { //Checks if registered by current user + if ($result->numRows() > 0) { + return true; + } + else { //checks if job belongs to same group as user + $sql = "SELECT j.id + FROM din_group g, din_job j, + din_usergrouprelationship ugr, din_position p, din_division d + WHERE j.id = $id + AND j.position_id = p.id + AND p.division_id = d.id + AND d.id = g.division_id + AND g.id = ugr.group_id + AND ugr.user_id = $user + AND g.admin = 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + else + if ($type == "event") { + $sql = "SELECT id + FROM din_event + WHERE id = $id + AND user_id_responsible = $user"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { //Checks if registered by current user + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + else + if ($type == "concert") { + $sql = "SELECT c.id + FROM din_group g, program c, + din_usergrouprelationship ugr, din_division d + WHERE c.id = $id + AND c.arr = d.id + AND d.id = g.division_id + AND g.id = ugr.group_id + AND ugr.user_id = $user + AND g.admin = 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { //Checks if registered by current user + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + else + if ($type == "user") { + $sql = "SELECT DISTINCT d.username " . + "FROM din_user d, din_user e, din_usergrouprelationship dg, din_usergrouprelationship eg, din_group dgg, din_group egg " . + "WHERE d.id = $user " . + "AND dg.user_id=d.id AND dg.group_id=dgg.id " . + "AND dgg.division_id = egg.division_id AND egg.admin = 1 " . + "AND egg.id = eg.group_id AND eg.user_id = $id"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { //Checks if registered by current user + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible - user: " . $result->toString()); + } + } + else + if ($type == "usergrouprelationship") { + $sql = "SELECT DISTINCT d.username " . + "FROM din_user d, din_user e, din_usergrouprelationship dg, din_usergrouprelationship eg, din_group dgg, din_group egg " . + "WHERE d.id = $user " . + "AND dg.user_id=d.id AND dg.group_id=dgg.id " . + "AND dgg.division_id = egg.division_id AND egg.admin = 1 " . + "AND egg.id = eg.group_id AND eg.user_id = $id"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { //Checks if registered by current user + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible - usergrouprelationship: " . $result->toString()); + } + } + else + if ($type == "division") { + $sql = "SELECT d.id + FROM din_group g, + din_usergrouprelationship ugr, din_division d + WHERE d.id = $id + AND d.id = g.division_id + AND g.id = ugr.group_id + AND ugr.user_id = $user + AND g.admin = 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + else + if ($type == "position") { + $sql = "SELECT p.id + FROM din_group g, din_position p, + din_usergrouprelationship ugr, din_division d + WHERE p.id = $id + AND p.division_id = d.id + AND d.id = g.division_id + AND g.id = ugr.group_id + AND ugr.user_id = $user + AND g.admin = 1"; + $result = $conn->query($sql); + if (DB :: isError($result) != true) { + if ($result->numRows() > 0) { + return true; + } + } + else { + error("Check responsible: " . $result->toString()); + } + } + + return false; +} + +function displayOptionsMenu($id, $name, $type, $actionName = NULL, $editable = true, $next_page = NULL) { + if ($next_page == NULL) { + $page = "display-" . $type . "s"; + } + else { + $page = $next_page; + } + + if (checkAuth($actionName) || checkResponsible() || ($type == "position" && checkAuth("view-register-job"))) { +?> + + +\"edit\""); + } + if ($type == "documentcategory" || $type == "eventcategory" || $type == "jobcategory") { + print ("\"""); + + } + else { + if (is_array($id)) { + $keys = array_keys($id); + $id_string = ""; + foreach ($keys as $k) { + $id_string .= "&" . $k . "=" . $id[$k]; + } + $id_string = str_replace("_", "", $id_string); + } + else { + $id_string = "&" . $type . "id=" . $id; + } + if ($next_page == NULL) { + $page = "display-" . $type . "s"; + } + else { + $page = $next_page; + } + print ("\"""); + } + } + else { + print (""); + return false; + } +} + +function getEditLink($id, $type) { + $link = ("javascript: + if(confirm('" . getConfirmDeleteText($type) . "')){ + editObject('$type', $id);}"); + return $link; +} + +function getEditText($name) { + // return "\"edit"; + return "edit"; +} + +function getDeleteLink($id, $type) { + $link = ("javascript: + if(confirm('" . getConfirmDeleteText($type) . "')){ + deleteObject('$type', $id);}"); + return $link; +} + +function getDeleteText($name) { + // return "\"delete"; + return "delete"; +} + +function getConfirmDeleteText($name) { + return ("Vil du virkelig slette $name?\\n\\nDenne handlingen kan ikke angres!"); +} + +function displayOptionsMenuCalendar($id, $name, $type, $actionName, $month) { + if (checkAuth($actionName)) { + print ("\"""); + } +} + +function prepareForHTML($text) { + $text = stripslashes($text); + $text = str_replace("[b]", "", $text); + $text = str_replace("[/b]", "", $text); + $text = str_replace("[i]", "", $text); + $text = str_replace("[/i]", "", $text); + //$text = htmlspecialchars($text); + $text = nl2br($text); + + //Prepare for preg + $text = str_replace(">", " > ", $text); + $text = str_replace("<", " <", $text); + + $text = str_replace("\n", "\n ", $text); + + //Wrap emailaddress in + $text = preg_replace("/\w+[\w-.]*\w+@\w[\w-.]+\.\w{2,4}/", "\\0", $text); + + //Wrap urls + //$text = preg_replace("/(\s|^)\w+\.[\w.?&=\/-]+[a-z]{2,4}/", "http://\\0", $text); + $text = preg_replace("/(\s|^)\w+[\w.]*\.[a-z]{2,4}[a-z.?&=\/-]*/", "http://\\0", $text); + $text = str_replace("http:// ", " http://", $text); + + //Wrap http:// or https:// in -tags + $text = preg_replace("/(((http:)||(https:))\/\/\S+\w)/", "\\0", $text); + + return $text; +} + +function printPassiveDay($day) { + print ("

    $day

    "); +} + +function printOpenActiveDay($day) { + print ("

    $day

    "); +} +function printCloseActiveDay() { + print (""); +} + +function displayLogin() { +?> +
    + "brukernavn", + "type" => "text", + "attributes" => Array ( + "name" => "username", + "size" => 12, + "maxlength" => 12 + ) + ); + + $fields[] = Array ( + "label" => "passord", + "type" => "password", + "attributes" => Array ( + "name" => "password", + "size" => 12, + "maxlength" => 50 + ) + ); + + $form = new Form($title, $enctype, $method, $action, $fields); + $form->display("table"); +?> +

    Om du har problemer med innlogging kan du kontakte support@studentersamfundet.no.

    +

    Ny bruker?

    +

    Registrér deg!

    + +
    +

    Mangler du eller har du glemt brukernavn og passord?

    +

    Du kan få tilsendt brukernavn og resatt passordet ditt ved å oppgi medlemskortnummer eller epostadresse:

    +
    + Tast inn epost eller medlemskortnummer for å få tilsendt brukernavn og passord: +
    + + +
    +
    +
    + +

    Noe som ikke virker?

    +

    Send epost til medlemskap@studentersamfundet.no. Oppgi medlemskortnummer og en kort beskrivelse av hva som ikke virker, så skal vi hjelpe deg så fort vi kan.

    +
    +query($sql); + if (DB :: isError($result) != true) { + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + return $row[0]; + } + } + } + else { + $sql = "SHOW TABLE STATUS LIKE '$table'"; + $result = & $conn->query($sql); + if (DB :: isError($result) != true) { + if ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + return $row->Auto_increment; + } + } + } +} + +function get_file_basename($filename) { + $pos = strrpos($filename, "."); + if ($pos === false) { + return $filename; + } + else { + return substr($filename, 0, $pos); + } +} + +function get_file_suffix($filename) { + $pos = strrpos($filename, "."); + if ($pos === false) { + return ""; + } + else { + return substr($filename, $pos); + } +} + +function get_repeat_date($date, $offset, $frequency) { + switch ($frequency) { + + case 'daily' : + $newDate = date("Y-m-d H:i", strtotime("+$offset day", strtotime($date))); + return $newDate; + + case 'weekly' : + $newDate = date("Y-m-d H:i", strtotime("+$offset week", strtotime($date))); + return $newDate; + + case 'biweekly' : + $offset = $offset * 2; + $newDate = date("Y-m-d H:i", strtotime("+$offset week", strtotime($date))); + return $newDate; + + case 'monthlyDate' : + $newDate = date("Y-m-d H:i", strtotime("+$offset month", strtotime($date))); + return $newDate; + + case 'annual' : + $newDate = date("Y-m-d H:i", strtotime("+$offset year", strtotime($date))); + return $newDate; + + } +} + +function getUnreadCount($type, $dateField, $userId = NULL) { + $db_prefix = 'din_'; + $table = $db_prefix . $type; + if ($userId == NULL) { + $userId = getCurrentUser(); + } + + $conn = db_connect(); + + $sql = sprintf("SELECT COUNT(*) FROM %s t " . "LEFT JOIN %s tr " . "ON t.id = tr.%s " . "AND tr.user_id = %s " . "WHERE t.%s > NOW() " . "AND tr.user_id IS NULL", $table, $table . "read", $type . "_id", $userId, $dateField); + + $result = & $conn->query($sql); + + if (DB :: isError($result) == true) { + error("Get count: " . $result->toString()); + return false; + } + else { + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + return $row[0]; + } + else { + error('Get count: No result returned'); + return false; + } + } +} + +function getBugreportCount() { + $conn = db_connect(); + $sql = "SELECT COUNT(*) FROM din_bugreport WHERE active = 1"; + $result = & $conn->query($sql); + + if (DB :: isError($result) == true) { + error("Get bugreportcount: " . $result->toString()); + return false; + } + else { + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + return $row[0]; + } + else { + error('Get bugreportcount: No result returned'); + return false; + } + } +} + +function reportBug($type) { + $GLOBALS['extraScriptParams']['report-bug'] = $type; +} + +function displayBugReportForm($type) { +?> + rapportér problem + query($sql); + + if (DB :: isError($result) == true) { + error("Get id: " . $result->toString()); + } + else { + while ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + $id = $row[0]; + $sql = "INSERT INTO din_division + SELECT id, navn, tekst, telefon, epost, '000', 5000, link, 0 + FROM din_forening + WHERE id = $id"; + $res = $conn->query($sql); + if (DB :: isError($res) == true) { + print ("

    Get id: " . $res->toString() . "

    "); + } + else { + print ("

    Division $id inserted

    "); + } + } + } +} + +function import_medlemmer_from_csv() { + $f = file("alle.csv"); + $conn = db_connect(); + + foreach ($f as $c) { + $c = explode(";", $c); + $email = ($c[0] == "") ? NULL : $c[0]; + $firstname = trim(substr($c[1], 0, strrpos($c[1], " "))); + $lastname = trim(substr($c[1], strrpos($c[1], " "))); + $address = $c[2]; + $zipcode = sprintf("%04d", $c[3]); + $phone = $c[4]; + $birthdate = rtrim($c[5]); + if ($birthdate != "0000-00-00") { + $birthdate = explode(".", $birthdate); + $birthdate = "$birthdate[2]-$birthdate[1]-$birthdate[0]"; + } + $id = getNextId("din_user"); + + $sql = sprintf("INSERT INTO din_user VALUES " . "(%s, NULL, %s, PASSWORD('hemmelig'), %s, %s, %s, %s, %s, %s, 0, %s, NULL, 0)", $conn->quoteSmart($id), $conn->quoteSmart($id), $conn->quoteSmart($firstname), $conn->quoteSmart($lastname), $conn->quoteSmart("no"), $conn->quoteSmart($email), $conn->quoteSmart($birthdate), $conn->quoteSmart(22), $conn->quoteSmart("0000-00-00")); + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_useraddressno VALUES " . " ($id, '$address', '$zipcode')"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_usergrouprelationship VALUES ( + $id, 1)"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + if ($phone != "") { + $sql = "INSERT INTO din_userphonenumber VALUES " . " ($id, $phone)"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + } + + $sql = "INSERT INTO din_userupdate VALUES " . " (NULL, NOW(), $id, 'user imported from csv-file', 1)"; + $result = $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + print ("

    user $id - $firstname $lastname inserted

    "); + } +} + +function import_medlemmer() { + $conn = db_connect(); + $sql = "SELECT id FROM medlemmer WHERE id >= 5"; + + $result = & $conn->query($sql); + + if (DB :: isError($result) == true) { + print ("Get id: " . $result->toString()); + } + else { + while ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + $user_id = getNextId("din_user"); + $id = $row[0]; + $sql = "INSERT INTO din_user + SELECT $user_id, id, id, PASSWORD('hemmelig'), fornavn, etternavn, + 'no', epost, fødselsdato, studiested, 1, '0000-00-00', NULL + FROM medlemmer + WHERE id = $id"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_useraddressno + SELECT $user_id, adresse, postnummer + FROM medlemmer + WHERE id = $id"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_usergrouprelationship VALUES ( + $user_id, 1)"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_userphonenumber + SELECT $user_id, telefon + FROM medlemmer + WHERE id = $id"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + $sql = "INSERT INTO din_userupdate (updateDate, updatedUserId, updatedByIP, updateComment, updatedByUserId) + SELECT NOW(), $user_id, 'localhost', 'user imported from dns_medlemmer', 1 + FROM medlemmer + WHERE id = $id"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + + print ("

    user $id inserted

    "); + } + } +} + +function moveLinks() { + $conn = db_connect(); + + $sql = "SELECT * FROM program_linker"; + + $result = & $conn->query($sql); + + if (DB :: isError($result) == true) { + print ("Move links: " . $result->toString()); + } + else { + while ($row = & $result->fetchRow(DB_FETCHMODE_OBJECT)) { + $concert_id = $row->parent_id; + $url = $row->url; + $sql = "UPDATE program SET " . " linker = CONCAT(linker, '\n$url') " . "WHERE " . " id = $concert_id"; + print $sql; + $update = $conn->query($sql); + if (DB :: isError($update) == true) { + print ("

    Get id: " . $update->toString() . "

    "); + } + } + } +} + +function subscribe_mailinglist($user_id, $group_id) { + $group = new Group($group_id); + if ($group->mailinglist != "") { + $user = new User($user_id); + $sendto = $group->mailinglist . "-subscribe@studentersamfundet.no"; + $subject = "subscribe"; + $message = "subscribe"; + $headers = "From: $user->email \r\n"; + if (!@ mail($sendto, $subject, $message, $headers)) { + error("Ikke kontakt med server for avmelding fra epostliste."); + } + } +} + +function unsubscribe_mailinglist($user_id, $group_id) { + $group = new Group($group_id); + if ($group->mailinglist != "") { + $user = new User($user_id); + $sendto = $group->mailinglist . "-unsubscribe@studentersamfundet.no"; + $subject = "subscribe"; + $message = "subscribe"; + $headers = "From: $user->email \r\n"; + if (!@ mail($sendto, $subject, $message, $headers)) { + error("Ikke kontakt med server for avmelding fra epostliste."); + } + } +} + +function registerCardNos() { + $conn = db_connect(); + $sql = "SELECT cardno FROM din_user WHERE cardno IS NOT NULL"; + + $result = & $conn->query($sql); + + if (DB :: isError($result) == true) { + print ("Regsiter cardnos: " . $result->toString()); + } + else { + while ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + $cardno = $row[0]; + $sql = "INSERT INTO din_usedcardno " . "VALUES ($cardno, NOW())"; + $conn->query($sql); + if (DB :: isError($result) == true) { + print ("

    Get id: " . $result->toString() . "

    "); + } + } + } +} + +function send_welcome_mail($user) { + $sendto = $user->email; + $subject = "Velkommen som registrert bruker på Studentersamfundet Inside!"; + $message = "" . + + "Hei, $user->firstname $user->lastname!\n " . + "\n" . + "\nDu har nettopp registrert deg som bruker på Studentersamfundet Inside." . + "\n" . + "\nDitt brukernavn er $user->username. Om du glemmer passordet ditt kan du få tilsendt nytt ved å besøke lenken under og taste inn din epostadresse. Her kan du også oppdatere din kontaktinformasjon og kjøpe/fornye medlemskap i Det Norske Studentersamfund" . + "\n" . + "\nhttps://www.studentersamfundet.no/inside/index.php" . + "\n" . + "\nmvh" . + "\n" . + "\nStyret i Det Norske Studentersamfund"; + $headers = 'From: medlemskap@studentersamfundet.no' . "\r\n"; + @ mail($sendto, $subject, $message, $headers); +} + +function getEnumValues($like, $tabell, $host = "default") { + $conn = db_connect($host); + $sql = "SHOW COLUMNS FROM $tabell LIKE '$like'"; + $result = & $conn->query($sql); + if (DB :: isError($result) == true) { + error("Get enum-values: " . $result->toString()); + return false; + } + else { + if ($row = & $result->fetchRow(DB_FETCHMODE_ORDERED)) { + $options = explode("','", preg_replace("/(enum|set)\('(.+?)'\)/", "\\2", $row[1])); + sort($options); + foreach ($options as $cur) { + $list[] = Array ( + "id" => $cur, + "title" => $cur + ); + } + return $list; + } + else { + error('Get enum-values: No result returned'); + return false; + } + } +} + +function strip_nl($string) { + $string = str_replace("\n", "", $string); + $string = str_replace("\r", "", $string); + return $string; +} +?> diff --git a/inside/getconcertinfo.php b/inside/getconcertinfo.php new file mode 100644 index 0000000..acb22a1 --- /dev/null +++ b/inside/getconcertinfo.php @@ -0,0 +1,29 @@ + 0){ + $sql = "UPDATE weekprogram SET " . + " gig$store = $gigid " . + "WHERE " . + " id = $programid"; + $conn = db_connect(); + $result =& $conn->query($sql); + +} + +?> +
    + +
    +

    name); ?>

    +

    time)); ?>

    +

    intro); ?>

    +

    Les mer»

    diff --git a/inside/grantcardno.php b/inside/grantcardno.php new file mode 100644 index 0000000..eb25c78 --- /dev/null +++ b/inside/grantcardno.php @@ -0,0 +1,16 @@ +'); + +require_once "includes.php"; + +$userid = $_GET["userid"]; + +$user = new User($userid); +$user->grantCardno(); + +?> + + cardno; ?> + expires)); ?> + diff --git a/inside/graphics/bar.png b/inside/graphics/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..5de52473e4f0b26df49da7cc93c64c01705bb4e4 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^j6lrI!2~1?-xTZs2^0spJ29*~C-V}>VM%xNb!1@J z*w6hZkrl{SNcITwWnidMV_;}#VPNYDQm5lc@qc+We*U^o2;gW-gO3@TlF86;bF cG02oGm>Dd%XWp@cAjdIyy85}Sb4q9e0P9UOF8}}l literal 0 HcmV?d00001 diff --git a/inside/graphics/call_to.png b/inside/graphics/call_to.png new file mode 100644 index 0000000000000000000000000000000000000000..17a11c322ce862c8add8fe802c66cdc65984302b GIT binary patch literal 788 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 MboFyt=akR{0Dl-UC;$Ke literal 0 HcmV?d00001 diff --git a/inside/graphics/payex.png b/inside/graphics/payex.png new file mode 100644 index 0000000000000000000000000000000000000000..64a3efb336c214133d864872dd8e0de390a30718 GIT binary patch literal 1620 zcmV-a2CMmrP)ghw00004XF*Lt006JZ zHwB960000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU#08mU+MGP@} zT2otARAce;_tM$rnWw{Xgsoy)U*VK9q_N9$iMBCKh&EA+N@A9>z0!h{wjMowGemL% zC2if}>uX(HBtn7c>+vo_b-jc_mZZW9EOOP3H<6>oeP>w&CT{tlD;+y~7&v4KjSt*W`MPvJy0V?CP=ue#8Lmbg!6m=ZH~_xSrc zRE!WYb?))@>h1IA>hR_1@I+yn&eY<5khM%?mw%774l{hd#@WY+JQOr{xWd*CFm$oI z(g-kqpRC7~qrvZ+F9$Dw5i)i`TagkqdjKVN2r6(+O)h7~q?E=z|KGX4tm%hKZXmK;%NnKwpo#m(LdFm!Ezsk)+xlcB-lk6E%7TFn|# zs3a>ua`>Ac|L(}{@bvwmDg2=-{-G(IOJJw7 z%<}a23Nw3dUt1S8c+rhHZGozDhOP-Qe!|M!VtAyDoxHTZ(_>RB9{>OX+DSw~RCwBA zu+7f_gII1J6yTQbk^=<{P&L)+u5XHvL5q=1H9}28&CQ$~>(X3dH5LR=^U96NfUBv= zdT$U2QloEOi~!fwb0y(wmI@wLvfCMBs-5d&$^Zk$vajzzQnOq_OUWd9XVR*t%ND3W zL5ko_DP(gDI9@b2%WLI5nY5uU4+6CEQUg)ctOT25$@t3tA|pE#s8|)EsQEfY*_>m` zEwFo%lRG*hfIzh{2StsoM(q@szj6Xom4kzWm6-xzYHr3CqJ$4nO|m72w6ye(DK!u^ z#eoKo33IoL#U#da&m+`C;1X#-qP8%A54M=H>?MneFc;Fuf z59gd#Ah?rrTeQBivc3_BKp4mr2rF)_$jJdpF&wEC5D?gV$t6b-2*TVILtYlX(kYt5FwMcN$H=4qU6U`f=CjXk>vXRRbUDQdYkF$7_s!#!>oel7W~k!L z-Q#DN>mVodU5ID(FL#Ej^|>|=W5ZnB!(wA&UBd2KoUmwNT~h7t?%t&65|-mq zoukMwEl!xXx&oLYD?lLQC$pE=?7!B9K#-FI#lUc`%|QmWwYA?}P(*S70t^6%S&>rw S$sS+;00003?#4ne^UZdEa{HEjtmUzPnffIy#(?lOI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+5i=?1^9%x0_p$%|1Z5c|1OZlR1)MD z{GZ|Jb^|XUPubJOF{I*FQbI~f0t>Uk(E|+$h6)ip9AeDNB$mZ>R5CEKF>uK-SYF>} R_XVh&!PC{xWt~$(695~2GN%9l literal 0 HcmV?d00001 diff --git a/inside/graphics/star.png b/inside/graphics/star.png new file mode 100644 index 0000000000000000000000000000000000000000..b875a204c5c291d229227ec42b341e962536a73f GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CN!3HF~3v%Lt6id3JuOkD)`V;1?T`z%r$r9Iy zlHmNblJdl&R0hYC{G?O`&)mfH)S%SFl*+=BsWw1G^F3W0Ln>}1r5)h=(-^_jA-~9* zfki;CM84yB@?-`Mg&Ym}j{nXZZFZ?RFc>|k!#!PH^7;FH2f_JD8h0*nF< z3QPEpyr1ZEwAJz46Lt=T6yF~r``cF~0`;ee^gDm7OqtBc)WPX_m|3Q=fbr&E2F8{( z2N^p5GIp+QSR<{_aKW@8$CDw+F=K_T!*vD$hZ7$1?G-jg>FVdQ&MBb@0RKZ*D*ylh literal 0 HcmV?d00001 diff --git a/inside/graphics/tick.png b/inside/graphics/tick.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pP)0ff@RSh-+00M{+*##LU z!sYtX|Jzx)7#aTo`M-YuXZZ5{AH%CJ|Nr0mz}md!;+uMO0{{Yu37KOc@wbB$sQLY; zzYOm_|7G~{gMr~66B`2yGYg|2>z@K_E&vE16azj0HA&iMF+}B7GdKn&F+Bgu!tnM7 z3&S@S0R}D(CeFo`e(dN500a<97>Fnczq1dF75a5|AA>9l3qx{d76Ts-7X!bR3&YON zuSV7zDZhFbIlDF?{*M%)s#O7BDcmZtKQR{e^A- zKmftLAmOu&b@D@pdpj5RG4L^bWME|B0Ah9q9_C*R2bT9ToU`WDO^@w z_X_rZ|NbU%GDu9@G0TGC>dYvH{|pedj6f(Ay_8|rAx{PsX*q^#PtP%|NWabqGXNj} z06_r0{{a(8sR8=^0ACUY8=tqBG62p12>{OU008~bJ^=py{Q&y@`~dp>`~VvfBLFTO zJOIkzz5vnW$o%;H`Ub*u?*9UaMS|_)D*ai47otSQcw`t&uSgU|4l+JHr`C z9|q?Cj12$&{AXbL^9!u`;oI8`zk#m!^Y1sq@4vqpKK=a6U?6MD@a6Y6mXr67`~V0b zCT2!PCKh%sh9f85FsQJ6WBBonf#D|*|M>HR;SbR1;(T%p5`6LulKe^xtjwGYqP)@! z=N=zrIC}TUjc>mg1ONhv@$#bF%3s%aG);Mt$Z+MqC5uj^Jp(9&-rrMY`0?u(FbsYH z4g1BQETYL^q2$JJ=Fu^R^Y@Ovdhz3{+_Sd-KLG*=919OtX7SFyB+a(ynttp54{yDh zS-FH57@1fZ{sH6S@1H;a{`~mD diff --git a/inside/images/products/1.jpg b/inside/images/products/1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bae2101836ebccaa2ffea7694010a3092243c572 GIT binary patch literal 24244 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 s3H7uvQ9u5<&za45EwPiRgk5y$7SW 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 literal 0 HcmV?d00001 diff --git a/inside/images/products/11jpeg b/inside/images/products/11jpeg new file mode 100644 index 0000000000000000000000000000000000000000..544d38e1a619e133968b61486d8f048112808d82 GIT binary patch literal 4999 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 l&YKe}7OxR2l1+inj}?V=qDebWcvUB literal 0 HcmV?d00001 diff --git a/inside/images/products/13jpeg b/inside/images/products/13jpeg new file mode 100644 index 0000000000000000000000000000000000000000..e3a390a19bb1fc3f86a6665d297df0708589343b GIT binary patch literal 4923 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 K-1w?Q8v75LmrAYx literal 0 HcmV?d00001 diff --git a/inside/images/products/14.jpg b/inside/images/products/14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e6e138bf5fbdae8e7885df59f3129d74b758802 GIT binary patch literal 41064 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 Bsn-Ai literal 0 HcmV?d00001 diff --git a/inside/images/products/16.png b/inside/images/products/16.png new file mode 100644 index 0000000000000000000000000000000000000000..93fe53bea74d563e0e261df08cf3e04037432d9b GIT binary patch literal 5767 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 O05xT8c$t#b$NvMzZ}92> literal 0 HcmV?d00001 diff --git a/inside/images/products/17.png b/inside/images/products/17.png new file mode 100644 index 0000000000000000000000000000000000000000..93fe53bea74d563e0e261df08cf3e04037432d9b GIT binary patch literal 5767 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 O05xT8c$t#b$NvMzZ}92> literal 0 HcmV?d00001 diff --git a/inside/images/products/4.gif b/inside/images/products/4.gif new file mode 100644 index 0000000000000000000000000000000000000000..0581c3d6a89d0a34bc294cc986738a6c2042bde2 GIT binary patch literal 32551 zcmWh!d011&*PgrNW)EQx5Fo4u1PKr@DAk(;Fn~)yP*l{QAc&{|QR3R0g%A-nDk>^! z5JgmM<62bIu!xALamTF@w!!R zbnxzyp|7v!rxUvqCPrO6YB*kBb+h~8+cz)zAKkfhu6cL$qT@Sfw$`uu_Tk3=ZXb2L z+wTmzpZRzPQl3cjmLU-Ip$%zi~o8{NeqLpXx({(4uKhYjsP$_3KX@-CbF! zdw#yK@4VsIv16B-3LoF@`K|ZJlbe^mUal%FataOg+*6h07{0V;Pu;)2KiOBis%q`x zr@c+W5M;*UqN1Wj@1ILN*U z*7QI6>%O$E*}JnSCp-RV&7$O_fNK4WU7J=GElR%G7@w08V5r1D4Bgb1dtExeH*SMYb1+ny@lZ&5sudK|CXgN}pni>E2WYwkfRa+b`HU4y7AaP%7q6I+nU;L<{OVEBoIfuY{`{u5{zy$;esuTATG{lF z`aQC=-1*-I*O=C1ynl22Y_+%`fp@f~A}j_eULiSo%5Xpx{o(U(m(9f=p6IsjS$pza z-35I?O>JRK?F>=EILFBN`Q+!%pB;~meE9Ie@$+Ga~M5-Z~g4} zeDd76&yEi#&z-D4Lew9b?Rb8C#JYelCmmf{+o+hcC% ztYQbH)yqyDy0(cETl~D|RO9unJZUvI_4MHzJNVO&=iWGdtlz?rNw+ud04XK;`zxh}%|EhhtY+E|5u&A! zO>YP(il0wmqMAv3$0i0;JjEbr?UuTtEbcUdKg>91Wya7V%xo$Et zmDQ8nJh-IS?QW;1MhRfDp^TTzb)Jmlbkh5V9@?8=BN6{5OYZ0F`at=Dq6+TqM3q@= zF)FFiAQ&z26(X{Jb$m1xAA3>x_~c`LBO^=xzb`xDnhfeH7p~}~?3CeRM>}alEqSpE zsLR7(kOU}#q>?l|KBYwo9TKgvL3HPcyd<}IHLt?6gs6RU$^0A1GYgJAoIQi};>)|t zD#EXSh_iR~p6-+pH!PqKo8yH#UJ{fy{H8Kts1L}z zQYaaE@*SC}FFU(NASFe2*>*D7t#dxye*W=9RN92}ol*eRm?(aWZ4fosN8x<^eohHH zC5&5pNDQGWb_b%Ue~csLDggX<23wc`)+uEYe{YrZW{}>8*9F9>Y+8D6)<<+_Qjvps zkR>t2rUAam#?b97=ze;~NV8c1QFb*aF4bO}!u=BYfbJL+eY z^o~Y!1RCd&V@qP+Ki|l3<9%v4E16Gtg}c0SJvEv(IKng?4?P| zc6+^Y`?Bvu))pygwFD~4(~b?`<6jtY`GU^I^d7-M5IY&ygUILYDgK_hM(U`8iM%^w zz;n_l!KqDjnVKxJBsYjm5KvisM0TmmE^Fl~zQyO6smf=~DI~d%H9H)Wb9QS=+!ndc z|2^b%*+_z{84%t&3H!K5oO6iKI@Ov;u|*JF6rvl0s(pLqh?o0o{nyHY-I?}4uL>m| zCG4d9mMS6jd}I_&hTRt{?qfPTEC7Kt>k$69EqW*5;FXWZ2TRIHJJ)9Cc}(lkvYMia zLggzii;&RjPwl^)!>7H?NfFiNIVkZe4N8}Hu&g}v`*I#aGA0K;8jHmAn7&K2p}bv2 zD0-)wbd-lUzbE*KB^JnQi219Z6!jPkV0p8W88FW4}fx*?Stmy2=>oM^j zM0QKw(d!*j2(>wtvU$!di)C_<5&F`%9k>%Xm1c&JG+40R5#=Va6TIwy7MEC@ z8|z+0sW5bs(lP{Lx&YReH306j*0GJLAc@x*gxW}f>s~sIvE!sPHeJYN&v6F`h<9d{ zWp#Rvx0x^s!93N_N17|Lyf9_xT#4zDmpXmSvU5kd+yI(?kJe)Yo=s`(h0|ry7!Na% zT5yus<7a6H{KS+Vj)kk6Clt?{WGwaSsEfKtho}eIq6jZW((N!uVy7(^K@PW#!-tUW=q+rZpl0`@@wv%6 zT@4oSFjCrLiYF?DCm8eHr^*;lv z(PCox*NJDmGoobBIGyIeg%|$ado>gNYZDq<`@NNWUFl|%vncBGl^OctK6SyZ7I+jB zG!#D%58sMB&^MIsd9dykWt^bHrFa_v>;SSvp?1RTtmNR6%vY2O_8L!8fC*-^%^K2i z9^K=h8V#0dJC|eyRef;zbyl62A+b%5I@>_q-QKTDYZ>^vg^Cyrc-O ziNc8I5d>Ug2e)jn)r6Es!=V7m%OJ70d)ICAOpkNBSjPOvw5)2na6Uva;E2SGHXF$+ zEihThT5rTw#u9C+HW;~qJ#xc7B^LYy2a5KN>gMm9aHjUWjM2`-yVBbX^h$|szq zumTsr3^zL!o0iARSubr+!kM*?OzNHGZbQ4gc8aA8haAq_O@3>ISOm=<&>|&FXDfZ9 zLQSxhXN-`u1#vdfX>69nm^r!$wVM_O+es1K3p5Jd4R%GuF0AX2uJBPvlG5*59?6Nl zh=v0TL7Ezm9ga5GS7hwZMC$JQ%+(ex#eqjNvep8nDTquq^xDeUPtbzo%w4uzy@K4S zA)mw{4=W@89?8ZA_e{Rk_tlA~Mi&IEooZgoSE3#>p;Q4?X+*CGVmm%ETzMpKJJh6s z7-saeH6;mAb+-dQ+Z)U^=bMP1O2F-8pm_` z(>gP87k>@zKgI+Ihk`fGgk%em2n+1>SHe;v`Y(5n7{#`d(-9E@RwJ0X&IKI=^k(I@ zEj;A4faz;2a95x$Z)QK*;iiffX0XAB{?yS{Xi&o1#-mI1V1`1Dbzvb2%^5&xHd6Kz ztbRE(XE-v=M*BXDT*#wpZ*22Ph0n=~gQyh|O=#72!KL8RJ1Hrw-I%i+3&4>nS^9K2 zAeqto6zE1WI8|G)n!_App>RgR=?0!;WsDPuA6udKawdz|#5I#&+Nm1^*lc55ybTRg zfJxg8;*6;_8`@}vezw783kb&QWlFy zsf>p(qktXxiU)a^m}H#wh>aOeL#Q1V8Bx6rePv=8Y*^(>>RcRc7El%{5I+-Wl%prz zw|2jE)ncqSS@2sPtWJ6*cx?`uVw}h4wP=-8BG@TV7fD#q>w80v$#c3Mjwh(Cx*C(g<>f6{pWlw{wrOPK<&52tks7>EG)S%JdFf#rxRP_+qK zD$4{D9|b-P0QWUHZv%jrg}UBI-6NRia9#ozRE#;oiMBznOw0{ddcip48-cJaAOlC) zRxoHp8jY~M)i>j#tM=Etcr(nBQ_`uqU-YyT0gDiX{<{kS(I06$B?=;N_Q@{?# ztf1a-@^W*FeKGyK`Hbc*^{j%-GLmC#e9dh0UHjrYM&My)dMLtn@*rkB%Z)dNDUWr+ zy>FM1VFN$Y42?EIGz)XG5-@q7)jD(KQ?lGjzBH(man8E}=q?UT1$1u{nrVi=v6&nj zfOrgd97@SXHG^a3KXGk-C*=re8!TX@5puCYp6m*iz1Yc8fm*1Sk|I`FPmebiTL9)_ zW`^-7TWqu&;9y@kdBUZZ^ET>CocbLPkrYp;nK>a&NjqwyTL>zmqjsgYeeFd$d?1Tu zd%(^_u{`uJM2_S+O-JA(W+)%WEJo_0f9kk^deUKs8!eU5V^cOBf|jyjrVaVWI%~X* zUKh$}worE1;{8mFFiYym0;amjwYZ%zRgSJC5R)Bx$cA1OQ8LXS(@23WmoxN4o>MC?Gw4WIq>?gSTI!mZ!n0t$3iC@I8e=9$`jpNqhyLs4@p&ZQto&Fx z`HYAfPTYq07uLY^M4vA)awFdlaSG z3{{x4uWiiv3-bjIfOr_mWdce_3H|hMXO=6-Cx}ZP6t0L3d9yn=JoMMFdte3VBUT;*B~T$?j#a{wlt`Fd_Nm9kFZ!#j-9;2jNSyuXA7huND3p1Ox<%? zL5?A2N^CQdxuh?=Pw%QJff>2lUdBO9_#cb?Q#NC*6 z(0bm{t63m~z%JR-%hpijX5oB0De$|aU+$AhJY-^ObP9n~*-5MRZW<40$&Qe{uI$VR z0*NP(Bmv^ZCeLS2&IF_vH-6&S8EimdDJb8|M{a(y)dI%KQHH(n9^v(@&1J6}s1#u1 zjI03MiEpNEP=Y&3ryDJlxeDa``{dJh>MMCn44Ao*z-9~JmB9bZx2gSy2v+cY<_iVu zS3B%7Z@^>fz-u{chz%dK!makEW07~Ozw71HL-!4=Y&+yl>@%Du|CowCjzPxRQD+=& zbX+&srXcG6mIJ`KiI^_croDWlpw%mBA+84JP>$%zgzz7g1da=AaV!Xmpxn0rhTM zv!}ZH_b`%8*er`va#N76LJCZ*3?hQm`26r)EZqXncV-P(SbJSa*;Z-+ZzPnE-!6b3 zc+^ci`Zk3+mdHH6zBe!bS}UFGa(ig&6~>M+_65my#OW=(++O!H<1U-|Le5g+V6~YZ z^(MLNlRwE4$i|Uz1gUC4P_=cer5#Sit4VgT0i=(eg8q!NN_bNaK7zy!68#gKIcS0p z3D9H#tzIa*O+1XrTRUqWrO8NI$z$DNi!)42=YLsxTQatTeBl%tVnY7VQs@6kSqdm! zGsX@P^!D1#Kj73J`JI<$RC8eBGD~QtmE1}o-&pqT2kbZHpGosStCoLW^}Su?^mg|j z_Fv5`R7qaHlOL0~VuKZnw!=a*e0fd8&}iQPd%|Ex2+0lwnMj$};BPqVt2LeB!Q7@? zc}~unYDW^jM<5FrOeuc^KE*=JDff^QcJx*@v_VeV0VuvkFwWRlk_ja2^w|U?Ka0A` zE4NyGM2ep(*x~aADKR3%{|YLo5$2&(k`*3s^bJK>8OXuUFDHIm{rzX^htIpG+Mie% zzgn5U5!xk77LB(&&66*Q+|J4Xq^LJoHDI?IC~~>obrXffb+es2G?heo244tc|4xKV zw9by>9Zh~<^qEwSDz|qK!or7j(f>WZ_d2~Uy5ROr&a zc*{KJuAO(){0^5unzs;VALemM5%Ee}Z`>5DlpShsWrs2j2o}e$BmR1se7@w{*Oi;j z_x&-qZS}{0&)j_cA?AX5UmWuM@%%GIzg|44)vE84SmO^2g{Nz~5lG7dQc zO{8S7AunB`OY&+(!M=d3XtNl68bxzViqyWlc2gVVdzKrTaX7!J<=4`|8*{@KdYrg^ zeDucKzD4Smy+^PK&F7S_(=w{cXu2exNdb;QNcXK!S188t1J_g?UDH%;$D0@GWiTPtP6h0d~yaqSXb)4%yMOTi!41QTNeOYR#Bco}r+ozn$ z?W5PdeMxwI?P-8X>v%^AlHH)wU=lXi!uD2mS0;oD^gHIJskb7NY>0Rpl}GSk<`rU) z{y!SK<7zAHBfv?HG>84i4wpE$yVy2LfR6gFtvE(3G&C}!c9m+FV{7{Zu4Ins$=}T! z9LNv2E3psk;i~K%{()aj0q9cW$1abM=jPzOyta&A_XQerQ*VUs*#9;aS(Nb75Yc5i zvI9}tUyX}mnelB=F3zUOfiz2?>+~Cum8043k~}BO($%GK$sKmo<;=Q0Bwt5KmR)|? zC0QUq{`dE1OIy?16ML@lBEV_di&l#|zHdn4wO|V^dcyciPX}PXU3LZVd}kA@%RqBG zqBOR5?(`KlTM$v#mq=nk#_ZHt^$Qn-5`X5}m79cr7B#^WTbzG&F1~14xYJA0tQg4f zefv)Ho!RJE@SuF)nRplN^ppG3#`8`stUPbKSMiJV%b!geg1PqW-77SmPn7oeVEu`+ZoH-NkJ)QAA^ra}{eH=9^Bmjvf5)i2y_=#%d&?djGgUHgpA$%9 z6Xn?X#*3McV}GPw>2Vsd#dPl0|2rMTGIAz!7~ zOQ@)dQv|Rgc@O?(KWwHw;33oV#pJF5X6v@C>o&vwFCKhOw%C^XqWwfZdI~UY9gKag z2QitMAQ`Ghr*S%+O?X4kdwk-|SHNk3m8i&(I{&~ijkVaSoXhjPUR%Y^Nk(|z&Mn$> znlJ0L7|oLr-s6m#(f4ealxT2&V22YH8LxL831D&9xbQ&Uw!-Hy_LL8(Kl7+ekqvs# z3^~0gND*d;yv(ac{c_jkr0;?OPf~n%TI}Uq5G%oJX5~V@CdFVtmkj7S}cuuv+5XPIF z9g|tH)p8B1-&Axn-Q>1r8x}ycv)^;BpTEu7!<=l}N@D})xL^y^)(fW^JKc%~fFKw! zCUtfA{b}9h30n5nWEyi0e7WycZd<#eF?8Am760$Z#%08;zER4Lox;O+>H7%mJE0L1 zg)SqP@(6OG?W|Lud`WI;C)ynybfXXWMCEiuyoF%6-k5H0SK859YM@Ega%akQMBH>fiAH4qUKxut-517 zpT&gRo*q08;GDz1d#o<*yJVYjZ591`e9r*9Y%jvv=~CFViwDYbI-#>7so`)pRysn8 zkObmjihzbG8kAgzQL=m;rwR!+!RI7mvcz6fXno&i%=$6-34KSPNlf`hNc}d*H8C=U z&wh{*_0Fe{8W+``)ulGH%=wYNj(odH(=ILGJfpA+jcYDO7e0d|iz0G4km z4Cc{v|8=og!`zmnecOpFl*olJNm$2@Zc3gy2AM`Z9iLFvQuEh8* zzIt}oz1t;fdGwU5F;DqXt(Sj~NxaNhRuc4Junt>(Ga6#b)MlS%C_7K8=}KMdL{_Q& zg@R3hcW6WJNDeWS)xeNTVX+7wH9Lb8r9iMTM9SIa_{_qVpPo95m^XXd7KF=l`fS#F z9*AaE@H?DUDwrvdi)QxcVQhYW0wePtW_Nihmfac9oDtVz)0u5lgiO+to+~CHU)AcVq6Vy=fBrj;QWNwXY)?J<&)l7kQfGnQ-f z>a}+k(%9JGg%0RtvpBfiRu#iHVHwnRVTpCma^XV=8e`}gH-B=0*P3j|f{k$U{&J_Zl=Y{h2rAe-1v&ik><2r=c5?+`Il z1l+8|JmX&9IyI^w3z~_k23Hx5+)b@qSzuu%I|hy0md*`r@ZQCB+a1aj0v4%Qcu#>%w&q}oyyiDrgo z^=KBD)rg8Ts+Bypb+4~Qtt=vYD4>dFlJ^jBQjrc#hm0cV#hE=zhGPmunrNFQ+X^io zicjgG1mMK9|9r=7iwm)ZM;S&iHVv-`jFuDAdcbNKa&lWG%S?>1LDMWq+Y0&xL2Hao zL{UJ3`a?x~C&sK3?Z3CleR^WC4A9M>NRBP7)0dcI{ZDr??Qkgt+dW-VPSvtZz^Pfi za0rSYh5}TiwFeRm!K>s1o5zGKq^$d#u@+F=k12-XM7b_6ymiU*j*g*A zshheP7Pa$<6q#0dHuY53bZPux_tN2%EjO{x?NQ=Zf}#TG#qeRJZkz!dx%|l-Z8i_{ zR*}&mc&+WIuL4cAIiYl9o-;cQIU7WwVj)un?e%d@a8Yt<`<2?w2DNg6^t*dA+4qsFx(z9yp7 z0+@1C*rT3khfx`k%Ht+B1F9XP7|=DK%9Tgpqcwg4Qd^0pQb;T>l3khXu}B091=q%! z5#Ks}j1oK}u&6qOV9Fas)JSFJERC01|UcZry)gq9W|iB>T3I+u%Xjk%Ya z;!J*A9%|x-|1;;-pQkpxZ)lDB^X!YPv;qS2G^sraq*s(>uW4j2GW0@Qe=>p*Fk>|oL5{6aBF6>@q2f>(;WZJj z1g%xx9AYW1YqSzxW&_KPl!-b@NAP+ZJl)E~D3$B@8h}H!)_e6CSfNP0-n4zR9i3%X z7xeEKH;koFU{2i;e+yUEy4%|dLVxQ#(cYMN4Pj8o-?Gp|1LBiYRb;@lJ8nIYNS71c ztXstRIw**Ds=+O-RV@8q=dFhs{>9B%N4};g>-3(H*Xc&ciC2|sCDyzI|3y?e*d`E! zn+FiNgtz_jd%LzTn*Ab?-BI7c$k@Ld!K zlr?MTaauz7&559Dtr=a~T9s{g4qHFV*t}=&wLSYH;b@a)bdENz6=w3ah@BXRSB5{+ zouCtR-eFQUJl+C%%dwMx>&6Y(Di((5e*TAcKt{S7L2RM;D9bOWvF$l=4h4lqPY6^!y2&l-a_iKgc)X4+Q zz*DB7MnV;ltqV?v?mtVXfHsjK<@M{wi{1;qSIv8Nwsq*_fOmZVvIkh1GNXL>B;5)E za<0fk)vsR?^d2qSM)$!+&MsbEK|0pOyYlG>UWm=$bkjrD|&kB)OPyV+fhZBT^yl zOe0b1BM)o6K5FXi(XDWrNhcOTd>h;r0WW-b@8>x#Bl;mX4ip3mml4=RaDJN`JP{y| zAhKT$k#EVEW&3TW8TPje3uLH3FFz7kq`1(BqBhK$BDAJzGDgb295Mup(0I9I0#>&RmZRK9_8#c&;PcF9T3y1qd zI>Gn90cMUi(xeH?sgx_gg6^9;hOryBz1GTQu68}tGsE!EGH-}9%L2u=CeoYXu{2k* zMV-1)U#n3smg_|-B+*`3by@ez6y2(jCgO%)ejulKO^QsflM-;QA;sB8njBE`{TO5V z6}mPfQS)nl`rIYyDi;RhWuY#M21OOXAruMOM{p z0u2k{f`0HrB=}=X&OIG6uwH0sy>((tjqO{Q2WMGCj@o0GC>ngzzQpbFrjP0;yQ40C z^qu+JTkM=XrHXoifR*uq7VYuPjhX+0#}{=q?XoYG>3o%>X#l17SV%l*rh_PN{$tFR zCsDsFzx`0Nux^2q9SbF(vSEbTw)e>v{h4B9<>?#KWL5ke^$5k=_bz4ZJCax35t`w4 z(_8(E8BOPtrOBz0@1%JV3R3(q2w=l$G|RN2uEDw0Czqm2v)6KDhOXfxUo58Om&qcc^=glm|b{wTn7Vu1HgejY1MrC|+e zyhQLayE@IP$Bm0_;26bLI+X`aD?$PkYQ7zDC7PS3>&4QiQ;ndA4Ve9an^Wa{e#)7j z>C#kosRd%6c@t&Ojt9MdC(F6AXUVgc#UA!Ka`EHa+aI~)I8T+D+OP5}B2XE`?3tTt zL=Vq}%axky?eMmTm}~PWR~dO?4w%V<$ULvdCrU8(Kg$ilmjYk;<=Dp9wOp#wZ~MbW z87iQVi~T24n$_WZi42~GjptVMgDuy!tY)-m_z~Q*G}*6ogTFs#dF^rXlA_>c@pUPV zQ6-Q^g{Z{kzmEf-hgPcHvVVJ#RIJPyn)(pH3OGlui)_`znwNb4CxKb9q@tuSg<6@T zUURy0>h_V84$yG;Pnf(!1pPBj4e(#DFWYq` z<8sBIRk0tw`Py96{UVOL6&OuXf(}_gxow25k_VCzADQv~WC)%yI-bciSk4 zGj=$2MR(1Ut9^UNuK2aDZ1fYeUq2RPY8}YcqX~3A?xV0 zg8Aiy9{%#c$QDRZ22y_E#tk=Yp|io@;QtnrjX2Ekpv zMKXRWuw8>Zhz2z;t@UMfpl|uvq)?8|e48HKPWGQX;bYS|*i$`Ct_;cy&?DdM(I|;gnPCFGU+Igxb9^^)osF@Gg{{9a>Epm!k zlTdcdgO+i-D+}-Ui#$mUk z&L#f_&7&_5eW+ndE0-M2`Xt%uGUI;N*!c$)uXp33C#L&)w`CFPpzmhpp3?d#6tSDV zKGgq3OQ>n+fmmS`g;!9RpBi+bDP@qCxcQm-O`lroer-I4zD2A^e9#uk{# z!E0M=`^VbOjoPyBk9Rt)bMgJf%P-%5edEXV#6_D#By6+8m}f4#J+}A3scUXrzGidt zqWUwFk()!WaGiS@8-x0}rZ0%^2 zvlT*?@fW&yTk+9{#K2Rb^?7fwERmT;3KqyOF|&(XWI&i~-jb-Il-Na@@7{kmDP-Qi z+nI}$RpWKj#=VQtu(xQgh}Iun_G!&8ULW)a+cKmR29)CX+2)BrhWj|1uesrJ;IE{B zxgs(NvuVi5MNqJkAkQcRlws!);o)_t2da)R9P+E=cd>(GB`(Kh-ZSl}p9`elnb`UN z5;>AyJ-%Q#Ai)m@<68${MO%}@^K#DvuR&bnYimHhxx!AfO(#dCd<=Q;*VF0!uJK%( z1(RIZU4Gyr{8vL1vUHe;J@@#^_>djd_bJ!C+g-LSzefZ|_UPPp@u0F2+$GqCW5XgQ z;Anhn=IH4{TXif&LW?zY|GF0nYJGB@#O))$i_A2qPF=PrdHQgNr(1xQ zRdbDvKSyabEF|vVu9jr4m1-TaY#9l*WNkjTP?~dEAwsg$Lid7v;TQN z$SlPzlqs{E_H{XT7cT;2wqpKet0-z{=I#6b#P3j@G?v`~q zKh4+z1*bay;275MXvF5O;aAQDoNE-0Tu(01I$x>l;CUa{gbqrxM;#hEarjhal#xJv z>MW;6;08Pi;v$rX@#QvbVzZVyxejrR@iV*x|GNBQBQ#@9$+2=C02B2d?O( z6K@@ezcK2^3#muOy^;E3r#Ge?`!jy@nnTmBc0c(^M4Jkp6W2(lBa{3Ec`htLlA8oq z=jGteH*5qZCP5mJM^?e1 ztokh1rKA4vsM&NWYQx`Q+?zws=(FY3lli<6u)mWnW>*yo8sHed+Bwl)jc{{Zuts75 zXE8z<&VvJT^sa#e8{^~)oImVb9vV{o%YWarUXOCL!Ov6k$h85KTO$R0pOQIh7(Y_4 z2#h=1zH#0NxPF4IiI=_JG}@N8dt;pxt_@&-bqjp&8oE<$+NeE3r1^t7yy-;delI~> z>&x*$V~?giTwZo$!r9p=@$-~bnRW|}%Ii2I&{raIE!ftqWxD)TlWJ@C$RPl!STYNK zV1oTP;i zscYFJS8b+YTTd0V?`Z*oGrElg$)fRpDY zjm9>U$68^x_ww%ea%W`ecmD>fPA^>=73n)J;Ca|XFHfcRPrLl4YQC+0xT_%0oFs!h zCzvg`Fw{VkndlpOBs_C8po?(o;^uZ}SBBmZa=4Rzv+j#SuUga;*sHHw!=;*ziwlSN_egZe!`Vk(gTvX3f4vw ziny)Vxa*&GpF2aiOOo0XC&McjM;-HkD+ zV)T>Vt6U6=)G@W~-(+I%eocg`{d!GJ`~zc@N`tjRKAiS=z80<%k2EP9&GMd-v^QOL z*N{MNE%*PNQMIys@6StJzqmJiQ9E{Q-lk*c!%m3=J*)jpur^3B8RFue!LSbslY;Tl zGWBRT0&N3;5WDqRL<$7WCyKnbj{;DLX$BvRhz7+;r~Hyn_AuXz)rZ^tnjsIR<;;5m zQK`uc3kcpT=z&xEQi4@@a~lFHrSyNafi`iJRl^Q`8VoE?_ejSov>WfDX}Ogv`aSv| z_zD-_{~Vo7J$!xmT29BFgI6Lte^KCJZUkH+9mU-mjE>~q?b9R0(MiybFiE8|9(D@n zS9it`V*h;I=vFn-*Wu40I-V08A;j*Ip8FUuYJCb#2S@gcooaA*Q9Gst&cEYo%z2z^cO2n!M^nD5(+2uBq46r55n4NF0)OiAJA$w_6h(JlcsUplL9 z>Be%PpD!@wEvZ=_UqpJ(9P{oa-PS=eTiTMrgC4aDMen8n%m?^*MNV*Hx_7yl1T4$= z1bs5$Rzyo&hLhxgDeL5X#rY-ePJO#6S>1In9v5;fOkC{LrD5s_dJf_tmu>BPB?#Ud z&}CzN>PSr`#-Z);>saw6T2}y%`orR=;Cr%+f`{wXVsNLPeA@|^U{;S2ON&68>_AARxl$iiRmU_AU*u$mXFjeP$m zy(8#j?0$(?0ji#8yMGv2!sYW$un^>bS7_+&dqXKpusp! ziAxQlwuL&Km`f2SD5Rr?B_6yEXM;q#QA1N~KL{85ziSVF5a44+IQfXL{4r?LIOFQ3 zvlgdlhey;4?Kl~6cledC{GE{Bx!rE?;Yvx?Iqr#g5an3KqIugw-zpXbZ{Jneq92@Y zsLH!IrM9Vm`|PdRpNhZbcLa^}zXXfTUA2?ftBWNtCm0}LkIP|F9HpI9L?i3*SfNEk zs3YVOry327q2Z&Ey`PSq+qNX(kU0FoK)6W^sibUn#}ACo(ZbFMotRSsyx{aGo(8o5 zQi+C?g;R283>*ftdP4#e55_0rtnd<{-L(7DgQ~x?cCZGr!kS*Vlm0d1nCa#}8E@Ad zUJ!fuDZQr?6I$YPB;}D7x5?tSt2Og-Z}-OFiHF4Fa7$lD%BW$cbFG>==zv1xFwbfU zVZc^B-1~muAj`K(^GA3t4%doD>5xB) zrL4MR^FG1eIq>DpNJpUBIKlgd+uQV>-=X}&lZRh-ZU5zBzh!wycCOLsNKn#4o%+P%%~@5gkurGfwpaD5KPe-(3;;9xQ(nhVAz zYC*l!i%^fxX^%B(eJhK%@+H11AS~((Es`Luj>r*fug7=B;&-1nyv zqeS9BQwO=L)356osn+7&=81Vq_=BC($7$~#zg@su zZF^>YZwcr3$MP&(Q`z`7m|=b960GCBC)~_xL7VjQsYqX5doGj}+n!Pc~>6u65ZYv-wV1rIr!=y-nl&QVTg$XevUTY z0>TEz_%H6HnmU#o7C+6DGKqH4S?QR%W;!3if_2J7xgQ~B9ze$IJ{0B$wq-v32Rt!?MLcJiXDmtN)kbV)QIDcML@4L$8i^_?Td4IS4D#GU^n* zDk(jQGH&eekQGOhG|VJ|)u)L{vh2K|^=BK_{x5fW^{eBI7uC(}!9M#XiE4H$;PeqO zt%Q?M$gppV5sVfGOG+uYSJFL^inzn?q}aFca;t-I7)v}DBU|qB+v%_?ktfl=p3_z+ zGE1{+9nbsraZjAy6tRnF!*Wu=lz#h%c)xf0< zjuV_HZVDxr5O5MgN|Iv3;_*W`+S5U{h=n;8Mv=v>UsFD<-ASolIn80p8iye49`AMP z@i$;>1iPb%T{y6iB4%1GP;<(p|DeBo_s&?`uI`l|Iwx-4a=PiTcoYSnv_pynNBr$F z{Lhx@u_epX$$u@nem1&-$Y`<9*5R=szy5P>fqsd~ReG0Rhm8Bbiq1Q(=Kb;GpKw=d`!e)RNDsw9AnsB&Q*zbPtm3bJ{9|(2`G6R*p(Sahh6kge2rNByru$YuvAX z=l9q7_j4YP_k4}#yBq=xk7)UJ)CP*p`#f~)0g)2G5oS0ni0WwGE?b8qo};W#QN53d z=_VoucF|1JP5Q*|ZfNKYKXdxibooFwNzwc3oq%R}MUMe0PM}fDbKqwv)n_}-k)Hq0 z!zoRnlEBU%1{_I!N&N8qU7L=ZdAi0!muzRMm0Rx$QUgqW2(98;bK&!LkBk0R?~Iy} zYwtU9{m%WW#f%YIt=5`c!}@gnW--JD@IQcPF3&-jzAatElJn^COh-j!SdOY1@(fW? z?Y&Y$Ip{WLG8Ms7s)=-Rw7uF@kbI2S;JR0{m`)wrWoX!8IVPgI?Z1$Uvpw+BITuD! z6lGYLmelpx@r+66wqpG$nko8q%67}r4=+C3#wq=JId^Mq%~54k#IN7~uhu?4w-1RX zx7)sCr-#n2zTBy8$zuv&l>(ZmTUmoW-X) z-4pTjN6hCu6ZD^>`Y1eO>p%Fjy8UY0;p-zC6UOC7EE?y<2K(An0Kg6SxTV2B&IU3S z&TiKo272!?-|$CnooOd*pW#vj+O0%!Ow`#c!$~44sVgyjxqM;})aW~_oeLQ}(|GTa zVgGX9un`>dAX5J&PbW~MJO&^|9lZNeZgZn;iU;i%l>S+)0pRS72c+@Hr&%hQl@MXJ zVZ5MwVs21^ql4}ZkKWr9sWRNxDjIDZ@t{aC9*R&$^A{QW>WCH;} zv5?~yxaK?YG{Nn}?9g;|a+xidu<#+O$tOd{%s-X;>Uw3b@y-D^g@S?eyMLT>_>X-; z)9m1uzL=4u=WG*MIq&G%g72N|)Rgl8f;pN%Ykd6cYCz)-9T6jQHfg%TWkQd*avOQJp4;AO8cQANI8Bv> zcOG}lO^agN4bAE6Dy6>n%7~1;I0b;H?7|lj?LOKU!aVor|>nj(P@p>W@RQgX5yQkMMW5vGr3cXI+8Gf26SlXrt<;~yWnc>D<5NoH~ zk8zao60&|aabSHfDWX#@TDS5HB4BHDKbiquTHn;`OraG2mopWEtic`UUzlyOy=JFl zxNAUcknN+oaG#~OZCa}A7y2AJNh}`o4%=xc&n^O6pZALGk~%sI;B+LNM4M`rI-2F3 z4q&y~e#afxEA`Eym^-#tl1`oWTOYdLfB9*;+o<3TwGUToRp1r20E@J7X&C5nW;LNG zGVMVZb$5E?K04Ph9$U;eZ_AC-+WE&+dX##5RSiw4^OMO&6Y+b}!P{NCg9lqqG?@*Z zjKr)BQ*-9yb)86QUga8qyv^*GD95}`DyF7Mp+HomHTJ0hq@mCYCV{AqQ0=fT*sD;i zUp&GyQdmO^v0I|-}oIjS3dbv3+faLNZLp%RM%TSi7@+E_DGykYSKXCMJ5HJ$~!r;|Ch+zjvWD9iMIEFHRiBZ`%d90GQT!?AhTL4@E5YUK7Cyk|L$2&i7%B2&fLG2x-e)hB0^xRL{gfJ$~=l_}=WA1sd9QSCM{v=u2rhiTzz(csOiaKD#0&t zb^H#p2QSO2CVIE^mR^e(?MqMfX9=HxbX{xgQu%PsS%2Bzo=%FZ71l|!=J)CrN9UM) zt#m{dx|btBzhNw*>qvU7?vuAx5`idpWJsxzGGJHfi7W5j5|_VszSny0Y{i#5Z`0nZ zpFH-&fdJ)#Rct1~2VfN*cBnVM3qX2lA~G4UR@GG*)HvR zz3mIrhkF!w?2F>hFhNpEB{bm+*n8(u+&W_0^A*4P|OqqUd5sxI--Vz~QJ8yx`wE07E{dMVEL%2c`4?tm-Da zUCJp~4elt4VNVnTz-{d4_V^6ay72D0GO1`JJ6ts@E$T?r-strk`T+gbj=UyO4!6%T zE)mIQcyltLB!m_fE;RdNthX3%V?;l}MWvyn%x*Urx=}%<3)8ddld@x3=+x- zXGjEEW$`FfA|TUA`j5&iMa-GM@d6x28|Ukx%8=3z)^~wx`j)8$uFkcoFQi^Rz&{dn z&Q^Qaeu+h$O;4P0t|iWc=*;sWNf(Z&7t7%tq^>2ux5cbXsRH#AfaL%Ww=)f0#@p4{ z{70P-?1j-INj!UWT(m3Iwe1x*C+$eIW2J9`|5laXqYp;k+#2EF&I|X@KK7>57udL3 zlIM~sQMTLHMG^H^7~U-v!Gqz)ls0^Yl!~ixbrFaaGuMlC5(P+14&<22V_HhDSw!%r zi?B?JNP-W#ezM!dV(&nh>*KXBND0qvVfjk(T#5ilY&RZ%W-T6_*95s}o!lAX1qf|E1$yxIac1=rcojSZy`8SAw_!@KEt zbN&1GqFn}08UV``6)OJ{#0Z58PB~y;!aq{WClV4%2(V_QL{ij_Avu(b8?(g@>my_~ zK*T^mUrKV3vWfw1V4m_laJo@W^teL)+_6-@=85;JQ2(V*ga4w9Av8Ipv?!Cq=A!?u zAf$8v)TV%X*!NzL5r+Y(9TPNDB{!){E}%%UvS+1x|6utG(uHCreOy%W09M@1(P^~Y z))1T|9USzi`rRrnD~i%77Ln^Ffl^SX3U{!gn=)yIlVfxf1pAf8k48a{OJKv4+7-ck zT_q(pO5%da#zEjroo^oQlgsp&y9nRL(;UJmOexh60n?@6D9Yfjnl2SlJ?gST6LEeL z-0GmGVS!5Ba{5UQO@c9mQk}X2RGDWQziZL-0({;IQA|Vk7hYu!)oVlvc$gAU&3Jo95JQJg6;w)j0G& zLG;_|B!3dgPJd;y^=VxszCcTM)Mcp z6oc^z~8&yvAe;67~rG(acZh&EP>5{5RuuV!Z zv?K|XK_(idCs+QVnD7F1ifGp_1SVm2!yu5^p<7&_wXLIHvy+42?*SJ(C>TM=1fwzN z$*RHbJd0Z_ohBx^wf4mvraW}rViM7O!6)Sc8jir^uS*&xz+fpzbDD(mF4g-_LXPsE zI7GJ@1Q)wG;D3FN3PWH7fm9noNh3WDVUJW20Kphb%3?)%ewg~)fKW@NU&1cNdL1|1 zGB*>T4le&;}C!@x<4t^v!NJ2wtJ($?XD+ML08^F%U7lRiI($ zP=M*~RH@dJ!rBN4L5bfn)fzN04p{Drq+d#Oc8w#_mYTm>&G@+!G7MB%_{aEy{i1!8 zt}JSH;3VS;LjA&BTv!!|$LPYz)iX*iwFu;tp>2#}jL&zIX)A72Qct3k5h*8vqorC& z&=zR9p`czAAw>?SN&7}Bp=}uJwcPB3N3dxnGkDOBQ}ZNq-ZQ8nJ5UY{V=-|ACDtV4 z3E3jCV<(BGnq2cRzPM&6<1xOc~?Rt5h<^q z;-(0FU|_rmZ1DE|AE2PCEaL-AH*v~$0j>%le#C%*(;BD0O*mnysZp?q_m@O`sTgCK z^Jpr-e=HF@9)N;*da08U&hvLmQ?Mcd>Lk*TL}|Oo0p|g~H^WkU;|7VWD$F`G`L(b83YD6@JA7z1Q3%~ffZ33bmUr>0187!kL9pjq`C{BI$PlU zR60-v>PSwVm&;W!fyO(Ppvu$^YedC13QiMfH2=GA&(UiG>OuRH-6j;94~XlOlIkXP z9Wh_TBl7n)aQKYb6jELfYNKM-0t%BvkRA$}OIf+{*j-HoeJP_;s^)cnvq_4RbU-|3SIRX4(5Z{Gt%ly!3z?k7^Nstr;RH zLatMRIKGrB6)?4pqv97tdqtl>^?tZ}(xpJ8frziorAC4m-Ca#TrixW4fMyC$BN)_B z-Lsr0I(rh-^Oc|Vl^#%wQn8d1X2)&|q2HA=lj8`vQmS4h;ivSJ zvRrux)leu%q>fWRF;Ei478&DJ#qnO>R-Pd!#iH|qaBxoY9i7KF@`#Sa$fs$^zfppF zCBsv|W=J>gc`_^P0E_KXVzO~X0B(^2=(JPRBm>drEj>#bX>)qqOH3)#FE<*~ zRFZ48igoTDC%1MGC%!0lGFCdK`#Fq~>%B6|oUtuNscO|;Whp5MBS--Yjufuqu&a=0 z_f-7mAZFE7EoFvMVCt|G(N>Z|igKf5=nYi>MAgb*OCZk)QLs9|Fl}%E zfRa$aX&P+2&6aT3{=m6ca%y-KokYCxOv+HLG)lQ<%mr75CWxKs|U9F{abntZ=~gsqi(;N z=JL3Lw=4AX&#Tkp>8q_;7~p8yB~I&$v$E4i_HSSBI;UvP5^^sww;=44p@~j8OhUnU zOtfB+SCL+JLD{|F;+YPzKR}K3bR3aGJO73N4lV*yD10Kf-0ITRu>27@!iBY1wF=~R z>RjT$wgSbBg&on}>vCG^*0S>tX~R4%2%AW|k}>-H9DXIojgu8V*(?%xE=J>&_uk0# zZ+BRi8gI7biL||a|Ao){&N<7e9#QHa5k@NK+~d8^YLKC&awzq0;{Ny6Dp$?+T~OG; zy5=Z>Emcx<9g4iz|1GOIQ(613l%`W&eb%iJNgT#N%WWrCObP`g3(f) z7O~3wX_`>cqLCdOX-HiA9dJHSa5fFIqs_Z%FUNGu5m;Z4WrN`$fE^)%3Q^s1K)G=f)Z7uItABLznR+jVtGNae zq{P%BMyFV1PU^^&==#H1Z{J4Ml$Y^MJ-(NQ&ZJOH1%RxoU)2_ zZ2WP@?HPonzy54L@!eb5)7?Xy{$|jRVH{NVPGxIPj<3a7UuP%b!6~)facG~q^{Wd$ zTZRyHT=CI3J#B3NBM-eZ_UXW1xfz3PIZ<7+3rl8U4lg{a2j1mYsBVx)>f~h{6C&Xe z(S7{%MYj;sGyT@Fd?o{Sb$c_a_wa`Rw7!!B_-RHxxzE##X6yGtr;WZV?nekKbJ=tn zKiGMx{o@W3kLJRa+bWB(bjIp2NsV%~OrGf~pFtT;w6$xFCO1c3DQqMoeTuYWN0Oo$(DlImxvY9z_;!`7y2sCuq^ z!nzE8R8*I(lGh0k;RG5SU2~*A@SnDb@%$gWsGTXEDwSU? z2o}^rG#z!i1K_{=9z*-Hd^<0&|hN7|QjV1RX75$ajArsUc&mK?w-cNqtN#nyK+N3-Kb`3U)+o>G3HHQ{~=!`8oQIs-VCIFSsq<6dNt7?dv8md;t?~we~h< z4--O;if2Sx&kEN~GR``6TLt5mnKGEaYRi`vO4S;;WU^fj-ae(uq>KXMBOd`DR?C5V z+5pFQQjCz~ATIYI!5Ya8$?VwjS5(*nTimU*L#i<`MzBA*;OZMIR+(P;y-~oUNR)7Xxgfsjl$tMM3%B-<$qj5eQ(=328 zyR#0YcG#Z&Tkbi$OOI$RNY}ziwLJSe5k)^ArWppPh4$iYiaVB)eFE8EG0icrTj}Rw z1^$H|nvy~XEfNOXps2=eZqAAnMYpinQ+4KgK9ZhmTRYan5$+)7yaFjng+5C(y$q&y zh}3m`MYi*Df@LN|DXiCL<=g~!@D1P)IZmAPRN^MU;PJi=g8B4-lLR@azaOOyJ`!mr z`KyFs0G_b0O7Qa(^r$bJcNBvoyE(n(s185VmGk{PL!p3o}AcOq!7Z>8!G%WKKZ4kGxU7Z912`AZ?e z>J4M~HmB}J%g0nNUsNj_>(Q&ga*~JVY!!(ES8JXl6P*H{$OeP<2ti^XLaC1Du`4L) zy7lq!+bJ1X@D2se=)3lcAvP|&qx5bFp|5oNH30Af?Ulp@0j zDrl5)k+f4YSmdV~4hJ+}l$*SB2$9En8T>TwBvT&YM5~j*eoak_(4=EB zB^58mc_Hiei^PtM6ODvTh%zMVq9QWLcOmo;_r=P(ea=LsZVX=Cx{2skm>&?4u1!{a zq4^}d1b7dqW`kKhlSfm=R*s1}|vdWE8GI#1oyn6z+?8r~AC||ej{f!M$2VX~rrdNpfZ~&|41+m9 zLuU@=3M6!RtV1P9=Bf8fe#4%GfSsBZtSKpdI|_NVbp;w0S}=Bm3ZTzpsHTXhSwV3* zZ1v(D(4RvN6sD_ecUp-b*Z~-GJ0P;4likZXrrEcMDkn(0G{SB0Ho4(=niG%W_1ikw zrCYeP<=M6`yVDO8d(fhMGyLKbZ|VNybn_TrpLADY@(7i6_3Fh;WIW$aHv{;!^3`}#0H)%kj5JA?rc9c>v{(a|+$UwXJjx*)G=<3VKHr@9 zBGUuW_&aHNp~KI_SJHrE=MgFHR}R(Fx>Ut&&eJ&Q_T%E~mT{^%>%qN+@c;m+930O4 z68Jf5S%jFCC`xDeZps9@d$li)p3L94=~~ZjuIfepFf!%}R3@RBMyd$37`K3`jY}bXC;(~q@(9hdYIsF1_9gSC?p;yN@>nrF ziP@#WYJykTOQB7G-e1oA?Co%Hj);I#K|y|Ll%%QHcoKOYDE(gaE0enC8$H>j>foREWR0O7a{u;)^Y zvCT-~BB78;)ItGRNL5Lry7R^ELg0V{z>2eaB%&+GSpTkt_AMwkBl}ED-CDDpsS62L z5W+<+VTAxP;79vNN#-|q{=-_j^#1-!Jsa+w4MCaFT{r!^w;s6iBnCDh8H$K_$<~TB z@Z1{MlAEO>q&NV+>xv!E?R16EgUS-HL`vor0tG1bq%uL#xm}mSX92d2hw}8wDTrl zyVj#U>wsHo8h(w3$s{G2Nyy^^ZCto=jY8(3-1DHoDCO}ST*LIF@ZkU{xnNR#2M~8^ z0UuvXST9LUD#U-e4hp#R7Yh1p9Zp9=R+j_mLcD_0|o9tG&q6AS=;wpN}QG;@52B0hI;pa6|md{d*c+Tgu@#_J6JRdURLQM+Hqab7L zLf-XBT4P^y{o4GyJM!&P;ZJF*;5ki_`&q2Mt5d8K@(m_dF0fOHwfu=C} z39g&F0lrX9JRuTwViVe zJB*PM%ZlfVkdaxb|4y6&oO$60G%TkrG#Xv`X=D?3>bFN(1a_+B7Jj3Ip#L2oB1mky z5uTvhLhdi5U6jGgCB&z<;>rq7=pG>kNOCMCaKDIH z2G9jSymE+_f?9K*55@5b6gk}q_BsH+`$NvaYZ=?cS_n6~bl# zFTh~)w8}bgdfUa@jdkX5tw>Cy z2mx3^9*_dsGHL=sQ1BR4g!TeCp{*9TjtgHCfWiJO4S=XXvA48b`|aY^P9R&z$XjfVRy5GhP zf%#50-JU6M<5d+tZQEufe;EM={FrWx;#4}pccQ5z4ew1h45ikA#f1EizHkd zrY)&(D`SC!2yWtphxh$Hl8oZUh2(l6D`wEnqr_{s*}5HkU{_=78~`3tOi+yO0u-Nq zp4eeVD#8e%g_O#LeJe1$5zuVIUli6|PCKDidL_L18pxZTUmaj^$K8~@N{83tYOMQJ zIl8}W*skqt#(}0@{ zsXB+}SKnCOq1C+MHm`D(tMTuUGLFlEua$|Wt6Q#gS|UtBV%<$w13bPkln#K(lH=?` zf~L&W9w69WIqWaN$z=HFKfBChT9UT)*O~0=G9WqbHnU{Hno`0^W()6Mj;n+cgb`QC zAo+z=SBHA)sHV8W#oN!#dug(~sSTCa%X+yNm_|LkdzVjf%v?4H=pl%@@CzH4;;>r@*Tj24L9pDxb zGQkAz8n^85fnNZm7Gv@QbJDg>iotxUjl2(pA?# zA{`aF*66}@+uIju%@|8&BkfqiFfkrRjK!DYueoLWAT$ zzCEkKAw3kK=CZQa(~}D#4SeNC9aFo-dG}(4ixI@CjPSfYhRZS4d=qy9&pje@2Z=G79zR zXRfItOz4wY_d5tV@~t;!PZjCztNjldcus5u#%+oo)@*5~9jf&g=Jx~8-*(G2&PITihT$dU;?L2#n%YiA!( z@ru7K$Dd@E?>tSZ2l3}G6Q;LJ^M#}xLZ9=`eDC$Rm9KOvsg%B8#-Br%0m!e#|F4g=_N` zyaz>~Wi=SiB#Nn;$qFj3gx-ntTN~k{%?Rs-hHe%a;WwcBs{uYAa2n<-IAVXk&3y}c zcT)vdDmM*Vcv2Je@fZs(IGGgKAT67Cr&KVg=P*CJVZKg}_cQtqK?r#O#CI|fFM7Yj zh^oe9+&p%TIYM+$a7F=|o6u2h0U8i0B`>%#WcXhIp7CF4ZdXYkC+U2nBb^>AI(gPuGL$ z2u?%j>@xnzb{Jn7uq_*d#qy@{xF6A-u zN|y`b0jyj=UNb`WkV9iy2gn;(y!{OEA} zW8Ny&nc*M5w?ioKGi3Q!8!~}K2T{qAf$ZX?i?qt<$4#P8> zOX=XDbwDYk=a#$UOWbg|Q-*xzB9aYNQnbzD(dI`)L^Io5`cqN!gRDez2|R%}*>Q>g zkanf#{Ua(XLo`v&gHpvKPJi07bk=>0xV`)DiJr1&)=etgnw@M6SN3}`5-48E>*^kQ zWs*1bco@PIr6a1kLESO>$FnVs7t$h_wk3TQ8@p??W2%_&S(i*wNy3^7!xha-{u|OV z?3KL=%ih4zp00drt|k=dVPyS#oAerFW+;1v8m1H*MEPsAF!wTz|b6?yYJn1m!z zP)nI*xmDLW`+{xDUKND+n<9;4+m|h`FBV-=3*0z)Obru7<5j$ijSAlfJ55=t^205N z|0qrqzMOZ_vpM0tebt(3z3B82@QDv&yGEt}1P8QULAT3%pzpi^bVR93#y&Qgw=X{^48W;y(0s=zLMeGE11Yw=3F zuBPexD?sa)9lk-!)K+P2?G<@Y9b=zo9CZscN+HIJxO! zFr2F#DD`)&cZ|DJM|BSU4n{VHN42}6DqZ+lFgxSe8T=*OkIGERs| z)V(9zWaorgCr@V+Un8{%yw9{5-WZ!Iq^L@P@UUTD0@aqZopajZqvShmsm?SQ(YZkd zCO&daR`@1}I&lTw(d!gOiLxUxEdfZwjKk)ro>0s7REhd?i2RWI)F;^L6g(**@AC zt?BH$D6}ruI;CnC?x}xHVP5k9qPAM|{f3n%xJdwA6M?i|F7~SNdGSZ% zoK|KCpg9Jqb8&6nlT(bXPG0>&<>eO@OLLNC#BhqEu6BteudRfjIaZc6bckmGl zNbB~`EmzmRjA2?xii~*WJlbWaOiQQLB3FsD%%K?2YC{P)VWVSeV?WVDEQbI5B{D{z z5A>qA3FmFGch>XF>xDVwU^%rPqiA{Asw_gP0{d{^m)4U%?EJU*_)L{O<7QnfIBZ&7 z{F~V|;>$g0ugJKjGbi7U0Aw3(pM7+Amxies!4c&s;R``R?0gVSB7pu}?q6gsTpu5j zo8K8U3kp=cWf3TVeg>}0!|{QzKB@830DS9CebM2m=w(;<9$>6(yQ=`$y79XD(!}n% zzV(zfdx}hdnqH!{*mh}~X|j>WDCBXwDqCL}XVC~;IaLSI53lT^#PW$HXE?A{pDxw(u1#?G#>a*lDsYWO&PtddGcpFBTf5t4cG|sk*LjzWngRg-JS%Z3S7H^_@~Y z8)8Mt=39;V^;$12cRZ~cUbpS*^1o}0itqG9{8d?5@cQ;sKwlG59RAuZQEX(>c`R(sl1X1M5_9rY=5@JjsH*{k>X^VQu;K5$+SM7xoabRYs3%2 z3O-!l$ldCQTbj1GD_bF<^3%1D^q#z9$R%$@`25j{5cp|H%40La zh0)k+NrIjg&-g&?NbH$Qs(>|g3-Fb93NKWM&un@BMl#|XLVtP;oS!TBRQWu4KwhIQTSH~4e;=%sVhtGG{T_E6|EqnYAYIbAHhX=)p8LyyE;SrtK?hmGqEJI-J0OOu$vaKQ*vZ?YV_t0o61;|y)zM0LB+Q9G0Rb< zjhYlK?Qd9WsXQfIZ4=nP{wAlJHZtbHoSx$wV_3^iN%V`HnJY9HU z7v-7C#BPUue{+8dl{b4dKyk{fSpD|jNzZo<2mc(AAk?E3eV%sm}} z*oz%*7gZd?55y(!d%JvdR9tA6_FZo=c#D=;VwwaRE*3fABC^sUk!t2jQV79n@qnCbTaMA8Tw77q zkq=Gq$F3}=dc)x9yXaSU?D9=@Q?LHZ9ZN5}*-*8crjE7b-a}MbuQ%9jU0k>U$nF_% zGyi;9VG_}iISXOOt;DcYBuBfIgjm}sqS-STQe1hqwPU}u614`!ougwe`ZM%6aNvtGjue|L2ZII_& zRkVGk_utn9a1m(VXTL_A zUY*yluPe(=3fPWi#PZwTDT~yl>4#5N>{aPdL@o20`||A{97TL-RgI6B=bquw4*4#fC z4L5CcRuEEl{l4rb6&>(^t0|rfh6bRoz7fy*n?WDXl~Pa*-*5EmJ$#D~qr`o-K=c9e6R#m6BYu{Kic4zIL*!E3ZeDvO|S<=o(eYc9U z)@8kCzb)((Co%O3dh*Yl)uxPo+$Nc-Q}E@C5Mpg;z^k?7S5Jbs+gh3i_QqCQ75nsh zsh-iU#*bw*K!YP2L~6`C>wDI^^gIP-vRqz0J+Ry3sRhUV+v63wVbQM`#4o)|UOL2W z58Jw2#%>+NTS3b8qbA?he5nr&eBcuF_wB1+5Wm9Uh}dce(iM#a_6dIapH3jM6&_1$ zynA`w`>JOfdmbG)8nh}lc)aZa_l{U#lrPd9iCL_5s2jZc+G8y9Y5qzp>k zk@Hqh+D-@Db>Qb;>c*|?k5&umTrRHrw#Ka8ujgp1<&O&&U)_FF%eR_|usV>w|LDY? z%=MeBHWk{xDhu3n;=slg+c!mJg^#`AJwLZ;!|#sP#V0S?dtTkG<-W@5zZ1%T{WKug zD&m4sWd82qM*{fVOhm`m*KfUSRGS_aw?{tSvhm4{=i?t9AKnrWb#Rkv-lorVKDKgm z%ZANoY9vcyn~J^s5(+oVw~r_4f_Xs^qbeErvGksU!#%rw9FSKdo7y$qUp)_e_4iu& z$E+8v_>f$OeAH@G_nmzGoflsoY^2^51nnJN5<6yebz{f5*STtu#M*EJ8?lY=(ZKdG z%dm{?uhwdP?_OFrS-N{8K29+Dbn+bi^)21aJo=Qr)z}wZ4+HmT!wRl`Wc1b_*$nGZ zpMzt++DHA)O$9ty7kK))6(Q#DtLt^bUg51{o>0S{t(>-B91Y-Xn*NVE_4!-xxK*@s zMNDuB_t#~w4b!iF?2cw0n>twhgd^Hee-v-9qcglXsy;~YaZ4=W&xGBm_pRLl4inRR z$WwpGADnmCtZzN_;_sP_@SB&nr&p(j`V%Hhj!toPpisSZW&WEbt+W1Hf?t$B+0gRF zCsnS?*!-z>Ci456fC~9}qggEIbxfFrzuW6AcVkTsO>Lu3FjF_I_%>_HXfioCb8hAI zvo}%wtEYE<+ybn8YpXKLmc@Qu9=a!)lji=KJ}YM=&%V~(Dq>9RXGEz<-{EdX1cUeQI$ye!un06NC`)@PqWo z=_P06nW^v2#^q_0JCu+zG2P_!&RF;Dm5JWUyYp3l9-j7o>q3dEjhx?| z9pkxu^S6WZrGI92A9}aCVyn`}Hw|@(*Szzq@6KE|PTU(cU+n!pCo=IumqVFjVr};O zfYi`kVITg3-?ybsw>u^_>2-cR_fAR(zIXIP`|vx-><39$eC;sUb~H)9;=`)cZG*-e zA_iYP>V0=}czU>@`u?GWM{(P8!onWAZ+}t|^Yre!&e5a?vp2?#XGfA>dtOa?)$*aE zrJnNs??(;UcaJ4i)+W6POPp!>n71#iQ~l%kndJGqAOBJJnV9(4U-xkympm#00N4Km DD`vBj literal 0 HcmV?d00001 diff --git a/inside/images/products/4.jpg b/inside/images/products/4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d82e2bafa2a0a753819a5aa08c963b5cf8cbdfd7 GIT binary patch literal 13939 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 literal 0 HcmV?d00001 diff --git a/inside/images/products/5.jpg b/inside/images/products/5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..563dac1d9646dc6df8022fff707c15a6c70ce465 GIT binary patch literal 12642 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 cP{zG`h5}d@HfCMk3`C+~x{F5qT9`D?tmK= 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 literal 0 HcmV?d00001 diff --git a/inside/images/products/7.jpg b/inside/images/products/7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6903f9c7915a04d91ce7b53ba1faa71f5f11476f GIT binary patch literal 17026 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 + + \ No newline at end of file diff --git a/inside/programutvalgtekst.php b/inside/programutvalgtekst.php new file mode 100644 index 0000000..45a24cb --- /dev/null +++ b/inside/programutvalgtekst.php @@ -0,0 +1,55 @@ + + +type == "Billett") { + print("Arrangementer med billettsalg på Det Norske Studentersamfund"); +} else { + print($prog->type."program for Det Norske Studentersamfund"); +}?> + + +", "\n", $prog->pretext))); ?> + +start; +$end = $prog->end; +$type = $prog->type; +$list = $gigs->getListSelection($start, $end, $type); +?> +fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); +?> + +concertcategory_id; ?>: name)); ?> + +venue_name; ?> - time)); ?> + +Pris: priceNormal; ?>/priceConcession; ?> + +intro))); ?> + + + +--- + +Våre samarbeidspartnere: + +Sony Ericsson - Chess - NextGenTel - Toro - Radio 1 - Dagbladet - The Voice TV + +--- + +Det Norske Studentersamfund +Chateau Neuf, Slemdalsveien 15, 0369 Oslo, tlf: 22 84 45 11 diff --git a/inside/screen.css b/inside/screen.css new file mode 100644 index 0000000..f6fada4 --- /dev/null +++ b/inside/screen.css @@ -0,0 +1,700 @@ +/** + * text: #000 (black) + * background: #FFF (white) + * light-fill: #EEE + * conrast-fill: #DDD + * passive-cell: #AAA + * border: #CCC + * link: #00D + * + **/ +/* =general +*********************************************************************/ + +html, body { + margin: 0; + padding: 5px; + font-size: .905em; + line-height: 1.5em; + font-family: arial, sans-serif; +} + +img { + border: none; + display: block; +} + +td img { + display: inline; +} + +.mceEditor img { + display: inline; +} + +p { + margin: 0 0 5px 0; + padding: 0; +} + +em { + font-style: italic; +} + +strong, p.strong { + font-weight: bolder; +} + + +/* =links +*********************************************************************/ + +a { + margin: 0; + padding: 0; + text-decoration: none; + color: #00D; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: #00D; +} + +th a { + color: #000; +} + +th a:visited { + color: #000; +} + +.optionsMenu a, a.button, span.button, label.button { + border: 1px solid #CCC; + background: #DDD; + padding: 1px 5px; + margin: 3px 0; + letter-spacing: 1px; + color: #000; + font-weight: bold; + white-space: nowrap; +} + +a.read { + font-weight: normal; +} + +a.unread { + font-weight: bold; +} + +a.skip-nav { + display: none; +} + +a.contact { + background: url("graphics/user_go.png") no-repeat right; + padding-right: 20px; +} +/* =lists +*********************************************************************/ + +ul { + +} + +li { + +} + +ul.linker, .linker li { + margin: 0; + padding: 0; + list-style: none; +} + +/* =forms +*********************************************************************/ + +form { + margin: 0; + padding: 0; +} + +textarea, input { + font-family: arial, sans-serif; + line-height: 1.2em; + font-size: 1em; + margin: 2px 0; +} + +form .title { + font-size: 16px; + font-weight: bold; +} + +textarea:focus, input:focus { + background: #FFD; +} + +.readonly { + background: inherit; + border: none; +} + +fieldset { + width: 90%; + max-width: 600px; + padding: 15px; + border: 3px solid #CCC; +} + +fieldset label { + font-weight: bold; +} + +legend { + font-weight: bold; + padding: 0 5px; + color: black; +} + +fieldset input, fieldset select, fieldset textarea { + margin: 0 15px; +} + +input.submit { + margin: 0px; + width: 100px; +} + +div.horizontal-form { + padding: 3px; + margin: 5px 0; + background: #EEE; + border: 1px solid #CCC; + font-weight: bold; +} + +.delete { + text-align: right; + color: red; + font-weight: bold; +} + +.formHelp { + cursor: help; +} + +.formHelpMessage { + background: #FFD; + border: 1px solid black; + font-size: 11px; + padding: 3px 3px 3px 20px; + max-width: 300px; +} + +.helpMessageClose { + border: 1px solid black; + position: absolute; + top: 2px; + left: 2px; + padding: 0 2px; + line-height: 1em; + cursor: pointer; + background: red; + color: white; + font-weight: bold; +} +/* =tables +*********************************************************************/ + +table { + margin: 5px 0; + padding: 0; + border: 1px solid #CCC; +} + +th { + padding: 0 5px; + text-align: center; + font-weight: bold; + letter-spacing: 2px; + background: #DDD; +} + +tr { + padding: 0px; + margin: 0px; +} + +td { + vertical-align: top; + padding: 0px 5px; + background: #EEE; +} + +td.label { + font-weight: bold; + text-align: right; +} + +td.number { + text-align: right; +} + +td.phone { + white-space: nowrap; +} + +td.date { + white-space: nowrap; +} + +td.is_member{ + text-align: center; +} + +tr.table-footer td { + font-weight: bold; + text-align: center; +} + +table.calendar { + width: 98%; + margin: 0 auto; + font-size: .85em; +} + +.calendar td { + padding: 0; + margin: 0; +} + +td.passive { + background: #AAA; +} + +td.weekNumber { + background: #DDD; + text-align: center; + vertical-align: middle; + font-weight: bold; +} + +div.calendar-event, label.calendar-event.button { + background: #CCC; +} + +div.calendar-concert, label.calendar-concert.button { + background: #DDD; +} + +.calendar td div { + padding: 2px 1px; + margin: 1px; + line-height: 1em; + border-bottom: 1px dotted #000; +} + +td h4 { + text-align: right; +} + +th a { + display: block; +} + +table.sortable tr:hover td { + background: #DDD; +} + +td.unread { + text-align: center; + font-size: 1.8em; + line-height: 0.1em; + padding: 15px 5px 0px 3px; +} + + +/* =headings +*********************************************************************/ + +h1, h2, h3, h4, h5, h6 { + margin: 0; + padding: 0; + line-height: 1.2em; +} + +h1 { + font-size: 2em; +} + +h2 { + font-size: 1.5em; + text-align: center; +} + +h3 { + font-size:1.2em; +} + +h4 { + font-size: 1em; + font-weight: bold; +} +/* =header +*********************************************************************/ +#header { + background-color: #EEE; + border: 1px solid #CCC; + -moz-border-radius: 8px; + color: #000; + text-align: center; + letter-spacing: 3px; + padding: 5px; +} + +#header h1 a { + text-decoration: none; + color: #000; + display: block; +} + + + +/* =navigation +*********************************************************************/ + + +#nav { + float: left; + background-color: #EEE; + border: 1px solid #CCC; + -moz-border-radius: 8px; + color: #000; + width: 170px; + margin: 5px 0 15px 0; + padding: 15px; +} + +#navList { + margin: 0px; + padding: 0px; +} + +li.menulist { + background: url(graphics/minus.png) no-repeat 3px 0.3em; + line-height: 1.2em; + list-style: none outside; + margin: 0px 0 10px; + padding: 2px 10px; + border: 1px solid black; +} + +.jsenabled li.menulist { + background: url(graphics/plus.png) no-repeat 3px 0.3em; +} + +.jsenabled .menu, .jsenabled .submenu { + display: none; +} + +.menu, .submenu { + margin: 0px; + padding: 0px; +} + +.menu li, .submenu li { + background: #EEE; + list-style: none outside; + margin: 3px 5px; + padding: 0px 3px; + border: 1px dotted #CCC; +} + +.menu li:hover, .submenu li:hover { + background: #DDD; +} + +#nav li a { + color: black; +} + +a.switch { + background-color: transparent; + color: #000; + font-size: .9em; + line-height: 1em; + padding-left: 5px; + text-decoration: none; + font-weight: bold; + display: block; +} + +a.switch:hover { + text-decoration: underline; +} + +.menu li a, .submenu li a { + display: block; + background-color: transparent; + color: #000; + text-decoration: none; +} + +.menu li a:hover, submenu li a:hover { + text-decoration: underline; +} + +span.key { + text-decoration: underline; +} + +#calHeader { + width: 400px; + margin: 0 auto; +} + +#previous { + float: left; + margin: 0px; +} + +#next { + float: right; + margin: 0px; +} + +#previous a, #next a { + border: 1px solid #CCC; + font-weight: bold; + padding: 0 5px; + margin: 0px; + line-height: 1em; + background: #DDD; + color: #000; +} + +/* =content +*********************************************************************/ +#content { + padding: 0px; + margin: 5px 0 15px 207px; +} + +div.text-column { + max-width: 600px; +} + +* html div.text-column { + width: 600px; +} + +div.article_images { + float: right; + margin: 0px 0px 3px 3px; + width: 200px; +} +div.article_images div { + border: 1px dotted #ccc; +} +/*div.primary_image { + float: right; + margin: 0px 0px 3px 3px; + width: 200px; + border: 1px dotted #ccc; +} +*/ +span.caption { + font-size: 11px; + font-style: italic; +} + +/*div.extra_image { + float: left; + margin: 0px 3px 3px 0px; + width: 200px; + border: 1px dotted #ccc; +}*/ + +p.date { + font-style: italic; +} + +p.date:first-letter { + text-transform: uppercase; +} + +p.subtitle { + font-style: italic; +} + +p.intro { + font-weight: bold; + font-style: italic; +} + +div.messages, div.errors { + margin: 0 0 5px 0; + padding: 3px; + background: #000; + color: #FFF; + border: 1px solid #CCC; +} + +div.messages ul, div.erros ul { + margin: 0 0 0 35px; + padding: 0; + font-weight: bold; +} + +div.timeData { + border: 1px solid #CCC; + background: #EEE; + padding: 1px; +} + +div.optionsMenu { + margin: 5px 0; +} + +div.product { + border: 1px solid black; + margin: 5px; + padding: 5px; + cursor: pointer; +} + +div.product_images { + float: right; +} + +tr.barshift-full td { + background: #AAA; + font-style: italic; +} + +td.worker-status { + text-align: center; + font-weight: bold; +} + +div.calendar-barshift { + border: 1px solid #CCC; +} + +div.calendar-barshift.full { + border: 1px solid #CCC; + background: #DDD; +} + +div.calendar-barshift h4 { + text-align: left; + white-space: nowrap; +} + +div.calendar-barshift ul { + margin: 0; + padding: 0; + list-style: none; +} + +.calendar-register-me { + border: 1px solid black; + padding: 1px; + width: 50%; + color: black; + margin: 0px; + display: block; + text-align: center; + background: #DDD; +} + +div.calendar-barshift li { + white-space: nowrap; + margin: 0; + padding: 0; +} + +div.comments { + border-top: 2px solid #CCC; + +} + +div.comment { + border-top: 2px solid #CCC; + padding: 5px 0; + position: relative; +} + +div.comment-meta { + position: absolute; + +} + +div.comment-main { + margin-left: 150px; + min-height: 60px; + border-left: 2px dotted #CCC; + padding-left: 5px; +} + +* html div.comment-main { + height: 60px; +} + +.clear-right { + clear: right; +} +/* =footer +*********************************************************************/ +#footer { + clear: both; + text-align: center; + background: #EEE; + border: 1px solid #CCC; + -moz-border-radius: 8px; + color: #000; + margin-top: 0px; +} + + + +/* =extras +*********************************************************************/ +.domenabled ul#finder, .domenabled ul#finder li, .domenabled ul#finder ul { + list-style-type:none; + margin: 5px 0; + padding:0; + line-height: 1em; +} + +.domenabled ul#finder ul.hidden { + display: none; +} +.domenabled ul#finder ul.shown { + margin: 3px 25px; + display: block; +} + +.domenabled ul#finder li a { +} + +.domenabled #finder a.open { + font-weight: bold; + display: block; + color: black; +} + +.domenabled #finder a.parent { + color: black; +} + + +.domenabled div.disabled { + display: none; +} diff --git a/inside/sethascard.php b/inside/sethascard.php new file mode 100644 index 0000000..d483803 --- /dev/null +++ b/inside/sethascard.php @@ -0,0 +1,18 @@ +'); + +require_once "includes.php"; + +$userid = $_GET["userid"]; + +$user = new User($userid); +$user->setHasCard(1); +$user->updateLastSticker(date("Y", strtotime($user->getExpiryDate($user->cardno)))); +$user->sendCardProducedNotifyMail(); + +?> + + cardno; ?> + lastSticker; ?> + diff --git a/inside/setorderdelivery.php b/inside/setorderdelivery.php new file mode 100644 index 0000000..2a8485c --- /dev/null +++ b/inside/setorderdelivery.php @@ -0,0 +1,28 @@ +'); + +require_once "includes.php"; + +if(!isAdmin()) { + die("N/A"); +} + +$orderid = mysql_escape_string($_GET["orderid"]); +$newstatusid = mysql_escape_string($_GET["newstatusid"]); + +//$user = new User($userid); +$conn = db_connect(); + +$sql = "UPDATE din_order SET order_deliverystatus_id='$newstatusid' WHERE id='$orderid'"; +$result =& $conn->query($sql); + +if (DB::isError($result) == true){ +// notify('Fikk ikke oppdatert status.'); +// error('List buyers: ' . $result->toString()); +} +?> + + + + diff --git a/inside/setweekprogramtext.php b/inside/setweekprogramtext.php new file mode 100644 index 0000000..e8fa363 --- /dev/null +++ b/inside/setweekprogramtext.php @@ -0,0 +1,18 @@ +query($sql); + + +?> \ No newline at end of file diff --git a/inside/showCodes.php b/inside/showCodes.php new file mode 100644 index 0000000..fda3df3 --- /dev/null +++ b/inside/showCodes.php @@ -0,0 +1,6 @@ + diff --git a/inside/sorttable.js b/inside/sorttable.js new file mode 100644 index 0000000..88c4e18 --- /dev/null +++ b/inside/sorttable.js @@ -0,0 +1,194 @@ +addEvent(window, "load", sortables_init); + +var SORT_COLUMN_INDEX; + +function sortables_init() { + // Find all tables with class sortable and make them sortable + if (!document.getElementsByTagName) return; + tbls = document.getElementsByTagName("table"); + for (ti=0;ti 0) { + var firstRow = table.rows[0]; + } + if (!firstRow) return; + + // We have a first row: assume it's the header, and make its contents clickable links + for (var i=0;i

    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 O{(t%Z^aZ*f7ycg#3pnxs literal 0 HcmV?d00001 diff --git a/inside/images/products/8.jpg b/inside/images/products/8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e6e138bf5fbdae8e7885df59f3129d74b758802 GIT binary patch literal 41064 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 Bsn-Ai literal 0 HcmV?d00001 diff --git a/inside/images/products/9.gif b/inside/images/products/9.gif new file mode 100644 index 0000000000000000000000000000000000000000..0581c3d6a89d0a34bc294cc986738a6c2042bde2 GIT binary patch literal 32551 zcmWh!d011&*PgrNW)EQx5Fo4u1PKr@DAk(;Fn~)yP*l{QAc&{|QR3R0g%A-nDk>^! z5JgmM<62bIu!xALamTF@w!!R zbnxzyp|7v!rxUvqCPrO6YB*kBb+h~8+cz)zAKkfhu6cL$qT@Sfw$`uu_Tk3=ZXb2L z+wTmzpZRzPQl3cjmLU-Ip$%zi~o8{NeqLpXx({(4uKhYjsP$_3KX@-CbF! zdw#yK@4VsIv16B-3LoF@`K|ZJlbe^mUal%FataOg+*6h07{0V;Pu;)2KiOBis%q`x zr@c+W5M;*UqN1Wj@1ILN*U z*7QI6>%O$E*}JnSCp-RV&7$O_fNK4WU7J=GElR%G7@w08V5r1D4Bgb1dtExeH*SMYb1+ny@lZ&5sudK|CXgN}pni>E2WYwkfRa+b`HU4y7AaP%7q6I+nU;L<{OVEBoIfuY{`{u5{zy$;esuTATG{lF z`aQC=-1*-I*O=C1ynl22Y_+%`fp@f~A}j_eULiSo%5Xpx{o(U(m(9f=p6IsjS$pza z-35I?O>JRK?F>=EILFBN`Q+!%pB;~meE9Ie@$+Ga~M5-Z~g4} zeDd76&yEi#&z-D4Lew9b?Rb8C#JYelCmmf{+o+hcC% ztYQbH)yqyDy0(cETl~D|RO9unJZUvI_4MHzJNVO&=iWGdtlz?rNw+ud04XK;`zxh}%|EhhtY+E|5u&A! zO>YP(il0wmqMAv3$0i0;JjEbr?UuTtEbcUdKg>91Wya7V%xo$Et zmDQ8nJh-IS?QW;1MhRfDp^TTzb)Jmlbkh5V9@?8=BN6{5OYZ0F`at=Dq6+TqM3q@= zF)FFiAQ&z26(X{Jb$m1xAA3>x_~c`LBO^=xzb`xDnhfeH7p~}~?3CeRM>}alEqSpE zsLR7(kOU}#q>?l|KBYwo9TKgvL3HPcyd<}IHLt?6gs6RU$^0A1GYgJAoIQi};>)|t zD#EXSh_iR~p6-+pH!PqKo8yH#UJ{fy{H8Kts1L}z zQYaaE@*SC}FFU(NASFe2*>*D7t#dxye*W=9RN92}ol*eRm?(aWZ4fosN8x<^eohHH zC5&5pNDQGWb_b%Ue~csLDggX<23wc`)+uEYe{YrZW{}>8*9F9>Y+8D6)<<+_Qjvps zkR>t2rUAam#?b97=ze;~NV8c1QFb*aF4bO}!u=BYfbJL+eY z^o~Y!1RCd&V@qP+Ki|l3<9%v4E16Gtg}c0SJvEv(IKng?4?P| zc6+^Y`?Bvu))pygwFD~4(~b?`<6jtY`GU^I^d7-M5IY&ygUILYDgK_hM(U`8iM%^w zz;n_l!KqDjnVKxJBsYjm5KvisM0TmmE^Fl~zQyO6smf=~DI~d%H9H)Wb9QS=+!ndc z|2^b%*+_z{84%t&3H!K5oO6iKI@Ov;u|*JF6rvl0s(pLqh?o0o{nyHY-I?}4uL>m| zCG4d9mMS6jd}I_&hTRt{?qfPTEC7Kt>k$69EqW*5;FXWZ2TRIHJJ)9Cc}(lkvYMia zLggzii;&RjPwl^)!>7H?NfFiNIVkZe4N8}Hu&g}v`*I#aGA0K;8jHmAn7&K2p}bv2 zD0-)wbd-lUzbE*KB^JnQi219Z6!jPkV0p8W88FW4}fx*?Stmy2=>oM^j zM0QKw(d!*j2(>wtvU$!di)C_<5&F`%9k>%Xm1c&JG+40R5#=Va6TIwy7MEC@ z8|z+0sW5bs(lP{Lx&YReH306j*0GJLAc@x*gxW}f>s~sIvE!sPHeJYN&v6F`h<9d{ zWp#Rvx0x^s!93N_N17|Lyf9_xT#4zDmpXmSvU5kd+yI(?kJe)Yo=s`(h0|ry7!Na% zT5yus<7a6H{KS+Vj)kk6Clt?{WGwaSsEfKtho}eIq6jZW((N!uVy7(^K@PW#!-tUW=q+rZpl0`@@wv%6 zT@4oSFjCrLiYF?DCm8eHr^*;lv z(PCox*NJDmGoobBIGyIeg%|$ado>gNYZDq<`@NNWUFl|%vncBGl^OctK6SyZ7I+jB zG!#D%58sMB&^MIsd9dykWt^bHrFa_v>;SSvp?1RTtmNR6%vY2O_8L!8fC*-^%^K2i z9^K=h8V#0dJC|eyRef;zbyl62A+b%5I@>_q-QKTDYZ>^vg^Cyrc-O ziNc8I5d>Ug2e)jn)r6Es!=V7m%OJ70d)ICAOpkNBSjPOvw5)2na6Uva;E2SGHXF$+ zEihThT5rTw#u9C+HW;~qJ#xc7B^LYy2a5KN>gMm9aHjUWjM2`-yVBbX^h$|szq zumTsr3^zL!o0iARSubr+!kM*?OzNHGZbQ4gc8aA8haAq_O@3>ISOm=<&>|&FXDfZ9 zLQSxhXN-`u1#vdfX>69nm^r!$wVM_O+es1K3p5Jd4R%GuF0AX2uJBPvlG5*59?6Nl zh=v0TL7Ezm9ga5GS7hwZMC$JQ%+(ex#eqjNvep8nDTquq^xDeUPtbzo%w4uzy@K4S zA)mw{4=W@89?8ZA_e{Rk_tlA~Mi&IEooZgoSE3#>p;Q4?X+*CGVmm%ETzMpKJJh6s z7-saeH6;mAb+-dQ+Z)U^=bMP1O2F-8pm_` z(>gP87k>@zKgI+Ihk`fGgk%em2n+1>SHe;v`Y(5n7{#`d(-9E@RwJ0X&IKI=^k(I@ zEj;A4faz;2a95x$Z)QK*;iiffX0XAB{?yS{Xi&o1#-mI1V1`1Dbzvb2%^5&xHd6Kz ztbRE(XE-v=M*BXDT*#wpZ*22Ph0n=~gQyh|O=#72!KL8RJ1Hrw-I%i+3&4>nS^9K2 zAeqto6zE1WI8|G)n!_App>RgR=?0!;WsDPuA6udKawdz|#5I#&+Nm1^*lc55ybTRg zfJxg8;*6;_8`@}vezw783kb&QWlFy zsf>p(qktXxiU)a^m}H#wh>aOeL#Q1V8Bx6rePv=8Y*^(>>RcRc7El%{5I+-Wl%prz zw|2jE)ncqSS@2sPtWJ6*cx?`uVw}h4wP=-8BG@TV7fD#q>w80v$#c3Mjwh(Cx*C(g<>f6{pWlw{wrOPK<&52tks7>EG)S%JdFf#rxRP_+qK zD$4{D9|b-P0QWUHZv%jrg}UBI-6NRia9#ozRE#;oiMBznOw0{ddcip48-cJaAOlC) zRxoHp8jY~M)i>j#tM=Etcr(nBQ_`uqU-YyT0gDiX{<{kS(I06$B?=;N_Q@{?# ztf1a-@^W*FeKGyK`Hbc*^{j%-GLmC#e9dh0UHjrYM&My)dMLtn@*rkB%Z)dNDUWr+ zy>FM1VFN$Y42?EIGz)XG5-@q7)jD(KQ?lGjzBH(man8E}=q?UT1$1u{nrVi=v6&nj zfOrgd97@SXHG^a3KXGk-C*=re8!TX@5puCYp6m*iz1Yc8fm*1Sk|I`FPmebiTL9)_ zW`^-7TWqu&;9y@kdBUZZ^ET>CocbLPkrYp;nK>a&NjqwyTL>zmqjsgYeeFd$d?1Tu zd%(^_u{`uJM2_S+O-JA(W+)%WEJo_0f9kk^deUKs8!eU5V^cOBf|jyjrVaVWI%~X* zUKh$}worE1;{8mFFiYym0;amjwYZ%zRgSJC5R)Bx$cA1OQ8LXS(@23WmoxN4o>MC?Gw4WIq>?gSTI!mZ!n0t$3iC@I8e=9$`jpNqhyLs4@p&ZQto&Fx z`HYAfPTYq07uLY^M4vA)awFdlaSG z3{{x4uWiiv3-bjIfOr_mWdce_3H|hMXO=6-Cx}ZP6t0L3d9yn=JoMMFdte3VBUT;*B~T$?j#a{wlt`Fd_Nm9kFZ!#j-9;2jNSyuXA7huND3p1Ox<%? zL5?A2N^CQdxuh?=Pw%QJff>2lUdBO9_#cb?Q#NC*6 z(0bm{t63m~z%JR-%hpijX5oB0De$|aU+$AhJY-^ObP9n~*-5MRZW<40$&Qe{uI$VR z0*NP(Bmv^ZCeLS2&IF_vH-6&S8EimdDJb8|M{a(y)dI%KQHH(n9^v(@&1J6}s1#u1 zjI03MiEpNEP=Y&3ryDJlxeDa``{dJh>MMCn44Ao*z-9~JmB9bZx2gSy2v+cY<_iVu zS3B%7Z@^>fz-u{chz%dK!makEW07~Ozw71HL-!4=Y&+yl>@%Du|CowCjzPxRQD+=& zbX+&srXcG6mIJ`KiI^_croDWlpw%mBA+84JP>$%zgzz7g1da=AaV!Xmpxn0rhTM zv!}ZH_b`%8*er`va#N76LJCZ*3?hQm`26r)EZqXncV-P(SbJSa*;Z-+ZzPnE-!6b3 zc+^ci`Zk3+mdHH6zBe!bS}UFGa(ig&6~>M+_65my#OW=(++O!H<1U-|Le5g+V6~YZ z^(MLNlRwE4$i|Uz1gUC4P_=cer5#Sit4VgT0i=(eg8q!NN_bNaK7zy!68#gKIcS0p z3D9H#tzIa*O+1XrTRUqWrO8NI$z$DNi!)42=YLsxTQatTeBl%tVnY7VQs@6kSqdm! zGsX@P^!D1#Kj73J`JI<$RC8eBGD~QtmE1}o-&pqT2kbZHpGosStCoLW^}Su?^mg|j z_Fv5`R7qaHlOL0~VuKZnw!=a*e0fd8&}iQPd%|Ex2+0lwnMj$};BPqVt2LeB!Q7@? zc}~unYDW^jM<5FrOeuc^KE*=JDff^QcJx*@v_VeV0VuvkFwWRlk_ja2^w|U?Ka0A` zE4NyGM2ep(*x~aADKR3%{|YLo5$2&(k`*3s^bJK>8OXuUFDHIm{rzX^htIpG+Mie% zzgn5U5!xk77LB(&&66*Q+|J4Xq^LJoHDI?IC~~>obrXffb+es2G?heo244tc|4xKV zw9by>9Zh~<^qEwSDz|qK!or7j(f>WZ_d2~Uy5ROr&a zc*{KJuAO(){0^5unzs;VALemM5%Ee}Z`>5DlpShsWrs2j2o}e$BmR1se7@w{*Oi;j z_x&-qZS}{0&)j_cA?AX5UmWuM@%%GIzg|44)vE84SmO^2g{Nz~5lG7dQc zO{8S7AunB`OY&+(!M=d3XtNl68bxzViqyWlc2gVVdzKrTaX7!J<=4`|8*{@KdYrg^ zeDucKzD4Smy+^PK&F7S_(=w{cXu2exNdb;QNcXK!S188t1J_g?UDH%;$D0@GWiTPtP6h0d~yaqSXb)4%yMOTi!41QTNeOYR#Bco}r+ozn$ z?W5PdeMxwI?P-8X>v%^AlHH)wU=lXi!uD2mS0;oD^gHIJskb7NY>0Rpl}GSk<`rU) z{y!SK<7zAHBfv?HG>84i4wpE$yVy2LfR6gFtvE(3G&C}!c9m+FV{7{Zu4Ins$=}T! z9LNv2E3psk;i~K%{()aj0q9cW$1abM=jPzOyta&A_XQerQ*VUs*#9;aS(Nb75Yc5i zvI9}tUyX}mnelB=F3zUOfiz2?>+~Cum8043k~}BO($%GK$sKmo<;=Q0Bwt5KmR)|? zC0QUq{`dE1OIy?16ML@lBEV_di&l#|zHdn4wO|V^dcyciPX}PXU3LZVd}kA@%RqBG zqBOR5?(`KlTM$v#mq=nk#_ZHt^$Qn-5`X5}m79cr7B#^WTbzG&F1~14xYJA0tQg4f zefv)Ho!RJE@SuF)nRplN^ppG3#`8`stUPbKSMiJV%b!geg1PqW-77SmPn7oeVEu`+ZoH-NkJ)QAA^ra}{eH=9^Bmjvf5)i2y_=#%d&?djGgUHgpA$%9 z6Xn?X#*3McV}GPw>2Vsd#dPl0|2rMTGIAz!7~ zOQ@)dQv|Rgc@O?(KWwHw;33oV#pJF5X6v@C>o&vwFCKhOw%C^XqWwfZdI~UY9gKag z2QitMAQ`Ghr*S%+O?X4kdwk-|SHNk3m8i&(I{&~ijkVaSoXhjPUR%Y^Nk(|z&Mn$> znlJ0L7|oLr-s6m#(f4ealxT2&V22YH8LxL831D&9xbQ&Uw!-Hy_LL8(Kl7+ekqvs# z3^~0gND*d;yv(ac{c_jkr0;?OPf~n%TI}Uq5G%oJX5~V@CdFVtmkj7S}cuuv+5XPIF z9g|tH)p8B1-&Axn-Q>1r8x}ycv)^;BpTEu7!<=l}N@D})xL^y^)(fW^JKc%~fFKw! zCUtfA{b}9h30n5nWEyi0e7WycZd<#eF?8Am760$Z#%08;zER4Lox;O+>H7%mJE0L1 zg)SqP@(6OG?W|Lud`WI;C)ynybfXXWMCEiuyoF%6-k5H0SK859YM@Ega%akQMBH>fiAH4qUKxut-517 zpT&gRo*q08;GDz1d#o<*yJVYjZ591`e9r*9Y%jvv=~CFViwDYbI-#>7so`)pRysn8 zkObmjihzbG8kAgzQL=m;rwR!+!RI7mvcz6fXno&i%=$6-34KSPNlf`hNc}d*H8C=U z&wh{*_0Fe{8W+``)ulGH%=wYNj(odH(=ILGJfpA+jcYDO7e0d|iz0G4km z4Cc{v|8=og!`zmnecOpFl*olJNm$2@Zc3gy2AM`Z9iLFvQuEh8* zzIt}oz1t;fdGwU5F;DqXt(Sj~NxaNhRuc4Junt>(Ga6#b)MlS%C_7K8=}KMdL{_Q& zg@R3hcW6WJNDeWS)xeNTVX+7wH9Lb8r9iMTM9SIa_{_qVpPo95m^XXd7KF=l`fS#F z9*AaE@H?DUDwrvdi)QxcVQhYW0wePtW_Nihmfac9oDtVz)0u5lgiO+to+~CHU)AcVq6Vy=fBrj;QWNwXY)?J<&)l7kQfGnQ-f z>a}+k(%9JGg%0RtvpBfiRu#iHVHwnRVTpCma^XV=8e`}gH-B=0*P3j|f{k$U{&J_Zl=Y{h2rAe-1v&ik><2r=c5?+`Il z1l+8|JmX&9IyI^w3z~_k23Hx5+)b@qSzuu%I|hy0md*`r@ZQCB+a1aj0v4%Qcu#>%w&q}oyyiDrgo z^=KBD)rg8Ts+Bypb+4~Qtt=vYD4>dFlJ^jBQjrc#hm0cV#hE=zhGPmunrNFQ+X^io zicjgG1mMK9|9r=7iwm)ZM;S&iHVv-`jFuDAdcbNKa&lWG%S?>1LDMWq+Y0&xL2Hao zL{UJ3`a?x~C&sK3?Z3CleR^WC4A9M>NRBP7)0dcI{ZDr??Qkgt+dW-VPSvtZz^Pfi za0rSYh5}TiwFeRm!K>s1o5zGKq^$d#u@+F=k12-XM7b_6ymiU*j*g*A zshheP7Pa$<6q#0dHuY53bZPux_tN2%EjO{x?NQ=Zf}#TG#qeRJZkz!dx%|l-Z8i_{ zR*}&mc&+WIuL4cAIiYl9o-;cQIU7WwVj)un?e%d@a8Yt<`<2?w2DNg6^t*dA+4qsFx(z9yp7 z0+@1C*rT3khfx`k%Ht+B1F9XP7|=DK%9Tgpqcwg4Qd^0pQb;T>l3khXu}B091=q%! z5#Ks}j1oK}u&6qOV9Fas)JSFJERC01|UcZry)gq9W|iB>T3I+u%Xjk%Ya z;!J*A9%|x-|1;;-pQkpxZ)lDB^X!YPv;qS2G^sraq*s(>uW4j2GW0@Qe=>p*Fk>|oL5{6aBF6>@q2f>(;WZJj z1g%xx9AYW1YqSzxW&_KPl!-b@NAP+ZJl)E~D3$B@8h}H!)_e6CSfNP0-n4zR9i3%X z7xeEKH;koFU{2i;e+yUEy4%|dLVxQ#(cYMN4Pj8o-?Gp|1LBiYRb;@lJ8nIYNS71c ztXstRIw**Ds=+O-RV@8q=dFhs{>9B%N4};g>-3(H*Xc&ciC2|sCDyzI|3y?e*d`E! zn+FiNgtz_jd%LzTn*Ab?-BI7c$k@Ld!K zlr?MTaauz7&559Dtr=a~T9s{g4qHFV*t}=&wLSYH;b@a)bdENz6=w3ah@BXRSB5{+ zouCtR-eFQUJl+C%%dwMx>&6Y(Di((5e*TAcKt{S7L2RM;D9bOWvF$l=4h4lqPY6^!y2&l-a_iKgc)X4+Q zz*DB7MnV;ltqV?v?mtVXfHsjK<@M{wi{1;qSIv8Nwsq*_fOmZVvIkh1GNXL>B;5)E za<0fk)vsR?^d2qSM)$!+&MsbEK|0pOyYlG>UWm=$bkjrD|&kB)OPyV+fhZBT^yl zOe0b1BM)o6K5FXi(XDWrNhcOTd>h;r0WW-b@8>x#Bl;mX4ip3mml4=RaDJN`JP{y| zAhKT$k#EVEW&3TW8TPje3uLH3FFz7kq`1(BqBhK$BDAJzGDgb295Mup(0I9I0#>&RmZRK9_8#c&;PcF9T3y1qd zI>Gn90cMUi(xeH?sgx_gg6^9;hOryBz1GTQu68}tGsE!EGH-}9%L2u=CeoYXu{2k* zMV-1)U#n3smg_|-B+*`3by@ez6y2(jCgO%)ejulKO^QsflM-;QA;sB8njBE`{TO5V z6}mPfQS)nl`rIYyDi;RhWuY#M21OOXAruMOM{p z0u2k{f`0HrB=}=X&OIG6uwH0sy>((tjqO{Q2WMGCj@o0GC>ngzzQpbFrjP0;yQ40C z^qu+JTkM=XrHXoifR*uq7VYuPjhX+0#}{=q?XoYG>3o%>X#l17SV%l*rh_PN{$tFR zCsDsFzx`0Nux^2q9SbF(vSEbTw)e>v{h4B9<>?#KWL5ke^$5k=_bz4ZJCax35t`w4 z(_8(E8BOPtrOBz0@1%JV3R3(q2w=l$G|RN2uEDw0Czqm2v)6KDhOXfxUo58Om&qcc^=glm|b{wTn7Vu1HgejY1MrC|+e zyhQLayE@IP$Bm0_;26bLI+X`aD?$PkYQ7zDC7PS3>&4QiQ;ndA4Ve9an^Wa{e#)7j z>C#kosRd%6c@t&Ojt9MdC(F6AXUVgc#UA!Ka`EHa+aI~)I8T+D+OP5}B2XE`?3tTt zL=Vq}%axky?eMmTm}~PWR~dO?4w%V<$ULvdCrU8(Kg$ilmjYk;<=Dp9wOp#wZ~MbW z87iQVi~T24n$_WZi42~GjptVMgDuy!tY)-m_z~Q*G}*6ogTFs#dF^rXlA_>c@pUPV zQ6-Q^g{Z{kzmEf-hgPcHvVVJ#RIJPyn)(pH3OGlui)_`znwNb4CxKb9q@tuSg<6@T zUURy0>h_V84$yG;Pnf(!1pPBj4e(#DFWYq` z<8sBIRk0tw`Py96{UVOL6&OuXf(}_gxow25k_VCzADQv~WC)%yI-bciSk4 zGj=$2MR(1Ut9^UNuK2aDZ1fYeUq2RPY8}YcqX~3A?xV0 zg8Aiy9{%#c$QDRZ22y_E#tk=Yp|io@;QtnrjX2Ekpv zMKXRWuw8>Zhz2z;t@UMfpl|uvq)?8|e48HKPWGQX;bYS|*i$`Ct_;cy&?DdM(I|;gnPCFGU+Igxb9^^)osF@Gg{{9a>Epm!k zlTdcdgO+i-D+}-Ui#$mUk z&L#f_&7&_5eW+ndE0-M2`Xt%uGUI;N*!c$)uXp33C#L&)w`CFPpzmhpp3?d#6tSDV zKGgq3OQ>n+fmmS`g;!9RpBi+bDP@qCxcQm-O`lroer-I4zD2A^e9#uk{# z!E0M=`^VbOjoPyBk9Rt)bMgJf%P-%5edEXV#6_D#By6+8m}f4#J+}A3scUXrzGidt zqWUwFk()!WaGiS@8-x0}rZ0%^2 zvlT*?@fW&yTk+9{#K2Rb^?7fwERmT;3KqyOF|&(XWI&i~-jb-Il-Na@@7{kmDP-Qi z+nI}$RpWKj#=VQtu(xQgh}Iun_G!&8ULW)a+cKmR29)CX+2)BrhWj|1uesrJ;IE{B zxgs(NvuVi5MNqJkAkQcRlws!);o)_t2da)R9P+E=cd>(GB`(Kh-ZSl}p9`elnb`UN z5;>AyJ-%Q#Ai)m@<68${MO%}@^K#DvuR&bnYimHhxx!AfO(#dCd<=Q;*VF0!uJK%( z1(RIZU4Gyr{8vL1vUHe;J@@#^_>djd_bJ!C+g-LSzefZ|_UPPp@u0F2+$GqCW5XgQ z;Anhn=IH4{TXif&LW?zY|GF0nYJGB@#O))$i_A2qPF=PrdHQgNr(1xQ zRdbDvKSyabEF|vVu9jr4m1-TaY#9l*WNkjTP?~dEAwsg$Lid7v;TQN z$SlPzlqs{E_H{XT7cT;2wqpKet0-z{=I#6b#P3j@G?v`~q zKh4+z1*bay;275MXvF5O;aAQDoNE-0Tu(01I$x>l;CUa{gbqrxM;#hEarjhal#xJv z>MW;6;08Pi;v$rX@#QvbVzZVyxejrR@iV*x|GNBQBQ#@9$+2=C02B2d?O( z6K@@ezcK2^3#muOy^;E3r#Ge?`!jy@nnTmBc0c(^M4Jkp6W2(lBa{3Ec`htLlA8oq z=jGteH*5qZCP5mJM^?e1 ztokh1rKA4vsM&NWYQx`Q+?zws=(FY3lli<6u)mWnW>*yo8sHed+Bwl)jc{{Zuts75 zXE8z<&VvJT^sa#e8{^~)oImVb9vV{o%YWarUXOCL!Ov6k$h85KTO$R0pOQIh7(Y_4 z2#h=1zH#0NxPF4IiI=_JG}@N8dt;pxt_@&-bqjp&8oE<$+NeE3r1^t7yy-;delI~> z>&x*$V~?giTwZo$!r9p=@$-~bnRW|}%Ii2I&{raIE!ftqWxD)TlWJ@C$RPl!STYNK zV1oTP;i zscYFJS8b+YTTd0V?`Z*oGrElg$)fRpDY zjm9>U$68^x_ww%ea%W`ecmD>fPA^>=73n)J;Ca|XFHfcRPrLl4YQC+0xT_%0oFs!h zCzvg`Fw{VkndlpOBs_C8po?(o;^uZ}SBBmZa=4Rzv+j#SuUga;*sHHw!=;*ziwlSN_egZe!`Vk(gTvX3f4vw ziny)Vxa*&GpF2aiOOo0XC&McjM;-HkD+ zV)T>Vt6U6=)G@W~-(+I%eocg`{d!GJ`~zc@N`tjRKAiS=z80<%k2EP9&GMd-v^QOL z*N{MNE%*PNQMIys@6StJzqmJiQ9E{Q-lk*c!%m3=J*)jpur^3B8RFue!LSbslY;Tl zGWBRT0&N3;5WDqRL<$7WCyKnbj{;DLX$BvRhz7+;r~Hyn_AuXz)rZ^tnjsIR<;;5m zQK`uc3kcpT=z&xEQi4@@a~lFHrSyNafi`iJRl^Q`8VoE?_ejSov>WfDX}Ogv`aSv| z_zD-_{~Vo7J$!xmT29BFgI6Lte^KCJZUkH+9mU-mjE>~q?b9R0(MiybFiE8|9(D@n zS9it`V*h;I=vFn-*Wu40I-V08A;j*Ip8FUuYJCb#2S@gcooaA*Q9Gst&cEYo%z2z^cO2n!M^nD5(+2uBq46r55n4NF0)OiAJA$w_6h(JlcsUplL9 z>Be%PpD!@wEvZ=_UqpJ(9P{oa-PS=eTiTMrgC4aDMen8n%m?^*MNV*Hx_7yl1T4$= z1bs5$Rzyo&hLhxgDeL5X#rY-ePJO#6S>1In9v5;fOkC{LrD5s_dJf_tmu>BPB?#Ud z&}CzN>PSr`#-Z);>saw6T2}y%`orR=;Cr%+f`{wXVsNLPeA@|^U{;S2ON&68>_AARxl$iiRmU_AU*u$mXFjeP$m zy(8#j?0$(?0ji#8yMGv2!sYW$un^>bS7_+&dqXKpusp! ziAxQlwuL&Km`f2SD5Rr?B_6yEXM;q#QA1N~KL{85ziSVF5a44+IQfXL{4r?LIOFQ3 zvlgdlhey;4?Kl~6cledC{GE{Bx!rE?;Yvx?Iqr#g5an3KqIugw-zpXbZ{Jneq92@Y zsLH!IrM9Vm`|PdRpNhZbcLa^}zXXfTUA2?ftBWNtCm0}LkIP|F9HpI9L?i3*SfNEk zs3YVOry327q2Z&Ey`PSq+qNX(kU0FoK)6W^sibUn#}ACo(ZbFMotRSsyx{aGo(8o5 zQi+C?g;R283>*ftdP4#e55_0rtnd<{-L(7DgQ~x?cCZGr!kS*Vlm0d1nCa#}8E@Ad zUJ!fuDZQr?6I$YPB;}D7x5?tSt2Og-Z}-OFiHF4Fa7$lD%BW$cbFG>==zv1xFwbfU zVZc^B-1~muAj`K(^GA3t4%doD>5xB) zrL4MR^FG1eIq>DpNJpUBIKlgd+uQV>-=X}&lZRh-ZU5zBzh!wycCOLsNKn#4o%+P%%~@5gkurGfwpaD5KPe-(3;;9xQ(nhVAz zYC*l!i%^fxX^%B(eJhK%@+H11AS~((Es`Luj>r*fug7=B;&-1nyv zqeS9BQwO=L)356osn+7&=81Vq_=BC($7$~#zg@su zZF^>YZwcr3$MP&(Q`z`7m|=b960GCBC)~_xL7VjQsYqX5doGj}+n!Pc~>6u65ZYv-wV1rIr!=y-nl&QVTg$XevUTY z0>TEz_%H6HnmU#o7C+6DGKqH4S?QR%W;!3if_2J7xgQ~B9ze$IJ{0B$wq-v32Rt!?MLcJiXDmtN)kbV)QIDcML@4L$8i^_?Td4IS4D#GU^n* zDk(jQGH&eekQGOhG|VJ|)u)L{vh2K|^=BK_{x5fW^{eBI7uC(}!9M#XiE4H$;PeqO zt%Q?M$gppV5sVfGOG+uYSJFL^inzn?q}aFca;t-I7)v}DBU|qB+v%_?ktfl=p3_z+ zGE1{+9nbsraZjAy6tRnF!*Wu=lz#h%c)xf0< zjuV_HZVDxr5O5MgN|Iv3;_*W`+S5U{h=n;8Mv=v>UsFD<-ASolIn80p8iye49`AMP z@i$;>1iPb%T{y6iB4%1GP;<(p|DeBo_s&?`uI`l|Iwx-4a=PiTcoYSnv_pynNBr$F z{Lhx@u_epX$$u@nem1&-$Y`<9*5R=szy5P>fqsd~ReG0Rhm8Bbiq1Q(=Kb;GpKw=d`!e)RNDsw9AnsB&Q*zbPtm3bJ{9|(2`G6R*p(Sahh6kge2rNByru$YuvAX z=l9q7_j4YP_k4}#yBq=xk7)UJ)CP*p`#f~)0g)2G5oS0ni0WwGE?b8qo};W#QN53d z=_VoucF|1JP5Q*|ZfNKYKXdxibooFwNzwc3oq%R}MUMe0PM}fDbKqwv)n_}-k)Hq0 z!zoRnlEBU%1{_I!N&N8qU7L=ZdAi0!muzRMm0Rx$QUgqW2(98;bK&!LkBk0R?~Iy} zYwtU9{m%WW#f%YIt=5`c!}@gnW--JD@IQcPF3&-jzAatElJn^COh-j!SdOY1@(fW? z?Y&Y$Ip{WLG8Ms7s)=-Rw7uF@kbI2S;JR0{m`)wrWoX!8IVPgI?Z1$Uvpw+BITuD! z6lGYLmelpx@r+66wqpG$nko8q%67}r4=+C3#wq=JId^Mq%~54k#IN7~uhu?4w-1RX zx7)sCr-#n2zTBy8$zuv&l>(ZmTUmoW-X) z-4pTjN6hCu6ZD^>`Y1eO>p%Fjy8UY0;p-zC6UOC7EE?y<2K(An0Kg6SxTV2B&IU3S z&TiKo272!?-|$CnooOd*pW#vj+O0%!Ow`#c!$~44sVgyjxqM;})aW~_oeLQ}(|GTa zVgGX9un`>dAX5J&PbW~MJO&^|9lZNeZgZn;iU;i%l>S+)0pRS72c+@Hr&%hQl@MXJ zVZ5MwVs21^ql4}ZkKWr9sWRNxDjIDZ@t{aC9*R&$^A{QW>WCH;} zv5?~yxaK?YG{Nn}?9g;|a+xidu<#+O$tOd{%s-X;>Uw3b@y-D^g@S?eyMLT>_>X-; z)9m1uzL=4u=WG*MIq&G%g72N|)Rgl8f;pN%Ykd6cYCz)-9T6jQHfg%TWkQd*avOQJp4;AO8cQANI8Bv> zcOG}lO^agN4bAE6Dy6>n%7~1;I0b;H?7|lj?LOKU!aVor|>nj(P@p>W@RQgX5yQkMMW5vGr3cXI+8Gf26SlXrt<;~yWnc>D<5NoH~ zk8zao60&|aabSHfDWX#@TDS5HB4BHDKbiquTHn;`OraG2mopWEtic`UUzlyOy=JFl zxNAUcknN+oaG#~OZCa}A7y2AJNh}`o4%=xc&n^O6pZALGk~%sI;B+LNM4M`rI-2F3 z4q&y~e#afxEA`Eym^-#tl1`oWTOYdLfB9*;+o<3TwGUToRp1r20E@J7X&C5nW;LNG zGVMVZb$5E?K04Ph9$U;eZ_AC-+WE&+dX##5RSiw4^OMO&6Y+b}!P{NCg9lqqG?@*Z zjKr)BQ*-9yb)86QUga8qyv^*GD95}`DyF7Mp+HomHTJ0hq@mCYCV{AqQ0=fT*sD;i zUp&GyQdmO^v0I|-}oIjS3dbv3+faLNZLp%RM%TSi7@+E_DGykYSKXCMJ5HJ$~!r;|Ch+zjvWD9iMIEFHRiBZ`%d90GQT!?AhTL4@E5YUK7Cyk|L$2&i7%B2&fLG2x-e)hB0^xRL{gfJ$~=l_}=WA1sd9QSCM{v=u2rhiTzz(csOiaKD#0&t zb^H#p2QSO2CVIE^mR^e(?MqMfX9=HxbX{xgQu%PsS%2Bzo=%FZ71l|!=J)CrN9UM) zt#m{dx|btBzhNw*>qvU7?vuAx5`idpWJsxzGGJHfi7W5j5|_VszSny0Y{i#5Z`0nZ zpFH-&fdJ)#Rct1~2VfN*cBnVM3qX2lA~G4UR@GG*)HvR zz3mIrhkF!w?2F>hFhNpEB{bm+*n8(u+&W_0^A*4P|OqqUd5sxI--Vz~QJ8yx`wE07E{dMVEL%2c`4?tm-Da zUCJp~4elt4VNVnTz-{d4_V^6ay72D0GO1`JJ6ts@E$T?r-strk`T+gbj=UyO4!6%T zE)mIQcyltLB!m_fE;RdNthX3%V?;l}MWvyn%x*Urx=}%<3)8ddld@x3=+x- zXGjEEW$`FfA|TUA`j5&iMa-GM@d6x28|Ukx%8=3z)^~wx`j)8$uFkcoFQi^Rz&{dn z&Q^Qaeu+h$O;4P0t|iWc=*;sWNf(Z&7t7%tq^>2ux5cbXsRH#AfaL%Ww=)f0#@p4{ z{70P-?1j-INj!UWT(m3Iwe1x*C+$eIW2J9`|5laXqYp;k+#2EF&I|X@KK7>57udL3 zlIM~sQMTLHMG^H^7~U-v!Gqz)ls0^Yl!~ixbrFaaGuMlC5(P+14&<22V_HhDSw!%r zi?B?JNP-W#ezM!dV(&nh>*KXBND0qvVfjk(T#5ilY&RZ%W-T6_*95s}o!lAX1qf|E1$yxIac1=rcojSZy`8SAw_!@KEt zbN&1GqFn}08UV``6)OJ{#0Z58PB~y;!aq{WClV4%2(V_QL{ij_Avu(b8?(g@>my_~ zK*T^mUrKV3vWfw1V4m_laJo@W^teL)+_6-@=85;JQ2(V*ga4w9Av8Ipv?!Cq=A!?u zAf$8v)TV%X*!NzL5r+Y(9TPNDB{!){E}%%UvS+1x|6utG(uHCreOy%W09M@1(P^~Y z))1T|9USzi`rRrnD~i%77Ln^Ffl^SX3U{!gn=)yIlVfxf1pAf8k48a{OJKv4+7-ck zT_q(pO5%da#zEjroo^oQlgsp&y9nRL(;UJmOexh60n?@6D9Yfjnl2SlJ?gST6LEeL z-0GmGVS!5Ba{5UQO@c9mQk}X2RGDWQziZL-0({;IQA|Vk7hYu!)oVlvc$gAU&3Jo95JQJg6;w)j0G& zLG;_|B!3dgPJd;y^=VxszCcTM)Mcp z6oc^z~8&yvAe;67~rG(acZh&EP>5{5RuuV!Z zv?K|XK_(idCs+QVnD7F1ifGp_1SVm2!yu5^p<7&_wXLIHvy+42?*SJ(C>TM=1fwzN z$*RHbJd0Z_ohBx^wf4mvraW}rViM7O!6)Sc8jir^uS*&xz+fpzbDD(mF4g-_LXPsE zI7GJ@1Q)wG;D3FN3PWH7fm9noNh3WDVUJW20Kphb%3?)%ewg~)fKW@NU&1cNdL1|1 zGB*>T4le&;}C!@x<4t^v!NJ2wtJ($?XD+ML08^F%U7lRiI($ zP=M*~RH@dJ!rBN4L5bfn)fzN04p{Drq+d#Oc8w#_mYTm>&G@+!G7MB%_{aEy{i1!8 zt}JSH;3VS;LjA&BTv!!|$LPYz)iX*iwFu;tp>2#}jL&zIX)A72Qct3k5h*8vqorC& z&=zR9p`czAAw>?SN&7}Bp=}uJwcPB3N3dxnGkDOBQ}ZNq-ZQ8nJ5UY{V=-|ACDtV4 z3E3jCV<(BGnq2cRzPM&6<1xOc~?Rt5h<^q z;-(0FU|_rmZ1DE|AE2PCEaL-AH*v~$0j>%le#C%*(;BD0O*mnysZp?q_m@O`sTgCK z^Jpr-e=HF@9)N;*da08U&hvLmQ?Mcd>Lk*TL}|Oo0p|g~H^WkU;|7VWD$F`G`L(b83YD6@JA7z1Q3%~ffZ33bmUr>0187!kL9pjq`C{BI$PlU zR60-v>PSwVm&;W!fyO(Ppvu$^YedC13QiMfH2=GA&(UiG>OuRH-6j;94~XlOlIkXP z9Wh_TBl7n)aQKYb6jELfYNKM-0t%BvkRA$}OIf+{*j-HoeJP_;s^)cnvq_4RbU-|3SIRX4(5Z{Gt%ly!3z?k7^Nstr;RH zLatMRIKGrB6)?4pqv97tdqtl>^?tZ}(xpJ8frziorAC4m-Ca#TrixW4fMyC$BN)_B z-Lsr0I(rh-^Oc|Vl^#%wQn8d1X2)&|q2HA=lj8`vQmS4h;ivSJ zvRrux)leu%q>fWRF;Ei478&DJ#qnO>R-Pd!#iH|qaBxoY9i7KF@`#Sa$fs$^zfppF zCBsv|W=J>gc`_^P0E_KXVzO~X0B(^2=(JPRBm>drEj>#bX>)qqOH3)#FE<*~ zRFZ48igoTDC%1MGC%!0lGFCdK`#Fq~>%B6|oUtuNscO|;Whp5MBS--Yjufuqu&a=0 z_f-7mAZFE7EoFvMVCt|G(N>Z|igKf5=nYi>MAgb*OCZk)QLs9|Fl}%E zfRa$aX&P+2&6aT3{=m6ca%y-KokYCxOv+HLG)lQ<%mr75CWxKs|U9F{abntZ=~gsqi(;N z=JL3Lw=4AX&#Tkp>8q_;7~p8yB~I&$v$E4i_HSSBI;UvP5^^sww;=44p@~j8OhUnU zOtfB+SCL+JLD{|F;+YPzKR}K3bR3aGJO73N4lV*yD10Kf-0ITRu>27@!iBY1wF=~R z>RjT$wgSbBg&on}>vCG^*0S>tX~R4%2%AW|k}>-H9DXIojgu8V*(?%xE=J>&_uk0# zZ+BRi8gI7biL||a|Ao){&N<7e9#QHa5k@NK+~d8^YLKC&awzq0;{Ny6Dp$?+T~OG; zy5=Z>Emcx<9g4iz|1GOIQ(613l%`W&eb%iJNgT#N%WWrCObP`g3(f) z7O~3wX_`>cqLCdOX-HiA9dJHSa5fFIqs_Z%FUNGu5m;Z4WrN`$fE^)%3Q^s1K)G=f)Z7uItABLznR+jVtGNae zq{P%BMyFV1PU^^&==#H1Z{J4Ml$Y^MJ-(NQ&ZJOH1%RxoU)2_ zZ2WP@?HPonzy54L@!eb5)7?Xy{$|jRVH{NVPGxIPj<3a7UuP%b!6~)facG~q^{Wd$ zTZRyHT=CI3J#B3NBM-eZ_UXW1xfz3PIZ<7+3rl8U4lg{a2j1mYsBVx)>f~h{6C&Xe z(S7{%MYj;sGyT@Fd?o{Sb$c_a_wa`Rw7!!B_-RHxxzE##X6yGtr;WZV?nekKbJ=tn zKiGMx{o@W3kLJRa+bWB(bjIp2NsV%~OrGf~pFtT;w6$xFCO1c3DQqMoeTuYWN0Oo$(DlImxvY9z_;!`7y2sCuq^ z!nzE8R8*I(lGh0k;RG5SU2~*A@SnDb@%$gWsGTXEDwSU? z2o}^rG#z!i1K_{=9z*-Hd^<0&|hN7|QjV1RX75$ajArsUc&mK?w-cNqtN#nyK+N3-Kb`3U)+o>G3HHQ{~=!`8oQIs-VCIFSsq<6dNt7?dv8md;t?~we~h< z4--O;if2Sx&kEN~GR``6TLt5mnKGEaYRi`vO4S;;WU^fj-ae(uq>KXMBOd`DR?C5V z+5pFQQjCz~ATIYI!5Ya8$?VwjS5(*nTimU*L#i<`MzBA*;OZMIR+(P;y-~oUNR)7Xxgfsjl$tMM3%B-<$qj5eQ(=328 zyR#0YcG#Z&Tkbi$OOI$RNY}ziwLJSe5k)^ArWppPh4$iYiaVB)eFE8EG0icrTj}Rw z1^$H|nvy~XEfNOXps2=eZqAAnMYpinQ+4KgK9ZhmTRYan5$+)7yaFjng+5C(y$q&y zh}3m`MYi*Df@LN|DXiCL<=g~!@D1P)IZmAPRN^MU;PJi=g8B4-lLR@azaOOyJ`!mr z`KyFs0G_b0O7Qa(^r$bJcNBvoyE(n(s185VmGk{PL!p3o}AcOq!7Z>8!G%WKKZ4kGxU7Z912`AZ?e z>J4M~HmB}J%g0nNUsNj_>(Q&ga*~JVY!!(ES8JXl6P*H{$OeP<2ti^XLaC1Du`4L) zy7lq!+bJ1X@D2se=)3lcAvP|&qx5bFp|5oNH30Af?Ulp@0j zDrl5)k+f4YSmdV~4hJ+}l$*SB2$9En8T>TwBvT&YM5~j*eoak_(4=EB zB^58mc_Hiei^PtM6ODvTh%zMVq9QWLcOmo;_r=P(ea=LsZVX=Cx{2skm>&?4u1!{a zq4^}d1b7dqW`kKhlSfm=R*s1}|vdWE8GI#1oyn6z+?8r~AC||ej{f!M$2VX~rrdNpfZ~&|41+m9 zLuU@=3M6!RtV1P9=Bf8fe#4%GfSsBZtSKpdI|_NVbp;w0S}=Bm3ZTzpsHTXhSwV3* zZ1v(D(4RvN6sD_ecUp-b*Z~-GJ0P;4likZXrrEcMDkn(0G{SB0Ho4(=niG%W_1ikw zrCYeP<=M6`yVDO8d(fhMGyLKbZ|VNybn_TrpLADY@(7i6_3Fh;WIW$aHv{;!^3`}#0H)%kj5JA?rc9c>v{(a|+$UwXJjx*)G=<3VKHr@9 zBGUuW_&aHNp~KI_SJHrE=MgFHR}R(Fx>Ut&&eJ&Q_T%E~mT{^%>%qN+@c;m+930O4 z68Jf5S%jFCC`xDeZps9@d$li)p3L94=~~ZjuIfepFf!%}R3@RBMyd$37`K3`jY}bXC;(~q@(9hdYIsF1_9gSC?p;yN@>nrF ziP@#WYJykTOQB7G-e1oA?Co%Hj);I#K|y|Ll%%QHcoKOYDE(gaE0enC8$H>j>foREWR0O7a{u;)^Y zvCT-~BB78;)ItGRNL5Lry7R^ELg0V{z>2eaB%&+GSpTkt_AMwkBl}ED-CDDpsS62L z5W+<+VTAxP;79vNN#-|q{=-_j^#1-!Jsa+w4MCaFT{r!^w;s6iBnCDh8H$K_$<~TB z@Z1{MlAEO>q&NV+>xv!E?R16EgUS-HL`vor0tG1bq%uL#xm}mSX92d2hw}8wDTrl zyVj#U>wsHo8h(w3$s{G2Nyy^^ZCto=jY8(3-1DHoDCO}ST*LIF@ZkU{xnNR#2M~8^ z0UuvXST9LUD#U-e4hp#R7Yh1p9Zp9=R+j_mLcD_0|o9tG&q6AS=;wpN}QG;@52B0hI;pa6|md{d*c+Tgu@#_J6JRdURLQM+Hqab7L zLf-XBT4P^y{o4GyJM!&P;ZJF*;5ki_`&q2Mt5d8K@(m_dF0fOHwfu=C} z39g&F0lrX9JRuTwViVe zJB*PM%ZlfVkdaxb|4y6&oO$60G%TkrG#Xv`X=D?3>bFN(1a_+B7Jj3Ip#L2oB1mky z5uTvhLhdi5U6jGgCB&z<;>rq7=pG>kNOCMCaKDIH z2G9jSymE+_f?9K*55@5b6gk}q_BsH+`$NvaYZ=?cS_n6~bl# zFTh~)w8}bgdfUa@jdkX5tw>Cy z2mx3^9*_dsGHL=sQ1BR4g!TeCp{*9TjtgHCfWiJO4S=XXvA48b`|aY^P9R&z$XjfVRy5GhP zf%#50-JU6M<5d+tZQEufe;EM={FrWx;#4}pccQ5z4ew1h45ikA#f1EizHkd zrY)&(D`SC!2yWtphxh$Hl8oZUh2(l6D`wEnqr_{s*}5HkU{_=78~`3tOi+yO0u-Nq zp4eeVD#8e%g_O#LeJe1$5zuVIUli6|PCKDidL_L18pxZTUmaj^$K8~@N{83tYOMQJ zIl8}W*skqt#(}0@{ zsXB+}SKnCOq1C+MHm`D(tMTuUGLFlEua$|Wt6Q#gS|UtBV%<$w13bPkln#K(lH=?` zf~L&W9w69WIqWaN$z=HFKfBChT9UT)*O~0=G9WqbHnU{Hno`0^W()6Mj;n+cgb`QC zAo+z=SBHA)sHV8W#oN!#dug(~sSTCa%X+yNm_|LkdzVjf%v?4H=pl%@@CzH4;;>r@*Tj24L9pDxb zGQkAz8n^85fnNZm7Gv@QbJDg>iotxUjl2(pA?# zA{`aF*66}@+uIju%@|8&BkfqiFfkrRjK!DYueoLWAT$ zzCEkKAw3kK=CZQa(~}D#4SeNC9aFo-dG}(4ixI@CjPSfYhRZS4d=qy9&pje@2Z=G79zR zXRfItOz4wY_d5tV@~t;!PZjCztNjldcus5u#%+oo)@*5~9jf&g=Jx~8-*(G2&PITihT$dU;?L2#n%YiA!( z@ru7K$Dd@E?>tSZ2l3}G6Q;LJ^M#}xLZ9=`eDC$Rm9KOvsg%B8#-Br%0m!e#|F4g=_N` zyaz>~Wi=SiB#Nn;$qFj3gx-ntTN~k{%?Rs-hHe%a;WwcBs{uYAa2n<-IAVXk&3y}c zcT)vdDmM*Vcv2Je@fZs(IGGgKAT67Cr&KVg=P*CJVZKg}_cQtqK?r#O#CI|fFM7Yj zh^oe9+&p%TIYM+$a7F=|o6u2h0U8i0B`>%#WcXhIp7CF4ZdXYkC+U2nBb^>AI(gPuGL$ z2u?%j>@xnzb{Jn7uq_*d#qy@{xF6A-u zN|y`b0jyj=UNb`WkV9iy2gn;(y!{OEA} zW8Ny&nc*M5w?ioKGi3Q!8!~}K2T{qAf$ZX?i?qt<$4#P8> zOX=XDbwDYk=a#$UOWbg|Q-*xzB9aYNQnbzD(dI`)L^Io5`cqN!gRDez2|R%}*>Q>g zkanf#{Ua(XLo`v&gHpvKPJi07bk=>0xV`)DiJr1&)=etgnw@M6SN3}`5-48E>*^kQ zWs*1bco@PIr6a1kLESO>$FnVs7t$h_wk3TQ8@p??W2%_&S(i*wNy3^7!xha-{u|OV z?3KL=%ih4zp00drt|k=dVPyS#oAerFW+;1v8m1H*MEPsAF!wTz|b6?yYJn1m!z zP)nI*xmDLW`+{xDUKND+n<9;4+m|h`FBV-=3*0z)Obru7<5j$ijSAlfJ55=t^205N z|0qrqzMOZ_vpM0tebt(3z3B82@QDv&yGEt}1P8QULAT3%pzpi^bVR93#y&Qgw=X{^48W;y(0s=zLMeGE11Yw=3F zuBPexD?sa)9lk-!)K+P2?G<@Y9b=zo9CZscN+HIJxO! zFr2F#DD`)&cZ|DJM|BSU4n{VHN42}6DqZ+lFgxSe8T=*OkIGERs| z)V(9zWaorgCr@V+Un8{%yw9{5-WZ!Iq^L@P@UUTD0@aqZopajZqvShmsm?SQ(YZkd zCO&daR`@1}I&lTw(d!gOiLxUxEdfZwjKk)ro>0s7REhd?i2RWI)F;^L6g(**@AC zt?BH$D6}ruI;CnC?x}xHVP5k9qPAM|{f3n%xJdwA6M?i|F7~SNdGSZ% zoK|KCpg9Jqb8&6nlT(bXPG0>&<>eO@OLLNC#BhqEu6BteudRfjIaZc6bckmGl zNbB~`EmzmRjA2?xii~*WJlbWaOiQQLB3FsD%%K?2YC{P)VWVSeV?WVDEQbI5B{D{z z5A>qA3FmFGch>XF>xDVwU^%rPqiA{Asw_gP0{d{^m)4U%?EJU*_)L{O<7QnfIBZ&7 z{F~V|;>$g0ugJKjGbi7U0Aw3(pM7+Amxies!4c&s;R``R?0gVSB7pu}?q6gsTpu5j zo8K8U3kp=cWf3TVeg>}0!|{QzKB@830DS9CebM2m=w(;<9$>6(yQ=`$y79XD(!}n% zzV(zfdx}hdnqH!{*mh}~X|j>WDCBXwDqCL}XVC~;IaLSI53lT^#PW$HXE?A{pDxw(u1#?G#>a*lDsYWO&PtddGcpFBTf5t4cG|sk*LjzWngRg-JS%Z3S7H^_@~Y z8)8Mt=39;V^;$12cRZ~cUbpS*^1o}0itqG9{8d?5@cQ;sKwlG59RAuZQEX(>c`R(sl1X1M5_9rY=5@JjsH*{k>X^VQu;K5$+SM7xoabRYs3%2 z3O-!l$ldCQTbj1GD_bF<^3%1D^q#z9$R%$@`25j{5cp|H%40La zh0)k+NrIjg&-g&?NbH$Qs(>|g3-Fb93NKWM&un@BMl#|XLVtP;oS!TBRQWu4KwhIQTSH~4e;=%sVhtGG{T_E6|EqnYAYIbAHhX=)p8LyyE;SrtK?hmGqEJI-J0OOu$vaKQ*vZ?YV_t0o61;|y)zM0LB+Q9G0Rb< zjhYlK?Qd9WsXQfIZ4=nP{wAlJHZtbHoSx$wV_3^iN%V`HnJY9HU z7v-7C#BPUue{+8dl{b4dKyk{fSpD|jNzZo<2mc(AAk?E3eV%sm}} z*oz%*7gZd?55y(!d%JvdR9tA6_FZo=c#D=;VwwaRE*3fABC^sUk!t2jQV79n@qnCbTaMA8Tw77q zkq=Gq$F3}=dc)x9yXaSU?D9=@Q?LHZ9ZN5}*-*8crjE7b-a}MbuQ%9jU0k>U$nF_% zGyi;9VG_}iISXOOt;DcYBuBfIgjm}sqS-STQe1hqwPU}u614`!ougwe`ZM%6aNvtGjue|L2ZII_& zRkVGk_utn9a1m(VXTL_A zUY*yluPe(=3fPWi#PZwTDT~yl>4#5N>{aPdL@o20`||A{97TL-RgI6B=bquw4*4#fC z4L5CcRuEEl{l4rb6&>(^t0|rfh6bRoz7fy*n?WDXl~Pa*-*5EmJ$#D~qr`o-K=c9e6R#m6BYu{Kic4zIL*!E3ZeDvO|S<=o(eYc9U z)@8kCzb)((Co%O3dh*Yl)uxPo+$Nc-Q}E@C5Mpg;z^k?7S5Jbs+gh3i_QqCQ75nsh zsh-iU#*bw*K!YP2L~6`C>wDI^^gIP-vRqz0J+Ry3sRhUV+v63wVbQM`#4o)|UOL2W z58Jw2#%>+NTS3b8qbA?he5nr&eBcuF_wB1+5Wm9Uh}dce(iM#a_6dIapH3jM6&_1$ zynA`w`>JOfdmbG)8nh}lc)aZa_l{U#lrPd9iCL_5s2jZc+G8y9Y5qzp>k zk@Hqh+D-@Db>Qb;>c*|?k5&umTrRHrw#Ka8ujgp1<&O&&U)_FF%eR_|usV>w|LDY? z%=MeBHWk{xDhu3n;=slg+c!mJg^#`AJwLZ;!|#sP#V0S?dtTkG<-W@5zZ1%T{WKug zD&m4sWd82qM*{fVOhm`m*KfUSRGS_aw?{tSvhm4{=i?t9AKnrWb#Rkv-lorVKDKgm z%ZANoY9vcyn~J^s5(+oVw~r_4f_Xs^qbeErvGksU!#%rw9FSKdo7y$qUp)_e_4iu& z$E+8v_>f$OeAH@G_nmzGoflsoY^2^51nnJN5<6yebz{f5*STtu#M*EJ8?lY=(ZKdG z%dm{?uhwdP?_OFrS-N{8K29+Dbn+bi^)21aJo=Qr)z}wZ4+HmT!wRl`Wc1b_*$nGZ zpMzt++DHA)O$9ty7kK))6(Q#DtLt^bUg51{o>0S{t(>-B91Y-Xn*NVE_4!-xxK*@s zMNDuB_t#~w4b!iF?2cw0n>twhgd^Hee-v-9qcglXsy;~YaZ4=W&xGBm_pRLl4inRR z$WwpGADnmCtZzN_;_sP_@SB&nr&p(j`V%Hhj!toPpisSZW&WEbt+W1Hf?t$B+0gRF zCsnS?*!-z>Ci456fC~9}qggEIbxfFrzuW6AcVkTsO>Lu3FjF_I_%>_HXfioCb8hAI zvo}%wtEYE<+ybn8YpXKLmc@Qu9=a!)lji=KJ}YM=&%V~(Dq>9RXGEz<-{EdX1cUeQI$ye!un06NC`)@PqWo z=_P06nW^v2#^q_0JCu+zG2P_!&RF;Dm5JWUyYp3l9-j7o>q3dEjhx?| z9pkxu^S6WZrGI92A9}aCVyn`}Hw|@(*Szzq@6KE|PTU(cU+n!pCo=IumqVFjVr};O zfYi`kVITg3-?ybsw>u^_>2-cR_fAR(zIXIP`|vx-><39$eC;sUb~H)9;=`)cZG*-e zA_iYP>V0=}czU>@`u?GWM{(P8!onWAZ+}t|^Yre!&e5a?vp2?#XGfA>dtOa?)$*aE zrJnNs??(;UcaJ4i)+W6POPp!>n71#iQ~l%kndJGqAOBJJnV9(4U-xkympm#00N4Km DD`vBj literal 0 HcmV?d00001 diff --git a/inside/includes.php b/inside/includes.php new file mode 100644 index 0000000..ca9fc70 --- /dev/null +++ b/inside/includes.php @@ -0,0 +1,231 @@ + "barshifts", + "change-username" => "quick", + "display-action" => "access", + "display-actiongrouprelationships" => "access", + "display-actions" => "access", + "display-all-calendar" => "", + "display-article" => "webpages", + "display-articles" => "webpages", + "display-barshift" => "barshifts", + "display-barshifts" => "barshifts", + "display-barshifts-calendar" => "barshifts", + "display-bugreport" => "messages", + "display-bugreports" => "messages", + "display-cart" => "webshop", + "display-carts" => "webshop", + "display-concert" => "concerts", + "display-concerts" => "concerts", + "display-concerts-calendar" => "concerts", + "display-current-user" => "quick", + "display-division" => "divisions", + "display-division-requests" => "users", + "display-divisions" => "divisions", + "display-documents" => "documents", + "display-event" => "events", + "display-events" => "events", + "display-events-archive" => "events", + "display-events-calendar" => "events", + "display-group" => "access", + "display-groups" => "access", + "display-job" => "jobs", + "display-jobs" => "jobs", + "display-jobs-archive" => "jobs", + "display-position" => "divisions", + "display-positions" => "divisions", + "display-product" => "webshop", + "display-sales" => "webshop", + "display-sales-item" => "webshop", + "display-user" => "users", + "display-user-expiries" => "users", + "display-usergrouprelationships" => "users", + "display-users" => "users", + "display-users-study-place" => "users", + "display-webshop" => "webshop", + "edit-action" => "access", + "edit-actiongrouprelationship" => "access", + "edit-article" => "webpages", + "edit-barshift" => "barshifts", + "edit-category" => "settings", + "edit-concert" => "concerts", + "edit-division" => "divisions", + "edit-documentcategory" => "settings", + "edit-event" => "events", + "edit-eventcategory" => "settings", + "edit-group" => "access", + "edit-job" => "jobs", + "edit-jobcategory" => "settings", + "edit-membership" => "users", + "edit-position" => "divisions", + "edit-product" => "webshop", + "edit-user" => "users", + "edit-usergrouprelationship" => "users", + "payex-form" => "users", + "register-action" => "access", + "register-actiongrouprelationship" => "access", + "register-article" => "webpages", + "register-barshift" => "barshifts", + "register-category" => "settings", + "register-concert" => "concerts", + "register-division" => "divisions", + "register-documentcategory" => "settings", + "register-user-ea-update" => "users", + "register-event" => "events", + "register-eventcategory" => "settings", + "register-group" => "access", + "register-job" => "jobs", + "register-jobcategory" => "settings", + "register-membership" => "quick", + "register-membership-bankpayment" => "users", + "register-position" => "divisions", + "register-product" => "settings", + "register-user" => "users", + "register-usergrouprelationship" => "users", + "renew-membership" => "users", + "reset-password" => "", + "upload-document" => "documents", + "week-program" => "concerts" + ); + +?> \ No newline at end of file diff --git a/inside/index.php b/inside/index.php new file mode 100644 index 0000000..8feba2b --- /dev/null +++ b/inside/index.php @@ -0,0 +1,13 @@ +performAction(); + +$p = new Page(); +$p->display(); + +?> \ No newline at end of file diff --git a/inside/info.php b/inside/info.php new file mode 100644 index 0000000..cf60860 --- /dev/null +++ b/inside/info.php @@ -0,0 +1,3 @@ + diff --git a/inside/language.php b/inside/language.php new file mode 100644 index 0000000..5dbeee8 --- /dev/null +++ b/inside/language.php @@ -0,0 +1,61 @@ + \ No newline at end of file diff --git a/inside/language/en/common.php b/inside/language/en/common.php new file mode 100644 index 0000000..f129488 --- /dev/null +++ b/inside/language/en/common.php @@ -0,0 +1,11 @@ + 'M d, Y', + 'LANGUAGE' => 'english', + + 'SEARCH' => 'Search', + 'CLICK_HERE' => 'Click here', + )); + +?> \ No newline at end of file diff --git a/inside/language/en/iso.txt b/inside/language/en/iso.txt new file mode 100644 index 0000000..7b39fc8 --- /dev/null +++ b/inside/language/en/iso.txt @@ -0,0 +1,3 @@ +British English +British English +hpa \ No newline at end of file diff --git a/inside/language/en/member.php b/inside/language/en/member.php new file mode 100644 index 0000000..ed64517 --- /dev/null +++ b/inside/language/en/member.php @@ -0,0 +1,14 @@ + 'Membership registration', + 'NEW_MEMBER' => 'New member', + 'NEW_MEMBER_EXPLAIN' => 'You can register here if you haven\'t been a member before.', + 'FORMER_MEMBER' => 'Are you a former member ?', + 'FORMER_MEMBER_EXPLAIN' => 'We have all former members from the previous years registered in our database. You can see which e-mail address you are registered with on your membership card. Enter your e-mail address to see if you are allready registered.' , + 'UPDATE_CONTACT_INFO' => 'Do you want to update your contact information?', + 'UPDATE_CONTACT_INFO_EXPLAIN' => 'You can update your contact information here if you have made a registration earlier, but have moved or changed other contact information.', + 'ENTER_EMAIL' => 'Enter your e-mail address', + )); + +?> \ No newline at end of file diff --git a/inside/language/nb/common.php b/inside/language/nb/common.php new file mode 100644 index 0000000..db28725 --- /dev/null +++ b/inside/language/nb/common.php @@ -0,0 +1,11 @@ + 'M d, Y', + 'LANGUAGE' => 'norsk', + + 'SEARCH' => 'Søk', + 'CLICK_HERE' => 'Klikk her', + )); + +?> \ No newline at end of file diff --git a/inside/language/nb/iso.txt b/inside/language/nb/iso.txt new file mode 100644 index 0000000..26ebd1e --- /dev/null +++ b/inside/language/nb/iso.txt @@ -0,0 +1,3 @@ +Norwegian Bokmål +Norsk Bokmål +hpa \ No newline at end of file diff --git a/inside/language/nb/member.php b/inside/language/nb/member.php new file mode 100644 index 0000000..b2844f7 --- /dev/null +++ b/inside/language/nb/member.php @@ -0,0 +1,14 @@ + 'Registrere medlemskap', + 'NEW_MEMBER' => 'Nytt medlem', + 'NEW_MEMBER_EXPLAIN' => 'Om du ikke har vært medlem tidligere kan du registrere deg.', + 'FORMER_MEMBER' => 'Har du vært medlem tidligere?', + 'FORMER_MEMBER_EXPLAIN' => 'Vi har registrert alle som har vært medlem de siste årene i databasen vår. Du kan se hvilken e-post adresse du er registrert med på medlemskortet ditt. Tast inn din epostadresse for å se om du allerede er registrert:' , + 'UPDATE_CONTACT_INFO' => 'Oppdatere din kontaktinformasjon?', + 'UPDATE_CONTACT_INFO_EXPLAIN' => 'Er du registrert tidligere, men har flyttet eller endret annen kontaktinformasjon kan du oppdatere dette.', + 'ENTER_EMAIL' => 'Tast inn epost', + )); + +?> \ No newline at end of file diff --git a/inside/linker.php b/inside/linker.php new file mode 100644 index 0000000..860044d --- /dev/null +++ b/inside/linker.php @@ -0,0 +1,13 @@ + diff --git a/inside/menuExpandable3.js b/inside/menuExpandable3.js new file mode 100644 index 0000000..236ad35 --- /dev/null +++ b/inside/menuExpandable3.js @@ -0,0 +1,39 @@ +/* + * menuExpandable3.js - implements an expandable menu based on a HTML list + * Author: Dave Lindquist (http://www.gazingus.org) + */ + +if (!document.getElementById){ + document.getElementById = function() { + return null; + } +} + +function initializeMenu(menuId, actuatorId) { + var menu = document.getElementById(menuId); + var actuator = document.getElementById(actuatorId); + + if (menu == null || actuator == null){ + return; + } + + actuator.parentNode.style.backgroundImage = "url(graphics/plus.png)"; + actuator.onclick = function() { + var display = menu.style.display; + this.parentNode.style.backgroundImage = + (display == "block") ? "url(graphics/plus.png)" : "url(graphics/minus.png)"; + menu.style.display = (display == "block") ? "none" : "block"; + + return false; + } +} + +function menuExpandCurrentSection(menuId){ + var menu = document.getElementById(menuId); + if (menu == null){ + return; + } + menu.parentNode.style.backgroundImage = "url(graphics/minus.png)"; + menu.style.display = "block"; +} + diff --git a/inside/pos.php b/inside/pos.php new file mode 100644 index 0000000..9d3b0f5 --- /dev/null +++ b/inside/pos.php @@ -0,0 +1,25 @@ +'); +require_once "includes.php"; + +header("Content-type: application/xml"); + + + + $conn = db_connect(); + + $posId = $_REQUEST['positionid']; + + $sql = "SELECT name, text + FROM din_position + WHERE id = $posId"; + + $result = $conn->query($sql); + $row =& $result->fetchRow(DB_FETCHMODE_OBJECT); +?> + + + + <?php print $row->name; ?> + text; ?>]]> + diff --git a/inside/print.css b/inside/print.css new file mode 100644 index 0000000..d78135f --- /dev/null +++ b/inside/print.css @@ -0,0 +1,403 @@ +/* =general +*********************************************************************/ + +html, body { + margin: 0; + padding: 5px; + font-size: .905em; + line-height: 1.5em; + font-family: arial, sans-serif; +} + +img { + +} + +p { + margin: 0 0 5px 0; + padding: 0; +} + +em { + font-style: italic; +} + +strong, p.strong { + font-weight: bolder; +} + +img { + border: none; +} + +/* =links +*********************************************************************/ + +a { + margin: 0; + padding: 0; + text-decoration: none; + color: #00D; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: #00D; +} + +th a { + color: #000; +} + +th a:visited { + color: #000; +} + +.optionsMenu a, a.button { + border: 1px solid #CCC; + background: #DDD; + padding: 1px 5px; + margin: 3px 0; + letter-spacing: 1px; + color: #000; + font-weight: bold; + white-space: nowrap; +} + +a.read { + font-weight: normal; +} + +a.unread { + font-weight: bold; +} + +a.skip-nav { + display: none; +} + +/* =lists +*********************************************************************/ + +ul { + +} + +li { + +} + +ul.linker, .linker li { + margin: 0; + padding: 0; + list-style: none; +} + +/* =forms +*********************************************************************/ + +form { + margin: 0; + padding: 0; +} + +textarea, input { + font-family: arial, sans-serif; + line-height: 1.2em; + font-size: 1em; +} + +.readonly { + background: inherit; + border: none; +} + +fieldset { + width: 90%; + max-width: 600px; + padding: 15px; + border: 3px solid #CCC; +} + +fieldset label { + font-weight: bold; +} + +legend { + font-weight: bold; + padding: 0 5px; + color: black; +} + +fieldset input, fieldset select, fieldset textarea { + margin: 0 15px; +} + +input.submit { + margin: 0px; + width: 100px; +} + +div.horizontal-form { + padding: 3px; + margin: 5px 0; + background: #EEE; + border: 1px solid #CCC; + font-weight: bold; +} + +.delete { + text-align: right; + color: red; + font-weight: bold; +} +/* =tables +*********************************************************************/ + +table { + margin: 5px 0; + padding: 0; + border: 1px solid #CCC; +} + +th { + padding: 0 5px; + text-align: center; + font-weight: bold; + letter-spacing: 2px; + background: #DDD; +} + +tr { + padding: 0px; + margin: 0px; +} + +td { + vertical-align: top; + padding: 0px 5px; + background: #EEE; +} + +td.label { + font-weight: bold; + text-align: right; +} + +td.number { + text-align: right; +} + +table.calendar { + width: 98%; + margin: 0 auto; +} + +.calendar td { + padding: 0; + margin: 0; + border: 1px solid black; +} + +td.passive { + background: #AAA; +} + +td.weekNumber { + background: #DDD; + text-align: center; + vertical-align: middle; + font-weight: bold; +} + +.calendar td div { + padding: 2px 1px; + margin: 1px; + font-size: 0.9em; + line-height: 1em; + border-bottom: 1px dotted #000; +} + +td h4 { + text-align: right; +} + +th a { + display: block; +} + +table.sortable tr:hover td { + background: #DDD; +} + +td.unread { + text-align: center; + font-size: 1.8em; + line-height: 0.1em; + padding: 15px 5px 0px 3px; +} + + +/* =headings +*********************************************************************/ + +h1, h2, h3, h4, h5, h6 { + margin: 0; + padding: 0; + line-height: 1.2em; +} + +h1 { + font-size: 2em; +} + +h2 { + font-size: 1.5em; + text-align: center; +} + +h3 { + font-size:1.2em; +} + +h4 { + font-size: 1em; + font-weight: bold; +} +/* =header +*********************************************************************/ +#header { + background-color: #EEE; + border: 1px solid #CCC; + -moz-border-radius: 8px; + color: #000; + text-align: center; + letter-spacing: 3px; +} + +#header h1 a { + text-decoration: none; + color: #000; + display: block; +} + + + +/* =navigation +*********************************************************************/ + + +#nav { + display: none; +} + +/* =content +*********************************************************************/ +#content { + padding: 0px; + margin: 0px; +} + +p.date { + font-style: italic; +} + +p.date:first-letter { + text-transform: uppercase; +} + + +p.intro { + font-weight: bold; + font-style: italic; +} + +div.messages, div.errors { + margin: 0 0 5px 0; + padding: 0; + background: #EEE; + border: 1px solid #CCC; +} + +div.timeData { + border: 1px solid #CCC; + background: #EEE; + padding: 1px; +} + +div.optionsMenu { + margin: 5px 0; +} + +div.comments { + border-top: 2px solid #CCC; + +} + +div.comment { + border-top: 2px solid #CCC; + padding: 5px 0; + position: relative; +} + +div.comment-meta { + position: absolute; + +} + +div.comment-main { + margin-left: 150px; + min-height: 60px; + border-left: 2px dotted #CCC; + padding-left: 5px; +} + +* html div.comment-main { + height: 60px; +} + +/* =footer +*********************************************************************/ +#footer { + display: none; +} + + + +/* =extras +*********************************************************************/ +.domenabled ul#finder, .domenabled ul#finder li, .domenabled ul#finder ul { + list-style-type:none; + margin: 5px 0; + padding:0; + line-height: 1em; +} + +.domenabled ul#finder ul.hidden { + display: none; +} +.domenabled ul#finder ul.shown { + margin: 3px 25px; + display: block; +} + +.domenabled ul#finder li a { +} + +.domenabled #finder a.open { + font-weight: bold; + display: block; + color: black; +} + +.domenabled #finder a.parent { + color: black; +} + + +.domenabled div.disabled { + display: none; +} diff --git a/inside/print_prog.css b/inside/print_prog.css new file mode 100644 index 0000000..5388daf --- /dev/null +++ b/inside/print_prog.css @@ -0,0 +1,7 @@ +a { + color: red; +} + +body { + background: black; +} \ No newline at end of file diff --git a/inside/programutvalg.php b/inside/programutvalg.php new file mode 100644 index 0000000..40aba96 --- /dev/null +++ b/inside/programutvalg.php @@ -0,0 +1,79 @@ + + + + + + Programutvalg for Det Norske Studentersamfund + + + + +

    '; + } +} + +function ts_getInnerText(el) { + if (typeof el == "string") return el; + if (typeof el == "undefined") { return el }; + if (el.innerText) return el.innerText; //Not needed but it is faster + var str = ""; + + var cs = el.childNodes; + var l = cs.length; + for (var i = 0; i < l; i++) { + switch (cs[i].nodeType) { + case 1: //ELEMENT_NODE + str += ts_getInnerText(cs[i]); + break; + case 3: //TEXT_NODE + str += cs[i].nodeValue; + break; + } + } + return str; +} + +function ts_resortTable(lnk) { + // get the span + var span; + for (var ci=0;ci diff --git a/inside/ukesprogram.php b/inside/ukesprogram.php new file mode 100644 index 0000000..c7e158a --- /dev/null +++ b/inside/ukesprogram.php @@ -0,0 +1,424 @@ +performAction(); + $page = new Page(); + $page->display(); + exit(); + } + // Ikke tilgang til å redigere + $mode = "view"; + } +?> + + + + + Ukesprogram for Det Norske Studentersamfund + + + + + + + + + + + + + +
    + +week - 1; + $start = date("Y-m-d", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year")))); + $picture = true; +?> +
    + Topp 1: + +
    + Topp 2: + +
    + Topp 3: + +
    +
    + + + +

    + Det Norske Studentersamfund +

    + +\n"; + print "\n"; + + for ($i = 0; $i < 3; $i++) { + $gigno = "gig" . ($i+1); + $gig = new Concert($prog->$gigno); + + print "\n"; + print "
    \n"; + print "

    "; + print htmlentities($gig->name); + print "

    \n"; + + print "

    "; + print strftime("%A %d. %B, %H:%M", strtotime($gig->time)); + print "

    \n"; + print "
    \n"; + + print "
    \n"; + + if ($gig->picture) print "picture . "&maxwidth=170\" alt=\"\" />\n"; + print "
    \n"; + + print "
    \n"; + + print "

    "; + print stripslashes($gig->intro); + print "

    \n"; + print "

    " . + "id . "\">Les mer»

    \n"; + print "
    \n"; + print "\n"; + } + print "\n"; + print "\n"; + + print "
     
    \n"; + + if ($mode == EDIT_MODE) { + print "

    endre tekst:

    \n"; + } + + print "
    \n"; + print "

    \n"; + print nl2br($prog->pretext); + print "

    \n"; + print "
    \n"; + print "
    \n"; + + print "
    \n"; + print "\n"; + + $week = $prog->week - 1; + $start = date("Y-m-d", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year")))); + $week = $prog->week; + $end = date("Y-m-d 23:59", strtotime("last sunday", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year"))))); + $week_list = $gigs->getListWeek($start, $end); + function month2maaned ($month) { + switch ($month) { + case 1: + return "jan"; + case 2: + return "februar"; + case 3: + return "mars"; + case 4: + return "april"; + case 5: + return "mai"; + case 6: + return "juni"; + case 7: + return "juli"; + case 8: + return "august"; + case 9: + return "sept."; + case 10: + return "okt."; + case 11: + return "nov."; + case 12: + return "des."; + default: + return ""; + } + } + + function day2dag ($day) { + switch ($day) { + case 0: + return "søndag"; + case 1: + return "mandag"; + case 2: + return "tirsdag"; + case 3: + return "onsdag"; + case 4: + return "torsdag"; + case 5: + return "fredag"; + case 6: + return "lørdag"; + default: + return ""; + } + } + + $lastday = 0; + // List all events this week + while ($current = $week_list->fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); + + // Choose if event should be view in week program + if (isset($_POST["gigid"]) && ($_POST["gigid"] == $gig->id)) { + if (isset($_POST["dontShow"])) + $gig->viewWeekprogram = 0; + elseif (isset($_POST["show"])) + $gig->viewWeekprogram = 1; + //print "update: gig=" . $gig->id . ", show=" . $gig->viewWeekprogram; + $gig->store(); + } + + // Always show all events when we are in edit mode + // if not, only show events which have viewWeekprogram enabled + if ($mode == EDIT_MODE || $gig->viewWeekprogram) { + + // Print line with day ? + if ($lastday != date("wm", strtotime($gig->time))) { + if ($lastday) { + print ""; + print ""; + print "\n"; + } + print "\n"; + print "\n"; + print "\n"; + $lastday = date("wm", strtotime($gig->time)); + } + + // Start table row + print "\n"; + + // Print gig category and time + //print "\n"; + + // Print gig picture if defined + print "\n"; + + // Print gig name and short info + print "\n"; + + // Print gig place and price + print "\n"; + + // Add edit stuff if we are in edit mode + if ($mode == EDIT_MODE) { + print "\n"; + } + + // done with this gig's info + print "\n"; + } + } +?> +
    "; + print ucfirst(day2dag(date("w", strtotime($gig->time)))); + print date(" j. ", strtotime($gig->time)); + print month2maaned(date("m", strtotime($gig->time))); + print "
    \n"; + //print "" . $gig->concertcategory_id . ""; + //print "
    "; + //print date("j. ", strtotime($gig->time)) . month2maaned(date("m", strtotime($gig->time))) . "
    kl " . date("H:i", strtotime($gig->time)); + //print "kl " . date("H:i", strtotime($gig->time)); + //print "
    \n"; + if ($gig->picture) { + print "picture . "&maxwidth=100\" alt=\"\" />\n"; + } + print "\n"; + print "" . prepareForHTML($gig->name) . "\n"; + print "
    \n"; + print prepareForHTML($gig->intro); + print " id . "\">Les mer»"; + print "
    \n"; + print $gig->concertcategory_id . "
    "; + print "" . rtrim($gig->venue_name) . "\n"; + print "
    \n"; + print "kl " . date("H:i", strtotime($gig->time)); + print "
    \n"; + if ($gig->priceNormal == 0 && $gig->priceConcession == 0) { + print "Fri inngang"; + } else { + print "Cc: " . $gig->priceNormal . "/" . $gig->priceConcession . "\n"; + } + print "
    "; + print "
    "; + print "id . "\">"; + if ($gig->viewWeekprogram) { + print ""; + } else { + print ""; + } + print "
    "; + print "
    +
    + + +

    endre tekst:

    + +
    +
    +

    posttext); ?>

    +
    +
    + +
    +

    Våre samarbeidspartnere:

    + Toro + Aftenposten +
    +
    +

    Det Norske Studentersamfund

    +

    www.studentersamfundet.no

    +

    Chateau Neuf, Slemdalsveien 15, 0369 Oslo, tlf: 22 84 45 11

    +
    +
    + + diff --git a/inside/ukesprogramprint.php b/inside/ukesprogramprint.php new file mode 100644 index 0000000..030353f --- /dev/null +++ b/inside/ukesprogramprint.php @@ -0,0 +1,61 @@ + + + + + + Ukesprogram for Det Norske Studentersamfund + + + + +
    + + + +
    Det Norske Studentersamfund
    +
    +week - 1; +$start = date("Y-m-d", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year")))); +$week = $prog->week; +$end = date("Y-m-d 23:59", strtotime("last sunday", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year"))))); +$week_list = $gigs->getListWeek($start, $end); +?> + +fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); +?> + + + + + + + + +
    + time)); ?>concertcategory_id; ?>name); ?>
    intro); ?>
    venue_name; ?>priceNormal; ?>/priceConcession; ?>
    +
    + + + \ No newline at end of file diff --git a/inside/ukesprogramtekst.php b/inside/ukesprogramtekst.php new file mode 100644 index 0000000..ce01583 --- /dev/null +++ b/inside/ukesprogramtekst.php @@ -0,0 +1,51 @@ + + +Ukesprogram for Det Norske Studentersamfund + +pretext); ?> + +week - 1; +$start = date("Y-m-d", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year")))); +$week = $prog->week; +$end = date("Y-m-d 23:59", strtotime("last sunday", strtotime("+$week week", strtotime("monday", strtotime(" 1 jan $prog->year"))))); +$week_list = $gigs->getListWeek($start, $end); +?> +fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); +?> + + +concertcategory_id; ?>: name)); ?> + +venue_name; ?> - time)); ?> + +Pris: priceNormal; ?>/priceConcession; ?> + +intro)); ?> + + + +posttext); ?> + + +Våre samarbeidspartnere: +Toro +Aftenposten + +Det Norske Studentersamfund +www.studentersamfundet.no +Chateau Neuf, Slemdalsveien 15, 0369 Oslo, tlf: 22 84 45 11 diff --git a/inside/ukesprogramuniversitas.php b/inside/ukesprogramuniversitas.php new file mode 100644 index 0000000..48df8f2 --- /dev/null +++ b/inside/ukesprogramuniversitas.php @@ -0,0 +1,197 @@ + + +Ukesprogram for Det Norske Studentersamfund + +week - 1; +$start = date("Y-m-d", strtotime("+$week week", strtotime("wednesday", strtotime(" 1 jan $prog->year")))); +$week = $prog->week; +$end = date("Y-m-d 23:59", strtotime("+$prog->week week", strtotime("wednesday", strtotime(" 1 jan $prog->year")))); +$week_list = $gigs->getListWeek($start, $end); +?> +fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); +?> + + +@plakdag:time)); ?> + +@plaktxt:host_name; ?>name)); ?> - intro)); ?> +venue_name; ?>, time)); ?>. priceNormal; ?>/priceConcession; ?> +week - 1; +$start = date("Y-m-d", strtotime("+$week week", strtotime("wednesday", strtotime(" 1 jan $prog->year")))); +$week = $prog->week; +$end = date("Y-m-d 23:59", strtotime("+$prog->week week", strtotime("tuesday", strtotime(" 1 jan $prog->year")))); +$week_list = $gigs->getListWeek($start, $end); + +$mode = scriptParam("mode"); +?> + + + + + Ukesprogram for Det Norske Studentersamfund + + + + + + + + + + +
    + +

    Det Norske Studentersamfund

    + +
    + + +fetchRow(DB_FETCHMODE_OBJECT)) { + $gig = new Concert($current->id); +?> + + + + + + +
    time)); ?>concertcategory_id; ?>: name); ?>.time)); ?>, venue_name; ?>, priceNormal; ?>,-/priceConcession; ?>,-
    +
    + + +

    endre tekst:

    +
    +
    +

    posttext); ?>

    +
    +
    + + +
    +

    Våre samarbeidspartnere:

    + Chess + Samsung + Toro + Nescafé + Dagbladet + Kanal 24 +
    +
    +

    Det Norske Studentersamfund

    +

    www.studentersamfundet.no

    +

    Chateau Neuf, Slemdalsveien 15, 0369 Oslo, tlf: 22 84 45 11

    +
    +
    + + \ No newline at end of file diff --git a/inside/updatelaststicker.php b/inside/updatelaststicker.php new file mode 100644 index 0000000..a9b3447 --- /dev/null +++ b/inside/updatelaststicker.php @@ -0,0 +1,12 @@ +'); + +require_once "includes.php"; + +$userid = $_GET['userid']; +$value = $_GET['value']; +$user = new User($userid); +$user->updateLastSticker($value); + +?> diff --git a/inside/updateuserexpiry.php b/inside/updateuserexpiry.php new file mode 100644 index 0000000..125f5e8 --- /dev/null +++ b/inside/updateuserexpiry.php @@ -0,0 +1,12 @@ +'); + +require_once "includes.php"; + +$userid = $_GET['userid']; +$value = $_GET['value']; +$user = new User($userid); +$user->updateExpiry($value); + +?>