?PNG  IHDR ? f ??C1 sRGB ?? gAMA ? a pHYs ? ??od GIDATx^LeY?a?("Bh?_????q5k?*:t0A-o??]VkJM??f?8\k2ll1]q????T
Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/user1137782/www/china1.by/classwithtostring.php on line 86

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 213

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 214

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/user1137782/www/china1.by/classwithtostring.php:6) in /home/user1137782/www/china1.by/classwithtostring.php on line 218
license.txt000066600000063473150472426320006755 0ustar00 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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 Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] 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 Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these 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 other code 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. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. 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, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser 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 combine 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) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) 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. d) 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. e) 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 materials to be 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 with 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 Lesser 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 How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This library 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 library 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 library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. , 1 April 1990 Ty Coon, President of Vice That's all there is to it! tiny_mce_popup.js000066600000011250150472426320010144 0ustar00 // Uncomment and change this document.domain value if you are loading the script cross subdomains // document.domain = 'moxiecode.com'; var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document,{ownEvents:true,proxy:tinyMCEPopup._eventProxy});b.dom.bind(window,"ready",b._onDOMLoaded,b);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write(''); Jare_Typograph_Tool::addCustomBlocks(''); $this->_text = Jare_Typograph_Tool::safeCustomBlocks($this->_text, true); $this->_text = Jare_Typograph_Tool::safeTagChars($this->_text, true); $this->_text = Jare_Typograph_Tool::clearSpecialChars($this->_text, Jare_Typograph_Tool::CLEAR_MODE_UTF8_NATIVE | Jare_Typograph_Tool::CLEAR_MODE_HTML_MATTER); foreach ($tofs as $tofName) { $this->getTof($tofName)->parse(); } $this->_text = Jare_Typograph_Tool::safeTagChars($this->_text, false); $this->_text = Jare_Typograph_Tool::safeCustomBlocks($this->_text, false); return $this->_text; } }plugins/jaretypograph/Jare/Typograph/Param.php000066600000010062150472426320015523 0ustar00 * @category Jare * @package Jare_Typograph */ class Jare_Typograph_Param { /** * Ключи настроек */ const KEY_DISABLE_DEFAULT = '_disable'; const KEY_DISABLE_USER = 'user_disable'; const KEY_PARSE_PATTERN = 'pattern'; const KEY_PARSE_REPLACE = 'replacement'; const KEY_FUNCTION_LINK = 'function_link'; const KEY_POSITION = 'position'; /** * Настройки * * @var array */ protected $_option = array(); /** * Настройки, которые были заданы по умолчанию при создание экземпляра класса; невозможно изменить * * @var array */ protected $_defaultOption = array(); /** * Конструктор * * @param array $option массив из настроек, которые будут заданы по умолчанию * @return void */ public function __construct($option = array()) { $this->_defaultOption = $option; $this->_option = $option; } /** * Отключение параметра * * @param bool $status * @return Jare_Typograph_Param */ public function disable($status) { $this->_option[self::KEY_DISABLE_USER] = (bool) $status; return $this; } /** * Сброс заданных настроек к тем, которые были заданы при создание экземпляра класса * * @throws Jare_Typograph_Param_Exception * @return Jare_Typograph_Param */ public function reset() { if (!count($this->_defaultOption)) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception('This parameter does not have default options'); } $this->_option = $this->_defaultOption; return $this; } /** * Задание настройки * * @param string $name * @param string $value * @throws Jare_Typograph_Param_Exception * @return Jare_Typograph_Param */ public function setOption($name, $value) { $name = strtolower($name); $value = trim($value); if ('_' === substr($name, 0, 1)) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception('Prefix "_" reserved for system option'); } if (empty($value)) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception('Empty value. It\'s bad.'); } switch ($name) { case self::KEY_FUNCTION_LINK: $this->_option[self::KEY_PARSE_PATTERN] = ''; $this->_option[self::KEY_PARSE_REPLACE] = ''; case self::KEY_PARSE_PATTERN: case self::KEY_PARSE_REPLACE: $this->_option[self::KEY_FUNCTION_LINK] = ''; } $this->_option[$name] = $value; return $this; } /** * Возврат списка заданных настроек параметра * * @throws Jare_Typograph_Param_Exception * @return array */ public function getOptions() { if (!count($this->_option)) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception('This parameter does not have options!'); } if (!empty($this->_option[self::KEY_FUNCTION_LINK])) { return $this->_option; } if (empty($this->_option[self::KEY_PARSE_PATTERN]) && !empty($this->_option[self::KEY_PARSE_REPLACE])) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception('You must set up pattern and replacement or function link'); } return $this->_option; } /** * Получение значения настройки * * @param string $name * @throws Jare_Typograph_Param_Exception * @return string */ public function getOption($name) { if (!in_array($name, $this->option)) { require_once 'Jare/Typograph/Param/Exception.php'; throw new Jare_Typograph_Param_Exception("This option doesn't have value"); } return $this->_option[$name]; } }plugins/jaretypograph/Jare/Typograph/Param/Exception.php000066600000000736150472426320017470 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Param */ class Jare_Typograph_Param_Exception extends Jare_Typograph_Exception { }plugins/jaretypograph/Jare/Typograph/Tof/Etc.php000066600000011653150472426320015735 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Etc extends Jare_Typograph_Tof { /** * Защищенные теги * * @todo привязать к методам из Jare_Typograph_Tool */ const BASE64_PARAGRAPH_TAG = 'cA=='; // p const BASE64_BREAKLINE_TAG = 'YnIgLw=='; // br / (с пробелом и слэшем) /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'tm_replace' => array( '_disable' => false, 'pattern' => '/([\040\t])?\(tm\)/i', 'replacement' => '™'), 'r_sign_replace' => array( '_disable' => false, 'pattern' => '/\(r\)/ei', 'replacement' => '$this->_buildTag($this->_buildTag("®", "small"), "sup")'), 'copy_replace' => array( '_disable' => false, 'pattern' => '/\((c|с)\)\s+/iu', 'replacement' => '© '), 'acute_accent' => array( '_disable' => false, 'pattern' => '/(у|е|ы|а|о|э|я|и|ю|ё)\`(\w)/i', 'replacement' => '\1́\2'), 'auto_links' => array( '_disable' => false, 'pattern' => '/(\s|^)(http|ftp|mailto|https)(:\/\/)([\S]{4,})(\s|\.|\,|\!|\?|$)/ieu', 'replacement' => '"\1" . $this->_buildTag("\4", "a", array("href" => "\2\3\4")) . "\5"'), 'email' => array( '_disable' => false, 'pattern' => '/(\s|^)([a-z0-9\-\_\.]{3,})\@([a-z0-9\-\.]{2,})\.([a-z]{2,6})(\s|\.|\,|\!|\?|$|\<)/e', 'replacement' => '"\1" . $this->_buildTag("\2@\3.\4", "a", array("href" => "mailto:\2@\3.\4")) . "\5"'), 'hyphen_nowrap' => array( '_disable' => false, 'pattern' => '/(\ \;|\s|\>|^)([a-zа-я]+)\-([a-zа-я]+)(\s|\.|\,|\!|\?|\ \;|\&hellip\;|$)/uie', 'replacement' => '"\1" . $this->_buildTag("\2-\3", "span", array("style" => "word-spacing:nowrap;")) . "\4"'), 'simple_arrow' => array( '_disable' => false, 'function_link' => '_buildArrows'), 'ip_address' => array( '_disable' => false, 'pattern' => '/(\s|\ \;|^)(\d{0,3}\.\d{0,3}\.\d{0,3}\.\d{0,3})/ie', 'replacement' => '"\1" . $this->_nowrapIpAddress("\2")'), 'optical_alignment' => array( '_disable' => false, 'function_link' => '_buildOpticalAlignment'), 'paragraphs' => array( '_disable' => false, 'function_link' => '_buildParagraphs'), ); /** * Объединение IP-адрессов в неразрывные конструкции (IPv4 only) * * @param unknown_type $triads * @return unknown */ protected function _nowrapIpAddress($triads) { $triad = explode('.', $triads); $addTag = true; foreach ($triad as $value) { $value = (int) $value; if ($value > 255) { $addTag = false; break; } } if (true === $addTag) { $triads = $this->_buildTag($triads, 'span', array('style' => "word-spacing:nowrap;")); } return $triads; } /** * Оптическое выравнивание для пунктуации * * @return void */ protected function _buildOpticalAlignment() { $this->_text = preg_replace('/(\040|\ \;|\t)\(/ei', '$this->_buildTag("\1", "span", array("style" => "margin-right:0.3em;")) . $this->_buildTag("(", "span", array("style" => "margin-left:-0.3em;"))', $this->_text); $this->_text = preg_replace('/(\n|\r|^)\(/ei', '"\1" . $this->_buildTag("(", "span", array("style" => "margin-left:-0.3em;"))', $this->_text); $this->_text = preg_replace('/([а-яa-z0-9]+)\,(\040+)/iue', '"\1" . $this->_buildTag(",", "span", array("style" => "margin-right:-0.2em;")) . $this->_buildTag(" ", "span", array("style" => "margin-left:0.2em;"))', $this->_text); } /** * Расстановка защищенных тегов параграфа (

...

) и переноса строки * * @return void */ protected function _buildParagraphs() { if (!preg_match('/\<\/?' . self::BASE64_PARAGRAPH_TAG . '\>/', $this->_text)) { $this->_text = '<' . self::BASE64_PARAGRAPH_TAG . '>' . $this->_text . ''; $this->_text = preg_replace('/([\040\t]+)?(\n|\r){2,}/e', '"<" .self::BASE64_PARAGRAPH_TAG . ">"', $this->_text); } if (!preg_match('/\<' . self::BASE64_BREAKLINE_TAG . '\>/', $this->_text)) { $this->_text = preg_replace('/(\n|\r)/e', '"<" . self::BASE64_BREAKLINE_TAG . ">"', $this->_text); } } /** * Преобразование -> и <- в коды * * @return void */ protected function _buildArrows() { $this->_text = preg_replace('/(\s|\>|\ \;)\-\>(\s|\ \;|\<\/)/', '\1→\2', $this->_text); $this->_text = preg_replace('/(\s|\>|\ \;)\<\-(\s|\ \;)/', '\1←\2', $this->_text); } }plugins/jaretypograph/Jare/Typograph/Tof/Punctmark.php000066600000003742150472426320017166 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Punctmark extends Jare_Typograph_Tof { /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'auto_comma' => array( '_disable' => false, 'pattern' => '/([a-zа-я])(\s| )(но|а)(\s| )/iu', 'replacement' => '\1,\2\3\4'), 'punctuation_marks_limit' => array( '_disable' => false, 'pattern' => '/([\!\.\?]){4,}/', 'replacement' => '\1\1\1'), 'punctuation_marks_base_limit' => array( '_disable' => false, 'pattern' => '/([\,]|[\:]|[\;]]){2,}/', 'replacement' => '\1'), 'hellip' => array( '_disable' => false, 'function_link' => '_buildHellipTags'), 'eng_apostrophe' => array( '_disable' => false, 'pattern' => '/(\s|^|\>)([a-z]{2,})\'([a-z]+)/i', 'replacement' => '\1\2’\3'), 'fix_pmarks' => array( '_disable' => false, 'pattern' => '/([a-zа-я0-9])(\!|\.|\?){2}(\s|$|\<)/i', 'replacement' => '\1\2\3'), 'fix_brackets' => array( '_disable' => false, 'function_link' => '_fixBrackets'), ); /** * Расстановка многоточия вместо трех и двух точек * * @return void */ protected function _buildHellipTags() { $this->_text = str_replace(array('...', '..'), '…', $this->_text); } /** * Удаление лишних пробелов внутри скобок * * @return void */ protected function _fixBrackets() { $this->_text = preg_replace('/(\()(\040|\t)+/', '\1', $this->_text); $this->_text = preg_replace('/(\040|\t)+(\))/', '\2', $this->_text); } }plugins/jaretypograph/Jare/Typograph/Tof/Number.php000066600000004557150472426320016457 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Number extends Jare_Typograph_Tof { /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'auto_times_x' => array( '_disable' => false, 'function_link' => '_buildTimesx'), 'numeric_sub' => array( '_disable' => false, 'pattern' => '/([a-zа-я0-9])\_([\d]{1,3})([^а-яa-z0-9]|$)/ieu', 'replacement' => '"\1" . $this->_buildTag($this->_buildTag("\2","small"),"sub") . "\3"'), 'numeric_sup' => array( '_disable' => false, 'pattern' => '/([a-zа-я0-9])\^([\d]{1,3})([^а-яa-z0-9]|$)/ieu', 'replacement' => '"\1" . $this->_buildTag($this->_buildTag("\2","small"),"sup") . "\3"'), 'simple_fraction' => array( '_disable' => true, 'function_link' => '_buildSimpleFraction'), 'math_chars' => array( '_disable' => false, 'function_link' => '_buildMathChars'), ); /** * Преобразование простых дробей (1/2, 1/4 и 3/4) в HTML-коды * * @return void */ protected function _buildSimpleFraction() { $this->_text = preg_replace('/(\D)1\/(2|4)(\D)/', '\1&frac1\2\3', $this->_text); $this->_text = preg_replace('/(\D)3\/4(\D)/', '\1¾\2', $this->_text); } /** * Расстановка × между числами * * @return void */ protected function _buildTimesx() { $regExpMask = '/(\×\;)?(\d+)(\040*)(x|х)(\040*)(\d+)/u'; while(preg_match($regExpMask, $this->_text)) { $this->_text = preg_replace($regExpMask, '\1\2×\6', $this->_text); } } /** * Расстановка простейших математических знаков * * @return void */ protected function _buildMathChars() { $this->_text = str_replace('!=', '≠', $this->_text); $this->_text = str_replace('<=', '≤', $this->_text); $this->_text = str_replace('>=', '≥', $this->_text); $this->_text = str_replace('~=', '≅', $this->_text); $this->_text = str_replace('+-', '±', $this->_text); } }plugins/jaretypograph/Jare/Typograph/Tof/Quote.php000066600000005011150472426320016306 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Quote extends Jare_Typograph_Tof { /** * Типы кавычек */ const QUOTE_FIRS_OPEN = '«'; const QUOTE_FIRS_CLOSE = '»'; const QUOTE_CRAWSE_OPEN = '„'; const QUOTE_CRAWSE_CLOSE = '“'; /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'quotes_outside_a' => array( '_disable' => false, 'pattern' => '/(\<%%\_\_.+?\>)\"(.+?)\"(\<\/%%\_\_.+?\>)/s', 'replacement' => '"\1\2\3"'), 'open_quote' => array( '_disable' => false, 'function_link' => '_buildOpenQuote'), 'close_quote' => array( '_disable' => false, 'function_link' => '_buildCloseQuote'), 'optical_alignment' => array( '_disable' => false, 'function_link' => '_buildOpticalAlignment'), ); /** * Расстановка закрывающих кавычек * * @return void */ protected function _buildOpenQuote() { $regExpMask = '/(^|\(|\s|\>)(\"|\\\")(\S+)/iu'; while(preg_match($regExpMask, $this->_text)) { $this->_text = preg_replace($regExpMask . 'e', '"\1" . self::QUOTE_FIRS_OPEN . "\3"', $this->_text); } } /** * Расстановка закрывающих кавычек * * @return void */ protected function _buildCloseQuote() { $regExpMask = '/([a-zа-я0-9]|\.|\&hellip\;|\!|\?|\>)(\"|\\\")+(\.|\&hellip\;|\;|\:|\?|\!|\,|\s|\)|\<\/|$)/ui'; while(preg_match($regExpMask, $this->_text)) { $this->_text = preg_replace($regExpMask . 'e', '"\1" . self::QUOTE_FIRS_CLOSE . "\3"', $this->_text); } } /** * Оптическое выравнивание открывающей кавычки * * @return void */ protected function _buildOpticalAlignment() { $this->_text = preg_replace('/([a-zа-я\-]{3,})(\040|\ \;|\t)(\«\;)/uie', '"\1" . $this->_buildTag("\2", "span",array("style" => "margin-right:0.44em;")) . $this->_buildTag("\3", "span", array("style" => "margin-left:-0.44em;"))', $this->_text); $this->_text = preg_replace('/(\n|\r|^)(\«\;)/ei', '"\1" . $this->_buildTag("\2", "span", array("style" => "margin-left:-0.44em;"))', $this->_text); } }plugins/jaretypograph/Jare/Typograph/Tof/Dash.php000066600000005201150472426320016071 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Dash extends Jare_Typograph_Tof { /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'mdash' => array( '_disable' => false, 'pattern' => '/([a-zа-я0-9]+|\,|\:|\)|\»\;|\|\")(\040|\t)(\-|\&mdash\;)(\s|$|\<)/u', 'replacement' => '\1 —\4'), 'mdash_2' => array( '_disable' => false, 'pattern' => '/(\n|\r|^|\>)(\-|\&mdash\;)(\t|\040)/', 'replacement' => '\1— '), 'mdash_3' => array( '_disable' => false, 'pattern' => '/(\.|\!|\?|\&hellip\;)(\040|\t|\ \;)(\-|\&mdash\;)(\040|\t|\ \;)/', 'replacement' => '\1 — '), 'years' => array( '_disable' => false, 'pattern' => '/(с|по|период|середины|начала|начало|конца|конец|половины|в|между)(\s+|\ \;)([\d]{4})(-)([\d]{4})(г|гг)?/eui', 'replacement' => '"\1\2" . $this->_buildYears("\3","\5","\4") . "\6"'), 'iz_za_pod' => array( '_disable' => false, 'pattern' => '/(\s|\ \;|\>)(из)(\040|\t|\ \;)\-?(за|под)([\.\,\!\?\:\;]|\040|\ \;)/uie', 'replacement' => '("\1" == " " ? " " : "\1") . "\2-\4" . ("\5" == " "? " " : "\5")'), 'to_libo_nibud' => array( '_disable' => false, 'function_link' => '_buildToLiboNibud') ); /** * Расстановка короткого тире между годами * * @param string $start * @param string $end * @param string $sep * @return string */ protected function _buildYears($start, $end, $sep) { $start = (int) $start; $end = (int) $end; return ($start >= $end) ? "$start$sep$end" : "$start–$end"; } /** * Расстановка дефиса перед -то, -либо, -нибудь * * @return void */ protected function _buildToLiboNibud() { $regExpMask = '/(\s|^|\ \;|\>)(кто|кем|когда|зачем|почему|как|что|чем|где|чего|кого)\-?(\040|\t|\ \;)\-?(то|либо|нибудь)([\.\,\!\?\;]|\040|\ \;|$)/ui'; while( preg_match($regExpMask, $this->_text)) { $this->_text = preg_replace($regExpMask . 'e', '("\1" == " " ? " " : "\1") . "\2-\4" . ("\5" == " "? " " : "\5")', $this->_text); } } }plugins/jaretypograph/Jare/Typograph/Tof/Space.php000066600000005406150472426320016254 0ustar00 * @category Jare * @package Jare_Typograph * @subpackage Tof */ class Jare_Typograph_Tof_Space extends Jare_Typograph_Tof { /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array( 'nobr_abbreviation' => array( '_disable' => false, 'pattern' => '/(\s+|^|\>)(\d+)(\040|\t)*(dpi|lpi)([\s\;\.\?\!\:\(]|$)/i', 'replacement' => '\1\2 \4\5'), 'nobr_acronym' => array( '_disable' => false, 'pattern' => '/(\s|^|\>)(гл|стр|рис|ил)\.(\040|\t)*(\d+)(\s|\.|\,|\?|\!|$)/iu', 'replacement' => '\1\2. \4\5'), 'nobr_before_unit' => array( '_disable' => false, 'pattern' => '/(\s|^|\>)(\d+)(м|мм|см|км|гм|km|dm|cm|mm)(\s|\.|\!|\?|\,|$)/iu', 'replacement' => '\1\2 \3\4'), 'remove_space_before_punctuationmarks' => array( '_disable' => false, 'pattern' => '/(\040|\t|\ \;)([\,\:\.])(\s+)/', 'replacement' => '\2\3'), 'autospace_after_comma' => array( '_disable' => true, 'pattern' => '/(\040|\t|\ \;)?\,([а-яa-z0-9])/iu', 'replacement' => ', \2'), 'autospace_after_pmarks' => array( '_disable' => false, 'pattern' => '/(\040|\t|\ \;)([a-zа-я0-9]+)(\040|\t|\ \;)?(\:|\)|\,|\.|\&hellip\;|(?:\!|\?)+)([а-яa-z])/iu', 'replacement' => '\1\2\4 \5'), 'super_nbsp' => array( '_disable' => false, 'pattern' => '/(\s|^|\«\;|\>|\(|\&mdash\;\ \;)([a-zа-я]{1,2}\s+)([a-zа-я]{1,2}\s+)?([a-zа-я0-9\-]{2,})/ieu', 'replacement' => '"\1" . trim("\2") . " " . ("\3" ? trim("\3") . " " : "") . "\4"'), 'many_spaces_to_one' => array( '_disable' => false, 'pattern' => '/(\040|\t)+/', 'replacement' => ' '), 'clear_percent' => array( '_disable' => false, 'pattern' => '/(\d+)([\t\040]+)\%/', 'replacement' => '\1%'), 'nbsp_before_open_quote' => array( '_disable' => false, 'pattern' => '/(^|\040|\t|>)([a-zа-я]{1,2})\040(\«\;|\&bdquo\;)/u', 'replacement' => '\1\2 \3'), 'nbsp_before_particle' => array( '_disable' => false, 'pattern' => '/(\040|\t)+(ли|бы|б|же|ж)(\ \;|\.|\,|\:|\;|\&hellip\;|\s)/iue', 'replacement' => '" \2" . ("\3" == " " ? " " : "\3")'), 'ps_pps' => array( '_disable' => false, 'pattern' => '/(^|\040|\t|\>|\r|\n)(p\.\040?)(p\.\040?)?(s\.)/ie', 'replacement' => '"\1" . trim("\2") . " " . ("\3" ? trim("\3") . " " : "") . "\4"'), ); }plugins/jaretypograph/Jare/Typograph/Exception.php000066600000000635150472426320016426 0ustar00 * @category Jare * @package Jare_Typograph */ class Jare_Typograph_Exception extends Jare_Exception { }plugins/jaretypograph/Jare/Typograph/Tool.php000066600000027175150472426320015415 0ustar00 * @category Jare * @package Jare_Typograph */ class Jare_Typograph_Tool { /** * Режимы очистки текста */ const CLEAR_MODE_UTF8_NATIVE = 1; const CLEAR_MODE_HTML_MATTER = 2; /** * Таблица символов * * @var array */ protected static $_charsTable = array( '"' => array('html' => array('«', '»', '“', '‘', '„', '“', '"', '«', '»'), 'utf8' => array(0x201E, 0x201C, 0x201F, 0x201D, 0x00AB, 0x00BB)), ' ' => array('html' => array(' ', ' ', ' '), 'utf8' => array(0x00A0, 0x2002, 0x2003, 0x2008, 0x2009)), '-' => array('html' => array('—', '–', '−', '—', '—', '–'), 'utf8' => array(0x002D, 0x2014, 0x2010, 0x2012, 0x2013)), '==' => array('html' => array('≡'), 'utf8' => array(0x2261)), '...' => array('html' => array('…', '…'), 'utf8' => array(0x2026)), '!=' => array('html' => array('≠', '≠'), 'utf8' => array(0x2260)), '<=' => array('html' => array('≤', '≤'), 'utf8' => array(0x2264)), '>=' => array('html' => array('≥', '≥'), 'utf8' => array(0x2265)), '1/2' => array('html' => array('½', '½'), 'utf8' => array(0x00BD)), '1/4' => array('html' => array('¼', '¼'), 'utf8' => array(0x00BC)), '3/4' => array('html' => array('¾', '¾'), 'utf8' => array(0x00BE)), '+-' => array('html' => array('±', '±'), 'utf8' => array(0x00B1)), '&' => array('html' => array('&', '&')), '(tm)' => array('html' => array('™', '™'), 'utf8' => array(0x2122)), '(r)' => array('html' => array('®', '®'), 'utf8' => array(0x00AE)), '(c)' => array('html' => array('©', '©'), 'utf8' => array(0x00A9)), '`' => array('html' => array('́')), '\'' => array('html' => array('’', '’')), 'x' => array('html' => array('×', '×'), 'utf8' => array('×') /* какой же у него может быть код? */), ); /** * Список из элементов, в которых текст не будет типографироваться * * @var array */ protected static $_customBlocks = array(); /** * Добавление к тегам атрибута 'id', благодаря которому * при повторном типографирование текста будут удалены теги, * расставленные данным типографом * * @var array */ protected static $_typographSpecificTagId = false; /** * Удаление кодов HTML из текста * * * // Remove UTF-8 chars: * $str = Jare_Typograph_Tool::clearSpecialChars('your text', Jare_Typograph_Tool::CLEAR_MODE_UTF8_NATIVE); * // ... or HTML codes only: * $str = Jare_Typograph_Tool::clearSpecialChars('your text', Jare_Typograph_Tool::CLEAR_MODE_HTML_MATTER); * // ... or combo: * $str = Jare_Typograph_Tool::clearSpecialChars('your text', Jare_Typograph_Tool::CLEAR_MODE_UTF8_NATIVE|Jare_Typograph_Tool::CLEAR_MODE_HTML_MATTER); * * * @param string $text * @param int $mode * @return string */ public static function clearSpecialChars($text, $mode) { $mode = (int) $mode; switch($mode) { case self::CLEAR_MODE_UTF8_NATIVE: $mode = array('utf8'); break; case self::CLEAR_MODE_HTML_MATTER: $mode = array('html'); break; case self::CLEAR_MODE_UTF8_NATIVE | self::CLEAR_MODE_HTML_MATTER: $mode = array('utf8', 'html'); break; } if (!is_array($mode)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Incorrect mode"); } foreach (self::$_charsTable as $char => $vals) { foreach ($mode as $type) { if (isset($vals[$type])) { foreach ($vals[$type] as $v) { if ('utf8' === $type && is_int($v)) { $v = self::_getUnicodeChar($v); } $text = str_replace($v, $char, $text); } } } } return $text; } /** * Удаление тегов HTML из текста * Тег
будет преобразов в перенос строки \n, сочетание тегов

- * в двойной перенос * * @param string $text * @param array $allowableTag массив из тегов, которые будут проигнорированы * @return string */ public static function removeHtmlTags($text, $allowableTag = null) { $ignore = null; if (null !== $allowableTag) { if (is_string($allowableTag)) { $allowableTag = array($allowableTag); } if (is_array($allowableTag)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception('Bad type of param #2'); } foreach ($allowableTag as $tag) { if ('<' !== substr($tag, 0, 1) || '>' !== substr($tag, -1, 1)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Incorrect tag $tag"); } if ('/' === substr($tag, 1, 1)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Incorrect tag $tag"); } } $ignore = implode('', $allowableTag); } $text = preg_replace('/\/i', "\n", $text); $text = preg_replace('/\<\/p\>\s*\/', "\n\n", $text); $text = strip_tags($text, $ignore); return $text; } /** * Сохраняем содержимое тегов HTML * * Тег 'a' кодируется со специальным префиксом для дальнейшей * возможности выносить за него кавычки. * * @param string $text * @param bool $safe * @return string */ public static function safeTagChars($text, $safe) { $safe = (bool) $safe; if (true === $safe) { $text = preg_replace('/(\<\/?)(.+?)(\>)/se', '"\1" . ( substr(trim("\2"), 0, 1) === "a" ? "%%___" : "" ) . self::_encrypteContent(trim("\2")) . "\3"', $text); } else { $text = preg_replace('/(\<\/?)(.+?)(\>)/se', '"\1" . ( substr(trim("\2"), 0, 3) === "%%___" ? self::_decrypteContent(substr(trim("\2"), 4)) : self::_decrypteContent(trim("\2")) ) . "\3"', $text); } return $text; } /** * Создание тега с защищенным содержимым * * @param string $content текст, который будет обрамлен тегом * @param string $tag * @param array $attribute список атрибутов, где ключ - имя атрибута, а значение - само значение данного атрибута * @return string */ public static function buildSafedTag($content, $tag = 'span', $attribute = array()) { $htmlTag = $tag; if (self::$_typographSpecificTagId) { if(!isset($attribute['id'])) { $attribute['id'] = 'jt-2' . mt_rand(1000,9999); } } if (count($attribute)) { foreach ($attribute as $attr => $value) { $htmlTag .= " $attr=\"$value\""; } } return "<" . self::_encrypteContent($htmlTag) . ">$content"; } /** * Список защищенных блоков * * @return array */ public static function getCustomBlocks() { return self::$_customBlocks; } /** * Удаленного блока по его номеру ключа * * @param int $blockId * @return void */ public static function removeCustomBlock($blockId) { if (!is_int($blockId)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Incorrect type of value"); } if (!isset(self::$_customBlocks[$blockId])) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Incorrect index"); } unset(self::$_customBlocks[$blockId]); } /** * Добавление защищенного блока * * * Jare_Typograph_Tool::addCustomBlocks('', ''); * Jare_Typograph_Tool::addCustomBlocks('\', '\<\/span\>', true); * * * @param string $open начало блока * @param string $close конец защищенного блока * @param bool $quoted специальные символы в начале и конце блока экранированы * @return void */ public static function addCustomBlocks($open, $close, $quoted = false) { $open = trim($open); $close = trim($close); if (empty($open) || empty($close)) { require_once 'Jare/Typograph/Tool/Exception.php'; throw new Jare_Typograph_Tool_Exception("Bad value"); } if (false === $quoted) { $open = preg_quote($open, '/'); $close = preg_quote($close, '/'); } self::$_customBlocks[] = array($open, $close); } /** * Сохранение содержимого защищенных блоков * * @param string $text * @param bool $safe если true, то содержимое блоков будет сохранено, иначе - раскодировано. * @return string */ public static function safeCustomBlocks($text, $safe) { $safe = (bool) $safe; if (count(self::$_customBlocks)) { $safeType = true === $safe ? "self::_encrypteContent('\\2')" : "stripslashes(self::_decrypteContent('\\2'))"; foreach (self::$_customBlocks as $block) { $text = preg_replace("/({$block[0]})(.+?)({$block[1]})/se", "'\\1' . $safeType . '\\3'" , $text); } } return $text; } /** * Метод, осуществляющий кодирование (сохранение) информации * с целью невозможности типографировать ее * * @param string $text * @return string */ protected static function _encrypteContent($text) { return base64_encode($text); } /** * Метод, осуществляющий декодирование информации * * @param string $text * @return string */ protected static function _decrypteContent($text) { return base64_decode($text); } /** * Костыли для работы с символами UTF-8 * * @author somebody? * @param int $c код символа в кодировке UTF-8 (например, 0x00AB) * @return bool|string */ protected static function _getUnicodeChar($c) { if ($c <= 0x7F) { return chr($c); } else if ($c <= 0x7FF) { return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); } else if ($c <= 0xFFFF) { return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) . chr(0x80 | $c & 0x3F); } else if ($c <= 0x10FFFF) { return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) . chr(0x80 | $c >> 6 & 0x3F) . chr(0x80 | $c & 0x3F); } else { return false; } } }plugins/jaretypograph/Jare/Typograph/Tof.php000066600000014002150472426320015211 0ustar00 * @category Jare * @package Jare_Typograph */ abstract class Jare_Typograph_Tof { /** * Отключение обработки текста тофом * * @var bool */ protected $_disableParsing = false; /** * Текст для типографирования * * @var string */ protected $_text = ''; /** * Базовые параметры тофа * * @var array */ protected $_baseParam = array(); /** * Установка базового параметра * * @param string $name * @param Jare_Typograph_Param $param * @return Jare_Typograph_Tof */ public function setBaseParam($name, Jare_Typograph_Param $param) { $this->_baseParam[$name] = $param->getOptions(); return $this; } /** * Получение экземпляра класса базового параметра * * @param string $name * @throws Jare_Typograph_Exception * @return Jare_Typograph_Param */ public function getBaseParam($name) { if(!isset($this->_baseParam[$name])) { require_once 'Jare/Typograph/Exception.php'; throw new Jare_Typograph_Exception("Incorrect base parameter name"); } $param = new Jare_Typograph_Param($this->_baseParam[$name]); return $param; } /** * Установка текста для типографирования * * @param string $text * @return void */ public function setStringToParse($text) { $this->_text = &$text; } /** * Отключение типографирования текста данным тофом * * @param bool $status * @return Jare_Typograph_Tof */ public function disableParsing($status) { $this->_disableParsing = (bool) $status; return $this; } /** * Возврат статуса для типографирования данным тофом * * @return bool */ public function isDisabledParsing() { return $this->_disableParsing; } /** * Отключение базовых параметров тофа * * @param mixed $name массив или строка из названий параметров, которые необходимо отключить * @return Jare_Typograph_Tof */ public function disableBaseParam($name) { if (!is_array($this->_baseParam) || !count($this->_baseParam)) { require_once 'Jare/Typograph/Exception.php'; throw new Jare_Typograph_Exception("This tof dosn't have base parameters"); } if (is_string($name)) { $name = array($name); } if (!is_array($name)) { require_once 'Jare/Typograph/Exception.php'; throw new Jare_Typograph_Exception("Incorrect var type"); } foreach ($name as $accessKey) { if (!isset($this->_baseParam[$accessKey])) { require_once 'Jare/Typograph/Exception.php'; throw new Jare_Typograph_Exception("Incorrect name of base param - '$accessKey'"); } else { $this->_baseParam[$accessKey][Jare_Typograph_Param::KEY_DISABLE_USER] = true; } } return $this; } /** * Стандартное типографирование текста тофом * * @throws Jare_Typograph_Exception * @return string */ public function parse() { $this->_preParse(); if (true === $this->_disableParsing) { return $this->_text; } if (is_array($this->_baseParam) || count($this->_baseParam)) { foreach ($this->_baseParam as $accessKey => $param) { $ignoreParsing = null; // Типографирование параметром отключено или включено пользователем if (isset($param[Jare_Typograph_Param::KEY_DISABLE_USER])) { $ignoreParsing = (bool) $param[Jare_Typograph_Param::KEY_DISABLE_USER]; } if (null === $ignoreParsing) { // Параметр отключен по умолчанию... if (isset($param[Jare_Typograph_Param::KEY_DISABLE_DEFAULT])) { $ignoreParsing = $param[Jare_Typograph_Param::KEY_DISABLE_DEFAULT]; } } if ($ignoreParsing) { continue; } // Ссылка на метод класса с правилами типографирования if (!empty($param[Jare_Typograph_Param::KEY_FUNCTION_LINK])) { $methodName = $param[Jare_Typograph_Param::KEY_FUNCTION_LINK]; if (method_exists($this, $methodName)) { $this->$methodName(); continue; } else { require_once 'Jare/Typograph/Exception.php'; throw new Jare_Typograph_Exception("Incorrect method name - '$methodName'"); } } // Классическое типографирование регулярными выражениями $this->_text = preg_replace($param[Jare_Typograph_Param::KEY_PARSE_PATTERN], $param[Jare_Typograph_Param::KEY_PARSE_REPLACE], $this->_text); } } $this->_postParse(); return $this->_text; } /** * Метод, который вызывается перед стандартным типографированием текста тофом * * @return void */ protected function _preParse() { } /** * Метод, который вызывается после стандартным типографированием текста тофом * * @return void */ protected function _postParse() { } /** * Создание защищенного тега с содержимым * * @see Jare_Typograph_Tool::buildSafeTag * @param string $content * @param string $tag * @param array $attribute * @return string */ protected function _buildTag($content, $tag = 'span', $attribute = array()) { require_once 'Jare/Typograph/Tool.php'; $html = Jare_Typograph_Tool::buildSafedTag($content, $tag, $attribute); return $html; } }plugins/jaretypograph/langs/ru.js000066600000000131150472426320013200 0ustar00tinyMCE.addI18n('ru.typograph',{ desc : 'Подтянуть типографику' }); plugins/jaretypograph/langs/en.js000066600000000072150472426320013160 0ustar00tinyMCE.addI18n('en.typograph',{ desc : 'Typography' }); plugins/jaretypograph/handler.php000066600000001550150472426320013244 0ustar00getTof('etc')->disableBaseParam('paragraphs'); $typograph->getTof('space')->disableBaseParam('many_spaces_to_one'); $text = $typograph->parse($typograph->getBaseTofsNames()); // Отдаем текст print $start_space.$text.$end_space; ?>plugins/jaretypograph/img/typograph.gif000066600000000231150472426320014371 0ustar00GIF89aDDDUUU333www"""fff!,FI8stR!JNo8A&:aNUX@ZG13 B.*-;;plugins/jaretypograph/img/typograph.png000066600000000506150472426320014415 0ustar00PNG  IHDR tEXtSoftwareAdobe ImageReadyqe<IDATxb?5} ddd@P@` b|zy hB ~AB.|'Xj?XAJ@eb%ab*P 1 j JBd8ʆ3E1p&C5!z@̏& B]YN A; q! D@ O-@-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{if(h[e]>0){b[e].style.zIndex=h[e]-1}}}else{for(g=0;gh[e]){k=g;break}}if(k>-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{b[e].style.zIndex=h[e]+1}}c.execCommand("mceRepaint")},_getParentLayer:function(b){return this.editor.dom.getParent(b,function(c){return c.nodeType==1&&/^(absolute|relative|static)$/i.test(c.style.position)})},_insertLayer:function(){var c=this.editor,e=c.dom,d=e.getPos(e.getParent(c.selection.getNode(),"*")),b=c.getBody();c.dom.add(b,"div",{style:{position:"absolute",left:d.x,top:(d.y>20?d.y:20),width:100,height:100},"class":"mceItemVisualAid mceItemLayer"},c.selection.getContent()||c.getLang("layer.content"));if(tinymce.isIE){e.setHTML(b,b.innerHTML)}},_toggleAbsolute:function(){var b=this.editor,c=this._getParentLayer(b.selection.getNode());if(!c){c=b.dom.getParent(b.selection.getNode(),"DIV,P,IMG")}if(c){if(c.style.position.toLowerCase()=="absolute"){b.dom.setStyles(c,{position:"",left:"",top:"",width:"",height:""});b.dom.removeClass(c,"mceItemVisualAid");b.dom.removeClass(c,"mceItemLayer")}else{if(c.style.left==""){c.style.left=20+"px"}if(c.style.top==""){c.style.top=20+"px"}if(c.style.width==""){c.style.width=c.width?(c.width+"px"):"100px"}if(c.style.height==""){c.style.height=c.height?(c.height+"px"):"100px"}c.style.position="absolute";b.dom.setAttrib(c,"data-mce-style","");b.addVisual(b.getBody())}b.execCommand("mceRepaint");b.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})();plugins/layer/editor_plugin_src.js000066600000014526150472426320013433 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { function findParentLayer(node) { do { if (node.className && node.className.indexOf('mceItemLayer') != -1) { return node; } } while (node = node.parentNode); }; tinymce.create('tinymce.plugins.Layer', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceInsertLayer', t._insertLayer, t); ed.addCommand('mceMoveForward', function() { t._move(1); }); ed.addCommand('mceMoveBackward', function() { t._move(-1); }); ed.addCommand('mceMakeAbsolute', function() { t._toggleAbsolute(); }); // Register buttons ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'}); ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'}); ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'}); ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'}); ed.onInit.add(function() { var dom = ed.dom; if (tinymce.isIE) ed.getDoc().execCommand('2D-Position', false, true); }); // Remove serialized styles when selecting a layer since it might be changed by a drag operation ed.onMouseUp.add(function(ed, e) { var layer = findParentLayer(e.target); if (layer) { ed.dom.setAttrib(layer, 'data-mce-style', ''); } }); // Fixes edit focus issues with layers on Gecko // This will enable designMode while inside a layer and disable it when outside ed.onMouseDown.add(function(ed, e) { var node = e.target, doc = ed.getDoc(), parent; if (tinymce.isGecko) { if (findParentLayer(node)) { if (doc.designMode !== 'on') { doc.designMode = 'on'; // Repaint caret node = doc.body; parent = node.parentNode; parent.removeChild(node); parent.appendChild(node); } } else if (doc.designMode == 'on') { doc.designMode = 'off'; } } }); ed.onNodeChange.add(t._nodeChange, t); ed.onVisualAid.add(t._visualAid, t); }, getInfo : function() { return { longname : 'Layer', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private methods _nodeChange : function(ed, cm, n) { var le, p; le = this._getParentLayer(n); p = ed.dom.getParent(n, 'DIV,P,IMG'); if (!p) { cm.setDisabled('absolute', 1); cm.setDisabled('moveforward', 1); cm.setDisabled('movebackward', 1); } else { cm.setDisabled('absolute', 0); cm.setDisabled('moveforward', !le); cm.setDisabled('movebackward', !le); cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute"); } }, // Private methods _visualAid : function(ed, e, s) { var dom = ed.dom; tinymce.each(dom.select('div,p', e), function(e) { if (/^(absolute|relative|fixed)$/i.test(e.style.position)) { if (s) dom.addClass(e, 'mceItemVisualAid'); else dom.removeClass(e, 'mceItemVisualAid'); dom.addClass(e, 'mceItemLayer'); } }); }, _move : function(d) { var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl; nl = []; tinymce.walk(ed.getBody(), function(n) { if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position)) nl.push(n); }, 'childNodes'); // Find z-indexes for (i=0; i -1) { nl[ci].style.zIndex = z[fi]; nl[fi].style.zIndex = z[ci]; } else { if (z[ci] > 0) nl[ci].style.zIndex = z[ci] - 1; } } else { // Move forward // Try find a higher one for (i=0; i z[ci]) { fi = i; break; } } if (fi > -1) { nl[ci].style.zIndex = z[fi]; nl[fi].style.zIndex = z[ci]; } else nl[ci].style.zIndex = z[ci] + 1; } ed.execCommand('mceRepaint'); }, _getParentLayer : function(n) { return this.editor.dom.getParent(n, function(n) { return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position); }); }, _insertLayer : function() { var ed = this.editor, dom = ed.dom, p = dom.getPos(dom.getParent(ed.selection.getNode(), '*')), body = ed.getBody(); ed.dom.add(body, 'div', { style : { position : 'absolute', left : p.x, top : (p.y > 20 ? p.y : 20), width : 100, height : 100 }, 'class' : 'mceItemVisualAid mceItemLayer' }, ed.selection.getContent() || ed.getLang('layer.content')); // Workaround for IE where it messes up the JS engine if you insert a layer on IE 6,7 if (tinymce.isIE) dom.setHTML(body, body.innerHTML); }, _toggleAbsolute : function() { var ed = this.editor, le = this._getParentLayer(ed.selection.getNode()); if (!le) le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG'); if (le) { if (le.style.position.toLowerCase() == "absolute") { ed.dom.setStyles(le, { position : '', left : '', top : '', width : '', height : '' }); ed.dom.removeClass(le, 'mceItemVisualAid'); ed.dom.removeClass(le, 'mceItemLayer'); } else { if (le.style.left == "") le.style.left = 20 + 'px'; if (le.style.top == "") le.style.top = 20 + 'px'; if (le.style.width == "") le.style.width = le.width ? (le.width + 'px') : '100px'; if (le.style.height == "") le.style.height = le.height ? (le.height + 'px') : '100px'; le.style.position = "absolute"; ed.dom.setAttrib(le, 'data-mce-style', ''); ed.addVisual(ed.getBody()); } ed.execCommand('mceRepaint'); ed.nodeChanged(); } } }); // Register plugin tinymce.PluginManager.add('layer', tinymce.plugins.Layer); })();plugins/contextmenu/editor_plugin.js000066600000004746150472426320014024 0ustar00(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(e){var h=this,f,d,i;h.editor=e;d=e.settings.contextmenu_never_use_native;h.onContextMenu=new tinymce.util.Dispatcher(this);f=e.onContextMenu.add(function(j,k){if((i!==0?i:k.ctrlKey)&&!d){return}a.cancel(k);if(k.target.nodeName=="IMG"){j.selection.select(k.target)}h._getMenu(j).showMenu(k.clientX||k.pageX,k.clientY||k.pageY);a.add(j.getDoc(),"click",function(l){g(j,l)});j.nodeChanged()});e.onRemove.add(function(){if(h._menu){h._menu.removeAll()}});function g(j,k){i=0;if(k&&k.button==2){i=k.ctrlKey;return}if(h._menu){h._menu.removeAll();h._menu.destroy();a.remove(j.getDoc(),"click",g);h._menu=null}}e.onMouseDown.add(g);e.onKeyDown.add(g);e.onKeyDown.add(function(j,k){if(k.shiftKey&&!k.ctrlKey&&!k.altKey&&k.keyCode===121){a.cancel(k);f(j,k)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();plugins/contextmenu/editor_plugin_src.js000066600000011637150472426320014670 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM; /** * This plugin a context menu to TinyMCE editor instances. * * @class tinymce.plugins.ContextMenu */ tinymce.create('tinymce.plugins.ContextMenu', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @method init * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed) { var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey; t.editor = ed; contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native; /** * This event gets fired when the context menu is shown. * * @event onContextMenu * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event. * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed. */ t.onContextMenu = new tinymce.util.Dispatcher(this); showMenu = ed.onContextMenu.add(function(ed, e) { // Block TinyMCE menu on ctrlKey and work around Safari issue if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative) return; Event.cancel(e); // Select the image if it's clicked. WebKit would other wise expand the selection if (e.target.nodeName == 'IMG') ed.selection.select(e.target); t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY); Event.add(ed.getDoc(), 'click', function(e) { hide(ed, e); }); ed.nodeChanged(); }); ed.onRemove.add(function() { if (t._menu) t._menu.removeAll(); }); function hide(ed, e) { realCtrlKey = 0; // Since the contextmenu event moves // the selection we need to store it away if (e && e.button == 2) { realCtrlKey = e.ctrlKey; return; } if (t._menu) { t._menu.removeAll(); t._menu.destroy(); Event.remove(ed.getDoc(), 'click', hide); t._menu = null; } }; ed.onMouseDown.add(hide); ed.onKeyDown.add(hide); ed.onKeyDown.add(function(ed, e) { if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) { Event.cancel(e); showMenu(ed, e); } }); }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @method getInfo * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Contextmenu', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, _getMenu : function(ed) { var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p; if (m) { m.removeAll(); m.destroy(); } p = DOM.getPos(ed.getContentAreaContainer()); m = ed.controlManager.createDropMenu('contextmenu', { offset_x : p.x + ed.getParam('contextmenu_offset_x', 0), offset_y : p.y + ed.getParam('contextmenu_offset_y', 0), constrain : 1, keyboard_focus: true }); t._menu = m; m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col); m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col); m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'}); if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) { m.addSeparator(); m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); } m.addSeparator(); m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); m.addSeparator(); am = m.addMenu({title : 'contextmenu.align'}); am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'}); am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'}); am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'}); am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'}); t.onContextMenu.dispatch(t, m, el, col); return m; } }); // Register plugin tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu); })(); plugins/advlist/editor_plugin.js000066600000004424150472426320013112 0ustar00(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square");if(tinymce.isIE&&/MSIE [2-7]/.test(navigator.userAgent)){d.isIE7=true}},createControl:function(d,b){var f=this,e,i,g=f.editor;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){i=f[d][0]}function c(j,l){var k=true;a(l.styles,function(n,m){if(g.dom.getStyle(j,m)!=n){k=false;return false}});return k}function h(){var k,l=g.dom,j=g.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,i)){g.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(i){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,i.styles);k.removeAttribute("data-mce-style")}}g.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){h()}});e.onRenderMenu.add(function(j,k){k.onHideMenu.add(function(){if(f.bookmark){g.selection.moveToBookmark(f.bookmark);f.bookmark=0}});k.onShowMenu.add(function(){var n=g.dom,m=n.getParent(g.selection.getNode(),"ol,ul"),l;if(m||i){l=f[d];a(k.items,function(o){var p=true;o.setSelected(0);if(m&&!o.isDisabled()){a(l,function(q){if(q.id==o.id){if(!c(m,q)){p=false;return false}}});if(p){o.setSelected(1)}}});if(!m){k.items[i.id].setSelected(1)}}g.focus();if(tinymce.isIE){f.bookmark=g.selection.getBookmark(1)}});k.add({id:g.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(l){if(f.isIE7&&l.styles.listStyleType=="lower-greek"){return}l.id=g.dom.uniqueId();k.add({id:l.id,title:l.title,onclick:function(){i=l;h()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})();plugins/advlist/editor_plugin_src.js000066600000010707150472426320013762 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var each = tinymce.each; tinymce.create('tinymce.plugins.AdvListPlugin', { init : function(ed, url) { var t = this; t.editor = ed; function buildFormats(str) { var formats = []; each(str.split(/,/), function(type) { formats.push({ title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')), styles : { listStyleType : type == 'default' ? '' : type } }); }); return formats; }; // Setup number formats from config or default t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman"); t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square"); if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent)) t.isIE7 = true; }, createControl: function(name, cm) { var t = this, btn, format, editor = t.editor; if (name == 'numlist' || name == 'bullist') { // Default to first item if it's a default item if (t[name][0].title == 'advlist.def') format = t[name][0]; function hasFormat(node, format) { var state = true; each(format.styles, function(value, name) { // Format doesn't match if (editor.dom.getStyle(node, name) != value) { state = false; return false; } }); return state; }; function applyListFormat() { var list, dom = editor.dom, sel = editor.selection; // Check for existing list element list = dom.getParent(sel.getNode(), 'ol,ul'); // Switch/add list type if needed if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format)) editor.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList'); // Append styles to new list element if (format) { list = dom.getParent(sel.getNode(), 'ol,ul'); if (list) { dom.setStyles(list, format.styles); list.removeAttribute('data-mce-style'); } } editor.focus(); }; btn = cm.createSplitButton(name, { title : 'advanced.' + name + '_desc', 'class' : 'mce_' + name, onclick : function() { applyListFormat(); } }); btn.onRenderMenu.add(function(btn, menu) { menu.onHideMenu.add(function() { if (t.bookmark) { editor.selection.moveToBookmark(t.bookmark); t.bookmark = 0; } }); menu.onShowMenu.add(function() { var dom = editor.dom, list = dom.getParent(editor.selection.getNode(), 'ol,ul'), fmtList; if (list || format) { fmtList = t[name]; // Unselect existing items each(menu.items, function(item) { var state = true; item.setSelected(0); if (list && !item.isDisabled()) { each(fmtList, function(fmt) { if (fmt.id == item.id) { if (!hasFormat(list, fmt)) { state = false; return false; } } }); if (state) item.setSelected(1); } }); // Select the current format if (!list) menu.items[format.id].setSelected(1); } editor.focus(); // IE looses it's selection so store it away and restore it later if (tinymce.isIE) { t.bookmark = editor.selection.getBookmark(1); } }); menu.add({id : editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1); each(t[name], function(item) { // IE<8 doesn't support lower-greek, skip it if (t.isIE7 && item.styles.listStyleType == 'lower-greek') return; item.id = editor.dom.uniqueId(); menu.add({id : item.id, title : item.title, onclick : function() { format = item; applyListFormat(); }}); }); }); return btn; } }, getInfo : function() { return { longname : 'Advanced lists', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin); })();plugins/pagebreak/css/content.css000066600000000251150472426320013131 0ustar00.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../img/pagebreak.gif) no-repeat center top;} plugins/pagebreak/editor_plugin.js000066600000002572150472426320013367 0ustar00(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='',a="mcePageBreak",c=b.getParam("pagebreak_separator",""),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})();plugins/pagebreak/editor_plugin_src.js000066600000004050150472426320014227 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.PageBreakPlugin', { init : function(ed, url) { var pb = '', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE; pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g'); // Register commands ed.addCommand('mcePageBreak', function() { ed.execCommand('mceInsertContent', 0, pb); }); // Register buttons ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls}); ed.onInit.add(function() { if (ed.theme.onResolveName) { ed.theme.onResolveName.add(function(th, o) { if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls)) o.name = 'pagebreak'; }); } }); ed.onClick.add(function(ed, e) { e = e.target; if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls)) ed.selection.select(e); }); ed.onNodeChange.add(function(ed, cm, n) { cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls)); }); ed.onBeforeSetContent.add(function(ed, o) { o.content = o.content.replace(pbRE, pb); }); ed.onPostProcess.add(function(ed, o) { if (o.get) o.content = o.content.replace(/]+>/g, function(im) { if (im.indexOf('class="mcePageBreak') !== -1) im = sep; return im; }); }); }, getInfo : function() { return { longname : 'PageBreak', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin); })();plugins/pagebreak/img/trans.gif000066600000000053150472426320012547 0ustar00GIF89a!,D;plugins/pagebreak/img/pagebreak.gif000066600000000505150472426320013343 0ustar00GIF89ad t]Othh[QB!,d I8ͻ`(d Y8#9.aBp8Uck<AtBU5qC n`U8k u-z 0Ck S@BNNVf7NK_NhJ k =?h  {}ʇ:dYx&sH\ bRN OO 5@`@siL‡#J;plugins/fullpage/css/fullpage.css000066600000003776150472426320013153 0ustar00/* Hide the advanced tab */ #advanced_tab { display: none; } #metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright { width: 280px; } #doctype, #docencoding { width: 200px; } #langcode { width: 30px; } #bgimage { width: 220px; } #fontface { width: 240px; } #leftmargin, #rightmargin, #topmargin, #bottommargin { width: 50px; } .panel_wrapper div.current { height: 400px; } #stylesheet, #style { width: 240px; } #doctypes { width: 200px; } /* Head list classes */ .headlistwrapper { width: 100%; } .selected { border: 1px solid #0A246A; background-color: #B6BDD2; } .toolbar { width: 100%; } #headlist { width: 100%; margin-top: 3px; font-size: 11px; } #info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element { display: none; } #addmenu { position: absolute; border: 1px solid gray; display: none; z-index: 100; background-color: white; } #addmenu a { display: block; width: 100%; line-height: 20px; text-decoration: none; background-color: white; } #addmenu a:hover { background-color: #B6BDD2; color: black; } #addmenu span { padding-left: 10px; padding-right: 10px; } #updateElementPanel { display: none; } #script_element .panel_wrapper div.current { height: 108px; } #style_element .panel_wrapper div.current { height: 108px; } #link_element .panel_wrapper div.current { height: 140px; } #element_script_value { width: 100%; height: 100px; } #element_comment_value { width: 100%; height: 120px; } #element_style_value { width: 100%; height: 100px; } #element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title { width: 250px; } .updateElementButton { margin-top: 3px; } /* MSIE specific styles */ * html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton { width: 22px; height: 22px; } textarea { height: 55px; } .panel_wrapper div.current {height:420px;}plugins/fullpage/editor_plugin.js000066600000014262150472426320013244 0ustar00(function(){var b=tinymce.each,a=tinymce.html.Node;tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(c,d){var e=this;e.editor=c;c.addCommand("mceFullPageProperties",function(){c.windowManager.open({file:d+"/fullpage.htm",width:430+parseInt(c.getLang("fullpage.delta_width",0)),height:495+parseInt(c.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:d,data:e._htmlToData()})});c.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});c.onBeforeSetContent.add(e._setContent,e);c.onGetContent.add(e._getContent,e)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_htmlToData:function(){var f=this._parseHeader(),h={},c,i,g,e=this.editor;function d(l,j){var k=l.attr(j);return k||""}h.fontface=e.getParam("fullpage_default_fontface","");h.fontsize=e.getParam("fullpage_default_fontsize","");i=f.firstChild;if(i.type==7){h.xml_pi=true;g=/encoding="([^"]+)"/.exec(i.value);if(g){h.docencoding=g[1]}}i=f.getAll("#doctype")[0];if(i){h.doctype=""}i=f.getAll("title")[0];if(i&&i.firstChild){h.metatitle=i.firstChild.value}b(f.getAll("meta"),function(m){var k=m.attr("name"),j=m.attr("http-equiv"),l;if(k){h["meta"+k.toLowerCase()]=m.attr("content")}else{if(j=="Content-Type"){l=/charset\s*=\s*(.*)\s*/gi.exec(m.attr("content"));if(l){h.docencoding=l[1]}}}});i=f.getAll("html")[0];if(i){h.langcode=d(i,"lang")||d(i,"xml:lang")}i=f.getAll("link")[0];if(i&&i.attr("rel")=="stylesheet"){h.stylesheet=i.attr("href")}i=f.getAll("body")[0];if(i){h.langdir=d(i,"dir");h.style=d(i,"style");h.visited_color=d(i,"vlink");h.link_color=d(i,"link");h.active_color=d(i,"alink")}return h},_dataToHtml:function(g){var f,d,h,j,k,e=this.editor.dom;function c(n,l,m){n.attr(l,m?m:undefined)}function i(l){if(d.firstChild){d.insert(l,d.firstChild)}else{d.append(l)}}f=this._parseHeader();d=f.getAll("head")[0];if(!d){j=f.getAll("html")[0];d=new a("head",1);if(j.firstChild){j.insert(d,j.firstChild,true)}else{j.append(d)}}j=f.firstChild;if(g.xml_pi){k='version="1.0"';if(g.docencoding){k+=' encoding="'+g.docencoding+'"'}if(j.type!=7){j=new a("xml",7);f.insert(j,f.firstChild,true)}j.value=k}else{if(j&&j.type==7){j.remove()}}j=f.getAll("#doctype")[0];if(g.doctype){if(!j){j=new a("#doctype",10);if(g.xml_pi){f.insert(j,f.firstChild)}else{i(j)}}j.value=g.doctype.substring(9,g.doctype.length-1)}else{if(j){j.remove()}}j=f.getAll("title")[0];if(g.metatitle){if(!j){j=new a("title",1);j.append(new a("#text",3)).value=g.metatitle;i(j)}}if(g.docencoding){j=null;b(f.getAll("meta"),function(l){if(l.attr("http-equiv")=="Content-Type"){j=l}});if(!j){j=new a("meta",1);j.attr("http-equiv","Content-Type");j.shortEnded=true;i(j)}j.attr("content","text/html; charset="+g.docencoding)}b("keywords,description,author,copyright,robots".split(","),function(m){var l=f.getAll("meta"),n,p,o=g["meta"+m];for(n=0;n"))},_parseHeader:function(){return new tinymce.html.DomParser({validate:false,root_name:"#document"}).parse(this.head)},_setContent:function(g,d){var m=this,i,c,h=d.content,f,l="",e=m.editor.dom,j;function k(n){return n.replace(/<\/?[A-Z]+/g,function(o){return o.toLowerCase()})}if(d.format=="raw"&&m.head){return}if(d.source_view&&g.getParam("fullpage_hide_in_source_view")){return}h=h.replace(/<(\/?)BODY/gi,"<$1body");i=h.indexOf("",i);m.head=k(h.substring(0,i+1));c=h.indexOf("\n"}f=m._parseHeader();b(f.getAll("style"),function(n){if(n.firstChild){l+=n.firstChild.value}});j=f.getAll("body")[0];if(j){e.setAttribs(m.editor.getBody(),{style:j.attr("style")||"",dir:j.attr("dir")||"",vLink:j.attr("vlink")||"",link:j.attr("link")||"",aLink:j.attr("alink")||""})}e.remove("fullpage_styles");if(l){e.add(m.editor.getDoc().getElementsByTagName("head")[0],"style",{id:"fullpage_styles"},l);j=e.get("fullpage_styles");if(j.styleSheet){j.styleSheet.cssText=l}}},_getDefaultHeader:function(){var f="",c=this.editor,e,d="";if(c.getParam("fullpage_default_xml_pi")){f+='\n'}f+=c.getParam("fullpage_default_doctype",'');f+="\n\n\n";if(e=c.getParam("fullpage_default_title")){f+=""+e+"\n"}if(e=c.getParam("fullpage_default_encoding")){f+='\n'}if(e=c.getParam("fullpage_default_font_family")){d+="font-family: "+e+";"}if(e=c.getParam("fullpage_default_font_size")){d+="font-size: "+e+";"}if(e=c.getParam("fullpage_default_text_color")){d+="color: "+e+";"}f+="\n\n";return f},_getContent:function(d,e){var c=this;if(!e.source_view||!d.getParam("fullpage_hide_in_source_view")){e.content=tinymce.trim(c.head)+"\n"+tinymce.trim(e.content)+"\n"+tinymce.trim(c.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})();plugins/fullpage/js/fullpage.js000066600000017374150472426320012622 0ustar00/** * fullpage.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinyMCEPopup.requireLangPack(); var defaultDocTypes = 'XHTML 1.0 Transitional=,' + 'XHTML 1.0 Frameset=,' + 'XHTML 1.0 Strict=,' + 'XHTML 1.1=,' + 'HTML 4.01 Transitional=,' + 'HTML 4.01 Strict=,' + 'HTML 4.01 Frameset='; var defaultEncodings = 'Western european (iso-8859-1)=iso-8859-1,' + 'Central European (iso-8859-2)=iso-8859-2,' + 'Unicode (UTF-8)=utf-8,' + 'Chinese traditional (Big5)=big5,' + 'Cyrillic (iso-8859-5)=iso-8859-5,' + 'Japanese (iso-2022-jp)=iso-2022-jp,' + 'Greek (iso-8859-7)=iso-8859-7,' + 'Korean (iso-2022-kr)=iso-2022-kr,' + 'ASCII (us-ascii)=us-ascii'; var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings'; var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px'; function setVal(id, value) { var elm = document.getElementById(id); if (elm) { value = value || ''; if (elm.nodeName == "SELECT") selectByValue(document.forms[0], id, value); else if (elm.type == "checkbox") elm.checked = !!value; else elm.value = value; } }; function getVal(id) { var elm = document.getElementById(id); if (elm.nodeName == "SELECT") return elm.options[elm.selectedIndex].value; if (elm.type == "checkbox") return elm.checked; return elm.value; }; window.FullPageDialog = { changedStyle : function() { var val, styles = tinyMCEPopup.editor.dom.parseStyle(getVal('style')); setVal('fontface', styles['font-face']); setVal('fontsize', styles['font-size']); setVal('textcolor', styles['color']); if (val = styles['background-image']) setVal('bgimage', val.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1")); else setVal('bgimage', ''); setVal('bgcolor', styles['background-color']); // Reset margin form elements setVal('topmargin', ''); setVal('rightmargin', ''); setVal('bottommargin', ''); setVal('leftmargin', ''); // Expand margin if (val = styles['margin']) { val = val.split(' '); styles['margin-top'] = val[0] || ''; styles['margin-right'] = val[1] || val[0] || ''; styles['margin-bottom'] = val[2] || val[0] || ''; styles['margin-left'] = val[3] || val[0] || ''; } if (val = styles['margin-top']) setVal('topmargin', val.replace(/px/, '')); if (val = styles['margin-right']) setVal('rightmargin', val.replace(/px/, '')); if (val = styles['margin-bottom']) setVal('bottommargin', val.replace(/px/, '')); if (val = styles['margin-left']) setVal('leftmargin', val.replace(/px/, '')); updateColor('bgcolor_pick', 'bgcolor'); updateColor('textcolor_pick', 'textcolor'); }, changedStyleProp : function() { var val, dom = tinyMCEPopup.editor.dom, styles = dom.parseStyle(getVal('style')); styles['font-face'] = getVal('fontface'); styles['font-size'] = getVal('fontsize'); styles['color'] = getVal('textcolor'); styles['background-color'] = getVal('bgcolor'); if (val = getVal('bgimage')) styles['background-image'] = "url('" + val + "')"; else styles['background-image'] = ''; delete styles['margin']; if (val = getVal('topmargin')) styles['margin-top'] = val + "px"; else styles['margin-top'] = ''; if (val = getVal('rightmargin')) styles['margin-right'] = val + "px"; else styles['margin-right'] = ''; if (val = getVal('bottommargin')) styles['margin-bottom'] = val + "px"; else styles['margin-bottom'] = ''; if (val = getVal('leftmargin')) styles['margin-left'] = val + "px"; else styles['margin-left'] = ''; // Serialize, parse and reserialize this will compress redundant styles setVal('style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(styles)))); this.changedStyle(); }, update : function() { var data = {}; tinymce.each(tinyMCEPopup.dom.select('select,input,textarea'), function(node) { data[node.id] = getVal(node.id); }); tinyMCEPopup.editor.plugins.fullpage._dataToHtml(data); tinyMCEPopup.close(); } }; function init() { var form = document.forms[0], i, item, list, editor = tinyMCEPopup.editor; // Setup doctype select box list = editor.getParam("fullpage_doctypes", defaultDocTypes).split(','); for (i = 0; i < list.length; i++) { item = list[i].split('='); if (item.length > 1) addSelectValue(form, 'doctype', item[0], item[1]); } // Setup fonts select box list = editor.getParam("fullpage_fonts", defaultFontNames).split(';'); for (i = 0; i < list.length; i++) { item = list[i].split('='); if (item.length > 1) addSelectValue(form, 'fontface', item[0], item[1]); } // Setup fontsize select box list = editor.getParam("fullpage_fontsizes", defaultFontSizes).split(','); for (i = 0; i < list.length; i++) addSelectValue(form, 'fontsize', list[i], list[i]); // Setup encodings select box list = editor.getParam("fullpage_encodings", defaultEncodings).split(','); for (i = 0; i < list.length; i++) { item = list[i].split('='); if (item.length > 1) addSelectValue(form, 'docencoding', item[0], item[1]); } // Setup color pickers document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color'); document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color'); document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color'); document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor'); document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage'); document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage'); // Resize some elements if (isVisible('stylesheetbrowser')) document.getElementById('stylesheet').style.width = '220px'; if (isVisible('link_href_browser')) document.getElementById('element_link_href').style.width = '230px'; if (isVisible('bgimage_browser')) document.getElementById('bgimage').style.width = '210px'; // Update form tinymce.each(tinyMCEPopup.getWindowArg('data'), function(value, key) { setVal(key, value); }); FullPageDialog.changedStyle(); // Update colors updateColor('textcolor_pick', 'textcolor'); updateColor('bgcolor_pick', 'bgcolor'); updateColor('visited_color_pick', 'visited_color'); updateColor('active_color_pick', 'active_color'); updateColor('link_color_pick', 'link_color'); }; tinyMCEPopup.onInit.add(init); })(); plugins/fullpage/fullpage.htm000066600000024377150472426320012363 0ustar00 {#fullpage_dlg.title}

{#fullpage_dlg.meta_props}
 
 
 
 
 
 
{#fullpage_dlg.langprops}
 
 
 
{#fullpage_dlg.appearance_textprops}
 
{#fullpage_dlg.appearance_bgprops}
 
 
{#fullpage_dlg.appearance_marginprops}
{#fullpage_dlg.appearance_linkprops}
 
 
   
{#fullpage_dlg.appearance_style}
 
plugins/fullpage/langs/ru_dlg.js000066600000012163150472426320012756 0ustar00tinyMCE.addI18n('ru.fullpage_dlg',{ title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430", meta_tab:"\u041E\u0431\u0449\u0435\u0435", appearance_tab:"\u0412\u0438\u0434", advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", meta_props:"\u0426\u0435\u043B\u044C \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438", langprops:"\u042F\u0437\u044B\u043A \u0438 \u043A\u043E\u0434\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F", meta_title:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", meta_keywords:"\u041A\u043B\u044E\u0447\u0435\u0432\u044B\u0435 \u0441\u043B\u043E\u0432\u0430", meta_description:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", meta_robots:"\u0420\u0430\u0431\u043E\u0442\u044B", doctypes:"Doctype", langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430", langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430", ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", xml_pi:"XML declaration", encoding:"\u041A\u043E\u0434\u0438\u0440\u043E\u0432\u043A\u0430", appearance_bgprops:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0444\u043E\u043D\u0430", appearance_marginprops:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B", appearance_linkprops:"\u0426\u0432\u0435\u0442 \u0441\u0441\u044B\u043B\u043E\u043A", appearance_textprops:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0442\u0435\u043A\u0441\u0442\u0430", bgcolor:"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430", bgimage:"\u0424\u043E\u043D\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", left_margin:"\u041E\u0442\u0441\u0442\u0443\u043F \u0441\u043B\u0435\u0432\u0430", right_margin:"\u041E\u0442\u0441\u0442\u0443\u043F \u0441\u043F\u0440\u0430\u0432\u0430", top_margin:"\u041E\u0442\u0441\u0442\u0443\u043F \u0441\u0432\u0435\u0440\u0445\u0443", bottom_margin:"\u041E\u0442\u0441\u0442\u0443\u043F \u0441\u043D\u0438\u0437\u0443", text_color:"\u0426\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430", font_size:"\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", font_face:"\u0428\u0440\u0438\u0444\u0442", link_color:"\u0426\u0432\u0435\u0442 \u0441\u0441\u044B\u043B\u043A\u0438", hover_color:"\u0426\u0432\u0435\u0442 \u0441\u0441\u044B\u043B\u043A\u0438 \u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438", visited_color:"\u0426\u0432\u0435\u0442 \u043D\u0430\u0436\u0430\u0442\u043E\u0439 \u0441\u0441\u044B\u043B\u043A\u0438", active_color:"\u0426\u0432\u0435\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0439 \u0441\u0441\u044B\u043B\u043A\u0438", textcolor:"\u0426\u0432\u0435\u0442", fontsize:"\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", fontface:"\u0421\u0435\u043C\u0435\u0439\u0441\u0442\u0432\u043E \u0448\u0440\u0438\u0444\u0442\u0430", meta_index_follow:"Index and follow the links", meta_index_nofollow:"Index and don't follow the links", meta_noindex_follow:"Do not index but follow the links", meta_noindex_nofollow:"Do not index and don \ 't follow the links", appearance_style:"Stylesheet and style properties", stylesheet:"Stylesheet", style:"\u0421\u0442\u0438\u043B\u044C", author:"\u0410\u0432\u0442\u043E\u0440", copyright:"\u041A\u043E\u043F\u0438\u0440\u0430\u0439\u0442", add:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u043E\u0432\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442", remove:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0432\u044B\u0434\u0435\u043B\u0435\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442", moveup:"\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u0432\u0435\u0440\u0445", movedown:"\u041F\u0435\u0440\u0435\u043C\u0435\u0441\u0442\u0438\u0442\u044C \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0432\u043D\u0438\u0437", head_elements:"Head elements", info:"\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F", add_title:"Title element", add_meta:"Meta element", add_script:"Script element", add_style:"Style element", add_link:"Link element", add_base:"Base element", add_comment:"Comment node", title_element:"Title element", script_element:"Script element", style_element:"Style element", base_element:"Base element", link_element:"Link element", meta_element:"Meta \u044D\u043B\u0435\u043C\u0435\u043D\u0442", comment_element:"\u041A\u043E\u043C\u043C\u0435\u043D\u0442\u0430\u0440\u0438\u0439", src:"Src", language:"\u042F\u0437\u044B\u043A", href:"Href", target:"Target", type:"Type", charset:"Charset", defer:"Defer", media:"Media", properties:"Properties", name:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435", value:"\u0417\u043D\u0430\u0447\u0435\u043D\u0438\u0435", content:"\u0421\u043E\u0434\u0435\u0440\u0436\u0430\u043D\u0438\u0435", rel:"Rel", rev:"Rev", hreflang:"Href lang", general_props:"\u041E\u0431\u0449\u0435\u0435", advanced_props:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E" });plugins/fullpage/langs/en_dlg.js000066600000004371150472426320012734 0ustar00tinyMCE.addI18n('en.fullpage_dlg',{title:"Document Properties","meta_tab":"General","appearance_tab":"Appearance","advanced_tab":"Advanced","meta_props":"Meta Information",langprops:"Language and Encoding","meta_title":"Title","meta_keywords":"Keywords","meta_description":"Description","meta_robots":"Robots",doctypes:"Doctype",langcode:"Language Code",langdir:"Language Direction",ltr:"Left to Right",rtl:"Right to Left","xml_pi":"XML Declaration",encoding:"Character Encoding","appearance_bgprops":"Background Properties","appearance_marginprops":"Body Margins","appearance_linkprops":"Link Colors","appearance_textprops":"Text Properties",bgcolor:"Background Color",bgimage:"Background Image","left_margin":"Left Margin","right_margin":"Right Margin","top_margin":"Top Margin","bottom_margin":"Bottom Margin","text_color":"Text Color","font_size":"Font Size","font_face":"Font Face","link_color":"Link Color","hover_color":"Hover Color","visited_color":"Visited Color","active_color":"Active Color",textcolor:"Color",fontsize:"Font Size",fontface:"Font Family","meta_index_follow":"Index and Follow the Links","meta_index_nofollow":"Index and Don\'t Follow the Links","meta_noindex_follow":"Do Not Index but Follow the Links","meta_noindex_nofollow":"Do Not Index and Don\'t Follow the Links","appearance_style":"Stylesheet and Style Properties",stylesheet:"Stylesheet",style:"Style",author:"Author",copyright:"Copyright",add:"Add New Element",remove:"Remove Selected Element",moveup:"Move Selected Element Up",movedown:"Move Selected Element Down","head_elements":"Head Elements",info:"Information","add_title":"Title Element","add_meta":"Meta Element","add_script":"Script Element","add_style":"Style Element","add_link":"Link Element","add_base":"Base Element","add_comment":"Comment Node","title_element":"Title Element","script_element":"Script Element","style_element":"Style Element","base_element":"Base Element","link_element":"Link Element","meta_element":"Meta Element","comment_element":"Comment",src:"Source",language:"Language",href:"HREF",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"HREF Lang","general_props":"General","advanced_props":"Advanced"});plugins/fullpage/editor_plugin_src.js000066600000025633150472426320014117 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var each = tinymce.each, Node = tinymce.html.Node; tinymce.create('tinymce.plugins.FullPagePlugin', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceFullPageProperties', function() { ed.windowManager.open({ file : url + '/fullpage.htm', width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)), height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)), inline : 1 }, { plugin_url : url, data : t._htmlToData() }); }); // Register buttons ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'}); ed.onBeforeSetContent.add(t._setContent, t); ed.onGetContent.add(t._getContent, t); }, getInfo : function() { return { longname : 'Fullpage', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private plugin internal methods _htmlToData : function() { var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor; function getAttr(elm, name) { var value = elm.attr(name); return value || ''; }; // Default some values data.fontface = editor.getParam("fullpage_default_fontface", ""); data.fontsize = editor.getParam("fullpage_default_fontsize", ""); // Parse XML PI elm = headerFragment.firstChild; if (elm.type == 7) { data.xml_pi = true; matches = /encoding="([^"]+)"/.exec(elm.value); if (matches) data.docencoding = matches[1]; } // Parse doctype elm = headerFragment.getAll('#doctype')[0]; if (elm) data.doctype = '"; // Parse title element elm = headerFragment.getAll('title')[0]; if (elm && elm.firstChild) { data.metatitle = elm.firstChild.value; } // Parse meta elements each(headerFragment.getAll('meta'), function(meta) { var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches; if (name) data['meta' + name.toLowerCase()] = meta.attr('content'); else if (httpEquiv == "Content-Type") { matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content')); if (matches) data.docencoding = matches[1]; } }); // Parse html attribs elm = headerFragment.getAll('html')[0]; if (elm) data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang'); // Parse stylesheet elm = headerFragment.getAll('link')[0]; if (elm && elm.attr('rel') == 'stylesheet') data.stylesheet = elm.attr('href'); // Parse body parts elm = headerFragment.getAll('body')[0]; if (elm) { data.langdir = getAttr(elm, 'dir'); data.style = getAttr(elm, 'style'); data.visited_color = getAttr(elm, 'vlink'); data.link_color = getAttr(elm, 'link'); data.active_color = getAttr(elm, 'alink'); } return data; }, _dataToHtml : function(data) { var headerFragment, headElement, html, elm, value, dom = this.editor.dom; function setAttr(elm, name, value) { elm.attr(name, value ? value : undefined); }; function addHeadNode(node) { if (headElement.firstChild) headElement.insert(node, headElement.firstChild); else headElement.append(node); }; headerFragment = this._parseHeader(); headElement = headerFragment.getAll('head')[0]; if (!headElement) { elm = headerFragment.getAll('html')[0]; headElement = new Node('head', 1); if (elm.firstChild) elm.insert(headElement, elm.firstChild, true); else elm.append(headElement); } // Add/update/remove XML-PI elm = headerFragment.firstChild; if (data.xml_pi) { value = 'version="1.0"'; if (data.docencoding) value += ' encoding="' + data.docencoding + '"'; if (elm.type != 7) { elm = new Node('xml', 7); headerFragment.insert(elm, headerFragment.firstChild, true); } elm.value = value; } else if (elm && elm.type == 7) elm.remove(); // Add/update/remove doctype elm = headerFragment.getAll('#doctype')[0]; if (data.doctype) { if (!elm) { elm = new Node('#doctype', 10); if (data.xml_pi) headerFragment.insert(elm, headerFragment.firstChild); else addHeadNode(elm); } elm.value = data.doctype.substring(9, data.doctype.length - 1); } else if (elm) elm.remove(); // Add/update/remove title elm = headerFragment.getAll('title')[0]; if (data.metatitle) { if (!elm) { elm = new Node('title', 1); elm.append(new Node('#text', 3)).value = data.metatitle; addHeadNode(elm); } } // Add meta encoding if (data.docencoding) { elm = null; each(headerFragment.getAll('meta'), function(meta) { if (meta.attr('http-equiv') == 'Content-Type') elm = meta; }); if (!elm) { elm = new Node('meta', 1); elm.attr('http-equiv', 'Content-Type'); elm.shortEnded = true; addHeadNode(elm); } elm.attr('content', 'text/html; charset=' + data.docencoding); } // Add/update/remove meta each('keywords,description,author,copyright,robots'.split(','), function(name) { var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name]; for (i = 0; i < nodes.length; i++) { meta = nodes[i]; if (meta.attr('name') == name) { if (value) meta.attr('content', value); else meta.remove(); return; } } if (value) { elm = new Node('meta', 1); elm.attr('name', name); elm.attr('content', value); elm.shortEnded = true; addHeadNode(elm); } }); // Add/update/delete link elm = headerFragment.getAll('link')[0]; if (elm && elm.attr('rel') == 'stylesheet') { if (data.stylesheet) elm.attr('href', data.stylesheet); else elm.remove(); } else if (data.stylesheet) { elm = new Node('link', 1); elm.attr({ rel : 'stylesheet', text : 'text/css', href : data.stylesheet }); elm.shortEnded = true; addHeadNode(elm); } // Update body attributes elm = headerFragment.getAll('body')[0]; if (elm) { setAttr(elm, 'dir', data.langdir); setAttr(elm, 'style', data.style); setAttr(elm, 'vlink', data.visited_color); setAttr(elm, 'link', data.link_color); setAttr(elm, 'alink', data.active_color); // Update iframe body as well dom.setAttribs(this.editor.getBody(), { style : data.style, dir : data.dir, vLink : data.visited_color, link : data.link_color, aLink : data.active_color }); } // Set html attributes elm = headerFragment.getAll('html')[0]; if (elm) { setAttr(elm, 'lang', data.langcode); setAttr(elm, 'xml:lang', data.langcode); } // Serialize header fragment and crop away body part html = new tinymce.html.Serializer({ validate: false, indent: true, apply_source_formatting : true, indent_before: 'head,html,body,meta,title,script,link,style', indent_after: 'head,html,body,meta,title,script,link,style' }).serialize(headerFragment); this.head = html.substring(0, html.indexOf('')); }, _parseHeader : function() { // Parse the contents with a DOM parser return new tinymce.html.DomParser({ validate: false, root_name: '#document' }).parse(this.head); }, _setContent : function(ed, o) { var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm; function low(s) { return s.replace(/<\/?[A-Z]+/g, function(a) { return a.toLowerCase(); }) }; // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate if (o.format == 'raw' && self.head) return; if (o.source_view && ed.getParam('fullpage_hide_in_source_view')) return; // Parse out head, body and footer content = content.replace(/<(\/?)BODY/gi, '<$1body'); startPos = content.indexOf('', startPos); self.head = low(content.substring(0, startPos + 1)); endPos = content.indexOf('\n'; header += editor.getParam('fullpage_default_doctype', ''); header += '\n\n\n'; if (value = editor.getParam('fullpage_default_title')) header += '' + value + '\n'; if (value = editor.getParam('fullpage_default_encoding')) header += '\n'; if (value = editor.getParam('fullpage_default_font_family')) styles += 'font-family: ' + value + ';'; if (value = editor.getParam('fullpage_default_font_size')) styles += 'font-size: ' + value + ';'; if (value = editor.getParam('fullpage_default_text_color')) styles += 'color: ' + value + ';'; header += '\n\n'; return header; }, _getContent : function(ed, o) { var self = this; if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view')) o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot); } }); // Register plugin tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin); })(); plugins/xhtmlxtras/css/attributes.css000066600000000272150472426320014145 0ustar00.panel_wrapper div.current { height: 290px; } #id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey { width: 200px; } #events_panel input { width: 200px; } plugins/xhtmlxtras/css/popup.css000066600000000771150472426320013126 0ustar00input.field, select.field {width:200px;} input.picker {width:179px; margin-left: 5px;} input.disabled {border-color:#F2F2F2;} img.picker {vertical-align:text-bottom; cursor:pointer;} h1 {padding: 0 0 5px 0;} .panel_wrapper div.current {height:160px;} #xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;} a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;} #datetime {width:180px;} plugins/xhtmlxtras/editor_plugin.js000066600000005304150472426320013660 0ustar00(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})();plugins/xhtmlxtras/ins.htm000066600000015741150472426320011767 0ustar00 {#xhtmlxtras_dlg.title_ins_element}
{#xhtmlxtras_dlg.fieldset_general_tab}
:
:
{#xhtmlxtras_dlg.fieldset_attrib_tab}
:
:
:
:
:
:
{#xhtmlxtras_dlg.fieldset_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/xhtmlxtras/js/ins.js000066600000002427150472426320012224 0ustar00/** * ins.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ function init() { SXE.initElementDialog('ins'); if (SXE.currentAction == "update") { setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime')); setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite')); SXE.showRemoveButton(); } } function setElementAttribs(elm) { setAllCommonAttribs(elm); setAttrib(elm, 'datetime'); setAttrib(elm, 'cite'); elm.removeAttribute('data-mce-new'); } function insertIns() { var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS'); if (elm == null) { var s = SXE.inst.selection.getContent(); if(s.length > 0) { insertInlineElement('ins'); var elementArray = SXE.inst.dom.select('ins[data-mce-new]'); for (var i=0; i 0) { insertInlineElement('del'); var elementArray = SXE.inst.dom.select('del[data-mce-new]'); for (var i=0; i 0) { tagName = element_name; insertInlineElement(element_name); var elementArray = tinymce.grep(SXE.inst.dom.select(element_name)); for (var i=0; i -1) ? true : false; } SXE.removeClass = function(elm,cl) { if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) { return true; } var classNames = elm.className.split(" "); var newClassNames = ""; for (var x = 0, cnl = classNames.length; x < cnl; x++) { if (classNames[x] != cl) { newClassNames += (classNames[x] + " "); } } elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end } SXE.addClass = function(elm,cl) { if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl; return true; } function insertInlineElement(en) { var ed = tinyMCEPopup.editor, dom = ed.dom; ed.getDoc().execCommand('FontName', false, 'mceinline'); tinymce.each(dom.select('span,font'), function(n) { if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline') dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1); }); } plugins/xhtmlxtras/js/abbr.js000066600000001001150472426320012324 0ustar00/** * abbr.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ function init() { SXE.initElementDialog('abbr'); if (SXE.currentAction == "update") { SXE.showRemoveButton(); } } function insertAbbr() { SXE.insertElement('abbr'); tinyMCEPopup.close(); } function removeAbbr() { SXE.removeElement('abbr'); tinyMCEPopup.close(); } tinyMCEPopup.onInit.add(init); plugins/xhtmlxtras/js/cite.js000066600000001001150472426320012342 0ustar00/** * cite.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ function init() { SXE.initElementDialog('cite'); if (SXE.currentAction == "update") { SXE.showRemoveButton(); } } function insertCite() { SXE.insertElement('cite'); tinyMCEPopup.close(); } function removeCite() { SXE.removeElement('cite'); tinyMCEPopup.close(); } tinyMCEPopup.onInit.add(init); plugins/xhtmlxtras/js/attributes.js000066600000006440150472426320013620 0ustar00/** * attributes.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ function init() { tinyMCEPopup.resizeToInnerSize(); var inst = tinyMCEPopup.editor; var dom = inst.dom; var elm = inst.selection.getNode(); var f = document.forms[0]; var onclick = dom.getAttrib(elm, 'onclick'); setFormValue('title', dom.getAttrib(elm, 'title')); setFormValue('id', dom.getAttrib(elm, 'id')); setFormValue('style', dom.getAttrib(elm, "style")); setFormValue('dir', dom.getAttrib(elm, 'dir')); setFormValue('lang', dom.getAttrib(elm, 'lang')); setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); setFormValue('onfocus', dom.getAttrib(elm, 'onfocus')); setFormValue('onblur', dom.getAttrib(elm, 'onblur')); setFormValue('onclick', onclick); setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick')); setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown')); setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup')); setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover')); setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove')); setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout')); setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress')); setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown')); setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup')); className = dom.getAttrib(elm, 'class'); addClassesToList('classlist', 'advlink_styles'); selectByValue(f, 'classlist', className, true); TinyMCE_EditableSelects.init(); } function setFormValue(name, value) { if(value && document.forms[0].elements[name]){ document.forms[0].elements[name].value = value; } } function insertAction() { var inst = tinyMCEPopup.editor; var elm = inst.selection.getNode(); setAllAttribs(elm); tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); } function setAttrib(elm, attrib, value) { var formObj = document.forms[0]; var valueElm = formObj.elements[attrib.toLowerCase()]; var inst = tinyMCEPopup.editor; var dom = inst.dom; if (typeof(value) == "undefined" || value == null) { value = ""; if (valueElm) value = valueElm.value; } dom.setAttrib(elm, attrib.toLowerCase(), value); } function setAllAttribs(elm) { var f = document.forms[0]; setAttrib(elm, 'title'); setAttrib(elm, 'id'); setAttrib(elm, 'style'); setAttrib(elm, 'class', getSelectValue(f, 'classlist')); setAttrib(elm, 'dir'); setAttrib(elm, 'lang'); setAttrib(elm, 'tabindex'); setAttrib(elm, 'accesskey'); setAttrib(elm, 'onfocus'); setAttrib(elm, 'onblur'); setAttrib(elm, 'onclick'); setAttrib(elm, 'ondblclick'); setAttrib(elm, 'onmousedown'); setAttrib(elm, 'onmouseup'); setAttrib(elm, 'onmouseover'); setAttrib(elm, 'onmousemove'); setAttrib(elm, 'onmouseout'); setAttrib(elm, 'onkeypress'); setAttrib(elm, 'onkeydown'); setAttrib(elm, 'onkeyup'); // Refresh in old MSIE // if (tinyMCE.isMSIE5) // elm.outerHTML = elm.outerHTML; } function insertAttribute() { tinyMCEPopup.close(); } tinyMCEPopup.onInit.add(init); tinyMCEPopup.requireLangPack(); plugins/xhtmlxtras/abbr.htm000066600000013725150472426320012104 0ustar00 {#xhtmlxtras_dlg.title_abbr_element}
{#xhtmlxtras_dlg.fieldset_attrib_tab}
:
:
:
:
:
:
{#xhtmlxtras_dlg.fieldset_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/xhtmlxtras/langs/ru_dlg.js000066600000004104150472426320013371 0ustar00tinyMCE.addI18n('ru.xhtmlxtras_dlg',{ attribute_label_title:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", attribute_label_id:"ID", attribute_label_class:"\u041A\u043B\u0430\u0441\u0441", attribute_label_style:"\u0421\u0442\u0438\u043B\u044C", attribute_label_cite:"\u0426\u0438\u0442\u0430\u0442\u0430", attribute_label_datetime:"\u0414\u0430\u0442\u0430 / \u0412\u0440\u0435\u043C\u044F", attribute_label_langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430", attribute_option_ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", attribute_option_rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", attribute_label_langcode:"\u042F\u0437\u044B\u043A", attribute_label_tabindex:"TabIndex", attribute_label_accesskey:"AccessKey", attribute_events_tab:"\u0421\u043E\u0431\u044B\u0442\u0438\u044F", attribute_attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044B", general_tab:"\u041E\u0431\u0449\u0435\u0435", attrib_tab:"\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044B", events_tab:"\u0421\u043E\u0431\u044B\u0442\u0438\u044F", fieldset_general_tab:"\u041E\u0431\u0449\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438", fieldset_attrib_tab:"Element Attributes", fieldset_events_tab:"Element Events", title_ins_element:"Insertion Element", title_del_element:"Deletion Element", title_acronym_element:"Acronym Element", title_abbr_element:"Abbreviation Element", title_cite_element:"Citation Element", remove:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C", insert_date:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0434\u0430\u0442\u0443 / \u0432\u0440\u0435\u043C\u044F", option_ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", option_rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", attribs_title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044B" });plugins/xhtmlxtras/langs/en_dlg.js000066600000002104150472426320013343 0ustar00tinyMCE.addI18n('en.xhtmlxtras_dlg',{"attribs_title":"Insert/Edit Attributes","option_rtl":"Right to Left","option_ltr":"Left to Right","insert_date":"Insert Current Date/Time",remove:"Remove","title_cite_element":"Citation Element","title_abbr_element":"Abbreviation Element","title_acronym_element":"Acronym Element","title_del_element":"Deletion Element","title_ins_element":"Insertion Element","fieldset_events_tab":"Element Events","fieldset_attrib_tab":"Element Attributes","fieldset_general_tab":"General Settings","events_tab":"Events","attrib_tab":"Attributes","general_tab":"General","attribute_attrib_tab":"Attributes","attribute_events_tab":"Events","attribute_label_accesskey":"AccessKey","attribute_label_tabindex":"TabIndex","attribute_label_langcode":"Language","attribute_option_rtl":"Right to Left","attribute_option_ltr":"Left to Right","attribute_label_langdir":"Text Direction","attribute_label_datetime":"Date/Time","attribute_label_cite":"Cite","attribute_label_style":"Style","attribute_label_class":"Class","attribute_label_id":"ID","attribute_label_title":"Title"});plugins/xhtmlxtras/editor_plugin_src.js000066600000007577150472426320014545 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', { init : function(ed, url) { // Register commands ed.addCommand('mceCite', function() { ed.windowManager.open({ file : url + '/cite.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)), height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceAcronym', function() { ed.windowManager.open({ file : url + '/acronym.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)), height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceAbbr', function() { ed.windowManager.open({ file : url + '/abbr.htm', width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)), height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceDel', function() { ed.windowManager.open({ file : url + '/del.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)), height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceIns', function() { ed.windowManager.open({ file : url + '/ins.htm', width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)), height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceAttributes', function() { ed.windowManager.open({ file : url + '/attributes.htm', width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)), height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)), inline : 1 }, { plugin_url : url }); }); // Register buttons ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'}); ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'}); ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'}); ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'}); ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'}); ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'}); ed.onNodeChange.add(function(ed, cm, n, co) { n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS'); cm.setDisabled('cite', co); cm.setDisabled('acronym', co); cm.setDisabled('abbr', co); cm.setDisabled('del', co); cm.setDisabled('ins', co); cm.setDisabled('attribs', n && n.nodeName == 'BODY'); cm.setActive('cite', 0); cm.setActive('acronym', 0); cm.setActive('abbr', 0); cm.setActive('del', 0); cm.setActive('ins', 0); // Activate all if (n) { do { cm.setDisabled(n.nodeName.toLowerCase(), 0); cm.setActive(n.nodeName.toLowerCase(), 1); } while (n = n.parentNode); } }); ed.onPreInit.add(function() { // Fixed IE issue where it can't handle these elements correctly ed.dom.create('abbr'); }); }, getInfo : function() { return { longname : 'XHTML Xtras Plugin', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin); })();plugins/xhtmlxtras/del.htm000066600000015734150472426320011744 0ustar00 {#xhtmlxtras_dlg.title_del_element}
{#xhtmlxtras_dlg.fieldset_general_tab}
:
:
{#xhtmlxtras_dlg.fieldset_attrib_tab}
:
:
:
:
:
:
{#xhtmlxtras_dlg.fieldset_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/xhtmlxtras/cite.htm000066600000013725150472426320012122 0ustar00 {#xhtmlxtras_dlg.title_cite_element}
{#xhtmlxtras_dlg.fieldset_attrib_tab}
:
:
:
:
:
:
{#xhtmlxtras_dlg.fieldset_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/xhtmlxtras/attributes.htm000066600000013703150472426320013360 0ustar00 {#xhtmlxtras_dlg.attribs_title}
{#xhtmlxtras_dlg.attribute_attrib_tab}
:
:
:
:
:
{#xhtmlxtras_dlg.attribute_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/xhtmlxtras/acronym.htm000066600000013744150472426320012647 0ustar00 {#xhtmlxtras_dlg.title_acronym_element}
{#xhtmlxtras_dlg.fieldset_attrib_tab}
:
:
:
:
:
:
{#xhtmlxtras_dlg.fieldset_events_tab}
:
:
:
:
:
:
:
:
:
:
:
:
plugins/fullscreen/fullscreen.htm000066600000006276150472426320013267 0ustar00
plugins/fullscreen/editor_plugin.js000066600000007014150472426320013604 0ustar00(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent());tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6||document.compatMode=="BackCompat"){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent());d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().firstChild);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})();plugins/fullscreen/editor_plugin_src.js000066600000012527150472426320014460 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var DOM = tinymce.DOM; tinymce.create('tinymce.plugins.FullScreenPlugin', { init : function(ed, url) { var t = this, s = {}, vp, posCss; t.editor = ed; // Register commands ed.addCommand('mceFullScreen', function() { var win, de = DOM.doc.documentElement; if (ed.getParam('fullscreen_is_enabled')) { if (ed.getParam('fullscreen_new_window')) closeFullscreen(); // Call to close in new window else { DOM.win.setTimeout(function() { tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc); tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent()); tinyMCE.remove(ed); DOM.remove('mce_fullscreen_container'); de.style.overflow = ed.getParam('fullscreen_html_overflow'); DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow')); DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly')); tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings }, 10); } return; } if (ed.getParam('fullscreen_new_window')) { win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight); try { win.resizeTo(screen.availWidth, screen.availHeight); } catch (e) { // Ignore } } else { tinyMCE.oldSettings = tinyMCE.settings; // Store old settings s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto'; s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1); vp = DOM.getViewPort(); s.fullscreen_scrollx = vp.x; s.fullscreen_scrolly = vp.y; // Fixes an Opera bug where the scrollbars doesn't reappear if (tinymce.isOpera && s.fullscreen_overflow == 'visible') s.fullscreen_overflow = 'auto'; // Fixes an IE bug where horizontal scrollbars would appear if (tinymce.isIE && s.fullscreen_overflow == 'scroll') s.fullscreen_overflow = 'auto'; // Fixes an IE bug where the scrollbars doesn't reappear if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll')) s.fullscreen_html_overflow = 'auto'; if (s.fullscreen_overflow == '0px') s.fullscreen_overflow = ''; DOM.setStyle(DOM.doc.body, 'overflow', 'hidden'); de.style.overflow = 'hidden'; //Fix for IE6/7 vp = DOM.getViewPort(); DOM.win.scrollTo(0, 0); if (tinymce.isIE) vp.h -= 1; // Use fixed position if it exists if (tinymce.isIE6 || document.compatMode == 'BackCompat') posCss = 'absolute;top:' + vp.y; else posCss = 'fixed;top:0'; n = DOM.add(DOM.doc.body, 'div', { id : 'mce_fullscreen_container', style : 'position:' + posCss + ';left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'}); DOM.add(n, 'div', {id : 'mce_fullscreen'}); tinymce.each(ed.settings, function(v, n) { s[n] = v; }); s.id = 'mce_fullscreen'; s.width = n.clientWidth; s.height = n.clientHeight - 15; s.fullscreen_is_enabled = true; s.fullscreen_editor_id = ed.id; s.theme_advanced_resizing = false; s.save_onsavecallback = function() { ed.setContent(tinyMCE.get(s.id).getContent()); ed.execCommand('mceSave'); }; tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) { s[k] = v; }); if (s.theme_advanced_toolbar_location === 'external') s.theme_advanced_toolbar_location = 'top'; t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s); t.fullscreenEditor.onInit.add(function() { t.fullscreenEditor.setContent(ed.getContent()); t.fullscreenEditor.focus(); }); t.fullscreenEditor.render(); t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container'); t.fullscreenElement.update(); //document.body.overflow = 'hidden'; t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() { var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize; // Get outer/inner size to get a delta size that can be used to calc the new iframe size outerSize = fed.dom.getSize(fed.getContainer().firstChild); innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]); fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h); }); } }); // Register buttons ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'}); ed.onNodeChange.add(function(ed, cm) { cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled')); }); }, getInfo : function() { return { longname : 'Fullscreen', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin); })();plugins/advlink/css/advlink.css000066600000000730150472426320012620 0ustar00.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;} plugins/advlink/editor_plugin.js000066600000001715150472426320013074 0ustar00(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})();plugins/advlink/js/advlink.js000066600000040362150472426320012275 0ustar00/* Functions for the advlink plugin popup */ tinyMCEPopup.requireLangPack(); var templates = { "window.open" : "window.open('${url}','${target}','${options}')" }; function preinit() { var url; if (url = tinyMCEPopup.getParam("external_link_list_url")) document.write(''); } function changeClass() { var f = document.forms[0]; f.classes.value = getSelectValue(f, 'classlist'); } function init() { tinyMCEPopup.resizeToInnerSize(); var formObj = document.forms[0]; var inst = tinyMCEPopup.editor; var elm = inst.selection.getNode(); 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('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; // Anchor list html = getAnchorListHTML('anchorlist','href'); if (html == "") document.getElementById("anchorlistrow").style.display = 'none'; else document.getElementById("anchorlistcontainer").innerHTML = html; // Resize some elements if (isVisible('hrefbrowser')) document.getElementById('href').style.width = '260px'; if (isVisible('popupurlbrowser')) document.getElementById('popupurl').style.width = '180px'; elm = inst.dom.getParent(elm, "A"); if (elm == null) { var prospect = inst.dom.create("p", null, inst.selection.getContent()); if (prospect.childNodes.length === 1) { elm = prospect.firstChild; } } if (elm != null && elm.nodeName == "A") action = "update"; formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); setPopupControlsDisabled(true); if (action == "update") { var href = inst.dom.getAttrib(elm, 'href'); var onclick = inst.dom.getAttrib(elm, 'onclick'); // Setup form data setFormValue('href', href); setFormValue('title', inst.dom.getAttrib(elm, 'title')); setFormValue('id', inst.dom.getAttrib(elm, 'id')); setFormValue('style', inst.dom.getAttrib(elm, "style")); setFormValue('rel', inst.dom.getAttrib(elm, 'rel')); setFormValue('rev', inst.dom.getAttrib(elm, 'rev')); setFormValue('charset', inst.dom.getAttrib(elm, 'charset')); setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang')); setFormValue('dir', inst.dom.getAttrib(elm, 'dir')); setFormValue('lang', inst.dom.getAttrib(elm, 'lang')); setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : "")); setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : "")); setFormValue('type', inst.dom.getAttrib(elm, 'type')); setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus')); setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur')); setFormValue('onclick', onclick); setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick')); setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown')); setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup')); setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover')); setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove')); setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout')); setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress')); setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown')); setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup')); setFormValue('target', inst.dom.getAttrib(elm, 'target')); setFormValue('classes', inst.dom.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', inst.dom.getAttrib(elm, 'dir')); selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel')); selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev')); selectByValue(formObj, 'linklisthref', href); if (href.charAt(0) == '#') selectByValue(formObj, 'anchorlist', href); addClassesToList('classlist', 'advlink_styles'); selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true); selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true); } else addClassesToList('classlist', 'advlink_styles'); } function checkPrefix(n) { if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email'))) n.value = 'mailto:' + n.value; if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external'))) n.value = 'http://' + n.value; } function setFormValue(name, value) { document.forms[0].elements[name].value = value; } 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;', ''); } else formObj.popupreturn.checked = false; var onClickData = parseLink(onclick); if (onClickData != null) { formObj.ispopup.checked = true; setPopupControlsDisabled(false); var onClickWindowOptions = parseOptions(onClickData['options']); var url = onClickData['url']; 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' + name + ''; } if (html == "") return ""; html = ''; return html; } function insertAction() { var inst = tinyMCEPopup.editor; var elm, elementArray, i; elm = inst.selection.getNode(); checkPrefix(document.forms[0].href); elm = inst.dom.getParent(elm, "A"); // Remove element if there is no href if (!document.forms[0].href.value) { i = inst.selection.getBookmark(); inst.dom.remove(elm, 1); inst.selection.moveToBookmark(i); tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); return; } // Create new anchor elements if (elm == null) { inst.getDoc().execCommand("unlink", false, null); tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';}); for (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 = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';'); var html = ''; html += ''; return html; } // While loading preinit(); tinyMCEPopup.onInit.add(init); plugins/advlink/langs/ru_dlg.js000066600000011102150472426320012577 0ustar00tinyMCE.addI18n('ru.advlink_dlg',{ title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443", url:"\u0410\u0434\u0440\u0435\u0441", target:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 ...", titlefield:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 URL \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 email \u0430\u0434\u0440\u0435\u0441, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 mailto?", is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 URL \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0441\u0441\u044B\u043B\u043A\u0443, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 http://?", list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0441\u044B\u043B\u043E\u043A", general_tab:"\u041E\u0431\u0449\u0435\u0435", popup_tab:"Popup", events_tab:"\u0421\u043E\u0431\u044B\u0442\u0438\u044F", advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", general_props:"\u041E\u0431\u0449\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430", popup_props:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 Popup", event_props:"\u0421\u043E\u0431\u044B\u0442\u0438\u044F", advanced_props:"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430", popup_opts:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430", anchor_names:"\u042F\u043A\u043E\u0440\u044F", target_same:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u044D\u0442\u043E\u043C \u0436\u0435 \u043E\u043A\u043D\u0435 / \u0444\u0440\u0435\u0439\u043C\u0435", target_parent:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u043C \u043E\u043A\u043D\u0435 / \u0444\u0440\u0435\u0439\u043C\u0435", target_top:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u0432\u0435\u0440\u0445\u043D\u0435\u043C \u0444\u0440\u0435\u0439\u043C\u0435 (\u0437\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435 \u0444\u0440\u0435\u0439\u043C\u044B)", target_blank:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 \u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435", popup:"Javascript popup", popup_url:"Popup URL", popup_name:"\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043E\u043A\u043D\u0430", popup_return:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C 'return false'", popup_scrollbars:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u043A\u0440\u043E\u043B\u043B\u0435\u0440\u044B", popup_statusbar:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u0441\u0442\u0430\u0442\u0443\u0441", popup_toolbar:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u0438 \u0438\u043D\u0441\u0442\u0440\u0443\u043C\u0435\u043D\u0442\u043E\u0432", popup_menubar:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043C\u0435\u043D\u044E", popup_location:"\u041F\u043E\u043A\u0430\u0437\u044B\u0432\u0430\u0442\u044C \u043F\u0430\u043D\u0435\u043B\u044C location", popup_resizable:"\u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044C \u0438\u0437\u043C\u0435\u043D\u044F\u0442\u044C \u0440\u0430\u0437\u043C\u0435\u0440", popup_dependent:"Dependent (\u0442\u043E\u043B\u044C\u043A\u043E \u0434\u043B\u044F Mozilla / Firefox)", popup_size:"\u0420\u0430\u0437\u043C\u0435\u0440", popup_position:"\u041F\u043E\u0437\u0438\u0446\u0438\u044F (X / Y)", id:"Id", style:"\u0421\u0442\u0438\u043B\u044C", classes:"\u041A\u043B\u0430\u0441\u0441\u044B", target_name:"Target name", langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430", target_langcode:"Target language", langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430", encoding:"Target character encoding", mime:"Target MIME type", rel:"Relationship page to target", rev:"Relationship target to page", tabindex:"Tabindex", accesskey:"Accesskey", ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", link_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0441\u044B\u043B\u043E\u043A" });plugins/advlink/langs/en_dlg.js000066600000003203150472426320012556 0ustar00tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target Name",classes:"Classes",style:"Style",id:"ID","popup_position":"Position (X/Y)",langdir:"Language Direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox Only)","popup_resizable":"Make Window Resizable","popup_location":"Show Location Bar","popup_menubar":"Show Menu Bar","popup_toolbar":"Show Toolbars","popup_statusbar":"Show Status Bar","popup_scrollbars":"Show Scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window Name","popup_url":"Popup URL",popup:"JavaScript Popup","target_blank":"Open in New Window","target_top":"Open in Top Frame (Replaces All Frames)","target_parent":"Open in Parent Window/Frame","target_same":"Open in This Window/Frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced Properties","event_props":"Events","popup_props":"Popup Properties","general_props":"General Properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link List","is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/Edit Link","link_list":"Link List",rtl:"Right to Left",ltr:"Left to Right",accesskey:"AccessKey",tabindex:"TabIndex",rev:"Relationship Target to Page",rel:"Relationship Page to Target",mime:"Target MIME Type",encoding:"Target Character Encoding",langcode:"Language Code","target_langcode":"Target Language",width:"Width",height:"Height"});plugins/advlink/link.htm000066600000036651150472426320011350 0ustar00 {#advlink_dlg.title}
plugins/advlink/editor_plugin_src.js000066600000003045150472426320013741 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.AdvancedLinkPlugin', { init : function(ed, url) { this.editor = ed; // Register commands ed.addCommand('mceAdvLink', function() { var se = ed.selection; // No selection and not in link if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A')) return; ed.windowManager.open({ file : url + '/link.htm', width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)), height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)), inline : 1 }, { plugin_url : url }); }); // Register buttons ed.addButton('link', { title : 'advlink.link_desc', cmd : 'mceAdvLink' }); ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink'); ed.onNodeChange.add(function(ed, cm, n, co) { cm.setDisabled('link', co && n.nodeName != 'A'); cm.setActive('link', n.nodeName == 'A' && !n.name); }); }, getInfo : function() { return { longname : 'Advanced link', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin); })();plugins/print/editor_plugin.js000066600000000754150472426320012602 0ustar00(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})();plugins/print/editor_plugin_src.js000066600000001517150472426320013447 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.Print', { init : function(ed, url) { ed.addCommand('mcePrint', function() { ed.getWin().print(); }); ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'}); }, getInfo : function() { return { longname : 'Print', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('print', tinymce.plugins.Print); })(); plugins/legacyoutput/editor_plugin.js000066600000004046150472426320014171 0ustar00(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);plugins/legacyoutput/editor_plugin_src.js000066600000011514150472426320015036 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing * * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash * * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are * not apart of the newer specifications for HTML and XHTML. */ (function(tinymce) { // Override inline_styles setting to force TinyMCE to produce deprecated contents tinymce.onAddEditor.addToTop(function(tinymce, editor) { editor.settings.inline_styles = false; }); // Create the legacy ouput plugin tinymce.create('tinymce.plugins.LegacyOutput', { init : function(editor) { editor.onInit.add(function() { var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img', fontSizes = tinymce.explode(editor.settings.font_size_style_values), schema = editor.schema; // Override some internal formats to produce legacy elements and attributes editor.formatter.register({ // Change alignment formats to use the deprecated align attribute alignleft : {selector : alignElements, attributes : {align : 'left'}}, aligncenter : {selector : alignElements, attributes : {align : 'center'}}, alignright : {selector : alignElements, attributes : {align : 'right'}}, alignfull : {selector : alignElements, attributes : {align : 'justify'}}, // Change the basic formatting elements to use deprecated element types bold : [ {inline : 'b', remove : 'all'}, {inline : 'strong', remove : 'all'}, {inline : 'span', styles : {fontWeight : 'bold'}} ], italic : [ {inline : 'i', remove : 'all'}, {inline : 'em', remove : 'all'}, {inline : 'span', styles : {fontStyle : 'italic'}} ], underline : [ {inline : 'u', remove : 'all'}, {inline : 'span', styles : {textDecoration : 'underline'}, exact : true} ], strikethrough : [ {inline : 'strike', remove : 'all'}, {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true} ], // Change font size and font family to use the deprecated font element fontname : {inline : 'font', attributes : {face : '%value'}}, fontsize : { inline : 'font', attributes : { size : function(vars) { return tinymce.inArray(fontSizes, vars.value) + 1; } } }, // Setup font elements for colors as well forecolor : {inline : 'font', attributes : {color : '%value'}}, hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}} }); // Check that deprecated elements are allowed if not add them tinymce.each('b,i,u,strike'.split(','), function(name) { schema.addValidElements(name + '[*]'); }); // Add font element if it's missing if (!schema.getElementRule("font")) schema.addValidElements("font[face|size|color|style]"); // Add the missing and depreacted align attribute for the serialization engine tinymce.each(alignElements.split(','), function(name) { var rule = schema.getElementRule(name), found; if (rule) { if (!rule.attributes.align) { rule.attributes.align = {}; rule.attributesOrder.push('align'); } } }); // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes editor.onNodeChange.add(function(editor, control_manager) { var control, fontElm, fontName, fontSize; // Find font element get it's name and size fontElm = editor.dom.getParent(editor.selection.getNode(), 'font'); if (fontElm) { fontName = fontElm.face; fontSize = fontElm.size; } // Select/unselect the font name in droplist if (control = control_manager.get('fontselect')) { control.select(function(value) { return value == fontName; }); } // Select/unselect the font size in droplist if (control = control_manager.get('fontsizeselect')) { control.select(function(value) { var index = tinymce.inArray(fontSizes, value.fontSize); return index + 1 == fontSize; }); } }); }); }, getInfo : function() { return { longname : 'LegacyOutput', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput); })(tinymce); plugins/visualchars/editor_plugin.js000066600000002530150472426320013764 0ustar00(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})();plugins/visualchars/editor_plugin_src.js000066600000004101150472426320014627 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.VisualChars', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceVisualChars', t._toggleVisualChars, t); // Register buttons ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'}); ed.onBeforeGetContent.add(function(ed, o) { if (t.state && o.format != 'raw' && !o.draft) { t.state = true; t._toggleVisualChars(false); } }); }, getInfo : function() { return { longname : 'Visual characters', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private methods _toggleVisualChars : function(bookmark) { var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm; t.state = !t.state; ed.controlManager.setActive('visualchars', t.state); if (bookmark) bm = s.getBookmark(); if (t.state) { nl = []; tinymce.walk(b, function(n) { if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1) nl.push(n); }, 'childNodes'); for (i = 0; i < nl.length; i++) { nv = nl[i].nodeValue; nv = nv.replace(/(\u00a0)/g, '$1'); div = ed.dom.create('div', null, nv); while (node = div.lastChild) ed.dom.insertAfter(node, nl[i]); ed.dom.remove(nl[i]); } } else { nl = ed.dom.select('span.mceItemNbsp', b); for (i = nl.length - 1; i >= 0; i--) ed.dom.remove(nl[i], 1); } s.moveToBookmark(bm); } }); // Register plugin tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars); })();plugins/imagemanager/pages/im/view.html000066600000014036150472426320014223 0ustar00 {#view.title}
 
 
plugins/imagemanager/pages/im/resources.xml000066600000004323150472426320015115 0ustar00 plugins/imagemanager/pages/im/createdir.html000066600000004167150472426320015217 0ustar00 {#createdir.title}

{#createdir.title}

{#createdir.description}

{#createdir.create_in}
plugins/imagemanager/pages/im/upload.html000066600000010121150472426320014524 0ustar00 {#upload.title}

{#upload.title}

{#upload.description}

{#upload.file} {#upload.size} {#upload.status}

{#upload.add_more}

plugins/imagemanager/pages/im/css/forms.css000066600000001416150472426320015011 0ustar00/* Forms */ /* ########################################################## */ form { margin:0px; padding:0px; } select { font:100% tahoma; } input.file, input.text { font:90% tahoma, arial, sans-serif; } /* Submit buttons */ input.submit, .button { width:94px; height:26px; padding:0 0 2px; border:0; background:url('../img/submit-grey.png') no-repeat; font:normal 100%/100% tahoma, arial, sans-serif; text-align: center; text-decoration: none; } .button.disabled { cursor: text; color: gray; } input.default { background:url('../img/submit-default.png') no-repeat; font-weight:bold; } input.cancel { background:url('../img/submit-grey.png') no-repeat; font-weight:normal; } a.button { padding-top: 6px; text-align: center; text-decoration: none; } plugins/imagemanager/pages/im/css/view.css000066600000005011150472426320014630 0ustar00body { background-color:#fff; color:#000; margin:0px 0px; padding:0px; font:70% arial, helvetica, sans-serif; text-align:center; overflow: hidden; } td {font-size: 100%;} img { behavior:expression(PNG.fix(this)); } a { background:transparent; } a:link { color:#000; } a:visited { color:#000; } a:visited:hover { color:#000; } a:hover { color:#000; } a:active { color:#000; } #center { width:auto; max-width:1200px; margin:0px auto; text-align:left; } #singleview { margin:20px 30px 10px 30px; text-align:center; } #singleimg { overflow: auto; } #singleview p { font:thin 100% tahoma; margin:4px 0px; width:100%; } #singleview h2 { font:bold 110% tahoma; margin:4px 0px; width:100%; } #singleview .nav { margin:6px 0px 12px 0px; } #singleview .gallery { background:url('../img/gallery.png') no-repeat center; padding:4px 10px 4px 10px; text-decoration: none; behavior:expression(PNG.fix(this)); } #singleview .prev { background:url('../img/left.png') no-repeat left; padding:4px 20px 4px 4px; text-decoration: none; behavior:expression(PNG.fix(this));} #singleview .next { background:url('../img/right.png') no-repeat right; padding:4px 4px 4px 20px; text-decoration: none; behavior:expression(PNG.fix(this)); } #singleview #prev.disabled { background:url('../img/left_disabled.png') no-repeat left; } #singleview #next.disabled { background:url('../img/right_disabled.png') no-repeat right; } #singleview .editsingle a { padding:1px 4px 1px 20px; margin:4px 8px; text-decoration:none; } #singleview .editsingle a.delete { background:url('../img/im-delete.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.delete:hover { background:#e3e0d8 url('../img/im-delete.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.delete_disabled { background:url('../img/im-delete.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.delete_disabled:hover { background:url('../img/im-delete.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.edt { background:url('../img/im-edit.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.edt:hover { background:#e3e0d8 url('../img/im-edit.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.disabled { color: gray; background:url('../img/im-edit.png') no-repeat; behavior:expression(PNG.fix(this)); } #singleview .editsingle a.disabled:hover { background:url('../img/im-edit.png') no-repeat; behavior:expression(PNG.fix(this)); } plugins/imagemanager/pages/im/css/viewmodes.css000066600000004466150472426320015675 0ustar00/* Thumbnail view */ /* ########################################################## */ #viewcontainer { padding-left: 212px; padding-top: 10px; } #thumbs { margin:0 10px 10px 0px; } #textlists { margin:0 10px 10px 0px; } .thumbnail { position:relative; float:left; margin:3px; background:url(../img/im-topright.gif) no-repeat top right; text-align:center; } .thumbnail .wrap { background:url(../img/im-topleft.gif) no-repeat; } .thumbnailimage { border: 0; } .pic { position:relative; margin:0px auto 0px; } .pic[class] { display:table; position:static; padding-top:6px; } .mid { position:absolute; top:50%; left:50%; } /* ie6 */ .mid a { position:relative; top:-50%; left:-50%; } /* ie6 */ html>body .mid { position:absolute; top:50%; left:50%; } /* ie7 */ html>body .mid a { position:relative; top:-60%; left:-50%; } /* ie7 */ html:not([dummy]) .mid[class] { display:table-cell; vertical-align:middle; position:static; } /* ff + safari */ html:not([dummy]) .mid a { position:static; } /* ff + safari */ @media all and (min-width:0px) { html>body .mid { display:table-cell; vertical-align:middle; position:static; } } /* opera */ @media all and (min-width:0px) { html>body .mid a { position:static; } } /* opera */ .details { background:url(../img/im.gif) no-repeat bottom right; text-align:left; } .details .wrap2 { background:url(../img/im-botleft.gif) no-repeat bottom left; width:25px; line-height:11px; } .name { margin:0px 5px; padding:3px 0px 2px 0px; font:90% tahoma, arial, sans-serif; overflow:hidden; text-align:center; line-height: 16px; height:16px; white-space:nowrap; } * html .name { height:21px; } .name a { text-decoration:none; color:#000; } .name a:hover { color:#827a69; } .parent .act { display: none; } .act { position:absolute; bottom:3px; right:3px; cursor:pointer; } /* List view */ /* ########################################################## */ .listview { position:relative; margin:3px; background:url('../img/im-topright.gif') no-repeat top right; float:left; text-align:left; width:100px; } .listview .name {width:75px} .listview .wrap { width:15px; height:2px; background: url('../img/im-topleft.gif') no-repeat; line-height:0px; font-size:0px; } plugins/imagemanager/pages/im/css/imageeditor.css000066600000006177150472426320016165 0ustar00body { background:#fff url('../img/bg.gif'); color:#000; margin: 0; padding: 0; font:70% arial, helvetica, sans-serif; text-align:left; } td {font-size: 100%;} a { background:transparent; } a:link { color:#000; } a:visited { color:#000; } a:visited:hover { color:#000; } a:hover { color:#000; } a:active { color:#000; } img { behavior:expression(PNG.fix(this)); } .panel { display: none; } #actionbar { position: absolute; left: 15px; top: 50px; z-index: 10000; } input.text { border: 0; font-size: 100%; border: 1px solid #E0E0E0; } input.checkbox { padding: 0; margin: 0 3px 0 5px; vertical-align: middle; line-height: 20px; } input.radio { padding: 0; margin: 0 3px 0 5px; vertical-align: middle; line-height: 20px; } label { vertical-align: middle; line-height: 20px; } .toolbar { margin:0px; font:90% tahoma; padding:2px 20px 10px 15px; } .icons { margin:14px 0px 0px 0px; float:left; } .icon { margin:0px 2px 0px 1px; padding:0px; float:left; line-height:0px; position:relative; } .icon a { text-decoration:none; padding:2px; display:block; } .icon a:hover, .active { background:#d3d0ce; } .disabled img { opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30); } .disabled span { color:gray } a.disabled:hover { background:transparent; } .icon .caption { display:none; padding:0px 4px 0px 4px; position:relative; top:-4px; } .toolbar .separator { margin:0px 4px; float:left; } #toolbar.caption span.caption { display: inline; } .panel span.caption { display: inline; } .panel a { text-decoration: none; display: block; } .panel a:hover { background: #d3d0ce; } .actionsettings { float: left; } .actionicons { float: left; } /* SelectionRect */ .selection-corner-tl { cursor: nw-resize; } .selection-corner-tc { cursor: n-resize; } .selection-corner-tr { cursor: ne-resize; } .selection-corner-cl { cursor: w-resize; } .selection-corner-cr { cursor: e-resize; } .selection-corner-bl { cursor: sw-resize; } .selection-corner-bc { cursor: s-resize; } .selection-corner-br { cursor: se-resize; } div.selection { display:none; z-index: 1000; cursor: move; line-height: 1px; overflow: hidden; position:absolute; border:1px solid gray; } .resize div.selection { border: 0; } div.selection img { position:absolute; } .selection-corner { position: absolute; left: 1px; top: 1px; width: 8px; height: 8px; border: 0; margin: 0; padding: 0; background: transparent url('../img/selection_corner.gif') top left no-repeat; z-index: 1001; display:none; } /*a.selection-corner:hover { background-position: -8px 0px; }*/ #editArea { position: absolute; left: 15px; top: 80px; } #imageWrapper { position: relative; left: 0; top: 0; width: 720px; height: 455px; border: 1px solid black; overflow: scroll; cursor: crosshair; background-color: #c0c0c0; } #eventElement { position: relative; left: 0; top: 0; padding: 0; } #editImage { padding: 0; margin-right: 10px; margin-bottom: 10px; } #marginWrapper { padding: 10px; } td { vertical-align: middle; } img.crop, .resize .selimage, .crop .mainimage { opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); } .resize div.selection { cursor: default; } plugins/imagemanager/pages/im/css/core.css000066600000011607150472426320014616 0ustar00/* Image Manager */ /* core stuff */ /* ########################################################## */ body { background:#fff; color:#000; margin:0 0; padding:0; font:70% arial, helvetica, sans-serif; text-align:center; } td { font-size: 11px; } img { behavior:expression(PNG.fix(this)); border: 0; } hr { clear:both; border:0; color:#e5e5e5; background-color:#e5e5e5; height:1px; } div { font-size:11px; } /* Lists */ ul { margin:0; padding:0; list-style:none; } ul li { margin:0; padding:0; } /* Layout */ #center { width:auto; max-width:1200px; margin:0 auto; text-align:left; } /* Links */ a {background:transparent; } a:link {color:#000; } a:visited {color:#000; } a:visited:hover {color:#000; } a:hover {color:#000; } a:active {color:#000; } #thearea { position:relative; } #secondarea { position:absolute; left:200px; } /* Page navigation */ /* ########################################################## */ .pagenav { float: left; color: #484848; display: none; line-height: 16px; height: 16px; z-index:1; } * html .pagenav {/* double margin ie6 bug fix */ display:inline; } .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0 2px; } .pagenav * {float:left; display:block} .pagenav a {outline:0 } .pagenav .prev {background:url('../img/left.gif') no-repeat left; width:20px; height:16px; text-decoration:none; behavior:expression(PNG.fix(this));} .pagenav .next {background:url('../img/right.gif') no-repeat right; width:20px; height:16px; text-decoration:none; behavior:expression(PNG.fix(this));} .pagenav input {padding:0; width:20px; text-align:center; font-size:10px; margin:0 4px 0 4px } .pagenav .disabled {opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); cursor:default} #progress { background: url('../img/loading.gif') no-repeat; padding-left: 20px; } /* View mode */ /* ########################################################## */ .viewmode { float:right; margin:0 25px 0 0; display:inline; height: 25px; color:#484848; z-index:1; white-space:nowrap; } .viewmode .desc { float:left; margin:3px 4px 0 0; } .viewmode a img { margin-bottom:-5px; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); } .viewmode a.listactive img { opacity:1; -ms-filter:'alpha(opacity=100)'; filter:alpha(opacity=100); } .viewmode a.listactive { font-weight:bold; } #viewcontainer #filelist { position:relative; } /* List container */ #listcontainer { position:relative; } * html #listcontainer {/* double margin ie6 bug fix */ display:inline; } /* Left side folders */ /* ########################################################## */ #folders { position:absolute; top:0; left:2px; margin:0; width:192px; background:url(../img/folder-middle-bg.png) bottom left; z-index:1; } #folders h2 { margin:0; padding:20px 10px 10px 10px; background:url(../img/folder-top-bg.png) top left; font-size:100%; color:#7791c4; } #folders h3 { margin:10px 2px 0 2px; padding:10px 8px 10px 8px; font-size:100%; color:#7791c4; border-top:1px solid #9ab0d7; } #folders a { text-decoration:none; behavior:expression(PNG.fix(this)); } #folders .categories { margin:0 6px 0 10px; } #folders .categories li a { background:url(../img/icons/category-closed.png) no-repeat; padding:2px 2px 0 24px; display:block; min-height:16px; } #folders .categories li.current a { background:url(../img/icons/category-open.png) no-repeat; font-weight:bold; } #folders .special { margin:5px 6px 0 10px; } #folders .special li a { padding: 2px 2px 0 24px; display: block; min-height: 16px; height: 16px; line-height: 16px; } #folders .folders { margin:0 6px 0 10px; } #folders div { background:url(../img/folder-bottom-bg.png) no-repeat bottom left; } #folder_list { padding:0 0 20px 0; } #folders .folders li a { background:url(../img/folder.png) no-repeat; padding:2px 2px 0 24px; display:block; min-height:16px; } #folders .folders li.parent a { background:url(../img/icons/up.png) no-repeat; } #folders .folders li.current a { background:url(../img/icons/folders-open.png) no-repeat; font-weight:bold; } #folders .preview { margin:0 0 4px 10px; } #folders .previewact { padding:0 0 20px 10px; } #folders a:hover { color:#2e4e8c; } #folders .folders li.progress { background: url('../img/loading.gif') no-repeat; height: 16px; line-height: 16px; padding-left: 20px; } .folder .name, .parent .name { font-weight:bold; } /* ########################################################## */ #toolbar.caption span.caption { display: inline; } #toolbar a {outline:0 } /* Validation classes */ label.msg { display:none; } label.invalid { color:#aa0000; display:inline; } input.invalid { background-color:#d63232; } div label.invalid { display:block; } /* Dialog facts */ #facts { height:30px; } plugins/imagemanager/pages/im/css/imagemanager.css000066600000000210150472426320016267 0ustar00@import url("core.css"); @import url("toolbar.css"); @import url("viewmodes.css"); @import url("dialog.css"); @import url("forms.css"); plugins/imagemanager/pages/im/css/window_clearlooks2.css000066600000026770150472426320017504 0ustar00/* * * clearlooks2 - Gnome theme * * */ .clearlooks2 { position: absolute; left: 20px; top: 20px; width: 320px; height: 240px; overflow: hidden; color: white; display: none; text-align: left; } .clearlooks2_progress { position: absolute; left: 0; top: 0; width: auto; height: 30px; z-index: 100100; display: none; border: 1px solid gray; background: #FFF url('../img/loading.gif') no-repeat 5px 8px; text-align: left; } .clearlooks2_progress .message { padding-left: 30px; padding-right: 10px; font-family: Arial, Verdana; font-weight: bold; line-height: 30px; } .clearlooks2_event_blocker, .clearlooks2_visible_event_blocker { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 100001; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2_visible_event_blocker { opacity:0.7; -ms-filter:'alpha(opacity=70)'; filter:alpha(opacity=70); background: #FFF; } .clearlooks2_placeholder { position: absolute; left: 0; top: 0; border: 1px dotted black; display: none; z-index: 100002; } /* Alert */ .clearlooks2 .alert { text-align: left; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; font-weight: bold; text-decoration: none; } .clearlooks2 .alert .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .bigicon { display: none; } .clearlooks2 .alert .bigicon, .clearlooks2 .confirm .bigicon, .clearlooks2 .status .bigicon { position: absolute; left: 15px; top: 15px; width: 32px; height: 32px; display: block; } .clearlooks2 .alert .info, .clearlooks2 .status .info { background-image: url('../img/clearlooks2/alert_info.gif'); } .clearlooks2 .alert .warning, .clearlooks2 .status .warning { background-image: url('../img/clearlooks2/alert_warn.gif'); } .clearlooks2 .alert .error, .clearlooks2 .status .error { background-image: url('../img/clearlooks2/alert_error.gif'); } .clearlooks2 .alert .message, .clearlooks2 .confirm .message { position: absolute; left: 55px; top: 15px; width: 325px; height: 40px; overflow: auto; } .clearlooks2 .ok, .clearlooks2 .cancel { position: absolute; left: 160px; top: 65px; width: 80px; height: 30px; background-image: url('../img/clearlooks2/button.gif'); text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 30px; font-weight: bold; text-decoration: none; } /* Confirm dialog */ .clearlooks2 .confirm .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .confirm .ok { left: 110px; } .clearlooks2 .confirm .cancel { left: 210px; } .clearlooks2 .confirm .ask { background-image: url('../img/clearlooks2/alert_info.gif'); } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Status dialog */ .clearlooks2 .status .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .status .ok { top: 178px; } .clearlooks2 .status .statustext { position: absolute; left: 10px; top: 8px; width: 360px; height: 150px; border: 1px solid gray; overflow: auto; padding: 5px; } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Chromeless window */ .clearlooks2 .chromeless .resize, .clearlooks2 .chromeless .action, .clearlooks2 .chromeless .statusbarbottom { display: none; } .clearlooks2 .chromeless .middle .action { display: block; } .clearlooks2 .chromeless .windowtop, .clearlooks2 .chromeless .window { height: 5px; } .clearlooks2 .chromeless .windowtop .left { position: absolute; left: 0; top: 0; width: 5px; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_left.gif') no-repeat; } .clearlooks2 .chromeless .windowtop .middle { position: absolute; right: 5px; width: 100%; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_middle.gif') no-repeat 5px 0; clip: rect(auto auto auto 10px); } .clearlooks2 .chromeless .windowtop .right { position: absolute; right: 0; top: 0; width: 5px; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_right.gif') no-repeat; } .clearlooks2 .chromeless .windowmiddle { top: 5px; } /* Top section */ .clearlooks2 .windowtop .middle-fg { display: none; } .clearlooks2 .windowtop { position: absolute; width: 100%; height: 23px; overflow: hidden; } .clearlooks2 .windowtop .left { position: absolute; left: 0; top: 0; width: 6px; height: 23px; background: transparent url('../img/clearlooks2/top_left.gif') no-repeat; } .clearlooks2 .windowtop .middle { position: absolute; right: 6px; width: 100%; height: 23px; background: transparent url('../img/clearlooks2/top_middle.gif') no-repeat 12px 0; clip: rect(auto auto auto 12px); /* Safari hack */ } .clearlooks2 .windowtop .right { position: absolute; right: 0; top: 0; width: 6px; height: 23px; background: transparent url('../img/clearlooks2/top_right.gif') no-repeat; } .clearlooks2 .windowtop .title { position: absolute; left: 0; top: 0; width: 100%; height: 19px; text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; font-weight: bold; } /* Top section - Focus */ .clearlooks2 .focustop .left { background: transparent url('../img/clearlooks2/top_left.gif') no-repeat -6px 0; } .clearlooks2 .focustop .middle { background: transparent url('../img/clearlooks2/top_middle.gif') no-repeat 12px -23px; } .clearlooks2 .focustop .right { background: transparent url('../img/clearlooks2/top_right.gif') no-repeat -6px 0; } .clearlooks2 .focus .title { color: #FFF; } /* Middle section */ .clearlooks2 .windowmiddle { position: absolute; top: 23px; width: 100%; z-index: 5; } .clearlooks2 .windowmiddle .left { position: absolute; left: 0; top: 0; width: 4px; height: 100%; background-image: url('../img/clearlooks2/middle_left.gif'); } .clearlooks2 .windowmiddle .middle { position: absolute; left: 4px; top: 0; width: 100%; height: 100%; background-color: #FFF; color: #000; } .clearlooks2 .windowmiddle .right { position: absolute; right: 0; top: 0; width: 4px; height: 100%; background-image: url('../img/clearlooks2/middle_right.gif'); } /* Bottom section */ .clearlooks2 .windowbottom { position: absolute; left: 0; bottom: 0; width: 100%; height: 5px; overflow: hidden; z-index: 5; } .clearlooks2 .windowbottom .left { position: absolute; left: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../img/clearlooks2/bottom_left.gif'); overflow: hidden; } .clearlooks2 .windowbottom .middle { position: absolute; left: 5px; bottom: 0; width: 100%; height: 5px; background: url('../img/clearlooks2/bottom_middle.gif'); overflow: hidden; } .clearlooks2 .windowbottom .right { position: absolute; right: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../img/clearlooks2/bottom_right.gif'); overflow: hidden; } /* Statusbar */ .clearlooks2 .statusbarbottom { height: 24px; overflow: hidden; z-index: 5; } .clearlooks2 .statusbarbottom .left { bottom: 0; width: 5px; height: 23px; background-image: url('../img/clearlooks2/statusbar_left.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .middle { height: 23px; background-image: url('../img/clearlooks2/statusbar_middle.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .right { width: 20px; height: 23px; background-image: url('../img/clearlooks2/statusbar_right.gif'); overflow: hidden; } .clearlooks2 .windowbottom .statustext { display: none; } .clearlooks2 .statusbarbottom div.statustext { display: block; position: absolute; left: 6px; bottom: 0; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; } .clearlooks2 .resizable .statusbarbottom .resize-se { background-image: url('../img/clearlooks2/statusbar_resize.gif'); width: 20px; height: 23px; } /* Actions */ .clearlooks2 .action { position: absolute; cursor: pointer; overflow: hidden; } .clearlooks2 .close, .clearlooks2 .min, .clearlooks2 .med, .clearlooks2 .max { z-index: 3; } .clearlooks2 .resizable .min { right: 68px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 0; background-repeat: no-repeat; } .clearlooks2 .resizable .med { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px 0; background-repeat: no-repeat; } .clearlooks2 .resizable .max { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px 0; background-repeat: no-repeat; } .clearlooks2 .close { right: 6px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px 0; } /* Actions - Focus */ .clearlooks2 .focustop .min { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 -16px; } .clearlooks2 .focustop .med { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px -16px; } .clearlooks2 .focustop .max { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px -16px; } .clearlooks2 .focustop .close { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px -16px; } /* Actions - Hover */ .clearlooks2 .focustop .min:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 -32px; } .clearlooks2 .focustop .med:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px -32px; } .clearlooks2 .focustop .max:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px -32px; } .clearlooks2 .focustop .close:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px -32px; } /* Move and resize handles */ .clearlooks2 .move { top: 0; left: 0; width: 100%; height: 19px; cursor: move; z-index: 1; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resize { display: none; z-index: 4; } .clearlooks2 .resizable .resize { display: block; } .clearlooks2 .resizable .resize-w { top: 0; left: 0; width: 5px; height: 100%; cursor: w-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-e { top: 0; right: 0; width: 5px; height: 100%; cursor: e-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-n { top: 0; left: 0; width: 100%; height: 5px; cursor: n-resize; overflow: hidden; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-nw { top: 0; left: 0; width: 5px; height: 19px; cursor: nw-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-ne { top: 0; right: 0; width: 5px; height: 19px; cursor: ne-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-sw { bottom: 0; left: 0; width: 5px; height: 5px; cursor: sw-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-s { bottom: 0; left: 0; width: 100%; height: 5px; cursor: s-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-se { bottom: 0; right: 0; width: 5px; height: 5px; cursor: se-resize; background-image: url('../img/clearlooks2/transparent.gif'); } plugins/imagemanager/pages/im/css/dialog.css000066600000005741150472426320015127 0ustar00/* dialog popups */ /* ########################################################## */ body { overflow: auto; } .dialog { position:relative; text-align:left; width:100%; } .dialog .top { padding:10px 12px; background:#f3f2f0 url('../img/dialog-top.png') no-repeat right bottom; behavior:expression(PNG.fix(this)); } .dialog .close { position:absolute; top:4px; right:4px; } .dialog h2 { font:bold 115% tahoma, arial, sans-serif; margin:0px; } .dialog .description { margin:0px; } .dialog .headline { padding:8px 0px 12px 40px; } .dialog .createdir { background: url('../img/dialog-icon-newfolder.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .facts { background:#f3f2f0; padding:8px 16px 12px 20px; font:90% tahoma, arial, sans-serif; } .dialog .body { padding:8px 16px 12px 20px; } #content { display: none; } /* Upload */ #uploadarea { position: relative; padding: 16px; height: 220px; overflow: hidden; } * html #uploadarea { height: 208px; } #uploadarea .small { margin: 2em 0 -1em; color: #6d88c4; font-size: 0.9em; text-transform: uppercase; } #uploadarea #add.hidden { display: none; } #uploadarea .addbutton, #uploadarea #uploadstart { display: block; width: 182px; height: 26px; margin: 0 0 1em; background: url(../img/submit-greyWide.png) no-repeat; text-align: center; font-size: 1em; font-weight: bold; line-height: 26px; text-decoration: none; } #uploadarea #uploadstart { background: url(../img/submit-wide.png) no-repeat; } #uploadarea #fileblock { position:relative; top:400px; } #uploadarea #filelist { position:relative; max-height: 7em; overflow: auto; margin-bottom: 6px; border: 1px solid #9fadc4; } * html #uploadarea #filelist { height: 7em; } #uploadarea #fileshead { width: 100%; font-weight: bold; background: #eee; border-bottom: 1px solid #fff; } #uploadarea #files { width: 490px; } #uploadarea #status { position: absolute; top: 4px; border: 1px solid #9fadc4; padding: 1px; width: 506px; height: 34px; display: none; } #uploadarea #progressbar { position: relative; width: 100%; height: 34px; background: url(../img/progress.gif); z-index: 10; } #uploadarea .progresstext { position: absolute; top: 0; left: 0; width: 100%; text-align: center; color: #535353; font-weight: bold; line-height: 36px; z-index: 11; } #uploadarea .progresstext a { text-decoration: none; color: #535353; } #files .fname a {display:block; width:295px; overflow:hidden} #files .disabled {text-decoration:none; cursor:default} #files .done {color:gray} #files .failed {color:red} #multiupload_view {display:none} #singleupload_view {display:none} #multiupload_view #selectview {position:relative} #files input.text {width:290px; margin:0; padding:0} plugins/imagemanager/pages/im/css/toolbar.css000066600000003501150472426320015322 0ustar00/* Toolbar */ /* ########################################################## */ #topnav { background:url('../img/toolbar.png') no-repeat bottom left; } #topwrap { background:url('../img/toolbar.png') no-repeat bottom right; margin:0px 0px 0px 30px; } #settings { display:none; position:absolute; top:20px; right:-4px; width:14em; line-height:14px; text-align:right; background:#fff; padding:4px; border:1px solid #959595; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:100; } #settings a { display:inline; padding:0px; } /* Inside stuff */ .toolbar { margin:0px; padding:2px 20px 10px 0px; font:90% tahoma, arial, sans-serif; } #tools li a { font-size:11px; } .toolbar div.filter { padding-right: 20px; width: 125px; } .filter input { width: 123px; background: transparent; border: 1px solid #aaaaaa; font-size: 10px; } .toolbar .navigation { margin:0px 2px; padding: 0; float: left; width: 170px; padding-bottom: 12px; } .navigation .desc { margin:0px 0px 4px 0px; background:url('../img/navdesc_bg.gif') no-repeat right; } .navigation .path { margin-bottom:5px; width:260px; overflow:hidden; } .toolbar .icons { margin:14px 0px 0px 0px; float:right; } .toolbar .icon { margin:0px 2px 0px 1px; padding:0px; float:left; line-height:0px; position:relative; } .toolbar .disabled img { opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30); } .toolbar .disabled a { color: #AAA; } .toolbar .disabled a:hover { background: transparent; cursor: default; } /* Icons */ .icon a { text-decoration:none; padding:2px; display:block; } .icon a:hover { background:#d3d0ce; } .icon .caption { position:relative; top:-4px; display:none; padding:0px 4px 0px 4px; } .toolbar .separator { margin:0px 4px; float:left; } plugins/imagemanager/pages/im/css/dropmenu.css000066600000002236150472426320015515 0ustar00/* Menu */ .menu { margin: 0; padding: 0; position: absolute; border: 1px solid #d4d0c8; background: #EAE9E5; z-index: 1000; width: 100px; } .menu a { display: block; color: #000; text-decoration: none; padding: 3px; text-align: left; overflow:auto; /* FF */ } .menu a:hover { background-color: #dbecf3 } .menu .submenu { background: url(../img/menu_arrow.gif) no-repeat center right } .menu .active { background: #dbecf3 url(../img/menu_arrow.gif) no-repeat center right } .menu .active a:hover { background-color: transparent } .menu .separator { border-top: 1px solid gray; height: 1px; overflow: hidden } .menu .separator a { display: none } .menu .disabled a { cursor: default; color: #aaa } /* Menu icons */ .menu a { background-image: url(../img/menu_icons.gif); background-repeat: no-repeat } .menu .add a { background-position: 0 -60px } .menu .delete a { background-position: 0 -80px } .menu .copy a { background-position: 0 0 } .menu .cut a { background-position: 0 -20px } .menu .paste a { background-position: 0 -40px } .menu .moveup a { background-position: 0 -100px } .menu .movedown a { background-position: 0 -120px }plugins/imagemanager/pages/im/js/upload.js000066600000023262150472426320014622 0ustar00(function($){ window.UploadDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; t.args = args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); t.fileListTpl = $.templateFromScript('#filelist_item_template'); $('.uploadtype').html($.translate('{#upload.basic_upload}', 0, {a : '', '/a' : ''})); $('#createin').html(args.visual_path); $('form input[name=path]').val(args.path); $('form input[name=file0]').change(function(e) { $('form input[name=name0]').val(t.cleanName(/([^\/\\]+)$/.exec(e.target.value)[0].replace(/\.[^\.]+$/, ''))); }); $('form').submit(function() { $.WindowManager.showProgress({message : $.translate('{#upload.progress}')}); }); if (document.location.hostname != document.domain) $('form input[name=domain]').val(document.domain); t.path = args.path; $('#singleupload').click(function(e) { $('#multiupload_view').hide(); $('#singleupload_view').show(); }); RPC.exec('im.getConfig', {path : args.path}, function(data) { var config = data.result, maxSize, upExt, fsExt, outExt = [], i, x, found; maxSize = config['upload.maxsize']; fsExt = config['filesystem.extensions'].split(','); upExt = config['upload.extensions'].split(','); t.debug = config['general.debug'] == "true"; t.shouldCleanNames = config['filesystem.clean_names'] == "true"; t.chunkSize = config['upload.chunk_size'] || '1mb'; $('#content').show(); if ($.multiUpload.initialized) $('#multiupload_view').show(); else $('#singleupload_view').show(); // Disabled upload if (config['upload.multiple_upload'] != "true") { $('#multiupload_view').hide(); $('#singleupload_view').show(); } maxSize = maxSize.replace(/\s+/, ''); maxSize = maxSize.replace(/([0-9]+)/g, '$1 '); if (upExt[0] == '*') upExt = fsExt; if (fsExt[0] == '*') fsExt = upExt; for (i = 0; i < upExt.length; i++) { upExt[i] = $.trim(upExt[i].toLowerCase()); found = false; for (x = 0; x < fsExt.length; x++) { fsExt[x] = $.trim(fsExt[x]).toLowerCase(); if (upExt[i] == fsExt[x]) { found = true; break; } } if (found) outExt.push(upExt[i]); } t.validExtensions = outExt; t.maxSize = maxSize; $('#facts').html($.templateFromScript('#facts_template'), {extensions : outExt.join(', '), maxsize : maxSize, path : args.visual_path}); if (config['upload.multiple_upload'] == "true") t.initMultiUpload(); }); $('#cancel').click(function() {t.currentWin.close();}); }, cleanName : function(s) { if (this.shouldCleanNames) s = $.cleanName(s); return s; }, handleSingleUploadResponse : function(data) { var t = this, args = t.currentWin.getArgs(); $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.upload_failed}', visual_path : t.args.visual_path, response : data})) { var res = RPC.toArray(data.result); $.WindowManager.info($.translate('{#message.upload_ok}')); $('#file0, #name0').val(''); t.insertFiles([res[0].file]); } }, initMultiUpload : function() { var t = this, up, args = t.currentWin.getArgs(), initial = 1, startTime; up = $.multiUpload.create({ silverlight_xap_url : '../../stream/index.php?theme=im&package=static_files&file=multiupload_xap', upload_url : '../../stream/index.php?cmd=im.upload', path : t.path, filter : t.validExtensions, chunk_size : t.chunkSize, max_size : t.maxSize, flash_browse_button : '#add', oninit : function() { $('#add').removeClass('hidden'); } }); if (t.debug) alert('Runtime used: ' + $.multiUpload.runtime); function calc(up) { var size = 0, uploaded = 0, loaded = 0, unloaded = 0, bps = 0, finished = true, fl = []; if (!up.files.length) { $('#selectview').css('top', 0); $('#selectview').show(); $('#fileblock').css({position : 'relative', top : 400}); initial = 1; return; } $(up.files).each(function(i, f) { size += f.size; loaded += f.loaded; if (f.status == 'completed') uploaded++; if (!f.status) finished = false; }); bps = Math.ceil(loaded / ((new Date().getTime() - startTime || 1) / 1000.0)); if (finished) { $('#abortupload').hide(); $(up.files).each(function(i, f) { if (f.status == 'completed') fl.push(t.path + '/' + f.name); }); t.insertFiles(fl); $('#progressbar').css('width', '100%'); return; } $('#progressinfo').html($.translate('{#upload.progressinfo}', 1, {loaded : up.formatSize(loaded), total : up.formatSize(size), speed : up.formatSize(bps)})); $('#progressbar').css('width', Math.round(loaded / size * 100.0) + '%'); $('#stats').html($.translate('{#upload.statusrow}', 1, {files : up.files.length, size : up.formatSize(size)})); }; // Register event listeners $(up).bind('multiUpload:filesSelected', function(e, fs) { var up = this, totalSize = 0; if (!fs.files.length) { $.WindowManager.info($.translate('{#upload.no_valid_files}')); return; } if (initial) { $('#selectview').animate({ top: '-150px' }, 1000); $('#fileblock').animate({ top:'-60px' }, 1000, 'linear', function() { $('#fileblock').css('position', 'static'); $('#selectview').hide(); up.repaint(); }); initial = 0; } $(fs.files).each(function(i, fo) { fo.name = t.cleanName(fo.name); $('#files').show(); $('#files tbody').append(t.fileListTpl, {id : fo.id, name : fo.name, size : fo.size}); $('#' + fo.id + ' a.remove').click(function(e) { $('#' + fo.id).remove(); $.multiUpload.get(up.id).removeFile(fo.id); e.preventDefault(); return false; }); $('#' + fo.id + ' a.rename').click(function(e) { var a = $(e.target), inp, parts; if (!a.hasClass('disabled')) { parts = /^(.+)(\.[^\.]+)$/.exec(fo.name); a.hide(); $(e.target).parent().append(''); inp = $('#rename').val(parts[1]); t.renameEnabled = 1; inp.focus().blur(function() { t.endRename(); }).keydown(function(e) { var c = e.keyCode; if (c == 13 || c == 27) { if (c == 13) { fo.name = t.cleanName(inp.val()) + parts[2]; a.html(fo.name); } t.endRename(); } }); } e.preventDefault(); return false; }); }); up.settings.flash_browse_button = '#addmore'; up.repaint(); $('#filelist')[0].scrollTop = 0; }); $(up).bind('multiUpload:fileUploaded', function(e, o) { $('#' + o.file.id).removeClass('failed').addClass('done'); }); $(up).bind('multiUpload:filesChanged', function() { calc(up); up.repaint(); t.endRename(); }); $(up).bind('multiUpload:fileUploadProgress', function(e, pr) { if (up.status) { if (!pr.file.scroll) { $('#filelist').scrollTo($('#' + pr.file.id), 50); pr.file.scroll = 1; } $('#' + pr.file.id + ' td.status').html(Math.round(pr.loaded / pr.total * 100.0) + '%'); calc(up); } }); $(up).bind('multiUpload:chunkUploaded', function(e, o) { var res = $.parseJSON(o.response), data = RPC.toArray(res.result); if (data[0]["status"] != 'OK') { o.file.loaded = o.file.size; calc(up); $('#' + o.file.id).addClass('failed'); $('#' + o.file.id + ' td.status').html($.translate(data[0]["message"])); o.cancel = 1; } }); $(up).bind('multiUpload:uploadChunkError', function(e, o) { $('#' + o.file.id).addClass('failed'); $('#' + o.file.id + ' td.status').html('Failed').attr('title', o.error); //top.console.log(o.file, o.chunk, o.chunks, o.error); }); // Add UI events $('#add, #addmore').click(function(e) { up.selectFiles(); e.preventDefault(); return false; }); $('#abortupload').click(function(e) { up.stopUpload(); $.WindowManager.info($.translate('{#upload.cancelled}'), function() { t.currentWin.close(); }); }); $('#uploadstart').click(function(e) { $('#uploadstart').parent().hide(); $('#status').show(); $('#statsrow').hide(); $('#files .status').html('-'); $('#files .fname a').addClass('disabled'); startTime = new Date().getTime(); up.startUpload(); e.preventDefault(); return false; }); $('#uploadstop').click(function(e) { up.stopUpload(); e.preventDefault(); return false; }); $('#clear').click(function(e) { up.clearFiles(); $('#files').hide(); $('#files tbody').html(''); e.preventDefault(); return false; }); }, insertFiles : function(pa) { var s = this.currentWin.getArgs(); // Insert file if (s.onupload) { RPC.insertFiles({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, paths : pa, insert_filter : s.insert_filter, oninsert : function(o) { s.onupload(o); } }); } }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } }, endRename : function() { if (this.renameEnabled) { $('#files input').remove(); $('#files a').show(); this.renameEnabled = 0; } } }; // JSON handler window.handleJSON = function(data) { window.focus(); UploadDialog.handleSingleUploadResponse(data); }; $(function(e) { UploadDialog.init(); }); })(jQuery); plugins/imagemanager/pages/im/js/imagemanager.js000066600000033401150472426320015747 0ustar00(function($) { window.ImageManager = $.extend(BaseManager, { page : 0, pages : 0, pageSize : 25, viewMode : 'thumbs', tools : [ 'createdir', 'preview', 'refresh', 'edit', 'upload', 'rename', 'delete', 'download', 'insert', 'filemanager', 'help' ], init : function() { var t = this, args = t.currentWin.getArgs(), uri; // Compile templates t.type = 'im'; t.caregoryListTpl = $.templateFromScript('#folders_template'); t.foldersTpl = $.templateFromScript('#folders_template'); t.thumbTpl = $.templateFromScript('#thumb_template'); t.textTpl = $.templateFromScript('#text_template'); t.customDirsTpl = $.templateFromScript('#custom_dir_template'); t.path = args.path || '{default}'; t.rootPath = args.rootpath; t.extensions = args.extensions; t.include_file_pattern = args.include_file_pattern; t.exclude_file_pattern = args.exclude_file_pattern; t.include_directory_pattern = args.include_directory_pattern; t.exclude_directory_pattern = args.exclude_directory_pattern; t.remember_last_path = args.remember_last_path; t.urlSuffix = ''; if (document.domain != document.location.hostname) t.urlSuffix = '?domain=' + document.domain; if (args.url) { uri = $.parseURI(args.url, {base_url : args.document_base_url || args.default_base_url}); if (uri) t.inputURL = uri.path.replace(/\/[^\/]+$/, ''); } if (t.rootPath) { chunks = t.rootPath.split(/=/); t.rootPathName = chunks.length > 1 ? chunks[0] : /[^\/]+$/.exec(t.rootPath); t.rootPath = chunks[1] || t.rootPath; } // Add template helpers $.extend($.template.helpers, { add : function(v, a) { if (v != 'auto') v = parseInt(v) + parseInt(a) + 'px'; return v; } }); t.menu = new $.mcDropMenu({ halign : 'right', valign : 'bottom', setup : function(m) { $(m).bind('DropMenu:beforeshow', function(e, m) { var file = t.focusedFile; // Build new menu m.clear(); if (file.type != 'folder') m.add({title : $.translate('{#common.insert}'), disabled : t.isDisabled('insert'), onclick : function() {t.insertFiles();}}); m.add({title : $.translate('{#common.deleteit}'), disabled : t.isDisabled('delete'), onclick : function() {t.deleteFiles([file]);}}); if (file.type != 'folder') { if (file.custom.editable) m.add({title : $.translate('{#common.edit}'), disabled : t.isDisabled('edit'), onclick : function() {t.editFile(file);}}); m.add({title : $.translate('{#common.view}'), disabled : t.isDisabled('view'), onclick : function() {t.viewFile(file);}}); } }); } }); $().bind('DropMenu:show', function(e, m) { $('#' + m.id).css('opacity', 0).animate({ opacity: 0.9 }, 300); }); t.menu.render('#filelist'); // Register toolbar actions $().bind('action:createdir', function() {t.createDir();}); $().bind('action:upload', function() {t.uploadFiles();}); $().bind('action:refresh', function() {t.listFiles();t.listDirs();}); $().bind('action:help', function() {}); $().bind('action:filemanager', function() {t.fileManager()}); $('#tools li').each(function(i, v) { $(v).click(function(e) { if (!$(v).hasClass('disabled')) $().trigger('action:' + v.id, e); e.preventDefault(); return false; }); }); $('#filelist').click(function(e) { var a = $(e.target).parents('a')[0], fo, o, div, img; if (a && a.rel) { div = $(a).parents('div.file')[0]; fo = t.focusedFile = t.files[div.id.replace(/[^0-9]/g, '')]; t.selectedFiles = [fo]; if (a.rel == 'file') { if (fo.type == 'folder' || fo.type == 'parent') { t.page = 0; t.listFiles(fo.path); t.listDirs(); } else t.insertFiles(); } else if (a.rel == 'menu') { img = $(a).find('img'); o = img.offset(); t.menu.show(o.left + img.width(), o.top); } e.preventDefault(); return false; } }); $('#folder_list, #special_list, #category_list').click(function(e) { var a = e.target.nodeName == 'A' ? e.target : $(e.target).parents('a')[0]; if (a) { t.page = 0; t.listFiles(a.title); t.listDirs(); } }); $('#selectView').change(function(e) { t.viewMode = $(e.target).val(); t.updateFileList(); }); $('#setPages').change(function(e) { t.page = 0; t.pageSize = $(e.target).val(); t.listFiles(); }); $('#curpage').change(function(e) { t.page = parseInt(e.target.value) - 1; t.listFiles(); }); $('#pages').click(function(e) { var el = e.target; if (el.nodeName == 'A') { if ($(el).hasClass('disabled')) return; if ($(el).hasClass('next')) t.page++; else if ($(el).hasClass('prev')) t.page--; t.listFiles(); e.preventDefault(); return false; } }); function filter(e) { var f = $(e.target).val(); if (f == t.filterVal) return; t.filterVal = f; if (f == '') f = null; else if (f.indexOf('*') == -1) f = '*' + f + '*'; t.page = 0; t.filter = f; t.listFiles(); t.listDirs(); }; $('#filter').change(filter).keyup(function(e) { if (e.keyCode == 13) filter(e); }); if (t.specialFolders.length) { $(t.specialFolders).each(function(i, v) { v.title = $.translate(v.title); $('#special_list').append(t.customDirsTpl, v); }); $('#special_list').show(); } setInterval(function() { RPC.exec('im.keepAlive', {}); }, 60 * 1000 * 5); // 5 min }, listFiles : function(p) { var t = this, args = t.currentWin.getArgs(); t.path = p || t.path; $('#pages').hide(); $('#progress').show(); $('#filelist').html(''); t.page = isNaN(t.page) || t.page < 0 ? 0 : t.page; if (t.pages) t.page = t.page > t.pages - 1 ? t.pages - 1 : t.page; RPC.exec('im.listFiles', { path : t.path, root_path : t.rootPath, url : t.inputURL, config : 'general,thumbnail,filesystem,filemanager', extensions : t.extensions, include_file_pattern : t.include_file_pattern, exclude_file_pattern : t.exclude_file_pattern, include_directory_pattern : t.include_directory_pattern, exclude_directory_pattern : t.exclude_directory_pattern, remember_last_path : !!t.remember_last_path, page : t.page, page_size : t.pageSize, filter : t.filter }, function(data) { var header, cfg, disabled, visible, argTools, argDisabledTools; if (!RPC.handleError({message : 'List files error', visual_path : t.visualPath, response : data})) { header = data.result.header; cfg = data.result.config; t.access = header.attribs; t.visualPath = header.visual_path; t.pages = parseInt(header.pages); t.config = cfg; t.fileManagerURL = cfg['filemanager.urlprefix']; t.demoMode = cfg['general.demo'] == "true"; t.path = header.path; function explode(s) { return s ? s.replace(/\s+/g, '').split(',') : s; }; // Enable/disable tools disabled = t.disabledTools = explode(cfg['general.disabled_tools']); visible = explode(cfg['general.tools']); if (argDisabledTools = explode(args.disabled_tools)) disabled = jQuery.merge(argDisabledTools, disabled); if (argTools = explode(args.tools)) { $(argTools).each(function(i, v) { if (!$.inArray(v, visible)) visible.push(v); }); visible = $.grep(visible, function(v) { return $.inArray(v, argTools); }); } $(t.tools).each(function(i, v) { var li = $('#' + v); t.setDisabled(v, $.inArray(v, disabled) != -1); if ($.inArray(v, visible) != -1) li.show(); else li.hide(); }); $('#tools').show(); $('#progress').hide(); $('#curpath').html(t.visualPath).attr('title', t.visualPath); // Convert result table into object list t.files = RPC.toArray(data.result); // Update file list t.updateFileList(); $().trigger('filelist:changed'); } }); }, updateFileList : function() { var t = this; fileLst = $('#filelist'); fileLst.html(''); $('#numpages').html(t.pages); $('#curpage').val(t.page + 1); $('#pages').show(); if (!t.page) $('#pages .prev').addClass('disabled'); else $('#pages .prev').removeClass('disabled'); if (t.page == t.pages - 1) $('#pages .next').addClass('disabled'); else $('#pages .next').removeClass('disabled'); $(t.files).each(function(i) { var r = this, cfg = t.config; r = $.extend({ index : i, thumburl : '../../stream/index.php?cmd=im.thumb&path=' + escape(r.path) + '&u=' + r.size, thumb_width : (parseInt(cfg["thumbnail.width"]) + 10) + 'px', thumb_height : (parseInt(cfg["thumbnail.height"]) + 10) + 'px', text_width : (parseInt(cfg["thumbnail.width"]) - 16) + 'px' }, this); if (r.custom.twidth) { r.width = r.custom.twidth + 'px'; r.height = r.custom.theight + 'px'; } else { r.width = r.height = 'auto'; r.thumburl = 'img/img_generic.png'; } switch (r.type) { case 'parent': r.thumburl = 'img/parent_big.gif'; break; case 'folder': r.thumburl = 'img/folder_big.gif'; break; case 'swf': case 'flv': r.thumburl = 'img/flash.gif'; break; case 'dcr': r.thumburl = 'img/dcr.gif'; break; case 'mov': case 'qt': r.thumburl = 'img/qt.gif'; break; case 'ram': case 'rm': r.thumburl = 'img/rm.gif'; break; case 'wmv': case 'avi': case 'mpg': case 'mpeg': case 'asf': r.thumburl = 'img/avi.gif'; break; } fileLst.append(t.viewMode == 'thumbs' ? t.thumbTpl : t.textTpl, r); $('#file_' + i + ' img.thumbnailimage').attr('src', r.thumburl); }); }, deleteFiles : function(fl) { var t = this, args = {}; if (fl) { $(fl).each(function(i, v) { args['path' + i] = v.path; }); $.WindowManager.confirm($.translate('{#view.confirm_delete}'), function(s) { if (s) { if (!t.isDemo()) { RPC.exec('im.deleteFiles', args, function (data) { if (!RPC.handleError({message : '{#error.delete_failed}', visual_path : t.visualPath, response : data})) { t.listFiles(); t.listDirs(); } }); } } }); } }, insertFiles : function() { var t = this, s = t.currentWin.getArgs(), selectedPaths = []; $(t.selectedFiles).each(function(i, v) { selectedPaths.push(v.path); }); RPC.insertFiles({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, paths : selectedPaths, progress_message : $.translate("{#common.image_data}"), insert_filter : s.insert_filter, oninsert : function(o) { t.currentWin.close(); if (s.oninsert) { $(o.files).each(function(i, v) { if (v.path == t.focusedFile.path) o.focusedFile = v; }); s.oninsert(o); } } }); }, editFile : function(f) { $('#center').hide(); window.scrollTo(0, 0); $.WindowManager.open({ url : 'edit.html' + this.urlSuffix, onclose : function() { $('#center').show(); } }, { is_demo : this.demoMode, path : this.focusedFile.path, visual_path : this.visualPath, onsave : function() { ImageManager.listFiles(); ImageManager.listDirs(); } }).maximize(); }, viewFile : function(f) { $('#center').hide(); window.scrollTo(0, 0); $.WindowManager.open({ url : 'view.html' + this.urlSuffix, chromeless : 1, onclose : function() { $('#center').show(); } }, { is_demo : this.demoMode, path : f.path, visual_path : this.visualPath, ondelete : function() { ImageManager.listFiles(); } }).maximize(); }, createDir : function() { $.WindowManager.open({ url : 'createdir.html' + this.urlSuffix, width : 450, height : 280 }, { is_demo : this.demoMode, path : this.path, visual_path : this.visualPath, oncreate : function() { ImageManager.listFiles(); ImageManager.listDirs(); } }); }, uploadFiles : function() { $.WindowManager.open({ url : 'upload.html' + this.urlSuffix, width : 550, height : 350, scrolling : 'no' }, { is_demo : this.demoMode, path : this.path, visual_path : this.visualPath, onupload : function() { ImageManager.listFiles(); } }); }, fileManager : function() { var suf; if (this.fileManagerURL.indexOf('?') != -1) suf = this.urlSuffix.replace(/\?/, '&'); document.location = this.fileManagerURL + suf; }, listRoots : function() { var t = this; if (t.rootPathName) { $('#category_list').html(t.caregoryListTpl, {name : t.rootPathName, path : t.rootPath}); return; } RPC.exec('im.listFiles', { "path" : "root:///" }, function(data) { $(RPC.toArray(data.result)).each(function() { $('#category_list').append(t.caregoryListTpl, this); }); }); }, listDirs : function() { var t = this; $('#folder_list').html($.translate('
  • {#common.loading}
  • ')); RPC.exec('im.listFiles', { path : t.path, root_path : t.rootPath, only_dirs : true, include_directory_pattern : t.include_directory_pattern, exclude_directory_pattern : t.exclude_directory_pattern, filter : t.filter, remember_last_path : t.remember_last_path }, function(data) { $('#folder_list').html(''); $(RPC.toArray(data.result)).each(function() { $('#folder_list').append(t.caregoryListTpl, this); }); }); } }); $(function() { ImageManager.init(); ImageManager.listFiles(); ImageManager.listDirs(); ImageManager.listRoots(); }); })(jQuery); plugins/imagemanager/pages/im/js/jquery/jquery.imageselection.js000066600000021221150472426320021154 0ustar00/** * $Id: jquery.imageselection.js 460 2008-10-14 16:06:43Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { var count = 0; function ImageSelection(ta, s) { var t = this, id; s = t.settings = $.extend({ }, s); t.id = id = 'imageSelection' + (count++); t.mode = s.mode; $(ta).after( '
    ' + '
    ' + '
    ' + '
    ' + '' + '' + '' + '' + '' + '' + '' + '' + '
    ' ); t.scrollContainer = $(s.scroll_container); t.container = $('#' + id + '_container'); t.selection = $('#' + id + '_sel'); t.cornerTL = $('#' + id + '_tl'); t.cornerTC = $('#' + id + '_tc'); t.cornerTR = $('#' + id + '_tr'); t.cornerCL = $('#' + id + '_cl'); t.cornerCR = $('#' + id + '_cr'); t.cornerBL = $('#' + id + '_bl'); t.cornerBC = $('#' + id + '_bc'); t.cornerBR = $('#' + id + '_br'); // Add images t.offset = t.container.offset(); t.setImage(ta); t.container.mousedown(function(e) { var el = e.target; if (t.mode == 'none') return; if (el.id == id + '_mainImg') return t.drag(e, 'sel'); if (el.id == id + '_selectionImg') return t.drag(e, 'move'); if (el.nodeName == 'SPAN') return t.drag(e, el.className.replace(/selection\-corner(-|\s+)/g, '')); }); }; $.extend(ImageSelection.prototype, { getX : function(e) { return (e.clientX - this.settings.delta_x) + this.scrollContainer[0].scrollLeft; }, getY : function(e) { return (e.clientY - this.settings.delta_y) + this.scrollContainer[0].scrollTop; }, setMode : function(m) { var t = this; if (t.mode != m) { t.container.removeClass(t.mode); t.mode = m; t.container.addClass(m); if (m == 'none') { t.reset(); t.targetImg.show(); t.container.hide(); } else { t.targetImg.hide(); t.container.show(); } if (m == 'resize') { t.cornersVisible = 1; t.setRect(0, 0, t.maxW, t.maxH).show(); } else { t.cornersVisible = 0; t.setRect(0, 0, 0, 0); t.hide(); } } return t; }, setBounderyRect : function(x, y, w, h) { var t = this; t.minX = x; t.minY = y; t.maxW = w; t.maxH = h; }, setImage : function(ta) { var t = this; ta = $(ta); if (t.mode != 'none') ta.hide(); t.container.find('img').remove(); t.container.append($(ta).clone().attr('id', t.id + '_mainImg').addClass('mainimage')); t.mainImage = $('#' + t.id + '_mainImg').show(); t.selection.append($(ta).clone().attr('id', t.id + '_selectionImg').addClass('selimage')); t.selectionImg = t.selection.find('img').show(); t.targetImg = ta; t.setBounderyRect(0, 0, ta.width(), ta.height()); return t; }, setRect : function(x, y, w, h, ns) { var t = this, s = t.settings; // Flip rect horizontal if (w < 0) { w = w * -1; x -= w; if (x < 0) w += x; } // Flip rect vertical if (h < 0) { h = h * -1; y -= h; if (y < 0) h += y; } // Boundery check x = x < 0 ? 0 : x; y = y < 0 ? 0 : y; if (t.mode == 'crop') { w = w > t.maxW - x ? t.maxW - x : w; h = h > t.maxH - y ? t.maxH - y : h; } if (t.x != x) { t.selection.css('left', t.x = x); if (t.selectionImg) t.selectionImg.css('left', 0 - x - 1); } if (t.y != y) { t.selection.css('top', t.y = y); if (t.selectionImg) t.selectionImg.css('top', 0 - y - 1); } if (t.w != w) t.selection.css('width', 0).css('width', (t.w = w) - 2); if (t.h != h) t.selection.css('height', 0).css('height', (t.h = h) - 2); if (t.mode == 'resize') { t.selectionImg.css({left : 0, top : 0, width : t.w, height : t.h}); if (!ns) t.mainImage.css({width : t.w, height : t.h}); } $(t).trigger('imgselection:change', [x, y, w, h]); if (!ns) t.cornersVisible = 1; t.drawCorners().show(); return this; }, show : function() { var t = this; if (!t.visible) { t.selection.show(); if (t.cornersVisible) t.container.find('span').show(); t.visible = 1; } return t; }, hide : function() { var t = this; if (t.visible) { t.selection.hide(); t.container.find('span').hide(); t.visible = 0; } return t; }, reset : function() { var t = this, w = t.targetImg.width(), h = t.targetImg.height(); t.mainImage.css({width : w, height : h}); t.selectionImg.css({width : w, height : h}); t.setRect(0, 0, w, h); t.setBounderyRect(0, 0, w, h); return t; }, drawCorners : function() { var t = this; if (t.cornersVisible) { t.cornerTL.css({left : t.x - 4, top : t.y - 4}).show(); t.cornerTC.css({left : t.x + Math.round((t.w - 8) / 2), top : t.y - 4}).show(); t.cornerTR.css({left : t.x + t.w - 3, top : t.y - 4}).show(); t.cornerCL.css({left : t.x - 4, top : t.y + Math.round((t.h - 8) / 2)}).show(); t.cornerCR.css({left : t.x + t.w - 3, top : t.y + Math.round((t.h - 8) / 2)}).show(); t.cornerBL.css({left : t.x - 4, top : t.y + t.h - 3}).show(); t.cornerBC.css({left : t.x + Math.round((t.w - 8) / 2), top : t.y + t.h - 3}).show(); t.cornerBR.css({left : t.x + t.w - 3, top : t.y + t.h - 3}).show(); } return t; }, startDrag : function(e, o) { var t = this, sx = t.getX(e), sy = t.getY(e); if (o.start) o.start.call(t, sx, sy); function drag(e) { if (o.drag) o.drag.call(t, t.getX(e), t.getY(e)); e.preventDefault(); return false; }; function up() { if (o.end) o.end.call(t, t.getX(e), t.getY(e)); $().unbind('mouseup', up); $().unbind('mousemove', drag); e.preventDefault(); return false; }; $().mousemove(drag); $().mouseup(up); e.preventDefault(); return false; }, drag : function(e, ty) { var t = this, sx, sy, rx, ry, rw, rh, mw, mh, a; t.startDrag(e, { start : function(x, y) { sx = x; sy = y; rx = t.x; ry = t.y; rw = t.w; rh = t.h; mw = t.maxW; mh = t.maxH; a = (rw / rh) || 0; if (rw == 0 && rh == 0) t.hide(); t.cornersVisible = 0; t.container.find('span').hide(); t.selection.addClass('selection-corner-' + ty); }, drag : function(cx, cy) { var x = rx, y = ry, w = rw, h = rh, dx, dy, p = t.proportional || e.shiftKey; dx = cx - sx; dy = cy - sy; // Calc rect switch (ty) { case 'sel': dx = p ? Math.round(dy * a) : dx; w = dx; h = dy; x = sx; y = sy - 1; // Fix quirk break; case 'tl': dx = p ? Math.round(dy * a) : dx; x = rx + dx; y = ry + dy; w = rw - dx; h = rh - dy; break; case 'tc': y = ry + dy; h = rh - dy; break; case 'tr': dx = p ? Math.round(-dy * a) : dx; y = ry + dy; w = rw + dx; h = rh - dy; break; case 'cl': x = rx + dx; w = rw - dx; break; case 'cr': w = rw + dx; break; case 'bl': dx = p ? Math.round(-dy * a) : dx; x = rx + dx; w = rw - dx; h = rh + dy; break; case 'bc': h = rh + dy; break; case 'br': dx = p ? Math.round(dy * a) : dx; w = rw + dx; h = rh + dy; break; case 'move': x = rx + dx; y = ry + dy; x = x + rw > mw ? mw - rw : x; y = y + rh > mh ? mh - rh : y; break; } if (ty != 'move') { w = x < 0 ? w + x : w; h = y < 0 ? h + y : h; } t.setRect(x, y, w, h, 1); }, end : function() { t.cornersVisible = 1; if (t.mode == 'resize') { t.setRect(0, 0, t.w, t.h); t.setBounderyRect(0, 0, t.w, t.h); } t.drawCorners(); t.selection.removeClass('selection-corner-' + ty); } }); } }); $.createImageSelection = function(ta, s) { return new ImageSelection(ta, s); }; })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.js000066600000007317150472426320020535 0ustar00/** * $Id: jquery.multiupload.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { var id = 0; $.multiUpload = function(s) { var up = this, mul; up.id = up.generateID(); // Default settings up.settings = { }; up.settings = s = $.extend(up.settings, s); // Parse max size if (s.max_size) s.max_size = up.parseSize(s.max_size); // Parse chunk size if (s.chunk_size) s.chunk_size = up.parseSize(s.chunk_size); if (s.oninit) { $(up).bind('multiUpload:init', function() { s.oninit.call(up, up); }); } up.init(); $(['setup', 'filesSelected', 'fileProgress', 'filesProgress', 'filesUploaded', 'fileUploaded', 'fileUploadProgress']).each(function() { if (s[(this)]) $(up).bind('multiUpload:' + this, s[(this)]); }); $(up).trigger('multiUpload:setup'); $(up).bind('multiUpload:selectFiles', function() {this.cache = {};}); $(up).bind('multiUpload:filesSelected', function(e, fs) { var mx = up.settings.max_size; function filter(f) { var m = /\.([^.]+)$/.exec(f.name.toLowerCase()), ext = m ? m[1] : null; return ext && $.inArray(ext, s.filter) != -1 && (!mx || f.size < mx); }; // Remove non valid files if (s.filter[0] != '*') { this.files = $.grep(this.files, filter); fs.files = $.grep(fs.files, filter); } this.cache = {}; }); }; // Add public methods $.extend($.multiUpload.prototype, { files : [], cache : {}, listeners : {}, status : 0, init : function() { }, repaint : function() { }, selectFiles : function() { $(this).trigger('multiUpload:selectFiles'); }, startUpload : function() { this.status = 1; $(this).trigger('multiUpload:startUpload'); this.uploadNext(); }, stopUpload : function() { this.status = 0; $(this).trigger('multiUpload:stopUpload'); }, uploadNext : function() { var i, fl = this.files; if (!this.status) return; for (i = 0; i < fl.length; i++) { if (!fl[i].status) { $(this).trigger('multiUpload:uploadFile', [fl[i]]); return; } } this.stopUpload(); }, getFile : function(id) { var t = this, f, i, fl = t.files; if (f = t.cache[id]) return f; for (i = 0; i < fl.length; i++) { if (fl[i].id == id) return t.cache[id] = fl[i]; } }, removeFile : function(id) { var up = this, f; up.files = $.grep(up.files, function(v) { if (v.id == id) f = v; return v.id != id; }); $(this).trigger('multiUpload:removeFile', f); $(this).trigger('multiUpload:filesChanged'); }, clearFiles : function() { this.stopUpload(); this.files = []; this.cache = {}; $(this).trigger('multiUpload:clearFiles'); $(this).trigger('multiUpload:filesChanged'); }, formatSize : function(v) { // MB if (v > 1048576) return Math.round(v / 1048576, 1) + " MB"; // KB if (v > 1024) return Math.round(v / 1024, 1) + " KB"; return v + " b"; }, generateID : function() { return 'u' + (id++); }, parseSize : function(sz) { var mul; if (typeof(sz) == 'string') { sz = /^([0-9]+)([mk]+)$/.exec(sz.toLowerCase().replace(/[^0-9mk]/g, '')); mul = sz[2]; sz = parseInt(sz[1]); if (mul == 'm') sz *= 1048576; if (mul == 'k') sz *= 1024; } return sz; } }); // Static methods $.extend($.multiUpload, { instances : {}, create : function(s) { return this.add(new $.multiUpload(s)); }, remove : function(id) { if (this.get(id)) delete this.instances[id]; }, add : function(up) { return this.instances[up.id] = up; }, get : function(id) { return this.instances[id]; } }); })(jQuery); plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.silverlight.js000066600000012647150472426320023072 0ustar00/** * $Id: jquery.multiupload.silverlight.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ function onSilverlightError(sender, args) { alert("onSilverlightError: " + args.errormessage); }; (function($) { function isInstalled(version) { var isVersionSupported = false; var container = null; try { var control = null; try { control = new ActiveXObject('AgControl.AgControl'); if (version == null) isVersionSupported = true; else if (control.IsVersionSupported(version)) isVersionSupported = true; control = null; } catch (e) { var plugin = navigator.plugins["Silverlight Plug-In"]; if (plugin) { if (version === null) { isVersionSupported = true; } else { var actualVer = plugin.description; if (actualVer === "1.0.30226.2") actualVer = "2.0.30226.2"; var actualVerArray = actualVer.split("."); while (actualVerArray.length > 3) actualVerArray.pop(); while ( actualVerArray.length < 4) actualVerArray.push(0); var reqVerArray = version.split("."); while (reqVerArray.length > 4) reqVerArray.pop(); var requiredVersionPart, actualVersionPart, index = 0; do { requiredVersionPart = parseInt(reqVerArray[index]); actualVersionPart = parseInt(actualVerArray[index]); index++; } while (index < reqVerArray.length && requiredVersionPart === actualVersionPart); if (requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart)) isVersionSupported = true; } } } } catch (e) { isVersionSupported = false; } return isVersionSupported; }; if (!$.multiUpload.initialized && isInstalled('2.0.31005.0')) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'silverlight'; // Register global Silverlight instance $.multiUpload.setup = function(se) { $.multiUpload.plugin = $('#multiuploader')[0].content.Upload; $.multiUpload._fireEvent('init'); }; $.multiUpload.instances = []; $.multiUpload._fireEvent = function(na, p1, p2, p3, p4) { // Detach event from flash window.setTimeout(function() { $($.multiUpload.instances).each(function(i, v) { $(v).trigger('multiUpload:' + na, [p1, p2, p3, p4]); }); }, 0); }; // Override init function $.extend($.multiUpload.prototype, { init : function() { var up = this, sel = []; $.multiUpload.instances.push(up); // Add silverlight runtime if (!$('#multiuploader')[0]) { $("body").append( '' + '' + '' ); } // Register silverlight specific event handlers $(up).bind('multiUpload:slSelectFile', function(e, id, na, sz) { var fo = {id : id, name : na, size : sz, loaded : 0}; sel.push(fo); up.files.push(fo); }); $(up).bind('multiUpload:slSelectSuccessful', function() { $(up).trigger('multiUpload:filesSelected', [{files : sel}]); $(up).trigger('multiUpload:filesChanged'); sel = []; }); $(up).bind('multiUpload:slSelectCancelled', function() { $(up).trigger('multiUpload:filesSelectionCancelled', [sel]); sel = []; }); $(up).bind('multiUpload:slUploadFileProgress', function(e, id, lod, tot) { var file = up.getFile(id); file.loaded = lod; $(up).trigger('multiUpload:fileUploadProgress', [{file : file, loaded : lod, total : tot}]); }); $(up).bind('multiUpload:slUploadSuccessful', function(e, id, resp) { var fo; if (fo = up.getFile(id)) { if (!fo.status) { fo.status = "completed"; $(up).trigger('multiUpload:fileUploaded', [{file : fo, response : resp}]); } } $(up).trigger('multiUpload:filesChanged'); up.uploadNext(); }); $(up).bind('multiUpload:stopUpload', function(e) { $.multiUpload.plugin.CancelUpload(); }); $(up).bind('multiUpload:slUploadChunkSuccessful', function(e, id, chunk, chunks, resp) { var fo = up.getFile(id), ar = {file : fo, chunk : chunk, chunks : chunks, response : resp}; $(up).trigger('multiUpload:chunkUploaded', [ar]); if (ar.cancel) { fo.status = "failed"; $.multiUpload.plugin.CancelUpload(); } }); $(up).bind('multiUpload:slUploadChunkError', function(e, id, chunk, chunks, err) { $(up).trigger('multiUpload:uploadChunkError', [{file : up.getFile(id), chunk : chunk, chunks : chunks, error : err}]); }); // Register event handlers $(up).bind('multiUpload:selectFiles', function(e) { $.multiUpload.plugin.SelectFiles( 'Files |' + $.map(up.settings.filter, function(v) { return '*.' + v }).join(';') ); }); $(up).bind('multiUpload:removeFile', function(e, fo) { $.multiUpload.plugin.RemoveFile(fo.id); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { $.multiUpload.plugin.UploadFile( fo.id, up.settings.upload_url + '&name=' + escape(fo.name) + "&path=" + escape(up.settings.path), parseInt(up.settings.chunk_size) ); }); $(up).bind('multiUpload:clearFiles', function(e) { $.multiUpload.plugin.ClearFiles(); }); } }); } })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.uri.js000066600000013712150472426320016771 0ustar00/** * $Id: jquery.uri.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function URI(u, s) { var t = this, o, a, b; // Default settings s = t.settings = s || {}; // Strange app protocol or local anchor if (/^(mailto|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) { t.source = u; return; } // Absolute path with no host, fake host and protocol if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; // Relative path if (u.indexOf(':/') === -1 && u.indexOf('//') !== 0) u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); $(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"]).each(function(i, v) { var s = u[i]; // Zope 3 workaround, they use @@something if (s) s = s.replace(/\(mce_at\)/g, '@@'); t[v] = s; }); if (b = s.base_uri) { if (!t.protocol) t.protocol = b.protocol; if (!t.userInfo) t.userInfo = b.userInfo; if (!t.port && t.host == 'mce_host') t.port = b.port; if (!t.host || t.host == 'mce_host') t.host = b.host; t.source = ''; } }; $.extend(URI.prototype, { /** * Sets the internal path part of the URI. * * @param {string} p Path string to set. */ setPath : function(p) { var t = this; p = /^(.*?)\/?(\w+)?$/.exec(p); // Update path parts t.path = p[0]; t.directory = p[1]; t.file = p[2]; // Rebuild source t.source = ''; t.getURI(); }, /** * Converts the specified URI into a relative URI based on the current URI instance location. * * @param {String} u URI to convert into a relative path/URI. * @return {String} Relative URI from the point specified in the current URI instance. */ toRelative : function(u) { var t = this, o; if (u === "./") return u; u = new URI(u, {base_uri : t}); // Not on same domain/port or protocol if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) return u.getURI(); o = t.toRelPath(t.path, u.path); // Add query if (u.query) o += '?' + u.query; // Add anchor if (u.anchor) o += '#' + u.anchor; return o; }, /** * Converts the specified URI into a absolute URI based on the current URI instance location. * * @param {String} u URI to convert into a relative path/URI. * @param {bool} nh No host and protocol prefix. * @return {String} Absolute URI from the point specified in the current URI instance. */ toAbsolute : function(u, nh) { var u = new URI(u, {base_uri : this}); return u.getURI(this.host == u.host ? nh : 0); }, /** * Converts a absolute path into a relative path. * * @param {String} base Base point to convert the path from. * @param {String} path Absolute path to convert into a relative path. */ toRelPath : function(base, path) { var items, bp = 0, out = '', i, l; // Split the paths base = base.substring(0, base.lastIndexOf('/')); base = base.split('/'); items = path.split('/'); if (base.length >= items.length) { for (i = 0, l = base.length; i < l; i++) { if (i >= items.length || base[i] != items[i]) { bp = i + 1; break; } } } if (base.length < items.length) { for (i = 0, l = items.length; i < l; i++) { if (i >= base.length || base[i] != items[i]) { bp = i + 1; break; } } } if (bp == 1) return path; for (i = 0, l = base.length - (bp - 1); i < l; i++) out += "../"; for (i = bp - 1, l = items.length; i < l; i++) { if (i != bp - 1) out += "/" + items[i]; else out += items[i]; } return out; }, /** * Converts a relative path into a absolute path. * * @param {String} base Base point to convert the path from. * @param {String} path Relative path to convert into an absolute path. */ toAbsPath : function(base, path) { var i, nb = 0, o = []; // Split paths base = base.split('/'); path = path.split('/'); // Remove empty chunks $(base).each(function(i, k) { if (k) o.push(k); }); base = o; // Merge relURLParts chunks for (i = path.length - 1, o = []; i >= 0; i--) { // Ignore empty or . if (path[i].length == 0 || path[i] == ".") continue; // Is parent if (path[i] == '..') { nb++; continue; } // Move up if (nb > 0) { nb--; continue; } o.push(path[i]); } i = base.length - nb; // If /a/b/c or / if (i <= 0) return '/' + o.reverse().join('/'); return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/'); }, /** * Returns the full URI of the internal structure. * * @param {bool} nh Optional no host and protocol part. Defaults to false. */ getURI : function(nh) { var s, t = this; // Rebuild source if (!t.source || nh) { s = ''; if (!nh) { if (t.protocol) s += t.protocol + '://'; if (t.userInfo) s += t.userInfo + '@'; if (t.host) s += t.host; if (t.port) s += ':' + t.port; } if (t.path) s += t.path; if (t.query) s += '?' + t.query; if (t.anchor) s += '#' + t.anchor; t.source = s; } return t.source; } }); $.parseURI = function(u, s) { s = s || {}; return new URI(u, $.extend({base_uri : new URI(s.base_url || document.location.href)}, s)); }; })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.cleanname.js000066600000001416150472426320020113 0ustar00/** * $Id: jquery.cleanname.js 528 2008-10-29 17:58:01Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ $.cleanName = function(s) { var i, lo; // Replace diacritics lo = [ /[\300-\306]/g, 'A', /[\340-\346]/g, 'a', /\307/g, 'C', /\347/g, 'c', /[\310-\313]/g, 'E', /[\350-\353]/g, 'e', /[\314-\317]/g, 'I', /[\354-\357]/g, 'i', /\321/g, 'N', /\361/g, 'n', /[\322-\330]/g, 'O', /[\362-\370]/g, 'o', /[\331-\334]/g, 'U', /[\371-\374]/g, 'u' ]; for (i = 0; i < lo.length; i += 2) s = s.replace(lo[i], lo[i + 1]); // Replace whitespace s = s.replace(/\s+/g, '_'); // Remove anything else s = s.replace(/[^a-z0-9_\-\.]+/gi, ''); return s; }; })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.dropmenu.js000066600000011733150472426320020024 0ustar00/** * $Id: jquery.dropmenu.js 466 2008-10-15 14:54:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { var idCount = 0; function DropMenu(s) { var t = this, k; t.items = []; t.settings = s = $.extend({ menu_class : 'menu', menu_item_class : 'menuitem', item_class : 'item', separator_class : 'separator', submenu_item_class : 'submenu', active_class : 'active' }, s); t.id = s.id; if (s.setup) s.setup.call(t, t); // Private methods function hideHandler(e) { if (e.target.nodeName !== 'A' || !$(e.target).parents('div.' + s.menu_class).length) t.hide(); }; function clickHandler(e) { var m; if (e.target.nodeName === 'A') { m = t.find(e.target.rel); if (!m.show && !m.disabled) { if (m.onclick) m.onclick.call(m.scope || this, e, m); if (s.onClick) s.onClick(e, m); m = t; do { m.hide(); } while (m = m.parentMenu); } e.preventDefault(); return false; } }; function mouseOverHandler(e) { var x, y, o, m, el; if (e.target.nodeName === 'A') { if (t.lastMenu) t.lastMenu.hide(); if (m = t.find(e.target.rel)) { if (m.show) { el = $(e.target.parentNode); o = el.offset(); x = o.left + el.width(); y = o.top; el.addClass(m.settings.active_class); t.lastMenu = m; m.show(x, y); } } } }; function createElm(n, a, h) { n = document.createElement(n); if (a) $(n).attr(a); if (h) $(n).html(h); return n; }; function uniqueId() { return 'jquery_mc_' + idCount++; }; // Public methods $.extend(this, { createMenu : function(s) { return new DropMenu(s); }, find : function(n) { var i; for (i = 0; i < t.items.length; i++) { if (t.items[i].id === n) return t.items[i]; } return null; }, clear : function() { t.hide(); t.items = []; $('#' + t.id).remove(); t.rendered = 0; }, render : function(n) { if (!n.id) n.id = t.id = uniqueId(); else t.id = 'jquery_mc_' + n.id; if (s.onInit) s.onInit(t); }, show : function(x, y) { var pe, it, m, s = t.settings; if (t.visible) t.hide(); $(t).trigger('DropMenu:beforeshow', [t]); $().trigger('DropMenu:beforeshow', [t]); if (!t.rendered) { pe = createElm('div', {id : t.id, 'class' : s.menu_class}); $.each(t.items, function(i, v) { var ti, id, cl = '', an; if (v.constructor == DropMenu) { ti = v.settings.title; cl = ' ' + s.submenu_item_class; if (v.settings['class']) cl += ' ' + v.settings['class']; } else { ti = v.title; if (this['class']) cl = ' ' + v['class']; } if (v.disabled || v.settings && v.settings.disabled) cl += ' disabled'; // Add menu item it = createElm('div', {id : t.id + '_' + v.id, 'class' : s.menu_item_class + cl}); an = createElm('a', {rel : v.id, href : '#'}, ti); //$(an).append(createElm('span', null, ti)); $(it).append(an); $(pe).append(it); }); $(document.body).append(pe); t.rendered = 1; } $().mouseup(hideHandler); m = $('#' + t.id); m.mouseover(mouseOverHandler).show().css({left : -5000, top : -5000}); // Measure and align if (s.halign == 'right') x -= m.width(); if (s.valign == 'bottom') y -= m.height(); // Constrain if (s.constrain) { x = x < 0 ? 0 : x; y = y < 0 ? 0 : y; x = x + m.width() > $.winWidth() ? $.winWidth() - m.width() : x; y = y + m.height() > $.winHeight() ? $.winHeight() - m.height() : y; } m.css({left : x, top : y}).click(clickHandler); t.visible = 1; $(t).trigger('DropMenu:show'); $().trigger('DropMenu:show', [t]); return false; }, hide : function() { if (!t.visible) return false; $('a[@rel=' + t.id + ']').parent().removeClass('active'); $().unbind('mouseup', hideHandler); $('#' + t.id).unbind('mouseover', mouseOverHandler).hide(); $('#' + t.id).unbind('click', clickHandler); t.visible = 0; $.each(t.items, function() { if (this.hide) this.hide(); }); $(t).trigger('DropMenu:hide'); $().trigger('DropMenu:hide', [t]); return false; }, add : function(o) { o.id = o.id || uniqueId(); t.items.push(o); return o; }, addSeparator : function() { return t.add({'class' : s.separator_class, title : 'separator'}); }, addMenu : function(o) { if (!o.onClick) o.onClick = s.onClick; o = new DropMenu(o); o.parentMenu = t; return t.add(o); } }); }; jQuery.mcDropMenu = DropMenu; jQuery.fn.mcContextMenu = function(s) { this.each(function() { var m = new $.mcDropMenu(s); m.render(this); $(this).bind('contextmenu', function(e) { return m.show(e.clientX, e.clientY); }); }); }; })(jQuery); plugins/imagemanager/pages/im/js/jquery/jquery.json.js000066600000005755150472426320017153 0ustar00(function ($) { var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, s = { 'array': function (x) { var a = ['['], b, f, i, l = x.length, v; for (i = 0; i < l; i += 1) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a[a.length] = v; b = true; } } } a[a.length] = ']'; return a.join(''); }, 'boolean': function (x) { return String(x); }, 'null': function (x) { return "null"; }, 'number': function (x) { return isFinite(x) ? String(x) : 'null'; }, 'object': function (x) { if (x) { if (x instanceof Array) { return s.array(x); } var a = ['{'], b, f, i, v; for (i in x) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a.push(s.string(i), ':', v); b = true; } } } a[a.length] = '}'; return a.join(''); } return 'null'; }, 'string': function (x) { if (/["\\\x00-\x1f]/.test(x)) { x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if (c) { return c; } c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }); } return '"' + x + '"'; } }; $.toJSON = function(v) { var f = isNaN(v) ? s[typeof v] : s['number']; if (f) return f(v); }; $.parseJSON = function(v, safe) { if (safe === undefined) safe = $.parseJSON.safe; if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v)) return undefined; return eval('('+v+')'); }; $.parseJSON.safe = false; })(jQuery); plugins/imagemanager/pages/im/js/jquery/jquery.template.js000066600000016004150472426320020002 0ustar00/** * jQuery Templates * * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * * Written by: Stan Lemon * * Based off of the Ext.Template library, available at: * http://www.extjs.com * * This library provides basic templating functionality, allowing for macro-based * templates within jQuery. * * Basic Usage: * * var t = $.template('
    Hello ${name}, how are you ${question}? I am ${me:substr(0,10)}
    '); * * $(selector).append( t , { * name: 'Stan', * question: 'feeling', * me: 'doing quite well myself, thank you very much!' * }); * * Requires: jQuery 1.2+ * * * @todo Add callbacks to the DOM manipulation methods, so that events can be bound * to template nodes after creation. */ (function($){ /** * Create a New Template */ $.template = function(html, options) { return new $.template.instance(html, options); }; /** * Template constructor - Creates a new template instance. * * @param html The string of HTML to be used for the template. * @param options An object of configurable options. Currently * you can toggle compile as a boolean value and set a custom * template regular expression on the property regx by * specifying the key of the regx to use from the regx object. */ $.template.instance = function(html, options) { // If a custom regular expression has been set, grab it from the regx object if ( options && options['regx'] ) options.regx = this.regx[ options.regx ]; this.options = $.extend({ compile: false, regx: this.regx.standard }, options || {}); this.html = html; if (this.options.compile) { this.compile(); } this.isTemplate = true; }; /** * Regular Expression for Finding Variables * * The default pattern looks for variables in JSP style, the form of: ${variable} * There are also regular expressions available for ext-style variables and * jTemplate style variables. * * You can add your own regular expressions for variable ussage by doing. * $.extend({ $.template.re , { * myvartype: /...../g * } * * Then when creating a template do: * var t = $.template("
    ...
    ", { regx: 'myvartype' }); */ $.template.regx = $.template.instance.prototype.regx = { jsp: /\$\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, ext: /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, jtemplates: /\{\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}\}/g }; /** * Set the standard regular expression to be used. */ $.template.regx.standard = $.template.regx.jsp; /** * Variable Helper Methods * * This is a collection of methods which can be used within the variable syntax, ie: * ${variable:substr(0,30)} Which would only print a substring, 30 characters in length * begining at the first character for the variable named "variable". * * A basic substring helper is provided as an example of how you can define helpers. * To add more helpers simply do: * $.extend( $.template.helpers , { * sampleHelper: function() { ... } * }); */ $.template.helpers = $.template.instance.prototype.helpers = { substr : function(value, start, length){ return String(value).substr(start, length); } }; /** * Template Instance Methods */ $.extend( $.template.instance.prototype, { /** * Apply Values to a Template * * This is the macro-work horse of the library, it receives an object * and the properties of that objects are assigned to the template, where * the variables in the template represent keys within the object itself. * * @param values An object of properties mapped to template variables */ apply: function(values) { if (this.options.compile) { return this.compiled(values); } else { var tpl = this; var fm = this.helpers; var fn = function(m, name, format, args) { if (format) { if (format.substr(0, 5) == "this."){ return tpl.call(format.substr(5), values[name], values); } else { if (args) { // quoted values are required for strings in compiled templates, // but for non compiled we need to strip them // quoted reversed for jsmin var re = /^\s*['"](.*)["']\s*$/; args = args.split(','); for(var i = 0, len = args.length; i < len; i++) { args[i] = args[i].replace(re, "$1"); } args = [values[name]].concat(args); } else { args = [values[name]]; } return fm[format].apply(fm, args); } } else { return values[name] !== undefined ? values[name] : ""; } }; return this.html.replace(this.options.regx, fn); } }, /** * Compile a template for speedier usage */ compile: function() { var sep = $.browser.mozilla ? "+" : ","; var fm = this.helpers; var fn = function(m, name, format, args){ if (format) { args = args ? ',' + args : ""; if (format.substr(0, 5) != "this.") { format = "fm." + format + '('; } else { format = 'this.call("'+ format.substr(5) + '", '; args = ", values"; } } else { args= ''; format = "(values['" + name + "'] == undefined ? '' : "; } return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; }; var body; if ($.browser.mozilla) { body = "this.compiled = function(values){ return '" + this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.options.regx, fn) + "';};"; } else { body = ["this.compiled = function(values){ return ['"]; body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.options.regx, fn)); body.push("'].join('');};"); body = body.join(''); } eval(body); return this; } }); /** * Save a reference in this local scope to the original methods which we're * going to overload. **/ var $_old = { domManip: $.fn.domManip, text: $.fn.text, html: $.fn.html }; /** * Overwrite the domManip method so that we can use things like append() by passing a * template object and macro parameters. */ $.fn.domManip = function( args, table, reverse, callback ) { if (args[0].isTemplate) { // Apply the template and it's arguments... args[0] = args[0].apply( args[1] ); // Get rid of the arguements, we don't want to pass them on delete args[1]; } // Call the original method var r = $_old.domManip.apply(this, arguments); return r; }; /** * Overwrite the html() method */ $.fn.html = function( value , o ) { if (value && value.isTemplate) var value = value.apply( o ); var r = $_old.html.apply(this, [value]); return r; }; /** * Overwrite the text() method */ $.fn.text = function( value , o ) { if (value && value.isTemplate) var value = value.apply( o ); var r = $_old.text.apply(this, [value]); return r; }; })(jQuery); plugins/imagemanager/pages/im/js/jquery/jquery.dialog.js000066600000034122150472426320017427 0ustar00/** * $Id: jquery.dialog.js 589 2008-11-13 11:15:53Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.Window = function(f, a) { var t = this; t.features = f; t.args = a; t.isIE6 = /MSIE [56]/.test(navigator.userAgent); // Register actions t.clickActions = { min : t.minimize, max : t.maximize, med : t.medimize, close : t.close }; t.mouseDownActions = { move : t.startDrag, 'resize-n' : t.startDrag, 'resize-nw' : t.startDrag, 'resize-w' : t.startDrag, 'resize-e' : t.startDrag, 'resize-s' : t.startDrag, 'resize-sw' : t.startDrag, 'resize-se' : t.startDrag }; }; $.extend($.Window.prototype, { getArgs : function() { return this.args; }, focus : function() { var t = this, id = t.id; if (!t.focused) { if (t.shim) t.shim.css('z-index', $.WindowManager.zIndex); $('#' + id).css('z-index', t.zIndex = $.WindowManager.zIndex++); $('#' + id + '_container').addClass('focus'); $('#' + id + '_top').addClass('focustop'); $('#' + id + '_middle').addClass('focusmiddle'); $('#' + id + '_bottom').addClass('focusbottom'); $($.WindowManager.windows).each(function() { if (this != t) this.blur(); }); t.focused = 1; } return this; }, blur : function() { var t = this, id = t.id; if (t.focused) { $('#' + id + '_container').removeClass('focus'); $('#' + id + '_top').removeClass('focustop'); $('#' + id + '_middle').removeClass('focusmiddle'); $('#' + id + '_bottom').removeClass('focusbottom'); t.focused = 0; } return t; }, setTitle : function(ti) { this.features.title = ti; $('#' + this.id + '_title').html(ti); return this; }, setStatus : function(st) { $('#' + this.id + '_statustext').html(st); return this; }, minimize : function() { return this; }, medimize : function() { var t = this, sp = $.scrollPos(), r; if (r = t.lastRect) { $('#' + t.id + '_max').removeClass('med').addClass('max'); t.moveTo(r.x, r.y); t.resizeTo(r.w, r.h); t.lastRect = 0; } return t; }, maximize : function() { var t = this, sp = $.scrollPos(); if (!t.lastRect) { t.lastRect = {x : t.x, y : t.y, w : t.width, h : t.height}; $('#' + t.id + '_max').removeClass('max').addClass('med'); t.moveTo(sp.x, sp.y); t.resizeTo($.winWidth(), $.winHeight(), 1); } return t; }, close : function(ac) { var t = this, f; if (ac && (f = t.features.onbeforeclose)) { if (f.call(t) === false) return; } $('#' + t.id).remove(); if ($.WindowManager.windows.length == 1) $('#windowManEventBlocker').remove(); $.WindowManager.remove(t); if (t.shim) { t.shim.remove(); t.shim = 0; } if (t.features.onclose) t.features.onclose(t); }, moveTo : function(x, y) { var t = this, el = $('#' + t.id); if (t.x != x) { el.css({left : x}); t.x = x; } if (t.y != y) { el.css({top : y}); t.y = y; } if (t.shim) t.shim.css({left : x, top : y}); return t; }, moveBy : function(dx, dy) { return this.moveTo(this.x + parseInt(dx), this.y + parseInt(dy)); }, resizeTo : function(w, h, nr) { var t = this, b = t.borders, el = $('#' + t.id), ifr = $('#' + t.id + '_content, #' + t.id + '_ifr'); w = parseInt(w); h = parseInt(h); if (!nr && t.lastRect) { $('#' + t.id + '_max').removeClass('med').addClass('max'); t.lastRect = 0; } if (t.width != w) { ifr.css({width : w - b.w}); el.css({width : w}); t.width = w; } if (t.height != h) { ifr.css({height : h - b.h}); el.css({height : h}); $('#' + t.id + '_middle').css('height', h - b.h); t.height = h; } if (t.shim) t.shim.css({width : w, height : h}); return t; }, resizeBy : function(dw, dh) { return this.resizeTo(this.width + parseInt(dw), this.height + parseInt(dh)); }, show : function() { var t = this, id = t.id, bw, bh; $('#' + id).show(); // Calculate borders bw = $('#' + id + '_middle div.left')[0].clientWidth; bw += $('#' + id + '_middle div.right')[0].clientWidth; bh = $('#' + id + '_top')[0].clientHeight; bh += $('#' + id + '_bottom')[0].clientHeight; t.borders = {w : bw, h : bh - 1}; if (t.shim) t.shim.show(); return t; }, hide : function() { var t = this; $('#' + t.id).hide(); if (t.shim) t.shim.hide(); return t; }, setContent : function(h) { $('#' + this.id + '_content').html(h); return this; }, setURL : function(u) { var t = this, id = t.id, ifr = $('#' + id + '_ifr'), b = t.borders; if (!ifr[0]) $('#' + id + '_content').html('').append($.createElm('iframe', {id : id + '_ifr', src : u, frameBorder : '0', scrolling : t.features.scrolling}).css({width : t.width - b.w, height : t.height - b.h})); else ifr.attr('src', u); return t; }, startMove : function(a, e) { var t = this, bid = t.features.theme + '_move', mb, sx = e.screenX, sy = e.screenY, dx, dy, wx, wy; $(document.body).append($.createElm('div', {id : bid, 'class' : t.features.theme + '_event_blocker'}).css('z-index', $.WindowManager.zIndex)); mb = $('#' + bid).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); wx = t.x; wy = t.y; mb.mousemove(function(e) { dx = e.screenX - sx; dy = e.screenY - sy; t.moveTo(wx + dx, wy + dy); }); mb.mouseup(function(e) { mb.remove(); }); }, startDrag : function(a, e) { var t = this, bid = t.features.theme + '_move', mb, sx = e.screenX, sy = e.screenY, dx, dy, wx, wy, w, h; $(document.body).append($.createElm('div', {id : bid, 'class' : t.features.theme + '_event_blocker'}).css('z-index', $.WindowManager.zIndex)); mb = $('#' + bid).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); wx = t.x; wy = t.y; w = t.width; h = t.height; mb.mousemove(function(e) { dx = e.screenX - sx; dy = e.screenY - sy; var x = wx + dx, y = wy + dy; switch (a) { case 'resize-n': t.moveTo(wx, y); t.resizeTo(w, h - dy); break; case 'resize-nw': t.moveTo(x, y); t.resizeTo(w - dx, h - dy); break; case 'resize-ne': t.moveTo(wx, y); t.resizeTo(w + dx, h - dy); break; case 'resize-w': t.moveTo(x, wy); t.resizeTo(w - dx, h); break; case 'resize-e': t.resizeTo(w + dx, h); break; case 'resize-s': t.resizeTo(w, h + dy); break; case 'resize-sw': t.moveTo(wx + dx, wy); t.resizeTo(w - dx, h + dy); break; case 'resize-se': t.resizeTo(w + dx, h + dy); break; case 'move': t.moveTo(wx + dx, wy + dy); break; } e.preventDefault(); return false; }); mb.mouseup(function(e) { mb.remove(); }); e.preventDefault(); return false; }, render : function() { var t = this, id = 'win_' + $.WindowManager.count++, f = t.features, mc = '', bl, v; t.features = f = $.extend({ theme : 'clearlooks2', modal : 1, type : 'window', x : -1, y : -1, width : 320, height : 240, title : ' ' }, f); // Center window if (f.x == -1) f.x = Math.round(($.winWidth() / 2) - (f.width / 2)); if (f.y == -1) f.y = Math.round(($.winHeight() / 2) - (f.height / 2)); t.id = id; if (f.modal) { bl = $('#windowManEventBlocker'); if (!bl[0]) { $(document.body).append($.createElm('div', {id : 'windowManEventBlocker', 'class' : f.theme + '_event_blocker'}).addClass(f.theme + '_visible_event_blocker')); bl = $('#windowManEventBlocker'); } bl.show().css('z-index', $.WindowManager.zIndex++).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); } if (t.isIE6 && !t.shim) { $(document.body).append(''); t.shim = $('#' + id + '_shim'); } $(document.body).appendAll( ['div', {id : id, 'class' : f.theme + ' window'}, ['div', {id : id + '_container', 'class' : 'statusbar ' + f.type}, ['div', {id : id + '_top', 'class' : 'windowtop'}, ['div', {'class' : 'left'}], ['div', {'class' : 'middle'}], ['div', {'class' : 'right'}], ['div', {id : id + '_title', 'class' : 'title'}, f.title], ['a', {id : id + '_min', href : '', 'class' : 'action min'}], ['a', {id : id + '_max', href : '', 'class' : 'action max'}], ['a', {id : id + '_close', href : '', 'class' : 'action close'}], ['a', {id : id + '_move', 'class' : 'action move', tabindex : '-1'}], ['a', {id : id + '_resize_n', 'class' : 'action resize resize-n', tabindex : '-1'}], ['a', {id : id + '_resize_nw', 'class' : 'action resize resize-nw', tabindex : '-1'}], ['a', {id : id + '_resize_ne', 'class' : 'action resize resize-ne', tabindex : '-1'}] ], ['div', {id : id + '_middle', 'class' : 'windowmiddle'}, ['div', {'class' : 'left'}], ['div', {id : id + '_content', 'class' : 'middle'}, ' '], ['div', {'class' : 'right'}], ['div', {id : id + '_bigicon', 'class' : 'bigicon'}], ['a', {id : id + '_resize_w', 'class' : 'action resize resize-w', tabindex : '-1'}], ['a', {id : id + '_resize_e', 'class' : 'action resize resize-e', tabindex : '-1'}] ], ['div', {id : id + '_bottom', 'class' : 'windowbottom' + (f.statusbar ? ' statusbarbottom' : '')}, ['div', {'class' : 'left'}], ['div', {'class' : 'middle'}], ['div', {'class' : 'right'}], ['div', {id : id + '_statustext', 'class' : 'statustext'}, ' '], ['a', {id : id + '_resize_s', 'class' : 'action resize resize-s', tabindex : '-1'}], ['a', {id : id + '_resize_sw', 'class' : 'action resize resize-sw', tabindex : '-1'}], ['a', {id : id + '_resize_se', 'class' : 'action resize resize-se', tabindex : '-1'}] ] ] ] ); if (f.bigicon) $('#' + id + '_bigicon').addClass(f.bigicon); if (f.chromeless) $('#' + id + '_container').addClass('chromeless'); if (f.resizable) $('#' + id + '_container').addClass('resizable'); if (f.statusbar) { $('#' + id + '_container').addClass('statusbar'); $('#' + id + '_bottom').addClass('statusbarbottom'); } t.show().hide().resizeTo(f.width, f.height).moveTo(f.x, f.y).show(); if (v = f.title) t.setTitle(v); if (v = f.content) t.setContent(v); if (v = f.url) t.setURL(v); function handleAction(e) { var el = $(e.target), action, f; t.focus(); if (el[0].nodeName == 'A' && el.hasClass('action')) { action = $.grep(el[0].className.split(/\s+/), function(v) {return !/^action|resize$/.test(v);}).join(' '); if (e.type == 'mousedown') f = t.mouseDownActions[action]; else { if (t.features.onaction) { t.features.onaction.call(t, action); return false; } f = t.clickActions[action]; } if (f) { f.call(t, action, e); return false; } } }; $('#' + id).click(handleAction).mousedown(handleAction); $($.WindowManager).trigger('WindowManager:open', [t]); return t; } }); $.WindowManager = { zIndex : 100010, count : 0, windows : [], i18n : { yes : 'Yes', no : 'No', ok : 'Ok' }, setup : function() { var w = window, lw, nwm; // Find root window manager while ((w = w.parent || w.opener) && w != lw) { if (w.$ && w.$.WindowManager) nwm = w.$.WindowManager; lw = w; } // Found parent window manager use that one and set the title for the dialog if (nwm && nwm != this) { $.CurrentWindowManager = $.WindowManager; $.WindowManager = nwm; nwm.find(window).setTitle(document.title); } else { $(window).bind('resize', function() { $($.WindowManager.windows).each(function(i, w) { if (w.lastRect) w.resizeTo($.winWidth(), $.winHeight(), 1); }); }); } }, find : function(tw) { var i, ifr, w; for (i = 0; i < this.windows.length; i++) { w = this.windows[i]; ifr = $('#' + w.id + '_ifr')[0]; if (ifr && ifr.contentWindow == tw) return w; } return this.defaultWin; }, open : function(f, a) { var w = new $.Window(f, a).render(); this.windows.push(w); return w.focus(); }, warn : function(msg, cb) { return this.modalBox(msg, { bigicon : 'warning' }, cb); }, error : function(msg, cb) { return this.modalBox(msg, { bigicon : 'error' }, cb); }, info : function(msg, cb) { return this.modalBox(msg, { bigicon : 'info' }, cb); }, confirm : function(msg, cb) { return this.modalBox(msg, { type : 'confirm', bigicon : 'ask', onaction : function(a) { var t = this; if (a == 'ok') { t.close(); if (cb) cb.call(t, 1); } else if (a == 'cancel' || a == 'close') { t.close(); if (cb) cb.call(t, 0); } } }, cb).setContent( '
    ' + msg +'
    ' + '' + this.i18n.yes + '' + '' + this.i18n.no + '' ); }, modalBox : function(msg, f, cb) { f = $.extend({ type : 'alert', bigicon : 'error', width : 400, height : 130, onaction : function(a) { if (a == 'ok') { this.close(); if (cb) cb.call(this, 1); } else if (a == 'close') this.close(); } }, f); return this.open(f).setContent( '
    ' + (msg || '') +'
    ' + '' + this.i18n.ok + '' ); }, remove : function(w) { var t = this, fr, z = 0, nl = []; // Find front most window $(t.windows).each(function(i, cw) { if (w == cw) return; if (cw.zIndex > z) { z = cw.zIndex; fr = cw; } nl.push(cw); }); t.windows = nl; if (fr) fr.focus(); } }; $.WindowManager.setup(); })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.flash.js000066600000010645150472426320021627 0ustar00/** * $Id: jquery.multiupload.gears.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function getFlashVersion() { var v; try { v = navigator.plugins['Shockwave Flash']; v = v.description; } catch (ex) { try { v = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); } catch (ex) { v = '0.0'; } } v = v.match(/\d+/g); return parseFloat(v[0] + '.' + v[1]); }; if (!$.multiUpload.initialized && getFlashVersion() >= 10) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'flash'; $.multiUpload.instances = []; $.multiUpload._fireEvent = function(na, p1, p2, p3, p4) { // Detach event from flash window.setTimeout(function() { $($.multiUpload.instances).each(function(i, v) { $(v).trigger('multiUpload:' + na, [p1, p2, p3, p4]); v.repaint(); }); }, 0); }; // Override init function $.extend($.multiUpload.prototype, { getFlash : function() { return $('#flashuploader')[0]; }, repaint : function() { var up = this, fb = $(up.settings.flash_browse_button), off = fb.offset(); up.flashContainer.css({position : 'absolute', top : off.top, left : off.left, width : fb.width(), height : fb.height(), backgr2ound : 'red'}); }, init : function() { var up = this, s = up.settings, so, fb; $.multiUpload.instances.push(up); $(up).bind('multiUpload:flashInit', function(e) { $(up).trigger('multiUpload:init'); }); $(document.body).append('
    '); so = new SWFObject("js/jquery/jquery.multiupload.flash.swf", "flashuploader", "100%", "100%", "10.0"); so.addVariable("file_filter", $.map(up.settings.filter, function(v) { return '*.' + v }).join(';')); so.addParam("wmode", "transparent"); so.write("flashUploaderContainer"); up.flashContainer = $('#flashUploaderContainer'); // Reposition flash $(function(e) { up.repaint(); }); up.repaint(); // Register event handlers $(up).bind('multiUpload:flashSelectFiles', function(e, sel) { // Add selected files to file queue $(sel).each(function(i, fo) { up.files.push(fo); }); // Trigger events $(up).trigger('multiUpload:filesSelected', [{files : sel}]); $(up).trigger('multiUpload:filesChanged'); }); $(up).bind('multiUpload:flashUploadComplete', function(e, o) { var fo; if (fo = up.getFile(o.id)) { if (!fo.status) { fo.status = 'completed'; $(up).trigger('multiUpload:fileUploaded', [{file : fo, response : o.text}]); } } $(up).trigger('multiUpload:filesChanged'); up.uploadNext(); }); $(up).bind('multiUpload:flashUploadProcess', function(e, pr) { var fo = up.getFile(pr.id); if (!fo.status) { fo.loaded = pr.loaded; $(up).trigger('multiUpload:fileUploadProgress', [{file : fo, loaded : fo.loaded, total : fo.size}]); } }); $(up).bind('multiUpload:flashIOError', function(e, o) { var fo; if (fo = up.getFile(o.id)) { if (!fo.status) { fo.status = 'failed'; $(up).trigger('multiUpload:uploadChunkError', [{file : fo, error : o.message}]); } } }); $(up).bind('multiUpload:stopUpload', function(e) { up.getFlash().cancelUpload(); }); $(up).bind('multiUpload:removeFile', function(e, fo) { up.getFlash().removeFile(fo.id); }); $(up).bind('multiUpload:clearFiles', function(e) { up.getFlash().clearFiles(); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { var pageURL = document.location.href.replace(/\/[^\/]+$/g, '/'); up.getFlash().uploadFile(fo.id, { upload_url : pageURL + up.settings.upload_url + '&path=' + escape(up.settings.path) + '&name=' + escape(fo.name), chunk_size : up.settings.chunk_size, file_field : 'file0', post_args : { name0 : fo.name } }); }); $(up).bind('multiUpload:flashUploadChunkComplete', function(e, o) { var fo = up.getFile(o.id), arg; arg = { file : fo, chunk : o.chunk, chunks : o.chunks, response : o.text }; if (!fo.status) $(up).trigger('multiUpload:chunkUploaded', [arg]); if (arg.cancel) { fo.status = 'failed'; up.getFlash().cancelUpload(); } }); } }); } })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.gears.js000066600000007076150472426320021637 0ustar00/** * $Id: jquery.multiupload.gears.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { if (!$.multiUpload.initialized && window.google && google.gears) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'gears'; // Override init function $.extend($.multiUpload.prototype, { init : function() { var up = this; $(up).trigger('multiUpload:init'); $(up).bind('multiUpload:selectFiles', function(e) { var up = this, desk = google.gears.factory.create('beta.desktop'), s = {}; if (up.settings.filter[0] != '*') s.filter = $.map(up.settings.filter, function(v) {return '.' + v}); desk.openFiles(function(f) { var sf = []; if (f.length) { up._fireEvent('multiUpload:beforeFilesSelected'); $(f).each(function() { var fo = { id : up.generateID(), name : this.name, blob : this.blob, size : this.blob.length, loaded : 0 }; up.files.push(fo); sf.push(fo); }); up._fireEvent('multiUpload:filesSelected', [{files : sf}]); up._fireEvent('multiUpload:filesChanged'); } else up._fireEvent('multiUpload:filesSelectionCancelled'); }, s); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { var req, up = this, chunkSize, chunk = 0, chunks, i, start, loaded = 0, curChunkSize; chunkSize = up.settings.chunk_size || 1024 * 1024; chunks = Math.ceil(fo.blob.length / chunkSize); uploadNextChunk(); function uploadNextChunk() { var url = up.settings.upload_url; if (fo.status) return; curChunkSize = Math.min(chunkSize, fo.blob.length - (chunk * chunkSize)); req = google.gears.factory.create('beta.httprequest'); req.open('POST', url + (url.indexOf('?') == -1 ? '?' : '&') + 'name=' + escape(fo.name) + '&chunk=' + chunk + '&chunks=' + chunks + '&path=' + escape(up.settings.path)); req.setRequestHeader('Content-Disposition', 'attachment; filename="' + fo.name + '"'); req.setRequestHeader('Content-Type', 'application/octet-stream'); req.setRequestHeader('Content-Range', 'bytes ' + chunk * chunkSize); req.upload.onprogress = function(pr) { fo.loaded = loaded + pr.loaded; up._fireEvent('multiUpload:fileUploadProgress', [{file : fo, loaded : fo.loaded, total : fo.size}]); }; req.onreadystatechange = function() { var ar; if (req.readyState == 4) { if (req.status == 200) { ar = {file : fo, chunk : chunk, chunks : chunks, response : req.responseText}; up._fireEvent('multiUpload:chunkUploaded', [ar]); if (ar.cancel) { fo.status = 'failed'; up._fireEvent('multiUpload:filesChanged'); up.uploadNext(); return; } loaded += curChunkSize; if (++chunk >= chunks) { fo.status = 'completed'; up._fireEvent('multiUpload:fileUploaded', [{file : fo, response : req.responseText}]); up._fireEvent('multiUpload:filesChanged'); up.uploadNext(); } else uploadNextChunk(); } else up._fireEvent('multiUpload:uploadChunkError', [{file : fo, chunk : chunk, chunks : chunks, error : 'Status: ' + req.status}]); } }; if (chunk < chunks) req.send(fo.blob.slice(chunk * chunkSize, curChunkSize)); }; }); }, _fireEvent : function(ev, ar) { $(this).trigger(ev, ar); } }); } })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.template.ext.js000066600000001443150472426320020602 0ustar00/** * $Id: jquery.template.ext.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ $.template.regx.standard = $.template.regx.ext; $.templateFromScript = function(el, opts) { return $.template($.trim($.translate($(el).html().replace(/()/gi, ''))), opts); }; // Add template helpers $.extend($.template.helpers, { sizefix : function(v) { v = parseInt(v); if (isNaN(v) || v == -1) return ''; // MB if (v > 1048576) return Math.round(v / 1048576, 1) + " MB"; // KB if (v > 1024) return Math.round(v / 1024, 1) + " KB"; return v + " b"; }, encodeURIComponent : function(v) { return encodeURIComponent(v); } }); })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.flash.swf000066600000007113150472426320022006 0ustar00CWS Ax}8Y{Ǒ]s$CO xHH,KD@4I<$ ba`9$VN"ىɮro o}o_7h{@V]wWWUWEG!ǀĚ:!orƗbӡS#vu 纥ͱby}dҥK#s# Pe[Cʩ n fV2eBFXu Ԭf3FKղMf3#c͂[EC̸U, w(;c0s#[C\1so0,Ǩ䮌<d::T6Cӎ M=Ҿ>ut1 =)GJbA,4ŕ0jڱ+9Yw*ÀrQ%kf\F}߁OێdZf,dLzXtLPwTl֮c[Y.+f ?Z1Шlgj5zŴ ܽ)̲6_ܰͨc4.\l&PlSϠweFHvvu ADj2&*uUv*zΰ 0߳96=Fs1z]_5SD>Fp3X^!b~ˤ NEK2d_Du_b>;fVr̺h9ŗkղ&kkI kBL;\|f޹8%7W^IFsx262U[ j, )^fX1XFƬ a.e ǑylF6˷fY0 fa*ǒ+ԍx_ψlW,C*mނ2U7L"_ZJ,5,ǣK3+h:|VTVrc\; `,Ti\)JMKvԧ:ŔtYˎK%C++n#[kWt=w1mk1N4g鹻_li{1mGݏѧ@=|[M#;a؎vҲ+g=*fO4dY5+Dx4$$04f5jV‚~^Ux5ҼYi19,75.vV:۠Mjښ[ev=,EerTW:[;v.u.wd(4AHQ]vD P(TPRAF:  Tjb[(=BiG)mrvQMi(=Ni'(=I^J()=C R0G(D(R(K.PTHKTe_a HaQpM 3f)Ba Baʷ(ܦpʯQx—(|7($)(2L )(RGBBBBKa[Naow@} !@~p'T1A ̟覍pAh/Ko@k _ /q[8 Vg`߯ ""If&&՗j"8 h5; ?`'5]8+Z>Xߠ!?(bfBZH+#@ئGہ $tp9$@W>g{0@ΈmQ a03926FH9K SVG @z/ %~"o Alz С.@?X5ы@iQP:/& HDfHj%ISv-%Z՞DY>}JgVfUHd( mBۻVv_>'焾 uHHQhמ Z˫/k"?K&#1 E&uHӒT%U|bY&8|I#M*bٓtIuQ˓OU7í0BO  /K@Y|X5l^d wrĞ<1$)O.R+FD,7`:=صʏ$Fj97:V ?ĺ옭 BPKP^4:޵b<_޳6=kk%4ܖ8-/{j[t&F oj׽{7vA]c"I57^⪈fl)/bIFRۑ[W"!=/W-L~OjŶ(lnr@Md"k 2QV:yvs/y{1o AQ쌝üX$"(Zy|Xa8ٌz{֘H~~o8YRF#5o&;x!7FD;@ѻNO@(A=]h'F=~k*+hVUv/>ljH}w!J򎔑P -qQ 5 M+iji?/5b_5.n0K%S2 ߁}@nqE㲠Xy,|ea!c)8lAxH|Aw-ħ:5ݠ|MG0Zw¶}58YOkƯ'AS(/״ kPwQo[]GpZ$H}֏1G錏yb(VFQ~Of)V .a B78a?WUj3;w y'P(>Io\_]F)S׮XLK˹K^Z]@~E]~w#A$EwG@E*>_(fKaplugins/imagemanager/pages/im/js/jquery/jquery.scrollto.js000066600000016007150472426320020033 0ustar00/** * jQuery.ScrollTo * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com * Dual licensed under MIT and GPL. * Date: 9/11/2008 * * @projectDescription Easy element scrolling using jQuery. * http://flesler.blogspot.com/2007/10/jqueryscrollto.html * Tested with jQuery 1.2.6. On FF 2/3, IE 6/7, Opera 9.2/5 and Safari 3. on Windows. * * @author Ariel Flesler * @version 1.4 * * @id jQuery.scrollTo * @id jQuery.fn.scrollTo * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. * The different options for target are: * - A number position (will be applied to all axes). * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes * - A jQuery/DOM element ( logically, child of the element to scroll ) * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. * @param {Object,Function} settings Optional set of settings or the onAfter callback. * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. * @option {Number} duration The OVERALL length of the animation. * @option {String} easing The easing method for the animation. * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. * @option {Function} onAfter Function to be called after the scrolling ends. * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. * @return {jQuery} Returns the same jQuery object, for chaining. * * @desc Scroll to a fixed position * @example $('div').scrollTo( 340 ); * * @desc Scroll relatively to the actual position * @example $('div').scrollTo( '+=340px', { axis:'y' } ); * * @dec Scroll using a selector (relative to the scrolled element) * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); * * @ Scroll to a DOM element (same for jQuery object) * @example var second_child = document.getElementById('container').firstChild.nextSibling; * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ * alert('scrolled!!'); * }}); * * @desc Scroll on both axes, to different values * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); */ ;(function( $ ){ var $scrollTo = $.scrollTo = function( target, duration, settings ){ $(window).scrollTo( target, duration, settings ); }; $scrollTo.defaults = { axis:'y', duration:1 }; // Returns the element that needs to be animated to scroll the window. // Kept for backwards compatibility (specially for localScroll & serialScroll) $scrollTo.window = function( scope ){ return $(window).scrollable(); }; // Hack, hack, hack... stay away! // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) $.fn.scrollable = function(){ return this.map(function(){ // Just store it, we might need it var win = this.parentWindow || this.defaultView, // If it's a document, get its iframe or the window if it's THE document elem = this.nodeName == '#document' ? win.frameElement || win : this, // Get the corresponding document doc = elem.contentDocument || (elem.contentWindow || elem).document, isWin = elem.setInterval; return elem.nodeName == 'IFRAME' || isWin && $.browser.safari ? doc.body : isWin ? doc.documentElement : this; }); }; $.fn.scrollTo = function( target, duration, settings ){ if( typeof duration == 'object' ){ settings = duration; duration = 0; } if( typeof settings == 'function' ) settings = { onAfter:settings }; settings = $.extend( {}, $scrollTo.defaults, settings ); // Speed is still recognized for backwards compatibility duration = duration || settings.speed || settings.duration; // Make sure the settings are given right settings.queue = settings.queue && settings.axis.length > 1; if( settings.queue ) // Let's keep the overall duration duration /= 2; settings.offset = both( settings.offset ); settings.over = both( settings.over ); return this.scrollable().each(function(){ var elem = this, $elem = $(elem), targ = target, toff, attr = {}, win = $elem.is('html,body'); switch( typeof targ ){ // A number will pass the regex case 'number': case 'string': if( /^([+-]=)?\d+(px)?$/.test(targ) ){ targ = both( targ ); // We are done break; } // Relative selector, no break! targ = $(targ,this); case 'object': // DOMElement / jQuery if( targ.is || targ.style ) // Get the real position of the target toff = (targ = $(targ)).offset(); } $.each( settings.axis.split(''), function( i, axis ){ var Pos = axis == 'x' ? 'Left' : 'Top', pos = Pos.toLowerCase(), key = 'scroll' + Pos, old = elem[key], Dim = axis == 'x' ? 'Width' : 'Height', dim = Dim.toLowerCase(); if( toff ){// jQuery / DOMElement attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); // If it's a dom element, reduce the margin if( settings.margin ){ attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; } attr[key] += settings.offset[pos] || 0; if( settings.over[pos] ) // Scroll to a fraction of its width/height attr[key] += targ[dim]() * settings.over[pos]; }else attr[key] = targ[pos]; // Number or 'number' if( /^\d+$/.test(attr[key]) ) // Check the limits attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max(Dim) ); // Queueing axes if( !i && settings.queue ){ // Don't waste time animating, if there's no need. if( old != attr[key] ) // Intermediate animation animate( settings.onAfterFirst ); // Don't animate this axis again in the next iteration. delete attr[key]; } }); animate( settings.onAfter ); function animate( callback ){ $elem.animate( attr, duration, settings.easing, callback && function(){ callback.call(this, target, settings); }); }; function max( Dim ){ var attr ='scroll'+Dim, doc = elem.ownerDocument; return win ? Math.max( doc.documentElement[attr], doc.body[attr] ) : elem[attr]; }; }).end(); }; function both( val ){ return typeof val == 'object' ? val : { top:val, left:val }; }; })( jQuery );plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.silverlight.xap000066600000024612150472426320023241 0ustar00PKQ961*MAppManifest.xaml`I%&/m{JJt`$ؐ@iG#)*eVe]f@흼{{;N'?\fdlJɞ!?~|?"ǿ|4_"_El>h޶Gw6yȚUSi;- jzwogݙ}#yѻ޾*wet/b7Mן}AfwoW||Z}Z/bd^7E죽GGq޸/mSw^d uYI(xw#PKyU9g]~'p Upload.dll`I%&/m{JJt`$ؐ@iG#)*eVe]f@흼{{;N'?\fdlJɞ!?~|?"?_ukׯ!?7=7]~]_?M:[ltz闯E5ǿon k<5  g刺3kE9_=]6?~kƟkoD?zI_7 o{]K?#icͼ0zk(ny=:/kAvOO~GϏ=?z~Gϗ_uէƯ_5{Ư?~_Hدz֯kzoAn G5EkzkZNG o/E~ǝ_ſ[}۫_mߞu߁~V#SS;ߙI~קߐ~Z4&[ >V^gҿV?~]@535u)wk'hFxZ:k&k|Z/V߮cկ_Ͷ~7o Z:kmBͯWoUBk5ӏ_k!;֯A#Fc16 %fɯ} ~_E77`_XFok%-jkwNdm~ꎇoV{K~ש~OoTGh7o1ܻ=?Ap}p: pztڃ'}ieJLCV[o[zo6kzm5_?+ol/{?3_C'yRCv~$~7mof7qnݧ6~CFolf$~__7g~7u_K_o%_zo/G_zo'_o/O__~ oVmo _ ֿA) oVB߀<@ϩϭ_ת_1}ׂX~Z>_?IB>c$q_נא'uvPfb?{~_B\zί[>I&o%֧<[񛿑Q}xPtuL_+IG'ݮV=:zrkZ7[ZZ{_<7~=|_<7~}|_<[7~|[_<S~Ϙ_*z/1 Ўv_|  ^5KaxjЬ 7`b~C7Ə_k+{['5*~oO_ǯK~}g:msC2նnoI݁7~B>tm_ϡŨ_kt'2:ޯ:/]~?Q~.ċ/D'-oH`_y%՞~ȷ15>)-(3ׯCF7vc0_Luv_Zu~1_%rѯI?xց &KK}_נkF v>e&e:~W#~7qws }Tṿ{~ǝ_'-^{!b=_뗠kWc֎? x~~_㏧Y5aX~ f ?1-qoZ $~^翐z?fo{g#0_7L>(~_P'cɯ۠G{7-g_0o///I11ۯz ^5V:_ׯ~R/7 Υ_~_7~$xC@M X~~{ч^U_П7O(~~/&ׯ*y&&?IK߂%y߅෥Z_Ka_ aiߎ~^{Bscȁ%>P_{(19/UX)'7x]Od_>2ߨ!N~ ~ z_뗠%M›ʯa4毱kc0?-u+3 waܾsNmT!}kwD:ƟLsNC0|rkk ߈^)7я"X! d~J?g5> _EZA~5Voch7߮C׫~_mS@(ssHQt(%)d~Frȯ'`kp4cf___?x77HDZ7 h:?K@~~'>װQ ׯ2|Un1qϯ>n߆6o+vaWx@?]s1O~{w;C~ۛmb(?_n|1~7պUz.iUdd^7EloFɺlu2_uVҗIYLM6_~6y ?{w^"7[0 SWZ?Yk~ůQŊ5r#jEe- 7N~ݢ\6}4oգw<_dxQL목Zܽ*|z](ɗ-xNʬZU6j>N۩(iY4kvki_e̫u9K'y:ϋ%5u>NC߿kjZuUz/>tyq1o?h`#ѯw]\<؃#7~_k#ۺX^4hKG,W?#G?)}Rn?Xow؏;k5~qTn}$7I?p_15^kߙ7F?_ɯ7ѿޯ/o~ӿɯolI535+nF ~ #:1K~ ÷?c/O~6/|g:6H7m~=75%ZѿH-_h7A }Fbd~M7yi>_)c~_~-z[sk}Oп_@P~k17_ ௿_75&!|8Fw!k|_KKw5~7_S5ם_+>5~o5' ~-P~Z?I53C_k;xw3ҿ鯽__~_毱Oz}_0z?֯k+?kwW#㟴pxזo_?;5!S7"5kZ_9]wRKZ'轻?$ǯW_넲ԏ_}cWk}$ӿVok/&M~C# f*M~?w75$}c4_%K'O\gp)gok׮[돢~_W_}M[},kl_Ro_?607/~?ӿ{oӿ_~~_",rT~ߍ~ 诗oO_w_=uNklO?_ouE5~u ] /`|zOO {~`?A0/y~{Yޑ޿k{ Z_{=!/޽owD&=F _O5_:ޯ<(o~كկy޿{=u$f=oNw~?_22SÿCx?&~FO aw?'wOyׯq\5Dҿ ZS.=_k?߿?3~]_l?5΃scou_'RL޿7+?aޥƯk.?7?ֿ_k˅m5o'^ _kLL~k*ckBد_75?5w7xkد|ko_o;ѿ?AD/ _ίys_s;ůG~Ko=o'?kΟkVDό~?k/hLjc?o_sk|z>>ݯ[/_s_5__I^FkUɔߞqMX'?#23֝_?H_ 0_kߒ?_7S-_/ã_1_oZůK>#Fԯ~777~_~-~77/_7N ~m~㿆ߖ|oZcZMwg ZMdFwx_35_ע_㷢?kƯ__Ϡ?5AnJk"G#Ɵkg:/ѯҿu~݄&/] T~-ף~~>g7 ףO~{"'|~7#@BlsDZAEoJ Uk<9~Ssk&x~Ϳ~~u_iאѯ ?M~g췍C{E uhסQ::4__F:4_-%/ٺ̏~ M[נdk k<+JJSf9/wE>fuQ^攇Xˏj*6vym>o_uU?^cKJהO}ɼYu` &kjYR0+j_Orie~zO۪5^YݮW/W9lvn{kPω8[mrгZ7f'UYR3<_u15AV_{9fk4I5뚦gA/i]ZELgE~9x}ɗū|Q]Ig48ɈJ4/~ 2[ƚ. ưٗg(~f^Sbr:e&-&: }l~-F~&SƉ&ӿF6jU/EMF{6cfh٘_ eyA˗˳//4|Aƿ1K[B_ΛҔy8rMҧ qmNQ~ښ –dΖ5}I~Q,L B8~A1g'IVmVr77K@2VP iWY-_EӒjߎ:>n);Y}I6[zEx_3C Ȱh.~ˬ\տFBU"W3bYM-KMo]yMM_:zʖX'a<_~yKxfl3>#뼾,-'|]u-tLKi],C#" Hͭ2Ȃhį2{ǿ5nIQGr  `l+ʨokX[˾P%zeh$3Z,q3dkP_ ܦoi@kD%BUO.JvCX#~Q=PyAF̛=3H|b0qs5NE^ ")%gUC .kcM~L|'{O)G5ryqO/Wo?ІDX@џdr!MáƟ[ RaxL _C~1mV,Z@p&`[}m?k|y/2$' N:#s1>OYoD0^|8! ւ ە)Z/[$R`~G W?5V9kRWR| 6L_ˊmۇmho>^y>kfoWթR_ck߯dA% 7GW d_>5[\7_!E7"ƵN xGXF3@ PxHYv߽XQTʡe@]mF7$+~h [a̋qm)l}%>oL_lQկqE(~V#? kܿKME-fɔ~['c*,RaC-_cMF{~ߟVO_N)c ݆ZNhk~N?{Z9ƝngLMenqAko֯ǻNxv;vx%_d×o gt{I=i} ]Xb靖)*0 KZ<`*_R@|XhQ+˻ཚ:w3^<ݯk}o?}_} ~௼_K_w-~{;ZޯzoZoZokzockֿk&ɯŝ_M7_/7 ~-~jMk̿.uo[oo;o)2z%5~߀-wG&n;voq~'dK?ٲBHZ:ȶ_ kz_PEѴ@/'S7_> :Z>Ak?/}~MD4ίk_wMh>- 7- w-5Zo;N@7_okw__'ί2/*j$k)8~_wu߀~ ?Z҈o{Rb?~!J-RO7s5㯟o[{HoZDC ~_4k.;NTD,$.gZIJTV&-lX#u5Ylg;Ư;Ưpl~k6߭[65odI/O5^~O?ӿ?~y_%_c%׾]'UMﻘ.%|O_M=} Wd~PO?f_/h{k'yӲ9'߿~ kɯAkI\Ϸkfާߟ=5^ogEg;/cVa[$Y^gd3[oی=T~?_@Zq1 ȇY^5! ,ccoakPư [V'X$@~MmPƔ>5?3IMyl`'k`N⦅do;7g}VFo:l}cXD|\ %V5"_MGPߓRڿy#;L'g읷gTϏkMGϏ=?z~GCͯQj/?z~GϏ=?z~GϏ PKQ961*MAppManifest.xamlPKyU9g]~'p XUpload.dllPKv(plugins/imagemanager/pages/im/js/jquery/jquery.imageutils.js000066600000005275150472426320020342 0ustar00/** * $Id: jquery.imageutils.js 466 2008-10-15 14:54:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.ImageUtils = function(ta) { var t = this, d = document, ss; ta = $(ta); t.target = ta; if ($.browser.msie) { // Add VML namespace and stylesheets on IE d.namespaces.add("v", "urn:schemas-microsoft-com:vml"); ss = d.createStyleSheet(); ss.cssText = "v\\:*{behavior:url(#default#VML);display:inline-block;margin:0;padding:0}"; } else { ta.after(''); t.canvas = document.getElementById('editImageCanvas'); t.context = t.canvas.getContext('2d'); } }; $.extend($.ImageUtils.prototype, { render : function() { var t = this; t.img = new Image(); $(t.img).load(function() { if (t.canvas) { t.canvas.width = t.img.width; t.canvas.height = t.img.height; $(t.canvas).css({width : t.img.width, height : t.img.height}).show(); t.context.drawImage(t.img, 0, 0); } else t.target.after(''); t.target.hide(); $(t).trigger('ImageUtils:load'); }); t.img.src = t.target.attr('src'); }, flip : function(d) { var t = this, ctx = t.context; if (!t.canvas) { $('#editImageVML').css('flip', d == 'h' ? 'x' : 'y'); return; } if (d == 'h') { ctx.save(); ctx.scale(-1, 1); ctx.drawImage(t.img, -t.img.width, 0); ctx.restore(); } else { ctx.save(); ctx.scale(1, -1); ctx.drawImage(t.img, 0, -t.img.height); ctx.restore(); } }, rotate : function(a) { var t = this, img = t.img, can = t.canvas, ctx = t.context, rad = a * Math.PI / 180; if (!t.canvas) { $('#editImageVML').attr('rotation', a); return; } ctx.save(); switch(a) { case 90: can.width = img.height; can.height = img.width; ctx.rotate(rad); ctx.drawImage(img, 0, -img.height); $(t.canvas).css({width : img.height, height : img.width}); break; case 180: can.width = img.width; can.height = img.height; ctx.rotate(rad); ctx.drawImage(img, -img.width, -img.height); break; case 270: can.width = img.height; can.height = img.width; ctx.rotate(rad); ctx.drawImage(img, -img.width, 0); break; } ctx.restore(); $(t.canvas).css({width : can.width, height : can.height}); }, destroy : function() { var t = this; if (t.canvas) $(t.canvas).remove(); else $('#editImageVML').remove(); t.target.show(); } }); })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.i18n.js000066600000002445150472426320016752 0ustar00/** * $Id: jquery.i18n.js 479 2008-10-20 09:00:59Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function xmlEncode(s) { return s ? ('' + s).replace(new RegExp('[<>&"\']', 'g'), function (c, b) { switch (c) { case '&': return '&'; case '"': return '"'; case '\'': return '''; // ' is not working in MSIE case '<': return '<'; case '>': return '>'; } return c; }) : s; }; $.translate = function(s, e, va) { return s.replace(/\{#([^\}]+)\}/g, function(a, b) { var pa = b.split(/\./); if (MCManagerI18n[pa[0]]) a = MCManagerI18n[pa[0]][pa[1]]; a = a ? a : '{#' + b + '}'; if (va) { a = a.replace(/\{([^\}]+)\}/g, function(a, b) { return va[b] || a; }); } return e ? xmlEncode(a) : a; }); }; $.translateElement = function(e) { e = e || document.body; e.innerHTML = $.translate(e.innerHTML.replace(/=({#[a-z0-9_]+})/gi, '="$1"'), 1); }; document.title = $.translate(document.title.replace(/^(http|https):\/\/[a-z0-9._\-\s]+-/gi, '')); $('body > *').each(function(i, v) { if (!/(SCRIPT|BR|HR|INPUT|META|IMG|LINK|PARAM|IFRAME)/.test(v.nodeName)) $.translateElement(v); }); })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.domutils.js000066600000002060150472426320020024 0ustar00/** * $Id: jquery.domutils.js 460 2008-10-14 16:06:43Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.extend({ createElm : function(n, a, h) { n = $(document.createElement(n)); n.attr(a).html(h); return n; }, appendElements : function(te, ne) { var i, n; if (typeof(ne) == 'string') te.appendChild(document.createTextNode(ne)); else if (ne.length) { te = te.appendChild($.createElm(ne[0], ne[1])[0]); for (i=2; i)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
    "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
    ","
    "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
    ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();plugins/imagemanager/pages/im/js/jquery/jquery.dialog.status.js000066600000006157150472426320020760 0ustar00/** * $Id: jquery.dialog.status.js 552 2008-11-03 12:32:05Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.StatusWindow = function(f, a) { var t = this; t.isIE6 = /MSIE [56]/.test(navigator.userAgent); f = $.extend({ type : 'status', width : 400, height : 240, onaction : function(a) { if (a == 'ok') t.close(); } }, f); $.Window.call(t, f, a); }; $.extend($.StatusWindow.prototype, $.Window.prototype, { setContent : function(co) { var v, k, h = ''; if (typeof(co) != 'string') { // Build string $(co).each(function(i, v) { h += '
    ' + '
    ' + v.title + '
    ' + '
    ' + v.content + '
    ' + '
    '; }); } $('#' + this.id + '_statuscont').html(h || co); return this; }, render : function() { var t = this, f, v; $.Window.prototype.render.call(t); $.Window.prototype.setContent.call(t, '
    ' + '' + $.WindowManager.i18n.ok + '' ); f = t.features; if (v = f.content) t.setContent(v); return t; } }); if (!$.CurrentWindowManager) { $.extend($.WindowManager, { status : function(f, cb) { var t = this, w; f = $.extend({ onaction : function(a) { if (a == 'ok') { w.close(); if (cb) cb.call(t, 1); } else if (a == 'close') w.close(); } }, f); w = new $.StatusWindow(f).render(); t.windows.push(w); return w.focus(); }, showProgress : function(f) { var t = this, bl, id = 'progressWindow'; t.hideProgress(); t.progress = 1; f = $.extend({ theme : 'clearlooks2', x : -1, y : -1 }, f); bl = $('#windowManProgressEventBlocker'); if (!bl[0]) { $(document.body).append($.createElm('div', {id : 'windowManProgressEventBlocker', 'class' : f.theme + '_event_blocker'}).addClass(f.theme + '_visible_event_blocker')); bl = $('#windowManProgressEventBlocker'); } bl.show().css('z-index', t.zIndex++).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); $(document.body).appendAll( ['div', {id : id, 'class' : f.theme + '_progress'}, ['div', {id : id + '_msg', 'class' : 'message'}] ] ); $('#' + id + '_msg').html(f.message); $('#' + id).css({left : -1000, top : -1000}).show(); // Center window if (f.x == -1) f.x = Math.round(($.winWidth() / 2) - ($('#' + id).width() / 2)); if (f.y == -1) f.y = Math.round(($.winHeight() / 2) - ($('#' + id).height() / 2)); $('#' + id).css({left : f.x, top : f.y}); $(t).bind('WindowManager:open', function() {t.hideProgress();}); }, hideProgress : function() { var t = this; if (t.progress) { $('#progressWindow').remove(); $('#windowManProgressEventBlocker').hide(); $(t).unbind('WindowManager:open', t.hideProgress); t.progress = 0; } } }); } })(jQuery);plugins/imagemanager/pages/im/js/jquery/jquery.multiupload.flash.expressinstall.swf000066600000001405150472426320025063 0ustar00CWSAxTO@uw-ע!1J 5 Y@l;@6ܳr⸉!F7vqB(3)Ka0.1`ziE9&/ h 1ms-1K;yeJ& J x7BP>h-3ˡG=1''7 {aI߱YO]uJsGюB'IE"x].楰:1Tq*;hR'-+HЪ ʚ\E&W%pRNi 24l79IW|6'm&j}qb3VZMQzvڂ̯$бmK"{>*<plugins/imagemanager/pages/im/js/view.js000066600000014007150472426320014305 0ustar00(function($){ window.ViewDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; t.args = args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); // Compile templates t.singeViewTpl = $.templateFromScript('#singleview_template'); t.mpgTpl = $.templateFromScript('#mpg_template'); t.rmTpl = $.templateFromScript('#rm_template'); t.movTpl = $.templateFromScript('#mov_template'); t.dcrTpl = $.templateFromScript('#dcr_template'); t.footerFullTpl = $.templateFromScript('#single_footer_full'); t.footerNoEditTpl = $.templateFromScript('#single_footer_no_edit'); t.footerSimpleTpl = $.templateFromScript('#single_footer_simple'); $('#prev').click(function(e) { if (!$(e.target).hasClass('disabled')) t.getMediaInfo(t.prevMedia); }); $('#next').click(function(e) { if (!$(e.target).hasClass('disabled')) t.getMediaInfo(t.nextMedia); }); $('#gallery').click(function(e) { if (!$(e.target).hasClass('disabled')) t.currentWin.close(); }); $('#singlefooter').click(function(e) { var el = e.target, a = el.nodeName == 'A' ? el : $(el).parents('a')[0]; if (a) { a = $(a); if (a.attr('id') == 'deleteit' && !a.hasClass('disabled')) t.deleteFile(t.path); if (a.attr('id') == 'edit' && !a.hasClass('disabled')) t.editFile(t.path); } }); $().keydown(function(e) { switch (e.keyCode) { case 32: // space case 110: // n case 34: // page down case 39: // right arrow case 40: // down arrow t.getMediaInfo(t.nextMedia); break; case 102: // p case 33: // page up case 37: // left arrow case 38: // up arrow t.getMediaInfo(t.prevMedia); break; case 27: // Esc t.currentWin.close(); break; } }); $(window).bind('resize', function() { t.resizeView(); }); $('#singlecontent').click(function(e) { if (e.target.nodeName == 'IMG' && $(e.target).hasClass('viewimage')) { if (args.onselect) { RPC.insertFile({ relative_urls : args.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : args.remove_script_host || args.no_host, path : t.path, progress_message : $.translate("{#message.insert}"), insert_filter : args.insert_filter, oninsert : function(o) { args.onselect(o); t.currentWin.close(); } }); } else t.currentWin.close(); } }); t.getMediaInfo(args.path); focus(); }, getMediaInfo : function(p) { var t = this; t.path = p; RPC.exec('im.getMediaInfo', {path : p}, function (data) { var res, row, tpl, footTpl; res = RPC.toArray(data.result); row = res[0]; t.nextMedia = row.next; t.prevMedia = row.prev; if (!row.next) $('#next').addClass('disabled'); else $('#next').removeClass('disabled'); if (!row.prev) $('#prev').addClass('disabled'); else $('#prev').removeClass('disabled'); footTpl = t.footerSimpleTpl; switch (row.type) { case "jpg": case "jpeg": case "gif": case "png": case "bmp": tpl = t.singeViewTpl; footTpl = t.footerFullTpl; break; case "mpg": case "mpeg": case "wma": case "wmv": case "asf": case "avi": tpl = t.mpgTpl; break; case "qt": case "mov": tpl = t.movTpl; break; case "rm": case "ram": tpl = t.rmTpl; break; case "dcr": tpl = t.dcrTpl; break; case "swf": var so = new SWFObject("../../stream/index.php?cmd=im.streamFile&path="+ escape(row.path), "swfMovie", row.width, row.height, "7", "#FFFFFF"); so.addParam("quality", "high"); so.addParam("scale", "showall"); so.addParam("wmode", "transparent"); so.write("singlecontent"); $('#singlefooter').html(t.footerNoEditTpl, row); return; case "flv": var so = new SWFObject("flvplayer/flvPlayer.swf", "flvPlayer", row.width, row.height, "8", "#FFFFFF"); so.addVariable("flvToPlay", "../../../stream/index.php?cmd=im.streamFile%26path=" + escape(row.path)); so.addVariable("hiddenGui", "false"); so.addVariable("showScaleModes", "true"); so.addVariable("autoStart", "false"); so.addParam("allowFullScreen", "true"); so.write("singlecontent"); $('#singlefooter').html(t.footerNoEditTpl, row); return; } $('#singlecontent').html(tpl, row); $('#singlefooter').html(footTpl, row); if (row.custom) { if (!row.custom.editable) $('#singleview .editsingle a.edt').addClass('disabled'); else $('#singleview .editsingle a.edt').removeClass('disabled'); } t.resizeView(); }); }, resizeView : function() { $('#singleimg').css({'width' : $.winWidth() - 60, 'height' : $.winHeight() - 100}); }, deleteFile : function(p) { var t = this; $.WindowManager.confirm($.translate('{#view.confirm_delete}'), function(s) { if (s) { if (!t.isDemo()) { RPC.exec('im.deleteFiles', {path0 : p}, function (data) { var args; if (!RPC.handleError({message : '{#error.delete_failed}', visual_path : t.args.visual_path, response : data})) { if (t.args.ondelete) t.args.ondelete(p); if (t.nextMedia) t.getMediaInfo(t.nextMedia); else if (t.prevMedia) t.getMediaInfo(t.prevMedia); else t.currentWin.close(); } }); } } }); }, editFile : function(p) { var t = this; $.WindowManager.open({ url : 'edit.html' }, { is_demo : t.args.is_demo, path : p, visual_path : this.visualPath, onsave : function() { t.getMediaInfo(t.path); } }).maximize(); }, isDemo : function() { if (this.args.is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function(e) { ViewDialog.init(); }); })(jQuery); plugins/imagemanager/pages/im/js/createdir.js000066600000005075150472426320015302 0ustar00(function($){ window.CreateDirDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args, cleanNames; args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); // Add templates RPC.exec('im.getConfig', {path : args.path}, function(data) { var config = data.result, templates = [], tpl; if (!RPC.handleError({message : 'Get config error', visual_path : t.visualPath, response : data})) { cleanNames = config['filesystem.clean_names'] == "true"; $(config['filesystem.directory_templates'].split(/,/)).each(function(i, v) { if (v) { v = $.trim(v).split('='); templates.push({name : /([^\/]+)$/.exec(v[0])[0], value : v[1] || v[0]}); } }); if (config['filesystem.force_directory_template'] == "true") { $('#template').html(''); if (templates.length == 1) $('#templaterow').hide(); } if (templates.length == 0) $('#templaterow').hide(); tpl = $.templateFromScript('#template_template'); $(templates).each(function(i, v) { $('#template').append(tpl, v); }); $('#content').show(); $('#createin').html(args.visual_path); $('form').submit(function() { var tpl = $('#template').val(), name = $('#dirname').val(); if (cleanNames) name = $.cleanName(name); if (!t.isDemo()) { RPC.exec('im.createDirs', {path : args.path, name0 : name, template0 : tpl}, function(data) { var res = RPC.toArray(data.result), s = t.currentWin.getArgs(); if (!RPC.handleError({message : '{#error.createdir_failed}', visual_path : args.visual_path, response : data})) { // Insert file if (s.oncreate) { RPC.insertFile({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, path : res[0].file, progress_message : $.translate("{#message.insert}"), insert_filter : s.insert_filter, oninsert : function(o) { s.oncreate(o); t.currentWin.close(); } }); } } }); } return false; }); $('#cancel').click(function() {t.currentWin.close();}); } }); }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function() { CreateDirDialog.init(); }); })(jQuery); plugins/imagemanager/pages/im/js/utils/swfobject.js000066600000015340150472426320016462 0ustar00/** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;plugins/imagemanager/pages/im/js/utils/basemanager.js000066600000002060150472426320016734 0ustar00/** * $Id: basemanager.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { window.BaseManager = { currentWin : $.WindowManager.find(window), path : '{default}', visualPath : '', files : [], selectedFiles : [], focusedFile : null, demoMode : false, disabled : {}, specialFolders : [], getFile : function(id) { var o; $(this.files).each(function() { if (this.id == id) o = this; }); return o; }, setDisabled : function(v, st) { this.disabled[v] = st; if (st) $('#' + v).addClass('disabled').addClass('deactivated'); else $('#' + v).removeClass('disabled').removeClass('deactivated'); }, isDisabled : function(v) { return this.disabled[v] ? this.disabled[v] : 0; }, addSpecialFolder : function(o) { this.specialFolders.push(o); }, isDemo : function() { if (this.demoMode) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; })(jQuery); plugins/imagemanager/pages/im/js/utils/fixpng.js000066600000002403150472426320015763 0ustar00var PNG = { isOldIE : navigator.userAgent.indexOf('MSIE 5') > 0 || navigator.userAgent.indexOf('MSIE 6') > 0, transparentImg : 'img/transparent.gif', transparentBGImg : '../img/transparent.gif', fix : function(e) { var rs, cs, b, o; // Remove behavior to prevent memory leaks e.runtimeStyle.behavior = "none"; // Check browser version if (!this.isOldIE) return; // Use old PNG src if (e.png_src) e.src = e.png_src; // Is PNG image if (e.src && e.src.toLowerCase().indexOf('.png') > 0) { e.png_src = e.src; e.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + e.src + "', sizingMethod='scale')"; e.src = this.transparentImg; } cs = e.currentStyle; b = cs.backgroundImage; // Has PNG background if (b && b.toLowerCase().indexOf('png') > 0) { rs = e.runtimeStyle; b = b.replace(/url\(\"([^"]+)\"\)/g, "$1"); o = rs["background-position"]; if (!cs.hasLayout) rs.display = 'inline-block'; rs.backgroundImage = 'url(\'' + this.transparentBGImg + '\')'; rs.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + b + "', sizingMethod='crop')"; rs["background-position"] = o; } // Remove referenced to prevent memory leaks rs = cs = b = o = e = null; } }; plugins/imagemanager/pages/im/js/utils/domain.js000066600000000727150472426320015746 0ustar00/** * $Id: domain.js 505 2008-10-23 12:34:12Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function(){ try { var li = document.location.search.replace(/\?/, '').split('&'), query = {}, i; for (i = 0; i < li.length; i++) { it = li[i].split('='); query[unescape(it[0])] = unescape(it[1]); } if (query.domain) document.domain = query.domain; } catch (ex) { // Ignore } })(); plugins/imagemanager/pages/im/js/utils/tinymce.js000066600000001723150472426320016144 0ustar00/** * $Id: tinymce.js 599 2008-11-19 12:26:03Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ var w, ed, wm, args = {}; window.focus(); // try { w = opener || parent; // Check mcFileManager if (w.mcImageManager) args = w.mcImageManager.windowArgs; // Check TinyMCE if (w.tinyMCE && (ed = w.tinyMCE.activeEditor)) { if (ed && (wm = ed.windowManager)) { if (wm.params) args = wm.params; if (wm.setTitle) wm.setTitle(window, document.title); } } /* } catch (ex) { }*/ if (!$.CurrentWindowManager) { // Add default window and add some methods to it $.WindowManager.defaultWin = { getArgs : function() { return args; }, close : function() { // Restore selection if (ed && wm.bookmark) ed.selection.moveToBookmark(wm.bookmark); if (wm) wm.close(window); else window.close(); } }; } })(jQuery); plugins/imagemanager/pages/im/js/utils/rpc.js000066600000007274150472426320015267 0ustar00/** * $Id: rpc.js 558 2008-11-05 15:54:42Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ window.RPC = { pageBaseURL : document.location.href.replace(/[^\/]+$/, ''), init : function() { $().ajaxError(function(e, req, se) { if (req.status) $.WindowManager.status({title : "The server response wasn't JSON format", content : req.responseText}); }); }, toArray : function(res) { var fl = []; if (res && res.data && res.columns) { $(res.data).each(function(i) { var o = {index : i}; $(this).each(function(i, v) { o[res.columns[i]] = v; }); fl.push(o); }); } return fl; }, exec : function(m, ar, cb) { // Make RPC call $.post(RPC.pageBaseURL + '../../rpc/index.php', { json_data : $.toJSON({ "method" : m, "params" :[ar], "id" : "c0" }) }, cb, "json" ); }, handleError : function(args) { var t = this, errors, res = args.response.result, err = args.response.error; if (err) { if (err.level == 'AUTH') { if (res.login_url.indexOf('return_url') != -1) document.location = res.login_url; else if (res.login_url.indexOf('://') == -1) document.location = "../../" + res.login_url + "?return_url=" + escape(document.location); else document.location = res.login_url + "?return_url=" + escape(document.location); return true; } $.WindowManager.info($.translate(err.errstr)); return true; } else { errors = []; $(this.toArray(res)).each(function(i, r) { var root; if (r.status && r.status.toLowerCase() != 'ok') { root = args.visual_path || '/'; root = root.substring(1); root = args.visual_path.replace(/^\/([^\/]+)\/.*$/, '$1'); if (r.fromfile != undefined) { r.fromfile = r.fromfile.replace(/\{[0-9]+\}/, root); r.tofile = r.tofile.replace(/\{[0-9]+\}/, root); errors.push({title : r.fromfile + " -> " + r.tofile, content : $.translate(r.message)}); } if (r.file != undefined) { r.file = r.file.replace(/\{[0-9]+\}/, root); r.file = r.file.replace(/\/+/, '/'); errors.push({title : r.file, content : $.translate(r.message)}); } } }); if (errors.length) { $.WindowManager.status({title : $.translate(args.message), content : errors}); return true; } } }, insertFiles : function(s) { var t = this, args = {}; $(s.paths).each(function(i, v) { args['path' + i] = v; }); if (s.progress_message) $.WindowManager.showProgress({message : s.progress_message}); RPC.exec('im.insertFiles', args, function (data) { var o = {files : []}; $.WindowManager.hideProgress(); $(RPC.toArray(data.result)).each(function(i, v) { var u = v.url; if (s.relative_urls) u = $.parseURI(s.document_base_url || s.default_base_url).toRelative(u); else if (s.document_base_url) u = $.parseURI(s.document_base_url).toAbsolute($.parseURI(u).getURI(1), s.no_host); v = { name : v.name, path : v.path, url : u, size : v.size, type : v.type, created : v.created, modified : v.modified, attribs : v.attribs, custom : $.extend({}, v.custom) }; o.files.push(v); }); if (s.oninsert) { if (s.insert_filter) { $(o.files).each(function(i, f) { s.insert_filter(f); }); } s.oninsert(o); } }); }, insertFile : function(s) { var ins = s.oninsert; s.paths = [s.path]; s.oninsert = function(o) { o.file = o.files[0]; ins.call(this, o); }; this.insertFiles(s); } }; RPC.init(); })(jQuery); plugins/imagemanager/pages/im/js/utils/gears_init.js000066600000006452150472426320016624 0ustar00// Copyright 2007, Google Inc. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // 3. Neither the name of Google Inc. nor the names of its contributors may be // used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Sets up google.gears.*, which is *the only* supported way to access Gears. // // Circumvent this file at your own risk! // // In the future, Gears may automatically define google.gears.* without this // file. Gears may use these objects to transparently fix bugs and compatibility // issues. Applications that use the code below will continue to work seamlessly // when that happens. (function() { // We are already defined. Hooray! if (window.google && google.gears) { return; } var factory = null; // Firefox if (typeof GearsFactory != 'undefined') { factory = new GearsFactory(); } else { // IE try { factory = new ActiveXObject('Gears.Factory'); // privateSetGlobalObject is only required and supported on WinCE. if (factory.getBuildInfo().indexOf('ie_mobile') != -1) { factory.privateSetGlobalObject(this); } } catch (e) { // Safari if ((typeof navigator.mimeTypes != 'undefined') && navigator.mimeTypes["application/x-googlegears"]) { factory = document.createElement("object"); factory.style.display = "none"; factory.width = 0; factory.height = 0; factory.type = "application/x-googlegears"; document.documentElement.appendChild(factory); } } } // *Do not* define any objects if Gears is not installed. This mimics the // behavior of Gears defining the objects in the future. if (!factory) { return; } // Now set up the objects, being careful not to overwrite anything. // // Note: In Internet Explorer for Windows Mobile, you can't add properties to // the window object. However, global objects are automatically added as // properties of the window object in all browsers. if (!window.google) { google = {}; } if (!google.gears) { google.gears = {factory: factory}; } })(); plugins/imagemanager/pages/im/js/edit.js000066600000022067150472426320014265 0ustar00(function($){ window.EditDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; args = t.args = $.extend({ path : '{0}', visual_path : '/' }, t.currentWin.getArgs()); if (t.currentWin.features) { t.currentWin.features.onbeforeclose = function() { // Temp file exists, ask to save if (t.imgPath != t.targetPath) { $.WindowManager.confirm($.translate('{#edit_image.confirm_no_save}'), function(s) { if (s) t.currentWin.close(); }); return false; // Block close } }; } $(window).bind('resize', function(e) { t.resizeView(); }); t.imageSelection = $.createImageSelection($('#editImage'), { scroll_container : $('#imageWrapper'), delta_x : 26 + ($.browser.msie ? 2 : 0), delta_y : 90 + ($.browser.msie ? 2 : 0) }); $(t.imageSelection).bind('imgselection:change', function(e, x, y, w, h) { var f = document.forms[0]; if (this.mode == 'resize') { f.resize_w.value = w; f.resize_h.value = h; } else { f.crop_x.value = x; f.crop_y.value = y; f.crop_w.value = w; f.crop_h.value = h; } }); t.loadImage({path : args.path, url : args.url, initial : 1}); t.resizeView(); $(['save', 'revert', 'crop', 'resize', 'flip', 'rotate']).each(function(i, v) { var a = $('#' + v); a.click(function() { if (!a.hasClass('disabled') && !a.hasClass('active')) { t[v](); $('div.panel').hide(); $('#' + v + '_tools').show(); a.addClass('active'); } }); }); $('a.apply').click(function(e) {t.apply();}); $('a.cancel').click(function(e) {t.cancel();}); }, apply : function() { }, cancel : function() { $('div.panel').hide(); $('#toolbar a').removeClass('active'); this.imageSelection.setMode('none'); if (this.imgUtils) { this.imgUtils.destroy(); this.imgUtils = null; } $.WindowManager.hideProgress(); }, save : function() { var t = this, f = document.forms[0]; f.save_filename.value = t.targetPath.substring(t.targetPath.lastIndexOf('/') + 1); t.apply = function() { // Get replace mode RPC.exec('im.getConfig', {path : t.imgPath}, function(data) { var config = data.result, f = document.forms[0]; if (!RPC.handleError({message : 'Get config error', visual_path : t.args.visual_path, response : data})) { if (config['filesystem.clean_names'] == "true") $('#save_filename').val($.cleanName($('#save_filename').val())); $.WindowManager.showProgress({message : $.translate("{#edit_image.saving_wait}")}); RPC.exec('im.saveImage', {path : t.imgPath, target : $('#save_filename').val()}, function(data) { var res; $.WindowManager.hideProgress(); if (!RPC.handleError({message : 'Save error', visual_path : t.args.visual_path, response : data})) { res = RPC.toArray(data.result); if (t.args.onsave) return t.insertFile(res[0].file); if (res.length > 0) t.loadImage({path : res[0].file, initial : 1}); $('#save,#revert').addClass('disabled'); t.cancel(); } }); } }); }; }, revert : function(e) { var t = this; $.WindowManager.confirm($.translate("{#edit_image.confirm_revert}"), function(s) { if (s) { $('#save,#revert').addClass('disabled'); t.loadImage({path : t.targetPath}); } }); }, resize : function() { var t = this, f = document.forms[0]; t.cancel(); t.imageSelection.setMode('resize'); t.imageSelection.proportional = f.resize_prop.checked; $(f.resize_prop).click(function() { t.imageSelection.proportional = f.resize_prop.checked; }); $('#resize_tools input[@type=text]').change(function(e) { if (f.resize_prop.checked) { if (e.target.id == "resize_w") f.resize_h.value = Math.round(t.imageSelection.h * (parseInt(f.resize_w.value) / t.imageSelection.w)); else f.resize_w.value = Math.round(t.imageSelection.w * (parseInt(f.resize_h.value) / t.imageSelection.h)); } t.imageSelection.setRect(0, 0, parseInt(f.resize_w.value), parseInt(f.resize_h.value)); }); t.apply = function() { $.WindowManager.showProgress({message : $.translate('{#edit_image.please_wait}')}); t.execRPC('im.resizeImage', {path : t.imgPath, width : f.resize_w.value, height : f.resize_h.value, temp : true}, '{#error.resize_failed}'); }; }, crop : function() { var t = this, f = document.forms[0]; t.cancel(); t.imageSelection.setMode('crop'); t.imageSelection.proportional = f.crop_prop.checked; $(f.crop_prop).click(function() { t.imageSelection.proportional = f.crop_prop.checked; }); $('#crop_tools input[@type=text]').change(function(e) { if (f.crop_prop.checked) { if (e.target.id == "crop_w") f.crop_h.value = Math.round(t.imageSelection.h * (parseInt(f.crop_w.value) / t.imageSelection.w)); else f.crop_w.value = Math.round(t.imageSelection.w * (parseInt(f.crop_h.value) / t.imageSelection.h)); } t.imageSelection.setRect(parseInt(f.crop_x.value), parseInt(f.crop_y.value), parseInt(f.crop_w.value), parseInt(f.crop_h.value)); }); t.apply = function() { $.WindowManager.showProgress({message : $.translate('{#edit_image.please_wait}')}); t.execRPC('im.cropImage', {path : t.imgPath, left : f.crop_x.value, top : f.crop_y.value, width : f.crop_w.value, height : f.crop_h.value, temp : true}, '{#error.crop_failed}'); }; }, flip : function() { var t = this, f = document.forms[0], axis; $('#flip_tools input').attr('checked', ''); t.cancel(); t.imageSelection.setMode('none'); t.imgUtils = new $.ImageUtils($('#editImage')); $(t.imgUtils).bind('ImageUtils:load', function() { $('#flip_tools input').click(function() { t.imgUtils.flip(axis = $('#flip_tools input:checked').val()); }); t.apply = function() { $.WindowManager.showProgress({message : $.translate('{#edit_image.please_wait}')}); if (axis) t.execRPC('im.flipImage', {path : t.imgPath, horizontal : axis == 'h', vertical : axis == 'v', temp : true}, '{#error.flip_failed}'); else t.cancel(); }; }); t.imgUtils.render(); }, rotate : function() { var t = this, f = document.forms[0], ang; $('#rotate_tools input').attr('checked', ''); t.cancel(); t.imageSelection.setMode('none'); t.imgUtils = new $.ImageUtils($('#editImage')); $(t.imgUtils).bind('ImageUtils:load', function() { $('#rotate_tools input').click(function() { t.imgUtils.rotate(ang = parseInt($('#rotate_tools input:checked').val())); }); t.apply = function() { $.WindowManager.showProgress({message : $.translate('{#edit_image.please_wait}')}); if (ang) t.execRPC('im.rotateImage', {path : t.imgPath, angle : ang, temp : true}, '{#error.rotate_failed}'); else t.cancel(); }; }); t.imgUtils.render(); }, execRPC : function(m, a, er) { var t = this; RPC.exec(m, a, function(data) { var res = RPC.toArray(data.result); $.WindowManager.hideProgress(); if (!RPC.handleError({message : er, response : data})) { $('#save,#revert').removeClass('disabled'); t.loadImage({path : res[0].file}); } }); }, insertFile : function(p) { var t = this, s = t.args; RPC.insertFile({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, path : p, progress_message : $.translate("{#common.image_data}"), insert_filter : s.insert_filter, oninsert : function(o) { s.onsave(o); t.currentWin.close(); } }); }, loadImage : function(o, cb) { var t = this; $('#crop,#resize,#flip,#rotate').addClass('disabled'); $.WindowManager.showProgress({message : $.translate(o.initial ? "{#edit_image.loading}" : "{#edit_image.please_wait}")}); RPC.exec('im.getMediaInfo', {path : o.path, url : o.url}, function (data) { var res = RPC.toArray(data.result); if (!RPC.handleError({message : 'Generic error', response : data})) { if (o.initial) t.imageURL = res[0].url; // Initial load if (o.initial) t.targetPath = res[0].path; t.imgPath = res[0].path; $('#editImage').load(function() { $.WindowManager.hideProgress(); t.imageSelection.setImage($('#editImage')); $('#crop,#resize,#flip,#rotate').removeClass('disabled'); t.cancel(); }); $('#editImage').error(function() { $.WindowManager.hideProgress(); }); $('#editImage').attr('src', '../../stream/index.php?cmd=im.streamFile&path=' + escape(res[0].path) + '&rnd=' + new Date().getTime()); if (cb) cb(res); } }); }, resizeView : function() { $('#imageWrapper').css({'width' : (window.innerWidth || $.winWidth()) - 30, 'height' : (window.innerHeight || $.winHeight()) - 100}); }, isDemo : function() { if (this.args.is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function(e) { EditDialog.init(); }); })(jQuery); plugins/imagemanager/pages/im/flvplayer/flvPlayer.swf000066600000026624150472426320017062 0ustar00CWSax| \S$pr/EO΀ ѐEUEzZj[jjjkov?xowfvvfvf`KsBj)@=%hjjJe 6( UH |F5PT! (5y$DxLB[ 4SH e>aJPBIB.&䫴>$)sIC=؇ޓ!g}o^ӣzT G)!;tQTPPƏ-Z>C=>A×迨֡ 幻GJ?쑱"Ӫھ{SVes¶ŋe^cKqy? 5~E^LhQD5޿ˬ<+O߅i8jοMN6,?D~#5d([T;nJ = DAqfy9 ^)jrp@/o ɰ&6ٸT+Tɠj؎A:;0)Yp<\<0B k*ۥO2FD G0cۥB_HXޕA!A$B,D`(it Z[J~ЬَW+ EH.,225S*H+*QZTi (_֠RBoư(EYԐZf0贤h07JQPBcե< dXQkU(L"J02JP΀M WҖ 22>>U0BS~ 4H]{>Coұ~PeH`P R0#,ẠP~O(ӱ¥X4'ҫ*%'vI)zbҨ |:6K>K'iU*" oPFQjЁ:S(eĚ_4egVm}3L+Yc@Q1`|e%^b{: nn| r06m> tZ*("DHa0(hO Tz@*y#[aI{+ 4VQ(׫K qDu?aZ YP4mO~*,Jl76F1FG✔Jbcj$HA@TUU?L @#NX D tUZFU(JB@EA=;Fuѱ[TNTKgPdfFir̅JT1(oo(Y+,UU"uŝQ~YAW R خ5~ZZTb-. a0)0L@-QjthEѮ54!Ƞ *uQoH8Q&2V_*(?@o=Д)@cVAgT -F2iG)P%3j3*$ӫ2ʊ .2ء,+"QPyN:uh αZQiqqªVBgV\:g~c6^0 He<_b-n>QBj`^?!8sjRBjvؖ*.. AxFzP2 2p5 nټ3o,V/6~JhD%v~+ B H)a+rZZ xXXM!peI 9'# @ C12;d^ #$e.H"# Iyqv&e/\)@= I"D|HlLZ$7|IԑCDI٦L<4Tˎe'q!5\ сmvV_t/sB7,21")!ǽ 2Me-h]+""`7tycMǶ@m<W}9!FPMc46- dZa_ <aZ7Yѳ#T0 '<[ӏB,ZX';2 I5e0DU:1k|97L%jc!gociأ6l|`1wcۃp4ޒ5SN8F9߃ j'n3ds((LIw%㥙ԟ0@;A I9|SiEpY4W0QBr["7a%HH1B4+ΈY:2dytw;@E<S\Z0&$9z\X9ɷd\_RI3&*y%#BjjEF\NBu+"=>x:1پ}@q6c4 8Tm}2"<<$rod/Y_">l+ snAQ>> DdDwVD?"_N/|hKqH c)7aV$>#}?5y8NfDXD`Vj&T#nad!aoWP.,,K: d;dnv.H]XL=eSmk/+5L ԌxC;+/֝0 D_[8qZ81=5a4VihwDHz"OA)XBbm 9a'>x[yZ+umH&Ҩ/)Lދ:бZM?1<;.CrOYt2ӓ>G#2\e!DjN`5[V' (XefZ4eSWji\kS p ti$D _;8 m(q|Nvc&x#\LV mZHݖ3, (WS^.9ܡ2fOQ!I`R-h&nRZ;4Wk3Auo7czW0 'Li$B$MeNצɠ=tF$6f5kTBҥG mMmDdB ŒQ[۬FīY!fRj6M&`#\ 隓 Cvt*|EDPM'ɗ=Po)ePҜ/ΉM$j%dGEl@G`i\ xl}k6ペJFe 9@ǥ3i ;7e#0femw\7g>FlX&o|UH_!aQ)/+{:5[6zζ^DaLCb$s'L[8^`o*pqi\!!jvߡE35^R=59ྋ"^ n" İ$1S* 좽!hɛVUev}}=rwր?IoF  (n<p'JjѬ΅>rU_: ˳jNV \t|ɪK:מ+wꮮbu0Og9rJ$}%W5-p܅T8mf4tDW17_id 3Ƣ¦5]\]uQ>kWYwhvRؑK]B {{F5c$SX}pn9E%\\r{nN9 6ɢu$c\.a?y5]l<$35Ҩaӂ8=8qgmD#dO *1 wY9~5@#eHA QכkF8} [cQYKHɒ&Mg@cZB >kwPq B)mAScN"a;K`+dO|eT~,`3ݾ  ge ?iC6@ nPs^UT,$nN]+B{mn@ R-MÍJlBL@L0Y4i*.ܮrww#A0lN.q0LNkw=VŮNPs1d!,4rb>z1C1L#wPweXJD$;8 0;wH%*.m[x",[6խ6%㾌.ʹf>9''N{9lO}gYw]O6'V[3׺ʼ^ ]_YkFFM5#{O*.NPt}-r6c{_~<4Y\RTD_MCkq [[̅9g~vz~"犤;o"@ޠ+]op"꽶ፄQ{ v2ySڝin>]mSz|? >~own5=須VPHW礤)W(<^޶^, ^)?_=eOWZy5˥߿zUoZvw{%MGw҃KoG; g¦W=+䚝~[ώkl^9u|Q[QcRVgSV?,C[Ӻ!nG9>i?tZ25W߻ρ·.KSK+ccOUXPW6sꮑ&]y;OK{XlwxɃwGflc6qBỮsyCcؑ+?y. ԨsC.!k/dйYg ]ffjp׏7?&D"ܽq|+iN٭lnދUuOg(c6=pf_π}kԭx%]/W3 I=-r^BѰ=;< uI5R~vLWɹNwxV_k=2|ِ;w<~7.U)Vʛ+&NN[7hkNdCo 9ÉCZwҸ_ȟ\l7|0j×Nd!oGݴ}y;ܚ:s{#NOoV$>&gːSxqpț{y留'ľ_1v)uG`g݉{ϡU].ȍ1qF꥞%k\n޻W~I#9~~SuMaњXg8V^Լ}cc[Ԙ0'w GFnx¸={L~÷.3{7HPgE§ILWݿ+yyٛroonK?.pOq+;n1ו%ΏJ %Ÿt96緝㤮>YY`ەR]^Qk_^w*tUmO q{ޥ?nzXz9s5p5c*8"p8b-XFGe sAVŚ}s-]Zw ֿtKtǠeuukJg-|KϽ { oJLslcw:(,oh=Od'O'ްU믟ͨ>#n;uvb0˫٩Q_1~1[fV#!T5~Y~]xڔ'φ|t蓛n虻}fV Nh$^_hg}ͱ7&]<)Go-Yjʸ#~#cW h?>gT;?z>om/ԍܔrxm 燷%hy[k|MgVnT%2ڧႺ=WMיV_?8Wr^|/jt*kv׆fhԜGʏv4vFh$_b$tt&3xk=  rX3!iAkQ4N ՁiA+|k% "! 1o/-W֋1\z2+VŁʙr8$-Ä`Wxr/;e[@GOS־~=ۓ{4z9,]lPrYl7y}n a+Uf:LW2dAHΤHOwP.ш"ey׶V:|Vݩaƭ욲dk[W]F5`\t5`GtwqL1DbtC{xvi\E14xdLtafˠxBL]˴B+"#*˼Žh5H}<Dz#I=շ %7gvN1|ϻGnyB <4)~[\|gӓTWW7/'է}}}c*ޞ57Bn%N{pvo}ĉr̷:ooZ{r\I8l}㌇n]sĂG?,G }dMЍ\W[/ F\1Ž$%pC2V?3|K"#$7ؒD{;(~SQ{[1(^UA@5u@G|P̠FSh^H@^_mtf_Y\gz)0" $.r/qDЧv-DzD{H.Bw2p>ڵkESSq\ze%e 9g xnBCL:ݹA],FϹk# DkVB8mb# {#common.title}

    {#panel.categories}

        {#panel.folders}

        • {#common.loading}
        {#view.mode} , {#view.images_per_page}

        plugins/imagemanager/pages/im/edit.html000066600000017006150472426320014176 0ustar00 {#edit_image.title}
          
        plugins/imagemanager/pages/im/img/submit-delete.png000066600000004204150472426320016404 0ustar00PNG  IHDR^y|CgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxY͎53UVQ"%E9\sC @H % 8<ܹ 7)JlLWU=;:w].W}Uk!jVU4s]NNNɓ=|GGGgΜ9|qCx2HpfR DgϞ-q+Wlmm(m}/gY *9]5ҏ6>&u/:z;kcy<qι_|/(5` T ESˊr[hv`rJo|ɧ;5QG-RZ֭kG[@Ί3䫈NPZjjPBʭl4K0y`g,SUHvKna*C KKor?OOCDA\Zy  BxƈEUBT2"Iz@\K/{/Bjs`k.G.{)]1fHz벵2.hAOܑAڮZ50nSh}W*ĉUZWx?3ûjZmu'[0#?cdsnu Fr$'(ŵ.#D1Nr9%<*X^'꒑rк3^:-ksl؛䄸(@$}Fh#hcOY۹ʋ=wuq75g0HHԕ* Y-Ii.i]RV`RY`z6EU {B%:d4ZdqE"/Fa;a*q \mS,ߡe MsE7ܹ\*q##C^e.G`[B 9dr mί#`@@,q@+ vD,!^Lhm5SƂU<֘W^LsʓtڰM3`A4  Y'l =q\U>OK;dn?y1MP0S4.ӪA[}vLa@=2;g//H\y'@XVy9(p8:u@PHC" =LX$,'gLd&s\=#a-euspuIѯ("HrX0S30IKIږ0gN]}:TuV-_Oo:0wZHZ4grɋ^Ϻ8`ZVqy-ʕMmFq<'N9n#ESLUq ĥNwH5k2|GAwQ6@dlLqdˠ[lƩ"!ρK㤞}<6)i,,N`M (T*t!S"j~t6f4Ndx;wwnAs4kמ?i_~%J9?zŋ޽|/_*[ze +ؾ4zVL#A'De1ug6IENDB`plugins/imagemanager/pages/im/img/imageeditor/editarea.png000066600000014245150472426320017716 0ustar00PNG  IHDRKgAMA7tEXtSoftwareAdobe ImageReadyqe<7IDATxvHQN9S0j@nqw>T* 0~   00   00   00   00   00   00   00   00   00   00   00   00 >ϟ?_9sɏ'~h0@X CxSt7EDž* +D7W v;0  =NvNᯐJ=]tU$( މC>??56ϟE˻6`߿Co? r9 puU֋ oۭ?xYtNcxY1 8?`Fg|NeMC]+ߚ3)g6 XYԷ2 ٜ HR=qyxpǜoJ V t7ԷlǜV^_F9||i+0h5a#BլvsNñ# 7Էݫ;puSFe)>黢``ABnnժ#Q_XV}ˮ(w~ 0 ,E7:/ˆ\``~x<~3+[r5i5""%Wx[.s/gXY}*ñlsI%o!sPI ̢r'}7ߤ.E9{8 Ʊ;M vVvws9H00}<ǟ``}Xi]_?`wߦ<ɢv; )j㦾poT}}pu7p~;i}0;__BwbkE׬o-__"kEWq_Xh}?'[ߍ``}n_[_!kw`@}gv5"N*|^!@{!oaM& 2ҕ?ۭP껱 R):v}?>>Buwn 3 ,)y?0+h+*}Frۼl_^c'[{{:wW0;.E;F NK;̈́#@fWT_``8o3 PnzÍgu7kɛ|~||AZqIY}E6r7nwk۹  4}a}W0@f/S_``6n$wʸNYO6Ï֢@!.3ײUS0nvWO/ kd-nw/ ,KBUn}Eqi[w_O |E]3wil]nl27|#Fum &uçQ/ ,w~n.{n8+6@s2dZx/ ;Kwc/Ģ|x|^oPkMVW_ 0S3h;14+h|>L5kXaB~NS(7c(kaߗ^vW˲g;^!{YCܼ5+uhptCpoʽK~Ëv~mX I`oA}(H璗Ӳgu:F/Ǐx{@ܓX}Aanq ȍV} g~0D͊s@2 G\4K}we00{7נ~YqwfvH9le}kZ{ٗq%.+#ΡX1}UH_?9.z~u-{ ~ytn>968k-;]yw:B߾ftoP/ |pK~]tS}Amj_`X3߲$ 5&f߫PYO??S}Aa*~0eCp"EzEˉ5ͭx v(^{5&ַom3WbShRsZ9ּ ~"o碣orTgR_`AګeͲ}xn}7ӫ/ i>}ˤߧU_WګuX=etЉobo>ߖ~]ګUЕMwF!n &`b-HZb}o P_0 ^eշr,.o@{ L0܃5mVn~+@a\kjvwVyG ]{U6/  Sa4tBd`?ƻ>y}[  c)>eQdj^ߑpl``h/kյOo^߶[=LAa7m7̽Rq}ǘY])X{5[S8 04g+Jh|>'7VswI'R֬ 7qU;W}{}Kwj]#tZl>3}]9^M ky2')GpA!;9)}ת{Kt^Yp#^Oܪ  9  '  o%F S˓6:Xq+IWzA!5`NTx@~Mr- j==X_ձ ;Náx>$Қ+V,~ 떂 0Q}7wlNOm4{sJ/CмH}kړu5 .[h"ɺFLzӹ+<žO[߫9[FL_ /R Z~$Bzl9 ܅`o;`#-7ww\ȍםMz30:^TV0t#{= 7|~ǟS o컹~#f{% 00do2n {̚1O_E~T.{)1 v;@˞;e\ӿ ]48+]B3`Xb,!w߹?̷V“~aEw30=#q1.(ǟA!=!Od7n<0I4oBzu'NU֫; `$׋иUo߇I[(W.DA!5˞w\o2.p𷠾 w?=|x](Cm'{ ݞw:o N|bI`2|/ $~s-Cv;Z 0eCpʂݶ;l4H鍶ۭ_-`(pecr-oJ!~*;,rєk4,q%8  Cttϧ;<-/tFoۭ@~('})7 ?gAWHo65g%F+9O] XP .:z jM|_.Mߜׯܴv.Hoyk9  ͽQ\ouɚ(#`M]}ӓ7~*k7߇5c +\[6ƋƾwuÓ&^{3^7,)U3^^n$ ) pȚg@һ椻͉^wEex{z_@镲Fs߉y}Tv'nq=M<<:c T߁ 7ǜçN2 R 3 Wt̐C6F<]@)wXKk n >껍 ov`o}ێڪ׫X4ǻ&LΕv=n|=qkf|\0ߝ ir#``@@``@@``@@``@@``@@``@@``@@``@@``@@``@@``@@``@@``@@``@@d``ՆEp8IENDB`plugins/imagemanager/pages/im/img/imageeditor/bg.png000066600000005521150472426320016525 0ustar00PNG  IHDR=ɣ pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FlIDATx1 kx /tPR7'HBܾ/Nڋ4 Za^\Js)>p"MgIENDB`plugins/imagemanager/pages/im/img/folder.png000066600000001340150472426320015112 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxT=oA߽;' A !D(@P?CZjA!IA D%ľ/{wyw<̮Z} C0{IQsbi 6V>O{*>nz@1M,PuΜ*%[;@q!y A+wDwpm3(Eݟ_]9 ( LHzCvM\fn\ų/ɪMezũU%S: P[;$YF%:NW%6jG cW}cZQ@O26^Zw @}hƏ l @ ?׀+UYK)An| X7hA60i TGElx3:%0}&iˆ{*A#7T8?#+Q\vF%&cbx &&.c 1?q\E[~q"}ϫⳟr.vӠh DxFnpF+o|g{_NecP,:3rK o׫߽<[\kzı"B 2ݶ؁+:lynY<삣}s&; +҃IyI*19yx@FrjEG̅}Ifz|~T7),+=G6=HnÂ4Rsp;h#<\*Iq[E1ao;n<]dSAfì sL'lʹkIMc_C81!Bb,F?-x׎x4qӌ}T2(@ IQAd%Ga)aS`Rp臜B3 be9'f<F,) $jK]kEH3ggA}ȿoLj4c)pP 0u9ۀL<|8.'#m& ֵ/:p}7[5׊0 kf\˹}- CH-"kqp'[zpsH~;v ߠQƄEp:+(-נ'~ ޤ:yMfx}D%e^ I1!/:)&P!1}RD.З:jbC)©'Fbx)*jqY5#OKьOH&i Aɀ4( F9%>r+Bc"BUO&"aZ~WQPdEEZ,k [zT9.) )t#D!R`ť,W>QXj\PU@F}ej`Ǫ VE8(iXQ.qoRXPe Z]ro˹TZ Xlk-BYoe\{ o,^+)%-*:S)FWktڒ\)ڣ/3UfZ^nZW[1JN///oulAjl$ѯmQ .%F]/#ZiA) {;n 6W$ՖTBoyssHheL0jZ%ծw%նi3Beǎ6إ';IENDB`plugins/imagemanager/pages/im/img/right.gif000066600000000456150472426320014744 0ustar00GIF89a6YYb;q|耫a~t 7D>>C6 (>%ID9  #!>*\h$;plugins/imagemanager/pages/im/img/folder-middle-bg.png000066600000000360150472426320016735 0ustar00PNG  IHDRR5+}gAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE&߭aIDATx 0c`I][OZjVZ<IENDB`plugins/imagemanager/pages/im/img/clearlooks2/button.gif000066600000000430150472426320017352 0ustar00GIF89aPccc!,PPC8;dihjLm,tJxpHDH1ɜ-P@ZجvvoްxL΂贚z^6|>~vz"w7ħ/! ;plugins/imagemanager/pages/im/img/clearlooks2/alert_info.gif000066600000001623150472426320020166 0ustar00GIF89a *T xg(Z[3ʜ[ūu=ѻnKc+؈,Meх+9CRڃL5\D~zȼ3~ %zn)E"<jT,-E΂-wIܕ@T8»aʡ_Ȯ}I:TµІ2aû{_}a݊#?׳^]ݏ1ƘPőU{79P|y7!,  Q Q _J]#i#]J_Kai~aK #LG# HY̯H œɽOO V ?S SRi~8 * mAm R85|,eп$Fhp #A}?` b=Pis$ `AQmph):ANQ͈T@ P-NU>E2`^ X5rgowxd> WqC:(SMu"C@k,U&aIB8]1!xh $q$mZ\e8>aGXXKT$AO>DŽew#X@F ys=@…&Ƃܽr É}Wx-P\"FčI;plugins/imagemanager/pages/im/img/clearlooks2/statusbar_right.gif000066600000000166150472426320021252 0ustar00GIF89a=:8ȿ!,;8"I} ͻHzY*ںL1-' Ia`l:tJ&;plugins/imagemanager/pages/im/img/clearlooks2/bottom_middle.gif000066600000000371150472426320020665 0ustar00GIF89aù=:8,Ҕڋ޼H扦ʶ L ĢL*̦ JԪjܮ N '(8HXhx)9IYiy *:JZjz 0K[k{ ,N^n~^;plugins/imagemanager/pages/im/img/clearlooks2/top_right.gif000066600000001161150472426320020040 0ustar00GIF89a $%'%+Ҽкβǭ·̴ɳۂu}~DZƴɳ鳧>;7 !F, ΀EF%E#$$#DF0C 22&E"==1E ..'EAA(99<>::=> 77B>--*669"9  ! CFsBjA R>P I*AAsr^@ `O> ;plugins/imagemanager/pages/im/img/clearlooks2/bottom_right.gif000066600000000105150472426320020537 0ustar00GIF89aù=:8!, 8*Î9 ;plugins/imagemanager/pages/im/img/clearlooks2/top_middle.gif000066600000007242150472426320020167 0ustar00GIF89a.$%'êu}~鳧!(,.pH,Ȥrl:ШtJZجvzxL.zn|N~& H*\ȰÇ#JHŃ2jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJQ Xjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(%Thfv ($h(,0(4h8<@)DiH&L6PF)$TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐¤Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6~ Vkfv+k覫+k,l' 7G,Wlgw ,$l(|,0,4l8<@-DmH'L7PG-TWmXg\w`-dmX{lp-tmx|߀.n'7G.Wngw砇.褗nꬷ.n/o'7G/Wogw/o= 觯/o HL:'H Z̠7z GH V(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` HhL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz ('ɁRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:vy @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNW*@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫZ׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKMv pKMr:ЍtKZͮvz xKMz|K]~LN;'L [ΰ7{ GL(NW0gL ȱw@L"HN&;PL*[Xβ.{`L2hN6pL:9xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMR#ָεw^MbNf;ЎMj[ζn{MrNvMη~NO;'N[ϸ7{ GN(OW0Gn8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOp @xϻOO;񐏼'O[ϼ7{GOқOWֻfOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂. 284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍ȍ0Xx蘎긎؎8Xx؏9Yy ِ9Yyّ "9$Y&y(*,ْ.0294Y6y85<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyx|ٗ~9Yy٘9Yyٙ9Yyٚ9Yy9ٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞ٞ9Yyٟ:Zz ڠʠ 0Zzڡ ":$Z&z(*,ڢ.02:4Z6z8:<ڣ>@B:DZFzHJLڤN@ R:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:tZvzxz|ڧ~:ZzڨA;plugins/imagemanager/pages/im/img/clearlooks2/statusbar_resize.gif000066600000000220150472426320021425 0ustar00GIF89a=:8ȿ!,Uh"I} Z ɅmB(xnGER-)LSEy_+$c"z^|;plugins/imagemanager/pages/im/img/clearlooks2/alert_warn.gif000066600000001462150472426320020203 0ustar00GIF89a wvnn \\ܣ<<66CCJJ888CCdd--QQ33yyWWiivvkj<<llbb$$uuEE׎ڴMLpp++$$eeKKRRÌͳ==AAdd::))::JJjjWWPP((;;ħɣп%%%ƪ00ccIIϺ̱֘~ȟ^]עUU,,ڌssyy||٭QPNNđƘBB__??mm 㺺߀bb!, o2u20v7$r1U{))F1+55=;p!}%Y!8d>x`~~ M\j_}]hE(M2x&sBW( '~7 ?Wf.cKRs&(#>88܅Dpj"@: )Fn$ 0&saxS-*B"-Ȅ }l9hǬ[8q ! 0HhACzfCˀ.a˻xtfbŃ|򗶱 xXB B(CӨH倠6v A;!,rMܰ !üЛPf@(ν@h $ӧg@;plugins/imagemanager/pages/im/img/clearlooks2/top_middle_fg.gif000066600000000070150472426320020633 0ustar00GIF89a!,ڋ;plugins/imagemanager/pages/im/img/clearlooks2/statusbar_middle.gif000066600000000166150472426320021373 0ustar00GIF89a-=:8ȿ!,-;80I8k`(dihlp,tmx|G(Ȥr 8ШtJ&;plugins/imagemanager/pages/im/img/clearlooks2/transparent.gif000066600000000070150472426320020400 0ustar00GIF89a!,ڋ;plugins/imagemanager/pages/im/img/clearlooks2/top_chromeless_right.gif000066600000000105150472426320022261 0ustar00GIF89aù=:8!, HC# ( ;plugins/imagemanager/pages/im/img/clearlooks2/top_left.gif000066600000001164150472426320017660 0ustar00GIF89a $%'%+EKQҼкβǭ·̴ɳۂu}~DZƴɳ鳧>;7 !G, рGFFF&F$%%G$ED1F'33F#F2>>F F(//)BB?=::?>;; ?C88 ?+..?:77SѢ`  6(#@.dEDhب md@25RK'U f8iH'<@h@;plugins/imagemanager/pages/im/img/clearlooks2/top_chromeless_middle.gif000066600000000371150472426320022407 0ustar00GIF89aù=:8,Ҍڋ޼H扦ʶ L gL*̦ JԪjܮ N ('@Xhx)9IYiy *:JZjz +;K[k{ ,N^n~~X;plugins/imagemanager/pages/im/img/clearlooks2/middle_left.gif000066600000000073150472426320020312 0ustar00GIF89a!, T똌ڇ ;plugins/imagemanager/pages/im/img/clearlooks2/buttons.gif000066600000002253150472426320017542 0ustar00GIF89at0n{Q[c787k|`r~WdpZiu^n|\kyy{x!,t0Fdi&l;nr-bA|c#B,< Ak6LTL9:z:9D;{>9u|ͻ߿u}Ả?5سk^}{ޱw߾u?~˟?*&{P5 6蠃 >@ '>HaJ] Thpb*B/17X\60DbHNUF7ALdP"YeS2 ې[F))iPyfd)fn&`&w U|矀g~G(,ꨟP 餔Vj^馒f駔z *Q)`ꩨ*R 묧J[+XfkU T*`&.6 JK-k\n+W޺njعƞXnټλY^oڿ Zy\[fE-'1ʕMpƲ'2v!{{%ww) (s|57\ l2+ b!^hv F@$T#;5,v>v5xyƪLMep')q7)fy ~>*yz(/y 0~>j(Jz{+Ȯ>k뮿 {F{l/{j;plugins/imagemanager/pages/im/img/clearlooks2/top_chromeless_left.gif000066600000000105150472426320022076 0ustar00GIF89a=:8!, H1NAH( ;plugins/imagemanager/pages/im/img/clearlooks2/bottom_left.gif000066600000000105150472426320020354 0ustar00GIF89a=:8!, H!,A ;plugins/imagemanager/pages/im/img/clearlooks2/statusbar_left.gif000066600000000105150472426320021060 0ustar00GIF89a=:8!,y{3Ree;plugins/imagemanager/pages/im/img/clearlooks2/alert_error.gif000066600000001662150472426320020367 0ustar00GIF89a SSEEGG9/.* ʌ21 K; RR SFHHII~z85–97zuoeTS IIFFoltl@0gfGGvrLLXWGG,,!D5rnNMTSYWkf!!21EE3'GGCCONII32ѹ^\WVLLPPEDdc!GGEE үԈURQP_WA@%%YW_]ZW|u~xYWI7M;mjLAcasm?>NM"!c^ONKK!, E e@>=>@e ELwTRN''NRTeL1SmHmS- 1D3r-6b6)r3E mO 3H,,{AZ+r&kr+K2X"'0#t#x)"Dȏ7p…6%nJQF(H`P uHf4Bʛ*$82H3Jѡ%d"H=JaԃMT(PM" N|"e)ld (xR0큦^B @p$+^̷q*n,E$75<<|@ n !( C4p9ٛHi# MTTu,۰O,3`?,Ĉ/ڈKYdaAW"Ҵ/,qTm9aد E%{J3Nc Q JPo 7pDca, c]6SkB+/;,F- ܘKo8dw܁ |Qh,Ymx%~]?nXyOGrR {>vD&|x3-?GN,`3R^`D'U+\&=#3 G|C_8\H8 *\Y-( b g6){ECRv biڦ HLւÈJ u3!p?=zl3.lbS$CJ '6fF;9 |`5Ah[<"{.ppFQelt&r8-sD"8<2AEZP?fWt"g4Ћ݊f8Q80FĠKhL&V.;m43;iل9x%H? G+^ /P.Aap^р{ L,2 >S`hf00GiJs+@%/dS/Ȩpt(:SJ]8VRt\p&Aog%Ps%1AP}[B?Ȁ(! ˨F'@m9CHhN@OnPSHE4(8C62L! Yb@ͫF:Tͱ87Q[E8p0@AMCP#,a `Vg?,*3H@J[iP L#` / M.7Q@ޠ;*pt#m e]B'\ O8Ԑ6 d|OV>-PWhD`ՠr܉^t xwoyх@VmnMF-!R?T1ZꁳGJyaW kBv 9b,_<R2aL\086Ĕ:@ ?Q)Ly$W2e+l+l! 1K ߴu}y@fRn;Q0  uV 1O`DXEL,A hE{c ȶ^^y 4/)4`H_;z2 H$W0;RHo+.D0+԰G(> /$|sL PM%`zN __>+t! ea΂ AD:OBqWpzy L@>9 %RsU$ b~ #ĔPcAX UӶ<[m|##A/z=@ zsgǛR U}- %! Eo|,0l'b7yЗIG>7jY`-y z_Wd~cqG<RcwEuwwHP:?aIYg Ql[0WVcL3jc61 (n@PO8zAdQ9kN>γsYZdts5 t8`}@[1uD8> PFfM8Xz++[X#HI`g/Nwϓo?wldps ed}p {#ASh;p0Vf>'Vg=H Do^ЂG0x[p x ?X m$`6hw-@XN b/v,Hr:ygp>=HP{U@YsЂm8`r]P  k^l@psq&;4Hf(9>`y8?`Yf/y08"H T{_wwbSŇ Q^n vIvxP& Wk9M8Q@`ruhpٌVfo6)04p>o{K4hueP[|^}pdjyȜMc`P@`bw ։9pk>Pi@f\UoSwhoo ] 0 hh%FW 44M0@BOgf/gI qJ0OyXr+@! CUp4@E@pZG7jO@TePЧ&| EG -NMxw0hX@:((T g+V!9ƦVnO{{QlL^ PQFl} :"z2g:21JY#1Z#YXcJ)Ќ5`jj+?@dgE@džJuxP Yd[~ Z)C #z j%c캢88SL0L Y 0 /ylʬ#*P k)MIJk8!+X g^fC0m:s WFExJdP hV0 ?A[yЊ  0 0 P 'AZ)p59uf 0MS p 0ko U}P ೊ0|JPװ .CGpj{fz˪%KmsF sW ʐt0l|H:,KM ںkz `n#PڌЋjʹELFYjݐK :p klt@ ޓ};Z09ۄ`J7,/s߹p \:fZOkP_X FTPP Y˦tp t0<[j3>QK#70J?p h%'[zڲQ0){0h2f|kP Πx` \@ǹH4)9 [ȏA׸   'jPZ0e8Y0HLYj@ [l` ` /| ZRbq˸|,.h2!0L̼F[ی!%%+$c)@CEP88=@){Z= lx 0 0 PxT.%`M-`9PܩsJk:p˪b y@&ۀD0 [w Un l \  pu\% `G,O:9 N?<+Jxk-4@јk] Ib`_D۫]Z  ط `|؇b1(+ ȕْhRP$ڌ|F2]pv@LY;=iIv *j` P \͠0؉m%;M+㡴<w@ Ga`YK:D6 OtN*wIPvY K i\@ +.~%NJ! d ї 5=8tS{ bЦ2N=D k pSϠ f\nP> @ ̠; @ R\""/jdgy)@)pqⓔYg*cb@0 1Z Zhp̠İ 0鳬 6%'_aLw$(pʵM;rzSDf0N0NY`X3EY@ %>e$G^TI(!Zf!9$W0& (s P F@Zp\@ p?H3>$׎(8!A": ~ .,ϪH8P:@C`Im=ޠ8P 0/eP`Xt 1 0̰X8x,J8mfpg@`'MۛF ]P͠ ? + ` K!/!$Y *]@Hho/ %+/;`kK Wbne = i4`b„+V p!ebaC I[6چ8D`ҥK9%L3 NOA%ZIweSQNUWYkRa, 2@`CF zV"D^4X"E !QL81dȑ{|(sNp(IAz, ( \8.I k:*Fv4I$åuF_HJj+.E rs^'_v[(D`JdB[,`a3lUƅoI/cB6 bFktn * M&@Ȅa*E|F0ZXLQ}ûek' đNƏhvfY-h3+YnƴFRWX8ly#sQ_\;LIENDB`plugins/imagemanager/pages/im/img/filelist-border.png000066600000000205150472426320016724 0ustar00PNG  IHDRfEegAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbz`۱UqIENDB`plugins/imagemanager/pages/im/img/dialog-top.png000066600000024772150472426320015714 0ustar00PNG  IHDRHfDgAMA7tEXtSoftwareAdobe ImageReadyqe<)IDATxێ#I$3*{N0 X`7y=,+VV#8UӃNgIF̏nf8?ukO*2Ngz]|d'4sc6wccS|lvLZ ˴!Ϲh %sgqn5rOKΘQ]>i &f>ƴ}`c\Xd;L$!<@zcbv20U(^!'^'L_q8vDkͨs`Ex3 )m_iƺ~M23D{u2*MvH_ IȾtb>lWnͨc"AZA6G;;a^i %0;Xyki܎:uvǿg'k4t~¼ؙO}1ñn'l gL.P@1ԙ1.9p`{﹚) 0OO0t a!abd܇ 80L32Yx=W=,i'O2slr̐yo;:i;؏tl:NF 3-gߴ-lkL|h 4e/qc04Ӄ $#ee p~ۆE,\=v0D"HA_D-l V'Un4D:q7nd܎pζ2! D"H}=Ə@ po^Y <{TXH@mנּ$D"Nз-¤䡏?u$ .BW>5 6q K!oI$D"_j 9 h؅I >!:8g(^s,Ʌg  D"H' ^HLkBҗ\ljv~O62ZrR$4&H$wpE%3/7\o#&[؀!u z`6YI$DzeȖ1^ 0^L=S#/iŃ CÙI {Fږ=N~F\d$H$W$F_&x Y+־qf~ \e2z9z9 PǤ"1ǑNv_ ̏6Osj|s"$H$ׯ4, 7+݌e(FMo!QJMc\p|AP< 'xVyq2:h⤰0nhBe!H$(fej>Yc95_Jg;oa( &Aq LbV n( u=|X }_'*2s G kh D"Hת|KylπozM=\P}e֊OpfD"HeCぐNw@a+ΜSs4 O_.G0-ן9LwꟅ@@D"~2/s@.M%g=?jжsk ze= jx H"H$&p/ZeWONA/%D; 8k4 p^3 ͅgwFuP"Z\l@q8H"H$ү^h1 e,FAx,:Sƒ~~zg}L mm-lg}>qA|wÒuϰ:H$Dz}Zq<f(p hqep`KFW<@9;pp't=0ڟ~{۵[,;#aFMl;uZ` GoR$ D"Hzܳ0P i,\TGƀg!t]rǶt1K)Ln *OQ\fa={I{pW$52N D"H_l$~bb`(v=ZcKh{TYep;mhUa w x, "xָ5 ueGXH-CS ,@_@H[$D"~1nͥpqo:6 @a{ETak8@~ pWr ~)CPf"`5G=Py Z80\ܜް?q1L"H$ҫ@,CYrb>l %ܪL-~X8YtY ~;;ӗ*XVtrAQsgGM/em!nW-gͳ) d$H$ Qkr p֦f r g^p؅{ftG?0 Flru - ۥi;p hAM1 Z3c`.M!}ն e Y1-3/N !H$Dz n،)fw&Bpe![-la LIf1 [xkpz %6 mnqO:K82 B-ӇXkP({0`D"^zAZ%; 3e$C XeTR"8Ǘg_C9ABLGR>OC8 tvT2$H$H0c1H-я{kwX iYA~z Gye<"F?99H$ʄѣKeZRhSTeY8g9taKdOB X}Σx΂Oh%%=yš"EZZmժ\UBb-8~#od%?.$ܤ't7c7VuqЫ:n!{[b`ym !Оe9Dt$^:MD"^@[J /ˢB TIYNa,m4'hQRt`To51G 0+ۮo6l[ݾֶ}lŒOA;MzY+t90lGmOrt13k0[7GfB)J]%F˧^< <8%@$D"6u8Jf h +nj $Z6JhhǀڈeK䦡ZDOa(t䝪PEyF}Y0؊m_o% 0=WpO-ia?Fb6uw' )AM{2{<9|`P7u܀?P'RNMJNϓH!H$Jd+bA))V}]mӸt}n߭7 |zndtP-Κe9ALىczBOiݶ5֬a-lڂf]2ˉ aZS6w(g%ۭ񵦮;u}k]UYz]bb#p y ?4[4D2UH$ěO1vMh!FUidAaO -gBw5AmB_aOgPR bWR=? )0͛7f7 [;ְcn/ğvtmͺVyӈ\tO:prH Ȏh)Tp$D"B$d0g߇A{zR: O*xu\RSz 3|{Z0m`R\HZMt`0#Iаuni^_}Ė7:4>1 !>=>6Ӷq;닋bGl"cOb,yHԤ#=1>27A&H$J1U5 bL[YkP`囫rRB[>>֏<eRVNɝ&-kYiM8pV`6Ib[B cG"H$ҫ&@D;7 #hѪz붻fsZU>/`.p5Ÿ\cG)XJ 0Zy?| zkP'lh;'1 4VDG;N"H$Wz s9>lưu|汼n-W?}{z[򇹈a&.;! lik>~;zl..J4ӈ<[f<9KOw/ruBp:[.g*5H$jдq#bPY(u[X"#H$uYU*YxҿVU÷wZvc֝Rh_ފ.~fn\B .LI< MHmv;9`ލJХ6DB  )8( D"H׮Owޯ Ѡ3~wrR?Äc`xwk7qQxܛ&5lc0KvVWWWZg61JIж\O48"dBAo X%^)rL3ڱԇcGcXr>| 4ñ´{ha.\Ftv3#׻{xӍg2zS`qfD JE={VU6Tkk|]*5kRelUk {, 'J4 &lS5~R>5=\ppϬiy_.hk6`_Kswp \;\a#։aq dJ?8t,FcBB%VZOY8/q'c7w#Џ >nCY5Lk^:9+Be,=FI)԰9>Ӏ:̛k#!4coxfθMY>ٱ_zmwW.IlL y,H7\T닷Jyt ?t]y[a~ŵ?fKeB;\W}9oḶ ~+B.܇d';\䘘|p,tÛttv6>~S·f6I(+sg9cG}=*b۰Ƚ }W5A=&ƆxhGHlۭXA\l/~PNIo'Hr1oL'E_p?`˂~.E?n8s>ۡOuˈbXiNkIk0~`G@ ̄?aZÿczkgrL`,җ g ukIϟܶ mywwmm6o߭e)n`ͻJJo>e<7<~baW`ﯫ/umaA 5sW1 q,s)CjGT\ڳ`wݺ% k`{鎅/}{{8O ϖn-pm䚃ߥŏwBczlml*qc*mJ v8ecPox~i{]m÷5nb&_X8ϞkLq;wX/`a?lبoF \@./vß~A}+G~-, lǧ'Yf>9pXϞW _ɨ/1uJ5/hH$D#Z/^Ͻ1v=xf(v;d;|HjY0 iS`NmIENDB`plugins/imagemanager/pages/im/img/folder-top-bg.png000066600000001243150472426320016302 0ustar00PNG  IHDR,GgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTEWIDATxWr@ _We )"yYKƖ2U gD13D<$8 $ P`@ ;-bB΀W=ovźOXEbEZf8MWf}xt:(x/ 5v}i6P7{fwՖ]@ض $@0`aP[ 1<@azhq@r) 1<7 mj{^ߍ*?Gz4W3IENDB`plugins/imagemanager/pages/im/img/navdesc_bg.gif000066600000001113150472426320015711 0ustar00GIF89au苢䠲{ȫɓϯٝ灛䰾ـ悛ݩۜҟӤzǧ֥}Ȕ接΅艡̪풧ϖ쐦~ȺܡԳڢߗфʶ醞ˇ~Ꮵι卤Φؙ֬Ҿߘ술̴㮽雮Ҽݱ!u,u S9CfR-5lG^ (2WTq. >= #:i`A"o7]%FYghB8j\N6es&J[_Q)nLt pc@'0b1,MK&B5O@a4JPHxK^;plugins/imagemanager/pages/im/img/submit-wide.png000066600000006024150472426320016074 0ustar00PNG  IHDR.tEXtSoftwareAdobe ImageReadyqe< IDATx\͎άˠ/`7}g>_0Wˇ}@\l9XpFdFVOU73h&ʟ/#QcjZtce]AݭG~tT>}Zig|+5陓'OFe0UUyJX3gvڒKi^4=(ˋ/(<_|QΝ 4Ds\8ܽK{-){/=4_*RyHr}>Y֝˿i]cWr} rrt6Ҽ Be}[|OUGX_i# I&J-[Lg0}WZ3xXiӋ^+m"eA2U 4c\+1N0YA|m'p  R6xQ t-^~ j "J͜ld#MI،3 4XiƦu]d~jàpR[i?~,uC?j;mPGR7*4Wz԰lYS_kIPi:ct4C0d+ -<[zV+y7-||8'O,Ԙ7U=id]*|R< %XxdY.=O{A9;z#Z["E@s#]a|`@c3(n:E똷U`~s%ƭcy\۷{jA9ri=oiev/ȡ뀧"K4SA/_izk]<Ni7TDirE^j!|P\5Pcߢ 8ܭ0YQëJPM%>LU  6ʈ#3Z@&9 QW:K@PȖTP^~uѤJ!+B_ RF{++{Ԫu(J\g׭ް~c=uՏGaZzxTeGu1>uGY2Ԧu}7CyX0;rcsN8Ik> ZԀ kl:ֽi?ܻ׸x*-Ui lCYФJd5`%Vl>-ҡ^)N.|ÊV甆~æh]fLc[wY¦vH0M#@_1 */| -uEꮦr21-5Ru57pKLva"(l8L rɔĘk_H8we։:y7/itcV`.8AhoPK"0QPsNc'"Jb⛄RLo5jk쟴$GPοILT\1 M[`9 {%Pc,ɌƷ8Іkܦ*ŸL7.8>JM;~76oI\ˮCPtˊz~R,M8Xn:9H?)HAIENDB`plugins/imagemanager/pages/im/img/rm.gif000066600000003011150472426320014233 0ustar00GIF89a-,Eyʖq&|tSjmJ闪䊱D~\ܠʣYY}گ>zæJ~1b-kڳݹ˵romr+QkW"zaO5kGtе]wǏå]9ߙwҪf88n!,-,~~>Ws-AX!>~>n##"7""#-b-878"n(((-X,[(y8#{ X\dE(v !&?(ÃD).H[I\"G,(⒦ A8R&B<9ƒ '2 .}>i `%&R 6ݫW pIa@2`hKKL!T#e?TƄ#U4xr/B uc} <1qEo1È #h˃Ĕ<&tp݉/m0H$/&kpHPBQH܊EJK 8 8!` ZPat >0g,D\` 2c(EDCP/$(?fD b )|g.$qCȠm p1$Nj1CvfĘ@%PGXQ G VpqI =4Qr*DjjhSGGDBDj+7@a!%,՜OpedG FFJF fmq{B\J=+DKzn( {H믿gDLqK(00* ,Bn";plugins/imagemanager/pages/im/img/im-edit.png000066600000001200150472426320015162 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤMhAߙL]DA C.JAPPhOKzЋųDQhÃZRl n-CtgƙmJ)cgwٙ["@?A00Y). h\GhAc  P.ʣ2țR>:#/I1w~Έ<]x ᵧ ۗN G%"R 'C >7Oҡ#\AW(K{y qgf0ꋛX]0*f˻?%RCAB@7zwXY%~tqq+p6608zQU#SYb\>7%D|xO3,/E  1r|4MX驥5[cqVeuR Fmhx!$e߫VNd2 9Ӿͻ&nk Rd2l6jPJJU>?}&@@IENDB`plugins/imagemanager/pages/im/img/submit-cancel.png000066600000011246150472426320016373 0ustar00PNG  IHDR^y|C pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATxY͊/2{ABH c#v16fl|e_g?{4ؾ> 6x@ v@{FOTWUCVeeu׌vi2####21F3k6HR~\AUucizuAwI]׻ܹsGUrJ)jه$|WWWo޼ifwÇWU91JϿX.m˯O}-"z՘^Ar @ ibi8)B@q}?D( C $ً؛] :"現1ƶmA過b=&ƝCI{~o - P$IENjrX!G;eI.p:P' $xɯqs1s,M.jf%j 8=i%Yڅxo_%ɱr 5'ߜLB7ĹL⯟JUQ-Ƥz| |_,(CD5B/o̒ޖMԆMތVbTc df6'{HO]QsP ۺ_&ԗOJ%h˕%Gޤ㖁eƧ34rVA@YLc{u:gXC[(r.M(l6[4Rh4d`L3TC¢$4$ 9{7`%EЫwc&ISȔd)-d қ޽{;3=1Q]>@Hq4i͘2> Ob1v$iVι2F8xYOaԹT/3IA{}/-eQЄP$:i)&dLTG bu]ׯ4mBi9},Y$}2}V6?+t"zbHIXm}f^է(3 'pW#8ڵMu9jn!`{ #&[h31 ;Dږc7(؇"3s>[닻7 dh.iEl2BX|BְTruu]ŁΛ&n,Nۦ1^^^ IZ"1`PP *Us.;΢Prc̢H(̞MŢ0 (8dྜYwyjvٴm\_^E$ rvxC8̼il)]ѡ2~\s r!_"XUX$T>m @Du<[J`%j>ɺ.jwKj;~۷'''"Bx%1_|ݻ?~YR߿Ϙ%[ݻ>jŜtO~2H7`\Ǔ IENDB`plugins/imagemanager/pages/im/img/im-botleft.gif000066600000001477150472426320015675 0ustar00GIF89aP߹񔔔!,P@Fx(PrYXxL.贊-kH% R1<+G{and{#gtxbo}wl{gE[z_}yprDʼnͯ\^ҮFڻ"~qs]¯"sHe}}d0x/5lBB\xk;d;f$ >N Js^̖^LpNzbH JBJ| 4J&O&B݊WX٢iͭ4%Z+jι.\rz n!þL0be&2&U5+E-ʛXE"g sgvY;m`+,;/J@LWYom&v=G5o]쵧Yq źo;4Rzb 27yw_ҼvqkǴ|捆\`jU}` \51YNh~x\1Xa Zu!^x_d676c @Dn#EBDTie RRY dI@;plugins/imagemanager/pages/im/img/im-delete.png000066600000001266150472426320015513 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<HIDATxڤSMKQ=of&51Qhզ.4 ůFE7.t҅AZ-nEM-J(M~sfh]. <޼s޹8h$4Yi9c_>_YHZ +8gZ+Rw8Ar渮 Ҩ7G_]qOOGlXۻ| q}K &=8:2>O&'y XJPIX =<:< z #9)nUL5bz"v3@32*s(J|rk+$dU0ק77;%M/mN'drRY(9:Ҥs`)J̕NOH軖UX,蝟O4$|J"Q=$a}(dcv :Z4(`@`utTwMMdABjkO-`dcl ;;dK SJRO@7pnm ww&"$e/\EatFoz挽ͮ{==O[Zz&nck9 0IENDB`plugins/imagemanager/pages/im/img/avi.gif000066600000003422150472426320014402 0ustar00GIF89a,,ꔲ[ ginLLN9J&/34Lh)MJGhwz{Vl]xƣ8»S(jdLmzxq7hşBo6nQ%$tkz|dce,o:iwGv^Ĺe~AC Pz;@C!x.+0]X.guy~xIأYCҹ%_|PXZ˯ki_j ei$Ũzǯ}wPW*]i(VѠȰppq[]!,,,"k^n 1taf~~1!^1zeYao1~1z"^wUA 2 50ezt~l"eU2UU``AlY]<e^~kA` CO)HR@B\,0܉Ձ5B!7 y9)vSL OcϟPP"$ds'DB~`hՅ@<h•PFQ`u' b<V#CVxmv:HBUt@!hХk22(eq?8\'ӍӦ͗/vƀ '2~”sn+NycD;ŀ`c pNCPy߿0M@V^@ L0ƒ@j`!~$ CLzq`@qG nPC B86` 8.wA1>f`FUw"58TM41*܀#:v^d a>„M`48`o2ԐdT 7A88xps`gKlxȆ @J G\=L# UdH@iy\qϘ*ðAZ@?]lTzhC B+` B${gULlw+ B.n;uTh!FH!@0#ٮkqG?H\' FQ'XڛD8 %a!m@/Wl 7W<QD.l 4@P Q]삽+M6/LsUqrqف'p 7M =˰S& h % Se$ {!GP'vw|oF`ÄF@D>8\Y a "ذB \rD1^ؠ(VafX@ e搄 d,t t#- h` kB!^@otp°KAnQ疅=60y|, L`t@E2d0 " 1@7XӁt&p t  : rPI2;plugins/imagemanager/pages/im/img/dcr.gif000066600000003044150472426320014373 0ustar00GIF89a4,虗5 1./$*hff36y4}{|%! XUV \_aXdܱ܄ɉ텉rA^+C&HFGh Î7;ͧhܥJعvM6l"[즡bיLQmF/N} !nkl_][\b``OMNrqrRPQ867_``Βސ׻" @D @>?~q#)Ű!,4,>Q"]@],</",@\GsB,{)2Jx*4X9D!5r5!>62q J*LL5q䜴)F8Ǹ?KB 1I"dC_'N 1!% @azx0@FW::HJ)h4#ϟ)hoLlP`Q~;P tF)RPMԥӉdHjucNLuHUm*1AڵUe:Bg\t)ij~N N\֊JD+m#/,bdEC; Hcί6ۗ6 0ƍozݘ8LUOȒ@҃xɻ:]^?Gvk?]8ёV_z-2M5'^l 4Q^M }B>{B 7|70XatyUM qTt q bm/b fޤPH`&рvO,IAfBG I09J EDpAd0y#8p@""G_\(i!h?pE tC Z@AjPeD|!'w@ hi@%QPFWPF"rpHb(@qlQ0kƺi| jpo\QFH'x" \P@ (n@*8?@8jL\@p(@,0F\ `䱅 HpF^DpQFAgb1ga!WdbF<0qh [F un,:^bЁnqy#PG  D;i$^F, lo lQGc|Ⱦk|dQBԡ`4=h|C@u ` uF0\j 1BR!A{kb  жCSnd`_@@Z(@ , 0c`ziO@siDŽ"[?*PHxMr =Mȗ(Z\@-@bn3hSYmu>)( _@:Gקx ;2(U"ϩ'4{u>f0Yl1{{Z!m r0}A3bMIR*\O-Bܮʺ,(IENDB`plugins/imagemanager/pages/im/img/dialog-icon-edit.png000066600000002543150472426320016755 0ustar00PNG  IHDR((mtEXtSoftwareAdobe ImageReadyqe<IDATx̙]LU3RQ\*I$.HH5M05!5)AFR}j_[ 1m E.ڏYQMNNuMeCbxn>Dp??܂5Ϣj JϿ믝Gee%$Io@JO=c43S8YqP+++$J~=]]Q!6~6>> x<=ZEOwvwwbi)'ZG8^^rt4̃DGG4ݼy ._DZIܹ9[:855WPVVpAx<;^ڰe/,܌p8 $JAE1k?DP__r͓5H2qcc"+8wvvۋ[hi) ]1BĂڠ*N 5Cgg'Z[[-WC;QRH:gV 63V&_p1Tya}! rmK鬷PrG JfcvMemqꖭx%b'u]oLؗt1N-8]Jljz'spBQ=bOtMbv%>cn1A8 ˪%WT]jKqX1 ><xϞ UNcOs0nctFoFr¥i!`O -[~IENDB`plugins/imagemanager/pages/im/img/img_generic.png000066600000001574150472426320016120 0ustar00PNG  IHDR,$ (^gAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE8IkؐDVwLNR󪪪asTfhnxæ~zTu\ak$9[ߟlՔ񢧫r/Aab|ಳm}»_%BIDATxڌԋn@a.rR*R,.j j"$aH SNQ^VeyRQpG,$xJF$,c&c #IKןN Eϫa>`Bz&֫NlCPCYWp4o>F?ˀyHð{G\Ј߰ anGk˸lm/@^ 3B7:~8}c܎f+h~ ';?Sa+ނqtk#mj<I[y>&E XZYSi8 sh.0ޅ;T ?Бe#B 81 k۸VoJ{,f"WԌ3vu\9pL 㑘CXjq #AbI+Q,cuS_Bc:U:10yBG˼L[l<>K܇IIW,[2LDxב#j+JQ$b)]7MJH\'&/IENDB`plugins/imagemanager/pages/im/img/submit-default.png000066600000004117150472426320016571 0ustar00PNG  IHDR^y|CgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxYˎ7-W a 4#+4DXgM> _%Qu!*lHHlFbFB,xMOw7Ǿvk{Ͻڔ(".B)eeIHX,n{~̙3ٌ+wQ9<.L!mx>_,C\0p:Fr>16+'"' Vl(֭.kYi::zL LOTsML&]Ip׎tt={ɓ'9ͮ_;{#X߹snܸ ݾs_rYvK.WbL=zO?`W/^`~i\pA_ӧO]1<;_t 0R:X}mIENDB`plugins/imagemanager/pages/im/img/parent_big.gif000066600000003553150472426320015742 0ustar00GIF89a%+Yh{BP_Ve Zh ZhYg^k `m Bep am s}!9>@Aghis ishrpzqz~%+Upx #+3I{}%5BFS&).0599JO_x#-8;@e!$%046Ώϔ %(,-@FUim҅"&0:?CPPdbݔpde[˶ͻ#%**//1547;AAFCGLMSUWM__eclqtrp||}p̟߶ ı*Ŵ7PȷGZ[ǹUlkxUګնy{ Ⱥe~`lȿʪzo}gr^TEt zx4Kֶ}urjmYiUeR]KD7)!4kѽf!,%+Mgp*L͛Ç޶aHbfخYȑ7۸dXU[5dɼQK͛_܉ ;ټd-:k'ܸjMTX{՝;mevLo9ƭ9sƍW횹sԭZv벥+;p\S*)RѢmٲN[X0aRiѧJRu)iq]Sy0\ЩLޭۘPC}Ωxt\hަ|E=X0P:e~8m1G|tcկwZݗKk/ng=|\ngvG %<XJr~B$4`xUC*`&-( /x|S5"C xb##3L$҉lI*.,쨓5Eu.4.P &iSVy|Zj9<""p⚼ĔX֬T :yJ0(P B%64鈘<`' C&(N&# :Lϯˆ"P$X 0@LI ڎ2ք{ )uQB2o5l,"Y @H" 7QFjQnm! "H8RK @=0GkD<1^lƂ\qA` OA(,lq,h<`.X?p@iXL GﱇA,KxHFiQW]1H{DL@kmĝ##B*FhA Mw,}淰Q _ pNi. t6/ bς^2Aztp[h5 0$@C5Qf0*H@.{4aBQ*!HJŠUN c>Ag1R9xs4Qp<4F;plugins/imagemanager/pages/im/img/progress.gif000066600000000545150472426320015472 0ustar00GIF89a"a~ed{wuԁlqԂyrntox|iҀbfcshm}jӁvzgk!,"p@r١8t Xvxx\z͈|n~x  !! A;plugins/imagemanager/pages/im/img/google_gears_logo.gif000066600000003451150472426320017302 0ustar00GIF89a**zWTE9N@@ݛ{?qMJƩKG;HCTLm)꺝<>4e_â7~*#i]ZM~OKt(H3.3ֱ<۔}s0(.&e*%iګJAj:5K>\PE9@5Յ6-tjbVB6~񜕥l\*k{*س<죖sb*¾{rXJ>r& Ү;3*RGtr׉L@a^qlzt8/sn5,A71){f$ڵ=Ȧ8H;ynܸAKfU1I<5ܶ>v.(D:~b_J=إ8.PB3m`\RE;1,M@M?L?M?L@QDUHK=UGXKL?WJL@J=VIpe߹><2L?J>x0|93G@ua 1}SOu3-m`4{h*،{Y^XlfeZ5PG]Wx(!C8LH>b[vPL=5ODُK>NCRIwFnkHVû¼Ǽɿlf4-_#˨9Ϭ:\~{!,** HIuÇQĈ'ċ%`F :LE/Ph X%ָl鐁BxBCCqE}ŀm@<T\Q`رD#|!%D $0 &|0LI#TB8S$8Y퐎 $\ uH#lQ" ` De`e#B#E\\s H!| @MaB8#@xQd"I$|P1gp2(2R d 4bI"> P-=w?kw~=4~tX)pWq~SP4 A$idE‹:$/>3܁ <3Y%2BIS@,e Z/lOYw1col4(^ʏ2d|#ecz3@LloLn1s؇} '-i20+9.UH͠O0JAccMYH kkk6+<#TCUtvXۉX3J`0̲M0x١uڟ `\J!Ot6xe': 3\ލjF=qPGnh$]CPE1I0t:E6.|/o<ϥ`8jRS&!RŸ>1UmXl^`ņL8])sUW5ߓH VG@G~a5ij^+W>rj44mIҥեp~_.X8>HO9֗_|ͷ޼yɓ߼yӟf677eqk׮<?WVVnݺ;{!Çoyy`xȅ򼵵p…ׯoEq=M766^Z>}իW}obׯ%''# \Μ9#*wVxB/{F΀ݼ+߲sIENDB`plugins/imagemanager/pages/im/img/submit-greyWide.png000066600000005332150472426320016724 0ustar00PNG  IHDR.gAMA7tEXtSoftwareAdobe ImageReadyqe< lIDATx\ݮ=?Ů \ RD=Vϳ}. d"/  D]jW۞hhZnWWJnݦvվ[cnmA}/>?NܹsJk7?Oο?%sNz(/_6 yu%رhzq+WTYxG{>{LUU.^iy,޶Eߜ_n_Ld?egJ^'~ٙ9Ll6UuVm*fo}ɕBIӉZjUhӬW 'ן z,3m_$x:!1޴}b?sJy~-6ݧאT~|KUBxSc_ 6SѸ[{uݾmƳ?l[mk1<͘}h໶1&MfMuG=aݹNf>]tu"|܅y<K:^=yyxn" faX11nG0PhR4Ca]@پ`@5qbseY :~CD沟g1ޫW|~S.dX<Qݝ!AU0fސi683 lh ih0JIG  hZϞeMw¾*鋻gXw2$8Cl5qߴY}8 Y&ȶKwQ6{O4ˉ5jOƞ tMYm}*쫬01P]%fNVaLczveN._r泹P)Z':8R̭2Eq.nfZ-^?f`4&$&b+bS_8<ޛ9.αRKv(])uK;z3wN^k9U@h K:2_tI9W 9QkBf"Cذawl')@HbjRYIRG gYXv2ौZeiΊ-qdIw=88偸}2T`3C!S׫޸Ϭ!;9rlx`'- MiMSAG+[t[;>, Ay՘qf9QūȘY/2i:L3R}.&B(I"hThLԴg2hCWdׯ5i.Nl *zxZLOA'!; ?xNؗ})$ógէ?U:5(E3M|h+,8s̱/u˾GauXE_U/>WOfVݸqC2-gԇ .ׯ꣫~)+W^ .ݻr%uދ򹏡߼wܡ>۷ooxI{VJ|޽{T֭[./5'ż|?~5?sz}"Z*2CWivr=T*?Kz~HIRLݔVW*w;4UBɡBJd(n=NM}ס.QЧ{hKC fcëzu.}_Y+^S?[ `X˵G|>Zz==/;/͕Am3B1:C{pTb=u*X'wD\La~>R=H,_C"bAWO\ 9`iL/ u6wy. zPQsKhOYyeǪhS%]`c< 't}jH@UUx#FY"腱|Kw],ҵN]싪b}~h=G>`P.2;c^mE-GmA(g:3b5/qsf(A7V E/9_j/ ;1WKbV/- :`B :&tL :&tL>: :.Aͱ :&tLPsL1`BDŽ 5DŽ :&tL:&tL1`BL1`BDŽ 0`BDŽ :&t :&tLL|H_a0:cBgA r^tѶ0|<&tV(9ͼn 1i<,#7ݺ:cB_aEn:0VQtYȜV z̵w胎|ڙh'.ڵѓnR z^'7k;Ps}НwݥmkjAEGFUX5qqqaKwsXtDࢪ缨*qy(;='(ȢGxyO:PU¦ߪh5gWUцsvZUwzhEGF}4lx%9b׈ȔF;N;BK2EGF }P4džWto"ߑ^uXNy1"2)?iZ83kaAo)'􁁁rHX`"3*رcXK׉f 荛NIG_yYKC<(,ꏅ.gP?.i!]6Q=s]ťQ\XCUhSUݠN&=oQx?AOIXumu ǰkQweo$.<Jy47t9<ރ)#k +(ty}"di~#Ybc SY̙=t]satgu~,'b}x#Qd^JSJϳS%=_7SVq`|*z쯡~Aq#Gbҿ}e )9?Yb?20T7|:AgEVC d_Q:;dUA}SJƴ9NJw3.l]nO ԢzU젯%>)).k?5!<߭X;J#*ӣ\-J~9K|y،·2$OA*~Ukn@wYCtbee8uyԟ3S E,C e1(ڪ߅|/@L8.kŊ, n'q2bRTfV 9'pf ߠTb< + dѵ}±:GAU^ɢ8^y& 9³׿ zz*rڧG i6<"KY>5T*.8vG v[Ŝ CvPlϻNj)g{/@.}\xySiaY3d#@ !G@m;{o~\KyN)'i#߼y$43+;`QtA Șˆ{( C`GS7z& z9]5:7'bZV|bhúvWvvu: {l}C _8bb~[gNxϜnOvwBZOҐv[ʡaMj|V5>䴤Y-S-+lx6[: sQs>a!lH!9Ν;ޝ@׵ ivn񫆆Qi 4]i,v}iii>NF=,g?qrCPa9CAn 1; WXVųʆ֜dʟ/5^v=`ezC;Eл[YsN-7gwTiKS]]m[78;Cyӽm55O[,+̬ބ0uIIu*{}/sK Mujm>EUݶXRΏOc9)Q^s|-?-'Žn no7LinO9;0tw7zu>kA7>B^pUdp@*7mp3^nawn/WԈ›;i\emO֘꫑)ҝt/ FcfDߑT?o^en|-Sϲ\6YdM55iSMuwnR(/ʑ[/ww;}h2KMsn[j7l6/h<2,MMm-1gag9h0Xلl:ivr2{xX+a7bed4r$e04?N]lzRX驼MMM8p73)k dyaa!;PI&],ܻW$U7}Y 4K\=IVQf.G缯a1Me1OKZ32RSһ3nׂoRt~?[~$/W[$(T{; Qt1+V݂:}uvW.[Mc;O:_x>yݛMDͯ#99}̧ ]bH.m׊u>q<2boD=4R{(E;V$27ۻxΖ\.Z-;;;bLjڵݰoש֑lӊ z.jO|u+젠!phI۲7>־ukR_](nd:"vHe=뫳ޝ;Y=OZ.鋍=2Sς.ۯ}[ӓ,RϲbjjE߰ߡ٬[{nQfQ ^<|"^漹YݷItߡ_m'Qi2g-a@mIMbѽۗ3P;,2Ɂ+uՌG!#͗><ԞuO.} h@ o`9dO6wvl,37n77}wd~&yw zY9{owSӺeU3.|9+[+:[u%7ٛΩ'OkGUQ- Waq~ Df7~,(w1[(OZ/7<ozn8x%#Z} z|-4?$ zvnQ9k@, }間,{$oْt'V+!q4ܒ\68oϼBLƺF67wЀ{w2/螚z}M wyG>DzlYk.~z ,WW+ZʼneBQз<,~ZX`=7$# zvϾuڢ{Ftv}С|m=8zvcVH M"Sw}If3GlOt eGH.<5 AIx"bD6zⴉn<33ExЏrN~S/ŊjM~d޻w+Gl u@/+}!.T􊊮_Gu4/ʞË4#: zjZ)x󜫯h)pQne\6^1_"smb/});4ޚ{Ř8ʳ(t׹Ws)Zoos&_Ȥ#mTD~G.>7iIn˙?͝wYrG/).))..//./?Kن崍(JR^o6U"]1rb~rqbE9= =Fxryς݄o)_ɔBlcO^bH)\G(/w}>+%CJ?|R 鱻U{U|3-._B?|%2%'%򹕔g%?~%2W?SsekԒZ[Oל>3{ųkgiܴ3fӧ[[~xVWΚӦAM6iӿ543Y3ܹs\B&Esb5> ".O<?cYn *{wif/9siXo:j sJk [pR0a!PɉYPy#w_LNkkfHS?ݕPy(T /AJ%zC?F~ 5%+ "^2lx|. \BUZA@M߃Ѝ- MJa<(8j,j1`֨#}٭oR&798Y@ e JD6R6RXs&J%M)-#'E&C%p f* 5nP.DΟJ9|Z/ wag0$]|$ */N3KXHlH@7Q/4<Ԕt⋮XrsPBBLِpv ˲Z@ȅTNf#Y]%Tמ܄S6 K@7KҴl̽q/ʥHTɨus l;`hKYC4IENDB`plugins/imagemanager/pages/im/img/editimage.gif000066600000002051150472426320015550 0ustar00GIF89a͎͓ܿΕ͟眯ǗΔϔU=_^v^ŘICAwցRݙKyzzǔxؚTЂֹuףcфScyX}[ЂñoɅAӯ~RHY̓IxٛL|xzOߘjѷ}wҬӮ{km΃e+Ͼasӟfo^][Z͕{‹V͛gҴˆɑXܜQ_]qwLНFnjH›彆BcdzUқ]eژG˓^Їlնze}BctJi{5uإXljϨtDlԀ۱_(zNԤEwӟT!,a H FTC" Š!$4^iܨD T"TA^9S>EVheAqbir0 =wh|0JgX%Vf-CP@*zddʼnP\P5 G ,BH2=9! VPjlpaHoP@0tR&LrIÄʣ#`X#, `S? @BXR<2[N&q gf$-ٞ!l^/J,r<;kŲDpd(77V*ȯ=g66 :=kke0u0b#h:e؅NqcAtcePj8 -\“`Dx=m`( X2TB4EjTPUIPM! k5t .-Ӡ?szS_ա`/7HRɖa) >NgJW|d Q4 K!8Ë}5@o/;K >֐KI8A#R6 EA>nlsrw+IENDB`plugins/imagemanager/pages/im/img/separator.png000066600000000244150472426320015641 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxL öouZ%$# DU>񦌛G(3< M+IENDB`plugins/imagemanager/pages/im/img/loading_bg.gif000066600000000105150472426320015703 0ustar00GIF89a!,ڋ޼H扦ʶk;plugins/imagemanager/pages/im/img/filelist-headbg2.png000066600000000476150472426320016755 0ustar00PNG  IHDRX++-agAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx 0DQYHJp16 s 1cV Pk! T]z)-E" { !!4 @XX`@Z-B B_F&!!!!!!!!!!!!!!!!!!!!!!!!!!`W.IENDB`plugins/imagemanager/pages/im/img/loading.gif000066600000004623150472426320015244 0ustar00GIF89a˷q;疲/fž@ާ֓Z^ԋЂ߫Jd҇۞ڜoxЀݤ-z! NETSCAPE2.0! ,0:@0! Da  " PXp@ɒ"40!B@p< Ⴥ((0! $>H@KJPBÒ <(Pa  4P X@a +`A$<awC΁K` wl q#X-f84! , @*$P*80P РA<D "@P ABH8@74 -* H @ %$|F q (`„ 80R|`CX0`k*`$P 6!3Ol0RŁRDA/Tr@! ,h \@@x8`<\9D , Ppb>H pР@QHB CS 6hȀx&LDlj'XbÆHAׁ~5Aj c P(Ⴥ̠C! ,`(P0 * V#H(6h0Ts `n80 .,\/ @_ ! , *0a > @_%<\dD`Z~'UKX#꺝([m/ػ@J:t6%y]Dr4JDo]x濨d%$1ED*뿀IENDB`plugins/imagemanager/pages/im/img/im-topright.gif000066600000004275150472426320016075 0ustar00GIF89a!,`#dihlp,tmx$B,Ȥrl:ШtJZجvF+ȃ zn|N> { ɥ΅ыԖxna½*lO>Zl&P,,ȱc(qb.Ae౥˗@ #'Qϟ@ȜI͛8+3ӧ>- (Jbk WRREduIZqʶb(klֺܐc*k &}+^0UC2|˘4ɔ1!Lt͜{hӰ3f&j­_ޭxvꢐ |eX7{};~7^ȣUmß[ν/u?ϮzA ?>uϿe}I_|\E`B'Wp fQw@ j(<&!V8x߉I"4*5Hz星/3hd+7֦{Dx6iR$X0┗Y䖪u9`f*.*i晕)_Rݐ9y% 'gg2)hR~hAfwZxep)si~JӒgJ*Ih 렲jNʫHkPD>KľIIJm{~Kn>C{Z ɸʩoc]\":.,+bR< c5=ܱYlTs#㗲Pr/!UG|2];sØF<#=1Ѯt>*]MSSݣՄݴ֫|u?Y]cGS4u:k͢sCݫ_7\׽݃Xx Lj㏋HP^cvyߠ*z:˦>~{\{b;> ?|8|2+<;={=ݙ=}=:>z>ȵ>>G;?%y?ݸ?A X,!(L 0Ȯ\A|i Q a qސ9C!2"mV!.;p#NS-n-]8/fMQd@59KdBE6-dD9?VcF9vmcH83t'bJ+t/}bL8S$֔7bNyS?aPY8TGaR9T 6O`T8UVW`VUu~__X7V|g_ZV쵕zo}^\7uxw]^wuv}]`U7t\b+56q\d6YUVne[fͶYuVkZh6ZVhYjmZVe%Yl=6[Vb]Xn 6_Wp5u\Vrg5Y Vtu5\UWV]UvINuS߭Tx)5FQ-Tz ^>wOS|45WMS~ô,KR4#HQ{5FfQW4UXDP3uA6P 4?'Ob3u5n2l9Yvg)V3,A{Іf˗D{enl:GKzNt/ihҜO>MP%δOݒTqլ= Xodz@;plugins/imagemanager/pages/im/img/icons/crop.gif000066600000001043150472426320015676 0ustar00GIF89a!! &&%..---,DC@vur21/?><]\ZXWUjigtsq975"! JHF'&%][Y,+*vutihghgf-,,vuuyyyxxxwwwsssrrrpppnnnmmmeee[[[ZZZUUURRRMMMEEE>>>777333...&&&$$$  !C,C  # $ ,''%443--?"7C-A@(BÂ)!5C͌ ..*Έ&ص+2;6C179<>==8C0/:;plugins/imagemanager/pages/im/img/icons/resize.gif000066600000000170150472426320016234 0ustar00GIF89a!,= x0AXQV:T=(%ݼMN#&C O8˽l;plugins/imagemanager/pages/im/img/icons/save.gif000066600000001131150472426320015667 0ustar00GIF89a-9IڀYcmTi|Xm!6HOduZp}访0B.CS3IZI`r>O\~kx/FVğ1@_y-<(5,:&&%tfvh͆zяѐӑ~tguhȊzzznnn!Y,45"?9:9;<>==6=78 #I@B IIJEACGGKNNFDF$ 'LGI/%٤JNR+ !&NMA ` 8|h 'Op @R +.H 2 c@;plugins/imagemanager/pages/im/img/icons/category-open.png000066600000001227150472426320017532 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<)IDATxt;oA̮_~4tDAB $4O WEH,l+;3u؊}WWsG;s.#"=b t `F(ʑ13lN(2qG7|z/u|b Cfa8ADv ںŻ?@W9`YJ'Y@(pa}]v1 x@߾iMH/112r/ \pYP괯`u X+DԂca;sQ#1\WU?ʼn*Daw8nW==BWCZ JgI(}جDrNl+# ܨfjtCj\t{t -(ezhFW)F40-q3mjONVrj_v#& 5J/54kFl؛ɴX8֖qjN~\{kyǕTbY_g&<na;8nbgD_76c̎rIENDB`plugins/imagemanager/pages/im/img/icons/filemanager.png000066600000000572150472426320017232 0ustar00PNG  IHDRabKGDC pHYs B(xtIME)0,C]ZIDAT8˽JAEI,|h%"h pNxZh{k%^R8; }IgN.I{Z!$Q }ӗ0ƙ17:#;֔v/Fٷ՗R^;Zא FrS(ҿs痔#\Q4<˕ZGڂOG,@0!`+c{R>8'Z;k LT_Ze҆IENDB`plugins/imagemanager/pages/im/img/icons/category-closed.png000066600000001113150472426320020034 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڜOAe`$C@&]ziS%PDR`g}{raюnܞPJwrbց=xw@*@`Tkņ'o;0ٜ5?4@}4}WE1v0fs뵏$Nm<&i@+2B\kRE$ tlW1b-b 0Bn w*Ɠ$aV\d/9M7(G76KlZ,AɅ)܉LԮZ'>2Jt> jMl $ (ڈIN/^} YHߏ $0=Yd@s0ἫℇݾW ϛJ߸Pd makD|=G Vn6[Įd桚(Pm.0Q`'Fb#&ܧ6aP׏Q12[+zi; ]C17оpI9̾jD}›?7ayze,hXAK^3*bk @+wQ=!}uXzq:g쯺n= :d+_GTA;Ր Jƣ.!P)5!H:epր"݂"Kyw|{H2!i~3z_X;okBZK* ^R:O(jF*^ȰS诿_ gЬycIENDB`plugins/imagemanager/pages/im/img/icons/picture_save.png000066600000001363150472426320017450 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATˋUus_ &# "e]mZie]EnB6J0 6QLeɌ3<.ss}|_ܸs:=j@dA#vAJ&qq ]nQЁU&[Cޚ3GxCڜ@Y7EGY4m>?v3PBFQ$Uumlډi4ۮ !J(RMVS3ԹfȭH"A}FˢӵyF93w7љ;sz\3%DPlgv/x+_>.][s^"(dY7pǻ& [k"y-mڜ=QY%`f.9:LIUUkeDHxy ?|UTS]Kh,Y "fY@v8ɡjRJ"iQiS;,) FtSݚ\ ʞ vok[+Ͼ^znhmlLJ7޶wQIam7@a`\3on~=ȁّ0[`c`L2%)"Sg|#(]X] ݨ ( (D]XB *$MkNfs'č+{=#1Ql=K5-krI!h_~.LN84T!Mjt⚅DK%/ \abx ^ͫ F^?tHKû{J^1MdEe3WbU12/{ű$_.ÞNtlSmk*lB&xK{߸ U&#0H' 3C;@tA߮^F]&V4t88B&h+#׃30A"+ps3#8])HLo|&][_Něm_))0OÙ%P(Hb+ҝ3M']4W;ɬt3P 2@e@!)oϙ3k۰4n?38$錧 }WZ@z4I"Z$EjXz,'?Bmn*B-r,S]mvi4UKB<|"ҸY;xCW$5AVLPy\`eY"R lHdj!P`VRϧAdJ04-M .z nf@D .BA4)Li)I9‰`Y;1OJ3ݍma9 =1!cʓM2y^$&Ak&J)LccJNv#DF- PVʝUkrL X̔n &!&@<wC|=&5 olp@PkJTGB?xj|65d]E&TInmԣ\.a)Cnxhz9k+!(eg"e IںEA*p'V5~C׀{v tiUm.PI%5 Ex(]:;"_jf&BYR?0c>eqD%2tdba9ҟ9_b0e Zlվ3LLO1y8cUc'O\2?~4g IE6IYje,rpŶRIP!tlho1{ ` QF1 污3,.G+L hCEr"OS ;*< ܮXC}M)_"Ahf(\[Xhl roXm2cco;z-VқD][eW`$b:L'Ia~$SJ1 ;Dc0qj"ovv HuOco!?>j~g]MIENDB`plugins/imagemanager/pages/im/img/icons/toggle_selection.gif000066600000000150150472426320020257 0ustar00GIF89a!,9 ZŴU^X>#=o)M7k8!h&Ì E;plugins/imagemanager/pages/im/img/icons/cancel.png000066600000001113150472426320016175 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥kkAkH !)4^cƘ4eJKi(̇\ ĕή;OgV7U/ þϙ3`  Fe` ݇[:WnF{2 28dA2I>w&B;6Y$ ZŽ=DUemӁfZ/Rm Cz/ tB ̛NJ a;rd N,XX'>Kry88 x__Y7ͫʹZȋ ==tajD_RA#(Uxf84ݹ9n2$b'C{M9Hj9,=ݫ R,2Z˾u0(fԘycRݵt#]畸ݿIENDB`plugins/imagemanager/pages/im/img/icons/newfolder.png000066600000001641150472426320016743 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATx\oE?;{m؁$c ;X dQDTi# ((! BJ-H8DGwp{3=iVo3ߙcC7oTڝbbOtd\!݊ 3*W$q뵎ve[+uvw6r9<͟"\bo*Y0{1?2bmCc[}J)pw?m>V&o|>/w׵m5$FE eL`be٫LQz θJ678'L!Ƴt-4FPeYG$w^lסZq_DU,` 4#괈St9t& !lSј^Xy8O̱-Fth& +05g"kOh2ʘ49$٢v{f>Lyvێ9a_&56SG:Ij>G9rer?zř5sfjra_)] QFu1Q2}7g qРn,.R8s?\. @RRhC O54X\9w98OJe S8,A2@V (BwX,43rP`<"J0n zxF;Ճ  ^\)0營Q•'n I; SbRfFa0QV)mN.mKR(haA/y!#}oc~!$%# D#X\`O&C=xA9B6׎;T@4' 7 R1"KFu]eW=c{t&PUA*/yc>zΛyB$k{;&Ϝ (Dꤟ+me&f^??nW `9YoIENDB`plugins/imagemanager/pages/im/img/icons/rotate_ac.png000066600000001221150472426320016711 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<#IDAT8˥MhA$ۦKmXQxMQh泝G?eQLd ^S6,[PAg}Qh5Cß`x{mq*F?U 5Ӱ19-}Kq&@1HW&3Ny K cVɃHW6.#W|~fSL_͠q2aa*.xZ* rnl(z~A=֒Z@H) HaU']AF$|n.R@bKG]| w  ,L րT=OĚ (A;0?ßP&/8m߿?]ǂ#%.z<7 C_|3e\%+-< ALAAJ .}OOkH("x[;)=~IENDB`plugins/imagemanager/pages/im/img/icons/reload.png000066600000001556150472426320016231 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx|IhALChD0xHЃ(/~=igd(/Ӳ6BNwn7?~NUGU\ǖ&KgBdt?H8$*m߽hhZܒNly??KXC IENDB`plugins/imagemanager/pages/im/img/icons/revert.gif000066600000001166150472426320016250 0ustar00GIF89a-9IYcmTY^gmsTi|Xm!6HOduZpWhvfnu0BI`r>O\kx$Wbj1@"-(5,:l~k| &&%0,WO.vk?ZR0KD(庄vEOtD\W̷mɴk]IB'րx'#"]S2A*%# f٪5޴FvR\@dkkє } p ף(zzzvvvssspppnnnfffcccbbbaaa!t,ӀW2XE7k]\][)30AIHJned_ 16AA=9qYZ 45?g[@PSVMA<`/SNUL=hCQmOTl'GKR (D*F8scCxƌ#lÇ cJ%(jA1 0E!7kP( E.Z Š+;plugins/imagemanager/pages/im/img/icons/flip_v.png000066600000000642150472426320016235 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<4IDAT8˵JQc>EЦE"$XR aXaa 'a` BS4X\73/D9wbbPN_؞Z`羚 {[ vsx[_%l(!P ag$Do*v.@Xc;#98p!r #k\9jrK],1˾`6<<aN۵>QtŎ􅋙x+Y8uY u6Ӎp7`lETY'M&k[ NW1t;RIENDB`plugins/imagemanager/pages/im/img/icons/help.png000066600000001456150472426320015712 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxtS]Ha~͙:ׅadRB 5]HÐ"4ꢺd7Y$)edhjvfNF̿۾y |B|>/_}eYrsvaQ A9Ï;-= RRn͖@Q-q8RQ_]3>^|3-L8PvЁʊ<ί"FƦQR1}+3a/99PM%!VdE{7FVe㜛\+͚Ydy\pHL/ZF0hh4*|i"F,EUykE'o?["2۞5)@.+ SN5rmJ®71\NkbF94B.)oG@jF%dLtxUJf0hFu̩U0zyċ5'{P) Y4?[[j5v%eӹ=rq~r~l`Į*\!NLWʧtGV(/峬],˦=Ǝn*^ V2\9[-?ٵLo($G4q7eeK88H *ϟrFZKDDJg~mi;vh}2m}i w0v r3[ϳ,ʏDeճOT7&{e>vμ{LyT~@?oWv\}rKK- ,U+?d}՟?;V>m}>^Q[>Ժne|5,GCERVF+%qW+bʭVB[Һn2+c4UWTk=<xvEl([bQz$Q {VWf.^?FaPvòee22Ȉ 0(g3=l7k2% {Yjw^<7?Mmk^H\}`FhEc/{uHN!m,>흯f*KK;7ӄ^ZDS)OQXg̱oO $*%G~ EPtlKjb875x<fښ=[ OCVSkk!V^mZ19e:³KPshPd?=QMTba{Lw8E͵ C*x@S=%3;˳?!dͯ澞R?܂c6?%r);\jlm2@ U+|;_8Y|y]Z.oCE4쟠?ʚc\8!*yXdS*C*WU׍@7\@|J(n}@q1ue<Gv ^K9/?G_]_?LBO; YWXuD%Z#]POx3xrwa7 xfAIz3\;i;)Z<F4RTyŅw 36;[sd }aT߯}}W߼_'z#exOC-^QY9GL~K5[OX+h?笍7r}"-"oҥgE9:.|^G|5ߙ-#/m g̛R%7puj^zJ7,*ȗDI͗x3fh#@^ۆ3ׯg*ȟ$g7&0|$HA48Zt&] @ }'xZ DxY48 $@BGN-4v8 $PB@f"x-*0P#0xߎ#cL1A$8ny ,iZFUZ)A Ex Mn#%YHf)gKe@ɧlAq ƗRHVR PJ'R(m:J.'Yq螞6*Q޺Ʀhk?(~, @Z -QB K*2y.l+ڋЭ)@~p@hro /,*Agj,gZ8}l|2>@3~lBDkLb (?ۯDKI/iCtPA\r vQo0u5!qE4]tabm6h N>`xkR 5pvߐ 8;~ |CyH9ځ;plugins/imagemanager/pages/im/img/folder-bg.gif000066600000021673150472426320015474 0ustar00GIF89aѹ浵ޛȡ񱱱ؿ얖䑑ޭ׎輼Z!,{H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\1O`ܹ@~'Qr&ڳǏK @Y%?~ hդ6y3r*%>$\)׻t<^Q@%SSQ2IfO@Cv+O"@`JC ZVYͺװc˞M۸s.녨Gx+_μW1hG~pËгH\bߦU(}~0Ͽ(h&CyP 0hfǀ(2A"h((e!*(4Ȁ*e@0@vC}:H&Y`@RdJF)<4Y*Sf<Xn)т&EbBl.ÙEt ȃ6hY{naCP)<|I< (9䢐j f*i>G>SO;$ 5#ꪊ9ꫴ묵ᭈk *.)k6;F VJmnm~KlJnnj oKoi.o 0\gωpl.0 p;_gqR~ "d&r?r.q M4ĸ=&J_t ROrVu'o͵^rbLv3jsn w?MIMzwݷz~t#n3hC^bS\cVs>P޴J~D>8^2,㞲&> ߱# 3C?S߯br_ܲ_ uۚ _ح@lVe*"X7RX 2A,Y;0p&$aBs-U B 0W7dW /CZ];]5Dy1E2Z4@\API$%jɢT{(D)uj B0"hT5nIi\ Qɦ`Aq $Mj6&{3) B isj*#MN**C'BЬ:$+ CQ6t+jDJ+)Rv^X$a-{ƂѲb,1kF΢Qj,EF‘rD-MkGѵzd-aGݠl[Gdp)9\Kdr9\O6etI9]SVUevY]Wvߕexi9^[ezy^_f|9_cUf~_gf9`kf`o6g9asVVgٹawvg9b{'gb6m!e|H84Vhゾ#1CY&Br|c%w1#VWh3dCyC_P1H䒖]1fyonj!f ysyN=:h^i[z.:iwV:{fj駎:>kZ꩞:ꫫ::ۺ޺k;ޫ\qM6a}Wi#ڂ6ce3;6,/;̆[l?{ʮ{.m7{_moo[;76 ϖV85es>x>YE9pU.\ƅ9re\39tu.]S:v]sE:x.^:z^:|._;~Ů_E;.`;`3;.aS<asF</bƓ&<%bʳ.EE'KAdG97=U/f֓}ffF>Og#ㄆg\>/hC>oicZ6?iS?ݯiZpƿjÚ&F~f怸 'ƀfƦ恾ƁF&fȦʆz!g}G%ƂFf׆覃悛Dd䦄ƃƄ&fFƅ& G''熡džG'q1fLJg'懷'Lj)+-'/G1g357lj9;='?GAgCEGNJIKM'OGQgSUWNjY[]'_Gagcegnjikm'oGqgsuwǍy{}'Ggǎ王'GgǏ''G珱g͇GǐG'Ǒ'gG㇒ǒۧ'GgǓG'hgǔˇ(hH  H (h#Ȗ!)(%h'H5+ȗ-h%1ȕ97h=;OȘ?A&KhMUQșS[W(YaH]_hgceȚiHkHG(ț蛑(HhȜ蜡(Hhȝ蝱(HhȞ(HhɈ˨ȟ(HhوۨȠ(Hh鈡먡ȡ(HhȢW)9.7ڐ0~ţ5GIhHH15K;*= ?ڤuHw>cRb(R`d !IR@Qjc,skG0tJj@592puڧ~:w #rxZIqdpjڦqtjQڕ9 DG@@@ 2GP@zG Zʪ GQeZzڇiZ*Qaj j@I0Zz*Ⱥ(uڮ Q ^ʪ DJHJ*J:Jz亰 K@GڧzZ* ˩@Eг>ºw.ZjjP ?KBe@TD"K*ғ s1n[IpMJTI gS7:l4 p%;Ep+?C0EhC\[ljd /ΨszKX;˺\;Cƌ8|6 y+/!)ڻȪR {O'"‚l`_@ʫ|j<|zZ` &ĺ˾,?̅]\<]K  q<̳X\Č@0 d0cpLKHOpvQZ۬?<Ɯʪ(<=1Pz)k˳.ƫ(EL}+D@:E` `*jQp+fL_E @MIIikdPSD k  " B؂=؄]؆}؈؈=،  = @Mhڃ0ڃ70 mff-ص0SںM-llz6܅=^Pەmls0ف}۠-ڤmڃݶۺ-TP0x0xP ܡM #]~]ކ݁^߂ऍ7=NT`s 0ڡ>(<؆ؑݖ]ߵ l>sfXZS0TPh lۼ7\-߅OrAPv~xz|~~ێ A MA g ~ `~.ڞ ߞ90؎>Ns@Nڭu>٧ښ.> ,h~õ`^@:صBn>=^d`Ǯn d۟hPEPN=`&> |^ ~~ 0Z~y^ . PAP _-E`Ezn2?4_68:3gaB/VLL٨Nepx0\XZ\H7OY`d/SpVN޳sp/4vxz|~ t=C `}Kv^d]/ ]{oMPjN OC@J_lP Fpro)v>x?` t ` ^C I m]\OP^Vo]PLY  ; b>![Yiծe֬GqE|鉘0}nx!1d EPLqӸMeکcV]Zg#0f#!Nd|zQ֭^ t[~R\ۇ/!+fgDH%I m$Gl!&m7>,sё.80'Ȗkkp@ 4@N:Ӣ3ΈȒ+‹$8!Fb2, N&12к.^jL% xB+( /N0EZB6- (rJ*J,21ĈC (%+ GĢ~BKLf t '=@8$*4C.$`0(TA?~PBSPCuTRK5TTCJҨOF XP r"B^?" 0!`T]9C hB#j"RJ5Xr  XPmP%ErM=~_x` 6`)cᅭe΁ ÃXCŒc5(h'f%R^IP2) IG^ xc7V+Bdx#)@B BRM2H:Yd"iF1lL y MASrLGxȀhqZ~xM1X5'1Ȍ @Xc ; (SG9 H(<LgZӛt=iPZة:B `rH㠾8ӸHX9 A#Q)J1 2;Еir#`H:A&w͍ zrxp1:Z}*VHֹHĀi`V|IBeǁ|%KH0EPE(W[#'9ǡS|@C^{Eo=0wu=l `ә8+pxć׊#` #:яjp#HmKu{zh;W+|}+|MbyvsZ#V"dda 9-a 08!?uNj/ZxSOgcõSg_ɘcUpE=kkV>6… -%c-?ouKz4y]d}[Ev'+! [nY`俰d'eA ̄ЊOIENDB`plugins/imagemanager/pages/im/img/alert.png000066600000004520150472426320014751 0ustar00PNG  IHDR31wi!gAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxYɎGٛYX0탅d 8!5`' _0p+l∼">0R3kk6CJ%3^ȈlO=xn2n_\)^swnK r3Y"}{ʴ hH*YoGF|C !KϟK}eE>~۾Tu2GDŕׯeW޾jU\d` (W`R͵5-vy`"`3a.W\Yd#;˯^I lqwHA@2VٔU~efЀOhV G=OE>o!E?L0Qѽc,ffQT|Ŋ3[``X`+W qpO]kXZ`g7uh_h, j~JJNB@ 214YOf 8v2H_\5^{/VBe{eܹXr'O|x<٭"Ts\CL GLLVTz٬ בl 2A*/OlIJ=.mSzn`XXq[iVİ}QUr @d s{)+,j6wd8VYby !Ըb'.-J{njϲIT+ y/=sw"?r;nvOB*?]K^dppWF ޱư/elCv8>|;)b)\YuTOktq YwNkC.VT >ݫ ژNU^Wa+ss[pܑ?WnRX Lf41yDps}̈gM1!Gdf曲33:8h VB&"WМǒ颞w vC=f+ѫ?S}[ +ɛ7T~=dUlT^oT:Vq# kxxb{)exFhJoL,Lj8e.$`dp|bO}E'wS]G BF%DNNi33+;64+N֦4sb' eTDb#K*؞q[> GTFY[ʩ`,i6P2Dy5Xpkl6iERhhOh=pO&FY=k{[uٶntESO=Cs$;9/_JݞgK[1Q"e&JSb͔>Pؔ/HuK.'gTdû х'&ߝ9۷hV&m=0;v)u OWtxO?vX)Ng޽λI0@rYϒb@ ;"<?Ɯ{̘=}gd絮6]&J?z/Ic H̬=8aVGKV+W4+9ˊ98-װґx Y^bzeby9@CTs7SS"ё ٮN4%k7!VB15Ig)ict(c=>i=Wp"g4Qg q58P鯿ʈ:*XW<\fE>k/',cIENDB`plugins/imagemanager/pages/im/img/act.gif000066600000000311150472426320014364 0ustar00GIF89aþŻĻĻþĹľĿ¶ƻĺǾ!,F`#I)Fl-дq㯳- B șl~ͨN!r*i1B$;plugins/imagemanager/pages/im/img/check_arrow.gif000066600000000130150472426320016103 0ustar00GIF89a srrhhgHHH!, h;% m4oޗH .)';plugins/imagemanager/pages/im/img/Thumbs.db000066600000016000150472426320014701 0ustar00ࡱ>  Root Entry0256_36957e1a789b1cf4*256_64c62767e0ef5477*   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJMOE<JFIFC  !"$"$C^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?>=]ƹBW I,IKgXFwJO x\nՍ|LDži5}O.pi o5_#o`&\h !.=gZz%&QE!aDOZsIC&v eM_.?n-BY]5˿d*#ւ\Ĺ~6W+Vfv>oCNz`P#d:go,uQR{c($]ћ^i iS*u jk BWYbX.%I#6;#:r /,OưXoޅF>3ֽb(TTL??Qa>(Kg7Ȥyzm?&/FK p3'_^X`c^<EL??Q`D,? u)E :&(aQ"1U5ίN Nq;נ?ʯȸgP?b&(aQ">?.?YVb|XX>ƑgE{+<ȣɇyG|,<~$KuF;M|ڏOkQZGm6emkm5۸UCdG8 Ҽȫlqm# V3,1"PNG  IHDR.sRGBgAMA a xIDATx^\]o\Emϗ$vx ! y&B5Yc]$ (6bc;eo}gƎk]͝UN9\&:[t9;fx,K 9t.~6Nǝe6>;fx1,0 XW|FSנp]\tV5$:͎M`Xf]0F^e:~vpƲ'}4OJHH4cr(IZy (4z:'GlW׿FCݷb Cwo$}Yms᭷'{!0n( .6{6H8 ~>P:'a2Xk/9Z ١{u#_P//*>ޠ n}};S#'ȩ3 N]RW+fT#.^d j\~[ :G0C 2DՆQ8R&EL|6Q> ~o9glN`hHj &4higl*OeBN}?,6\F8M:E/5fo4=*$  ~'dGK q znU8E6 kmOܜE͂]'R WCkgg:kh=زc"zI_dw>8"@p kE,Nr*˥ރr "=6mµͺӻĻ;0N\@)q=RrBR6ȓH&F%qLSlG Z6END+ ٽO{CM1bF?։x{olWƏiHT'40 .ǀ' Њ~'Բq(/_O_a! P+tEtdt>F6Y?ehD7ъuŢS'i!Q{rEpے\v z{n MX Z;,{+0ڊ29,H{=H- h}kHM,Vp= g9Q`'"_~[[]sW^Y.5}MrhTPիJ5Ngi6/ O9URiSk_ʧtvaG-p40=|(ec+Y|"4/x!YiP׷݉wCꮈ &~!hb$ 4f/muJ2@8vE]9)\Hjn~=U<Dž;9_h腉(ޣ!8HJ޶TJU `i|*۞dB7F.fL"ivFjTlq hVpYjrrǁ6+r: I0b08#0Oё.+ч(>D|"~''vjD7DjJ|<1ܤ_c&qjغG> l ɢ |P0| li[:j96|<2//+֫[u2+W=XG39GT"DZH?X)rt('gG6vF̣vXED>^WW/e=ŽVeYP(b=Elٟqzur#l11ʻ,"-{c͍gccuf,&Q]| 2] l<8Zlrlu.?>Y\uIzc-AчȂx@A%u>&pm ƃ ]P==u[/ËM|\[ݮCOQ\S' Hk՗!ҺKP,L+JQY)]|MmzAaٺd&}t+܏iF)kYO huj5հ݅dtY#t-:y&V>F$6WvF;|9GU*պ)\FČU5^0K!􀔽N]֖} S8,Ls>F6VA >l+8~dmpɯk0~/ a(Q|<`qZ!,,,{$HHTT$ $~LmOO7,SS1Ta!199]@s}MGPR~7/^`i**AA))fVGTpÄTLiIWW>WI JMv#m9[igW+eŕ$̙A6+C6 WKA C9rRqURL8pF.",&E,iQ-4cRcIiaS d$vP -. JI60%T\,PP2 ҤCvdr cLi@#d1 00]Ł #&  @B 73XQ.46414Aplslb幠 ~"x񹨐FYhE Ae"Azt0f FVl̑@e\8D$Mx _@,#A`NY @% !Y v@ $!Kx+=v R}8h!PJ)f0 stI l@'AP_>\EĎ E,AtxF*B~x0Y*(  \D`Їba@IX*) ,P: vNp n mdoeIrp3*Ezp|XD)<9%?e U|pZAA K,H^A ǀ @  l 7> Tqfp 0@GK:+ ,H. `@@ aS %A(P:CZ0 <.!C4pZ 80Da41Vp#A RkjBTc`0}|gB `gPty'tDFhLB]`B ? 86!aFk?OCCDd zQK >x`PDQb;?='&A7% tT@50I?x 5ȡo6Yr@-| +/X %p J@X(Eh#8Y0  J`z N",С | cP/%A <`: d C@& Xh#J([ 6Y8AEt@ {0a;plugins/imagemanager/pages/im/img/flash.gif000066600000003270150472426320014721 0ustar00GIF89a+,cJM0󈃦!(4kXJ'|vksd*ĺ䨙䴧ۣwgqZxfڇsWAݘh[򸩵3囉:(<R4󚢰#gY̩½L2w]CD4гꂁ%C}sz[JY|0bIP4bZ~"xhbḋ G"E:tf@,%N8t@섀F%PIsu "ZsDqRB,A Gи]`'5ԢMB9l3?/X 3_ؠNzNK I @>8 o  pslP F+ ^P@(4F{ޡ' Q sppa@A `pƃ W0s$pC <oG 4)XNL'=\qE u(  q\\ D-~h @ 1dG"HT0 1K}.A8,0*{d GTF,-:f۪e(+1>+*^mDYA,KB{+fU '@:nj \!e=[lQB@* >0i<P-mU\Q ua $f@$!'R0+m-90y ?JbmAbw y:ϡ;`!(}Dk/cՈ*G/PYw1]d֎ xK>l3ev~%C.xpv?=ڦojLN p ({3``Ky lܰ_/d P5! R:C @yܑ5&LS0"(`A REȃ4iMgPB `d `&ꄋ,0,…\]D).FD H(C@`8D">W4tX"P!"`h D hDW,|^p`KD ` H(K: ,"i $d P< Pd!)3=oh=rgDZZQƏbt)oCO]:yƳ hhGҩ>5ch6M{jN3QGY~Xr%=+=v;_  H1=/zyv[a(F=`j;) cg2 Z' .RO2O @\J|O%&AVnk&. .}2YŴ]z Sky,W55ψ1ug5\eE3 gPlgT Ѻ\ji@ FbV`X :H/w):PG-DSV{x ׌`mmjv5B'#=6W#=Q\F&? xreOauS]-JVGf<̩^n_e{.7F b="C1ϻnU5}luzLr̶kaئ+Q=Qw_h iaG-\sgVBAl G"k>Y* `繟 ߱v3) \=F\,A9qJg|{q!=Nun{>}14ziZBp?\5^Z%Oad_$yljz#Q\i5⺅ekHs$1 B-0e2EҡmWU{ S R<T* !m0X UK}g!VM@w!8͉Z%P+nl螱ZUͶq=TuN@U. mD"up3>TSS3{3Bf4Iv2h]ns_CCU<C(.ٯ+^F-?_sʼ*HdNripjp>ImC$hCfp9CXt1j1Ot#0%H| \E6c#MyϜ|LκNj_:Y#<"8 A*şόZmBs@̱Hj(dϜn4X!K3 Դ^~h}ӸHdWtE?+cNG"s29$s>#˙C~m "h!yƥ< H#L>z#f_ Ԟd2jnzpr3m}81?I1L[)0%|U(:@P e:Cd֥gyE4  ΌNWW/Jض|}QSلt*P%5&?q %7o\l9y25E<6ujfFi@Af[O64iTu 1luLeg#N9Ŀ,fL&wyHYCnV״ڰe0kSDqaJk/` cV,u1+K?(w|k,"-ݝVl$=ijǨ7 oʒ={6jJY|8Z7 A1D ̥_tXy,?7" %mBhiK@0B lnN'lg*GFߟtT^WD4x5Alh /rLJ& 1?ᮨ|]ŋ[[[U`rW##ԋ{ SrZ܁]opW$. QN[Wajq2ַ༥e2EzOOgsYٛ{6x9?PKvq>p'{8D7"+VzBfYa_n.lV֝pp?mDF(GJ {,R}CBܧ8+}إeca%WP19B= pRBA~vgP_,6n{8 R8YK0Y fy < +ڋc@`Y kVݗ6`_k*4AU_H 6Á @OScC^??Ky]ƏH>sikBʡ a`0rop@ W /9BC XP{}r(kY'cC{,/Q@DX{]}m0"*)1ypoStnZصdg͒) iy7* &IaKFMG;;PR]p /("?Rx-8ooR ARe'-BR0{0PZ8# gk /n< $BAa0B G~<2d39RUCY,<f.EnqD"hѢp͢0%Z[GZl^VC-,Xufsʷa#fW}e!@Wy1`_Pʿk5|W3l~EG.XK-g;Eק؍޾0`bIs4،k3mzG=5F,%Ūa<Ic `c}$qO6{HV@9A VD=vvuuݾBpޞyGc%P6M?z/ 1?-iJֈQ:n% Tw\`te]5xwpX4+pgW3Ifስdko\jw*nfF̵2;IDa}2mFpnwJU3m;ٹrʵ?nU: ^Ou^LWCOn\^z ZV3纻+%1>\ۖl\5qݷ_WOw'NxIFG?o6?[=OږhsX5a6>_g-\k &a:kY Lf.Ԧ'%|s'܏׼u/f&NlKƏJע.uM7͕t-.*mMԥ\B}Y L1=3_u7\zᒭfN3Zt3F0} 5og}n=?դ;8yACiܰqĚ<;; KADR.azzZ917_ݭ{J-iugmrPiFb\ _ JE1EHBH kwvf8Pcٙ={\{;Wp~*.#4fe^mD5fu*Ĩ%o $AĽTShV7?a{ps2L(-0)4PK GCX&_q81)%v]j1W٫G ;E)}z>wOu{G%lj٘=*l__v$>lIENDB`plugins/imagemanager/css/_cache/im_core_css.gz000066600000012062150472426320015475 0ustar00-PP >xsd1s>]O9Џ*eD(I؂[ք# @n0hZIqlQ XbH JDz]Ue$d"| ςDJց #p3*KEht+d.k<51&AJÂ@ >EPJ$ Xf7^Cx&|ճ1X/r.}(:p_7I oizwϣo螬E lCiP[$ԋU-r,7s Xo {$j ژĜ#Wyh.+qH53˳; Dm =jC~ҲdߑKGrkԥxdْh ^{ꭦx1L'T;ŵO[70кRfET E2<DtϤfMfGh,`1>w-dU^PID9}5~r(ݩL0gl/|ƸrUjWI.s93Sݵ(w(&"1t`F*ݞ4e3H#ZTp3]TtG_D۹ƬFk$ȷ\u8VȏE˝!;֊?jҖ(sv#ϑtterw ra.wPc̲vTv*OBtxn<\V_8ݷz hffC jS:4kl!fY) Bp1=%pRY$LEoFhlłPOVtoS]Yi,z&p<&/Hִdî@8`.+$_CJY通-.e¾/7RW.}R {$fN^ ?͞y$~fόhy ៀS8k3K-."^گw;CpPqN \bDHv6ǯczn>:lv%PGf °o1r,vG|nfúF\z{j:^(ֽZ\;mHTC4hΧǖ]}:ޗ!Nd#e<ȳ7Gm.Z{IKۂ>'(xVqDE-l.A3SֶJk.F#$fB'O+q6geg*$0*tMQ&)ִP;B>QU4(>BY̺:JtZ;;i5TK}%_ZwR 0R{${YZE)[$rj>1#$w҈~4v =z!bUcmm:?Vp#{ܛ){ym0UTSc-J)ه)l (n mK[8۠RkG\*1[,ϣALkC-_P Ɇ,ݬA{ " ƊY<ޮtOnd(ya aLF"N }zo({Fg|-"Å&Bp2 篦T XG+ t8*ϟ7ڒ^gwЉS_^ d,D5.Xҁ˵^\_*/Qt)ڕBUOQ{V&ODO Қt4)Rz\ܙپ%$GNF`;)TEzC4A'TOVFg_ӕCHo}>\{hX]j'RK9{"[#7KHd5,ٯk[lZ4AEy %Ԧd?G>,E!.L9 @q_ou㤈;[8K-'o֒dmW:H/%Iӛxگ%K_Ȓt&?]YߧFz1߭׈_=J ׍֯U0N;sΡ6Iڼ>"Ry~2B:*FOזuBqN L{b:sYì=4kr)-ŒQC ڑ.{~" j9w23XO)jW3&;Iq<攏n?emj_Lęyx|K FO䙄>IV^N,r`Qc6!/ ?Kvgnmf10kplugins/imagemanager/css/_cache/im_core_css.css000066600000065532150472426320015657 0ustar00/* Image Manager */ /* core stuff */ /* ########################################################## */ body { background:#fff; color:#000; margin:0 0; padding:0; font:70% arial, helvetica, sans-serif; text-align:center; } td { font-size: 11px; } img { behavior:expression(PNG.fix(this)); border: 0; } hr { clear:both; border:0; color:#e5e5e5; background-color:#e5e5e5; height:1px; } div { font-size:11px; } /* Lists */ ul { margin:0; padding:0; list-style:none; } ul li { margin:0; padding:0; } /* Layout */ #center { width:auto; max-width:1200px; margin:0 auto; text-align:left; } /* Links */ a {background:transparent; } a:link {color:#000; } a:visited {color:#000; } a:visited:hover {color:#000; } a:hover {color:#000; } a:active {color:#000; } #thearea { position:relative; } #secondarea { position:absolute; left:200px; } /* Page navigation */ /* ########################################################## */ .pagenav { float: left; color: #484848; display: none; line-height: 16px; height: 16px; z-index:1; } * html .pagenav {/* double margin ie6 bug fix */ display:inline; } .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0 2px; } .pagenav * {float:left; display:block} .pagenav a {outline:0 } .pagenav .prev {background:url('../pages/im/css/../img/left.gif') no-repeat left; width:20px; height:16px; text-decoration:none; behavior:expression(PNG.fix(this));} .pagenav .next {background:url('../pages/im/css/../img/right.gif') no-repeat right; width:20px; height:16px; text-decoration:none; behavior:expression(PNG.fix(this));} .pagenav input {padding:0; width:20px; text-align:center; font-size:10px; margin:0 4px 0 4px } .pagenav .disabled {opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); cursor:default} #progress { background: url('../pages/im/css/../img/loading.gif') no-repeat; padding-left: 20px; } /* View mode */ /* ########################################################## */ .viewmode { float:right; margin:0 25px 0 0; display:inline; height: 25px; color:#484848; z-index:1; white-space:nowrap; } .viewmode .desc { float:left; margin:3px 4px 0 0; } .viewmode a img { margin-bottom:-5px; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); } .viewmode a.listactive img { opacity:1; -ms-filter:'alpha(opacity=100)'; filter:alpha(opacity=100); } .viewmode a.listactive { font-weight:bold; } #viewcontainer #filelist { position:relative; } /* List container */ #listcontainer { position:relative; } * html #listcontainer {/* double margin ie6 bug fix */ display:inline; } /* Left side folders */ /* ########################################################## */ #folders { position:absolute; top:0; left:2px; margin:0; width:192px; background:url(../pages/im/css/../img/folder-middle-bg.png) bottom left; z-index:1; } #folders h2 { margin:0; padding:20px 10px 10px 10px; background:url(../pages/im/css/../img/folder-top-bg.png) top left; font-size:100%; color:#7791c4; } #folders h3 { margin:10px 2px 0 2px; padding:10px 8px 10px 8px; font-size:100%; color:#7791c4; border-top:1px solid #9ab0d7; } #folders a { text-decoration:none; behavior:expression(PNG.fix(this)); } #folders .categories { margin:0 6px 0 10px; } #folders .categories li a { background:url(../pages/im/css/../img/icons/category-closed.png) no-repeat; padding:2px 2px 0 24px; display:block; min-height:16px; } #folders .categories li.current a { background:url(../pages/im/css/../img/icons/category-open.png) no-repeat; font-weight:bold; } #folders .special { margin:5px 6px 0 10px; } #folders .special li a { padding: 2px 2px 0 24px; display: block; min-height: 16px; height: 16px; line-height: 16px; } #folders .folders { margin:0 6px 0 10px; } #folders div { background:url(../pages/im/css/../img/folder-bottom-bg.png) no-repeat bottom left; } #folder_list { padding:0 0 20px 0; } #folders .folders li a { background:url(../pages/im/css/../img/folder.png) no-repeat; padding:2px 2px 0 24px; display:block; min-height:16px; } #folders .folders li.parent a { background:url(../pages/im/css/../img/icons/up.png) no-repeat; } #folders .folders li.current a { background:url(../pages/im/css/../img/icons/folders-open.png) no-repeat; font-weight:bold; } #folders .preview { margin:0 0 4px 10px; } #folders .previewact { padding:0 0 20px 10px; } #folders a:hover { color:#2e4e8c; } #folders .folders li.progress { background: url('../pages/im/css/../img/loading.gif') no-repeat; height: 16px; line-height: 16px; padding-left: 20px; } .folder .name, .parent .name { font-weight:bold; } /* ########################################################## */ #toolbar.caption span.caption { display: inline; } #toolbar a {outline:0 } /* Validation classes */ label.msg { display:none; } label.invalid { color:#aa0000; display:inline; } input.invalid { background-color:#d63232; } div label.invalid { display:block; } /* Dialog facts */ #facts { height:30px; } /* Toolbar */ /* ########################################################## */ #topnav { background:url('../pages/im/css/../img/toolbar.png') no-repeat bottom left; } #topwrap { background:url('../pages/im/css/../img/toolbar.png') no-repeat bottom right; margin:0px 0px 0px 30px; } #settings { display:none; position:absolute; top:20px; right:-4px; width:14em; line-height:14px; text-align:right; background:#fff; padding:4px; border:1px solid #959595; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:100; } #settings a { display:inline; padding:0px; } /* Inside stuff */ .toolbar { margin:0px; padding:2px 20px 10px 0px; font:90% tahoma, arial, sans-serif; } #tools li a { font-size:11px; } .toolbar div.filter { padding-right: 20px; width: 125px; } .filter input { width: 123px; background: transparent; border: 1px solid #aaaaaa; font-size: 10px; } .toolbar .navigation { margin:0px 2px; padding: 0; float: left; width: 170px; padding-bottom: 12px; } .navigation .desc { margin:0px 0px 4px 0px; background:url('../pages/im/css/../img/navdesc_bg.gif') no-repeat right; } .navigation .path { margin-bottom:5px; width:260px; overflow:hidden; } .toolbar .icons { margin:14px 0px 0px 0px; float:right; } .toolbar .icon { margin:0px 2px 0px 1px; padding:0px; float:left; line-height:0px; position:relative; } .toolbar .disabled img { opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30); } .toolbar .disabled a { color: #AAA; } .toolbar .disabled a:hover { background: transparent; cursor: default; } /* Icons */ .icon a { text-decoration:none; padding:2px; display:block; } .icon a:hover { background:#d3d0ce; } .icon .caption { position:relative; top:-4px; display:none; padding:0px 4px 0px 4px; } .toolbar .separator { margin:0px 4px; float:left; } /* Thumbnail view */ /* ########################################################## */ #viewcontainer { padding-left: 212px; padding-top: 10px; } #thumbs { margin:0 10px 10px 0px; } #textlists { margin:0 10px 10px 0px; } .thumbnail { position:relative; float:left; margin:3px; background:url(../pages/im/css/../img/im-topright.gif) no-repeat top right; text-align:center; } .thumbnail .wrap { background:url(../pages/im/css/../img/im-topleft.gif) no-repeat; } .thumbnailimage { border: 0; } .pic { position:relative; margin:0px auto 0px; } .pic[class] { display:table; position:static; padding-top:6px; } .mid { position:absolute; top:50%; left:50%; } /* ie6 */ .mid a { position:relative; top:-50%; left:-50%; } /* ie6 */ html>body .mid { position:absolute; top:50%; left:50%; } /* ie7 */ html>body .mid a { position:relative; top:-60%; left:-50%; } /* ie7 */ html:not([dummy]) .mid[class] { display:table-cell; vertical-align:middle; position:static; } /* ff + safari */ html:not([dummy]) .mid a { position:static; } /* ff + safari */ @media all and (min-width:0px) { html>body .mid { display:table-cell; vertical-align:middle; position:static; } } /* opera */ @media all and (min-width:0px) { html>body .mid a { position:static; } } /* opera */ .details { background:url(../pages/im/css/../img/im.gif) no-repeat bottom right; text-align:left; } .details .wrap2 { background:url(../pages/im/css/../img/im-botleft.gif) no-repeat bottom left; width:25px; line-height:11px; } .name { margin:0px 5px; padding:3px 0px 2px 0px; font:90% tahoma, arial, sans-serif; overflow:hidden; text-align:center; line-height: 16px; height:16px; white-space:nowrap; } * html .name { height:21px; } .name a { text-decoration:none; color:#000; } .name a:hover { color:#827a69; } .parent .act { display: none; } .act { position:absolute; bottom:3px; right:3px; cursor:pointer; } /* List view */ /* ########################################################## */ .listview { position:relative; margin:3px; background:url('../pages/im/css/../img/im-topright.gif') no-repeat top right; float:left; text-align:left; width:100px; } .listview .name {width:75px} .listview .wrap { width:15px; height:2px; background: url('../pages/im/css/../img/im-topleft.gif') no-repeat; line-height:0px; font-size:0px; } /* dialog popups */ /* ########################################################## */ body { overflow: auto; } .dialog { position:relative; text-align:left; width:100%; } .dialog .top { padding:10px 12px; background:#f3f2f0 url('../pages/im/css/../img/dialog-top.png') no-repeat right bottom; behavior:expression(PNG.fix(this)); } .dialog .close { position:absolute; top:4px; right:4px; } .dialog h2 { font:bold 115% tahoma, arial, sans-serif; margin:0px; } .dialog .description { margin:0px; } .dialog .headline { padding:8px 0px 12px 40px; } .dialog .createdir { background: url('../pages/im/css/../img/dialog-icon-newfolder.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../pages/im/css/../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../pages/im/css/../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .facts { background:#f3f2f0; padding:8px 16px 12px 20px; font:90% tahoma, arial, sans-serif; } .dialog .body { padding:8px 16px 12px 20px; } #content { display: none; } /* Upload */ #uploadarea { position: relative; padding: 16px; height: 220px; overflow: hidden; } * html #uploadarea { height: 208px; } #uploadarea .small { margin: 2em 0 -1em; color: #6d88c4; font-size: 0.9em; text-transform: uppercase; } #uploadarea #add.hidden { display: none; } #uploadarea .addbutton, #uploadarea #uploadstart { display: block; width: 182px; height: 26px; margin: 0 0 1em; background: url(../pages/im/css/../img/submit-greyWide.png) no-repeat; text-align: center; font-size: 1em; font-weight: bold; line-height: 26px; text-decoration: none; } #uploadarea #uploadstart { background: url(../pages/im/css/../img/submit-wide.png) no-repeat; } #uploadarea #fileblock { position:relative; top:400px; } #uploadarea #filelist { position:relative; max-height: 7em; overflow: auto; margin-bottom: 6px; border: 1px solid #9fadc4; } * html #uploadarea #filelist { height: 7em; } #uploadarea #fileshead { width: 100%; font-weight: bold; background: #eee; border-bottom: 1px solid #fff; } #uploadarea #files { width: 490px; } #uploadarea #status { position: absolute; top: 4px; border: 1px solid #9fadc4; padding: 1px; width: 506px; height: 34px; display: none; } #uploadarea #progressbar { position: relative; width: 100%; height: 34px; background: url(../pages/im/css/../img/progress.gif); z-index: 10; } #uploadarea .progresstext { position: absolute; top: 0; left: 0; width: 100%; text-align: center; color: #535353; font-weight: bold; line-height: 36px; z-index: 11; } #uploadarea .progresstext a { text-decoration: none; color: #535353; } #files .fname a {display:block; width:295px; overflow:hidden} #files .disabled {text-decoration:none; cursor:default} #files .done {color:gray} #files .failed {color:red} #multiupload_view {display:none} #singleupload_view {display:none} #multiupload_view #selectview {position:relative} #files input.text {width:290px; margin:0; padding:0} /* Forms */ /* ########################################################## */ form { margin:0px; padding:0px; } select { font:100% tahoma; } input.file, input.text { font:90% tahoma, arial, sans-serif; } /* Submit buttons */ input.submit, .button { width:94px; height:26px; padding:0 0 2px; border:0; background:url('../pages/im/css/../img/submit-grey.png') no-repeat; font:normal 100%/100% tahoma, arial, sans-serif; text-align: center; text-decoration: none; } .button.disabled { cursor: text; color: gray; } input.default { background:url('../pages/im/css/../img/submit-default.png') no-repeat; font-weight:bold; } input.cancel { background:url('../pages/im/css/../img/submit-grey.png') no-repeat; font-weight:normal; } a.button { padding-top: 6px; text-align: center; text-decoration: none; } /* Menu */ .menu { margin: 0; padding: 0; position: absolute; border: 1px solid #d4d0c8; background: #EAE9E5; z-index: 1000; width: 100px; } .menu a { display: block; color: #000; text-decoration: none; padding: 3px; text-align: left; overflow:auto; /* FF */ } .menu a:hover { background-color: #dbecf3 } .menu .submenu { background: url(../pages/im/css/../img/menu_arrow.gif) no-repeat center right } .menu .active { background: #dbecf3 url(../pages/im/css/../img/menu_arrow.gif) no-repeat center right } .menu .active a:hover { background-color: transparent } .menu .separator { border-top: 1px solid gray; height: 1px; overflow: hidden } .menu .separator a { display: none } .menu .disabled a { cursor: default; color: #aaa } /* Menu icons */ .menu a { background-image: url(../pages/im/css/../img/menu_icons.gif); background-repeat: no-repeat } .menu .add a { background-position: 0 -60px } .menu .delete a { background-position: 0 -80px } .menu .copy a { background-position: 0 0 } .menu .cut a { background-position: 0 -20px } .menu .paste a { background-position: 0 -40px } .menu .moveup a { background-position: 0 -100px } .menu .movedown a { background-position: 0 -120px } /* * * clearlooks2 - Gnome theme * * */ .clearlooks2 { position: absolute; left: 20px; top: 20px; width: 320px; height: 240px; overflow: hidden; color: white; display: none; text-align: left; } .clearlooks2_progress { position: absolute; left: 0; top: 0; width: auto; height: 30px; z-index: 100100; display: none; border: 1px solid gray; background: #FFF url('../pages/im/css/../img/loading.gif') no-repeat 5px 8px; text-align: left; } .clearlooks2_progress .message { padding-left: 30px; padding-right: 10px; font-family: Arial, Verdana; font-weight: bold; line-height: 30px; } .clearlooks2_event_blocker, .clearlooks2_visible_event_blocker { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 100001; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2_visible_event_blocker { opacity:0.7; -ms-filter:'alpha(opacity=70)'; filter:alpha(opacity=70); background: #FFF; } .clearlooks2_placeholder { position: absolute; left: 0; top: 0; border: 1px dotted black; display: none; z-index: 100002; } /* Alert */ .clearlooks2 .alert { text-align: left; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; font-weight: bold; text-decoration: none; } .clearlooks2 .alert .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .bigicon { display: none; } .clearlooks2 .alert .bigicon, .clearlooks2 .confirm .bigicon, .clearlooks2 .status .bigicon { position: absolute; left: 15px; top: 15px; width: 32px; height: 32px; display: block; } .clearlooks2 .alert .info, .clearlooks2 .status .info { background-image: url('../pages/im/css/../img/clearlooks2/alert_info.gif'); } .clearlooks2 .alert .warning, .clearlooks2 .status .warning { background-image: url('../pages/im/css/../img/clearlooks2/alert_warn.gif'); } .clearlooks2 .alert .error, .clearlooks2 .status .error { background-image: url('../pages/im/css/../img/clearlooks2/alert_error.gif'); } .clearlooks2 .alert .message, .clearlooks2 .confirm .message { position: absolute; left: 55px; top: 15px; width: 325px; height: 40px; overflow: auto; } .clearlooks2 .ok, .clearlooks2 .cancel { position: absolute; left: 160px; top: 65px; width: 80px; height: 30px; background-image: url('../pages/im/css/../img/clearlooks2/button.gif'); text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 30px; font-weight: bold; text-decoration: none; } /* Confirm dialog */ .clearlooks2 .confirm .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .confirm .ok { left: 110px; } .clearlooks2 .confirm .cancel { left: 210px; } .clearlooks2 .confirm .ask { background-image: url('../pages/im/css/../img/clearlooks2/alert_info.gif'); } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Status dialog */ .clearlooks2 .status .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .status .ok { top: 178px; } .clearlooks2 .status .statustext { position: absolute; left: 10px; top: 8px; width: 360px; height: 150px; border: 1px solid gray; overflow: auto; padding: 5px; } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Chromeless window */ .clearlooks2 .chromeless .resize, .clearlooks2 .chromeless .action, .clearlooks2 .chromeless .statusbarbottom { display: none; } .clearlooks2 .chromeless .middle .action { display: block; } .clearlooks2 .chromeless .windowtop, .clearlooks2 .chromeless .window { height: 5px; } .clearlooks2 .chromeless .windowtop .left { position: absolute; left: 0; top: 0; width: 5px; height: 5px; background: transparent url('../pages/im/css/../img/clearlooks2/top_chromeless_left.gif') no-repeat; } .clearlooks2 .chromeless .windowtop .middle { position: absolute; right: 5px; width: 100%; height: 5px; background: transparent url('../pages/im/css/../img/clearlooks2/top_chromeless_middle.gif') no-repeat 5px 0; clip: rect(auto auto auto 10px); } .clearlooks2 .chromeless .windowtop .right { position: absolute; right: 0; top: 0; width: 5px; height: 5px; background: transparent url('../pages/im/css/../img/clearlooks2/top_chromeless_right.gif') no-repeat; } .clearlooks2 .chromeless .windowmiddle { top: 5px; } /* Top section */ .clearlooks2 .windowtop .middle-fg { display: none; } .clearlooks2 .windowtop { position: absolute; width: 100%; height: 23px; overflow: hidden; } .clearlooks2 .windowtop .left { position: absolute; left: 0; top: 0; width: 6px; height: 23px; background: transparent url('../pages/im/css/../img/clearlooks2/top_left.gif') no-repeat; } .clearlooks2 .windowtop .middle { position: absolute; right: 6px; width: 100%; height: 23px; background: transparent url('../pages/im/css/../img/clearlooks2/top_middle.gif') no-repeat 12px 0; clip: rect(auto auto auto 12px); /* Safari hack */ } .clearlooks2 .windowtop .right { position: absolute; right: 0; top: 0; width: 6px; height: 23px; background: transparent url('../pages/im/css/../img/clearlooks2/top_right.gif') no-repeat; } .clearlooks2 .windowtop .title { position: absolute; left: 0; top: 0; width: 100%; height: 19px; text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; font-weight: bold; } /* Top section - Focus */ .clearlooks2 .focustop .left { background: transparent url('../pages/im/css/../img/clearlooks2/top_left.gif') no-repeat -6px 0; } .clearlooks2 .focustop .middle { background: transparent url('../pages/im/css/../img/clearlooks2/top_middle.gif') no-repeat 12px -23px; } .clearlooks2 .focustop .right { background: transparent url('../pages/im/css/../img/clearlooks2/top_right.gif') no-repeat -6px 0; } .clearlooks2 .focus .title { color: #FFF; } /* Middle section */ .clearlooks2 .windowmiddle { position: absolute; top: 23px; width: 100%; z-index: 5; } .clearlooks2 .windowmiddle .left { position: absolute; left: 0; top: 0; width: 4px; height: 100%; background-image: url('../pages/im/css/../img/clearlooks2/middle_left.gif'); } .clearlooks2 .windowmiddle .middle { position: absolute; left: 4px; top: 0; width: 100%; height: 100%; background-color: #FFF; color: #000; } .clearlooks2 .windowmiddle .right { position: absolute; right: 0; top: 0; width: 4px; height: 100%; background-image: url('../pages/im/css/../img/clearlooks2/middle_right.gif'); } /* Bottom section */ .clearlooks2 .windowbottom { position: absolute; left: 0; bottom: 0; width: 100%; height: 5px; overflow: hidden; z-index: 5; } .clearlooks2 .windowbottom .left { position: absolute; left: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../pages/im/css/../img/clearlooks2/bottom_left.gif'); overflow: hidden; } .clearlooks2 .windowbottom .middle { position: absolute; left: 5px; bottom: 0; width: 100%; height: 5px; background: url('../pages/im/css/../img/clearlooks2/bottom_middle.gif'); overflow: hidden; } .clearlooks2 .windowbottom .right { position: absolute; right: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../pages/im/css/../img/clearlooks2/bottom_right.gif'); overflow: hidden; } /* Statusbar */ .clearlooks2 .statusbarbottom { height: 24px; overflow: hidden; z-index: 5; } .clearlooks2 .statusbarbottom .left { bottom: 0; width: 5px; height: 23px; background-image: url('../pages/im/css/../img/clearlooks2/statusbar_left.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .middle { height: 23px; background-image: url('../pages/im/css/../img/clearlooks2/statusbar_middle.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .right { width: 20px; height: 23px; background-image: url('../pages/im/css/../img/clearlooks2/statusbar_right.gif'); overflow: hidden; } .clearlooks2 .windowbottom .statustext { display: none; } .clearlooks2 .statusbarbottom div.statustext { display: block; position: absolute; left: 6px; bottom: 0; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; } .clearlooks2 .resizable .statusbarbottom .resize-se { background-image: url('../pages/im/css/../img/clearlooks2/statusbar_resize.gif'); width: 20px; height: 23px; } /* Actions */ .clearlooks2 .action { position: absolute; cursor: pointer; overflow: hidden; } .clearlooks2 .close, .clearlooks2 .min, .clearlooks2 .med, .clearlooks2 .max { z-index: 3; } .clearlooks2 .resizable .min { right: 68px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat 0 0; background-repeat: no-repeat; } .clearlooks2 .resizable .med { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -29px 0; background-repeat: no-repeat; } .clearlooks2 .resizable .max { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -58px 0; background-repeat: no-repeat; } .clearlooks2 .close { right: 6px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -87px 0; } /* Actions - Focus */ .clearlooks2 .focustop .min { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat 0 -16px; } .clearlooks2 .focustop .med { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -29px -16px; } .clearlooks2 .focustop .max { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -58px -16px; } .clearlooks2 .focustop .close { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -87px -16px; } /* Actions - Hover */ .clearlooks2 .focustop .min:hover { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat 0 -32px; } .clearlooks2 .focustop .med:hover { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -29px -32px; } .clearlooks2 .focustop .max:hover { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -58px -32px; } .clearlooks2 .focustop .close:hover { background: transparent url('../pages/im/css/../img/clearlooks2/buttons.gif') no-repeat -87px -32px; } /* Move and resize handles */ .clearlooks2 .move { top: 0; left: 0; width: 100%; height: 19px; cursor: move; z-index: 1; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resize { display: none; z-index: 4; } .clearlooks2 .resizable .resize { display: block; } .clearlooks2 .resizable .resize-w { top: 0; left: 0; width: 5px; height: 100%; cursor: w-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-e { top: 0; right: 0; width: 5px; height: 100%; cursor: e-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-n { top: 0; left: 0; width: 100%; height: 5px; cursor: n-resize; overflow: hidden; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-nw { top: 0; left: 0; width: 5px; height: 19px; cursor: nw-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-ne { top: 0; right: 0; width: 5px; height: 19px; cursor: ne-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-sw { bottom: 0; left: 0; width: 5px; height: 5px; cursor: sw-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-s { bottom: 0; left: 0; width: 100%; height: 5px; cursor: s-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-se { bottom: 0; right: 0; width: 5px; height: 5px; cursor: se-resize; background-image: url('../pages/im/css/../img/clearlooks2/transparent.gif'); } #folders .special li a.history { background: url(../plugins/History/css/../img/clock.png) no-repeat; } #folders .special li a.favorites { background: url(../plugins/Favorites/css/../img/favorites.png) no-repeat; } plugins/imagemanager/css/index.php000066600000003435150472426320013270 0ustar00dispatchEvent("onPreInit", array($type)); $config = $man->getConfig(); $compressor = new Moxiecode_CSSCompressor(array( 'expires_offset' => 3600 * 24 * 10, 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => false, 'charset' => 'UTF-8', 'name' => $theme . "_" . $package, 'convert_urls' => true )); $resources = new Moxiecode_ClientResources(); // Load theme resources $resources->load('../pages/' . $theme . '/resources.xml'); // Load plugin resources $plugins = explode(',', $config["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); $files = $resources->getFiles($package); if ($resources->isDebugEnabled() || checkBool($config["general.debug"])) { header('Content-type: text/css'); $pagePath = dirname($_SERVER['SCRIPT_NAME']); echo "/* Debug enabled, css files will be loaded without compression */\n"; foreach ($files as $file) echo '@import url("' . $pagePath . '/' . $file->getPath() . '");' . "\n"; } else { foreach ($files as $file) $compressor->addFile($file->getPath(), $file->isRemoveWhiteSpaceEnabled()); $compressor->compress($package); } ?>plugins/imagemanager/editor_plugin.js000066600000035266150472426320014071 0ustar00/** * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ (function() { window.mcImageManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'image,media' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; i'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinymce.DOM.encode(v); } } )); } }, v)); }); }, getInfo : function() { return mcImageManagerPlugin.getInfo(); }, createControl: function(n, cm) { var t = this, c, ed = t.editor, v; switch (n) { case 'insertimage': v = ed.getParam('imagemanager_insert_template'); if (v instanceof Array) { c = cm.createMenuButton('insertimage', { title : 'imagemanager_insertimage_desc', image : t.url + '/pages/im/img/insertimage.gif', icons : false }); c.onRenderMenu.add(function(c, m) { tinymce.each(v, function(v) { m.add({title : v.title, onclick : function() { ed.execCommand('mceInsertImage', false, v); }}); }); }); } else { c = cm.createButton('insertimage', { title : 'Загрузка и вставка картинок', image : t.url + '/pages/im/img/insertimage.gif', onclick : function() { ed.execCommand('mceInsertImage', false, {template : v}); } }); } return c; } return null; } }); tinymce.PluginManager.add('imagemanager', tinymce.plugins.ImageManagerPlugin); tinymce.ScriptLoader.load((tinymce.PluginManager.urls['imagemanager'] || tinymce.baseURL + '/plugins/imagemanager')+ '/language/index.php?type=im&format=tinymce_3_x&group=tinymce&prefix=imagemanager_'); } // Setup TinyMCE 2.x plugin if (window.TinyMCE_Engine) { var TinyMCE_ImageManagerPlugin = { setup : function() { var b = (window.realTinyMCE || tinyMCE).baseURL; mcImageManager.baseURL = b + '/plugins/imagemanager/js'; document.write(''); }, initInstance : function(ed) { ed.settings.file_browser_callback = 'mcImageManager.filebrowserCallBack'; mcImageManager.settings.handle = tinyMCE.getParam('imagemanager_handle', mcImageManager.settings.handle); }, getControlHTML : function(cn) { switch (cn) { case "insertimage": return tinyMCE.getButtonHTML(cn, 'lang_imagemanager_insertimage_desc', '{$pluginurl}/pages/im/img/insertimage.gif', 'mceInsertImage', false); } return ""; }, getInfo : function() { return mcImageManagerPlugin.getInfo(); }, execCommand : function(id, el, cmd, ui, v) { var ed = tinyMCE.getInstanceById(id); if (cmd == 'mceInsertImage') { mcImageManager.browse(tinyMCE.extend({ path : tinyMCE.getParam("imagemanager_path"), rootpath : tinyMCE.getParam("imagemanager_rootpath"), remember_last_path : tinyMCE.getParam("imagemanager_remember_last_path"), custom_data : tinyMCE.getParam("imagemanager_custom_data"), insert_filter : tinyMCE.getParam("imagemanager_insert_filter"), oninsert : function(o) { var ci = o.focusedFile.custom; if (!ci.thumbnail_url) { ci.thumbnail_url = url; ci.twidth = ci.width; ci.theight = ci.height; } ed.execCommand('mceInsertContent', false, mcImageManagerPlugin.replace( tinyMCE.getParam('imagemanager_insert_template', ''), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinyMCE.xmlEncode(v); } } )); } }, v)); return true; } return false; } }; TinyMCE_ImageManagerPlugin.setup(); tinyMCE.addPlugin('imagemanager', TinyMCE_ImageManagerPlugin); } })(); plugins/imagemanager/plugins/_Template/Template.php000066600000016102150472426320016532 0ustar00getConfig(); // Override option $config['somegroup.someoption'] = true; return true; } /** * Gets called before a file action occurs for example before a rename or copy. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param BaseFile $file1 File object 1 for example from in a copy operation. * @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeFileAction(&$man, $action, $file1, $file2) { return true; } /** * Gets called after a file action was perforem for example after a rename or copy. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param BaseFile $file1 File object 1 for example from in a copy operation. * @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onFileAction(&$man, $action, $file1, $file2) { return true; } /** * Gets called before a RPC command is handled. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeRPC(&$man, $cmd, $input) { return null; } /** * Gets executed when a RPC command is to be executed. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { return null; } /** * Gets called before data is streamed to client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeStream(&$man, $cmd, $input) { return true; } /** * Gets called when data is streamed to client. This method should setup * HTTP headers, content type etc and simply send out the binary data to the client and the return false * ones that is done. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onStream(&$man, $cmd, $input) { return true; } /** * Gets called after data was streamed to client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to was performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onAfterStream(&$man, $cmd, $input) { return true; } /** * Gets called before data is streamed/uploaded from client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeUpload(&$man, $cmd, $input) { return true; } /** * Gets called when data is streamed/uploaded from client. This method should take care of * any uploaded files and move them to the correct location. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return object Result object data or null if the event wasn't handled. */ function onUpload(&$man, $cmd, $input) { return null; } /** * Gets called before data is streamed/uploaded from client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to was performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onAfterUpload(&$man, $cmd, $input) { return true; } /** * Gets called when custom data is to be added for a file custom data can for example be * plugin specific name value items that should get added into a file listning. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param BaseFile $file File reference to add custom info/data to. * @param string $type Where is the info needed for example list or info. * @param Array $custom Name/Value array to add custom items to. * @return bool true/false if the execution of the event chain should continue. */ function onCustomInfo(&$man, &$file, $type, &$custom) { return true; } /** * Gets called when the user selects a file and inserts it into TinyMCE or a form or similar. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param BaseFile $file Implementation of the BaseFile class that was inserted/returned to external system. * @return bool true/false if the execution of the event chain should continue. */ function onInsertFile(&$man, &$file) { return true; } } // Add plugin to ManagerEngine $man->registerPlugin("template", new Moxiecode_TemplatePlugin()); ?>plugins/imagemanager/plugins/Favorites/resources.xml000066600000000417150472426320017034 0ustar00 plugins/imagemanager/plugins/Favorites/css/favorites.css000066600000000126150472426320017601 0ustar00#folders .special li a.favorites { background: url(../img/favorites.png) no-repeat; } plugins/imagemanager/plugins/Favorites/js/favorites.js000066600000003115150472426320017252 0ustar00(function($){ var man = window.FileManager || window.ImageManager, type = window.FileManager ? 'fm' : 'im'; man.addSpecialFolder({title : '{#favorites.special_folder_title}', path : 'favorite:///', type : 'favorites'}); // Add menu items to context menu $().bind('DropMenu:beforeshow', function(e, m) { if (man.path.indexOf('://') == -1) { m.addSeparator(); m.add({title : $.translate('{#favorites.addfavorites}'), disabled : man.isDisabled('addfavorites') || !man.selectedFiles.length, onclick : addFavorites}); } if (man.path.indexOf('favorite://') != -1) { m.addSeparator(); m.add({title : $.translate('{#favorites.removefavorites}'), disabled : man.isDisabled('removefavorites') || !man.selectedFiles.length, onclick : removeFavorites}); } }); $().bind('filelist:changed', function() { if (man.path.indexOf('favorite://') != -1) { $(man.tools).each(function(i, v) { man.setDisabled(v, 1); }); } }); function addFavorites() { var args = {}; $(man.selectedFiles).each(function(i, f) { args['path' + i] = f.path; }); RPC.exec(type + '.addFavorites', args, function(data) { RPC.handleError({message : '{#error.addfavorites_failed}', visual_path : args.visual_path, response : data}); }); }; function removeFavorites() { var args = {}; $(man.selectedFiles).each(function(i, f) { args['path' + i] = f.path; }); RPC.exec(type + '.removeFavorites', args, function(data) { if (!RPC.handleError({message : '{#error.removefavorites_failed}', visual_path : args.visual_path, response : data})) man.listFiles(); }); }; })(jQuery); plugins/imagemanager/plugins/Favorites/Favorites.php000066600000014455150472426320016762 0ustar00registerFileSystem('favorite', 'FavoriteFile'); return true; } function onRPC(&$man, $cmd, $input) { if ($cmd == "addFavorites") return $this->_addFavorites($man, $input); if ($cmd == "removeFavorites") return $this->_removeFavorites($man, $input); return null; } function _removeFavorites(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input['path' . $i]); $i++) { $status = $this->removeFavorite($man, $input["path". $i]); if ($status) $result->add("OK", $man->encryptPath($input["path". $i]), "Path was removed."); else $result->add("FAILED", $man->encryptPath($input["path". $i]), "Path was not removed."); } return $result->toArray(); } function _addFavorites(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input['path' . $i]); $i++) { $status = $this->addFavorite($man, $input["path". $i]); if ($status) $result->add("OK", $man->encryptPath($input["path". $i]), "Path was added."); else $result->add("FAILED", $man->encryptPath($input["path". $i]), "Path was not added."); } return $result->toArray(); } function addFavorite(&$man, $path) { $config = $man->getConfig(); $maxfavorites = isset($config["favorites.max"]) ? $config["favorites.max"] : $this->_maxfavorites; $type = $man->getType(); $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); if (count($patharray) > 0) { for($i=0;$i $maxfavorites) array_pop($patharray); } else $patharray[] = $path; $cookievalue = implode(",", $patharray); $this->setCookieData($type, $cookievalue); return true; } function getCookieData($type) { if ($this->_cookieData) return $this->_cookieData; if (isset($_COOKIE["MCManagerFavoriteCookie_". $type])) return $_COOKIE["MCManagerFavoriteCookie_". $type]; else return ""; } function setCookieData($type, $val) { $this->_cookieData = $val; setcookie("MCManagerFavoriteCookie_". $type, $val, time()+(3600*24*30)); // 30 days } function clearFavorites(&$man) { setcookie ("MCManagerFavoriteCookie_". $man->getType(), "", time() - 3600); // 1 hour ago return true; } function removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$isetCookieData($type, $cookievalue); return true; } } class FavoriteFile extends Moxiecode_BaseFileImpl { function FavoriteFile(&$manager, $absolute_path, $child_name = "", $type = MC_IS_FILE) { $absolute_path = str_replace('favorite://', '', $absolute_path); Moxiecode_BaseFileImpl::Moxiecode_BaseFileImpl($manager, $absolute_path, $child_name, $type); } function canRead() { return true; } function canWrite() { return false; } function exists() { return true; } function isDirectory() { return true; } function isFile() { return false; } function getParent() { return null; } function getParentFile() { return null; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new DummyFileFilter()); return $files; } /** * Returns an array of MCE_File instances based on the specified filter instance. * * @param MCE_FileFilter &$filter MCE_FileFilter instance to filter files by. * @return Array array of MCE_File instances based on the specified filter instance. */ function listFilesFiltered(&$filter) { $files = array(); $man = $this->_manager; $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); if (IndexOf($cookievalue, ",") != -1) $patharray = split(",", $cookievalue); else if ($cookievalue != "") $patharray[] = $cookievalue; foreach ($patharray as $path) { if (!$man->verifyPath($path)) continue; $file = $man->getFile($path); if (!$file->exists()) { $this->_removeFavorite($man, $path); continue; } if ($man->verifyFile($file) < 0) continue; if ($filter->accept($file) == BASIC_FILEFILTER_ACCEPTED) $files[] = $file; } return $files; } function _getCookieData($type) { if (isset($_COOKIE["MCManagerFavoriteCookie_". $type])) return $_COOKIE["MCManagerFavoriteCookie_". $type]; else return ""; } function _removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$i_setCookieData($type, $cookievalue); return true; } function _setCookieData($type, $val) { setcookie("MCManagerFavoriteCookie_". $type, $val, time() + (3600 * 24 * 30)); // 30 days } } // Add plugin to MCManager $man->registerPlugin("favorites", new Moxiecode_FavoritesPlugin()); ?>plugins/imagemanager/plugins/Favorites/img/favorites.png000066600000001077150472426320017567 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤkQwhfBV[m*P\I1J7] "[?K|i1ږILj2$ۊHRj8}BJnu#_3uw#sKܷaʏ'}>D(pw=zZCT%Lu[x6uB#TGB)Ag*09 W3pyAl%hI],gD M'?Ыz`{Iӧ`pY-E*?X\kP)L_PzpQ$ JCf9[UKt];ໃ|(oXR:o5վ[:$ĔoZ>-suy+,T(~1xmg)[lCLGg=ZȻM1MKX ^.PگtNDb:v?.kbvi7!nSȢ6ubIENDB`plugins/imagemanager/plugins/Trash/css/trash.css000066600000000115150472426320016035 0ustar00#folders .special li a.trash { background:url(../img/trash.png) no-repeat; } plugins/imagemanager/plugins/Trash/img/trash_empty.png000066600000001217150472426320017237 0ustar00PNG  IHDRabKGDC pHYs B(xtIME*/3?IDAT8˥Ka?25E\3Эb")v/ ݪݲC CaD$ 2p-1e}y:[aK0;_3@ngU96tIvth}|bLxhÏXY㸸u,fzK}7GAHfDEDQ!\Y*:af厉=ծSV3Xhm1Zc!I :6c aГnoYߘW,%skYXfkv^S,ec#EK}zN~E[-_#p܈L!8|( il PN@-$I2W45@`!½?נrk((\w"4oj(`Z51%ϏuXC"f/@Z~{Fd1Blf=im;kD"h- Nc`% ٥ qIzdv IENDB`plugins/imagemanager/plugins/Trash/img/trash.png000066600000001422150472426320016017 0ustar00PNG  IHDRabKGDNPMzQN pHYs B(xtIME*SIDAT8˕Mh\e޹301&%L'4B]%[WRIPPpcͦ!] .. *AHARh$qb# :NzsgtcOA gwއzّ9Nq7iX971{n.?x-tFsӣa&lYjꙻ6Oҍ!jܿ@)~tM7~R{/Nu6~ZKA築BR7nNX5X`? [7GG<+Ah G1FVUrx@<Պ>{nѫV@dE_#IENDB`plugins/imagemanager/plugins/History/resources.xml000066600000000411150472426320016525 0ustar00 plugins/imagemanager/plugins/History/History.php000066600000010740150472426320016151 0ustar00registerFileSystem('history', 'Moxiecode_HistoryFile'); return true; } function onInsertFile(&$man, $file) { $path = $file->getAbsolutePath(); $type = $man->getType(); $maxhistory = isset($config["history.max"]) ? $config["history.max"] : $this->_maxhistory; $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); if (count($patharray) > 0) { for($i=0;$i $maxhistory) array_pop($patharray); } else $patharray[] = $path; $cookievalue = implode(",", $patharray); $this->setCookieData($type, $cookievalue); return true; } function getCookieData($type) { if (isset($_COOKIE["MCManagerHistoryCookie_". $type])) return $_COOKIE["MCManagerHistoryCookie_". $type]; else return ""; } function setCookieData($type, $val) { setcookie("MCManagerHistoryCookie_". $type, $val, time()+(3600*24*30)); // 30 days } function onClearHistory(&$man) { setcookie ("MCManagerHistoryCookie_". $man->getType(), "", time() - 3600); // 1 hour ago return true; } } class Moxiecode_HistoryFile extends Moxiecode_BaseFileImpl { function Moxiecode_HistoryFile(&$manager, $absolute_path, $child_name = "", $type = MC_IS_FILE) { $absolute_path = str_replace('favorite://', '', $absolute_path); Moxiecode_BaseFileImpl::Moxiecode_BaseFileImpl($manager, $absolute_path, $child_name, $type); } function canRead() { return true; } function canWrite() { return false; } function exists() { return true; } function isDirectory() { return true; } function isFile() { return false; } function getParent() { return null; } function getParentFile() { return null; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Returns an array of MCE_File instances based on the specified filter instance. * * @param MCE_FileFilter &$filter MCE_FileFilter instance to filter files by. * @return Array array of MCE_File instances based on the specified filter instance. */ function listFilesFiltered(&$filter) { $files = array(); $man = $this->_manager; $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); if (IndexOf($cookievalue, ",") != -1) $patharray = split(",", $cookievalue); else if ($cookievalue != "") $patharray[] = $cookievalue; foreach ($patharray as $path) { if (!$man->verifyPath($path)) continue; $file = $man->getFile($path); if (!$file->exists()) { $this->_removeFavorite($man, $path); continue; } if ($man->verifyFile($file) < 0) continue; if ($filter->accept($file) == BASIC_FILEFILTER_ACCEPTED) $files[] = $file; } return $files; } function _getCookieData($type) { if (isset($_COOKIE["MCManagerHistoryCookie_". $type])) return $_COOKIE["MCManagerHistoryCookie_". $type]; else return ""; } function _removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$i_setCookieData($type, $cookievalue); return true; } function _setCookieData($type, $val) { setcookie("MCManagerHistoryCookie_". $type, $val, time()+(3600*24*30)); // 30 days } } // Add plugin to MCManager $man->registerPlugin("history", new Moxiecode_HistoryPlugin()); ?>plugins/imagemanager/plugins/History/css/history.css000066600000000120150472426320016771 0ustar00#folders .special li a.history { background: url(../img/clock.png) no-repeat; } plugins/imagemanager/plugins/History/js/history.js000066600000000706150472426320016453 0ustar00(function($){ var man = window.FileManager || window.ImageManager; man.addSpecialFolder({title : '{#history.special_folder_title}', path : 'history:///', type : 'history'}); $().bind('filelist:changed', function() { if (man.path.indexOf('history://') != -1) { $(man.tools).each(function(i, v) { man.setDisabled(v, 1); }); $(['insert', 'download', 'view']).each(function(i, v) { man.setDisabled(v, 0); }); } }); })(jQuery); plugins/imagemanager/plugins/History/img/clock.png000066600000001562150472426320016356 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8]kHSq}}( EAAЇnAXVdYդtvl6׌t7 M}پ 7EF܏&MszJf-KS0\u I!}ًf>Ʌ]zd&."^õJ,.4 2I3(PdEى zG˅מ=M'QH;ePQxt5/ހG0/ vT\}`gDhc8 /jRTp ex+JP/)T;ƥ0o8ާx^+e/<6iFہ ~G [app@NyY&^tRE]"taC T%}N+BŨyY&^xrk᪾6W݇$+Ϊ U0L`#ZyÙZ} $man, "basepath" => $basepath, "json" => $json, "input" => $input, "cmd" => $cmd, "cwd" => getcwd(), "MCErrorHandler" => $MCErrorHandler ); // Bootstap drupal @session_destroy(); chdir($basepath . "../../../../../../../../"); require_once("includes/bootstrap.inc"); require_once("includes/common.inc"); // Setup session level drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); $isDrupalAuth = false; if (!isset($_SESSION['mc_drupal_auth']) || !$_SESSION['mc_drupal_auth']) { // Not cached in session check agains API drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $isDrupalAuth = user_access('access tinymce'); $_SESSION['mc_drupal_auth'] = $isDrupalAuth; } else $isDrupalAuth = $_SESSION['mc_drupal_auth']; // Restore everything chdir($access_check['cwd']); $MCErrorHandler = $access_check['MCErrorHandler']; $man = $access_check['manager']; $json = $access_check['json']; $cmd = $access_check['cmd']; $input = $access_check['input']; $basepath = $access_check['basepath']; /** * This class is a Drupal CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class Moxiecode_DrupalAuthenticator extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Main constructor. */ function Moxiecode_DrupalAuthenticator() { } function onAuthenticate(&$man) { global $isDrupalAuth; global $user; $config =& $man->getConfig(); // If authenticated then if ($isDrupalAuth && isset($user)) { foreach ($config as $key => $value) { if (is_string($value)) { $value = str_replace('${user}', $user->uid, $value); $config[$key] = $value; } } // Get rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); // Create rootpath if (!file_exists($rootPath)) mkdir($rootPath); } return $isDrupalAuth; } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("DrupalAuthenticator", new Moxiecode_DrupalAuthenticator()); ?>plugins/imagemanager/plugins/CustomInfoExample/CustomInfoExample.php000066600000004240150472426320022051 0ustar00getName()); // Will be used as title/alt in TinyMCE link/image dialogs $input['description'] = $file->getName() . " (" . $this->_getSizeStr($file->getLength()) . ")"; break; // When the file is displayed in a more info dialog case "info": //$input['mycustomfield'] = strtoupper($file->getName()); break; // When the file is listed case "list": //$input['mycustomfield'] = strtoupper($file->getName()); break; } // Chain to next return true; } /** * Returns a filesize as a nice truncated string like "10.3 MB". * * @param int $size File size to convert. * @return String Nice truncated string of the file size. */ function _getSizeStr($size) { // MB if ($size > 1048576) return round($size / 1048576, 1) . "MB"; // KB if ($size > 1024) return round($size / 1024, 1) . "KB"; return trim($size) . "b"; } } // Add plugin to MCManager $man->registerPlugin("custominfoexample", new Moxiecode_CustomInfoExample()); ?>plugins/imagemanager/plugins/PHPNukeAuthenticator/PHPNukeAuthenticator.php000066600000001525150472426320023062 0ustar00registerPlugin("PHPNukeAuthenticator", new Moxiecode_PHPNukeAuthenticator()); ?>plugins/imagemanager/plugins/MamboAuthenticator/MamboAuthenticatorImpl.php000066600000003464150472426320023252 0ustar00initSession(); $mamboUser =& $mainframe->getUser(); chdir("mambots/editors/mosce/jscripts/tiny_mce/plugins/imagemanager/"); /** * This class is a Mambo CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class MamboAuthenticatorImpl extends BaseAuthenticator { /**#@+ * @access public */ var $_config; /** * Main constructor. */ function MamboAuthenticatorImpl() { } /** * Initializes the authenicator. * * @param Array $config Name/Value collection of config items. */ function init(&$config) { $this->_config =& $config; } /** * Returns a array with group names that the user is bound to. * * @return Array with group names that the user is bound to. */ function getGroups() { return ""; } /** * Returns true/false if the user is logged in or not. * * @return bool true/false if the user is logged in or not. */ function isLoggedin() { global $mamboUser; return preg_match($this->_config['authenticator.joomla.valid_users'], $mamboUser->username); } /**#@-*/ } ?>plugins/imagemanager/plugins/JoomlaAuthenticator/JoomlaAuthenticator.php000066600000004403150472426320022776 0ustar00initSession(); $mamboUser = $mainframe->getUser(); // Try that if ($mamboUser->id == 0) { session_name(md5($mosConfig_live_site)); session_start(); $mamboUser = new mosUser($database); $mamboUser->id = intval(mosGetParam($_SESSION, 'session_user_id', '')); $mamboUser->username = strval(mosGetParam($_SESSION, 'session_username', '')); $mamboUser->usertype = strval(mosGetParam($_SESSION, 'session_usertype', '')); } chdir($mcOldCWD); /** * This class is a Drupal CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class Moxiecode_JoomlaAuthenticator extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Main constructor. */ function Moxiecode_JoomlaAuthenticator() { } function onAuthenticate(&$man) { global $mamboUser; $config =& $man->getConfig(); // Not logged in if ($mamboUser->id == 0) return false; // Replace ${user} in all config values foreach ($config as $key => $value) { // Skip replaceing {$user} in true/false stuff if ($value === true || $value === false) continue; $value = str_replace('${user}', $mamboUser->username, $value); $config[$key] = $value; } // Try create rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); $rootPathItems = explode(';', $rootPath); $rootPathItems = explode('=', $rootPathItems[0]); if (count($rootPathItems) > 1) $rootPath = $rootPathItems[1]; else $rootPath = $rootPathItems[0]; if (!file_exists($rootPath)) @mkdir($rootPath); // Is one of the valid user names return preg_match($config['JoomlaAuthenticator.valid_users'], $mamboUser->username); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("JoomlaAuthenticator", new Moxiecode_JoomlaAuthenticator()); ?>plugins/imagemanager/plugins/ExternalAuthenticator/ExternalAuthenticator.php000066600000011137150472426320023702 0ustar00getConfig(); session_start(); $authURL = $config['ExternalAuthenticator.external_auth_url']; $secretKey = $config['ExternalAuthenticator.secret_key']; $prefix = isset($config['ExternalAuthenticator.session_prefix']) ? $config['ExternalAuthenticator.session_prefix'] : "mcmanager_"; $useCookie = isset($config['ExternalAuthenticator.use_cookie']) ? $config['ExternalAuthenticator.use_cookie'] == true : true; $dir = basename(dirname($_SERVER["PHP_SELF"])); // Always allow language packs to be loaded if ($dir == "language") { // Override language key if (isset($_SESSION[$prefix . "ExternalAuthenticator_general__language"])) $config["general.language"] = $_SESSION[$prefix . "ExternalAuthenticator_general__language"]; return true; } // Check local session if authenticated if ($dir == "rpc" || $dir == "stream") { if (isset($_SESSION[$prefix . 'ExternalAuthenticator']) && $_SESSION[$prefix . 'ExternalAuthenticator'] == true) { if (!$useCookie || isset($_COOKIE[$prefix . 'enabled']) && $_COOKIE[$prefix . 'enabled'] == md5($secretKey . $_SERVER['REMOTE_ADDR'])) { foreach ($_SESSION as $key => $value) { if (strpos($key, $prefix . "ExternalAuthenticator_") === 0) { $key = str_replace("__", ".", $key); $key = substr($key, strlen($prefix . "ExternalAuthenticator_")); $config[$key] = $value; } } // Try create rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); $rootPathItems = explode(';', $rootPath); $rootPathItems = explode('=', $rootPathItems[0]); if (count($rootPathItems) > 1) $rootPath = $rootPathItems[1]; else $rootPath = $rootPathItems[0]; if (!file_exists($rootPath)) @mkdir($rootPath); // Use rootpath as path if (!$config['filesystem.path'] || !$man->isChildPath($rootPath, $config['filesystem.path'])) $config['filesystem.path'] = $rootPath; return true; } } } if (isset($_POST['key'])) { // Generate data chunk $data = ""; $ignored = array("key"); foreach ($_POST as $key => $value) { if (!in_array($key, $ignored)) $data .= $value; } // Check input if ($_POST['key'] == md5($data . $secretKey)) { // Set authenticated session and cookie $_SESSION[$prefix . 'ExternalAuthenticator'] = true; if ($useCookie) setcookie($prefix . 'enabled', md5($secretKey . $_SERVER['REMOTE_ADDR']), 0, '/'); // Set config parameters foreach ($_POST as $key => $value) { if (!in_array($key, $ignored)) { $_SESSION[$prefix . 'ExternalAuthenticator_' . $key] = $value; $config[$key] = $value; } } return true; } else { sleep(1); // Sleep for bots die("Invalid input make sure that the secret keys match."); } } // Force absolute if (strpos($authURL, "http") !== 0 && strpos($authURL, "/") !== 0) $authURL = "plugins/ExternalAuthenticator/" . $authURL; // Setup return URL $prot = "http"; $port = ""; if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") $prot = "https"; // Non default port if ($_SERVER['SERVER_PORT'] != "80" && $_SERVER['SERVER_PORT'] != "443") $port = ":" . $_SERVER['SERVER_PORT']; // If RPC or stream then return it using config if ($dir == "rpc" || $dir == "stream") { // This part doesn't work yet but isn't really needed. // Make it absolute if (strpos($authURL, "/") === 0) $authURL = $prot . "://" . $_SERVER['HTTP_HOST'] . $port . $authURL; $returnURL = $prot . "://" . $_SERVER['HTTP_HOST'] . $port . dirname(dirname($_SERVER['PHP_SELF'])) . "/index.php?type=" . $man->getType(); $config['authenticator.login_page'] = $authURL . "?return_url=" . urlencode($returnURL); return false; } // Not logged redirect to External backend $returnURL = $prot . "://" . $_SERVER['HTTP_HOST'] . $port . $_SERVER['PHP_SELF'] . "?type=" . $man->getType(); header('location: ' . $authURL . "?return_url=" . urlencode($returnURL)); die(); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("ExternalAuthenticator", new Moxiecode_ExternalAuthenticator()); ?>plugins/imagemanager/plugins/ExternalAuthenticator/auth_example.asp000066600000002261150472426320022033 0ustar00<% @LANGUAGE="VBScript" %> <% Option Explicit %> <% ' Change this secret key so it matches the one in the imagemanager/filemanager config Private Const SECRET_KEY = "someSecretKey" Dim config, data, key, value ' Check if user is logged in here ' If Session("some_session") <> True Then ' Response.Write "You are not logged in." ' Response.End ' End If Set config = Server.CreateObject("Scripting.Dictionary") ' Override config values ' config("filesystem.path") = "c:/Inetpub/wwwroot/somepath" ' config("filesystem.rootpath") = "c:/Inetpub/wwwroot/somepath" ' Generate MD5 of config values data = "" For Each value In config.Items data = data & value Next key = MD5(data & SECRET_KEY) %>
        "> <% For Each key In config.Keys %> " value="<%= Server.HTMLEncode(config(key)) %>" /> <% Next %>
        plugins/imagemanager/plugins/ExternalAuthenticator/md5.asp000066600000030135150472426320020045 0ustar00<% ' Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm, ' as set out in the memo RFC1321. ' ' ' ASP VBScript code for generating an MD5 'digest' or 'signature' of a string. The ' MD5 algorithm is one of the industry standard methods for generating digital ' signatures. It is generically known as a digest, digital signature, one-way ' encryption, hash or checksum algorithm. A common use for MD5 is for password ' encryption as it is one-way in nature, that does not mean that your passwords ' are not free from a dictionary attack. ' ' This is 'free' software with the following restrictions: ' ' You may not redistribute this code as a 'sample' or 'demo'. However, you are free ' to use the source code in your own code, but you may not claim that you created ' the sample code. It is expressly forbidden to sell or profit from this source code ' other than by the knowledge gained or the enhanced value added by your own code. ' ' Use of this software is also done so at your own risk. The code is supplied as ' is without warranty or guarantee of any kind. ' ' Should you wish to commission some derivative work based on this code provided ' here, or any consultancy work, please do not hesitate to contact us. ' ' Web Site: http://www.frez.co.uk ' E-mail: sales@frez.co.uk Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) m_lOnBits(0) = CLng(1) m_lOnBits(1) = CLng(3) m_lOnBits(2) = CLng(7) m_lOnBits(3) = CLng(15) m_lOnBits(4) = CLng(31) m_lOnBits(5) = CLng(63) m_lOnBits(6) = CLng(127) m_lOnBits(7) = CLng(255) m_lOnBits(8) = CLng(511) m_lOnBits(9) = CLng(1023) m_lOnBits(10) = CLng(2047) m_lOnBits(11) = CLng(4095) m_lOnBits(12) = CLng(8191) m_lOnBits(13) = CLng(16383) m_lOnBits(14) = CLng(32767) m_lOnBits(15) = CLng(65535) m_lOnBits(16) = CLng(131071) m_lOnBits(17) = CLng(262143) m_lOnBits(18) = CLng(524287) m_lOnBits(19) = CLng(1048575) m_lOnBits(20) = CLng(2097151) m_lOnBits(21) = CLng(4194303) m_lOnBits(22) = CLng(8388607) m_lOnBits(23) = CLng(16777215) m_lOnBits(24) = CLng(33554431) m_lOnBits(25) = CLng(67108863) m_lOnBits(26) = CLng(134217727) m_lOnBits(27) = CLng(268435455) m_lOnBits(28) = CLng(536870911) m_lOnBits(29) = CLng(1073741823) m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1) m_l2Power(1) = CLng(2) m_l2Power(2) = CLng(4) m_l2Power(3) = CLng(8) m_l2Power(4) = CLng(16) m_l2Power(5) = CLng(32) m_l2Power(6) = CLng(64) m_l2Power(7) = CLng(128) m_l2Power(8) = CLng(256) m_l2Power(9) = CLng(512) m_l2Power(10) = CLng(1024) m_l2Power(11) = CLng(2048) m_l2Power(12) = CLng(4096) m_l2Power(13) = CLng(8192) m_l2Power(14) = CLng(16384) m_l2Power(15) = CLng(32768) m_l2Power(16) = CLng(65536) m_l2Power(17) = CLng(131072) m_l2Power(18) = CLng(262144) m_l2Power(19) = CLng(524288) m_l2Power(20) = CLng(1048576) m_l2Power(21) = CLng(2097152) m_l2Power(22) = CLng(4194304) m_l2Power(23) = CLng(8388608) m_l2Power(24) = CLng(16777216) m_l2Power(25) = CLng(33554432) m_l2Power(26) = CLng(67108864) m_l2Power(27) = CLng(134217728) m_l2Power(28) = CLng(268435456) m_l2Power(29) = CLng(536870912) m_l2Power(30) = CLng(1073741824) Private Function LShift(lValue, iShiftBits) If iShiftBits = 0 Then LShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And 1 Then LShift = &H80000000 Else LShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If If (lValue And m_l2Power(31 - iShiftBits)) Then LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000 Else LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) End If End Function Private Function RShift(lValue, iShiftBits) If iShiftBits = 0 Then RShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And &H80000000 Then RShift = 1 Else RShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits) If (lValue And &H80000000) Then RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1))) End If End Function Private Function RotateLeft(lValue, iShiftBits) RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits)) End Function Private Function AddUnsigned(lX, lY) Dim lX4 Dim lY4 Dim lX8 Dim lY8 Dim lResult lX8 = lX And &H80000000 lY8 = lY And &H80000000 lX4 = lX And &H40000000 lY4 = lY And &H40000000 lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) If lX4 And lY4 Then lResult = lResult Xor &H80000000 Xor lX8 Xor lY8 ElseIf lX4 Or lY4 Then If lResult And &H40000000 Then lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8 Else lResult = lResult Xor &H40000000 Xor lX8 Xor lY8 End If Else lResult = lResult Xor lX8 Xor lY8 End If AddUnsigned = lResult End Function Private Function F(x, y, z) F = (x And y) Or ((Not x) And z) End Function Private Function G(x, y, z) G = (x And z) Or (y And (Not z)) End Function Private Function H(x, y, z) H = (x Xor y Xor z) End Function Private Function I(x, y, z) I = (y Xor (x Or (Not z))) End Function Private Sub FF(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub GG(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub HH(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub II(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Function ConvertToWordArray(sMessage) Dim lMessageLength Dim lNumberOfWords Dim lWordArray() Dim lBytePosition Dim lByteCount Dim lWordCount Const MODULUS_BITS = 512 Const CONGRUENT_BITS = 448 lMessageLength = Len(sMessage) lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD) ReDim lWordArray(lNumberOfWords - 1) lBytePosition = 0 lByteCount = 0 Do Until lByteCount >= lMessageLength lWordCount = lByteCount \ BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition) lByteCount = lByteCount + 1 Loop lWordCount = lByteCount \ BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3) lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArray End Function Private Function WordToHex(lValue) Dim lByte Dim lCount For lCount = 0 To 3 lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) WordToHex = WordToHex & Right("0" & Hex(lByte), 2) Next End Function Public Function MD5(sMessage) Dim x Dim k Dim AA Dim BB Dim CC Dim DD Dim a Dim b Dim c Dim d Const S11 = 7 Const S12 = 12 Const S13 = 17 Const S14 = 22 Const S21 = 5 Const S22 = 9 Const S23 = 14 Const S24 = 20 Const S31 = 4 Const S32 = 11 Const S33 = 16 Const S34 = 23 Const S41 = 6 Const S42 = 10 Const S43 = 15 Const S44 = 21 x = ConvertToWordArray(sMessage) a = &H67452301 b = &HEFCDAB89 c = &H98BADCFE d = &H10325476 For k = 0 To UBound(x) Step 16 AA = a BB = b CC = c DD = d FF a, b, c, d, x(k + 0), S11, &HD76AA478 FF d, a, b, c, x(k + 1), S12, &HE8C7B756 FF c, d, a, b, x(k + 2), S13, &H242070DB FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE FF a, b, c, d, x(k + 4), S11, &HF57C0FAF FF d, a, b, c, x(k + 5), S12, &H4787C62A FF c, d, a, b, x(k + 6), S13, &HA8304613 FF b, c, d, a, x(k + 7), S14, &HFD469501 FF a, b, c, d, x(k + 8), S11, &H698098D8 FF d, a, b, c, x(k + 9), S12, &H8B44F7AF FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1 FF b, c, d, a, x(k + 11), S14, &H895CD7BE FF a, b, c, d, x(k + 12), S11, &H6B901122 FF d, a, b, c, x(k + 13), S12, &HFD987193 FF c, d, a, b, x(k + 14), S13, &HA679438E FF b, c, d, a, x(k + 15), S14, &H49B40821 GG a, b, c, d, x(k + 1), S21, &HF61E2562 GG d, a, b, c, x(k + 6), S22, &HC040B340 GG c, d, a, b, x(k + 11), S23, &H265E5A51 GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA GG a, b, c, d, x(k + 5), S21, &HD62F105D GG d, a, b, c, x(k + 10), S22, &H2441453 GG c, d, a, b, x(k + 15), S23, &HD8A1E681 GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8 GG a, b, c, d, x(k + 9), S21, &H21E1CDE6 GG d, a, b, c, x(k + 14), S22, &HC33707D6 GG c, d, a, b, x(k + 3), S23, &HF4D50D87 GG b, c, d, a, x(k + 8), S24, &H455A14ED GG a, b, c, d, x(k + 13), S21, &HA9E3E905 GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8 GG c, d, a, b, x(k + 7), S23, &H676F02D9 GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A HH a, b, c, d, x(k + 5), S31, &HFFFA3942 HH d, a, b, c, x(k + 8), S32, &H8771F681 HH c, d, a, b, x(k + 11), S33, &H6D9D6122 HH b, c, d, a, x(k + 14), S34, &HFDE5380C HH a, b, c, d, x(k + 1), S31, &HA4BEEA44 HH d, a, b, c, x(k + 4), S32, &H4BDECFA9 HH c, d, a, b, x(k + 7), S33, &HF6BB4B60 HH b, c, d, a, x(k + 10), S34, &HBEBFBC70 HH a, b, c, d, x(k + 13), S31, &H289B7EC6 HH d, a, b, c, x(k + 0), S32, &HEAA127FA HH c, d, a, b, x(k + 3), S33, &HD4EF3085 HH b, c, d, a, x(k + 6), S34, &H4881D05 HH a, b, c, d, x(k + 9), S31, &HD9D4D039 HH d, a, b, c, x(k + 12), S32, &HE6DB99E5 HH c, d, a, b, x(k + 15), S33, &H1FA27CF8 HH b, c, d, a, x(k + 2), S34, &HC4AC5665 II a, b, c, d, x(k + 0), S41, &HF4292244 II d, a, b, c, x(k + 7), S42, &H432AFF97 II c, d, a, b, x(k + 14), S43, &HAB9423A7 II b, c, d, a, x(k + 5), S44, &HFC93A039 II a, b, c, d, x(k + 12), S41, &H655B59C3 II d, a, b, c, x(k + 3), S42, &H8F0CCC92 II c, d, a, b, x(k + 10), S43, &HFFEFF47D II b, c, d, a, x(k + 1), S44, &H85845DD1 II a, b, c, d, x(k + 8), S41, &H6FA87E4F II d, a, b, c, x(k + 15), S42, &HFE2CE6E0 II c, d, a, b, x(k + 6), S43, &HA3014314 II b, c, d, a, x(k + 13), S44, &H4E0811A1 II a, b, c, d, x(k + 4), S41, &HF7537E82 II d, a, b, c, x(k + 11), S42, &HBD3AF235 II c, d, a, b, x(k + 2), S43, &H2AD7D2BB II b, c, d, a, x(k + 9), S44, &HEB86D391 a = AddUnsigned(a, AA) b = AddUnsigned(b, BB) c = AddUnsigned(c, CC) d = AddUnsigned(d, DD) Next MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)) End Function %> plugins/imagemanager/plugins/ExternalAuthenticator/auth_example.jsp000066600000004772150472426320022055 0ustar00<%@page import="java.util.*" %> <% String key, secretKey, data = ""; // Change this secret key so it matches the one in the imagemanager/filemanager config secretKey = "someSecretKey"; // Check here if the user is logged in or not /* if (session.getAttribute("some_session") != "somevalue") { out.print("You are not logged in."); return; } */ // Override any config values here Hashtable configuration = new Hashtable(); //configuration.put("filesystem.path", "c:/Inetpub/wwwroot/somepath"); //configuration.put("filesystem.rootpath", "c:/Inetpub/wwwroot/somepath"); // Generates a unique key of the config values with the secret key for (Enumeration e = configuration.keys(); e.hasMoreElements(); ) data += configuration.get(e.nextElement()); key = md5(data + secretKey); %> <%! public String md5(String str) { try { java.security.MessageDigest md5 = java.security.MessageDigest.getInstance("MD5"); char[] charArray = str.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i=0; i': buff.append(">"); break; case '"': buff.append("""); break; case '&': buff.append("&"); break; default: buff.append(chr); } } return buff.toString(); } %>
        "> <% for (Enumeration e = configuration.keys(); e.hasMoreElements(); ) { key = (String) e.nextElement(); %> " value="<%= htmlEncode((String) configuration.get(key)) %>" /> <% } %>
        plugins/imagemanager/plugins/ExternalAuthenticator/auth_example.php000066600000001732150472426320022041 0ustar00
        $value) { echo ''; } ?>
        plugins/imagemanager/plugins/ExternalAuthenticator/auth_drupal.php000066600000002245150472426320021675 0ustar00uid; // Generates a unique key of the config values with the secret key $key = md5(implode('', array_values($config)) . $secretKey); ?>
        $value) { echo ''; } ?>
        plugins/imagemanager/plugins/WordpressAuthenticator/WordpressAuthenticator.php000066600000001436150472426320024317 0ustar00registerPlugin("WordpressAuthenticator", new Moxiecode_WordpressAuthenticator()); ?>plugins/imagemanager/changelog.txt000066600000057444150472426320013361 0ustar00Version 3.1.0.4 (2008-11-27) Fixed bug where the Flash uploader was compiled with debugging on. Fixed bug where downloading of files with spaces didn't work correctly. Fixed bug where it wouldn't load correctly correctly in old TinyMCE 2.x versions. Fixed bug where filter wouldn't be applied on IE when the user pressed enter. Fixed bug auto resizing of uploaded images would fail if the files where over 1MB. Version 3.1.0.3 (2008-11-20) Fixed bug where inline dialogs wasn't opened correctly when loading the product cross domain. Fixed bug where it was returning incorrect content-encoding headers. Fixed bug where the multiple upload feature didn't work correctly when * was used for the valid extensions settings. Fixed bug where language packs wasn't loading correctly when TinyMCE was compressed using the gzip compressor. Fixed bug where switching from ImageManager to FileManager would fail some times when used with TinyMCE. Version 3.1.0.2 (2008-11-13) Added new possibility to have a custom function for the imagemanager_insert_template option. Added new imagemanager_contextmenu option that enables you to disable the contextmenu addons for TinyMCE. Fixed bug where the combination of Google Gears and images larger then the chunk size would fail. Fixed bug where errors passed back from the server would be ignored by the Google gears implementation. Fixed bug where the file upload progress bar wasn't moving if upload errors occured. Fixed bug where domain relaxing didn't work when TinyMCE and the ImageManager was loaded from another domain. Fixed bug where the preview.urlprefix host wouldn't get applied correctly to output. Fixed bug where edit and view dialogs would be scrollable if the page was scrollable. Fixed bug where the resize tool would produce a move cursor in the edit dialog. Fixed bug where switching page size wouldn't take the user to the first page. Version 3.1.0.1 (2008-11-10) Fixed bug where it wasn't possible to override the preview.wwwroot and preview.urlprefix settings with mc_access files. Fixed bug with notice messages for missing items when using display_errors on. Fixed bug where it wasn't possible to load TinyMCE and the imagemanager plugin from another sub domain. Fixed bug where scrollbars wouldn't appear for native windows when used with TinyMCE. Fixed bug where it was impossible to enable remember_last_path by default. Fixed bug where the upload.chunk_size option didn't work correctly. Fixed bug where the onchange event wasn't fired as it was before when form items was changed by a browse call. Fixed bug where the category list and special folders list where separated by an odd margin in IE. Fixed so it's possible to see the current upload runtime when enablig the general.debug option. Version 3.1 (2008-11-06) Fixed bug where the toolbar would get a trailing focus rectangle on Gecko. Fixed bug with using the imagemanager on a non default http port. Fixed bug where the directory list wasn't refreshed if you using the refresh button. Fixed bug where progress of listing directories didn't work. Fixed bug where there could be a double scroll when you had to many directories. Fixed bug where sorting was incorrect on non Windows operating systems. Fixed bug where the ClientResources class would produce an error due to an invalid regexp. Fixed bug where IE would scroll the page down if you clicked the "basic upload" link. Fixed bug where single upload didn't work correctly. Fixed so all new integration callback functions have a file object. Version 3.1b2 (2008-10-30) Added new confirm message to edit dialog if the user didn't save the image before closing the dialog. Added new paging buttons and input. This new UI works better if you have a huge amount of images in one directory. Added new edit.format option. Enables you to update format images when you edit the original image. Added new filesystem.delete_format_images. Enables you to control if format images is to be deleted if the original is deleted. Added new disabled_tools js option enables you to disable specific tools from page level or TinyMCE. Added new tools js option enables you specify tools from page level or TinyMCE. Fixed bug where the first page size wasn't correct. It displayed one item less that expected. Fixed bug where it wasn't possible to override general.language using an external authenticator. Fixed bug an JS exception was thown when changing page, due to a call to preventDefault. Fixed bug where keepAlive handler was missing. It will not hit the backend each 5 minutes. Fixed bug where Gecko browsers would produce an traling focus border for toolbar items. Fixed bug where directory path would be on two lines if it was very long. Fixed bug where loading the xml resource files would break on some PHP installations. Fixed bug where add file action wasn't executed when multiple files where uploaded. Fixed bug where upload.format wasn't applied when multiple files where uploaded. Fixed bug where it wasn't possible to override path and rootpath settings from TinyMCE init. Fixed bug where rootpath names didn't work when specified in javascript options. Fixed bug where directory listing wasn't rooted if rootpath was specified using the javascript options. Fixed bug where the upload dialog produced a vertical scrollbar on IE. Fixed bug where images would be inserted to beginning of editor instances on IE. Fixed bug where scrolling of thumbnails didn't work correctly in IE. Fixed bug where singe file uploads wasn't working correctly. Fixed bug where native windows wasn't move to top. Fixed bug where upload with upper case extensions would fail. Fixed bug where filter input was case sensitive. Fixed bug where filter wouldn't move the user to the first page. Replaced upload.replace_diacritics with filesystem.clean_names. To make it more general and also take care of whitespace. Optimized file listing logic by 600%. The sorting was improved by sorting by the file names first and then creating file instances. Version 3.1b1 (2008-10-23) Added new multiple file upload uses Flash, Google Gears and Silverlight. Chunks large files by default. Added new API for client side plugin logic. You can now add menu items, dialogs and buttons from plugins. Added new resources.xml file for all themes and plugins. These are used to compress and concat js and css files. Added new support for live preview of resize, flip and rotate in image editor. Added new support for file and directory filtering from page level. Added new upload.replace_diacritics option. Replaces national characters like to aaou. Added new upload.multiple_upload option. Enables you to disable/enable this support. Added new upload.chunk_size option. Enables you to change the chunk size for each request. Added new support for cross sub domain usage by relaxing the document.domain field. Added new ImageManager context menu to the TinyMCE plugin. Enables you to edit and replace images more easily. Added new browse method to the mcImageManager.js file that replaces the old open method. Added new createDir method to the mcImageManager.js file. Enables you to open the create directory dialog directly from page. Added new createDoc method to the mcImageManager.js file. Enables you to open the create document dialog directly from page. Added new view method to the mcImageManager.js file. Enables you to open the view dialog directly from page. Added new upload method to the mcImageManager.js file. Enables you to open the upload dialog directly from page. Added new edit method to the mcImageManager.js file. Enables you to open the edit file dialog directly from page. Fixed so all dialogs adds a shim for the background items. Fixed so the mcimagemanager.js file is merged into the editor_plugin.js file to increase gzip compression. Fixed bug where the buttons in dialogs would look incorrect in FF 3. Fixed bug where it wouldn't display the input path in error message if it couldn't find a specific filesystem. Fixed bug where image rotation by 180 degrees didn't work correctly. Fixed bug where page size was one item more when the parent folder item was present. Fixed bug where it wasn't possible to override thumbnail settings using mc_access files. Optimized the LocalFileImpl class for speed particularly on Windows. Version 3.0.9.2 (2008-09-11) Fixed bug the default insert template didn't respect the TinyMCE url settings. Fixed bug where the an exception would be produced if you used the standalone mode on a page where TinyMCE was included but not loaded. Fixed bug with authenticators producing and error if they was overriding the filesystem.rootpath to a path not within the configured rootpath. Version 3.0.9.1 (2008-07-09) Fixed bug where Firefox 3 would produce an exception about empty id passed to getElementById. Fixed bug where Firefox 3 would produce an exception about window.console being undefined. Fixed bug where the insertimage command didn't work correctly if you didn't specify an template. Version 3.0.9 (2008-07-02) Added new support for adding multiple templates for the insertimage button. Fixed bug where loading the ImageManager on demand didn't load the language packs correctly. Fixed so it's not possible to open a hidden directory. It will automatically go to the parent of that dir. Fixed issue where it wouldn't setup an correct baseURL if the script was loaded dynamically. Version 3.0.8 (2008-04-29) Added possibility to load plugins from out side the ImageManager path. Fixed so plugin names are lowercase internally to avoid confusion. Fixed auto detection logic for the API base URL. It will now do this client side to avoid PHP bugs. Fixed bug where using the standalone integration on a page with TinyMCE without any editor instances would produce an error. Fixed so that the custom_data setting gets passed in as a parameter to the initial request for the index.php. Fixed so the SessionAuthenticator is enabled by default since people tend to miss adding any authentication. Version 3.0.7 (2008-03-20) Added missing support for WMV files in the view dialog. Fixed so the plugin info is displayed correctly in TinyMCE 3.0 about dialog. Fixed bug where cookies could be interpreted as input parameters. Version 3.0.6.1 (2008-02-21) Fixed compatibility issue with the TinyMCE gzip compressor. Fixed bug where the FileManager didn't work if the inlinepopups wasn't used in TinyMCE 3. Version 3.0.6 (2008-02-21) Added support for loading the TinyMCE plugin from an external location. Added support for inlinepopups if used with TinyMCE 3.x. Added detection for proxies that doesn't support non encoded HTTP posts. Added support for ${user} replacement variable for the JoomlaAuthenticator class. Added new insert_filter option enabled you to filter data passed back from IM before it's inserted. Fixed bug where the thumbnail directory wasn't deleted if all images was deleted. Fixed bug where scaling of images proportional sometimes would produce larger images than the specified max width/height. Fixed bug where loading non english language packs for the TinyMCE insertimage icon didn't work. Fixed bug where an empty value for the general.plugins option would produce errors. Fixed so the getSiteRoot will use the script_name instead of document_root. Version 3.0.5 (2007-11-22) Added new imagemanager_handle option to the TinyMCE editor plugin. Fixed compatibility with the TinyMCE 3.0b1 API. Removed all deprecated =& new statements from the PHP code to reduce notices. Fixed bug where reverting an image after editing didn't work properly. Fixed bug where comparison with null didn't work in new version of PHP 5.2.3. Fixed bug where caret focus on edit image sometimes wasn't possible due to IE7 bug. Fixed security issue thanks to a report from Michel Weimerskirch. Version 3.0.4 (2007-11-02) Added new upload.format option. Enables you to auto resize a image to multiple dimensions and formats. Added new ExternalAuthenticator.session_prefix option to ExternalAuthenticator to separate sessions. Added new ExternalAuthenticator.use_cookie option. This will create a cookie based on the session_prefix. Added new compatibility with TinyMCE 3.x. Fixed so that the external authentication page is runned each time the ImageManager opens. Fixed bug where filesystem.force_directory_template didn't work correctly. Fixed bug where general.disabled_tools didn't work for the edit menu. Fixed various issues with the jpeg file extension. Fixed issue where it was impossible to select a file if a user switched from IM to FM but only included one of them in the page. Version 3.0.3 (2007-08-21) Added new external authenticator enables you to authenticate between backend and cross domains. Added new asp and jsp example authentication pages for the external authenticator. Added new non flash upload que since the flash uploader was to buggy. Fixed bug compatibility issues with older TinyMCE gzip compressors like the one in Wordpress. Fixed bug where custom insert callback functions also execured default logic. Fixed some issues with symlinks, they where not resolved when used in JS init calls. Fixed issue with the need to have index.php as the default document. Fixed bug where the mcFileManager.init call didn't work as expected. Fixed so the upload.use_flash is now set to false by default. Version 3.0.2 (2007-06-20) Added new logging options, enables you to specify level, format, rotation, max size. Added cancel buttons to all dialogs for usability reasons. Added new config_prefix option to the SessionAuthenticator class, enables you to override any config option with a session. Fixed so that all dialogs are closed when a operation is completed successfully. Fixed so the template selection box gets removed if no templates are specified. Fixed so the dialogs will open more nicely, less visual maniplulation. Fixed so the parent directory icons has an arrow for usability reasons. Fixed so filter also filters folders in the folder listing to the left. Fixed so images get refreshed in cache when edited. Fixed so URL convertion logic is executed before custom callbacks. Fixed so the element names can be element id's in a mcImageManager.open call. Fixed so bit depth on PNG images are maintained while editing or generating thumbnails. Fixed some issues with the JoomlaAuthenticator, it now works in a multisite environment. Fixed bug where edit button wasn't removed from view image if you can't edit the image. Fixed bug where really long directory listings could make the background image wrap. Fixed bug where the imagemanager wasn't loading correctly if it was compressed using the TinyMCE Gzip compressor. Fixed bug where flip image produced a extra horizontal/vertical black line. Fixed issue with filemanager.urlprefix not working due to invalid config options. Fixed problem with the text not being centered on parent directory thumbnails. Fixed bug where the animation of the fading menus didn't finish correctly some times. Version 3.0.1 (2007-05-21) Added new upload.use_flash option, enables you to disable the flash uploader. Added new use_url_path JS integration option. Added new use path from url functionalty. Fixed problem with error reporting in PHP 5.x+. Fixed bug where the gzip compression failed if the accept encoding headers where missing. Fixed bug with preview.wwwroot not working correctly. Fixed bug with message "path not allowed", some installations use symlinks for their wwwroot. Fixed bug where it was sometimes resolved the URL to the js dir wrong in some PHP installations. Fixed issue where the remember_last_path feature remembered favorites and history as well. Fixed issues with very old PHP installations that doesn't have file_get_contents. Fixed issue with IE producing warning message if it was loaded over HTTPS. Version 3.0 (2007-05-15) Moved the general.login_page option to authenticator.login_page. Added new _Template plugin, this is a example plugin. Added better support for national characters like in filenames. Fixed so that you can change the default file system impelementation. Version 3.0b3 (2007-05-10) Added new CustomInfoExample plugin. Displays how to inject custom file information. Added new include/exclude/extensions config options for stream section. Added better error handling when loading XML language packs. Added missing language items for add file(s) in flash upload dialog. Added fallback JSON RPC method when Apache is configured with mod_security. Added more rapid demo mode response. It only ask the server once. Fixed so upload button is disabled until the user selects a file. Fixed so next/prev buttons in view mode are disabled when there is no more files in a direction. Fixed bug where it wasn't possible to disable the delete and edit tools in view image dialog. Fixed bug where non english language packs where loaded twice. Fixed bug where utf-8 encodings of language packs didn't work correctly. Fixed bug where relative path didn't work for the filesystem.rootpath config option. Fixed so the translation of the page is faster, so it doesn't flicker. Renamed all "directory" to "folder" in the English language pack. Version 3.0b2 (2007-05-04) Private beta released to selected customers. Version 3.0b1 (2007-04-13) First beta release of the complete rewrite of the ImageManager PHP. Version 2.0 (2006-02-22) Fixed an issue with the logger, a warning was displayed when no logfile was found, removed. Fixed an issue with image editing, if nothing was selected and the crop/resize icon was pressed. Fixed so the MCImageManager is a plugin for TinyMCE, makes the installation process easier. Fixed issue with parsing of the XML language packs in latest PHP versions. Fixed bug where valid extensions wasn't presented correctly in the upload form. Fixed bug where mc_access files wasn't working correctly under Windows. Fixed an issue with upload.php, thumbnails wasn't generated properly. Fixed issue where input URL was ignored if the remember_last_path option was enabled. Fixed lots of various bugs and issues. Changed some interface elements, using Ajax to get image info and delete images. Cleaned up JavaScript in some templates, moved to external files. Added better error checking and messages. Added new JoomlaAuthenticatorImpl, example config and documentation. Added new WordpressAuthenticatorImpl, example config and documentation. Added new DrupalAuthenticatorImpl, example config and documentation. Added new alert message when imagemanager popups is getting blocked by popup blockers. Added two strings to language pack, "error_selection" and "error_resize", an error message when input data to function is bad. Added new WordpressAuthenicatorImpl for integration with Wordpress 2.0. Added new DrupalAuthenicatorImpl for integration with Drupal CMS. Added new PHPNukeAuthenicatorImpl for integration with PHPNuke. Added new not_loggedin.php file, this can be used to present a error message when the user session was lost. Added more language packs, can't remember all the names (currently supports de, en, fs, ja_utf-8, nb, nn, no, sv). Added German language pack contributed by Markus Vetten. Added French language pack contributed by Olivier Gaillot. Removed status.php, was outdated and not very helpfull. Version 1.9 (2005-10-26) Fixed an issue with the language pack array merge in general.php Fixed issue with short_open_tag = "Off", replaced all 7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;;(function($){var $scrollTo=$.scrollTo=function(target,duration,settings){$(window).scrollTo(target,duration,settings);};$scrollTo.defaults={axis:'y',duration:1};$scrollTo.window=function(scope){return $(window).scrollable();};$.fn.scrollable=function(){return this.map(function(){var win=this.parentWindow||this.defaultView,elem=this.nodeName=='#document'?win.frameElement||win:this,doc=elem.contentDocument||(elem.contentWindow||elem).document,isWin=elem.setInterval;return elem.nodeName=='IFRAME'||isWin&&$.browser.safari?doc.body:isWin?doc.documentElement:this;});};$.fn.scrollTo=function(target,duration,settings){if(typeof duration=='object'){settings=duration;duration=0;}if(typeof settings=='function')settings={onAfter:settings};settings=$.extend({},$scrollTo.defaults,settings);duration=duration||settings.speed||settings.duration;settings.queue=settings.queue&&settings.axis.length>1;if(settings.queue)duration/=2;settings.offset=both(settings.offset);settings.over=both(settings.over);return this.scrollable().each(function(){var elem=this,$elem=$(elem),targ=target,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case 'number':case 'string':if( /^([+-]=)?\d+(px)?$/.test(targ)){targ=both(targ);break;}targ=$(targ,this);case 'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset();}$.each(settings.axis.split(''),function(i,axis){var Pos=axis=='x'?'Left':'Top',pos=Pos.toLowerCase(),key='scroll'+Pos,old=elem[key],Dim=axis=='x'?'Width':'Height',dim=Dim.toLowerCase();if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(settings.margin){attr[key]-=parseInt(targ.css('margin'+Pos))||0;attr[key]-=parseInt(targ.css('border'+Pos+'Width'))||0;}attr[key]+=settings.offset[pos]||0;if(settings.over[pos])attr[key]+=targ[dim]()* settings.over[pos];}else attr[key]=targ[pos];if( /^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max(Dim));if(!i&&settings.queue){if(old!=attr[key])animate(settings.onAfterFirst);delete attr[key];}});animate(settings.onAfter);function animate(callback){$elem.animate(attr,duration,settings.easing,callback&&function(){callback.call(this,target,settings);});};function max(Dim){var attr='scroll'+Dim,doc=elem.ownerDocument;return win?Math.max(doc.documentElement[attr],doc.body[attr]):elem[attr];};}).end();};function both(val){return typeof val=='object'?val:{top:val,left:val};};})(jQuery);(function($){var id=0;$.multiUpload=function(s){var up=this,mul;up.id=up.generateID();up.settings={};up.settings=s=$.extend(up.settings,s);if(s.max_size)s.max_size=up.parseSize(s.max_size);if(s.chunk_size)s.chunk_size=up.parseSize(s.chunk_size);if(s.oninit){$(up).bind('multiUpload:init',function(){s.oninit.call(up,up);});}up.init();$(['setup','filesSelected','fileProgress','filesProgress','filesUploaded','fileUploaded','fileUploadProgress']).each(function(){if(s[(this)])$(up).bind('multiUpload:'+this,s[(this)]);});$(up).trigger('multiUpload:setup');$(up).bind('multiUpload:selectFiles',function(){this.cache={};});$(up).bind('multiUpload:filesSelected',function(e,fs){var mx=up.settings.max_size;function filter(f){var m= /\.([^.]+)$/.exec(f.name.toLowerCase()),ext=m?m[1]:null;return ext&&$.inArray(ext,s.filter)!=-1&&(!mx||f.size1048576)return Math.round(v/1048576,1)+" MB";if(v>1024)return Math.round(v/1024,1)+" KB";return v+" b";},generateID:function(){return 'u'+(id++);},parseSize:function(sz){var mul;if(typeof(sz)=='string'){sz= /^([0-9]+)([mk]+)$/.exec(sz.toLowerCase().replace(/[^0-9mk]/g,''));mul=sz[2];sz=parseInt(sz[1]);if(mul=='m')sz *=1048576;if(mul=='k')sz *=1024;}return sz;}});$.extend($.multiUpload,{instances:{},create:function(s){return this.add(new $.multiUpload(s));},remove:function(id){if(this.get(id))delete this.instances[id];},add:function(up){return this.instances[up.id]=up;},get:function(id){return this.instances[id];}});})(jQuery);(function($){if(!$.multiUpload.initialized&&window.google&&google.gears){$.multiUpload.initialized=1;$.multiUpload.runtime='gears';$.extend($.multiUpload.prototype,{init:function(){var up=this;$(up).trigger('multiUpload:init');$(up).bind('multiUpload:selectFiles',function(e){var up=this,desk=google.gears.factory.create('beta.desktop'),s={};if(up.settings.filter[0]!='*')s.filter=$.map(up.settings.filter,function(v){return '.'+v});desk.openFiles(function(f){var sf=[];if(f.length){up._fireEvent('multiUpload:beforeFilesSelected');$(f).each(function(){var fo={id:up.generateID(),name:this.name,blob:this.blob,size:this.blob.length,loaded:0};up.files.push(fo);sf.push(fo);});up._fireEvent('multiUpload:filesSelected',[{files:sf}]);up._fireEvent('multiUpload:filesChanged');}else up._fireEvent('multiUpload:filesSelectionCancelled');},s);});$(up).bind('multiUpload:uploadFile',function(e,fo){var req,up=this,chunkSize,chunk=0,chunks,i,start,loaded=0,curChunkSize;chunkSize=up.settings.chunk_size||1024 * 1024;chunks=Math.ceil(fo.blob.length/chunkSize);uploadNextChunk();function uploadNextChunk(){var url=up.settings.upload_url;if(fo.status)return;curChunkSize=Math.min(chunkSize,fo.blob.length-(chunk * chunkSize));req=google.gears.factory.create('beta.httprequest');req.open('POST',url+(url.indexOf('?')==-1?'?':'&')+'name='+escape(fo.name)+'&chunk='+chunk+'&chunks='+chunks+'&path='+escape(up.settings.path));req.setRequestHeader('Content-Disposition','attachment; filename="'+fo.name+'"');req.setRequestHeader('Content-Type','application/octet-stream');req.setRequestHeader('Content-Range','bytes '+chunk * chunkSize);req.upload.onprogress=function(pr){fo.loaded=loaded+pr.loaded;up._fireEvent('multiUpload:fileUploadProgress',[{file:fo,loaded:fo.loaded,total:fo.size}]);};req.onreadystatechange=function(){var ar;if(req.readyState==4){if(req.status==200){ar={file:fo,chunk:chunk,chunks:chunks,response:req.responseText};up._fireEvent('multiUpload:chunkUploaded',[ar]);if(ar.cancel){fo.status='failed';up._fireEvent('multiUpload:filesChanged');up.uploadNext();return;}loaded+=curChunkSize;if(++chunk>=chunks){fo.status='completed';up._fireEvent('multiUpload:fileUploaded',[{file:fo,response:req.responseText}]);up._fireEvent('multiUpload:filesChanged');up.uploadNext();}else uploadNextChunk();}else up._fireEvent('multiUpload:uploadChunkError',[{file:fo,chunk:chunk,chunks:chunks,error:'Status: '+req.status}]);}};if(chunk=10){$.multiUpload.initialized=1;$.multiUpload.runtime='flash';$.multiUpload.instances=[];$.multiUpload._fireEvent=function(na,p1,p2,p3,p4){window.setTimeout(function(){$($.multiUpload.instances).each(function(i,v){$(v).trigger('multiUpload:'+na,[p1,p2,p3,p4]);v.repaint();});},0);};$.extend($.multiUpload.prototype,{getFlash:function(){return $('#flashuploader')[0];},repaint:function(){var up=this,fb=$(up.settings.flash_browse_button),off=fb.offset();up.flashContainer.css({position:'absolute',top:off.top,left:off.left,width:fb.width(),height:fb.height(),backgr2ound:'red'});},init:function(){var up=this,s=up.settings,so,fb;$.multiUpload.instances.push(up);$(up).bind('multiUpload:flashInit',function(e){$(up).trigger('multiUpload:init');});$(document.body).append('
        ');so=new SWFObject("js/jquery/jquery.multiupload.flash.swf","flashuploader","100%","100%","10.0");so.addVariable("file_filter",$.map(up.settings.filter,function(v){return '*.'+v}).join(';'));so.addParam("wmode","transparent");so.write("flashUploaderContainer");up.flashContainer=$('#flashUploaderContainer');$(function(e){up.repaint();});up.repaint();$(up).bind('multiUpload:flashSelectFiles',function(e,sel){$(sel).each(function(i,fo){up.files.push(fo);});$(up).trigger('multiUpload:filesSelected',[{files:sel}]);$(up).trigger('multiUpload:filesChanged');});$(up).bind('multiUpload:flashUploadComplete',function(e,o){var fo;if(fo=up.getFile(o.id)){if(!fo.status){fo.status='completed';$(up).trigger('multiUpload:fileUploaded',[{file:fo,response:o.text}]);}}$(up).trigger('multiUpload:filesChanged');up.uploadNext();});$(up).bind('multiUpload:flashUploadProcess',function(e,pr){var fo=up.getFile(pr.id);if(!fo.status){fo.loaded=pr.loaded;$(up).trigger('multiUpload:fileUploadProgress',[{file:fo,loaded:fo.loaded,total:fo.size}]);}});$(up).bind('multiUpload:flashIOError',function(e,o){var fo;if(fo=up.getFile(o.id)){if(!fo.status){fo.status='failed';$(up).trigger('multiUpload:uploadChunkError',[{file:fo,error:o.message}]);}}});$(up).bind('multiUpload:stopUpload',function(e){up.getFlash().cancelUpload();});$(up).bind('multiUpload:removeFile',function(e,fo){up.getFlash().removeFile(fo.id);});$(up).bind('multiUpload:clearFiles',function(e){up.getFlash().clearFiles();});$(up).bind('multiUpload:uploadFile',function(e,fo){var pageURL=document.location.href.replace(/\/[^\/]+$/g,'/');up.getFlash().uploadFile(fo.id,{upload_url:pageURL+up.settings.upload_url+'&path='+escape(up.settings.path)+'&name='+escape(fo.name),chunk_size:up.settings.chunk_size,file_field:'file0',post_args:{name0:fo.name}});});$(up).bind('multiUpload:flashUploadChunkComplete',function(e,o){var fo=up.getFile(o.id),arg;arg={file:fo,chunk:o.chunk,chunks:o.chunks,response:o.text};if(!fo.status)$(up).trigger('multiUpload:chunkUploaded',[arg]);if(arg.cancel){fo.status='failed';up.getFlash().cancelUpload();}});}});}})(jQuery); function onSilverlightError(sender,args){alert("onSilverlightError: "+args.errormessage);};(function($){function isInstalled(version){var isVersionSupported=false;var container=null;try{var control=null;try{control=new ActiveXObject('AgControl.AgControl');if(version==null)isVersionSupported=true;else if(control.IsVersionSupported(version))isVersionSupported=true;control=null;}catch(e){var plugin=navigator.plugins["Silverlight Plug-In"];if(plugin){if(version===null){isVersionSupported=true;}else{var actualVer=plugin.description;if(actualVer==="1.0.30226.2")actualVer="2.0.30226.2";var actualVerArray=actualVer.split(".");while(actualVerArray.length>3)actualVerArray.pop();while(actualVerArray.length<4)actualVerArray.push(0);var reqVerArray=version.split(".");while(reqVerArray.length>4)reqVerArray.pop();var requiredVersionPart,actualVersionPart,index=0;do{requiredVersionPart=parseInt(reqVerArray[index]);actualVersionPart=parseInt(actualVerArray[index]);index++;}while(index'+''+'');}$(up).bind('multiUpload:slSelectFile',function(e,id,na,sz){var fo={id:id,name:na,size:sz,loaded:0};sel.push(fo);up.files.push(fo);});$(up).bind('multiUpload:slSelectSuccessful',function(){$(up).trigger('multiUpload:filesSelected',[{files:sel}]);$(up).trigger('multiUpload:filesChanged');sel=[];});$(up).bind('multiUpload:slSelectCancelled',function(){$(up).trigger('multiUpload:filesSelectionCancelled',[sel]);sel=[];});$(up).bind('multiUpload:slUploadFileProgress',function(e,id,lod,tot){var file=up.getFile(id);file.loaded=lod;$(up).trigger('multiUpload:fileUploadProgress',[{file:file,loaded:lod,total:tot}]);});$(up).bind('multiUpload:slUploadSuccessful',function(e,id,resp){var fo;if(fo=up.getFile(id)){if(!fo.status){fo.status="completed";$(up).trigger('multiUpload:fileUploaded',[{file:fo,response:resp}]);}}$(up).trigger('multiUpload:filesChanged');up.uploadNext();});$(up).bind('multiUpload:stopUpload',function(e){$.multiUpload.plugin.CancelUpload();});$(up).bind('multiUpload:slUploadChunkSuccessful',function(e,id,chunk,chunks,resp){var fo=up.getFile(id),ar={file:fo,chunk:chunk,chunks:chunks,response:resp};$(up).trigger('multiUpload:chunkUploaded',[ar]);if(ar.cancel){fo.status="failed";$.multiUpload.plugin.CancelUpload();}});$(up).bind('multiUpload:slUploadChunkError',function(e,id,chunk,chunks,err){$(up).trigger('multiUpload:uploadChunkError',[{file:up.getFile(id),chunk:chunk,chunks:chunks,error:err}]);});$(up).bind('multiUpload:selectFiles',function(e){$.multiUpload.plugin.SelectFiles('Files |'+$.map(up.settings.filter,function(v){return '*.'+v}).join(';'));});$(up).bind('multiUpload:removeFile',function(e,fo){$.multiUpload.plugin.RemoveFile(fo.id);});$(up).bind('multiUpload:uploadFile',function(e,fo){$.multiUpload.plugin.UploadFile(fo.id,up.settings.upload_url+'&name='+escape(fo.name)+"&path="+escape(up.settings.path),parseInt(up.settings.chunk_size));});$(up).bind('multiUpload:clearFiles',function(e){$.multiUpload.plugin.ClearFiles();});}});}})(jQuery);(function($){window.UploadDialog={currentWin:$.WindowManager.find(window),init:function(){var t=this,args;t.args=args=$.extend({path:'{default}',visual_path:'/'},t.currentWin.getArgs());t.fileListTpl=$.templateFromScript('#filelist_item_template');$('.uploadtype').html($.translate('{#upload.basic_upload}',0,{a:'','/a':''}));$('#createin').html(args.visual_path);$('form input[name=path]').val(args.path);$('form input[name=file0]').change(function(e){$('form input[name=name0]').val(t.cleanName(/([^\/\\]+)$/.exec(e.target.value)[0].replace(/\.[^\.]+$/,'')));});$('form').submit(function(){$.WindowManager.showProgress({message:$.translate('{#upload.progress}')});});if(document.location.hostname!=document.domain)$('form input[name=domain]').val(document.domain);t.path=args.path;$('#singleupload').click(function(e){$('#multiupload_view').hide();$('#singleupload_view').show();});RPC.exec('im.getConfig',{path:args.path},function(data){var config=data.result,maxSize,upExt,fsExt,outExt=[],i,x,found;maxSize=config['upload.maxsize'];fsExt=config['filesystem.extensions'].split(',');upExt=config['upload.extensions'].split(',');t.debug=config['general.debug']=="true";t.shouldCleanNames=config['filesystem.clean_names']=="true";t.chunkSize=config['upload.chunk_size']||'1mb';$('#content').show();if($.multiUpload.initialized)$('#multiupload_view').show();else $('#singleupload_view').show();if(config['upload.multiple_upload']!="true"){$('#multiupload_view').hide();$('#singleupload_view').show();}maxSize=maxSize.replace(/\s+/,'');maxSize=maxSize.replace(/([0-9]+)/g,'$1 ');if(upExt[0]=='*')upExt=fsExt;if(fsExt[0]=='*')fsExt=upExt;for(i=0;i');inp=$('#rename').val(parts[1]);t.renameEnabled=1;inp.focus().blur(function(){t.endRename();}).keydown(function(e){var c=e.keyCode;if(c==13||c==27){if(c==13){fo.name=t.cleanName(inp.val())+parts[2];a.html(fo.name);}t.endRename();}});}e.preventDefault();return false;});});up.settings.flash_browse_button='#addmore';up.repaint();$('#filelist')[0].scrollTop=0;});$(up).bind('multiUpload:fileUploaded',function(e,o){$('#'+o.file.id).removeClass('failed').addClass('done');});$(up).bind('multiUpload:filesChanged',function(){calc(up);up.repaint();t.endRename();});$(up).bind('multiUpload:fileUploadProgress',function(e,pr){if(up.status){if(!pr.file.scroll){$('#filelist').scrollTo($('#'+pr.file.id),50);pr.file.scroll=1;}$('#'+pr.file.id+' td.status').html(Math.round(pr.loaded/pr.total * 100.0)+'%');calc(up);}});$(up).bind('multiUpload:chunkUploaded',function(e,o){var res=$.parseJSON(o.response),data=RPC.toArray(res.result);if(data[0]["status"]!='OK'){o.file.loaded=o.file.size;calc(up);$('#'+o.file.id).addClass('failed');$('#'+o.file.id+' td.status').html($.translate(data[0]["message"]));o.cancel=1;}});$(up).bind('multiUpload:uploadChunkError',function(e,o){$('#'+o.file.id).addClass('failed');$('#'+o.file.id+' td.status').html('Failed').attr('title',o.error);});$('#add, #addmore').click(function(e){up.selectFiles();e.preventDefault();return false;});$('#abortupload').click(function(e){up.stopUpload();$.WindowManager.info($.translate('{#upload.cancelled}'),function(){t.currentWin.close();});});$('#uploadstart').click(function(e){$('#uploadstart').parent().hide();$('#status').show();$('#statsrow').hide();$('#files .status').html('-');$('#files .fname a').addClass('disabled');startTime=new Date().getTime();up.startUpload();e.preventDefault();return false;});$('#uploadstop').click(function(e){up.stopUpload();e.preventDefault();return false;});$('#clear').click(function(e){up.clearFiles();$('#files').hide();$('#files tbody').html('');e.preventDefault();return false;});},insertFiles:function(pa){var s=this.currentWin.getArgs();if(s.onupload){RPC.insertFiles({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,paths:pa,insert_filter:s.insert_filter,oninsert:function(o){s.onupload(o);}});}},isDemo:function(){if(this.currentWin.getArgs().is_demo){$.WindowManager.info($.translate('{#error.demo}'));return true;}},endRename:function(){if(this.renameEnabled){$('#files input').remove();$('#files a').show();this.renameEnabled=0;}}};window.handleJSON=function(data){window.focus();UploadDialog.handleSingleUploadResponse(data);};$(function(e){UploadDialog.init();});})(jQuery);plugins/imagemanager/js/_cache/im_upload.gz000066600000021304150472426320015004 0ustar00}v۸(lIhZrn)LNI^tFա$fY> Nz9ӧEBP ,6Y%+F *Z͓+,Ibqxȿݦ"ߤ2L;p'M7k,:C7\ 7XD+1ݭn!J`;܉8<).mMm|vS ?mxvHׇ12FQ_2-Na,ϣ |v*Bh/Yy #+\Ok\d6KY*ױ7J.*³ce8 Uy":;ύJC=HJ|h#Vs`:2j z޵|`aI-ז| OZ\N!ds1KV3΃`[ˢEHΫKV[<+(*w7 >de2@/IߋޕwM{3oԛM~&! =a\tv^ק'xIbȡEf֐`hJ2{y#]KI Zq>+*`fp0he4 Q'&b6TP]-,hBy#L4q rA3q#ԥH3+C ޽*?yڬ@C`yrUq,"h2ZZlZᡖ @wxXC/?F.Wq΃<LY/pTd[!؄FydLf3}1a 'P]G>?ᮨE60|n¸D?bvݘMZiӍ(-!?)>,7,Bhv 0$u Y~>kV*G dKI_~c`Y(;7g lNc$l~ v X&]aݽ"ޮJ&R@i(r*Zk*Ov.KqD@YkY-`lWP:`-Һ0(9v]c%ZCU7:Ѽ l\Ȓbj1E'eL"YrDx!n(lf5%gPjLmT\+g<?d_(Z2zb>s1Qe7w髟>zɫ~8O?=z㇏aQ{d)Z%N227ł21͕Jp!x$⾢^S-nE1h-#h٫4*Yɓ^FiW~ϯ=zޓcSד@Aw5P\mt|NMkO;I<µh육=ꍙ`3v;\zۗJAh*. [,Z/_\FFlqz,A=AlL1BBy 8৊>$G AٙmE&tv~{[9$dH9D|&?+?>fʦkCNQFVjaʥ4Ec}ϓEZ A@Zi4K2Ky"\mP-"hO7ó_َOciJ?p%/pdyUv(- 1Uwee'* ֤9,44LK0y,2M $7N <g/yeň'{ a[LpY܅;l`˹_I+NAl9c TlDzCK  w,h3[MCGSz\$?&5P@7ߤL0řBtuv`E,e-}dd-4w( Z҉pT4 T}7oHĕ'`p Sm<MJ- B6ajrz%:f\uETp{-TB*7(z_^۷B p10f@Z٥$ [' ޞ8ݭ TPC}A تOՅdrFR솺˹yu3SwnoU%@!ƻV2\~=<(*+GE^t,LܩGU(*P PU rvs x@(s|{(D6Pv+gۺY,"7:rFݣq4:k#A4pGT!- qc T81d,Py m+5̿wIY,wc5TA'?'W"=׻7bwK9iʽy|#J2NT0 I"<q9ySj$K`I2y'62t"]7>M9>w倸N9'Ƥś6b?#`qA9 1TrDNE~z􀍿9 #cGUPrU sa ٛ(rtVb0xbcU)2c.LӌrDX zᡡ#TxR+ &B#~Zܡ0J*,, iǞ2]h3zY@" ƲpXKAQa^`'bP8״s/`?3d퍨Xǘ l>(EHy*| ArA}{#3ve $ UKd RFe֢{8cz\jb(cu)pOՙ`NZ[uk4쯥 & #4z*{~x#Ld*Xy}':-NN-; 47v ./RoX  (}.g0T}ѿyC#ȾNC@}(s( K@򨨸't6 L9a⳧D!Ը7O\+3,ߤ x<"E%CQd2f"kl?]QgUI 5bȤ|tB#q$<)tԆcG)_>ݮM'<aT]U*ȠduS?Xc2w SGlde=( ,+)ږ}B<- ,LwLoru@KBx!2_˰VSw Kq:wJ-`(Q{`?qJ`F1#%P SX%Bw8Z Nz=w&0r"b*/a نQఢ"NJrEV M,rR~<UY\Ws7ƀ4U: ګNMu&Ik, 8QH Lr 4dmU>k I\zaZX6PkxOqXWuq9#V :{< .ͣrҵn3miZ]E4B]P~^rs9 y :aL-N+ Z5^*GoW|!xK A h#Qfo?hJ$ '5։Q>,a~5bR%Hu[)_'kgogjMГ HI1Bķ8q.ƺ{]BΠ7'ۆ~Ljͧ*trkHYgn꾾E[reVn&.k˾0}E'n'Æ.6q C-E4_Obi?Au8Chaҙ/e"c-m1齃^[heՔ]{tW?{,~὘r_ԓ$UBݻ[ݵZ*mGm9b*~:vfo-Hɴɍ4"hhJ8a:<73o5 w%wQ:{8YmRyKrp_)?&g6ȳsSC~ 쭼(b: pC|2(?c Pa.ޤɒ Y}ݓ' Ktl nanBL'WMiE =og!9x&\^Z*57ͳC@ΥNs1JuIycGU;jG$cX1qVH~!(p{L5pJ)9ɦ;f?}2Ύ / RpR$}1qHGRw n(S%)(R+p[%R0 b4_x23RmCæybM $~y03\ -bXݽ$O-$7'84w-Ywұ zwя(,VOcC%H왴*hP4êť-Pas9.rԕHaȜ"BJw:S +:0\LI| 87 v<7Cf(YmeS8 NP]tCI6N=.o4pȩNw eŵq;GF: ^ iQ^i!,]Ѻ|txYS,bOTM*ckLCk`fB6{[Eġ~+(/Wm0q7Lj.{lt/avÒpֹHLÃ;36uН"{.zE-g4ޤexO H qpUc,Xw,oo)iu*hEit.y2FޠҼUA+}Dx@.2I]=T[xK\}kkn3-!RY)O+JVCWMaU'hܦÃ%Nyh̪B1O145<[n ͕RF01@ۯN-mÛqT0 3P4x^ B!}XF~&&=(ѩ414Yc0seOIؿ\^y_xpOCr>'MP0\fG&S= [/jH0ڬ9f쓻cg:/Gvv:՗6C9MŐ'G cnGSc}b~:)Leu\ݢ2â I1 P-QLÌVPA4o>IYSzE6Xr Kx $j{ыWV~Q6b Τ!Pm^u/O_äW>'nśt]%P7~}6OzPl2$n6_<+~{H@UJ~j *[snd㋡L&Bb7eK{E+g%w\`D?3{Nt2 U2c?5ːZkH_OXtql1=X57 xrUh\!L?W7H/̓~/VlM띦-uUDŽLcve]^~EkY;ц(thԛ›V78֨>u$ 7r6ho6†In qqkl z=Goݮi0ͯ lS cƢ -PE;{f. mb63֎oH3 ge[k3['lu%l&b^c&n ~Û nli`4ns7py@M l`8c̝hcMDҭt`DF*! CCcN4+a=Q.]םÁvɟawi^_D_ITdZ8.)A}.Vuz5ax=:6eb 07nC9usln}4E( 3 aTVQ&/Oͤ:i8.~K܁'6&zs_.'tEfi (D/KWn<vr w50' 4"?Ug+bc}=L,8tE1$~jڢ@e ##8q{:P\&sZH 8^X-N9rbɠ@fxjXcmM{s9mV&d1+gg|"%GFF^%_C۫$79SéGiBVduf^c1mN^erheYF+ 1L5P?V7EzUf,c8tzM=,+;:xp';C$2`UiOP&-.h\$v[%+9ρ Ԥ~uk>40=3/O('D5=I~L ~ִ>t#-NwLO+%j@gWYQ<6ZzdM-#Q|eȖ&3lDZjN\@rqst,1[LbaS% q!Ribz6M`A?UEJXٝ^DҀV;|4Bi_X0(T7{TWlyLHJl%YĦP1qOxKΩd0&F)B;`B\pLrq3|PdjN;Eev'<"mA rd'o Orhj⨚B -*#Np`1# ͌h; Oٲ j%!f"$ʝ XA>"6* ?P+@ |Nׯ!zg^8uT,sr-``9+V?DndN73ۍKTeu&i`p+f^TBJjI0 +3yElcuy!$I2p?{%&/aosEPPC@t;Q S<`r "Li J0^Ȩ.fmczL *)0ˎncF} 6n.v֚Х:?1DaƄO ^i %vmsQLEǞU<o7gL&EE7-8 *&N9i^#Kw`P*R䙀:ջ]|ZIȩtm+Ę(}7X"V'|c$&xh1g%`Fo{E &wԾ,\kdIFK I=fǯiא.<$e;-Ԑ.nA+t. iN~c,aZ"^x9]!Vs:lY<5Tw)e›rb` ïX%  cѴ #Lu +:{O*˗[N#z}BTv 6lM.XIVN̛"Y@h)XMgUҦ] #'Cɢoѳ~ʜ. Pk4YM`ǩ|~)uFlLs0ۿM6E]w$M`O_׍H+S)qG󷝠jP.dsn~2;ƺ }eS`<d;a* d |I\5 &WU]0]ٕ"e~}9CُuR@fu~5;$Efhޫ}jfWSY8CŎ[t8۸qٔM'BB ՗EdӅD/[Ge_yUJ4eHr%}XKMKDށ.2J| ]:2(<^;BK*]ݯ_xAk`UО_5Q5OWqehS+UB@s#:mx1OLD'28(uX׷/#l(xmӰ:<֪ DOɀb*Wpi3hpT_*8'8 9]5fJs"YjL}}N3RAT xnkr Z$]8#V#L:QQ˺ǠfG*[5>uYsgC5Mv»D-*g_Lp dyL%oh8=eVDN^;m YgtClK[Ol6ztP"fUkmmns)[Ik~=\(Or= Ol(z[bۗEE/tGLY͋v\eH7/ 랲Zk^vC4@`۶,ɨ6S9z'̘#uE㋡xu[j{=w$l'uз]tf?x#ϋ0:vo+f. JeQAd9A AȊì)ۚFʸ nт:1@1;ZUQ/aW=\8kOϽ\vjٞzANt+[kYSx49F!05X]['P g A0 \օ,\d=;ٯ'c77uJ[1!Ts6K)\Xxԙ!6t 5mz5CG$VQ38C|SAj돢"`+'5ǓEo2 imJ%R /IO=YkyʜVU~4%ެěw.c03nb GɇcXY5޺zXA-, Wo\|E _gD{dtI3feuiiLB/;S1IYGG塳Dw jU x|hCV^+y(iT]:7Np|;kc4)l hp: ՛zPG&PJU u-Ul!P:n<2c#:#CDF1i.ra[>nz&·pm[ Oj!V]ɱS5I;><ۍ fu/OY$酶J}M<2Sbg9(y)*ݠpyr"yȘ$?MȺ\5rWxU P,cу6:d7ڔF޸cEl;m )3V]]>ָ֥ `a(-kq'L4Kk'\\y;|h8)V#p\_T=ծ{,TÒXHe98Xrǖ&U ԾhAnS ]hIMu}I)F ۀ{ O ^WTozv!=R[VkZu+#SFE(yZ t7rAx  =).PͱU>. jHNɶ+e%Bj0v] /qEv+Qx1`#j \T" /g<잿?&^N'7<c),#m=~N޻WIԱ ~[.4U!r^57Y"$wD 'ih^<73{?s^@$"/گSuӗs pu+]hc{NWe88J.E)hcl/*.d"`6 0-y+%pKm͵u,5<'8!<,ǁ/Ë!D`yOXUyv+$4Rq'{㌯jߒVq XgՈM #le[zG_ L,fäjcJeӯIMddl7lw<r![~6/UPB\4L -7`Tܴ;t=UbhaT; <{y~ɴB(P'70ߟ࿓ hoxW0geH۰>ip } о5rm O.cW0wε0HxǦ3,{y*@vJjKcgu9:;.lKe )?T,dɍxJ,Teg24ƔZK}L6'aau'_CWQ-_w1܊ZZPnW{cNpϝ88 dt~UT +90z)Q on z\AOdA>)R{Z ڎXuߚ&2*6B/^hG0#pz?Lٌ$ɚq2 7:GtAOnݦ1U]:exUk`%w|)ZQ+B3K`U~曮ٞ=sh :7v* uo.dZIJ/z*Ee׭D)DFINbЭ}$POĮ@_qo/3-4!)1+$Ji$k 6@vVN9F[3|x.ft;޴gJx\ Δ@&8{<'h$C#'D8>pǒhN4ϽDd qE$ PZ;ҶȚcP4Jh:-;ڃ,r_zdmZ|i0GvB Sm,3ʾcH>w sx}ޫRL+5 c3^bnAԭB0dEԥ4NxXѓN%*/<44gS Ź942C| rVf If4m|hC6fDۍX0 Di7,呋7DQsV"j6ѶP*h'O*cgӐ5F؎U  z W/5{Tlo4,S|j`Ʈ|Li⨎.g}7igx&D—Ϩ:UR8Q}y{h8Z k|(BS*ac ˪+y\GP-YA,E<gq` {/6D)-[,8{g} !gIJbedc! / "!>L#M #6Dž^Ϻ#b=v5/?whX.8>V@R yz`ɤ4@aqòWʝSWD)JDŲ Mh4=e)T̰!!Xa4Ш:rixDOV7'cn.U 9#Qy$=^ՀRnj2ipހ6!&w0AvgXܒb+YدPٝ`B`Zyo7ԻnwAeWZ #a3쫻ޜi ж‹!NJyTqګbxeu% mnE`HI[BM:CK(/wMs|Z\TS/pzyARhb93H^\Q=!~ABg\.Sa"iܺ>7=u>#s*V E.7OXq\lꅰR/X!"9El`cRHD-wĹKEhCZAItd"O`W}K2وk-YPBYŒR{Zю3 . yd#ĺх8ivrI $~kͼѿpѴ~sh8Jץ?NQ^a4Z0=v j$`Rʇn n2plܭ !iݸIe[ >> 51fouLgu" |j l:Om7ڳ9U@'9,n5l3+$F'ٴ_UMZzF^+1dZX4f̱hi#q&oFxSH`œ#Xn (EGkh)ϪBQ9m$Tve@x2bP̍ bFScan Tve>Qp9g NF Tq>RZuZ;`_(kAKt4֝6;Ho̮Д*. _:1D|S)89ۏ$"A^N_cOV ]"V]3pàU":$!zb*hĎ;2chDfC /^rXų3B3FXoa`lZ.bc~`GO9̵h%]UJؖHe%*vV;79j+ǧAXn]f(Dorc[fdE~qd@o*+'7ȡ~Fi]\^f&>OVhD_~j=?Z2_!8C3=B"]q!ߖgkO}L 0A@dGzf4;=ʡeBn0귔/yl."҅ \>Ze߾M]kw$zjc<fW%yKt:51jBpCn6ͨh`*esk}`d0P]Eĕoi$4?Yu7]ynLI{P,F27#Gj]'#On:І]>yp#Xݦ7v 8RYY@G lR]ؒ$ 3Mn2Ql1M0rd…D0n&E-edNްw`t·sMy1E4g Gۯ&pJ?\nɓWuD))5,F{yK`f~<_WY,nBux'B8Hgx.QV 2aMzϴHϟܙ?;nRhl"Q-GJ*r&;d\=/G`9/*r%tJIXq=$|&"iTkP UUSK Bsڵ{_}'FЧ'*N]س,A C\9!,|{Fl[>ሯ]Aú j~Stq/v*j>iSKoJbosdy;wRޓV+o&U?I[xy >.p&^`]{`5PJ#<;ָ rV^ ݅E(5 Y +uD.y-E#BLh#g=|ݖ_8 z`/B=fK܌馂KD+Dvx=-' /9_1}B:$55!;S5IGxt$%y^!ÚnY%֪ؑ:Gx?Z<j[esj^jA(eEyö)MPnso᠓6Y2EWbNak#lbm m,_Ӊ~0)I_{Ω:xNT Dt8q  ה:| М$qQ$7Ui'&M;F;:Bk<%-LGVO4,5 r K~ŭX9(PI} )L?3ԢƁEj_`߂sCTdx3F{;61"\a5ҟ W_΢oFs>o#ANY}^ea e:><*̕4cQB񛨆])ݞ2D&BD(dhDqMgslT|au0;dd%͏?<0`}(1M(SİFeT~#EB]րU6+(SKXxP2 TtD>P-rn;Grw`<#fg8QB0z=K =aGp=YL9 rѬN( 7䩉Xg%E]7 I\kpiiviRn(ި/9S0Ig\fDfe~Qx'3cEz kI*7_)$Z!֔eaG,5k##/7_YԻ\z #9 0.{ߧ<+e۟ bU۟uh)!&P*wM/)b T+z-C(/SD{F⍤R'@|HLOe+k_>2O U4Rq;0?}{i֢BYM\C겭lH4ՖTj`xBN'ZQ ˽ELGg$'nk.2g+o _ D%lnŋmxC)'Ngt ɬcm %n"L>F gDl|4kF$9 NјcL#+fk4bo1@wHț{+C!;hdԴhjE;)Hm AvrX 번Ufzsr^LkPcŌ<)Eʺ- uYuJymsgv{FO F}R><);D] FDW}ҍ¸ݿWs:YDw$&N[kz !'YeP#y֋$r svgՂ^\oj={/.+z-rm{,&fO]%U Y Z|/KnCP'AzeC }>2xҨuhM5bVi-E-M7xΤfHqfkUzv%J2Bf:1v..#FfS_\|~m n#fR`VV@Y_0'}L ٟ\ ܷYl=r5Ab,=Yn*0fo3dXo.n7Zy݀ XZct_.җrKAx]K4ay踤QC%H<ܡzm1Y\]; ">wKz.\4n@ 89> y'8zkتoz*l)AZ0l >U1,'vdD.-0`K u_%~)sX@\:Ab)}CPZJ6گxk$A!F1$_41~lr;3~MdG&:fޣ^$=B1b¶JF )=xJ9 \27B2Fk^͍1~܏ArR ]{~QX|4.CD ;MW!sW}NP(0VLqTMɹE),ݸ?2}d\| y Ub3EY\lL Lw|qSYI6q7q1Մ =fۭNU.nrmc!!_m,V@U*3vrG2Gv-(1CΝ"Q AY:lÍMH6 κ W΅e s.ҥ1S]L}a@dU?Yoϟ /9GgK[ZUHw!OбIjS,W)߂a 6KqWڨ @e j)fE8ȣ;v~A/ hFgqvp#$,'fKHwL4TZ%bXh. ٦ OkMs%"|:Fy_l!1֘lq;JI<^Ize>Gߧ=6@7Bq$61رdu#SVlL:gx,y#Y:%MYd+[pj@\O.P[gY p~)uoNJ2.QL4'-ljk\d E6.BsyWvs&.ӂԃU߿`@}fGKn#B8Hل#Q#pȪ%h )vlrVi~t=q #vP0 5?84VFO HI)'$[YWֱi `&^"[ݐ6lNNT:s*B;Bj7dn{%Ҟ9Zu22,SE.}I Vx(t.ia_CRk2 /$#q3ɥJOq`K_fgrĉxX) OieA"c揜մl [QZ5luI?c ֿvֳ*$wt S/KQG KqZT-dX-_}c}ѝá̵vf(BwǖMԺ; :@o:N<;SV=Т\i=OV^g уNsvs~F c)7s-Q%&T}F⠢ȓfT a(JOP(8ᛙvG(AUUtԡl._!gv=9++,N DUf_tg9%bXr#'//1gy_fe=kt׭tqmjNɈr_\5&_M^vS64m(l+Ҕ{\i`dJqB* $21 *uVݭWߐ#+UtG@_j{U [0/=x?G"iuڝH`vڳvrgr:cұr>?tK+}eʿ0Y?c{g2m [Vh1al 2Z]*0ԯ } ۋ?n[|adohuuαAgvo&]K؜3ZhwduDgOE=fQO⤲LJ$ `_~]lt6:81_a'FGajeZe=f)Gvϩ8vS}L[7_Oo_|χooݷ??oecžiof*ٞAf#)-;e2Kx ~ŷ>n7~?lfլ%|= :DeM lgdUV$GEѸPwJ`}Ϯ:tw'D ( Hh/̳Zsb\0ۧJ8zXR-O*,E`I< ̀v)ԫ*ߐeR3P (PEYh҉]%.Xb Y埲xaE%VZJǸW@3 M8XJE&罻0c JA5v* -DtGr}ÿk~q)" |3܏u¼>`0L܊6MYA+!㟭Xj ܩ27KOv6@Q^ȷ߸LFxH$[o3_*=;1[a@莨]|'ߟj$}|/% UY}_Z8;w]W+w_[id*2`wuɝ_rS0]汃L.^kig{ bT''קBZ-Utc.]D;Anʸȉӑ^kGS]\;o[Tl5Z(Ӕ+\Ճaeꨮhw:>8kk"cjob 6b~P(. H .M _ ׸vfko{ڡʹ Kf5Pt`߁ u}4MHY_R+QgБmhN<vmXm xWWRs@ƝgGwKh v %f1חaq'=y,,?B.8{TrFCcG2Ȱ).[ogU;OWMlP]]SJ `x=ѓb猂UCwNoR0myrcr3,T;ꦚg7 m(\N'\N0:=mC6,XB-fívXw_ | $q?:G Lb]_s4oZ-(L@[jKzmE B̊eF/Y 8!pO#f\.OSI- 2bQ) Cz˕pxOܲ$@0(H󒹬,'3mIgZTx-b*|I_-R"! x`a ׫*enesozZcֱX>q :B]Kaj0xL3%u&I0i=C,b.iL Xaf_duJ38cȧk@f)HNz;?rvI[)_k~S9-<QHJU^ʂUS8荢WXCOA*h$rj2֧꣓9q:=G-zo[z*1Df sT<6G'xtي[M+~DPV&(srUkͯl0ߣjlGjSʺ䕔>zVEr[΃5B.TY8l` !^+V!SKr%3Edec:aG᠂57@O!#CT`ܟyA}Kǝםv;YglϿʓ$Têڶ-[˩1;f=3^# =EPn~е9&'EGkEN}:?~쐞}TCp 7O,&هÎb<'vwvn|q-uډmL:<}uh[_ (DҦj4ʏH;^ޓPML=\lNТ8ܑW8]}G{qq yg a\w m[ar72NyR[8$A9pJ,kmp;j(  zN;;Mn[U8޺LevG{9 \+` 7'@NYf VP eO 5Y6ZKfJz%2 m/;X|>̓Up7>7SqwZt=ޫNC&|t^Z(Ğ c}|TD ͜JUkqݚL*3ϭKZGD>[%yi9(hp?nCԋV'ީv$͔,kǡx>Z@5s_AYa gt|d΅f|gV:߉կX́"mVL:;| =8 ikF tY'Y6dX/D !TY m'{٣,Asb,j\ՍmZ5|nA/Y9[Q{ǤuWAs Vý`;nw! `586s!V `p>X*.wp=̱.H< -z|I빜S k`1K`s޿}`QGן{5v}ս¿,Iۗسe?~ϑNQ1V%kt5;I# (?w8I> 8x2E7yY\mӠ;2A-FD:>ȘNЩ+[Sr-*̨^UDTInav`9#o KKo "v*C׸7);_{)|>%Y8;*N=+%{"LS5#Aݤ泒{BՋc,rJ]l"gR:o$j St|Pգmju tGį< grхGf[r;Xp8Wq a_X#<{lln#WJiN_!?q6 1&ht!Oe#$R/Tl Tl }?\$\%vLh~0KJQ~]`bYN&K/0!Ǚ`kqV._4iγ~M a~MidtqQAyQJdׯ߾d*PaP>l@{4X06aM%T䈃ռ|*R~%/ZKOxʼn/~>/Qj5e5xF[A%&,[,ItXtTWI}g c~]ső MPENŃvNDMOϊMO9 8$~=O_gE "n ڨw/`uj^7A? `.l.ӴIO?'gzTP`OTyԯ``가fO0~Y3ld_B`qځϐY}rx{a9:)nĂe~lbJ<i*.?T+C޴R}ak)sYbB'i\ 26K*4Bg|J 5B±>m&NPƜá0%]ҟi#X ZO8"[KNɮzKWP7ޢ>"'  _LΔHj.gYS^4G7K^*0;aW+ZqάQ{sxTboYCJS6b0lu07nOaT0:45Қpsͳsb0c&z*3/SpB 6Mӷ/maTB}u;|"GCJiuK\. w)yJc*Y0, ,,JosnYRy"9YK$h5-U_YA"Wٜ{CKQh! CLmU6\*?oO>"#0 LfB?WXrc.P\|Nu8ôqZbUE1w&_\ccxu>P1_`/(RN鴦lf`#o.[WtN%}NuN'_`)j矾x 컨3>c;!޶FAЛ}}ǖO~'_Oq jٱ{{`@1fŦS=/!h!~ Ht4OgdK*mt-,hTFKHx.l): |{6R=:o)s\ er29|Δ>,]Z.>/ԝz l{Pqg/Dfl]xxOC/Do>Zȇ򈼃q_@CM*_-Gc~%jUy[6Y_#XLAvn~g PSS眀E7x~SL'bQ2=PR5G 7T%0/ؿ#-[vJ%[etJ F~ѺߦlO!e?bc +3=_ ;.{! nVTxNO;Z;9ClzCcpfadqqlΆA9 RbKY#)m ȊMlx?Cgx ?60btKNx<.ޭ^T$bE!?5AuM'X36f 1ױ2u,z;!=8`Y9<XJ5>qwq`t.1+|WYq=?0"Y%zα<.#ωN2(ezm<plugins/imagemanager/js/_cache/im_core.js000066600000236155150472426320014460 0ustar00(function(){try{var li=document.location.search.replace(/\?/,'').split('&'),query={},i;for(i=0;i)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
        "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
        ","
        "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
        ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();(function($){function xmlEncode(s){return s?(''+s).replace(new RegExp('[<>&"\']','g'),function(c,b){switch(c){case '&':return '&';case '"':return '"';case '\'':return ''';case '<':return '<';case '>':return '>';}return c;}):s;};$.translate=function(s,e,va){return s.replace(/\{#([^\}]+)\}/g,function(a,b){var pa=b.split(/\./);if(MCManagerI18n[pa[0]])a=MCManagerI18n[pa[0]][pa[1]];a=a?a:'{#'+b+'}';if(va){a=a.replace(/\{([^\}]+)\}/g,function(a,b){return va[b]||a;});}return e?xmlEncode(a):a;});};$.translateElement=function(e){e=e||document.body;e.innerHTML=$.translate(e.innerHTML.replace(/=({#[a-z0-9_]+})/gi,'="$1"'),1);};document.title=$.translate(document.title.replace(/^(http|https):\/\/[a-z0-9._\-\s]+-/gi,''));$('body > *').each(function(i,v){if(!/(SCRIPT|BR|HR|INPUT|META|IMG|LINK|PARAM|IFRAME)/.test(v.nodeName))$.translateElement(v);});})(jQuery);(function($){$.Window=function(f,a){var t=this;t.features=f;t.args=a;t.isIE6= /MSIE [56]/.test(navigator.userAgent);t.clickActions={min:t.minimize,max:t.maximize,med:t.medimize,close:t.close};t.mouseDownActions={move:t.startDrag,'resize-n':t.startDrag,'resize-nw':t.startDrag,'resize-w':t.startDrag,'resize-e':t.startDrag,'resize-s':t.startDrag,'resize-sw':t.startDrag,'resize-se':t.startDrag};};$.extend($.Window.prototype,{getArgs:function(){return this.args;},focus:function(){var t=this,id=t.id;if(!t.focused){if(t.shim)t.shim.css('z-index',$.WindowManager.zIndex);$('#'+id).css('z-index',t.zIndex=$.WindowManager.zIndex++);$('#'+id+'_container').addClass('focus');$('#'+id+'_top').addClass('focustop');$('#'+id+'_middle').addClass('focusmiddle');$('#'+id+'_bottom').addClass('focusbottom');$($.WindowManager.windows).each(function(){if(this!=t)this.blur();});t.focused=1;}return this;},blur:function(){var t=this,id=t.id;if(t.focused){$('#'+id+'_container').removeClass('focus');$('#'+id+'_top').removeClass('focustop');$('#'+id+'_middle').removeClass('focusmiddle');$('#'+id+'_bottom').removeClass('focusbottom');t.focused=0;}return t;},setTitle:function(ti){this.features.title=ti;$('#'+this.id+'_title').html(ti);return this;},setStatus:function(st){$('#'+this.id+'_statustext').html(st);return this;},minimize:function(){return this;},medimize:function(){var t=this,sp=$.scrollPos(),r;if(r=t.lastRect){$('#'+t.id+'_max').removeClass('med').addClass('max');t.moveTo(r.x,r.y);t.resizeTo(r.w,r.h);t.lastRect=0;}return t;},maximize:function(){var t=this,sp=$.scrollPos();if(!t.lastRect){t.lastRect={x:t.x,y:t.y,w:t.width,h:t.height};$('#'+t.id+'_max').removeClass('max').addClass('med');t.moveTo(sp.x,sp.y);t.resizeTo($.winWidth(),$.winHeight(),1);}return t;},close:function(ac){var t=this,f;if(ac&&(f=t.features.onbeforeclose)){if(f.call(t)===false)return;}$('#'+t.id).remove();if($.WindowManager.windows.length==1)$('#windowManEventBlocker').remove();$.WindowManager.remove(t);if(t.shim){t.shim.remove();t.shim=0;}if(t.features.onclose)t.features.onclose(t);},moveTo:function(x,y){var t=this,el=$('#'+t.id);if(t.x!=x){el.css({left:x});t.x=x;}if(t.y!=y){el.css({top:y});t.y=y;}if(t.shim)t.shim.css({left:x,top:y});return t;},moveBy:function(dx,dy){return this.moveTo(this.x+parseInt(dx),this.y+parseInt(dy));},resizeTo:function(w,h,nr){var t=this,b=t.borders,el=$('#'+t.id),ifr=$('#'+t.id+'_content, #'+t.id+'_ifr');w=parseInt(w);h=parseInt(h);if(!nr&&t.lastRect){$('#'+t.id+'_max').removeClass('med').addClass('max');t.lastRect=0;}if(t.width!=w){ifr.css({width:w-b.w});el.css({width:w});t.width=w;}if(t.height!=h){ifr.css({height:h-b.h});el.css({height:h});$('#'+t.id+'_middle').css('height',h-b.h);t.height=h;}if(t.shim)t.shim.css({width:w,height:h});return t;},resizeBy:function(dw,dh){return this.resizeTo(this.width+parseInt(dw),this.height+parseInt(dh));},show:function(){var t=this,id=t.id,bw,bh;$('#'+id).show();bw=$('#'+id+'_middle div.left')[0].clientWidth;bw+=$('#'+id+'_middle div.right')[0].clientWidth;bh=$('#'+id+'_top')[0].clientHeight;bh+=$('#'+id+'_bottom')[0].clientHeight;t.borders={w:bw,h:bh-1};if(t.shim)t.shim.show();return t;},hide:function(){var t=this;$('#'+t.id).hide();if(t.shim)t.shim.hide();return t;},setContent:function(h){$('#'+this.id+'_content').html(h);return this;},setURL:function(u){var t=this,id=t.id,ifr=$('#'+id+'_ifr'),b=t.borders;if(!ifr[0])$('#'+id+'_content').html('').append($.createElm('iframe',{id:id+'_ifr',src:u,frameBorder:'0',scrolling:t.features.scrolling}).css({width:t.width-b.w,height:t.height-b.h}));else ifr.attr('src',u);return t;},startMove:function(a,e){var t=this,bid=t.features.theme+'_move',mb,sx=e.screenX,sy=e.screenY,dx,dy,wx,wy;$(document.body).append($.createElm('div',{id:bid,'class':t.features.theme+'_event_blocker'}).css('z-index',$.WindowManager.zIndex));mb=$('#'+bid).css({width:$.winWidth(),height:$.winHeight(),position:t.isIE6?'absolute':'fixed'});wx=t.x;wy=t.y;mb.mousemove(function(e){dx=e.screenX-sx;dy=e.screenY-sy;t.moveTo(wx+dx,wy+dy);});mb.mouseup(function(e){mb.remove();});},startDrag:function(a,e){var t=this,bid=t.features.theme+'_move',mb,sx=e.screenX,sy=e.screenY,dx,dy,wx,wy,w,h;$(document.body).append($.createElm('div',{id:bid,'class':t.features.theme+'_event_blocker'}).css('z-index',$.WindowManager.zIndex));mb=$('#'+bid).css({width:$.winWidth(),height:$.winHeight(),position:t.isIE6?'absolute':'fixed'});wx=t.x;wy=t.y;w=t.width;h=t.height;mb.mousemove(function(e){dx=e.screenX-sx;dy=e.screenY-sy;var x=wx+dx,y=wy+dy;switch(a){case 'resize-n':t.moveTo(wx,y);t.resizeTo(w,h-dy);break;case 'resize-nw':t.moveTo(x,y);t.resizeTo(w-dx,h-dy);break;case 'resize-ne':t.moveTo(wx,y);t.resizeTo(w+dx,h-dy);break;case 'resize-w':t.moveTo(x,wy);t.resizeTo(w-dx,h);break;case 'resize-e':t.resizeTo(w+dx,h);break;case 'resize-s':t.resizeTo(w,h+dy);break;case 'resize-sw':t.moveTo(wx+dx,wy);t.resizeTo(w-dx,h+dy);break;case 'resize-se':t.resizeTo(w+dx,h+dy);break;case 'move':t.moveTo(wx+dx,wy+dy);break;}e.preventDefault();return false;});mb.mouseup(function(e){mb.remove();});e.preventDefault();return false;},render:function(){var t=this,id='win_'+$.WindowManager.count++,f=t.features,mc='',bl,v;t.features=f=$.extend({theme:'clearlooks2',modal:1,type:'window',x:-1,y:-1,width:320,height:240,title:' '},f);if(f.x==-1)f.x=Math.round(($.winWidth() / 2) - (f.width / 2));if(f.y==-1)f.y=Math.round(($.winHeight() / 2) - (f.height / 2));t.id=id;if(f.modal){bl=$('#windowManEventBlocker');if(!bl[0]){$(document.body).append($.createElm('div',{id:'windowManEventBlocker','class':f.theme+'_event_blocker'}).addClass(f.theme+'_visible_event_blocker'));bl=$('#windowManEventBlocker');}bl.show().css('z-index',$.WindowManager.zIndex++).css({width:$.winWidth(),height:$.winHeight(),position:t.isIE6?'absolute':'fixed'});}if(t.isIE6&&!t.shim){$(document.body).append('');t.shim=$('#'+id+'_shim');}$(document.body).appendAll(['div',{id:id,'class':f.theme+' window'},['div',{id:id+'_container','class':'statusbar '+f.type},['div',{id:id+'_top','class':'windowtop'},['div',{'class':'left'}],['div',{'class':'middle'}],['div',{'class':'right'}],['div',{id:id+'_title','class':'title'},f.title],['a',{id:id+'_min',href:'','class':'action min'}],['a',{id:id+'_max',href:'','class':'action max'}],['a',{id:id+'_close',href:'','class':'action close'}],['a',{id:id+'_move','class':'action move',tabindex:'-1'}],['a',{id:id+'_resize_n','class':'action resize resize-n',tabindex:'-1'}],['a',{id:id+'_resize_nw','class':'action resize resize-nw',tabindex:'-1'}],['a',{id:id+'_resize_ne','class':'action resize resize-ne',tabindex:'-1'}] ],['div',{id:id+'_middle','class':'windowmiddle'},['div',{'class':'left'}],['div',{id:id+'_content','class':'middle'},' '],['div',{'class':'right'}],['div',{id:id+'_bigicon','class':'bigicon'}],['a',{id:id+'_resize_w','class':'action resize resize-w',tabindex:'-1'}],['a',{id:id+'_resize_e','class':'action resize resize-e',tabindex:'-1'}] ],['div',{id:id+'_bottom','class':'windowbottom'+(f.statusbar?' statusbarbottom':'')},['div',{'class':'left'}],['div',{'class':'middle'}],['div',{'class':'right'}],['div',{id:id+'_statustext','class':'statustext'},' '],['a',{id:id+'_resize_s','class':'action resize resize-s',tabindex:'-1'}],['a',{id:id+'_resize_sw','class':'action resize resize-sw',tabindex:'-1'}],['a',{id:id+'_resize_se','class':'action resize resize-se',tabindex:'-1'}] ] ] ]);if(f.bigicon)$('#'+id+'_bigicon').addClass(f.bigicon);if(f.chromeless)$('#'+id+'_container').addClass('chromeless');if(f.resizable)$('#'+id+'_container').addClass('resizable');if(f.statusbar){$('#'+id+'_container').addClass('statusbar');$('#'+id+'_bottom').addClass('statusbarbottom');}t.show().hide().resizeTo(f.width,f.height).moveTo(f.x,f.y).show();if(v=f.title)t.setTitle(v);if(v=f.content)t.setContent(v);if(v=f.url)t.setURL(v);function handleAction(e){var el=$(e.target),action,f;t.focus();if(el[0].nodeName=='A'&&el.hasClass('action')){action=$.grep(el[0].className.split(/\s+/),function(v){return !/^action|resize$/.test(v);}).join(' ');if(e.type=='mousedown')f=t.mouseDownActions[action];else{if(t.features.onaction){t.features.onaction.call(t,action);return false;}f=t.clickActions[action];}if(f){f.call(t,action,e);return false;}}};$('#'+id).click(handleAction).mousedown(handleAction);$($.WindowManager).trigger('WindowManager:open',[t]);return t;}});$.WindowManager={zIndex:100010,count:0,windows:[],i18n:{yes:'Yes',no:'No',ok:'Ok'},setup:function(){var w=window,lw,nwm;while((w=w.parent||w.opener)&&w!=lw){if(w.$&&w.$.WindowManager)nwm=w.$.WindowManager;lw=w;}if(nwm&&nwm!=this){$.CurrentWindowManager=$.WindowManager;$.WindowManager=nwm;nwm.find(window).setTitle(document.title);}else{$(window).bind('resize',function(){$($.WindowManager.windows).each(function(i,w){if(w.lastRect)w.resizeTo($.winWidth(),$.winHeight(),1);});});}},find:function(tw){var i,ifr,w;for(i=0;i'+msg+'
        '+''+this.i18n.yes+''+''+this.i18n.no+'');},modalBox:function(msg,f,cb){f=$.extend({type:'alert',bigicon:'error',width:400,height:130,onaction:function(a){if(a=='ok'){this.close();if(cb)cb.call(this,1);}else if(a=='close')this.close();}},f);return this.open(f).setContent('
        '+(msg||'')+'
        '+''+this.i18n.ok+'');},remove:function(w){var t=this,fr,z=0,nl=[];$(t.windows).each(function(i,cw){if(w==cw)return;if(cw.zIndex>z){z=cw.zIndex;fr=cw;}nl.push(cw);});t.windows=nl;if(fr)fr.focus();}};$.WindowManager.setup();})(jQuery);(function($){$.StatusWindow=function(f,a){var t=this;t.isIE6= /MSIE [56]/.test(navigator.userAgent);f=$.extend({type:'status',width:400,height:240,onaction:function(a){if(a=='ok')t.close();}},f);$.Window.call(t,f,a);};$.extend($.StatusWindow.prototype,$.Window.prototype,{setContent:function(co){var v,k,h='';if(typeof(co)!='string'){$(co).each(function(i,v){h+='
        '+'
        '+v.title+'
        '+'
        '+v.content+'
        '+'
        ';});}$('#'+this.id+'_statuscont').html(h||co);return this;},render:function(){var t=this,f,v;$.Window.prototype.render.call(t);$.Window.prototype.setContent.call(t,'
        '+''+$.WindowManager.i18n.ok+'');f=t.features;if(v=f.content)t.setContent(v);return t;}});if(!$.CurrentWindowManager){$.extend($.WindowManager,{status:function(f,cb){var t=this,w;f=$.extend({onaction:function(a){if(a=='ok'){w.close();if(cb)cb.call(t,1);}else if(a=='close')w.close();}},f);w=new $.StatusWindow(f).render();t.windows.push(w);return w.focus();},showProgress:function(f){var t=this,bl,id='progressWindow';t.hideProgress();t.progress=1;f=$.extend({theme:'clearlooks2',x:-1,y:-1},f);bl=$('#windowManProgressEventBlocker');if(!bl[0]){$(document.body).append($.createElm('div',{id:'windowManProgressEventBlocker','class':f.theme+'_event_blocker'}).addClass(f.theme+'_visible_event_blocker'));bl=$('#windowManProgressEventBlocker');}bl.show().css('z-index',t.zIndex++).css({width:$.winWidth(),height:$.winHeight(),position:t.isIE6?'absolute':'fixed'});$(document.body).appendAll(['div',{id:id,'class':f.theme+'_progress'},['div',{id:id+'_msg','class':'message'}] ]);$('#'+id+'_msg').html(f.message);$('#'+id).css({left:-1000,top:-1000}).show();if(f.x==-1)f.x=Math.round(($.winWidth() / 2) - ($('#' + id).width() / 2));if(f.y==-1)f.y=Math.round(($.winHeight() / 2) - ($('#' + id).height() / 2));$('#'+id).css({left:f.x,top:f.y});$(t).bind('WindowManager:open',function(){t.hideProgress();});},hideProgress:function(){var t=this;if(t.progress){$('#progressWindow').remove();$('#windowManProgressEventBlocker').hide();$(t).unbind('WindowManager:open',t.hideProgress);t.progress=0;}}});}})(jQuery);(function($){$.extend({createElm:function(n,a,h){n=$(document.createElement(n));n.attr(a).html(h);return n;},appendElements:function(te,ne){var i,n;if(typeof(ne)=='string')te.appendChild(document.createTextNode(ne));else if(ne.length){te=te.appendChild($.createElm(ne[0],ne[1])[0]);for(i=2;i)/gi,''))),opts);};$.extend($.template.helpers,{sizefix:function(v){v=parseInt(v);if(isNaN(v)||v==-1)return '';if(v>1048576)return Math.round(v/1048576,1)+" MB";if(v>1024)return Math.round(v/1024,1)+" KB";return v+" b";},encodeURIComponent:function(v){return encodeURIComponent(v);}});})(jQuery);(function($){function URI(u,s){var t=this,o,a,b;s=t.settings=s||{};if (/^(mailto|news|javascript|about):/i.test(u)|| /^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf(':/')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u= /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);$(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"]).each(function(i,v){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}};$.extend(URI.prototype,{setPath:function(p){var t=this;p= /^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;if(u==="./")return u;u=new URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i,l;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0,l=base.length;i=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0,l=base.length-(bp-1);i=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return '/'+o.reverse().join('/');return '/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});$.parseURI=function(u,s){s=s||{};return new URI(u,$.extend({base_uri:new URI(s.base_url||document.location.href)},s));};})(jQuery);(function($){$.cleanName=function(s){var i,lo;lo=[ /[\300-\306]/g,'A', /[\340-\346]/g,'a', /\307/g,'C', /\347/g,'c', /[\310-\313]/g,'E', /[\350-\353]/g,'e', /[\314-\317]/g,'I', /[\354-\357]/g,'i', /\321/g,'N', /\361/g,'n', /[\322-\330]/g,'O', /[\362-\370]/g,'o', /[\331-\334]/g,'U', /[\371-\374]/g,'u' ];for(i=0;i "+r.tofile,content:$.translate(r.message)});}if(r.file!=undefined){r.file=r.file.replace(/\{[0-9]+\}/,root);r.file=r.file.replace(/\/+/,'/');errors.push({title:r.file,content:$.translate(r.message)});}}});if(errors.length){$.WindowManager.status({title:$.translate(args.message),content:errors});return true;}}},insertFiles:function(s){var t=this,args={};$(s.paths).each(function(i,v){args['path'+i]=v;});if(s.progress_message)$.WindowManager.showProgress({message:s.progress_message});RPC.exec('im.insertFiles',args,function(data){var o={files:[]};$.WindowManager.hideProgress();$(RPC.toArray(data.result)).each(function(i,v){var u=v.url;if(s.relative_urls)u=$.parseURI(s.document_base_url||s.default_base_url).toRelative(u);else if(s.document_base_url)u=$.parseURI(s.document_base_url).toAbsolute($.parseURI(u).getURI(1),s.no_host);v={name:v.name,path:v.path,url:u,size:v.size,type:v.type,created:v.created,modified:v.modified,attribs:v.attribs,custom:$.extend({},v.custom)};o.files.push(v);});if(s.oninsert){if(s.insert_filter){$(o.files).each(function(i,f){s.insert_filter(f);});}s.oninsert(o);}});},insertFile:function(s){var ins=s.oninsert;s.paths=[s.path];s.oninsert=function(o){o.file=o.files[0];ins.call(this,o);};this.insertFiles(s);}};RPC.init();})(jQuery);(function($){var w,ed,wm,args={};window.focus();w=opener||parent;if(w.mcImageManager)args=w.mcImageManager.windowArgs;if(w.tinyMCE&&(ed=w.tinyMCE.activeEditor)){if(ed&&(wm=ed.windowManager)){if(wm.params)args=wm.params;if(wm.setTitle)wm.setTitle(window,document.title);}}if(!$.CurrentWindowManager){$.WindowManager.defaultWin={getArgs:function(){return args;},close:function(){if(ed&&wm.bookmark)ed.selection.moveToBookmark(wm.bookmark);if(wm)wm.close(window);else window.close();}};}})(jQuery);plugins/imagemanager/js/_cache/im_imagemanager.js000066600000040121150472426320016127 0ustar00(function($){var idCount=0;function DropMenu(s){var t=this,k;t.items=[];t.settings=s=$.extend({menu_class:'menu',menu_item_class:'menuitem',item_class:'item',separator_class:'separator',submenu_item_class:'submenu',active_class:'active'},s);t.id=s.id;if(s.setup)s.setup.call(t,t);function hideHandler(e){if(e.target.nodeName!=='A'||!$(e.target).parents('div.'+s.menu_class).length)t.hide();};function clickHandler(e){var m;if(e.target.nodeName==='A'){m=t.find(e.target.rel);if(!m.show&&!m.disabled){if(m.onclick)m.onclick.call(m.scope||this,e,m);if(s.onClick)s.onClick(e,m);m=t;do{m.hide();}while(m=m.parentMenu);}e.preventDefault();return false;}};function mouseOverHandler(e){var x,y,o,m,el;if(e.target.nodeName==='A'){if(t.lastMenu)t.lastMenu.hide();if(m=t.find(e.target.rel)){if(m.show){el=$(e.target.parentNode);o=el.offset();x=o.left+el.width();y=o.top;el.addClass(m.settings.active_class);t.lastMenu=m;m.show(x,y);}}}};function createElm(n,a,h){n=document.createElement(n);if(a)$(n).attr(a);if(h)$(n).html(h);return n;};function uniqueId(){return 'jquery_mc_'+idCount++;};$.extend(this,{createMenu:function(s){return new DropMenu(s);},find:function(n){var i;for(i=0;i$.winWidth()?$.winWidth()-m.width():x;y=y+m.height()>$.winHeight()?$.winHeight()-m.height():y;}m.css({left:x,top:y}).click(clickHandler);t.visible=1;$(t).trigger('DropMenu:show');$().trigger('DropMenu:show',[t]);return false;},hide:function(){if(!t.visible)return false;$('a[@rel='+t.id+']').parent().removeClass('active');$().unbind('mouseup',hideHandler);$('#'+t.id).unbind('mouseover',mouseOverHandler).hide();$('#'+t.id).unbind('click',clickHandler);t.visible=0;$.each(t.items,function(){if(this.hide)this.hide();});$(t).trigger('DropMenu:hide');$().trigger('DropMenu:hide',[t]);return false;},add:function(o){o.id=o.id||uniqueId();t.items.push(o);return o;},addSeparator:function(){return t.add({'class':s.separator_class,title:'separator'});},addMenu:function(o){if(!o.onClick)o.onClick=s.onClick;o=new DropMenu(o);o.parentMenu=t;return t.add(o);}});};jQuery.mcDropMenu=DropMenu;jQuery.fn.mcContextMenu=function(s){this.each(function(){var m=new $.mcDropMenu(s);m.render(this);$(this).bind('contextmenu',function(e){return m.show(e.clientX,e.clientY);});});};})(jQuery);(function($){window.BaseManager={currentWin:$.WindowManager.find(window),path:'{default}',visualPath:'',files:[],selectedFiles:[],focusedFile:null,demoMode:false,disabled:{},specialFolders:[],getFile:function(id){var o;$(this.files).each(function(){if(this.id==id)o=this;});return o;},setDisabled:function(v,st){this.disabled[v]=st;if(st)$('#'+v).addClass('disabled').addClass('deactivated');else $('#'+v).removeClass('disabled').removeClass('deactivated');},isDisabled:function(v){return this.disabled[v]?this.disabled[v]:0;},addSpecialFolder:function(o){this.specialFolders.push(o);},isDemo:function(){if(this.demoMode){$.WindowManager.info($.translate('{#error.demo}'));return true;}}};})(jQuery);(function($){window.ImageManager=$.extend(BaseManager,{page:0,pages:0,pageSize:25,viewMode:'thumbs',tools:[ 'createdir','preview','refresh','edit','upload','rename','delete','download','insert','filemanager','help' ],init:function(){var t=this,args=t.currentWin.getArgs(),uri;t.type='im';t.caregoryListTpl=$.templateFromScript('#folders_template');t.foldersTpl=$.templateFromScript('#folders_template');t.thumbTpl=$.templateFromScript('#thumb_template');t.textTpl=$.templateFromScript('#text_template');t.customDirsTpl=$.templateFromScript('#custom_dir_template');t.path=args.path||'{default}';t.rootPath=args.rootpath;t.extensions=args.extensions;t.include_file_pattern=args.include_file_pattern;t.exclude_file_pattern=args.exclude_file_pattern;t.include_directory_pattern=args.include_directory_pattern;t.exclude_directory_pattern=args.exclude_directory_pattern;t.remember_last_path=args.remember_last_path;t.urlSuffix='';if(document.domain!=document.location.hostname)t.urlSuffix='?domain='+document.domain;if(args.url){uri=$.parseURI(args.url,{base_url:args.document_base_url||args.default_base_url});if(uri)t.inputURL=uri.path.replace(/\/[^\/]+$/,'');}if(t.rootPath){chunks=t.rootPath.split(/=/);t.rootPathName=chunks.length>1?chunks[0]: /[^\/]+$/.exec(t.rootPath);t.rootPath=chunks[1]||t.rootPath;}$.extend($.template.helpers,{add:function(v,a){if(v!='auto')v=parseInt(v)+parseInt(a)+'px';return v;}});t.menu=new $.mcDropMenu({halign:'right',valign:'bottom',setup:function(m){$(m).bind('DropMenu:beforeshow',function(e,m){var file=t.focusedFile;m.clear();if(file.type!='folder')m.add({title:$.translate('{#common.insert}'),disabled:t.isDisabled('insert'),onclick:function(){t.insertFiles();}});m.add({title:$.translate('{#common.deleteit}'),disabled:t.isDisabled('delete'),onclick:function(){t.deleteFiles([file]);}});if(file.type!='folder'){if(file.custom.editable)m.add({title:$.translate('{#common.edit}'),disabled:t.isDisabled('edit'),onclick:function(){t.editFile(file);}});m.add({title:$.translate('{#common.view}'),disabled:t.isDisabled('view'),onclick:function(){t.viewFile(file);}});}});}});$().bind('DropMenu:show',function(e,m){$('#'+m.id).css('opacity',0).animate({opacity:0.9},300);});t.menu.render('#filelist');$().bind('action:createdir',function(){t.createDir();});$().bind('action:upload',function(){t.uploadFiles();});$().bind('action:refresh',function(){t.listFiles();t.listDirs();});$().bind('action:help',function(){});$().bind('action:filemanager',function(){t.fileManager()});$('#tools li').each(function(i,v){$(v).click(function(e){if(!$(v).hasClass('disabled'))$().trigger('action:'+v.id,e);e.preventDefault();return false;});});$('#filelist').click(function(e){var a=$(e.target).parents('a')[0],fo,o,div,img;if(a&&a.rel){div=$(a).parents('div.file')[0];fo=t.focusedFile=t.files[div.id.replace(/[^0-9]/g,'')];t.selectedFiles=[fo];if(a.rel=='file'){if(fo.type=='folder'||fo.type=='parent'){t.page=0;t.listFiles(fo.path);t.listDirs();}else t.insertFiles();}else if(a.rel=='menu'){img=$(a).find('img');o=img.offset();t.menu.show(o.left+img.width(),o.top);}e.preventDefault();return false;}});$('#folder_list, #special_list, #category_list').click(function(e){var a=e.target.nodeName=='A'?e.target:$(e.target).parents('a')[0];if(a){t.page=0;t.listFiles(a.title);t.listDirs();}});$('#selectView').change(function(e){t.viewMode=$(e.target).val();t.updateFileList();});$('#setPages').change(function(e){t.page=0;t.pageSize=$(e.target).val();t.listFiles();});$('#curpage').change(function(e){t.page=parseInt(e.target.value)-1;t.listFiles();});$('#pages').click(function(e){var el=e.target;if(el.nodeName=='A'){if($(el).hasClass('disabled'))return;if($(el).hasClass('next'))t.page++;else if($(el).hasClass('prev'))t.page--;t.listFiles();e.preventDefault();return false;}});function filter(e){var f=$(e.target).val();if(f==t.filterVal)return;t.filterVal=f;if(f=='')f=null;else if(f.indexOf('*')==-1)f='*'+f+'*';t.page=0;t.filter=f;t.listFiles();t.listDirs();};$('#filter').change(filter).keyup(function(e){if(e.keyCode==13)filter(e);});if(t.specialFolders.length){$(t.specialFolders).each(function(i,v){v.title=$.translate(v.title);$('#special_list').append(t.customDirsTpl,v);});$('#special_list').show();}setInterval(function(){RPC.exec('im.keepAlive',{});},60 * 1000 * 5);},listFiles:function(p){var t=this,args=t.currentWin.getArgs();t.path=p||t.path;$('#pages').hide();$('#progress').show();$('#filelist').html('');t.page=isNaN(t.page)||t.page<0?0:t.page;if(t.pages)t.page=t.page>t.pages-1?t.pages-1:t.page;RPC.exec('im.listFiles',{path:t.path,root_path:t.rootPath,url:t.inputURL,config:'general,thumbnail,filesystem,filemanager',extensions:t.extensions,include_file_pattern:t.include_file_pattern,exclude_file_pattern:t.exclude_file_pattern,include_directory_pattern:t.include_directory_pattern,exclude_directory_pattern:t.exclude_directory_pattern,remember_last_path:!!t.remember_last_path,page:t.page,page_size:t.pageSize,filter:t.filter},function(data){var header,cfg,disabled,visible,argTools,argDisabledTools;if(!RPC.handleError({message:'List files error',visual_path:t.visualPath,response:data})){header=data.result.header;cfg=data.result.config;t.access=header.attribs;t.visualPath=header.visual_path;t.pages=parseInt(header.pages);t.config=cfg;t.fileManagerURL=cfg['filemanager.urlprefix'];t.demoMode=cfg['general.demo']=="true";t.path=header.path;function explode(s){return s?s.replace(/\s+/g,'').split(','):s;};disabled=t.disabledTools=explode(cfg['general.disabled_tools']);visible=explode(cfg['general.tools']);if(argDisabledTools=explode(args.disabled_tools))disabled=jQuery.merge(argDisabledTools,disabled);if(argTools=explode(args.tools)){$(argTools).each(function(i,v){if(!$.inArray(v,visible))visible.push(v);});visible=$.grep(visible,function(v){return $.inArray(v,argTools);});}$(t.tools).each(function(i,v){var li=$('#'+v);t.setDisabled(v,$.inArray(v,disabled)!=-1);if($.inArray(v,visible)!=-1)li.show();else li.hide();});$('#tools').show();$('#progress').hide();$('#curpath').html(t.visualPath).attr('title',t.visualPath);t.files=RPC.toArray(data.result);t.updateFileList();$().trigger('filelist:changed');}});},updateFileList:function(){var t=this;fileLst=$('#filelist');fileLst.html('');$('#numpages').html(t.pages);$('#curpage').val(t.page+1);$('#pages').show();if(!t.page)$('#pages .prev').addClass('disabled');else $('#pages .prev').removeClass('disabled');if(t.page==t.pages-1)$('#pages .next').addClass('disabled');else $('#pages .next').removeClass('disabled');$(t.files).each(function(i){var r=this,cfg=t.config;r=$.extend({index:i,thumburl:'../../stream/index.php?cmd=im.thumb&path='+escape(r.path)+'&u='+r.size,thumb_width:(parseInt(cfg["thumbnail.width"])+10)+'px',thumb_height:(parseInt(cfg["thumbnail.height"])+10)+'px',text_width:(parseInt(cfg["thumbnail.width"])-16)+'px'},this);if(r.custom.twidth){r.width=r.custom.twidth+'px';r.height=r.custom.theight+'px';}else{r.width=r.height='auto';r.thumburl='img/img_generic.png';}switch(r.type){case 'parent':r.thumburl='img/parent_big.gif';break;case 'folder':r.thumburl='img/folder_big.gif';break;case 'swf':case 'flv':r.thumburl='img/flash.gif';break;case 'dcr':r.thumburl='img/dcr.gif';break;case 'mov':case 'qt':r.thumburl='img/qt.gif';break;case 'ram':case 'rm':r.thumburl='img/rm.gif';break;case 'wmv':case 'avi':case 'mpg':case 'mpeg':case 'asf':r.thumburl='img/avi.gif';break;}fileLst.append(t.viewMode=='thumbs'?t.thumbTpl:t.textTpl,r);$('#file_'+i+' img.thumbnailimage').attr('src',r.thumburl);});},deleteFiles:function(fl){var t=this,args={};if(fl){$(fl).each(function(i,v){args['path'+i]=v.path;});$.WindowManager.confirm($.translate('{#view.confirm_delete}'),function(s){if(s){if(!t.isDemo()){RPC.exec('im.deleteFiles',args,function(data){if(!RPC.handleError({message:'{#error.delete_failed}',visual_path:t.visualPath,response:data})){t.listFiles();t.listDirs();}});}}});}},insertFiles:function(){var t=this,s=t.currentWin.getArgs(),selectedPaths=[];$(t.selectedFiles).each(function(i,v){selectedPaths.push(v.path);});RPC.insertFiles({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,paths:selectedPaths,progress_message:$.translate("{#common.image_data}"),insert_filter:s.insert_filter,oninsert:function(o){t.currentWin.close();if(s.oninsert){$(o.files).each(function(i,v){if(v.path==t.focusedFile.path)o.focusedFile=v;});s.oninsert(o);}}});},editFile:function(f){$('#center').hide();window.scrollTo(0,0);$.WindowManager.open({url:'edit.html'+this.urlSuffix,onclose:function(){$('#center').show();}},{is_demo:this.demoMode,path:this.focusedFile.path,visual_path:this.visualPath,onsave:function(){ImageManager.listFiles();ImageManager.listDirs();}}).maximize();},viewFile:function(f){$('#center').hide();window.scrollTo(0,0);$.WindowManager.open({url:'view.html'+this.urlSuffix,chromeless:1,onclose:function(){$('#center').show();}},{is_demo:this.demoMode,path:f.path,visual_path:this.visualPath,ondelete:function(){ImageManager.listFiles();}}).maximize();},createDir:function(){$.WindowManager.open({url:'createdir.html'+this.urlSuffix,width:450,height:280},{is_demo:this.demoMode,path:this.path,visual_path:this.visualPath,oncreate:function(){ImageManager.listFiles();ImageManager.listDirs();}});},uploadFiles:function(){$.WindowManager.open({url:'upload.html'+this.urlSuffix,width:550,height:350,scrolling:'no'},{is_demo:this.demoMode,path:this.path,visual_path:this.visualPath,onupload:function(){ImageManager.listFiles();}});},fileManager:function(){var suf;if(this.fileManagerURL.indexOf('?')!=-1)suf=this.urlSuffix.replace(/\?/,'&');document.location=this.fileManagerURL+suf;},listRoots:function(){var t=this;if(t.rootPathName){$('#category_list').html(t.caregoryListTpl,{name:t.rootPathName,path:t.rootPath});return;}RPC.exec('im.listFiles',{"path":"root:///"},function(data){$(RPC.toArray(data.result)).each(function(){$('#category_list').append(t.caregoryListTpl,this);});});},listDirs:function(){var t=this;$('#folder_list').html($.translate('
      • {#common.loading}
      • '));RPC.exec('im.listFiles',{path:t.path,root_path:t.rootPath,only_dirs:true,include_directory_pattern:t.include_directory_pattern,exclude_directory_pattern:t.exclude_directory_pattern,filter:t.filter,remember_last_path:t.remember_last_path},function(data){$('#folder_list').html('');$(RPC.toArray(data.result)).each(function(){$('#folder_list').append(t.caregoryListTpl,this);});});}});$(function(){ImageManager.init();ImageManager.listFiles();ImageManager.listDirs();ImageManager.listRoots();});})(jQuery);(function($){var man=window.FileManager||window.ImageManager;man.addSpecialFolder({title:'{#history.special_folder_title}',path:'history:///',type:'history'});$().bind('filelist:changed',function(){if(man.path.indexOf('history://')!=-1){$(man.tools).each(function(i,v){man.setDisabled(v,1);});$(['insert','download','view']).each(function(i,v){man.setDisabled(v,0);});}});})(jQuery);(function($){var man=window.FileManager||window.ImageManager,type=window.FileManager?'fm':'im';man.addSpecialFolder({title:'{#favorites.special_folder_title}',path:'favorite:///',type:'favorites'});$().bind('DropMenu:beforeshow',function(e,m){if(man.path.indexOf('://')==-1){m.addSeparator();m.add({title:$.translate('{#favorites.addfavorites}'),disabled:man.isDisabled('addfavorites')||!man.selectedFiles.length,onclick:addFavorites});}if(man.path.indexOf('favorite://')!=-1){m.addSeparator();m.add({title:$.translate('{#favorites.removefavorites}'),disabled:man.isDisabled('removefavorites')||!man.selectedFiles.length,onclick:removeFavorites});}});$().bind('filelist:changed',function(){if(man.path.indexOf('favorite://')!=-1){$(man.tools).each(function(i,v){man.setDisabled(v,1);});}});function addFavorites(){var args={};$(man.selectedFiles).each(function(i,f){args['path'+i]=f.path;});RPC.exec(type+'.addFavorites',args,function(data){RPC.handleError({message:'{#error.addfavorites_failed}',visual_path:args.visual_path,response:data});});};function removeFavorites(){var args={};$(man.selectedFiles).each(function(i,f){args['path'+i]=f.path;});RPC.exec(type+'.removeFavorites',args,function(data){if(!RPC.handleError({message:'{#error.removefavorites_failed}',visual_path:args.visual_path,response:data}))man.listFiles();});};})(jQuery);plugins/imagemanager/js/_cache/im_imagemanager.gz000066600000011663150472426320016144 0ustar00; s㶕xdrs۹Ra|tg4ݸ@]~($O Ey<<}nʤͪһw۸>oMFә9{[WUF*kYd*j۬\6Q]U6OiBm!nF:nta[eKdQfY5׿A/qU)@*hzڠ꛸P/H ;OU'6&H*o\g_g!+6H3QGEЬ/_Bc5}t"JBj{Ⱂd74ݶ<ԳE+9>\yET@ ֵ[ƛ5.8o6V"W@^ ygMCvwku҈M]RTеv%NV{Ҟ.[Q2 I 0%IU6mIG/2Y= 7x'`F\t9w؁!<ݺ/_:VO1ړT9)'IdKwVVi2~m 58.clGr}WG; 3]ոPjo֞.=8֍&rl cC^N )<[`ArW.K3f}նU!GR8a3P4|HG0*aInz_4u(C?Ё@n4dT?夸t6Hқ ,o$+bNĝ0g'{=x~6=:]EEȞ&7#&)MO$v2괺o[ֈQㄓ$QClQwz ;N8Y,H |oaw%oٌA0-ɶ!U~bil h[!*9yhD%6UaxQbP$z30*[7h_)`\8 cQhE&voeqp`S:6Sp$tUcQ_e M1+ËG86e_v݂烐 ś8ao7JJZxg:R  h9J4'AбVICdLJ- a|0HGr5-V6f.jZحϊZXTdu B?ag~o̚vj6Ͱ#j]uiS/;݅#$6 wC ʴ.eAu 223fP=ם?@KOAp Lo'wǓ>0HޱY/VU_8 HGC727 5GvUuFhSc#8TqѰa Uܫzq?L4 ;B[hEU@UhiQM @6X*&;w=xFv@A ˬ17=3m7^oڿ}U$&pbDyW?&WR٥HKVjC|]xQ%7}; ,`J\ j<ǘN34-r 2&3}xVFD#omD[ZJC>N}V';)ڇʣ~ǸOagBss'91#~6q> 86@hh ncXA9澢ZI> 9H NwtJA6 WrE -z~ps&XĝVGl҃(Bzb T\Iئ Gt8΍):31 թvHܜ>ZQ2])]yd_J,|0 w+bI˘*;xp rV}1[-:tﮖI۴#Ĉ5# 3Pqh~u2 ch:s$1zP ;(|~$!f] B+%u=KƳnn4/sܲ_> F8>opF Ω֯s,0.0=t?ҵ`MMJ$R1WS󺮖nFwB'&W_*y&0iK{y}c[G{nev $2sa]ɤ*l*U e\k|l KC7c9z8˱<ɤ<|"'T^gc <ջ43=owɪ?txrbP=KK}ms0:u-EwB>iܒ@Dy]sF5@SB68Bw? X׀f^7 x$9i!of.3lCFy.=`f֏b5:oݒ+'كIykwQt%s-: ?{iE3Q$~؀6,] ̂ )s $jtś"[w@ade 83>4(|]5n յghSz=Գ<̥?]VZ@GN19h0όP>ݛC}9B^2G7բ`rAW`BմQ x)#3j=upxT5= 8\'sO\ u8uQq]״+֫MR,  dD5IV>"^nЅsJ CgE66Ο\Oi83]^/ua)4 Or[n=l7C+N9Kuc3kJ]L @8} Y*f3х#x4Sj|; B:[$#xx&HAy~jA0 uq R  %fY]Svܤǫ%?277ݕ[hd"r"ΰhb2+pnDn+웤SU,i%%9W;pޭ o1--!L.wxl36aQ}c=_E{ sN$he)Q-?'J}*4N-+`SC8ʟrty$q z\/ -M-.‘K89~ odY037tK}qz{p!M27sE꼻AM}M΀-"\F$y(ϾE N&vԯ2^xJzUHTE@*aۑwƅ)za/jh.kDŽ f W*Tu_}thS7'Q%*@f&h>xlE#2+FO^m{5:O!-8$#2B9O{94Yrye2S[:f僊FWC]ܨfps%KH!D#kO-F+_`_+*GoQrOrPxogs9&:?]x㷉c ԃ#p>vJ#'53[_΍=:L+Wy%>ݪلX-jcӱWG2c7lN8"3o{G~F:3eN3 ߚ h]giCq[c= qH[m=G8* ^荗5fڪ%uVܵ.v=nKM-#F&߈R]z; 񶪳V5OLsydACFyEL='{}Qwc?zOȝ(I-}X“p >< ;үTR]ݟ.+xO$Q"E P'"pq>]Tpek@Nǰ`k @25|<I/$| BQ@plugins/imagemanager/js/_cache/im_createdir.gz000066600000001522150472426320015462 0ustar00UKo:+i2jy-E]cܹ356ͤCGyǤM5dEe*A+w|({ ߕIW{T(Ikt2eTHt w(τyVj)'J!$:4*Y^1a{{NF! - f_?߁YDȿVM& Ȗ*[usdp'=xfA}ٲLh|ud <&d\ID}/St7R:O&6IQZ'<ي\PeXOwZfkJeC(= 8y ;}C #Zj=|R^^͛2G ֕x!M:Hr)oBIDش4zP$ -ǒ̢ζJpB?|:wpl @@@ffĠ2A>lZΝ39um"a3ZgAl2tR #* \{ZpysnoS/ M!ȋh9طΉGrQ|~yM$$_:6~ \p5 .sdprS{YNU[!|d [4և衵`I̧'g9YAK0d;}\xl nfxOY3чopPIJm}g\s2\B{BRjRt_66ch?C 830EճMڒ,co6,L>zr|8)fhplugins/imagemanager/js/_cache/im_createdir.js000066600000003577150472426320015472 0ustar00(function($){window.CreateDirDialog={currentWin:$.WindowManager.find(window),init:function(){var t=this,args,cleanNames;args=$.extend({path:'{default}',visual_path:'/'},t.currentWin.getArgs());RPC.exec('im.getConfig',{path:args.path},function(data){var config=data.result,templates=[],tpl;if(!RPC.handleError({message:'Get config error',visual_path:t.visualPath,response:data})){cleanNames=config['filesystem.clean_names']=="true";$(config['filesystem.directory_templates'].split(/,/)).each(function(i,v){if(v){v=$.trim(v).split('=');templates.push({name: /([^\/]+)$/.exec(v[0])[0],value:v[1]||v[0]});}});if(config['filesystem.force_directory_template']=="true"){$('#template').html('');if(templates.length==1)$('#templaterow').hide();}if(templates.length==0)$('#templaterow').hide();tpl=$.templateFromScript('#template_template');$(templates).each(function(i,v){$('#template').append(tpl,v);});$('#content').show();$('#createin').html(args.visual_path);$('form').submit(function(){var tpl=$('#template').val(),name=$('#dirname').val();if(cleanNames)name=$.cleanName(name);if(!t.isDemo()){RPC.exec('im.createDirs',{path:args.path,name0:name,template0:tpl},function(data){var res=RPC.toArray(data.result),s=t.currentWin.getArgs();if(!RPC.handleError({message:'{#error.createdir_failed}',visual_path:args.visual_path,response:data})){if(s.oncreate){RPC.insertFile({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,path:res[0].file,progress_message:$.translate("{#message.insert}"),insert_filter:s.insert_filter,oninsert:function(o){s.oncreate(o);t.currentWin.close();}});}}});}return false;});$('#cancel').click(function(){t.currentWin.close();});}});},isDemo:function(){if(this.currentWin.getArgs().is_demo){$.WindowManager.info($.translate('{#error.demo}'));return true;}}};$(function(){CreateDirDialog.init();});})(jQuery);plugins/imagemanager/js/default.php000066600000000044150472426320013422 0ustar00plugins/imagemanager/js/mcfilemanager.js000066600000015613150472426320014425 0ustar00/** * $Id: mcfilemanager.js 584 2008-11-12 16:26:02Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function() { window.mcFileManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'file' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; idispatchEvent("onPreInit", array($type)); $config = $man->getConfig(); if ($package) { $compressor = new Moxiecode_JSCompressor(array( 'expires_offset' => 3600 * 24 * 10, 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'name' => $theme . "_" . $package )); require_once('../classes/Utils/ClientResources.php'); $resources = new Moxiecode_ClientResources(); // Load theme resources $resources->load('../pages/' . $theme . '/resources.xml'); // Load plugin resources $plugins = explode(',', $config["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); $files = $resources->getFiles($package); if ($resources->isDebugEnabled() || checkBool($config["general.debug"])) { header('Content-type: text/javascript'); $pagePath = dirname($_SERVER['SCRIPT_NAME']); echo "// Debug enabled, scripts will be loaded without compression\n"; echo "(function() {\n"; echo "var h = '';\n"; foreach ($files as $file) echo 'h += \'\';' . "\n"; echo "document.write(h);\n"; echo "})();\n"; } else { foreach ($files as $file) $compressor->addFile($file->getPath(), $file->isRemoveWhiteSpaceEnabled()); $compressor->compress($package); } die; } ?>plugins/imagemanager/default.php000066600000000044150472426320013006 0ustar00plugins/imagemanager/rpc/rpc.php000066600000006312150472426320012736 0ustar00decode($raw); // Parse prefix and method $chunks = explode('.', $input['method']); $type = $chunks[0]; $input['method'] = $chunks[1]; // Clean up type, only a-z stuff. $type = preg_replace("/[^a-z]/i", "", $type); if ($type == "") die('{"result":null,"id":null,"error":{"errstr":"No type set.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'); // Include Base and Core and Config. $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $config =& $man->getConfig(); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch onInit event if ($man->isAuthenticated()) { $man->dispatchEvent("onBeforeRPC", array($input['method'], $input['params'][0])); $result = new stdClass(); $result->result = $man->executeEvent("onRPC", array($input['method'], $input['params'][0])); $result->id = $input['id']; $result->error = null; $data = $json->encode($result); //header('Content-Length: ' . strlen($data)); die($data); } else die('{"result":{"login_url":"' . addslashes($config["authenticator.login_page"]) . '"},"id":null,"error":{"errstr":"Access denied by authenicator.","errfile":"","errline":null,"errcontext":"","level":"AUTH"}}'); ?>plugins/imagemanager/rpc/default.php000066600000000042150472426320013570 0ustar00plugins/imagemanager/rpc/index.php000066600000000042150472426320013253 0ustar00plugins/imagemanager/mime.types000066600000001612150472426320012670 0ustar00# # Mime types/Content Types for some common file extensions. (Apache style file format) # application/msword doc dot application/pdf pdf application/pgp-signature pgp application/postscript ps ai eps application/rtf rtf application/smil smi smil application/vnd.ms-excel xls xlb application/vnd.ms-powerpoint ppt pps pot application/zip zip application/x-java-archive jar application/x-javascript js application/x-shockwave-flash swf swfl audio/x-pn-realaudio ra rm ram audio/mpeg mpga mpega mp2 mp3 audio/x-wav wav image/bmp bmp image/gif gif image/jpeg jpeg jpg jpe image/png png image/svg+xml svg svgz image/tiff tiff tif text/html htm html xhtml text/rtf rtf video/mpeg mpeg mpg mpe video/quicktime qt mov video/x-flv flv video/vnd.rn-realvideo rv text/plain asc txt text diff log plugins/imagemanager/files/moreimages/mcith/Thumbs.db000066600000017000150472426320016760 0ustar00ࡱ>  Root Entryp Z1 Catalog-2/   !"#$%&'()*+,.V0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU  JFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ-=06t}Bʵ2V|NL|KpC@L?LbᏮ1l_4vors+CV5tBaF̣̯r}ARy\9KXl?HnkS̬mQx_Hnk ڨq)GIzKg`_ƴPktQOL+/ĀՍN§޿P%麆fU{{HAyKPb~yA\HI;8okRX:(q;5R{s?4c^~ͨ_9gW׃xOK32˦OB/"ʩ~![SmJgMޔ?<<ʭ}pېQUmoY(*z]EX(*F.>BǙUw?"}jϏ|_ufSeV6S2P?EmFVQxZխ5 [kf "$O09;3ſ']vM9$NMVc Ԋu]6FPfx fx ٞ->S=O??#/&hjП}v~П}v~ ?#/&hjП}v~П}v~ n45GqLo g3+藷M,-tDDr9ݙns{p,kPnSmI$mmk֠ԵHu]```[X{A42CD7B6-E9B9-4D02-B7A6-288B71AD28BA}6M  JFIF``C     C   DZ" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?O7o˷ǩg6Uk+>oU$c^K&ٷX?_K#TsH9Mo4T𗊝7EZy:}O?)S_)3̰oW]l_fi3~OSenG)VyJ~'G]udvEcsv'˷{~/O+U# ikB[?\зU>Ͻ]7}_lz'[ҡ_.X1ggsu@7uw>ib/S~ץ_Rrǚg58?|_K? V[?,w{̒|vzjimhv/5j^{[k,O?uvF딾H(-%үO6&m.x:̺e̪uXlJ 1}e]UM_NC`>O϶A=G,L/(՞-ʋJk rLv+5n'no%Z';V~ {--^O*n/hkU(by]=x\\#~_YiZƟ 5;Wn벇cs}c+ggq<3k]5ﻕj+6]kK٪'Y+K6d6~ːƮa_+%Mﯢ>jjVom?^?P^@Uݱ~z·, WM(R\8sA[;K8{/wfw|.݋*׸~W:]?_0ꪛ6}t6o,gѩ|ϟ_"tB5C;Zq(s0Y\չq#dF/7޴Q]SjZ=@ݳoxPu R;vUQEu G<ͨi6w\5R˗q4Q^ȝkK#>+'h$Hn+M+Eqq(3|st2DžT hWc#"HSpoEe ?mcith_dogleft.jpgplugins/imagemanager/files/moreimages/Thumbs.db000066600000021000150472426320015647 0ustar00ࡱ>  Root EntryMX1( Catalog-2/   !"#$%&'()*+,.b0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`a  JFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ-=06t}Bʵ2V|NL|KpC@L?LBށLbi[ȧdr@\_p~Ŀayc+Wd_>X:(q;?i=3L¼$Q$xVx)-tٷ` ;bº։}ŭH qOC/W¶F"~=FNOI}E~-uCqs*űDnN_U,n/ ] _)u%:߄L`cfo/?SD4?="7) 3K<ג4>.h|%~1Z͝Vʉ'VvXA8޼LsR.Us귙G_\ ;ǭgV((r|zɾlc3]+2xHk\Aї&0>xQ\k:F/Vc̩?Ϊq8~Hmyr >oeV)|z.4暭{y\9 >aV)|z.6x+̪σ?"k\ImN]6xMUKǍ_aڟާkS:hHQUm܅22o}RϙGUz..BǙGUZ7q<ʭnwO.Pض|{H+0**ꄏx+j7 ݎ.iMr\@1Qa$wf"xa9ٞ->uIɜaSS(p=)tr?+?k.ȍc̏OZcՐJ}k$0=jH}~F*O|-HB2={Pd"8$g?ΩID\c 5f@c?{:TJ dd 'c,F*>\J??ƚ]}+'iEg28NO>LS~P7 rJ?r:|N=7J;xaCbXcY9?Þkk<.4 U­@'^ _O#g:@^&d Zz͕>_Rw/w l%8@ G6;M[^1լʔn+%f%?O~qҽk#M]g+}B+kVvty3I?*nIndˡ'7C2 :٥;qۧ}/xoGx>2lо7Ae ΖdfpъN,m8/?,\Nx$Z;MSHԥo>#o8O56EUiBCWΟ,O:ĒpeQ-v6n\rBs$E4 {dSENEVO;bpqQ.+wVdw,9Ƹ/FՇ hp^#hlo?ŏxizl\7c^ ǿ>YՖ{l.1+K{U<и: k3i;o'w*y.qߏЮ?T#-M7O&o|Vv1BQ2}ט_뺄Pwh2]ƙ#1ro΢OR'Qjalu+[[s9ϒI U ;z}k6 ]3;{׾xCrj nmȓPA^:^2Iz;3)h|O"t,C(;Pc$z;9 ĭ1@:ϥ,X@f3oz|(Sp1aqXngDjlD4xf(NH'F;vD,QR>bŵq4Ew9wVhWF$gsi)]yOVH<2CRO\&BҾK/ q2a뻷A_nj)q#FIqҾխoK3@=UaLWiF1JwU l[6Y>u2FT.1ׯW ?3n-@dsqiqc;# $sEљ-ZG/QxEG I؈8n@>+:i%dk'/nm/R?2B-i0 kxQL dz֊+߻s=p>utٸg9r8$yDTe$@Hn +ϧl( %d?dogleft.jpgplugins/imagemanager/files/templates/readme.txt000066600000000134150472426320015747 0ustar00The contents of this directory is used as templates when creating documents and directories.plugins/imagemanager/files/templates/another_directory/index.htm000066600000000265150472426320021323 0ustar00 Index This is a default directory index page. plugins/imagemanager/files/templates/directory/images/gotmoxie.png000066600000001727150472426320021574 0ustar00PNG  IHDRX :OgAMAOX2tEXtSoftwareAdobe ImageReadyqe<ZPLTEMn+Srʣֺ댡ƁLTSIDATxڴs Qcxͷh4m&,{?$y^j1p6 zo`2Ulq[~+qSZ+߉F}eV9LZiJݶ#%uG *+׭+jb:1nn$޹>ݎ 5)1)u!oYUP76orzM6hyR./V01{7s먫Tp[u?Ul&nj88N|W1{y#] 5Ѿ_p(hpzeerIDd|]8TLU G-c#醒O+b5~nAmE_'y#ϛe؍Olu%wiI+O[Ԥm?:ЉlT:`t NB-麏T.@-bun73Va -}vHy!pUHRW7D`:# ՕJj&?p:y i=W˹%M2Im%Gc|=LߏB6fAVH|8M%2YN?~.o! ^m6/ŨSm4IrS맰rá603 ~rsVlU6 /A--^` Q+ώ/.bgqa%`J?i~eIENDB`plugins/imagemanager/files/templates/directory/index.htm000066600000000265150472426320017603 0ustar00 Index This is a default directory index page. plugins/imagemanager/files/templates/another_document.htm000066600000000310150472426320020015 0ustar00 ${title}

        ${title}

        This is another document template. plugins/imagemanager/files/templates/document.htm000066600000000302150472426320016276 0ustar00 ${title}

        ${title}

        This is a document template. plugins/imagemanager/files/1.jpg000066600000376366150472426320012644 0ustar00JFIFddDuckyPAdobed      I  !1AQa"q2#BRbr3$4t5񂒲Cs%u67ScTv DUVWdE !1AQaq"2BR#3brS$4Cc ?5"PMNT,{xuL@|OW=ଅ$lZ|&;)KjDӟ1OF#Mel) mNzdV?ņ,hZOƏ0}f{Y0Lx-P8~BF҄M)iMt y-tŒ< Vt+Sg,\BT>(f~irs™_ti 6k525?mCQ{}$m BYF ĊQq )|bHFZJ2" kR!EH Ҏ<$%D1 ͤ:bz&1Q3FSPP5ƅ=*Қ VT{ڃn8ʐhWx],e[nV#.(%J )6팄tFJj6Һ G1Y{u`M@1`niT yqèZrJd8pxA IQ<< eU4L$V&*$ԭ\8>xAEpk#r8dYNS>uç 6 M9\$I#$8rS)#% CJÝ0K5MNbxD€# + =fW D-*A̤©b$˄PqɈ< $@Qt3nIβjب*FӝGRW<$AӝsÄBHu"DBGp:ygQ &I4qvH GaJ Ӗu9<;EDrM|ʸqlJ&j r3INC'pA"HҤ.$RHdOVg/qHDIs?Ň!1.W5Pq# 8}@yûr]".n PTtᓜ58儘5"5̧lZ^pLT (4fw~ksK$H5\?"Je%%CFΧ ND@9Nx@bR '0 '*$dW,#q|̀ΔS<3$H0@e#O~I(r1*b%?DMGa괂sƘ"UZ vJTӒ_KTU*>lD fdoI# b#OG$*kS[)> 1WX :qm}Q&; &Ǝw }sRҺj2B9QsңC\'!Dp浶T8RѩpfЭH8@Q< yb2r}uPHvDi> {'Z.C(4m]idggT|娸iUGPy6yH ( m⾣`i>8$^ݤpT)W:8RGȲ= JFe_,RdN rLԴZQJyc4S›8̲6j"T2%f,W ]8:uc$i>` $S-2 x:k 2l9U*>~5&lB!rˋ!5A F;Icn3-mASj.SKn`n[]u1IW´x(ILd\^#:p@wk ’iUJ+:uX Q I~8Яqb&*).]RQ2:uєǎ9NWLGAIpY:vK7P <1p- ]@EG' 2:oRT+OJa"ȐC5j)1PE'>8p $SAJP*28I:`јVAY)&EE!$ZX!R˵R?V,]U92v[ TŚ Iniy%d}"| ZN(;,H(|jycsk!Xꂸ)I!#0+: .~(EEtAAI7Ԟ#: UR|H5Qa%”}Y?fuϥ9)H?kVd8ETCϩj9N5t#^?z%^;Vp]@ _y1efJK9hZ}+s$R?X :ztv[ZNd}I2]INT2,E3M劌8S\1,h)N)48'eXt6ң:R_T@fD-*|ʫe6EWC槣Ԥ \qLe|hK7l1D!ձ'9ӨVbf ~(7q0ds JqlҨQi#?b7 2Lil7Iu W~;̍qQ\ .+HE 'lt:a\6JRHtgGՄ))X!Ti*FLjXZҬ:a3' I'_* 1 )hih 劤J@e&I־HʕNyQM>b)(WgQ z(()W"Tt(ZX0U]I#XRsģ9m.qp,=K? %GXnZ\[dW,ybwV8(6<ɞM"HxNXRwk(T(djxcGb%b $8 JzsLvU-pB+5e H V|S Q&Ct"+,t-:U= `-#(uz[z PAM-Tzّ,pp] wYtp? VNjgn%A?.!CEx _#ՈH(v㮥HlzU\Ńr٧e 2&*B*)3܉T̠[*!M/`,9p(IEzhu#<1,%v#F5."b Zqu(nM5$0SH`IH 8$T4\;IБZ(e rRPeIpT 8=+m(W.q03VIʛJL'/P$J$&\ONTT%UTIʃ%(F}I Fi+>Y'I  8drE?x|~XwJE"uSM(4BLA5 ^E)-GH92WO#9zMu>?<:<$xKA^uTiNCe&j+ψ4nPPOP0I"># @B~*$v\?|8RuP]G?,"Rįu:G $,9<䨓Hp^ Ҧ|X$K'"TbO1 : (hG. ygZq,rO|RP"M)BU#,7U)%#ʼ0*q|\V!Fg2.*mܢ$P8 Wo]j["B^`N<,b˪UV %%wـ|f;ve]2TN9SYw*:ʔA8M<PZh26Xu $gB8\uuߦ띶NJv^hxS%Tv%D|.ZSKH!UbY (18PupJiDrȩF> ^rW9@D Yb&۝kF|VqZhjGp"^!-0ߊjHqI#!l$\djXL%gJE@|1n@-m,24gY҂:drV0fy \ d8"Jp7yIimhOQQ@E9^se:"fJ <) Z+ `2q7N"Ƀѹi1$ ˤCRuruTPu%1#753 7 &85D8M+ \*pLδEzY[ J75ū̚A? lm5lD[I6{Y"IZNևK.(C ejD*j<hZ% yvm9.'9sG=܆M"ْHIOÝ:ݽ1{>Q߮j*Q჆!"@Eʧ,:H֤Ӈ: Dya~*H+NM4‘椗 HRr H'21['2ɮh+.U2enm5LxVYq14h@BHSƸ20ZPRxĤyh<}'u/gEn23Uj<dž%܉JT@} `b:fn6@ [ dqMU:VP̤V,ɺRP?sBR@uEG-|A9E }Ր:O??*q_gCC`$.TUSzkB#buIiŊf jրeL -q8D M8ә$,B:2ۓۭg>C c,rQ.r+KIӑ!HBN0MTYӏ`(RZ8 5S pNd,i9V|)HIT +,?4Yi<>8tRAT9/dpHB<\>i!rPМFZJy5|8A>i4xT)Jˁr8lW$ZJ9JiU*~2 j 2x爙bTB|ԈuβudFx ٗ5Nǟ2^+Dy NjS ҘP4~;^ FUx@]u#3̎pӪM ~ŀ_ úC4)L4O!d'kJJxPb#jf/i-ܛmtuu8NfpZ#m|q7QB q]ZjNNF/FqUhiU'Ƙ.ƒn&1A;Si Jr6@ P Sq^-PC4 sÍ=:_xv~!n1ĦJR*):⨻ dVp.3'qҝ%BW.̸4!N*ԜXVdWGj5%[]r7[CQ~6TJ<iX-d6E N_n0%anj/v{%4Hk2VRcV׸HeR5(QȀZ!'|0?', اˍ1Y*@/E+¸gR4tuIJT348m gȧ^|qI(#iUt)`eGK)" ɓH: TI T, U ymY68B5YSQ^: TAgrAuUCwa:̣B5RqL Vtڶȥh"; I]+Q76+oY%hTm>|du v4E{C4G-|h9<%t+m ԥ<1eaʪ  [~?`d1E@]ԴJO, 3)`8 m+ HMNKI+SN/w hpE{bPoG Q~n!+8 IJvꠗݔQe3Y?%o܍Zx(Y%N;Kp!! Kt+zw\ZJi 4*5hԝBzI,>Z5llD@!zE4+^$H9זx3oS޳Usu9]D$qQMB1`7%2'tEEF rIq RdrԓZ}4̏#@NBx|)R`X>yIJ4)tU>XN .2!75#~~8sA{nd OU)gqYnS <H9sN (MFn2uꬒd*|ct}`!;q}kqS"J7{oxrdIsB@5pT@9Rl:$QI$+N0 QPF~Y$&VJa2)# Jθtn)%+ M5T$":R՗?'%'R>HTt$Ԭ(s4ts\-E:i "Ԁu檍*hk\1IDVL)R 98\eÕh QN5OĦ?5.hEx!|~B eP̞&$:f]@:fJ6Pr!&dajQ T3ZAkg_[vd6Tڊd$V--*"ֻU,zv?Qr]nƈ,Z!iN0nVVZMp1uȍUpڊvtEۇUHHSiJB:jA@ 1`17"jZ NX:΂+y ]d5$*92^82=BM}<[+ڼRt\0=+yjnl$ C0$KE@)Aj6 5ybeK@B(ʜ1D@"hH(RHAqSxNtFIkL%P :r!L 2n9JW pECqW̡ؔ4>^\df [x8J\et"E1HBU1 3$دfFT3O )]tT$9SQ5c%mÏi3hGJIU5cYmR'm%jʄ1ƒγ`rEP7i-J(<+'@ux^ҐIetM)pC6.\]$d:`F-=h$PfxgRXai9ZKhnJ!ef /` l_.-[5I"2.ӀBLU9HRZ9f8׈SUL@ h),TYP$:/B+:G9#xZEkJp>xgRp$׍|lH&~#L:I2GQ< =T5Q?Νt4RA591&tPX$J *R<xt@Z .'Ԑ 4˖$\΃'$ÙbI/ P#<O h3K)vS0zc^P)'W+(}<'x$U+aD%Ң: UJ% A!FO-dbibB94)'\O2wF*{hg== ƃۍ4uW3c6mh+ ^e 31'l׾B] c !YU!UWs oo Ѝ1 (0fY}+҄n.IQ2#IM|qld%Iti.(NM8Rst2!isSu(")PxjˆG Sh|ڒJR(9bfN"jOr%tI-9x NS%$SWVQP%#&$]c k`Ur]-Ʒ4,x'yH! q4a I4c{o-AsI.RH $8C1B/Y Tg3LӤ:P(4k\,ߔ梠92Vr ^@YHXRfVt|1-*RДG c+TX%' bpVC!Hx;jV&D9]&UNJ I ZUUx<]|U3PZJe ˎ !$P#1> !6դUJ#%sԪI+ăߊAK·,s8vL1 8FI) gxL$FjҊ' ,^YT:LA$*,":I&:F@9pNK+ r:D/ P:iȒ D2LI'H儖IEuH@RLMk @u@:JA ? rWFYk Y鄂)\ϝ1u٢q%prp M} *F*]Qn U)) ̡+]܃h_@iƼ}dB{Q ZP~6(-tJӍ9VjQWQ*:e8 /Ju$]M<"Kj-hBE( >d嗒iI'I; Sm R4z ]gv ^fGX+p4 ?QMHRia9<RTb!ϐ$:n"-fKԄʪxW;)~ TuQuS"}s;l! O%RRm f1uh=jDe*aG1eBBC W;MԲ2 æI^3$W(x׎$I)@fO'IkH @ !8INZ@_%IIHx $'pL\1:Hq)IT猝@3GrزG0a!H")\qۛIVtkg i"6Z,́Oo!:ε6D慿e;znQs ,t+ 7`p#EiE`"dʂzW%x>8s%YDiJ ?SƜ|!ZDg- H9 ߇<:]oh~x'Tm甕ЧI&?p*"mL%)11UP55tW $V<&)d.S?q (J,BNfӗ.B^7P@¸y?jt`eἑ,%U@^%Lg}`JA!A#W/-ARsӒ})yOyb(/M +A_ rcoĶ MH1-!4SXϘRv^ST!"iRU@~8glX"f*n s\1N n"/j5,$N$TNYe&*=ѭ@ 10pPY S%L'9yb(aT#I)QZW,1K5G"' xt p%?I6P(OMR">xpR*"me`-]@w.pA8ӈREĴ=:ΛȦVi\ml59,z:*T6QtYPv+萅 jN >! K!hQq\!L1HQSnЄ/-%jJS? L2'qq ]U)92#F)[`KJRr~9$ǂTy$%-kuT B2vLFx cıXRMN[1Ԅh31A'`đJ|ԜG$SD O6leIK },P 6=^t". ᐜH^Ԟ<x>X%í ds,Z5 ,b)8&4||Mi T%Fy|\WZd(PHuk #$ #|"VWIEN쌮V丢*a(lN ;-ldGu?rbw@s2ovwayG |<ʎ8.y&#%/Ε҇'RcaDv~wo+Ƣ wJh(1hZ،=&VdɢY[f[>ZB>NƁTBȎ>*2[&΃pKP* @>Y8zX,Q(K(zv:򝈨VIJUS*>9୿䛪&љQ~)Lfcߥ ۶Jq̲j a 4ާm}Bu*7۞C! ?p2~X鶿煐#ڸ5Sld9ܹ~!MiPD:5Wۭ/Lǧ?mdD-݊y ۍ)fKIHƴf%u:gYizj 43ĝGBJqG ԅEqRs!%LV`9fR{W?'%,#4#Rm ʍl++'0, HJ$"JKsSqŀE\=^GL %co)+\N2((kQ!2㎚CbPvph4KȑyL U1esHx#%e9)k_I +YI.eSb6*`Hp"-twD$#̲&mq2hU$4YeڥW:nctҡyxZ(Cv+Uom^)x㞺FL!T]ų"3NҕjT9Waa%lr<+0֒T+ 8klO ,stH5ώ' 8$'NDpDKi3~-'%5DLU!oqdT۪V1zf0@wWxR#2WY8Şȏݚӫtv>N+ϘE1[K Um|Rh"<HJ#TÄ 'ƒ<;(.*iHiMj(/P@'ͤ2Z)L(Y@כrVgOIF C[HT>TSD|H}an=tͺ i䯅y^ %oO#Ȋ&LucV;,dWfѩ:H"k.5ILrp%%//׉{sQ]w uQ@}.-I@PΙyPa/[zs9XIqI@JUSNØL&F+;:TCx|1!D\4 JME"֮Tx KMX. &,Ȯ&"'hጀVd T|x`-꺃֏O黍jeޅt6KiRDIJ )G @+~%_!x=+zG"g^mlUjopͳoMNi*~KG?K Ҝr{ۙJDw;>4@ X|ۓJճ7WuK*R.Leo狫G,wH[xwf5ITksRH-MK&?`0tMwmfKpFoNuqqNI*iȏ,x:+c[e-dvYGf;w(X{p)= k p q5AB#\]߁X'~ SnHT9փW&II0-ํi2\9`#R S4<RS '_m$ҬQ!u Iq#1B00HV_ocH>/WQ]QV$&FB1.l%c^M>Xw3y.#R e8!COc[jBEk2,@[_OjD7L$эh':\M[&,%Hq#ƺy<̫P>~4YqƔ%Yҹݘ"Y^+$NBEMuB1 )ْ:rzS@Þ+ҟRj T1ҜɓE݇y22n_E&H+~Sl!"[J@d6J#mſm.JtyQJ犑)2FXL::Hd):X̟,$˂kZL H gp&n6 rt5yg@PRl*]P! \-ͺ|L&ʩe|\Uj7Ѩ*;tle%R PxoLpX[B\$0 BH8X'Ʋe8O1%2ˊR 8]IiBjRC册B.dK@y|0L9)*+)$5&aJI8S@(*0%0 B(G#ޢΒ֭ Rf80 R)7l* PT֔bJ%4Vu,&t-CJHTpĥܨO<0M T0;.#ĝӌ QGW*a ` ,)ei'sF < uƲ0[ P-:=B K܋hr`-\4RO!%[m~NiWLQO2 (Bs+50ϒIվP peKe JQ dX#,ZA ()0\*5?,(<isq-CfYn-3!nTxUbzn2.):rvUvx[6`D@'O{D/Cm^k>$]n맧n;k?RC1Jr}nSG2GvtmFO+Nl/ش[cۊkT+豫#OU LfHDUm86=R"ఴDPIs!a48wR6cEί:{r#+TjjI9Zf ' 7ic}-Zmhm̏eŕkMuRU¨EqH1'Qnr@(2 ?%&hs SE}9 y }<[HḍkD(DeS~,D=@TQ9r@>Jq.B W2 ,Ò wo)ŦՀt5Lnw:Dx*;pXxzv ["YWKO?-KG2DHwe7#lK헻d4Hfڝo?$~#vxm{E Bw俾QOwXXKN[d$~[#uwūHpTulwg7VƒU!N:2TI5ׯίa FsF]?9c~4tuuBc~_`d> ~?A27[QLG)@U.2:o _iܶ+=#62ܷ7a5pr$gyE(ZT)'):bs۽iQz8DpIlZŌ$HUo5MYba i7zuWFw3KmTl,Bw=VLϩqrkf7R)YjRjSw].jj%T:4ͩr;C6۔*swq}1d&J[S) :<H;+rr 흠`KƢlQ$^qn3sN;(=N;P'cUh{~[_7,稖S͓DjCi:|ًN2sD%Tgt*Ury˓M%8‘FԔΔ@G5 nީP.W=ͿHec CT#9:J[ϚHLq| G- $t㎛)49ӍF ,]ATYkD*cND1C"8%jzg`8KT|1PQ.zLRb2BR>8*`0F LڶVr,5b+FܝooPaJ +M }_ S 'N[bD,H>BPZɐFjr\"[ɌG$%,I]:e#8g#TQnyɿEȪ%<(\54V`>5%MFv_q_ٺljyTj@ qܓPJZQ ]{-pH효e?Qn_َkvmC*TDR@ *ʘ +6%I\З@d͵؟R Ҥƞr`;g.[K#Ci>@p#6)Żo k+*REgY^!mi@ʇJx"6UAԒPW-jG'j: kRy\*>QlC*תPH.6DXPgA R 9W# ,p^܃PjqZy'JO^C߼9H")yHdPMs\nw mL“Єq債),()$Vd_?suY&F"R9W' BLPʜ b (wTJzj< ړBJBJÒDbkDTҔs+"Ee:谓T)*""-(~G">8q']5㊚{{R Pjy⍶c;(3p$4bUI6lԪtåժz ~~4^ nZJ5ƙjA8pjj$#^AN("JqH')Y]cUw̄)D}.sٵ9}1oUj"]hH Gnc~O-SLt7@p@oˍoeَqFPR8wn$1zMcNc9/1nB壸}r=~^rC?|iϢ(™coiyKmP`}a?-CɲSG E?jŗOďGq2ʭ6Q wG#ё*~C Bm7OÊvb-*乹u:0,0Ԫ%3KB9WIsl[ "=_@ QU+Q' f0ԥhWaI|UqR%e-j>X?`t558 ¼+jXJtIʸ_ԬoJT-6Ay`)Mb%E*>xZ>J=4kKK ׾&!֖sI)O"0.=HI ૽ gmdlNad>۲$D 1~?/3k0KwsF-\xVD38B=AI)g1SiRNC0U5]UK}ޖظX\X t.jPKq)Ck*RTN<1ex e Tqܼ8X-gJvZ\9XmIBЅ:RJ1}q2Yl^ݏ36~ON[Fp2뇂!ƂRJ8ٛE82tW'2{wq.v W-Cjg*TT~#i(fkan,Ž[};< oqunOIvt]w=r}hvBZtuYP{eY{ubF){ w~M:!ń닅.$D%oZ԰\C[-.+s\D֏!Nܵ{Z)NjO=4YTԄƝYLbO]7d밦d%aĔ"+G oCq#B;S!ך-lq8ڊ\*S C$jy#"ʩ. (hIU$AeeA8*8%˚3V Z$@+zޠ' &:ׯBZ7}!?qDSftGmyHG 0Hֈ+WhYh)&5ۋꡎ+Ii j VWIPebE* Ie6(~XRLr PWfҜ)b9w @u! re']PdMp`@5X ((IqjR5\jP(G [0@fz4`YS`t!**zZ]rŠ,Uy{Y- C4.2VNF߭%MY5C+ WzW^+\LbӤd7BT *$%\2n{8,\.?K3HB'1ȫ́ -M굏vGX]Shl+ O0A#]n X~öM 풲R۝-erM4 ϟcYpy,+KjAn'2C;} 6ҕP +NE8cKqM8w-*@i WbZ+PiG|HPku OmoJX (Ƙh6.P˄iWL Jx £F=kX:"m{k*J@}TYr3nU$p]~cٍho)GH\)Ar!ǮT+&倍x ['?jv11ԆBܔu PRǒp-J dDDZ*r)\#i\|될xj|anu'WmRPᛤ(a8'˳[,#V Y86XŔu+[j 鳏SQ8VɁ`WƵƚaǝu(TBxPb0<"SjxDȦ9#/K J~kb <y k\-:=X(JfμU}+ &fD^Lj̴zi@CeG<0TH&;R %w Ur-5Pf=* q0C˜19)*PP 2JD^^`^*D89e>hGx مĚfSZBG B()./ }`p S]RG+:˺ b(H` Pcq>VVW.TJIs,mHGA+U!IS&J S B`-Ĝ ~CPU<!Y|:Y܄? hFJ5n* YY6+Dt!!4WЭ֔Z-%o֟ eYuDأ^tҰ9g+MgpA HʦFw.3 n@|-ԕU5;cQBTAxP;ʽX t%Hs}ZV +qwنTt7y.=EBqU$}ī %l[SuBKA ҧP$H84TЦח3'刹MEG]C/4N9i⣟$Eu,4$,2b2Z_w}8%Aҵ&}RWF8γx򮗧cX'2W\ɏ"3덢49 1VkVY #=?ciaipd,[O0)@#ҟ8 d.ͅnDgǒ7}w*lB,'%8+TU$!4S.fMA9,nyb`CWx J2f{ - j$Q TsxK%'=@f}^8II-"?å*փ㈤u: @ϑLFA”R2RCIJЏbcDlJTVj݂ 7 a%@P$ uvDpo&9( ~ e⮅)Lq)Ri?iRy 6v#%-J!(SsFfX:܋|W~yHWgh( ?hPafb2^KN!ƀ5KK ̫w^ܴ`]H2=>-/%5OM&:Yf:Rrq$ SꓘCеnĈ/ =J^aP_~)/|?U,;Somz6K[0IUGb(+v^g-CI/تe$^q `ʕ|>xδ@dG m=™^L/F\Fp8Ϳvó{VߦZ~0,ٸ3o\z ) :}HKd0?;ΈVCc"UTVI ~ 2(S~B6URVP 'M*h9qMZ3/YιUAgzKBѸ&AqHmNe;ޗLb o1s }/A j;dݵ-% HJ>YS4?V,{Z/7dY.RM9T4b[L8'3_`{ۃb}F~]L ~*sb[ \LuWqo"Xc[ Ox_9绖M(ypɗT56iwqoߐic+>6}3}떓CyM8s 8ſc(V7KNeamOivٶPlS)iUh 8XI ےk\@1/D!)Vc:*W!-4 D9G$˥_.$S % ֪Irr+W*c2p:ǨPM' /ϸү*5<;L8I-RRCr+zVο2,㿷,L{.JWs\,% ; D#"T@ W cbb]MQs3+7o~en=ɋFƼGB\(AU_b11jv7λƴLi3mwXgGZ-0q:!RtZ Yl͈<!hmJj4h6tSQuTQ$+e_w6)R6xvg?0gꕕ(%bXx"\vʯ.oHŹQ.#ܣI/2J4@$)^XۉZNoȞk* 3ՐUHZP,u%c(DqZ$Ic"8)V^ J4 qYvSlR(pc2:>dI!9pPbH9 {J i4|h2$i= u#^ZԧTc+pX欄qh[Z!4AI?XP'd@n*P%UHF&>BR޴)PTi#\*FeE&Q*eZjX'Ɉk&]!w-8!"@ |)On 鰅%CS0A9Cn!$A7WW48`#(8Kw--a %'IDH -ԔhԚQ@[afcV,?+\J{W5LٍESk_ nZ[v:c)Nt, 'H\hJXL}n-fIk;rO`E{fVyhRcf Y*QݴFr[n7.F; m:[OA(RBMTk^ .QGjfɑ$62nAkRI $݉ggQZ.v)ح.,d/}jZK%cI(R* <1nhqے뒝vfڷpC2rAABڔ$a\{Q3LVM״-nAܗ!"$T]m 4J=6uI>xϰylf$mLD~վZYXi [VM'KIP9d),ۿ*@ptbt )Ys><1bu|ZC- 9bɐҭMċ2chk\{,ӒFd:Rqg:Qb[5DW^^8ˌSe"T pLB@G" +h[AۋЭNH.,OЊ,Rx2|􁂯6eiIJ']4ˏBdTfXk\նڌeӻszcDAN\뚆.c毺;{#A4!)H]PiU2`T'U؎gr#ZBd.dWP43/k*R6Prڙb1*I帬[ M6&/aļЗu[jS|՞X pnlٶ?_X/#۞jE%@%zΧ!Hʼ}\y6|mKJRP=Y52ajrⅣ%Q)RSPJ?0SjQhR|rTE I#(1M IsP՚ӣzm)5X#xwLS11Z^`L͠ WNGJZOҴj'CB9YWLA & X*%2Plז:Fi KTG%Sq)Z*OScm2Y{ݿOoI~KV. $%:&=cm+."mTo JI<=EZMRHsǘ_\kQf]ο4?`'Ѯ* :N6G-5Q0Q,pEW>籴{mDe2\  K'JXQ}@։cuIor;~B{\8ԗTGI3P5Q'2ȍ,Ѥܭ7=Ƕn-Oۭ&v:}uR+uhب2vm(ɸt'Wojm0ebFpjoRN/R0gAˢD =F@'[o%{խoEMGm:D" a-n,A%? ܍q&ûϞi=3 Ňp[Brt )B BÙqm^d 'slYy Ӊ׾K l1Tُʛ :HӨ 3+'qW%]h4u CKu@RxSèAN?,:CQU'M4N3#K `M:U$ȂYv}/t% ҉-ƤBI\fx,,3Pd21j iTcy֨:v^w{ #)ڙT)oSL|X> r{uŁhw[?vO̡ebjv<$4T} ZHVJ!VJ2[۴o֍NAc:Z[zI#PI<0PH9ħl}Bsw= s .Br-xDQ`WON `NMl.*H_81LN\pӴ'Erq@֊1ADqFr?Z&jonGɪI-HQ8|߆B%.g!_?%hCL=*@\*9kR}f 21ॊL8S&b-u8yWҹ8+,T]k.8N-UHLBb,u GȀp TBu52I# '*ZA$Ce1?l~p]J~.}: Ȥ\OGJrWpJ=ZW.dθ[騪8I%~,!I_JCHpNXI ƴK Q朧  iLQTzsc' ta􆡙l"S4KM^(̜gݹ9+\g]͹ۨnphIیrԉ-1L.*+P)PsY`ypWB_=ESni&3#~#O;K7 ˝=Ct I\>r^d9ݻPmܟtJJڔ֥R4rJ@Kk(!]ʽzX8f-[FPIО#+b%ҤIWuBeۙcЇh, R݅uwmqβDḣ)DT-ZL+Z]s4 Żm1s'?DJòljo}v_Ť"*jX}3 CͲ^摤R+4t(bw +m1LFg}z]>d%k%R[mQ !gBGsY 1Kn6͜#>hiP(Řu2B#Jʘ  /%6QM6Oۋ-ٶj%e CP }ս]Jө$(-tωF=4Y?Bn*P!6C{rrl-|[[q,-0oB9'|n t׬XoXg-nL6ODGQlzt%@SQ\]レ},ulBdS44P'OGVef{aL~,>Sē¿ lĜRYXE  j#mkQ3o<:BXva- DF\iAJIiA!δɑ$~ӓC-,XJPWF2@fQtԤKs:-sƈӎJGUз {zR_j/rP[%E*yPDe][s).;n9gkqWO!܇r,c[6]L!I-$VH2)㇗^9W/cܛ鋤#)b I.)BR WJ?o]5Z;"̆Bw VxK6TM+U1V[Q}VD>u̒Ћ~ǸrIY)_Hm*:]2i ۊ`:oXBKa + ͤG=$U?U?%%v\$‡21p5SkQPք.FO_YQ'[=n",% >k!)YlSݜP1:c}/̬9{rNJVR)@j# >c^zHc9O0ZIK:gdE:1Q@C(egrt~2xbq JXo6Օٖ덱kQu`ATjK.Trnz3-WL^5~t{}Z *Uk/#V^$}A߿4ͿCmm=qX,1V>_[Z*L%.Zݙ!(5JKkrÛ,Omʁz;ݽiL&QSQl!h*ȷ^nU|opnF'egG}F}>tBǬKlx7;r9`SCY(WB_5N.S?*r*N*K7|u(ሚՃq0xrQSazGlMې u 5?  $:\ |q( f胂ww@Y<-eQ'tLmI^᷉P;'c -nhpOlŕݞ*Z6eiqԊq1L[%+Q 9%U4iԢ V 6:Z%ֺ||26@n&g {yf򮏬IB (4DVs#h21 X;nZa={[[Y >KX" fOaQtD68sm }MjnR RpXl'I9QrMX,elAH^ $oK#;0չdUj2&npd] H V۸ T[CUOR֣@4 3Qb,4ۊp*mjx9ҸX9*8-Qnޓ2,[n㼦1ˢSIUBV&uO(8dʺ_Fc>ܺi,"JA$ha޳LYZwvȂ[ݟmth#JJ̥ ,t]8ʼl:gM^,2Lv z]\ɾ P]g!ĸ!d !*l}+Zm,[ƐFjqj?D&0 ϶3(\M u*vl䴧݈5: JÿjJƔhGT7a`9,Ħ%D%UbNNT<2`1Dv T'Pf~-wYlW#^nnجpǏ tCv8Zˮm' ,zݎ ZL8GCCЏ*{oGbv}+iRV陹n5zD$zG2.a*ٱl;%=H *SR|NH2!8ᚼoowV+SܚA*^@pVѰΩ`o/[d$n~Jt."9[#lF5É!,aO#p'9F4 8교8S( !mu%E`Tg3Y3/`V &//ӭ@ 8$ (YRIe@{L G̋(bimBԯ 7=\GUąք$UN) 3[t5HRTe 3> #T)O,1,7P=]9`YN0 oÖhr VwX g,-䖔e\x'qQ5HfITt` E@<#|q&EPR,~ͩMQJAp‰:[Wo<Zc.ܳztf5I<:D`DR~^,kbmleB%6-&KN, ǔuFf`\zx1\2+~5\$|ty)D 뢒qmdsZd:uG,L3qƨRMQB45bN%)5PRA~&)rEiˁ4ÒE*!4Ja9N z A*DUtyuÎ%9q qŶeGL'E+^uV8]Vej{rvT]i ;% @[HeI+)UV$l5z}AxGnflKͻ3&n[N)[-jaR֑UO1M '|E>]:^޺]^~ߏG&z:iiu! u:H҂daɖ T] ǷY[{p1c[ g3-97ZIy*:k5C<r?Ln ,ێ%Pu8gcNyqKM^mF2r+_6cwٿ-~gjn=d%UO0~+bL)[7fI>Qcnͱ(Z\V!\RʙFNW4NUR 5jpҞ28*#p\];upIrpEylKwzdwթu:: VJ!M2>6H#v 7&@[665z֩ %ۣ[ҵUYWQӃU괳_!?ދ nVjKr;a_vUu)B?h>GU70yAWnvUD@j{T!40ڛ%µuăUQJtTcY `#}_@W+=J>TŴW'JjDZ-čH ,& 扅?Dz dt۩(ުAJIT1L?̉=Fq m*r2&eETblwtN۸&qeBێ}}>W)[2aҢ޷eωBGTu R7Qndz#J447wB7k'VU2ߏ@n[nS Ϟ[&~ AUQLy`XJ A%I(ҁPxBZ$u,~SE>ܫ;W(ТܕxzGR}4^䀬jFطnۚA{J WA PH7I3wޜMIM~:18c;-R lnN׸QtӦ # E78Tn۹4->%E aT2!GTe:Ghvl`}asHſ8AT@>j:_o&%-QL^BK>Y)TRaA>W)?<7-#}}w帙!*Gȍ ~qht~] z:PB}U;hw_h$׵!\J-,j2uVCQ/| D]|!j Mi"'rzEtqb`*eN3 jC">8*c :9W) Z\3(" f!)JhU1lajbTcړE%< .<1?#Y/cԇS)i:F pFr!)A[Q UP M'IQKnŠ!IQt%XrLqX~7D.+־4F.3!kqUHB+'CwɋM nl>dfZ&4Z[+iBTP ro5D:ؖVW7S׷vz6ˌf-S*iW̚|2Z#mpTᘴ@Y[&re8iVGh>\ZmjMi RTA\oVe&~?nloŀZQ{0t&zNZTPMc! |[KL%(^qv4}LXw॥"JjUQ@+vRÊy+NdLaSc+zj9SFjX&CrӍ! p$Riqy8q\Y9Rːs(qS):E\,%F@UsҁUulFdOP^أw", q-(D Tcj8r1 ɿm{i~gUٺuo(UR)f!DW[i?.m;}^u?#[v;JB 8A2nwyH=e4DvlLܲܒꥲ'[20fTտo۰,%Pيy!&}J"FP"]ݛ@fdr[G'KIDv5ԥqF9"kjl53vL7)R`4KQ7<2mW֛hm+lDDI :R<3wE &WYȄӟ'9"Z@U Yq0( |l([#zT>ɗ, G|Ds}V%kP:@QJV0K$3 G ʧ,sJ'& w˳nv5lw^\WLQ*}M^#v⹎@YAvقwou^vj<*H" %dǦإ"vPSہL-*L0Ru'M*N+$z УyYԥbEV]2Ri5p802boBi~_k5GRR[z*j[LiSi,8IZ~m;{ݖѶvǷ9i+q̹8ԥ1,֊YX~q]% 'V <+dRn[mۤ鶕IChMxTiL8ſ:kϏq㒿k%-'oWS}둶Av%(~Ͳac! >D[ޢ#˰i~'Q ̖ZCqR[~,;#*2R$W-]jd-xvM;;lw-lqn,)Kq)h&<=zyݿZJEGtƪ'.n!;7i6 +cMq(#^$"7V&2]/h[rwmYv[]N=[nMӎ P ylP p{ݎr}(SBÍҲ4cF͠. F/B PRF@g/Ӏpd%4ITe 8/šaU#Gp\Ҋ f&Jm>ԥ$aR'J -G$$ׁqe"CN4&yXHɆ)uII(և *~JX+,'޾n~\83T!0iAB%KXL"+śЋU}iYo[I Y_C\=oJքGwZ kХ)[3)Hɸ)դx#K ϼ~3ۻgsmRnK\=$Flu:qRܘwtY7T={[fޑuomcMi3 AX)[(@ETV6+2Lf'>[}L/k^v;R&A3q\d&6)t#HΊ>uۧ['s]msm/V}lߏ-o5)32M%VE*ŶB&6=-NU uݽθn}6rcv)&-7'D 6X'X W;mZL_Bi:_׎w's=P1VqoBgQ pT*Db%V~.H;b7%80A |J8|wCl2'Jp@Y7LIq *JRQQ”ݨJ` 'nXq0dmGCOukI H# B%U)bYIJWtNtmTʹuы>ICQLgl$JL/ ;=k 37F %burMGOC%ĵ'}ISz2* W冗QDb9TLܓgK$%n 䓈AI&Q+yz)ӎ$7e#*`;Fۏ9tI%J2m5gakHPKAۊ@9gD*pNi{<á>[Y*+}ħ,ϪXDc۽9FvT7 nHP8yWoRZ$mFR#,hpZ.hqg /0-])vŅijCyR^t;V: 0lPk}Rγ^;-?ƍzl HѤ-Re{f zvRJcTR */9/F-7yB؊ Pi*hi6͜)[Rؔ$!he(K)\40JF*Ж&9u2rkQC['9$0m)Rll :J_p,AOjm%1{}Y)fCc ā77XL)V *:WM)> IŇ/>ޥ~ݰ% 8R8gRkty5{iH:gwؒՌ֬RAUufqimuJԪ2s"-ky鎗TR(1}(BdU͈1㕩$A+/!>C!->+3Ҧ)aF"8BR2̲wr? c2ܸZEj:kZ"$902w8w`| 0lTn\6dDEre+zqjcHt)!)>A svU`nGֵpǺ[Ųjmrtc4WJ܎RVMRc>[ӷV7~D }v[AnciHΒxg㘲] v 'A-L'$1:kT AE}Zm)roM.Tʑ;˯ 64bdC}9X QԖGh4<JȌΤSWƭة< 1Tud nF[NPj?H4v7,pT$ohaKS.-l!5RI$ 71\ 8S)ɢ1D7~"鳯=TXMlG=gi{ZTQ<]vOĶQ\ざX/W/ D) B{e)5c?Pql;z{uBȎ :oe 4Ddnjx<̶~|eK d}J݁q[ǠgL~im\#\!"n3 Eeَ f;hmJ@၉'2*IͤJ &ʘ`@BS]J#zk5Gn'Lt>8c&Q!%*'VGo t_An!W򏴭ߙqݶezT^p;e`RN\qEe !"^ĂAbe7 lVOmLI ZYJZP9eو Zo.A- ^%ѶnEGN,Z0\n=92+N8 5oX{}^dQ=j@v;=omeկ-'ܧE2ݞLu 鴅8N`x}%p7kqyږ;- ,nfĚ џ 9cSud߽[a$1-'#܍7u5]%W;`Gs>ه%8y$2[9I2|0ܡNL '2+sC b/n{nZOZEhz*$ y8f2$I #Z_6;Lp%ʐC˖5]K2r}3YlճfZU]Z$hھ/R ~`u0G% Ɉjt~D;<;-sk3-oJktHeeZj*3Y\vdY-wy 0&ƵzU3=4UΔ56mvS$`TEӽWy>z"Y.sZa3R.K!+ Y%J*B=25 $O`o%`ioo6F;m5lr%|ġrhi3:GRS9r6 9{mzI`}*7-|j90z[ iodjI8#̈,yfRn!OOjj+H>M{:ϱ7xW#tZ!\P5W 7}߱Q.=[8p8 45A%He  =NUgRPQ>4Ixbbtܷ4gIҐSAr'x^ZvrIuJs4a'xmdȐ2>yH!9*<\X\Y:IV%LM%!%BeiI%PROyVHK<*->j_O giFJ@n#hT5J-nZ Yq1Wzϸ&ؐP&V-GP3LfNuf8W-wyI?p|1Oz?45fqN9 'Ikομ}ޜQpwYi`) S`RSL얇^_\t UK>IuCJ?J'iMD\-J,k^hH?%j8!w5bM1N\,9iVs`NŊWM)w-N}dߏ:SWUT>XwBЯ@m[}Ji PRBsޜpEӜU)@e74RLi)faMp'3 2 qCmM8]dN&\PJʊo8uKarqiFEPՖ4cʧ8*hb+0%Tt&Š q]rnrmØ 5)ƒBZ|wQ 6V^߬9n8-Jp_+3WAȔZ s/(!䰵:s1HPVz wu+o4J5vkGI伥t%HJ@R8aJ3z*]=O*G(MƟ:k6"=ͰYh:T9|vn$%aɽY@"x.6`"ɖNbTR@R.ԕ* [Wlnl~W;Kc2RvN*4i7%] BPOB+m r$veJ[xJU &jrgڛwR?Ni 7!PM8 c&6ـlV%^b8L[ k@*A+fYvXsmHzH% (P^c@5\q[+MGSZKKlPTt<LD,|7]ldD&\,_# pNLBM1tPdg_`sVmom, BxixN2-9 \aS<{mlW2,k.(еW(5q7B|KzA͂3vMN[!=^N=F#@Ƈ@%kpQD?o!?-' &H` eHHb3LShuŸQPrTc*qMSI 89|NqymPϕb8b^@ RT΄ё;iҦԶX뢋+pWʄor=ۿ֙"[Q:BhʕkuJt%bSJ?wGLYx,.Jv[ؔnO*ӍMQu ώj+CxҦB7ȅwK߰> E[*qΥqJBb4W#'̓>>\>J+/̍ܶlFݖQ:!%tdʇG$w+ ]c]Cܷ-w?nrxCn:+1Q\sP88:F\;:yI5vK y>y` Jӫy~^,}sC'?ׇ}߸mvKWf]!t2Bq(%DR9TZ5#F ;u-Y;io0›Ƹ6 ]DQ9 en`&?Z `m6V>aB$gV1?"d% \ЫIRt $dOf+6b6!f=o('QTl!g0$)D!IzJJTp5I8GNiğ$0DC_ 0L5!+SZR iޝ#.[m%kJ ht$S!mN RVY[E&yHJѡBSd3@*lQz=Z' MMu=eP Bc] ? )PBS(RÊ.+U X;oC{A} xXO[7qGfuVN]2oP:_SCn%IZTR(2>Vy 0?5NnC rBv0,7blu *Lpo=IqX!%$Svzѣ>*L{-m)޼b.ld-+b(1R0v!e7$B!.2mq(XPRJjڳd@lGvtF_FGR$( E|qE:q]1qvm4Ģ3}4M:a yU ִcV]KׯF~霠vFueӵ8)_SpL7}i˔+CH)r \ yӸhq ܭw/7m폼{El@q)`s$WܴE:~ I3a#q8;$!;,]t in+"J>re' ׎$(#4r]$FZYHqE>?ˋUe'?yAfA\lTWMq\qm?&*CDItUMzbLKDSj)8D0ۧ6BDSLPmQnם1?$(=I㉊UfSsoQⓗ /%7{y#^b!o\EܚJA (V//,zȿy q͇)y)KoR 6e5b%ShIv;Aj$PGIW9 2)KKp־:_ SJJ˶d M]i׎]Q[q"ST~Iq#1N8)i4VkxNR*>&p਑=9@ I?V.1lobg \)ćT[q u x'4|{ۨ/n챮,LȖ I\ B^2=XZB$ ssT[-PefKI% {G z}P>rvYnmkFT]I4(ꖒI yqpDY#芪[y6eΡ"鰩(XH\)O<1= Acުp,I~k%t}9m沕ɡQ1"Zu~82?T8mv"swcςiN"ZSb Yb˭'3C~V6k\rs.{m qMHSjiD@8eb`=b:wT乽7;)\tHH\7PπQٴv+`w[ 6iSZnlWTʎ($,gN`#HWq[$~"pQ8ͿDUbn j౩VH% 5 k匋vǷhGr%:IK% GˎWFh% SZH|UJiu/JhÆ.$.5P$j -'5ʟ >4m*R)&5e\-%AR뗫11#)Z%I$ A#A.Գ㈋lԼxSz>ҔȞCs*vJ+$;H=[t풜IX66QN v۷?{X˸q&{ i!*Kk|jFZ30 N=]1Ć"c%d-t߷bD"(^ ;QZH&]{`l4ե,L)m)zP㴶ߥB>~O>)kުrΨwp[z)"XR~BICN+P)AJ vPdԨ]v W;c¼n6wm4eRX*fSdH"1~ߦxgYF;7r_-v{{3>u Ν 9ycR{ #e*G0\L2n!jz%3Cjz#i`9E$-&qzUaWӲG}øq%ZKlpxqcށDqr+>ޱY[lp=.gDbJmUrek (nl#|{÷þ5QMAZ:ql>PqA7nf?+wl#۸m;NnQ7-Wx ^&@nD;{6^Di|wP颊 `Y\jŀwϽj"-.2d!#YHI9yc8dNJQ#'ܦkX7s32ﻥݪJFqFKZ5nS넸8āYg-}>sCwk[W)-Â[lRR۩ 2zwڽz?r vwvr/],nK O:p)T8sWnS`g^X!ꄹ> 2!zg>gObJ6HJxwf* w|ixݜuZCGn2J}HE/0=9w w?Ĺ G:[U%+irez svEE?)7K<864wAd%iz;f*Kkk`/B18Ϸw=%e{I[~u]s/DH4JAB1|~8AV.7<\+n[ܴFDlp1(5sc=c{TpX[ 6g.<~PJ΋oaV_e%)@qj&'1ϽH%l;.ѵܤ^_EmGynumͭ[ Kӑ给sӐB[nw2frJdigZ7 Cke)Kz=V)%Kq Yg>|8!%v.jMd%ǟ.hvץɋiYm+XsO'*td`-ed }65iq$2.֖GLuU.)#i@-s0V}(H?Gى O`涽lksp7 X_A,L)El!(N݋ba&?j[m'_I%%kz:$8Uc|nUemUmFS5z{6AV]', ]XվX3buh9vo{ͯH6K`Lס@R,ZhL , zt9on{-h sf m)r R:H_5Ce"I<$Ln-DY"n(xєuKb.N ݈b28ڏNso op#DCquRRˉ[4RCIl@C ޮmX,{ë~U}4w6J%O@$i1e ʉGadPM~X~*:aТ:M( +׎%r'ޔD!GI4GrZ*`iW Gr b< Gr|?OahKPQ:*sIďtώ,ܛX]3HYN8Zy&`ajǑHC694֞_ ?9'Ԑ\C8&tEC4rQ[*jA̎ΚO*Ӂd\~0왗~XL/mn #m5wv-wC˂+1a-jR.WOon'9l6oPcaWtG` \bYI0IKv{&IP Cȭi={ p*o/fngLn *>ҁLmX]N.ݼUàlɛ( ?(6Nئ/Wbl*SᆗQjf#ᅴT&Ƿ#m{nɏ1ˀaRiDw=BMN|0 Gq=i!߷I-"wx ,-o ?!(xgJZa u>$ZR*ݿn'[SeZh  QN-ԥLP+=ZrǷ1}F3n?4 L>N\M~8dz1.ܗ7 .0IW+׎|2tDz6q!io*c̰Ґ=܅)tQYQ!.a.اMaG5-H" %4CS,L1WնY߹H}n0ዒ z!6zSUC)ڟq:0BMqzY:U@DSէ3 ^,<-)ꐆf jYH5仦8brgڂ} X-#IȚC 0*qq.qifI(q-%N3ይb.PGȉ:Ϳe)Bϩ %I B[!Yoɑ!AE(!#Ա*=^F$Pwr^lmeP8HHd,F>0)BQȆ0 IH4"O\ B$*,O]Pp?y1C}Mjy맧R~)vIkloR豴֨ޗꓒ45郎JKPlĵ9l$Ѕ9ԩy$+P92C)[ ܭ=֤yIBPjHpr)T InҜQq]a%,Q%}5xSf*>tA]׸Gq ghFh)A:q3Ӛ͔VͷvŅ]ZBZm@'41 1W R?OΏ\x{Bg¼m&cgC)hJsθ#oJYr8zn S*\:h&xcN{4 FJn4!*>i1#JR +̳M reQZmc^Lhڼ"4㪼KrSP}11#i-Wz}cS9`&{Wg\\S C-'RZj+gVDnΩ{H*/כ}bE*gDsKΦ@3 -z9+tVL<#lL v3Ï-RQ Q %J58ڕ4!.K5WkWv>.KfoYqZ,)hJTT38:m9.St$?17<)!ôaӒPYLN_.'5i[?,Y`d=ʅ7jZ*~KKS39ccyS[v*nhv" yHfZ?D8 r4(S Cʧm#oX`*_>fmon rK;-Gs< @cu<ϥCnZ8N[DLߌ RIBd@8=y̟ygvnwT*ko* j|tǦc *+yY(`żcJӐArzTǛ 8hkq6/8P¥ORTFAi#1hi{vyj~v군XϦ;LN JV^b #qf[* ZwvBJںCNel nM;׻tͰaP #RA4 %Ne` 5dN\\RmC3)8OVQ][Lq+0P˾(@q'k-\T-Au|~XZ6RlwdLm1`@@yNQ #$҅ TI\q|S%(iɫ ]I5b?s%0d롗~GK W-t%Rv>8SJ֔]TZ w}ɴjQf %-?RGو}m1RV`%jb\B^BBR"weFB8)ݑ-EQ%o,<,DnO5^aȓ\p)JJ^n$_-JW+4X&5$]MJ9T›MY JhhOqL*m-e(ڻ mF6LH:[upIJdHAn{kѷgudVHNא$|1V޸0Uy`J (qHcH_7iҽru:R\5?/HLC %/8CZ(>8(iN[ҐXZuduU>Xc[y D]b$GSH &1Tί Q*`kʄ3X\oIJBS[VDRGj5 Qs49ʰ ɢ4v3lz$T]IOU kqc4 :[RsZi.^JY7z+jmlariV-$ґhѶq)W"X7!Je>ӥZ~L$3WWh|4J HQ#F\V&f=Rr0Upu le1] q4^x>B>#e  d14L(2iN~-D$ x0i)JyRt=55 BaӉG;W;f(*z~+4%k/YM˥ԥ8mimbK$AK!x:wU3zϪB@4'טfEt7sra!҂Bmnj{7tEž hn fnRY}ڏ|}9QjRLprB,J }Kp~'?)B?ݭڊfvR5$iN9J#5^5#9Nx:zb'Vn){-HJMBPc+< KoO_}\W "QsOf-m%Ii*ȐN,rJ@ީVzs\:RXvC)jq:rDȬW=ap#v=FyT2]eqt5s{6bJ}МtV4׈En*nGedKy~+SJmO@^^GE7F2|vr*J̆ Ni\ B3vg% VrM|HMQh%,{& 7"3UEhX#RU PH:ɔA~n wjՒ||4Ko۵MfU9ynEF|6Vjm3XRx j#l2/nmqL(]Ĝ ('*ҟ:;އ{8.r|{w&ۻATmt{hais:3^ྫ("_Sw>!{kŸ!ANݲWt<6){(C$vCkǡs@']Pr+ CW ~c+ͷ_i+N!<NXֶ* L#jwKnm#"vZwZTu\dPA'NQV!bvgnikr/m-Q.n"*iHRZ )CFi)|Ǚ= e޴(GmۂƝ׶~8ϷZt $@'`U\;ޛ<56[nڏo"֞&4!)s08? aݛ;q|V+µ㥐V@Z5 8:A$+|3/lovDh7zlFHZTk$N.?I-P#gsq`{kmʛpZdTJeF+N2mtq-\e ao׷^bce-fwqxKk*SiRoG}G R2>\Y]pի/.斴; vIxEb.M^nhHk6KtUh=PqEm(_23<8ډ;aǹRL%v9k-;lҒY-6Fu 1q( 0w-ӻlSR{J!&򤉰و!]P@N)F``O) lKoj,{rw5$&L'(4㍷GZSn9uUȷW኿wd,n6v-}gg-fk6R_7 gJ("C>X,V|v2H25wi;~ YWM ҙjClRy-!Z/Wvws~hjSkݣ>(jn&Mmr[nLmƢkVx̮Te\ }( y6Ol2$.T3"3֛tIiim-J\Uu~VXѠ{uFu_퍛 g{`޽VP-&s- =%aڼJV᪉E0\?pt7ˊc_%Uw]oL؛ u8,8a Ka)M 5Wxm Cಷ#ٓ u*[inNMPH  :݅ҲERriqBRx@pSJRВBI L~\xiZy &t4HI(+Й QE%:G>xZvJ%JNAZj)3V ^V $2$KP9jeL'̧Ý0$j'OӗiׅpSFYI2U3BlRB)˙>X^ZgX/nO>)-ȐD*E)9]XYgqʴӡd ,6N)Ǜ *QRPӹ&8!%'țat"25.'2TXvYE&MMxiM(pgyUa䘿kZKЭ5KnTҊ1@z}3QoR4R*j3&U!|R$Rm\N$ICV}6굽sXJNQ1\$doJvQ'{z Y0):|Wq<c(~3!S_ :+5& Q,]Tb"Uzz[y"4-/T9NsӮ2Qzf&RP_MOxPdF_/7  % %IHX̯o]]E].ꟷ-6$Myٶou=iMIqT A3Xo fDVh 6J @&QJT&DiFB!'ַ T(M>Xai/^at)OH+)dȭ+p05i<rwrセawQ9wؖGlk5Gr1W;qA)ZO iEŖX&T9+[rpnu$r-R[. >g0a&wbj /}j}lVjzX&$-ˉ-PT-A ͂qҷ*9HyFE+J:!dk`쾌ZǸ"}SWnFR n;(P矐{kc>>%qI+1lm`m]LuR)K$gqyLJpj~?hg%U,#ݰQHUJAթ|oRSfV[9qTt:Q2ߒmXl)n((O:TI(HsЏ)in;zU.yIUŦt qLRJNy:PGs8=/BZ܎ੲTۻ궏\SqjSrvͿ;%?Q2"uTU-)E5 &n#AIYLg.΂{{]x߬{/ykq&щza RRR; FaA,qh6d{dIݘ_(H SAꅄJT њ#O V 'r帽/oS}TXRX.KDPuDAPX>M&yچ7< mZ[oyn;PBu@ u p>m0PB#7t_$whj4{3GzRh)(SZ[:3$tF8ݽ70dGMqnl}utu֮>LBm aЬI}ĸ=Ndjw7p;9pf53S; .)&zDr";l! (*VV\:ǰLXŖ=z\:WvĔ֐B0E3\)ೆܣdm .-WR-~Jƥ[6-҇n g[bG6)vuiHE'$y^( $y?t8J'$qʔ9bqbrNKT4 Bf$$(QUH,'M儈H>8A(5*sĀu(8iU )i LU@Ϟ'UN<+LK@L\q>xuΒ]s\+}*.P_ 4>xNI?3$žPօWk8e {b:jqK^#F0HW坱:OE)!#GV%8ANj@ǒx-t 4V$ 6VHYB5H% )#6`E8 O)'Z?y:20ƃB[]PJPJ?m))6`$-Q*Ur0Hɴ,r FhJ) J0l5|zu!v鎛z%!,>dލ)JJNT(|1Lp.1B9 3yk!`i P*|tawyveKw5/)ΠԤBR NAewҢRb>TУQAEe2irDp=vI H.tBp[. (J8ptK IR}&\ZζXrCyyNҵ\J0R+j}ehJF) s1L5K*LQCl8x_8Zi(nb\`&bm/z#(6x+24+o H乻Qkr)Ki!Λ)l,e=$5*LnÄV+m3Dl(:V Nʘڤ]E2mu! iK9(Ǎp>*fU\% Ōd>E.CPH'/<TdfǸ6HVőv!?V.$RU2]\7cn&dW$2VmBӭ9qNEU[nwjMCS!HRT}KX0$GamfޕD8(2‰j&m*yT Ԣy@.LBmT?0'*ϞIv 1Iҩx8m!"KCNC*IҸ"Y+!#OTV9Sҋįr'cKuo]du?rmE(u$(;!I  Ƅ[2=rN %ꦠUi>'y㹷d6=고3<^i}Byڲ*{Ҥ(%~ <~=(nn RSֵLD7&G;y0C.L7J\ s?pksd &:4xcokvIӷDKrwK4 *:ްRxҘl81Dr6WKkx?jCh0F%Z{s{Z*uRS%d}vYnB=*Q9Pl?0Bڣl\`UJ(%` )Ē8yc|-0jׇyl4yxt*VÊb-<я?^v?|'*SESvO/"T$7?GkelVH^㷂xXRpGXLs}ȳQ=Ѻ6aKj ;DjjU'Ҟ?y5zP |ïraG܌5d߉WTBjWZ%Σ]7nIS*=qIt]~($~;p;]gN$Q'r 6Z%3q'd`Y 'ǁOI:xp>xI)SƄ':S0>Y:DorjAMI퉖.iK+K-)#B[( Ssu$%{m/=޷=ƹ%1nC6:!MWNuO,cJɃyԺ Ó.=،ܶݿ0F7pkal>lې :4t_>\,T쀔bw}gؖvv۱b ,)-z]JRC1Y9|,Aޝ햻Q{oh.ބo[Ow\[z:j &T`y7JŇޥ]wyY}ŶHжz%\-Db+[fNx>ҭ(bDg61-B,[!.z;hq0㡽, TG5`m݁aۏ\xԑHOlm3l^^*&9/hXyƕ)IKn% :u6/NIG}aq^I7θ^R1p6m[SIq r. ^hC!"Gn޵7m/˹߯ 9ȸ0➲Ð_ _Vu]APX=y06L+7f7Fw#k\ =sY+ +mb"[C!kakqYpR"Y1s8qi܊6?oIAwpZUЊBM,$Urq؎, j9QٲMVU%b-7=:NBy]Sf+JZ1Ԏ3FYn>&5Ul~n W ~ݛ6h2ـnטg!?m:Pz@QI Ή+'mW@Lq*lFKDޝnnY܊~ܙ u $/*Btt&ACW#89ZC~#}5o;O۷nvnDiihJ\CoU5z1NuipMۋS{WVQeÁ ).Qo31PDrJ) #wV@l}oœqbYnjwAQP\E`H {}A@&/%mnrZmCU/BΛ:̗ ѧRRHx>HdCol{u=bR6όBiSaht֓Ĥ(jGk6*f=if۽A-;C V֠#_<?0 yط-,H3 HKЈ[*']$ cV.d+:naks@N"MO-l}h%*FU\WU\wJT=t V\hv7Rpc2bU5FhƢ|q=w^h @冔Y8+(w)5Š`JH$Te\>$S1I>jO)Ij21Lj'$"y'pJT5ʘDdY);Y,G~ 㒠5Ù%-%;Yrn؎ )I 5ZJ`ҲçC봷oۡ]/- CG A-|ĥmrJ]]u!6p%'MPQWYqd`H; %/$S221/)Q06 R(qaJa*9,dyX'6{SiVY-+#q(ALUq ¢bz(*f[hq@dT W鲭- '**pYuqnX.d-nb)rLzu[}@J 鞊L䢄*@$9TGP"VW[6FiA3=PJ?gd-[Z?wqn){ BGݑ5ϺXӕjOUJ%K}^s"2=@s)H+tW-oQ z+ qa+mz>Ӂ̍-&Ddy:THGxzfT6JZOv9{$oyf@m8JN2V些뛊̉P$jt?ր1m*i}mZzkNU>$lM`.` ^1&ر[[rRԸ0զ4ǟkѺ n9m}4%LӢdk(BZ=E'ё f9xnpC=$inWoYq %W RPrDb?7f Bi_JَFis 8U i iIL7F5j!])jU0ٻtY- j  Q'GU( 7Io}p*n/&CHJ!ZJI'1X{ kfPveBvYqYZs0uM>έu8/hm1wę[ ylCucl):O*S1Կ"ϔ8gPĺ<)3eNb4v!Bi4f4vϡ?'ld%޲.Jc|KsUT򏊯]3nuH Fʠr cN,V?/n|gH.%rRR֑ˍ1E?k[Zc툺Z%V+mW8-꜏rㅇyq4LJʕ玐5J~Lb|YOW-UHFݽ*62[3Bʵ*ȀUu2_DN Л5[T#Fn4*} ⚊( ǟ6V8VWw29EnJ#X.iuzT\?$KFss*鳶)rT4%nΚaLai@5FF.ĿrݻsnQN: |y}R%1cPuqS.`GRH ''?َ=g\no{ ȷz}2n kJ(O:iXNÀs"YVo{iݺe尙3e͐q$0uxӦP1Z_ۂկ[~>(ueպ$nߖڣ)62^eLel%I}-I4mEL 2g-XwN'kǶ}uÜn,۴[5Q)k}N6UPi3|ϓ nˈl}\6W~ywu(*I}JiʶaegIP4!`a@aF.H6rܲVԆWҗUMjԯCq96^P?ֆڇw:jw zl Ѷ{u[HZ’j41n)HDc)jdO[׷߉hMrYpBWY:q4W2h ?֮dG/Oظn8kݶ]=rS9vt~%[]eړi)@ԥ5N AV{yTBw{H~6M ] SHLKJp-RT$kP4Ɛ'M]_[joc7q> 2.7Rfmԅ5 JxPZӎ0mꘖc/U0m{4Nk0'bKKK~^۞ۉRPmaHq'DNZ,{2'w@9n;=C֕k[&QPPau:EIJAvSeSDB(n *TUrz3mqJ)!IVn㷐8{zn7Y:>y["綧.,.nSZb>n:n-a%ZiPTi=@N؀I(Clc: ?o6~ vnr]r6-8ҧDRtҀsq $FBT6ܭl>mЕ K˒@'V_-Z,O% --HBY'Հ&GYH&>qq mIU^X:X p˔].udQ.I J;õc]VެԶLVYbHWTZ.Z[O )0NcuU5c:\"m II3gvλ`Fa}Gs>2@KF@ei&;d$iַ)*RbF)q”}~Mh8\؂޼"^Njj[AO$3yBޤD#\s*.^T SiL;|e}@[Of/%}p$wbIKZb-GuKG/o=N?Wl?.gqf=ͺ*np>\MiHZe k_>q3Edᜐ%YEWžӆ,n-KCQ !+S8)bGD2b:GM)K$fI䥒]\&S5xpFJTY1RHξ#i /O@ rRu9h[ JfAK2̮EĹ 2Ur$UCYaĺKD̵>$冁Hn9HVĊAVJknѴPnov\iOǒq(^*H*FeIu BY8f੒ԣ)oIp!!m('*מ&BbN;wiQbkó8ȉIq }PtD3yL2-^j.\HvsuQMIB21GދAB*W3őG@)q2R5:y2c6]f*~8`T*  +h t,sLdQ 4"/׆d+ԢJ5L9B2U^N3zjP- M>d[XvR֝xdz*C4_u ֩(69goZd&+q z|kQ#.],k÷Fmr9|~iqRN.Hg֨DgHEjZVq G,SVC@ D[v$RT+U ##@p,锰DFQ%5eJ !*r" C׫\ަw K'XïH$e11'2*Pp'Eʤ0Դ(r]?c~BhQ}Љ%CԔbBt.Tflݓ[G5I1mpq(zE3h {3  )_m+zf[9K4Qd F^ܑ$YYZ\ݵ/*BҝgԶ8)Q浫};w{z#D1iv;nRIW9 }@D}J߾ܟ]ySve {E8d@Z^> ƀ e2P{?k =8.8HMJsŃSF Mѵ.hn+]dɯb4n-m P45-"8N)?2lK}kιƏDiv0tIPQ :@9V<Q5O"jrm'"jܥ9:BJl:A*sW(c; ol-WWj3OR )E*,\j,yָ^/WtmպD!"*UKB:AsJSy]D9؈=ݯ9Sf"Rwt~nHis+yo'HҲ\("Y%pUss"ۭͿB]ip~DxPu2UF*s̝,Ͱ lj藣ŶʖCy D;=r<{@&\Gl}Ǹ2=n;-^ ȆK!r\XQZs#XQ bd"ތH=Y& ۃ {7[&7g_K_SEݫmSeken%HVSQ>r> = Hy}?xNL=wJZ+Zv+ThSdDqv8Km8ڷ"ܠˑKlK Xd!e) C4W[^(YGB;- ˺go&vn6AEa/\ #ǚVr_II w;U}pmۤɝ-eREySTJ rV DZ, £fKRWMD՞, 9(? @WDf\7qVRFc)Y!L&+rUvMۓ#'OH`گz^oX4s+W-!I13tH4 Cq{g@.p*[gꗘy5G$a]D+&#|T#˸|ǽ_ݶ7nߤb͑:TK]DSmiovDj,ST)VZeB=|86an2wz#!LZФ%$Uްg}ճԉ/͵1kH ZpLVݤOQ6UآQC-!YvK3߇ۿ4~K?QrJʹVc jPy:|[r4ۤVںH-e0ܪ iČI1xx8'[b]yj`c!%!Ԟ([kWQʟmn6 - #*?tmGV5.۽sv˒.6˯0RPjU[YXZTs9*z\oZxoRa{Dly$[ERm*!8=(R۹>BCD)?i v[f l&DOT,QIZBixS;I/gd}J|THAKɈQ;]A)4<=e,9ޥX?sPmwk4I#BAa .:JNFZۧ>~]X?DW십>қ܍iMU#*S.'W(ݏPeEnɷlDǻ"d-Zċ,gz TH+a) AQRN'0O1vxun+CJlx7[i ó{t1ϐ-:ܷ\З:)i =ZI4鉌sbxeB_)jrq]~jw(ٵ]Zd%O6[PR./4k#mC>(1v(Kf޷3fn[wYwJ>!Nmi-Ηnm-β G@QŤ,m*H;=pTM֫#_췭|ߠ/:Ŧsa-pJR)+V+H#SVcCm50|rଌ@ۗn&Lrnu,pHu|8 Q H" iCw_m26-e.2 ێd&<{ÊxFEC)Еz9nwHfwnDRn@w{ۛn 7KJg=ur]J90<z 4ZV)6v5-ews%\_`![-oH)Ҫ,$a̓q[XxkAl[[6X'Mn$v|IU=:jhY( ڈ10mn^wmmrwr$\ZRC(5n76[of*ʩa{qTݍnɰDoSV wHXht Bu#ZA &v. &@hPQՌa۷Vʿn'nF;5{jwŸez+Z+Z8Qo!JMv ,3矇gAo C}-ٷgj]uc m2BR[m^PfHF56H.p 9.J!\HL\(P|0` u5#XA55<x`i@:AI4)>y_L\+VZ7N䴪VfTǐu*Ҵ>fZ`/2MUjѪ;ՐeQZBG>=^>XrzߘZ۪ͮ‰#= L|VVKIp_ X8&2Tӥ9(!JA()PXWBze/f&GU68.BQIEc_D_1G*Ֆ} *Σܨޟko˞QQC.`!+>?FH (h"t*C I҃DR2PW $mے--2܊78*sHP4FdH+žu [7,X{ҁdaCC'Z4/ĘWeL:/t-JiP Ř[X䶄*[)qVIS 9bP%!,m߆=[~6Qh>q=h[ 7&}O@tR S [nAgty/0eKNO [d]Ӈ%z1*3*n! BFEk8 2ËD`&*Oy!IN^ &N hfCo"CrK: -TR0р|spYuD)뤸QBip'd [Zo.ДS׭JtzA>#,12~hft+mvM!ڹN( a(A)ύp(%[:`rb -Oo nܐYRʪeLdc '/~o, ,V T' Zt$h:W_FqH8V&LxMPs. -r殍l}ϱ-2HN筚A>`c2͹EsV3O5!èyB~b٥0%?9pIm).PW s:tK" M}F%Bς~x=q?nĦm[5 \Ch WLq/*Np'ڴbyq$u5CJSX^vVGT=BåҧDW5k ́S=;lAUn KAoJt0֐j 9PAߓ;*w0_ҷA%J1!)}@8rEoznӟ{66[iFڀ#k4,lSRZeb1<P=:&{%;64Xm2OM J *S;qψȎ}XᆯV|]6l-(^/FS;56eot[ -Q :q vsUCuomWZ>5 HITx1+2 JCUHOc>b/Xh+PW26 v#;*+ݷFvXc?o:n<^3e˳d9?lUzC៥!ߘhޯ6;}Km7=ZPڟeHDv--"ug[Sd ,?^Hmj-L1 i;jKPj<%,$ѵ[ *Ls\v^.)K)DԞ'Z"Fdm&Ckڷtx~{.gcʷ`(mZg`& D.vUf*fmmۇwA&|‹nݓ\Q 2+Ii$ШQBITg9 N9b{9=v~uu}0=!!iYS"MG fQ,VW#&l}󸯦uKF^1عۯģoiRnNФ!ʅkJxb*@ C"90Ά쯻7lBjoHr sn Ork-UKEnSc0nܸ`HwfS?ik[IB{"6_S/K S*$*BZbÒlU=i `4ͽJ $6BZJCzTaDI<·P=hw4#d]ܩ[duo64@}yHjcxe+<3glp>}netT[:T|P-> yW$rv/ⶥle q6MnwqlFx- ]U)5[R+"~&N18p#!ޭ#Z;R>8$\fZ"SGUs嶰ۏiӞ*{ #i,퀜KxKܣDwUpZdfpY Z^T#a-kRҬyoR_-D"8{9.o:=* tFV0#bGƌEm8)MVD橜|+Z ]ʈW)mJf#/F>>[(x/=tM jgo$œbAz@L4Tl&1TH9(8/=㶙ᤂx6ԄRyTq G~zUDp_5gJH +<֟cHy2[*╁1uC4[Slq̥sr |ǟn+mVԓEτOm%A Zs$c&d]?B|>uZ*~$X}"e-㎡w۴T(ӊm3J>QPKS'遱9:Dj2A*aA45Q1.t[ү฻XLGc%K\ p#Sd"V6bZsۮH!Dʐ:xZciW(;gS-&HOS?X.@ C W@IKVV{-M"I=]@GG켛WS6û5D qPYȦV֪59G\g.g], U! ^<]b\AY[%c܎pq@@lۮrr%ieTZ%yE,AUxrJؔ[~ B yˋR C+!*KtT (:B]v$5p4 zbNٷ9E+")@%Ծt [B#))X% ˆ!)c)̋se _Yqi,W Fm!L}Ȏ*US %I5 q884ybJ>%*VU,KS+aO BmZc:|p|Ηd+HB4NF*E9և Be:,Ԧ\SSj'~]T]W8A6lla8+.#HXRG1PqFDc޲7yo}Q[j"ӭZFEjk6ә,}{|ˎ܎vleA.X滏&)%mT旓I^V|ksKɊvlv mՄ摪S 햔,,u9bq2SAmB[pMKiZxW9+@S_Xm]J֟|VcI_}|˓!B~_,{h0#^YmQZS-ЀOpS4%[; {k 2Z|ƟDBۊvEU1L;my:Biw"C*ɞMEz3h~: \JV#>s뿏_.J~mf=l,Pq_R =iJgIZs့;ˌ+cժ"e*.}EMƊm$HHBS:wQ_7U뱍D9j Qtm 2ސ«:-EI&]ÒoԊ#]SM07DV!]rJg+ҥSEYmH`#]#jwgYw\h{eSe" qit}+ԄZFU2T}jEd!ˮp6͖]ӴNmf1ut2$4X{c(Ie}*hgnK mAKw?mlH0[Ң VIR ,ӡD,8{͹ [wn_`.i^6\i -, [L!0R^E~{qAN>Ҟ 5-PD}򖄨MԎXL܊.ZxEK]v\mý>pcQqǻ>Thq]rA JBT(2~1bщ{2imrgrlȐ=F*EJΒ ՍݜLܨOkeOHc۸*v!kՙ26!HQq-_5>t^Lkb2aHNnvܫ$Pm'-iimN<#HKl*Vg2"{T'l헼Iڮ&\~ޓs7%w/;5UJԧ[)M'̋KA${cZۘqžaL^͟cjc6KtK)i%d- :E4pr+M ]߷tV9ߏ)B涨"1^|;D[j-)%iW:wˆwZ6\̈́nۢM%=p~;neo*u6e#JS [z{<kwָ]/kp;+sBeQv4:4HG}վYBsPexxg⌶>d_Z}`mkouOe,I U'$ eTR[o.ˈr-R%lPxъ 4ԙj̱WJ}51&DSdSJGzG#_WKRTC=JJ*c=MT+|=N1wT˾.HReL{E7W 8k1n Q@'$}2DMShĂ[yZGO/O2s҉^&|}KEJ$%C˝1B rdvgj4y'<ůc:d ob\Xg {„RK# ht=B$nnЏI?1t+%TxW seFa6m y"I8qG׭{24h+P.! )!# ˸iR͌ ۴.6j"!1~]-;v ŀAפ2))#b@BǺ[WR?RxӊV#1)kk@Bp%))HP ##-Ґo h;я ȆͮK̴u'] RRT8cw~ͲZ8*Ly:  6HKhHU LŻ;`sEp;:UU ][Dr4h z;kj9e_tޅqO!f8⧶+4iH#*V1P"$d\CHeSa_R aE4ė~2K(u G յW0 q+Q$GqRBZb@9EyBzky 3 q R9`/D%;􇝕&C)Ĥ9!nB6|;Ck.%ֹf2)zt'xV+B6f* K[qʐҜZSe^Tx M`J[YBRJQIMAφ,8%[K Cu lF O˜%V`.*-)"3NxD*up!5PEt [iAWzEvk ZFo6GbUN2ܧT\QӇ4/#bY"4%QeDSőR5Oل/'fP C"vT]^ɿr'l2IR՟ΠX3`}'X=pۤ(4>4#2vVZToH3s! ca%BHۊkM3:.BfS[H)8З![_L( +)ROǞI&Kк>?kU"0+ȉ.e?ڏpʐm +A%2)Ċ?8O It^෾ -Xn: EƎ"W⧹nN%O;AJS 4m*(UVy8:{X1k .3Z]v[LtmTe5% !,ȯ|umש"As;}8;u@;F)nj)Wk}zeHAb@kiɝ+C+ckt+ĻaᏳ1P[{qrleW P6%vجCmec53ldl$O&p;ĶwaZHmX-Zʍ 0 e#MR\Vۭe@bNlrZeW[{?yIbSLIBKH˦ڵ uBAA#_o(XD],y꭛;reqOnb KAejQPPa8ϟcTW&X!eڭ*|q)]fҚ̒_ 4ԔE41U"?؃Cgl+Ws7ډo:ܶ_qoRJ_atA\w]m)C~\5MsUv@(* *ٶ[s[cr@pDdȊŵZ%H5cB3l )W[5 -2hm–m E4UMpEvi?dϵeZ헫10rbIӨmǢWD4U(6墣?XW<dβ9^Y/|U5 0+u PI QNx[nLky[n޽[.nLFoKBԅǒkJd*Z`Oʺ]XflO?Ӽd~?@3-5HC1uHv;H[)%tp6WdgZ?f|iɏNJDՂ!*ԈԵK<,$(BeZxd"|U߹e>ݦ|}t5tL EJ%c֐ULnG !zvZy7kž-ݐcLTn3 f3̰IMHRJyVxF>M̽-prTgZ{o]n˜ZWmόoڜiYԗT%@; IlqbdǺ]qd%X6za 5 txGȼFGp8s:7[2V)"8 WR7E7ˆ pWz0MA⨖k4[u,5[ɼm%ȳey ot 8|]@j{[Jࡾ% +m%!hiƸ=QFz(ČsQ{&JAA ӕ0GMq#ZZtSQP8jUD=.bB ר#Oo ˄au+Ҕ}mܳY:1!5ec8Xu14%K 53S5En[1RURcI}Z\_BK<7;UIcR d9eHC;:C[E%6v@$,#-Y(8)HjiRVթ*p=$p`PPMou%(h}%\V WWt*[zmM&.BM)1m_IU*|=v뽾t[M* hP)8g )&dkV9onJP㦎)ILHT/j׆7n.܇ZqىSK;QkBTΜ)%4A%hX)Fe G7F| cE_h! L8I4k]uBaǹ[Hek?zRO0j0=9#!C*2,*RI W3 Hu]R{ E<З Gqe_ 1^0 Q[(UIP4X}q[TVƌ!iҷ P8PH?µf.n:HMI1 c\efn Hᕪ僉!Y"m `OLH(_SJh: ]TRI)o rONU---w&6qg.߶ln-jCwVaRYkt<}Kg J,,g^nq˛|x{^[Vh[Cqbߒ]ZzJHQ;?QWcdKaYFoaw6L-̀m. v׃j.oǎH}44c$%!E+"Hl5Þ~9rP 7Vw8w{dՇ}qt¹?}+K ސ4dŞP _T̈۳t7y7oŶf6z -2GJ]VpSIP(d<$cgAgІp<ݱ* &R{s[XJ[VPu!l4tRhP ?^.oeӑ$c9;p͇Vyl@oWghۏiq0(;r2KCV@/BhUVSW<:U~ʷmШ6: c⤷oYpQ:sƆo嗋eBR A*bo-+?nGF$8-e*[MXJc8n}k% Lpn}ۻeʫ6V7RĄ u1x!Ixm%Tt(& OQ2˼g3Ɇfifsoq^.p͑RޔۡSMS-EqɢS(d%=3i~[əW, NJ&Ps~KLY޹΋jombmqĈd2V+ 5UTbγb/ mԺw1$Ǝ†dV9NlAő[˹"3A k=̇ЗeqM:EM1M2XOrbrpZ[gmn3^l׉y[Ie:K! %CNPN3܃0COG͎ 3gSlU,D&>#.8Qx>=FxH<68{Лnř_>~݈K;~R]qe4m i֚l hExТF @i(^Tt=t{+*MSۋ.t:ϥ,O 43zK{Esl jR Ū\"%KJ:@DW3_эŝ %]}cN{d[. Uc-Gp--tR<ǃu@D/G3mwޛ_f]-f·*L}Bi)'S(m-JW$d Cp%ur2^ Ja|)E IȄLTŻvVtbG*i> aKۛq=vǐmtVimvA*@@ =\q:X6Jdf;-IeMi 0$k5?O?юkE[hi5oJE j_b7KTե:RYq(eSNk9~}_MxEb;Vf=DԌ -/N@H9uRd8> @+6{Dö.{2Rа#AƥvDmXb]Q(WHrZk3aMld#I/qQPRgm2"*PEQQmort.Nq*i$YHc5<ˆN3`pVLBPNNZJ8ǯkC!.)+@&Ч.XHu=2 UltܑGZB .7z}Uᐥ1+ȐqQDILwTeTf9Q)Q,ZRxؼ\S%ߍo"ݠ-Kp%D%I1:`c j~7mA ^!.8 R"BfKoRThbr@ acɐ"PBUKkj_rsG@D'O"qqߋ"z3cXFqJ`y(GXt}^XzޒCVҊuBRSN5꒪/f_C~H.CL1)ҕ6XhJx)J"FOl_pK(V'#<Xd#*BKu )SYD^[ZY \@gʸV{ownչHM\BK q PRSJKn I!8j{˞޷ ]OmImO'X392*`\dX5)HRrP$ˆJ&D2 l%۶DۂdȜ6X(^5Μ1M*42m#"}Y]G>g5]Tk}79'G>~'*<7UKܜ|tJ`a֖Vcꤼ6R\EAE)"P [V>7]F͕2wNu0@Bs^ qI\xזXSTk;NPt4#@i0W&:m u+n _!<HĨ]̐HH! r1;%3@yҘ>Yi6*Α_ֿ+kgoιqW%u;OCeyJRÂxDV+Rןyp8Ƀ]'K7ݟtœ_>ܰ7)G bB-Sep+~٧9 >8͇=u1嫹____^L:d2vt4)Q(|Cm^(|p\9(sH贊. h*"d0U6*z GI4H&$W^MKZ KE$$S-Km viǙ6]l6PbNOoi7b"KKN xz:O=y=캮cďRcR/o &譵1kmc'Q N8eNpt^zwqmӭX!˶7in N!D6%%TJΞ,\wmXu'&؈-*J--F_ŊRiHkc}E{L6 kkP_WmƷŶ[%YQTi $)/`PY-d;rCoo-< Q-[+n|!g\A(iU!,@9^z2c$N>ҬwwT ⷶ7k3|^4RܸҐTJR44~UB3pÇ.EtuNVZbN|=~Nݬs ƶoռmCg*8bZo%OJH% ʸ<[HݰýY>ٺ;mK]?n?ns/ƇKQE( V5('Hp!GS8#dlyzF܅7$ݡo0w=TīlX%Ʀ(m8K*IBTzJ#t>\@IP3j~݂ʔ۰`o.{Mx!ukfLZێQR0nǮ_K N*% Llݏwn=]67{ǵ5"cHj CVH~R2mHJ&?Hl9|6'mF8:CX7Uloض}:+-Z_$8I CCziPBsƽ@HYq.rP{nܻk(m@*l̼a+Ӧ6m-%*@4_4FU_ Ua2x7N!;]׸[WPb;6QSeh%ב!Ҕjڒ\f[~:DG\pW]VŖuKosVS/%huN6҂ Jw,>‰W#F|ݔ\tWfFn%6׋cmjR.O*ՀYX;lm;{[D8cyʙuk NC%D D`{62x")cx#w:廻ɫ̒[Z\HB!+7+l@(FݲM[agEqgȔ %jZR~i3#,>?hZ?/orKzl9]-*Lf5<⺅4ʀR}UpWMOje[M^= [wn֙jGi84Q$Ti5zogn+ڊ-v+mt6m+cLCNd$[.%I)JoKNj"id'@4L%}=aa:gX?,mSat Qe(Kq>GR$ 0\ʞi<5 32!eSPbB. ֨.-InD:!)U T*sLpKN,p_X&rVJ]e7d* @D t+5cJTcyvaF_>6v~`;K)v䩯@Bjc-<ʜNVx{vZ f6J2f (3,%]FԀ*q=`nBGJ߿nz7u(%y_5#"R!/2lB:`Of/͂"jBPas)Xn%Q|V\r] l򦟏?ӄen+1TMzHְD]D Ԫ̏ 18'6;͖ej}JhU4<ғ9quݖ#}\~4tD4]Z>Ofꋒ=+mݑ/$N  lChKQE@ʴϝN:[i|+<|X˕ ^?~ZiRTt46[LW܆~,CMfw^Qw[5DHo*B$8uP[`t>FL} A;`$Ze=l8*VBOsGUL<1s{M@q#n(L.M/TeD%%]C]EUe3n$}kt"g8xo .)7d8(%]@ JC )ŻYHc NUj7e2g%J@!%FD(,hGp&Hpb:܊hjUx4"5łQ⫌56j;YˋL7i)J֦V5k +%)VEn-dkܭ~`Gbڍ0nֵm)S'C%ʗv* 3$ڇZ֧chDHoycij8TE4Qq]RԦ7)l!I[JJV4\9QBrԿA i/YQQꢓT:VD]!`@D y |U(Q;|F':Q  qtF5>T猿Zaa҃ovcFѻbDKPn˷͉3(-ӒD-N6踇 \)l31!RTJΡQR+A R'%C8l)h:dy`JaVZYJ[q'P$z!+_vs;-EuB=~U HiMScRVN2ƧGq}H{*30oK]W5E:r}IGPD+2:y5fY앳u\e:VyMuH歉8>VHLKbͷ 99.f#qz*R@\LҤC6}·Wl_!F Pm-|+偄lhdE b*%#ϷPTHq *3fɌC8Nuxxe`Jx0Vup̐fɋ2K!-qk7FX/9)ֺHmf`"G0 Hb\\kuܢ[JCCjo1zP$cӺts>ocCᥩi9jCyf;pYj)Gkڒs:^8[[Oس2xP9Ꭷi,^L|iT{nQ. pWt=7,vw<(;:ޔOw|pОA)yTFx,wqJlG"(>'{|Gt-]I"ÆE5qt~xIp{*JѼ _1w3r1گƸn+wQi*V pҚ q1Bx[tnI-%+,[PMiR8+wLJ䥈vFQz5:u#! qT 9g˲~YV9B+ʍuJ/&ᩗI=1=jJ θnͦĞ|mհ{rf[ۑ-pKC*2)J\ZY*VNU`-iPm;x۝۽ɜ/SKBlRSf ΥG=.aJ}Tt+ߙamlbQa¦]ԴQ +!( IPˬe >/ۇEF.CH3Yo;}ȒҜ=km)@P \y}fȼqf3g] 3G֫^ٛb-7޳BCvU\ևT+1Lꛍ_Lo1zXdFVc0-7Hr"xýO4= ⊨RNi9P0:e/oH룍 D#0L[Cn[gw[hfxH-޸֮HZ{KP dF4dXzM(%jٮ;kgvsor9{Hcۻ.{rcՖҶD @"1ۛm1'>n<41>;+;  wGso+lKzh`Y@4P5Q;4-}p;q]4]ӺnM46\:p2  #Ip)n(hMF_NbM=O,Rr.nF7 6fH۶X2? KR 㹕ZN<6nʨ@,=_ 8x!9ojer\ťkmĞ]wEaSn "Bp>`|N+7iT޴H&u}1nvF!o(O-%2JЅ)J*A6k7ӆY+bwUgI.[\!E[v EjTvZĥ@lveg}c-ܨDN*vmvKvӲ[N Ƿ/KH\)zR#DfIJ)C8;qIǎ|QɲP+ڶޮ-Zlw-/C)nθVjꢾ]FB0 NXQ@'[d\%\$٠Jx* >K8QiQcmqfKmC7ĹpmVJvJ: %tw5c^2_%U9#Vox۫&vWvDm(t'\(9 h+Bu"Km2I[e*TWl.p {Bۺx,|lsH]YL^% "k9m-JZz*@2vSLɩ]ٷN(H$i-57+ʕ'?&CDKs_Pm.`bmdtF%Ko8kˈ@lISn$GҔ@3NAitdoWb mIuTƝ d)(ZFY fǗۊq}/R{Oj{Av6l2WAHgm8!J+֔T"tS-P9zEVypnޅ oM}.~\vV{mcP;45f%tG)ӰN`oepqw[bi}krݹg$6P ^uZydJEdK㖛?4O"*=:afjiRt':2alXXAkV9L,.PY[j$9IEusX'Ssj*zҧ`~kA_]#[ S'Nҳ)|kusWGcò;rԋC5$Tf/_#ܓŻ{.3FvM$˱!S!2vM#%IH4e;{Ab~%n+ViN0y,lh8ΟRZhƼqp[wYzt >wNNkڷ\ⴅ̐u-!e g?SUtA&N^P..piT ZZ}Ti Ǟ\zjٰ۸7mٍ"jz$JCjқt*ӈ|$,)Gq+ r܎yIet{+(rhiX*SQ_|(ԫG .z)K{C)y14TRc3gLLpYkǁhu 2ӯ]s*u9bcqKz;Hu{Mec ,E 9kiQ=ROӤwo,'|pɐRTOlZ-} m uHUҒPMB4RBrŕJ#ǑVNgAdt&Ä":% V(R u[j2٨xwe 8 Q]+ΣuQ!Ib)>HpB9 (1aHxѓv}`11%}yHIY! AJcᴵF=bs#P$T'29'qTx"Q]yv[\5*he D{NBi;};bI_ Չ vݾqt[ "R־JJM8i쬜\딥",U!u}9*"ᎎQ)kRlkGQ`HR $`ed5.c6֐Q&PQRA@ 4_RMLڭѝ][Ȓ_%9b(OQtj++RUxPerrx0w<)Vd61$-4 *#HHa sbjڔ+}TBСGJj H&G߷RxpZeMju1R^A5̒`a7Aoܤ˹L}\JO>QI&,Ģm;$4DxjlǔzxLQlB4ɕ6]LfN- J`QSq=(vPĪ(7uUͽ~n*yEzpx~ygDjǭt->D!+"tjFX*.0YR\)/۴jN~ L_-_:I~qlnѡ8Zi!!JelR@NA<|LmAqbm#VVzڶ[6/e72+K٭z,;uƄ!jj4>yk6>$)Q;i،p;۟F[ wDUzY{[C"\cFLT4yP )P #$ߜGoT닌Y5N݋]zo;T<]%܍uoB-G\ IB)$J~DV_VFY(m+N M ѵ.6|~q[~չєB/[R~KۺRHRQ 'bHCYcevհYpNnȖbIv󽜍úZ'aQasHm)m.[@!5s'!+Ms<5s;zkJݕbaEWǚ*q%ަ)YnelN>9q:ֺ617pm4Qgߌusz\-kR&HԪpu.vQ }6>lޤnwZ+nd5<ӋV[7iБL86 %HG].[v^mGFCV*+ܑ&Tt{s+iw nDRגۯGݦ~ Qb.@({pvݵh[SW;\Xp[i ŁPQ_Ҫ`u8={ )> űLr'Z=qn2*JC{\g"MR'Ծ^ymdʃne7 PB[!塶вSJN48^ԛt۹j֔tn Ż;Pӝ-v%dlۚTO1m興bxwf @܈R;%7l6׉b-1m4 45fѺtIZu%QPQo$8[ndطl{f=M=qʲݬWENȍ4=Tw%RNkbIŻze'=:/V~8xiܐͷvA%'uF}U$hqd0Uג-td:蠒kL|Ud2S4~Xq Qi$N.!̿4<˷pB {̈́%@ j !A_p|RnKJd-Jcܡ礊.5Nd;]oQV.חjztQgqp,Κ˵J)):v5eOc$bB[,#-\1ljΖ_:RUP+Nx{U8zzef\>!Ynۛi+x*dC4K 8yxFED C;wMɉUKuS&T'L":E8wXeėh~V7owEƹdHJu9EO6FA6Aܡ,$aɹ+Oõ߷$dYlSsYK%!>B*㈢Xx_+@7bn;c$lS 7%]}QPwΜ9gS#f)♵#Td.kΡWZZ哨^u!8V[.aC΄6xrM Š pҎ@kȰyn|UIwnq6tb,'SIJʉ8CLNڈP Xʘk!+j[um!UܐVYb J/ngLXP RZ"ȍD=H΄*A([m\MjRxs{[c $4Vw#=E!{ "RCqoi~T#8m|.(kkƑbtt4m(9ebBuMKa(#$5gLQqKD"ɒ:-!KHi4Θvh Cn.{s_Ve”BW궠@ tBa*6q?qaZ ;hHa-7%b*jpWaD9xd;YOAnGHvtQQ oO5#,">6, :mt햍6[%7Mq%! Z[%p+R3W~yb@~;sUOsvgo;s&=rYSB*䲴"(NYc񍴃=^̱nq91KfKTUJ8DZAN\UP*#6e[ޓ{jKڑji@^M4(ϖ ͘rCNnRۅ}S*B,6 @RZCidTTk>Hr+bٓ>M.DOWCҖ:Jg\B=J{ߥj=ʻme IbZV())[j8aŸlcL ەCf=55rҕ-RңBEMЂ,;i*'csZ KaaђR *%+@E4+>}GH5Dت~|d4TqGI+4h2MJKj$C)7˻F}n’YJ@4f[vb`H -3mƝJȨM=CAպ0e[] s$^[*tCq)p>Ȍ#9THI-=V!-$٩UT!Zx&x"SXQf']JO*srHGIu$j"^dҘ[\o":u, H*Z"Q@଻ Vfm>!6SqvN"_4ZN3)%kt[ĕaBy>Z{Ƶy="*y2tȊ>hѢ <cLpGUQl=ŹsFNIOq"lhHң8` !e+hs.&gi-y:Ww~߶vĂ{ZЂt!Y^٠ r9d~ۅ3tE!kk)%'ZSCR6)n'vlTO,VV3!,Jb>`G!W#|Mj*nLTOc>|F:d|^iNs$PYHZn(m`J q>~q}goƳmrBR1lV<F<(`j.Yyӗԕ18-?ZΠ) (*rI<~ėo,ՓTiALN0$tɺ:epE #mȨr3PbڋL<+o P*̑1}rwQֳI?1; Æ+QelY{yP%(Rd6r*1?d}n8긏טFlkhM%qdQ :P> <{>WS˂翖oL 7&roRU"YX ω9b{:~Ȇ! BUy/YR/sݼ_%JzT9g:*DFm#@8z#AdOL~o?/ vCK*4me &}iJ))dS*hѾkpIFK1vEm-1ԹoT.aũ4[vI\*32B[]Y9cZn H)鏩%rp@,'<`WG۱R'Nֵûp%F~:utuDr#)72,hmHv&ȿWWvNW?srzV锐Y%j!-4DjҢ9}N 3E-ؐHJo] mmmliA:Z8 TVAtIͤ똑n}HipJl+5bF[T ;SEZ*KJBu04˹lm1Ql;?4ۢw5k_Aݝhh܆u0@]zP[FEBb厐G|XnbSZHw'և7tޮ߷ Omڗ؎m,E#ƈ:s9 0X37H|YWmz1'5xb+}bBeXmԘ u6R}F˜ NUނoJ mJn;ux]6dD4W]7= *<46כlN6cx;l$)q`-0SJA I4<{xBjtڛ4pݶaeԺBGnJCpʊҰLl,8+Ggl̏/nZ/&EN@y@R\mԩ(̶ZsO21]mY5јLqFnc}nD-$lܐ2f D搬P*CNQ>Z Zkrvo3ƛ$@EnharcR5)%'RBGt7|3 M.Ͱn0eP,{-XSdV#0@`n丐iI :aPCϿ\M>%UT+hK!Ι(XsCm4W5Y̌;dq_cs;48fÓřȚEE 6Ϊ\l_Ѐ{4ˤm~WGt6oV6=wMqB^$HC&LZd)!iH uqZiPfg|svyeǴCfpƟ.;"h}|m7XZthIS֚'Rycuܴ#H2&/[:|S{o.U[N`:;k BN.\a`Ia5?=n>mvn _Qbr H\q-j4oH;e۹KedQiGp6]aa.ǿEOI fkC> TFE{k&7u!*ݻ:ͤR:jw#ruHֱhh)s36-Գ̞ߗKgop[{S/Bq\Rˡ*mn(!;a64}57lO`l5mNʷ-{mҦ)*\fJtZ%-X o3Ifp(ޔhEMrJLSs}̔>!;z5(KH)$988{>j^rWfpCu0,qA5A>`R{W #w>gl7edzm%.2 Lĕe-N+qmE` $3~SuYY5;,64ǖuJ!uQ$ 9x$f5`Oj.w|ً=ž:QGƲj(AB( dq ϡ c7! %[bJSx "qs'!llM6Y®PJbXtIS6Rm(HH?k6 F>A<"cA'\0ےRPབ$xx M.cݒ<ŤZaz}DF-6mDYgե&xiі ZfZHuUJQ4'1|w"}hF%Ɨ m8( , VWwIB%Y ĵ9g=`ifCڛiնQM.~_H#{?V*a:Gwoݪ|ɶIOBUJBeM-@FE*#χ$u hrѷ{nAu[lPP!iNQRΕp@2/"4T^ۯr{Nζ=OK0 Dd7J[éKR4cS|.I&<(QIO[*&]祛d׃O-MJ-R3Ml"[ԵiJ2pDMk; dA&,ة*RuףZtt ӭ OU=1q ']jC J$=RjkÑ㢠;[ܔ]{dݣ4q74$ڷa,@j[Ru'@[ѩMT$Ep(j{kmRiquIe4 e=K5JBgPwzܯypIv-1a^߭ƾˍZ£}'K >x!eӡ-T˨ qSx+-+Ԙ[[-0ZJPVڒsZi rMN#ݮ읒n8+vC)E@Gr;JJUG3B 7O͹CluRө.z_:p mR1ZZNҝA4A<0` v(,Ef,|q]7W_[:J(hkP!MpPˈ=7D)E"+0pӁlK2EZV&  yE@CB·1al.[]L?wH8nP KGJ$ 5φ( bG0*45 JRS|q8Duq:Ct(JsR JJd!뼕PrI_ uyֹ1Ȇͯpmk%R(}8BG U@f {o:⤸%*Ejxw՘ %ے㧴I YvP{n؋T*Pr#\"dh1u8-hmYysa@u,-mw*U+P$ ח:Mm1!JQ@+Ktԇtex8TEW6;F uXZJِ γKj/HV\P*8j>K2˼HNE5Ҫ>0S7wgHWrtQNY9Iq\ʸ?2'nz Otde:y-evv;~huD454Śuw*aaVu/Hej?,41DbHI$>QMEkp1K:h RA>bKP\m;GvKO992,cV8y %' ߂͗NQjuqm[ "E)59Rm8hoOX}_Y)1۞ݍqiTr햹So[Z }'*$8hޑ=8ofmuFʵmͷo!R4kHm$+WI?UxeLgC|ֶz?LC lUj+kN61jJBۨBAb[O'|ԗXv>[j7"~YIԴPQi+DCD8>V @wɺm흳z0&u*.KCn mHcxd(ͬI"~Hw!`[\jk,ȸDLR㫊AZʟ,%KH N+'1Ŀfu=tk2f[^v{Z7\ /'._qG}iEZ У9ek &97,RAh]S6nnxu !撥HxRG oCH|0Y{ڌI9>> o_8m["p~XjR?k]hip̳OՊf{]0nNJБ&;ņ_e ǦXO<| w{)[KIƋP{[)H IyWn118AvPQ-/{6n=1Lm'nQFY*jh٥W{k{Vmi.̺S~dJ۪ e}iF!5֘٨2 0<1wX>OwlnvLr^/aGǺeCp)s:2{KaHɟeةYIDĞJ Um/ #,F@XRRA57`،Vt J}YOTInͦ& {HZU\YijKtԕ:yfGc{Hǹh*7UpKqEޙz_a.@a-VyZit}͑w?h̴^mfݭ^H* R-=$)@ ի&W}:$8y ;f[ $&;;ԝZBcEӬ4GZ#0@RRylHDGՎe"'i$7 2P|ccqfu.:*K$۪sq0RV@<.ñ7 Йms/;!ͶjauҀPa 4( p<97⳩W{~˷wn|oɳڗcKOԊrhj) +)cCcz?rۆ8`{`mrDhWm,%1qŀӡ1Q/JqdӞkc?2FMӱɳGm ܳ:Dw"Qũ9jJFSqRn Q"ֶlmɷXT/\U1#$[BuViH-i$C1 !laV3kiL"/MȲ TԴԓPP a P,p%BJg( -RkH2'ѠH` d,A 6+˅ *(l\b<)gW^8̞RTM۶n7Elg7s]$vTW2鯅0m3"NoZRE+ݴԽ]_RTW{dL3qEN}ɩvt$Gfख़ou\ԧ mqhRmd [_?L6TJwk;<[oxvH0Y: mINdc V}2UZ%PGP9EԶ@WAx = Qq7;+T.LIJO'S%UIJ 8ΎOWtA չUrܯP)t)h/+5)U5'd5 ̪Yzj6-f_KMLf>SЂ!W 4SCC9KPI3+_m8doirV]6\MR ]JsQ4$Sc`"e /;ټwkjɎ&CЕya_jC5CZVRS8C n{d,{nHktFz!,Y:A mŭ¥Y 8Muϡi1d-.Cvpeԙ(!Ff5Ghw+(x!kc9o2k--!TҖHP $q2apW !5ѐPUTPҪDe3Wy"D͹&@ ](Xe;|1!˴($u@/^l 3kM_mM?Ka$9+Ai'WS:O.aĥ:k 5 k !זڸRI L`K' GI UU,)jP JA  fJ8ˈ:]EMMk㆐ #xpœ] Su▕MOL' 5L]cFj1ɲU0A|<&jRU=$p#L%R: BE3OqDk@g<_Ou%jܭ %Jtġt݉,w:*FGRq\qJxչD| K:H> W(Df "RI)g,:d\(=tffÐ_B\mĞ)R#13 ֒vg Lԕb2k )'[]' ;b - 2 OʸAǷUlES~ٛK#)*5BR th܀`*F×mOr[c젪ESjCP'򕣐S: m*ԭx,Irݲl{zyKwk̮{-4.4vZytJ rUOeJ X5Wja3XnfC[!0UҚz"ԗ !%:@9ayUJ;pZ NҠu qLb-1KqVVJ % R0y7^soWwFLi [m-2nj%AsTݽԕ7N n*]1Kkq\%)Q%D ,c%QQ4 fNԾZY˻]myN!9/C?I M30&THDLϽY ~5eZPݞK*Z)QUqe Ȝձ2[eݫNۯRu}kĥFUm;)NY]|:h 9Uqav`{ 9]B9=Ϸ嵮}o);[{HTi]+Z QjYB1՝|>+#mכ%X5*ú:*}Ka]8r'HAȣzVGYW`6x;G 3 ݊LۢC/ȸ$u`ۙPjPK(.IVTƵ@K9dϵl:gncB+pDT?kBGOQdlJ#m8.۽^v{J*֥DĴjt8d6%J gl`[ㇸ9(߰׻f;z1yũLDR$i 4NƕaZPޔu5v.Փ`[q[n&3V<qL=%!I:Uh Dj .9P[^<ѶWʹ ፸v/ۊ*qn\RԷ I@o 82cܬmk$j8vF=TؑwXsZ%[\<ېێ} i'& H WGgȩ݃pTe聻JvX'>F5Q]2 P3;*!iGJX FJ\x8T(EۡHJPǖ*tTPvBҘRaT6`h)ډmjR(嗎 mBpG{Sc\׋mT>j !QP`y4GW }bnef1~KII} i!Z|N".pGb˼z¤-B6#B\e J@d!@Ȕ!_O¨tĺp*ČAH5ӣ䤴yDC)ܜ %kmI*C#lU_ rRDTB#!-ICcJZ)jq nBjN8i!Yxoaڻ?|3_vWKߡrYfom"qr+Se:JH2oBȜ{v[aa&g2E%̺R !QąFຮso}ܒ6m3- !ZWpLu$N8*Ҵ6R@J9G!aT"MlMɲյ =wHW7ߐ S%BTPʉ'!:c2um)ڿϲ7mFȱۢb!!4ҵ)ZIp۰Ek%k/n)FҵyoʒQzT'S)e`UrcO)%G{* rO&5mK,+}ie 8K[RRU76(@18{hnn=zm&̞Za3bǪ@SA-8 МsLY1\o 1n<=x䊻rwݟs@n!p&#aMpGԮqHi֤$Qo{A: _<[mWg޷5cu2o![܉RQ!Uy㿌L $=덐"FJkww[p-˃ eb1>uKea\q@ZreV0"2.BFDګ} '[#.g=lJa!aS(4(ז4jX㷑ZfMKk9ulKy)HWJ(A 3 j 8DZ]mWt&\sk˔ TJB~әβf%-=cX 4ɑRʹ, \Z Wp0U 2&.ynd{2FMnH1.F}-qߕ%6R:UCRTJ5R}x<9 0Lʩ^@|v,hj̃.닒ΫOB\o:4QNdw2 j{coݻ 7ƲDb 2pCk `Ii(-9HRTB"Tgw8^# ׳@vk}QoLD!@8(W~Ƚ{82R|uq*H@3|E+5\:T@NOcso ceLQ4Pȟׂ4Rد>G4ϗ%F!Ժ]UAh@ !tGh _$ MV!Y+@ uL&D=5Lt%eIUuj@9c,,Ý)%a)K 4%)GN2 ֭u%-z}u%%m %RR&b',spƇ")jziq(P`0N#ZrpZA]R4գZ J3G0=ٛz$9s[j4yWR%ূ]Gh)|ٛw:aG(WkYܻȗ9MZ,\.N8 [ WQ@@ L<']s Q,ڛvi9 $Bd>}iHhSJt]MXqM}Zb%XnhY+-GUC;"%3.4 &OHZ:(Ѱ!zVj`\AN+M?ai 4MEB}$:P-CӠ} bP"|Q}oӭ nYnCf 2B* zJs-AC,%tbxaϿJbJSœVi^tᴺq^D;=LT72STRH.xY!KZ6]."#6t>fJ)KA*)FIL#5Y|udFu&UYr/ :KQp҅~TO8cmDQEz2PҼOғUSÒy(ϊv,rݷ \6nRғ]uPZV !|Bf&j+2)E*S'Zԑ#wNt K'oגMIadD,%&j1\@dBۖMq<@PJ[HtRHdl.1D;;zmn)WYmJ 4j`3rtb[k{ ĐmIW#,L`8@}'= \4҈ 6W-գC* #rm1ʈ\E֚d_UQC#ᎆq\ "SU8 Cז-y*զcĜĢ42TybzB Z@x&NvB ^4Iz+mQ@G zޒP@?K҂V~I/* ml8tʸ7ǁ8ĺ!{bB4HYR<<&*NO&L"A$9Ίse22V-ZyVH}WgXU[vݚs-ϥ)"(R+0 rD+mIjS>+H$r+O-h CmD˗ [ Qȏu G,]DSi#%+4%թYi"hn K[[ɏm+cOj#X[$Hoh%%9@!E?.toWVYs8֍2]3yQ!NhZ}َnP8%A^s̶Fpkv{h l얜NսڻEln}jkΖ0dG IIeޔHqk_(@~p>F} (UQ'rv%7vы,KLTiLem3BUTmF%$x/0i.W{s6Փkݛjw_ݶ-ўb,*bNZg&cCsnŸv \lTMX4ΙZ[+IӨ4Q! 2I8{:uFlVb]V4å,T xSPN8v ۆH[A {C=㲧@v-WYҶ h:VTi ը_mp%|t&+lډ0\)mLʟdfi K9ZcFd➒' yʣ[pT)Խ P. հ5`X *:X/n\\ySm˭]ٹ?v*e"]J\AJXR3bZLޕUOԁ$vdZO.A3xGyFD^RƦDbU"Կݍ+r\.[⦠ ȃմܥ-l IPp.l͆Wn_n ;ž­ѱ6^RC8 HQΚ@]W4pxZ: hTy@lNۛQH$9Ty`??zD/PDAgݰ(rqԊ* .8qP:mH>P0teP\1!bf/9P*׊W}?p`<܎d6\/c7VөխtO?ޣU"6i[L*j4bz-@@b̋Y*9Ymi\7#< ƖqA+[VZA , RvoiOXUomZrVQN' gxXkm}ܬʝczcÎf3wԊr'`%&읊95wŵ-U2J!GqtuTopQ .gbk57F@VoMy"CbO)uC 9B灆͋Lklsɉ،'LQ5,)Kiu9=_Iu[|Ȱ]p.kC+Vڒ q-{вOUi7./(K Tۥ-aG3ƕQ& mm3Hf$Kn-.us*μ1 Q"wBN3e[rM)j䷁YJ:JI Jy \=,d=B$Pyaw%ꮚЁ _8L=)]ҳHK,%Ie65qZ9j$Ԕ Uu.3uTWR5~xև$<Di:,T5,,U6Hn&!Qm(̄gQDcy4}*-+h~Â!D ڷWaE[OdCYC8 KۭV1EFUfgog#m^̘/7 qEԚЁUTP`Z8J`%05,۞nz88 VO`"U:C(z['Flwv3-IC.8uiP9kRHSyu;b6C0aڭPȅ2cI5j38qYQ9d\-SL!_[h[o*]iRqk8vVie-ět+<(Ng4J\jqD;ɐ eJ%c2=l3[PGA%C\u~~XX*) Ty HxV@dKolfJ0-.GQBTie0cФ J2Ȍ6kRR'dI)PΚA*%Jيs6Cc&i]ZSPtu(R|N7FAaO4lB:]h}-Rs ,0OVD|LWhBԞg&xV*x(H9a$U S I%ԄQ!UP&!mwBmm;$."mmRv.#b[ZF)>n91'p_N׈oOi{Yw5&<ی%֥V EjĜfe;aUdr>߼6;3?Kppm;mGKQ[nUI84x8b*o|lVauDIopt8t"t\,[ e02b܌2tmI["⵰Kf"LdiוB])$ABh A r\T&L1p{d_L;2vu}D2쑇uY_NJe~]F#2<=䅢\YSw]qvn vTb]!)Cer1+^bq(q`$ r@o-}I \+[CKwU?hGPAY[mŚοi%LH1 0I۫ 轾Sr2Cs{7po5 |IlO! )n 4+ 0lpQJ27EB%2n1ҋ~(9Y)n4RTujd& 8 {ֽXD>g>wۻym[~׳OpC2z|i&ڤ8&+b>b)%\$ĉ@o\CpzKl-v2Ee*ok A+! xR-zM)vw=ǿuH/ߒn|Ӭ;z[MKpz'%~+JFZztH^M7g5$0UܻZs.LfndΤ%%eZ֔t $AafZ㧚vEm> ?2(,Δ)R +m N@:FbqP0#}}C6@ܳ%&ϙomrd>[ְ ?꣩&iu>~(N(dlwr^ H:\4OeJ-Ym@^ qG>(T.z4q ^3q" J#B-mЀT8>nx ߷rc*:$knZcmH1:!.u )5E:cKQPv$+p`͕23g[6Uh[aj}nkJr*$Q.)H3[tĜ(X,Ejq[yemٜ%rzV.B:54Gf>ۊ6?.زym/vnKC2#ˉP\ы^%@Tђۖdh2 W.k ]>XN.u >I)dr] &{}Nq)VzBI<gvNsQaqQ#ÒڪS<Ɋv?׊]?Qnb?黏\2dIN;`[ry!]"%-8M(^?Bۗ_%,?7ߍa,^)trA?1xB?\Hҩ$_!Ϋ$&ӂau{\?;7sBv\GsX'R=F.x%_n&(Ze?Mb[ش^Ckkn ҪG@]S5[U) bGӑVՒH++cgҫw1DA w[8_!_G1 }#Yb$IZ[S('[UZW3?^B:#&9 h^,N<@*FFy(5꿬sbvZ(_O/,ӄ PQW?CpbS.U(?R~# R v/0KÄr?0Max1 J) +B' bb*eI[;o?/BBU?V2˷5yZ/j |Q,R_Dtxx$4࿀g9&*!PJ dʟ.آ*-gxb6QXf/I墶ovw˞0_ V?㏡3W&^)53?‘+F^gZ%7M+D>q{o_Cq{~*?ۿB5?)xU_)|N<=+*3yTm9-ٯ yz}{vqTHFj1e=j [Gd];տpUSNZvee\gnMg۳6#t/Ooaj5v[\rX[ω;k2!i핌ϸ?V?x$q[7?kE$sf;pSw?|Cgc*+-Uټt~ϊ2{8 Y{(>3>+Fj˓*q^(ټuُZNCϪW52Hj934i %>bgƕDqt 듌Η#68+*IOrYuxr9dWwBRhXP0T ri:IsH,rMs}yF.MKz<-d[7 qFd+#t ~ң7 `sn9ٵaDʔk-%4kx$FyP3޽wjTie07^ih8Nܩc[>7w aD'𮚘դYSJF=7Cz$ĬU,HO"?A^_e.wzn(t8f߃5{ yj^^;ӴtG/1GAvkR-oSV/h#qv#pȍ#;*^ +D&}]fEׯK\Ys&@au:]s!۹A\ϖҚ\z'Y36;q?\j&TiNUܒ8=:ZC$Y@$tJφt[`WpIF8$U0ގ:6G4٭"7zjM鄍BΫk-._G,1-(`N4D usߠfЂOҞ&59MS{NWs7}}ᶒ#57_n}{ư5(جlLʟ=H]ËV_8 ZaW<{ʦ{68tlt֪=S|D19J̺ppZēMF.8Nkا()#UdG3pVt pI~FW Pk S~Q^kKCMٜ-dѷҴe|hw;_.$bdCxWVb pSE9Iӳf %+G^M-8dw;^Yf.e9Ĭ  cEy85;(+KC+Nhi0vw+`0zS>,) <=(ZGZ[BХĨnٺ_QEoJOu?plugins/imagemanager/files/mcith/Thumbs.db000066600000017000150472426320014630 0ustar00ࡱ>  Root Entry@g1 Catalog.20Q   !"#$%&'()*+,-W/V123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU  JFIF``C     C   ``" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?Ϗ-=06t}Bʵ2V|NL|KpC@L?L[ `񧇭)X_"_w /Z=~n)Z|Kl`F8Bл` o-]I:5+_K/K[]r0č9=+q<a%$KV'A}GR׆PI=&M4"p0I 1ɯ: dVx..Rz4駉ǪI-Nw}22$PyeR>.O+Tm0W¿\JQ^SPƋH-($T"$I ~Fx=zw9dqDBmgˢr !A#nf}._CkZe{0gb*N'1{xBGw_fRa4m&x_Tv9޾ f]:l%2^Z1h/ #` Ẓ̯jmQ|#X:> E[ƥI $ '& :k22jA_ൿtƯ~oee|ΞBGU<.3޲o>2XEsW|̹}4_&+?qe/Ɍ0_EkW<Α1X*q3oN_,y[}eq\BϛGU_3ދ!g4yygBϘhxU_3ދ!gͬr7`*6|sH+gSe1Mƞ0_EmSyRoB/"ǿΚ1(?,yy[}.ṷ!c̣̪EÔQUmދQU}֍\|2[4EqK6-7;??|ʬmJe1#.ڍ~#vwc˫ZjGs&AEI"وarwgO??]yPNsiIM4<=j>/2mƍo go gxFև̛yq<[B}?<[B}>z.?kC~G_MѼ?ٞ->ٞ->S=O?kC~G_MѼ?ٞ->ٞ->S=O??#/&ikg. gW~1/o9]:Yn[~$*s2 0X׌ ```^5{A42CD7B6-E9B9-4D02-B7A6-288B71AD28BA}*bҘ E JFIF``C     C   &Z" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? t7×aӠ"ה<=+ -1v2m:4[jƉ _L>п{{_7G0?uTwފJk x?XwMض>-]Z"fׯ˫ T'2XƷnA}.)wCq|6W y4 /͹˺wū |Gv }ܭ hOx3ܗDk}w2]#7-TTRQ=d.1rg./T$u? Njvr_ZK4m5_)~*||7.fll-o#oȊ^gB>Z|˗Nc[GhDwWC=3O |j+i%k YVlPtnuE ^owWcJ, >WS ghf+_E|4*^mů|1p!6ֽK?fYt?'1T$ǮWQO.FOV< v~Qg*O|o6a;{􍉺_>[NJDAחvٷo^ Cyy3gY^%Go?e|s\|چ( % xUҵ+2%g|WOUnW{F7j&篗gtGI^=nR{{9[g~T}&^~ϓ:G_Fc3K>M-x,%HmN|XZo5+7bibDw_Wؿ~ KP6^iݬR،kpyi*N҉UmOڔjj'.+DcxD6'% ¿mt\מ [m>X($J?+3Au_ țZYᾋۯβbrt {<~w246e/7vJ'-iƟӮ_yη.IZ+in'TeUijZۚV]=nWb<[Op92>{ox'R_G ރZ3JO{dS1Zޡ]p/fb8\ |\eJueQSvy$3/8uvo{_X'F]>bD_(Wv9K{3\,41˷]û)XE8cِP6(Q|%+ea $spp?v?KEé'bVU٨ZrkWykXuޯ<9}iK!K%1G߻_"{ފ+9QW>.\48ihYZ, =s{.>sqcw5Ly~qW"4iZ{6q}4{%9Ot8нk|E{IKǟcmcith_1.jpgۄII6j׭AQj~?3plugins/imagemanager/files/Thumbs.db000066600000011000150472426320013516 0ustar00ࡱ> Root Entry` 1 Catalog'.  !"#$%&  JFIF``C     C   (`" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? 43B| y6A^s92S$6{zW7>5g~`E|ž.5; ],Z">o}&g(\5;o"$6 /8p+j: R)$fU/Ė"/tȷ, !&UI ̤`־, K m|~`qXk_~8r+v9#cZZF$t-v']v\t˯xS 2}qs^el*UpJS8wGvACu S`[$T_<6O-nlV0,xm+Ok ͂{;ۏ̤cQT.5ՏJ<%헵YJ> $VffT`+s`֖egom 3؏Zv'JIH\2n_py6P*+a3?A>ؔ'p[_)ic]c{mq"x u>|xS]>ҵ,4:|P'a;Tn7שjN+mUϧP:M7zYkO H˴ױ7+o k=t7M|֬$f./ZD1t c9kGkS(V(8uM{J[-^lK%լ%.$2?ZP׵ ip=Ŧ|J2AlN%T&r.slבàwGKfWݷ#8\ڽ?wש612 zh:=O $~ǘk-$E8Q1Vgklx~{Qú>Cm<+%Qro繸(X7m^Mmao!>b$+I!I8#Ev6V(ڊ+b*9{<^>'3h.BH~2F<_B|S_oKh",?MY*wr+s*TU5h~*O%md #\CNጞ =ntwAe'ry$QE|6Rtٵ{f")5~~ʟQuˤV6~u (YKim┄|s֊+W:Q}UFP``1.jpgplugins/imagemanager/language/default.php000066600000000047150472426320014574 0ustar00plugins/imagemanager/language/index.php000066600000000047150472426320014257 0ustar00plugins/imagemanager/language/language.php000066600000006317150472426320014741 0ustar00dispatchEvent("onPreInit", array($type)); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch auth event to make authenticators override config options $man->isAuthenticated(); $langPack =& $man->getLangPack(); $groups =& $langPack->getGroups(); // TinyMCE specific format if ($format == "tinymce") { echo "tinyMCE.addToLang('',{\n"; $group = $groups['tinymce']; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});"; } else if ($format == "tinymce_3_x") { echo "tinyMCE.addI18n('" . $langPack->getLanguage() . "',{\n"; $group = $groups['tinymce']; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});"; } else if ($format == "old") { // Normal MC manager format echo "mox.require(['mox.lang.LangPack'], function() {\n"; foreach ($groups as $groupName => $group) { echo "mox.lang.LangPack.add('en', '" . $groupName . "', {\n"; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});\n\n"; } echo "\n});\n\n"; echo "function translatePage() {"; echo "if (mox && mox.lang && mox.lang.LangPack)"; echo "mox.lang.LangPack.translatePage();"; echo "}"; } else { $content = ""; echo "var MCManagerI18n = {\n"; $groupNames = $groupIDs ? explode(',', $groupIDs) : array_keys($groups); foreach ($groupNames as $group) { if (strlen($content) > 0) $content .= ','; $content .= "'" . $group . "':{\n"; $group = $groups[$group]; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) $content .= ","; $content .= "\n"; } $content .= "}"; } echo $content . "};"; } ?>plugins/imagemanager/language/im/fr.xml000066600000015641150472426320014203 0ustar00
        Francis THOMAS (frato@lecentre.net) This is the french language pack for the MCImageManager.
        Moxiecode Gestionnaire d'images Gestionnaire d'images Crer dossier Rafrachir Uploader une image Aide Modifier Supprimer Afficher Insrer Ajouter aux favoris Dossier slectionn Retirer des favoris Chargement... filtrer Ok Oui Non prc. suiv. Rcupration des informations de l'image, patientez... Crer Anuller Valider Enregistrer Action interdite en mode dmonstration. Aucun fichier trouv pour le chemin : {path}. Vous ne disposez pas des droits sur ce dossier/fichier. Vous ne disposez pas des droits en criture sur ce dossier. Le fichier/dossier n'a pas t trouv. Nom de fichier non valide. Impossible de supprimer le favoris de votre liste de favoris. Le template slectionn n'existe pas. Un dossier du mme nom existe dj. Erreur, impossible de crer le dossier. Upload annule, vrifiez les droits en criture sur le dossier. Un fichier du mme nom existe dj. Le fichier que vous essayez de charger est trop volumineux. Suppression impossible. Erreur, recadrage impossible. Erreur, redimensionnement impossible. Rotation impossible. Retournement impossible. Enregistrement impossible. Fichier enregistr. Keepalive request. Fichier(s) supprim(s). Le dossier a t cr. Upload termin. Recadrage termin. Redimensionnement termin. Rotation termine. Retournement termin. Catgories Dossiers Favoris Historique Affichage Type d'affichage Vignette Liste images par page Voulez-vous vraiment supprimer cette image ? Suivant Prcdent Dimensions Voulez-vous vraiment retirer cette image de vos favoris ? Crer dossier Insrez le nom du dossier crer. Template : -- Slection template -- Nom du dossier : Crer dans : Cration du dossier, patientez... Upload Utilisez ce formulaire pour uploader vos fichiers. Extensions valides : Taille maximum : Fichier uploader : Nom de destination : Uploader dans : Uploader Parcourir Upload en cours, patientez... Modification de l'image Sauver image Revenir la dernire sauvegarde Recadrer l'image Redimensionner image Traitement de l'image, patientez... Conserver les proportions g : h : L : H : Enregistrer sous Inverser Rotation Horizontal Vertical Sauvegarde de l'image, patientez... Revenir la dernire sauvegarde ? Chargement... Insrer image
        plugins/imagemanager/language/im/nl.xml000066600000011714150472426320014202 0ustar00
        Duraserve - T. de Roode - tinymce@intrnet.nl This is the Dutch language pack for the MCImageManager.
        Filemanager knop Map aanmaken Verversen Upload een nieuwe afbeelding Fout: Er zijn geen schrijfrechten voor deze map. Fout: U heeft geen rechten om deze actie uit te voeren. Map aanmaken Specificeer de naam voor de aan te maken map Template: -- Selecteer template -- Map naam: Maak in: Maken Annuleren Fout: U moet een map naam opgeven. Fout: U moet een map template selecteren. Fout: De geselecteerde template kan niet worden gevonden. Fout: Deze map naam is niet toegestaan. Fout: Er bestaat reeds een map met deze naam. Uploaden Gebruik het formulier om bestanden te uploaden. Upload in: Toegestane bestandstypen: Maximale upload grootte: Bestand voor uploaden: Als bestandsnaam: Er dient een naam voor het te uploaden bestand te worden gespecificeerd. Uploaden Toevoegen upload Annuleren Fout: Er bestaat reeds een bestand met deze naam. Fout: Het bestand dat u probeert te uploaden is te groot. Verwijderen Moxiecode Image Manager Image Manager Categorie: Map: Breedte: Hoogte: Type: Grootte: Schaal: Weet u zeker dat u dit bestand wilt verwijderen? Er zijn geen afbeeldingen binnen deze map gevonden. Afbeelding bestand BMP afbeelding PNG afbeelding JPEG afbeelding GIF afbeelding TIFF afbeelding Geen schrijfrechten, tijdelijke bestanden kunnen niet worden aangemaakt. Laden van informatie... Afbeelding opslaan Terug naar laatst opgeslagen afbeelding Verander selectie kleur Afbeelding uitsnijden Formaat van afbeelding aanpassen Afbeelding aan het bewerken, een moment geduld... Verfijn proporties l: t: b: h: Gebruik de selectie functie om een gedeelte bij te snijden. U moet een hoogte en breedte specificeren als u het formaat van de afbeelding aan wilt passen. Bestandsnaam: Bekijken Afbeelding bekijken Volgende afbeelding Eerste afbeelding Laatste afbeelding Toetsenbord sneltoets: SPACE,N,RIGHTARROW,PAGE DOWN Toetsenbord sneltoets: P,LEFTARROW,PAGE UP
        plugins/imagemanager/language/im/de.xml000066600000010742150472426320014161 0ustar00
        Moxiecode Systems AB This is the German language pack for the MCImageManager.
        Dateimanager Verzeichnis erstellen Neu laden Datei hochladen Fehler: Keine Schreibrechte fr dieses Verzeichnis. Fehler: Ihre Rechte reichen nicht aus, um diese Aktion durchzufhren. Verzeichnis erstellen Geben Sie einen Name fr das Verzeichnis ein. Vorlage: -- Vorlage whlen -- Verzeichnis: Erstellen in: Erstellen Abbrechen Fehler: Sie mssen einen Namen fr das Verzeichnis angeben. Fehler: Sie mssen eine Vorlage whlen. Fehler: Die gewhlte Vorlage konnte nicht gefunden werden. Fehler: Der angegebene Verzeichnisname ist ungltig. Fehler: Es existiert bereits ein Verzeichnis mit diesem Namen. Hochladen Benutzen Sie das Formular, um neue Dateien hochzuladen. Speichern in: Gltige Dateitypen: Max. Dateigre: Datei: Speichern als: Sie mssen einen Dateinamen angeben. Hochladen Weitere Datei hochladen Abbrechen Fehler: Es existiert bereits eine Datei mit diesem Namen. Fehler: Die Datei ist zu gross. Entfernen Moxiecode Image Manager Image Manager Verzeichnis whlen: Breite: Hhe: Typ: Gre: Skalierung: Diese Datei wirklich lschen? In diesem Verzeichnis sind keine Bilder. Bild BMP Bild PNG Bild JPEG Bild GIF Bild TIFF Bild No write access, temporary files can not be created. Bild speichern Neu laden Rahmenfarbe ndern Bild zurechtschneiden Gre ndern Bild wird bearbeitet, Bitte warten... Proportionen beibehalten l: t: w: h: Use the selection tool to select an area to crop. You must insert a width and height in order to resize the image. Vorschau zurck vor Tastatur Krzel: SPACE,N,RIGHTARROW,PAGE DOWN Tastatur Krzel: P,LEFTARROW,PAGE UP
        plugins/imagemanager/language/im/ja_utf-8.xml000066600000010723150472426320015205 0ustar00
        Moxiecode Systems AB This is the japanese unicode language pack for the MCImageManager.
        ファイル管理に行く フォルダ新規作成 更新 イメージをアップロード エラー:アクセス権利がありません エラー:アクセス権利がありません フォルダ新規作成 フォルダ名を記入してください テンプレート: -- テンプレートを選択 -- フォルダ名: 作成先: 作成 キャンセル エラー:名前を設定していない エラー: フォルダのテンプレートを選択する必要がある エラー: 選択されたテンプレートがない。 エラー:そのフォルダ名が無効 エラー:そのフォルダがすでに存在する アップロード ファイルをアップロードのフォルム アップロード先: 有効拡張形式: 最大のサイズ: アップロードするファイル名: ファイル名: ファイル名が必要 アップロード アップロードを追加 キャンセル エラー:そのファイルがすでに存在する エラー:そのファイルが大きすぎる 取り除く イメージ管理 イメージ管理 フォルダを選択: 幅: 高さ: 種類: サイズ: スケール: 削除しますか? イメージがありません イメージ BMP形式 PNG形式 JPEG形式 GIF形式 TIFF形式 書込み権利がありません イメージを保存 保存したイメージに戻る 選択色を交換 切り抜き イメージサイズ変更 イメージを整備中 縦横比を固定 左: 上: 幅: 高さ: プレビュー ショートカットキー: スペース,N,→,次のページへ ショートカットキー: P,←,前のページへ
        plugins/imagemanager/language/im/ca.xml000066600000024752150472426320014162 0ustar00
        Moxiecode Systems AB Aquest s el paquet d'idioma en catal de MCFileManager.
        Fitxer Executable Fitxer d'Imatge Fitxer Comprimit Fitxer HTML o Script Fitxer de Mitjans Fitxer de so Fitxer Flash Fitxer Powerpoint Fitxer de Document Document d'Office Fitxer Adobe acrobat Fitxer Excel Fitxer de text Fitxer XML Moxiecode File Browser Moxiecode File Browser Nom de Fitxer Mida Data de Modificaci Esteu segurs de voler tallar i moure els Fitxers seleccionats? Esteu segurs de voler copiar els Fitxers seleccionats? Esteu segurs de voler collocar els Fitxers seleccionats del portapapers? Esteu segurs de voler esborrar els Fitxers seleccionats? Esteu segurs de voler descomprimir el Fitxer seleccionat?\n Si el Fitxer comprimit s massa gran, l'acci trigar una estona. Els segents Fitxers han estat esborrats degut a que no sn Fitxers comprimits (zip). Crear Directori Crear Fitxer Actualitzar Pujar un Fitxer nou Descarregar Fitxers seleccionats Propietats de Fitxer/Directori Tallar Fitxers/directoris seleccionats Copiar Fitxers/directoris seleccionats Enganxar Fitxers/directoris seleccionats Esborrar Fitxers/directoris seleccionats Descomprimir el Fitxer seleccionat Comprimir els Fitxers/directoris seleccionats Canviar a ImageManager Directori Directori Arrel Alternar amb Tots Error: El Fitxer/directori {path} ja existeix. Error: No teniu accs a esborrar Fitxers o Directoris. Error: El directori {path} no ha pogut ser esborrat ja que no s buit. Informaci de Fitxer / Directori Informaci de Directori Informaci de Fitxer Data de creaci: Data de Modificaci: Accs: Directori: Subdirectoris: Fitxers: Mida total: Nom: Mida: descripci: Previsualitzar No es pot previsualitzar. Seleccionar Veure Lectura No lectura Escriptura No escriptura Propietats de Fitxer / Directori Propietats de Fitxer / Directori Propietats a: Nom: Guardar Cancellar Error: Un fitxer o directori amb el nom especificat ja existeix. Crear directori Introduu el nom del directori que voleu crear. Plantilla: -- Seleccionar Plantilla -- Nom del Directori: Crear a: Crear Cancellar Error: Cal que especifiqueu un nom. Error: Cal que seleccioneu una plantilla. Error: La plantilla seleccionada no s'ha pogut localitzar. Error: El nom del directori que intenteu crear s invlid.\\ninclou carcters no vlidos com ara: :; Error: El nom del directori especificat ja existeix. Crear document Ompleneu el formulari per crear un nou document a partir de la plantilla. Plantilla: -- Seleccionar Plantilla -- Cal que escrigueu un nom de Fitxer per al nou document. Nom de Fitxer: Crear a: Crear Cancellar Error: Cal que especifiqueu el nom del document. Error: Cal que seleccioneu una plantilla. Error: La plantilla seleccionada no s'ha pogut trobar. Error: El nom del fitxer que intenteu crear no s vlid.\\ninclou carcters no vlids com ara:;. Error: El nom del fitxer ja existeix. Pujar Useu el formulari per pujar fitxers. Pujar a: Extensions vlides: Mida mxima permesa: Fitxer per pujar: Amb nom de fitxer: Cal que escrigueu un nom de fitxer per al fitxer que vulgueu pujar. Pujar Agregar Casella Cancellar Error: El fitxer que intenteu pujar ja existeix. Error: El fitxer que intenteu pujar sobrepassa el lmit de la mida permesa. Treure Resum de fitxer comprimit Resum dels fitxers comprimits seleccionats. Nom del fitxer comprimit: Carpeta actual: Fitxers reescrits: Nom Mida Cmida Existeix Estat Creat Descomprimir Cancellar Enrera Tancar Acceptat Denegat Passat Fallit S No Crear zip Escrigueu el nom del fitxer zip que voleu crear. El fitxer zip ser creat a: Nom: Cal que escrigueu un nom. Crear Cancellar
        plugins/imagemanager/language/im/en.xml000066600000024713150472426320014176 0ustar00
        ctepeo spam@ctepeo.net Русская версия
        Менеджер загрузки и вставки картинок Файловый менеджер Создать папку Обновить Загрузить Помощь Редактировать Удалить Просмотр Вставить Текущая папка Загружаю... Фильтр Ок Да Нет Пред След Загружаю картинки, секундочку... Страница из Добавить в избранное Удалить из избранного Создать Отмена Принять Сохранить This action is restricted in demo mode. Не могу найти картинку: {path}. Не хватает прав доступа к файлу/папке. Запись в папку невозможна Файл/папка не найдены Некорректное имя файла. Отсутствует выбранный шаблон. Папка с выбранным именем уже существует Ошибка создания папки Ошибка загрузки, не достаточно прав Файл с указанным именем уже существует Слишком большой файл Ошибка удаления файла(ов) Ошибка при обрезании фотографии Ошибка при обрезании фотографии Ошибка при вращении картинки Ошибка при переворачивании картинки Ошибка при сохранении Ошибка при удалении из избранного Файл сохранён Поддерживаю соединение... Файл(ы) успешно удалены Папка успешно создана Загрузка прошла успешно. Обрезание фотографии прошло успешно. Изменение размеров фотографии прошло успешно. Вращение фотографии прошло успешно. Переворачивание фотографии прошло успешно. Категории Папки Избранное История Просмотр Режим просмотра: Предпросмотр Текстом картинка/страница Удалить файл? Горячие клавиши: Пробел,N,Стрелка вправо,PAGE DOWN Горячие клавиши: P,Стрелка влево,PAGE UP Измерение Удалить из избранного? Создать папку Введите имя создаваемой папки Шаблон: -- Шаблоны -- Имя папки: Создать в: Создаю папку, секундочку... Загрузка Используйте форму для загрузки файлов Допустимые расширения: Максимальный размер файла: Файл для загрузки: Добавить как: Путь: Загрузить Добавить файл(ы) Загружаю... Файлы уже загружены, хотите отменить загрузку? {files} файлов (размер {size}) ожидают загрузки. {loaded} из {total} загружено на скорости {speed}/сек. Отменить загрузку Добавить ещё? Загрузить на сервер Загрузка отменена Выберите файлы При возникновении ошибок воспользуйтесь {a}классическим загрузчиком{/a}. Удалить Файл Размер Статус Ни одного корректного файла не было выбрано, попробуйте ещё Редактор изображений Сохранить Вернуть Обрезать Изменить размер Обрабатываю фотографию, секундочку... Сохранить пропорцию Слева Сверху Ширина Высота Сохранить как Перевернуть Повернуть Перезагрузить Горизонтально Вертикально Сохраняю картинку, секундочку... Вернуться? Загружаю картинку, секундочку... Точно не хотите сохранить изменения? Вставить картинку Заменить картинку Редактировать картинку Избранное Добавить в избранное Удалить из избранного Удалить из избранного Ошибка при удалении из избранного История
        plugins/imagemanager/language/im/sv.xml000066600000021165150472426320014222 0ustar00
        Moxiecode Systems AB (spam@moxiecode.com) This is the Swedish language pack for the MCImageManager.
        Moxiecode Image Mananger File manager Skapa katalog Uppdatera Ladda upp Hjlp Redigera Radera Visa Vlj Katalog Laddar... Filter Ok Ja Nej Fregende Nsta Tarut bild information, var god vnta... Sida av Lgg till favorit Radera favorit Skapa Avbryt Applicera Spara Denna operation r inte tillten i demostrations lget. Kunde inte hitta filsystem fr: {path}. Inga rttigheter till katalogen/filen. Inga skrivrttigheter till katalogen/filen. Filen/katalogen kunde inte hittas. Filens namn r inte valid. Den valda mallen kunde inte hittas. En katalog med det angivna namnet finns redan. Kunde inte skapa katalog. Kunde inte ladda up fil, kolla s den har skrivaccess. En fil med det angivna namnet finns redan. Filen du frsker ladda upp r fr stor. Kunde inte radera filer/kataloger. Kunde inte beskra bilden. Kunde inte skalaom bilden. Kunde inte rotera bilden. Kunde inte spegelvnda bilden. Kunde inte spara bilden. Kunde inte radera favoriten. Filen blev sparad. Hll vid liv. Rederingen av filerna/katalogerna lyckades. Katalogen har skapats. Uppladdningen r genomfrd. Beskrningen lyckades. Omskalningen lyckades. Rotationen lyckades. Spegelvndingen lyckades. Kategories Kataloger Favoriter Historik Vy Lge: Tumnaglar Text lista bilder per sida r du sker p att du vill radera denna fil/katalog? Tangentbordsgenvgar: SPACE,N,RIGHTARROW,PAGE DOWN Tangentbordsgenvgar: P,LEFTARROW,PAGE UP Dimensioner r du sker p att du vill radera denna favorit? Skapa katalog Fyll i namnet p katalogen du vill skapa. Mall: -- Vlj mall -- Katalogens namn: Skapa i: Skapar katalog, var god vnta... Ladda upp Vlj filer att ladda upp nedan. Godknnda filndelser: Max storlek: Fill att ladda upp: Filnamn: Skvg: Ladda upp Lgg till fil(er) Laddar upp fil, var god vnta... Filer hller p att laddas upp, r du sker p att du vill avbryta? Du har {files} filer (totalt {size}) som vntar p att f bli uppladdade. {loaded} av {total} uppladdade med hastigheten {speed}/s. Avbryt uppladdning Lgg till fler? Ladda upp till servern Upladdningen avbruten Vlj filer Om du har problem att ladda upp kan du alltid anvnda den {a}enkla upladdaren{/a}. Radera Fil Storlek Status Du mste vlja ngra korrekta filer. Bildredigeraren Spara terg Beskr Skalaom Bearbetar bild, var god vnta... Behll proportioner Vnster Toppen Bredd Hjd Spara som Spegelvnd Rotera Ladda om Horizontell Vertical Sparar bild, vad god vnta... r du sker p att du vill tergr till den senast sparade bild versionen? Laddar bilden, var god vnta... r du sker p att du inte vill spara frndringarna du gjorde p bilden? Infoga bild Byt bild Redigera bild Favoriter Lgg till favorit(er) Radera favorit r du sker p att du vill radera favoriten? Raderingen av favoriten misslyckades.. Historik
        plugins/imagemanager/language/im/nb.xml000066600000015330150472426320014166 0ustar00
        Knut B. Jacobsen (knut.jacobsen@gmail.com) +47 900 80 241 This is the Norwegian (bokml) language pack for the MCImageManager.
        Moxiecode Image Mananger Fil utforsker Opprett mappe. Oppfrisk Opplasting Hjelp Editer Slett Vis Innsett Legg til favoritter Velg mappe. Fjern favoritt Laster... Filter Ok Ja Nei Forrige Neste Henter bildedata, vent... Opprett Kanseller Utfr Lagre Denne handlingen er avgrenset i demo. modus. Filsystem ikke funnet for bane: {path}. Ingen tilgang til denne fil/mappe. Mappen har ikke skrive tillatelse. Fil/mappe ikke funnet. Filnavn ikke gyldig. Kunne ikke fjerne favoritten fra favorittlisten din. Valgt template mangler. Mappe med valgt navn finnes allerede. Feil: Kunne ikke opprette mappe. Opplasting feilet, sjekk mappens skrive tillatelser. Fil med oppgitt navn finnes allerede. Filen du prver laste opp er for stor. Kunne ikke slette fil(er). Kunne ikke beskjre bildet. Kunne ikke endre strrelsen p bildet. Rotering var ikke vellykket. Vend var ikke vellykket. Lagring var ikke vellykket. Fil er lagret OK. Keepalive foresprsel. Fil(er) er slettet OK. Mappe er opprettet OK. Opplastet OK. Beskjr vellykket. Skaler vellykket. Rotering vellykket. Vend vellykket. Kategorier Mapper Favoritter Histore Vis Vis modus: Thumbnails Tekstliste bilder/side Er det sikkert at du vil fjerne filen? Tastatur snarvei: SPACE,N,RIGHTARROW,PAGE DOWN Tastatur snarvei: P,LEFTARROW,PAGE UP Dimensjoner Er det sikkert at du vil fjerne dette fra din favorittliste? Opprett mappe. Gi inn navn p mappen du nsker opprette. Template: -- Velg template -- Mappe navn: Opprett i: Oppretter mappe, vent... Opplasting Bruk formular for opplasting av filer. Gyldige filtyper: Max opplastings strrelse: Fil til opplasting: Som filnavn: Bane: Last opp Legg til fil(er) Moxiecode ImageManager Editor Lagre Angre Beskjr Skaler Bearbeider bilde, vent... Behold proporsjoner Venstre Topp Bredde Hyde Lagre som Vend Roter Oppfrisk Horisontalt Vertikalt Lagrer bilde, vent... Er det sikkert at du vil reversere til sist lagrede bilde? Laster bilde, vent... Innsett bilde
        plugins/imagemanager/language/im/nn.xml000066600000015331150472426320014203 0ustar00
        Knut B. Jacobsen (knut.jacobsen@gmail.com) +47 900 80 241 This is the Norwegian (nynorsk) language pack for the MCImageManager.
        Moxiecode Image Mananger Fil utforsker Opprett mappe. Oppfrisk Opplasting Hjelp Editer Slett Vis Innsett Legg til favoritter Velg mappe. Fjern favoritt Laster... Filter Ok Ja Nei Forrige Neste Henter bildedata, vent... Opprett Kanseller Utfr Lagre Denne handlingen er avgrenset i demo. modus. Filsystem ikke funnet for bane: {path}. Ingen tilgang til denne fil/mappe. Mappen har ikke skrive tillatelse. Fil/mappe ikke funnet. Filnavn ikke gyldig. Kunne ikke fjerne favoritten fra favorittlisten din. Valgt template mangler. Mappe med valgt navn finnes allerede. Feil: Kunne ikke opprette mappe. Opplasting feilet, sjekk mappens skrive tillatelser. Fil med oppgitt navn finnes allerede. Filen du prver laste opp er for stor. Kunne ikke slette fil(er). Kunne ikke beskjre bildet. Kunne ikke endre strrelsen p bildet. Rotering var ikke vellykket. Vend var ikke vellykket. Lagring var ikke vellykket. Fil er lagret OK. Keepalive foresprsel. Fil(er) er slettet OK. Mappe er opprettet OK. Opplastet OK. Beskjr vellykket. Skaler vellykket. Rotering vellykket. Vend vellykket. Kategorier Mapper Favoritter Histore Vis Vis modus: Thumbnails Tekstliste bilder/side Er det sikkert at du vil fjerne filen? Tastatur snarvei: SPACE,N,RIGHTARROW,PAGE DOWN Tastatur snarvei: P,LEFTARROW,PAGE UP Dimensjoner Er det sikkert at du vil fjerne dette fra din favorittliste? Opprett mappe. Gi inn navn p mappen du nsker opprette. Template: -- Velg template -- Mappe navn: Opprett i: Oppretter mappe, vent... Opplasting Bruk formular for opplasting av filer. Gyldige filtyper: Max opplastings strrelse: Fil til opplasting: Som filnavn: Bane: Last opp Legg til fil(er) Moxiecode ImageManager Editor Lagre Angre Beskjr Skaler Bearbeider bilde, vent... Behold proporsjoner Venstre Topp Bredde Hyde Lagre som Vend Roter Oppfrisk Horisontalt Vertikalt Lagrer bilde, vent... Er det sikkert at du vil reversere til sist lagrede bilde? Laster bilde, vent... Innsett bilde
        plugins/imagemanager/index.php000066600000002741150472426320012477 0ustar00dispatchEvent("onPreInit", array($type)); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once($path); $config = $man->getConfig(); $suffix = ""; if ($domain) $suffix .= "?domain=" . $domain; // Dispatch onInit event if ($man->isAuthenticated()) { $man->dispatchEvent("onInit"); header("Location: pages/". $config["general.theme"] ."/" . $page . $suffix); die(); } else { $_SESSION['isLoggedIn'] = true; $_SESSION['user'] = $_POST['login']; $man->dispatchEvent("onInit"); header("Location: pages/". $config["general.theme"] ."/" . $page . $suffix); die(); } ?>plugins/imagemanager/stream/default.php000066600000000045150472426320014302 0ustar00plugins/imagemanager/stream/index.php000066600000000045150472426320013765 0ustar00plugins/imagemanager/stream/stream.php000066600000007706150472426320014164 0ustar00load('../pages/' . $theme . '/resources.xml'); if ($type) { $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $config = $man->getConfig(); // Load plugin resources $plugins = explode(',', $config["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); } $file = $resources->getFile($package, $file); header('Content-type: ' . $file->getContentType()); readfile($file->getPath()); die(); } if ($cmd == "") die("No command."); $chunks = explode('.', $cmd); $type = $chunks[0]; $method = $cmd = $chunks[1]; // Clean up type, only a-z stuff. $type = preg_replace("/[^a-z]/i", "", $type); if ($type == "") die("No type set."); // Include Base and Core and Config. $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $config = $man->getConfig(); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch onAuthenticate event if ($man->isAuthenticated()) { if ($_SERVER["REQUEST_METHOD"] == "GET") { $args = $_GET; // Dispatch event before starting to stream $man->dispatchEvent("onBeforeStream", array($cmd, &$args)); // Check command, do command, stream file. $man->dispatchEvent("onStream", array($cmd, &$args)); // Dispatch event after stream $man->dispatchEvent("onAfterStream", array($cmd, &$args)); } else if ($_SERVER["REQUEST_METHOD"] == "POST") { $args = array_merge($_POST, $_GET); $json = new Moxiecode_JSON(); // Dispatch event before starting to stream $man->dispatchEvent("onBeforeUpload", array($cmd, &$args)); // Check command, do command, stream file. $result = $man->executeEvent("onUpload", array($cmd, &$args)); $data = $result->toArray(); if (isset($args["chunk"])) { // Output JSON response to multiuploader die('{method:\'' . $method . '\',result:' . $json->encode($data) . ',error:null,id:\'m0\'}'); } else { // Output JSON function echo ''; } // Dispatch event after stream $man->dispatchEvent("onAfterUpload", array($cmd, &$args)); } } else { if (isset($_GET["format"]) && ($_GET["format"] == "flash")) header("HTTP/1.1 405 Method Not Allowed"); die('{"result":{login_url:"' . addslashes($config["authenticator.login_page"]) . '"},"id":null,"error":{"errstr":"Access denied by authenicator.","errfile":"","errline":null,"errcontext":"","level":"AUTH"}}'); } ?>plugins/imagemanager/editor_plugin_src.js000066600000035162150472426320014733 0ustar00/** * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2007, Moxiecode Systems AB, All rights reserved. */ (function() { window.mcImageManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'image,media' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; i'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinymce.DOM.encode(v); } } )); } }, v)); }); }, getInfo : function() { return mcImageManagerPlugin.getInfo(); }, createControl: function(n, cm) { var t = this, c, ed = t.editor, v; switch (n) { case 'insertimage': v = ed.getParam('imagemanager_insert_template'); if (v instanceof Array) { c = cm.createMenuButton('insertimage', { title : 'imagemanager_insertimage_desc', image : t.url + '/pages/im/img/insertimage.gif', icons : false }); c.onRenderMenu.add(function(c, m) { tinymce.each(v, function(v) { m.add({title : v.title, onclick : function() { ed.execCommand('mceInsertImage', false, v); }}); }); }); } else { c = cm.createButton('insertimage', { title : 'imagemanager_insertimage_desc', image : t.url + '/pages/im/img/insertimage.gif', onclick : function() { ed.execCommand('mceInsertImage', false, {template : v}); } }); } return c; } return null; } }); tinymce.PluginManager.add('imagemanager', tinymce.plugins.ImageManagerPlugin); tinymce.ScriptLoader.load((tinymce.PluginManager.urls['imagemanager'] || tinymce.baseURL + '/plugins/imagemanager')+ '/language/index.php?type=im&format=tinymce_3_x&group=tinymce&prefix=imagemanager_'); } // Setup TinyMCE 2.x plugin if (window.TinyMCE_Engine) { var TinyMCE_ImageManagerPlugin = { setup : function() { var b = (window.realTinyMCE || tinyMCE).baseURL; mcImageManager.baseURL = b + '/plugins/imagemanager/js'; document.write(''); }, initInstance : function(ed) { ed.settings.file_browser_callback = 'mcImageManager.filebrowserCallBack'; mcImageManager.settings.handle = tinyMCE.getParam('imagemanager_handle', mcImageManager.settings.handle); }, getControlHTML : function(cn) { switch (cn) { case "insertimage": return tinyMCE.getButtonHTML(cn, 'lang_imagemanager_insertimage_desc', '{$pluginurl}/pages/im/img/insertimage.gif', 'mceInsertImage', false); } return ""; }, getInfo : function() { return mcImageManagerPlugin.getInfo(); }, execCommand : function(id, el, cmd, ui, v) { var ed = tinyMCE.getInstanceById(id); if (cmd == 'mceInsertImage') { mcImageManager.browse(tinyMCE.extend({ path : tinyMCE.getParam("imagemanager_path"), rootpath : tinyMCE.getParam("imagemanager_rootpath"), remember_last_path : tinyMCE.getParam("imagemanager_remember_last_path"), custom_data : tinyMCE.getParam("imagemanager_custom_data"), insert_filter : tinyMCE.getParam("imagemanager_insert_filter"), oninsert : function(o) { var ci = o.focusedFile.custom; if (!ci.thumbnail_url) { ci.thumbnail_url = url; ci.twidth = ci.width; ci.theight = ci.height; } ed.execCommand('mceInsertContent', false, mcImageManagerPlugin.replace( tinyMCE.getParam('imagemanager_insert_template', ''), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinyMCE.xmlEncode(v); } } )); } }, v)); return true; } return false; } }; TinyMCE_ImageManagerPlugin.setup(); tinyMCE.addPlugin('imagemanager', TinyMCE_ImageManagerPlugin); } })(); plugins/imagemanager/config.php000066600000020776150472426320012645 0ustar00plugins/imagemanager/includes/general.php000066600000010474150472426320014615 0ustar00 $value) $newarray[formatParam($name, $sanitize)] = formatParam($value, $sanitize); return $newarray; } return formatParam($httpRequestInput[$name], $sanitize); } function formatParam($str, $sanitize = false) { if ($sanitize) $str = preg_replace("/[^0-9a-z\-_,]+/i", "", $str); if (ini_get("magic_quotes_gpc")) $str = stripslashes($str); return $str; } function getClassName($obj) { return strtolower(get_class($obj)); } /** * Check if a value is true/false. * * @param string $str True/False value. * @return bool true/false */ function checkBool($str, $def = false) { if ($str === true) return true; if ($str === false) return false; $str = strtolower($str); if ($str == "true") return true; return $def; } /** * Returns a file extention from a path. * * @param string $path Path to grab extention from. * @return string File extention. */ function getFileExt($path) { $ar = explode('.', $path); return strtolower(array_pop($ar)); } /** * Returns the mime type of an path by resolving it agains a apache style "mime.types" file. * * @param String $path path to Map/get content type by * @patam String $mime_File Absolute filepath to mime.types style file. * @return String mime type of path or an empty string on failue. */ function mapMimeTypeFromUrl($path, $mime_file) { if (($fp = fopen($mime_file, "r"))) { $ar = explode('.', $path); $ext = strtolower(array_pop($ar)); while (!feof ($fp)) { $line = fgets($fp, 4096); $chunks = preg_split("/(\t+)|( +)/", $line); for ($i=1; $igetLogger(); if (!$mcLogger) { $mcLogger = new Moxiecode_Logger(); // Set logger options $mcLogger->setPath(dirname(__FILE__) . "/../logs"); $mcLogger->setMaxSize("100kb"); $mcLogger->setMaxFiles("10"); $mcLogger->setFormat("{time} - {message}"); } return $mcLogger; } function debug($msg) { $args = func_get_args(); $log =& getLogger(); $log->debug(implode(', ', $args)); } function info($msg) { $args = func_get_args(); $log =& getLogger(); $log->info(implode(', ', $args)); } function error($msg) { $args = func_get_args(); $log =& getLogger(); $log->error(implode(', ', $args)); } function warn($msg) { $args = func_get_args(); $log =& getLogger(); $log->warn(implode(', ', $args)); } function fatal($msg) { $args = func_get_args(); $log =& getLogger(); $log->fatal(implode(', ', $args)); } ?>plugins/imagemanager/classes/ManagerPlugin.php000066600000020410150472426320015547 0ustar00plugins/imagemanager/classes/Authenticators/IPAuthenticator.php000066600000002303150472426320021057 0ustar00getConfig(); $ipNums = split(',', $config['IPAuthenticator.ip_numbers']); $currentIP = $this->_ip2int($_SERVER["REMOTE_ADDR"]); foreach ($ipNums as $ip) { $ipRange = split('-', $ip); if (count($ipRange) == 1 && $this->_ip2int($ipRange[0]) == $currentIP) return true; if (count($ipRange) == 2 && $currentIP >= $this->_ip2int($ipRange[0]) && $currentIP <= $this->_ip2int($ipRange[1])) return true; } return false; } function _ip2int($addr) { $ips = split("\.", $addr); return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256); } } // Add plugin to MCManager $man->registerPlugin("IPAuthenticator", new Moxiecode_IPAuthenticator()); ?>plugins/imagemanager/classes/Authenticators/BaseAuthenticator.php000066600000001215150472426320021422 0ustar00registerPlugin("BaseAuthenticator", new Moxiecode_BaseAuthenticator()); ?>plugins/imagemanager/classes/Authenticators/SessionAuthenticator.php000066600000005301150472426320022173 0ustar00getConfig(); // Support both old and new format $loggedInKey = isset($config['SessionAuthenticator.logged_in_key']) ? $config['SessionAuthenticator.logged_in_key'] : $config["authenticator.session.logged_in_key"]; $userKey = isset($config['SessionAuthenticator.user_key']) ? $config['SessionAuthenticator.user_key'] : $config["authenticator.session.user_key"]; $pathKey = isset($config['SessionAuthenticator.path_key']) ? $config['SessionAuthenticator.path_key'] : $config["authenticator.session.path_key"]; $rootPathKey = isset($config['SessionAuthenticator.rootpath_key']) ? $config['SessionAuthenticator.rootpath_key'] : $config["authenticator.session.rootpath_key"]; $configPrefix = (isset($config['SessionAuthenticator.config_prefix']) ? $config['SessionAuthenticator.config_prefix'] : "mcmanager") . "."; // Switch path if (isset($_SESSION[$pathKey])) $config['filesystem.path'] = $_SESSION[$pathKey]; // Switch root if (isset($_SESSION[$rootPathKey])) $config['filesystem.rootpath'] = $_SESSION[$rootPathKey]; $user = isset($_SESSION[$userKey]) ? $_SESSION[$userKey] : ""; $user = preg_replace('/[\\\\\\/:]/i', '', $user); // Override by prefix foreach ($_SESSION as $key => $value) { if (strpos($key, $configPrefix) === 0) $config[substr($key, strlen($configPrefix))] = $value; } foreach ($config as $key => $value) { // Skip replaceing {$user} in true/false stuff if ($value === true || $value === false) continue; $value = str_replace('${user}', $user, $value); $config[$key] = $value; } return isset($_SESSION[$loggedInKey]) && checkBool($_SESSION[$loggedInKey]); } } // Add plugin to MCManager $man->registerPlugin("SessionAuthenticator", new Moxiecode_SessionAuthenticator()); ?>plugins/imagemanager/classes/ImageManager/ImageManagerPlugin.php000066600000103001150472426320021025 0ustar00setConfig($mcImageManagerConfig, false); $man->setLangPackPath("im"); return false; } return true; } /** * Gets executed when a RPC command is to be executed. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { switch ($cmd) { case "getMediaInfo": return $this->_getMediaInfo($man, $input); case "resizeImage": $result = new Moxiecode_ResultSet("status,file,message"); $file = $man->getFile($input["path"]); /* if ($man->verifyFile($file, "edit") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result->toArray(); }*/ $filedata = array(); $filedata["path"] = $man->encryptPath($file->getAbsolutePath()); $filedata["width"] = isset($input["width"]) ? $input["width"] : 0; $filedata["height"] = isset($input["height"]) ? $input["height"] : 0; $filedata["target"] = isset($input["target"]) ? $input["target"] : ""; $filedata["temp"] = isset($input["temp"]) ? $input["temp"] : ""; $this->_resizeImage($man, $file, $filedata, $result); return $result->toArray(); case "cropImage": $result = new Moxiecode_ResultSet("status,file,message"); $file = $man->getFile($input["path"]); /* if ($man->verifyFile($file, "edit") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result->toArray(); }*/ $filedata = array(); $filedata["path"] = $man->encryptPath($file->getAbsolutePath()); $filedata["width"] = $input["width"]; $filedata["height"] = $input["height"]; $filedata["top"] = $input["top"]; $filedata["left"] = $input["left"]; $filedata["target"] = isset($input["target"]) ? $input["target"] : ""; $filedata["temp"] = isset($input["temp"]) ? $input["temp"] : ""; $this->_cropImage($man, $file, $filedata, $result); return $result->toArray(); case "rotateImage": $result = new Moxiecode_ResultSet("status,file,message"); $file = $man->getFile($input["path"]); /* if ($man->verifyFile($file, "edit") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result->toArray(); }*/ $filedata = array(); $filedata["path"] = $file->getAbsolutePath(); $filedata["angle"] = $input["angle"]; $filedata["target"] = isset($input["target"]) ? $input["target"] : ""; $filedata["temp"] = isset($input["temp"]) ? $input["temp"] : ""; $this->_rotateImage($man, $file, $filedata, $result); return $result->toArray(); case "flipImage": $result = new Moxiecode_ResultSet("status,file,message"); $file = $man->getFile($input["path"]); /* if ($man->verifyFile($file, "edit") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result->toArray(); }*/ $filedata = array(); $filedata["path"] = $file->getAbsolutePath(); $filedata["vertical"] = isset($input["vertical"]) ? $input["vertical"] : false; $filedata["horizontal"] = isset($input["horizontal"]) ? $input["horizontal"] : false; $filedata["target"] = isset($input["target"]) ? $input["target"] : ""; $filedata["temp"] = isset($input["temp"]) ? $input["temp"] : ""; $this->_flipImage($man, $file, $filedata, $result); return $result->toArray(); case "saveImage": $config = $man->getConfig(); $result = new Moxiecode_ResultSet("status,file,message"); $file = $man->getFile($input["path"]); if (checkBool($config["general.demo"])) { $result->add("FAILED", $man->encryptPath($input["target"]), "{#error.demo}"); $this->_cleanUp($man, $file->getParent()); return $result->toArray(); } /*if ($man->verifyFile($file, "edit") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); $this->_cleanUp($man, $file->getParent()); return $result->toArray(); }*/ $filedata = array(); $filedata["path"] = $file->getAbsolutePath(); if (isset($input["target"]) && $input["target"] != "") { $targetFile = $man->getFile(utf8_encode($file->getParent()), $input["target"]); $filedata["target"] = utf8_encode($targetFile->getAbsolutePath()); } $this->_saveImage($man, $file, $filedata, $result); $this->_cleanUp($man, $file->getParent()); return $result->toArray(); } return null; } /** * Gets called when data is streamed to client. This method should setup * HTTP headers, content type etc and simply send out the binary data to the client and the return false * ones that is done. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onStream(&$man, $cmd, $input) { switch ($cmd) { case "thumb": return $this->_streamThumb($man, $input); } return null; } /** * Gets called before a file action occurs for example before a rename or copy. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param BaseFile $file1 File object 1 for example from in a copy operation. * @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeFileAction(&$man, $action, $file1, $file2) { if ($action == DELETE_ACTION) { // Delete format images $config = $file1->getConfig(); if (checkBool($config['filesystem.delete_format_images'])) { $imageutils = new $config['thumbnail']; $imageutils->deleteFormatImages($file1->getAbsolutePath(), $config["upload.format"]); $imageutils->deleteFormatImages($file1->getAbsolutePath(), $config["edit.format"]); } } return true; } /** * Gets called after a file action was perforem for example after a rename or copy. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param string $file1 File object 1 for example from in a copy operation. * @param string $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onFileAction(&$man, $action, $file1, $file2) { switch ($action) { case ADD_ACTION: $config = $file1->getConfig(); if ($config["upload.format"]) { $imageutils = new $config['thumbnail']; $imageutils->formatImage($file1->getAbsolutePath(), $config["upload.format"], $config['upload.autoresize_jpeg_quality']); } if (checkBool($config["upload.create_thumbnail"])) $thumbnail = $this->_createThumb($man, $file1); if (checkBool($config['upload.autoresize'])) { $ext = getFileExt($file1->getName()); if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png'))) return true; $imageInfo = @getimagesize($file1->getAbsolutePath()); $fileWidth = $imageInfo[0]; $fileHeight = $imageInfo[1]; $imageutils = new $config['thumbnail']; $percentage = min($config['upload.max_width'] / $fileWidth, $config['upload.max_height'] / $fileHeight); if ($percentage <= 1) $result = $imageutils->resizeImage($file1->getAbsolutePath(), $file1->getAbsolutePath(), round($fileWidth * $percentage), round($fileHeight * $percentage), $ext, $config['upload.autoresize_jpeg_quality']); } break; case DELETE_ACTION: $config = $file1->getConfig(); if ($config['thumbnail.delete'] == true) { $thumbnailFolder = $man->getFile(dirname($file1->getAbsolutePath()) ."/". $config['thumbnail.folder']); $thumbnailPath = $thumbnailFolder->getAbsolutePath() . "/" . $config['thumbnail.prefix'] . basename($file1->getAbsolutePath()); $thumbnail = $man->getFile($thumbnailPath); if ($thumbnail->exists()) $thumbnail->delete(); // Check if thumbnail directory should be deleted if ($thumbnailFolder->exists()) { $files = $thumbnailFolder->listFiles(); if (count($files) == 0) $thumbnailFolder->delete(); } } break; } return true; // Pass to next plugin } /** * Gets called when custom data is to be added for a file custom data can for example be * plugin specific name value items that should get added into a file listning. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param BaseFile $file File reference to add custom info/data to. * @param string $type Where is the info needed for example list or info. * @param Array $custom Name/Value array to add custom items to. * @return bool true/false if the execution of the event chain should continue. */ function onCustomInfo(&$man, &$file, $type, &$input) { // Is file and image $config = $file->getConfig(); $input["editable"] = false; if ($file->isFile() && ($type == "list" || $type == "insert" || $type == "info")) { // Should we get config on each file here? //$config = $file->getConfig(); $ext = getFileExt($file->getName()); if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png', 'bmp'))) return true; $imageutils = new $config['thumbnail']; $canEdit = $imageutils->canEdit($ext); $imageInfo = @getimagesize($file->getAbsolutePath()); $fileWidth = $imageInfo[0]; $fileHeight = $imageInfo[1]; $targetWidth = $config['thumbnail.width']; $targetHeight = $config['thumbnail.height']; // Check thumnail size if ($config['thumbnail.scale_mode'] == "percentage") { $percentage = min($config['thumbnail.width'] / $fileWidth, $config['thumbnail.height'] / $fileHeight); if ($percentage <= 1) { $targetWidth = round($fileWidth * $percentage); $targetHeight = round($fileHeight * $percentage); } else { $targetWidth = $fileWidth; $targetHeight = $fileHeight; } } $input["thumbnail"] = true; // Check against config. if (($config["thumbnail.max_width"] != "" && $fileWidth > $config["thumbnail.max_width"]) || ($config["thumbnail.max_height"] != "" && $fileHeight > $config["thumbnail.max_height"])) $input["thumbnail"] = false; else { $input["twidth"] = $targetWidth; $input["theight"] = $targetHeight; } // Get thumbnail URL if ($type == "insert") { $thumbFile = $man->getFile($file->getParent() . "/" . $config['thumbnail.folder'] . "/" . $config['thumbnail.prefix'] . $file->getName()); if ($thumbFile->exists()) $input["thumbnail_url"] = $man->convertPathToURI($thumbFile->getAbsolutePath(), $config['preview.wwwroot']); } $input["width"] = $fileWidth; $input["height"] = $fileHeight; $input["editable"] = $canEdit; } return true; } // * * * * * * * Private methods /** * SaveImage * TODO: Check for PX or % */ function _saveImage(&$man, &$file, &$filedata, &$result) { $config =& $file->getConfig(); // Find out if we have a temp file. $ext = getFileExt($file->getName()); if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } // To file to save if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); return; } if (strpos($file->getName(), "mcic_") !== 0) $tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext; else $tmpImage = $file->getName(); $tempFile =& $man->getFile(utf8_encode(dirname($file->getAbsolutePath()) . "/" . $tmpImage)); $tempFile->setTriggerEvents(false); /* Failed when mcic_ was found due to exclude in filesystem conf if ($man->verifyFile($tempFile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($tempFile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } */ // NOTE: add check for R/W if ($tempFile->exists()) { if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); // Delete format images $config = $targetfile->getConfig(); $imageutils = new $config['thumbnail']; $imageutils->deleteFormatImages($targetfile->getAbsolutePath(), $config["upload.format"]); // Just ignore it if it's the same file if ($tempFile->getAbsolutePath() != $targetfile->getAbsolutePath()) { if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } if ($targetfile->exists()) $targetfile->delete(); $tempFile->renameTo($targetfile); $targetfile->importFile(); // Reformat if ($config["edit.format"]) { $imageutils = new $config['thumbnail']; $imageutils->formatImage($targetfile->getAbsolutePath(), $config["edit.format"], $config['edit.jpeg_quality']); } } $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.save_success}"); } else { $file->delete(); $tempFile->renameTo($file); $file->importFile(); $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.save_success}"); } } else { if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); // Just ignore it if it's the same file if ($file->getAbsolutePath() != $targetfile->getAbsolutePath()) { if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } if ($targetfile->exists()) $targetfile->delete(); $file->copyTo($targetfile); $targetfile->importFile(); } $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.save_success}"); } else { // No temp, no target, abort! $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.save_failed}"); } } } /** * CropImage * TODO: Check for PX or % */ function _cropImage(&$man, &$file, &$filedata, &$result) { $ext = getFileExt($file->getName()); $config = $file->getConfig(); $imageutils = new $config['thumbnail']; if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } // To file to crop if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); return; } if ($filedata["temp"]) { if (strpos($file->getName(), "mcic_") !== 0) $tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext; else $tmpImage = $file->getName(); $tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage); $tempFile->setTriggerEvents(false); $status = $imageutils->cropImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $filedata["top"], $filedata["left"], $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]); if ($status) { $tempFile->importFile(); $result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.crop_success}"); } else { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.crop_failed}"); } } else { if (checkBool($config["general.demo"])) { $result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); if ($targetfile->isDirectory()) { $targetfile = $man->getFile($man->addTrailingSlash($targetfile->getAbsolutePath()) . $file->getName()); } if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } } else $targetfile = $file; $status = $imageutils->cropImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $filedata["top"], $filedata["left"], $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]); if ($status) { $targetfile->importFile(); $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.crop_success}"); } else { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.no_access}"); } } } /** * ResizeImage */ function _resizeImage(&$man, &$file, &$filedata, &$result) { $ext = getFileExt($file->getName()); $config = $file->getConfig(); $imageutils = new $config['thumbnail']; if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } // To file to resize if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); return; } if ($filedata["temp"]) { if (strpos($file->getName(), "mcic_") !== 0) $tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext; else $tmpImage = $file->getName(); $tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage); $tempFile->setTriggerEvents(false); $status = $imageutils->resizeImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]); if ($status) { $tempFile->importFile(); $result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.resize_success}"); } else { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.resize_failed}"); } } else { if (checkBool($config["general.demo"])) { $result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); if ($targetfile->isDirectory()) { $targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName()); } if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } } else $targetfile = $file; $status = $imageutils->resizeImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $filedata["width"], $filedata["height"], $ext, $config["edit.jpeg_quality"]); if ($status) { $targetfile->importFile(); $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.resize_success}"); } else { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.resize_failed}"); } } } /** * RotateImage */ function _rotateImage(&$man, &$file, &$filedata, &$result) { $ext = getFileExt($file->getName()); $config = $file->getConfig(); $imageutils = new $config['thumbnail']; if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } // To file to rotate if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); return; } if ($filedata["temp"]) { if (strpos($file->getName(), "mcic_") !== 0) $tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext; else $tmpImage = $file->getName(); $tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage); $tempFile->setTriggerEvents(false); $status = $imageutils->rotateImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $ext, $filedata["angle"], $config["edit.jpeg_quality"]); if ($status) { $tempFile->importFile(); $result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.rotate_success}"); } else { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.rotate_failed}"); } } else { if (checkBool($config["general.demo"])) { $result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); if ($targetfile->isDirectory()) { $targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName()); } if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } } else $targetfile = $file; $status = $imageutils->rotateImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $ext, $filedata["angle"], $config["edit.jpeg_quality"]); if ($status) { $targetfile->importFile(); $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.rotate_success}"); } else { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.rotate_failed}"); } } } /** * FlipImage */ function _flipImage(&$man, &$file, &$filedata, &$result) { $ext = getFileExt($file->getName()); $config = $file->getConfig(); $imageutils = new $config['thumbnail']; if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } // To file to flip if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); return; } if ($filedata["temp"]) { if (strpos($file->getName(), "mcic_") !== 0) $tmpImage = "mcic_". md5(session_id() . $file->getName()) . "." . $ext; else $tmpImage = $file->getName(); $tempFile =& $man->getFile(dirname($file->getAbsolutePath()) . "/" . $tmpImage); $tempFile->setTriggerEvents(false); $status = $imageutils->flipImage($file->getAbsolutePath(), $tempFile->getAbsolutePath(), $ext, $filedata["vertical"], $filedata["horizontal"]); if ($status) { $tempFile->importFile(); $result->add("OK", $man->encryptPath($tempFile->getAbsolutePath()), "{#message.flip_success}"); } else { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.flip_failed}"); } } else { if (checkBool($config["general.demo"])) { $result->add("FAILED", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if ($filedata["target"] != "") { $targetfile = $man->getFile($filedata["target"]); if ($targetfile->isDirectory()) { $targetfile = $man->addTrailingSlash($man->getFile($targetfile->getAbsolutePath()) . $file->getName()); } if ($man->verifyFile($targetfile, "edit") < 0) { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), $man->getInvalidFileMsg()); return; } } else $targetfile = $file; $status = $imageutils->flipImage($file->getAbsolutePath(), $targetfile->getAbsolutePath(), $ext, $filedata["vertical"], $filedata["horizontal"], $config["edit.jpeg_quality"]); if ($status) { $targetfile->importFile(); $result->add("OK", $man->encryptPath($targetfile->getAbsolutePath()), "{#message.flip_success}"); } else { $result->add("FAILED", $man->encryptPath($targetfile->getAbsolutePath()), "{#error.flip_failed}"); } } } /** * Clean up temp files, input is dir path. */ function _cleanUp(&$man, $path) { $filedir =& $man->getFile($path); $config = $filedir->getConfig(); if ($man->verifyFile($filedir, "edit") < 0) return; // If we can't access this dir, we just return. if (!$filedir->canWrite()) return; // Delete old files $files = $filedir->listFiles(); foreach ($files as $file) { if (strpos($file->getName(), "mcic_") === 0 && time() - $file->getLastModified() > 3600) { $file->setTriggerEvents(false); $file->delete(); } } } /** * Lists file. */ function _getMediaInfo(&$man, $input) { // Convert URL to path if (isset($input["url"])) { $url = parse_url($input["url"]); $input["path"] = $man->resolveURI($url["path"]); if (!$man->verifyPath($input["path"])) trigger_error(sprintf("Could not resolve URL: %s to a filesystem path. Could be that the image is outside the configured filesystem.rootpath.", $input["url"]), FATAL); } $file =& $man->getFile($input["path"]); $config = $file->getConfig(); $parent =& $file->getParentFile(); $files = array(); if ($parent->isDirectory()) { // Setup file filter $fileFilter = new Moxiecode_BasicFileFilter(); //$fileFilter->setDebugMode(true); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); $fileFilter->setOnlyFiles(true); // List files $files =& $parent->listFilesFiltered($fileFilter); } $match = false; $prev = ""; $next = ""; foreach($files as $curfile) { if ($curfile->getAbsolutePath() == $file->getAbsolutePath()) { $match = true; continue; } else if (!$match) $prev = $curfile->getAbsolutePath(); if ($match) { $next = $curfile->getAbsolutePath(); break; } } $ext = getFileExt($file->getName()); // Input default size? $width = "425"; $height = "350"; // All types that getimagesize support $imagearray = array('gif', 'jpg', 'png', 'swf', 'psd', 'bmp', 'tiff', 'jpc', 'jp2', 'jpx', 'jb2', 'swc', 'iff', 'wbmp', 'xbm'); if (in_array($ext, $imagearray)) { $sizeinfo = @getimagesize($file->getAbsolutePath()); if ($sizeinfo) { $width = $sizeinfo[0]; $height = $sizeinfo[1]; } } $result = new Moxiecode_ResultSet("name,path,url,size,type,created,modified,width,height,attribs,next,prev,custom"); $custom = array(); $man->dispatchEvent("onCustomInfo", array(&$file, "info", &$custom)); $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getAbsolutePath(), $config['preview.wwwroot']); $result->add( utf8_encode($file->getName()), $man->encryptPath($file->getAbsolutePath()), utf8_encode($url), $file->getLength(), $ext, date($config['filesystem.datefmt'], $file->getCreationDate()), date($config['filesystem.datefmt'], $file->getLastModified()), $width, $height, $attribs, $man->encryptPath($next), $man->encryptPath($prev), $custom); return $result->toArray(); } function _createThumb(&$man, &$file) { $config = $file->getConfig(); $imageutils = new $config['thumbnail']; $ext = getFileExt($file->getName()); $canEdit = $imageutils->canEdit($ext); if (!in_array($ext, array('gif', 'jpeg', 'jpg', 'png', 'bmp'))) return false; // Check if we have an EXIF JPG file. if (($config['thumbnail.use_exif'] == true) && (function_exists("exif_thumbnail")) && (strtolower($ext) == "jpg" || strtolower($ext) == "jpeg")) { $image = @exif_thumbnail($file->getAbsolutePath(), $exif_width, $exif_height, $exif_type); if ($image !== false) return false; } // Check for thumbnails $havethumbnail = true; // No folder or not enabled = no thumbnail, could check for thumbnail folder and delete it perhaps? if (($config['thumbnail.folder'] == "") || ($config['thumbnail.enabled'] == false)) $havethumbnail = false; // If we dont have GD we dont have a thumbnail. if (!$canEdit) $havethumbnail = false; // Check so that we aren't inside a thumbnail folder. $parentFile = $file->getParentFile(); if ($config['thumbnail.folder'] == $parentFile->getName()) $havethumbnail = false; // Ok, no thumbnail? Then lets just stream the original image. if (!$havethumbnail) return false; // Ok, we have a thumbnail or should generate one, now lets check some stuff about it. $thumbnailFolder = $man->getFile(dirname($file->getAbsolutePath()) ."/". $config['thumbnail.folder']); if ((!$thumbnailFolder->exists()) && ($config['thumbnail.auto_generate'] == true)) $thumbnailFolder->mkdir(); $thumbnailPath = $thumbnailFolder->getAbsolutePath() . "/" . $config['thumbnail.prefix'] . basename($file->getAbsolutePath()); $thumbnail = $man->getFile(utf8_encode($thumbnailPath)); $thumbnail->setTriggerEvents(false); $thumbnailQuality = $config['thumbnail.jpeg_quality']; $thumbnailResult = false; $imageInfo = @getimagesize($file->getAbsolutePath()); $fileWidth = $imageInfo[0]; $fileHeight = $imageInfo[1]; $fileType = $imageInfo[2]; $thumbnailType = $fileType; // Calculate thumbnail width and height $targetWidth = $config['thumbnail.width']; $targetHeight = $config['thumbnail.height']; if ($config['thumbnail.scale_mode'] == "percentage") { $percentage = min($config['thumbnail.width'] / $fileWidth, $config['thumbnail.height'] / $fileHeight); if ($percentage <= 1) { $targetWidth = round($fileWidth * $percentage); $targetHeight = round($fileHeight * $percentage); } else { $targetWidth = $fileWidth; $targetHeight = $fileHeight; } } if ($thumbnail->exists()) { $thumbnailInfo = @getimagesize($thumbnail->getAbsolutePath()); $thumbnailWidth = $thumbnailInfo[0]; $thumbnailHeight = $thumbnailInfo[1]; $thumbnailType = $thumbnailInfo[2]; // Check width and height against config //debug($thumbnailHeight . " - " . $targetHeight . " - " . $thumbnailWidth . " - " . $targetWidth); if (($thumbnailHeight != $targetHeight) || ($thumbnailWidth != $targetWidth)) { $thumbnail->delete(); $thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality); } // Check modificationdate against original image if ($file->getLastModified() != $thumbnail->getLastModified()) { $thumbnail->delete(); $thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality); } if ($thumbnailResult) $thumbnail->setLastModified($file->getLastModified()); } else if ((!$thumbnail->exists()) && ($config['thumbnail.auto_generate'] == true)) { $thumbnailResult = $imageutils->resizeImage($file->getAbsolutePath(), $thumbnail->getAbsolutePath(), $targetWidth, $targetHeight, $ext, $thumbnailQuality); if ($thumbnailResult) { $thumbnailInfo = @getimagesize($thumbnail->getAbsolutePath()); $thumbnailType = $thumbnailInfo[2]; $thumbnail->setLastModified($file->getLastModified()); $thumbnail->importFile(); } } // failsafe check if ($thumbnail->exists() && $thumbnailType) return $thumbnail; return false; } function _streamThumb(&$man, $input) { if (!$man->verifyPath($input["path"]) < 0) { trigger_error("Path verification failed.", FATAL); die(); } $path = $man->decryptPath($input["path"]); $file =& $man->getFile($path); $ext = getFileExt($file->getName()); $config = $file->getConfig(); $urlprefix = $man->toUnixPath($config['preview.urlprefix']); $urlsuffix = $man->toUnixPath($config['preview.urlsuffix']); // NOTE: Verify more stuff here before proceeding. if ($man->verifyFile($file, "thumbnail", $config) < 0) { trigger_error("Path verification failed.", FATAL); die(); } //$imageutils = new $config['thumbnail']; //$canEdit = $imageutils->canEdit($ext); // Check if we have an EXIF JPG file. if (($config['thumbnail.use_exif'] == true) && (function_exists("exif_thumbnail")) && (strtolower($ext) == "jpg" || strtolower($ext) == "jpeg")) { $image = @exif_thumbnail($file->getAbsolutePath(), $exif_width, $exif_height, $exif_type); if ($image !== false) { header('Content-type: '. image_type_to_mime_type($exif_type)); echo $image; return null; } } $thumbnail = $this->_createThumb($man, $file); if ($thumbnail != false) { header('Content-type: ' . mapMimeTypeFromUrl($thumbnail->getName(), "../" . $config['stream.mimefile'])); if (!readfile($thumbnail->getAbsolutePath())) header("Location: ". $urlprefix . $man->convertPathToURI($thumbnail->getAbsolutePath(), $config['preview.wwwroot']) . $urlsuffix); } else { header('Content-type: ' . mapMimeTypeFromUrl($file->getName(), "../" . $config['stream.mimefile'])); if (!readfile($file->getAbsolutePath())) header("Location: " . $urlprefix . $man->convertPathToURI($file->getAbsolutePath(), $config['preview.wwwroot']) . $urlsuffix); } return null; } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("imagemanager", new Moxiecode_ImageManagerPlugin(), "im"); ?>plugins/imagemanager/classes/ImageManager/Utils/MCImageToolsGD.php000066600000055377150472426320021155 0ustar00canEdit($ext)) return false; $this->_quality = $quality; $this->_source = $source; $this->_target = $target; $this->_width = $width; $this->_height = $height; $this->_ext = $ext; $ar = explode('.', $target); $this->_targetExt = strtolower(array_pop($ar)); switch ($ext) { case "gif": return $this->_resizeGif(); case "jpg": case "jpe": case "jpeg": return $this->_resizeJpg(); case "png": return $this->_resizePng(); case "bmp": return false; } return false; } /** * Generates a rotated image as the target file, from the source file * @param String $source Absolute source path. * @param String $target Absolute source target. * @param String $ext Extension of the image. * @param Int $angle Angle to set the angle. * @param String $bgc Background color. * @param Int $quality Quality in percent, 0-100. * @return Bool true or false depending on success or not. */ function rotateImage($source, $target, $ext, $angle = "90", $bgc = "0", $quality = "") { if (!$this->canEdit($ext)) return false; $this->_angle = $angle; $this->_source = $source; $this->_target = $target; $this->_quality = $quality; $this->_ext = $ext; $this->_bgc = $bgc; switch ($ext) { case "gif": return $this->_rotateGif(); case "jpg": case "jpe": case "jpeg": return $this->_rotateJpg(); case "png": return $this->_rotatePng(); case "bmp": return false; } return false; } /** * Generates a cropped image as the target file, from the source file * @param String $source Absolute source path. * @param String $target Absolute source target. * @param Int $top Top of crop. * @param Int $left Left of crop. * @param Int $height Height of image. * @param Int $width Width of the image. * @param String $ext Extension of the image. * @param Int $quality Quality in percent, 0-100. * @return Bool true or false depending on success or not. */ function cropImage($source, $target, $top, $left, $width, $height, $ext, $quality="") { if (!$this->canEdit($ext)) return false; $this->_left = $left; $this->_top = $top; $this->_quality = $quality; $this->_source = $source; $this->_target = $target; $this->_width = $width; $this->_height = $height; $this->_ext = $ext; switch ($ext) { case "gif": return $this->_cropGif(); case "jpg": case "jpe": case "jpeg": return $this->_cropJpg(); case "png": return $this->_cropPng(); case "bmp": return false; } } /** * Generates a flipped image as the target file, from the source file * @param String $source Absolute source path. * @param String $target Absolute source target. * @param String $ext Extension of the image. * @param Bool $vert Vertical or not (Horizontal). * @param Int $quality Quality in percent, 0-100. * @return Bool true or false depending on success or not. */ function flipImage($source, $target, $ext, $vert = false, $hori = false, $quality="") { if (!$this->canEdit($ext)) return false; $this->_source = $source; $this->_target = $target; $this->_ext = $ext; $this->_vert = $vert; $this->_hori = $hori; $this->_quality = $quality; switch ($ext) { case "gif": return $this->_flipGif(); case "jpg": case "jpe": case "jpeg": return $this->_flipJpg(); case "png": return $this->_flipPng(); case "bmp": return false; } } /** * Internal function for cropping gif images. * @return Bool true or false depending on success or not. */ function _cropGif() { $source = ImagecreateFromGif($this->_source); $image = ImageCreate($this->_width, $this->_height); $transparent = imagecolorallocate($image, 255, 255, 255); imagefilledrectangle($image, 0, 0, $this->_width, $this->_width, $transparent); imagecolortransparent($image, $transparent); ImageCopyResampled($image, $source, 0, 0, $this->_left, $this->_top, $this->_width, $this->_height, $this->_width, $this->_height); ImageDestroy($source); $result = ImageGif($image, $this->_target); ImageDestroy($image); return $result; } /** * Internal function for cropping png images. * @return Bool true or false depending on success or not. */ function _cropPng() { $source = ImagecreateFromPng($this->_source); if ($this->_isPNG8($this->_source)) $image = ImageCreate($this->_width, $this->_height); else $image = ImageCreateTrueColor($this->_width, $this->_height); imagealphablending($image, false); imagesavealpha($image, true); ImageCopyResampled($image, $source, 0, 0, $this->_left, $this->_top, $this->_width, $this->_height, $this->_width, $this->_height); ImageDestroy($source); $result = ImagePng($image, $this->_target); ImageDestroy($image); return $result; } /** * Internal function for cropping Jpg images. * @return Bool true or false depending on success or not. */ function _cropJpg() { $source = ImagecreateFromJpeg($this->_source); $image = ImageCreateTrueColor($this->_width, $this->_height); ImageCopyResampled($image, $source, 0, 0, $this->_left, $this->_top, $this->_width, $this->_height, $this->_width, $this->_height); ImageDestroy($source); // this should set it to same file if ($this->_quality != "") $result = ImageJpeg($image, $this->_target, $this->_quality); else $result = ImageJpeg($image, $this->_target); ImageDestroy($image); return $result; } /** * Internal function for resizing gif images. * @return Bool true or false depending on success or not. */ function _resizeGif() { $source = ImagecreateFromGif($this->_source); $image = ImageCreate($this->_width, $this->_height); //imagealphablending($thumbnail, true); //imagesavealpha($thumbnail,true); $transparent = imagecolorallocate($image, 255, 255, 255); imagefilledrectangle($image, 0, 0, $this->_width, $this->_height, $transparent); imagecolortransparent($image, $transparent); ImageCopyResampled($image, $source, 0, 0, 0, 0, $this->_width, $this->_height, ImageSX($source), ImageSY($source)); ImageDestroy($source); switch ($this->_targetExt) { case 'gif': $result = ImageGif($image, $this->_target); break; case 'jpeg': case 'jpg': if ($this->_quality != "") $result = ImageJpeg($image, $this->_target, $this->_quality); else $result = ImageJpeg($image, $this->_target); break; case 'png': $result = ImagePng($image, $this->_target); break; } ImageDestroy($image); return $result; } /** * Internal function for resizing png images. * @return Bool true or false depending on success or not. */ function _resizePng() { $source = imagecreatefrompng($this->_source); if ($this->_isPNG8($this->_source)) $image = ImageCreate($this->_width, $this->_height); else $image = ImageCreateTrueColor($this->_width, $this->_height); imagealphablending($image, true); imagesavealpha($image, true); $transparent = imagecolorallocatealpha($image, 255, 255, 255, 0); imagefilledrectangle($image, 0, 0, $this->_width, $this->_height, $transparent); imagecolortransparent($image, $transparent); ImageCopyResampled($image, $source, 0, 0, 0, 0, $this->_width, $this->_height, ImageSX($source), ImageSY($source)); ImageDestroy($source); switch ($this->_targetExt) { case 'gif': $result = ImageGif($image, $this->_target); break; case 'jpeg': case 'jpg': if ($this->_quality != "") $result = ImageJpeg($image, $this->_target, $this->_quality); else $result = ImageJpeg($image, $this->_target); break; case 'png': $result = ImagePng($image, $this->_target); break; } ImageDestroy($image); return $result; } /** * Internal function for resizing jpg images. * @return Bool true or false depending on success or not. */ function _resizeJpg() { $source = ImageCreateFromJpeg($this->_source); $image = ImageCreateTrueColor($this->_width, $this->_height); ImageCopyResampled($image, $source, 0, 0, 0, 0, $this->_width, $this->_height, ImageSX($source), ImageSY($source)); ImageDestroy($source); $result = false; switch ($this->_targetExt) { case 'gif': $result = ImageGif($image, $this->_target); break; case 'jpeg': case 'jpg': if ($this->_quality != "") $result = ImageJpeg($image, $this->_target, $this->_quality); else $result = ImageJpeg($image, $this->_target); break; case 'png': $result = ImagePng($image, $this->_target); break; } ImageDestroy($image); return $result; } function _rotateJpg() { $image = ImagecreateFromJpeg($this->_source); $width = imagesx($image); $height = imagesy($image); switch ($this->_angle) { case 90: $fill = imagecreatetruecolor ($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy($fill, $image, $height-$y-1, $x, $x, $y, 1, 1); break; case 180: $this->_hori = true; $this->_vert = true; return $this->_flipJpg(); case 270: $fill = imagecreatetruecolor ($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy($fill, $image, $y, $width-$x-1, $x, $y, 1, 1); break; } ImageDestroy($image); $result = ImageJpeg($fill, $this->_target); ImageDestroy($fill); return $result; } function _rotatePng() { $image = ImagecreateFromPng($this->_source); $width = imagesx($image); $height = imagesy($image); switch ($this->_angle) { case 90: if ($this->_isPNG8($this->_source)) $fill = ImageCreate($height, $width); else $fill = ImageCreateTrueColor($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy ($fill, $image, $height-$y-1, $x, $x, $y, 1, 1); break; case 180: $this->_hori = true; $this->_vert = true; return $this->_flipPng(); case 270: if ($this->_isPNG8($this->_source)) $fill = ImageCreate($height, $width); else $fill = ImageCreateTrueColor($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy ($fill, $image, $y, $width-$x-1, $x, $y, 1, 1); break; } ImageDestroy($image); $result = ImagePng($fill, $this->_target); ImageDestroy($fill); return $result; } function _rotateGif() { $image = ImagecreateFromGif($this->_source); $width = imagesx($image); $height = imagesy($image); switch ($this->_angle) { case 90: $fill = imagecreatetruecolor ($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy($fill, $image, $height-$y-1, $x, $x, $y, 1, 1); break; case 180: $this->_hori = true; $this->_vert = true; return $this->_flipGif(); case 270: $fill = imagecreatetruecolor ($height, $width); for ($x=0; $x<$width; $x++) for ($y=0; $y<$height; $y++) imagecopy($fill, $image, $y, $width-$x-1, $x, $y, 1, 1); break; } ImageDestroy($image); $result = ImageGif($fill, $this->_target); ImageDestroy($fill); return $result; } function _flipPng() { $source = ImagecreateFromPng($this->_source); $width = imagesx($source); $height = imagesy($source); if ($this->_isPNG8($this->_source)) $image = ImageCreate($height, $width); else $image = ImageCreateTrueColor($height, $width); if ($this->_hori) { for ($i=0; $i<$width; $i++) ImageCopyResampled($image, $source, $width - $i - 1, 0, $i, 0, 1, $height, 1, $height); if ($this->_vert) ImageCopyResampled($source, $image, 0, 0, 0, 0, $width, $height, $width, $height); } if ($this->_vert) { for ($i=0; $i<$height; $i++) ImageCopyResampled($image, $source, 0, $height - $i - 1, 0, $i, $width, 1, $width, 1); } ImageDestroy($source); $result = ImagePng($image, $this->_target); ImageDestroy($image); return $result; } function _flipJpg() { $source = ImagecreateFromJpeg($this->_source); $width = imagesx($source); $height = imagesy($source); $image = ImageCreateTrueColor($width, $height); $processed = false; if ($this->_hori) { for ($i=0; $i<$width; $i++) ImageCopyResampled($image, $source, $width - $i - 1, 0, $i, 0, 1, $height, 1, $height); $processed = true; } if ($this->_vert) { for ($i=0; $i<$height; $i++) ImageCopyResampled($image, $source, 0, $height - $i - 1, 0, $i, $width, 1, $width, 1); if ($this->_vert) ImageCopyResampled($source, $image, 0, 0, 0, 0, $width, $height, $width, $height); $processed = true; } ImageDestroy($source); if ($processed) $result = ImageJpeg($image, $this->_target); else $result = false; ImageDestroy($image); return $result; } function _flipGif() { $source = ImagecreateFromGif($this->_source); $width = imagesx($source); $height = imagesy($source); $image = ImageCreateTrueColor($width, $height); if ($this->_hori) { for ($i=0; $i<$width; $i++) ImageCopyResampled($image, $source, $width - $i - 1, 0, $i, 0, 1, $height, 1, $height); ImageCopyResampled($image, $source, 0, $height - $i - 1, 0, $i, $width, 1, $width, 1); if ($this->_vert) ImageCopyResampled($source, $image, 0, 0, 0, 0, $width, $height, $width, $height); } if ($this->_vert) { for ($i=0; $i<$height; $i++) ImageCopyResampled($image, $source, 0, $height - $i - 1, 0, $i, $width, 1, $width, 1); } ImageDestroy($source); $result = ImageGif($image, $this->_target); ImageDestroy($image); return $result; } function _getPNGHeader($path) { $fp = fopen($path, "rb"); if ($fp) { $magic = fread($fp, 8); if ($magic == "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A" ) { // Is PNG // Read chunks while (!feof($fp)) { $buff = fread($fp, 4); if (strlen($buff) != 4) break; $chunk = unpack('Nlen', $buff); $chunk['type'] = fread($fp, 4); if (strlen($chunk['type']) != 4) break; // Found header then read it if ($chunk['type'] == 'IHDR') { $buff = fread($fp, 13); $header = unpack('Nwidth/Nheight/Cbits/Ctype/Ccompression/Cfilter/Cinterlace', $buff); fclose($fp); return $header; } // Jump to next chunk and skip CRC fseek($fp, $chunk['len'] + 4, SEEK_CUR); } } fclose($fp); } return null; } function _isPNG8($path) { $header = $this->_getPNGHeader($path); return $header && $header['type'] == 3; } function _isPNG24($path) { $header = $this->_getPNGHeader($path); return $header && $header['type'] == 2; } function hasFunctions($list) { $list = split(",", $list); foreach($list as $item) { if (!function_exists($item)) return false; } return true; } /** * Get the support with current GD. * @param String $type Extensions of image. * @return Array An array with booleans, crop, resize, rotate. */ function getEditSupport($type) { $rotate = function_exists("imagerotate"); $crop = false; $resize = false; switch ($type) { case "jpg": $resize = $this->hasFunctions("ImageCreateTrueColor,ImageCopyResampled,ImageSX,ImageSY"); $crop = $this->hasFunctions("ImageCreateTrueColor,ImageCopyResampled"); break; case "gif": $resize = $this->hasFunctions("imagecolorallocate,imagefilledrectangle,imagecolortransparent,ImageCopyResampled,ImageSX,ImageSY"); $crop = $this->hasFunctions("imagecolorallocate,imagefilledrectangle,imagecolortransparent,ImageCopyResampled"); break; case "png": $resize = $this->hasFunctions("imagecolorallocate,imagefilledrectangle,imagecolortransparent,ImageCopyResampled,ImageSX,ImageSY"); $crop = $this->hasFunctions("imagealphablending,imagesavealpha,ImageColorTransparent,ImageCopyResampled,ImageCreateTrueColor"); break; } return array($crop, $resize, $rotate); } /** * Formats a image based in the input parameter. * * Format parameters: * %f - Filename. * %e - Extension. * %w - Image width. * %h - Image height. * %tw - Target width. * %th - Target height. * %ow - Original width. * %oh - Original height. * * Example: 320x240|gif=%f_%w_%h.gif,320x240=%f_%w_%h.%e */ function formatImage($path, $format, $quality = 90) { $chunks = explode(',', $format); $imageInfo = @getimagesize($path); $width = $imageInfo[0]; $height = $imageInfo[1]; foreach ($chunks as $chunk) { if (!$chunk) continue; $parts = explode('=', $chunk); $actions = array(); $fileName = preg_replace('/\..+$/', '', basename($path)); $extension = preg_replace('/^.+\./', '', basename($path)); $targetWidth = $newWidth = $width; $targetHeight = $newHeight = $height; $items = explode('|', $parts[0]); foreach ($items as $item) { switch ($item) { case "gif": case "jpg": case "jpeg": case "png": $extension = $item; break; default: $matches = array(); if (preg_match('/\s?([0-9]+)\s?x([0-9]+)\s?/', $item, $matches)) { $actions[] = "resize"; $targetWidth = $matches[1]; $targetHeight = $matches[2]; } } } // Add default action if (count($actions) == 0) $actions[] = "resize"; // Scale it if ($targetWidth != $width || $targetHeight != $height) { $scale = min($targetWidth / $width, $targetHeight / $height); $newWidth = $scale > 1 ? $width : floor($width * $scale); $newHeight = $scale > 1 ? $height : floor($height * $scale); } // Build output path $outPath = $parts[1]; $outPath = str_replace("%f", $fileName, $outPath); $outPath = str_replace("%e", $extension, $outPath); $outPath = str_replace("%ow", "" . $width, $outPath); $outPath = str_replace("%oh", "" . $height, $outPath); $outPath = str_replace("%tw", "" . $targetWidth, $outPath); $outPath = str_replace("%th", "" . $targetHeight, $outPath); $outPath = str_replace("%w", "" . $newWidth, $outPath); $outPath = str_replace("%h", "" . $newHeight, $outPath); $outPath = dirname($path) . '/' . $outPath; $this->_mkdirs(dirname($outPath)); foreach ($actions as $action) { switch ($action) { case 'resize': //debug($path, $outPath); $this->resizeImage($path, $outPath, $newWidth, $newHeight, "", $quality); break; } } } } /** * Deletes formats for the specified image. * * Format parameters: * %f - Filename. * %e - Extension. * %w - Image width. * %h - Image height. * %tw - Target width. * %th - Target height. * %ow - Original width. * %oh - Original height. * * Example: 320x240|gif=%f_%w_%h.gif,320x240=%f_%w_%h.%e */ function deleteFormatImages($path, $format) { $chunks = explode(',', $format); $imageInfo = @getimagesize($path); $width = $imageInfo[0]; $height = $imageInfo[1]; foreach ($chunks as $chunk) { if (!$chunk) continue; $parts = explode('=', $chunk); $fileName = preg_replace('/\..+$/', '', basename($path)); $extension = preg_replace('/^.+\./', '', basename($path)); $targetWidth = $newWidth = $width; $targetHeight = $newHeight = $height; $items = explode('|', $parts[0]); foreach ($items as $item) { switch ($item) { case "gif": case "jpg": case "jpeg": case "png": $extension = $item; break; default: $matches = array(); if (preg_match('/\s?([0-9]+)\s?x([0-9]+)\s?/', $item, $matches)) { $targetWidth = $matches[1]; $targetHeight = $matches[2]; } } } // Scale it if ($targetWidth != $width || $targetHeight != $height) { $scale = min($targetWidth / $width, $targetHeight / $height); $newWidth = $scale > 1 ? $width : floor($width * $scale); $newHeight = $scale > 1 ? $height : floor($height * $scale); } // Build output path $outPath = $parts[1]; $outPath = str_replace("%f", $fileName, $outPath); $outPath = str_replace("%e", $extension, $outPath); $outPath = str_replace("%ow", "" . $width, $outPath); $outPath = str_replace("%oh", "" . $height, $outPath); $outPath = str_replace("%tw", "" . $targetWidth, $outPath); $outPath = str_replace("%th", "" . $targetHeight, $outPath); $outPath = str_replace("%w", "" . $newWidth, $outPath); $outPath = str_replace("%h", "" . $newHeight, $outPath); $outPath = dirname($path) . '/' . $outPath; if (file_exists($outPath)) unlink($outPath); } } /** * Check for the GD functions that are beeing used. * @param String $type Extensions of image. * @return Bool true or false depending on success or not. */ function canEdit($type) { // just make a quick check, we dont need to loop if we can't find GD at all. if (!function_exists("gd_info")) return false; $gdUsedFunctions = array(); // Check type specific functions switch ($type) { case "jpg": $gdUsedFunctions[] = "ImagecreateFromJpeg"; $gdUsedFunctions[] = "ImageJpeg"; break; case "gif": $gdUsedFunctions[] = "ImagecreateFromGif"; $gdUsedFunctions[] = "ImageGif"; break; case "png": $gdUsedFunctions[] = "ImagecreateFromPng"; $gdUsedFunctions[] = "ImagePng"; break; default: return false; } // check so that each function exists foreach ($gdUsedFunctions as $function) { if (!function_exists($function)) { trigger_error("Function " . $function . " does not exist.", WARNING); return false; } } return true; } function _mkdirs($path, $rights = 0777) { $path = preg_replace('/\/$/', '', $path); $dirs = array(); // Figure out what needs to be created while ($path) { if (file_exists($path)) break; $dirs[] = $path; $pathAr = explode("/", $path); array_pop($pathAr); $path = implode("/", $pathAr); } // Create the dirs $dirs = array_reverse($dirs); foreach ($dirs as $path) { if (!@is_dir($path) && strlen($path) > 0) mkdir($path, $rights); } } } ?>plugins/imagemanager/classes/FileSystems/LocalFileImpl.php000066600000061433150472426320017753 0ustar00_manager =& $manager; $this->_type = $type; if ($child_name != "") $this->_absPath = $this->_manager->removeTrailingSlash($absolute_path) . "/" . $child_name; else $this->_absPath = $absolute_path; // Force it absolute if (strpos($this->_absPath, '..') !== false) $this->_absPath = $this->_manager->toUnixPath(realpath($this->_absPath)); } /** * Set a bool regarding events triggering. * * @param Bool $trigger Trigger or not to trigger. */ function setTriggerEvents($trigger) { $this->_events = $trigger; } /** * Returns bool if events are to be triggered or not. * * @return Bool bool for triggering events or not. */ function getTriggerEvents() { return $this->_events; } /** * Returns the parent files absolute path. * * @return String parent files absolute path. */ function getParent() { $pathAr = explode("/", $this->_absPath); array_pop($pathAr); $path = implode("/", $pathAr); // TODO: Check this return ($path == "") ? null : $path; } /** * Returns the parent files File instance. * * @return File parent files File instance or false if there is no more parents. */ function &getParentFile() { $file = new Moxiecode_LocalFileImpl($this->_manager, $this->getParent()); return $file; } /** * Returns the file name of a file. * * @return string File name of file. */ function getName() { return basename($this->_manager->toOSPath($this->_absPath)); } /** * Returns the absolute path of the file. * * @return String absolute path of the file. */ function getAbsolutePath() { return $this->_absPath; } /** * Imports a local file to the file system, for example when users upload files. * * @param String $local_absolute_path Absolute path to local file to import. */ function importFile($local_absolute_path = "") { $this->_clearCache(); // Add action if ($this->_events) { if ($this->isFile()) { $this->_manager->dispatchEvent("onBeforeFileAction", array(ADD_ACTION, &$this)); $this->_manager->dispatchEvent("onFileAction", array(ADD_ACTION, &$this)); } else { $this->_manager->dispatchEvent("onBeforeFileAction", array(MKDIR_ACTION, &$this)); $this->_manager->dispatchEvent("onFileAction", array(MKDIR_ACTION, &$this)); } } // Chmod the file if (($mask = $this->_getConfigValue("filesystem.local.file_mask", false)) !== false) @chmod($this->_manager->toOSPath($this->_absPath), intval($mask, 8)); // Chown the file if (($owner = $this->_getConfigValue("filesystem.local.file_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($this->_absPath), $owner); } /** * Returns true if the file exists. * * @return boolean true if the file exists. */ function exists() { if (isset($this->_statCache['exists'])) return $this->_statCache['exists']; // Returns false if safe mode is on and the user/group is not the same as apache return ($this->_statCache['exists'] = file_exists($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the file is a directory. * * @return boolean true if the file is a directory. */ function isDirectory() { if (!$this->exists()) return $this->_type == MC_IS_DIRECTORY; if (isset($this->_statCache['is_dir'])) return $this->_statCache['is_dir']; return ($this->_statCache['is_dir'] = is_dir($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the file is a file. * * @return boolean true if the file is a file. */ function isFile() { if (!$this->exists()) return $this->_type == MC_IS_FILE; if (isset($this->_statCache['is_file'])) return $this->_statCache['is_file']; return ($this->_statCache['is_file'] = is_file($this->_manager->toOSPath($this->_absPath))); } /** * Returns last modification date in ms as an long. * * @return long last modification date in ms as an long. */ function getLastModified() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][9]; } /** * Returns creation date in ms as an long. * * @return long creation date in ms as an long. */ function getCreationDate() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][10]; } /** * Returns true if the files is readable. * * @return boolean true if the files is readable. */ function canRead() { if (isset($this->_statCache['is_readable'])) return $this->_statCache['is_readable']; return ($this->_statCache['is_readable'] = is_readable($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the files is writable. * * @return boolean true if the files is writable. */ function canWrite() { // Check parent if (!$this->exists()) { $file =& $this->getParentFile(); if ($this->getAbsolutePath() == $file->getAbsolutePath()) return false; return $file->canWrite(); } if (isset($this->_statCache['is_writeable'])) return $this->_statCache['is_writeable']; // Is windows if (DIRECTORY_SEPARATOR == "\\") { $path = $this->_manager->toOSPath($this->_absPath); if (is_file($path)) { $fp = @fopen($path, 'ab'); if ($fp) { fclose($fp); return true; } } else if (is_dir($path)) { $tmpnam = time() . md5(uniqid('iswritable')); if (@touch($path . '\\' . $tmpnam)) { unlink($path . '\\' . $tmpnam); return true; } } return false; } // Other OS:es return ($this->_statCache['is_writeable'] = is_writeable($this->_manager->toOSPath($this->_absPath))); } /** * Returns file size as an long. * * @return long file size as an long. */ function getLength() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][7]; } /** * Copies this file to the specified file instance. * * @param File $dest File to copy to. * @return boolean true - success, false - failure */ function copyTo(&$dest) { $this->_clearCache(); if ($dest->exists()) return false; // Copy in to your self? if (strpos($dest->getAbsolutePath(), $this->getAbsolutePath()) === 0) return false; // Different file system then import if (getClassName($dest) != 'moxiecode_localfileimpl') return $dest->importFile($this->getAbsolutePath()); $dest->_clearCache(); if ($this->isDirectory()) { $handle_as_add_event = true; $treeHandler = new _LocalCopyDirTreeHandler($this->_manager, $this, $dest, $handle_as_add_event); $this->listTree($treeHandler); return true; } else { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(COPY_ACTION, &$this, &$dest)); $status = $this->_absPath == $dest->_absPath || copy($this->_manager->toOSPath($this->_absPath), $this->_manager->toOSPath($dest->_absPath)); // Chmod the file if (($mask = $dest->_getConfigValue("filesystem.local.file_mask", false)) !== false) @chmod($this->_manager->toOSPath($dest->_absPath), intval($mask, 8)); // Chown the file if (($owner = $dest->_getConfigValue("filesystem.local.file_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($dest->_absPath), $owner); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(COPY_ACTION, &$this, &$dest)); return $status; } } /** * Deletes the file. * * @param boolean $deep If this option is enabled files will be deleted recurive. * @return boolean true - success, false - failure */ function delete($deep = false) { if (!$this->exists()) return false; $this->_clearCache(); if (is_dir($this->_manager->toOSPath($this->_absPath))) { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(RMDIR_ACTION, &$this)); if ($deep) { // Get all the files $treeHandler = new _LocalDeleteDirTreeHandler($this->_manager, $this); $this->listTree($treeHandler); // Delete the files $files = array_reverse($treeHandler->getFiles()); foreach ($files as $file) $file->delete(); // Hmm, should be better return true; } if (($status = rmdir($this->_manager->toOSPath($this->_absPath))) && ($this->_events)) $this->_manager->dispatchEvent("onFileAction", array(RMDIR_ACTION, &$this)); } else { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(DELETE_ACTION, &$this)); if (($status = unlink($this->_manager->toOSPath($this->_absPath))) && ($this->_events)) $this->_manager->dispatchEvent("onFileAction", array(DELETE_ACTION, &$this)); } return $status; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Returns an array of BaseFile instances based on the specified filter instance. * * @param FileFilter &$filter FileFilter instance to filter files by. * @return Array array of File instances based on the specified filter instance. */ function &listFilesFiltered(&$filter) { $dir = $this->_absPath; $files = array(); $dirs = array(); $fileArray = array(); $dirArray = array(); if ($fHnd = opendir($this->_manager->toOSPath($dir))) { // Is there a trailing slash on the dir? Get rid of it //if ($dir[sizeof($dir)] == "/") // $dir = substr($dir, 0, sizeof($dir) -1); while (false !== ($file = readdir($fHnd))) { if ($file == "." || $file == "..") continue; // Returns false if safe mode is on and the user/group is not the same as apache $path = $dir . "/" . $file; if (file_exists($path)) { // We are at root! if ($dir == "/") $dir = ""; if (is_file($path)) $fileArray[] = $file; else $dirArray[] = $file; } } // Close handle closedir($fHnd); sort($dirArray); sort($fileArray); // Add dirs foreach ($dirArray as $adir) { $file = new Moxiecode_LocalFileImpl($this->_manager, $dir . "/" . $adir); if ($filter->accept($file) < 0) continue; array_push($files, $file); } // Add files foreach ($fileArray as $afile) { $file = new Moxiecode_LocalFileImpl($this->_manager, $dir . "/" . $afile); if ($filter->accept($file) < 0) continue; array_push($files, $file); } } return $files; } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. */ function listTree(&$file_tree_handler) { $this->_listTree($this, $file_tree_handler, new Moxiecode_DummyFileFilter(), 0); } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file * if the file filter accepts the file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. * @param FileTreeHandler &$file_filter FileFilter instance to filter files by. */ function listTreeFiltered(&$file_tree_handler, &$file_filter) { $this->_listTree($this, $file_tree_handler, $file_filter, 0); } /** * Creates a new directory. * * @return boolean true- success, false - failure */ function mkdir() { $this->_clearCache(); if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(MKDIR_ACTION, &$this)); $tpl = $this->_getConfigValue("filesystem.local.directory_template", false); if ($tpl) $status = copy($this->_manager->toAbsPath($tpl), $this->_manager->toOSPath($this->_absPath)); else $status = mkdir($this->_manager->toOSPath($this->_absPath)); // Chmod the dir if (($mask = $this->_getConfigValue("filesystem.local.directory_mask", false)) !== false) @chmod($this->_manager->toOSPath($this->_absPath), intval($mask, 8)); // Chown the dir if (($owner = $this->_getConfigValue("filesystem.local.directory_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($this->_absPath), $owner); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(MKDIR_ACTION, &$this)); return $status; } /** * Renames/Moves this file to the specified file instance. * * @param File $dest File to rename/move to. * @return boolean true- success, false - failure */ function renameTo(&$dest) { $this->_clearCache(); // Already exists if ($dest->exists()) return false; if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(RENAME_ACTION, &$this, &$dest)); if ($this->_absPath != $dest->_absPath) $status = rename($this->_manager->toOSPath($this->_absPath), $this->_manager->toOSPath($dest->_absPath)); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(RENAME_ACTION, &$this, &$dest)); $isFile = is_file($this->_manager->toOSPath($this->_absPath)); // Chmod the file/directory if (($mask = $dest->_getConfigValue("filesystem.local." . ($isFile ? "file" : "directory") . "_mask", false)) !== false) @chmod($this->_manager->toOSPath($dest->_absPath), intval($mask, 8)); // Chown the file/directory if (($owner = $dest->_getConfigValue("filesystem.local." . ($isFile ? "file" : "directory") . "_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($dest->_absPath), $owner); return $status; } /* * Sets the last-modified time of the file or directory. * * @param String $datetime The new date/time to set the file, in timestamp format * @return boolean true- success, false - failure */ function setLastModified($datetime) { $this->_clearCache(); return touch($this->_manager->toOSPath($this->_absPath), $datetime); } /** * Opens a file stream by the specified mode. The default mode is rb. * * @param String $mode Mode to open file by, r, rb, w, wb etc. * @return FileStream File stream implementation for the file system. */ function &open($mode = 'rb') { $this->_clearCache(); $stream = new Moxiecode_LocalFileStream($this, $mode); return $stream; } // * * Private methods function _clearCache() { $this->_statCache = array(); } /** * Lists files recursive, and places the files in the specified array. */ function _listTree($file, &$file_tree_handler, &$file_filter, $level) { $state = $file_tree_handler->CONTINUE; if ($file_filter->accept($file)) { $state = $file_tree_handler->handle($file, $level); if ($state == $file_tree_handler->ABORT || $state == $file_tree_handler->ABORT_FOLDER) return $state; } $files = $file->listFiles(); foreach ($files as $file) { if ($file_filter->accept($file)) { if ($file->isFile()) { // This is some weird shit! //if (!is_object($file_filter)) $state = $file_tree_handler->handle($file, $level); } else { $state = $this->_listTree($file, $file_tree_handler, $file_filter, ++$level); --$level; } } if ($state == $file_tree_handler->ABORT) return $state; } return $file_tree_handler->CONTINUE; } /** * Returns a merged name/value array of config elements. * * @return Array Merged name/value array of config elements. */ function getConfig() { $globalConf = $this->_manager->getConfig(); // Not cached config if (!$this->_config) { $localConfig = array(); $this->_config = $globalConf; // Get files up the tree $accessFiles = array(); $file =& $this; if ($file->isFile()) $file =& $file->getParentFile(); while ($file->exists() && $file->getAbsolutePath() != "/") { $accessFile = new Moxiecode_LocalFileImpl($this->_manager, $file->getAbsolutePath(), $globalConf["filesystem.local.access_file_name"]); if ($accessFile->exists()) $accessFiles[] = $accessFile; // Is not a valid path break loop if (!$this->_manager->verifyPath($file->getParent())) break; $file =& $file->getParentFile(); } // Parse and merge $allowoverrideKeys = array(); foreach ($this->_config as $key => $value) { $keyChunks = explode('.', $key); if ($keyChunks[count($keyChunks)-1] == "allow_override") { foreach (explode(',', $value) as $keySuffix) { $keyChunks[count($keyChunks)-1] = $keySuffix; $allowoverrideKeys[] = implode('.', $keyChunks); } } } foreach (array_reverse($accessFiles) as $accessFile) { $config = array(); // Parse ini file if (($fp = fopen($this->_manager->toOSPath($accessFile->getAbsolutePath()), "r"))) { while (!feof($fp)) { $line = trim(fgets($fp)); // Skip comments if (substr($line, 0, 1) == "#") continue; // Split rows if (($pos = strpos($line, "=")) !== FALSE) $config[substr($line, 0, $pos)] = substr($line, $pos+1); } fclose($fp); } // Handle local config values $curDir = $this->isFile() ? $this->getParent() : $this->getAbsolutePath(); if ($accessFile->getParent() == $curDir) { foreach ($config as $key => $value) { if (substr($key, 0, 1) == '_') $localConfig[substr($key, 1)] = $value; } } // Parse allow keys and deny keys $denyOverrideKeys = array(); foreach ($config as $key => $value) { $keyChunks = explode('.', $key); $lastChunk = $keyChunks[count($keyChunks)-1]; if ($lastChunk == "allow_override" || $lastChunk == "deny_override") { foreach (explode(',', $value) as $keySuffix) { $keyChunks[count($keyChunks)-1] = $keySuffix; $allowDenyKey = implode('.', $keyChunks); if (in_array($allowDenyKey, $allowoverrideKeys)) { if ($lastChunk == "allow_override") $allowoverrideKeys[] = $allowDenyKey; else $denyOverrideKeys[] = $allowDenyKey; } } } } // Remove the denied keys from the allow list /* foreach ($denyOverrideKeys as $denyKey) { for ($i=0; $i $value) { $validAllKey = false; foreach ($allowoverrideKeys as $allowkey) { if (strpos($allowkey, "*") > 0) { $allowkey = str_replace("*", "", $allowkey); // echo $allowkey . "," . $key . strpos($allowkey, $key) . "
        "; if (strpos($key, $allowkey) === 0) { $validAllKey = true; break; } } } if ((in_array($key, $allowoverrideKeys) || $validAllKey) && !in_array($key, $denyOverrideKeys)) { if (strpos($value, '${') !== false) $value = str_replace('${configpath}', $accessFile->getParent(), $value); $this->_config[$key] = $value; } } } // Variable substitute the values foreach ($this->_config as $key => $value) { if (!is_array($value) && strpos($value, '${') !== false) { if ($this->isFile()) $path = $this->getAbsolutePath(); else $path = $this->getParent(); $value = str_replace('${path}', $path, $value); $value = str_replace('${rootpath}', $this->_manager->toUnixPath($this->_manager->_rootPaths[0]), $value); // Handle multiple rootpaths for ($i=0; $i_manager->_rootPaths); $i++) $value = str_replace('${rootpath' . $i . '}', $this->_manager->toUnixPath($this->_manager->_rootPaths[$i]), $value); $this->_config[$key] = $value; } } // Force local config foreach ($localConfig as $key => $value) { //$this->_config[$key] = $value; $validAllKey = false; foreach ($allowoverrideKeys as $allowkey) { if (strpos($allowkey, "*") > 0) { $allowkey = str_replace("*", "", $allowkey); // echo $allowkey . "," . $key . strpos($allowkey, $key) . "
        "; if (strpos($key, $allowkey) === 0) { $validAllKey = true; break; } } } if ((in_array($key, $allowoverrideKeys) || $validAllKey) && !in_array($key, $denyOverrideKeys)) { if (strpos($value, '${') !== false) $value = str_replace('${configpath}', $accessFile->getParent(), $value); $this->_config[$key] = $value; } } /* foreach ($this->_config as $key => $value) { if (in_array($key, $allowoverrideKeys)) { // Seems to be a variable if (strpos($value, '${') !== false) { $matches = array(); preg_match_all('/\${(.*)}/i', $value, $matches); var_dump($matches); foreach ($matches as $match) $this->_config[$key] = str_replace('${' . $match . '}', $this->_config[$match], $this->_config[$key]); } } }*/ } return $this->_config; } /** * Returns a config value by the specified key. * * @param String key Key to return value by. * @param String default_value Optional default value. * @return String Value returned from config. */ function _getConfigValue($key, $default_value = "") { $config = $this->getConfig(); if (isset($config[$key])) return $config[$key] ? $config[$key] : $default_value; else return $default_value; } function _chown($path, $owner) { if ($owner == "") return; $owner = explode(":", $owner); // Only user if (count($owner) == 1) array_push($owner, ""); // Hmm if (count($owner) != 2) return; // Set user if ($owner[0] != "") @chown($path, $owner[0]); // Set group if ($owner[1] != "") @chgrp($path, $owner[1]); } function _cmpByName($file1, $file2) { $al = strtolower($file1->getName()); $bl = strtolower($file2->getName()); if ($al == $bl) return 0; return $al > $bl ? 1 : -1; } } class _LocalCopyDirTreeHandler extends Moxiecode_FileTreeHandler { var $_fromFile; var $_destFile; var $_manager; var $_handle_as_add_event; function _LocalCopyDirTreeHandler(&$manager, $from_file, $dest_file, $handle_as_add_event) { $this->_manager = $manager; $this->_fromFile = $from_file; $this->_destFile = $dest_file; $this->_handle_as_add_event = $handle_as_add_event; } /** * Handles a file instance while looping an tree of directories. * * @param File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $toPath = $this->_destFile->getAbsolutePath(); $toPath .= substr($file->getAbsolutePath(), strlen($this->_fromFile->getAbsolutePath())); $toFile = $this->_manager->getFile($toPath); //debug($file->getAbsolutePath() . "->" . $toPath); // Do action if ($file->isDirectory()) $toFile->mkdir(); else $file->copyTo($toFile); return $this->CONTINUE; } } class _LocalDeleteDirTreeHandler extends Moxiecode_FileTreeHandler { var $_manager; var $_dir; var $_files; function _LocalDeleteDirTreeHandler(&$manager, $dir) { $this->_manager = $manager; $this->_dir = $dir; $this->_files = array(); } /** * Returns all the files and dirs. * * @return Array All the files and dirs. */ function getFiles() { return $this->_files; } /** * Handles a file instance while looping an tree of directories. * * @param File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $this->_files[] = $file; //$file->delete(); return $this->CONTINUE; } } class Moxiecode_LocalFileStream extends Moxiecode_FileStream { var $_fp; var $_file; function Moxiecode_LocalFileStream(&$file, $mode) { $this->_file = $file; $this->_fp = fopen($file->getAbsolutePath(), $mode); } function skip($bytes) { $pos = ftell($this->_fp); fseek($this->_fp, $bytes, SEEK_CUR); return ftell($this->_fp) - $pos; } function read($len = 1024) { return fread($this->_fp, $len); } function readToEnd() { $data = ""; while (($chunk = $this->read(1024)) != null) $data .= $chunk; return $data; } function write($buff, $len = -1) { if ($len == -1) return fwrite($this->_fp, $buff); return fwrite($this->_fp, $buff, $len); } function close() { $this->_file->_clearCache(); @fclose($this->_fp); $this->_fp = null; } } ?>plugins/imagemanager/classes/FileSystems/BaseFileImpl.php000066600000010530150472426320017563 0ustar00_manager =& $manager; $this->_type = $type; if ($child_name != "") $this->_absPath = $this->_manager->removeTrailingSlash($absolute_path) . "/" . $child_name; else $this->_absPath = $absolute_path; } /** * Set a bool regarding events triggering. * * @param Bool $trigger Trigger or not to trigger. */ function setTriggerEvents($trigger) { $this->_events = $trigger; } /** * Returns bool if events are to be triggered or not. * * @return Bool bool for triggering events or not. */ function getTriggerEvents() { return $this->_events; } /** * Returns the parent files absolute path. * * @return String parent files absolute path. */ function getParent() { $pathAr = explode("/", $this->getAbsolutePath()); array_pop($pathAr); $path = implode("/", $pathAr); return ($path == "") ? "/" : $path; } /** * Returns the file name of a file. * * @return string File name of file. */ function getName() { return basename($this->_absPath); } /** * Returns the absolute path of the file. * * @return String absolute path of the file. */ function getAbsolutePath() { return $this->_absPath; } /** * Returns true if the file is a directory. * * @return boolean true if the file is a directory. */ function isDirectory() { if (!$this->exists()) return $this->_type == MC_IS_DIRECTORY; return is_dir($this->_manager->toOSPath($this->_absPath)); } /** * Returns true if the file is a file. * * @return boolean true if the file is a file. */ function isFile() { if (!$this->exists()) return $this->_type == MC_IS_FILE; return !$this->isDirectory(); } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. */ function listTree(&$file_tree_handler) { $this->_listTree($this, $file_tree_handler, new Moxiecode_DummyFileFilter(), 0); } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file * if the file filter accepts the file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. * @param FileTreeHandler &$file_filter FileFilter instance to filter files by. */ function listTreeFiltered(&$file_tree_handler, &$file_filter) { $this->_listTree($this, $file_tree_handler, $file_filter, 0); } // * * Private methods /** * Lists files recursive, and places the files in the specified array. */ function _listTree($file, &$file_tree_handler, &$file_filter, $level) { $state = $file_tree_handler->CONTINUE; if ($file_filter->accept($file)) { $state = $file_tree_handler->handle($file, $level); if ($state == $file_tree_handler->ABORT || $state == $file_tree_handler->ABORT_FOLDER) return $state; } $files = $file->listFiles(); foreach ($files as $file) { if ($file_filter->accept($file)) { if ($file->isFile()) { // This is some weird shit! //if (!is_object($file_filter)) $state = $file_tree_handler->handle($file, $level); } else { $state = $this->_listTree($file, $file_tree_handler, $file_filter, ++$level); --$level; } } if ($state == $file_tree_handler->ABORT) return $state; } return $file_tree_handler->CONTINUE; } } ?>plugins/imagemanager/classes/FileSystems/BaseFile.php000066600000014545150472426320016753 0ustar00plugins/imagemanager/classes/FileSystems/FileStream.php000066600000002526150472426320017330 0ustar00plugins/imagemanager/classes/FileSystems/RootFileImpl.php000066600000002617150472426320017643 0ustar00_manager; $files = array(); $roots = $man->getRootPaths(); foreach ($roots as $root) { $file = $man->getFile($root); // Configured root doesn't exists if (!$file->exists()) { error("Configured root: " . $root . " could not be found."); continue; } if ($filter->accept($file)) $files[] = $file; } return $files; } } ?>plugins/imagemanager/classes/FileSystems/FileTreeHandler.php000066600000011423150472426320020266 0ustar00_onlyFiles = false; $this->_onlyDirs = false; } /** * Sets only files mode. * * @param bool $only_files true if only files should be added to output. */ function setOnlyFiles($only_files) { $this->_onlyFiles = $only_files; } /** * Gets only files mode. * * @return bool true if only files should be added to output. */ function getOnlyFiles() { return $this->_onlyFiles; } /** * Sets only dirs mode. * * @param bool $only_dirs true if only dirs should be added to output. */ function setOnlyDirs($only_dirs) { $this->_onlyDirs = $only_dirs; } /** * Gets only dirs mode. * * @return bool true if only dirs should be added to output. */ function getOnlyDirs() { return $this->_onlyDirs; } /** * Sets the max level to include in tree parse. * * @param int $level max level to include in tree parse. */ function setMaxLevel($level) { $this->_maxLevel = $level; } /** * Sets is the result is to be built in to an array or not. * The result is returned by getFileArray when the tree list completes. * Note: The default value of this state is false. * * @param boolean $state True if the result is to be built in to an array or not. */ function setMakeArray($state) { $this->_makeArray = $state; if ($this->_makeArray) $this->_array = array(); } /** * Returns the tree as an array of MCE_File instances. This method * will not return anything if the setMakeArray isn't set to true. * * @return Array Array of MCE_File instances. */ function &getFileArray() { return $this->_array; } /** * Handles a file instance while looping an tree of directories. * * @param MCE_File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $add = true; if (is_array($this->_array) && $this->_onlyDirs && $file->isFile()) $add = false; if (is_array($this->_array) && $this->_onlyFiles && $file->isDir()) $add = false; if ($add) $this->_array[] = $file; if ($this->_maxLevel && $level >= $this->_maxLevel) return $this->ABORT_FOLDER; return $this->CONTINUE; } /**#@-*/ } class Moxiecode_ConfigFilteredFileTreeHandler extends Moxiecode_BasicFileTreeHandler { var $_config; /** * Handles a file instance while looping an tree of directories. * * @param MCE_File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { if ($file->isDirectory() || !is_array($this->_config)) { if ($level == 0) return parent::handle($file, $level); else $parentFile = $file->getParentFile(); $this->_config = $parentFile->getConfig(); } $filter = new Moxiecode_BasicFileFilter(); $filter->setIncludeFilePattern($this->_config['filesystem.include_file_pattern']); $filter->setExcludeFilePattern($this->_config['filesystem.exclude_file_pattern']); $filter->setIncludeDirectoryPattern($this->_config['filesystem.include_directory_pattern']); $filter->setExcludeDirectoryPattern($this->_config['filesystem.exclude_directory_pattern']); $filter->setOnlyDirs($this->_onlyDirs); if (!$filter->accept($file)) return $this->ABORT_FOLDER; return parent::handle($file, $level); } } ?>plugins/imagemanager/classes/FileSystems/FileFilter.php000066600000026267150472426320017332 0ustar00_filters = array(); } /** * Adds a new filter to check. * * @param Moxiecode_FileFilter $file_filter Filter to add. */ function addFilter(&$file_filter) { $this->_filters[] = $file_filter; } /** * Returns true or false if the file is accepted or not. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { for ($i = 0; $i < count($this->_filters); $i++) { $state = $this->_filters[$i]->accept($file); if ($state < 0) return $state; } return 1; } } /** * DummyFileFiler this filter accepts all files. * * @package mce.core */ class Moxiecode_DummyFileFilter extends Moxiecode_FileFilter { /** * Returns true or false if the file is accepted or not. * Note: This dummb method allways returns true. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { return true; } } // Define reason constants define('BASIC_FILEFILTER_ACCEPTED', 1); define('BASIC_FILEFILTER_INVALID_EXTENSION', -1); define('BASIC_FILEFILTER_INVALID_NAME', -2); /** * Basic file filter, this class handles some common filter problems * and is possible to extend if needed. * * @package mce.core */ class Moxiecode_BasicFileFilter extends Moxiecode_FileFilter { /**#@+ * @access private */ var $_excludeFolders; var $_includeFolders; var $_excludeFiles; var $_includeFiles; var $_includeFilePattern; var $_excludeFilePattern; var $_includeDirectoryPattern; var $_excludeDirectoryPattern; var $_filesOnly; var $_dirsOnly; var $_includeWildcardPattern; var $_excludeWildcardPattern; var $_extensions; var $_maxLevels; var $_debug; /**#@+ * @access public */ /** * Main constructor. */ function BasicFileFilter() { $this->_debug = false; $this->_extensions = ""; } /** * Sets if debug mode is on or off, default off. * * @param boolean $state if true debug mode is enabled. */ function setDebugMode($state) { $this->_debug = $state; } /** * Sets if only files are to be accepted in result. * * @param boolean $files_only True if only files are to be accepted. */ function setOnlyFiles($files_only) { $this->_filesOnly = $files_only; } /** * Sets if only dirs are to be accepted in result. * * @param boolean $dirs_only True if only dirs are to be accepted. */ function setOnlyDirs($dirs_only) { $this->_dirsOnly = $dirs_only; } /** * Sets maximum number of directory levels to accept. * * @param int $max_levels Maximum number of directory levels to accept. */ function setMaxLevels($max_levels) { $this->_maxLevels = $max_levels; } /** * Sets a comma separated list of valid file extensions. * * @param String $extensions Comma separated list of valid file extensions. */ function setIncludeExtensions($extensions) { if ($extensions == "*" || $extensions == "") return; $this->_extensions = explode(',', strtolower($extensions)); } /** * Sets comma separated string list of filenames to exclude. * * @param String $files separated string list of filenames to exclude. */ function setExcludeFiles($files) { if ($files != "") $this->_excludeFiles = split(',', $files); } /** * Sets comma separated string list of filenames to include. * * @param String $files separated string list of filenames to include. */ function setIncludeFiles($files) { if ($files != "") $this->_includeFiles = split(',', $files); } /** * Sets comma separated string list of foldernames to exclude. * * @param String $folders separated string list of foldernames to exclude. */ function setExcludeFolders($folders) { if ($folders != "") $this->_excludeFolders = split(',', $folders); } /** * Sets comma separated string list of foldernames to include. * * @param String $folders separated string list of foldernames to include. */ function setIncludeFolders($folders) { if ($folders != "") $this->_includeFolders = split(',', $folders); } /** * Sets a regexp pattern that is used to accept files path parts. * * @param String $pattern regexp pattern that is used to accept files path parts. */ function setIncludeFilePattern($pattern) { $this->_includeFilePattern = $pattern; } /** * Sets a regexp pattern that is used to deny files path parts. * * @param String $pattern regexp pattern that is used to deny files path parts. */ function setExcludeFilePattern($pattern) { $this->_excludeFilePattern = $pattern; } /** * Sets a regexp pattern that is used to accept directory path parts. * * @param String $pattern regexp pattern that is used to accept directory path parts. */ function setIncludeDirectoryPattern($pattern) { $this->_includeDirectoryPattern = $pattern; } /** * Sets a regexp pattern that is used to deny directory path parts. * * @param String $pattern regexp pattern that is used to deny directory path parts. */ function setExcludeDirectoryPattern($pattern) { $this->_excludeDirectoryPattern = $pattern; } /** * Sets a wildcard pattern that is used to accept files path parts. * * @param String $pattern wildcard pattern that is used to accept files path parts. */ function setIncludeWildcardPattern($pattern) { if ($pattern != "") $this->_includeWildcardPattern = $pattern; } /** * Sets a wildcard pattern that is used to deny files path parts. * * @param String $pattern wildcard pattern that is used to deny files path parts. */ function setExcludeWildcardPattern($pattern) { if ($pattern != "") $this->_excludeWildcardPattern = $pattern; } /** * Returns true or false if the file is accepted or not. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { $name = $file->getName(); $absPath = $file->getAbsolutePath(); $isFile = $file->isFile(); // Handle exclude folders if (is_array($this->_excludeFolders)) { foreach ($this->_excludeFolders as $folder) { if (strpos($absPath, $folder) != "") { if ($this->_debug) debug("File denied \"" . $absPath . "\" by \"excludeFolders\"."); return BASIC_FILEFILTER_INVALID_NAME; } } } // Handle include folders if (is_array($this->_includeFolders)) { $state = false; foreach ($this->_includeFolders as $folder) { if (strpos($absPath, $folder) != "") { $state = true; break; } } if (!$state) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFolders\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle exclude files if (is_array($this->_excludeFiles) && $isFile) { foreach ($this->_excludeFiles as $fileName) { if ($name == $fileName) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeFiles\"."); return BASIC_FILEFILTER_INVALID_NAME; } } } // Handle include files if (is_array($this->_includeFiles) && $isFile) { $state = false; foreach ($this->_includeFiles as $fileName) { if ($name == $fileName) { $state = true; break; } } if (!$state) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFiles\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle file patterns if ($isFile) { if ($this->_dirsOnly) { if ($this->_debug) debug("File denied \"" . $absPath . "\" by \"dirsOnly\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude pattern if ($this->_excludeFilePattern && preg_match($this->_excludeFilePattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeFilePattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle include pattern if ($this->_includeFilePattern && !preg_match($this->_includeFilePattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFilePattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } } else { if ($this->_filesOnly) { if ($this->_debug) debug("Dir denied \"" . $absPath . "\" by \"filesOnly\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude pattern if ($this->_excludeDirectoryPattern && preg_match($this->_excludeDirectoryPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeDirectoryPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle include pattern if ($this->_includeDirectoryPattern && !preg_match($this->_includeDirectoryPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeDirectoryPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle include wildcard pattern if ($this->_includeWildcardPattern && !$this->_fnmatch($this->_includeWildcardPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeWildcardPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude wildcard pattern if ($this->_excludeWildcardPattern && $this->_fnmatch($this->_excludeWildcardPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeWildcardPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle file exntetion pattern if (is_array($this->_extensions) && $isFile) { $ar = explode('.', $absPath); $ext = strtolower(array_pop($ar)); $valid = false; foreach ($this->_extensions as $extension) { if ($extension == $ext) { $valid = true; break; } } if (!$valid) return BASIC_FILEFILTER_INVALID_EXTENSION; } return BASIC_FILEFILTER_ACCEPTED; } function _fnmatch($pattern, $file) { return ereg($this->_fnmatch2regexp(strtolower($pattern)), strtolower($file)); } function _fnmatch2regexp($str) { $s = ""; for ($i = 0; $iplugins/imagemanager/classes/ManagerEngine.php000066600000100001150472426320015511 0ustar00_plugins = array(); $this->_prefixes = array(); $this->_rootPaths = array(); $this->_config = array(); $this->_type = $type; } /** * Sets the name/value array of config options. This method will also force some relative config option paths to absolute. * * @param Array $config Name/value array of config options. * @param bool $setup_values True/false if the paths etc of the config should be set to default values or not. */ function setConfig($config, $setup_values = true) { $this->_rootPaths = array(); if ($setup_values) { // Auto add rootpaths and force them absolute in config $newRoots = array(); $roots = explode(';', $config['filesystem.rootpath']); foreach ($roots as $root) { $rootParts = explode('=', $root); // Unnamed root if (count($rootParts) == 1) { $rootParts[0] = $this->removeTrailingSlash($this->toAbsPath($rootParts[0])); $this->addRootPath($rootParts[0]); } // Named root if (count($rootParts) == 2) { $rootParts[1] = $this->removeTrailingSlash($this->toAbsPath($rootParts[1])); $this->addRootPath($rootParts[1]); } $newRoots[] = implode('=', $rootParts); } $config['filesystem.rootpath'] = implode(';', $newRoots); // Force absolute path if ($config['filesystem.path'] == "") $config['filesystem.path'] = $this->_rootPaths[0]; else $config['filesystem.path'] = $this->removeTrailingSlash($this->toAbsPath($config['filesystem.path'])); // Setup absolute wwwroot if (isset($config['preview.wwwroot']) && $config['preview.wwwroot']) $config['preview.wwwroot'] = $this->toUnixPath($this->toAbsPath($config['preview.wwwroot'])); else $config['preview.wwwroot'] = $this->getSiteRoot(); // Setup preview.urlprefix if ($config["preview.urlprefix"]) { if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") $config["preview.urlprefix"] = str_replace("{proto}", "https", $config["preview.urlprefix"]); else $config["preview.urlprefix"] = str_replace("{proto}", "http", $config["preview.urlprefix"]); $config["preview.urlprefix"] = str_replace("{host}", $_SERVER['HTTP_HOST'], $config["preview.urlprefix"]); $config["preview.urlprefix"] = str_replace("{port}", $_SERVER['SERVER_PORT'], $config["preview.urlprefix"]); } } $this->_config =& $config; } function getType() { return $this->_type; } function setLangPackPath($path) { $this->_langPackPath = $path; } function getLangPackPath() { return $this->_langPackPath; } /** * Returns a LanguagePack instance of the current language pack. * * @return LanguagePack Instance of the current language pack. */ function &getLangPack() { if (!$this->_language) { $config = $this->getConfig(); $this->_language = new Moxiecode_LanguagePack(); $this->_language->load($this->toAbsPath("language/" . $this->_langPackPath . "/" . $config['general.language'] . ".xml")); } return $this->_language; } /** * Returns a lang item by group and key. * * @param string $group Language group to look in. * @param string $item Item to get inside group. * @param Array $replace Name/Value array of variables to replace in language pack. * @return string Language pack string loaded from XML file. */ function getLangItem($group, $item, $replace = array()) { $pack =& $this->getLangPack(); $string = $pack->get($group, $item); foreach ($replace as $key => $val) $string = str_replace("{". $key ."}", $val, $string); return $string; } /** * Returns an array of plugin paths to be loaded/required/includes. * * @return Array Array of file paths to load. */ function getPluginPaths() { global $basepath; $config = $this->getConfig(); $plugins = array(); if (isset($config["general.plugins"]) && $config["general.plugins"]) $plugins = preg_split("/,/i", $config["general.plugins"]); $out = array(); foreach($plugins as $plugin) { if (!isset($this->_plugins[strtolower($plugin)])) { // Check for single file plugins if (file_exists($basepath . "../plugins/" . $plugin . ".php")) $out[] = "plugins/" . $plugin . ".php"; else $out[] = "plugins/" . $plugin . "/". $plugin . ".php"; } } // Check the string first if ($config["authenticator"] == "") $config["authenticator"] = "BaseAuthenticator"; $authenticators = array(); // Check string for delimiter, preg_split returns php warning if delimiter is not found! if (strpos($config["authenticator"], "+") || strpos($config["authenticator"], "|")) $authenticators = preg_split("/\+|\|/i", $config["authenticator"], -1, PREG_SPLIT_NO_EMPTY); if (count($authenticators) != 0) { foreach ($authenticators as $auth) { // Check for single file plugins if (!isset($this->_plugins[strtolower($auth)])) { if (file_exists($basepath . "../plugins/" . $auth . ".php")) $out[] = "plugins/" . $auth . ".php"; else $out[] = "plugins/" . $auth . "/". $auth . ".php"; } } } else { if (!isset($this->_plugins[strtolower($config["authenticator"])])) { if (file_exists($basepath . "Authenticators/" . $config["authenticator"] . ".php")) $out[] = "classes/Authenticators/" . $config["authenticator"] . ".php"; else if (file_exists($basepath . "../plugins/" . $config["authenticator"] . ".php")) $out[] = "plugins/" . $config["authenticator"] . ".php"; else $out[] = "plugins/" . $config["authenticator"] . "/" . $config["authenticator"] . ".php"; } } // Check so that they all exists foreach ($out as $path) { if (!file_exists($basepath . "../" . $path)) trigger_error("Plugin could not be found: " . $path, FATAL); } return $out; } /** * Adds a path to the list of root paths. * * @param String $path Path to add must be a absolute path. */ function addRootPath($path) { $this->_rootPaths[] = $path; } /** * Returns an array of root paths. * * @return Array Root paths. */ function getRootPaths() { return $this->_rootPaths; } /** * Returns a plugin by id/name. * * @param String $name Plugin id/name. * @return MCManagerPlugin instance object. */ function getPlugin($name) { return isset($this->_plugins[$name]) ? $this->_plugins[$name] : null; } /** * Returns a true/false check for plugin. * * @param String $name Plugin id/name. * @return Bool true/false */ function hasPlugin($name) { return isset($this->_plugins[$name]); } /** * Returns a name/value array of plugins. * * @return Array name/value array of MCManagerPlugin instances. */ function getPlugins() { return $this->_plugins; } /** * Registers a plugin by id/name. * * @param $name Id/name to register plugin by. * @param $plugin Plugin instance to register/add to list. * * @return SmallMCEPlugin The added plugin instance. */ function ®isterPlugin($name, &$plugin, $prefix = false) { $name = strtolower($name); $this->_plugins[$name] =& $plugin; if ($prefix != false) $this->_prefixes[$name] = $prefix; return $plugin; } /** * Returns the MCManager config as name/value array. * * @return Array MCManager config as name/value array. */ function &getConfig() { return $this->_config; } /** * Returns the a config item by name. * * @param string $key Config item key to retrive. * @param string $def Default value to return. * @return mixed config item by name. */ function getConfigItem($key, $def = false) { return isset($this->_config[$key]) ? $this->_config[$key] : $def; } /** * Returns a merged JS config. It will only export configured items controlled by the allow_export suffix. * * @return Array Name/Value array of JS config options. */ function &getJSConfig($config = false, $prefixes = '*') { $encrypted = array("filesystem.path", "filesystem.rootpath", "filesystem.directory_templates"); $jsConfig = array(); $prefixes = explode(",", $prefixes); if (!$config) $config = $this->getConfig(); foreach ($config as $name => $value) { $pos = strpos($name, ".allow_export"); if ($pos > 0) { $names = explode(",", $value); $prefix = substr($name, 0, $pos); if (in_array("*", $prefixes) || in_array($prefix, $prefixes)) { foreach ($names as $key) { $key = $prefix . "." . $key ; // Encrypt some paths if (in_array($key, $encrypted)) $jsConfig[$key] = "" . $this->encryptPath($config[$key]); else $jsConfig[$key] = "" . is_bool($config[$key]) ? ($config[$key] ? "true" : "false") : $config[$key]; } } } } return $jsConfig; } /** * Encrypts the specified path so that it doesn't contain full paths on the client side of the application. * * @param string $path Path to encrypt. * @return string Encrypted short path. */ function encryptPath($path) { $config = $this->getConfig(); if (checkBool($config['general.encrypt_paths'])) { $count = 0; foreach ($this->_rootPaths as $rootPath) { // Needs encryption? if ($rootPath != "/") $path = str_replace($rootPath, "{" . $count++ . "}", $path); } } return utf8_encode($path); } /** * Decrypts the specified path from a non absolute path to a absolute path. * * @param string $path Path to decrypt. * @return string Decrypted absolute path. */ function decryptPath($path) { if (!$path) return ""; $count = 0; $path = $this->toUnixPath($path); // Is relative path if (!(strpos($path, '/') === 0 || strpos($path, ':') !== false || strpos($path, '{') !== false)) $path = realpath(dirname(__FILE__) . '/../' . $path); foreach ($this->_rootPaths as $rootPath) $path = str_replace("{" . $count++ . "}", $rootPath, $path); $path = str_replace("{default}", $this->_config["filesystem.path"], $path); return $path; } /** * isAuthenticated checks against the configuration and sends events to auth plugins. * This method will also call the onBeforeInit, onInit and onAfterInit methods if the user was authenticated. * * @return bool Returns true if authenticated, false if not. */ function isAuthenticated() { $config = $this->getConfig(); $authenticators = strtolower($config["authenticator"]); // Check the string first if ($authenticators != "" && $authenticators != "BaseAuthenticator") { if (strpos($authenticators, "|") && strpos($authenticators, "+")) trigger_error("You can not use both + and | at the same time for adding authenticators.", FATAL); $pass = false; // Check for AND authenticators if (strpos($authenticators, "+")) { $authArray = preg_split("/\+/i", $authenticators, -1, PREG_SPLIT_NO_EMPTY); if (!$authArray) trigger_error("No Authenticator could be used.", FATAL); // Verify that all authenticators exists foreach($authArray as $auth) { if (!$this->hasPlugin($auth)) trigger_error("Authenticator \"". htmlentities($auth) ."\" was not found.", FATAL); } // Default to true $pass = true; // Send AND event foreach ($authArray as $auth) { $plugin = $this->getPlugin($auth); if ($pass && !$plugin->onAuthenticate($this)) $pass = false; } // Check for OR authentocator string } else if (strpos($authenticators, "|")) { $authArray = preg_split("/\|/i", $authenticators, -1, PREG_SPLIT_NO_EMPTY); if (!$authArray) trigger_error("No Authenticator could be used.", FATAL); // Verify that all authenticators exists foreach ($authArray as $auth) { if (!$this->hasPlugin($auth)) trigger_error("Authenticator \"". htmlentities($auth) ."\" was not found.", FATAL); } // Default to false $pass = false; // Send OR event foreach ($authArray as $auth) { $plugin = $this->getPlugin($auth); if ($plugin->onAuthenticate($this)) $pass = true; } } else { $plugin = $this->getPlugin($authenticators); if ($plugin->onAuthenticate($this)) $pass = true; } } else $pass = true; // Is authenticated, call onInit if ($pass) $this->dispatchEvent("onInit"); // Set config again to update rootpaths etc $this->setConfig($this->_config); return $pass; } /** * Dispatches a event to all registered plugins. This method will loop through all plugins and call the specific event if this * event method returns false the chain will be terminated. * * @param String $event Event name to be dispatched for example onAjaxCommand. * @param Array $args Optional array with arguments. * @return Bool Returns true of a plugin returned true, false if not. */ function dispatchEvent($event, $args=false) { // Setup event arguments $keys = array_keys($this->_plugins); for ($i=0; $i_plugins[$keys[$i]]; // Valid prefix if (isset($this->_prefixes[$keys[$i]])) { if ($this->_type != $this->_prefixes[$keys[$i]]) continue; } switch ($event) { case "onAuthenticate": if (!$plugin->onAuthenticate($this)) return false; break; case "onInit": if (!$plugin->onInit($this)) return false; break; case "onPreInit": if (!$plugin->onPreInit($this, $args[0])) return false; break; case "onLogin": if (!$plugin->onLogin($this)) return false; break; case "onLogout": if (!$plugin->onLogout($this)) return false; break; case "onBeforeFileAction": if (!isset($args[2])) $args[2] = null; if (!$plugin->onBeforeFileAction($this, $args[0], $args[1], $args[2])) return false; break; case "onFileAction": if (!isset($args[2])) $args[2] = null; if (!$plugin->onFileAction($this, $args[0], $args[1], $args[2])) return false; break; case "onBeforeRPC": if (!$plugin->onBeforeRPC($this, $args[0], $args[1])) return false; break; case "onBeforeStream": if (!$plugin->onBeforeStream($this, $args[0], $args[1])) return false; break; case "onStream": if (!$plugin->onStream($this, $args[0], $args[1])) return false; break; case "onAfterStream": if (!$plugin->onAfterStream($this, $args[0], $args[1])) return false; break; case "onBeforeUpload": if (!$plugin->onBeforeUpload($this, $args[0], $args[1])) return false; break; case "onAfterUpload": if (!$plugin->onAfterUpload($this, $args[0], $args[1])) return false; break; case "onCustomInfo": if (!$plugin->onCustomInfo($this, $args[0], $args[1], $args[2])) return false; break; case "onListFiles": if (!$plugin->onListFiles($this, $args[0], $args[1])) return false; break; case "onInsertFile": if (!$plugin->onInsertFile($this, $args[0])) return false; break; } } return true; } /** * Executes a event in all registered plugins if a plugin returns a object or array the execution chain will be * terminated. * * @param String $event Event name to be dispatched for example onAjaxCommand. * @param Array $args Optional array with arguments. * @return Bool Returns true of a plugin returned true, false if not. */ function executeEvent($event, $args=false) { // Setup event arguments $keys = array_keys($this->_plugins); for ($i=0; $i_plugins[$keys[$i]]; // Valid prefix if (isset($this->_prefixes[$keys[$i]])) { if ($this->_type != $this->_prefixes[$keys[$i]]) continue; } switch ($event) { case "onRPC": $result =& $plugin->onRPC($this, $args[0], $args[1]); if (!is_null($result)) return $result; break; case "onUpload": $result =& $plugin->onUpload($this, $args[0], $args[1]); if (!is_null($result)) return $result; break; } } return null; } function getInvalidFileMsg() { return $this->_invalidFileMsg; } /** * Returns the wwwroot if it fails it will trigger a fatal error. * * @return String wwwroot or null string if it was impossible to get. */ function getSiteRoot() { // Check config if (isset($this->_config['preview.wwwroot']) && $this->_config['preview.wwwroot']) return $this->toUnixPath(realpath($this->_config['preview.wwwroot'])); // Try script file if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["SCRIPT_FILENAME"])) { $path = str_replace($this->toUnixPath($_SERVER["SCRIPT_NAME"]), "", $this->toUnixPath($_SERVER["SCRIPT_FILENAME"])); if (is_dir($path)) return $this->toUnixPath(realpath($path)); } // If all else fails, try this. if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["PATH_TRANSLATED"])) { $path = str_replace($this->toUnixPath($_SERVER["SCRIPT_NAME"]), "", str_replace("//", "/", $this->toUnixPath($_SERVER["PATH_TRANSLATED"]))); if (is_dir($path)) return $this->toUnixPath(realpath($path)); } // Check document root if (isset($_SERVER['DOCUMENT_ROOT'])) return $this->toUnixPath(realpath($_SERVER['DOCUMENT_ROOT'])); trigger_error("Could not resolve WWWROOT path, please set an absolute path in preview.wwwroot config option. Check the Wiki documentation for details.", FATAL); return null; } /** * Returns a absolute file system path of a absolute URI path for example /mydir/myfile.htm * will be resolved to /www/mywwwroot/mydir/myfile.htm. * * @param String $uri Absolute URI path for example /mydir/myfile.htm * @param String $root Option site root to use. * @return String Absolute file system path or empty string on failure. */ function resolveURI($uri, $root = false) { // Use default root if not specified if (!$root) $root = $this->getSiteRoot(); return realpath($root . $uri); } /** * Returns a site absolute path from a absolute file system path for example /www/mywwwroot/mydir/myfile.htm * will be converted to /mydir/myfile.htm. * * @param String $abs_path Absolute path for example /mydir/myfile.htm * @return String Site absolute path (URI) or empty string on failure. */ function convertPathToURI($abs_path, $root = false) { $log =& $this->getLogger(); // No root defined use specified root if (!$root) $root = $this->getSiteRoot(); if (!$root) { trigger_error("Could not resolve WWWROOT path, please set an absolute path in preview.wwwroot config option.", FATAL); die(); } if ($root == "/") { if ($log && $log->isDebugEnabled()) $log->info("ConvertPathToURI: SiteRoot=" . $root . ", Path: " . $abs_path . " -> URI: " . $abs_path); return $abs_path; } $uri = substr($abs_path, strlen($root)); if ($log && $log->isDebugEnabled()) $log->info("ConvertPathToURI: SiteRoot=" . $root . ", Path: " . $abs_path . " -> URI: " . $uri); return $uri; } /** * Converts a URI such as /somedir/somefile.gif to /system/path/somedir/somefile.gif * * @param String $uri URI to convert to path. * @param String $root Optional site root to use. * @return String Path out of URI. */ function convertURIToPath($uri, $root = false) { $log =& $this->getLogger(); if (!$root) $root = $this->getSiteRoot(); if ($log && $log->isDebugEnabled()) $log->info("ConvertURIToPath: SiteRoot=" . $root . ", URI: " . $uri . " -> Path: " . $this->removeTrailingSlash($root) . $uri); return $this->removeTrailingSlash($root) . $uri; } /** * Converts an path into a visualy presentatble path. So that special folder names * gets translated and root paths gets replaced with their names. * * @param String $path Path to convert into a visual path. * @return String Visual path based on input path. */ function toVisualPath($path, $root = false) { $fs = "file"; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } $path = $this->decryptPath($path); // Speficied root if ($root) { $pos = strpos($path, $root); if ($pos === 0) $path = substr($path, strlen($root)); if ($path == "") $path = "/"; // Re-attach fs if ($fs != "file") $path = $fs . "://" . $path; return $this->encryptPath($path); } // Use config roots $rootNames = $this->_getRootNames(); foreach ($rootNames as $rootPath => $name) { $pos = strpos($path, $rootPath); if ($pos === 0) { $path = substr($path, strlen($rootPath)); if ($name == "/") $name = ""; $path = "/" . $name . $path; } } if (!$path) $path = "/"; // Re-attach fs if ($fs != "file") $path = $fs . "://" . $path; return $this->encryptPath($path); } /** * Verifies that a path is within the parent path. * * @param String $parent_path Parent path that must contain the path. * @param String $path Path that must contained the parent path. * @return Bool true if it's valid, false if it's not. */ function isChildPath($parent_path, $path) { return strpos(strtolower($path), strtolower($parent_path)) === 0; } /** * Checks if a specific tool is enabled or not. * * @param string $tool Tool to check for. * @param Array $config Name/Value config array to check tool against. * @return bool true/false if the tool is enabled or not. */ function isToolEnabled($tool, $config = false) { if (!$config) $config = $this->getConfig(); $ar = explode(',', $config['general.disabled_tools']); if (in_array($tool, $ar)) return false; $ar = explode(',', $config['general.tools']); if (in_array($tool, $ar)) return true; return false; } /** * Verifies that the specified path is within valid root paths. * * @param String $path Path to verify. * @return Bool true if the path is valid, false if it's invalid. */ function verifyPath($path) { $fs = "file"; $valid = false; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } // Filesystem wasn't found if (!isset($this->_fileSystems[$fs])) { trigger_error($this->getLangItem("error", "no_filesystem", array("path" => $path)), FATAL); die(); } $path = $this->decryptPath($path); // /../ is never valid if (indexOf($this->addTrailingSlash($path), "/../") != -1) return false; if ($fs != 'file') return true; foreach ($this->_rootPaths as $rootPath) { if ($this->isChildPath($rootPath, $path)) $valid = true; } return $valid; } /** * Returns the file system for a path for file if it couldn't be extracted. * * @param string $path Path to get FS from. * @return string Filesystem for path. */ function getFSFromPath($path) { $fs = "file"; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) $fs = $matches[1]; return $fs; } /** * Verifies that the specified file is valid agains the filters specified in config. * * @param String $path Path to verify. * @param String $action Action to get config options by. * @param Array $config Name/Value array of config options. * @return int Reason why it was denied. */ function verifyFile($file, $action = false, $config = false) { $config = $config ? $config : $file->getConfig(); // Verify filesystem config $fileFilter = new Moxiecode_BasicFileFilter(); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); $this->_invalidFileMsg = "{#error.invalid_filename}"; $status = $fileFilter->accept($file); if ($status != BASIC_FILEFILTER_ACCEPTED) { if ($status == BASIC_FILEFILTER_INVALID_NAME) { if ($file->isFile() && isset($config['filesystem.invalid_file_name_msg'])) $this->_invalidFileMsg = $config['filesystem.invalid_file_name_msg']; else if (!$file->isFile() && isset($config['filesystem.invalid_directory_name_msg'])) $this->_invalidFileMsg = $config['filesystem.invalid_directory_name_msg']; if (!$this->_invalidFileMsg) $this->_invalidFileMsg = "{#error.invalid_filename}"; } return $status; } // Verify action specific config $fileFilter = new Moxiecode_BasicFileFilter(); if ($action) { if (isset($config[$action . '.include_directory_pattern'])) $fileFilter->setIncludeDirectoryPattern($config[$action . '.include_directory_pattern']); if (isset($config[$action . '.exclude_directory_pattern'])) $fileFilter->setExcludeDirectoryPattern($config[$action . '.exclude_directory_pattern']); if (isset($config[$action . '.include_file_pattern'])) $fileFilter->setIncludeFilePattern($config[$action . '.include_file_pattern']); if (isset($config[$action . '.exclude_file_pattern'])) $fileFilter->setExcludeFilePattern($config[$action . '.exclude_file_pattern']); if (isset($config[$action . '.extensions'])) $fileFilter->setIncludeExtensions($config[$action . '.extensions']); } else return BASIC_FILEFILTER_ACCEPTED; $status = $fileFilter->accept($file); if ($status != BASIC_FILEFILTER_ACCEPTED) { if ($status == BASIC_FILEFILTER_INVALID_NAME) { $this->_invalidFileMsg = "{#error.invalid_filename}"; if ($file->isFile()) { if (isset($config[$action . '.invalid_file_name_msg'])) $this->_invalidFileMsg = $config[$action . '.invalid_file_name_msg']; } else { if (isset($config[$action . '.invalid_directory_name_msg'])) $this->_invalidFileMsg = $config[$action . '.invalid_directory_name_msg']; } } return $status; } return BASIC_FILEFILTER_ACCEPTED; } /** * Returns a file object represtentation of a file path this * will also do security checks agains the list of valid paths * so that file IO can't be done outside the valid paths. * * @param String $path Path to return as File object. * @param String $file_name Optional file name. * @param String $type Optional file type. * @return File File object representation of a file. */ function &getFile($path, $file_name = "", $type = MC_IS_FILE) { $path = utf8_decode($path); $file_name = utf8_decode($file_name); $fs = 'file'; $matches = array(); $oldpath = $path; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } // Filesystem wasn't found if (!isset($this->_fileSystems[$fs])) { trigger_error($this->getLangItem("error", "no_filesystem", array("path" => $path)), FATAL); die(); } $path = $this->decryptPath($path); $path = $this->removeTrailingSlash($this->toUnixPath($path)); // Verfiy path if no file was returned if ($fs == 'file' && !$this->verifyPath($path)) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } // Validate file name if ($fs == 'file' && $file_name) { if (preg_match('/[\\\\\\/:]+/', $file_name, $matches)) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } } // Get file instance $file = new $this->_fileSystems[$fs]($this, $path, $file_name, $type); // Verfiy path if no file was returned if ($fs == 'file' && !$this->verifyPath($file->getAbsolutePath())) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } return $file; } /** * Converts a relative path to absolute path. * * @param string $path Path to convert to absolute. * @param string $basepath Optional base path default to ../. */ function toAbsPath($path, $basepath = false) { $path = $this->toUnixPath($path); if (!$basepath) $basepath = dirname(__FILE__) . "/../"; // Is absolute unix or windows if (substr($path, 0, 1) == '/' || strpos($path, ":") !== false) { // Resolve symlinks $tmp = realpath($path); if ($tmp) $path = $tmp; return $this->toUnixPath($path); } $path = $this->toUnixPath($this->addTrailingSlash($this->toUnixPath(realpath($basepath))) . $path); // Local FS and exists remove any ../../ if (strpos($path, "://") === false && file_exists($path)) $path = $this->toUnixPath(realpath($path)); return $path; } /** * Converts a Unix path to OS specific path. * * @param String $path Unix path to convert. */ function toOSPath($path) { return str_replace("/", DIRECTORY_SEPARATOR, $path); } /** * Converts a OS specific path to Unix path. * * @param String $path OS path to convert to Unix style. */ function toUnixPath($path) { return str_replace(DIRECTORY_SEPARATOR, "/", $path); } /** * Adds a trailing slash to a path. * * @param String path Path to add trailing slash on. * @return String New path with trailing slash. */ function addTrailingSlash($path) { if (strlen($path) > 0 && $path[strlen($path)-1] != '/') $path .= '/'; return $path; } /** * Removes the trailing slash from a path. * * @param String path Path to remove trailing slash from. * @return String New path without trailing slash. */ function removeTrailingSlash($path) { // Is root if ($path == "/") return $path; if ($path == "") return $path; if ($path[strlen($path)-1] == '/') $path = substr($path, 0, strlen($path)-1); return $path; } /** * Adds a new file system bu name. * * @param String $protocol File protocol like zip/ftp etc. * @param String $file_system Name of class to create instances by. */ function registerFileSystem($protocol, $file_system) { $this->_fileSystems[$protocol] = $file_system; } /** * Returns a logger instance. * * @return Logger New logger instance. */ function &getLogger() { if (!$this->_logger) { $log = new Moxiecode_Logger(); $null = null; // PHP why!!! Other languages can return null if (!checkBool($this->getConfigItem("log.enabled"))) return $null; // Set logger options $log->setLevel($this->getConfigItem("log.level", "fatal")); $log->setPath($this->toAbsPath($this->getConfigItem("log.path", "logs"))); $log->setFileName($this->getConfigItem("log.filename", "{level}.log")); $log->setFormat($this->getConfigItem("log.format", "[{time}] [{level}] {message}")); $log->setMaxSize($this->getConfigItem("log.max_size", "100k")); $log->setMaxFiles($this->getConfigItem("log.max_files", "10")); $this->_logger = $log; } return $this->_logger; } // * * * * * * * Private methods function _getRootNames() { $config = $this->getConfig(); $output = array(); $roots = explode(';', $config['filesystem.rootpath']); foreach ($roots as $root) { $rootParts = explode('=', $root); if (count($rootParts) > 1) $output[$rootParts[1]] = $rootParts[0]; else { $output[$rootParts[0]] = basename($root); // If it's root if ($output[$rootParts[0]] == "") $output[$rootParts[0]] = "/"; } } return $output; } /**#@-*/ } ?>plugins/imagemanager/classes/CorePlugin.php000066600000074056150472426320015104 0ustar00getConfig(); // Register local and root file system $man->registerFileSystem('file', isset($config['filesystem']) ? $config['filesystem'] : 'Moxiecode_LocalFileImpl'); $man->registerFileSystem('root', 'Moxiecode_RootFileImpl'); return true; } /** * Gets executed when a RPC command is to be executed. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { switch ($cmd) { case "deleteFiles": return $this->_deleteFile($man, $input); case "listFiles": return $this->_listFiles($man, $input); case "createDirs": return $this->_createDirs($man, $input); case "getConfig": return $this->_getConfig($man, $input); case "insertFiles": return $this->_insertFiles($man, $input); case "loopBack": return $this->_loopBack($input); case "keepAlive": return $this->_keepAlive($man, $input); } return null; } /** * Gets called when data is streamed to client. This method should setup * HTTP headers, content type etc and simply send out the binary data to the client and the return false * ones that is done. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onStream(&$man, $cmd, $input) { $config = $man->getConfig(); // Download stream if ($cmd == "download") { if ($man->verifyPath($input["path"])) { $file =& $man->getFile($input["path"]); $config = $file->getConfig(); if ($man->verifyFile($file, "download") > 0 && $file->exists()) { // Get the mimetype, need to go to ../ parent folder cause... well we have to. //$mimeType = mapMimeTypeFromUrl($file->getAbsolutePath(), "../". $config['stream.mimefile']); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"" . $file->getName() . "\""); // Stream data $stream =& $file->open('rb'); if ($stream) { while (($buff = $stream->read()) != null) echo $buff; $stream->close(); } return false; } } else { header('HTTP/1.0 404 Not found'); header('status: 404 Not found'); echo "Requested resource could not be found. Or access was denied."; die(); } // Do not pass to next return false; } // Normal stream if ($cmd == "streamFile") { if (!$man->verifyPath($input["path"]) < 0) { trigger_error("Path verification failed.", FATAL); die(); } $file = $man->getFile($input["path"]); $config = $file->getConfig(); if (!$file->exists()) { trigger_error("File not found.", FATAL); die(); } else { if (getClassName($file) == 'moxiecode_localfileimpl') { // Redirect to data $url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getParent() . "/" . str_replace("+", "%20", urlencode($file->getName())), $config["preview.wwwroot"]) . $config['preview.urlsuffix']; // Passthrough rnd if (isset($input["rnd"])) $url .= (strpos($url, "?") === false ? "?" : "&") . "rnd=" . $input["rnd"]; header('location: ' . $url); die(); } else { // Verify that we can stream this one if ($man->verifyFile($file, "stream") < 0) { header('HTTP/1.0 404 Not found'); header('status: 404 Not found'); echo "Requested resource could not be found. Or access was denied."; die(); } // Get the mimetype, need to go to ../ parent folder cause... well we have to. $mimeType = mapMimeTypeFromUrl($file->getAbsolutePath(), "../". $config['stream.mimefile']); header("Content-type: " . $mimeType); // Stream data $stream =& $file->open('rb'); if ($stream) { while (($buff = $stream->read()) != null) echo $buff; $stream->close(); } } return false; } } // Devkit commands switch ($cmd) { case "viewServerInfo": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); phpinfo(); break; case "downloadServerInfo": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); // Get all ini settings $data = ini_get_all(); // Setup all headers header("Content-type: text/plain; charset=UTF-8"); header("Content-Disposition: attachment; filename=dump.txt"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo "# Config from config.php" . "\r\n\r\n"; foreach ($config as $key => $value) { if (is_bool($value)) echo $key . "=" . ($value ? "true" : "false") . "\r\n"; else echo $key . "=" . $value . "\r\n"; } // Dump INI settings echo "\r\n# PHP INI settings file\r\n\r\n"; foreach ($data as $key => $value) echo $key . "=" . $value['local_value'] . "\r\n"; // Dump function support echo "\r\n# Function check" . "\r\n\r\n"; $functions = array( "ImagecreateFromJpeg", "ImageJpeg", "ImagecreateFromGif", "ImageGif", "ImagecreateFromPng", "ImagePng", "gzdeflate", "gzinflate" ); foreach ($functions as $function) echo $function . "=" . (function_exists($function) ? "ok" : "missing") . "\r\n"; // Dump rootpath access echo "\r\n# Rootpath access" . "\r\n\r\n"; foreach ($man->getRootPaths() as $rootpath) { $stat = stat($rootpath); echo $rootpath . "\r\n"; echo " is_readable=" . (is_readable($rootpath) ? "readable" : "not readable") . "\r\n"; echo " is_writable=" . (is_writable($rootpath) ? "writable" : "not writable") . "\r\n"; foreach ($stat as $key => $value) echo " " . $key . "=" . $value . "\r\n"; } break; case "viewLog": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); header('Content-type: text/plain'); if ($input['level'] == "debug") echo @file_get_contents("../logs/debug.log"); else echo @file_get_contents("../logs/error.log"); break; case "clearLog": header('Content-type: text/plain'); if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); if ($input['level'] == "debug") $log = "../logs/debug.log"; else $log = "../logs/error.log"; @unlink($log); for ($i=0; $i<10; $i++) @unlink($log . "." . $i); echo "Logs cleared."; break; } // Pass to next return true; } /** * Gets called when data is streamed/uploaded from client. This method should take care of * any uploaded files and move them to the correct location. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return object Result object data or null if the event wasn't handled. */ function onUpload(&$man, $cmd, $input) { if ($cmd == "upload") { // Setup response $result = new Moxiecode_ResultSet("status,file,message"); $path = $man->decryptPath($input["path"]); $config = $man->getConfig(); if ($man->verifyPath($path)) { $file =& $man->getFile($path); $config = $file->getConfig(); $maxSizeBytes = preg_replace("/[^0-9]/", "", $config["upload.maxsize"]); if (strpos((strtolower($config["upload.maxsize"])), "k") > 0) $maxSizeBytes *= 1024; if (strpos((strtolower($config["upload.maxsize"])), "m") > 0) $maxSizeBytes *= (1024 * 1024); // Is chunked upload if (isset($input["chunk"])) { $filename = $input["name"]; $chunk = intval($input["chunk"]); $chunks = intval($input["chunks"]); // No access, tool disabled if (in_array("upload", explode(',', $config['general.disabled_tools'])) || !$file->canWrite() || !checkBool($config["filesystem.writable"])) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); return $result; } $file =& $man->getFile($path, $filename, MC_IS_FILE); if ($man->verifyFile($file, "upload") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result; } // Hack attempt if ($filename == $config['filesystem.local.access_file_name']) { $result->add("MCACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); return $result; } // Only peform IO when not in demo mode if (!checkBool($config['general.demo'])) { if ($chunk == 0 && $file->exists() && (!isset($config["upload.overwrite"]) || $config["upload.overwrite"] == false)) { $result->add("OVERWRITE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.file_exists}"); return $result; } if ($chunk == 0 && $file->exists() && $config["upload.overwrite"] == true) $file->delete(); // Write file $stream =& $file->open($chunk == 0 ? 'wb' : 'ab'); if ($stream) { $in = fopen("php://input", "rb"); if ($in) { while ($buff = fread($in, 4096)) $stream->write($buff); } $stream->close(); } // Check file size if ($file->getLength() > $maxSizeBytes) { $file->delete(); $result->add("SIZE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.error_to_large}"); return $result; } // Verify uploaded file, if it fails delete it $status = $man->verifyFile($file, "upload"); if ($status < 0) { $file->delete(); $result->add("FILTER_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result; } // Import file when all chunks are complete if ($chunk == $chunks - 1) { clearstatcache(); debug($chunk, $chunks, filesize($file->getAbsolutePath()), $chunk == 0 ? 'wb' : 'ab'); $file->importFile(); } } $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.upload_ok}"); return $result; } else { // Ok lets check the files array out. for ($i=0; isset($_FILES['file' . $i]['tmp_name']); $i++) { $filename = utf8_encode($input["name" . $i]); // Do nothing in demo mode if (checkBool($config['general.demo'])) { $result->add("DEMO_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.demo}"); continue; } // No access, tool disabled if (in_array("upload", explode(',', $config['general.disabled_tools'])) || !$file->canWrite() || !checkBool($config["filesystem.writable"])) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); continue; } // Get ext to glue back on $ext = ""; if (strpos(basename($_FILES['file' . $i]['name']), ".") > 0) { $ar = explode('.', basename($_FILES['file' . $i]['name'])); $ext = array_pop($ar); } $file =& $man->getFile($path, $filename . "." . $ext, "", MC_IS_FILE); if ($man->verifyFile($file, "upload") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } $config = $file->getConfig(); if (is_uploaded_file($_FILES['file' . $i]['tmp_name'])) { // Hack attempt if ($filename == $config['filesystem.local.access_file_name']) { @unlink($_FILES['file' . $i]['tmp_name']); $result->add("MCACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); continue; } if ($file->exists() && (!isset($config["upload.overwrite"]) || $config["upload.overwrite"] == false)) { @unlink($_FILES['file' . $i]['tmp_name']); $result->add("OVERWRITE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.file_exists}"); continue; } if ($file->exists() && $config["upload.overwrite"] == true) $file->delete(); if (getClassName($file) == 'moxiecode_localfileimpl') { if (!move_uploaded_file($_FILES['file' . $i]['tmp_name'], $file->getAbsolutePath())) { $result->add("RW_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.upload_failed}"); continue; } // Dispatch add event $file->importFile(); } else $file->importFile($_FILES['file' . $i]['tmp_name']); if ($file->getLength() > $maxSizeBytes) { $file->delete(); $result->add("SIZE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.error_to_large}"); continue; } // Verify uploaded file, if it fails delete it $status = $man->verifyFile($file, "upload"); if ($status < 0) { $file->delete(); $result->add("FILTER_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.upload_ok}"); } else $result->add("GENERAL_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.upload_failed}"); } } } else $result->add("PATH_ERROR", $man->encryptPath($path), "{#error.upload_failed}"); return $result; } } // * * * * * * * * Private methods function _deleteFile(&$man, &$input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input["path" . $i]); $i++) { $file =& $man->getFile($input["path" . $i]); $config = $file->getConfig(); if (checkBool($config['general.demo'])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.demo}"); continue; } if (!$man->isToolEnabled("delete", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); continue; } if ($man->verifyFile($file, "delete") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$file->canWrite()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!checkBool($config["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } if ($file->delete($config['filesystem.delete_recursive'])) $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.delete_success}"); else $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.delete_failed}"); } return $result->toArray(); } function _insertFiles(&$man, $input) { $result = new Moxiecode_ResultSet("name,path,url,size,type,created,modified,attribs,custom"); $indata = array(); for ($i=0; isset($input['path' . $i]); $i++) { $custom = array(); $file = $man->getFile($input["path". $i]); if (!$file->exists()) { trigger_error("{#error.file_not_exists}", FATAL); die; } $ar = explode('.', $file->getName()); $ext = array_pop($ar); $man->dispatchEvent("onCustomInfo", array(&$file, "insert", &$custom)); $status = $man->dispatchEvent("onInsertFile", array(&$file)); $config = $file->getConfig(); $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getAbsolutePath(), $config["preview.wwwroot"]); $result->add($file->getName(), $man->encryptPath($file->getAbsolutePath()), utf8_encode($url), $file->getLength(), $ext, $file->getCreationDate(), $file->getLastModified(), $attribs, $custom); } return $result->toArray(); } function _listDefault(&$man, $file, $input, &$result, $filter_root_path) { $config = $man->getConfig(); // Setup input file filter $inputFileFilter = new Moxiecode_BasicFileFilter(); if (isset($input['include_directory_pattern']) && $input['include_directory_pattern']) $inputFileFilter->setIncludeDirectoryPattern($input['include_directory_pattern']); if (isset($input['exclude_directory_pattern']) && $input['exclude_directory_pattern']) $inputFileFilter->setExcludeDirectoryPattern($input['exclude_directory_pattern']); if (isset($input['include_file_pattern']) && $input['include_file_pattern']) $inputFileFilter->setIncludeFilePattern($input['include_file_pattern']); if (isset($input['exclude_file_pattern']) && $input['exclude_file_pattern']) $inputFileFilter->setExcludeFilePattern($input['exclude_file_pattern']); if (isset($input['extensions']) && $input['extensions']) $inputFileFilter->setIncludeExtensions($input['extensions']); // If file doesn't exists use default path if (!$file->exists()) { $file = $man->getFile($config['filesystem.path']); $result->setHeader("path", $man->encryptPath($file->getAbsolutePath())); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($file->getAbsolutePath()) : $man->encryptPath($file->getAbsolutePath())); } // List files $config = $file->getConfig(); if ($file->isDirectory()) { // Setup file filter $fileFilter = new Moxiecode_BasicFileFilter(); //$fileFilter->setDebugMode(true); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); // If file is hidden then try the parent if ($fileFilter->accept($file) <= 0) { $file = $file->getParentFile(); $result->setHeader("path", $man->encryptPath($file->getAbsolutePath())); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($file->getAbsolutePath()) : $man->encryptPath($file->getAbsolutePath())); } if (isset($input["filter"]) && $input["filter"] != null) $fileFilter->setIncludeWildcardPattern($input["filter"]); if (isset($input["only_dirs"]) && checkBool($input["only_dirs"])) $fileFilter->setOnlyDirs(true); else if (!checkBool($config["filesystem.list_directories"], true) || (isset($input["only_files"]) && checkBool($input["only_files"]))) $fileFilter->setOnlyFiles(true); // List files $combinedFilter = new Moxiecode_CombinedFileFilter(); $combinedFilter->addFilter($fileFilter); $combinedFilter->addFilter($inputFileFilter); $files =& $file->listFilesFiltered($combinedFilter); $showparent = isset($input["no_parent"]) ? checkBool($input["no_parent"]) : true; $showparent = $showparent && $man->verifyPath($file->getParent()); if (!isset($input["only_dirs"])) $showparent = $showparent && checkBool($config["filesystem.list_directories"], true); // Add parent if ($showparent && !isset($input["only_files"])) { // Remove files below root if ($filter_root_path && getClassName($file) == 'moxiecode_localfileimpl') { if (!$man->isChildPath($filter_root_path, $file->getParent())) return $files; } if ($file->getAbsolutePath() != $filter_root_path) $result->add("..", $man->encryptPath($file->getParent()), -1, "parent", "", "", "", array()); } } else trigger_error("The specified path is not a directory. Probably an incorrect setting for the filesystem.rootpath option.", FATAL); return $files; } /** * Lists files. */ function _listFiles(&$man, $input) { $result = new Moxiecode_ResultSet("name,path,size,type,created,modified,attribs,custom"); $config = $man->getConfig(); $files = array(); $rootNames = $man->_getRootNames(); $filterRootPath = isset($input["root_path"]) && $input["root_path"] != null ? $man->toAbsPath($man->decryptPath($input["root_path"])) : null; if (isset($input["path"]) && $input["path"]) { // URL specified if (isset($input["url"]) && $input["path"] == '{default}') $input["path"] = $man->convertURIToPath($input["url"]); if (isset($input['remember_last_path'])) { if ($input['remember_last_path'] !== 'auto') $remember = checkBool($input['remember_last_path']); else $remember = checkBool($config['general.remember_last_path']); if ($remember) { if (isset($_COOKIE["MCManager_". $man->getType() . "_lastPath"]) && $input["path"] == '{default}') { $tmpPath = $_COOKIE["MCManager_". $man->getType() . "_lastPath"]; if ($man->getFSFromPath($tmpPath) == "file" && $tmpPath) $input["path"] = $tmpPath; } else { if ($man->getFSFromPath($input["path"]) == "file") setcookie("MCManager_". $man->getType() . "_lastPath", $input["path"], time() + (3600*24*30)); // 30 days } } } $input["path"] = $man->toAbsPath($man->decryptPath($input["path"])); $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"]) : $man->encryptPath($input["path"])); // Move path inside rootpath if it's localfs if ($filterRootPath && $man->getFSFromPath($input["path"]) == 'file') { if (!$man->isChildPath($filterRootPath, $input["path"])) $input["path"] = $filterRootPath; $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"], $filterRootPath) : $man->encryptPath($input["path"])); } // Not valid path use default path if ($man->getFSFromPath($input["path"]) == 'file' && !$man->verifyPath($input["path"])) { $input["path"] = $config['filesystem.path']; $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"]) : $man->encryptPath($input["path"])); } $file =& $man->getFile($input["path"]); $config = $file->getConfig(); $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $result->setHeader("attribs", $attribs); $files = $this->_listDefault($man, $file, $input, $result, $filterRootPath); } else { trigger_error("ListFiles input not valid.", FATAL); die(); } if (isset($input["page_size"])) { if ($file->getAbsolutePath() != $filterRootPath && $man->verifyPath($file->getParent())) $pageSize = $input["page_size"] - 1; else $pageSize = $input["page_size"]; $pages = ceil(count($files) / $pageSize); // Setup response $result->setHeader("pages", $pages > 1 ? $pages : 1); $result->setHeader("count", count($files)); if (!isset($input["page"])) $input["page"] = 0; // Remove non visible files $files = array_slice($files, ($input["page"] * $pageSize), $pageSize); } // Add directories $listFS = $man->getFSFromPath($input["path"]); foreach ($files as $file) { // Remove files below root if ($filterRootPath && $listFS == 'file') { if (!$man->isChildPath($filterRootPath, $file->getAbsolutePath())) continue; } // Setup fields $custom = array(); // Attribs: R = Read, W = Write (cut/delete/rename), D = Download, S = Stream/Preview, I = Insert $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $cdate = date($config['filesystem.datefmt'], $file->getCreationDate()); $mdate = date($config['filesystem.datefmt'], $file->getLastModified()); $filePath = $man->encryptPath($file->getAbsolutePath()); if ($file->isFile()) $type = getFileExt($file->getName()); else $type = "folder"; $man->dispatchEvent("onCustomInfo", array(&$file, "list", &$custom)); // Special treatment of roots $name = $file->getName(); if ($input["path"] == "root:///") { foreach ($rootNames as $rootPath => $rootName) { if ($file->getAbsolutePath() == $rootPath) { $name = $rootName; break; } } } $result->add(utf8_encode($name), $filePath, $file->isFile() ? $file->getLength() : -1, $type, $cdate, $mdate, $attribs, $custom); } if (isset($input["config"])) $result->setConfig($man->getJSConfig($config, $input["config"])); return $result->toArray(); } function _filterFile(&$file, $input) { $config = $file->getConfig(); // Setup file filter $fileFilter = new Moxiecode_BasicFileFilter(); //$fileFilter->setDebugMode(true); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); if (isset($input["only_dirs"]) && checkBool($input["only_dirs"])) $fileFilter->setOnlyDirs(true); return ($fileFilter->accept($file) > 0); } function _createDirs(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); // Get input data $path = $man->decryptPath($input['path']); $dir =& $man->getFile($path); $config = $dir->getConfig(); if (checkBool($config["general.demo"])) { $result->add("DEMO_ERROR", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if (!$man->isToolEnabled("createdir", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } for ($i=0; isset($input['name' . $i]); $i++) { // Get dir info $name = $input['name' . $i]; $template = false; if (isset($input['template' . $i])) $template = $man->decryptPath($input['template' . $i]); // Setup target file $file =& $man->getFile($path, $name, MC_IS_DIRECTORY); if ($man->verifyFile($file, "createdir") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } // Check write access if (!checkBool($config["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } // Setup template dir if ($template) { $templateFile =& $man->getFile($template, "", MC_IS_DIRECTORY); if (!$templateFile->exists()) { $result->add("TEMPLATE_ERROR", $man->encryptPath($templateFile->getAbsolutePath()), "{#error.template_missing}"); continue; } if ($man->verifyFile($templateFile, "createdir") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } else $templateFile = null; // Check if target exists if ($file->exists()) { $result->add("EXISTS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.folder_exists}"); continue; } // Create directory if ($templateFile) $status = $templateFile->copyTo($file); else $status = $file->mkdir(); if ($status) $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.directory_ok}"); else $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); } return $result->toArray(); } function _getConfig(&$man, $input) { $globalConfig = $man->getConfig(); if (!isset($input['prefixes'])) $input["prefixes"] = "*"; // If debug mode return all if (!isset($input['path']) && isset($input['debug']) && checkBool($globalConfig['general.debug'])) return $man->getConfig(); if (!isset($input['path'])) { trigger_error("{#error.file_not_exists}", FATAL); die; } $file =& $man->getFile($input['path']); if (!$file->exists()) { trigger_error("{#error.file_not_exists}", FATAL); die; } $config = $file->getConfig(); // If debug mode return all if (isset($input['debug']) && checkBool($globalConfig['general.debug'])) return $config; return $man->getJSConfig($config, $input["prefixes"]); } /** * Simple keepalive function. */ function _keepAlive(&$man, $input) { $result = new Moxiecode_ResultSet("status,time,message"); $man->dispatchEvent("onKeepAlive"); // Return status KEEPALIVE, current time on server and message. $result->add("KEEPALIVE", time(), "{#message.keepalive}"); return $result->toArray(); } /** * Simple loopback function. Used for debugging purposes of the RPC functionality. */ function _loopBack($input) { return $input; } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("core", new Moxiecode_CorePlugin()); ?>plugins/imagemanager/classes/Utils/LanguagePack.php000066600000021437150472426320016452 0ustar00_header = array(); $this->_items = array(); $this->_cdataArr = array(); $this->_currentTarget = ""; $this->_currentLanguage = "en"; $this->_currentDir = "ltr"; $this->_header["major"] = 0; $this->_header["minor"] = 1; $this->_header["releasedate"] = date("Y-m-d"); } function setLanguage($language) { $this->_currentLanguage = $language; } function getLanguage() { return $this->_currentLanguage; } /* Loads XML string */ function loadXML($data) { // Check encoding on data preg_match('//m', $data, $matches); $encoding = "UTF-8"; // Found XML encoding if (count($matches) > 1) $encoding = strtoupper($matches[1]); $this->_encoding = $encoding; // OMG! PHP Xpath is crappy, cant detect CDATA, haxx! $data = preg_replace("/<\!\[CDATA\[/", "_parser = xml_parser_create($encoding); // Auto detect for PHP4/PHP5 xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, "_saxStartElement", "_saxEndElement"); xml_set_character_data_handler($this->_parser, "_saxCharacterData"); xml_parser_set_option($this->_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); if (!xml_parse($this->_parser, $data, true)) trigger_error(sprintf("Language pack loading failed, XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser)), E_USER_ERROR); xml_parser_free($this->_parser); } /* Loads XML file */ function load($file) { if (($fp = @fopen($file, "r"))) { $data = ''; while (!feof($fp)) $data .= fread($fp, 8192); fclose($fp); if (ini_get("magic_quotes_gpc")) $data = stripslashes($data); $this->loadXML($data); } else trigger_error("Could not open XML: ". $file, E_USER_ERROR); } function save($file, $enc="UTF-8") { if (($fp = @fopen($file, "w"))) { fwrite($fp, $this->toString($enc)); fclose($fp); } else trigger_error("Could not open XML for writing: ". $file, E_USER_ERROR); } function getGroups() { return $this->_items[$this->_currentLanguage]["data"]; } function setGroups($groups) { $this->_items[$this->_currentLanguage]["data"] = $groups; } function getGroup($name) { return $this->_items[$this->_currentLanguage]["data"][$name]; } function get($target, $name) { return isset($this->_items[$this->_currentLanguage]["data"][$target][$name]) ? $this->_items[$this->_currentLanguage]["data"][$target][$name] : ("$" . $name . "$"); } function set($target, $name, $value, $cdata = 3) { if ($cdata != 3) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$target])) $this->_cdataArr[$this->_currentLanguage][$target] = array(); $this->_cdataArr[$this->_currentLanguage][$target][$name] = $cdata; } if (!isset($this->_items[$this->_currentLanguage]["data"][$target])) $this->_items[$this->_currentLanguage]["data"][$target] = array(); $this->_items[$this->_currentLanguage]["data"][$target][$name] = $value; } function getLanguageTitle() { return $this->_items[$this->_currentLanguage]["title"]; } function setAuthor($author) { $this->_header["author"] = $author; } function getAuthor() { return $this->_header["author"]; } function setVersion($major, $minor, $releasedate) { $this->_header["major"] = $major; $this->_header["minor"] = $minor; $this->_header["releasedate"] = $releasedate; } function getMinor() { return $this->_header["minor"]; } function getMajor() { return $this->_header["major"]; } function getReleaseDate() { return $this->_header["releasedate"]; } function getDescription() { return $this->_header["description"]; } function setDescription($description) { $this->_header["description"] = $description; } function createLanguage($lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = array("dir" => $dir, "title" => $title, "data" => array()); } function updateLanguage($target, $lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = $this->_items[$target]; unset($this->_items[$target]); $this->_items[$lang]["dir"] = $dir; $this->_items[$lang]["title"] = $title; $this->_cdataArr[$lang] = $this->_cdataArr[$target]; unset($this->_cdataArr[$target]); } // * * Private methods function _saxStartElement($parser, $name, $attrs) { $this->_tag = $name; $this->_tagAttrs = $attrs; $this->_tagContent = ""; switch($name) { case "LANGUAGE": $this->_currentLanguage = $this->_tagAttrs["CODE"]; $this->_currentDir = $this->_tagAttrs["DIR"]; $this->_items[$this->_currentLanguage] = array("dir" => $this->_currentDir, "title" => $this->_tagAttrs["TITLE"], "data" => array()); break; case "GROUP": $this->_currentTarget = $this->_tagAttrs["TARGET"]; $this->_items[$this->_currentLanguage]["data"][$this->_tagAttrs["TARGET"]] = array(); break; } } function _saxEndElement($parser, $name) { preg_match('/^#CDATA#/', $this->_tagContent, $matches); $this->_tagContent = preg_replace("/^#CDATA#/", "", $this->_tagContent); if (count($matches) == 0) $this->_tagContent = trim($this->_tagContent); switch($name) { case "ITEM": if (count($matches) != 0) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$this->_currentTarget])) $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget] = array(); $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget][$this->_tagAttrs["NAME"]] = true; } $this->_items[$this->_currentLanguage]["data"][$this->_currentTarget][$this->_tagAttrs["NAME"]] = $this->_tagContent; break; case "AUTHOR": $this->_header["author"] = $this->_tagContent; break; case "VERSION": $this->_header["minor"] = trim($this->_tagAttrs["MINOR"]); $this->_header["major"] = trim($this->_tagAttrs["MAJOR"]); $this->_header["releasedate"] = trim($this->_tagAttrs["RELEASEDATE"]); break; case "DESCRIPTION": $this->_header["description"] = $this->_tagContent; break; } // Clear memory! $this->_tagContent = ""; $this->_tag = ""; $this->_tagAttrs = ""; } function _saxCharacterData($parser, $data) { $this->_tagContent .= $data; } function xmlEncode($str) { if (strtolower($this->_encoding) == "utf-8") return utf8_encode(htmlspecialchars($str, ENT_QUOTES, $this->_encoding)); return htmlspecialchars($str, ENT_QUOTES, $this->_encoding); } function toString($enc = "") { $oldenc = ""; if ($enc == "") $enc = $this->_encoding; else { $oldenc = $this->_encoding; $this->_encoding = $enc; } $doc = ""; $doc .= ''. "\n"; $doc .= ''. "\n"; $doc .= '
        '. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["author"]) .''. "\n"; $doc .= ' '. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["description"]) .''. "\n"; $doc .= '
        '. "\n"; foreach($this->_items as $code => $language) { $doc .= ' '. "\n"; foreach($language["data"] as $target => $group) { $doc .= ' '. "\n"; foreach($group as $name => $item) { if (isset($this->_cdataArr[$code]) && isset($this->_cdataArr[$code][$target]) && isset($this->_cdataArr[$code][$target][$name]) && $this->_cdataArr[$code][$target][$name]) { $doc .= ' '. "\n"; } else $doc .= ' '. $this->xmlEncode($item) .''. "\n"; } $doc .= ' '. "\n"; } $doc .= ' '. "\n"; } $doc .= '
        '. "\n"; if ($oldenc != "") $this->_encoding = $oldenc; return $doc; } } ?>plugins/imagemanager/classes/Utils/Error.php000066600000016374150472426320015225 0ustar00id = $id; } function handleError($errno, $errstr, $errfile, $errline, $errcontext) { global $man, $config; $error = array(); $log = false; $error['title'] = ""; $error['break'] = false; $error['errstr'] = $errstr; //$error['errcontext'] = $errcontext; $error['errcontext'] = ""; $error['errfile'] = ""; $error['errline'] = ""; // Add file and line only in debug mode if (isset($man)) { $config = $man->getConfig(); $log = $man->getLogger(); if (checkBool($config['general.debug'])) { $error['errfile'] = $errfile; $error['errline'] = $errline; } } switch ($errno) { case E_USER_ERROR: $error['title'] = "Fatal Error"; $error['break'] = true; break; case E_USER_NOTICE: $error['title'] = "Notice"; $error['break'] = false; break; case E_USER_WARNING: $error['title'] = "Warning"; $error['break'] = true; break; case E_PARSE: $error['title'] = "PHP Parse Error"; $error['break'] = true; if ($log) $log->fatal($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_ERROR: $error['title'] = "PHP Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_WARNING: $error['title'] = "PHP Warning"; $error['break'] = false; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_CORE_ERROR: $error['title'] = "PHP Error : Core Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_CORE_WARNING: $error['title'] = "PHP Error : Core Warning"; $error['break'] = true; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_COMPILE_ERROR: $error['title'] = "PHP Error : Compile Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_COMPILE_WARNING: $error['title'] = "PHP Error : Compile Warning"; $error['break'] = true; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_NOTICE: $error['title'] = "PHP Notice"; $error['break'] = false; if ($log) $log->info($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_STRICT: $error['title'] = "PHP Strict"; $error['break'] = false; if ($log) $log->info($error['title'] . " (" . $errno . ")" . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; } // Add error number $error['title'] = $error['title'] . " (". $errno .")"; return $error; } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function JSONErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { unset($data['break']); unset($data['title']); $data['level'] = "FATAL"; $json = new Moxiecode_JSON(); $result = new stdClass(); $result->result = null; $result->id = 'err'; $result->error = $data; echo $json->encode($result); die(); } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function JSErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { echo 'alert(\'' . addslashes($data['errstr']) . '\');'; die(); } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function StreamErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { if ($_SERVER["REQUEST_METHOD"] == "GET") { header("HTTP/1.1 500 Internal server error"); die($errstr); } else { unset($data['break']); unset($data['title']); $data['level'] = "FATAL"; $json = new Moxiecode_JSON(); $result = new stdClass(); $result->result = null; $result->id = 'err'; $result->error = $data; echo ''; die(); } } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function HTMLErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { die($errstr); } } ?>plugins/imagemanager/classes/Utils/ClientResources.php000066600000006443150472426320017241 0ustar00_settings = array_merge($default, $settings); $this->_files = array(); } function isDebugEnabled() { return $this->_debug; } function getSetting($name, $default = false) { return isset($this->_settings["name"]) ? $this->_settings["name"] : $default; } function getPackageIDs() { return array_keys($this->_files); } function &getFile($package, $file_id) { $files = $this->getFiles($package); foreach ($files as $file) { if ($file->getId() == $file_id) return $file; } return null; } function getFiles($package) { return isset($this->_files[$package]) ? $this->_files[$package] : array(); } function load($xml_file) { $this->_path = dirname($xml_file); if (!file_exists($xml_file)) return; $fp = @fopen($xml_file, "r"); if ($fp) { $data = ''; while (!feof($fp)) $data .= fread($fp, 8192); fclose($fp); if (ini_get("magic_quotes_gpc")) $data = stripslashes($data); } $this->_parser = xml_parser_create('UTF-8'); xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, "_saxStartElement", "_saxEndElement"); xml_parser_set_option($this->_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); if (!xml_parse($this->_parser, $data, true)) trigger_error(sprintf("Language pack loading failed, XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser)), E_USER_ERROR); xml_parser_free($this->_parser); } // * * Private methods function _saxStartElement($parser, $name, $attrs) { switch ($name) { case "RESOURCES": if (!$this->_debug) $this->_debug = isset($attrs["DEBUG"]) && $attrs["DEBUG"] == 'yes'; break; case "PACKAGE": $this->_packageID = isset($attrs["ID"]) ? $attrs["ID"] : 'noid'; if (!isset($this->_files[$this->_packageID])) $this->_files[$this->_packageID] = array(); break; case "FILE": $this->_files[$this->_packageID][] = new Moxiecode_ClientResourceFile( isset($attrs["ID"]) ? $attrs["ID"] : "", str_replace("\\", DIRECTORY_SEPARATOR, $this->_path . '/' . $attrs["PATH"]), !isset($attrs["KEEPWHITESPACE"]) || $attrs["KEEPWHITESPACE"] != "yes", isset($attrs["TYPE"]) ? $attrs["TYPE"] : '' ); break; } } function _saxEndElement($parser, $name) { } } class Moxiecode_ClientResourceFile { /**#@+ @access private */ var $_id, $_contentType, $_path, $_remove_whitespace; /**#@-*/ function Moxiecode_ClientResourceFile($id, $path, $remove_whitespace, $content_type) { $this->_id = $id; $this->_path = $path; $this->_remove_whitespace = $remove_whitespace; $this->_contentType = $content_type; } function isRemoveWhitespaceEnabled() { return $this->_remove_whitespace; } function getId() { return $this->_id; } function getContentType() { return $this->_contentType; } function getPath() { return $this->_path; } } ?>plugins/imagemanager/classes/Utils/JSCompressor.php000066600000017337150472426320016525 0ustar00_items = array(); $default = array( 'expires_offset' => '10d', 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'patch_ie' => true, 'remove_firebug' => false, 'name' => '' ); $this->_settings = array_merge($default, $settings); $this->_lastUpdate = 0; } /** * Add raw contents as part of the concatenation/compression. This method should only be used if * you really need to. * * @param String $content Content to add as part of the concatenation process. */ function addContent($content) { $this->_items[] = array('content', $content); } /** * Adds a file to the concatenation/compression process. * * @param String $path Path to the file to include in the compressed package/output. * @param bool $whitespace Set this state to false to skip whitespace removal for the specified file. */ function addFile($path, $whitespace = true) { $this->_items[] = array('file', $path, $whitespace); $mtime = @filemtime($path); if ($mtime > $this->_lastUpdate) $this->_lastUpdate = $mtime; } /** * Compress and output all files that got added to the process by addFile. */ function compress() { $key = ""; foreach ($this->_items as $item) $key .= $item[1]; // Setup some variables $cacheFile = $this->_settings['cache_dir'] . "/"; if ($this->_settings['name']) $cacheFile .= preg_replace('/[^a-z0-9_]/i', '', $this->_settings['name']); else $cacheFile .= md5($key); $supportsGzip = false; $content = ""; $encodings = array(); // Check if it supports gzip if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); if ($this->_settings['gzip_compress'] && (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('gzencode') && !ini_get('zlib.output_compression')) { $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; $supportsGzip = true; $cacheFile .= ".gz"; } else $cacheFile .= ".js"; // Set headers header("Content-type: text/javascript;charset=" . $this->_settings['charset']); header("Vary: Accept-Encoding"); // Handle proxies header("Expires: " . gmdate("D, d M Y H:i:s", time() + $this->_parseTime($this->_settings['expires_offset'])) . " GMT"); header("Cache-Control: public, max-age=" . $this->_parseTime($this->_settings['expires_offset'])); // Output explorer workaround or compressed file if (!isset($_GET["gz"]) && $supportsGzip && $this->_settings['patch_ie'] && strpos($_SERVER["HTTP_USER_AGENT"], "MSIE") !== false) { // Build request URL $url = $_SERVER["PHP_SELF"]; if (isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"]) $url .= "?" . $_SERVER["QUERY_STRING"] . "&gz=1"; else $url .= "?gz=1"; // This script will ensure that the gzipped script gets loaded on IE versions with the Gzip request chunk bug echo 'var gz;try {gz = new XMLHttpRequest();} catch(gz) { try {gz = new ActiveXObject("Microsoft.XMLHTTP");}'; echo 'catch (gz) {gz = new ActiveXObject("Msxml2.XMLHTTP");}}'; echo 'gz.open("GET", "' . $url . '", false);gz.send(null);eval(gz.responseText);'; die(); } // Use cached file if ($this->_settings['disk_cache'] && file_exists($cacheFile) && @filemtime($cacheFile) == $this->_lastUpdate) { if ($supportsGzip) header("Content-Encoding: " . $enc); echo $this->_getFileContents($cacheFile); return; } // Load content foreach ($this->_items as $item) { if ($item[0] == 'file') $chunk = $this->_getFileContents($item[1]); else $chunk = $item[1]; // Remove UTF-8 BOM if (substr($chunk, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) $chunk = substr($chunk, 3); if ($this->_settings['remove_whitespace'] && $item[2]) $chunk = $this->_removeWhiteSpace($chunk); if (!$item[2]) $chunk = "\n" . $chunk . ";\n"; $content .= $chunk; } // Remove firebug calls if ($this->_settings['remove_firebug']) $content = preg_replace('/console\\.[^;]+;/', '', $content); // GZip content if ($supportsGzip) { header("Content-Encoding: " . $enc); $content = gzencode($content, 9, FORCE_GZIP); } // Write cache file if ($this->_settings['disk_cache']) { if (!is_dir($this->_settings['cache_dir'])) @mkdir($this->_settings['cache_dir']); $this->_putFileContents($cacheFile, $content); if (@file_exists($cacheFile)) @touch($cacheFile, $this->_lastUpdate); } // Output content to client echo $content; } /**#@+ @access private */ function _removeWhiteSpace($content) { $this->_strings = array(); $this->_count = 0; // Replace strings and regexps $content = preg_replace_callback('/\\\\(\"|\'|\\/)/', array(&$this, '_encode'), $content); // Replace all \/, \", \' with tokens $content = preg_replace_callback('/(\'[^\'\\n\\r]*\')|("[^"\\n\\r]*")|(\\s+(\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?))|([^\\w\\x24\\/\'"*)\\?:]\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?)/', array(&$this, '_strToItems'), $content); // Remove comments $content = preg_replace('/(\\/\\/[^\\n\\r]*[\\n\\r])|(\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/)/', '', $content); // Remove whitespace $content = preg_replace('/[\r\n]+/', ' ', $content); $content = preg_replace('/\s*([=&|!+\\-\\/?:;,\\^\\(\\)\\{\\}<>%]+)\s*/', '$1', $content); $content = preg_replace('/(;)\s+/', '$1', $content); $content = preg_replace('/\s+/', ' ', $content); // Restore strings and regexps $content = preg_replace_callback('/@([^]+)/', array(&$this, '_itemsToStr'), $content); $content = preg_replace_callback('/#([^]+)/', array(&$this, '_decode'), $content); // Restore all \/, \", \' return $content; } function _putFileContents($path, $content) { if (function_exists("file_put_contents")) return @file_put_contents($path, $content); $fp = @fopen($path, "wb"); if ($fp) { fwrite($fp, $content); fclose($fp); } } function _getFileContents($path) { $path = realpath($path); if (!$path || !@is_file($path)) return ""; if (function_exists("file_get_contents")) return @file_get_contents($path); $content = ""; $fp = @fopen($path, "r"); if (!$fp) return ""; while (!feof($fp)) $content .= fread($fp, 1024); fclose($fp); return $content; } function _strToItems($matches) { $this->_strings[] = $matches[0]; return '@' . ($this->_count++) . ''; } function _itemsToStr($matches) { return $this->_strings[intval($matches[1])]; } function _encode($matches) { $this->_strings[] = $matches[0]; return '#' . ($this->_count++) . ''; } function _decode($matches) { return $this->_strings[intval($matches[1])]; } function _parseTime($time) { $multipel = 1; // Hours if (strpos($time, "h") != false) $multipel = 60 * 60; // Days if (strpos($time, "d") != false) $multipel = 24 * 60 * 60; // Months if (strpos($time, "m") != false) $multipel = 24 * 60 * 60 * 30; // Trim string return intval($time) * $multipel; } /**#@-*/ } ?>plugins/imagemanager/classes/Utils/Logger.class.php000066600000012531150472426320016446 0ustar00_path = ""; $this->_filename = "{level}.log"; $this->setMaxSize("100k"); $this->_maxFiles = 10; $this->_level = MC_LOGGER_DEBUG; $this->_format = "[{time}] [{level}] {message}"; } /** * Sets the current log level, use the MC_LOGGER constants. * * @param int $level Log level instance for example MC_LOGGER_DEBUG. */ function setLevel($level) { if (is_string($level)) { switch (strtolower($level)) { case "debug": $level = MC_LOGGER_DEBUG; break; case "info": $level = MC_LOGGER_INFO; break; case "warn": case "warning": $level = MC_LOGGER_WARN; break; case "error": $level = MC_LOGGER_ERROR; break; case "fatal": $level = MC_LOGGER_FATAL; break; default: $level = MC_LOGGER_FATAL; } } $this->_level = $level; } /** * Returns the current log level for example MC_LOGGER_DEBUG. * * @return int Current log level for example MC_LOGGER_DEBUG. */ function getLevel() { return $this->_level; } function setPath($path) { $this->_path = $path; } function getPath() { return $this->_path; } function setFileName($file_name) { $this->_filename = $file_name; } function getFileName() { return $this->_filename; } function setFormat($format) { $this->_format = $format; } function getFormat() { return $this->_format; } function setMaxSize($size) { // Fix log max size $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size)); // Is KB if (strpos((strtolower($size)), "k") > 0) $logMaxSizeBytes *= 1024; // Is MB if (strpos((strtolower($size)), "m") > 0) $logMaxSizeBytes *= (1024 * 1024); $this->_maxSizeBytes = $logMaxSizeBytes; $this->_maxSize = $size; } function getMaxSize() { return $this->_maxSize; } function setMaxFiles($max_files) { $this->_maxFiles = $max_files; } function getMaxFiles() { return $this->_maxFiles; } function debug($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args)); } function info($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args)); } function warn($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args)); } function error($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args)); } function fatal($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args)); } function isDebugEnabled() { return $this->_level >= MC_LOGGER_DEBUG; } function isInfoEnabled() { return $this->_level >= MC_LOGGER_INFO; } function isWarnEnabled() { return $this->_level >= MC_LOGGER_WARN; } function isErrorEnabled() { return $this->_level >= MC_LOGGER_ERROR; } function isFatalEnabled() { return $this->_level >= MC_LOGGER_FATAL; } function _logMsg($level, $message) { $roll = false; if ($level < $this->_level) return; $logFile = $this->toOSPath($this->_path . "/" . $this->_filename); switch ($level) { case MC_LOGGER_DEBUG: $levelName = "DEBUG"; break; case MC_LOGGER_INFO: $levelName = "INFO"; break; case MC_LOGGER_WARN: $levelName = "WARN"; break; case MC_LOGGER_ERROR: $levelName = "ERROR"; break; case MC_LOGGER_FATAL: $levelName = "FATAL"; break; } $logFile = str_replace('{level}', strtolower($levelName), $logFile); $text = $this->_format; $text = str_replace('{time}', date("Y-m-d H:i:s"), $text); $text = str_replace('{level}', strtolower($levelName), $text); $text = str_replace('{message}', $message, $text); $message = $text . "\r\n"; // Check filesize if (file_exists($logFile)) { $size = @filesize($logFile); if ($size + strlen($message) > $this->_maxSizeBytes) $roll = true; } // Roll if the size is right if ($roll) { for ($i=$this->_maxFiles-1; $i>=1; $i--) { $rfile = $this->toOSPath($logFile . "." . $i); $nfile = $this->toOSPath($logFile . "." . ($i+1)); if (@file_exists($rfile)) @rename($rfile, $nfile); } @rename($logFile, $this->toOSPath($logFile . ".1")); // Delete last logfile $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1)); if (@file_exists($delfile)) @unlink($delfile); } // Append log line if (($fp = @fopen($logFile, "a")) != null) { @fputs($fp, $message); @fflush($fp); @fclose($fp); } } /** * Converts a Unix path to OS specific path. * * @param String $path Unix path to convert. */ function toOSPath($path) { return str_replace("/", DIRECTORY_SEPARATOR, $path); } } ?>plugins/imagemanager/classes/Utils/JSON.php000066600000027146150472426320014704 0ustar00_data = $data; $this->_len = strlen($data); $this->_pos = -1; $this->_location = JSON_IN_BETWEEN; $this->_lastLocations = array(); $this->_needProp = false; } function getToken() { return $this->_token; } function getLocation() { return $this->_location; } function getTokenName() { switch ($this->_token) { case JSON_BOOL: return 'JSON_BOOL'; case JSON_INT: return 'JSON_INT'; case JSON_STR: return 'JSON_STR'; case JSON_FLOAT: return 'JSON_FLOAT'; case JSON_NULL: return 'JSON_NULL'; case JSON_START_OBJ: return 'JSON_START_OBJ'; case JSON_END_OBJ: return 'JSON_END_OBJ'; case JSON_START_ARRAY: return 'JSON_START_ARRAY'; case JSON_END_ARRAY: return 'JSON_END_ARRAY'; case JSON_KEY: return 'JSON_KEY'; } return 'UNKNOWN'; } function getValue() { return $this->_value; } function readToken() { $chr = $this->read(); if ($chr != null) { switch ($chr) { case '[': $this->_lastLocation[] = $this->_location; $this->_location = JSON_IN_ARRAY; $this->_token = JSON_START_ARRAY; $this->_value = null; $this->readAway(); return true; case ']': $this->_location = array_pop($this->_lastLocation); $this->_token = JSON_END_ARRAY; $this->_value = null; $this->readAway(); if ($this->_location == JSON_IN_OBJECT) $this->_needProp = true; return true; case '{': $this->_lastLocation[] = $this->_location; $this->_location = JSON_IN_OBJECT; $this->_needProp = true; $this->_token = JSON_START_OBJ; $this->_value = null; $this->readAway(); return true; case '}': $this->_location = array_pop($this->_lastLocation); $this->_token = JSON_END_OBJ; $this->_value = null; $this->readAway(); if ($this->_location == JSON_IN_OBJECT) $this->_needProp = true; return true; // String case '"': case '\'': return $this->_readString($chr); // Null case 'n': return $this->_readNull(); // Bool case 't': case 'f': return $this->_readBool($chr); default: // Is number if (is_numeric($chr) || $chr == '-' || $chr == '.') return $this->_readNumber($chr); return true; } } return false; } function _readBool($chr) { $this->_token = JSON_BOOL; $this->_value = $chr == 't'; if ($chr == 't') $this->skip(3); // rue else $this->skip(4); // alse $this->readAway(); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _readNull() { $this->_token = JSON_NULL; $this->_value = null; $this->skip(3); // ull $this->readAway(); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _readString($quote) { $output = ""; $this->_token = JSON_STR; $endString = false; while (($chr = $this->peek()) != -1) { switch ($chr) { case '\\': // Read away slash $this->read(); // Read escape code $chr = $this->read(); switch ($chr) { case 't': $output .= "\t"; break; case 'b': $output .= "\b"; break; case 'f': $output .= "\f"; break; case 'r': $output .= "\r"; break; case 'n': $output .= "\n"; break; case 'u': $output .= $this->_int2utf8(hexdec($this->read(4))); break; default: $output .= $chr; break; } break; case '\'': case '"': if ($chr == $quote) $endString = true; $chr = $this->read(); if ($chr != -1 && $chr != $quote) $output .= $chr; break; default: $output .= $this->read(); } // String terminated if ($endString) break; } $this->readAway(); $this->_value = $output; // Needed a property if ($this->_needProp) { $this->_token = JSON_KEY; $this->_needProp = false; return true; } if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _int2utf8($int) { $int = intval($int); switch ($int) { case 0: return chr(0); case ($int & 0x7F): return chr($int); case ($int & 0x7FF): return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F)); case ($int & 0xFFFF): return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F)); case ($int & 0x1FFFFF): return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F)); } } function _readNumber($start) { $value = ""; $isFloat = false; $this->_token = JSON_INT; $value .= $start; while (($chr = $this->peek()) != -1) { if (is_numeric($chr) || $chr == '-' || $chr == '.') { if ($chr == '.') $isFloat = true; $value .= $this->read(); } else break; } $this->readAway(); if ($isFloat) { $this->_token = JSON_FLOAT; $this->_value = floatval($value); } else $this->_value = intval($value); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function readAway() { while (($chr = $this->peek()) != null) { if ($chr != ':' && $chr != ',' && $chr != ' ') return; $this->read(); } } function read($len = 1) { if ($this->_pos < $this->_len) { if ($len > 1) { $str = substr($this->_data, $this->_pos + 1, $len); $this->_pos += $len; return $str; } else return $this->_data[++$this->_pos]; } return null; } function skip($len) { $this->_pos += $len; } function peek() { if ($this->_pos < $this->_len) return $this->_data[$this->_pos + 1]; return null; } } /** * This class handles JSON stuff. * * @package MCManager.utils */ class Moxiecode_JSON { function Moxiecode_JSON() { } function decode($input) { $reader = new Moxiecode_JSONReader($input); return $this->readValue($reader); } function readValue(&$reader) { $this->data = array(); $this->parents = array(); $this->cur =& $this->data; $key = null; $loc = JSON_IN_ARRAY; while ($reader->readToken()) { switch ($reader->getToken()) { case JSON_STR: case JSON_INT: case JSON_BOOL: case JSON_FLOAT: case JSON_NULL: switch ($reader->getLocation()) { case JSON_IN_OBJECT: $this->cur[$key] = $reader->getValue(); break; case JSON_IN_ARRAY: $this->cur[] = $reader->getValue(); break; default: return $reader->getValue(); } break; case JSON_KEY: $key = $reader->getValue(); break; case JSON_START_OBJ: case JSON_START_ARRAY: if ($loc == JSON_IN_OBJECT) $this->addArray($key); else $this->addArray(null); $cur =& $obj; $loc = $reader->getLocation(); break; case JSON_END_OBJ: case JSON_END_ARRAY: $loc = $reader->getLocation(); if (count($this->parents) > 0) { $this->cur =& $this->parents[count($this->parents) - 1]; array_pop($this->parents); } break; } } return $this->data[0]; } // This method was needed since PHP is crapy and doesn't have pointers/references function addArray($key) { $this->parents[] =& $this->cur; $ar = array(); if ($key) $this->cur[$key] =& $ar; else $this->cur[] =& $ar; $this->cur =& $ar; } function getDelim($index, &$reader) { switch ($reader->getLocation()) { case JSON_IN_ARRAY: case JSON_IN_OBJECT: if ($index > 0) return ","; break; } return ""; } function encode($input) { switch (gettype($input)) { case 'boolean': return $input ? 'true' : 'false'; case 'integer': return (int) $input; case 'float': case 'double': return (float) $input; case 'NULL': return 'null'; case 'string': return $this->encodeString($input); case 'array': return $this->_encodeArray($input); case 'object': return $this->_encodeArray(get_object_vars($input)); } return ''; } function encodeString($input) { // Needs to be escaped if (preg_match('/[^a-zA-Z0-9]/', $input)) { $output = ''; for ($i=0; $i_utf82utf16($char))); } if (($byte & 0xF0) == 0xE0) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2])); $i += 2; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xF8) == 0xF0) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]))); $i += 3; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xFC) == 0xF8) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]))); $i += 4; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xFE) == 0xFC) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5]))); $i += 5; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } else if ($byte < 128) $output .= $input[$i]; } } return '"' . $output . '"'; } return '"' . $input . '"'; } function _utf82utf16($utf8) { if (function_exists('mb_convert_encoding')) return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); switch (strlen($utf8)) { case 1: return $utf8; case 2: return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); case 3: return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); } return ''; } function _encodeArray($input) { $output = ''; $isIndexed = true; $keys = array_keys($input); for ($i=0; $iencodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]); $isIndexed = false; } else $output .= $this->encode($input[$keys[$i]]); if ($i != count($keys) - 1) $output .= ','; } return $isIndexed ? '[' . $output . ']' : '{' . $output . '}'; } } ?> plugins/imagemanager/classes/Utils/CSSCompressor.php000066600000014545150472426320016637 0ustar00_items = array(); $default = array( 'expires_offset' => '10d', 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'convert_urls' => true, 'name' => '' ); $this->_settings = array_merge($default, $settings); $this->_lastUpdate = 0; } /** * Add raw contents as part of the concatenation/compression. This method should only be used if * you really need to. * * @param String $content Content to add as part of the concatenation process. */ function addContent($content) { $this->_items[] = array('content', $content); } /** * Adds a file to the concatenation/compression process. * * @param String $path Path to the file to include in the compressed package/output. * @param bool $whitespace Set this state to false to skip whitespace removal for the specified file. */ function addFile($path, $whitespace = true) { $this->_items[] = array('file', $path, $whitespace); $mtime = @filemtime($path); if ($mtime > $this->_lastUpdate) $this->_lastUpdate = $mtime; } /** * Compress and output all files that got added to the process by addFile. */ function compress() { $key = ""; foreach ($this->_items as $item) $key .= $item[1]; // Setup some variables $cacheFile = $this->_settings['cache_dir'] . "/"; if ($this->_settings['name']) $cacheFile .= preg_replace('/[^a-z0-9_]/i', '', $this->_settings['name']); else $cacheFile .= md5($key); $supportsGzip = false; $content = ""; $encodings = array(); // Check if it supports gzip if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); if ($this->_settings['gzip_compress'] && (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('gzencode') && !ini_get('zlib.output_compression')) { $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; $supportsGzip = true; $cacheFile .= ".gz"; } else $cacheFile .= ".css"; // Set headers header("Content-type: text/css;charset=" . $this->_settings['charset']); header("Cache-Control: must-revalidate"); // Must be there for IE 6 header("Vary: Accept-Encoding"); // Handle proxies header("Expires: " . gmdate("D, d M Y H:i:s", time() + $this->_parseTime($this->_settings['expires_offset'])) . " GMT"); // Use cached file if ($this->_settings['disk_cache'] && file_exists($cacheFile) && @filemtime($cacheFile) == $this->_lastUpdate) { if ($supportsGzip) header("Content-Encoding: " . $enc); echo $this->_getFileContents($cacheFile); return; } // Load content foreach ($this->_items as $item) { if ($item[0] == 'file') $chunk = $this->_getFileContents($item[1]); else $chunk = $item[1]; // Remove UTF-8 BOM if (substr($chunk, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) $chunk = substr($chunk, 3); if (!preg_match('/[\r\n]$/', $chunk)) $chunk .= "\n"; if ($this->_settings['remove_whitespace'] && $item[2]) $chunk = $this->_removeWhiteSpace($chunk); // Convert urls if ($this->_settings['convert_urls']) { $chunk = preg_replace('/\\$base/', dirname($_SERVER['SCRIPT_NAME']), $chunk); $chunk = preg_replace('/url\\([\'"]?(?!\\/|http)/', '$0' . dirname($item[1]) . '/', $chunk); } $content .= $chunk; } // GZip content if ($supportsGzip) { header("Content-Encoding: " . $enc); $content = gzencode($content, 9, FORCE_GZIP); } // Write cache file if ($this->_settings['disk_cache']) { if (!is_dir($this->_settings['cache_dir'])) @mkdir($this->_settings['cache_dir']); $this->_putFileContents($cacheFile, $content); if (@file_exists($cacheFile)) @touch($cacheFile, $this->_lastUpdate); } // Output content to client echo $content; } /**#@+ @access private */ function _removeWhiteSpace($content) { // Remove comments $content = preg_replace('/(\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/)/', '', $content); // Remove whitespace at the beginning and end of CSS $content = preg_replace('/^[\r\n]+/', '', $content); $content = preg_replace('/[\r\n]+$/', "\n", $content); // Remove redundant linebreaks $content = preg_replace('/\r\n/', "\n", $content); $content = preg_replace('/\n+/', "\n", $content); // Remove whitespace before/after styles inside rules $content = preg_replace('/\\{\\s*(.*?)\\s*\\}/', '{$1}', $content); // Remove remove whitespace between style rules and after the last one $content = preg_replace('/;\\s+/', ';', $content); $content = preg_replace('/\\{([^\\}]+);\\}/', '{$1}', $content); // Remove whitespace between : $content = preg_replace('/\\s*\\:\\s*/', ':', $content); return $content; } function _putFileContents($path, $content) { if (function_exists("file_put_contents")) return @file_put_contents($path, $content); $fp = @fopen($path, "wb"); if ($fp) { fwrite($fp, $content); fclose($fp); } } function _getFileContents($path) { $path = realpath($path); if (!$path || !@is_file($path)) return ""; if (function_exists("file_get_contents")) return @file_get_contents($path); $content = ""; $fp = @fopen($path, "r"); if (!$fp) return ""; while (!feof($fp)) $content .= fread($fp, 1024); fclose($fp); return $content; } function _parseTime($time) { $multipel = 1; // Hours if (strpos($time, "h") != false) $multipel = 60 * 60; // Days if (strpos($time, "d") != false) $multipel = 24 * 60 * 60; // Months if (strpos($time, "m") != false) $multipel = 24 * 60 * 60 * 30; // Trim string return intval($time) * $multipel; } /**#@-*/ } ?>plugins/imagemanager/classes/Utils/ResultSet.php000066600000002526150472426320016060 0ustar00_cols = explode(',', $cols); $this->_rows = array(); $this->_config = null; } function add() { $this->_rows[] = func_get_args(); } function setHeader($name, $value) { $this->_header[$name] = $value; } function setConfig($config) { $this->_config = $config; } function getRowCount() { return count($this->_rows); } function getRows() { $rowsArr = array(); for ($i=0; $i_rows);$i++) $rowsArr[] = $this->getRow($i); return $rowsArr; } function getRow($index) { if ($index < 0) return null; $row = $this->_rows[$index]; $obj = array(); for ($i=0; $i_cols[$i]] = $row[$i]; return $obj; } function toArray() { $ar = array( "header" => $this->_header, "columns" => $this->_cols, "data" => $this->_rows ); if (is_array($this->_config)) $ar["config"] = $this->_config; return $ar; } } ?>plugins/imagemanager/login_session_auth.php000066600000002163150472426320015262 0ustar00Wiki for more details.'; if (isset($_POST['submit_button'])) { // If password match, then set login if ($_POST['login'] == $username && $_POST['password'] == $password && $password) { // Set session session_start(); $_SESSION['isLoggedIn'] = true; $_SESSION['user'] = $_POST['login']; // Override any config option //$_SESSION['imagemanager.filesystem.rootpath'] = 'some path'; //$_SESSION['filemanager.filesystem.rootpath'] = 'some path'; // Redirect header("location: " . $_POST['return_url']); die; } else $msg = "Wrong username/password."; }*/ $_SESSION['isLoggedIn'] = true; $_SESSION['user'] = $_POST['login']; header("location: " . $_POST['return_url']); die; ?> plugins/imagemanager/docs/license.html000066600000015106150472426320014116 0ustar00 Commercial license - MCI1

        Commercial license - MCI1

        End User License Agreement For Moxiecode ImageManager (MCImageManager)

        This license is for 1 copy of the Moxiecode ImageManager Software on 1 web site.

        THE MOXIECODE IMAGEMANAGER SOFTWARE LICENSE AGREEMENT

        This License Agreement is a legal agreement between you ("LICENSEE") (either an individual or a single entity) and Moxiecode Systems AB ("MOXIECODE") for the software product Moxiecode ImageManager which includes computer software and electronic documentation (collectively the "SOFTWARE"). Read it carefully before completing the installation process and using the SOFTWARE. If you did not obtain this copy of the SOFTWARE legally, please destroy the copy immediately.

        By installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this License Agreement.

        If you do not agree to the terms of this License Agreement, MOXIECODE is unwilling to license the SOFTWARE. In such event, you may not install, copy or otherwise use the SOFTWARE.

        YOU AGREE THAT YOUR USE OF THE SOFTWARE ACKNOWLEDGES THAT YOU HAVE READ THIS LICENSE, UNDERSTAND IT, AND AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS.

        1. Using the SOFTWARE

        If you have purchased a license for the SOFTWARE, subject to the terms and conditions of this Agreement, MOXIECODE grants you, LICENSEE, a limited, non-exclusive, non-transferable, non-sublicenseable license to install one (1) copy of the SOFTWARE only on one (1) single web site and use that copy of the SOFTWARE only in accordance with this Agreement.

        LICENSEE may use the SOFTWARE to operate in conjunction with other SOFTWARE.

        If the SOFTWARE is to be installed on multiple web sites (development web sites not included), a separate SOFTWARE license must be acquired for each individual web site.

        LICENSEE may make a copy of the SOFTWARE solely for backup or archival purposes, provided that LICENSEE reproduces and includes all copyright and other proprietary notice(s) on the copy.

        2. Restrictions

        LICENSEE may not:
        (i) Rent, lease, lend, transfer or otherwise transfer rights to the SOFTWARE.
        (ii) Translate, adapt, modify the SOFTWARE or create derivative works based upon the SOFTWARE or any part thereof except configuration.
        (iii) Distribute copies of the SOFTWARE.
        (iv) Electronically transfer the SOFTWARE over a network, a telephone circuit or the Internet to a non-LICENCEE.
        (v) Remove any proprietary notices or labels on the SOFTWARE.
        (vi) Use the SOFTWARE to encode, reproduce or copy any material or intellectual property you do not have the right to encode, reproduce or copy.

        3. Termination

        This License Agreement is effective until terminated. MOXIECODE may terminate this License Agreement if LICENSEE fails to comply with the terms and conditions of this License Agreement. In such event, LICENSEE must destroy all copies of the SOFTWARE and all of its component parts. All provisions relating the ownership, disclaimer of warranties, limitation of liability and the general provisions shall survive the termination of this License Agreement.

        4. Ownership

        The SOFTWARE is licensed, NOT sold. The foregoing License Agreement gives LICENSEE limited rights to use the SOFTWARE. All rights, title and interest, including all copyrights, in and to the SOFTWARE and any copies LICENSEE is permitted to make herein are exclusively owned by MOXIECODE and/or its suppliers and are protected by copyright, trademark and trade secret law and international treaties. MOXIECODE retains all rights not expressly granted to LICENSEE in this License Agreement.

        5. Limited Warranty.

        MOXIECODE warrants to you that for a period of fifteen (15) days from the date of purchase, as evidenced by a copy of the receipt, the media on which SOFTWARE is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, SOFTWARE is provided "AS IS". Your exclusive remedy and MOXIECODE's entire liability under this limited warranty will be at MOXIECODE's option to replace SOFTWARE or refund the fee paid for SOFTWARE.

        6. DISCLAIMER OF WARRANTY.

        UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.

        7. LIMITATION OF LIABILITY.

        TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL MOXIECODE OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF MOXIECODE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will MOXIECODE's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for SOFTWARE under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose.

        9. Governing Law.

        Any action related to this Agreement will be governed by Swedish law. No choice of law rules of any jurisdiction will apply.

        10. Severability.

        If any provision of this Agreement is held to be unenforceable, This Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate.

        11. Entire Agreement

        This License Agreement constitutes the entire agreement between LICENSEE and MOXIECODE and supersedes any other prior agreements or understandings, whether oral or written, regarding the SOFTWARE. If a provision of this agreement is deemed null and void, invalid or without effect, the remainder of this agreement shall remain in effect.

        plugins/imagemanager/examples.html000066600000006753150472426320013372 0ustar00 MCImageManager Example

        Simple example

        This is the most simple form of integration.

        [MCImageManager]

        Relative URL example

        This example will output the selected files as relative to the current document.

        [MCImageManager]

        Absolute URL with document_base_url option

        This example will output the selected files as absolute URLs but with a different domain prefix.

        [MCImageManager]

        Absolute URL without host

        This example will output the selected files as absolute URLs but without the protocol and host name parts.

        [MCImageManager]

        Specify default path

        This example shows how the default path can be specified with JavaScript, it also disables the remember last path feature.

        [MCImageManager]

        Specify rootpath

        This example shows how the rootpath can be specified with JavaScript.

        [MCImageManager]

        Custom JavaScript insert script

        This example shows how one could implement a custom insertion JavaScript.

        [MCImageManager]

        Custom filter script

        This example shows you how to change/filter data passed back.

        [MCImageManager]

        Filtered file list example

        This is the most simple form of integration.

        [MCImageManager]

        plugins/media/moxieplayer.swf000066600000047014150472426320012402 0ustar00CWS xݽ XS8<3&7 (⎊q"BX*K$MuZ]oukwjukwMBPpr̙3g{R0S!QPLCdqH( 6l9aa $Ԓ/qV#""F#lvplk(Fު5L@ZfXlmT3u.9yfF2S76kX@(SifimQڜI7-FjlVHL6>*:Ӓ36 .ϰEYh4wΒkO :w$r2&Q= 2HrZ,Q]YxQ]-Mԁ\a-/ uPZRRR򩂃 xb?~-皚)MY9f}`Y;DJ*j| u[س|}跩84v>[g4ekS;9)Qm<([[mC@Sfy6%v Sئv5M67h䴩 uau6Ҭ6b n@\K^v&H}ͳ/=bҧO&l^ɐg6Чqx9$Kg4Xam{s3ځVP=Yځ:ْۦv8$-f)7O؆& Pgfx;FeY2Ek)W9Z Fϵ N+9pblL$2, 9Yee)͸TCSqvo#o 9:TrthVۿyϦAEm&mCʙ?r1̬\VRٹU1 mnJ\(:hUV4ꄳl,]f%({DV^745!u:Nh>-zw>I[8m~FCN?J*:gS})}v/^L5w>>yww[>mwVor,0/B^?40geq3:%}w3qz-ι0ϟ0J/ѠRD:7s~|zԃktPC{z_QCj8w3_9Drگ=d_ߟe;qYџ^j׮]'׳KSj ۴yKz|IoOOh&=D̩'Yk;:sܝewݓԊU[<{pyca{D`F߹{WG]{~v2y[[^G-=1yy_s]>r5V֫d}W_IJ-Ϭؙz+U7^XcիWl߳ڛӸ!5ӂwo=[?qЪ4m/}Ǖ ۾ #Q}nTzkhȩE7'?i2;ꋙ]nu䧒ޟ|es3Y~ScLﶶz"ɶGa߸8/~U7.vN]'W^4%k[A(:5bec Kskf\T{>ù9G{,02VLkY\2мDXcݫ +Vg6;u֢ Qc|dGXj~bq3ac8yŻZd]yɟd既Çmi}kۘO//#Q/ |t\ٝS|vq;}{/x|UovY\ӳF;?&TsCtJҋ7#Ok;o+_}x“ٕ/rJ7Z[6./fly钺ͬv~ɼעcwD m?V}ŭGG++|-?ڞgj?Zs|U :ϦW_ŻD\L+z`uﮎ Դ˖cTjb}K>>E cTP=N?M:/D^gفVUIʂA͟|wpMƜ}Jv.{ѩ&ܻ_nT^~W\=!~mΛEi sׯl}n==%jI/Z_dph|?fW|pu7>TVmNɾۃ^~V+˅ǷmѢEjTpyL:'\7<^ rryV/~#œgo?MW/=68Ǜ=jCCpy COE)T>tWx2Ou:6pǭaEr:}lSsۤ\3`◱C^MzkMG۷Ov ~VOMƎ¤z&}w;:큺ie1*ϞwoeCTL͙}$̜~e͒ si_ye)vlxkuHD|]#7=3dtzo+cw86=̣IFX`BBրIܮsy;K|Wu}Mc-?筛g%Og70Sڼx;tdQp͞[o5ol[ߧy*%=\W5b~^#R;Oxf5ͭ?Bs۶=Rr&YK_/>n?L~zf8s=&4!I7eV\i:64MWjO/ۼ5?1KՌL ^uIи™!m<ЁeOP}˔k{ϛ6muˊ~5xgҲ%lmSG.zAJ +a6ozVz +)aπ+OpbY؃S|O;ں/\ٔ{ݚ(†Y恵OxCdZ~޼Oݫ_MO'5 wǩnbw_P빗ϊO[30&쵫?m:;aգU5ڞ ϝ+o5=dӵLɎ_ngft>*g̾fl뗾tO7n?_>+<~=QnT`+qOm36%yj'+[g`y87N|JBH/YI7a+-ZgmWt+sG^|^[AKjKN=5j#n|Wc}}AZ{/T8t rNg>0#3g=@l%7~ckf|z 7O%-̹F6\n ͿO=kp&߀gooS4O<&wj4믯&9s?U؞jڨc4uquo]:\M[-(K U撃ϓ_4pu/[卟|XMPZ]ҼU.aaھ{*4o ,}cBHVn̜A=#>bT B!XζY%l ao=cAh˅ R*^H5:WW-Ѧ8qyfs"G`eY\^6AYL6>i׼ Bd dCJۛlYWΊ.<#ED"rMkl"1 pO_NGkX!Ooɒw/\yR6J?t;s ?V[ dR)ڽ-גϵV!Q =()Xk劃˓ 3͙7RqޒD6G/,M:YCu\w|wvύ1`|>A*H` XtUr\&ق'l3^mjkliNYmf&&MeUXuZqkNth,xga,C҃Y PDKE!Wϔw>˒6Y8PI }hl~p[a=~wZ-{|OewCjodTL(֦3sF/k$V|l?m.=YZ Cl{޲\Dk1j%R*^AzAUPeӷw]kI1S.LfЅV9\nsvkgdhI44ґUm)Y9JTavOɖ*[(1QI[UkyN\Şt<= :[֜C%?皻׉JX.*[W!av.S irʝK˕}*Χ3r`"= ձљl>Xr2ݪuJ+5K^3%f2[&׊A\>a0oCI2#Huץ"2oli0< ܹ68UZn9 #-n~ʩlU-GM;SiJŗPnn^WYdNQ]A3{\ZJs(wی`Ta٫SohVF]v{]p. J,3Ĭz&,*ptz6PSΥz++e bLd]AQqD:ka9'MON/dzdp^ޥOʼW^SXNdֽ۽D{IdmA!CVe͵ʨ˙+Ϧ{tuDQJ% ryjc9l +*Īut(x:5ztN:EwtbĦn~Η䬟JlUl.p@DK91{l jw)P1roξf[5 =b'kz4 mڸyx*?f[xz0XYCUOrỲWC{$1){x>$vd:Չ'&i)X @^A\m͊~Iӡݑ= `g2)6jiΉJŘOܽS`2yic$E?z6KPP]y^;fuդ%Dw[U :4OODTB',pcr`js&DzLfzB,Vxde1>!qy,zɻk@"`\rY0Yn4(JT{}"  9?06bN~d 5b,'8Rf [bX+h3?Z$)2\p9zsb6ho[ 4RY+,P`˥!X4n(YfD?W8k9:ĐaҚK!tX4ڒf1i3: ,w,#CdYOS<9`zx oɵraTC=8,ֲ! aPF]/vptZmd>}Ii A[7~ RBDumנcE76IOj:}RB5JENPFdyz0t9zҷ!Zד~l :P}ϑn<(|+Mz b@-wEa2g&o %v ~*2e?A?HU/a]q=~DoD*keO+xd H>R~_Ery&b\9MXQp|@` v ,ZBN$쏛xN<&R<3QuO蚔yFgLR)#k {::fg QR)8`T !IjN_T?IlB\*~ ({X 32RѾA$XLDgks:KΐnTKYUܞLӝ!t>k$Rk^C pPsc@m8 !)}S6NzPqp,2ol:k0@OKŐ?%>_?, H i@ DzX6Pڍ{q>hbp〿C˞Ddl9}Ҹ)RN*EJ1" -VJ)%UR*ᠸW~@Uh𸏫!bTM6kޢe+TḵMX2maYOFs1 :'2;WRk+,Q.&[VemZ=lL TQCJ{ KV RA |%,U . ZPGY= .D5x m$HCE |l"ংl.([ʖgHl-(^me;e (ce((; xA (?eAUAMP~"( 8I% %#ྂ_S.M_s2?)?O3 ~&7@3 ~Y_gr,Wq &< ~ ~gB_ 0,XP|@[,4V,`DI|0`tf0`\y,X` Re?,X`jk ɿŜk 7 0t&xx3v1vx”1 a S0v0,TP<BQc?Ϗ8 p \!T8r u u[uCE_o|w?\:  p.0v z ,x 5J!d8F|-(cA=L BÉDh4` SAtX` 2" B*P^`z!l;<]Dws `/>h@t1>D#P> p qx'9/xD49"?Ox$(^_q \;PT?tM[D ; p><x )PK":CD_KP5"f 0N P F 0`<'qB$D>'$K699W )|ϩsB8y=P38wD&@dpel9sX`b%K9!fz`Mfo `;Oqh90 bwɇ(`?WU琎 Gy z`PS$'_zb7> } V \9(n pP'o({ \"% '`r^8/sP5/!-]j)5p`% ㅘVy3_I@jd#! 0`L9Oɼ| }N{aL)82.ė.]_/#T+1-r?X3HUH?Tf*gRבʐC+rQP*l*Å9?ked'%6, Ͽ!ʔ'u »d)a91_HH  )j@C\5TI ԤI $\-^B,eBr"PxxP OJyP| "(yz ƨ$!C?NP/%A)_r(+҆IiC.c8t# 9r!gH 9Hș ׿r[HFA= ,Ѣѐ8rc g 9X千\8 !7; rM D}9r_M0=94OF@ʡ!h$ę੐~A-D?@~4Drhx69:υt"mJ|/a*!]R8yS!ʩei3 f吟i4b]*+fļu\xkyA!@Z-k :0Z/ ~!:hA q M0Րrh DXucbp6nĀ6n;!݂wvv=X^ Ѹڃ/X"`'b0h]hD;c#>A6O@I1:Bj*"1=JtTŨf=yt@t$K)(zB_8ElYz9Xgo,9H/@U+%HĿAz_M;Bz_һ:p ,MP/1G]`v7J-#oâT*ƐT!%h$i܇[HAȏ1FEc!%hyG)AcO @J)BJ4 !%3 %h&yY4ty\yrh>yrh!y Erh1y%ҥj5yCHsEJ0ɫא&#!]C`yY!h=)uɷnC(oC[h U!R@X"%L)&x<\#R ? D* MϢ n!x6epg0:ѯ= F/Iw\ ¯| h9kTu9\W7VIG8GdH axrPh0 $x3?Sy_0= 1iOx g}5<}q&a|Ux!Y-AMEX%_ *Dp\c,sp/=җ ]IWjbXC손8(?\n YRpaB:N 롽a İʑa3IDE$a.ҷVFt>~EN"i N"*BvM$@k+@+*텆a1$ mhxG!g0 S،i]$ RLAOQȹY85X]u&{Bf$ДhW.!9LPj`c@AFІzfP'!"~696(sQzA0lqAR[@Ezh N=I,="(S3vP:H,{Q}S:h:0Y=E v-=>h)rxӹVPLۃЂ4IB=,0I'>x!aMR&z7!g7`7Ԃpt5㦳jI:gX|q F R^w[ <$l9-<糪D8{J* A 90cY:o9Db"9XN% H;0 ߑv Wai*L$픮$ULy9 p vCK=[ |!Ƃ\6J@Q5H/eW<AB,AqIAO]G,4\!!g-dD"T;1AԯHCA@.#4&z&(bBU JQJ G+ьoll *P NiiқTjh ,s@r, \9PFR9;COz'kotCӥ[C<v~PHiWAUEP6&GC|-",wEqw ɣ]Kl/\w$l9.\K)-^/y).i{Z2."XkLO[`'bִ>TEae 5 JPw|L*KuUl jv}o:vC -RIE)Y!@cJrֵQ$<$O OD+׃^:1j": 1$u,Q$Ʊ$uQ&q$u7B=ʋ%/9\Y4VEꙘVpaURI I{C(3'u#ގcI5qM1Z[ 'Ɂ"f ơf jʪxKƚ,Kʩ_'NVO'cvf͞)*NcW^gH4g1oG)aBtzo Yv\ ь3xV֌P1d7 > PܵzT(tY(RR80rNZU |yF]щBK?1:ZV!lBr IK 6$pQQ7Q9Y Z%ԃJf M(D7Bm8e[KTn-map_9хZAF}Q v*m`lLR|P)Iȵk/ZĵkI 9!Q^<OƱkM}(Dݯd7$I,'2F_t_5T۵ S?2Zekh=톞XH6SCta&U_uY"\l7$zRޒv9V="B8^vC/ƉRn-"DOz3^QD׈}j-tXvېhF1 5f ; "3Mdڻ-qn1`5IL$Q)JThehNG Z*SqS9Tz @k?vZԊէƪ> hłv1zqD[WwbAQ B-WnLEcFڻ WŢ&E*ȍPoj>C6L1$"鄤`h:l!Nfp5L}4CRH ^0]"Y=UUꄩLX1t_BxVN +WdOIh@N t=&8c{Jf]wN$F`:N@;9};"<[ $&)ASŀ| ] ~C>1$00(. zRG<^üm(BۘF5WwzMWzEWP )q`/ U *N!8J'T@VLJ;dJNqǖ:x.u.%8[g镏N|$q&-q{7G\R r; bt '!V>O~{I٬lesVZP)}L&cgh@LG|oC"Po`1!(ҿ'X3,D[a 1ORgeNz=Q ?R*C4iD9 TF&N7|1@uK:1y"0!2b-Ņ؅ P-/XvrDi.؂Ey*"3}bx?02'+sÝ(+ax%V5 KSٹUn; ;tV3*{"ҫH?b^]nH/*7ҏťהCz.K!KKI-rI/+:7OX!j9I?aUͅTN-/gn=eí`ñ Ӌq8ұ6Tc,g nc=cc*] 匵m՞HF6Rkd/"BF2|? 9vJ }וӶѶL>kaΨ oͣlmā+! fF_ VN?[J^`05M%1"kqN:!{P|X1R_RSۀ H KHPk\Ik7eԥe36L%E]LڙBqѢQ%>+̸SVfW>!"ٛJ( ՛JY?HX 3k2"*ET(x=OpdaUD"j2*QEMe?*ER0-LZ8ϯC^b Kv-G/]5v%:J681lK.zOPpvL/\??Q*@eTa OlK|{R.JyOzyݔn.RgUR ntu͠3 x^%p0)NmԅSsӜ >˩qHبzx ?SƵ6q 6sxOF$:INnK3 a G$CR*-!>KJ2 `@8Ϥ\ٔ"m0wNמrq8R'} cptZ Dqި`fqTKQlJ& I⦒"t?(Poȇ"8MX5-W 5%}:HS9%<{s^ > 'n؋<;8l<5pP 2e£+02Ψ_0L}'fALŮ T(性l8d܋}j 1`ãZA켢*AJ88Ѯ)5pX{+|ωٸAtl#߽{J 6KFH q?N银iŭA{WiwL@y2d0}y'4vbCy`Nj2ŎJW ӱKE;#]80 Qwwt@$54G0*3Ec<& 胰PؓL:AK_;9enT]XRuuhP"0lw*:vt |;om3.ELBAqIIԛq&IE[qIMۈq6e4S`ݕ7 3nlY}ΥUctVLJE9/6>.ʛXq*N  =t;dMcjL\E"UOQn47O"ewiq!fF@7B6ph˘v?!_яyBp^VЏ6 8qv0}Fp4!`7ر7xN~SG=jdBxAC1B|˃^89z_(ǃZfdboS1_I]b0!}NXKd|̩DFƩ#}7 8.n q!/kxP2a<)7 KbLōz&Zfif}oaH#h\ @-Lx4Ǹ\`ǃ@yākncB"-\`(RlR7ʟ~s@0U1hHZhD#2 PԹ W\9[Q2SaElGZ0R\oRY"EPTZ_l;;;AEXC.KxyzX .cPط2#CRmہb8ߴO,7vG~%jǥ쇼z9^AWPH\*vlEڄI<=7Лn@ɐWҳjt 8Dŵ"zԟq" V2G:R)Dո(~:gQZI΢\΢B5SEH(w<(NĎiV/UODώU(T8߉C1諪 ŽQ׉Ѡ u WB%-mɷ%7#/ƻt_w%П07H=M!vQ.RO.SLȦGN'A 4TfGm.]ї΀j-I0NaTC2VC! {38[*ePztz CS1խȋ7#wI| 8?7\|Itv_ ?ØH.C؉p);!E<qq gځ0[(wJsR⢼((Y%hiШ}ӏ#i< YaWAP h{l 7y<{j FQ_YSds+H!|BY? Qhϟ_$i3V@߽00){N+=(N?"&":"")+O+"="+escape(P)}});if(N.length){G.params.flashvars=N}K=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(K,function(P,O){G.params[O]=""+P})}}G=z.attr("data-mce-json");if(!G){return}G=g.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}if(q.name==="Iframe"){x=new b("iframe",1);tinymce.each(d,function(i){var n=z.attr(i);if(i=="class"&&n){n=n.replace(/mceItem.+ ?/g,"")}if(n&&n.length>0){x.attr(i,n)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new b("script",1).attr("type","text/javascript");y=new b("#text",3);y.value="write"+q.name+"("+g.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new b("video",1).attr(tinymce.extend({id:z.attr("id"),width:z.attr("width"),height:z.attr("height"),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A'); function get(id) { return document.getElementById(id); } function clone(obj) { var i, len, copy, attr; if (null == obj || "object" != typeof obj) return obj; // Handle Array if ('length' in obj) { copy = []; for (i = 0, len = obj.length; i < len; ++i) { copy[i] = clone(obj[i]); } return copy; } // Handle Object copy = {}; for (attr in obj) { if (obj.hasOwnProperty(attr)) copy[attr] = clone(obj[attr]); } return copy; } function getVal(id) { var elm = get(id); if (elm.nodeName == "SELECT") return elm.options[elm.selectedIndex].value; if (elm.type == "checkbox") return elm.checked; return elm.value; } function setVal(id, value, name) { if (typeof(value) != 'undefined' && value != null) { var elm = get(id); if (elm.nodeName == "SELECT") selectByValue(document.forms[0], id, value); else if (elm.type == "checkbox") { if (typeof(value) == 'string') { value = value.toLowerCase(); value = (!name && value === 'true') || (name && value === name.toLowerCase()); } elm.checked = !!value; } else elm.value = value; } } window.Media = { init : function() { var html, editor, self = this; self.editor = editor = tinyMCEPopup.editor; // Setup file browsers and color pickers get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media'); get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media'); get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media'); get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media'); get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media'); get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media'); get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','media','image'); html = self.getMediaListHTML('medialist', 'src', 'media', 'media'); if (html == "") get("linklistrow").style.display = 'none'; else get("linklistcontainer").innerHTML = html; if (isVisible('filebrowser')) get('src').style.width = '230px'; if (isVisible('video_filebrowser_altsource1')) get('video_altsource1').style.width = '220px'; if (isVisible('video_filebrowser_altsource2')) get('video_altsource2').style.width = '220px'; if (isVisible('audio_filebrowser_altsource1')) get('audio_altsource1').style.width = '220px'; if (isVisible('audio_filebrowser_altsource2')) get('audio_altsource2').style.width = '220px'; if (isVisible('filebrowser_poster')) get('video_poster').style.width = '220px'; editor.dom.setOuterHTML(get('media_type'), self.getMediaTypeHTML(editor)); self.setDefaultDialogSettings(editor); self.data = clone(tinyMCEPopup.getWindowArg('data')); self.dataToForm(); self.preview(); updateColor('bgcolor_pick', 'bgcolor'); }, insert : function() { var editor = tinyMCEPopup.editor; this.formToData(); editor.execCommand('mceRepaint'); tinyMCEPopup.restoreSelection(); editor.selection.setNode(editor.plugins.media.dataToImg(this.data)); tinyMCEPopup.close(); }, preview : function() { get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true); }, moveStates : function(to_form, field) { var data = this.data, editor = this.editor, mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src; defaultStates = { // QuickTime quicktime_autoplay : true, quicktime_controller : true, // Flash flash_play : true, flash_loop : true, flash_menu : true, // WindowsMedia windowsmedia_autostart : true, windowsmedia_enablecontextmenu : true, windowsmedia_invokeurls : true, // RealMedia realmedia_autogotourl : true, realmedia_imagestatus : true }; function parseQueryParams(str) { var out = {}; if (str) { tinymce.each(str.split('&'), function(item) { var parts = item.split('='); out[unescape(parts[0])] = unescape(parts[1]); }); } return out; }; function setOptions(type, names) { var i, name, formItemName, value, list; if (type == data.type || type == 'global') { names = tinymce.explode(names); for (i = 0; i < names.length; i++) { name = names[i]; formItemName = type == 'global' ? name : type + '_' + name; if (type == 'global') list = data; else if (type == 'video' || type == 'audio') { list = data.video.attrs; if (!list && !to_form) data.video.attrs = list = {}; } else list = data.params; if (list) { if (to_form) { setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : ''); } else { delete list[name]; value = getVal(formItemName); if ((type == 'video' || type == 'audio') && value === true) value = name; if (defaultStates[formItemName]) { if (value !== defaultStates[formItemName]) { value = "" + value; list[name] = value; } } else if (value) { value = "" + value; list[name] = value; } } } } } } if (!to_form) { data.type = get('media_type').options[get('media_type').selectedIndex].value; data.width = getVal('width'); data.height = getVal('height'); // Switch type based on extension src = getVal('src'); if (field == 'src') { ext = src.replace(/^.*\.([^.]+)$/, '$1'); if (typeInfo = mediaPlugin.getType(ext)) data.type = typeInfo.name.toLowerCase(); setVal('media_type', data.type); } if (data.type == "video" || data.type == "audio") { if (!data.video.sources) data.video.sources = []; data.video.sources[0] = {src: getVal('src')}; } } // Hide all fieldsets and show the one active get('video_options').style.display = 'none'; get('audio_options').style.display = 'none'; get('flash_options').style.display = 'none'; get('quicktime_options').style.display = 'none'; get('shockwave_options').style.display = 'none'; get('windowsmedia_options').style.display = 'none'; get('realmedia_options').style.display = 'none'; get('embeddedaudio_options').style.display = 'none'; if (get(data.type + '_options')) get(data.type + '_options').style.display = 'block'; setVal('media_type', data.type); setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars'); setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc'); setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign'); setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume'); setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks'); setOptions('video', 'poster,autoplay,loop,muted,preload,controls'); setOptions('audio', 'autoplay,loop,preload,controls'); setOptions('embeddedaudio', 'autoplay,loop,controls'); setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height'); if (to_form) { if (data.type == 'video') { if (data.video.sources[0]) setVal('src', data.video.sources[0].src); src = data.video.sources[1]; if (src) setVal('video_altsource1', src.src); src = data.video.sources[2]; if (src) setVal('video_altsource2', src.src); } else if (data.type == 'audio') { if (data.video.sources[0]) setVal('src', data.video.sources[0].src); src = data.video.sources[1]; if (src) setVal('audio_altsource1', src.src); src = data.video.sources[2]; if (src) setVal('audio_altsource2', src.src); } else { // Check flash vars if (data.type == 'flash') { tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) { if (value == '$url') data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src || ''; }); } setVal('src', data.params.src); } } else { src = getVal("src"); // YouTube *NEW* if (src.match(/youtu.be\/[a-z1-9.-_]+/)) { data.width = 425; data.height = 350; data.params.frameborder = '0'; data.type = 'iframe'; src = 'http://www.youtube.com/embed/' + src.match(/youtu.be\/([a-z1-9.-_]+)/)[1]; setVal('src', src); setVal('media_type', data.type); } // YouTube if (src.match(/youtube.com(.+)v=([^&]+)/)) { data.width = 425; data.height = 350; data.params.frameborder = '0'; data.type = 'iframe'; src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1]; setVal('src', src); setVal('media_type', data.type); } // Google video if (src.match(/video.google.com(.+)docid=([^&]+)/)) { data.width = 425; data.height = 326; data.type = 'flash'; src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en'; setVal('src', src); setVal('media_type', data.type); } if (data.type == 'video') { if (!data.video.sources) data.video.sources = []; data.video.sources[0] = {src : src}; src = getVal("video_altsource1"); if (src) data.video.sources[1] = {src : src}; src = getVal("video_altsource2"); if (src) data.video.sources[2] = {src : src}; } else if (data.type == 'audio') { if (!data.video.sources) data.video.sources = []; data.video.sources[0] = {src : src}; src = getVal("audio_altsource1"); if (src) data.video.sources[1] = {src : src}; src = getVal("audio_altsource2"); if (src) data.video.sources[2] = {src : src}; } else data.params.src = src; // Set default size setVal('width', data.width || (data.type == 'audio' ? 300 : 320)); setVal('height', data.height || (data.type == 'audio' ? 32 : 240)); } }, dataToForm : function() { this.moveStates(true); }, formToData : function(field) { if (field == "width" || field == "height") this.changeSize(field); if (field == 'source') { this.moveStates(false, field); setVal('source', this.editor.plugins.media.dataToHtml(this.data)); this.panel = 'source'; } else { if (this.panel == 'source') { this.data = clone(this.editor.plugins.media.htmlToData(getVal('source'))); this.dataToForm(); this.panel = ''; } this.moveStates(false, field); this.preview(); } }, beforeResize : function() { this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10); this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10); }, changeSize : function(type) { var width, height, scale, size; if (get('constrain').checked) { width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10); height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10); if (type == 'width') { this.height = Math.round((width / this.width) * height); setVal('height', this.height); } else { this.width = Math.round((height / this.height) * width); setVal('width', this.width); } } }, getMediaListHTML : function() { if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) { var html = ""; html += ''; return html; } return ""; }, getMediaTypeHTML : function(editor) { function option(media_type, element) { if (!editor.schema.getElementRule(element || media_type)) { return ''; } return '' } var html = ""; html += ''; return html; }, setDefaultDialogSettings : function(editor) { var defaultDialogSettings = editor.getParam("media_dialog_defaults", {}); tinymce.each(defaultDialogSettings, function(v, k) { setVal(k, v); }); } }; tinyMCEPopup.requireLangPack(); tinyMCEPopup.onInit.add(function() { Media.init(); }); })(); plugins/media/js/embed.js000066600000003511150472426320011343 0ustar00/** * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. */ function writeFlash(p) { writeEmbed( 'D27CDB6E-AE6D-11cf-96B8-444553540000', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', 'application/x-shockwave-flash', p ); } function writeShockWave(p) { writeEmbed( '166B1BCA-3F9C-11CF-8075-444553540000', 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', 'application/x-director', p ); } function writeQuickTime(p) { writeEmbed( '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', 'video/quicktime', p ); } function writeRealMedia(p) { writeEmbed( 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', 'audio/x-pn-realaudio-plugin', p ); } function writeWindowsMedia(p) { p.url = p.src; writeEmbed( '6BF52A52-394A-11D3-B153-00C04F79FAA6', 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', 'application/x-mplayer2', p ); } function writeEmbed(cls, cb, mt, p) { var h = '', n; h += ''; h += ' 0) flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value); }); if (flashVarsOutput.length) data.params.flashvars = flashVarsOutput; params = editor.getParam('flash_video_player_params', { allowfullscreen: true, allowscriptaccess: true }); tinymce.each(params, function(value, name) { data.params[name] = "" + value; }); } }; data = node.attr('data-mce-json'); if (!data) return; data = JSON.parse(data); typeItem = this.getType(node.attr('class')); style = node.attr('data-mce-style') if (!style) { style = node.attr('style'); if (style) style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img')); } // Handle iframe if (typeItem.name === 'Iframe') { replacement = new Node('iframe', 1); tinymce.each(rootAttributes, function(name) { var value = node.attr(name); if (name == 'class' && value) value = value.replace(/mceItem.+ ?/g, ''); if (value && value.length > 0) replacement.attr(name, value); }); for (name in data.params) replacement.attr(name, data.params[name]); replacement.attr({ style: style, src: data.params.src }); node.replace(replacement); return; } // Handle scripts if (this.editor.settings.media_use_script) { replacement = new Node('script', 1).attr('type', 'text/javascript'); value = new Node('#text', 3); value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, { width: node.attr('width'), height: node.attr('height') })) + ');'; replacement.append(value); node.replace(replacement); return; } // Add HTML5 video element if (typeItem.name === 'Video' && data.video.sources[0]) { // Create new object element video = new Node('video', 1).attr(tinymce.extend({ id : node.attr('id'), width: node.attr('width'), height: node.attr('height'), style : style }, data.video.attrs)); // Get poster source and use that for flash fallback if (data.video.attrs) posterSrc = data.video.attrs.poster; sources = data.video.sources = toArray(data.video.sources); for (i = 0; i < sources.length; i++) { if (/\.mp4$/.test(sources[i].src)) mp4Source = sources[i].src; } if (!sources[0].type) { video.attr('src', sources[0].src); sources.splice(0, 1); } for (i = 0; i < sources.length; i++) { source = new Node('source', 1).attr(sources[i]); source.shortEnded = true; video.append(source); } // Create flash fallback for video if we have a mp4 source if (mp4Source) { addPlayer(mp4Source, posterSrc); typeItem = self.getType('flash'); } else data.params.src = ''; } // Add HTML5 audio element if (typeItem.name === 'Audio' && data.video.sources[0]) { // Create new object element audio = new Node('audio', 1).attr(tinymce.extend({ id : node.attr('id'), width: node.attr('width'), height: node.attr('height'), style : style }, data.video.attrs)); // Get poster source and use that for flash fallback if (data.video.attrs) posterSrc = data.video.attrs.poster; sources = data.video.sources = toArray(data.video.sources); if (!sources[0].type) { audio.attr('src', sources[0].src); sources.splice(0, 1); } for (i = 0; i < sources.length; i++) { source = new Node('source', 1).attr(sources[i]); source.shortEnded = true; audio.append(source); } data.params.src = ''; } if (typeItem.name === 'EmbeddedAudio') { embed = new Node('embed', 1); embed.shortEnded = true; embed.attr({ id: node.attr('id'), width: node.attr('width'), height: node.attr('height'), style : style, type: node.attr('type') }); for (name in data.params) embed.attr(name, data.params[name]); tinymce.each(rootAttributes, function(name) { if (data[name] && name != 'type') embed.attr(name, data[name]); }); data.params.src = ''; } // Do we have a params src then we can generate object if (data.params.src) { // Is flv movie add player for it if (/\.flv$/i.test(data.params.src)) addPlayer(data.params.src, ''); if (args && args.force_absolute) data.params.src = editor.documentBaseURI.toAbsolute(data.params.src); // Create new object element object = new Node('object', 1).attr({ id : node.attr('id'), width: node.attr('width'), height: node.attr('height'), style : style }); tinymce.each(rootAttributes, function(name) { var value = data[name]; if (name == 'class' && value) value = value.replace(/mceItem.+ ?/g, ''); if (value && name != 'type') object.attr(name, value); }); // Add params for (name in data.params) { param = new Node('param', 1); param.shortEnded = true; value = data.params[name]; // Windows media needs to use url instead of src for the media URL if (name === 'src' && typeItem.name === 'WindowsMedia') name = 'url'; param.attr({name: name, value: value}); object.append(param); } // Setup add type and classid if strict is disabled if (this.editor.getParam('media_strict', true)) { object.attr({ data: data.params.src, type: typeItem.mimes[0] }); } else { object.attr({ classid: "clsid:" + typeItem.clsids[0], codebase: typeItem.codebase }); embed = new Node('embed', 1); embed.shortEnded = true; embed.attr({ id: node.attr('id'), width: node.attr('width'), height: node.attr('height'), style : style, type: typeItem.mimes[0] }); for (name in data.params) embed.attr(name, data.params[name]); tinymce.each(rootAttributes, function(name) { if (data[name] && name != 'type') embed.attr(name, data[name]); }); object.append(embed); } // Insert raw HTML if (data.object_html) { value = new Node('#text', 3); value.raw = true; value.value = data.object_html; object.append(value); } // Append object to video element if it exists if (video) video.append(object); } if (video) { // Insert raw HTML if (data.video_html) { value = new Node('#text', 3); value.raw = true; value.value = data.video_html; video.append(value); } } if (audio) { // Insert raw HTML if (data.video_html) { value = new Node('#text', 3); value.raw = true; value.value = data.video_html; audio.append(value); } } var n = video || audio || object || embed; if (n) node.replace(n); else node.remove(); }, /** * Converts a tinymce.html.Node video/object/embed to an img element. * * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this: * * * The JSON structure will be like this: * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}} */ objectToImg : function(node) { var object, embed, video, iframe, img, name, id, width, height, style, i, html, param, params, source, sources, data, type, lookup = this.lookup, matches, attrs, urlConverter = this.editor.settings.url_converter, urlConverterScope = this.editor.settings.url_converter_scope, hspace, vspace, align, bgcolor; function getInnerHTML(node) { return new tinymce.html.Serializer({ inner: true, validate: false }).serialize(node); }; function lookupAttribute(o, attr) { return lookup[(o.attr(attr) || '').toLowerCase()]; } function lookupExtension(src) { var ext = src.replace(/^.*\.([^.]+)$/, '$1'); return lookup[ext.toLowerCase() || '']; } // If node isn't in document if (!node.parent) return; // Handle media scripts if (node.name === 'script') { if (node.firstChild) matches = scriptRegExp.exec(node.firstChild.value); if (!matches) return; type = matches[1]; data = {video : {}, params : JSON.parse(matches[2])}; width = data.params.width; height = data.params.height; } // Setup data objects data = data || { video : {}, params : {} }; // Setup new image object img = new Node('img', 1); img.attr({ src : this.editor.theme.url + '/img/trans.gif' }); // Video element name = node.name; if (name === 'video' || name == 'audio') { video = node; object = node.getAll('object')[0]; embed = node.getAll('embed')[0]; width = video.attr('width'); height = video.attr('height'); id = video.attr('id'); data.video = {attrs : {}, sources : []}; // Get all video attributes attrs = data.video.attrs; for (name in video.attributes.map) attrs[name] = video.attributes.map[name]; source = node.attr('src'); if (source) data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)}); // Get all sources sources = video.getAll("source"); for (i = 0; i < sources.length; i++) { source = sources[i].remove(); data.video.sources.push({ src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'), type: source.attr('type'), media: source.attr('media') }); } // Convert the poster URL if (attrs.poster) attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name); } // Object element if (node.name === 'object') { object = node; embed = node.getAll('embed')[0]; } // Embed element if (node.name === 'embed') embed = node; // Iframe element if (node.name === 'iframe') { iframe = node; type = 'Iframe'; } if (object) { // Get width/height width = width || object.attr('width'); height = height || object.attr('height'); style = style || object.attr('style'); id = id || object.attr('id'); hspace = hspace || object.attr('hspace'); vspace = vspace || object.attr('vspace'); align = align || object.attr('align'); bgcolor = bgcolor || object.attr('bgcolor'); data.name = object.attr('name'); // Get all object params params = object.getAll("param"); for (i = 0; i < params.length; i++) { param = params[i]; name = param.remove().attr('name'); if (!excludedAttrs[name]) data.params[name] = param.attr('value'); } data.params.src = data.params.src || object.attr('data'); } if (embed) { // Get width/height width = width || embed.attr('width'); height = height || embed.attr('height'); style = style || embed.attr('style'); id = id || embed.attr('id'); hspace = hspace || embed.attr('hspace'); vspace = vspace || embed.attr('vspace'); align = align || embed.attr('align'); bgcolor = bgcolor || embed.attr('bgcolor'); // Get all embed attributes for (name in embed.attributes.map) { if (!excludedAttrs[name] && !data.params[name]) data.params[name] = embed.attributes.map[name]; } } if (iframe) { // Get width/height width = iframe.attr('width'); height = iframe.attr('height'); style = style || iframe.attr('style'); id = iframe.attr('id'); hspace = iframe.attr('hspace'); vspace = iframe.attr('vspace'); align = iframe.attr('align'); bgcolor = iframe.attr('bgcolor'); tinymce.each(rootAttributes, function(name) { img.attr(name, iframe.attr(name)); }); // Get all iframe attributes for (name in iframe.attributes.map) { if (!excludedAttrs[name] && !data.params[name]) data.params[name] = iframe.attributes.map[name]; } } // Use src not movie if (data.params.movie) { data.params.src = data.params.src || data.params.movie; delete data.params.movie; } // Convert the URL to relative/absolute depending on configuration if (data.params.src) data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object'); if (video) { if (node.name === 'video') type = lookup.video.name; else if (node.name === 'audio') type = lookup.audio.name; } if (object && !type) type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name; if (embed && !type) type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name; // for embedded audio we preserve the original specified type if (embed && type == 'EmbeddedAudio') { data.params.type = embed.attr('type'); } // Replace the video/object/embed element with a placeholder image containing the data node.replace(img); // Remove embed if (embed) embed.remove(); // Serialize the inner HTML of the object element if (object) { html = getInnerHTML(object.remove()); if (html) data.object_html = html; } // Serialize the inner HTML of the video element if (video) { html = getInnerHTML(video.remove()); if (html) data.video_html = html; } data.hspace = hspace; data.vspace = vspace; data.align = align; data.bgcolor = bgcolor; // Set width/height of placeholder img.attr({ id : id, 'class' : 'mceItemMedia mceItem' + (type || 'Flash'), style : style, width : width || (node.name == 'audio' ? "300" : "320"), height : height || (node.name == 'audio' ? "32" : "240"), hspace : hspace, vspace : vspace, align : align, bgcolor : bgcolor, "data-mce-json" : JSON.serialize(data, "'") }); } }); // Register plugin tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin); })(); plugins/media/media.htm000066600000112052150472426320011107 0ustar00 {#media_dlg.title}
        {#media_dlg.general}
         
        x   
        {#media_dlg.preview}
        {#media_dlg.advanced}
         
        {#media_dlg.html5_video_options}
         
         
         
        {#media_dlg.embedded_audio_options}
        {#media_dlg.html5_audio_options}
         
         
        {#media_dlg.flash_options}
        {#media_dlg.qt_options}
         
         
        {#media_dlg.wmp_options}
        {#media_dlg.rmp_options}
         
        {#media_dlg.shockwave_options}
        {#media_dlg.source}
        plugins/media/img/flv_player.swf000066600000026624150472426320012767 0ustar00CWSax| \S$pr/EO΀ ѐEUEzZj[jjjkov?xowfvvfvf`KsBj)@=%hjjJe 6( UH |F5PT! (5y$DxLB[ 4SH e>aJPBIB.&䫴>$)sIC=؇ޓ!g}o^ӣzT G)!;tQTPPƏ-Z>C=>A×迨֡ 幻GJ?쑱"Ӫھ{SVes¶ŋe^cKqy? 5~E^LhQD5޿ˬ<+O߅i8jοMN6,?D~#5d([T;nJ = DAqfy9 ^)jrp@/o ɰ&6ٸT+Tɠj؎A:;0)Yp<\<0B k*ۥO2FD G0cۥB_HXޕA!A$B,D`(it Z[J~ЬَW+ EH.,225S*H+*QZTi (_֠RBoư(EYԐZf0贤h07JQPBcե< dXQkU(L"J02JP΀M WҖ 22>>U0BS~ 4H]{>Coұ~PeH`P R0#,ẠP~O(ӱ¥X4'ҫ*%'vI)zbҨ |:6K>K'iU*" oPFQjЁ:S(eĚ_4egVm}3L+Yc@Q1`|e%^b{: nn| r06m> tZ*("DHa0(hO Tz@*y#[aI{+ 4VQ(׫K qDu?aZ YP4mO~*,Jl76F1FG✔Jbcj$HA@TUU?L @#NX D tUZFU(JB@EA=;Fuѱ[TNTKgPdfFir̅JT1(oo(Y+,UU"uŝQ~YAW R خ5~ZZTb-. a0)0L@-QjthEѮ54!Ƞ *uQoH8Q&2V_*(?@o=Д)@cVAgT -F2iG)P%3j3*$ӫ2ʊ .2ء,+"QPyN:uh αZQiqqªVBgV\:g~c6^0 He<_b-n>QBj`^?!8sjRBjvؖ*.. AxFzP2 2p5 nټ3o,V/6~JhD%v~+ B H)a+rZZ xXXM!peI 9'# @ C12;d^ #$e.H"# Iyqv&e/\)@= I"D|HlLZ$7|IԑCDI٦L<4Tˎe'q!5\ сmvV_t/sB7,21")!ǽ 2Me-h]+""`7tycMǶ@m<W}9!FPMc46- dZa_ <aZ7Yѳ#T0 '<[ӏB,ZX';2 I5e0DU:1k|97L%jc!gociأ6l|`1wcۃp4ޒ5SN8F9߃ j'n3ds((LIw%㥙ԟ0@;A I9|SiEpY4W0QBr["7a%HH1B4+ΈY:2dytw;@E<S\Z0&$9z\X9ɷd\_RI3&*y%#BjjEF\NBu+"=>x:1پ}@q6c4 8Tm}2"<<$rod/Y_">l+ snAQ>> DdDwVD?"_N/|hKqH c)7aV$>#}?5y8NfDXD`Vj&T#nad!aoWP.,,K: d;dnv.H]XL=eSmk/+5L ԌxC;+/֝0 D_[8qZ81=5a4VihwDHz"OA)XBbm 9a'>x[yZ+umH&Ҩ/)Lދ:бZM?1<;.CrOYt2ӓ>G#2\e!DjN`5[V' (XefZ4eSWji\kS p ti$D _;8 m(q|Nvc&x#\LV mZHݖ3, (WS^.9ܡ2fOQ!I`R-h&nRZ;4Wk3Auo7czW0 'Li$B$MeNצɠ=tF$6f5kTBҥG mMmDdB ŒQ[۬FīY!fRj6M&`#\ 隓 Cvt*|EDPM'ɗ=Po)ePҜ/ΉM$j%dGEl@G`i\ xl}k6ペJFe 9@ǥ3i ;7e#0femw\7g>FlX&o|UH_!aQ)/+{:5[6zζ^DaLCb$s'L[8^`o*pqi\!!jvߡE35^R=59ྋ"^ n" İ$1S* 좽!hɛVUev}}=rwր?IoF  (n<p'JjѬ΅>rU_: ˳jNV \t|ɪK:מ+wꮮbu0Og9rJ$}%W5-p܅T8mf4tDW17_id 3Ƣ¦5]\]uQ>kWYwhvRؑK]B {{F5c$SX}pn9E%\\r{nN9 6ɢu$c\.a?y5]l<$35Ҩaӂ8=8qgmD#dO *1 wY9~5@#eHA QכkF8} [cQYKHɒ&Mg@cZB >kwPq B)mAScN"a;K`+dO|eT~,`3ݾ  ge ?iC6@ nPs^UT,$nN]+B{mn@ R-MÍJlBL@L0Y4i*.ܮrww#A0lN.q0LNkw=VŮNPs1d!,4rb>z1C1L#wPweXJD$;8 0;wH%*.m[x",[6խ6%㾌.ʹf>9''N{9lO}gYw]O6'V[3׺ʼ^ ]_YkFFM5#{O*.NPt}-r6c{_~<4Y\RTD_MCkq [[̅9g~vz~"犤;o"@ޠ+]op"꽶ፄQ{ v2ySڝin>]mSz|? >~own5=須VPHW礤)W(<^޶^, ^)?_=eOWZy5˥߿zUoZvw{%MGw҃KoG; g¦W=+䚝~[ώkl^9u|Q[QcRVgSV?,C[Ӻ!nG9>i?tZ25W߻ρ·.KSK+ccOUXPW6sꮑ&]y;OK{XlwxɃwGflc6qBỮsyCcؑ+?y. ԨsC.!k/dйYg ]ffjp׏7?&D"ܽq|+iN٭lnދUuOg(c6=pf_π}kԭx%]/W3 I=-r^BѰ=;< uI5R~vLWɹNwxV_k=2|ِ;w<~7.U)Vʛ+&NN[7hkNdCo 9ÉCZwҸ_ȟ\l7|0j×Nd!oGݴ}y;ܚ:s{#NOoV$>&gːSxqpț{y留'ľ_1v)uG`g݉{ϡU].ȍ1qF꥞%k\n޻W~I#9~~SuMaњXg8V^Լ}cc[Ԙ0'w GFnx¸={L~÷.3{7HPgE§ILWݿ+yyٛroonK?.pOq+;n1ו%ΏJ %Ÿt96緝㤮>YY`ەR]^Qk_^w*tUmO q{ޥ?nzXz9s5p5c*8"p8b-XFGe sAVŚ}s-]Zw ֿtKtǠeuukJg-|KϽ { oJLslcw:(,oh=Od'O'ްU믟ͨ>#n;uvb0˫٩Q_1~1[fV#!T5~Y~]xڔ'φ|t蓛n虻}fV Nh$^_hg}ͱ7&]<)Go-Yjʸ#~#cW h?>gT;?z>om/ԍܔrxm 燷%hy[k|MgVnT%2ڧႺ=WMיV_?8Wr^|/jt*kv׆fhԜGʏv4vFh$_b$tt&3xk=  rX3!iAkQ4N ՁiA+|k% "! 1o/-W֋1\z2+VŁʙr8$-Ä`Wxr/;e[@GOS־~=ۓ{4z9,]lPrYl7y}n a+Uf:LW2dAHΤHOwP.ш"ey׶V:|Vݩaƭ욲dk[W]F5`\t5`GtwqL1DbtC{xvi\E14xdLtafˠxBL]˴B+"#*˼Žh5H}<Dz#I=շ %7gvN1|ϻGnyB <4)~[\|gӓTWW7/'է}}}c*ޞ57Bn%N{pvo}ĉr̷:ooZ{r\I8l}㌇n]sĂG?,G }dMЍ\W[/ F\1Ž$%pC2V?3|K"#$7ؒD{;(~SQ{[1(^UA@5u@G|P̠FSh^H@^_mtf_Y\gz)0" $.r/qDЧv-DzD{H.Bw2p>ڵkESSq\ze%e 9g xnBCL:ݹA],FϹk# DkVB8mb#iLD8ntYuD#ux z"  #7S ,V ". ;*?5;" <_ ,\" !;plugins/media/img/trans.gif000066600000000053150472426320011705 0ustar00GIF89a!,D;plugins/media/img/windowsmedia.gif000066600000000637150472426320013260 0ustar00GIF89a?uS-ѩaY0@G愅p+fҎG,LWKqxwwV&^qKNCiiimKx+tnV^K~3fp!BWuWr(a;vTHo9!?," %lhhD 4],G:jͤ\fఄTs5 !*$/  ;-!&1/<'9;=7+; :78(3.2 "+%?>))'=., ? ., B 2%3cB(  ~;plugins/media/img/realmedia.gif000066600000000667150472426320012514 0ustar00GIF89a%RPM@kű@=;.+)c5xHVusq}$pX Jfff!,%' 0){for(m=j+1;m=0;m--){if(r(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();plugins/tabfocus/editor_plugin_src.js000066600000005567150472426320014132 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode; tinymce.create('tinymce.plugins.TabFocusPlugin', { init : function(ed, url) { function tabCancel(ed, e) { if (e.keyCode === 9) return Event.cancel(e); } function tabHandler(ed, e) { var x, i, f, el, v; function find(d) { el = DOM.select(':input:enabled,*[tabindex]:not(iframe)'); function canSelectRecursive(e) { return e.nodeName==="BODY" || (e.type != 'hidden' && !(e.style.display == "none") && !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode)); } function canSelectInOldIe(el) { return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA"; } function isOldIe() { return tinymce.isIE6 || tinymce.isIE7; } function canSelect(el) { return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el); } each(el, function(e, i) { if (e.id == ed.id) { x = i; return false; } }); if (d > 0) { for (i = x + 1; i < el.length; i++) { if (canSelect(el[i])) return el[i]; } } else { for (i = x - 1; i >= 0; i--) { if (canSelect(el[i])) return el[i]; } } return null; } if (e.keyCode === 9) { v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next'))); if (v.length == 1) { v[1] = v[0]; v[0] = ':prev'; } // Find element to focus if (e.shiftKey) { if (v[0] == ':prev') el = find(-1); else el = DOM.get(v[0]); } else { if (v[1] == ':next') el = find(1); else el = DOM.get(v[1]); } if (el) { if (el.id && (ed = tinymce.get(el.id || el.name))) ed.focus(); else window.setTimeout(function() { if (!tinymce.isWebKit) window.focus(); el.focus(); }, 10); return Event.cancel(e); } } } ed.onKeyUp.add(tabCancel); if (tinymce.isGecko) { ed.onKeyPress.add(tabHandler); ed.onKeyDown.add(tabCancel); } else ed.onKeyDown.add(tabHandler); }, getInfo : function() { return { longname : 'Tabfocus', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin); })(); plugins/nonbreaking/editor_plugin.js000066600000001660150472426320013740 0ustar00(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?' ':" ")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(f.keyCode==9){f.preventDefault();d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking")}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})();plugins/nonbreaking/editor_plugin_src.js000066600000002674150472426320014615 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.Nonbreaking', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceNonBreaking', function() { ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' '); }); // Register buttons ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'}); if (ed.getParam('nonbreaking_force_tab')) { ed.onKeyDown.add(function(ed, e) { if (e.keyCode == 9) { e.preventDefault(); ed.execCommand('mceNonBreaking'); ed.execCommand('mceNonBreaking'); ed.execCommand('mceNonBreaking'); } }); } }, getInfo : function() { return { longname : 'Nonbreaking space', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } // Private methods }); // Register plugin tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking); })();plugins/autosave/editor_plugin.js000066600000006760150472426320013300 0ustar00(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s| |<\/?p[^>]*>|]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){h.storeDraft();i.nodeChanged()},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,j=h.storage,i;if(j){i=j.getItem(h.key);if(i){h.editor.setContent(i);h.onRestoreDraft.dispatch(h,{content:i})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()]*>|]*>/gi, "").length > 0) { // Show confirm dialog if the editor isn't empty ed.windowManager.confirm( PLUGIN_NAME + ".warning_message", function(ok) { if (ok) self.restoreDraft(); } ); } else self.restoreDraft(); } }); // Enable/disable restoredraft button depending on if there is a draft stored or not ed.onNodeChange.add(function() { var controlManager = ed.controlManager; if (controlManager.get(RESTORE_DRAFT)) controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft()); }); ed.onInit.add(function() { // Check if the user added the restore button, then setup auto storage logic if (ed.controlManager.get(RESTORE_DRAFT)) { // Setup storage engine self.setupStorage(ed); // Auto save contents each interval time setInterval(function() { self.storeDraft(); ed.nodeChanged(); }, settings.autosave_interval); } }); /** * This event gets fired when a draft is stored to local storage. * * @event onStoreDraft * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. * @param {Object} draft Draft object containing the HTML contents of the editor. */ self.onStoreDraft = new Dispatcher(self); /** * This event gets fired when a draft is restored from local storage. * * @event onStoreDraft * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. * @param {Object} draft Draft object containing the HTML contents of the editor. */ self.onRestoreDraft = new Dispatcher(self); /** * This event gets fired when a draft removed/expired. * * @event onRemoveDraft * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event. * @param {Object} draft Draft object containing the HTML contents of the editor. */ self.onRemoveDraft = new Dispatcher(self); // Add ask before unload dialog only add one unload handler if (!unloadHandlerAdded) { window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler; unloadHandlerAdded = TRUE; } }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @method getInfo * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Auto save', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, /** * Returns an expiration date UTC string. * * @method getExpDate * @return {String} Expiration date UTC string. */ getExpDate : function() { return new Date( new Date().getTime() + this.editor.settings.autosave_retention ).toUTCString(); }, /** * This method will setup the storage engine. If the browser has support for it. * * @method setupStorage */ setupStorage : function(ed) { var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK"; self.key = PLUGIN_NAME + ed.id; // Loop though each storage engine type until we find one that works tinymce.each([ function() { // Try HTML5 Local Storage if (localStorage) { localStorage.setItem(testKey, testVal); if (localStorage.getItem(testKey) === testVal) { localStorage.removeItem(testKey); return localStorage; } } }, function() { // Try HTML5 Session Storage if (sessionStorage) { sessionStorage.setItem(testKey, testVal); if (sessionStorage.getItem(testKey) === testVal) { sessionStorage.removeItem(testKey); return sessionStorage; } } }, function() { // Try IE userData if (tinymce.isIE) { ed.getElement().style.behavior = "url('#default#userData')"; // Fake localStorage on old IE return { autoExpires : TRUE, setItem : function(key, value) { var userDataElement = ed.getElement(); userDataElement.setAttribute(key, value); userDataElement.expires = self.getExpDate(); try { userDataElement.save("TinyMCE"); } catch (e) { // Ignore, saving might fail if "Userdata Persistence" is disabled in IE } }, getItem : function(key) { var userDataElement = ed.getElement(); try { userDataElement.load("TinyMCE"); return userDataElement.getAttribute(key); } catch (e) { // Ignore, loading might fail if "Userdata Persistence" is disabled in IE return null; } }, removeItem : function(key) { ed.getElement().removeAttribute(key); } }; } }, ], function(setup) { // Try executing each function to find a suitable storage engine try { self.storage = setup(); if (self.storage) return false; } catch (e) { // Ignore } }); }, /** * This method will store the current contents in the the storage engine. * * @method storeDraft */ storeDraft : function() { var self = this, storage = self.storage, editor = self.editor, expires, content; // Is the contents dirty if (storage) { // If there is no existing key and the contents hasn't been changed since // it's original value then there is no point in saving a draft if (!storage.getItem(self.key) && !editor.isDirty()) return; // Store contents if the contents if longer than the minlength of characters content = editor.getContent({draft: true}); if (content.length > editor.settings.autosave_minlength) { expires = self.getExpDate(); // Store expiration date if needed IE userData has auto expire built in if (!self.storage.autoExpires) self.storage.setItem(self.key + "_expires", expires); self.storage.setItem(self.key, content); self.onStoreDraft.dispatch(self, { expires : expires, content : content }); } } }, /** * This method will restore the contents from the storage engine back to the editor. * * @method restoreDraft */ restoreDraft : function() { var self = this, storage = self.storage, content; if (storage) { content = storage.getItem(self.key); if (content) { self.editor.setContent(content); self.onRestoreDraft.dispatch(self, { content : content }); } } }, /** * This method will return true/false if there is a local storage draft available. * * @method hasDraft * @return {boolean} true/false state if there is a local draft. */ hasDraft : function() { var self = this, storage = self.storage, expDate, exists; if (storage) { // Does the item exist at all exists = !!storage.getItem(self.key); if (exists) { // Storage needs autoexpire if (!self.storage.autoExpires) { expDate = new Date(storage.getItem(self.key + "_expires")); // Contents hasn't expired if (new Date().getTime() < expDate.getTime()) return TRUE; // Remove it if it has self.removeDraft(); } else return TRUE; } } return false; }, /** * Removes the currently stored draft. * * @method removeDraft */ removeDraft : function() { var self = this, storage = self.storage, key = self.key, content; if (storage) { // Get current contents and remove the existing draft content = storage.getItem(key); storage.removeItem(key); storage.removeItem(key + "_expires"); // Dispatch remove event if we had any contents if (content) { self.onRemoveDraft.dispatch(self, { content : content }); } } }, "static" : { // Internal unload handler will be called before the page is unloaded _beforeUnloadHandler : function(e) { var msg; tinymce.each(tinyMCE.editors, function(ed) { // Store a draft for each editor instance if (ed.plugins.autosave) ed.plugins.autosave.storeDraft(); // Never ask in fullscreen mode if (ed.getParam("fullscreen_is_enabled")) return; // Setup a return message if the editor is dirty if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload")) msg = ed.getLang("autosave.unload_msg"); }); return msg; } } }); tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave); })(tinymce); plugins/directionality/editor_plugin.js000066600000002465150472426320014472 0ustar00(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},getInfo:function(){return{longname:"Directionality",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})();plugins/directionality/editor_plugin_src.js000066600000003712150472426320015335 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.Directionality', { init : function(ed, url) { var t = this; t.editor = ed; ed.addCommand('mceDirectionLTR', function() { var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); if (e) { if (ed.dom.getAttrib(e, "dir") != "ltr") ed.dom.setAttrib(e, "dir", "ltr"); else ed.dom.setAttrib(e, "dir", ""); } ed.nodeChanged(); }); ed.addCommand('mceDirectionRTL', function() { var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock); if (e) { if (ed.dom.getAttrib(e, "dir") != "rtl") ed.dom.setAttrib(e, "dir", "rtl"); else ed.dom.setAttrib(e, "dir", ""); } ed.nodeChanged(); }); ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'}); ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'}); ed.onNodeChange.add(t._nodeChange, t); }, getInfo : function() { return { longname : 'Directionality', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private methods _nodeChange : function(ed, cm, n) { var dom = ed.dom, dir; n = dom.getParent(n, dom.isBlock); if (!n) { cm.setDisabled('ltr', 1); cm.setDisabled('rtl', 1); return; } dir = dom.getAttrib(n, 'dir'); cm.setActive('ltr', dir == "ltr"); cm.setDisabled('ltr', 0); cm.setActive('rtl', dir == "rtl"); cm.setDisabled('rtl', 0); } }); // Register plugin tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality); })();plugins/inlinepopups/editor_plugin.js000066600000027205150472426320014173 0ustar00(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","
        "));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceClose"){z.close(null,i);return a.cancel(t)}else{if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;gf){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})();plugins/inlinepopups/template.htm000066600000030313150472426320013310 0ustar00 Template for dialogs
        Blured
        Content
        Statusbar text.
        Focused
        Content
        Statusbar text.
        Statusbar
        Content
        Statusbar text.
        Statusbar, Resizable
        Content
        Statusbar text.
        Resizable, Maximizable
        Content
        Statusbar text.
        Blurred, Maximizable, Statusbar, Resizable
        Content
        Statusbar text.
        Maximized, Maximizable, Minimizable
        Content
        Statusbar text.
        Blured
        Content
        Statusbar text.
        Alert
        This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message.
        Ok
        Confirm
        This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message. This is a very long error message.
        Ok Cancel
        plugins/inlinepopups/skins/clearlooks2/window.css000066600000014741150472426320016362 0ustar00/* Clearlooks 2 */ /* Reset */ .clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block} /* General */ .clearlooks2 {position:absolute; direction:ltr} .clearlooks2 .mceWrapper {position:static} .mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%} .clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)} .clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none} /* Top */ .clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px} .clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)} .clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)} .clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0} .clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold} .clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0} .clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px} .clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0} .clearlooks2 .mceFocus .mceTop span {color:#FFF} /* Middle */ .clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0} .clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)} .clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0} .clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF} .clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)} /* Bottom */ .clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px} .clearlooks2 .mceBottom {left:0; bottom:0; width:100%} .clearlooks2 .mceBottom div {top:0} .clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px} .clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px} .clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0} .clearlooks2 .mceBottom span {display:none} .clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px} .clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0} .clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px} .clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0} .clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px} /* Actions */ .clearlooks2 a {width:29px; height:16px; top:3px;} .clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0} .clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0} .clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0} .clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0} .clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px} .clearlooks2 .mceMovable .mceMove {display:block} .clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px} .clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px} .clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px} .clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px} .clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} .clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px} .clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px} .clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px} .clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px} /* Resize */ .clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px} .clearlooks2 .mceResizable .mceResize {display:block} .clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none} .clearlooks2 .mceMinimizable .mceMin {display:block} .clearlooks2 .mceMaximizable .mceMax {display:block} .clearlooks2 .mceMaximized .mceMed {display:block} .clearlooks2 .mceMaximized .mceMax {display:none} .clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize} .clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize} .clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize} .clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;} .clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize} .clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize} .clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize} .clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize} /* Alert/Confirm */ .clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0} .clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px} .clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal} .clearlooks2 a:hover {font-weight:bold;} .clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5} .clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px} .clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)} .clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px} .clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto} .clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif000066600000001401150472426320017762 0ustar00GIF89a-P$%'êu}~鳧ùȿǵ=:8!.,-PpH,$el:ШtJVSجvzxL.hznhN% !$"HNXȰÇ#J\@ŋ3jܨǏ CI2ɓ(S\ɲ%0cʜI8sɳ JѣH (]ʴӧPJJիXjׯ`Ê۠ٳhӪ]˶۷o!ȝKݻx˗ LÈ'vǐ#KL˘3kyϠCMӨQ3Xͺװc@۸s޽ Nȓ+_μУK>݄سkν;ËOӫ_Ͼ_˟Ͽ(h& 6 „Vhfyv!x.($h(,0(.;plugins/inlinepopups/skins/clearlooks2/img/vertical.gif000066600000000124150472426320017403 0ustar00GIF87a , @!(AK( 8vu)~*F ;plugins/inlinepopups/skins/clearlooks2/img/button.gif000066600000000420150472426320017104 0ustar00GIF87aPccc,PPC8;qdihjLm,tJxpH<H1ɜ-P@ZجvvoްxL΂贚z^6|>~vz"w7ħ/! ;plugins/inlinepopups/skins/clearlooks2/img/confirm.gif000066600000001613150472426320017233 0ustar00GIF87a y7*T xg(Z[3ʜ[ūu=ѻnKc+؈,Meх+9CRڃL5\D~z3~ %zn)E"<jT,-E΂-wIܕ@T8»aʡ_Ȯ}I:TµІ2aû{_}a݊#׳^]ݏ1ƘPőU{79P|y, xx O O x]H[#f#[H]I_f_I #JE# FW̯F œɽMMy T =yQ QPf~8 *8瀓 j{Aj zR3|,dп$Ədp #Aw=`"=Phs$ `AQiph)8ډMQɈT@C P⽓-NU;C2 ^ V%rΡfwtd> q yC:j(SMu! C@k+S&YI6[1!x a$mXT6>GX@CKR$9OƄc'#X FE ys=@…&łܭra ֱÉ}Up-H"FčI;plugins/inlinepopups/skins/clearlooks2/img/alert.gif000066600000001452150472426320016706 0ustar00GIF87a {nn \\ܣ<<66CCJJ888CCdd--QQ33yyWWiivvkj<<llbb$$uuEE׎ڴMLpp++$$eeKKRRÌͳ==AAdd::))::JJjjWWPP((;;ħɣп%%%ƪ00ccIIϺ̱֘~ȟ^]עUU,,ڌyy||٭QPNNđƘBB__??mm 㺺߀bbսwv, z{k1q1/r6#n0Sw((E{0*44<:{l y$W 7za=t^ LZf]y[dD'L1t%oAU' &6 >Uc-ܴ#K%QlÆs%(Ñ"<88Cpj":)Fj$&s_xS-*B",d yj9HǬ[4iuG  HhACvfCˀZ-aH˻xtfBŃ|1 vPBݑѶɣA B(CӨH倠4r A!+r=ąب !üЛ fЙ?$ν?f ӧG@;plugins/inlinepopups/skins/clearlooks2/img/buttons.gif000066600000002253150472426320017275 0ustar00GIF89at0n{Q[c787k|`r~WdpZiu^n|\kyy{x!,t0Fdi&l;nr-bA|c#B,< Ak6LTL9:z:9D;{>9u|ͻ߿u}Ả?5سk^}{ޱw߾u?~˟?*&{P5 6蠃 >@ '>HaJ] Thpb*B/17X\60DbHNUF7ALdP"YeS2 ې[F))iPyfd)fn&`&w U|矀g~G(,ꨟP 餔Vj^馒f駔z *Q)`ꩨ*R 묧J[+XfkU T*`&.6 JK-k\n+W޺njعƞXnټλY^oڿ Zy\[fE-'1ʕMpƲ'2v!{{%ww) (s|57\ l2+ b!^hv F@$T#;5,v>v5xyƪLMep')q7)fy ~>*yz(/y 0~>j(Jz{+Ȯ>k뮿 {F{l/{j;plugins/inlinepopups/skins/clearlooks2/img/corners.gif000066600000001615150472426320017253 0ustar00GIF89a'I=:8 }݂~ދ釚uù볧η̴%+ҭٴ!I,'@II)HH)H#@G 9 G@91, 1,I4%C$%4$CƯ##H/./.ĭH-D /yX%Sb B"h(EIb SB>(P "(pBaJ &=Ip03HUt`SgfAV UUa" ݹqe+o߽(] *!n@AY)@ ڊч ؈:j> `#} ܀B g FFrWwPNSرrԭ+N|')); Event.add(id, 'keyup', function(evt) { var VK_ESCAPE = 27; if (evt.keyCode === VK_ESCAPE) { f.button_func(false); return Event.cancel(evt); } }); Event.add(id, 'keydown', function(evt) { var cancelButton, VK_TAB = 9; if (evt.keyCode === VK_TAB) { cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0]; if (cancelButton && cancelButton !== evt.target) { cancelButton.focus(); } else { DOM.get(id + '_ok').focus(); } return Event.cancel(evt); } }); } // Register events mdf = Event.add(id, 'mousedown', function(e) { var n = e.target, w, vp; w = t.windows[id]; t.focus(id); if (n.nodeName == 'A' || n.nodeName == 'a') { if (n.className == 'mceClose') { t.close(null, id); return Event.cancel(e); } else if (n.className == 'mceMax') { w.oldPos = w.element.getXY(); w.oldSize = w.element.getSize(); vp = DOM.getViewPort(); // Reduce viewport size to avoid scrollbars vp.w -= 2; vp.h -= 2; w.element.moveTo(vp.x, vp.y); w.element.resizeTo(vp.w, vp.h); DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight}); DOM.addClass(id + '_wrapper', 'mceMaximized'); } else if (n.className == 'mceMed') { // Reset to old size w.element.moveTo(w.oldPos.x, w.oldPos.y); w.element.resizeTo(w.oldSize.w, w.oldSize.h); w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight); DOM.removeClass(id + '_wrapper', 'mceMaximized'); } else if (n.className == 'mceMove') return t._startDrag(id, e, n.className); else if (DOM.hasClass(n, 'mceResize')) return t._startDrag(id, e, n.className.substring(13)); } }); clf = Event.add(id, 'click', function(e) { var n = e.target; t.focus(id); if (n.nodeName == 'A' || n.nodeName == 'a') { switch (n.className) { case 'mceClose': t.close(null, id); return Event.cancel(e); case 'mceButton mceOk': case 'mceButton mceCancel': f.button_func(n.className == 'mceButton mceOk'); return Event.cancel(e); } } }); // Make sure the tab order loops within the dialog. Event.add([id + '_left', id + '_right'], 'focus', function(evt) { var iframe = DOM.get(id + '_ifr'); if (iframe) { var body = iframe.contentWindow.document.body; var focusable = DOM.select(':input:enabled,*[tabindex=0]', body); if (evt.target.id === (id + '_left')) { focusable[focusable.length - 1].focus(); } else { focusable[0].focus(); } } else { DOM.get(id + '_ok').focus(); } }); // Add window w = t.windows[id] = { id : id, mousedown_func : mdf, click_func : clf, element : new Element(id, {blocker : 1, container : ed.getContainer()}), iframeElement : new Element(id + '_ifr'), features : f, deltaWidth : dw, deltaHeight : dh }; w.iframeElement.on('focus', function() { t.focus(id); }); // Setup blocker if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') { DOM.add(DOM.doc.body, 'div', { id : 'mceModalBlocker', 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker', style : {zIndex : t.zIndex - 1} }); DOM.show('mceModalBlocker'); // Reduces flicker in IE DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true'); } else DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1); if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel)) DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2}); DOM.setAttrib(id, 'aria-hidden', 'false'); t.focus(id); t._fixIELayout(id, 1); // Focus ok button if (DOM.get(id + '_ok')) DOM.get(id + '_ok').focus(); t.count++; return w; }, focus : function(id) { var t = this, w; if (w = t.windows[id]) { w.zIndex = this.zIndex++; w.element.setStyle('zIndex', w.zIndex); w.element.update(); id = id + '_wrapper'; DOM.removeClass(t.lastId, 'mceFocus'); DOM.addClass(id, 'mceFocus'); t.lastId = id; if (w.focussedElement) { w.focussedElement.focus(); } else if (DOM.get(id + '_ok')) { DOM.get(w.id + '_ok').focus(); } else if (DOM.get(w.id + '_ifr')) { DOM.get(w.id + '_ifr').focus(); } } }, _addAll : function(te, ne) { var i, n, t = this, dom = tinymce.DOM; if (is(ne, 'string')) te.appendChild(dom.doc.createTextNode(ne)); else if (ne.length) { te = te.appendChild(dom.create(ne[0], ne[1])); for (i=2; i ix) { fw = w; ix = w.zIndex; } }); return fw; }, setTitle : function(w, ti) { var e; w = this._findId(w); if (e = DOM.get(w + '_title')) e.innerHTML = DOM.encode(ti); }, alert : function(txt, cb, s) { var t = this, w; w = t.open({ title : t, type : 'alert', button_func : function(s) { if (cb) cb.call(s || t, s); t.close(null, w.id); }, content : DOM.encode(t.editor.getLang(txt, txt)), inline : 1, width : 400, height : 130 }); }, confirm : function(txt, cb, s) { var t = this, w; w = t.open({ title : t, type : 'confirm', button_func : function(s) { if (cb) cb.call(s || t, s); t.close(null, w.id); }, content : DOM.encode(t.editor.getLang(txt, txt)), inline : 1, width : 400, height : 130 }); }, // Internal functions _findId : function(w) { var t = this; if (typeof(w) == 'string') return w; each(t.windows, function(wo) { var ifr = DOM.get(wo.id + '_ifr'); if (ifr && w == ifr.contentWindow) { w = wo.id; return false; } }); return w; }, _fixIELayout : function(id, s) { var w, img; if (!tinymce.isIE6) return; // Fixes the bug where hover flickers and does odd things in IE6 each(['n','s','w','e','nw','ne','sw','se'], function(v) { var e = DOM.get(id + '_resize_' + v); DOM.setStyles(e, { width : s ? e.clientWidth : '', height : s ? e.clientHeight : '', cursor : DOM.getStyle(e, 'cursor', 1) }); DOM.setStyle(id + "_bottom", 'bottom', '-1px'); e = 0; }); // Fixes graphics glitch if (w = this.windows[id]) { // Fixes rendering bug after resize w.element.hide(); w.element.show(); // Forced a repaint of the window //DOM.get(id).style.filter = ''; // IE has a bug where images used in CSS won't get loaded // sometimes when the cache in the browser is disabled // This fix tries to solve it by loading the images using the image object each(DOM.select('div,a', id), function(e, i) { if (e.currentStyle.backgroundImage != 'none') { img = new Image(); img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1'); } }); DOM.get(id).style.filter = ''; } } }); // Register plugin tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups); })(); plugins/advimage/image.htm000066600000027113150472426320011613 0ustar00 {#advimage_dlg.dialog_title}
        {#advimage_dlg.general}
        {#advimage_dlg.preview}
        {#advimage_dlg.tab_appearance}
        {#advimage_dlg.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
         
        {#advimage_dlg.swap_image}
         
         
        {#advimage_dlg.misc}
         
        plugins/advimage/css/advimage.css000066600000001223150472426320013070 0ustar00#src_list, #over_list, #out_list {width:280px;} .mceActionPanel {margin-top:7px;} .alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;} .checkbox {border:0;} .panel_wrapper div.current {height:305px;} #prev {margin:0; border:1px solid #000; width:428px; 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;} #class_list {width:180px;} input {width: 280px;} #constrain, #onmousemovecheck {width:auto;} #id, #dir, #lang, #usemap, #longdesc {width:200px;} plugins/advimage/editor_plugin.js000066600000001427150472426320013221 0ustar00(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})();plugins/advimage/js/image.js000066600000030070150472426320012047 0ustar00var ImageDialog = { preInit : function() { var url; tinyMCEPopup.requireLangPack(); if (url = tinyMCEPopup.getParam("external_image_list_url")) document.write(''); }, init : function(ed) { var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'); tinyMCEPopup.resizeToInnerSize(); this.fillClassList('class_list'); this.fillFileList('src_list', fl); this.fillFileList('over_list', fl); this.fillFileList('out_list', fl); TinyMCE_EditableSelects.init(); if (n.nodeName == 'IMG') { nl.src.value = dom.getAttrib(n, 'src'); nl.width.value = dom.getAttrib(n, 'width'); nl.height.value = dom.getAttrib(n, 'height'); nl.alt.value = dom.getAttrib(n, 'alt'); nl.title.value = dom.getAttrib(n, 'title'); nl.vspace.value = this.getAttrib(n, 'vspace'); nl.hspace.value = this.getAttrib(n, 'hspace'); nl.border.value = this.getAttrib(n, 'border'); selectByValue(f, 'align', this.getAttrib(n, 'align')); selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true); nl.style.value = dom.getAttrib(n, 'style'); nl.id.value = dom.getAttrib(n, 'id'); nl.dir.value = dom.getAttrib(n, 'dir'); nl.lang.value = dom.getAttrib(n, 'lang'); nl.usemap.value = dom.getAttrib(n, 'usemap'); nl.longdesc.value = dom.getAttrib(n, 'longdesc'); nl.insert.value = ed.getLang('update'); if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover'))) nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout'))) nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1'); if (ed.settings.inline_styles) { // Move attribs to styles if (dom.getAttrib(n, 'align')) this.updateStyle('align'); if (dom.getAttrib(n, 'hspace')) this.updateStyle('hspace'); if (dom.getAttrib(n, 'border')) this.updateStyle('border'); if (dom.getAttrib(n, 'vspace')) this.updateStyle('vspace'); } } // Setup browse button document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); if (isVisible('srcbrowser')) document.getElementById('src').style.width = '260px'; // Setup browse button document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image'); if (isVisible('overbrowser')) document.getElementById('onmouseoversrc').style.width = '260px'; // Setup browse button document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image'); if (isVisible('outbrowser')) document.getElementById('onmouseoutsrc').style.width = '260px'; // If option enabled default contrain proportions to checked if (ed.getParam("advimage_constrain_proportions", true)) f.constrain.checked = true; // Check swap image if valid data if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value) this.setSwapImage(true); else this.setSwapImage(false); this.changeAppearance(); this.showPreviewImage(nl.src.value, 1); }, insert : function(file, title) { var ed = tinyMCEPopup.editor, t = this, f = document.forms[0]; if (f.src.value === '') { if (ed.selection.getNode().nodeName == 'IMG') { ed.dom.remove(ed.selection.getNode()); ed.execCommand('mceRepaint'); } tinyMCEPopup.close(); return; } if (tinyMCEPopup.getParam("accessibility_warnings", 1)) { if (!f.alt.value) { tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) { if (s) t.insertAndClose(); }); return; } } t.insertAndClose(); }, insertAndClose : function() { var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el; tinyMCEPopup.restoreSelection(); // Fixes crash in Safari if (tinymce.isWebKit) ed.getWin().focus(); if (!ed.settings.inline_styles) { args = { vspace : nl.vspace.value, hspace : nl.hspace.value, border : nl.border.value, align : getSelectValue(f, 'align') }; } else { // Remove deprecated values args = { vspace : '', hspace : '', border : '', align : '' }; } tinymce.extend(args, { src : nl.src.value.replace(/ /g, '%20'), width : nl.width.value, height : nl.height.value, alt : nl.alt.value, title : nl.title.value, 'class' : getSelectValue(f, 'class_list'), style : nl.style.value, id : nl.id.value, dir : nl.dir.value, lang : nl.lang.value, usemap : nl.usemap.value, longdesc : nl.longdesc.value }); args.onmouseover = args.onmouseout = ''; if (f.onmousemovecheck.checked) { if (nl.onmouseoversrc.value) args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';"; if (nl.onmouseoutsrc.value) args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';"; } el = ed.selection.getNode(); if (el && el.nodeName == 'IMG') { ed.dom.setAttribs(el, args); } else { tinymce.each(args, function(value, name) { if (value === "") { delete args[name]; } }); ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1}); ed.undoManager.add(); } tinyMCEPopup.editor.execCommand('mceRepaint'); tinyMCEPopup.editor.focus(); tinyMCEPopup.close(); }, getAttrib : function(e, at) { var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; if (ed.settings.inline_styles) { switch (at) { case 'align': if (v = dom.getStyle(e, 'float')) return v; if (v = dom.getStyle(e, 'vertical-align')) return v; break; case 'hspace': v = dom.getStyle(e, 'margin-left') v2 = dom.getStyle(e, 'margin-right'); if (v && v == v2) return parseInt(v.replace(/[^0-9]/g, '')); break; case 'vspace': v = dom.getStyle(e, 'margin-top') v2 = dom.getStyle(e, 'margin-bottom'); if (v && v == v2) return parseInt(v.replace(/[^0-9]/g, '')); break; case 'border': v = 0; tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { sv = dom.getStyle(e, 'border-' + sv + '-width'); // False or not the same as prev if (!sv || (sv != v && v !== 0)) { v = 0; return false; } if (sv) v = sv; }); if (v) return parseInt(v.replace(/[^0-9]/g, '')); break; } } if (v = dom.getAttrib(e, at)) return v; return ''; }, setSwapImage : function(st) { var f = document.forms[0]; f.onmousemovecheck.checked = st; setBrowserDisabled('overbrowser', !st); setBrowserDisabled('outbrowser', !st); if (f.over_list) f.over_list.disabled = !st; if (f.out_list) f.out_list.disabled = !st; f.onmouseoversrc.disabled = !st; f.onmouseoutsrc.disabled = !st; }, fillClassList : function(id) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { cl = []; tinymce.each(v.split(';'), function(v) { var p = v.split('='); cl.push({'title' : p[0], 'class' : p[1]}); }); } else cl = tinyMCEPopup.editor.dom.getClasses(); if (cl.length > 0) { lst.options.length = 0; lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); tinymce.each(cl, function(o) { lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); }); } else dom.remove(dom.getParent(id, 'tr')); }, fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; l = typeof(l) === 'function' ? l() : window[l]; lst.options.length = 0; if (l && l.length > 0) { lst.options[lst.options.length] = new Option('', ''); tinymce.each(l, function(o) { lst.options[lst.options.length] = new Option(o[0], o[1]); }); } else dom.remove(dom.getParent(id, 'tr')); }, resetImageData : function() { var f = document.forms[0]; f.elements.width.value = f.elements.height.value = ''; }, updateImageData : function(img, st) { var f = document.forms[0]; if (!st) { f.elements.width.value = img.width; f.elements.height.value = img.height; } this.preloadImg = img; }, changeAppearance : function() { var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg'); if (img) { if (ed.getParam('inline_styles')) { ed.dom.setAttrib(img, 'style', f.style.value); } else { img.align = f.align.value; img.border = f.border.value; img.hspace = f.hspace.value; img.vspace = f.vspace.value; } } }, changeHeight : function() { var f = document.forms[0], tp, t = this; if (!f.constrain.checked || !t.preloadImg) { return; } if (f.width.value == "" || f.height.value == "") return; tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height; f.height.value = tp.toFixed(0); }, changeWidth : function() { var f = document.forms[0], tp, t = this; if (!f.constrain.checked || !t.preloadImg) { return; } if (f.width.value == "" || f.height.value == "") return; tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width; f.width.value = tp.toFixed(0); }, updateStyle : function(ty) { var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value}); if (tinyMCEPopup.editor.settings.inline_styles) { // Handle align if (ty == 'align') { dom.setStyle(img, 'float', ''); dom.setStyle(img, 'vertical-align', ''); v = getSelectValue(f, 'align'); if (v) { if (v == 'left' || v == 'right') dom.setStyle(img, 'float', v); else img.style.verticalAlign = v; } } // Handle border if (ty == 'border') { b = img.style.border ? img.style.border.split(' ') : []; bStyle = dom.getStyle(img, 'border-style'); bColor = dom.getStyle(img, 'border-color'); dom.setStyle(img, 'border', ''); v = f.border.value; if (v || v == '0') { if (v == '0') img.style.border = isIE ? '0' : '0 none none'; else { if (b.length == 3 && b[isIE ? 2 : 1]) bStyle = b[isIE ? 2 : 1]; else if (!bStyle || bStyle == 'none') bStyle = 'solid'; if (b.length == 3 && b[isIE ? 0 : 2]) bColor = b[isIE ? 0 : 2]; else if (!bColor || bColor == 'none') bColor = 'black'; img.style.border = v + 'px ' + bStyle + ' ' + bColor; } } } // Handle hspace if (ty == 'hspace') { dom.setStyle(img, 'marginLeft', ''); dom.setStyle(img, 'marginRight', ''); v = f.hspace.value; if (v) { img.style.marginLeft = v + 'px'; img.style.marginRight = v + 'px'; } } // Handle vspace if (ty == 'vspace') { dom.setStyle(img, 'marginTop', ''); dom.setStyle(img, 'marginBottom', ''); v = f.vspace.value; if (v) { img.style.marginTop = v + 'px'; img.style.marginBottom = v + 'px'; } } // Merge dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img'); } }, changeMouseMove : function() { }, showPreviewImage : function(u, st) { if (!u) { tinyMCEPopup.dom.setHTML('prev', ''); return; } if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true)) this.resetImageData(); u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u); if (!st) tinyMCEPopup.dom.setHTML('prev', ''); else tinyMCEPopup.dom.setHTML('prev', ''); } }; ImageDialog.preInit(); tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); plugins/advimage/langs/ru_dlg.js000066600000006721150472426320012737 0ustar00tinyMCE.addI18n('ru.advimage_dlg',{ tab_general:"\u041E\u0431\u0449\u0435\u0435", tab_appearance:"\u0412\u0438\u0434", tab_advanced:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", general:"\u041E\u0431\u0449\u0435\u0435", title:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", preview:"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440", constrain_proportions:"\u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0442\u044C \u043F\u0440\u043E\u043F\u043E\u0440\u0446\u0438\u0438", langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430", langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430", long_desc:"Long description link", style:"\u0421\u0442\u0438\u043B\u044C", classes:"\u041A\u043B\u0430\u0441\u0441\u044B", ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", id:"Id", map:"Image map", swap_image:"Swap image", alt_image:"\u0410\u043B\u044C\u0442\u0435\u0440\u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", mouseover:"\u043F\u0440\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0438", mouseout:"\u043F\u0440\u0438 \u043E\u0442\u0432\u043E\u0434\u0435", misc:"\u0414\u0440\u0443\u0433\u043E\u0435", example_img:"\u0412\u0438\u0434 \u043F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", 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", dialog_title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", src:"\u0410\u0434\u0440\u0435\u0441 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", alt:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439", border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430", dimensions:"\u0420\u0430\u0437\u043C\u0435\u0440\u044B", vspace:"\u0412\u0435\u0440\u0442. \u043E\u0442\u0441\u0442\u0443\u043F", hspace:"\u0413\u043E\u0440\u0438\u0437. \u043E\u0442\u0441\u0442\u0443\u043F", align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", align_baseline:"\u041F\u043E \u0431\u0430\u0437\u043E\u0432\u043E\u0439 \u043B\u0438\u043D\u0438\u0438", align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443", align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", align_texttop:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430", align_textbottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430", align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", image_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439" });plugins/advimage/langs/en_dlg.js000066600000002366150472426320012714 0ustar00tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image List","align_right":"Right","align_left":"Left","align_textbottom":"Text Bottom","align_texttop":"Text Top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal Space",vspace:"Vertical Space",dimensions:"Dimensions",border:"Border",list:"Image List",alt:"Image Description",src:"Image URL","dialog_title":"Insert/Edit 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.","example_img":"Appearance Preview Image",misc:"Miscellaneous",mouseout:"For Mouse Out",mouseover:"For Mouse Over","alt_image":"Alternative Image","swap_image":"Swap Image",map:"Image Map",id:"ID",rtl:"Right to Left",ltr:"Left to Right",classes:"Classes",style:"Style","long_desc":"Long Description Link",langcode:"Language Code",langdir:"Language Direction","constrain_proportions":"Constrain Proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General",width:"Width",height:"Height"});plugins/advimage/editor_plugin_src.js000066600000002476150472426320014075 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.AdvancedImagePlugin', { init : function(ed, url) { // Register commands ed.addCommand('mceAdvImage', function() { // Internal image object like a flash placeholder if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1) return; ed.windowManager.open({ file : url + '/image.htm', width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)), height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)), inline : 1 }, { plugin_url : url }); }); // Register buttons ed.addButton('image', { title : 'advimage.image_desc', cmd : 'mceAdvImage' }); }, getInfo : function() { return { longname : 'Advanced image', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin); })();plugins/advimage/img/sample.gif000066600000003130150472426320012534 0ustar00GIF89a--~~~}}}|||zzzxxxwwxvvvtttrrrpppmmmiiieeebbbYYY!,--%JPJS2GPINC6#>[b[cHU[V]O;"HVLLNQH8#ń00,,8QL88;;GC7ԃYYSS;LPQQa aXhl8TYC~!Doٸ9,A<9(Sx% 5b¸QǐfXb,mXb 'X(Ղ 5 qƣE X]E(3,C49"<.eIێ">n wUI($ܹ=a#I4Ӕ5bM $@0kZK4aÚ 'D~1AA IDɐ@} 5Ք-"d Gn"umaÅ τiG^JZGk'[H#CGȚ2OiFΓ DxjPA` .U-0Ca G=hцmE$AC.x u$}EșkD TIo7(euV` /`bqƓOv!DO(rQB 1pQcdhaQ!vqp *B !leFiDn1,қ]TQ #| a&qahd[ vE8qKn/``o葇hU(3r, nP@w1dGdtawɱVAa8 c7ЀEjX!BA ]LL!e e!-hG@ t O &А%0DLцdyqF#İOȀ@+@f&frjD TW]&f`S[m@lp}YaAg@o.ׁ uvA1mRMuBK=4Qsj>Pቛm@Nxp,<r '̗G@z"H'/PDh\7 ?X<vXa0 n1T8{C&&C6ATA lpCB9xȃddIP gH'`! /Bo02a| f0 HL@a P:d 2".P³2qI;plugins/spellchecker/css/content.css000066600000000141150472426320013652 0ustar00.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;} plugins/spellchecker/editor_plugin.js000066600000015334150472426320014112 0ustar00(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(g.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(g.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(g.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(f,'$1$2')}g.replace(q,t)}});i.setRng(d)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();plugins/spellchecker/editor_plugin_src.js000066600000026522150472426320014762 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM; tinymce.create('tinymce.plugins.SpellcheckerPlugin', { getInfo : function() { return { longname : 'Spellchecker', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, init : function(ed, url) { var t = this, cm; t.url = url; t.editor = ed; t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}"); if (t.rpcUrl == '{backend}') { // Sniff if the browser supports native spellchecking (Don't know of a better way) if (tinymce.isIE) return; t.hasSupport = true; // Disable the context menu when spellchecking is active ed.onContextMenu.addToTop(function(ed, e) { if (t.active) return false; }); } // Register commands ed.addCommand('mceSpellCheck', function() { if (t.rpcUrl == '{backend}') { // Enable/disable native spellchecker t.editor.getBody().spellcheck = t.active = !t.active; return; } if (!t.active) { ed.setProgressState(1); t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) { if (r.length > 0) { t.active = 1; t._markWords(r); ed.setProgressState(0); ed.nodeChanged(); } else { ed.setProgressState(0); if (ed.getParam('spellchecker_report_no_misspellings', true)) ed.windowManager.alert('spellchecker.no_mpell'); } }); } else t._done(); }); if (ed.settings.content_css !== false) ed.contentCSS.push(url + '/css/content.css'); ed.onClick.add(t._showMenu, t); ed.onContextMenu.add(t._showMenu, t); ed.onBeforeGetContent.add(function() { if (t.active) t._removeWords(); }); ed.onNodeChange.add(function(ed, cm) { cm.setActive('spellchecker', t.active); }); ed.onSetContent.add(function() { t._done(); }); ed.onBeforeGetContent.add(function() { t._done(); }); ed.onBeforeExecCommand.add(function(ed, cmd) { if (cmd == 'mceFullScreen') t._done(); }); // Find selected language t.languages = {}; each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) { if (k.indexOf('+') === 0) { k = k.substring(1); t.selectedLang = v; } t.languages[k] = v; }); }, createControl : function(n, cm) { var t = this, c, ed = t.editor; if (n == 'spellchecker') { // Use basic button if we use the native spellchecker if (t.rpcUrl == '{backend}') { // Create simple toggle button if we have native support if (t.hasSupport) c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); return c; } c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t}); c.onRenderMenu.add(function(c, m) { m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1); each(t.languages, function(v, k) { var o = {icon : 1}, mi; o.onclick = function() { if (v == t.selectedLang) { return; } mi.setSelected(1); t.selectedItem.setSelected(0); t.selectedItem = mi; t.selectedLang = v; }; o.title = k; mi = m.add(o); mi.setSelected(v == t.selectedLang); if (v == t.selectedLang) t.selectedItem = mi; }) }); return c; } }, // Internal functions _walk : function(n, f) { var d = this.editor.getDoc(), w; if (d.createTreeWalker) { w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); while ((n = w.nextNode()) != null) f.call(this, n); } else tinymce.walk(n, f, 'childNodes'); }, _getSeparators : function() { var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}\u201d\u201c'); // Build word separator regexp for (i=0; i elements content is broken after spellchecking. // Bug #1408: Preceding whitespace characters are removed // @TODO: I'm not sure that both are still issues on IE9. if (tinymce.isIE) { // Enclose mispelled words with temporal tag v = v.replace(rx, '$1$2'); // Loop over the content finding mispelled words while ((pos = v.indexOf('')) != -1) { // Add text node for the content before the word txt = v.substring(0, pos); if (txt.length) { node = doc.createTextNode(dom.decode(txt)); elem.appendChild(node); } v = v.substring(pos+10); pos = v.indexOf(''); txt = v.substring(0, pos); v = v.substring(pos+11); // Add span element for the word elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt)); } // Add text node for the rest of the content if (v.length) { node = doc.createTextNode(dom.decode(v)); elem.appendChild(node); } } else { // Other browsers preserve whitespace characters on innerHTML usage elem.innerHTML = v.replace(rx, '$1$2'); } // Finally, replace the node with the container dom.replace(elem, n); } }); se.setRng(r); }, _showMenu : function(ed, e) { var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target; e = 0; // Fixes IE memory leak if (!m) { m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'}); t._menu = m; } if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) { m.removeAll(); m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1); t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) { var ignoreRpc; m.removeAll(); if (r.length > 0) { m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); each(r, function(v) { m.add({title : v, onclick : function() { dom.replace(ed.getDoc().createTextNode(v), wordSpan); t._checkDone(); }}); }); m.addSeparator(); } else m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1); if (ed.getParam('show_ignore_words', true)) { ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", ''); m.add({ title : 'spellchecker.ignore_word', onclick : function() { var word = wordSpan.innerHTML; dom.remove(wordSpan, 1); t._checkDone(); // tell the server if we need to if (ignoreRpc) { ed.setProgressState(1); t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) { ed.setProgressState(0); }); } } }); m.add({ title : 'spellchecker.ignore_words', onclick : function() { var word = wordSpan.innerHTML; t._removeWords(dom.decode(word)); t._checkDone(); // tell the server if we need to if (ignoreRpc) { ed.setProgressState(1); t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) { ed.setProgressState(0); }); } } }); } if (t.editor.getParam("spellchecker_enable_learn_rpc")) { m.add({ title : 'spellchecker.learn_word', onclick : function() { var word = wordSpan.innerHTML; dom.remove(wordSpan, 1); t._checkDone(); ed.setProgressState(1); t._sendRPC('learnWord', [t.selectedLang, word], function(r) { ed.setProgressState(0); }); } }); } m.update(); }); p1 = DOM.getPos(ed.getContentAreaContainer()); m.settings.offset_x = p1.x; m.settings.offset_y = p1.y; ed.selection.select(wordSpan); p1 = dom.getPos(wordSpan); m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y); return tinymce.dom.Event.cancel(e); } else m.hideMenu(); }, _checkDone : function() { var t = this, ed = t.editor, dom = ed.dom, o; each(dom.select('span'), function(n) { if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) { o = true; return false; } }); if (!o) t._done(); }, _done : function() { var t = this, la = t.active; if (t.active) { t.active = 0; t._removeWords(); if (t._menu) t._menu.hideMenu(); if (la) t.editor.nodeChanged(); } }, _sendRPC : function(m, p, cb) { var t = this; JSONRequest.sendRPC({ url : t.rpcUrl, method : m, params : p, success : cb, error : function(e, x) { t.editor.setProgressState(0); t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText)); } }); } }); // Register plugin tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin); })(); plugins/spellchecker/img/wline.gif000066600000000056150472426320013264 0ustar00GIF89a**!,Df;plugins/lists/editor_plugin.js000066600000033666150472426320012614 0ustar00(function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{return v&&u.tagName==="P"&&t.tagName==="P"}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(y){var v="TABBING";var s="EMPTY";var J="ESCAPE";var z="PARAGRAPH";var N="UNKNOWN";var x=N;function E(U){return U.keyCode===tinymce.VK.TAB&&!(U.altKey||U.ctrlKey)&&(y.queryCommandState("InsertUnorderedList")||y.queryCommandState("InsertOrderedList"))}function w(){var U=B();var W=U.parentNode.parentNode;var V=U.parentNode.lastChild===U;return V&&!t(W)&&P(U)}function t(U){if(n(U)){return U.parentNode&&U.parentNode.tagName==="LI"}else{return U.tagName==="LI"}}function F(){return y.selection.isCollapsed()&&P(B())}function B(){var U=y.selection.getStart();return((U.tagName=="BR"||U.tagName=="")&&U.parentNode.tagName=="LI")?U.parentNode:U}function P(U){var V=U.childNodes.length;if(U.tagName==="LI"){return V==0?true:V==1&&(U.firstChild.tagName==""||U.firstChild.tagName=="BR"||H(U))}return false}function H(U){var V=tinymce.grep(U.parentNode.childNodes,function(Y){return Y.tagName=="LI"});var W=U==V[V.length-1];var X=U.firstChild;return tinymce.isIE9&&W&&(X.nodeValue==String.fromCharCode(160)||X.nodeValue==String.fromCharCode(32))}function T(U){return U.keyCode===tinymce.VK.ENTER}function A(U){return T(U)&&!U.shiftKey}function M(U){if(E(U)){return v}else{if(A(U)&&w()){return N}else{if(A(U)&&F()){return s}else{return N}}}}function D(U,V){if(x==v||x==s||tinymce.isGecko&&x==J){r.cancel(V)}}function C(){var U=y.selection.getRng(true);var V=U.startContainer;if(V.nodeType==3){var W=V.nodeValue;if(tinymce.isIE9&&W.length>1&&W.charCodeAt(W.length-1)==32){return(U.endOffset==W.length-1)}else{return(U.endOffset==W.length)}}else{if(V.nodeType==1){return U.endOffset==V.childNodes.length}}return false}function I(){var W=y.selection.getNode();var V="h1,h2,h3,h4,h5,h6,p,div";var U=y.dom.is(W,V)&&W.parentNode.tagName==="LI"&&W.parentNode.lastChild===W;return y.selection.isCollapsed()&&U&&C()}function K(W,Y){if(A(Y)&&I()){var X=W.selection.getNode();var V=W.dom.create("li");var U=W.dom.getParent(X,"li");W.dom.insertAfter(V,U);if(tinymce.isIE6||tinymce.isIE7||tinyMCE.isIE8){W.selection.setCursorLocation(V,1)}else{W.selection.setCursorLocation(V,0)}Y.preventDefault()}}function u(X,Z){var ac;if(!tinymce.isGecko){return}var V=X.selection.getStart();if(Z.keyCode!=tinymce.VK.BACKSPACE||V.tagName!=="IMG"){return}function W(ag){var ah=ag.firstChild;var af=null;do{if(!ah){break}if(ah.tagName==="LI"){af=ah}}while(ah=ah.nextSibling);return af}function ae(ag,af){while(ag.childNodes.length>0){af.appendChild(ag.childNodes[0])}}ac=V.parentNode.previousSibling;if(!ac){return}var aa;if(ac.tagName==="UL"||ac.tagName==="OL"){aa=ac}else{if(ac.previousSibling&&(ac.previousSibling.tagName==="UL"||ac.previousSibling.tagName==="OL")){aa=ac.previousSibling}else{return}}var ad=W(aa);var U=X.dom.createRng();U.setStart(ad,1);U.setEnd(ad,1);X.selection.setRng(U);X.selection.collapse(true);var Y=X.selection.getBookmark();var ab=V.parentNode.cloneNode(true);if(ab.tagName==="P"||ab.tagName==="DIV"){ae(ab,ad)}else{ad.appendChild(ab)}V.parentNode.parentNode.removeChild(V.parentNode);X.selection.moveToBookmark(Y)}function G(U){var V=y.dom.getParent(U,"ol,ul");if(V!=null){var W=V.lastChild;y.selection.setCursorLocation(W,0)}}this.ed=y;y.addCommand("Indent",this.indent,this);y.addCommand("Outdent",this.outdent,this);y.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);y.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);y.onInit.add(function(){y.editorCommands.addCommands({outdent:function(){var V=y.selection,W=y.dom;function U(X){X=W.getParent(X,W.isBlock);return X&&(parseInt(y.dom.getStyle(X,"margin-left")||0,10)+parseInt(y.dom.getStyle(X,"padding-left")||0,10))>0}return U(V.getStart())||U(V.getEnd())||y.queryCommandState("InsertOrderedList")||y.queryCommandState("InsertUnorderedList")}},"state")});y.onKeyUp.add(function(V,W){if(x==v){V.execCommand(W.shiftKey?"Outdent":"Indent",true,null);x=N;return r.cancel(W)}else{if(x==s){var U=B();var Y=V.settings.list_outdent_on_enter===true||W.shiftKey;V.execCommand(Y?"Outdent":"Indent",true,null);if(tinymce.isIE){G(U)}return r.cancel(W)}else{if(x==J){if(tinymce.isIE6||tinymce.isIE7||tinymce.isIE8){var X=V.getDoc().createTextNode("\uFEFF");V.selection.getNode().appendChild(X)}else{if(tinymce.isIE9||tinymce.isGecko){V.execCommand("Outdent");return r.cancel(W)}}}}}});function L(V,U){var W=y.getDoc().createTextNode("\uFEFF");V.insertBefore(W,U);y.selection.setCursorLocation(W,0);y.execCommand("mceRepaint")}function R(V,X){if(T(X)){var U=B();if(U){var W=U.parentNode;var Y=W&&W.parentNode;if(Y&&Y.nodeName=="LI"&&Y.firstChild==W&&U==W.firstChild){L(Y,W)}}}}function S(V,X){if(T(X)){var U=B();if(V.dom.select("ul li",U).length===1){var W=U.firstChild;L(U,W)}}}function Q(V,Z){function W(ad,aa){var ac=[];var ae=new tinymce.dom.TreeWalker(aa,ad);for(var ab=ae.current();ab;ab=ae.next()){if(V.dom.is(ab,"ol,ul,li")){ac.push(ab)}}return ac}if(Z.keyCode==tinymce.VK.BACKSPACE){var U=B();if(U){var Y=V.dom.getParent(U,"ol,ul");if(Y&&Y.firstChild===U){var X=W(Y,U);V.execCommand("Outdent",false,X);V.undoManager.add();return r.cancel(Z)}}}}function O(V,X){var U=B();if(X.keyCode===tinymce.VK.BACKSPACE&&V.dom.is(U,"li")&&U.parentNode.firstChild!==U){if(V.dom.select("ul,ol",U).length===1){var Z=U.previousSibling;V.dom.remove(V.dom.select("br",U));V.dom.remove(U,true);var W=tinymce.grep(Z.childNodes,function(aa){return aa.nodeType===3});if(W.length===1){var Y=W[0];V.selection.setCursorLocation(Y,Y.length)}V.undoManager.add();return r.cancel(X)}}}y.onKeyDown.add(function(U,V){x=M(V)});y.onKeyDown.add(D);y.onKeyDown.add(u);y.onKeyDown.add(K);if(tinymce.isGecko){y.onKeyUp.add(R)}if(tinymce.isIE8){y.onKeyUp.add(S)}if(tinymce.isGecko||tinymce.isWebKit){y.onKeyDown.add(Q)}if(tinymce.isWebKit){y.onKeyDown.add(O)}},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(t){if(t.tagName==="LI"&&(M.tagName==="P"||G.length>1)){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true)}return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(P,L,N){var t,O=P,M;while(!I.isBlock(P.parentNode)&&P.parentNode!==I.getRoot()){P=I.split(P.parentNode,P.previousSibling);P=P.nextSibling;O=P}if(N){t=N.cloneNode(true);P.parentNode.insertBefore(t,P);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");P.parentNode.insertBefore(t,P)}while(O&&O!=L){M=O.nextSibling;t.appendChild(O);O=M}if(t.childNodes.length===0){t.innerHTML='
        '}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(U){if(U.hasAttribute&&U.hasAttribute("_mce_bogus")){return true}if(P(N,U)){I.addClass(U,"_mce_tagged_br");N=S(U)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w&&!H||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D,elements:this.selectedBlocks()}}else{B={defaultAction:x,elements:this.selectedBlocks()}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true),elements:this.selectedBlocks()})},outdent:function(y,x){var w=this,u=w.ed,z=u.dom,s=[];function A(t){var C,B,D;if(!d(u,t,s)){if(z.getStyle(t,"margin-left")!==""||z.getStyle(t,"padding-left")!==""){return w.adjustPaddingFunction(false)(t)}D=z.getStyle(t,"text-align",true);if(D==="center"||D==="right"){z.setStyle(t,"text-align","left");return}t=c(t,z);C=t.parentNode;B=t.parentNode.parentNode;if(B.tagName==="P"){z.split(B,t.parentNode)}else{z.split(C,t);if(B.tagName==="LI"){z.split(B,t)}else{if(!z.is(B,"ol,ul")){z.rename(t,"p")}}}s.push(t)}}var v=x&&tinymce.is(x,"array")?x:this.selectedBlocks();this.process({LI:A,defaultAction:this.adjustPaddingFunction(false),elements:v});e(s,m)},process:function(y){var F=this,w=F.ed.selection,z=F.ed.dom,E,u;function B(t){var s=tinymce.grep(t.childNodes,function(H){return !(H.nodeName==="BR"||H.nodeName==="SPAN"&&z.getAttrib(H,"data-mce-type")=="bookmark"||H.nodeType==3&&(H.nodeValue==String.fromCharCode(160)||H.nodeValue==""))});return s.length===0}function x(s){z.removeClass(s,"_mce_act_on");if(!s||s.nodeType!==1||E.length>1&&B(s)){return}s=k(s,z);var t=y[s.tagName];if(!t){t=y.defaultAction}t(s)}function v(s){F.splitSafeEach(s.childNodes,x)}function C(s,t){return t>=0&&s.hasChildNodes()&&t0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},selectedBlocks:function(){var s=this.ed;var t=s.selection.getSelectedBlocks();return t.length==0?[s.dom.getRoot()]:t},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());plugins/lists/editor_plugin_src.js000066600000075223150472426320013456 0ustar00/** * editor_plugin_src.js * * Copyright 2011, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var each = tinymce.each, Event = tinymce.dom.Event, bookmark; // Skips text nodes that only contain whitespace since they aren't semantically important. function skipWhitespaceNodes(e, next) { while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) { e = next(e); } return e; } function skipWhitespaceNodesBackwards(e) { return skipWhitespaceNodes(e, function(e) { return e.previousSibling; }); } function skipWhitespaceNodesForwards(e) { return skipWhitespaceNodes(e, function(e) { return e.nextSibling; }); } function hasParentInList(ed, e, list) { return ed.dom.getParent(e, function(p) { return tinymce.inArray(list, p) !== -1; }); } function isList(e) { return e && (e.tagName === 'OL' || e.tagName === 'UL'); } function splitNestedLists(element, dom) { var tmp, nested, wrapItem; tmp = skipWhitespaceNodesBackwards(element.lastChild); while (isList(tmp)) { nested = tmp; tmp = skipWhitespaceNodesBackwards(nested.previousSibling); } if (nested) { wrapItem = dom.create('li', { style: 'list-style-type: none;'}); dom.split(element, nested); dom.insertAfter(wrapItem, nested); wrapItem.appendChild(nested); wrapItem.appendChild(nested); element = wrapItem.previousSibling; } return element; } function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) { e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs); return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs); } function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) { var prev = skipWhitespaceNodesBackwards(e.previousSibling); if (prev) { return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs); } else { return e; } } function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) { var next = skipWhitespaceNodesForwards(e.nextSibling); if (next) { return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs); } else { return e; } } function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) { if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) { return merge(e1, e2, differentStylesMasterElement); } else if (e1 && e1.tagName === 'LI' && isList(e2)) { // Fix invalidly nested lists. e1.appendChild(e2); } return e2; } function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) { if (!e1 || !e2) { return false; } else if (e1.tagName === 'LI' && e2.tagName === 'LI') { return e2.style.listStyleType === 'none' || containsOnlyAList(e2); } else if (isList(e1)) { return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2); } else return mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P'; } function isListForIndent(e) { var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild); return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI)); } function containsOnlyAList(e) { var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild); return firstChild && lastChild && firstChild === lastChild && isList(firstChild); } function merge(e1, e2, masterElement) { var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild); if (e1.tagName === 'P') { e1.appendChild(e1.ownerDocument.createElement('br')); } while (e2.firstChild) { e1.appendChild(e2.firstChild); } if (masterElement) { e1.style.listStyleType = masterElement.style.listStyleType; } e2.parentNode.removeChild(e2); attemptMerge(lastOriginal, firstNew, false); return e1; } function findItemToOperateOn(e, dom) { var item; if (!dom.is(e, 'li,ol,ul')) { item = dom.getParent(e, 'li'); if (item) { e = item; } } return e; } tinymce.create('tinymce.plugins.Lists', { init: function(ed) { var LIST_TABBING = 'TABBING'; var LIST_EMPTY_ITEM = 'EMPTY'; var LIST_ESCAPE = 'ESCAPE'; var LIST_PARAGRAPH = 'PARAGRAPH'; var LIST_UNKNOWN = 'UNKNOWN'; var state = LIST_UNKNOWN; function isTabInList(e) { // Don't indent on Ctrl+Tab or Alt+Tab return e.keyCode === tinymce.VK.TAB && !(e.altKey || e.ctrlKey) && (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList')); } function isOnLastListItem() { var li = getLi(); var grandParent = li.parentNode.parentNode; var isLastItem = li.parentNode.lastChild === li; return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li); } function isNestedList(grandParent) { if (isList(grandParent)) { return grandParent.parentNode && grandParent.parentNode.tagName === 'LI'; } else { return grandParent.tagName === 'LI'; } } function isInEmptyListItem() { return ed.selection.isCollapsed() && isEmptyListItem(getLi()); } function getLi() { var n = ed.selection.getStart(); // Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n; } function isEmptyListItem(li) { var numChildren = li.childNodes.length; if (li.tagName === 'LI') { return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || li.firstChild.tagName == 'BR' || isEmptyIE9Li(li)); } return false; } function isEmptyIE9Li(li) { // only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.tagName == 'LI'}); var isLastLi = li == lis[lis.length - 1]; var child = li.firstChild; return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32)); } function isEnter(e) { return e.keyCode === tinymce.VK.ENTER; } function isEnterWithoutShift(e) { return isEnter(e) && !e.shiftKey; } function getListKeyState(e) { if (isTabInList(e)) { return LIST_TABBING; } else if (isEnterWithoutShift(e) && isOnLastListItem()) { // Returns LIST_UNKNOWN since breaking out of lists is handled by the EnterKey.js logic now //return LIST_ESCAPE; return LIST_UNKNOWN; } else if (isEnterWithoutShift(e) && isInEmptyListItem()) { return LIST_EMPTY_ITEM; } else { return LIST_UNKNOWN; } } function cancelDefaultEvents(ed, e) { // list escape is done manually using outdent as it does not create paragraphs correctly in td's if (state == LIST_TABBING || state == LIST_EMPTY_ITEM || tinymce.isGecko && state == LIST_ESCAPE) { Event.cancel(e); } } function isCursorAtEndOfContainer() { var range = ed.selection.getRng(true); var startContainer = range.startContainer; if (startContainer.nodeType == 3) { var value = startContainer.nodeValue; if (tinymce.isIE9 && value.length > 1 && value.charCodeAt(value.length-1) == 32) { // IE9 places a space on the end of the text in some cases so ignore last char return (range.endOffset == value.length-1); } else { return (range.endOffset == value.length); } } else if (startContainer.nodeType == 1) { return range.endOffset == startContainer.childNodes.length; } return false; } /* If we are at the end of a list item surrounded with an element, pressing enter should create a new list item instead without splitting the element e.g. don't want to create new P or H1 tag */ function isEndOfListItem() { var node = ed.selection.getNode(); var validElements = 'h1,h2,h3,h4,h5,h6,p,div'; var isLastParagraphOfLi = ed.dom.is(node, validElements) && node.parentNode.tagName === 'LI' && node.parentNode.lastChild === node; return ed.selection.isCollapsed() && isLastParagraphOfLi && isCursorAtEndOfContainer(); } // Creates a new list item after the current selection's list item parent function createNewLi(ed, e) { if (isEnterWithoutShift(e) && isEndOfListItem()) { var node = ed.selection.getNode(); var li = ed.dom.create("li"); var parentLi = ed.dom.getParent(node, 'li'); ed.dom.insertAfter(li, parentLi); // Move caret to new list element. if (tinymce.isIE6 || tinymce.isIE7 || tinyMCE.isIE8) { // Removed this line since it would create an odd < > tag and placing the caret inside an empty LI is handled and should be handled by the selection logic //li.appendChild(ed.dom.create(" ")); // IE needs an element within the bullet point ed.selection.setCursorLocation(li, 1); } else { ed.selection.setCursorLocation(li, 0); } e.preventDefault(); } } function imageJoiningListItem(ed, e) { var prevSibling; if (!tinymce.isGecko) return; var n = ed.selection.getStart(); if (e.keyCode != tinymce.VK.BACKSPACE || n.tagName !== 'IMG') return; function lastLI(node) { var child = node.firstChild; var li = null; do { if (!child) break; if (child.tagName === 'LI') li = child; } while (child = child.nextSibling); return li; } function addChildren(parentNode, destination) { while (parentNode.childNodes.length > 0) destination.appendChild(parentNode.childNodes[0]); } // Check if there is a previous sibling prevSibling = n.parentNode.previousSibling; if (!prevSibling) return; var ul; if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL') ul = prevSibling; else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL')) ul = prevSibling.previousSibling; else return; var li = lastLI(ul); // move the caret to the end of the list item var rng = ed.dom.createRng(); rng.setStart(li, 1); rng.setEnd(li, 1); ed.selection.setRng(rng); ed.selection.collapse(true); // save a bookmark at the end of the list item var bookmark = ed.selection.getBookmark(); // copy the image an its text to the list item var clone = n.parentNode.cloneNode(true); if (clone.tagName === 'P' || clone.tagName === 'DIV') addChildren(clone, li); else li.appendChild(clone); // remove the old copy of the image n.parentNode.parentNode.removeChild(n.parentNode); // move the caret where we saved the bookmark ed.selection.moveToBookmark(bookmark); } // fix the cursor position to ensure it is correct in IE function setCursorPositionToOriginalLi(li) { var list = ed.dom.getParent(li, 'ol,ul'); if (list != null) { var lastLi = list.lastChild; // Removed this line since IE9 would report an DOM character error and placing the caret inside an empty LI is handled and should be handled by the selection logic //lastLi.appendChild(ed.getDoc().createElement('')); ed.selection.setCursorLocation(lastLi, 0); } } this.ed = ed; ed.addCommand('Indent', this.indent, this); ed.addCommand('Outdent', this.outdent, this); ed.addCommand('InsertUnorderedList', function() { this.applyList('UL', 'OL'); }, this); ed.addCommand('InsertOrderedList', function() { this.applyList('OL', 'UL'); }, this); ed.onInit.add(function() { ed.editorCommands.addCommands({ 'outdent': function() { var sel = ed.selection, dom = ed.dom; function hasStyleIndent(n) { n = dom.getParent(n, dom.isBlock); return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0; } return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList'); } }, 'state'); }); ed.onKeyUp.add(function(ed, e) { if (state == LIST_TABBING) { ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null); state = LIST_UNKNOWN; return Event.cancel(e); } else if (state == LIST_EMPTY_ITEM) { var li = getLi(); var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey; ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null); if (tinymce.isIE) { setCursorPositionToOriginalLi(li); } return Event.cancel(e); } else if (state == LIST_ESCAPE) { if (tinymce.isIE6 || tinymce.isIE7 || tinymce.isIE8) { // append a zero sized nbsp so that caret is positioned correctly in IE after escaping and applying formatting. // if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after // escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag. var n = ed.getDoc().createTextNode('\uFEFF'); ed.selection.getNode().appendChild(n); } else if (tinymce.isIE9 || tinymce.isGecko) { // IE9 does not escape the list so we use outdent to do this and cancel the default behaviour // Gecko does not create a paragraph outdenting inside a TD so default behaviour is cancelled and we outdent ourselves ed.execCommand('Outdent'); return Event.cancel(e); } } }); function fixListItem(parent, reference) { // a zero-sized non-breaking space is placed in the empty list item so that the nested list is // displayed on the below line instead of next to it var n = ed.getDoc().createTextNode('\uFEFF'); parent.insertBefore(n, reference); ed.selection.setCursorLocation(n, 0); // repaint to remove rendering artifact. only visible when creating new list ed.execCommand('mceRepaint'); } function fixIndentedListItemForGecko(ed, e) { if (isEnter(e)) { var li = getLi(); if (li) { var parent = li.parentNode; var grandParent = parent && parent.parentNode; if (grandParent && grandParent.nodeName == 'LI' && grandParent.firstChild == parent && li == parent.firstChild) { fixListItem(grandParent, parent); } } } } function fixIndentedListItemForIE8(ed, e) { if (isEnter(e)) { var li = getLi(); if (ed.dom.select('ul li', li).length === 1) { var list = li.firstChild; fixListItem(li, list); } } } function fixDeletingFirstCharOfList(ed, e) { function listElements(list, li) { var elements = []; var walker = new tinymce.dom.TreeWalker(li, list); for (var node = walker.current(); node; node = walker.next()) { if (ed.dom.is(node, 'ol,ul,li')) { elements.push(node); } } return elements; } if (e.keyCode == tinymce.VK.BACKSPACE) { var li = getLi(); if (li) { var list = ed.dom.getParent(li, 'ol,ul'); if (list && list.firstChild === li) { var elements = listElements(list, li); ed.execCommand("Outdent", false, elements); ed.undoManager.add(); return Event.cancel(e); } } } } function fixDeletingEmptyLiInWebkit(ed, e) { var li = getLi(); if (e.keyCode === tinymce.VK.BACKSPACE && ed.dom.is(li, 'li') && li.parentNode.firstChild!==li) { if (ed.dom.select('ul,ol', li).length === 1) { var prevLi = li.previousSibling; ed.dom.remove(ed.dom.select('br', li)); ed.dom.remove(li, true); var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 }); if (textNodes.length === 1) { var textNode = textNodes[0] ed.selection.setCursorLocation(textNode, textNode.length); } ed.undoManager.add(); return Event.cancel(e); } } } ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); }); ed.onKeyDown.add(cancelDefaultEvents); ed.onKeyDown.add(imageJoiningListItem); ed.onKeyDown.add(createNewLi); if (tinymce.isGecko) { ed.onKeyUp.add(fixIndentedListItemForGecko); } if (tinymce.isIE8) { ed.onKeyUp.add(fixIndentedListItemForIE8); } if (tinymce.isGecko || tinymce.isWebKit) { ed.onKeyDown.add(fixDeletingFirstCharOfList); } if (tinymce.isWebKit) { ed.onKeyDown.add(fixDeletingEmptyLiInWebkit); } }, applyList: function(targetListType, oppositeListType) { var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions, selectedBlocks = ed.selection.getSelectedBlocks(); function cleanupBr(e) { if (e && e.tagName === 'BR') { dom.remove(e); } } function makeList(element) { var list = dom.create(targetListType), li; function adjustIndentForNewList(element) { // If there's a margin-left, outdent one level to account for the extra list margin. if (element.style.marginLeft || element.style.paddingLeft) { t.adjustPaddingFunction(false)(element); } } if (element.tagName === 'LI') { // No change required. } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') { processBrs(element, function(startSection, br) { doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode); li = startSection.parentNode; adjustIndentForNewList(li); cleanupBr(br); }); if (li) { if (li.tagName === 'LI' && (element.tagName === 'P' || selectedBlocks.length > 1)) { dom.split(li.parentNode.parentNode, li.parentNode); } attemptMergeWithAdjacent(li.parentNode, true); } return; } else { // Put the list around the element. li = dom.create('li'); dom.insertAfter(li, element); li.appendChild(element); adjustIndentForNewList(element); element = li; } dom.insertAfter(list, element); list.appendChild(element); attemptMergeWithAdjacent(list, true); applied.push(element); } function doWrapList(start, end, template) { var li, n = start, tmp; while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) { start = dom.split(start.parentNode, start.previousSibling); start = start.nextSibling; n = start; } if (template) { li = template.cloneNode(true); start.parentNode.insertBefore(li, start); while (li.firstChild) dom.remove(li.firstChild); li = dom.rename(li, 'li'); } else { li = dom.create('li'); start.parentNode.insertBefore(li, start); } while (n && n != end) { tmp = n.nextSibling; li.appendChild(n); n = tmp; } if (li.childNodes.length === 0) { li.innerHTML = '
        '; } makeList(li); } function processBrs(element, callback) { var startSection, previousBR, END_TO_START = 3, START_TO_END = 1, breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl'; function isAnyPartSelected(start, end) { var r = dom.createRng(), sel; bookmark.keep = true; ed.selection.moveToBookmark(bookmark); bookmark.keep = false; sel = ed.selection.getRng(true); if (!end) { end = start.parentNode.lastChild; } r.setStartBefore(start); r.setEndAfter(end); return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0); } function nextLeaf(br) { if (br.nextSibling) return br.nextSibling; if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot()) return nextLeaf(br.parentNode); } // Split on BRs within the range and process those. startSection = element.firstChild; // First mark the BRs that have any part of the previous section selected. var trailingContentSelected = false; each(dom.select(breakElements, element), function(br) { if (br.hasAttribute && br.hasAttribute('_mce_bogus')) { return true; // Skip the bogus Brs that are put in to appease Firefox and Safari. } if (isAnyPartSelected(startSection, br)) { dom.addClass(br, '_mce_tagged_br'); startSection = nextLeaf(br); } }); trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined)); startSection = element.firstChild; each(dom.select(breakElements, element), function(br) { // Got a section from start to br. var tmp = nextLeaf(br); if (br.hasAttribute && br.hasAttribute('_mce_bogus')) { return true; // Skip the bogus Brs that are put in to appease Firefox and Safari. } if (dom.hasClass(br, '_mce_tagged_br')) { callback(startSection, br, previousBR); previousBR = null; } else { previousBR = br; } startSection = tmp; }); if (trailingContentSelected) { callback(startSection, undefined, previousBR); } } function wrapList(element) { processBrs(element, function(startSection, br, previousBR) { // Need to indent this part doWrapList(startSection, br); cleanupBr(br); cleanupBr(previousBR); }); } function changeList(element) { if (tinymce.inArray(applied, element) !== -1) { return; } if (element.parentNode.tagName === oppositeListType) { dom.split(element.parentNode, element); makeList(element); attemptMergeWithNext(element.parentNode, false); } applied.push(element); } function convertListItemToParagraph(element) { var child, nextChild, mergedElement, splitLast; if (tinymce.inArray(applied, element) !== -1) { return; } element = splitNestedLists(element, dom); while (dom.is(element.parentNode, 'ol,ul,li')) { dom.split(element.parentNode, element); } // Push the original element we have from the selection, not the renamed one. applied.push(element); element = dom.rename(element, 'p'); mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines); if (mergedElement === element) { // Now split out any block elements that can't be contained within a P. // Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each) child = element.firstChild; while (child) { if (dom.isBlock(child)) { child = dom.split(child.parentNode, child); splitLast = true; nextChild = child.nextSibling && child.nextSibling.firstChild; } else { nextChild = child.nextSibling; if (splitLast && child.tagName === 'BR') { dom.remove(child); } splitLast = false; } child = nextChild; } } } each(selectedBlocks, function(e) { e = findItemToOperateOn(e, dom); if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) { hasOppositeType = true; } else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) { hasSameType = true; } else { hasNonList = true; } }); if (hasNonList &&!hasSameType || hasOppositeType || selectedBlocks.length === 0) { actions = { 'LI': changeList, 'H1': makeList, 'H2': makeList, 'H3': makeList, 'H4': makeList, 'H5': makeList, 'H6': makeList, 'P': makeList, 'BODY': makeList, 'DIV': selectedBlocks.length > 1 ? makeList : wrapList, defaultAction: wrapList, elements: this.selectedBlocks() }; } else { actions = { defaultAction: convertListItemToParagraph, elements: this.selectedBlocks() }; } this.process(actions); }, indent: function() { var ed = this.ed, dom = ed.dom, indented = []; function createWrapItem(element) { var wrapItem = dom.create('li', { style: 'list-style-type: none;'}); dom.insertAfter(wrapItem, element); return wrapItem; } function createWrapList(element) { var wrapItem = createWrapItem(element), list = dom.getParent(element, 'ol,ul'), listType = list.tagName, listStyle = dom.getStyle(list, 'list-style-type'), attrs = {}, wrapList; if (listStyle !== '') { attrs.style = 'list-style-type: ' + listStyle + ';'; } wrapList = dom.create(listType, attrs); wrapItem.appendChild(wrapList); return wrapList; } function indentLI(element) { if (!hasParentInList(ed, element, indented)) { element = splitNestedLists(element, dom); var wrapList = createWrapList(element); wrapList.appendChild(element); attemptMergeWithAdjacent(wrapList.parentNode, false); attemptMergeWithAdjacent(wrapList, false); indented.push(element); } } this.process({ 'LI': indentLI, defaultAction: this.adjustPaddingFunction(true), elements: this.selectedBlocks() }); }, outdent: function(ui, elements) { var t = this, ed = t.ed, dom = ed.dom, outdented = []; function outdentLI(element) { var listElement, targetParent, align; if (!hasParentInList(ed, element, outdented)) { if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') { return t.adjustPaddingFunction(false)(element); } align = dom.getStyle(element, 'text-align', true); if (align === 'center' || align === 'right') { dom.setStyle(element, 'text-align', 'left'); return; } element = splitNestedLists(element, dom); listElement = element.parentNode; targetParent = element.parentNode.parentNode; if (targetParent.tagName === 'P') { dom.split(targetParent, element.parentNode); } else { dom.split(listElement, element); if (targetParent.tagName === 'LI') { // Nested list, need to split the LI and go back out to the OL/UL element. dom.split(targetParent, element); } else if (!dom.is(targetParent, 'ol,ul')) { dom.rename(element, 'p'); } } outdented.push(element); } } var listElements = elements && tinymce.is(elements, 'array') ? elements : this.selectedBlocks(); this.process({ 'LI': outdentLI, defaultAction: this.adjustPaddingFunction(false), elements: listElements }); each(outdented, attemptMergeWithAdjacent); }, process: function(actions) { var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r; function isEmptyElement(element) { var excludeBrsAndBookmarks = tinymce.grep(element.childNodes, function(n) { return !(n.nodeName === 'BR' || n.nodeName === 'SPAN' && dom.getAttrib(n, 'data-mce-type') == 'bookmark' || n.nodeType == 3 && (n.nodeValue == String.fromCharCode(160) || n.nodeValue == '')); }); return excludeBrsAndBookmarks.length === 0; } function processElement(element) { dom.removeClass(element, '_mce_act_on'); if (!element || element.nodeType !== 1 || selectedBlocks.length > 1 && isEmptyElement(element)) { return; } element = findItemToOperateOn(element, dom); var action = actions[element.tagName]; if (!action) { action = actions.defaultAction; } action(element); } function recurse(element) { t.splitSafeEach(element.childNodes, processElement); } function brAtEdgeOfSelection(container, offset) { return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length && container.childNodes[offset].tagName === 'BR'; } function isInTable() { var n = sel.getNode(); var p = dom.getParent(n, 'td'); return p !== null; } selectedBlocks = actions.elements; r = sel.getRng(true); if (!r.collapsed) { if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) { r.setEnd(r.endContainer, r.endOffset - 1); sel.setRng(r); } if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) { r.setStart(r.startContainer, r.startOffset + 1); sel.setRng(r); } } if (tinymce.isIE8) { // append a zero sized nbsp so that caret is restored correctly using bookmark var s = t.ed.selection.getNode(); if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) { var i = t.ed.getDoc().createTextNode('\uFEFF'); s.appendChild(i); } } bookmark = sel.getBookmark(); actions.OL = actions.UL = recurse; t.splitSafeEach(selectedBlocks, processElement); sel.moveToBookmark(bookmark); bookmark = null; // we avoid doing repaint in a table as this will move the caret out of the table in Firefox 3.6 if (!isInTable()) { // Avoids table or image handles being left behind in Firefox. t.ed.execCommand('mceRepaint'); } }, splitSafeEach: function(elements, f) { if (tinymce.isGecko && (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) || /Firefox\/3\.[0-4]/.test(navigator.userAgent))) { this.classBasedEach(elements, f); } else { each(elements, f); } }, classBasedEach: function(elements, f) { var dom = this.ed.dom, nodes, element; // Mark nodes each(elements, function(element) { dom.addClass(element, '_mce_act_on'); }); nodes = dom.select('._mce_act_on'); while (nodes.length > 0) { element = nodes.shift(); dom.removeClass(element, '_mce_act_on'); f(element); nodes = dom.select('._mce_act_on'); } }, adjustPaddingFunction: function(isIndent) { var indentAmount, indentUnits, ed = this.ed; indentAmount = ed.settings.indentation; indentUnits = /[a-z%]+/i.exec(indentAmount); indentAmount = parseInt(indentAmount, 10); return function(element) { var currentIndent, newIndentAmount; currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10); if (isIndent) { newIndentAmount = currentIndent + indentAmount; } else { newIndentAmount = currentIndent - indentAmount; } ed.dom.setStyle(element, 'padding-left', ''); ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : ''); }; }, selectedBlocks: function() { var ed = this.ed var selectedBlocks = ed.selection.getSelectedBlocks(); return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks; }, getInfo: function() { return { longname : 'Lists', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); tinymce.PluginManager.add("lists", tinymce.plugins.Lists); }()); plugins/autolink/editor_plugin.js000066600000004422150472426320013270 0ustar00(function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;a.onKeyDown.addToTop(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}});if(tinyMCE.isIE){return}a.onKeyPress.add(function(d,f){if(f.which==41){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng(true).cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f-2);a.setEnd(n,f-1);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}var m=a.toString();if(m.charAt(m.length-1)=="."){a.setEnd(n,c-1)}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}else{if(/@$/.test(h[1])&&!/^mailto:/.test(h[1])){h[1]="mailto:"+h[1]}}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("createlink",false,h[1]+h[2]);i.selection.moveToBookmark(k);i.nodeChanged();if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})();plugins/autolink/editor_plugin_src.js000066600000012116150472426320014136 0ustar00/** * editor_plugin_src.js * * Copyright 2011, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.AutolinkPlugin', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed, url) { var t = this; // Add a key down handler ed.onKeyDown.addToTop(function(ed, e) { if (e.keyCode == 13) return t.handleEnter(ed); }); // Internet Explorer has built-in automatic linking for most cases if (tinyMCE.isIE) return; ed.onKeyPress.add(function(ed, e) { if (e.which == 41) return t.handleEclipse(ed); }); // Add a key up handler ed.onKeyUp.add(function(ed, e) { if (e.keyCode == 32) return t.handleSpacebar(ed); }); }, handleEclipse : function(ed) { this.parseCurrentLine(ed, -1, '(', true); }, handleSpacebar : function(ed) { this.parseCurrentLine(ed, 0, '', true); }, handleEnter : function(ed) { this.parseCurrentLine(ed, -1, '', false); }, parseCurrentLine : function(ed, end_offset, delimiter, goback) { var r, end, start, endContainer, bookmark, text, matches, prev, len; // We need at least five characters to form a URL, // hence, at minimum, five characters from the beginning of the line. r = ed.selection.getRng(true).cloneRange(); if (r.startOffset < 5) { // During testing, the caret is placed inbetween two text nodes. // The previous text node contains the URL. prev = r.endContainer.previousSibling; if (prev == null) { if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null) return; prev = r.endContainer.firstChild.nextSibling; } len = prev.length; r.setStart(prev, len); r.setEnd(prev, len); if (r.endOffset < 5) return; end = r.endOffset; endContainer = prev; } else { endContainer = r.endContainer; // Get a text node if (endContainer.nodeType != 3 && endContainer.firstChild) { while (endContainer.nodeType != 3 && endContainer.firstChild) endContainer = endContainer.firstChild; r.setStart(endContainer, 0); r.setEnd(endContainer, endContainer.nodeValue.length); } if (r.endOffset == 1) end = 2; else end = r.endOffset - 1 - end_offset; } start = end; do { // Move the selection one character backwards. r.setStart(endContainer, end - 2); r.setEnd(endContainer, end - 1); end -= 1; // Loop until one of the following is found: a blank space,  , delimeter, (end-2) >= 0 } while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter); if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) { r.setStart(endContainer, end); r.setEnd(endContainer, start); end += 1; } else if (r.startOffset == 0) { r.setStart(endContainer, 0); r.setEnd(endContainer, start); } else { r.setStart(endContainer, end); r.setEnd(endContainer, start); } // Exclude last . from word like "www.site.com." var text = r.toString(); if (text.charAt(text.length - 1) == '.') { r.setEnd(endContainer, start - 1); } text = r.toString(); matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i); if (matches) { if (matches[1] == 'www.') { matches[1] = 'http://www.'; } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) { matches[1] = 'mailto:' + matches[1]; } bookmark = ed.selection.getBookmark(); ed.selection.setRng(r); tinyMCE.execCommand('createlink',false, matches[1] + matches[2]); ed.selection.moveToBookmark(bookmark); ed.nodeChanged(); // TODO: Determine if this is still needed. if (tinyMCE.isWebKit) { // move the caret to its original position ed.selection.collapse(false); var max = Math.min(endContainer.length, start + 1); r.setStart(endContainer, max); r.setEnd(endContainer, max); ed.selection.setRng(r); } } }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Autolink', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin); })(); plugins/table/table.htm000066600000021217150472426320011131 0ustar00 {#table_dlg.title}
        {#table_dlg.general_props}
        {#table_dlg.advanced_props}
         
         
         
        plugins/table/css/cell.css000066600000000275150472426320011552 0ustar00/* 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; }plugins/table/css/row.css000066600000000431150472426320011434 0ustar00/* 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; } plugins/table/css/table.css000066600000000235150472426320011716 0ustar00/* CSS file for table dialog in the table plugin */ .panel_wrapper div.current { height: 245px; } .advfield { width: 200px; } #class { width: 150px; } plugins/table/editor_plugin.js000066600000042406150472426320012535 0ustar00(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE){M.innerHTML='
        '}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(g[y][x]){G.addClass(g[y][x].elm,"mceSelected")}}}}}d.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:h,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}d.create("tinymce.plugins.TablePlugin",{init:function(g,h){var f,m,j=true;function l(p){var o=g.selection,n=g.dom.getParent(p||o.getNode(),"table");if(n){return new b(n,g.dom,o)}}function k(){g.getBody().style.webkitUserSelect="";if(j){g.dom.removeClass(g.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");j=false}}e([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(n){g.addButton(n[0],{title:n[1],cmd:n[2],ui:n[3]})});if(!d.isIE){g.onClick.add(function(n,o){o=o.target;if(o.nodeName==="TABLE"){n.selection.select(o);n.nodeChanged()}})}g.onPreProcess.add(function(o,p){var n,q,r,t=o.dom,s;n=t.select("table",p.node);q=n.length;while(q--){r=n[q];t.setAttrib(r,"data-mce-style","");if((s=t.getAttrib(r,"width"))){t.setStyle(r,"width",s);t.setAttrib(r,"width","")}if((s=t.getAttrib(r,"height"))){t.setStyle(r,"height",s);t.setAttrib(r,"height","")}}});g.onNodeChange.add(function(q,o,s){var r;s=q.selection.getStart();r=q.dom.getParent(s,"td,th,caption");o.setActive("table",s.nodeName==="TABLE"||!!r);if(r&&r.nodeName==="CAPTION"){r=0}o.setDisabled("delete_table",!r);o.setDisabled("delete_col",!r);o.setDisabled("delete_table",!r);o.setDisabled("delete_row",!r);o.setDisabled("col_after",!r);o.setDisabled("col_before",!r);o.setDisabled("row_after",!r);o.setDisabled("row_before",!r);o.setDisabled("row_props",!r);o.setDisabled("cell_props",!r);o.setDisabled("split_cells",!r);o.setDisabled("merge_cells",!r)});g.onInit.add(function(r){var p,t,q=r.dom,u;f=r.windowManager;r.onMouseDown.add(function(w,z){if(z.button!=2){k();t=q.getParent(z.target,"td,th");p=q.getParent(t,"table")}});q.bind(r.getDoc(),"mouseover",function(C){var A,z,B=C.target;if(t&&(u||B!=t)&&(B.nodeName=="TD"||B.nodeName=="TH")){z=q.getParent(B,"table");if(z==p){if(!u){u=l(z);u.setStartCell(t);r.getBody().style.webkitUserSelect="none"}u.setEndCell(B);j=true}A=r.selection.getSel();try{if(A.removeAllRanges){A.removeAllRanges()}else{A.empty()}}catch(w){}C.preventDefault()}});r.onMouseUp.add(function(F,G){var z,B=F.selection,H,I=B.getSel(),w,C,A,E;if(t){if(u){F.getBody().style.webkitUserSelect=""}function D(J,L){var K=new d.dom.TreeWalker(J,J);do{if(J.nodeType==3&&d.trim(J.nodeValue).length!=0){if(L){z.setStart(J,0)}else{z.setEnd(J,J.nodeValue.length)}return}if(J.nodeName=="BR"){if(L){z.setStartBefore(J)}else{z.setEndBefore(J)}return}}while(J=(L?K.next():K.prev()))}H=q.select("td.mceSelected,th.mceSelected");if(H.length>0){z=q.createRng();C=H[0];E=H[H.length-1];z.setStartBefore(C);z.setEndAfter(C);D(C,1);w=new d.dom.TreeWalker(C,q.getParent(H[0],"table"));do{if(C.nodeName=="TD"||C.nodeName=="TH"){if(!q.hasClass(C,"mceSelected")){break}A=C}}while(C=w.next());D(A);B.setRng(z)}F.nodeChanged();t=u=p=null}});r.onKeyUp.add(function(w,z){k()});r.onKeyDown.add(function(w,z){n(w)});r.onMouseDown.add(function(w,z){if(z.button!=2){n(w)}});function o(D,z,A,F){var B=3,G=D.dom.getParent(z.startContainer,"TABLE"),C,w,E;if(G){C=G.parentNode}w=z.startContainer.nodeType==B&&z.startOffset==0&&z.endOffset==0&&F&&(A.nodeName=="TR"||A==C);E=(A.nodeName=="TD"||A.nodeName=="TH")&&!F;return w||E}function n(A){if(!d.isWebKit){return}var z=A.selection.getRng();var C=A.selection.getNode();var B=A.dom.getParent(z.startContainer,"TD,TH");if(!o(A,z,C,B)){return}if(!B){B=C}var w=B.lastChild;while(w.lastChild){w=w.lastChild}z.setEnd(w,w.nodeValue.length);A.selection.setRng(z)}r.plugins.table.fixTableCellSelection=n;if(r&&r.plugins.contextmenu){r.plugins.contextmenu.onContextMenu.add(function(A,w,C){var D,B=r.selection,z=B.getNode()||r.getBody();if(r.dom.getParent(C,"td")||r.dom.getParent(C,"th")||r.dom.select("td.mceSelected,th.mceSelected").length){w.removeAll();if(z.nodeName=="A"&&!r.dom.getAttrib(z,"name")){w.add({title:"advanced.link_desc",icon:"link",cmd:r.plugins.advlink?"mceAdvLink":"mceLink",ui:true});w.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});w.addSeparator()}if(z.nodeName=="IMG"&&z.className.indexOf("mceItem")==-1){w.add({title:"advanced.image_desc",icon:"image",cmd:r.plugins.advimage?"mceAdvImage":"mceImage",ui:true});w.addSeparator()}w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});w.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});w.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});w.addSeparator();D=w.addMenu({title:"table.cell"});D.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});D.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});D.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});D=w.addMenu({title:"table.row"});D.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});D.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});D.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});D.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});D.addSeparator();D.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});D.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});D.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!m);D.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!m);D=w.addMenu({title:"table.col"});D.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});D.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});D.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(d.isWebKit){function v(C,N){var L=d.VK;var Q=N.keyCode;function O(Y,U,S){var T=Y?"previousSibling":"nextSibling";var Z=C.dom.getParent(U,"tr");var X=Z[T];if(X){z(C,U,X,Y);d.dom.Event.cancel(S);return true}else{var aa=C.dom.getParent(Z,"table");var W=Z.parentNode;var R=W.nodeName.toLowerCase();if(R==="tbody"||R===(Y?"tfoot":"thead")){var V=w(Y,aa,W,"tbody");if(V!==null){return K(Y,V,U,S)}}return M(Y,Z,T,aa,S)}}function w(V,T,U,X){var S=C.dom.select(">"+X,T);var R=S.indexOf(U);if(V&&R===0||!V&&R===S.length-1){return B(V,T)}else{if(R===-1){var W=U.tagName.toLowerCase()==="thead"?0:S.length-1;return S[W]}else{return S[R+(V?-1:1)]}}}function B(U,T){var S=U?"thead":"tfoot";var R=C.dom.select(">"+S,T);return R.length!==0?R[0]:null}function K(V,T,S,U){var R=J(T,V);R&&z(C,S,R,V);d.dom.Event.cancel(U);return true}function M(Y,U,R,X,W){var S=X[R];if(S){F(S);return true}else{var V=C.dom.getParent(X,"td,th");if(V){return O(Y,V,W)}else{var T=J(U,!Y);F(T);return d.dom.Event.cancel(W)}}}function J(S,R){var T=S&&S[R?"lastChild":"firstChild"];return T&&T.nodeName==="BR"?C.dom.getParent(T,"td,th"):T}function F(R){C.selection.setCursorLocation(R,0)}function A(){return Q==L.UP||Q==L.DOWN}function D(R){var T=R.selection.getNode();var S=R.dom.getParent(T,"tr");return S!==null}function P(S){var R=0;var T=S;while(T.previousSibling){T=T.previousSibling;R=R+a(T,"colspan")}return R}function E(T,R){var U=0;var S=0;e(T.children,function(V,W){U=U+a(V,"colspan");S=W;if(U>R){return false}});return S}function z(T,W,Y,V){var X=P(T.dom.getParent(W,"td,th"));var S=E(Y,X);var R=Y.childNodes[S];var U=J(R,V);F(U||R)}function H(R){var T=C.selection.getNode();var U=C.dom.getParent(T,"td,th");var S=C.dom.getParent(R,"td,th");return U&&U!==S&&I(U,S)}function I(S,R){return C.dom.getParent(S,"TABLE")===C.dom.getParent(R,"TABLE")}if(A()&&D(C)){var G=C.selection.getNode();setTimeout(function(){if(H(G)){O(!N.shiftKey&&Q===L.UP,G,N)}},0)}}r.onKeyDown.add(v)}if(!d.isIE){function s(){var w;for(w=r.getBody().lastChild;w&&w.nodeType==3&&!w.nodeValue.length;w=w.previousSibling){}if(w&&w.nodeName=="TABLE"){r.dom.add(r.getBody(),"p",null,'
        ')}}if(d.isGecko){r.onKeyDown.add(function(z,B){var w,A,C=z.dom;if(B.keyCode==37||B.keyCode==38){w=z.selection.getRng();A=C.getParent(w.startContainer,"table");if(A&&z.getBody().firstChild==A){if(c(w,A)){w=C.createRng();w.setStartBefore(A);w.setEndBefore(A);z.selection.setRng(w);B.preventDefault()}}}})}r.onKeyUp.add(s);r.onSetContent.add(s);r.onVisualAid.add(s);r.onPreProcess.add(function(w,A){var z=A.node.lastChild;if(z&&z.childNodes.length==1&&z.firstChild.nodeName=="BR"&&z.previousSibling&&z.previousSibling.nodeName=="TABLE"){w.dom.remove(z)}});if(d.isGecko){r.onKeyDown.add(function(z,B){if(B.keyCode===d.VK.ENTER&&B.shiftKey){var A=z.selection.getRng().startContainer;var C=q.getParent(A,"td,th");if(C){var w=z.getDoc().createTextNode("\uFEFF");q.insertAfter(w,A)}}})}s();r.startContent=r.getContent({format:"raw"})}});e({mceTableSplitCells:function(n){n.split()},mceTableMergeCells:function(o){var p,q,n;n=g.dom.getParent(g.selection.getNode(),"th,td");if(n){p=n.rowSpan;q=n.colSpan}if(!g.dom.select("td.mceSelected,th.mceSelected").length){f.open({url:h+"/merge_cells.htm",width:240+parseInt(g.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(g.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:p,cols:q,onaction:function(r){o.merge(n,r.cols,r.rows)},plugin_url:h})}else{o.merge()}},mceTableInsertRowBefore:function(n){n.insertRow(true)},mceTableInsertRowAfter:function(n){n.insertRow()},mceTableInsertColBefore:function(n){n.insertCol(true)},mceTableInsertColAfter:function(n){n.insertCol()},mceTableDeleteCol:function(n){n.deleteCols()},mceTableDeleteRow:function(n){n.deleteRows()},mceTableCutRow:function(n){m=n.cutRows()},mceTableCopyRow:function(n){m=n.copyRows()},mceTablePasteRowBefore:function(n){n.pasteRows(m,true)},mceTablePasteRowAfter:function(n){n.pasteRows(m)},mceTableDelete:function(n){n.deleteTable()}},function(o,n){g.addCommand(n,function(){var p=l();if(p){o(p);g.execCommand("mceRepaint");k()}})});e({mceInsertTable:function(n){f.open({url:h+"/table.htm",width:400+parseInt(g.getLang("table.table_delta_width",0)),height:320+parseInt(g.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:n?n.action:0})},mceTableRowProps:function(){f.open({url:h+"/row.htm",width:400+parseInt(g.getLang("table.rowprops_delta_width",0)),height:295+parseInt(g.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})},mceTableCellProps:function(){f.open({url:h+"/cell.htm",width:400+parseInt(g.getLang("table.cellprops_delta_width",0)),height:295+parseInt(g.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}},function(o,n){g.addCommand(n,function(p,q){o(q)})})}});d.PluginManager.add("table",d.plugins.TablePlugin)})(tinymce);plugins/table/js/table.js000066600000034735150472426320011402 0ustar00tinyMCEPopup.requireLangPack(); var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom; function insertTable() { var formObj = document.forms[0]; var inst = tinyMCEPopup.editor, dom = inst.dom; var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules; var html = '', capEl, elm; var cellLimit, rowLimit, colLimit; tinyMCEPopup.restoreSelection(); if (!AutoValidator.validate(formObj)) { tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); return false; } elm = dom.getParent(inst.selection.getNode(), 'table'); // Get form data cols = formObj.elements['cols'].value; rows = formObj.elements['rows'].value; border = formObj.elements['border'].value != "" ? formObj.elements['border'].value : 0; cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : ""; cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : ""; align = getSelectValue(formObj, "align"); frame = getSelectValue(formObj, "tframe"); rules = getSelectValue(formObj, "rules"); width = formObj.elements['width'].value; height = formObj.elements['height'].value; bordercolor = formObj.elements['bordercolor'].value; bgcolor = formObj.elements['bgcolor'].value; className = getSelectValue(formObj, "class"); id = formObj.elements['id'].value; summary = formObj.elements['summary'].value; style = formObj.elements['style'].value; dir = formObj.elements['dir'].value; lang = formObj.elements['lang'].value; background = formObj.elements['backgroundimage'].value; caption = formObj.elements['caption'].checked; cellLimit = tinyMCEPopup.getParam('table_cell_limit', false); rowLimit = tinyMCEPopup.getParam('table_row_limit', false); colLimit = tinyMCEPopup.getParam('table_col_limit', false); // Validate table size if (colLimit && cols > colLimit) { tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit)); return false; } else if (rowLimit && rows > rowLimit) { tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit)); return false; } else if (cellLimit && cols * rows > cellLimit) { tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit)); return false; } // Update table if (action == "update") { dom.setAttrib(elm, 'cellPadding', cellpadding, true); dom.setAttrib(elm, 'cellSpacing', cellspacing, true); if (!isCssSize(border)) { dom.setAttrib(elm, 'border', border); } else { dom.setAttrib(elm, 'border', ''); } if (border == '') { dom.setStyle(elm, 'border-width', ''); dom.setStyle(elm, 'border', ''); dom.setAttrib(elm, 'border', ''); } dom.setAttrib(elm, 'align', align); dom.setAttrib(elm, 'frame', frame); dom.setAttrib(elm, 'rules', rules); dom.setAttrib(elm, 'class', className); dom.setAttrib(elm, 'style', style); dom.setAttrib(elm, 'id', id); dom.setAttrib(elm, 'summary', summary); dom.setAttrib(elm, 'dir', dir); dom.setAttrib(elm, 'lang', lang); capEl = inst.dom.select('caption', elm)[0]; if (capEl && !caption) capEl.parentNode.removeChild(capEl); if (!capEl && caption) { capEl = elm.ownerDocument.createElement('caption'); if (!tinymce.isIE) capEl.innerHTML = '
        '; elm.insertBefore(capEl, elm.firstChild); } if (width && inst.settings.inline_styles) { dom.setStyle(elm, 'width', width); dom.setAttrib(elm, 'width', ''); } else { dom.setAttrib(elm, 'width', width, true); dom.setStyle(elm, 'width', ''); } // Remove these since they are not valid XHTML dom.setAttrib(elm, 'borderColor', ''); dom.setAttrib(elm, 'bgColor', ''); dom.setAttrib(elm, 'background', ''); if (height && inst.settings.inline_styles) { dom.setStyle(elm, 'height', height); dom.setAttrib(elm, 'height', ''); } else { dom.setAttrib(elm, 'height', height, true); dom.setStyle(elm, 'height', ''); } if (background != '') elm.style.backgroundImage = "url('" + background + "')"; else elm.style.backgroundImage = ''; /* if (tinyMCEPopup.getParam("inline_styles")) { if (width != '') elm.style.width = getCSSSize(width); }*/ if (bordercolor != "") { elm.style.borderColor = bordercolor; elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle; elm.style.borderWidth = cssSize(border); } else elm.style.borderColor = ''; elm.style.backgroundColor = bgcolor; elm.style.height = getCSSSize(height); inst.addVisual(); // Fix for stange MSIE align bug //elm.outerHTML = elm.outerHTML; inst.nodeChanged(); inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true}); // Repaint if dimensions changed if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight) inst.execCommand('mceRepaint'); tinyMCEPopup.close(); return true; } // Create new table html += ''); tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) { if (patt) patt += ','; patt += n + ' ._mce_marker'; }); tinymce.each(inst.dom.select(patt), function(n) { inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n); }); dom.setOuterHTML(dom.select('br._mce_marker')[0], html); } else inst.execCommand('mceInsertContent', false, html); tinymce.each(dom.select('table[data-mce-new]'), function(node) { var tdorth = dom.select('td,th', node); // Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document if (tinymce.isIE && node.nextSibling == null) { dom.insertAfter(dom.create('p'), node); } try { // IE9 might fail to do this selection inst.selection.setCursorLocation(tdorth[0], 0); } catch (ex) { // Ignore } dom.setAttrib(node, 'data-mce-new', ''); }); inst.addVisual(); inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true}); tinyMCEPopup.close(); } 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, '>'); 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 = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', ''); var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = ""; var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = ""; var inst = tinyMCEPopup.editor, dom = inst.dom; var formObj = document.forms[0]; var elm = dom.getParent(inst.selection.getNode(), "table"); // Hide advanced fields that isn't available in the schema tinymce.each("summary id rules dir style frame".split(" "), function(name) { var tr = tinyMCEPopup.dom.getParent(name, "tr") || tinyMCEPopup.dom.getParent("t" + name, "tr"); if (tr && !tinyMCEPopup.editor.schema.isValid("table", name)) { tr.style.display = 'none'; } }); action = tinyMCEPopup.getWindowArg('action'); if (!action) action = elm ? "update" : "insert"; if (elm && action != "insert") { var rowsAr = elm.rows; var cols = 0; for (var i=0; i cols) cols = rowsAr[i].cells.length; cols = cols; rows = rowsAr.length; st = dom.parseStyle(dom.getAttrib(elm, "style")); border = trimSize(getStyle(elm, 'border', 'borderWidth')); cellpadding = dom.getAttrib(elm, 'cellpadding', ""); cellspacing = dom.getAttrib(elm, '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 = dom.getAttrib(elm, 'align', align); frame = dom.getAttrib(elm, 'frame'); rules = dom.getAttrib(elm, 'rules'); className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, '')); id = dom.getAttrib(elm, 'id'); summary = dom.getAttrib(elm, 'summary'); style = dom.serializeStyle(st); dir = dom.getAttrib(elm, 'dir'); lang = dom.getAttrib(elm, 'lang'); background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); formObj.caption.checked = elm.getElementsByTagName('caption').length > 0; orgTableWidth = width; orgTableHeight = height; action = "update"; formObj.insert.value = inst.getLang('update'); } addClassesToList('class', "table_styles"); TinyMCE_EditableSelects.init(); // Update form selectByValue(formObj, 'align', align); selectByValue(formObj, 'tframe', frame); selectByValue(formObj, 'rules', rules); selectByValue(formObj, 'class', className, true, true); 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; 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 = dom.parseStyle(formObj.style.value); /* var width = formObj.width.value; if (width != "") st['width'] = tinyMCEPopup.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 = dom.serializeStyle(st); } function isCssSize(value) { return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value); } function cssSize(value, def) { value = tinymce.trim(value || def); if (!isCssSize(value)) { return parseInt(value, 10) + 'px'; } return value; } function changedBackgroundImage() { var formObj = document.forms[0]; var st = dom.parseStyle(formObj.style.value); st['background-image'] = "url('" + formObj.backgroundimage.value + "')"; formObj.style.value = dom.serializeStyle(st); } function changedBorder() { var formObj = document.forms[0]; var st = dom.parseStyle(formObj.style.value); // Update border width if the element has a color if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != "")) st['border-width'] = cssSize(formObj.border.value); else { if (!formObj.border.value) { st['border'] = ''; st['border-width'] = ''; } } formObj.style.value = dom.serializeStyle(st); } function changedColor() { var formObj = document.forms[0]; var st = dom.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'] = cssSize(formObj.border.value, 1); } formObj.style.value = dom.serializeStyle(st); } function changedStyle() { var formObj = document.forms[0]; var st = dom.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'); } } tinyMCEPopup.onInit.add(init); plugins/table/js/row.js000066600000015717150472426320011121 0ustar00tinyMCEPopup.requireLangPack(); function init() { tinyMCEPopup.resizeToInnerSize(); document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table'); document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor'); var inst = tinyMCEPopup.editor; var dom = inst.dom; var trElm = dom.getParent(inst.selection.getStart(), "tr"); var formObj = document.forms[0]; var st = dom.parseStyle(dom.getAttrib(trElm, "style")); // Get table row data var rowtype = trElm.parentNode.nodeName.toLowerCase(); var align = dom.getAttrib(trElm, 'align'); var valign = dom.getAttrib(trElm, 'valign'); var height = trimSize(getStyle(trElm, 'height', 'height')); var className = dom.getAttrib(trElm, 'class'); var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor')); var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1"); var id = dom.getAttrib(trElm, 'id'); var lang = dom.getAttrib(trElm, 'lang'); var dir = dom.getAttrib(trElm, 'dir'); selectByValue(formObj, 'rowtype', rowtype); // Any cells selected if (dom.select('td.mceSelected,th.mceSelected', trElm).length == 0) { // Setup form addClassesToList('class', 'table_row_styles'); TinyMCE_EditableSelects.init(); formObj.bgcolor.value = bgcolor; formObj.backgroundimage.value = backgroundimage; formObj.height.value = height; formObj.id.value = id; formObj.lang.value = lang; formObj.style.value = dom.serializeStyle(st); selectByValue(formObj, 'align', align); selectByValue(formObj, 'valign', valign); selectByValue(formObj, 'class', className, true, true); selectByValue(formObj, 'dir', dir); // Resize some elements if (isVisible('backgroundimagebrowser')) document.getElementById('backgroundimage').style.width = '180px'; updateColor('bgcolor_pick', 'bgcolor'); } else tinyMCEPopup.dom.hide('action'); } function updateAction() { var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0]; var action = getSelectValue(formObj, 'action'); if (!AutoValidator.validate(formObj)) { tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.'); return false; } tinyMCEPopup.restoreSelection(); trElm = dom.getParent(inst.selection.getStart(), "tr"); tableElm = dom.getParent(inst.selection.getStart(), "table"); // Update all selected rows if (dom.select('td.mceSelected,th.mceSelected', trElm).length > 0) { tinymce.each(tableElm.rows, function(tr) { var i; for (i = 0; i < tr.cells.length; i++) { if (dom.hasClass(tr.cells[i], 'mceSelected')) { updateRow(tr, true); return; } } }); inst.addVisual(); inst.nodeChanged(); inst.execCommand('mceEndUndoLevel'); tinyMCEPopup.close(); return; } switch (action) { case "row": updateRow(trElm); break; case "all": var rows = tableElm.getElementsByTagName("tr"); for (var i=0; i {#table_dlg.row_title}
        {#table_dlg.general_props}
        {#table_dlg.advanced_props}
         
         
        plugins/table/cell.htm000066600000015710150472426320010762 0ustar00 {#table_dlg.cell_title}
        {#table_dlg.general_props}
        {#table_dlg.advanced_props}
         
         
         
        plugins/table/langs/ru_dlg.js000066600000012541150472426320012246 0ustar00tinyMCE.addI18n('ru.table_dlg',{ general_tab:"\u041E\u0431\u0449\u0435\u0435", advanced_tab:"\u0414\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u043E", general_props:"\u041E\u0431\u0449\u0438\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430", advanced_props:"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u044B\u0435 \u0441\u0432\u043E\u0439\u0441\u0442\u0432\u0430", rowtype:"Row in table part", title:"\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435 / \u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B", width:"\u0428\u0438\u0440\u0438\u043D\u0430", height:"\u0412\u044B\u0441\u043E\u0442\u0430", cols:"\u0421\u0442\u043E\u043B\u0431\u0446\u044B", rows:"\u0421\u0440\u043E\u043A\u0438", cellspacing:"\u0420\u0430\u0441\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043C\u0435\u0436\u0434\u0443 \u044F\u0447\u0435\u0439\u043A\u0430\u043C\u0438", cellpadding:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B \u0432 \u044F\u0447\u0435\u0439\u043A\u0430\u0445", border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430", align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", align_default:"\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E", align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443", row_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043E\u043A\u0435 \u0442\u0430\u0431\u043B\u0438\u0446\u044B", cell_title:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u044F\u0447\u0435\u0439\u043A\u0438 \u0442\u0430\u0431\u043B\u0438\u0446\u044B", cell_type:"\u0422\u0438\u043F \u044F\u0447\u0435\u0439\u043A\u0438", valign:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", bordercolor:"\u0446\u0432\u0435\u0442 \u0433\u0440\u0430\u043D\u0438\u0446\u044B", bgcolor:"\u0446\u0432\u0435\u0442 \u0444\u043E\u043D\u0430", merge_cells_title:"\u041E\u0431\u044A\u0435\u0434\u0438\u043D\u0438\u0442\u044C \u044F\u0447\u0435\u0439\u043A\u0438", id:"Id", style:"\u0421\u0442\u0438\u043B\u044C", langdir:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u044F\u0437\u044B\u043A\u0430", langcode:"\u041A\u043E\u0434 \u044F\u0437\u044B\u043A\u0430", mime:"Target MIME-\u0442\u0438\u043F", ltr:"\u0421\u043B\u0435\u0432\u0430 \u043D\u0430\u043F\u0440\u0430\u0432\u043E", rtl:"\u0421\u043F\u0440\u0430\u0432\u0430 \u043D\u0430\u043B\u0435\u0432\u043E", bgimage:"\u0424\u043E\u043D\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", summary:"\u041E\u0431\u0449\u0435\u0435", td:"\u0414\u0430\u043D\u043D\u044B\u0435", th:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", cell_cell:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u044F\u0447\u0435\u0439\u043A\u0443", cell_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0441\u0442\u0440\u043E\u043A\u0435", cell_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u044F\u0447\u0435\u0439\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435", row_row:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0442\u0440\u043E\u043A\u0443", row_odd:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u043D\u0435\u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435", row_even:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0447\u0435\u0442\u043D\u044B\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435", row_all:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0432\u0441\u0435 \u0441\u0442\u0440\u043E\u043A\u0438 \u0432 \u0442\u0430\u0431\u043B\u0438\u0446\u0435", thead:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0442\u0430\u0431\u043B\u0438\u0446\u044B", tbody:"\u0422\u0435\u043B\u043E \u0442\u0430\u0431\u043B\u0438\u0446\u044B", tfoot:"\u041D\u0438\u0436\u043D\u044F\u044F \u0447\u0430\u0441\u0442\u0441\u0438\u043D\u0430", scope:"Scope", rowgroup:"Row Group", colgroup:"Col Group", col_limit:"You've exceeded the maximum number of columns of ($ cols)", row_limit:"You've exceeded the maximum number of rows of ($ rows)", cell_limit:"You've exceeded the maximum number of cells of ($ cells)", 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", caption:"Table caption", frame:"\u0424\u0440\u0435\u0439\u043C", frame_none:"none", frame_groups:"groups", frame_rows:"rows", frame_cols:"cols", frame_all:"all", rules:"Rules", rules_void:"void", rules_above:"above", rules_below:"below", rules_hsides:"hsides", rules_lhs:"lhs", rules_rhs:"rhs", rules_vsides:"vsides", rules_box:"box", rules_border:"border" });plugins/table/langs/en_dlg.js000066600000004054150472426320012222 0ustar00tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table Caption","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.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Footer",tbody:"Body",thead:"Header","row_all":"Update All Rows in Table","row_even":"Update Even Rows in Table","row_odd":"Update Odd Rows in Table","row_row":"Update Current Row","cell_all":"Update All Cells in Table","cell_row":"Update All Cells in Row","cell_cell":"Update Current Cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background Image",rtl:"Right to Left",ltr:"Left to Right",mime:"Target MIME Type",langcode:"Language Code",langdir:"Language Direction",style:"Style",id:"ID","merge_cells_title":"Merge Table Cells",bgcolor:"Background Color",bordercolor:"Border Color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical Alignment","cell_type":"Cell Type","cell_title":"Table Cell Properties","row_title":"Table Row Properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cell Padding",cellspacing:"Cell Spacing",rows:"Rows",cols:"Columns",height:"Height",width:"Width",title:"Insert/Edit Table",rowtype:"Row Type","advanced_props":"Advanced Properties","general_props":"General Properties","advanced_tab":"Advanced","general_tab":"General","cell_col":"Update all cells in column"});plugins/table/editor_plugin_src.js000066600000114221150472426320013377 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function(tinymce) { var each = tinymce.each; // Checks if the selection/caret is at the start of the specified block element function isAtStart(rng, par) { var doc = par.ownerDocument, rng2 = doc.createRange(), elm; rng2.setStartBefore(par); rng2.setEnd(rng.endContainer, rng.endOffset); elm = doc.createElement('body'); elm.appendChild(rng2.cloneContents()); // Check for text characters of other elements that should be treated as content return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0; }; function getSpanVal(td, name) { return parseInt(td.getAttribute(name) || 1); } /** * Table Grid class. */ function TableGrid(table, dom, selection) { var grid, startPos, endPos, selectedCell; buildGrid(); selectedCell = dom.getParent(selection.getStart(), 'th,td'); if (selectedCell) { startPos = getPos(selectedCell); endPos = findEndPos(); selectedCell = getCell(startPos.x, startPos.y); } function cloneNode(node, children) { node = node.cloneNode(children); node.removeAttribute('id'); return node; } function buildGrid() { var startY = 0; grid = []; each(['thead', 'tbody', 'tfoot'], function(part) { var rows = dom.select('> ' + part + ' tr', table); each(rows, function(tr, y) { y += startY; each(dom.select('> td, > th', tr), function(td, x) { var x2, y2, rowspan, colspan; // Skip over existing cells produced by rowspan if (grid[y]) { while (grid[y][x]) x++; } // Get col/rowspan from cell rowspan = getSpanVal(td, 'rowspan'); colspan = getSpanVal(td, 'colspan'); // Fill out rowspan/colspan right and down for (y2 = y; y2 < y + rowspan; y2++) { if (!grid[y2]) grid[y2] = []; for (x2 = x; x2 < x + colspan; x2++) { grid[y2][x2] = { part : part, real : y2 == y && x2 == x, elm : td, rowspan : rowspan, colspan : colspan }; } } }); }); startY += rows.length; }); }; function getCell(x, y) { var row; row = grid[y]; if (row) return row[x]; }; function setSpanVal(td, name, val) { if (td) { val = parseInt(val); if (val === 1) td.removeAttribute(name, 1); else td.setAttribute(name, val, 1); } } function isCellSelected(cell) { return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell); }; function getSelectedRows() { var rows = []; each(table.rows, function(row) { each(row.cells, function(cell) { if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) { rows.push(row); return false; } }); }); return rows; }; function deleteTable() { var rng = dom.createRng(); rng.setStartAfter(table); rng.setEndAfter(table); selection.setRng(rng); dom.remove(table); }; function cloneCell(cell) { var formatNode; // Clone formats tinymce.walk(cell, function(node) { var curNode; if (node.nodeType == 3) { each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) { node = cloneNode(node, false); if (!formatNode) formatNode = curNode = node; else if (curNode) curNode.appendChild(node); curNode = node; }); // Add something to the inner node if (curNode) curNode.innerHTML = tinymce.isIE ? ' ' : '
        '; return false; } }, 'childNodes'); cell = cloneNode(cell, false); setSpanVal(cell, 'rowSpan', 1); setSpanVal(cell, 'colSpan', 1); if (formatNode) { cell.appendChild(formatNode); } else { if (!tinymce.isIE) cell.innerHTML = '
        '; } return cell; }; function cleanup() { var rng = dom.createRng(); // Empty rows each(dom.select('tr', table), function(tr) { if (tr.cells.length == 0) dom.remove(tr); }); // Empty table if (dom.select('tr', table).length == 0) { rng.setStartAfter(table); rng.setEndAfter(table); selection.setRng(rng); dom.remove(table); return; } // Empty header/body/footer each(dom.select('thead,tbody,tfoot', table), function(part) { if (part.rows.length == 0) dom.remove(part); }); // Restore selection to start position if it still exists buildGrid(); // Restore the selection to the closest table position row = grid[Math.min(grid.length - 1, startPos.y)]; if (row) { selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true); selection.collapse(true); } }; function fillLeftDown(x, y, rows, cols) { var tr, x2, r, c, cell; tr = grid[y][x].elm.parentNode; for (r = 1; r <= rows; r++) { tr = dom.getNext(tr, 'tr'); if (tr) { // Loop left to find real cell for (x2 = x; x2 >= 0; x2--) { cell = grid[y + r][x2].elm; if (cell.parentNode == tr) { // Append clones after for (c = 1; c <= cols; c++) dom.insertAfter(cloneCell(cell), cell); break; } } if (x2 == -1) { // Insert nodes before first cell for (c = 1; c <= cols; c++) tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]); } } } }; function split() { each(grid, function(row, y) { each(row, function(cell, x) { var colSpan, rowSpan, newCell, i; if (isCellSelected(cell)) { cell = cell.elm; colSpan = getSpanVal(cell, 'colspan'); rowSpan = getSpanVal(cell, 'rowspan'); if (colSpan > 1 || rowSpan > 1) { setSpanVal(cell, 'rowSpan', 1); setSpanVal(cell, 'colSpan', 1); // Insert cells right for (i = 0; i < colSpan - 1; i++) dom.insertAfter(cloneCell(cell), cell); fillLeftDown(x, y, rowSpan - 1, colSpan); } } }); }); }; function merge(cell, cols, rows) { var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count; // Use specified cell and cols/rows if (cell) { pos = getPos(cell); startX = pos.x; startY = pos.y; endX = startX + (cols - 1); endY = startY + (rows - 1); } else { startPos = endPos = null; // Calculate start/end pos by checking for selected cells in grid works better with context menu each(grid, function(row, y) { each(row, function(cell, x) { if (isCellSelected(cell)) { if (!startPos) { startPos = {x: x, y: y}; } endPos = {x: x, y: y}; } }); }); // Use selection startX = startPos.x; startY = startPos.y; endX = endPos.x; endY = endPos.y; } // Find start/end cells startCell = getCell(startX, startY); endCell = getCell(endX, endY); // Check if the cells exists and if they are of the same part for example tbody = tbody if (startCell && endCell && startCell.part == endCell.part) { // Split and rebuild grid split(); buildGrid(); // Set row/col span to start cell startCell = getCell(startX, startY).elm; setSpanVal(startCell, 'colSpan', (endX - startX) + 1); setSpanVal(startCell, 'rowSpan', (endY - startY) + 1); // Remove other cells and add it's contents to the start cell for (y = startY; y <= endY; y++) { for (x = startX; x <= endX; x++) { if (!grid[y] || !grid[y][x]) continue; cell = grid[y][x].elm; if (cell != startCell) { // Move children to startCell children = tinymce.grep(cell.childNodes); each(children, function(node) { startCell.appendChild(node); }); // Remove bogus nodes if there is children in the target cell if (children.length) { children = tinymce.grep(startCell.childNodes); count = 0; each(children, function(node) { if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1) startCell.removeChild(node); }); } // Remove cell dom.remove(cell); } } } // Remove empty rows etc and restore caret location cleanup(); } }; function insertRow(before) { var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan; // Find first/last row each(grid, function(row, y) { each(row, function(cell, x) { if (isCellSelected(cell)) { cell = cell.elm; rowElm = cell.parentNode; newRow = cloneNode(rowElm, false); posY = y; if (before) return false; } }); if (before) return !posY; }); for (x = 0; x < grid[0].length; x++) { // Cell not found could be because of an invalid table structure if (!grid[posY][x]) continue; cell = grid[posY][x].elm; if (cell != lastCell) { if (!before) { rowSpan = getSpanVal(cell, 'rowspan'); if (rowSpan > 1) { setSpanVal(cell, 'rowSpan', rowSpan + 1); continue; } } else { // Check if cell above can be expanded if (posY > 0 && grid[posY - 1][x]) { otherCell = grid[posY - 1][x].elm; rowSpan = getSpanVal(otherCell, 'rowSpan'); if (rowSpan > 1) { setSpanVal(otherCell, 'rowSpan', rowSpan + 1); continue; } } } // Insert new cell into new row newCell = cloneCell(cell); setSpanVal(newCell, 'colSpan', cell.colSpan); newRow.appendChild(newCell); lastCell = cell; } } if (newRow.hasChildNodes()) { if (!before) dom.insertAfter(newRow, rowElm); else rowElm.parentNode.insertBefore(newRow, rowElm); } }; function insertCol(before) { var posX, lastCell; // Find first/last column each(grid, function(row, y) { each(row, function(cell, x) { if (isCellSelected(cell)) { posX = x; if (before) return false; } }); if (before) return !posX; }); each(grid, function(row, y) { var cell, rowSpan, colSpan; if (!row[posX]) return; cell = row[posX].elm; if (cell != lastCell) { colSpan = getSpanVal(cell, 'colspan'); rowSpan = getSpanVal(cell, 'rowspan'); if (colSpan == 1) { if (!before) { dom.insertAfter(cloneCell(cell), cell); fillLeftDown(posX, y, rowSpan - 1, colSpan); } else { cell.parentNode.insertBefore(cloneCell(cell), cell); fillLeftDown(posX, y, rowSpan - 1, colSpan); } } else setSpanVal(cell, 'colSpan', cell.colSpan + 1); lastCell = cell; } }); }; function deleteCols() { var cols = []; // Get selected column indexes each(grid, function(row, y) { each(row, function(cell, x) { if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) { each(grid, function(row) { var cell = row[x].elm, colSpan; colSpan = getSpanVal(cell, 'colSpan'); if (colSpan > 1) setSpanVal(cell, 'colSpan', colSpan - 1); else dom.remove(cell); }); cols.push(x); } }); }); cleanup(); }; function deleteRows() { var rows; function deleteRow(tr) { var nextTr, pos, lastCell; nextTr = dom.getNext(tr, 'tr'); // Move down row spanned cells each(tr.cells, function(cell) { var rowSpan = getSpanVal(cell, 'rowSpan'); if (rowSpan > 1) { setSpanVal(cell, 'rowSpan', rowSpan - 1); pos = getPos(cell); fillLeftDown(pos.x, pos.y, 1, 1); } }); // Delete cells pos = getPos(tr.cells[0]); each(grid[pos.y], function(cell) { var rowSpan; cell = cell.elm; if (cell != lastCell) { rowSpan = getSpanVal(cell, 'rowSpan'); if (rowSpan <= 1) dom.remove(cell); else setSpanVal(cell, 'rowSpan', rowSpan - 1); lastCell = cell; } }); }; // Get selected rows and move selection out of scope rows = getSelectedRows(); // Delete all selected rows each(rows.reverse(), function(tr) { deleteRow(tr); }); cleanup(); }; function cutRows() { var rows = getSelectedRows(); dom.remove(rows); cleanup(); return rows; }; function copyRows() { var rows = getSelectedRows(); each(rows, function(row, i) { rows[i] = cloneNode(row, true); }); return rows; }; function pasteRows(rows, before) { var selectedRows = getSelectedRows(), targetRow = selectedRows[before ? 0 : selectedRows.length - 1], targetCellCount = targetRow.cells.length; // Calc target cell count each(grid, function(row) { var match; targetCellCount = 0; each(row, function(cell, x) { if (cell.real) targetCellCount += cell.colspan; if (cell.elm.parentNode == targetRow) match = 1; }); if (match) return false; }); if (!before) rows.reverse(); each(rows, function(row) { var cellCount = row.cells.length, cell; // Remove col/rowspans for (i = 0; i < cellCount; i++) { cell = row.cells[i]; setSpanVal(cell, 'colSpan', 1); setSpanVal(cell, 'rowSpan', 1); } // Needs more cells for (i = cellCount; i < targetCellCount; i++) row.appendChild(cloneCell(row.cells[cellCount - 1])); // Needs less cells for (i = targetCellCount; i < cellCount; i++) dom.remove(row.cells[i]); // Add before/after if (before) targetRow.parentNode.insertBefore(row, targetRow); else dom.insertAfter(row, targetRow); }); // Remove current selection dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); }; function getPos(target) { var pos; each(grid, function(row, y) { each(row, function(cell, x) { if (cell.elm == target) { pos = {x : x, y : y}; return false; } }); return !pos; }); return pos; }; function setStartCell(cell) { startPos = getPos(cell); }; function findEndPos() { var pos, maxX, maxY; maxX = maxY = 0; each(grid, function(row, y) { each(row, function(cell, x) { var colSpan, rowSpan; if (isCellSelected(cell)) { cell = grid[y][x]; if (x > maxX) maxX = x; if (y > maxY) maxY = y; if (cell.real) { colSpan = cell.colspan - 1; rowSpan = cell.rowspan - 1; if (colSpan) { if (x + colSpan > maxX) maxX = x + colSpan; } if (rowSpan) { if (y + rowSpan > maxY) maxY = y + rowSpan; } } } }); }); return {x : maxX, y : maxY}; }; function setEndCell(cell) { var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan; endPos = getPos(cell); if (startPos && endPos) { // Get start/end positions startX = Math.min(startPos.x, endPos.x); startY = Math.min(startPos.y, endPos.y); endX = Math.max(startPos.x, endPos.x); endY = Math.max(startPos.y, endPos.y); // Expand end positon to include spans maxX = endX; maxY = endY; // Expand startX for (y = startY; y <= maxY; y++) { cell = grid[y][startX]; if (!cell.real) { if (startX - (cell.colspan - 1) < startX) startX -= cell.colspan - 1; } } // Expand startY for (x = startX; x <= maxX; x++) { cell = grid[startY][x]; if (!cell.real) { if (startY - (cell.rowspan - 1) < startY) startY -= cell.rowspan - 1; } } // Find max X, Y for (y = startY; y <= endY; y++) { for (x = startX; x <= endX; x++) { cell = grid[y][x]; if (cell.real) { colSpan = cell.colspan - 1; rowSpan = cell.rowspan - 1; if (colSpan) { if (x + colSpan > maxX) maxX = x + colSpan; } if (rowSpan) { if (y + rowSpan > maxY) maxY = y + rowSpan; } } } } // Remove current selection dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); // Add new selection for (y = startY; y <= maxY; y++) { for (x = startX; x <= maxX; x++) { if (grid[y][x]) dom.addClass(grid[y][x].elm, 'mceSelected'); } } } }; // Expose to public tinymce.extend(this, { deleteTable : deleteTable, split : split, merge : merge, insertRow : insertRow, insertCol : insertCol, deleteCols : deleteCols, deleteRows : deleteRows, cutRows : cutRows, copyRows : copyRows, pasteRows : pasteRows, getPos : getPos, setStartCell : setStartCell, setEndCell : setEndCell }); }; tinymce.create('tinymce.plugins.TablePlugin', { init : function(ed, url) { var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload function createTableGrid(node) { var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table'); if (tblElm) return new TableGrid(tblElm, ed.dom, selection); }; function cleanup() { // Restore selection possibilities ed.getBody().style.webkitUserSelect = ''; if (hasCellSelection) { ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected'); hasCellSelection = false; } }; // Register buttons each([ ['table', 'table.desc', 'mceInsertTable', true], ['delete_table', 'table.del', 'mceTableDelete'], ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'], ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'], ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'], ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'], ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'], ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'], ['row_props', 'table.row_desc', 'mceTableRowProps', true], ['cell_props', 'table.cell_desc', 'mceTableCellProps', true], ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true], ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true] ], function(c) { ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]}); }); // Select whole table is a table border is clicked if (!tinymce.isIE) { ed.onClick.add(function(ed, e) { e = e.target; if (e.nodeName === 'TABLE') { ed.selection.select(e); ed.nodeChanged(); } }); } ed.onPreProcess.add(function(ed, args) { var nodes, i, node, dom = ed.dom, value; nodes = dom.select('table', args.node); i = nodes.length; while (i--) { node = nodes[i]; dom.setAttrib(node, 'data-mce-style', ''); if ((value = dom.getAttrib(node, 'width'))) { dom.setStyle(node, 'width', value); dom.setAttrib(node, 'width', ''); } if ((value = dom.getAttrib(node, 'height'))) { dom.setStyle(node, 'height', value); dom.setAttrib(node, 'height', ''); } } }); // Handle node change updates ed.onNodeChange.add(function(ed, cm, n) { var p; n = ed.selection.getStart(); p = ed.dom.getParent(n, 'td,th,caption'); cm.setActive('table', n.nodeName === 'TABLE' || !!p); // Disable table tools if we are in caption if (p && p.nodeName === 'CAPTION') p = 0; cm.setDisabled('delete_table', !p); cm.setDisabled('delete_col', !p); cm.setDisabled('delete_table', !p); cm.setDisabled('delete_row', !p); cm.setDisabled('col_after', !p); cm.setDisabled('col_before', !p); cm.setDisabled('row_after', !p); cm.setDisabled('row_before', !p); cm.setDisabled('row_props', !p); cm.setDisabled('cell_props', !p); cm.setDisabled('split_cells', !p); cm.setDisabled('merge_cells', !p); }); ed.onInit.add(function(ed) { var startTable, startCell, dom = ed.dom, tableGrid; winMan = ed.windowManager; // Add cell selection logic ed.onMouseDown.add(function(ed, e) { if (e.button != 2) { cleanup(); startCell = dom.getParent(e.target, 'td,th'); startTable = dom.getParent(startCell, 'table'); } }); dom.bind(ed.getDoc(), 'mouseover', function(e) { var sel, table, target = e.target; if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) { table = dom.getParent(target, 'table'); if (table == startTable) { if (!tableGrid) { tableGrid = createTableGrid(table); tableGrid.setStartCell(startCell); ed.getBody().style.webkitUserSelect = 'none'; } tableGrid.setEndCell(target); hasCellSelection = true; } // Remove current selection sel = ed.selection.getSel(); try { if (sel.removeAllRanges) sel.removeAllRanges(); else sel.empty(); } catch (ex) { // IE9 might throw errors here } e.preventDefault(); } }); ed.onMouseUp.add(function(ed, e) { var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode; // Move selection to startCell if (startCell) { if (tableGrid) ed.getBody().style.webkitUserSelect = ''; function setPoint(node, start) { var walker = new tinymce.dom.TreeWalker(node, node); do { // Text node if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) { if (start) rng.setStart(node, 0); else rng.setEnd(node, node.nodeValue.length); return; } // BR element if (node.nodeName == 'BR') { if (start) rng.setStartBefore(node); else rng.setEndBefore(node); return; } } while (node = (start ? walker.next() : walker.prev())); } // Try to expand text selection as much as we can only Gecko supports cell selection selectedCells = dom.select('td.mceSelected,th.mceSelected'); if (selectedCells.length > 0) { rng = dom.createRng(); node = selectedCells[0]; endNode = selectedCells[selectedCells.length - 1]; rng.setStartBefore(node); rng.setEndAfter(node); setPoint(node, 1); walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table')); do { if (node.nodeName == 'TD' || node.nodeName == 'TH') { if (!dom.hasClass(node, 'mceSelected')) break; lastNode = node; } } while (node = walker.next()); setPoint(lastNode); sel.setRng(rng); } ed.nodeChanged(); startCell = tableGrid = startTable = null; } }); ed.onKeyUp.add(function(ed, e) { cleanup(); }); ed.onKeyDown.add(function (ed, e) { fixTableCellSelection(ed); }); ed.onMouseDown.add(function (ed, e) { if (e.button != 2) { fixTableCellSelection(ed); } }); function tableCellSelected(ed, rng, n, currentCell) { // The decision of when a table cell is selected is somewhat involved. The fact that this code is // required is actually a pointer to the root cause of this bug. A cell is selected when the start // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases) // or the parent of the table (in the case of the selection containing the last cell of a table). var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'), tableParent, allOfCellSelected, tableCellSelection; if (table) tableParent = table.parentNode; allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE && rng.startOffset == 0 && rng.endOffset == 0 && currentCell && (n.nodeName=="TR" || n==tableParent); tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell; return allOfCellSelected || tableCellSelection; // return false; } // this nasty hack is here to work around some WebKit selection bugs. function fixTableCellSelection(ed) { if (!tinymce.isWebKit) return; var rng = ed.selection.getRng(); var n = ed.selection.getNode(); var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH'); if (!tableCellSelected(ed, rng, n, currentCell)) return; if (!currentCell) { currentCell=n; } // Get the very last node inside the table cell var end = currentCell.lastChild; while (end.lastChild) end = end.lastChild; // Select the entire table cell. Nothing outside of the table cell should be selected. rng.setEnd(end, end.nodeValue.length); ed.selection.setRng(rng); } ed.plugins.table.fixTableCellSelection=fixTableCellSelection; // Add context menu if (ed && ed.plugins.contextmenu) { ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) { var sm, se = ed.selection, el = se.getNode() || ed.getBody(); if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) { m.removeAll(); if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) { m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true}); m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'}); m.addSeparator(); } if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) { m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true}); m.addSeparator(); } m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}}); m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'}); m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'}); m.addSeparator(); // Cell menu sm = m.addMenu({title : 'table.cell'}); sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'}); sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'}); sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'}); // Row menu sm = m.addMenu({title : 'table.row'}); sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'}); sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'}); sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'}); sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'}); sm.addSeparator(); sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'}); sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'}); sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows); sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows); // Column menu sm = m.addMenu({title : 'table.col'}); sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'}); sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'}); sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'}); } else m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'}); }); } // Fix to allow navigating up and down in a table in WebKit browsers. if (tinymce.isWebKit) { function moveSelection(ed, e) { var VK = tinymce.VK; var key = e.keyCode; function handle(upBool, sourceNode, event) { var siblingDirection = upBool ? 'previousSibling' : 'nextSibling'; var currentRow = ed.dom.getParent(sourceNode, 'tr'); var siblingRow = currentRow[siblingDirection]; if (siblingRow) { moveCursorToRow(ed, sourceNode, siblingRow, upBool); tinymce.dom.Event.cancel(event); return true; } else { var tableNode = ed.dom.getParent(currentRow, 'table'); var middleNode = currentRow.parentNode; var parentNodeName = middleNode.nodeName.toLowerCase(); if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) { var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody'); if (targetParent !== null) { return moveToRowInTarget(upBool, targetParent, sourceNode, event); } } return escapeTable(upBool, currentRow, siblingDirection, tableNode, event); } } function getTargetParent(upBool, topNode, secondNode, nodeName) { var tbodies = ed.dom.select('>' + nodeName, topNode); var position = tbodies.indexOf(secondNode); if (upBool && position === 0 || !upBool && position === tbodies.length - 1) { return getFirstHeadOrFoot(upBool, topNode); } else if (position === -1) { var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1; return tbodies[topOrBottom]; } else { return tbodies[position + (upBool ? -1 : 1)]; } } function getFirstHeadOrFoot(upBool, parent) { var tagName = upBool ? 'thead' : 'tfoot'; var headOrFoot = ed.dom.select('>' + tagName, parent); return headOrFoot.length !== 0 ? headOrFoot[0] : null; } function moveToRowInTarget(upBool, targetParent, sourceNode, event) { var targetRow = getChildForDirection(targetParent, upBool); targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool); tinymce.dom.Event.cancel(event); return true; } function escapeTable(upBool, currentRow, siblingDirection, table, event) { var tableSibling = table[siblingDirection]; if (tableSibling) { moveCursorToStartOfElement(tableSibling); return true; } else { var parentCell = ed.dom.getParent(table, 'td,th'); if (parentCell) { return handle(upBool, parentCell, event); } else { var backUpSibling = getChildForDirection(currentRow, !upBool); moveCursorToStartOfElement(backUpSibling); return tinymce.dom.Event.cancel(event); } } } function getChildForDirection(parent, up) { var child = parent && parent[up ? 'lastChild' : 'firstChild']; // BR is not a valid table child to return in this case we return the table cell return child && child.nodeName === 'BR' ? ed.dom.getParent(child, 'td,th') : child; } function moveCursorToStartOfElement(n) { ed.selection.setCursorLocation(n, 0); } function isVerticalMovement() { return key == VK.UP || key == VK.DOWN; } function isInTable(ed) { var node = ed.selection.getNode(); var currentRow = ed.dom.getParent(node, 'tr'); return currentRow !== null; } function columnIndex(column) { var colIndex = 0; var c = column; while (c.previousSibling) { c = c.previousSibling; colIndex = colIndex + getSpanVal(c, "colspan"); } return colIndex; } function findColumn(rowElement, columnIndex) { var c = 0; var r = 0; each(rowElement.children, function(cell, i) { c = c + getSpanVal(cell, "colspan"); r = i; if (c > columnIndex) return false; }); return r; } function moveCursorToRow(ed, node, row, upBool) { var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th')); var tgtColumnIndex = findColumn(row, srcColumnIndex); var tgtNode = row.childNodes[tgtColumnIndex]; var rowCellTarget = getChildForDirection(tgtNode, upBool); moveCursorToStartOfElement(rowCellTarget || tgtNode); } function shouldFixCaret(preBrowserNode) { var newNode = ed.selection.getNode(); var newParent = ed.dom.getParent(newNode, 'td,th'); var oldParent = ed.dom.getParent(preBrowserNode, 'td,th'); return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent) } function checkSameParentTable(nodeOne, NodeTwo) { return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE'); } if (isVerticalMovement() && isInTable(ed)) { var preBrowserNode = ed.selection.getNode(); setTimeout(function() { if (shouldFixCaret(preBrowserNode)) { handle(!e.shiftKey && key === VK.UP, preBrowserNode, e); } }, 0); } } ed.onKeyDown.add(moveSelection); } // Fixes an issue on Gecko where it's impossible to place the caret behind a table // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled if (!tinymce.isIE) { function fixTableCaretPos() { var last; // Skip empty text nodes form the end for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ; if (last && last.nodeName == 'TABLE') ed.dom.add(ed.getBody(), 'p', null, '
        '); }; // Fixes an bug where it's impossible to place the caret before a table in Gecko // this fix solves it by detecting when the caret is at the beginning of such a table // and then manually moves the caret infront of the table if (tinymce.isGecko) { ed.onKeyDown.add(function(ed, e) { var rng, table, dom = ed.dom; // On gecko it's not possible to place the caret before a table if (e.keyCode == 37 || e.keyCode == 38) { rng = ed.selection.getRng(); table = dom.getParent(rng.startContainer, 'table'); if (table && ed.getBody().firstChild == table) { if (isAtStart(rng, table)) { rng = dom.createRng(); rng.setStartBefore(table); rng.setEndBefore(table); ed.selection.setRng(rng); e.preventDefault(); } } } }); } ed.onKeyUp.add(fixTableCaretPos); ed.onSetContent.add(fixTableCaretPos); ed.onVisualAid.add(fixTableCaretPos); ed.onPreProcess.add(function(ed, o) { var last = o.node.lastChild; if (last && last.childNodes.length == 1 && last.firstChild.nodeName == 'BR' && last.previousSibling && last.previousSibling.nodeName == "TABLE") ed.dom.remove(last); }); /** * Fixes bug in Gecko where shift-enter in table cell does not place caret on new line */ if (tinymce.isGecko) { ed.onKeyDown.add(function(ed, e) { if (e.keyCode === tinymce.VK.ENTER && e.shiftKey) { var node = ed.selection.getRng().startContainer; var tableCell = dom.getParent(node, 'td,th'); if (tableCell) { var zeroSizedNbsp = ed.getDoc().createTextNode("\uFEFF"); dom.insertAfter(zeroSizedNbsp, node); } } }); } fixTableCaretPos(); ed.startContent = ed.getContent({format : 'raw'}); } }); // Register action commands each({ mceTableSplitCells : function(grid) { grid.split(); }, mceTableMergeCells : function(grid) { var rowSpan, colSpan, cell; cell = ed.dom.getParent(ed.selection.getNode(), 'th,td'); if (cell) { rowSpan = cell.rowSpan; colSpan = cell.colSpan; } if (!ed.dom.select('td.mceSelected,th.mceSelected').length) { winMan.open({ url : url + '/merge_cells.htm', width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)), height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)), inline : 1 }, { rows : rowSpan, cols : colSpan, onaction : function(data) { grid.merge(cell, data.cols, data.rows); }, plugin_url : url }); } else grid.merge(); }, mceTableInsertRowBefore : function(grid) { grid.insertRow(true); }, mceTableInsertRowAfter : function(grid) { grid.insertRow(); }, mceTableInsertColBefore : function(grid) { grid.insertCol(true); }, mceTableInsertColAfter : function(grid) { grid.insertCol(); }, mceTableDeleteCol : function(grid) { grid.deleteCols(); }, mceTableDeleteRow : function(grid) { grid.deleteRows(); }, mceTableCutRow : function(grid) { clipboardRows = grid.cutRows(); }, mceTableCopyRow : function(grid) { clipboardRows = grid.copyRows(); }, mceTablePasteRowBefore : function(grid) { grid.pasteRows(clipboardRows, true); }, mceTablePasteRowAfter : function(grid) { grid.pasteRows(clipboardRows); }, mceTableDelete : function(grid) { grid.deleteTable(); } }, function(func, name) { ed.addCommand(name, function() { var grid = createTableGrid(); if (grid) { func(grid); ed.execCommand('mceRepaint'); cleanup(); } }); }); // Register dialog commands each({ mceInsertTable : function(val) { winMan.open({ url : url + '/table.htm', width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)), height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)), inline : 1 }, { plugin_url : url, action : val ? val.action : 0 }); }, mceTableRowProps : function() { winMan.open({ url : url + '/row.htm', width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)), height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)), inline : 1 }, { plugin_url : url }); }, mceTableCellProps : function() { winMan.open({ url : url + '/cell.htm', width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)), height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)), inline : 1 }, { plugin_url : url }); } }, function(func, name) { ed.addCommand(name, function(ui, val) { func(val); }); }); } }); // Register plugin tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin); })(tinymce); plugins/table/merge_cells.htm000066600000002704150472426320012323 0ustar00 {#table_dlg.merge_cells_title}
        {#table_dlg.merge_cells_title}
        :
        :
        plugins/template/css/template.css000066600000000374150472426320013172 0ustar00#frmbody { padding: 10px; background-color: #FFF; border: 1px solid #CCC; } .frmRow { margin-bottom: 10px; } #templatesrc { border: none; width: 320px; height: 240px; } .title { padding-bottom: 5px; } .mceActionPanel { padding-top: 5px; } plugins/template/editor_plugin.js000066600000006346150472426320013264 0ustar00(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length'); }, init : function() { var ed = tinyMCEPopup.editor, tsrc, sel, x, u; tsrc = ed.getParam("template_templates", false); sel = document.getElementById('tpath'); // Setup external template list if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') { for (x=0, tsrc = []; x'); }); }, selectTemplate : function(u, ti) { var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc; if (!u) return; d.body.innerHTML = this.templateHTML = this.getFileContents(u); for (x=0; x blank_page plugins/template/template.htm000066600000002602150472426320012376 0ustar00 {#template_dlg.title}
        {#template_dlg.desc}
        {#template_dlg.preview}
        plugins/template/langs/ru_dlg.js000066600000004552150472426320012775 0ustar00tinyMCE.addI18n('ru.template_dlg',{ title:"\u0428\u0430\u0431\u043B\u043E\u043D\u044B", label:"\u0428\u0430\u0431\u043B\u043E\u043D", desc_label:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0448\u0430\u0431\u043B\u043E\u043D\u043D\u044B\u0439 \u043A\u043E\u043D\u0442\u0435\u043D\u0442", select:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043B\u043E\u043D", preview:"\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440", warning:"\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u0448\u0430\u0431\u043B\u043E\u043D\u0430 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0439 \u043C\u043E\u0436\u0435\u0442 \u043F\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043A \u043F\u043E\u0442\u0435\u0440\u044F\u043C \u0434\u0430\u043D\u043D\u044B\u0445", mdate_format:"% Y-% m-% d% H:% M:% S", cdate_format:"% Y-% m-% d% H:% M:% S", months_long:"\u044F\u043D\u0432\u0430\u0440\u044C, \u0444\u0435\u0432\u0440\u0430\u043B\u044C, \u043C\u0430\u0440\u0442, \u0430\u043F\u0440\u0435\u043B\u044C, \u043C\u0430\u0439, \u0438\u044E\u043D\u044C, \u0438\u044E\u043B\u044C, \u0430\u0432\u0433\u0443\u0441\u0442, \u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C, \u043E\u043A\u0442\u044F\u0431\u0440\u044C, \u043D\u043E\u044F\u0431\u0440\u044C, \u0434\u0435\u043A\u0430\u0431\u0440\u044C", months_short:"\u044F\u043D\u0432\u0430\u0440\u044C, \u0444\u0435\u0432\u0440\u0430\u043B\u044C, \u043C\u0430\u0440\u0442, \u0430\u043F\u0440\u0435\u043B\u044C, \u043C\u0430\u0439, \u0438\u044E\u043D\u044C, \u0438\u044E\u043B\u044C, \u0430\u0432\u0433\u0443\u0441\u0442, \u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C, \u041E\u043A\u0442\u044F\u0431\u0440\u044C, \u041D\u043E\u044F\u0431\u0440\u044C, \u0414\u0435\u043A\u0430\u0431\u0440\u044C", day_long:"\u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435, \u043F\u043E\u043D\u0435\u0434\u0435\u043B\u044C\u043D\u0438\u043A, \u0432\u0442\u043E\u0440\u043D\u0438\u043A, \u0441\u0440\u0435\u0434\u0430, \u0447\u0435\u0442\u0432\u0435\u0440\u0433, \u043F\u044F\u0442\u043D\u0438\u0446\u0443, \u0441\u0443\u0431\u0431\u043E\u0442\u0443, \u0432\u043E\u0441\u043A\u0440\u0435\u0441\u0435\u043D\u044C\u0435", day_short:"\u0412\u0441, \u041F\u043D, \u0412\u0442, \u0421\u0440, \u0427\u0442, \u041F\u0442, \u0421\u0431, \u0412\u0441" });plugins/template/langs/en_dlg.js000066600000001163150472426320012744 0ustar00tinyMCE.addI18n('en.template_dlg',{title:"Templates",label:"Template","desc_label":"Description",desc:"Insert Predefined Template Content",select:"Select a Template",preview:"Preview",warning:"Warning: Updating a template with a different one may cause data loss.","mdate_format":"%Y-%m-%d %H:%M:%S","cdate_format":"%Y-%m-%d %H:%M:%S","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"});plugins/template/editor_plugin_src.js000066600000011334150472426320014124 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var each = tinymce.each; tinymce.create('tinymce.plugins.TemplatePlugin', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceTemplate', function(ui) { ed.windowManager.open({ file : url + '/template.htm', width : ed.getParam('template_popup_width', 750), height : ed.getParam('template_popup_height', 600), inline : 1 }, { plugin_url : url }); }); ed.addCommand('mceInsertTemplate', t._insertTemplate, t); // Register buttons ed.addButton('template', {title : 'template.desc', cmd : 'mceTemplate'}); ed.onPreProcess.add(function(ed, o) { var dom = ed.dom; each(dom.select('div', o.node), function(e) { if (dom.hasClass(e, 'mceTmpl')) { each(dom.select('*', e), function(e) { if (dom.hasClass(e, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) e.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); }); t._replaceVals(e); } }); }); }, getInfo : function() { return { longname : 'Template plugin', author : 'Moxiecode Systems AB', authorurl : 'http://www.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, _insertTemplate : function(ui, v) { var t = this, ed = t.editor, h, el, dom = ed.dom, sel = ed.selection.getContent(); h = v.content; each(t.editor.getParam('template_replace_values'), function(v, k) { if (typeof(v) != 'function') h = h.replace(new RegExp('\\{\\$' + k + '\\}', 'g'), v); }); el = dom.create('div', null, h); // Find template element within div n = dom.select('.mceTmpl', el); if (n && n.length > 0) { el = dom.create('div', null); el.appendChild(n[0].cloneNode(true)); } function hasClass(n, c) { return new RegExp('\\b' + c + '\\b', 'g').test(n.className); }; each(dom.select('*', el), function(n) { // Replace cdate if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|'))) n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format"))); // Replace mdate if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|'))) n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format"))); // Replace selection if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|'))) n.innerHTML = sel; }); t._replaceVals(el); ed.execCommand('mceInsertContent', false, el.innerHTML); ed.addVisual(); }, _replaceVals : function(e) { var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values'); each(dom.select('*', e), function(e) { each(vl, function(v, k) { if (dom.hasClass(e, k)) { if (typeof(vl[k]) == 'function') vl[k](e); } }); }); }, _getDateTime : function(d, fmt) { if (!fmt) return ""; function addZeros(value, len) { var i; value = "" + value; if (value.length < len) { for (i=0; i<(len-value.length); i++) value = "0" + value; } return value; } fmt = fmt.replace("%D", "%m/%d/%y"); fmt = fmt.replace("%r", "%I:%M:%S %p"); fmt = fmt.replace("%Y", "" + d.getFullYear()); fmt = fmt.replace("%y", "" + d.getYear()); fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2)); fmt = fmt.replace("%d", addZeros(d.getDate(), 2)); fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2)); fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2)); fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2)); fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1)); fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM")); fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]); fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]); fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]); fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]); fmt = fmt.replace("%%", "%"); return fmt; } }); // Register plugin tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin); })();plugins/paste/editor_plugin.js000066600000032214150472426320012556 0ustar00(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"combined",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:o.encode(r).replace(/\r?\n/g,"
        ")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u="

        "+o.encode(r).replace(/\r?\n\r?\n/g,"

        ").replace(/\r?\n/g,"
        ")+"

        "}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9&&/<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(e.content)){d([[/(?:
         [\s\r\n]+|
        )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
         [\s\r\n]+|
        )*/g,"$1"]]);d([[/

        /g,"

        "],[/
        /g," "],[/

        /g,"
        "]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/

        ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"

        $1

        ")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,"

        "],[/<\/h[1-6][^>]*>/gi,"

        "]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(g){var d=this.editor,e=b(d,"paste_text_linebreaktype"),i=b(d,"paste_text_replacements"),f=tinymce.is;function h(j){c(j,function(k){if(k.constructor==RegExp){g=g.replace(k,"")}else{g=g.replace(k[0],k[1])}})}if((typeof(g)==="string")&&(g.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(g)){h([/[\n\r]+/g])}else{h([/\r+/g])}h([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"]]);g=d.dom.decode(tinymce.html.Entities.encodeRaw(g));if(f(i,"array")){h(i)}else{if(f(i,"string")){h(new RegExp(i,"gi"))}}if(e=="none"){h([[/\n+/g," "]])}else{if(e=="br"){h([[/\n/g,"
        "]])}else{if(e=="p"){h([[/\n+/g,"

        "],[/^(.*<\/p>)(

        )$/,"

        $1"]])}else{h([[/\n\n/g,"

        "],[/^(.*<\/p>)(

        )$/,"

        $1"],[/\n/g,"
        "]])}}}d.execCommand("mceInsertContent",false,g)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();plugins/paste/js/pasteword.js000066600000003074150472426320012340 0ustar00tinyMCEPopup.requireLangPack(); var PasteWordDialog = { init : function() { var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = ''; // Create iframe el.innerHTML = ''; ifr = document.getElementById('iframe'); doc = ifr.contentWindow.document; // Force absolute CSS urls css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")]; css = css.concat(tinymce.explode(ed.settings.content_css) || []); tinymce.each(css, function(u) { cssHTML += ''; }); // Write content into iframe doc.open(); doc.write('' + cssHTML + ''); doc.close(); doc.designMode = 'on'; this.resize(); window.setTimeout(function() { ifr.contentWindow.focus(); }, 10); }, insert : function() { var h = document.getElementById('iframe').contentWindow.document.body.innerHTML; tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true}); tinyMCEPopup.close(); }, resize : function() { var vp = tinyMCEPopup.dom.getViewPort(window), el; el = document.getElementById('iframe'); if (el) { el.style.width = (vp.w - 20) + 'px'; el.style.height = (vp.h - 90) + 'px'; } } }; tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog); plugins/paste/js/pastetext.js000066600000001520150472426320012343 0ustar00tinyMCEPopup.requireLangPack(); var PasteTextDialog = { init : function() { this.resize(); }, insert : function() { var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines; // Convert linebreaks into paragraphs if (document.getElementById('linebreaks').checked) { lines = h.split(/\r?\n/); if (lines.length > 1) { h = ''; tinymce.each(lines, function(row) { h += '

        ' + row + '

        '; }); } } tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h}); tinyMCEPopup.close(); }, resize : function() { var vp = tinyMCEPopup.dom.getViewPort(window), el; el = document.getElementById('content'); el.style.width = (vp.w - 20) + 'px'; el.style.height = (vp.h - 90) + 'px'; } }; tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog); plugins/paste/pastetext.htm000066600000002237150472426320012111 0ustar00 {#paste.paste_text_desc}
        {#paste.paste_text_desc}

        {#paste_dlg.text_title}
        plugins/paste/pasteword.htm000066600000001372150472426320012077 0ustar00 {#paste.paste_word_desc}
        {#paste.paste_word_desc}
        {#paste_dlg.word_title}
        plugins/paste/langs/ru_dlg.js000066600000001167150472426320012275 0ustar00tinyMCE.addI18n('ru.paste_dlg',{ text_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL + V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E", text_linebreaks:"\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044B \u0441\u0442\u0440\u043E\u043A", word_title:"\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 CTRL + V \u0434\u043B\u044F \u0432\u0441\u0442\u0430\u0432\u043A\u0438 \u0442\u0435\u043A\u0441\u0442\u0430 \u0432 \u043E\u043A\u043D\u043E" });plugins/paste/langs/en_dlg.js000066600000000342150472426320012243 0ustar00tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});plugins/paste/editor_plugin_src.js000066600000072723150472426320013436 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var each = tinymce.each, defs = { paste_auto_cleanup_on_paste : true, paste_enable_default_filters : true, paste_block_drop : false, paste_retain_style_properties : "none", paste_strip_class_attributes : "mso", paste_remove_spans : false, paste_remove_styles : false, paste_remove_styles_if_webkit : true, paste_convert_middot_lists : true, paste_convert_headers_to_strong : false, paste_dialog_width : "450", paste_dialog_height : "400", paste_text_use_dialog : false, paste_text_sticky : false, paste_text_sticky_default : false, paste_text_notifyalways : false, paste_text_linebreaktype : "combined", paste_text_replacements : [ [/\u2026/g, "..."], [/[\x93\x94\u201c\u201d]/g, '"'], [/[\x60\x91\x92\u2018\u2019]/g, "'"] ] }; function getParam(ed, name) { return ed.getParam(name, defs[name]); } tinymce.create('tinymce.plugins.PastePlugin', { init : function(ed, url) { var t = this; t.editor = ed; t.url = url; // Setup plugin events t.onPreProcess = new tinymce.util.Dispatcher(t); t.onPostProcess = new tinymce.util.Dispatcher(t); // Register default handlers t.onPreProcess.add(t._preProcess); t.onPostProcess.add(t._postProcess); // Register optional preprocess handler t.onPreProcess.add(function(pl, o) { ed.execCallback('paste_preprocess', pl, o); }); // Register optional postprocess t.onPostProcess.add(function(pl, o) { ed.execCallback('paste_postprocess', pl, o); }); ed.onKeyDown.addToTop(function(ed, e) { // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) return false; // Stop other listeners }); // Initialize plain text flag ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default'); // This function executes the process handlers and inserts the contents // force_rich overrides plain text mode set by user, important for pasting with execCommand function process(o, force_rich) { var dom = ed.dom, rng; // Execute pre process handlers t.onPreProcess.dispatch(t, o); // Create DOM structure o.node = dom.create('div', 0, o.content); // If pasting inside the same element and the contents is only one block // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element if (tinymce.isGecko) { rng = ed.selection.getRng(true); if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) { // Is only one block node and it doesn't contain word stuff if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1) dom.remove(o.node.firstChild, true); } } // Execute post process handlers t.onPostProcess.dispatch(t, o); // Serialize content o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''}); // Plain text option active? if ((!force_rich) && (ed.pasteAsPlainText)) { t._insertPlainText(o.content); if (!getParam(ed, "paste_text_sticky")) { ed.pasteAsPlainText = false; ed.controlManager.setActive("pastetext", false); } } else { t._insert(o.content); } } // Add command for external usage ed.addCommand('mceInsertClipboardContent', function(u, o) { process(o, true); }); if (!getParam(ed, "paste_text_use_dialog")) { ed.addCommand('mcePasteText', function(u, v) { var cookie = tinymce.util.Cookie; ed.pasteAsPlainText = !ed.pasteAsPlainText; ed.controlManager.setActive('pastetext', ed.pasteAsPlainText); if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) { if (getParam(ed, "paste_text_sticky")) { ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky')); } else { ed.windowManager.alert(ed.translate('paste.plaintext_mode')); } if (!getParam(ed, "paste_text_notifyalways")) { cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31)) } } }); } ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'}); ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'}); // This function grabs the contents from the clipboard by adding a // hidden div and placing the caret inside it and after the browser paste // is done it grabs that contents and processes that function grabContent(e) { var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent; // Check if browser supports direct plaintext access if (e.clipboardData || dom.doc.dataTransfer) { textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text'); if (ed.pasteAsPlainText) { e.preventDefault(); process({content : dom.encode(textContent).replace(/\r?\n/g, '
        ')}); return; } } if (dom.get('_mcePaste')) return; // Create container to paste into n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF'); // If contentEditable mode we need to find out the position of the closest element if (body != ed.getDoc().body) posY = dom.getPos(ed.selection.getStart(), body).y; else posY = body.scrollTop + dom.getViewPort(ed.getWin()).y; // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles // If also needs to be in view on IE or the paste would fail dom.setStyles(n, { position : 'absolute', left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div top : posY - 25, width : 1, height : 1, overflow : 'hidden' }); if (tinymce.isIE) { // Store away the old range oldRng = sel.getRng(); // Select the container rng = dom.doc.body.createTextRange(); rng.moveToElementText(n); rng.execCommand('Paste'); // Remove container dom.remove(n); // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due // to IE security settings so we pass the junk though better than nothing right if (n.innerHTML === '\uFEFF\uFEFF') { ed.execCommand('mcePasteWord'); e.preventDefault(); return; } // Restore the old range and clear the contents before pasting sel.setRng(oldRng); sel.setContent(''); // For some odd reason we need to detach the the mceInsertContent call from the paste event // It's like IE has a reference to the parent element that you paste in and the selection gets messed up // when it tries to restore the selection setTimeout(function() { // Process contents process({content : n.innerHTML}); }, 0); // Block the real paste event return tinymce.dom.Event.cancel(e); } else { function block(e) { e.preventDefault(); }; // Block mousedown and click to prevent selection change dom.bind(ed.getDoc(), 'mousedown', block); dom.bind(ed.getDoc(), 'keydown', block); or = ed.selection.getRng(); // Move select contents inside DIV n = n.firstChild; rng = ed.getDoc().createRange(); rng.setStart(n, 0); rng.setEnd(n, 2); sel.setRng(rng); // Wait a while and grab the pasted contents window.setTimeout(function() { var h = '', nl; // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit if (!dom.select('div.mcePaste > div.mcePaste').length) { nl = dom.select('div.mcePaste'); // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string each(nl, function(n) { var child = n.firstChild; // WebKit inserts a DIV container with lots of odd styles if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { dom.remove(child, 1); } // Remove apply style spans each(dom.select('span.Apple-style-span', n), function(n) { dom.remove(n, 1); }); // Remove bogus br elements each(dom.select('br[data-mce-bogus]', n), function(n) { dom.remove(n); }); // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV if (n.parentNode.className != 'mcePaste') h += n.innerHTML; }); } else { // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same h = '

        ' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '

        ').replace(/\r?\n/g, '
        ') + '

        '; } // Remove the nodes each(dom.select('div.mcePaste'), function(n) { dom.remove(n); }); // Restore the old selection if (or) sel.setRng(or); process({content : h}); // Unblock events ones we got the contents dom.unbind(ed.getDoc(), 'mousedown', block); dom.unbind(ed.getDoc(), 'keydown', block); }, 0); } } // Check if we should use the new auto process method if (getParam(ed, "paste_auto_cleanup_on_paste")) { // Is it's Opera or older FF use key handler if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) { ed.onKeyDown.addToTop(function(ed, e) { if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45)) grabContent(e); }); } else { // Grab contents on paste event on Gecko and WebKit ed.onPaste.addToTop(function(ed, e) { return grabContent(e); }); } } ed.onInit.add(function() { ed.controlManager.setActive("pastetext", ed.pasteAsPlainText); // Block all drag/drop events if (getParam(ed, "paste_block_drop")) { ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) { e.preventDefault(); e.stopPropagation(); return false; }); } }); // Add legacy support t._legacySupport(); }, getInfo : function() { return { longname : 'Paste text/word', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, _preProcess : function(pl, o) { var ed = this.editor, h = o.content, grep = tinymce.grep, explode = tinymce.explode, trim = tinymce.trim, len, stripClass; //console.log('Before preprocess:' + o.content); function process(items) { each(items, function(v) { // Remove or replace if (v.constructor == RegExp) h = h.replace(v, ''); else h = h.replace(v[0], v[1]); }); } if (ed.settings.paste_enable_default_filters == false) { return; } // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser if (tinymce.isIE && document.documentMode >= 9 && /<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(o.content)) { // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser process([[/(?:
         [\s\r\n]+|
        )*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
         [\s\r\n]+|
        )*/g, '$1']]); // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break process([ [/

        /g, '

        '], // Replace multiple BR elements with uppercase BR to keep them intact [/
        /g, ' '], // Replace single br elements with space since they are word wrap BR:s [/

        /g, '
        '] // Replace back the double brs but into a single BR ]); } // Detect Word content and process it more aggressive if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) { o.wordContent = true; // Mark the pasted contents as word specific content //console.log('Word contents detected.'); // Process away some basic content process([ /^\s*( )+/gi, //   entities at the start of contents /( |]*>)+\s*$/gi //   entities at the end of contents ]); if (getParam(ed, "paste_convert_headers_to_strong")) { h = h.replace(/

        ]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "

        $1

        "); } if (getParam(ed, "paste_convert_middot_lists")) { process([ [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF) ]); } process([ // Word comments like conditional comments etc //gi, // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi, // Convert into for line-though [/<(\/?)s>/gi, "<$1strike>"], // Replace nsbp entites to char since it's easier to handle [/ /gi, "\u00a0"] ]); // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag. // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot. do { len = h.length; h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1"); } while (len != h.length); // Remove all spans if no styles is to be retained if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) { h = h.replace(/<\/?span[^>]*>/gi, ""); } else { // We're keeping styles, so at least clean them up. // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx process([ // Convert ___ to string of alternating breaking/non-breaking spaces of same length [/([\s\u00a0]*)<\/span>/gi, function(str, spaces) { return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : ""; } ], // Examine all styles: delete junk, transform some, and keep the rest [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi, function(str, tag, style) { var n = [], i = 0, s = explode(trim(style).replace(/"/gi, "'"), ";"); // Examine each style definition within the tag's style attribute each(s, function(v) { var name, value, parts = explode(v, ":"); function ensureUnits(v) { return v + ((v !== "0") && (/\d$/.test(v)))? "px" : ""; } if (parts.length == 2) { name = parts[0].toLowerCase(); value = parts[1].toLowerCase(); // Translate certain MS Office styles into their CSS equivalents switch (name) { case "mso-padding-alt": case "mso-padding-top-alt": case "mso-padding-right-alt": case "mso-padding-bottom-alt": case "mso-padding-left-alt": case "mso-margin-alt": case "mso-margin-top-alt": case "mso-margin-right-alt": case "mso-margin-bottom-alt": case "mso-margin-left-alt": case "mso-table-layout-alt": case "mso-height": case "mso-width": case "mso-vertical-align-alt": n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value); return; case "horiz-align": n[i++] = "text-align:" + value; return; case "vert-align": n[i++] = "vertical-align:" + value; return; case "font-color": case "mso-foreground": n[i++] = "color:" + value; return; case "mso-background": case "mso-highlight": n[i++] = "background:" + value; return; case "mso-default-height": n[i++] = "min-height:" + ensureUnits(value); return; case "mso-default-width": n[i++] = "min-width:" + ensureUnits(value); return; case "mso-padding-between-alt": n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value); return; case "text-line-through": if ((value == "single") || (value == "double")) { n[i++] = "text-decoration:line-through"; } return; case "mso-zero-height": if (value == "yes") { n[i++] = "display:none"; } return; } // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) { return; } // If it reached this point, it must be a valid CSS style n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case } }); // If style attribute contained any valid styles the re-write it; otherwise delete style attribute. if (i > 0) { return tag + ' style="' + n.join(';') + '"'; } else { return tag; } } ] ]); } } // Replace headers with if (getParam(ed, "paste_convert_headers_to_strong")) { process([ [/]*>/gi, "

        "], [/<\/h[1-6][^>]*>/gi, "

        "] ]); } process([ // Copy paste from Java like Open Office will produce this junk on FF [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, ''] ]); // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso"). // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation. stripClass = getParam(ed, "paste_strip_class_attributes"); if (stripClass !== "none") { function removeClasses(match, g1) { if (stripClass === "all") return ''; var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "), function(v) { return (/^(?!mso)/i.test(v)); } ); return cls.length ? ' class="' + cls.join(" ") + '"' : ''; }; h = h.replace(/ class="([^"]+)"/gi, removeClasses); h = h.replace(/ class=([\-\w]+)/gi, removeClasses); } // Remove spans option if (getParam(ed, "paste_remove_spans")) { h = h.replace(/<\/?span[^>]*>/gi, ""); } //console.log('After preprocess:' + h); o.content = h; }, /** * Various post process items. */ _postProcess : function(pl, o) { var t = this, ed = t.editor, dom = ed.dom, styleProps; if (ed.settings.paste_enable_default_filters == false) { return; } if (o.wordContent) { // Remove named anchors or TOC links each(dom.select('a', o.node), function(a) { if (!a.href || a.href.indexOf('#_Toc') != -1) dom.remove(a, 1); }); if (getParam(ed, "paste_convert_middot_lists")) { t._convertLists(pl, o); } // Process styles styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties // Process only if a string was specified and not equal to "all" or "*" if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) { styleProps = tinymce.explode(styleProps.replace(/^none$/i, "")); // Retains some style properties each(dom.select('*', o.node), function(el) { var newStyle = {}, npc = 0, i, sp, sv; // Store a subset of the existing styles if (styleProps) { for (i = 0; i < styleProps.length; i++) { sp = styleProps[i]; sv = dom.getStyle(el, sp); if (sv) { newStyle[sp] = sv; npc++; } } } // Remove all of the existing styles dom.setAttrib(el, 'style', ''); if (styleProps && npc > 0) dom.setStyles(el, newStyle); // Add back the stored subset of styles else // Remove empty span tags that do not have class attributes if (el.nodeName == 'SPAN' && !el.className) dom.remove(el, true); }); } } // Remove all style information or only specifically on WebKit to avoid the style bug on that browser if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) { each(dom.select('*[style]', o.node), function(el) { el.removeAttribute('style'); el.removeAttribute('data-mce-style'); }); } else { if (tinymce.isWebKit) { // We need to compress the styles on WebKit since if you paste it will become // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles each(dom.select('*', o.node), function(el) { el.removeAttribute('data-mce-style'); }); } } }, /** * Converts the most common bullet and number formats in Office into a real semantic UL/LI list. */ _convertLists : function(pl, o) { var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html; // Convert middot lists into real semantic lists each(dom.select('p', o.node), function(p) { var sib, val = '', type, html, idx, parents; // Get text node value at beginning of paragraph for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling) val += sib.nodeValue; val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0'); // Detect unordered lists look for bullets if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val)) type = 'ul'; // Detect ordered lists 1., a. or ixv. if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val)) type = 'ol'; // Check if node value matches the list pattern: o   if (type) { margin = parseFloat(p.style.marginLeft || 0); if (margin > lastMargin) levels.push(margin); if (!listElm || type != lastType) { listElm = dom.create(type); dom.insertAfter(listElm, p); } else { // Nested list element if (margin > lastMargin) { listElm = li.appendChild(dom.create(type)); } else if (margin < lastMargin) { // Find parent level based on margin value idx = tinymce.inArray(levels, margin); parents = dom.getParents(listElm.parentNode, type); listElm = parents[parents.length - 1 - idx] || listElm; } } // Remove middot or number spans if they exists each(dom.select('span', p), function(span) { var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, ''); // Remove span with the middot or the number if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html)) dom.remove(span); else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html)) dom.remove(span); }); html = p.innerHTML; // Remove middot/list items if (type == 'ul') html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, ''); else html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, ''); // Create li and add paragraph data into the new li li = listElm.appendChild(dom.create('li', 0, html)); dom.remove(p); lastMargin = margin; lastType = type; } else listElm = lastMargin = 0; // End list element }); // Remove any left over makers html = o.node.innerHTML; if (html.indexOf('__MCE_ITEM__') != -1) o.node.innerHTML = html.replace(/__MCE_ITEM__/g, ''); }, /** * Inserts the specified contents at the caret position. */ _insert : function(h, skip_undo) { var ed = this.editor, r = ed.selection.getRng(); // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells. if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer) ed.getDoc().execCommand('Delete', false, null); ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo}); }, /** * Instead of the old plain text method which tried to re-create a paste operation, the * new approach adds a plain text mode toggle switch that changes the behavior of paste. * This function is passed the same input that the regular paste plugin produces. * It performs additional scrubbing and produces (and inserts) the plain text. * This approach leverages all of the great existing functionality in the paste * plugin, and requires minimal changes to add the new functionality. * Speednet - June 2009 */ _insertPlainText : function(content) { var ed = this.editor, linebr = getParam(ed, "paste_text_linebreaktype"), rl = getParam(ed, "paste_text_replacements"), is = tinymce.is; function process(items) { each(items, function(v) { if (v.constructor == RegExp) content = content.replace(v, ""); else content = content.replace(v[0], v[1]); }); }; if ((typeof(content) === "string") && (content.length > 0)) { // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) { process([ /[\n\r]+/g ]); } else { // Otherwise just get rid of carriage returns (only need linefeeds) process([ /\r+/g ]); } process([ [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them [/]*>|<\/tr>/gi, "\n"], // Single linebreak for
        tags and table rows [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*) [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],// Cool little RegExp deletes whitespace around linebreak chars. [/\n{3,}/g, "\n\n"] // Max. 2 consecutive linebreaks ]); content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content)); // Perform default or custom replacements if (is(rl, "array")) { process(rl); } else if (is(rl, "string")) { process(new RegExp(rl, "gi")); } // Treat paragraphs as specified in the config if (linebr == "none") { // Convert all line breaks to space process([ [/\n+/g, " "] ]); } else if (linebr == "br") { // Convert all line breaks to
        process([ [/\n/g, "
        "] ]); } else if (linebr == "p") { // Convert all line breaks to

        ...

        process([ [/\n+/g, "

        "], [/^(.*<\/p>)(

        )$/, '

        $1'] ]); } else { // defaults to "combined" // Convert single line breaks to
        and double line breaks to

        ...

        process([ [/\n\n/g, "

        "], [/^(.*<\/p>)(

        )$/, '

        $1'], [/\n/g, "
        "] ]); } ed.execCommand('mceInsertContent', false, content); } }, /** * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine. */ _legacySupport : function() { var t = this, ed = t.editor; // Register command(s) for backwards compatibility ed.addCommand("mcePasteWord", function() { ed.windowManager.open({ file: t.url + "/pasteword.htm", width: parseInt(getParam(ed, "paste_dialog_width")), height: parseInt(getParam(ed, "paste_dialog_height")), inline: 1 }); }); if (getParam(ed, "paste_text_use_dialog")) { ed.addCommand("mcePasteText", function() { ed.windowManager.open({ file : t.url + "/pastetext.htm", width: parseInt(getParam(ed, "paste_dialog_width")), height: parseInt(getParam(ed, "paste_dialog_height")), inline : 1 }); }); } // Register button for backwards compatibility ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"}); } }); // Register plugin tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin); })(); plugins/preview/editor_plugin.js000066600000002033150472426320013117 0ustar00(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})();plugins/preview/preview.html000066600000001145150472426320012267 0ustar00 {#preview.preview_desc} plugins/preview/jscripts/embed.js000066600000003511150472426320013172 0ustar00/** * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose. */ function writeFlash(p) { writeEmbed( 'D27CDB6E-AE6D-11cf-96B8-444553540000', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', 'application/x-shockwave-flash', p ); } function writeShockWave(p) { writeEmbed( '166B1BCA-3F9C-11CF-8075-444553540000', 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0', 'application/x-director', p ); } function writeQuickTime(p) { writeEmbed( '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B', 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0', 'video/quicktime', p ); } function writeRealMedia(p) { writeEmbed( 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0', 'audio/x-pn-realaudio-plugin', p ); } function writeWindowsMedia(p) { p.url = p.src; writeEmbed( '6BF52A52-394A-11D3-B153-00C04F79FAA6', 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701', 'application/x-mplayer2', p ); } function writeEmbed(cls, cb, mt, p) { var h = '', n; h += ''; h += ' Example of a custom preview page Editor contents:
        plugins/advhr/rule.htm000066600000004474150472426320011034 0ustar00 {#advhr.advhr_desc}
        plugins/advhr/css/advhr.css000066600000000353150472426320011751 0ustar00input.radio {border:1px none #000; background:transparent; vertical-align:middle;} .panel_wrapper div.current {height:80px;} #width {width:50px; vertical-align:middle;} #width2 {width:50px; vertical-align:middle;} #size {width:100px;} plugins/advhr/editor_plugin.js000066600000001517150472426320012550 0ustar00(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})();plugins/advhr/js/rule.js000066600000002377150472426320011274 0ustar00var AdvHRDialog = { init : function(ed) { var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w; w = dom.getAttrib(n, 'width'); f.width.value = w ? parseInt(w) : (dom.getStyle('width') || ''); f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || ''; f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width'); selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px'); }, update : function() { var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = ''; h = 'text

        , then only the styles in the block are recognized, not those in the span. When selecting text that includes multiple blocks at the same level (peers), this plug-in accumulates the specified styles in all of the surrounding blocks and populates the dialogue checkboxes accordingly. There is no differentiation between styles set in all the blocks versus styles set in some of the blocks. When the [Update] or [Apply] buttons are pressed, the styles selected in the checkboxes are applied to all blocks that surround the selected text. plugins/style/css/props.css000066600000001573150472426320012051 0ustar00#text_font {width:250px;} #text_size {width:70px;} .mceAddSelectValue {background:#DDD;} select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;} #box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;} #positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;} #positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;} .panel_toggle_insert_span {padding-top:10px;} .panel_wrapper div.current {padding-top:10px;height:230px;} .delim {border-left:1px solid gray;} .tdelim {border-bottom:1px solid gray;} #block_display {width:145px;} #list_type {width:115px;} .disabled {background:#EEE;}plugins/style/editor_plugin.js000066600000002135150472426320012601 0ustar00(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){var c=false;var f=a.selection.getSelectedBlocks();var d=[];if(f.length===1){d.push(a.selection.getNode().style.cssText)}else{tinymce.each(f,function(g){d.push(a.dom.getAttrib(g,"style"))});c=true}a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:340+parseInt(a.getLang("style.delta_height",0)),inline:1},{applyStyleToBlocks:c,plugin_url:b,styles:d})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})();plugins/style/js/props.js000066600000075636150472426320011534 0ustar00tinyMCEPopup.requireLangPack(); var defaultFonts = "" + "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + "Courier New, Courier, mono=Courier New, Courier, mono;" + "Times New Roman, Times, serif=Times New Roman, Times, serif;" + "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif"; var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger"; var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%"; var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%"; var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900"; var defaultTextStyle = "normal;italic;oblique"; var defaultVariant = "normal;small-caps"; var defaultLineHeight = "normal"; var defaultAttachment = "fixed;scroll"; var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y"; var defaultPosH = "left;center;right"; var defaultPosV = "top;center;bottom"; var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom"; var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none"; var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset"; var defaultBorderWidth = "thin;medium;thick"; var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none"; function aggregateStyles(allStyles) { var mergedStyles = {}; tinymce.each(allStyles, function(style) { if (style !== '') { var parsedStyles = tinyMCEPopup.editor.dom.parseStyle(style); for (var name in parsedStyles) { if (parsedStyles.hasOwnProperty(name)) { if (mergedStyles[name] === undefined) { mergedStyles[name] = parsedStyles[name]; } else if (name === 'text-decoration') { if (mergedStyles[name].indexOf(parsedStyles[name]) === -1) { mergedStyles[name] = mergedStyles[name] +' '+ parsedStyles[name]; } } } } } }); return mergedStyles; } var applyActionIsInsert; var existingStyles; function init(ed) { var ce = document.getElementById('container'), h; existingStyles = aggregateStyles(tinyMCEPopup.getWindowArg('styles')); ce.style.cssText = tinyMCEPopup.editor.dom.serializeStyle(existingStyles); applyActionIsInsert = ed.getParam("edit_css_style_insert_span", false); document.getElementById('toggle_insert_span').checked = applyActionIsInsert; h = getBrowserHTML('background_image_browser','background_image','image','advimage'); document.getElementById("background_image_browser").innerHTML = h; document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color'); document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color'); document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top'); document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right'); document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom'); document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left'); fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true); fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true); fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true); fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true); fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true); fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true); fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true); fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true); fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true); fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true); fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true); fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true); fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true); fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true); fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true); fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true); fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true); fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true); fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true); fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true); fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true); fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true); fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true); fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true); fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true); fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true); fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true); fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true); fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true); fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true); fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true); fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true); fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true); fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true); fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true); fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true); fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true); fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true); fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true); fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true); fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true); fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true); fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true); fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true); fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true); fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true); fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true); TinyMCE_EditableSelects.init(); setupFormData(); showDisabledControls(); } function setupFormData() { var ce = document.getElementById('container'), f = document.forms[0], s, b, i; // Setup text fields selectByValue(f, 'text_font', ce.style.fontFamily, true, true); selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true); selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize)); selectByValue(f, 'text_weight', ce.style.fontWeight, true, true); selectByValue(f, 'text_style', ce.style.fontStyle, true, true); selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true); selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight)); selectByValue(f, 'text_case', ce.style.textTransform, true, true); selectByValue(f, 'text_variant', ce.style.fontVariant, true, true); f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color); updateColor('text_color_pick', 'text_color'); f.text_underline.checked = inStr(ce.style.textDecoration, 'underline'); f.text_overline.checked = inStr(ce.style.textDecoration, 'overline'); f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through'); f.text_blink.checked = inStr(ce.style.textDecoration, 'blink'); f.text_none.checked = inStr(ce.style.textDecoration, 'none'); updateTextDecorations(); // Setup background fields f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor); updateColor('background_color_pick', 'background_color'); f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true); selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true); selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true); selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0))); selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true); selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1))); // Setup block fields selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true); selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing)); selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true); selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing)); selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true); selectByValue(f, 'block_text_align', ce.style.textAlign, true, true); f.block_text_indent.value = getNum(ce.style.textIndent); selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent)); selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true); selectByValue(f, 'block_display', ce.style.display, true, true); // Setup box fields f.box_width.value = getNum(ce.style.width); selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width)); f.box_height.value = getNum(ce.style.height); selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height)); selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true); selectByValue(f, 'box_clear', ce.style.clear, true, true); setupBox(f, ce, 'box_padding', 'padding', ''); setupBox(f, ce, 'box_margin', 'margin', ''); // Setup border fields setupBox(f, ce, 'border_style', 'border', 'Style'); setupBox(f, ce, 'border_width', 'border', 'Width'); setupBox(f, ce, 'border_color', 'border', 'Color'); updateColor('border_color_top_pick', 'border_color_top'); updateColor('border_color_right_pick', 'border_color_right'); updateColor('border_color_bottom_pick', 'border_color_bottom'); updateColor('border_color_left_pick', 'border_color_left'); f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value); f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value); f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value); f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value); // Setup list fields selectByValue(f, 'list_type', ce.style.listStyleType, true, true); selectByValue(f, 'list_position', ce.style.listStylePosition, true, true); f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"); // Setup box fields selectByValue(f, 'positioning_type', ce.style.position, true, true); selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true); selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true); f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : ""; f.positioning_width.value = getNum(ce.style.width); selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width)); f.positioning_height.value = getNum(ce.style.height); selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height)); setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']); s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1"); s = s.replace(/,/g, ' '); if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) { f.positioning_clip_top.value = getNum(getVal(s, 0)); selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); f.positioning_clip_right.value = getNum(getVal(s, 1)); selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1))); f.positioning_clip_bottom.value = getNum(getVal(s, 2)); selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2))); f.positioning_clip_left.value = getNum(getVal(s, 3)); selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3))); } else { f.positioning_clip_top.value = getNum(getVal(s, 0)); selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0))); f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value; } // setupBox(f, ce, '', 'border', 'Color'); } function getMeasurement(s) { return s.replace(/^([0-9.]+)(.*)$/, "$2"); } function getNum(s) { if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s)) return s.replace(/[^0-9.]/g, ''); return s; } function inStr(s, n) { return new RegExp(n, 'gi').test(s); } function getVal(s, i) { var a = s.split(' '); if (a.length > 1) return a[i]; return ""; } function setValue(f, n, v) { if (f.elements[n].type == "text") f.elements[n].value = v; else selectByValue(f, n, v, true, true); } function setupBox(f, ce, fp, pr, sf, b) { if (typeof(b) == "undefined") b = ['Top', 'Right', 'Bottom', 'Left']; if (isSame(ce, pr, sf, b)) { f.elements[fp + "_same"].checked = true; setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); f.elements[fp + "_top"].disabled = false; f.elements[fp + "_right"].value = ""; f.elements[fp + "_right"].disabled = true; f.elements[fp + "_bottom"].value = ""; f.elements[fp + "_bottom"].disabled = true; f.elements[fp + "_left"].value = ""; f.elements[fp + "_left"].disabled = true; if (f.elements[fp + "_top_measurement"]) { selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); f.elements[fp + "_left_measurement"].disabled = true; f.elements[fp + "_bottom_measurement"].disabled = true; f.elements[fp + "_right_measurement"].disabled = true; } } else { f.elements[fp + "_same"].checked = false; setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf])); f.elements[fp + "_top"].disabled = false; setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf])); f.elements[fp + "_right"].disabled = false; setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf])); f.elements[fp + "_bottom"].disabled = false; setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf])); f.elements[fp + "_left"].disabled = false; if (f.elements[fp + "_top_measurement"]) { selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf])); selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf])); selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf])); selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf])); f.elements[fp + "_left_measurement"].disabled = false; f.elements[fp + "_bottom_measurement"].disabled = false; f.elements[fp + "_right_measurement"].disabled = false; } } } function isSame(e, pr, sf, b) { var a = [], i, x; if (typeof(b) == "undefined") b = ['Top', 'Right', 'Bottom', 'Left']; if (typeof(sf) == "undefined" || sf == null) sf = ""; a[0] = e.style[pr + b[0] + sf]; a[1] = e.style[pr + b[1] + sf]; a[2] = e.style[pr + b[2] + sf]; a[3] = e.style[pr + b[3] + sf]; for (i=0; i 0 ? s.substring(1) : s; if (f.text_none.checked) s = "none"; ce.style.textDecoration = s; // Build background styles ce.style.backgroundColor = f.background_color.value; ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : ""; ce.style.backgroundRepeat = f.background_repeat.value; ce.style.backgroundAttachment = f.background_attachment.value; if (f.background_hpos.value != "") { s = ""; s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " "; s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : ""); ce.style.backgroundPosition = s; } // Build block styles ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : ""); ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : ""); ce.style.verticalAlign = f.block_vertical_alignment.value; ce.style.textAlign = f.block_text_align.value; ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : ""); ce.style.whiteSpace = f.block_whitespace.value; ce.style.display = f.block_display.value; // Build box styles ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : ""); ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : ""); ce.style.styleFloat = f.box_float.value; ce.style.cssFloat = f.box_float.value; ce.style.clear = f.box_clear.value; if (!f.box_padding_same.checked) { ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : ""); ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : ""); ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : ""); } else ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : ""); if (!f.box_margin_same.checked) { ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : ""); ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : ""); ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : ""); } else ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : ""); // Build border styles if (!f.border_style_same.checked) { ce.style.borderTopStyle = f.border_style_top.value; ce.style.borderRightStyle = f.border_style_right.value; ce.style.borderBottomStyle = f.border_style_bottom.value; ce.style.borderLeftStyle = f.border_style_left.value; } else ce.style.borderStyle = f.border_style_top.value; if (!f.border_width_same.checked) { ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : ""); ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : ""); ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : ""); } else ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : ""); if (!f.border_color_same.checked) { ce.style.borderTopColor = f.border_color_top.value; ce.style.borderRightColor = f.border_color_right.value; ce.style.borderBottomColor = f.border_color_bottom.value; ce.style.borderLeftColor = f.border_color_left.value; } else ce.style.borderColor = f.border_color_top.value; // Build list styles ce.style.listStyleType = f.list_type.value; ce.style.listStylePosition = f.list_position.value; ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : ""; // Build positioning styles ce.style.position = f.positioning_type.value; ce.style.visibility = f.positioning_visibility.value; if (ce.style.width == "") ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : ""); if (ce.style.height == "") ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : ""); ce.style.zIndex = f.positioning_zindex.value; ce.style.overflow = f.positioning_overflow.value; if (!f.positioning_placement_same.checked) { ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : ""); ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : ""); ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : ""); } else { s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : ""); ce.style.top = s; ce.style.right = s; ce.style.bottom = s; ce.style.left = s; } if (!f.positioning_clip_same.checked) { s = "rect("; s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " "; s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " "; s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " "; s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto"); s += ")"; if (s != "rect(auto auto auto auto)") ce.style.clip = s; } else { s = "rect("; t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto"; s += t + " "; s += t + " "; s += t + " "; s += t + ")"; if (s != "rect(auto auto auto auto)") ce.style.clip = s; } ce.style.cssText = ce.style.cssText; } function isNum(s) { return new RegExp('[0-9]+', 'g').test(s); } function showDisabledControls() { var f = document.forms, i, a; for (i=0; i 1) { addSelectValue(f, s, p[0], p[1]); if (se) selectByValue(f, s, p[1]); } else { addSelectValue(f, s, p[0], p[0]); if (se) selectByValue(f, s, p[0]); } } } function toggleSame(ce, pre) { var el = document.forms[0].elements, i; if (ce.checked) { el[pre + "_top"].disabled = false; el[pre + "_right"].disabled = true; el[pre + "_bottom"].disabled = true; el[pre + "_left"].disabled = true; if (el[pre + "_top_measurement"]) { el[pre + "_top_measurement"].disabled = false; el[pre + "_right_measurement"].disabled = true; el[pre + "_bottom_measurement"].disabled = true; el[pre + "_left_measurement"].disabled = true; } } else { el[pre + "_top"].disabled = false; el[pre + "_right"].disabled = false; el[pre + "_bottom"].disabled = false; el[pre + "_left"].disabled = false; if (el[pre + "_top_measurement"]) { el[pre + "_top_measurement"].disabled = false; el[pre + "_right_measurement"].disabled = false; el[pre + "_bottom_measurement"].disabled = false; el[pre + "_left_measurement"].disabled = false; } } showDisabledControls(); } function synch(fr, to) { var f = document.forms[0]; f.elements[to].value = f.elements[fr].value; if (f.elements[fr + "_measurement"]) selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value); } function updateTextDecorations(){ var el = document.forms[0].elements; var textDecorations = ["text_underline", "text_overline", "text_linethrough", "text_blink"]; var noneChecked = el["text_none"].checked; tinymce.each(textDecorations, function(id) { el[id].disabled = noneChecked; if (noneChecked) { el[id].checked = false; } }); } tinyMCEPopup.onInit.add(init); plugins/style/props.htm000066600000111421150472426320011253 0ustar00 {#style_dlg.title}
        {#style_dlg.text}
         
         
         
        {#style_dlg.text_decoration}
        {#style_dlg.background}
         
         
         
         
        {#style_dlg.block}
         
         
         
        {#style_dlg.box}
         
           
         
           
        {#style_dlg.padding}
         
         
         
         
         
        {#style_dlg.margin}
         
         
         
         
         

        {#style_dlg.border}
            {#style_dlg.style}   {#style_dlg.width}   {#style_dlg.color}
               
        {#style_dlg.top}    
         
         
         
        {#style_dlg.right}    
         
         
         
        {#style_dlg.bottom}    
         
         
         
        {#style_dlg.left}    
         
         
         
        {#style_dlg.list}
        {#style_dlg.position}
           
         
           
         
           
        {#style_dlg.placement}
         
        {#style_dlg.top}
         
        {#style_dlg.right}
         
        {#style_dlg.bottom}
         
        {#style_dlg.left}
         
        {#style_dlg.clip}
         
        {#style_dlg.top}
         
        {#style_dlg.right}
         
        {#style_dlg.bottom}
         
        {#style_dlg.left}
         

        plugins/style/langs/ru_dlg.js000066600000007040150472426320012315 0ustar00tinyMCE.addI18n('ru.style_dlg',{ title:"\u0420\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 CSS \u0441\u0442\u0438\u043B\u044F", apply:"\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C", text_tab:"\u0422\u0435\u043A\u0441\u0442", background_tab:"\u0424\u043E\u043D", block_tab:"\u0411\u043B\u043E\u043A", box_tab:"Box", border_tab:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430", list_tab:"\u0421\u043F\u0438\u0441\u043E\u043A", positioning_tab:"\u041F\u043E\u0437\u0438\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435", text_props:"\u0422\u0435\u043A\u0441\u0442", text_font:"\u0428\u0440\u0438\u0444\u0442", text_size:"\u0420\u0430\u0437\u043C\u0435\u0440", text_weight:"\u0422\u043E\u043B\u0449\u0438\u043D\u0430", text_style:"\u0421\u0442\u0438\u043B\u044C", text_variant:"Variant", text_lineheight:"\u0412\u044B\u0441\u043E\u0442\u0430 \u0441\u0442\u0440\u043E\u043A\u0438", text_case:"Case", text_color:"\u0426\u0432\u0435\u0442", text_decoration:"\u041E\u0444\u043E\u0440\u043C\u043B\u0435\u043D\u0438\u0435", text_overline:"\u0432\u0435\u0440\u0445\u043D\u044F\u044F \u0447\u0435\u0440\u0442\u0430", text_underline:"\u043D\u0438\u0436\u043D\u044F\u044F \u0447\u0435\u0440\u0442\u0430", text_striketrough:"\u0437\u0430\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439", text_blink:"\u043C\u0435\u0440\u0446\u0430\u043D\u0438\u044F", text_none:"\u043D\u0438\u0447\u0435\u0433\u043E", background_color:"\u0426\u0432\u0435\u0442 \u0444\u043E\u043D\u0430", background_image:"\u0424\u043E\u043D\u043E\u0432\u043E\u0435 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", background_repeat:"\u041F\u043E\u0432\u0442\u043E\u0440", background_attachment:"Attachment", background_hpos:"\u0413\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F", background_vpos:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u0430\u044F \u043F\u043E\u0437\u0438\u0446\u0438\u044F", block_wordspacing:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B \u043C\u0435\u0436\u0434\u0443 \u0441\u043B\u043E\u0432\u0430\u043C\u0438", block_letterspacing:"\u041E\u0442\u0441\u0442\u0443\u043F\u044B \u043C\u0435\u0436\u0434\u0443 \u0431\u0443\u043A\u0432\u0430\u043C\u0438", block_vertical_alignment:"\u0412\u0435\u0440\u0442\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", block_text_align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043A\u0441\u0442\u0430", block_text_indent:"Text indent", block_whitespace:"Whitespace", block_display:"Display", box_width:"\u0428\u0438\u0440\u0438\u043D\u0430", box_height:"\u0412\u044B\u0441\u043E\u0442\u0430", box_float:"Float", box_clear:"Clear", padding:"Padding", same:"\u041E\u0434\u0438\u043D\u0430\u043A\u043E\u0432\u043E \u0434\u043B\u044F \u0432\u0441\u0435\u0445", top:"\u0412\u0432\u0435\u0440\u0445", right:"\u0421\u043F\u0440\u0430\u0432\u0430", bottom:"\u0421\u043D\u0438\u0437\u0443", left:"\u0421\u043B\u0435\u0432\u0430", margin:"Margin", style:"\u0421\u0442\u0438\u043B\u044C", width:"\u0428\u0438\u0440\u0438\u043D\u0430", height:"\u0412\u044B\u0441\u043E\u0442\u0430", color:"\u0426\u0432\u0435\u0442", list_type:"\u0422\u0438\u043F", bullet_image:"Bullet image", position:"\u041F\u043E\u0437\u0438\u0446\u0438\u044F", positioning_type:"\u0422\u0438\u043F", visibility:"\u0412\u0438\u0434\u0438\u043C\u043E\u0441\u0442\u044C", zindex:"Z-index", overflow:"Overflow", placement:"Placement", clip:"Clip" });plugins/style/langs/en_dlg.js000066600000003132150472426320012267 0ustar00tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",toggle_insert_span:"Insert span at selection",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"}); plugins/style/editor_plugin_src.js000066600000003500150472426320013445 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.StylePlugin', { init : function(ed, url) { // Register commands ed.addCommand('mceStyleProps', function() { var applyStyleToBlocks = false; var blocks = ed.selection.getSelectedBlocks(); var styles = []; if (blocks.length === 1) { styles.push(ed.selection.getNode().style.cssText); } else { tinymce.each(blocks, function(block) { styles.push(ed.dom.getAttrib(block, 'style')); }); applyStyleToBlocks = true; } ed.windowManager.open({ file : url + '/props.htm', width : 480 + parseInt(ed.getLang('style.delta_width', 0)), height : 340 + parseInt(ed.getLang('style.delta_height', 0)), inline : 1 }, { applyStyleToBlocks : applyStyleToBlocks, plugin_url : url, styles : styles }); }); ed.addCommand('mceSetElementStyle', function(ui, v) { if (e = ed.selection.getNode()) { ed.dom.setAttrib(e, 'style', v); ed.execCommand('mceRepaint'); } }); ed.onNodeChange.add(function(ed, cm, n) { cm.setDisabled('styleprops', n.nodeName === 'BODY'); }); // Register buttons ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'}); }, getInfo : function() { return { longname : 'Style', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin); })(); plugins/example_dependency/editor_plugin.js000066600000000643150472426320015274 0ustar00(function(){tinymce.create("tinymce.plugins.ExampleDependencyPlugin",{init:function(a,b){},getInfo:function(){return{longname:"Example Dependency plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency",version:"1.0"}}});tinymce.PluginManager.add("example_dependency",tinymce.plugins.ExampleDependencyPlugin,["example"])})();plugins/example_dependency/editor_plugin_src.js000066600000003453150472426320016145 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.ExampleDependencyPlugin', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed, url) { }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Example Dependency plugin', author : 'Some author', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency', version : "1.0" }; } }); /** * Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order. * plugins in this list will be initialised when this plugin is initialized. (before the init method is called). * plugins in a depends list should typically be specified using the short name). If neccesary this can be done * with an object which has the url to the plugin and the shortname. */ tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']); })(); plugins/emotions/editor_plugin.js000066600000001244150472426320013276 0ustar00(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce);plugins/emotions/js/emotions.js000066600000002065150472426320012705 0ustar00tinyMCEPopup.requireLangPack(); var EmotionsDialog = { addKeyboardNavigation: function(){ var tableElm, cells, settings; cells = tinyMCEPopup.dom.select("a.emoticon_link", "emoticon_table"); settings ={ root: "emoticon_table", items: cells }; cells[0].tabindex=0; tinyMCEPopup.dom.addClass(cells[0], "mceFocus"); if (tinymce.isGecko) { cells[0].focus(); } else { setTimeout(function(){ cells[0].focus(); }, 100); } tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); }, init : function(ed) { tinyMCEPopup.resizeToInnerSize(); this.addKeyboardNavigation(); }, insert : function(file, title) { var ed = tinyMCEPopup.editor, dom = ed.dom; tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', { src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file, alt : ed.getLang(title), title : ed.getLang(title), border : 0 })); tinyMCEPopup.close(); } }; tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog); plugins/emotions/emotions.htm000066600000013452150472426320012447 0ustar00 {#emotions_dlg.title}
        {#emotions_dlg.title}:

        {#emotions_dlg.usage}
        plugins/emotions/langs/ru_dlg.js000066600000000752150472426320013015 0ustar00tinyMCE.addI18n('ru.emotions_dlg',{ title:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u043C\u0430\u0439\u043B", desc:"\u0421\u043C\u0430\u0439\u043B\u0438\u043A\u0438", 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" });plugins/emotions/langs/en_dlg.js000066600000000644150472426320012771 0ustar00tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",usage:"Use left and right arrows to navigate.",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"}); plugins/emotions/editor_plugin_src.js000066600000002232150472426320014143 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function(tinymce) { tinymce.create('tinymce.plugins.EmotionsPlugin', { init : function(ed, url) { // Register commands ed.addCommand('mceEmotion', function() { ed.windowManager.open({ file : url + '/emotions.htm', width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)), height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)), inline : 1 }, { plugin_url : url }); }); // Register buttons ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'}); }, getInfo : function() { return { longname : 'Emotions', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin); })(tinymce);plugins/emotions/img/smiley-surprised.gif000066600000000522150472426320014655 0ustar00GIF89aƝ(#ʶjNR; Z&2,kS §غ7o7ļF>"RX( ĸD!,@'Pixh:Ti]^* n9$J3s VMw9ZF>2B噚6Ѿ&ӿrx$~!,'TicJn0Q*I041n~( D>tsh8",n0f!$lw2*ۑW]Hm %x%D%opu% Q Y 4  #B  *N!;plugins/emotions/img/smiley-embarassed.gif000066600000000513150472426320014743 0ustar00GIF89a*ļLTԿ( AT«!:l:v[wX87d$|(*=غ$W°bQ!,'RicJj&I*!8ʃtdUn ~$bcA  ǂ@h \T@• L2AN&zxMv  % Cu y %    ] #  J;s B Q *N!;plugins/emotions/img/smiley-wink.gif000066600000000536150472426320013612 0ustar00GIF89a)Ɲ 2ʶjNYdzP: , ,u\Gqغļ6־2Y( :!,@'Ri0Z fk 2JXe4JPHRC"8=#0%qtWCI$ho¢P4V  6 :< 1  F)ts#@MB:,    ..+-15961 w*H`@0T!;plugins/emotions/img/smiley-frown.gif000066600000000524150472426320013772 0ustar00GIF89aA'Ơ2ʶjNXν"7hT -qZA غGīļ7Z"%x`0!,'QicJJ&!E*Y08ԡAA`& 4!x<đ0"FU$Jc&%`..cރ1w~bp  z r r  x% ] ̘ AKGP)DN5!;plugins/emotions/img/smiley-foot-in-mouth.gif000066600000000526150472426320015346 0ustar00GIF89aƖ~ʶj MR: Zѽ1mT +HغoļO'ª60:" 6& 7!,@'Pix6M1C]Xbr xd0B&Ţj21 E"d PwQ=5  9;b   E)sr#? c9,O~ . x. +-58  \ |bT* GB;plugins/emotions/img/smiley-innocent.gif000066600000000520150472426320014450 0ustar00GIF89a8*˭q˱ZU쳏 8wi٫T̵ qN*aK z0-VھB2u"!,'RixeHdbK,R=ɣ !Q<6Ph'0*di;pgP:t|NR RUR}   m _Q w     %ΗQS* P 8) vʶjZj!,'XicJR#@a* y!dQ®~0pAƀ<+ fPer>zြXc| % %q  %       \ { A9;=# ݄5N!;plugins/emotions/img/smiley-kiss.gif000066600000000522150472426320013606 0ustar00GIF89aR= 44sYʶj 2!N*)"mqغ>9)ښļ9ֽ)Y!,'TicJVsRQ*Y!IrT3!x Cp#ʂ!X׫Q*y$0.9@8nH5q}M a}  { /  H    J % S \  A  HJ P) DN 5!;plugins/emotions/img/smiley-cool.gif000066600000000542150472426320013573 0ustar00GIF89a z\V<N:8ѿ#[[WY#!1,//, & ɿbA_z`  !,'UicJRqGBU*ѣiOt`Be]GUZCqn P@~=@pLAx;d@~}{r} hr=       E   %  4  A F M) DK fP(J;plugins/emotions/img/smiley-laughing.gif000066600000000527150472426320014440 0ustar00GIF89a¦2,Nr^HYҾëjSļGغq7uZӺ.ʶj2yc1R= Z!,@'SihHT#OI8], q&Ḛ`8A(1. g02NBIp$:{PW 8s    E)sr# 9, {Q .. 8+45   ~bS*  G\ J;plugins/filemanager/pages/fm/resources.xml000066600000004057150472426320014753 0ustar00 plugins/filemanager/pages/fm/createdir.html000066600000006750150472426320015051 0ustar00 {#createdir.title}

        {#createdir.title}

        {#createdir.description}

        {#createdir.create_in}

        plugins/filemanager/pages/fm/upload.html000066600000017017150472426320014371 0ustar00 {#upload.title}

        {#upload.title}

        {#upload.description}


        {#upload.file} {#upload.size} {#upload.status}

        {#upload.add_more}


        plugins/filemanager/pages/fm/css/forms.css000066600000001416150472426320014643 0ustar00/* Forms */ /* ########################################################## */ form { margin:0px; padding:0px; } select { font:100% tahoma; } input.file, input.text { font:90% tahoma, arial, sans-serif; } /* Submit buttons */ input.submit, .button { width:94px; height:26px; padding:0 0 2px; border:0; background:url('../img/submit-grey.png') no-repeat; font:normal 100%/100% tahoma, arial, sans-serif; text-align: center; text-decoration: none; } .button.disabled { cursor: text; color: gray; } input.default { background:url('../img/submit-default.png') no-repeat; font-weight:bold; } input.cancel { background:url('../img/submit-grey.png') no-repeat; font-weight:normal; } a.button { padding-top: 6px; text-align: center; text-decoration: none; } plugins/filemanager/pages/fm/css/core.css000066600000021216150472426320014445 0ustar00/* Image Manager */ /* core stuff */ /* ########################################################## */ body { background:#fff; color:#000; margin:0 0; padding:0; font:70% arial, helvetica, sans-serif; text-align:center; } body.filelistPage { overflow: hidden; } td { font-size: 11px; } img { behavior:expression(PNG.fix(this)); border:0; } hr { clear:both; border:0; color:#e5e5e5; background-color:#e5e5e5; height:1px; } div { font-size:11px; } /* Lists */ ul { margin:0; padding:0; list-style:none; } ul li { margin:0; padding:0; } /* Layout */ #center { width:auto; max-width:1200px; margin:0 auto; text-align:left; } /* Links */ a { background:transparent; } a:link { color:#000; } a:visited { color:#000; } a:visited:hover { color:#000; } a:hover { color:#000; } a:active { color:#000; } #thearea { position:relative; } #secondarea { position:absolute; left:200px; } /* Page navigation */ /* ########################################################## */ .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0 2px; } /* File Manager */ /* ########################################################## */ .filemanagertop { background:#e8e7e5 url(../img/check_arrow.gif) no-repeat 16px 12px; padding:6px 0px 6px 36px; } .filemanagertop ul, .filemanagertop li { display: inline; } .filemanagertop a, .filemanagertop a:visited, .filemanagertop a:hover { text-decoration:none; color:#3f5f9f; cursor: pointer; } .filemanagertop li.disabled a, .filemanagertop li.disabled a:visited, .filemanagertop li.disabled a:hover { text-decoration:none; color:#999; cursor: text; } .filemanagertop li a:hover { text-decoration:underline; color:#3f5f9f; } .filemanagertop li.hidden { display: none; } .filemanagertop li.end { display: none; } .filelist { font-size:100%; width:100%; } .filelist th { text-align:left; color:#7a92c2; background:#f2f1ee url(../img/filelist-headbg.png) no-repeat right top; padding:8px 8px 6px 8px; } .filelist th.file { background:#fff url(../img/filelist-headbg2.png) no-repeat right top; padding:2px 0px 2px 30px; } .filelist th a, .filelist th a:visited { color:#7a92c2; text-decoration:none; } .filelist th a:hover { color:#3f5f9f; } .filelist td { background:#f2f1ee url(../img/filelist-border.png) repeat-y right top; padding:1px 4px 1px 8px; } .filelist td.file { background-color:#fff; height: 22px; } .filelist td .d { position:relative; } /* hover effect */ .filelist tr.hover td { background-color:#e8e7e5; } /* selected effect */ .filelist tr.selected td { background-color:#ddefff; } /* focused effect */ .filelist tr.focused td { background-color:#ddddff; } /* popup box */ .filelist .edit { position:absolute; left:8px; top:-8px; background:#fff; border:1px solid #959595; padding:2px; text-align:left; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:10; width:12em; } .filelist .edit li a { display:block; padding:1px 4px 1px 20px; text-decoration:none; } .filelist .edit li a:hover { color:#2e4e8c; } .filelist .edit li a.select:hover { background:#e3e0d8; } .filelist .edit li a.download:hover { background:#e3e0d8; } .filelist .edit li a.delete { background:url(../img/im-delete.png) no-repeat; } .filelist .edit li a.delete:hover { background:#e3e0d8 url(../img/im-delete.png) no-repeat; } .filelist .edit li a.preview { background:url(../img/preview.png) no-repeat; } .filelist .edit li a.preview:hover { background:#e3e0d8 url(../img/preview.png) no-repeat; } .filelist .edit li a.info { background:url(../img/im-info.png) no-repeat; } .filelist .edit li a.info:hover { background:#e3e0d8 url(../img/im-info.png) no-repeat; } .filelist tr { height: 22px; } *html .filelist .edit li a { display:inline; width:100%; } .filelist a.checkbox, .filelist .selected a.checkbox { display: block; width: 13px; height: 13px; background: transparent url('../img/checkbox.gif') no-repeat 0 0; margin-left: 4px; overflow: hidden; } /* Rename input */ .filelist input.text { display: block; width: 75%; font-size: 11px; border: 1px solid gray; } .filelist .selected a.checkbox { background: transparent url('../img/checkbox.gif') no-repeat 0 -13px; } .filelist .parent a.checkbox { display: none; } .filelist .checkbox { width: 22px; } #filemanagerlist { overflow: auto; overflow-x: hidden; } /* icons */ .filelist td.file a { padding:2px 0px 2px 22px; text-decoration:none; display: block; background-repeat: no-repeat; behavior:expression(PNG.fix(this)); width: 220px; overflow: hidden; } .filelist a { background-image: url(../img/filetypes/unknown.gif); } /* Display captions */ .icon .caption { display:inline; } .caption-on { font-weight:bold; } .caption-off { color:#666; } /* List container */ #listcontainer { position:relative; } #listing { position: absolute; left: 215px; top: 0px; right: 0; max-width: 980px; padding-right: 20px;} .pagenav { padding:0px 0px 10px 0px; color:#484848; z-index:1; height: 16px; } .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0px 2px; } /* Folder view */ /* ########################################################## */ #folders { margin:-5px 10px 10px 2px; position:absolute; top:0; left:0; width:192px; background:url(../img/folder-middle-bg.png) bottom left; z-index:1; } #folders div.panel {background:url(../img/folder-bottom-bg.png) no-repeat bottom left;} #folders h2 { background:url(../img/folder-top-bg.png) top left; margin:0; padding:20px 10px 10px 10px; font-size:100%; color:#7791c4; } #folders h3 { margin:10px 2px 0px 2px; padding:10px 8px 10px 8px; font-size:100%; color:#7791c4; border-top:1px solid #9ab0d7; } #folders a { text-decoration:none; behavior:expression(PNG.fix(this)); } #folders .categories { margin:0px 6px 0px 10px; } #folders .categories li a { background:url(../img/icons/category-closed.png) no-repeat; padding:2px 2px 0px 24px; display:block; min-height:16px; } #folders .categories li.current a { background:url(../img/icons/category-open.png) no-repeat; font-weight:bold; } #folders .special { margin:5px 6px 0px 10px; } #folders .special li a { padding: 2px 2px 0px 24px; display: block; min-height: 16px; height: 16px; line-height: 16px; } #folders a:hover { color:#2e4e8c; } /* Preview iframe */ #preview { width: 170px; height: 170px; padding: 0px; margin: 0px; background-color: #f2f0ed; visibility: hidden; } #previewwrap { border: 1px solid #9ab0d7; width: 170px; height: 170px; } #previewinfo { overflow: hidden; width: 170px; padding-bottom: 5px;} #filepreview { padding:0px 0px 20px 10px; } #filepreview .actions ul, #filepreview .actions li { display: inline; } #filepreview .actions li.end { display: none; } #filepreview .actions { padding-top: 10px; text-align: center; width: 170px; } #filepreview .actions a { text-decoration:none; color:#3f5f9f; cursor: pointer; } #filepreview .actions a:hover { text-decoration:underline; color:#3f5f9f; } #filepreview .actions .disabled a, #filepreview .actions .disabled a:visited { color:#aaa; text-decoration:none; cursor: text; } #filepreview .actions .disabled a:hover { color: #aaa; text-decoration:none; cursor: text; } #filepreview .actions .hidden { display: none; } /* Sorting */ a.sort { background-image: none; padding: 2px 18px 2px 0px; } a.sortasc { background: url(../img/sortasc.gif) no-repeat top right; padding: 2px 18px 2px 0px; } a.sortdesc { background: url(../img/sortdesc.gif) no-repeat top right; padding: 2px 18px 2px 0px; } /* Edit menu */ /* ########################################################## */ .Menu { position:absolute; left:0; top:0; z-index:10; display:none; background:#eae9e5; border:1px solid #cac6bb; text-align:left; } .Menu li a { display:block; padding:2px 8px; text-decoration:none; } .Menu li a:hover { color:#2e4e8c; } .Menu li.disabled a { color: gray; cursor: text; } .Menu li.disabled a:hover { color: gray; } .Menu li.hidden { display:none; } *html .Menu li a { display:inline; width:auto; } .folder .name, .parent .name { font-weight:bold; } /* Template engine */ /* ########################################################## */ #toolbar.caption span.caption { display: inline; } #tools .hidden { display: none; } #tools li {font-size:11px} /* Validation classes */ label.msg { display:none; } label.invalid { color:#aa0000; display:inline; } input.invalid { background-color:#d63232; } div label.invalid { display:block; } /* Dialog facts */ #facts { height:30px; } /* Progress */ #progress { background: url('../img/loading.gif') no-repeat; padding-left: 20px; } #dirinfo {display:none} plugins/filemanager/pages/fm/css/filetypes.css000066600000002243150472426320015520 0ustar00/* File types */ a.folder { background-image: url(../img/folder.png); } a.parent { background-image: url(../img/icons/up.png); } a.jpg, a.gif, a.bmp, a.tif, a.jpeg, a.png { background-image: url(../img/filetypes/image.gif); } a.html, a.htm, a.php, a.asp, a.aspx, a.jsp, a.cfm { background-image: url(../img/filetypes/html.gif); } a.mov, a.avi, a.wmv, a.rm, a.qt, a.mpg, a.mpeg { background-image: url(../img/filetypes/movie.gif); } a.ppt, a.ppm { background-image: url(../img/filetypes/powerpoint.gif); } a.pdf { background-image: url(../img/filetypes/pdf.gif); } a.txt, a.nfo { background-image: url(../img/filetypes/txt.gif); } a.swf, a.flv { background-image: url(../img/filetypes/swf.gif); } a.doc, a.dot, a.docx { background-image: url(../img/filetypes/word.gif); } a.xls { background-image: url(../img/filetypes/excel.gif); } a.zip, a.rar, a.arj, a.tar, a.tgz, a.gz, a.zoo, a.lha, a.lzh { background-image: url(../img/filetypes/archive.gif); } a.xml, a.xsl, a.xsd, a.dtd { background-image: url(../img/filetypes/xml.gif); } a.mp3, a.mp2, a.aif, a.aiff, a.wav { background-image: url(../img/filetypes/sound.gif); } a.exe, a.com { background-image: url(../img/filetypes/exe.gif); } plugins/filemanager/pages/fm/css/window_clearlooks2.css000066600000026770150472426320017336 0ustar00/* * * clearlooks2 - Gnome theme * * */ .clearlooks2 { position: absolute; left: 20px; top: 20px; width: 320px; height: 240px; overflow: hidden; color: white; display: none; text-align: left; } .clearlooks2_progress { position: absolute; left: 0; top: 0; width: auto; height: 30px; z-index: 100100; display: none; border: 1px solid gray; background: #FFF url('../img/loading.gif') no-repeat 5px 8px; text-align: left; } .clearlooks2_progress .message { padding-left: 30px; padding-right: 10px; font-family: Arial, Verdana; font-weight: bold; line-height: 30px; } .clearlooks2_event_blocker, .clearlooks2_visible_event_blocker { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 100001; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2_visible_event_blocker { opacity:0.7; -ms-filter:'alpha(opacity=70)'; filter:alpha(opacity=70); background: #FFF; } .clearlooks2_placeholder { position: absolute; left: 0; top: 0; border: 1px dotted black; display: none; z-index: 100002; } /* Alert */ .clearlooks2 .alert { text-align: left; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; font-weight: bold; text-decoration: none; } .clearlooks2 .alert .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .bigicon { display: none; } .clearlooks2 .alert .bigicon, .clearlooks2 .confirm .bigicon, .clearlooks2 .status .bigicon { position: absolute; left: 15px; top: 15px; width: 32px; height: 32px; display: block; } .clearlooks2 .alert .info, .clearlooks2 .status .info { background-image: url('../img/clearlooks2/alert_info.gif'); } .clearlooks2 .alert .warning, .clearlooks2 .status .warning { background-image: url('../img/clearlooks2/alert_warn.gif'); } .clearlooks2 .alert .error, .clearlooks2 .status .error { background-image: url('../img/clearlooks2/alert_error.gif'); } .clearlooks2 .alert .message, .clearlooks2 .confirm .message { position: absolute; left: 55px; top: 15px; width: 325px; height: 40px; overflow: auto; } .clearlooks2 .ok, .clearlooks2 .cancel { position: absolute; left: 160px; top: 65px; width: 80px; height: 30px; background-image: url('../img/clearlooks2/button.gif'); text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 30px; font-weight: bold; text-decoration: none; } /* Confirm dialog */ .clearlooks2 .confirm .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .confirm .ok { left: 110px; } .clearlooks2 .confirm .cancel { left: 210px; } .clearlooks2 .confirm .ask { background-image: url('../img/clearlooks2/alert_info.gif'); } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Status dialog */ .clearlooks2 .status .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .status .ok { top: 178px; } .clearlooks2 .status .statustext { position: absolute; left: 10px; top: 8px; width: 360px; height: 150px; border: 1px solid gray; overflow: auto; padding: 5px; } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Chromeless window */ .clearlooks2 .chromeless .resize, .clearlooks2 .chromeless .action, .clearlooks2 .chromeless .statusbarbottom { display: none; } .clearlooks2 .chromeless .middle .action { display: block; } .clearlooks2 .chromeless .windowtop, .clearlooks2 .chromeless .window { height: 5px; } .clearlooks2 .chromeless .windowtop .left { position: absolute; left: 0; top: 0; width: 5px; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_left.gif') no-repeat; } .clearlooks2 .chromeless .windowtop .middle { position: absolute; right: 5px; width: 100%; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_middle.gif') no-repeat 5px 0; clip: rect(auto auto auto 10px); } .clearlooks2 .chromeless .windowtop .right { position: absolute; right: 0; top: 0; width: 5px; height: 5px; background: transparent url('../img/clearlooks2/top_chromeless_right.gif') no-repeat; } .clearlooks2 .chromeless .windowmiddle { top: 5px; } /* Top section */ .clearlooks2 .windowtop .middle-fg { display: none; } .clearlooks2 .windowtop { position: absolute; width: 100%; height: 23px; overflow: hidden; } .clearlooks2 .windowtop .left { position: absolute; left: 0; top: 0; width: 6px; height: 23px; background: transparent url('../img/clearlooks2/top_left.gif') no-repeat; } .clearlooks2 .windowtop .middle { position: absolute; right: 6px; width: 100%; height: 23px; background: transparent url('../img/clearlooks2/top_middle.gif') no-repeat 12px 0; clip: rect(auto auto auto 12px); /* Safari hack */ } .clearlooks2 .windowtop .right { position: absolute; right: 0; top: 0; width: 6px; height: 23px; background: transparent url('../img/clearlooks2/top_right.gif') no-repeat; } .clearlooks2 .windowtop .title { position: absolute; left: 0; top: 0; width: 100%; height: 19px; text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; font-weight: bold; } /* Top section - Focus */ .clearlooks2 .focustop .left { background: transparent url('../img/clearlooks2/top_left.gif') no-repeat -6px 0; } .clearlooks2 .focustop .middle { background: transparent url('../img/clearlooks2/top_middle.gif') no-repeat 12px -23px; } .clearlooks2 .focustop .right { background: transparent url('../img/clearlooks2/top_right.gif') no-repeat -6px 0; } .clearlooks2 .focus .title { color: #FFF; } /* Middle section */ .clearlooks2 .windowmiddle { position: absolute; top: 23px; width: 100%; z-index: 5; } .clearlooks2 .windowmiddle .left { position: absolute; left: 0; top: 0; width: 4px; height: 100%; background-image: url('../img/clearlooks2/middle_left.gif'); } .clearlooks2 .windowmiddle .middle { position: absolute; left: 4px; top: 0; width: 100%; height: 100%; background-color: #FFF; color: #000; } .clearlooks2 .windowmiddle .right { position: absolute; right: 0; top: 0; width: 4px; height: 100%; background-image: url('../img/clearlooks2/middle_right.gif'); } /* Bottom section */ .clearlooks2 .windowbottom { position: absolute; left: 0; bottom: 0; width: 100%; height: 5px; overflow: hidden; z-index: 5; } .clearlooks2 .windowbottom .left { position: absolute; left: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../img/clearlooks2/bottom_left.gif'); overflow: hidden; } .clearlooks2 .windowbottom .middle { position: absolute; left: 5px; bottom: 0; width: 100%; height: 5px; background: url('../img/clearlooks2/bottom_middle.gif'); overflow: hidden; } .clearlooks2 .windowbottom .right { position: absolute; right: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../img/clearlooks2/bottom_right.gif'); overflow: hidden; } /* Statusbar */ .clearlooks2 .statusbarbottom { height: 24px; overflow: hidden; z-index: 5; } .clearlooks2 .statusbarbottom .left { bottom: 0; width: 5px; height: 23px; background-image: url('../img/clearlooks2/statusbar_left.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .middle { height: 23px; background-image: url('../img/clearlooks2/statusbar_middle.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .right { width: 20px; height: 23px; background-image: url('../img/clearlooks2/statusbar_right.gif'); overflow: hidden; } .clearlooks2 .windowbottom .statustext { display: none; } .clearlooks2 .statusbarbottom div.statustext { display: block; position: absolute; left: 6px; bottom: 0; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; } .clearlooks2 .resizable .statusbarbottom .resize-se { background-image: url('../img/clearlooks2/statusbar_resize.gif'); width: 20px; height: 23px; } /* Actions */ .clearlooks2 .action { position: absolute; cursor: pointer; overflow: hidden; } .clearlooks2 .close, .clearlooks2 .min, .clearlooks2 .med, .clearlooks2 .max { z-index: 3; } .clearlooks2 .resizable .min { right: 68px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 0; background-repeat: no-repeat; } .clearlooks2 .resizable .med { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px 0; background-repeat: no-repeat; } .clearlooks2 .resizable .max { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px 0; background-repeat: no-repeat; } .clearlooks2 .close { right: 6px; top: 3px; width: 29px; height: 16px; background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px 0; } /* Actions - Focus */ .clearlooks2 .focustop .min { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 -16px; } .clearlooks2 .focustop .med { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px -16px; } .clearlooks2 .focustop .max { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px -16px; } .clearlooks2 .focustop .close { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px -16px; } /* Actions - Hover */ .clearlooks2 .focustop .min:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat 0 -32px; } .clearlooks2 .focustop .med:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -29px -32px; } .clearlooks2 .focustop .max:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -58px -32px; } .clearlooks2 .focustop .close:hover { background: transparent url('../img/clearlooks2/buttons.gif') no-repeat -87px -32px; } /* Move and resize handles */ .clearlooks2 .move { top: 0; left: 0; width: 100%; height: 19px; cursor: move; z-index: 1; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resize { display: none; z-index: 4; } .clearlooks2 .resizable .resize { display: block; } .clearlooks2 .resizable .resize-w { top: 0; left: 0; width: 5px; height: 100%; cursor: w-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-e { top: 0; right: 0; width: 5px; height: 100%; cursor: e-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-n { top: 0; left: 0; width: 100%; height: 5px; cursor: n-resize; overflow: hidden; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-nw { top: 0; left: 0; width: 5px; height: 19px; cursor: nw-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-ne { top: 0; right: 0; width: 5px; height: 19px; cursor: ne-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-sw { bottom: 0; left: 0; width: 5px; height: 5px; cursor: sw-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-s { bottom: 0; left: 0; width: 100%; height: 5px; cursor: s-resize; background-image: url('../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-se { bottom: 0; right: 0; width: 5px; height: 5px; cursor: se-resize; background-image: url('../img/clearlooks2/transparent.gif'); } plugins/filemanager/pages/fm/css/dialog.css000066600000007160150472426320014756 0ustar00/* dialog popups */ /* ########################################################## */ body { overflow: auto; } .dialog { position:relative; text-align:left; width: 100%; } .dialog .top { padding:10px 12px; background:#f3f2f0 url('../img/dialog-top.png') no-repeat right bottom; behavior:expression(PNG.fix(this)); } .dialog .close { position:absolute; top:4px; right:4px; } .dialog h2 { font:bold 115% tahoma, arial, sans-serif; margin:0px; } .dialog .description { margin:0px; } .dialog .headline { padding:8px 0px 12px 40px; } .dialog .createdir { background: url('../img/dialog-icon-newfolder.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .createdoc { background: url('../img/dialog-icon-newfile.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .edit { background: url('../img/dialog-icon-edit.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .createzip { background: url('../img/dialog-icon-compress.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .facts { background:#f3f2f0; padding:8px 16px 12px 20px; font:90% tahoma, arial, sans-serif; } .dialog .body { padding:8px 16px 12px 20px; } #content { display: none; } /* Upload */ #uploadarea { position: relative; padding: 16px; height: 220px; overflow: hidden; } * html #uploadarea { height: 208px; } #uploadarea .small { margin: 2em 0 -1em; color: #6d88c4; font-size: 0.9em; text-transform: uppercase; } #uploadarea #add.hidden { display: none; } #uploadarea .addbutton, #uploadarea #uploadstart { display: block; width: 182px; height: 26px; margin: 0 0 1em; background: url(../img/submit-greyWide.png) no-repeat; text-align: center; font-size: 1em; font-weight: bold; line-height: 26px; text-decoration: none; } #uploadarea #uploadstart { background: url(../img/submit-wide.png) no-repeat; } #uploadarea #fileblock { position:relative; top:400px; } #uploadarea #filelist { position:relative; max-height: 7em; overflow: auto; margin-bottom: 6px; border: 1px solid #9fadc4; } * html #uploadarea #filelist { height: 7em; } #uploadarea #fileshead { width: 100%; font-weight: bold; background: #eee; border-bottom: 1px solid #fff; } #uploadarea #files { width: 490px; } #uploadarea #status { position: absolute; top: 4px; border: 1px solid #9fadc4; padding: 1px; width: 506px; height: 34px; display: none; } #uploadarea #progressbar { position: relative; width: 100%; height: 34px; background: url(../img/progress.gif); z-index: 10; } #uploadarea .progresstext { position: absolute; top: 0; left: 0; width: 100%; text-align: center; color: #535353; font-weight: bold; line-height: 36px; z-index: 11; } #uploadarea .progresstext a { text-decoration: none; color: #535353; } #files .fname a {display:block; width:295px; overflow:hidden} #files .disabled {text-decoration:none; cursor:default} #files .done {color:gray} #files .failed {color:red} #multiupload_view {display:none} #singleupload_view {display:none} #multiupload_view #selectview {position:relative} #files input.text {width:290px; margin:0; padding:0} /* Createdoc */ a.preview { background: transparent url('../img/preview.gif') no-repeat; width: 16px; height: 16px; display: block; } #createdoc { overflow: hidden; } /* Edit */ #edit form div {margin-bottom: 4px} #edit #textcontent { width: 500px; height: 250px; }plugins/filemanager/pages/fm/css/toolbar.css000066600000003303150472426320015154 0ustar00/* Toolbar */ /* ########################################################## */ #topnav { background:url('../img/toolbar.png') no-repeat bottom left; } #topwrap { background:url('../img/toolbar.png') no-repeat bottom right; margin:0px 0px 0px 30px; } #settings { display:none; position:absolute; top:20px; right:-4px; width:14em; line-height:14px; text-align:right; background:#fff; padding:4px; border:1px solid #959595; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:1; } #settings a { display:inline; padding:0px; } /* Inside stuff */ .toolbar { margin:0px; padding:2px 20px 10px 0px; font:90% tahoma, arial, sans-serif; } .toolbar .navigation { margin:0px 2px; padding:0px; float:left; width:170px; padding-bottom:12px; } .navigation .desc { margin:0px 0px 4px 0px; background:url('../img/navdesc_bg.gif') no-repeat right; } .navigation .path { margin-bottom:5px; width:320px; overflow:hidden; } .toolbar .icons { margin:14px 0px 0px 0px; float:right; } .toolbar .icon { margin:0px 2px 0px 1px; padding:0px; float:left; line-height:0px; position:relative; } .toolbar .disabled img { opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30); } .toolbar .disabled a { color: #AAA; } .toolbar .disabled a:hover { background: transparent; cursor: default; } /* Icons */ .icon a { text-decoration:none; padding:2px; display:block; outline:0; } .icon a:hover { background:#d3d0ce; } .icon .caption { position:relative; top:-4px; display:none; padding:0px 4px 0px 4px; } .toolbar .separator { margin:0px 4px; float:left; } .icon span.caption { display: inline; } #tools { display:none; } plugins/filemanager/pages/fm/css/filemanager.css000066600000000210150472426320015756 0ustar00@import url("core.css"); @import url("toolbar.css"); @import url("dialog.css"); @import url("forms.css"); @import url("filetypes.css"); plugins/filemanager/pages/fm/css/dropmenu.css000066600000002121150472426320015340 0ustar00/* Menu */ .menu { margin: 0; padding: 0; position: absolute; border: 1px solid #d4d0c8; background: #EAE9E5; z-index: 1000; width: 100px; } .menu a { display: block; color: #000; text-decoration: none; padding: 3px; text-align: left; overflow:auto; /* FF */ } .menu a:hover { background-color: #dbecf3 } .menu .submenu { background: url(../img/menu_arrow.gif) no-repeat center right } .menu .active { background: #dbecf3 url(../img/menu_arrow.gif) no-repeat center right } .menu .active a:hover { background-color: transparent } .menu .separator { border-top: 1px solid gray; height: 1px; overflow: hidden } .menu .separator a { display: none } .menu .disabled a { cursor: default; color: #aaa } /* Menu icons */ .menu a { } .menu .add a { background-position: 0 -60px } .menu .delete a { background-position: 0 -80px } .menu .copy a { background-position: 0 0 } .menu .cut a { background-position: 0 -20px } .menu .paste a { background-position: 0 -40px } .menu .moveup a { background-position: 0 -100px } .menu .movedown a { background-position: 0 -120px }plugins/filemanager/pages/fm/js/upload.js000066600000023520150472426320014451 0ustar00(function($){ window.UploadDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; t.args = args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); t.fileListTpl = $.templateFromScript('#filelist_item_template'); $('.uploadtype').html($.translate('{#upload.basic_upload}', 0, {a : '', '/a' : ''})); $('#createin').html(args.visual_path); $('form input[name=path]').val(args.path); $('form input[name=file0]').change(function(e) { $('form input[name=name0]').val(t.cleanName(/([^\/\\]+)$/.exec(e.target.value)[0].replace(/\.[^\.]+$/, ''))); }); $('form').submit(function() { $.WindowManager.showProgress({message : $.translate('{#upload.progress}')}); }); if (document.location.hostname != document.domain) $('form input[name=domain]').val(document.domain); t.path = args.path; $('#singleupload').click(function(e) { $('#multiupload_view').hide(); $('#singleupload_view').show(); }); RPC.exec('fm.getConfig', {path : args.path}, function(data) { var config = data.result, maxSize, upExt, fsExt, outExt = [], i, x, found; maxSize = config['upload.maxsize']; fsExt = config['filesystem.extensions'].split(','); upExt = config['upload.extensions'].split(','); t.debug = config['general.debug'] == "true"; t.shouldCleanNames = config['filesystem.clean_names'] == "true"; t.chunkSize = config['upload.chunk_size'] || '1mb'; $('#content').show(); if ($.multiUpload.initialized) $('#multiupload_view').show(); else $('#singleupload_view').show(); // Disabled upload if (config['upload.multiple_upload'] != "true") { $('#multiupload_view').hide(); $('#singleupload_view').show(); } maxSize = maxSize.replace(/\s+/, ''); maxSize = maxSize.replace(/([0-9]+)/g, '$1 '); if (upExt[0] == '*') upExt = fsExt; if (fsExt[0] == '*') fsExt = upExt; for (i = 0; i < upExt.length; i++) { upExt[i] = $.trim(upExt[i].toLowerCase()); found = false; for (x = 0; x < fsExt.length; x++) { fsExt[x] = $.trim(fsExt[x]).toLowerCase(); if (upExt[i] == fsExt[x]) { found = true; break; } } if (found) outExt.push(upExt[i]); } t.validExtensions = outExt; t.maxSize = maxSize; $('#facts').html($.templateFromScript('#facts_template'), {extensions : outExt.join(', '), maxsize : maxSize, path : args.visual_path}); if (config['upload.multiple_upload'] == "true") t.initMultiUpload(); }); $('#cancel').click(function() {t.currentWin.close();}); }, cleanName : function(s) { if (this.shouldCleanNames) s = $.cleanName(s); return s; }, handleSingleUploadResponse : function(data) { var t = this, args = t.currentWin.getArgs(); $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.upload_failed}', visual_path : t.args.visual_path, response : data})) { var res = RPC.toArray(data.result); $.WindowManager.info($.translate('{#message.upload_ok}')); $('#file0, #name0').val(''); t.insertFiles([res[0].file]); } }, initMultiUpload : function() { var t = this, up, args = t.currentWin.getArgs(), initial = 1, startTime; up = $.multiUpload.create({ silverlight_xap_url : '../../stream/index.php?theme=fm&package=static_files&file=multiupload_xap', upload_url : '../../stream/index.php?cmd=fm.upload', path : t.path, filter : t.validExtensions, chunk_size : t.chunkSize, max_size : t.maxSize, flash_browse_button : '#add', oninit : function() { $('#add').removeClass('hidden'); } }); if (t.debug) alert('Runtime used: ' + $.multiUpload.runtime); function calc(up) { var size = 0, uploaded = 0, loaded = 0, unloaded = 0, bps = 0, finished = true, fl = []; if (!up.files.length) { $('#selectview').css('top', 0); $('#selectview').show(); $('#fileblock').css({position : 'relative', top : 400}); initial = 1; return; } $(up.files).each(function(i, f) { size += f.size; loaded += f.loaded; if (f.status == 'completed') uploaded++; if (!f.status) finished = false; }); bps = Math.ceil(loaded / ((new Date().getTime() - startTime || 1) / 1000.0)); if (finished) { $('#abortupload').hide(); $(up.files).each(function(i, f) { if (f.status == 'completed') fl.push(t.path + '/' + f.name); }); $('#progressbar').css('width', '100%'); t.insertFiles(fl, function() { // All files uploaded 100% ok if (up.files.length == uploaded) t.currentWin.close(); }); return; } $('#progressinfo').html($.translate('{#upload.progressinfo}', 1, {loaded : up.formatSize(loaded), total : up.formatSize(size), speed : up.formatSize(bps)})); $('#progressbar').css('width', Math.round(loaded / size * 100.0) + '%'); $('#stats').html($.translate('{#upload.statusrow}', 1, {files : up.files.length, size : up.formatSize(size)})); }; // Register event listeners $(up).bind('multiUpload:filesSelected', function(e, fs) { var up = this, totalSize = 0; if (!fs.files.length) { $.WindowManager.info($.translate('{#upload.no_valid_files}')); return; } if (initial) { $('#selectview').animate({ top: '-150px' }, 1000); $('#fileblock').animate({ top:'-60px' }, 1000, 'linear', function() { $('#fileblock').css('position', 'static'); $('#selectview').hide(); up.repaint(); }); initial = 0; } $(fs.files).each(function(i, fo) { fo.name = t.cleanName(fo.name); $('#files').show(); $('#files tbody').append(t.fileListTpl, {id : fo.id, name : fo.name, size : fo.size}); $('#' + fo.id + ' a.remove').click(function(e) { $('#' + fo.id).remove(); $.multiUpload.get(up.id).removeFile(fo.id); e.preventDefault(); return false; }); $('#' + fo.id + ' a.rename').click(function(e) { var a = $(e.target), inp, parts; if (!a.hasClass('disabled')) { parts = /^(.+)(\.[^\.]+)$/.exec(fo.name); a.hide(); $(e.target).parent().append(''); inp = $('#rename').val(parts[1]); t.renameEnabled = 1; inp.focus().blur(function() { t.endRename(); }).keydown(function(e) { var c = e.keyCode; if (c == 13 || c == 27) { if (c == 13) { fo.name = t.cleanName(inp.val()) + parts[2]; a.html(fo.name); } t.endRename(); } }); } e.preventDefault(); return false; }); }); up.settings.flash_browse_button = '#addmore'; up.repaint(); $('#filelist')[0].scrollTop = 0; }); $(up).bind('multiUpload:fileUploaded', function(e, o) { $('#' + o.file.id).removeClass('failed').addClass('done'); }); $(up).bind('multiUpload:filesChanged', function() { calc(up); up.repaint(); t.endRename(); }); $(up).bind('multiUpload:fileUploadProgress', function(e, pr) { if (up.status) { if (!pr.file.scroll) { $('#filelist').scrollTo($('#' + pr.file.id), 50); pr.file.scroll = 1; } $('#' + pr.file.id + ' td.status').html(Math.round(pr.loaded / pr.total * 100.0) + '%'); calc(up); } }); $(up).bind('multiUpload:chunkUploaded', function(e, o) { var res = $.parseJSON(o.response), data = RPC.toArray(res.result); if (data[0]["status"] != 'OK') { o.file.loaded = o.file.size; calc(up); $('#' + o.file.id).addClass('failed'); $('#' + o.file.id + ' td.status').html($.translate(data[0]["message"])); o.cancel = 1; } }); $(up).bind('multiUpload:uploadChunkError', function(e, o) { $('#' + o.file.id).addClass('failed'); $('#' + o.file.id + ' td.status').html('Failed').attr('title', o.error); //top.console.log(o.file, o.chunk, o.chunks, o.error); }); // Add UI events $('#add, #addmore').click(function(e) { up.selectFiles(); e.preventDefault(); return false; }); $('#abortupload').click(function(e) { up.stopUpload(); $.WindowManager.info($.translate('{#upload.cancelled}'), function() { t.currentWin.close(); }); }); $('#uploadstart').click(function(e) { $('#uploadstart').parent().hide(); $('#status').show(); $('#statsrow').hide(); $('#files .status').html('-'); $('#files .fname a').addClass('disabled'); startTime = new Date().getTime(); up.startUpload(); e.preventDefault(); return false; }); $('#uploadstop').click(function(e) { up.stopUpload(); e.preventDefault(); return false; }); $('#clear').click(function(e) { up.clearFiles(); $('#files').hide(); $('#files tbody').html(''); e.preventDefault(); return false; }); }, insertFiles : function(pa, cb) { var s = this.currentWin.getArgs(); // Insert file if (s.onupload) { RPC.insertFiles({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, paths : pa, insert_filter : s.insert_filter, oninsert : function(o) { s.onupload(o); if (cb) cb(); } }); } }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } }, endRename : function() { if (this.renameEnabled) { $('#files input').remove(); $('#files a').show(); this.renameEnabled = 0; } } }; // JSON handler window.handleJSON = function(data) { window.focus(); UploadDialog.handleSingleUploadResponse(data); }; $(function(e) { UploadDialog.init(); }); })(jQuery); plugins/filemanager/pages/fm/js/filemanager.js000066600000111572150472426320015444 0ustar00(function($){ window.FileManager = $.extend(BaseManager, { focusedIndex : -1, clipboard : null, access : '', tools : [ 'createdir', 'edit', 'createdoc', 'refresh', 'zip', 'upload', 'rename', 'cut', 'copy', 'paste', 'delete', 'view', 'download', 'insert', 'imagemanager', 'help' ], init : function() { var t = this, args = t.currentWin.getArgs(), uri, chunks; $('#selectall,#unselectall').removeClass('disabled'); t.path = args.path || '{default}'; t.rootPath = args.rootpath; t.extensions = args.extensions; t.include_file_pattern = args.include_file_pattern; t.exclude_file_pattern = args.exclude_file_pattern; t.include_directory_pattern = args.include_directory_pattern; t.exclude_directory_pattern = args.exclude_directory_pattern; t.remember_last_path = args.remember_last_path; t.urlSuffix = ''; if (document.domain != document.location.hostname) t.urlSuffix = '?domain=' + document.domain; if (args.url) { uri = $.parseURI(args.url, {base_url : args.document_base_url || args.default_base_url}); if (uri) t.inputURL = uri.path.replace(/\/[^\/]+$/, ''); } if (t.rootPath) { chunks = t.rootPath.split(/=/); t.rootPathName = chunks.length > 1 ? chunks[0] : /[^\/]+$/.exec(t.rootPath); t.rootPath = chunks[1] || t.rootPath; } // Compile templates t.fileListTpl = $.templateFromScript('#filelist_item_template'); t.dirInfoTpl = $.templateFromScript('#dirinfo_template'); t.caregoryListTpl = $.templateFromScript('#folders_template'); t.previewFileTpl = $.templateFromScript('#preview_file_template'); t.pathTpl = $.templateFromScript('#path_template'); t.customDirsTpl = $.templateFromScript('#custom_dir_template'); $('#filemanagerlist').css('height', $.winHeight() - 140); $(window).bind('resize', function() { $('#filemanagerlist').css('height', $.winHeight() - 140); }); // Register default actions $().bind('action:selectall', function() {t.setFileSelection(0, t.files.length, true);}); $().bind('action:unselectall', function() {t.focusFile(0);}); $().bind('action:cut', function() {t.setClipBoard({files : t.selectedFiles, action : 'cut'});}); $().bind('action:copy', function() {t.setClipBoard({files : t.selectedFiles, action : 'copy'});}); $().bind('action:paste', function() {t.pasteFiles();}); $().bind('action:rename', function() {t.renameFile(t.focusedFile);}); $().bind('action:delete', function() {t.deleteFiles(t.selectedFiles);}); $().bind('action:zip', function() {t.zipFiles();}); // Register sort actions $().bind('action:sortbyname', function(e) {t.updateFileList('name', $(e.target).hasClass('sortasc'));}); $().bind('action:sortbysize', function(e) {t.updateFileList('size', $(e.target).hasClass('sortasc'));}); $().bind('action:sortbytype', function(e) {t.updateFileList('type', $(e.target).hasClass('sortasc'));}); $().bind('action:sortbymodified', function(e) {t.updateFileList('modified', $(e.target).hasClass('sortasc'));}); // Register view actions $().bind('action:insert', function() {t.insertFiles();}); $().bind('action:download', function() {t.downloadFile(t.focusedFile);}); $().bind('action:view', function() {t.viewFile(t.focusedFile);}); // Register toolbar actions $().bind('action:createdir', function() {t.createDir();}); $().bind('action:edit', function() {t.editFile(t.focusedFile);}); $().bind('action:upload', function() {t.uploadFiles();}); $().bind('action:createdoc', function() {t.createDoc();}); $().bind('action:refresh', function() {t.listFiles();}); $().bind('action:help', function() {}); $().bind('action:imagemanager', function() {t.imageManager();}); $().bind('filemanager:clipboardchanged', function() { if (t.clipboard && !$('#paste').hasClass('deactivated')) $('#paste').removeClass('disabled'); else $('#paste').addClass('disabled'); }); $().bind('selection:changed', function() { $(['cut', 'copy', 'delete', 'zip']).each(function(i, v) { if (t.selectedFiles.length > 0 && !$('#' + v).hasClass('deactivated')) $('#' + v).removeClass('disabled'); else $('#' + v).addClass('disabled'); }); }); $().bind('filelist:changed', function() { if (t.clipboard && !$('#paste').hasClass('deactivated')) $('#paste').removeClass('disabled'); else $('#paste').addClass('disabled'); }); $().bind('selection:changed', function() { if (t.focusedFile) $('#previewinfo').html(t.previewFileTpl, t.focusedFile); else $('#previewinfo').html(' '); $(['rename', 'insert', 'download', 'view', 'edit']).each(function(i, v) { if (!t.focusedFile) { $('#' + v).addClass('disabled'); t.showPreview(0); } else if (!$('#' + v).hasClass('deactivated')) $('#' + v).removeClass('disabled'); }); if (t.focusedFile && (!t.focusedFile.custom || !t.focusedFile.custom.editable)) $('#edit').addClass('disabled'); }); $('#selection_actions li, #view_actions li, #tools li, #filemanagerlist a').each(function(i, v) { $(v).click(function(e) { if (!$(v).hasClass('disabled')) $().trigger('action:' + v.id, e); e.preventDefault(); return false; }); }); $('#filemanagerlist').mousedown(function(e) { if (e.shiftKey) e.preventDefault(); }); $('#filemanagerlist').bind('selectstart', function(e) { e.preventDefault(); }); $('#category_list').click(function(e) { var el = e.target; if (el.title) t.listFiles(el.title); e.preventDefault(); return false; }); $('#special_list').click(function(e) { var el = e.target; if (el.title) t.listFiles(el.title); e.preventDefault(); return false; }); $('#filemanagerlist').click(t.handleSelection); $('#filemanagerlist').dblclick(t.handleSelection); $('#filemanagerlist').bind('contextmenu', t.handleSelection); $('#filemanagerlist').mcContextMenu({ constrain : 1, setup : function(m) { $(m).bind('DropMenu:beforeshow', function(e, m) { // Build new menu m.clear(); m.add({title : $.translate('{#actions.cut}'), disabled : t.isDisabled('cut') || !t.selectedFiles.length, onclick : function() {t.setClipBoard({files : t.selectedFiles, action : 'cut'});}}); m.add({title : $.translate('{#actions.copy}'), disabled : t.isDisabled('copy') || !t.selectedFiles.length, onclick : function() {t.setClipBoard({files : t.selectedFiles, action : 'copy'});}}); m.add({title : $.translate('{#actions.paste}'), disabled : t.isDisabled('paste') || !t.clipboard, onclick : function() {t.pasteFiles();}}); m.addSeparator(); m.add({title : $.translate('{#actions.edit}'), disabled : !t.focusedFile || (!t.focusedFile.custom || !t.focusedFile.custom.editable) || t.isDisabled('edit') || !t.selectedFiles.length, onclick : function() {t.editFile(t.focusedFile);}}); m.add({title : $.translate('{#actions.rename}'), disabled : t.isDisabled('rename') || !t.selectedFiles.length, onclick : function() {t.renameFile(t.focusedFile);}}); m.add({title : $.translate('{#actions.deleteit}'), disabled : t.isDisabled('delete') || !t.selectedFiles.length, onclick : function() {t.deleteFiles(t.selectedFiles);}}); m.add({title : $.translate('{#actions.zip}'), disabled : t.isDisabled('zip') || !t.selectedFiles.length, onclick : function() {t.zipFiles();}}); }); } }); $().bind('DropMenu:show', function(e, m) { $('#' + m.id).css('opacity', 0).animate({ opacity: 0.9 }, 100); }); if (t.specialFolders.length) { $(t.specialFolders).each(function(i, v) { v.title = $.translate(v.title); $('#special_list').append(t.customDirsTpl, v); }); $('#special_list').show(); } setInterval(function() { RPC.exec('fm.keepAlive', {}); }, 60 * 1000 * 5); // 5 min }, handleSelection : function(e) { var t = FileManager, el = e.target, tr = $(el).parents('tr.listrow')[0], idx, type; if (tr && el.nodeName != 'INPUT') { idx = parseInt(tr.id.replace(/[^0-9]+/g, '')); t.focusedFile = t.files[idx]; type = t.focusedFile.type; $('#file_' + t.focusedIndex).removeClass('focused'); if (e.shiftKey) t.setFileSelection(t.focusedIndex, idx, true, 1); if ($(el).hasClass('checkbox')) { if ($(tr).hasClass('selected')) { $(tr).removeClass('focused'); idx = -1; t.focusedFile = null; } else $(tr).addClass('focused'); $(tr).toggleClass('selected'); t.showPreview(0); } else { if (!e.shiftKey && (type == 'folder' || type == 'parent' || type == 'zip') && e.type == 'click') { if (type == 'zip') t.listFiles('zip://' + t.focusedFile.path); else t.listFiles(t.focusedFile.path); t.showPreview(0); e.preventDefault(); return false; } else if (e.type != 'dblclick') t.showPreview(t.focusedFile); if (!e.shiftKey && (e.type != 'contextmenu' || !$(tr).hasClass('selected'))) { $('#filemanagerlist tbody tr').removeClass('selected'); $('#file_' + t.focusedIndex).removeClass('selected'); } $(tr).addClass('focused').addClass('selected'); } // Build list of selected files t.selectedFiles = []; $('#filemanagerlist tbody tr.selected').each(function(i, tr) { t.selectedFiles.push(t.files[parseInt(tr.id.replace(/[^0-9]+/g, ''))]); }); t.focusedIndex = idx; $().trigger('selection:changed'); if (e.type == 'dblclick') t.insertFiles(t.selectedFiles); e.preventDefault(); return false; } }, createDir : function() { $.WindowManager.open({ url : 'createdir.html' + this.urlSuffix, width : 520, height : 320 }, { is_demo : this.demoMode, path : this.path, visual_path : this.visualPath, oncreate : function() { FileManager.listFiles(); } }); }, createDoc : function() { $.WindowManager.open({ url : 'createdoc.html' + this.urlSuffix, width : 520, height : 320 }, { is_demo : this.demoMode, path : this.path, visual_path : this.visualPath, oncreate : function() { FileManager.listFiles(); } }); }, uploadFiles : function() { $.WindowManager.open({ url : 'upload.html' + this.urlSuffix, width : 550, height : 360, scrolling : 'no' }, { is_demo : this.demoMode, path : this.path, visual_path : this.visualPath, onupload : function() { FileManager.listFiles(); } }); }, zipFiles : function() { var files = []; $(this.selectedFiles).each(function(i, f) { files.push(f.path); }); $.WindowManager.open({ url : 'createzip.html' + this.urlSuffix, width : 490, height : 280 }, { is_demo : this.demoMode, files : files, path : this.path, visual_path : this.visualPath, oncreate : function() { FileManager.listFiles(); } }); }, editFile : function(fi) { $.WindowManager.open({ url : 'edit.html' + this.urlSuffix, width : 750, height : 450 }, { is_demo : this.demoMode, path : fi.path, visual_path : (this.visualPath + '/' + /[^\/]+$/.exec(fi.path)).replace(/^\/\//, '/'), onsave : function() { FileManager.listFiles(); } }); }, showPreview : function(fi) { if (fi && (!fi.custom || fi.custom.previewable) && fi.type != 'zip') $('#preview').attr('src', '../../stream/index.php?cmd=fm.streamFile&path=' + encodeURIComponent(fi.path)).css('visibility', 'visible'); else $('#preview').attr('src', "javascript:''").css('visibility', 'hidden'); }, deleteFiles : function(fl) { var t = this, args = {}; if (fl) { $(fl).each(function(i, v) { args['path' + i] = v.path; }); $.WindowManager.confirm($.translate('{#message.confirm_delete}'), function(s) { if (s) { if (!t.isDemo()) { RPC.exec('fm.deleteFiles', args, function (data) { if (!RPC.handleError({message : '{#error.delete_failed}', visual_path : t.visualPath, response : data})) t.listFiles(); }); } } }); } }, pasteFiles : function() { var t = this, args = {}; if (t.clipboard && !t.isDemo()) { args.topath = t.path; $(t.clipboard.files).each(function(i, v) { args['frompath' + i] = v.path; }); $.WindowManager.showProgress({message : $.translate("{#message.paste_in_progress}")}); if (t.clipboard.action == 'cut') { RPC.exec('fm.moveFiles', args, function(data) { $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.move_failed}', visual_path : t.visualPath, response : data})) t.listFiles(); }); } else { RPC.exec('fm.copyFiles', args, function(data) { $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.copy_failed}', visual_path : t.visualPath, response : data})) t.listFiles(); }); } t.clipboard = null; $().trigger('filemanager:clipboardchanged'); } }, setClipBoard : function(clip) { this.clipboard = clip; $().trigger('filemanager:clipboardchanged', clip); }, insertFiles : function() { var t = this, s = t.currentWin.getArgs(), selectedPaths = []; $(t.selectedFiles).each(function(i, v) { selectedPaths.push(v.path); }); RPC.insertFiles({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, paths : selectedPaths, insert_filter : s.insert_filter, progress_message : $.translate("{#message.insert}"), oninsert : function(o) { if (s.oninsert) { $(o.files).each(function(i, v) { if (v.path == t.focusedFile.path) o.focusedFile = v; }); s.oninsert(o); } t.currentWin.close(); } }); }, renameFile : function(f) { var t = this, inp, ext = '', ma; t.curRenameFile = f; inp = $.createElm('input', {id : f.id + '_rename', type : "text", "class" : "text", "value" : f.name.replace(/\.[^\.]+$/, '')}); $('#' + f.id + ' td.file').append(inp).find('a').hide(); if (ma = /\.[^\.]+$/.exec(f.name)) ext = ma[0]; inp.focus().blur(function() { t.endRename(); }).keyup(function(e) { var c = e.keyCode, na; if (c == 13 || c == 27) { if (c == 13) { if (!t.isDemo()) { na = inp.val(); if (t.shouldCleanNames) na = $.cleanName(na); RPC.exec('fm.moveFiles', { frompath0 : f.path, toname0 : na + ext }, function (data) { if (!RPC.handleError({message : '{#error.rename_failed}', visual_path : t.visualPath, response : data})) t.listFiles(); }); } } t.endRename(); } }) }, endRename : function() { var td; if (this.curRenameFile) { td = $('#' + this.curRenameFile.id + ' td.file'); td.find('input').remove(); td.find('a').show(); } }, listFiles : function(p, col, des) { var t = this, args = t.currentWin.getArgs(); t.path = p || t.path; $('#dirinfo').hide(); $('#progress').show(); $('#filelist').html(''); t.showPreview(0); RPC.exec('fm.listFiles', { path : t.path, root_path : t.rootPath, url : t.inputURL, extensions : t.extensions, include_file_pattern : t.include_file_pattern, exclude_file_pattern : t.exclude_file_pattern, include_directory_pattern : t.include_directory_pattern, exclude_directory_pattern : t.exclude_directory_pattern, config : 'general,filesystem,imagemanager', remember_last_path : t.remember_last_path }, function(data) { var header, cfg, disabled, visible, argTools, argDisabledTools; if (!RPC.handleError({message : 'List files error', visual_path : t.visualPath, response : data})) { header = data.result.header; cfg = data.result.config; t.access = header.attribs; t.visualPath = header.visual_path; t.imageManagerURL = cfg['imagemanager.urlprefix']; t.demoMode = cfg['general.demo'] == "true"; t.path = header.path; function explode(s) { return s ? s.replace(/\s+/g, '').split(',') : s; }; // Enable/disable tools t.shouldCleanNames = cfg['filesystem.clean_names'] == "true"; disabled = explode(cfg['general.disabled_tools']); visible = explode(cfg['general.tools']); if (argDisabledTools = explode(args.disabled_tools)) disabled = jQuery.merge(argDisabledTools, disabled); if (argTools = explode(args.tools)) { $(argTools).each(function(i, v) { if (!$.inArray(v, visible)) visible.push(v); }); visible = $.grep(visible, function(v) { return $.inArray(v, argTools); }); } $(t.tools).each(function(i, v) { var li = $('#' + v); t.setDisabled(v, $.inArray(v, disabled) != -1); if ($.inArray(v, visible) != -1) li.show(); else li.hide(); }); $('#tools').show(); $('#progress').hide(); $('#curpath').html(t.pathTpl, header).attr("title", t.visualPath); // Convert result table into object list t.files = RPC.toArray(data.result); // Update file list t.updateFileList(col, des); $().trigger('filelist:changed'); } }); }, updateFileList : function(col, des) { var t = this, info = {dirs : 0, files : 0, filesize : 0, access : t.access}, co = 0, fileLst; col = col || 'name'; $('thead a.sortdesc').removeClass('sortdesc'); $('thead a.sortasc').removeClass('sortasc'); $('#sortby' + col).removeClass('sort' + (des ? 'asc' : 'desc')); $('#sortby' + col).addClass('sort' + (des ? 'desc' : 'asc')); t.endRename(); t.focusedIndex = -1; t.focusedFile = null; t.selectedFiles = []; $().trigger('selection:changed'); // Sort the files this.files = $(this.files).sortArray(col, des); // Make sure directories are before files this.files = $.grep(this.files, function(v) { return v.type == 'folder' || v.type == 'parent'; }).concat($.grep(this.files, function(v) { return v.type != 'folder' && v.type != 'parent'; })); $('#filelist').html(''); // Collect directory info $(this.files).each(function(i, f) { if (f.type != 'parent') { if (f.type == 'folder') info.dirs++; else info.files++; if (f.size != -1) info.filesize += f.size; } f.id = 'file_' + i; }); $('#dirinfo').html(t.dirInfoTpl, info); $('#dirinfo').show(); fileLst = $('#filelist'); $(this.files).each(function() { fileLst.append(t.fileListTpl, this); }); }, downloadFile : function(f) { if (f.type != 'folder' && f.type != 'parent') $('#preview').attr('src', '../../stream/index.php?cmd=fm.download&path=' + encodeURIComponent(f.path)); }, viewFile : function(f) { if (f.type != 'folder' && f.type != 'parent' && f.type != 'zip') window.open('../../stream/index.php?cmd=fm.streamFile&path=' + encodeURIComponent(f.path), 'View'); }, imageManager : function() { var suf; if (this.imageManagerURL.indexOf('?') != -1) suf = this.urlSuffix.replace(/\?/, '&'); document.location = this.imageManagerURL + suf; }, focusFile : function(f) { var t = this; if (f && f.type == 'parent') return; $('#filemanagerlist tbody tr').removeClass('selected').removeClass('focused'); if (!f) { t.selectedFiles = []; t.focusedFile = null; t.focusedIndex = -1; $().trigger('selection:changed'); t.showPreview(0); return; } t.focusedIndex = f.index; t.focusedFile = f; t.selectedFiles = [f]; $().trigger('selection:changed'); $('#' + f.id).addClass('selected focused'); t.showPreview(f); }, setFileSelection : function(st, en, ck, nup) { var t = this, i; function sel(v, i) { if (v && v.type != 'parent') { v = $('#file_' + i); if (ck) v.addClass('selected'); else if (!v.hasClass('focused')) v.removeClass('selected'); } }; for (i = st; i < en; i++) sel(t.files[i], i); for (i = en; i < st; i++) sel(t.files[i], i); if (!nup) { // Build list of selected files t.selectedFiles = []; $('#filemanagerlist tbody tr.selected').each(function(i, tr) { t.selectedFiles.push(t.files[parseInt(tr.id.replace(/[^0-9]+/g, ''))]); }); } $().trigger('selection:changed'); }, listRoots : function() { var t = this; if (t.rootPathName) { $('#category_list').html(t.caregoryListTpl, {name : t.rootPathName, path : t.rootPath}); return; } $('#progress').show(); RPC.exec('fm.listFiles', { "path" : "root:///" }, function(data) { if (!RPC.handleError({message : 'List files error', visual_path : t.visualPath, response : data})) { $(RPC.toArray(data.result)).each(function() { $('#category_list').append(t.caregoryListTpl, this); }); } }); } }); $(function() { FileManager.init(); FileManager.listFiles(); FileManager.listRoots(); }); })(jQuery); plugins/filemanager/pages/fm/js/createzip.js000066600000002762150472426320015160 0ustar00(function($){ window.CreateZipDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); $('#content').show(); $('#createin').html(args.visual_path); RPC.exec('fm.getConfig', {path : args.path}, function(data) { var config = data.result, templates = [], tpl, cleanNames; if (!RPC.handleError({message : 'Get config error', visual_path : t.visualPath, response : data})) { cleanNames = config['filesystem.clean_names'] == "true"; $('form').submit(function() { var rpcArgs = {}; $(args.files).each(function(i, f) { rpcArgs['frompath' + i] = f; }); rpcArgs.topath = args.path; rpcArgs.toname = cleanNames ? $.cleanName($('#zipname').val()) : $('#zipname').val(); if (!t.isDemo()) { RPC.exec('fm.createZip', rpcArgs, function (data) { if (!RPC.handleError({message : '{#error.createzip_failed}', visual_path : args.visual_path, response : data})) { if (args.oncreate) args.oncreate(); t.currentWin.close(); } }); } return false; }); $('#cancel').click(function() {t.currentWin.close();}); } }); }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function() { CreateZipDialog.init(); }); })(jQuery); plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.js000066600000007317150472426320020367 0ustar00/** * $Id: jquery.multiupload.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { var id = 0; $.multiUpload = function(s) { var up = this, mul; up.id = up.generateID(); // Default settings up.settings = { }; up.settings = s = $.extend(up.settings, s); // Parse max size if (s.max_size) s.max_size = up.parseSize(s.max_size); // Parse chunk size if (s.chunk_size) s.chunk_size = up.parseSize(s.chunk_size); if (s.oninit) { $(up).bind('multiUpload:init', function() { s.oninit.call(up, up); }); } up.init(); $(['setup', 'filesSelected', 'fileProgress', 'filesProgress', 'filesUploaded', 'fileUploaded', 'fileUploadProgress']).each(function() { if (s[(this)]) $(up).bind('multiUpload:' + this, s[(this)]); }); $(up).trigger('multiUpload:setup'); $(up).bind('multiUpload:selectFiles', function() {this.cache = {};}); $(up).bind('multiUpload:filesSelected', function(e, fs) { var mx = up.settings.max_size; function filter(f) { var m = /\.([^.]+)$/.exec(f.name.toLowerCase()), ext = m ? m[1] : null; return ext && $.inArray(ext, s.filter) != -1 && (!mx || f.size < mx); }; // Remove non valid files if (s.filter[0] != '*') { this.files = $.grep(this.files, filter); fs.files = $.grep(fs.files, filter); } this.cache = {}; }); }; // Add public methods $.extend($.multiUpload.prototype, { files : [], cache : {}, listeners : {}, status : 0, init : function() { }, repaint : function() { }, selectFiles : function() { $(this).trigger('multiUpload:selectFiles'); }, startUpload : function() { this.status = 1; $(this).trigger('multiUpload:startUpload'); this.uploadNext(); }, stopUpload : function() { this.status = 0; $(this).trigger('multiUpload:stopUpload'); }, uploadNext : function() { var i, fl = this.files; if (!this.status) return; for (i = 0; i < fl.length; i++) { if (!fl[i].status) { $(this).trigger('multiUpload:uploadFile', [fl[i]]); return; } } this.stopUpload(); }, getFile : function(id) { var t = this, f, i, fl = t.files; if (f = t.cache[id]) return f; for (i = 0; i < fl.length; i++) { if (fl[i].id == id) return t.cache[id] = fl[i]; } }, removeFile : function(id) { var up = this, f; up.files = $.grep(up.files, function(v) { if (v.id == id) f = v; return v.id != id; }); $(this).trigger('multiUpload:removeFile', f); $(this).trigger('multiUpload:filesChanged'); }, clearFiles : function() { this.stopUpload(); this.files = []; this.cache = {}; $(this).trigger('multiUpload:clearFiles'); $(this).trigger('multiUpload:filesChanged'); }, formatSize : function(v) { // MB if (v > 1048576) return Math.round(v / 1048576, 1) + " MB"; // KB if (v > 1024) return Math.round(v / 1024, 1) + " KB"; return v + " b"; }, generateID : function() { return 'u' + (id++); }, parseSize : function(sz) { var mul; if (typeof(sz) == 'string') { sz = /^([0-9]+)([mk]+)$/.exec(sz.toLowerCase().replace(/[^0-9mk]/g, '')); mul = sz[2]; sz = parseInt(sz[1]); if (mul == 'm') sz *= 1048576; if (mul == 'k') sz *= 1024; } return sz; } }); // Static methods $.extend($.multiUpload, { instances : {}, create : function(s) { return this.add(new $.multiUpload(s)); }, remove : function(id) { if (this.get(id)) delete this.instances[id]; }, add : function(up) { return this.instances[up.id] = up; }, get : function(id) { return this.instances[id]; } }); })(jQuery); plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.silverlight.js000066600000012647150472426320022724 0ustar00/** * $Id: jquery.multiupload.silverlight.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ function onSilverlightError(sender, args) { alert("onSilverlightError: " + args.errormessage); }; (function($) { function isInstalled(version) { var isVersionSupported = false; var container = null; try { var control = null; try { control = new ActiveXObject('AgControl.AgControl'); if (version == null) isVersionSupported = true; else if (control.IsVersionSupported(version)) isVersionSupported = true; control = null; } catch (e) { var plugin = navigator.plugins["Silverlight Plug-In"]; if (plugin) { if (version === null) { isVersionSupported = true; } else { var actualVer = plugin.description; if (actualVer === "1.0.30226.2") actualVer = "2.0.30226.2"; var actualVerArray = actualVer.split("."); while (actualVerArray.length > 3) actualVerArray.pop(); while ( actualVerArray.length < 4) actualVerArray.push(0); var reqVerArray = version.split("."); while (reqVerArray.length > 4) reqVerArray.pop(); var requiredVersionPart, actualVersionPart, index = 0; do { requiredVersionPart = parseInt(reqVerArray[index]); actualVersionPart = parseInt(actualVerArray[index]); index++; } while (index < reqVerArray.length && requiredVersionPart === actualVersionPart); if (requiredVersionPart <= actualVersionPart && !isNaN(requiredVersionPart)) isVersionSupported = true; } } } } catch (e) { isVersionSupported = false; } return isVersionSupported; }; if (!$.multiUpload.initialized && isInstalled('2.0.31005.0')) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'silverlight'; // Register global Silverlight instance $.multiUpload.setup = function(se) { $.multiUpload.plugin = $('#multiuploader')[0].content.Upload; $.multiUpload._fireEvent('init'); }; $.multiUpload.instances = []; $.multiUpload._fireEvent = function(na, p1, p2, p3, p4) { // Detach event from flash window.setTimeout(function() { $($.multiUpload.instances).each(function(i, v) { $(v).trigger('multiUpload:' + na, [p1, p2, p3, p4]); }); }, 0); }; // Override init function $.extend($.multiUpload.prototype, { init : function() { var up = this, sel = []; $.multiUpload.instances.push(up); // Add silverlight runtime if (!$('#multiuploader')[0]) { $("body").append( '' + '' + '' ); } // Register silverlight specific event handlers $(up).bind('multiUpload:slSelectFile', function(e, id, na, sz) { var fo = {id : id, name : na, size : sz, loaded : 0}; sel.push(fo); up.files.push(fo); }); $(up).bind('multiUpload:slSelectSuccessful', function() { $(up).trigger('multiUpload:filesSelected', [{files : sel}]); $(up).trigger('multiUpload:filesChanged'); sel = []; }); $(up).bind('multiUpload:slSelectCancelled', function() { $(up).trigger('multiUpload:filesSelectionCancelled', [sel]); sel = []; }); $(up).bind('multiUpload:slUploadFileProgress', function(e, id, lod, tot) { var file = up.getFile(id); file.loaded = lod; $(up).trigger('multiUpload:fileUploadProgress', [{file : file, loaded : lod, total : tot}]); }); $(up).bind('multiUpload:slUploadSuccessful', function(e, id, resp) { var fo; if (fo = up.getFile(id)) { if (!fo.status) { fo.status = "completed"; $(up).trigger('multiUpload:fileUploaded', [{file : fo, response : resp}]); } } $(up).trigger('multiUpload:filesChanged'); up.uploadNext(); }); $(up).bind('multiUpload:stopUpload', function(e) { $.multiUpload.plugin.CancelUpload(); }); $(up).bind('multiUpload:slUploadChunkSuccessful', function(e, id, chunk, chunks, resp) { var fo = up.getFile(id), ar = {file : fo, chunk : chunk, chunks : chunks, response : resp}; $(up).trigger('multiUpload:chunkUploaded', [ar]); if (ar.cancel) { fo.status = "failed"; $.multiUpload.plugin.CancelUpload(); } }); $(up).bind('multiUpload:slUploadChunkError', function(e, id, chunk, chunks, err) { $(up).trigger('multiUpload:uploadChunkError', [{file : up.getFile(id), chunk : chunk, chunks : chunks, error : err}]); }); // Register event handlers $(up).bind('multiUpload:selectFiles', function(e) { $.multiUpload.plugin.SelectFiles( 'Files |' + $.map(up.settings.filter, function(v) { return '*.' + v }).join(';') ); }); $(up).bind('multiUpload:removeFile', function(e, fo) { $.multiUpload.plugin.RemoveFile(fo.id); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { $.multiUpload.plugin.UploadFile( fo.id, up.settings.upload_url + '&name=' + escape(fo.name) + "&path=" + escape(up.settings.path), parseInt(up.settings.chunk_size) ); }); $(up).bind('multiUpload:clearFiles', function(e) { $.multiUpload.plugin.ClearFiles(); }); } }); } })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.uri.js000066600000013712150472426320016623 0ustar00/** * $Id: jquery.uri.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function URI(u, s) { var t = this, o, a, b; // Default settings s = t.settings = s || {}; // Strange app protocol or local anchor if (/^(mailto|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) { t.source = u; return; } // Absolute path with no host, fake host and protocol if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; // Relative path if (u.indexOf(':/') === -1 && u.indexOf('//') !== 0) u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u); // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); $(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"]).each(function(i, v) { var s = u[i]; // Zope 3 workaround, they use @@something if (s) s = s.replace(/\(mce_at\)/g, '@@'); t[v] = s; }); if (b = s.base_uri) { if (!t.protocol) t.protocol = b.protocol; if (!t.userInfo) t.userInfo = b.userInfo; if (!t.port && t.host == 'mce_host') t.port = b.port; if (!t.host || t.host == 'mce_host') t.host = b.host; t.source = ''; } }; $.extend(URI.prototype, { /** * Sets the internal path part of the URI. * * @param {string} p Path string to set. */ setPath : function(p) { var t = this; p = /^(.*?)\/?(\w+)?$/.exec(p); // Update path parts t.path = p[0]; t.directory = p[1]; t.file = p[2]; // Rebuild source t.source = ''; t.getURI(); }, /** * Converts the specified URI into a relative URI based on the current URI instance location. * * @param {String} u URI to convert into a relative path/URI. * @return {String} Relative URI from the point specified in the current URI instance. */ toRelative : function(u) { var t = this, o; if (u === "./") return u; u = new URI(u, {base_uri : t}); // Not on same domain/port or protocol if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) return u.getURI(); o = t.toRelPath(t.path, u.path); // Add query if (u.query) o += '?' + u.query; // Add anchor if (u.anchor) o += '#' + u.anchor; return o; }, /** * Converts the specified URI into a absolute URI based on the current URI instance location. * * @param {String} u URI to convert into a relative path/URI. * @param {bool} nh No host and protocol prefix. * @return {String} Absolute URI from the point specified in the current URI instance. */ toAbsolute : function(u, nh) { var u = new URI(u, {base_uri : this}); return u.getURI(this.host == u.host ? nh : 0); }, /** * Converts a absolute path into a relative path. * * @param {String} base Base point to convert the path from. * @param {String} path Absolute path to convert into a relative path. */ toRelPath : function(base, path) { var items, bp = 0, out = '', i, l; // Split the paths base = base.substring(0, base.lastIndexOf('/')); base = base.split('/'); items = path.split('/'); if (base.length >= items.length) { for (i = 0, l = base.length; i < l; i++) { if (i >= items.length || base[i] != items[i]) { bp = i + 1; break; } } } if (base.length < items.length) { for (i = 0, l = items.length; i < l; i++) { if (i >= base.length || base[i] != items[i]) { bp = i + 1; break; } } } if (bp == 1) return path; for (i = 0, l = base.length - (bp - 1); i < l; i++) out += "../"; for (i = bp - 1, l = items.length; i < l; i++) { if (i != bp - 1) out += "/" + items[i]; else out += items[i]; } return out; }, /** * Converts a relative path into a absolute path. * * @param {String} base Base point to convert the path from. * @param {String} path Relative path to convert into an absolute path. */ toAbsPath : function(base, path) { var i, nb = 0, o = []; // Split paths base = base.split('/'); path = path.split('/'); // Remove empty chunks $(base).each(function(i, k) { if (k) o.push(k); }); base = o; // Merge relURLParts chunks for (i = path.length - 1, o = []; i >= 0; i--) { // Ignore empty or . if (path[i].length == 0 || path[i] == ".") continue; // Is parent if (path[i] == '..') { nb++; continue; } // Move up if (nb > 0) { nb--; continue; } o.push(path[i]); } i = base.length - nb; // If /a/b/c or / if (i <= 0) return '/' + o.reverse().join('/'); return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/'); }, /** * Returns the full URI of the internal structure. * * @param {bool} nh Optional no host and protocol part. Defaults to false. */ getURI : function(nh) { var s, t = this; // Rebuild source if (!t.source || nh) { s = ''; if (!nh) { if (t.protocol) s += t.protocol + '://'; if (t.userInfo) s += t.userInfo + '@'; if (t.host) s += t.host; if (t.port) s += ':' + t.port; } if (t.path) s += t.path; if (t.query) s += '?' + t.query; if (t.anchor) s += '#' + t.anchor; t.source = s; } return t.source; } }); $.parseURI = function(u, s) { s = s || {}; return new URI(u, $.extend({base_uri : new URI(s.base_url || document.location.href)}, s)); }; })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.cleanname.js000066600000001426150472426320017746 0ustar00/** * $Id: jquery.replacediacritics.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ $.cleanName = function(s) { var i, lo; // Replace diacritics lo = [ /[\300-\306]/g, 'A', /[\340-\346]/g, 'a', /\307/g, 'C', /\347/g, 'c', /[\310-\313]/g, 'E', /[\350-\353]/g, 'e', /[\314-\317]/g, 'I', /[\354-\357]/g, 'i', /\321/g, 'N', /\361/g, 'n', /[\322-\330]/g, 'O', /[\362-\370]/g, 'o', /[\331-\334]/g, 'U', /[\371-\374]/g, 'u' ]; for (i = 0; i < lo.length; i += 2) s = s.replace(lo[i], lo[i + 1]); // Replace whitespace s = s.replace(/\s+/g, '_'); // Remove anything else s = s.replace(/[^a-z0-9_\-\.]+/gi, ''); return s; }; })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.dropmenu.js000066600000011733150472426320017656 0ustar00/** * $Id: jquery.dropmenu.js 466 2008-10-15 14:54:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { var idCount = 0; function DropMenu(s) { var t = this, k; t.items = []; t.settings = s = $.extend({ menu_class : 'menu', menu_item_class : 'menuitem', item_class : 'item', separator_class : 'separator', submenu_item_class : 'submenu', active_class : 'active' }, s); t.id = s.id; if (s.setup) s.setup.call(t, t); // Private methods function hideHandler(e) { if (e.target.nodeName !== 'A' || !$(e.target).parents('div.' + s.menu_class).length) t.hide(); }; function clickHandler(e) { var m; if (e.target.nodeName === 'A') { m = t.find(e.target.rel); if (!m.show && !m.disabled) { if (m.onclick) m.onclick.call(m.scope || this, e, m); if (s.onClick) s.onClick(e, m); m = t; do { m.hide(); } while (m = m.parentMenu); } e.preventDefault(); return false; } }; function mouseOverHandler(e) { var x, y, o, m, el; if (e.target.nodeName === 'A') { if (t.lastMenu) t.lastMenu.hide(); if (m = t.find(e.target.rel)) { if (m.show) { el = $(e.target.parentNode); o = el.offset(); x = o.left + el.width(); y = o.top; el.addClass(m.settings.active_class); t.lastMenu = m; m.show(x, y); } } } }; function createElm(n, a, h) { n = document.createElement(n); if (a) $(n).attr(a); if (h) $(n).html(h); return n; }; function uniqueId() { return 'jquery_mc_' + idCount++; }; // Public methods $.extend(this, { createMenu : function(s) { return new DropMenu(s); }, find : function(n) { var i; for (i = 0; i < t.items.length; i++) { if (t.items[i].id === n) return t.items[i]; } return null; }, clear : function() { t.hide(); t.items = []; $('#' + t.id).remove(); t.rendered = 0; }, render : function(n) { if (!n.id) n.id = t.id = uniqueId(); else t.id = 'jquery_mc_' + n.id; if (s.onInit) s.onInit(t); }, show : function(x, y) { var pe, it, m, s = t.settings; if (t.visible) t.hide(); $(t).trigger('DropMenu:beforeshow', [t]); $().trigger('DropMenu:beforeshow', [t]); if (!t.rendered) { pe = createElm('div', {id : t.id, 'class' : s.menu_class}); $.each(t.items, function(i, v) { var ti, id, cl = '', an; if (v.constructor == DropMenu) { ti = v.settings.title; cl = ' ' + s.submenu_item_class; if (v.settings['class']) cl += ' ' + v.settings['class']; } else { ti = v.title; if (this['class']) cl = ' ' + v['class']; } if (v.disabled || v.settings && v.settings.disabled) cl += ' disabled'; // Add menu item it = createElm('div', {id : t.id + '_' + v.id, 'class' : s.menu_item_class + cl}); an = createElm('a', {rel : v.id, href : '#'}, ti); //$(an).append(createElm('span', null, ti)); $(it).append(an); $(pe).append(it); }); $(document.body).append(pe); t.rendered = 1; } $().mouseup(hideHandler); m = $('#' + t.id); m.mouseover(mouseOverHandler).show().css({left : -5000, top : -5000}); // Measure and align if (s.halign == 'right') x -= m.width(); if (s.valign == 'bottom') y -= m.height(); // Constrain if (s.constrain) { x = x < 0 ? 0 : x; y = y < 0 ? 0 : y; x = x + m.width() > $.winWidth() ? $.winWidth() - m.width() : x; y = y + m.height() > $.winHeight() ? $.winHeight() - m.height() : y; } m.css({left : x, top : y}).click(clickHandler); t.visible = 1; $(t).trigger('DropMenu:show'); $().trigger('DropMenu:show', [t]); return false; }, hide : function() { if (!t.visible) return false; $('a[@rel=' + t.id + ']').parent().removeClass('active'); $().unbind('mouseup', hideHandler); $('#' + t.id).unbind('mouseover', mouseOverHandler).hide(); $('#' + t.id).unbind('click', clickHandler); t.visible = 0; $.each(t.items, function() { if (this.hide) this.hide(); }); $(t).trigger('DropMenu:hide'); $().trigger('DropMenu:hide', [t]); return false; }, add : function(o) { o.id = o.id || uniqueId(); t.items.push(o); return o; }, addSeparator : function() { return t.add({'class' : s.separator_class, title : 'separator'}); }, addMenu : function(o) { if (!o.onClick) o.onClick = s.onClick; o = new DropMenu(o); o.parentMenu = t; return t.add(o); } }); }; jQuery.mcDropMenu = DropMenu; jQuery.fn.mcContextMenu = function(s) { this.each(function() { var m = new $.mcDropMenu(s); m.render(this); $(this).bind('contextmenu', function(e) { return m.show(e.clientX, e.clientY); }); }); }; })(jQuery); plugins/filemanager/pages/fm/js/jquery/jquery.json.js000066600000005755150472426320017005 0ustar00(function ($) { var m = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\' }, s = { 'array': function (x) { var a = ['['], b, f, i, l = x.length, v; for (i = 0; i < l; i += 1) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a[a.length] = v; b = true; } } } a[a.length] = ']'; return a.join(''); }, 'boolean': function (x) { return String(x); }, 'null': function (x) { return "null"; }, 'number': function (x) { return isFinite(x) ? String(x) : 'null'; }, 'object': function (x) { if (x) { if (x instanceof Array) { return s.array(x); } var a = ['{'], b, f, i, v; for (i in x) { v = x[i]; f = s[typeof v]; if (f) { v = f(v); if (typeof v == 'string') { if (b) { a[a.length] = ','; } a.push(s.string(i), ':', v); b = true; } } } a[a.length] = '}'; return a.join(''); } return 'null'; }, 'string': function (x) { if (/["\\\x00-\x1f]/.test(x)) { x = x.replace(/([\x00-\x1f\\"])/g, function(a, b) { var c = m[b]; if (c) { return c; } c = b.charCodeAt(); return '\\u00' + Math.floor(c / 16).toString(16) + (c % 16).toString(16); }); } return '"' + x + '"'; } }; $.toJSON = function(v) { var f = isNaN(v) ? s[typeof v] : s['number']; if (f) return f(v); }; $.parseJSON = function(v, safe) { if (safe === undefined) safe = $.parseJSON.safe; if (safe && !/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(v)) return undefined; return eval('('+v+')'); }; $.parseJSON.safe = false; })(jQuery); plugins/filemanager/pages/fm/js/jquery/jquery.template.js000066600000016004150472426320017634 0ustar00/** * jQuery Templates * * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. * * Written by: Stan Lemon * * Based off of the Ext.Template library, available at: * http://www.extjs.com * * This library provides basic templating functionality, allowing for macro-based * templates within jQuery. * * Basic Usage: * * var t = $.template('
        Hello ${name}, how are you ${question}? I am ${me:substr(0,10)}
        '); * * $(selector).append( t , { * name: 'Stan', * question: 'feeling', * me: 'doing quite well myself, thank you very much!' * }); * * Requires: jQuery 1.2+ * * * @todo Add callbacks to the DOM manipulation methods, so that events can be bound * to template nodes after creation. */ (function($){ /** * Create a New Template */ $.template = function(html, options) { return new $.template.instance(html, options); }; /** * Template constructor - Creates a new template instance. * * @param html The string of HTML to be used for the template. * @param options An object of configurable options. Currently * you can toggle compile as a boolean value and set a custom * template regular expression on the property regx by * specifying the key of the regx to use from the regx object. */ $.template.instance = function(html, options) { // If a custom regular expression has been set, grab it from the regx object if ( options && options['regx'] ) options.regx = this.regx[ options.regx ]; this.options = $.extend({ compile: false, regx: this.regx.standard }, options || {}); this.html = html; if (this.options.compile) { this.compile(); } this.isTemplate = true; }; /** * Regular Expression for Finding Variables * * The default pattern looks for variables in JSP style, the form of: ${variable} * There are also regular expressions available for ext-style variables and * jTemplate style variables. * * You can add your own regular expressions for variable ussage by doing. * $.extend({ $.template.re , { * myvartype: /...../g * } * * Then when creating a template do: * var t = $.template("
        ...
        ", { regx: 'myvartype' }); */ $.template.regx = $.template.instance.prototype.regx = { jsp: /\$\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, ext: /\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}/g, jtemplates: /\{\{([\w-]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?\}\}/g }; /** * Set the standard regular expression to be used. */ $.template.regx.standard = $.template.regx.jsp; /** * Variable Helper Methods * * This is a collection of methods which can be used within the variable syntax, ie: * ${variable:substr(0,30)} Which would only print a substring, 30 characters in length * begining at the first character for the variable named "variable". * * A basic substring helper is provided as an example of how you can define helpers. * To add more helpers simply do: * $.extend( $.template.helpers , { * sampleHelper: function() { ... } * }); */ $.template.helpers = $.template.instance.prototype.helpers = { substr : function(value, start, length){ return String(value).substr(start, length); } }; /** * Template Instance Methods */ $.extend( $.template.instance.prototype, { /** * Apply Values to a Template * * This is the macro-work horse of the library, it receives an object * and the properties of that objects are assigned to the template, where * the variables in the template represent keys within the object itself. * * @param values An object of properties mapped to template variables */ apply: function(values) { if (this.options.compile) { return this.compiled(values); } else { var tpl = this; var fm = this.helpers; var fn = function(m, name, format, args) { if (format) { if (format.substr(0, 5) == "this."){ return tpl.call(format.substr(5), values[name], values); } else { if (args) { // quoted values are required for strings in compiled templates, // but for non compiled we need to strip them // quoted reversed for jsmin var re = /^\s*['"](.*)["']\s*$/; args = args.split(','); for(var i = 0, len = args.length; i < len; i++) { args[i] = args[i].replace(re, "$1"); } args = [values[name]].concat(args); } else { args = [values[name]]; } return fm[format].apply(fm, args); } } else { return values[name] !== undefined ? values[name] : ""; } }; return this.html.replace(this.options.regx, fn); } }, /** * Compile a template for speedier usage */ compile: function() { var sep = $.browser.mozilla ? "+" : ","; var fm = this.helpers; var fn = function(m, name, format, args){ if (format) { args = args ? ',' + args : ""; if (format.substr(0, 5) != "this.") { format = "fm." + format + '('; } else { format = 'this.call("'+ format.substr(5) + '", '; args = ", values"; } } else { args= ''; format = "(values['" + name + "'] == undefined ? '' : "; } return "'"+ sep + format + "values['" + name + "']" + args + ")"+sep+"'"; }; var body; if ($.browser.mozilla) { body = "this.compiled = function(values){ return '" + this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.options.regx, fn) + "';};"; } else { body = ["this.compiled = function(values){ return ['"]; body.push(this.html.replace(/\\/g, '\\\\').replace(/(\r\n|\n)/g, '\\n').replace(/'/g, "\\'").replace(this.options.regx, fn)); body.push("'].join('');};"); body = body.join(''); } eval(body); return this; } }); /** * Save a reference in this local scope to the original methods which we're * going to overload. **/ var $_old = { domManip: $.fn.domManip, text: $.fn.text, html: $.fn.html }; /** * Overwrite the domManip method so that we can use things like append() by passing a * template object and macro parameters. */ $.fn.domManip = function( args, table, reverse, callback ) { if (args[0].isTemplate) { // Apply the template and it's arguments... args[0] = args[0].apply( args[1] ); // Get rid of the arguements, we don't want to pass them on delete args[1]; } // Call the original method var r = $_old.domManip.apply(this, arguments); return r; }; /** * Overwrite the html() method */ $.fn.html = function( value , o ) { if (value && value.isTemplate) var value = value.apply( o ); var r = $_old.html.apply(this, [value]); return r; }; /** * Overwrite the text() method */ $.fn.text = function( value , o ) { if (value && value.isTemplate) var value = value.apply( o ); var r = $_old.text.apply(this, [value]); return r; }; })(jQuery); plugins/filemanager/pages/fm/js/jquery/jquery.dialog.js000066600000034716150472426320017272 0ustar00/** * $Id: jquery.dialog.js 637 2009-01-12 12:59:14Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.Window = function(f, a) { var t = this; t.features = f; t.args = a; t.isIE6 = /MSIE [56]/.test(navigator.userAgent); // Register actions t.clickActions = { min : t.minimize, max : t.maximize, med : t.medimize, close : t.close }; t.mouseDownActions = { move : t.startDrag, 'resize-n' : t.startDrag, 'resize-nw' : t.startDrag, 'resize-w' : t.startDrag, 'resize-e' : t.startDrag, 'resize-s' : t.startDrag, 'resize-sw' : t.startDrag, 'resize-se' : t.startDrag }; }; $.extend($.Window.prototype, { getArgs : function() { return this.args; }, focus : function() { var t = this, id = t.id; if (!t.focused) { if (t.shim) t.shim.css('z-index', $.WindowManager.zIndex); $('#' + id).css('z-index', t.zIndex = $.WindowManager.zIndex++); $('#' + id + '_container').addClass('focus'); $('#' + id + '_top').addClass('focustop'); $('#' + id + '_middle').addClass('focusmiddle'); $('#' + id + '_bottom').addClass('focusbottom'); $($.WindowManager.windows).each(function() { if (this != t) this.blur(); }); t.focused = 1; } return this; }, blur : function() { var t = this, id = t.id; if (t.focused) { $('#' + id + '_container').removeClass('focus'); $('#' + id + '_top').removeClass('focustop'); $('#' + id + '_middle').removeClass('focusmiddle'); $('#' + id + '_bottom').removeClass('focusbottom'); t.focused = 0; } return t; }, setTitle : function(ti) { this.features.title = ti; $('#' + this.id + '_title').html(ti); return this; }, setStatus : function(st) { $('#' + this.id + '_statustext').html(st); return this; }, minimize : function() { return this; }, medimize : function() { var t = this, sp = $.scrollPos(), r; if (r = t.lastRect) { $('#' + t.id + '_max').removeClass('med').addClass('max'); t.moveTo(r.x, r.y); t.resizeTo(r.w, r.h); t.lastRect = 0; } return t; }, maximize : function() { var t = this, sp = $.scrollPos(); if (!t.lastRect) { t.lastRect = {x : t.x, y : t.y, w : t.width, h : t.height}; $('#' + t.id + '_max').removeClass('max').addClass('med'); t.moveTo(sp.x, sp.y); t.resizeTo($.winWidth(), $.winHeight(), 1); } return t; }, close : function(ac) { var t = this, f; if (ac && (f = t.features.onbeforeclose)) { if (f.call(t) === false) return; } $('#' + t.id).remove(); if ($.WindowManager.windows.length == 1) $('#windowManEventBlocker').remove(); $.WindowManager.remove(t); if (t.shim) { t.shim.remove(); t.shim = 0; } if (t.features.onclose) t.features.onclose(t); }, moveTo : function(x, y) { var t = this, el = $('#' + t.id); if (t.x != x) { el.css({left : x}); t.x = x; } if (t.y != y) { el.css({top : y}); t.y = y; } if (t.shim) t.shim.css({left : x, top : y}); return t; }, moveBy : function(dx, dy) { return this.moveTo(this.x + parseInt(dx), this.y + parseInt(dy)); }, resizeTo : function(w, h, nr) { var t = this, b = t.borders, el = $('#' + t.id), ifr = $('#' + t.id + '_content, #' + t.id + '_ifr'); w = parseInt(w); h = parseInt(h); if (!nr && t.lastRect) { $('#' + t.id + '_max').removeClass('med').addClass('max'); t.lastRect = 0; } if (t.width != w) { ifr.css({width : w - b.w}); el.css({width : w}); t.width = w; } if (t.height != h) { ifr.css({height : h - b.h}); el.css({height : h}); $('#' + t.id + '_middle').css('height', h - b.h); t.height = h; } if (t.shim) t.shim.css({width : w, height : h}); return t; }, resizeBy : function(dw, dh) { return this.resizeTo(this.width + parseInt(dw), this.height + parseInt(dh)); }, show : function() { var t = this, id = t.id, bw, bh; $('#' + id).show(); // Calculate borders bw = $('#' + id + '_middle div.left')[0].clientWidth; bw += $('#' + id + '_middle div.right')[0].clientWidth; bh = $('#' + id + '_top')[0].clientHeight; bh += $('#' + id + '_bottom')[0].clientHeight; t.borders = {w : bw, h : bh - 1}; if (t.shim) t.shim.show(); return t; }, hide : function() { var t = this; $('#' + t.id).hide(); if (t.shim) t.shim.hide(); return t; }, setContent : function(h) { $('#' + this.id + '_content').html(h); return this; }, setURL : function(u) { var t = this, id = t.id, ifr = $('#' + id + '_ifr'), b = t.borders; if (!ifr[0]) $('#' + id + '_content').html('').append($.createElm('iframe', {id : id + '_ifr', src : u, frameBorder : '0', scrolling : t.features.scrolling}).css({width : t.width - b.w, height : t.height - b.h})); else ifr.attr('src', u); return t; }, startMove : function(a, e) { var t = this, bid = t.features.theme + '_move', mb, sx = e.screenX, sy = e.screenY, dx, dy, wx, wy; $(document.body).append($.createElm('div', {id : bid, 'class' : t.features.theme + '_event_blocker'}).css('z-index', $.WindowManager.zIndex)); mb = $('#' + bid).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); wx = t.x; wy = t.y; mb.mousemove(function(e) { dx = e.screenX - sx; dy = e.screenY - sy; t.moveTo(wx + dx, wy + dy); }); mb.mouseup(function(e) { mb.remove(); }); }, startDrag : function(a, e) { var t = this, bid = t.features.theme + '_move', mb, sx = e.screenX, sy = e.screenY, dx, dy, wx, wy, w, h; $(document.body).append($.createElm('div', {id : bid, 'class' : t.features.theme + '_event_blocker'}).css('z-index', $.WindowManager.zIndex)); mb = $('#' + bid).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); wx = t.x; wy = t.y; w = t.width; h = t.height; mb.mousemove(function(e) { dx = e.screenX - sx; dy = e.screenY - sy; var x = wx + dx, y = wy + dy; switch (a) { case 'resize-n': t.moveTo(wx, y); t.resizeTo(w, h - dy); break; case 'resize-nw': t.moveTo(x, y); t.resizeTo(w - dx, h - dy); break; case 'resize-ne': t.moveTo(wx, y); t.resizeTo(w + dx, h - dy); break; case 'resize-w': t.moveTo(x, wy); t.resizeTo(w - dx, h); break; case 'resize-e': t.resizeTo(w + dx, h); break; case 'resize-s': t.resizeTo(w, h + dy); break; case 'resize-sw': t.moveTo(wx + dx, wy); t.resizeTo(w - dx, h + dy); break; case 'resize-se': t.resizeTo(w + dx, h + dy); break; case 'move': t.moveTo(wx + dx, wy + dy); break; } e.preventDefault(); return false; }); mb.mouseup(function(e) { mb.remove(); }); e.preventDefault(); return false; }, render : function() { var t = this, id = 'win_' + $.WindowManager.count++, f = t.features, mc = '', bl, v; t.features = f = $.extend({ theme : 'clearlooks2', modal : 1, type : 'window', x : -1, y : -1, width : 320, height : 240, title : ' ' }, f); // Center window if (f.x == -1) f.x = Math.round(($.winWidth() / 2) - (f.width / 2)); if (f.y == -1) f.y = Math.round(($.winHeight() / 2) - (f.height / 2)); t.id = id; if (f.modal) { bl = $('#windowManEventBlocker'); if (!bl[0]) { $(document.body).append($.createElm('div', {id : 'windowManEventBlocker', 'class' : f.theme + '_event_blocker'}).addClass(f.theme + '_visible_event_blocker')); bl = $('#windowManEventBlocker'); } bl.show().css('z-index', $.WindowManager.zIndex++).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); } if (t.isIE6 && !t.shim) { $(document.body).append(''); t.shim = $('#' + id + '_shim'); } $(document.body).appendAll( ['div', {id : id, 'class' : f.theme + ' window'}, ['div', {id : id + '_container', 'class' : 'statusbar ' + f.type}, ['div', {id : id + '_top', 'class' : 'windowtop'}, ['div', {'class' : 'left'}], ['div', {'class' : 'middle'}], ['div', {'class' : 'right'}], ['div', {id : id + '_title', 'class' : 'title'}, f.title], ['a', {id : id + '_min', href : '', 'class' : 'action min'}], ['a', {id : id + '_max', href : '', 'class' : 'action max'}], ['a', {id : id + '_close', href : '', 'class' : 'action close'}], ['a', {id : id + '_move', 'class' : 'action move', tabindex : '-1'}], ['a', {id : id + '_resize_n', 'class' : 'action resize resize-n', tabindex : '-1'}], ['a', {id : id + '_resize_nw', 'class' : 'action resize resize-nw', tabindex : '-1'}], ['a', {id : id + '_resize_ne', 'class' : 'action resize resize-ne', tabindex : '-1'}] ], ['div', {id : id + '_middle', 'class' : 'windowmiddle'}, ['div', {'class' : 'left'}], ['div', {id : id + '_content', 'class' : 'middle'}, ' '], ['div', {'class' : 'right'}], ['div', {id : id + '_bigicon', 'class' : 'bigicon'}], ['a', {id : id + '_resize_w', 'class' : 'action resize resize-w', tabindex : '-1'}], ['a', {id : id + '_resize_e', 'class' : 'action resize resize-e', tabindex : '-1'}] ], ['div', {id : id + '_bottom', 'class' : 'windowbottom' + (f.statusbar ? ' statusbarbottom' : '')}, ['div', {'class' : 'left'}], ['div', {'class' : 'middle'}], ['div', {'class' : 'right'}], ['div', {id : id + '_statustext', 'class' : 'statustext'}, ' '], ['a', {id : id + '_resize_s', 'class' : 'action resize resize-s', tabindex : '-1'}], ['a', {id : id + '_resize_sw', 'class' : 'action resize resize-sw', tabindex : '-1'}], ['a', {id : id + '_resize_se', 'class' : 'action resize resize-se', tabindex : '-1'}] ] ] ] ); if (f.bigicon) $('#' + id + '_bigicon').addClass(f.bigicon); if (f.chromeless) $('#' + id + '_container').addClass('chromeless'); if (f.resizable) $('#' + id + '_container').addClass('resizable'); if (f.statusbar) { $('#' + id + '_container').addClass('statusbar'); $('#' + id + '_bottom').addClass('statusbarbottom'); } t.show().hide().resizeTo(f.width, f.height).moveTo(f.x, f.y).show(); if (v = f.title) t.setTitle(v); if (v = f.content) t.setContent(v); if (v = f.url) t.setURL(v); function handleAction(e) { var el = $(e.target), action, f; t.focus(); if (el[0].nodeName == 'A' && el.hasClass('action')) { action = $.grep(el[0].className.split(/\s+/), function(v) {return !/^action|resize$/.test(v);}).join(' '); if (e.type == 'mousedown') f = t.mouseDownActions[action]; else { if (t.features.onaction) { t.features.onaction.call(t, action); return false; } f = t.clickActions[action]; } if (f) { f.call(t, action, e); return false; } } }; $('#' + id).click(handleAction).mousedown(handleAction); $($.WindowManager).trigger('WindowManager:open', [t]); return t; } }); $.WindowManager = { zIndex : 100010, count : 0, windows : [], i18n : { yes : 'Yes', no : 'No', ok : 'Ok' }, setup : function() { var w = window, lw, nwm, op, b; // Find root window manager while ((w = w.parent || w.opener) && w != lw) { if (w.$ && w.$.WindowManager) nwm = w.$.WindowManager; lw = w; } // Found parent window manager use that one and set the title for the dialog if (nwm && nwm != this) { $.CurrentWindowManager = $.WindowManager; b = document.location.pathname.replace(/[^\/]+$/, ''); op = nwm.open; $.WindowManager = $.extend({}, nwm, { open : function(f, a) { // Is relative URL force it absolute if (!/^https?\:|\//.test(f.url)) f.url = b + f.url; return op.call(nwm, f, a); } }); nwm.find(window).setTitle(document.title); } else { $(window).bind('resize', function() { $($.WindowManager.windows).each(function(i, w) { if (w.lastRect) w.resizeTo($.winWidth(), $.winHeight(), 1); }); }); } // Find current window $.WindowManager.currentWindow = $.WindowManager.find(window); }, find : function(tw) { var i, ifr, w; for (i = 0; i < this.windows.length; i++) { w = this.windows[i]; ifr = $('#' + w.id + '_ifr')[0]; if (ifr && ifr.contentWindow == tw) return w; } return this.defaultWin; }, open : function(f, a) { var w = new $.Window(f, a).render(); this.windows.push(w); return w.focus(); }, warn : function(msg, cb) { return this.modalBox(msg, { bigicon : 'warning' }, cb); }, error : function(msg, cb) { return this.modalBox(msg, { bigicon : 'error' }, cb); }, info : function(msg, cb) { return this.modalBox(msg, { bigicon : 'info' }, cb); }, confirm : function(msg, cb) { return this.modalBox(msg, { type : 'confirm', bigicon : 'ask', onaction : function(a) { var t = this; if (a == 'ok') { t.close(); if (cb) cb.call(t, 1); } else if (a == 'cancel' || a == 'close') { t.close(); if (cb) cb.call(t, 0); } } }, cb).setContent( '
        ' + msg +'
        ' + '' + this.i18n.yes + '' + '' + this.i18n.no + '' ); }, modalBox : function(msg, f, cb) { f = $.extend({ type : 'alert', bigicon : 'error', width : 400, height : 130, onaction : function(a) { if (a == 'ok') { this.close(); if (cb) cb.call(this, 1); } else if (a == 'close') this.close(); } }, f); return this.open(f).setContent( '
        ' + (msg || '') +'
        ' + '' + this.i18n.ok + '' ); }, remove : function(w) { var t = this, fr, z = 0, nl = []; // Find front most window $(t.windows).each(function(i, cw) { if (w == cw) return; if (cw.zIndex > z) { z = cw.zIndex; fr = cw; } nl.push(cw); }); t.windows = nl; if (fr) fr.focus(); } }; $.WindowManager.setup(); })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.flash.js000066600000010645150472426320021461 0ustar00/** * $Id: jquery.multiupload.gears.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function getFlashVersion() { var v; try { v = navigator.plugins['Shockwave Flash']; v = v.description; } catch (ex) { try { v = new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version'); } catch (ex) { v = '0.0'; } } v = v.match(/\d+/g); return parseFloat(v[0] + '.' + v[1]); }; if (!$.multiUpload.initialized && getFlashVersion() >= 10) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'flash'; $.multiUpload.instances = []; $.multiUpload._fireEvent = function(na, p1, p2, p3, p4) { // Detach event from flash window.setTimeout(function() { $($.multiUpload.instances).each(function(i, v) { $(v).trigger('multiUpload:' + na, [p1, p2, p3, p4]); v.repaint(); }); }, 0); }; // Override init function $.extend($.multiUpload.prototype, { getFlash : function() { return $('#flashuploader')[0]; }, repaint : function() { var up = this, fb = $(up.settings.flash_browse_button), off = fb.offset(); up.flashContainer.css({position : 'absolute', top : off.top, left : off.left, width : fb.width(), height : fb.height(), backgr2ound : 'red'}); }, init : function() { var up = this, s = up.settings, so, fb; $.multiUpload.instances.push(up); $(up).bind('multiUpload:flashInit', function(e) { $(up).trigger('multiUpload:init'); }); $(document.body).append('
        '); so = new SWFObject("js/jquery/jquery.multiupload.flash.swf", "flashuploader", "100%", "100%", "10.0"); so.addVariable("file_filter", $.map(up.settings.filter, function(v) { return '*.' + v }).join(';')); so.addParam("wmode", "transparent"); so.write("flashUploaderContainer"); up.flashContainer = $('#flashUploaderContainer'); // Reposition flash $(function(e) { up.repaint(); }); up.repaint(); // Register event handlers $(up).bind('multiUpload:flashSelectFiles', function(e, sel) { // Add selected files to file queue $(sel).each(function(i, fo) { up.files.push(fo); }); // Trigger events $(up).trigger('multiUpload:filesSelected', [{files : sel}]); $(up).trigger('multiUpload:filesChanged'); }); $(up).bind('multiUpload:flashUploadComplete', function(e, o) { var fo; if (fo = up.getFile(o.id)) { if (!fo.status) { fo.status = 'completed'; $(up).trigger('multiUpload:fileUploaded', [{file : fo, response : o.text}]); } } $(up).trigger('multiUpload:filesChanged'); up.uploadNext(); }); $(up).bind('multiUpload:flashUploadProcess', function(e, pr) { var fo = up.getFile(pr.id); if (!fo.status) { fo.loaded = pr.loaded; $(up).trigger('multiUpload:fileUploadProgress', [{file : fo, loaded : fo.loaded, total : fo.size}]); } }); $(up).bind('multiUpload:flashIOError', function(e, o) { var fo; if (fo = up.getFile(o.id)) { if (!fo.status) { fo.status = 'failed'; $(up).trigger('multiUpload:uploadChunkError', [{file : fo, error : o.message}]); } } }); $(up).bind('multiUpload:stopUpload', function(e) { up.getFlash().cancelUpload(); }); $(up).bind('multiUpload:removeFile', function(e, fo) { up.getFlash().removeFile(fo.id); }); $(up).bind('multiUpload:clearFiles', function(e) { up.getFlash().clearFiles(); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { var pageURL = document.location.href.replace(/\/[^\/]+$/g, '/'); up.getFlash().uploadFile(fo.id, { upload_url : pageURL + up.settings.upload_url + '&path=' + escape(up.settings.path) + '&name=' + escape(fo.name), chunk_size : up.settings.chunk_size, file_field : 'file0', post_args : { name0 : fo.name } }); }); $(up).bind('multiUpload:flashUploadChunkComplete', function(e, o) { var fo = up.getFile(o.id), arg; arg = { file : fo, chunk : o.chunk, chunks : o.chunks, response : o.text }; if (!fo.status) $(up).trigger('multiUpload:chunkUploaded', [arg]); if (arg.cancel) { fo.status = 'failed'; up.getFlash().cancelUpload(); } }); } }); } })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.gears.js000066600000007076150472426320021471 0ustar00/** * $Id: jquery.multiupload.gears.js 616 2008-11-27 15:43:52Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { if (!$.multiUpload.initialized && window.google && google.gears) { $.multiUpload.initialized = 1; $.multiUpload.runtime = 'gears'; // Override init function $.extend($.multiUpload.prototype, { init : function() { var up = this; $(up).trigger('multiUpload:init'); $(up).bind('multiUpload:selectFiles', function(e) { var up = this, desk = google.gears.factory.create('beta.desktop'), s = {}; if (up.settings.filter[0] != '*') s.filter = $.map(up.settings.filter, function(v) {return '.' + v}); desk.openFiles(function(f) { var sf = []; if (f.length) { up._fireEvent('multiUpload:beforeFilesSelected'); $(f).each(function() { var fo = { id : up.generateID(), name : this.name, blob : this.blob, size : this.blob.length, loaded : 0 }; up.files.push(fo); sf.push(fo); }); up._fireEvent('multiUpload:filesSelected', [{files : sf}]); up._fireEvent('multiUpload:filesChanged'); } else up._fireEvent('multiUpload:filesSelectionCancelled'); }, s); }); $(up).bind('multiUpload:uploadFile', function(e, fo) { var req, up = this, chunkSize, chunk = 0, chunks, i, start, loaded = 0, curChunkSize; chunkSize = up.settings.chunk_size || 1024 * 1024; chunks = Math.ceil(fo.blob.length / chunkSize); uploadNextChunk(); function uploadNextChunk() { var url = up.settings.upload_url; if (fo.status) return; curChunkSize = Math.min(chunkSize, fo.blob.length - (chunk * chunkSize)); req = google.gears.factory.create('beta.httprequest'); req.open('POST', url + (url.indexOf('?') == -1 ? '?' : '&') + 'name=' + escape(fo.name) + '&chunk=' + chunk + '&chunks=' + chunks + '&path=' + escape(up.settings.path)); req.setRequestHeader('Content-Disposition', 'attachment; filename="' + fo.name + '"'); req.setRequestHeader('Content-Type', 'application/octet-stream'); req.setRequestHeader('Content-Range', 'bytes ' + chunk * chunkSize); req.upload.onprogress = function(pr) { fo.loaded = loaded + pr.loaded; up._fireEvent('multiUpload:fileUploadProgress', [{file : fo, loaded : fo.loaded, total : fo.size}]); }; req.onreadystatechange = function() { var ar; if (req.readyState == 4) { if (req.status == 200) { ar = {file : fo, chunk : chunk, chunks : chunks, response : req.responseText}; up._fireEvent('multiUpload:chunkUploaded', [ar]); if (ar.cancel) { fo.status = 'failed'; up._fireEvent('multiUpload:filesChanged'); up.uploadNext(); return; } loaded += curChunkSize; if (++chunk >= chunks) { fo.status = 'completed'; up._fireEvent('multiUpload:fileUploaded', [{file : fo, response : req.responseText}]); up._fireEvent('multiUpload:filesChanged'); up.uploadNext(); } else uploadNextChunk(); } else up._fireEvent('multiUpload:uploadChunkError', [{file : fo, chunk : chunk, chunks : chunks, error : 'Status: ' + req.status}]); } }; if (chunk < chunks) req.send(fo.blob.slice(chunk * chunkSize, curChunkSize)); }; }); }, _fireEvent : function(ev, ar) { $(this).trigger(ev, ar); } }); } })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.template.ext.js000066600000001443150472426320020434 0ustar00/** * $Id: jquery.template.ext.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ $.template.regx.standard = $.template.regx.ext; $.templateFromScript = function(el, opts) { return $.template($.trim($.translate($(el).html().replace(/()/gi, ''))), opts); }; // Add template helpers $.extend($.template.helpers, { sizefix : function(v) { v = parseInt(v); if (isNaN(v) || v == -1) return ''; // MB if (v > 1048576) return Math.round(v / 1048576, 1) + " MB"; // KB if (v > 1024) return Math.round(v / 1024, 1) + " KB"; return v + " b"; }, encodeURIComponent : function(v) { return encodeURIComponent(v); } }); })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.flash.swf000066600000007214150472426320021642 0ustar00CWS x}8Y[וvURKbPe I h"Npwuw]Rjg1IرEYdgd2=}y+Ќ曗yw͹q==݂ܳ-B=B 9 $Ny_˥5m|y +Y- onnmJ#/^>{v%y̗Os1.E.C 7R{5>PZ263g*ʤǬB)gFi,g 黛Ɔ9h9F9{y ڮcOf )34[\a™'v b& U͇0JʱY4^6#PLdni};F~bS ws \5g#xy]`I,_e?~.bWGdcOSk&r-L2f"Wq\Rt F&1UiBn Vș#$H?6 vFYvKv~=2dnHSl],Kf̱L|T*8Ҹl+%~Bbkp-:leAߨhExꎙvEMvv%2Kf>mkcCe3vrM1{{ء5i:v&Z]] OLcݝ(k ی:vQKfa2 tp64ZWbdmWD֠.cJl\[_qm4-i>nS`ݿה.7"q>KƜ>|q&MYtZY)">( 13LT`$MU|yJZ-9jzz`n<'Ąxdo9c*sX"zcuD4>872MLZp]5۷0Jyi3,,#m֤ 2ݐSXܷ҆A#G(yT7M+&?=٩fi&o(3? ržaSO%=OcWTӏ=-/h`m`pOdR ѩ9eyjn*/3L:z^]/&榦Wdu>41*:97H%e-eyLEG͔%4`[޴3FY^Ϻ̳wTu yR6oLR*J*(>_@_KDԒC+rtn&>_]ZP}puQ.+~Ŝ|H~\1+߽f8ukSqҺ6rYXԶk8j9BI.ftHe+:Zmi,ddlT]\__Z^Vg≩RTtuifm/å$1bU3fUuVleKZMg=wLr>}9e.J2vXv \/_ZPvٲ^-%th`(qмkgj.L5i{6mGѦ@cn-WO4͛n+Ju%sd=|H֧փ+t;XֈEDZh+W*um2i=I29 Ŏ;:;2KuzDס QH (T*hTPKz A*6PJ[)=Bi).J)=J1JCTL!Bag>J_pB/__/Q2 Q &im4nP0K% sx TIT~«@(F!A!I`RN!Kp] r \ ޠU ;xp|7p4M\Z-xq6*}@{}#qǏY(~Oq QG8hC\Q_#q# ڸ]'@?ų_3+[w`&bQ  [$IaeK UU=`O2t@M_??"Wbmz0 @j i"@ZԷC AH'"AXw9$@g^g{N<-F9CHYG}u:.ś* V .Yu{J%;l9\ ۳]+*ěY0g|]+/DҳB3B_8$(X+OWw ]U5Y7x[ELt$vsqr9Rɉ_j:oz[ߥG)*>T,ъv GJJle'}D P΄֥ VF g!|ΧN!x,ޯp&'2e9-Ǐ;;IHE:LR#btXtV SHCMGck}ٲp.NkIӯ1]+c!BJ_hس6"JQqk,#ď#Yj׵{'vA ~"A57^FlI/bIDۑ":MOEԌm[Q/ GUd"k 2QV:xv/x{Qo,oAQssüWX:%$M+jz|Xa8ٌxɯz֨H~>8Y}=R=WeL#5o&y" FD[@ѻNO@(Bg=mh'z_[0.T{ɑd߬쨟Oַ!J򎔖P %qt54M))jxh//5b_5ʊ 3mf"v<݀w.#dAQ]`2Gh`!q|? 0Y9T J,GzꟄ݃Gp>rrijr9kƏAvR0'GU/p_vUO8X?Ga3>cX¿,~!-W\-Q?}L2tO1py /> F8ԌOϠZ=+y'P(>X] _^BISyQ^Ģ9#+S}FRrRqct)?秈C$)xPQh}=TC: ]qplugins/filemanager/pages/fm/js/jquery/jquery.scrollto.js000066600000016007150472426320017665 0ustar00/** * jQuery.ScrollTo * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com * Dual licensed under MIT and GPL. * Date: 9/11/2008 * * @projectDescription Easy element scrolling using jQuery. * http://flesler.blogspot.com/2007/10/jqueryscrollto.html * Tested with jQuery 1.2.6. On FF 2/3, IE 6/7, Opera 9.2/5 and Safari 3. on Windows. * * @author Ariel Flesler * @version 1.4 * * @id jQuery.scrollTo * @id jQuery.fn.scrollTo * @param {String, Number, DOMElement, jQuery, Object} target Where to scroll the matched elements. * The different options for target are: * - A number position (will be applied to all axes). * - A string position ('44', '100px', '+=90', etc ) will be applied to all axes * - A jQuery/DOM element ( logically, child of the element to scroll ) * - A string selector, that will be relative to the element to scroll ( 'li:eq(2)', etc ) * - A hash { top:x, left:y }, x and y can be any kind of number/string like above. * @param {Number} duration The OVERALL length of the animation, this argument can be the settings object instead. * @param {Object,Function} settings Optional set of settings or the onAfter callback. * @option {String} axis Which axis must be scrolled, use 'x', 'y', 'xy' or 'yx'. * @option {Number} duration The OVERALL length of the animation. * @option {String} easing The easing method for the animation. * @option {Boolean} margin If true, the margin of the target element will be deducted from the final position. * @option {Object, Number} offset Add/deduct from the end position. One number for both axes or { top:x, left:y }. * @option {Object, Number} over Add/deduct the height/width multiplied by 'over', can be { top:x, left:y } when using both axes. * @option {Boolean} queue If true, and both axis are given, the 2nd axis will only be animated after the first one ends. * @option {Function} onAfter Function to be called after the scrolling ends. * @option {Function} onAfterFirst If queuing is activated, this function will be called after the first scrolling ends. * @return {jQuery} Returns the same jQuery object, for chaining. * * @desc Scroll to a fixed position * @example $('div').scrollTo( 340 ); * * @desc Scroll relatively to the actual position * @example $('div').scrollTo( '+=340px', { axis:'y' } ); * * @dec Scroll using a selector (relative to the scrolled element) * @example $('div').scrollTo( 'p.paragraph:eq(2)', 500, { easing:'swing', queue:true, axis:'xy' } ); * * @ Scroll to a DOM element (same for jQuery object) * @example var second_child = document.getElementById('container').firstChild.nextSibling; * $('#container').scrollTo( second_child, { duration:500, axis:'x', onAfter:function(){ * alert('scrolled!!'); * }}); * * @desc Scroll on both axes, to different values * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } ); */ ;(function( $ ){ var $scrollTo = $.scrollTo = function( target, duration, settings ){ $(window).scrollTo( target, duration, settings ); }; $scrollTo.defaults = { axis:'y', duration:1 }; // Returns the element that needs to be animated to scroll the window. // Kept for backwards compatibility (specially for localScroll & serialScroll) $scrollTo.window = function( scope ){ return $(window).scrollable(); }; // Hack, hack, hack... stay away! // Returns the real elements to scroll (supports window/iframes, documents and regular nodes) $.fn.scrollable = function(){ return this.map(function(){ // Just store it, we might need it var win = this.parentWindow || this.defaultView, // If it's a document, get its iframe or the window if it's THE document elem = this.nodeName == '#document' ? win.frameElement || win : this, // Get the corresponding document doc = elem.contentDocument || (elem.contentWindow || elem).document, isWin = elem.setInterval; return elem.nodeName == 'IFRAME' || isWin && $.browser.safari ? doc.body : isWin ? doc.documentElement : this; }); }; $.fn.scrollTo = function( target, duration, settings ){ if( typeof duration == 'object' ){ settings = duration; duration = 0; } if( typeof settings == 'function' ) settings = { onAfter:settings }; settings = $.extend( {}, $scrollTo.defaults, settings ); // Speed is still recognized for backwards compatibility duration = duration || settings.speed || settings.duration; // Make sure the settings are given right settings.queue = settings.queue && settings.axis.length > 1; if( settings.queue ) // Let's keep the overall duration duration /= 2; settings.offset = both( settings.offset ); settings.over = both( settings.over ); return this.scrollable().each(function(){ var elem = this, $elem = $(elem), targ = target, toff, attr = {}, win = $elem.is('html,body'); switch( typeof targ ){ // A number will pass the regex case 'number': case 'string': if( /^([+-]=)?\d+(px)?$/.test(targ) ){ targ = both( targ ); // We are done break; } // Relative selector, no break! targ = $(targ,this); case 'object': // DOMElement / jQuery if( targ.is || targ.style ) // Get the real position of the target toff = (targ = $(targ)).offset(); } $.each( settings.axis.split(''), function( i, axis ){ var Pos = axis == 'x' ? 'Left' : 'Top', pos = Pos.toLowerCase(), key = 'scroll' + Pos, old = elem[key], Dim = axis == 'x' ? 'Width' : 'Height', dim = Dim.toLowerCase(); if( toff ){// jQuery / DOMElement attr[key] = toff[pos] + ( win ? 0 : old - $elem.offset()[pos] ); // If it's a dom element, reduce the margin if( settings.margin ){ attr[key] -= parseInt(targ.css('margin'+Pos)) || 0; attr[key] -= parseInt(targ.css('border'+Pos+'Width')) || 0; } attr[key] += settings.offset[pos] || 0; if( settings.over[pos] ) // Scroll to a fraction of its width/height attr[key] += targ[dim]() * settings.over[pos]; }else attr[key] = targ[pos]; // Number or 'number' if( /^\d+$/.test(attr[key]) ) // Check the limits attr[key] = attr[key] <= 0 ? 0 : Math.min( attr[key], max(Dim) ); // Queueing axes if( !i && settings.queue ){ // Don't waste time animating, if there's no need. if( old != attr[key] ) // Intermediate animation animate( settings.onAfterFirst ); // Don't animate this axis again in the next iteration. delete attr[key]; } }); animate( settings.onAfter ); function animate( callback ){ $elem.animate( attr, duration, settings.easing, callback && function(){ callback.call(this, target, settings); }); }; function max( Dim ){ var attr ='scroll'+Dim, doc = elem.ownerDocument; return win ? Math.max( doc.documentElement[attr], doc.body[attr] ) : elem[attr]; }; }).end(); }; function both( val ){ return typeof val == 'object' ? val : { top:val, left:val }; }; })( jQuery );plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.silverlight.xap000066600000024612150472426320023073 0ustar00PKQ961*MAppManifest.xaml`I%&/m{JJt`$ؐ@iG#)*eVe]f@흼{{;N'?\fdlJɞ!?~|?"ǿ|4_"_El>h޶Gw6yȚUSi;- jzwogݙ}#yѻ޾*wet/b7Mן}AfwoW||Z}Z/bd^7E죽GGq޸/mSw^d uYI(xw#PKyU9g]~'p Upload.dll`I%&/m{JJt`$ؐ@iG#)*eVe]f@흼{{;N'?\fdlJɞ!?~|?"?_ukׯ!?7=7]~]_?M:[ltz闯E5ǿon k<5  g刺3kE9_=]6?~kƟkoD?zI_7 o{]K?#icͼ0zk(ny=:/kAvOO~GϏ=?z~Gϗ_uէƯ_5{Ư?~_Hدz֯kzoAn G5EkzkZNG o/E~ǝ_ſ[}۫_mߞu߁~V#SS;ߙI~קߐ~Z4&[ >V^gҿV?~]@535u)wk'hFxZ:k&k|Z/V߮cկ_Ͷ~7o Z:kmBͯWoUBk5ӏ_k!;֯A#Fc16 %fɯ} ~_E77`_XFok%-jkwNdm~ꎇoV{K~ש~OoTGh7o1ܻ=?Ap}p: pztڃ'}ieJLCV[o[zo6kzm5_?+ol/{?3_C'yRCv~$~7mof7qnݧ6~CFolf$~__7g~7u_K_o%_zo/G_zo'_o/O__~ oVmo _ ֿA) oVB߀<@ϩϭ_ת_1}ׂX~Z>_?IB>c$q_נא'uvPfb?{~_B\zί[>I&o%֧<[񛿑Q}xPtuL_+IG'ݮV=:zrkZ7[ZZ{_<7~=|_<7~}|_<[7~|[_<S~Ϙ_*z/1 Ўv_|  ^5KaxjЬ 7`b~C7Ə_k+{['5*~oO_ǯK~}g:msC2նnoI݁7~B>tm_ϡŨ_kt'2:ޯ:/]~?Q~.ċ/D'-oH`_y%՞~ȷ15>)-(3ׯCF7vc0_Luv_Zu~1_%rѯI?xց &KK}_נkF v>e&e:~W#~7qws }Tṿ{~ǝ_'-^{!b=_뗠kWc֎? x~~_㏧Y5aX~ f ?1-qoZ $~^翐z?fo{g#0_7L>(~_P'cɯ۠G{7-g_0o///I11ۯz ^5V:_ׯ~R/7 Υ_~_7~$xC@M X~~{ч^U_П7O(~~/&ׯ*y&&?IK߂%y߅෥Z_Ka_ aiߎ~^{Bscȁ%>P_{(19/UX)'7x]Od_>2ߨ!N~ ~ z_뗠%M›ʯa4毱kc0?-u+3 waܾsNmT!}kwD:ƟLsNC0|rkk ߈^)7я"X! d~J?g5> _EZA~5Voch7߮C׫~_mS@(ssHQt(%)d~Frȯ'`kp4cf___?x77HDZ7 h:?K@~~'>װQ ׯ2|Un1qϯ>n߆6o+vaWx@?]s1O~{w;C~ۛmb(?_n|1~7պUz.iUdd^7EloFɺlu2_uVҗIYLM6_~6y ?{w^"7[0 SWZ?Yk~ůQŊ5r#jEe- 7N~ݢ\6}4oգw<_dxQL목Zܽ*|z](ɗ-xNʬZU6j>N۩(iY4kvki_e̫u9K'y:ϋ%5u>NC߿kjZuUz/>tyq1o?h`#ѯw]\<؃#7~_k#ۺX^4hKG,W?#G?)}Rn?Xow؏;k5~qTn}$7I?p_15^kߙ7F?_ɯ7ѿޯ/o~ӿɯolI535+nF ~ #:1K~ ÷?c/O~6/|g:6H7m~=75%ZѿH-_h7A }Fbd~M7yi>_)c~_~-z[sk}Oп_@P~k17_ ௿_75&!|8Fw!k|_KKw5~7_S5ם_+>5~o5' ~-P~Z?I53C_k;xw3ҿ鯽__~_毱Oz}_0z?֯k+?kwW#㟴pxזo_?;5!S7"5kZ_9]wRKZ'轻?$ǯW_넲ԏ_}cWk}$ӿVok/&M~C# f*M~?w75$}c4_%K'O\gp)gok׮[돢~_W_}M[},kl_Ro_?607/~?ӿ{oӿ_~~_",rT~ߍ~ 诗oO_w_=uNklO?_ouE5~u ] /`|zOO {~`?A0/y~{Yޑ޿k{ Z_{=!/޽owD&=F _O5_:ޯ<(o~كկy޿{=u$f=oNw~?_22SÿCx?&~FO aw?'wOyׯq\5Dҿ ZS.=_k?߿?3~]_l?5΃scou_'RL޿7+?aޥƯk.?7?ֿ_k˅m5o'^ _kLL~k*ckBد_75?5w7xkد|ko_o;ѿ?AD/ _ίys_s;ůG~Ko=o'?kΟkVDό~?k/hLjc?o_sk|z>>ݯ[/_s_5__I^FkUɔߞqMX'?#23֝_?H_ 0_kߒ?_7S-_/ã_1_oZůK>#Fԯ~777~_~-~77/_7N ~m~㿆ߖ|oZcZMwg ZMdFwx_35_ע_㷢?kƯ__Ϡ?5AnJk"G#Ɵkg:/ѯҿu~݄&/] T~-ף~~>g7 ףO~{"'|~7#@BlsDZAEoJ Uk<9~Ssk&x~Ϳ~~u_iאѯ ?M~g췍C{E uhסQ::4__F:4_-%/ٺ̏~ M[נdk k<+JJSf9/wE>fuQ^攇Xˏj*6vym>o_uU?^cKJהO}ɼYu` &kjYR0+j_Orie~zO۪5^YݮW/W9lvn{kPω8[mrгZ7f'UYR3<_u15AV_{9fk4I5뚦gA/i]ZELgE~9x}ɗū|Q]Ig48ɈJ4/~ 2[ƚ. ưٗg(~f^Sbr:e&-&: }l~-F~&SƉ&ӿF6jU/EMF{6cfh٘_ eyA˗˳//4|Aƿ1K[B_ΛҔy8rMҧ qmNQ~ښ –dΖ5}I~Q,L B8~A1g'IVmVr77K@2VP iWY-_EӒjߎ:>n);Y}I6[zEx_3C Ȱh.~ˬ\տFBU"W3bYM-KMo]yMM_:zʖX'a<_~yKxfl3>#뼾,-'|]u-tLKi],C#" Hͭ2Ȃhį2{ǿ5nIQGr  `l+ʨokX[˾P%zeh$3Z,q3dkP_ ܦoi@kD%BUO.JvCX#~Q=PyAF̛=3H|b0qs5NE^ ")%gUC .kcM~L|'{O)G5ryqO/Wo?ІDX@џdr!MáƟ[ RaxL _C~1mV,Z@p&`[}m?k|y/2$' N:#s1>OYoD0^|8! ւ ە)Z/[$R`~G W?5V9kRWR| 6L_ˊmۇmho>^y>kfoWթR_ck߯dA% 7GW d_>5[\7_!E7"ƵN xGXF3@ PxHYv߽XQTʡe@]mF7$+~h [a̋qm)l}%>oL_lQկqE(~V#? kܿKME-fɔ~['c*,RaC-_cMF{~ߟVO_N)c ݆ZNhk~N?{Z9ƝngLMenqAko֯ǻNxv;vx%_d×o gt{I=i} ]Xb靖)*0 KZ<`*_R@|XhQ+˻ཚ:w3^<ݯk}o?}_} ~௼_K_w-~{;ZޯzoZoZokzockֿk&ɯŝ_M7_/7 ~-~jMk̿.uo[oo;o)2z%5~߀-wG&n;voq~'dK?ٲBHZ:ȶ_ kz_PEѴ@/'S7_> :Z>Ak?/}~MD4ίk_wMh>- 7- w-5Zo;N@7_okw__'ί2/*j$k)8~_wu߀~ ?Z҈o{Rb?~!J-RO7s5㯟o[{HoZDC ~_4k.;NTD,$.gZIJTV&-lX#u5Ylg;Ư;Ưpl~k6߭[65odI/O5^~O?ӿ?~y_%_c%׾]'UMﻘ.%|O_M=} Wd~PO?f_/h{k'yӲ9'߿~ kɯAkI\Ϸkfާߟ=5^ogEg;/cVa[$Y^gd3[oی=T~?_@Zq1 ȇY^5! ,ccoakPư [V'X$@~MmPƔ>5?3IMyl`'k`N⦅do;7g}VFo:l}cXD|\ %V5"_MGPߓRڿy#;L'g읷gTϏkMGϏ=?z~GCͯQj/?z~GϏ=?z~GϏ PKQ961*MAppManifest.xamlPKyU9g]~'p XUpload.dllPKv(plugins/filemanager/pages/fm/js/jquery/jquery.i18n.js000066600000002445150472426320016604 0ustar00/** * $Id: jquery.i18n.js 481 2008-10-20 15:40:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { function xmlEncode(s) { return s ? ('' + s).replace(new RegExp('[<>&"\']', 'g'), function (c, b) { switch (c) { case '&': return '&'; case '"': return '"'; case '\'': return '''; // ' is not working in MSIE case '<': return '<'; case '>': return '>'; } return c; }) : s; }; $.translate = function(s, e, va) { return s.replace(/\{#([^\}]+)\}/g, function(a, b) { var pa = b.split(/\./); if (MCManagerI18n[pa[0]]) a = MCManagerI18n[pa[0]][pa[1]]; a = a ? a : '{#' + b + '}'; if (va) { a = a.replace(/\{([^\}]+)\}/g, function(a, b) { return va[b] || a; }); } return e ? xmlEncode(a) : a; }); }; $.translateElement = function(e) { e = e || document.body; e.innerHTML = $.translate(e.innerHTML.replace(/=({#[a-z0-9_]+})/gi, '="$1"'), 1); }; document.title = $.translate(document.title.replace(/^(http|https):\/\/[a-z0-9._\-\s]+-/gi, '')); $('body > *').each(function(i, v) { if (!/(SCRIPT|BR|HR|INPUT|META|IMG|LINK|PARAM|IFRAME)/.test(v.nodeName)) $.translateElement(v); }); })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.domutils.js000066600000002060150472426320017656 0ustar00/** * $Id: jquery.domutils.js 460 2008-10-14 16:06:43Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.extend({ createElm : function(n, a, h) { n = $(document.createElement(n)); n.attr(a).html(h); return n; }, appendElements : function(te, ne) { var i, n; if (typeof(ne) == 'string') te.appendChild(document.createTextNode(ne)); else if (ne.length) { te = te.appendChild($.createElm(ne[0], ne[1])[0]); for (i=2; i b : a < b) return -1; } catch (ex) { // Ignore } return 1; }; if (data.length) data = data.sort(typeof(data[0][by]) == 'number' ? numSort : strSort); return data; }; })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.js000066600000154736150472426320016041 0ustar00/* * jQuery 1.2.6 - New Wave Javascript * * Copyright (c) 2008 John Resig (jquery.com) * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $ * $Rev: 5685 $ */ (function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
        "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
        ","
        "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
        ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();plugins/filemanager/pages/fm/js/jquery/jquery.dialog.status.js000066600000006157150472426320020612 0ustar00/** * $Id: jquery.dialog.status.js 552 2008-11-03 12:32:05Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { $.StatusWindow = function(f, a) { var t = this; t.isIE6 = /MSIE [56]/.test(navigator.userAgent); f = $.extend({ type : 'status', width : 400, height : 240, onaction : function(a) { if (a == 'ok') t.close(); } }, f); $.Window.call(t, f, a); }; $.extend($.StatusWindow.prototype, $.Window.prototype, { setContent : function(co) { var v, k, h = ''; if (typeof(co) != 'string') { // Build string $(co).each(function(i, v) { h += '
        ' + '
        ' + v.title + '
        ' + '
        ' + v.content + '
        ' + '
        '; }); } $('#' + this.id + '_statuscont').html(h || co); return this; }, render : function() { var t = this, f, v; $.Window.prototype.render.call(t); $.Window.prototype.setContent.call(t, '
        ' + '' + $.WindowManager.i18n.ok + '' ); f = t.features; if (v = f.content) t.setContent(v); return t; } }); if (!$.CurrentWindowManager) { $.extend($.WindowManager, { status : function(f, cb) { var t = this, w; f = $.extend({ onaction : function(a) { if (a == 'ok') { w.close(); if (cb) cb.call(t, 1); } else if (a == 'close') w.close(); } }, f); w = new $.StatusWindow(f).render(); t.windows.push(w); return w.focus(); }, showProgress : function(f) { var t = this, bl, id = 'progressWindow'; t.hideProgress(); t.progress = 1; f = $.extend({ theme : 'clearlooks2', x : -1, y : -1 }, f); bl = $('#windowManProgressEventBlocker'); if (!bl[0]) { $(document.body).append($.createElm('div', {id : 'windowManProgressEventBlocker', 'class' : f.theme + '_event_blocker'}).addClass(f.theme + '_visible_event_blocker')); bl = $('#windowManProgressEventBlocker'); } bl.show().css('z-index', t.zIndex++).css({width : $.winWidth(), height : $.winHeight(), position : t.isIE6 ? 'absolute' : 'fixed'}); $(document.body).appendAll( ['div', {id : id, 'class' : f.theme + '_progress'}, ['div', {id : id + '_msg', 'class' : 'message'}] ] ); $('#' + id + '_msg').html(f.message); $('#' + id).css({left : -1000, top : -1000}).show(); // Center window if (f.x == -1) f.x = Math.round(($.winWidth() / 2) - ($('#' + id).width() / 2)); if (f.y == -1) f.y = Math.round(($.winHeight() / 2) - ($('#' + id).height() / 2)); $('#' + id).css({left : f.x, top : f.y}); $(t).bind('WindowManager:open', function() {t.hideProgress();}); }, hideProgress : function() { var t = this; if (t.progress) { $('#progressWindow').remove(); $('#windowManProgressEventBlocker').hide(); $(t).unbind('WindowManager:open', t.hideProgress); t.progress = 0; } } }); } })(jQuery);plugins/filemanager/pages/fm/js/jquery/jquery.multiupload.flash.expressinstall.swf000066600000001405150472426320024715 0ustar00CWSAxTO@uw-ע!1J 5 Y@l;@6ܳr⸉!F7vqB(3)Ka0.1`ziE9&/ h 1ms-1K;yeJ& J x7BP>h-3ˡG=1''7 {aI߱YO]uJsGюB'IE"x].楰:1Tq*;hR'-+HЪ ʚ\E&W%pRNi 24l79IW|6'm&j}qb3VZMQzvڂ̯$бmK"{>*<plugins/filemanager/pages/fm/js/createdir.js000066600000005075150472426320015134 0ustar00(function($){ window.CreateDirDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args, cleanNames; args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); // Add templates RPC.exec('fm.getConfig', {path : args.path}, function(data) { var config = data.result, templates = [], tpl; if (!RPC.handleError({message : 'Get config error', visual_path : t.visualPath, response : data})) { cleanNames = config['filesystem.clean_names'] == "true"; $(config['filesystem.directory_templates'].split(/,/)).each(function(i, v) { if (v) { v = $.trim(v).split('='); templates.push({name : /([^\/]+)$/.exec(v[0])[0], value : v[1] || v[0]}); } }); if (config['filesystem.force_directory_template'] == "true") { $('#template').html(''); if (templates.length == 1) $('#templaterow').hide(); } if (templates.length == 0) $('#templaterow').hide(); tpl = $.templateFromScript('#template_template'); $(templates).each(function(i, v) { $('#template').append(tpl, v); }); $('#content').show(); $('#createin').html(args.visual_path); $('form').submit(function() { var tpl = $('#template').val(), name = $('#dirname').val(); if (cleanNames) name = $.cleanName(name); if (!t.isDemo()) { RPC.exec('fm.createDirs', {path : args.path, name0 : name, template0 : tpl}, function(data) { var res = RPC.toArray(data.result), s = t.currentWin.getArgs(); if (!RPC.handleError({message : '{#error.createdir_failed}', visual_path : args.visual_path, response : data})) { // Insert file if (s.oncreate) { RPC.insertFile({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, path : res[0].file, progress_message : $.translate("{#message.insert}"), insert_filter : s.insert_filter, oninsert : function(o) { s.oncreate(o); t.currentWin.close(); } }); } } }); } return false; }); $('#cancel').click(function() {t.currentWin.close();}); } }); }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function() { CreateDirDialog.init(); }); })(jQuery); plugins/filemanager/pages/fm/js/utils/swfobject.js000066600000015340150472426320016314 0ustar00/** * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/ * * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License: * http://www.opensource.org/licenses/mit-license.php * */ if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;plugins/filemanager/pages/fm/js/utils/basemanager.js000066600000002060150472426320016566 0ustar00/** * $Id: basemanager.js 453 2008-10-14 12:24:41Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($) { window.BaseManager = { currentWin : $.WindowManager.find(window), path : '{default}', visualPath : '', files : [], selectedFiles : [], focusedFile : null, demoMode : false, disabled : {}, specialFolders : [], getFile : function(id) { var o; $(this.files).each(function() { if (this.id == id) o = this; }); return o; }, setDisabled : function(v, st) { this.disabled[v] = st; if (st) $('#' + v).addClass('disabled').addClass('deactivated'); else $('#' + v).removeClass('disabled').removeClass('deactivated'); }, isDisabled : function(v) { return this.disabled[v] ? this.disabled[v] : 0; }, addSpecialFolder : function(o) { this.specialFolders.push(o); }, isDemo : function() { if (this.demoMode) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; })(jQuery); plugins/filemanager/pages/fm/js/utils/fixpng.js000066600000002403150472426320015615 0ustar00var PNG = { isOldIE : navigator.userAgent.indexOf('MSIE 5') > 0 || navigator.userAgent.indexOf('MSIE 6') > 0, transparentImg : 'img/transparent.gif', transparentBGImg : '../img/transparent.gif', fix : function(e) { var rs, cs, b, o; // Remove behavior to prevent memory leaks e.runtimeStyle.behavior = "none"; // Check browser version if (!this.isOldIE) return; // Use old PNG src if (e.png_src) e.src = e.png_src; // Is PNG image if (e.src && e.src.toLowerCase().indexOf('.png') > 0) { e.png_src = e.src; e.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + e.src + "', sizingMethod='scale')"; e.src = this.transparentImg; } cs = e.currentStyle; b = cs.backgroundImage; // Has PNG background if (b && b.toLowerCase().indexOf('png') > 0) { rs = e.runtimeStyle; b = b.replace(/url\(\"([^"]+)\"\)/g, "$1"); o = rs["background-position"]; if (!cs.hasLayout) rs.display = 'inline-block'; rs.backgroundImage = 'url(\'' + this.transparentBGImg + '\')'; rs.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + b + "', sizingMethod='crop')"; rs["background-position"] = o; } // Remove referenced to prevent memory leaks rs = cs = b = o = e = null; } }; plugins/filemanager/pages/fm/js/utils/domain.js000066600000000727150472426320015600 0ustar00/** * $Id: domain.js 505 2008-10-23 12:34:12Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function(){ try { var li = document.location.search.replace(/\?/, '').split('&'), query = {}, i; for (i = 0; i < li.length; i++) { it = li[i].split('='); query[unescape(it[0])] = unescape(it[1]); } if (query.domain) document.domain = query.domain; } catch (ex) { // Ignore } })(); plugins/filemanager/pages/fm/js/utils/tinymce.js000066600000002033150472426320015771 0ustar00/** * $Id: tinymce.js 643 2009-01-21 13:03:53Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ var w, ed, wm, args = {}; window.focus(); // try { w = opener || parent; // Check mcFileManager if (w.mcFileManager) args = w.mcFileManager.windowArgs; // Check TinyMCE if (w.tinyMCE && (ed = w.tinyMCE.activeEditor)) { if (ed && (wm = ed.windowManager)) { if (!args && wm.params) args = wm.params; if (wm.setTitle) wm.setTitle(window, document.title); } } /* } catch (ex) { }*/ if (!$.CurrentWindowManager) { // Add default window and add some methods to it $.WindowManager.defaultWin = { getArgs : function() { return args; }, close : function() { // Restore selection but only when the window is opened in an iframe if (ed && wm.bookmark && top != window) ed.selection.moveToBookmark(wm.bookmark); if (wm) wm.close(window); else window.close(); } }; } })(jQuery); plugins/filemanager/pages/fm/js/utils/rpc.js000066600000007235150472426320015116 0ustar00/** * $Id: rpc.js 649 2009-01-21 14:56:49Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function($){ window.RPC = { pageBaseURL : document.location.href.replace(/[^\/]+$/, ''), init : function() { $().ajaxError(function(e, req, se) { if (req.status) $.WindowManager.status({title : "The server response wasn't JSON format", content : req.responseText}); }); }, toArray : function(res) { var fl = []; if (res && res.data && res.columns) { $(res.data).each(function(i) { var o = {index : i}; $(this).each(function(i, v) { o[res.columns[i]] = v; }); fl.push(o); }); } return fl; }, exec : function(m, ar, cb) { // Make RPC call $.post(RPC.pageBaseURL + '../../rpc/index.php', { json_data : $.toJSON({ "method" : m, "params" :[ar], "id" : "c0" }) }, cb, "json" ); }, handleError : function(args) { var t = this, errors, res = args.response.result, err = args.response.error; if (err) { if (err.level == 'AUTH') { if (res.login_url.indexOf('return_url') != -1) document.location = res.login_url; else if (res.login_url.indexOf('://') == -1) document.location = "../../" + res.login_url + "?return_url=" + escape(document.location); else document.location = res.login_url + "?return_url=" + escape(document.location); return true; } $.WindowManager.info($.translate(err.errstr)); return true; } else { errors = []; $(this.toArray(res)).each(function(i, r) { var root; if (r.status && r.status.toLowerCase() != 'ok') { root = args.visual_path || '/'; root = root.replace(/^\/([^\/]+)\/.*$/, '$1'); if (r.fromfile != undefined) { r.fromfile = r.fromfile.replace(/\{[0-9]+\}/, root); r.tofile = r.tofile.replace(/\{[0-9]+\}/, root); errors.push({title : r.fromfile + " -> " + r.tofile, content : $.translate(r.message)}); } if (r.file != undefined) { r.file = r.file.replace(/\{[0-9]+\}/, root); r.file = r.file.replace(/\/+/, '/'); errors.push({title : r.file, content : $.translate(r.message)}); } } }); if (errors.length) { $.WindowManager.status({title : $.translate(args.message), content : errors}); return true; } } }, insertFiles : function(s) { var t = this, args = {}; $(s.paths).each(function(i, v) { args['path' + i] = v; }); if (s.progress_message) $.WindowManager.showProgress({message : s.progress_message}); RPC.exec('fm.insertFiles', args, function (data) { var o = {files : []}; $.WindowManager.hideProgress(); $(RPC.toArray(data.result)).each(function(i, v) { var u = v.url; if (s.relative_urls) u = $.parseURI(s.document_base_url || s.default_base_url).toRelative(u); else if (s.document_base_url || s.no_host) u = $.parseURI(s.document_base_url).toAbsolute($.parseURI(u).getURI(1), s.no_host); v = { name : v.name, path : v.path, url : u, size : v.size, type : v.type, created : v.created, modified : v.modified, attribs : v.attribs, custom : $.extend({}, v.custom) }; o.files.push(v); }); if (s.oninsert) { if (s.insert_filter) { $(o.files).each(function(i, f) { s.insert_filter(f); }); } s.oninsert(o); } }); }, insertFile : function(s) { var ins = s.oninsert; s.paths = [s.path]; s.oninsert = function(o) { o.file = o.files[0]; ins.call(this, o); }; this.insertFiles(s); } }; RPC.init(); })(jQuery); plugins/filemanager/pages/fm/js/utils/gears_init.js000066600000006452150472426320016456 0ustar00// Copyright 2007, Google Inc. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // 2. Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // 3. Neither the name of Google Inc. nor the names of its contributors may be // used to endorse or promote products derived from this software without // specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Sets up google.gears.*, which is *the only* supported way to access Gears. // // Circumvent this file at your own risk! // // In the future, Gears may automatically define google.gears.* without this // file. Gears may use these objects to transparently fix bugs and compatibility // issues. Applications that use the code below will continue to work seamlessly // when that happens. (function() { // We are already defined. Hooray! if (window.google && google.gears) { return; } var factory = null; // Firefox if (typeof GearsFactory != 'undefined') { factory = new GearsFactory(); } else { // IE try { factory = new ActiveXObject('Gears.Factory'); // privateSetGlobalObject is only required and supported on WinCE. if (factory.getBuildInfo().indexOf('ie_mobile') != -1) { factory.privateSetGlobalObject(this); } } catch (e) { // Safari if ((typeof navigator.mimeTypes != 'undefined') && navigator.mimeTypes["application/x-googlegears"]) { factory = document.createElement("object"); factory.style.display = "none"; factory.width = 0; factory.height = 0; factory.type = "application/x-googlegears"; document.documentElement.appendChild(factory); } } } // *Do not* define any objects if Gears is not installed. This mimics the // behavior of Gears defining the objects in the future. if (!factory) { return; } // Now set up the objects, being careful not to overwrite anything. // // Note: In Internet Explorer for Windows Mobile, you can't add properties to // the window object. However, global objects are automatically added as // properties of the window object in all browsers. if (!window.google) { google = {}; } if (!google.gears) { google.gears = {factory: factory}; } })(); plugins/filemanager/pages/fm/js/createdoc.js000066600000006074150472426320015123 0ustar00(function($){ window.CreateDocDialog = { currentWin : $.WindowManager.find(window), fields : [], init : function() { var t = this, args, cleanNames; args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); $('#content').show(); $('#createin').html(args.visual_path); RPC.exec('fm.getConfig', {path : args.path}, function(data) { var config = data.result, templates = [], tpl; cleanNames = config['filesystem.clean_names'] == "true"; $(config['filesystem.file_templates'].split(/[,;]/)).each(function(i, v) { v = $.trim(v).split('='); templates.push({name : /([^\/]+)$/.exec(v[0])[0], value : v[1] || v[0]}); }); $(config['createdoc.fields'].split(/[,;]/)).each(function(i, v) { v = $.trim(v).split('='); t.fields.push({title : /([^\/]+)$/.exec(v[0])[0], name : v[1] || v[0]}); }); tpl = $.templateFromScript('#template_template'); $(templates).each(function(i, v) { $('#template').append(tpl, v); }); tpl = $.templateFromScript('#field_template'); $(t.fields).each(function(i, v) { $('#docnamerow').after(tpl, v); }); cleanNames = config['filesystem.clean_names'] == "true"; $('form').submit(function() { var rpcArgs; rpcArgs = { frompath0 : $('#template').val(), topath0 : args.path, toname0 : cleanNames ? $.cleanName($('#docname').val()) : $('#docname').val() }; rpcArgs.fields = {}; $(t.fields).each(function(i, v) { rpcArgs.fields[v.name] = $('#' + v.name).val(); }); if (!t.isDemo()) { RPC.exec('fm.createDocs', rpcArgs, function(data) { var res = RPC.toArray(data.result), s = t.currentWin.getArgs(); if (!RPC.handleError({message : '{#error.createdoc_failed}', visual_path : args.visual_path, response : data})) { // Insert file if (s.oncreate) { RPC.insertFile({ relative_urls : s.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : s.remove_script_host || s.no_host, path : res[0].tofile, progress_message : $.translate("{#message.insert}"), insert_filter : s.insert_filter, oninsert : function(o) { s.oncreate(o); t.currentWin.close(); } }); } } }); } return false; }); $('#showpreview').click(function() { if ($('#template').val()) { $.WindowManager.open({ url : '../../stream/index.php?cmd=fm.streamFile&path=' + escape($('#template').val()), width : 750, height : 450, title : $.translate('{#createdoc.preview_title}', 1, {file : /([^\/]+)$/.exec($('#template').val())[0]}) }).maximize(); } }); $('#cancel').click(function() {t.currentWin.close();}); }); }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function() { CreateDocDialog.init(); }); })(jQuery); plugins/filemanager/pages/fm/js/edit.js000066600000004151150472426320014111 0ustar00(function($){ window.EditDialog = { currentWin : $.WindowManager.find(window), init : function() { var t = this, args; args = $.extend({ path : '{default}', visual_path : '/' }, t.currentWin.getArgs()); $('#filepath').html($.translate('{#edit.file_path}') + " " + args.visual_path); $.WindowManager.showProgress({message : $.translate("{#edit.loading_wait}")}); RPC.exec('fm.loadContent', {path : args.path}, function(data) { $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.loadcontent_failed}', visual_path : args.visual_path, response : data})) $('#textcontent').val(data.result.content); }); $('form').submit(function() { if (!t.isDemo()) { $.WindowManager.showProgress({message : $.translate("{#edit.saving_wait}")}); RPC.exec('fm.saveContent', {path : args.path, content : $('#textcontent').val()}, function(data) { $.WindowManager.hideProgress(); if (!RPC.handleError({message : '{#error.savecontent_failed}', visual_path : args.visual_path, response : data})) { // Insert file if (args.onsave) { RPC.insertFile({ relative_urls : args.relative_urls, document_base_url : s.document_base_url, default_base_url : s.default_base_url, no_host : args.remove_script_host || args.no_host, path : args.path, progress_message : $.translate("{#message.insert}"), insert_filter : args.insert_filter, oninsert : function(o) { args.onsave(o); t.currentWin.close(); } }); } } }); } return false; }); $('#cancel').click(function() {t.currentWin.close();}); t.resizeView(); $(window).bind('resize', function(e) { t.resizeView(); }); }, resizeView : function() { $('#textcontent').css({'width' : $.winWidth() - 50, 'height' : $.winHeight() - 150}); }, isDemo : function() { if (this.currentWin.getArgs().is_demo) { $.WindowManager.info($.translate('{#error.demo}')); return true; } } }; $(function(e) { EditDialog.init(); }); })(jQuery); plugins/filemanager/pages/fm/createzip.html000066600000004527150472426320015075 0ustar00 {#createzip.title}

        {#createzip.title}

        {#createzip.description}

        {#createzip.path}

        plugins/filemanager/pages/fm/index.html000066600000023011150472426320014203 0ustar00 {#common.title}




        plugins/filemanager/pages/fm/edit.html000066600000002504150472426320014025 0ustar00 {#edit.title}

        {#edit.title}

        {#edit.description}

        plugins/filemanager/pages/fm/img/preview.gif000066600000000422150472426320015133 0ustar00GIF89aB2"^2=ݕ=b҂nJmBr6McقښJvZbhoZZRzB2owgO2!,#}h9MR̩3[7 ϔ ( ؘ< HbCT& 0v: V@88D )z<  _l- %lz " >>3*l!;plugins/filemanager/pages/fm/img/submit-delete.png000066600000004204150472426320016236 0ustar00PNG  IHDR^y|CgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxY͎53UVQ"%E9\sC @H % 8<ܹ 7)JlLWU=;:w].W}Uk!jVU4s]NNNɓ=|GGGgΜ9|qCx2HpfR DgϞ-q+Wlmm(m}/gY *9]5ҏ6>&u/:z;kcy<qι_|/(5` T ESˊr[hv`rJo|ɧ;5QG-RZ֭kG[@Ί3䫈NPZjjPBʭl4K0y`g,SUHvKna*C KKor?OOCDA\Zy  BxƈEUBT2"Iz@\K/{/Bjs`k.G.{)]1fHz벵2.hAOܑAڮZ50nSh}W*ĉUZWx?3ûjZmu'[0#?cdsnu Fr$'(ŵ.#D1Nr9%<*X^'꒑rк3^:-ksl؛䄸(@$}Fh#hcOY۹ʋ=wuq75g0HHԕ* Y-Ii.i]RV`RY`z6EU {B%:d4ZdqE"/Fa;a*q \mS,ߡe MsE7ܹ\*q##C^e.G`[B 9dr mί#`@@,q@+ vD,!^Lhm5SƂU<֘W^LsʓtڰM3`A4  Y'l =q\U>OK;dn?y1MP0S4.ӪA[}vLa@=2;g//H\y'@XVy9(p8:u@PHC" =LX$,'gLd&s\=#a-euspuIѯ("HrX0S30IKIږ0gN]}:TuV-_Oo:0wZHZ4grɋ^Ϻ8`ZVqy-ʕMmFq<'N9n#ESLUq ĥNwH5k2|GAwQ6@dlLqdˠ[lƩ"!ρK㤞}<6)i,,N`M (T*t!S"j~t6f4Ndx;wwnAs4kמ?i_~%J9?zŋ޽|/_*[ze +ؾ4zVL#A'De1ug6IENDB`plugins/filemanager/pages/fm/img/folder.png000066600000001340150472426320014744 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<rIDATxT=oA߽;' A !D(@P?CZjA!IA D%ľ/{wyw<̮Z} C0{IQsbi 6V>O{*>nz@1M,PuΜ*%[;@q!y A+wDwpm3(Eݟ_]9 ( LHzCvM\fn\ų/ɪMezũU%S: P[;$YF%:NW%6jG cW}cZQ@O26^Zw @}hƏ l @ ?׀+UYK)An| X7hA60i TGElx3:%0}&iˆ{*A#7T8?#+Q\vF%&cbx &&.c 1?q\E[~q"}ϫⳟr.vӠh DxFnpF+o|g{_NecP,:3rK o׫߽<[\kzı"B 2ݶ؁+:lynY<삣}s&; +҃IyI*19yx@FrjEG̅}Ifz|~T7),+=G6=HnÂ4Rsp;h#<\*Iq[E1ao;n<]dSAfì sL'lʹkIMc_C81!Bb,F?-x׎x4qӌ}T2(@ IQAd%Ga)aS`Rp臜B3 be9'f<F,) $jK]kEH3ggA}ȿoLj4c)pP 0u9ۀL<|8.'#m& ֵ/:p}7[5׊0 kf\˹}- CH-"kqp'[zpsH~;v ߠQƄEp:+(-נ'~ ޤ:yMfx}D%e^ I1!/:)&P!1}RD.З:jbC)©'Fbx)*jqY5#OKьOH&i Aɀ4( F9%>r+Bc"BUO&"aZ~WQPdEEZ,k [zT9.) )t#D!R`ť,W>QXj\PU@F}ej`Ǫ VE8(iXQ.qoRXPe Z]ro˹TZ Xlk-BYoe\{ o,^+)%-*:S)FWktڒ\)ڣ/3UfZ^nZW[1JN///oulAjl$ѯmQ .%F]/#ZiA) {;n 6W$ՖTBoyssHheL0jZ%ծw%նi3Beǎ6إ';IENDB`plugins/filemanager/pages/fm/img/insertfile.gif000066600000000652150472426320015623 0ustar00GIF89ad766 >> E: D9+ d I*\;plugins/filemanager/pages/fm/img/sortdesc.gif000066600000000260150472426320015300 0ustar00GIF89a{{{|||!,-`&dihlFQL2&R "LtJ5;plugins/filemanager/pages/fm/img/x.gif000066600000000061150472426320013720 0ustar00GIF89a!,T;plugins/filemanager/pages/fm/img/im-topleft.gif000066600000001013150472426320015527 0ustar00GIF89a!,adhC0D 2rHx8;<;Es49*RSf]&efm{uu=W~}X\^bfjnrvz´ƹǻɽ˿ Hp(S8!8 ғ"@1LcCAF9dEQfTKF Yj)˃6avN}RhQ#&EZRiS'FRjU+fڒ+M]q5زcD۵o:hݥw杺j߭,0]vU1_~!,×g^qC;plugins/filemanager/pages/fm/img/folder-middle-bg.png000066600000000360150472426320016567 0ustar00PNG  IHDRR5+}gAMA7tEXtSoftwareAdobe ImageReadyqe<PLTE&߭aIDATx 0c`I][OZjVZ<IENDB`plugins/filemanager/pages/fm/img/clearlooks2/button.gif000066600000000430150472426320017204 0ustar00GIF89aPccc!,PPC8;dihjLm,tJxpHDH1ɜ-P@ZجvvoްxL΂贚z^6|>~vz"w7ħ/! ;plugins/filemanager/pages/fm/img/clearlooks2/alert_info.gif000066600000001623150472426320020020 0ustar00GIF89a *T xg(Z[3ʜ[ūu=ѻnKc+؈,Meх+9CRڃL5\D~zȼ3~ %zn)E"<jT,-E΂-wIܕ@T8»aʡ_Ȯ}I:TµІ2aû{_}a݊#?׳^]ݏ1ƘPőU{79P|y7!,  Q Q _J]#i#]J_Kai~aK #LG# HY̯H œɽOO V ?S SRi~8 * mAm R85|,eп$Fhp #A}?` b=Pis$ `AQmph):ANQ͈T@ P-NU>E2`^ X5rgowxd> WqC:(SMu"C@k,U&aIB8]1!xh $q$mZ\e8>aGXXKT$AO>DŽew#X@F ys=@…&Ƃܽr É}Wx-P\"FčI;plugins/filemanager/pages/fm/img/clearlooks2/statusbar_right.gif000066600000000166150472426320021104 0ustar00GIF89a=:8ȿ!,;8"I} ͻHzY*ںL1-' Ia`l:tJ&;plugins/filemanager/pages/fm/img/clearlooks2/bottom_middle.gif000066600000000371150472426320020517 0ustar00GIF89aù=:8,Ҕڋ޼H扦ʶ L ĢL*̦ JԪjܮ N '(8HXhx)9IYiy *:JZjz 0K[k{ ,N^n~^;plugins/filemanager/pages/fm/img/clearlooks2/top_right.gif000066600000001161150472426320017672 0ustar00GIF89a $%'%+Ҽкβǭ·̴ɳۂu}~DZƴɳ鳧>;7 !F, ΀EF%E#$$#DF0C 22&E"==1E ..'EAA(99<>::=> 77B>--*669"9  ! CFsBjA R>P I*AAsr^@ `O> ;plugins/filemanager/pages/fm/img/clearlooks2/bottom_right.gif000066600000000105150472426320020371 0ustar00GIF89aù=:8!, 8*Î9 ;plugins/filemanager/pages/fm/img/clearlooks2/top_middle.gif000066600000007242150472426320020021 0ustar00GIF89a.$%'êu}~鳧!(,.pH,Ȥrl:ШtJZجvzxL.zn|N~& H*\ȰÇ#JHŃ2jȱǏ CIɓ(S\ɲ˗0cʜI͛8sɳ@ JѣH*]ʴӧPJJQ Xjʵׯ`ÊKٳhӪ]˶۷pʝKݻx˷߿ LÈ+^̸ǐ#KL˘3k̹ϠCMӨS^ͺװc˞M۸sͻ Nȓ+_μУKNسkνËOӫ_Ͼ˟OϿ(h& 6F(%Thfv ($h(,0(4h8<@)DiH&L6PF)$TViXf\v`)dihlp)tix|矀*蠄j衈&袌6裐¤Vj饘f馜v駠*ꨤjꩨꪬ꫰*무j뭸뮼+k&6~ Vkfv+k覫+k,l' 7G,Wlgw ,$l(|,0,4l8<@-DmH'L7PG-TWmXg\w`-dmX{lp-tmx|߀.n'7G.Wngw砇.褗nꬷ.n/o'7G/Wogw/o= 觯/o HL:'H Z̠7z GH V(L W0 gH8̡w@ H"HL&:PH*ZX̢.z` HhL6pH:x̣> IBL"F:򑐌$'IJZ̤&7Nz ('ɁRL*WV򕰌,gIZ̥.w^ 0IbL2f:Ќ4IjZ̦6nz 8IrL:vy @JЂMBІ:D'JъZͨF7юz HGJҒ(MJWҖ0LgJӚ8ͩNW*@ PJԢHMRԦ:PTJժZXͪVծz` XJֲhMZֶp\J׺xͫZ׾ `KMb:d'KZͬf7z hGKҚMjWֺlgKMv pKMr:ЍtKZͮvz xKMz|K]~LN;'L [ΰ7{ GL(NW0gL ȱw@L"HN&;PL*[Xβ.{`L2hN6pL:9xγ>πMBЈNF;ѐ'MJ[Ҙδ7N{ӠGMRԨNWVհgMR#ָεw^MbNf;ЎMj[ζn{MrNvMη~NO;'N[ϸ7{ GN(OW0Gn8Ϲw@ЇNHOҗ;PԧN[XϺַ{`NhOp @xϻOO;񐏼'O[ϼ7{GOқOWֻfOϽwOO;ЏO[Ͼ{OOOϿ8Xx ؀8Xx؁ "8$X&x(*,؂. 284X6x8:<؃>@B8DXFxHJL؄NPR8TXVxXZ\؅^`b8dXfxhjl؆npr8tXvxxz|؇~8Xx؈8Xx؉8Xx؊8Xx؋8XxȘʸ،8Xxؘڸ؍ȍ0Xx蘎긎؎8Xx؏9Yy ِ9Yyّ "9$Y&y(*,ْ.0294Y6y85<ٓ>@B9DYFyHJLٔNPR9TYVyXZ\ٕ^`b9dYfyhjlٖnpr9tYvyx|ٗ~9Yy٘9Yyٙ9Yyٚ9Yy9ٛ9Yyșʹٜ9Yyؙڹٝ9Yy虞깞ٞ9Yyٟ:Zz ڠʠ 0Zzڡ ":$Z&z(*,ڢ.02:4Z6z8:<ڣ>@B:DZFzHJLڤN@ R:TZVzXZ\ڥ^`b:dZfzhjlڦnpr:tZvzxz|ڧ~:ZzڨA;plugins/filemanager/pages/fm/img/clearlooks2/statusbar_resize.gif000066600000000220150472426320021257 0ustar00GIF89a=:8ȿ!,Uh"I} Z ɅmB(xnGER-)LSEy_+$c"z^|;plugins/filemanager/pages/fm/img/clearlooks2/alert_warn.gif000066600000001462150472426320020035 0ustar00GIF89a wvnn \\ܣ<<66CCJJ888CCdd--QQ33yyWWiivvkj<<llbb$$uuEE׎ڴMLpp++$$eeKKRRÌͳ==AAdd::))::JJjjWWPP((;;ħɣп%%%ƪ00ccIIϺ̱֘~ȟ^]עUU,,ڌssyy||٭QPNNđƘBB__??mm 㺺߀bb!, o2u20v7$r1U{))F1+55=;p!}%Y!8d>x`~~ M\j_}]hE(M2x&sBW( '~7 ?Wf.cKRs&(#>88܅Dpj"@: )Fn$ 0&saxS-*B"-Ȅ }l9hǬ[8q ! 0HhACzfCˀ.a˻xtfbŃ|򗶱 xXB B(CӨH倠6v A;!,rMܰ !üЛPf@(ν@h $ӧg@;plugins/filemanager/pages/fm/img/clearlooks2/top_middle_fg.gif000066600000000070150472426320020465 0ustar00GIF89a!,ڋ;plugins/filemanager/pages/fm/img/clearlooks2/statusbar_middle.gif000066600000000166150472426320021225 0ustar00GIF89a-=:8ȿ!,-;80I8k`(dihlp,tmx|G(Ȥr 8ШtJ&;plugins/filemanager/pages/fm/img/clearlooks2/transparent.gif000066600000000070150472426320020232 0ustar00GIF89a!,ڋ;plugins/filemanager/pages/fm/img/clearlooks2/top_chromeless_right.gif000066600000000105150472426320022113 0ustar00GIF89aù=:8!, HC# ( ;plugins/filemanager/pages/fm/img/clearlooks2/top_left.gif000066600000001164150472426320017512 0ustar00GIF89a $%'%+EKQҼкβǭ·̴ɳۂu}~DZƴɳ鳧>;7 !G, рGFFF&F$%%G$ED1F'33F#F2>>F F(//)BB?=::?>;; ?C88 ?+..?:77SѢ`  6(#@.dEDhب md@25RK'U f8iH'<@h@;plugins/filemanager/pages/fm/img/clearlooks2/top_chromeless_middle.gif000066600000000371150472426320022241 0ustar00GIF89aù=:8,Ҍڋ޼H扦ʶ L gL*̦ JԪjܮ N ('@Xhx)9IYiy *:JZjz +;K[k{ ,N^n~~X;plugins/filemanager/pages/fm/img/clearlooks2/middle_left.gif000066600000000073150472426320020144 0ustar00GIF89a!, T똌ڇ ;plugins/filemanager/pages/fm/img/clearlooks2/buttons.gif000066600000002253150472426320017374 0ustar00GIF89at0n{Q[c787k|`r~WdpZiu^n|\kyy{x!,t0Fdi&l;nr-bA|c#B,< Ak6LTL9:z:9D;{>9u|ͻ߿u}Ả?5سk^}{ޱw߾u?~˟?*&{P5 6蠃 >@ '>HaJ] Thpb*B/17X\60DbHNUF7ALdP"YeS2 ې[F))iPyfd)fn&`&w U|矀g~G(,ꨟP 餔Vj^馒f駔z *Q)`ꩨ*R 묧J[+XfkU T*`&.6 JK-k\n+W޺njعƞXnټλY^oڿ Zy\[fE-'1ʕMpƲ'2v!{{%ww) (s|57\ l2+ b!^hv F@$T#;5,v>v5xyƪLMep')q7)fy ~>*yz(/y 0~>j(Jz{+Ȯ>k뮿 {F{l/{j;plugins/filemanager/pages/fm/img/clearlooks2/top_chromeless_left.gif000066600000000105150472426320021730 0ustar00GIF89a=:8!, H1NAH( ;plugins/filemanager/pages/fm/img/clearlooks2/bottom_left.gif000066600000000105150472426320020206 0ustar00GIF89a=:8!, H!,A ;plugins/filemanager/pages/fm/img/clearlooks2/statusbar_left.gif000066600000000105150472426320020712 0ustar00GIF89a=:8!,y{3Ree;plugins/filemanager/pages/fm/img/clearlooks2/alert_error.gif000066600000001662150472426320020221 0ustar00GIF89a SSEEGG9/.* ʌ21 K; RR SFHHII~z85–97zuoeTS IIFFoltl@0gfGGvrLLXWGG,,!D5rnNMTSYWkf!!21EE3'GGCCONII32ѹ^\WVLLPPEDdc!GGEE үԈURQP_WA@%%YW_]ZW|u~xYWI7M;mjLAcasm?>NM"!c^ONKK!, E e@>=>@e ELwTRN''NRTeL1SmHmS- 1D3r-6b6)r3E mO 3H,,{AZ+r&kr+K2X"'0#t#x)"Dȏ7p…6%nJQF(H`P uHf4Bʛ*$82H3Jѡ%d"H=JaԃMT(PM" N|"e)ld (xR0큦^B @p$+^̷q*n,E$75<<|@ n !( C4p9ٛHi# MTTu,۰O,3`?,Ĉ/ڈKYdaAW"Ҵ/,qTm9aد E%{J3Nc Q JPo 7pDca, c]6SkB+/;,F- ܘKo8dw܁ |Qh,Ymx%~]?nXyOGrR {>vD&|x3-?GN,`3R^`D'U+\&=#3 G|C_8\H8 *\Y-( b g6){ECRv biڦ HLւÈJ u3!p?=zl3.lbS$CJ '6fF;9 |`5Ah[<"{.ppFQelt&r8-sD"8<2AEZP?fWt"g4Ћ݊f8Q80FĠKhL&V.;m43;iل9x%H? G+^ /P.Aap^р{ L,2 >S`hf00GiJs+@%/dS/Ȩpt(:SJ]8VRt\p&Aog%Ps%1AP}[B?Ȁ(! ˨F'@m9CHhN@OnPSHE4(8C62L! Yb@ͫF:Tͱ87Q[E8p0@AMCP#,a `Vg?,*3H@J[iP L#` / M.7Q@ޠ;*pt#m e]B'\ O8Ԑ6 d|OV>-PWhD`ՠr܉^t xwoyх@VmnMF-!R?T1ZꁳGJyaW kBv 9b,_<R2aL\086Ĕ:@ ?Q)Ly$W2e+l+l! 1K ߴu}y@fRn;Q0  uV 1O`DXEL,A hE{c ȶ^^y 4/)4`H_;z2 H$W0;RHo+.D0+԰G(> /$|sL PM%`zN __>+t! ea΂ AD:OBqWpzy L@>9 %RsU$ b~ #ĔPcAX UӶ<[m|##A/z=@ zsgǛR U}- %! Eo|,0l'b7yЗIG>7jY`-y z_Wd~cqG<RcwEuwwHP:?aIYg Ql[0WVcL3jc61 (n@PO8zAdQ9kN>γsYZdts5 t8`}@[1uD8> PFfM8Xz++[X#HI`g/Nwϓo?wldps ed}p {#ASh;p0Vf>'Vg=H Do^ЂG0x[p x ?X m$`6hw-@XN b/v,Hr:ygp>=HP{U@YsЂm8`r]P  k^l@psq&;4Hf(9>`y8?`Yf/y08"H T{_wwbSŇ Q^n vIvxP& Wk9M8Q@`ruhpٌVfo6)04p>o{K4hueP[|^}pdjyȜMc`P@`bw ։9pk>Pi@f\UoSwhoo ] 0 hh%FW 44M0@BOgf/gI qJ0OyXr+@! CUp4@E@pZG7jO@TePЧ&| EG -NMxw0hX@:((T g+V!9ƦVnO{{QlL^ PQFl} :"z2g:21JY#1Z#YXcJ)Ќ5`jj+?@dgE@džJuxP Yd[~ Z)C #z j%c캢88SL0L Y 0 /ylʬ#*P k)MIJk8!+X g^fC0m:s WFExJdP hV0 ?A[yЊ  0 0 P 'AZ)p59uf 0MS p 0ko U}P ೊ0|JPװ .CGpj{fz˪%KmsF sW ʐt0l|H:,KM ںkz `n#PڌЋjʹELFYjݐK :p klt@ ޓ};Z09ۄ`J7,/s߹p \:fZOkP_X FTPP Y˦tp t0<[j3>QK#70J?p h%'[zڲQ0){0h2f|kP Πx` \@ǹH4)9 [ȏA׸   'jPZ0e8Y0HLYj@ [l` ` /| ZRbq˸|,.h2!0L̼F[ی!%%+$c)@CEP88=@){Z= lx 0 0 PxT.%`M-`9PܩsJk:p˪b y@&ۀD0 [w Un l \  pu\% `G,O:9 N?<+Jxk-4@јk] Ib`_D۫]Z  ط `|؇b1(+ ȕْhRP$ڌ|F2]pv@LY;=iIv *j` P \͠0؉m%;M+㡴<w@ Ga`YK:D6 OtN*wIPvY K i\@ +.~%NJ! d ї 5=8tS{ bЦ2N=D k pSϠ f\nP> @ ̠; @ R\""/jdgy)@)pqⓔYg*cb@0 1Z Zhp̠İ 0鳬 6%'_aLw$(pʵM;rzSDf0N0NY`X3EY@ %>e$G^TI(!Zf!9$W0& (s P F@Zp\@ p?H3>$׎(8!A": ~ .,ϪH8P:@C`Im=ޠ8P 0/eP`Xt 1 0̰X8x,J8mfpg@`'MۛF ]P͠ ? + ` K!/!$Y *]@Hho/ %+/;`kK Wbne = i4`b„+V p!ebaC I[6چ8D`ҥK9%L3 NOA%ZIweSQNUWYkRa, 2@`CF zV"D^4X"E !QL81dȑ{|(sNp(IAz, ( \8.I k:*Fv4I$åuF_HJj+.E rs^'_v[(D`JdB[,`a3lUƅoI/cB6 bFktn * M&@Ȅa*E|F0ZXLQ}ûek' đNƏhvfY-h3+YnƴFRWX8ly#sQ_\;LIENDB`plugins/filemanager/pages/fm/img/filelist-border.png000066600000000205150472426320016556 0ustar00PNG  IHDRfEegAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbz`۱UqIENDB`plugins/filemanager/pages/fm/img/dialog-top.png000066600000026122150472426320015535 0ustar00PNG  IHDRHOytEXtSoftwareAdobe ImageReadyqe<+IDATxY#D#&sT0 0<~=S@x_ppk[U2s!i.6#MݬUeJdT(kǟs6g?szY>}egϕW-9,}^9LsO+_;v>g'c %?Y \ڇ9ۘw;9/a_nL;^Z>?sdڸ٤.a }/n ½h͘o4_S~!Ǭen0?1)lvfzV؉"׮͟36V09ߏMȅER:m e^\tts,3'vEs2?r!خZe+zr}K 7<"wˋxce6a|,9A6G;;c\1[s{~0990;qsiڎnX㾌A8vWwo0Mnw~j(c HOceXC飱c4r=W>5}AϜd`P\& eh{zl2:yjh?͊,lĉ*a'o!:U$ל\ma"s]KKLl])eduA6tXMf.a0~a ssa9_|nlnAe_.ϋ ]XSDb)/ySc/ ^RU,2"ΌUn sF1H0?y-x16i ?=ܽg.XW>hK7U0x9&ސo,8'~#3Ԣ>W#Y 2 cS=k&M朏1]پfpJD%}A+Hn;9'./2yr^ջ(,p9^! "yS۩=Je|NA!} bxf߮ K1s"O $S;F} {d/DSډ Tom+BJ).1a#2x %D񧄄y="my31 $~yyEO 9e ,aˉ9]$,K70?!xqNu,L۩^,~)`4!;~_oA8&/ AHUp b1Tĩq/Xp{/>h&$LR.Js %&cfBª>:+&R1a-e9~_p=_'W?($aJq.f5󵁴'f̥4g[4M{K,Իfmٰi;DW<ł <\/2 `^JI H5>wNj fcN!,\1-3c;r|)fyX̽x2j?͂x`"by ,x4gA.O-3*!p $\#@|Py1"5 1폢X-9두_R҅x`}>3D,b`+qN.@4CF'B8y1.B6.*ltl(Ķβ7bBZg*2cjNT},ap>053!Z|h3#_O:"T$U\|f֤Vz; }fZbiF3zpB`3 d[L ӱ 6c+8zj{A638k&i|`Q8`ft֪>a@C(XK ݼυ`S/1qB='<*̕liwQpİO3M?/p.hIB>y_?+SiyĹ=z]@XR2NX74ybᦱƫ hGC~j`*Ec%ܢS0~.V% \ĐC億b֎S')MAI{hHjL&,,`GbBa Aׁy%DOwBobFZ{! f]Iٽ..\EX&0A Ke w_V6ֹ%N49fmCǾ&@+αi ?("0#:F*p3u"(I0{1P OLAMpP5P)P!!tB uLH0LwfG^CVLp}E`\2  F^Fdg!rQQCK Mj-*!DG8yި^T8 V^<D$JH8Rܞ/Up1ݪ, y@@p, 3}`)&AaF8(\ e4GGw+rG З[JO94yS2bCNkJ(l^v._ Ga4,}Wy) r\D0w>,kƶ}oϋ1}lF >YTh7ڨζ5g>\$3 lu8˵ &{`:5*fX€`n孳7}p.jٮGv5Uw!+)Nr"L(jCz(s)5S1 :Z/4!Ǎ^hP 5Ӛk!8ed ff|N`BY3(edxָ~G?y<`(Muϧ_l2m>(Į7Zi9 ӓm!soI:Be֡UR29}R-xFiǻ%'tnKyFBWJvAָ#uo'U`b`r"z(d9!T9A(DN4ժQIlǍYpiu AhkK!.a r'+U|is潋 `-_kZV<㲨`N8dClj~& EY٢oxK a<,>P䀰e%>s%@@p^`2"P0}mX׉8͇}BRub,N[(d%d/,c*CDuR];23HOL%r9E@kՅsp,L-5Ì%ig 3a]\>1*%{[S1L=穵O6"Xv3GmB(Y⣐2f5AATc{6ۚ\Zc\KYT |m0TFHO}`9ZZ+3PfA5IrS "5c[#ޕ̭5pMZs95 dtUbp u@V]OUeQAH#}^|d_ﻮo$(훪(+cm9Q$[u)C\ EXfw!=Sj]k8i8PCK"Vu+ˢBʅN002,X=o$S|m\ZG^=yPU-6}gx[3 UYq葯AV0vh՛tâ@to-Sd U`D9 Oik+.tQ{N=i8٬seRaY_x)H!KYSmۺ ʘV5m߶}Q֪/Jnɤxo]Ⱦ隮m&qmD]յ(brVkj8nvMg^3(zϏ~idK]R 3Sˋmt}wZ Ā^uCommӜ>#8ҽ$B\l5| yC=COk*\gBA#3-ͰtIFP@צC (.4Dڿ|k^P 5X+&ŘPR!mwm!%)'Vǩݪ ͓ \EY]*[c2*RD۾vwص,%!G+,)qHA^\^u]K c@&K\d&``S5YT['ؘN<TՁ#LqIp"I ,b WmXXڙ5ĥlMumKY'f?ۋ i<~ZtOӭmo'hi,n6I|f< Z(ֲ'Ԡe}y|%b!YMF)OH }m{ֹ6U)7myh,>As+Oe:ꖣ&b| R6 4΀1u=Z>chߓA+,M]Rm3ՙs5 Г{[3v*c&&Plի Z,^KԃAl!Wǜ0ݮ8Nؖf[8zt}6.z&9#{:LDO 3% ZBzX`x~ {kx>?>77HH eJV|Ñ\o6JB{ngVRJy{BRă26CIvO?SөEIk)XTRIIʸ(gn-deH,apX7b0Gg^E+}<6<=7WW׵tS,T <'8gs|0Ƈ Ij0t8^0ʪx}}y*mnoRDE!=bs(妮p%Vh/dwppPkB"(KI+]Rb̂ k6J_DYԞL ۭ`zpΑ'$;%Aeo~u{}sY]0NDpqly9;%m^xlW f$v(wREphFL8κWSIhE̙}껻kU]Wׯ6EYCKRĵ zɁ= ej*}tJ 7czrE nE910lbFnd8J:z&) qJF;LJoWWW5'+xx,Ne$r>ݏtfb9DXHɥxqօõ1dSi܃:xxotWd \?혊c_JߨYaVgNEHP*һ$) ^@4.x })QN)(`ۋ˲,+yxw8mڶusC*hK{sL qp>+Kɥˁ(<0v"/Lڐ0@es1-Wxn{~^xfCI7&c;'`h >aӷj(g"X.b)'kZ5, 7!SP%++%# UwjHD Ra]̀'H,mqiuwwVS}N:utrb"}J&:#<؉m]Ck ho?>@ϻ}{~r15V)Me",{u"z*IP k bX@:KH\ ^c aIY$ 7iͼ{lU%wwn9áQ~j7J^ YȼTy% 4> u T 7ۋmq{{E)&6I^\Vb3w߫f?f=b hGRH3dc0r^e fݽۿy։s@ԝ;~v_͛moRtc'`bP0J .3K}Vي=?w9{zsq(e9pQ1@ccf> ) fLw ؼ椲AXD$N)8b2|Hk嬵;wN2|Hĉ>GSwN>/O/>`L19!m9ۘw;9/a_~:MK`V77%=EAH^oVnp|+{|(;O?w>>(g^Sт*]YBD:=`v|җ\oEM9jVр1Ayȼ@ k;utкdf5VZ*]߅quR=31p&%հuЪj am]?VExo}ݶM}j \v|(۲:{>߂ʴePQg1w}EmC6qu>Ey0-;Fuд^d,͵zD.z GS]vlIbˏS)X1%IDZ6P~1K,S?JmH~];>KUc_Q۔DŽS[pWMmtuP}ʋ~g:Ρy$17T'Sct,eQc_6_qG?عo}ʪ Fށ/A~acsڅ Y->WGUy3M2TMYsso{t] FH_kalkjq|]z*pEػw]v|گaZޢUJg[[{w{>Rwܾm {w]psAc? h۶a`o=FJٳB |P`Cÿ>Ѽon~6LZA B@C*ޕCv}-ěۖnm}PqR*V sbw%2,),&y;vC>zcSxrCssSv.}0vo*~XRkõ>u37BovO?57իW NC}tW_޼}^,t\L@}5-uxuۯ.p^n^(`_܍L^]v8o;z4醹>֠ZZ!}(W 8!cO4z(xv 6 7q~wz{n\ U m~p`u- )~Zru%Ceoj4AfC!|s}omQvKiS/Nvb N^Us'r\A?" uM6*?ft_A͡/SdxO,,(jfPfy2E,NۢS[݅1& ^Q\/\ EdB;Tn~pX#Rx]V k/+Ap}ǙS躣';|>62 JWXOa8Ʊ> ~$*ɝjO-f1: xʉ9?zyDҡ?t ?ÿ9{~099yp 8w1=76v/ʩMErU'@[xØ6a{fuo]kүolU%`Z|uR_#P_:} `ǛSXc&ΙÛ® ?uR ;D^#bh5E˭`ՑGp/YzchkgAcWsCDi`W۲n.z3a,hWY۷Jwٛ7[quY0lëZ;mjq{+).P!%pDN;q&3;JmT/"X<:Rj6 n.߿{o}_f٬J7{VUk/E(K1^nX}on ?qNt1Z '(ض?rz1 m޾ywW=ᛋs.//oQtq @4mI y-gwao~_)onk PI==?狤xn"7xN[gL{$}J3c# h iH1Kuo$sg>-'vvQ9I"wlPEȕ^3s'L׿0um˗)i2CupQHјOCΛń@'D(Hq 3Aa8&3+\ QB)f`x-\=<<_zSvn;nɖmm+7MCb_cp`WcIENDB`plugins/filemanager/pages/fm/img/folder-top-bg.png000066600000001243150472426320016134 0ustar00PNG  IHDR,GgAMA7tEXtSoftwareAdobe ImageReadyqe<PLTEWIDATxWr@ _We )"yYKƖ2U gD13D<$8 $ P`@ ;-bB΀W=ovźOXEbEZf8MWf}xt:(x/ 5v}i6P7{fwՖ]@ض $@0`aP[ 1<@azhq@r) 1<7 mj{^ߍ*?Gz4W3IENDB`plugins/filemanager/pages/fm/img/navdesc_bg.gif000066600000001113150472426320015543 0ustar00GIF89au苢䠲{ȫɓϯٝ灛䰾ـ悛ݩۜҟӤzǧ֥}Ȕ接΅艡̪풧ϖ쐦~ȺܡԳڢߗфʶ醞ˇ~Ꮵι卤Φؙ֬Ҿߘ술̴㮽雮Ҽݱ!u,u S9CfR-5lG^ (2WTq. >= #:i`A"o7]%FYghB8j\N6es&J[_Q)nLt pc@'0b1,MK&B5O@a4JPHxK^;plugins/filemanager/pages/fm/img/submit-wide.png000066600000006024150472426320015726 0ustar00PNG  IHDR.tEXtSoftwareAdobe ImageReadyqe< IDATx\͎άˠ/`7}g>_0Wˇ}@\l9XpFdFVOU73h&ʟ/#QcjZtce]AݭG~tT>}Zig|+5陓'OFe0UUyJX3gvڒKi^4=(ˋ/(<_|QΝ 4Ds\8ܽK{-){/=4_*RyHr}>Y֝˿i]cWr} rrt6Ҽ Be}[|OUGX_i# I&J-[Lg0}WZ3xXiӋ^+m"eA2U 4c\+1N0YA|m'p  R6xQ t-^~ j "J͜ld#MI،3 4XiƦu]d~jàpR[i?~,uC?j;mPGR7*4Wz԰lYS_kIPi:ct4C0d+ -<[zV+y7-||8'O,Ԙ7U=id]*|R< %XxdY.=O{A9;z#Z["E@s#]a|`@c3(n:E똷U`~s%ƭcy\۷{jA9ri=oiev/ȡ뀧"K4SA/_izk]<Ni7TDirE^j!|P\5Pcߢ 8ܭ0YQëJPM%>LU  6ʈ#3Z@&9 QW:K@PȖTP^~uѤJ!+B_ RF{++{Ԫu(J\g׭ް~c=uՏGaZzxTeGu1>uGY2Ԧu}7CyX0;rcsN8Ik> ZԀ kl:ֽi?ܻ׸x*-Ui lCYФJd5`%Vl>-ҡ^)N.|ÊV甆~æh]fLc[wY¦vH0M#@_1 */| -uEꮦr21-5Ru57pKLva"(l8L rɔĘk_H8we։:y7/itcV`.8AhoPK"0QPsNc'"Jb⛄RLo5jk쟴$GPοILT\1 M[`9 {%Pc,ɌƷ8Іkܦ*ŸL7.8>JM;~76oI\ˮCPtˊz~R,M8Xn:9H?)HAIENDB`plugins/filemanager/pages/fm/img/im-edit.png000066600000001200150472426320015014 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤMhAߙL]DA C.JAPPhOKzЋųDQhÃZRl n-CtgƙmJ)cgwٙ["@?A00Y). h\GhAc  P.ʣ2țR>:#/I1w~Έ<]x ᵧ ۗN G%"R 'C >7Oҡ#\AW(K{y qgf0ꋛX]0*f˻?%RCAB@7zwXY%~tqq+p6608zQU#SYb\>7%D|xO3,/E  1r|4MX驥5[cqVeuR Fmhx!$e߫VNd2 9Ӿͻ&nk Rd2l6jPJJU>?}&@@IENDB`plugins/filemanager/pages/fm/img/dialog-icon-newfile.png000066600000002565150472426320017317 0ustar00PNG  IHDR((mtEXtSoftwareAdobe ImageReadyqe<IDATxX[hU涗lvsF6Zo!-4bQ}m@EYQE#r!*eiRW\6Mv73t=f7s3{?g([1:Aao5q#-MP',qx"C"5ܸoGP%٪ؽЋmuO>ujL>}az":2lj9=^<_uZ'jEP'' ¡P(P\\j$| w]45۞F<]/G񚖣V5 ͐7NKhooG$Y Q\p4#DZ=X1UOgz=~ 9Mq𹯏.* uԯB<b}^!4kMBeX҈7\6l<7SY#j@TGHFH XotV P<=mK1Ơ(sI A:]8~ s7Qܲ 3SS QBL3 0sxBJ$#kdRRRン`INΆqahfn*Mnh$`r %"ī=G3`2N_W{Qȱf bƥF9\C{< Q SPaL̔#*z#!΢On-"dˈ`/g yz3V3f $2O%$]S oS+ĥYpwO7J~ߜjqdc@]aZqze]j!TVe$އyM`cc#$I UP u5￙61N{ʑA Dr(eoweD~Ϛ>QUkt[qzڋ"_ 1䴪TAz-v8!H+)iBϵeGFF:.1o!nhhpEtfzF Ag:fRH"*f՚MlgEiW䥲u2ح F^ ;!qJI脲!f moAm?T?~_Z]sK~f1CnYfy JT;bGf*71y%6UˣT;[/O J%"XH-, en醢n洇e!6djKj$W4’YRUNJqRiKP:oQVpsPԐ*--*=[/sZ@ƳIENDB`plugins/filemanager/pages/fm/img/submit-cancel.png000066600000011246150472426320016225 0ustar00PNG  IHDR^y|C pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATxY͊/2{ABH c#v16fl|e_g?{4ؾ> 6x@ v@{FOTWUCVeeu׌vi2####21F3k6HR~\AUucizuAwI]׻ܹsGUrJ)jه$|WWWo޼ifwÇWU91JϿX.m˯O}-"z՘^Ar @ ibi8)B@q}?D( C $ً؛] :"現1ƶmA過b=&ƝCI{~o - P$IENjrX!G;eI.p:P' $xɯqs1s,M.jf%j 8=i%Yڅxo_%ɱr 5'ߜLB7ĹL⯟JUQ-Ƥz| |_,(CD5B/o̒ޖMԆMތVbTc df6'{HO]QsP ۺ_&ԗOJ%h˕%Gޤ㖁eƧ34rVA@YLc{u:gXC[(r.M(l6[4Rh4d`L3TC¢$4$ 9{7`%EЫwc&ISȔd)-d қ޽{;3=1Q]>@Hq4i͘2> Ob1v$iVι2F8xYOaԹT/3IA{}/-eQЄP$:i)&dLTG bu]ׯ4mBi9},Y$}2}V6?+t"zbHIXm}f^է(3 'pW#8ڵMu9jn!`{ #&[h31 ;Dږc7(؇"3s>[닻7 dh.iEl2BX|BְTruu]ŁΛ&n,Nۦ1^^^ IZ"1`PP *Us.;΢Prc̢H(̞MŢ0 (8dྜYwyjvٴm\_^E$ rvxC8̼il)]ѡ2~\s r!_"XUX$T>m @Du<[J`%j>ɺ.jwKj;~۷'''"Bx%1_|ݻ?~YR߿Ϙ%[ݻ>jŜtO~2H7`\Ǔ IENDB`plugins/filemanager/pages/fm/img/im-botleft.gif000066600000001477150472426320015527 0ustar00GIF89aP߹񔔔!,P@Fx(PrYXxL.贊-kH% R1<+G{and{#gtxbo}wl{gE[z_}yprDʼnͯ\^ҮFڻ"~qs]¯"sHe}}d0x/5lBB\xk;d;f$ >N Js^̖^LpNzbH JBJ| 4J&O&B݊WX٢iͭ4%Z+jι.\rz n!þL0be&2&U5+E-ʛXE"g sgvY;m`+,;/J@LWYom&v=G5o]쵧Yq źo;4Rzb 27yw_ҼvqkǴ|捆\`jU}` \51YNh~x\1Xa Zu!^x_d676c @Dn#EBDTie RRY dI@;plugins/filemanager/pages/fm/img/im-delete.png000066600000001266150472426320015345 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<HIDATxڤSMKQ=of&51Qhզ.4 ůFE7.t҅AZ-nEM-J(M~sfh]. <޼s޹8h$4Yi9c_>_YHZ +8gZ+Rw8Ar渮 Ҩ7G_]qOOGlXۻ| q}K &=8:2>O&'y XJPIX =<:< z #9)nUL5bz"v3@32*s(J|rk+$dU0ק77;%M/mN'drRY(9:Ҥs`)J̕NOH軖UX,蝟O4$|J"Q=$a}(dcv :Z4(`@`utTwMMdABjkO-`dcl ;;dK SJRO@7pnm ww&"$e/\EatFoz挽ͮ{==O[Zz&nck9 0IENDB`plugins/filemanager/pages/fm/img/dialog-icon-compress.png000066600000005633150472426320017520 0ustar00PNG  IHDR((mtEXtSoftwareAdobe ImageReadyqe< =IDATxڤXgl3޳aQꂂ`.!ZDˏEh% 6@"F]" @"D3K 739;}6&;2fn9+Y%ܗi򆖄o߾@`aV(HD8׹t]wǣ ~Y 3crAUrMy#K17 [*'NO 5J9R>J|"ňJtGii:lm۶Q]owtRvmn"n֭~8q"bG j[yJG݀i.\X]tY|rѿISY\\\t4A3A:DD6萵W@1.VYpEffjڵkA2WKtZ. NڞjI,-in :'}DI|2%|> (CFikJBR{}ؖ$?w|x?a1m4qMrd%}Aǚ{1VJ̊E:N7䦚7|C {bbʕy&MZ-iً+J#Dj8EeZu -=T`~~~%Kl͕!vܭ[7C/R\a P& +wRrw࢖JPeX;{l!1V_~]@w21 ?` B"ġPP4 ,aע<O8u EM9$ͻ}1ٳ7nHjb"ZP2w]f\~O&/sC;?rm&$3g͚%:v(22cǎN'OǂTPEy}SPu`(#]%(mefD.}ذaǏ?1PŐvf[{%l0,RSS%&A2YYY'BPyb)yAʔtE3 4zg>Pɍkޯٯ_?1zh".^xn \B.ޔIKI H$ۤEN cqT}AJneGf^٧O'NPrpZ4H*$C U%!$l,`$RZE$[`H5cNJA%DOHc <19%%4@2ۛȘdtך¦2ݻ'wKF7^xڕ,ҋUdZ)==Ԏ(2),) idKJrClܸ_v튐Ν:Zx5{*HO"Dζ9& & y8h;iR7;_D"QaرڼÛ0'YDNٳ|d9al۷Xdg!$%$O9JҮ1 [g:)=WJJhǏ`Y@4 ӕ$ L *Ѵ3;/u$p:%WVV-[E:|:]r~AOmh2sIa?/" 0L(DqNU@mmmW>|)S0r4oKE$-ZG`'bfߪ];aoet$MP*C#&G01QHSuj߸g,[lj:"ȓ 8 di: @>=(ln"Ν;WMu[vSwHîpyҖhP BQ0{=6dee^8Ç 7MTe. vIæ^ftEJ.Ԙ~~4m{4|K5jTnaaaע D_̓PRR"=z$mǏ_\~}'/^4n۶m5OUdRQUUm&U $ΔKݻ7 kȑ#!z圆؃m5 5:d9{P[Ӹ "z("˄Gx(˱aZ 6=*iWS2T rR ^DӲc.ni|r$18C(?^\QH)Xp&hr2 }P7T1:s)Bf}njUg{QK^Zpȝ(+gfImn/4OԹ oՊ~ @@A{բA&+%,K͡އ~,@;6sPn$JT_#M1' , Ve^\qYVٖb$Ptlw%_ (] EH?аKr /@J;t-JP'AP1耴ed29, FB\]],ˡXA4W8ym Rss߃<2nP:'ݝHo/ah5QHMMtvf5uoc#3 dv69 i5rxh>ӧ1g<m)8 "C*a*[f5imc|Kb̩ /.UEC`b ,bӥ`X/ʊmZ bzhȌ_# x{:>}~i ߷{z@>:ykty"ZS;9caIHJ5gA.~̘A_{8[:iEk @OEd$vXH_.֩76aI1!8P0/ T E 3S5/=]kO@=๙c~۲[A<ޡl_P729s0P﨟4"&4YT: E0(zz/@H3(jɷ̪m,  phf*N dծA kJ:i7xM9j]H\_k/vf ?IENDB`plugins/filemanager/pages/fm/img/submit-default.png000066600000000000150472426320016406 0ustar00plugins/filemanager/pages/fm/img/progress.gif000066600000000545150472426320015324 0ustar00GIF89a"a~ed{wuԁlqԂyrntox|iҀbfcshm}jӁvzgk!,"p@r١8t Xvxx\z͈|n~x  !! A;plugins/filemanager/pages/fm/img/google_gears_logo.gif000066600000003451150472426320017134 0ustar00GIF89a**zWTE9N@@ݛ{?qMJƩKG;HCTLm)꺝<>4e_â7~*#i]ZM~OKt(H3.3ֱ<۔}s0(.&e*%iګJAj:5K>\PE9@5Յ6-tjbVB6~񜕥l\*k{*س<죖sb*¾{rXJ>r& Ү;3*RGtr׉L@a^qlzt8/sn5,A71){f$ڵ=Ȧ8H;ynܸAKfU1I<5ܶ>v.(D:~b_J=إ8.PB3m`\RE;1,M@M?L?M?L@QDUHK=UGXKL?WJL@J=VIpe߹><2L?J>x0|93G@ua 1}SOu3-m`4{h*،{Y^XlfeZ5PG]Wx(!C8LH>b[vPL=5ODُK>NCRIwFnkHVû¼Ǽɿlf4-_#˨9Ϭ:\~{!,** HIuÇQĈ'ċ%`F :LE/Ph X%ָl鐁BxBCCqE}ŀm@<T\Q`رD#|!%D $0 &|0LI#TB8S$8Y퐎 $\ uH#lQ" ` De`e#B#E\\s H!| @MaB8#@xQd"I$|P1gp2(2R d 4bI"> P-=w?kw~=4~tX)pWq~SP4 A$idE‹:$/>3܁ <3Y%2BIS@,e Z/lOYw1col4(^ʏ2d|#ecz3@LloLn1s؇} '-i20+9.UH͠O0JAccMYH kkk6+<#TCUtvXۉX3J`0̲M0x١uڟ `\J!Ot6xe': 3\ލjF=qPGnh$]CPE1I0t:E6.|/o<ϥ`8jRS&!RŸ>1UmXl^`ņL8])sUW5ߓH VG@G~a5ij^+W>rj44mIҥեp~_.X8>HO9֗_|ͷ޼yɓ߼yӟf677eqk׮<?WVVnݺ;{!Çoyy`xȅ򼵵p…ׯoEq=M766^Z>}իW}obׯ%''# \Μ9#*wVxB/{F΀ݼ+߲sIENDB`plugins/filemanager/pages/fm/img/submit-greyWide.png000066600000005332150472426320016556 0ustar00PNG  IHDR.gAMA7tEXtSoftwareAdobe ImageReadyqe< lIDATx\ݮ=?Ů \ RD=Vϳ}. d"/  D]jW۞hhZnWWJnݦvվ[cnmA}/>?NܹsJk7?Oο?%sNz(/_6 yu%رhzq+WTYxG{>{LUU.^iy,޶Eߜ_n_Ld?egJ^'~ٙ9Ll6UuVm*fo}ɕBIӉZjUhӬW 'ן z,3m_$x:!1޴}b?sJy~-6ݧאT~|KUBxSc_ 6SѸ[{uݾmƳ?l[mk1<͘}h໶1&MfMuG=aݹNf>]tu"|܅y<K:^=yyxn" faX11nG0PhR4Ca]@پ`@5qbseY :~CD沟g1ޫW|~S.dX<Qݝ!AU0fސi683 lh ih0JIG  hZϞeMw¾*鋻gXw2$8Cl5qߴY}8 Y&ȶKwQ6{O4ˉ5jOƞ tMYm}*쫬01P]%fNVaLczveN._r泹P)Z':8R̭2Eq.nfZ-^?f`4&$&b+bS_8<ޛ9.αRKv(])uK;z3wN^k9U@h K:2_tI9W 9QkBf"Cذawl')@HbjRYIRG gYXv2ौZeiΊ-qdIw=88偸}2T`3C!S׫޸Ϭ!;9rlx`'- MiMSAG+[t[;>, Ay՘qf9QūȘY/2i:L3R}.&B(I"hThLԴg2hCWdׯ5i.Nl *zxZLOA'!; ?xNؗ})$ógէ?U:5(E3M|h+,8s̱/u˾GauXE_U/>WOfVݸqC2-gԇ .ׯ꣫~)+W^ .ݻr%uދ򹏡߼wܡ>۷ooxI{VJ|޽{T֭[./5'ż|?~5?sz}"Z*2CWivr=T*?Kz~HIRLݔVW*w;4UBɡBJd(n=NM}ס.QЧ{hKC fcëzu.}_Y+^S?[ `X˵G|>Zz==/;/͕Am3B1:C{pTb=u*X'wD\La~>R=H,_C"bAWO\ 9`iL/ u6wy. zPQsKhOYyeǪhS%]`c< 't}jH@UUx#FY"腱|Kw],ҵN]싪b}~h=G>`P.2;c^mE-GmA(g:3b5/qsf(A7V E/9_j/ ;1WKbV/- :`B :&tL :&tL>: :.Aͱ :&tLPsL1`BDŽ 5DŽ :&tL:&tL1`BL1`BDŽ 0`BDŽ :&t :&tLL|H_a0:cBgA r^tѶ0|<&tV(9ͼn 1i<,#7ݺ:cB_aEn:0VQtYȜV z̵w胎|ڙh'.ڵѓnR z^'7k;Ps}НwݥmkjAEGFUX5qqqaKwsXtDࢪ缨*qy(;='(ȢGxyO:PU¦ߪh5gWUцsvZUwzhEGF}4lx%9b׈ȔF;N;BK2EGF }P4džWto"ߑ^uXNy1"2)?iZ83kaAo)'􁁁rHX`"3*رcXK׉f 荛NIG_yYKC<(,ꏅ.gP?.i!]6Q=s]ťQ\XCUhSUݠN&=oQx?AOIXumu ǰkQweo$.<Jy47t9<ރ)#k +(ty}"di~#Ybc SY̙=t]satgu~,'b}x#Qd^JSJϳS%=_7SVq`|*z쯡~Aq#Gbҿ}e )9?Yb?20T7|:AgEVC d_Q:;dUA}SJƴ9NJw3.l]nO ԢzU젯%>)).k?5!<߭X;J#*ӣ\-J~9K|y،·2$OA*~Ukn@wYCtbee8uyԟ3S E,C e1(ڪ߅|/@L8.kŊ, n'q2bRTfV 9'pf ߠTb< + dѵ}±:GAU^ɢ8^y& 9³׿ zz*rڧG i6<"KY>5T*.8vG v[Ŝ CvPlϻNj)g{/@.}\xySiaY3d#@ !G@m;{o~\KyN)'i#߼y$43+;`QtA Șˆ{( C`GS7z& z9]5:7'bZV|bhúvWvvu: {l}C _8bb~[gNxϜnOvwBZOҐv[ʡaMj|V5>䴤Y-S-+lx6[: sQs>a!lH!9Ν;ޝ@׵ ivn񫆆Qi 4]i,v}iii>NF=,g?qrCPa9CAn 1; WXVųʆ֜dʟ/5^v=`ezC;Eл[YsN-7gwTiKS]]m[78;Cyӽm55O[,+̬ބ0uIIu*{}/sK Mujm>EUݶXRΏOc9)Q^s|-?-'Žn no7LinO9;0tw7zu>kA7>B^pUdp@*7mp3^nawn/WԈ›;i\emO֘꫑)ҝt/ FcfDߑT?o^en|-Sϲ\6YdM55iSMuwnR(/ʑ[/ww;}h2KMsn[j7l6/h<2,MMm-1gag9h0Xلl:ivr2{xX+a7bed4r$e04?N]lzRX驼MMM8p73)k dyaa!;PI&],ܻW$U7}Y 4K\=IVQf.G缯a1Me1OKZ32RSһ3nׂoRt~?[~$/W[$(T{; Qt1+V݂:}uvW.[Mc;O:_x>yݛMDͯ#99}̧ ]bH.m׊u>q<2boD=4R{(E;V$27ۻxΖ\.Z-;;;bLjڵݰoש֑lӊ z.jO|u+젠!phI۲7>־ukR_](nd:"vHe=뫳ޝ;Y=OZ.鋍=2Sς.ۯ}[ӓ,RϲbjjE߰ߡ٬[{nQfQ ^<|"^漹YݷItߡ_m'Qi2g-a@mIMbѽۗ3P;,2Ɂ+uՌG!#͗><ԞuO.} h@ o`9dO6wvl,37n77}wd~&yw zY9{owSӺeU3.|9+[+:[u%7ٛΩ'OkGUQ- Waq~ Df7~,(w1[(OZ/7<ozn8x%#Z} z|-4?$ zvnQ9k@, }間,{$oْt'V+!q4ܒ\68oϼBLƺF67wЀ{w2/螚z}M wyG>DzlYk.~z ,WW+ZʼneBQз<,~ZX`=7$# zvϾuڢ{Ftv}С|m=8zvcVH M"Sw}If3GlOt eGH.<5 AIx"bD6zⴉn<33ExЏrN~S/ŊjM~d޻w+Gl u@/+}!.T􊊮_Gu4/ʞË4#: zjZ)x󜫯h)pQne\6^1_"smb/});4ޚ{Ř8ʳ(t׹Ws)Zoos&_Ȥ#mTD~G.>7iIn˙?͝wYrG/).))..//./?Kن崍(JR^o6U"]1rb~rqbE9= =Fxryς݄o)_ɔBlcO^bH)\G(/w}>+%CJ?|R 鱻U{U|3-._B?|%2%'%򹕔g%?~%2W?SsekԒZ[Oל>3{ųkgiܴ3fӧ[[~xVWΚӦAM6iӿ543Y3ܹs\B&Esb5> ".O<?cYn *{wif/9siXo:j sJk [pR0a!PɉYPy#w_LNkkfHS?ݕPy(T /AJ%zC?F~ 5%+ "^2lx|. \BUZA@M߃Ѝ- MJa<(8j,j1`֨#}٭oR&798Y@ e JD6R6RXs&J%M)-#'E&C%p f* 5nP.DΟJ9|Z/ wag0$]|$ */N3KXHlH@7Q/4<Ԕt⋮XrsPBBLِpv ˲Z@ȅTNf#Y]%Tמ܄S6 K@7KҴl̽q/ʥHTɨus l;`hKYC4IENDB`plugins/filemanager/pages/fm/img/alert-small.png000066600000001156150472426320015713 0ustar00PNG  IHDR;mGgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڬKQǿ/ٸ&$%UV9y ⹧zS7ыzՋ(AA h 5 Ƭ!יPKZ}3yy )%uxZdVĦrYVR)zq2Y}‚<><2[N&q gf$-ٞ!l^/J,r<;kŲDpd(77V*ȯ=g66 :=kke0u0b#h:e؅NqcAtcePj8 -\“`Dx=m`( X2TB4EjTPUIPM! k5t .-Ӡ?szS_ա`/7HRɖa) >NgJW|d Q4 K!8Ë}5@o/;K >֐KI8A#R6 EA>nlsrw+IENDB`plugins/filemanager/pages/fm/img/separator.png000066600000000244150472426320015473 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<6IDATxL öouZ%$# DU>񦌛G(3< M+IENDB`plugins/filemanager/pages/fm/img/filelist-headbg2.png000066600000000545150472426320016604 0ustar00PNG  IHDR +={agAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx 0DѬC !_@Mz0|'b6-Rθ`\ 'B,X1,0 @>,X/X @`, L`, X @` @`, X @` @`,X @`q0|-ZIENDB`plugins/filemanager/pages/fm/img/loading.gif000066600000004623150472426320015076 0ustar00GIF89a˷q;疲/fž@ާ֓Z^ԋЂ߫Jd҇۞ڜoxЀݤ-z! NETSCAPE2.0! ,0:@0! Da  " PXp@ɒ"40!B@p< Ⴥ((0! $>H@KJPBÒ <(Pa  4P X@a +`A$<awC΁K` wl q#X-f84! , @*$P*80P РA<D "@P ABH8@74 -* H @ %$|F q (`„ 80R|`CX0`k*`$P 6!3Ol0RŁRDA/Tr@! ,h \@@x8`<\9D , Ppb>H pР@QHB CS 6hȀx&LDlj'XbÆHAׁ~5Aj c P(Ⴥ̠C! ,`(P0 * V#H(6h0Ts `n80 .,\/ @_ ! , *0a > @~ϞNh1(`NlOq}xUc{[|gHlہl6tzDF:,//qDDwՔٸBS$@6?~ |>pP#ff&LIJ,aH`T#+@]y>=\E3pJ} wwA3FdxR^+@r$PvѻB PE[ߢMG-HIa( H,M"RȜ$@0~}\q}^ U#❳#-G! 2(UUi\3 1Z^W PVY Q;8`f n%C7n;_tOyy#u?w 8ns9oeĶ G3ȠDIENDB`plugins/filemanager/pages/fm/img/im-topright.gif000066600000004275150472426320015727 0ustar00GIF89a!,`#dihlp,tmx$B,Ȥrl:ШtJZجvF+ȃ zn|N> { ɥ΅ыԖxna½*lO>Zl&P,,ȱc(qb.Ae౥˗@ #'Qϟ@ȜI͛8+3ӧ>- (Jbk WRREduIZqʶb(klֺܐc*k &}+^0UC2|˘4ɔ1!Lt͜{hӰ3f&j­_ޭxvꢐ |eX7{};~7^ȣUmß[ν/u?ϮzA ?>uϿe}I_|\E`B'Wp fQw@ j(<&!V8x߉I"4*5Hz星/3hd+7֦{Dx6iR$X0┗Y䖪u9`f*.*i晕)_Rݐ9y% 'gg2)hR~hAfwZxep)si~JӒgJ*Ih 렲jNʫHkPD>KľIIJm{~Kn>C{Z ɸʩoc]\":.,+bR< c5=ܱYlTs#㗲Pr/!UG|2];sØF<#=1Ѯt>*]MSSݣՄݴ֫|u?Y]cGS4u:k͢sCݫ_7\׽݃Xx Lj㏋HP^cvyߠ*z:˦>~{\{b;> ?|8|2+<;={=ݙ=}=:>z>ȵ>>G;?%y?ݸ?A X,!(L 0Ȯ\A|i Q a qސ9C!2"mV!.;p#NS-n-]8/fMQd@59KdBE6-dD9?VcF9vmcH83t'bJ+t/}bL8S$֔7bNyS?aPY8TGaR9T 6O`T8UVW`VUu~__X7V|g_ZV쵕zo}^\7uxw]^wuv}]`U7t\b+56q\d6YUVne[fͶYuVkZh6ZVhYjmZVe%Yl=6[Vb]Xn 6_Wp5u\Vrg5Y Vtu5\UWV]UvINuS߭Tx)5FQ-Tz ^>wOS|45WMS~ô,KR4#HQ{5FfQW4UXDP3uA6P 4?'Ob3u5n2l9Yvg)V3,A{Іf˗D{enl:GKzNt/ihҜO>MP%δOݒTqլ= Xodz@;plugins/filemanager/pages/fm/img/icons/crop.gif000066600000001053150472426320015531 0ustar00GIF89a!! &&%..---,DC@vur21/?><]\ZXWUjigtsq975"! JHF'&%][Y,+*vutihghgf-,,vuuyyyxxxwwwsssrrrpppnnnmmmeee[[[ZZZUUURRRMMMEEE>>>777333...&&&$$$  !C,C  # $ ,''%443--?"7C-A@(BƂ)!5CЍ ..*щ&۸+2;6߅179<>==8ꍂ0/CtH_ ;plugins/filemanager/pages/fm/img/icons/resize.gif000066600000000200150472426320016060 0ustar00GIF89a!,EHЁIc!@U lCYFy+i[^Ę3[uϡ0Ɉ4GQt̑iNA$WyG;plugins/filemanager/pages/fm/img/icons/save.gif000066600000001172150472426320015526 0ustar00GIF89a-9IڀYcmTi|Xm!6HOduZp}访0B.CS3IZI`r>O\~kx/FVğ1@_y-<(5,:&&%tfvh͆zяѐӑ~tguhȊzzznnn!Y,׀Y45"?9:9;<>==6=78 #I@B IIJEYACGGƒKNNǽFDFڱ$ 'ѯLGI/J `Ck*(q"ex0I EaEDd 8|h 'Opc PR,W\0X3d<##*];plugins/filemanager/pages/fm/img/icons/category-open.png000066600000001227150472426320017364 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<)IDATxt;oA̮_~4tDAB $4O WEH,l+;3u؊}WWsG;s.#"=b t `F(ʑ13lN(2qG7|z/u|b Cfa8ADv ںŻ?@W9`YJ'Y@(pa}]v1 x@߾iMH/112r/ \pYP괯`u X+DԂca;sQ#1\WU?ʼn*Daw8nW==BWCZ JgI(}جDrNl+# ܨfjtCj\t{t -(ezhFW)F40-q3mjONVrj_v#& 5J/54kFl؛ɴX8֖qjN~\{kyǕTbY_g&<na;8nbgD_76c̎rIENDB`plugins/filemanager/pages/fm/img/icons/category-closed.png000066600000001113150472426320017666 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڜOAe`$C@&]ziS%PDR`g}{raюnܞPJwrbց=xw@*@`Tkņ'o;0ٜ5?4@}4}WE1v0fs뵏$Nm<&i@+2B\kRE$ tlW1b-b 0Bn w*Ɠ$aV\d/9M7(G76KlZ,AɅ)܉LԮZ'>2Jt> jMl $ (ڈIN/^} YHߏ $0=Yd@s0Ἣℇ(]X] ݨ ( (D]XB *$MkNfs'č+{=#1Ql=K5-krI!h_~.LN84T!Mjt⚅DK%/ \abx ^ͫ F^?tHKû{J^1MdEe3WbU12/{ű$_.ÞNtlSmk*lB&xK{߸ U&#0H' 3C;@tA߮^F]&V4t88B&h+#׃30A"+ps3#8])HLo|&][_Něm_))0OÙ%P(Hb+ҝ3M']4W;ɬt3P 2@e@!)oϙ3k۰4n?38$錧 }WZ@z4I"Z$EjXz,'?Bmn*B-r,S]mvi4UKB<|"ҸY;xCW$5AVLPy\`eY"R lHdj!P`VRϧAdJ0 &!&@<wC|=&5 olp@PkJTGB?xj|65d]E&TInmԣ\.a)Cnxhz9k+!(eg"e IںEA*p'V5~C׀{v tiUm.PI%5 Ex(]:;"_jf&BYR?0c>eqD%2tdba9ҟ9_b0e Zlվ3LLO1y8cUc'O\2?~4g IE6IYje,rpŶRIP!tlho1{ ` QF1 污3,.G+L hCEr"OS ;*< ܮXC}M)_"Ahf(\[Xhl roXm2cco;z-VқD][eW`$b:L'Ia~$SJ1 ;Dc0qj"ovv HuOco!?>j~g]MIENDB`plugins/filemanager/pages/fm/img/icons/toggle_selection.gif000066600000000150150472426320020111 0ustar00GIF89a!,9 ZŴU^X>#=o)M7k8!h&Ì E;plugins/filemanager/pages/fm/img/icons/newfolder.png000066600000001641150472426320016575 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<3IDATx\oE?;{m؁$c ;X dQDTi# ((! BJ-H8DGwp{3=iVo3ߙcC7oTڝbbOtd\!݊ 3*W$q뵎ve[+uvw6r9<͟"\bo*Y0{1?2bmCc[}J)pw?m>V&o|>/w׵m5$FE eL`be٫LQz θJ678'L!Ƴt-4FPeYG$w^lסZq_DU,` 4#괈St9t& !lSј^Xy8O̱-Fth& +05g"kOh2ʘ49$٢v{f>Lyvێ9a_&56SG:Ij>G9rer?zř5sfjra_)] QFu1Q2}7g qРn,.R8s?\. @RRhC O54X\9w98OJe S8,A2@V (BwX,43rP`<"J0n zxF;Ճ  ^\)0營Q•'n I; SbRfFa0QV)mN.mKR(haA/y!#}oc~!$%# D#X\`O&C=xA9B6׎;T@4' 7 R1"KFu]eW=c{t&PUA*/yc>zΛyB$k{;&Ϝ (Dꤟ+me&f^??nW `9YoIENDB`plugins/filemanager/pages/fm/img/icons/up.png000066600000001213150472426320015227 0ustar00PNG  IHDR"LgAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbf\u]e@`ayY@11c1D@]d}bPӗ/%.x!@=X ٟm /)/!O  Qi`r.30N W|0  @JF6J ~d-~!՚AKY%hYGfk 'H10yx ?7P/7101<{2@RC`L^@rQ:f & ko;3F&ny](Ḯ+>@H) HaU']AF$|n.R@bKG]| w  ,L րT=OĚ (A;0?ßP&/8m߿?]ǂ#%.z<7 C_|3e\%+-< ALAAJ .}OOkH("x[;)=~IENDB`plugins/filemanager/pages/fm/img/icons/reload.png000066600000001556150472426320016063 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATx|IhALChD0xHЃ(/~=igd(/Ӳ6BNwn7?~NUGU\ǖ&KgBdt?H8$*m߽hhZܒNly??KXC IENDB`plugins/filemanager/pages/fm/img/icons/revert.gif000066600000001230150472426320016072 0ustar00GIF89a-9IYcmTY^gmsTi|Xm!6HOduZpWhvfnu0BI`r>O\kx$Wbj1@"-(5,:l~k| &&%0,WO.vk?ZR0KD(庄vEOtD\W̷mɴk]IB'րx'#"]S2A*%# f٪5޴FvR\@dkkє } p ף(zzzvvvssspppnnnfffcccbbbaaa!t,tW2XE7k]\][)30AIHJned_ 16AA=9qYZ 45?g[t@PSVMA<`/SNUL=hܔCQmOTl'GKR  "*d` 1a!Bĉƌ#lpFÇ cK%X`!/ IcA0 4hԼY3B(u",]ID@;plugins/filemanager/pages/fm/img/icons/help.png000066600000001456150472426320015544 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxtS]Ha~͙:ׅadRB 5]HÐ"4ꢺd7Y$)edhjvfNF̿۾y |B|>/_}eYrsvaQ A9Ï;-= RRn͖@Q-q8RQ_]3>^|3-L8PvЁʊ<ί"FƦQR1}+3a/99PM%!VdE{7FVe㜛\+͚Ydy\pHL/ZF0hh4*|i"F,EUykE'o?["2۞5)@.+ SN5rmJ®71\NkbF94B.)oG@jF%dLtxUJf0hFu̩U0zyċ5'{P) Y4?[[j5v%eӹ=rq~r~l`Į*\!NLWʧtGV(/峬],˦=Ǝn*^ V2\9[-?ٵLo($G4q7eeK88H *ϟrFZKDDJg~mi;vh}2m}i w0v r3[ϳ,ʏDeճOT7&{e>vμ{LyT~@?oWv\}rKK- ,U+?d}՟?;V>m}>^Q[>Ժne|5,GCERVF+%qW+bʭVB[Һn2+c4UWTk=<xvEl([bQz$Q {VWf.^?FaPvòee22Ȉ 0(g3=l7k2% {Yjw^<7?Mmk^H\}`FhEc/{uHN!m,>흯f*KK;7ӄ^ZDS)OQXg̱oO $*%G~ EPtlKjb875x<fښ=[ OCVSkk!V^mZ19e:³KPshPd?=QMTba{Lw8E͵ C*x@S=%3;˳?!dͯ澞R?܂c6?%r);\jlm2@ U+|;_8Y|y]Z.oCE4쟠?ʚc\8!*yXdS*C*WU׍@7\@|J(n}@q1ue<Gv ^K9/?G_]_?LBO; YWXuD%Z#]POx3xrwa7 xfAIz3\;i;)Z<F4RTyŅw 36;[sd }aT߯}}W߼_'z#exOC-^QY9GL~K5[OX+h?笍7r}"-"oҥgE9:.|^G|5ߙ-#/m g̛R%7puj^zJ7,*ȗDI͗x3fh#@^ۆ3ׯg*ȟ$g7&0|$HA48Zt&] @ }'xZ DxY48 $@BGN-4v8 $PB@f"x-*0P#0xߎ#cL1A$8ny ,iZFUZ)A Ex Mn#%YHf)gKe@ɧlAq ƗRHVR PJ'R(m:J.'Yq螞6*Q޺Ʀhk?(~, @Z -QB K*2y.l+ڋЭ)@~p@hro /,*Agj,gZ8}l|2>@3~lBDkLb (?ۯDKI/iCtPA\r vQo0u5!qE4]tabm6h N>`xkR 5pvߐ 8;~ |CyH9ځ;plugins/filemanager/pages/fm/img/folder-bg.gif000066600000021673150472426320015326 0ustar00GIF89aѹ浵ޛȡ񱱱ؿ얖䑑ޭ׎輼Z!,{H*\ȰÇ#JHŋ3jȱǏ CIɓ(S\1O`ܹ@~'Qr&ڳǏK @Y%?~ hդ6y3r*%>$\)׻t<^Q@%SSQ2IfO@Cv+O"@`JC ZVYͺװc˞M۸s.녨Gx+_μW1hG~pËгH\bߦU(}~0Ͽ(h&CyP 0hfǀ(2A"h((e!*(4Ȁ*e@0@vC}:H&Y`@RdJF)<4Y*Sf<Xn)т&EbBl.ÙEt ȃ6hY{naCP)<|I< (9䢐j f*i>G>SO;$ 5#ꪊ9ꫴ묵ᭈk *.)k6;F VJmnm~KlJnnj oKoi.o 0\gωpl.0 p;_gqR~ "d&r?r.q M4ĸ=&J_t ROrVu'o͵^rbLv3jsn w?MIMzwݷz~t#n3hC^bS\cVs>P޴J~D>8^2,㞲&> ߱# 3C?S߯br_ܲ_ uۚ _ح@lVe*"X7RX 2A,Y;0p&$aBs-U B 0W7dW /CZ];]5Dy1E2Z4@\API$%jɢT{(D)uj B0"hT5nIi\ Qɦ`Aq $Mj6&{3) B isj*#MN**C'BЬ:$+ CQ6t+jDJ+)Rv^X$a-{ƂѲb,1kF΢Qj,EF‘rD-MkGѵzd-aGݠl[Gdp)9\Kdr9\O6etI9]SVUevY]Wvߕexi9^[ezy^_f|9_cUf~_gf9`kf`o6g9asVVgٹawvg9b{'gb6m!e|H84Vhゾ#1CY&Br|c%w1#VWh3dCyC_P1H䒖]1fyonj!f ysyN=:h^i[z.:iwV:{fj駎:>kZ꩞:ꫫ::ۺ޺k;ޫ\qM6a}Wi#ڂ6ce3;6,/;̆[l?{ʮ{.m7{_moo[;76 ϖV85es>x>YE9pU.\ƅ9re\39tu.]S:v]sE:x.^:z^:|._;~Ů_E;.`;`3;.aS<asF</bƓ&<%bʳ.EE'KAdG97=U/f֓}ffF>Og#ㄆg\>/hC>oicZ6?iS?ݯiZpƿjÚ&F~f怸 'ƀfƦ恾ƁF&fȦʆz!g}G%ƂFf׆覃悛Dd䦄ƃƄ&fFƅ& G''熡džG'q1fLJg'懷'Lj)+-'/G1g357lj9;='?GAgCEGNJIKM'OGQgSUWNjY[]'_Gagcegnjikm'oGqgsuwǍy{}'Ggǎ王'GgǏ''G珱g͇GǐG'Ǒ'gG㇒ǒۧ'GgǓG'hgǔˇ(hH  H (h#Ȗ!)(%h'H5+ȗ-h%1ȕ97h=;OȘ?A&KhMUQșS[W(YaH]_hgceȚiHkHG(ț蛑(HhȜ蜡(Hhȝ蝱(HhȞ(HhɈ˨ȟ(HhوۨȠ(Hh鈡먡ȡ(HhȢW)9.7ڐ0~ţ5GIhHH15K;*= ?ڤuHw>cRb(R`d !IR@Qjc,skG0tJj@592puڧ~:w #rxZIqdpjڦqtjQڕ9 DG@@@ 2GP@zG Zʪ GQeZzڇiZ*Qaj j@I0Zz*Ⱥ(uڮ Q ^ʪ DJHJ*J:Jz亰 K@GڧzZ* ˩@Eг>ºw.ZjjP ?KBe@TD"K*ғ s1n[IpMJTI gS7:l4 p%;Ep+?C0EhC\[ljd /ΨszKX;˺\;Cƌ8|6 y+/!)ڻȪR {O'"‚l`_@ʫ|j<|zZ` &ĺ˾,?̅]\<]K  q<̳X\Č@0 d0cpLKHOpvQZ۬?<Ɯʪ(<=1Pz)k˳.ƫ(EL}+D@:E` `*jQp+fL_E @MIIikdPSD k  " B؂=؄]؆}؈؈=،  = @Mhڃ0ڃ70 mff-ص0SںM-llz6܅=^Pەmls0ف}۠-ڤmڃݶۺ-TP0x0xP ܡM #]~]ކ݁^߂ऍ7=NT`s 0ڡ>(<؆ؑݖ]ߵ l>sfXZS0TPh lۼ7\-߅OrAPv~xz|~~ێ A MA g ~ `~.ڞ ߞ90؎>Ns@Nڭu>٧ښ.> ,h~õ`^@:صBn>=^d`Ǯn d۟hPEPN=`&> |^ ~~ 0Z~y^ . PAP _-E`Ezn2?4_68:3gaB/VLL٨Nepx0\XZ\H7OY`d/SpVN޳sp/4vxz|~ t=C `}Kv^d]/ ]{oMPjN OC@J_lP Fpro)v>x?` t ` ^C I m]\OP^Vo]PLY  ; b>![Yiծe֬GqE|鉘0}nx!1d EPLqӸMeکcV]Zg#0f#!Nd|zQ֭^ t[~R\ۇ/!+fgDH%I m$Gl!&m7>,sё.80'Ȗkkp@ 4@N:Ӣ3ΈȒ+‹$8!Fb2, N&12к.^jL% xB+( /N0EZB6- (rJ*J,21ĈC (%+ GĢ~BKLf t '=@8$*4C.$`0(TA?~PBSPCuTRK5TTCJҨOF XP r"B^?" 0!`T]9C hB#j"RJ5Xr  XPmP%ErM=~_x` 6`)cᅭe΁ ÃXCŒc5(h'f%R^IP2) IG^ xc7V+Bdx#)@B BRM2H:Yd"iF1lL y MASrLGxȀhqZ~xM1X5'1Ȍ @Xc ; (SG9 H(<LgZӛt=iPZة:B `rH㠾8ӸHX9 A#Q)J1 2;Еir#`H:A&w͍ zrxp1:Z}*VHֹHĀi`V|IBeǁ|%KH0EPE(W[#'9ǡS|@C^{Eo=0wu=l `ә8+pxć׊#` #:яjp#HmKu{zh;W+|}+|MbyvsZ#V"dda 9-a 08!  Root Entry0256_36957e1a789b1cf4*256_64c62767e0ef5477*   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJ ӕSJFIFC  !"$"$C^" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?>=]ƹBW I,IKgXFwJO x\nՍ|LDži5}O.pi o5_#o`&\h !.=gZz%&QE!aDOZsIC&v eM_.?n-BY]5˿d*#ւ\Ĺ~6W+Vfv>oCNz`P#d:go,uQR{c($]ћ^i iS*u jk BWYbX.%I#6;#:r /,OưXoޅF>3ֽb(TTL??Qa>(Kg7Ȥyzm?&/FK p3'_^X`c^<EL??Q`D,? u)E :&(aQ"1U5ίN Nq;נ?ʯȸgP?b&(aQ">?.?YVb|XX>ƑgE{+<ȣɇyG|,<~$KuF;M|ڏOkQZGm6emkm5۸UCdG8 Ҽȫlqm# I5/PNG  IHDR.sRGBgAMA a xIDATx^\]o\Emϗ$vx ! y&B5Yc]$ (6bc;eo}gƎk]͝UN9\&:[t9;fx,K 9t.~6Nǝe6>;fx1,0 XW|FSנp]\tV5$:͎M`Xf]0F^e:~vpƲ'}4OJHH4cr(IZy (4z:'GlW׿FCݷb Cwo$}Yms᭷'{!0n( .6{6H8 ~>P:'a2Xk/9Z ١{u#_P//*>ޠ n}};S#'ȩ3 N]RW+fT#.^d j\~[ :G0C 2DՆQ8R&EL|6Q> ~o9glN`hHj &4higl*OeBN}?,6\F8M:E/5fo4=*$  ~'dGK q znU8E6 kmOܜE͂]'R WCkgg:kh=زc"zI_dw>8"@p kE,Nr*˥ރr "=6mµͺӻĻ;0N\@)q=RrBR6ȓH&F%qLSlG Z6END+ ٽO{CM1bF?։x{olWƏiHT'40 .ǀ' Њ~'Բq(/_O_a! P+tEtdt>F6Y?ehD7ъuŢS'i!Q{rEpے\v z{n MX Z;,{+0ڊ29,H{=H- h}kHM,Vp= g9Q`'"_~[[]sW^Y.5}MrhTPիJ5Ngi6/ O9URiSk_ʧtvaG-p40=|(ec+Y|"4/x!YiP׷݉wCꮈ &~!hb$ 4f/muJ2@8vE]9)\Hjn~=U<Dž;9_h腉(ޣ!8HJ޶TJU `i|*۞dB7F.fL"ivFjTlq hVpYjrrǁ6+r: I0b08#0Oё.+ч(>D|"~''vjD7DjJ|<1ܤ_c&qjغG> l ɢ |P0| li[:j96|<2//+֫[u2+W=XG39GT"DZH?X)rt('gG6vF̣vXED>^WW/e=ŽVeYP(b=Elٟqzur#l11ʻ,"-{c͍gccuf,&Q]| 2] l<8Zlrlu.?>Y\uIzc-AчȂx@A%u>&pm ƃ ]P==u[/ËM|\[ݮCOQ\S' Hk՗!ҺKP,L+JQY)]|MmzAaٺh/;plugins/filemanager/pages/fm/img/filetypes/word.gif000066600000000214150472426320016430 0ustar00GIF89a"!,QXJܮ@+%@ ;WV5P@yBgG 0 mxxS%Y0Y\ͮjAtZQ ;plugins/filemanager/pages/fm/img/filetypes/xml.gif000066600000000244150472426320016260 0ustar00GIF89a!,@QIesv[g$Y 9mt!r0(:0/r<2>wZ[UUGkDtCYTUᢷ޳|[(D^ֺ'giFwHP1ش`bVJ%?cp)z4Uswnq2"Һs!, @.\p@#zѲ`aCWTE &C\h' c/]0 'L$Q/KfV"A(QH'%$s uC IfMhsh8q ȝ+g6m ١Ca /QF BUHC8|?ˎ]&9B$!0b hP -\ f"pȓ 8,pП;plugins/filemanager/pages/fm/img/filetypes/exe.gif000066600000000163150472426320016241 0ustar00GIF89a"!,8X0 `mHr ϴ8p۰#H`l:";plugins/filemanager/pages/fm/img/filetypes/movie.gif000066600000000432150472426320016576 0ustar00GIF89aN%^agu&zׂ,uǤe"@eu_mmm!,'dIF~pDpGlx A7PD+C@DX X%{ZAX8 N<N@ù\ ux 6lu  " O  * ~yy5!;plugins/filemanager/pages/fm/img/filetypes/document.gif000066600000000162150472426320017275 0ustar00GIF89a"!,7H*0J'vVtXbCKk€2Z'ār졞PW;plugins/filemanager/pages/fm/img/filetypes/up_folder.gif000066600000000174150472426320017441 0ustar00GIF89a!,@AX5EA<`(3 ពNnM`%+>tHd@3iz lmK;plugins/filemanager/pages/fm/img/filetypes/archive.gif000066600000000254150472426320017102 0ustar00GIF89a3! ,f̙̆YPI[:R0A0l Y& Ea @lx A @0_RHtRKJ&b|pNw~o;plugins/filemanager/pages/fm/img/filetypes/excel.gif000066600000000213150472426320016554 0ustar00GIF89a"!,PXJܮ@+%BY`Y"(F ]J u˥64ϸ*Q9db[]i^';plugins/filemanager/pages/fm/img/filetypes/pdf.gif000066600000000176150472426320016235 0ustar00GIF89a!,@CAN*AŸU@S)5d԰=JKM(>L VcOӴL:JR> ;plugins/filemanager/pages/fm/img/filetypes/trash.gif000066600000000200150472426320016571 0ustar00GIF89a!,EX^H$dD.Cp 0|E3mݲ ,,#9lչ |c,G`@Up;plugins/filemanager/pages/fm/img/filetypes/swf.gif000066600000000365150472426320016263 0ustar00GIF89accΜcΜRR1Μ!,r $(PlR>*QOt?Ax`/'<B@X2[ tU@p0T_1h(oh7" z:"mxh2" *yW"--|.%2!;plugins/filemanager/pages/fm/img/filetypes/sound.gif000066600000000145150472426320016610 0ustar00GIF89a!,6\c)3=oh=rgDZZQƏbt)oCO]:yƳ hhGҩ>5ch6M{jN3QGY~Xr%=+=v;_  H1=/zyv[a(F=`j;) cg2 Z' .RO2O @\J|O%&AVnk&. .}2YŴ]z Sky,W55ψ1ug5\eE3 gPlgT Ѻ\ji@ FbV`X :H/w):PG-DSV{x ׌`mmjv5B'#=6W#=Q\F&? xreOauS]-JVGf<̩^n_e{.7F b="C1ϻnU5}luzLr̶kaئ+Q=Qw_h iaG-\sgVBAl G"k>Y* `繟 ߱v3) \=F\,A9qJg|{q!=Nun{>}14ziZBp?\5^Z%Oad_$yljz#Q\i5⺅ekHs$1 B-0e2EҡmWU{ S R<T* !m0X UK}g!VM@w!8͉Z%P+nl螱ZUͶq=TuN@U. mD"up3>TSS3{3Bf4Iv2h]ns_CCU<C(.ٯ+^F-?_sʼ*HdNripjp>ImC$hCfp9CXt1j1Ot#0%H| \E6c#MyϜ|LκNj_:Y#<"8 A*şόZmBs@̱Hj(dϜn4X!K3 Դ^~h}ӸHdWtE?+cNG"s29$s>#˙C~m "h!yƥ< H#L>z#f_ Ԟd2jnzpr3m}81?I1L[)0%|U(:@P e:Cd֥gyE4  ΌNWW/Jض|}QSلt*P%5&?q %7o\l9y25E<6ujfFi@Af[O64iTu 1luLeg#N9Ŀ,fL&wyHYCnV״ڰe0kSDqaJk/` cV,u1+K?(w|k,"-ݝVl$=ijǨ7 oʒ={6jJY|8Z7 A1D ̥_tXy,?7" %mBhiK@0B lnN'lg*GFߟtT^WD4x5Alh /rLJ& 1?ᮨ|]ŋ[[[U`rW##ԋ{ SrZ܁]opW$. QN[Wajq2ַ༥e2EzOOgsYٛ{6x9?PKvq>p'{8D7"+VzBfYa_n.lV֝pp?mDF(GJ {,R}CBܧ8+}إeca%WP19B= pRBA~vgP_,6n{8 R8YK0Y fy < +ڋc@`Y kVݗ6`_k*4AU_H 6Á @OScC^??Ky]ƏH>sikBʡ a`0rop@ W /9BC XP{}r(kY'cC{,/Q@DX{]}m0"*)1ypoStnZصdg͒) iy7* &IaKFMG;;PR]p /("?Rx-8ooR ARe'-BR0{0PZ8# gk /n< $BAa0B G~<2d39RUCY,<f.EnqD"hѢp͢0%Z[GZl^VC-,Xufsʷa#fW}e!@Wy1`_Pʿk5|W3l~EG.XK-g;Eק؍޾0`bIs4،k3mzG=5F,%Ūa<Ic `c}$qO6{HV@9A VD=vvuuݾBpޞyGc%P6M?z/ 1?-iJֈQ:n% Tw\`te]5xwpX4+pgW3Ifስdko\jw*nfF̵2;IDa}2mFpnwJU3m;ٹrʵ?nU: ^Ou^LWCOn\^z ZV3纻+%1>\ۖl\5qݷ_WOw'NxIFG?o6?[=OږhsX5a6>_g-\k &a:kY Lf.Ԧ'%|s'܏׼u/f&NlKƏJע.uM7͕t-.*mMԥ\B}Y L1=3_u7\zᒭfN3Zt3F0} 5og}n=?դ;8yACiܰqĚ<;; KADR.azzZ917_ݭ{J-iugmrPiFb\ _ JE1EHBH kwvf8Pcٙ={\{;Wp~*.#4fe^mD5fu*Ĩ%o $AĽTShV7?a{ps2L(-0)4PK GC {#createdoc.title}

        {#createdoc.title}

        {#createdoc.description}

        {#createdoc.path}

        plugins/filemanager/readme.txt000066600000000543150472426320012510 0ustar00You can find the documentation with installation instuctions here: ImageManager documentation: http://wiki.moxiecode.com/index.php/MCImageManager:Index FileManager documentation: http://wiki.moxiecode.com/index.php/MCFileManager:Index If you still have problems installing it use the forums at http://tinymce.moxiecode.com/punbb/index.php for support. plugins/filemanager/css/_cache/fm_index_css.gz000066600000000710150472426320015503 0ustar00Sn0=׀/-m"QN98~C1"G$v{IFn$ Nq7pړWM9ׯ Ր!_,:uZj69-]}V;<_g!Su.}4hn. b 熴R焠ZȺ xe5o]E ߱NXꆊ:WE[ J?Z},>. Gz+x4@x(??oA96V F/x=^p +=&}cUjaScZl̤aAn[T+7\b6v;ԤWJJ[6A / nU5 f}c֐{&plugins/filemanager/css/_cache/fm_core_css.css000066600000072161150472426320015505 0ustar00/* Image Manager */ /* core stuff */ /* ########################################################## */ body { background:#fff; color:#000; margin:0 0; padding:0; font:70% arial, helvetica, sans-serif; text-align:center; } body.filelistPage { overflow: hidden; } td { font-size: 11px; } img { behavior:expression(PNG.fix(this)); border:0; } hr { clear:both; border:0; color:#e5e5e5; background-color:#e5e5e5; height:1px; } div { font-size:11px; } /* Lists */ ul { margin:0; padding:0; list-style:none; } ul li { margin:0; padding:0; } /* Layout */ #center { width:auto; max-width:1200px; margin:0 auto; text-align:left; } /* Links */ a { background:transparent; } a:link { color:#000; } a:visited { color:#000; } a:visited:hover { color:#000; } a:hover { color:#000; } a:active { color:#000; } #thearea { position:relative; } #secondarea { position:absolute; left:200px; } /* Page navigation */ /* ########################################################## */ .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0 2px; } /* File Manager */ /* ########################################################## */ .filemanagertop { background:#e8e7e5 url(../pages/fm/css/../img/check_arrow.gif) no-repeat 16px 12px; padding:6px 0px 6px 36px; } .filemanagertop ul, .filemanagertop li { display: inline; } .filemanagertop a, .filemanagertop a:visited, .filemanagertop a:hover { text-decoration:none; color:#3f5f9f; cursor: pointer; } .filemanagertop li.disabled a, .filemanagertop li.disabled a:visited, .filemanagertop li.disabled a:hover { text-decoration:none; color:#999; cursor: text; } .filemanagertop li a:hover { text-decoration:underline; color:#3f5f9f; } .filemanagertop li.hidden { display: none; } .filemanagertop li.end { display: none; } .filelist { font-size:100%; width:100%; } .filelist th { text-align:left; color:#7a92c2; background:#f2f1ee url(../pages/fm/css/../img/filelist-headbg.png) no-repeat right top; padding:8px 8px 6px 8px; } .filelist th.file { background:#fff url(../pages/fm/css/../img/filelist-headbg2.png) no-repeat right top; padding:2px 0px 2px 30px; } .filelist th a, .filelist th a:visited { color:#7a92c2; text-decoration:none; } .filelist th a:hover { color:#3f5f9f; } .filelist td { background:#f2f1ee url(../pages/fm/css/../img/filelist-border.png) repeat-y right top; padding:1px 4px 1px 8px; } .filelist td.file { background-color:#fff; height: 22px; } .filelist td .d { position:relative; } /* hover effect */ .filelist tr.hover td { background-color:#e8e7e5; } /* selected effect */ .filelist tr.selected td { background-color:#ddefff; } /* focused effect */ .filelist tr.focused td { background-color:#ddddff; } /* popup box */ .filelist .edit { position:absolute; left:8px; top:-8px; background:#fff; border:1px solid #959595; padding:2px; text-align:left; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:10; width:12em; } .filelist .edit li a { display:block; padding:1px 4px 1px 20px; text-decoration:none; } .filelist .edit li a:hover { color:#2e4e8c; } .filelist .edit li a.select:hover { background:#e3e0d8; } .filelist .edit li a.download:hover { background:#e3e0d8; } .filelist .edit li a.delete { background:url(../pages/fm/css/../img/im-delete.png) no-repeat; } .filelist .edit li a.delete:hover { background:#e3e0d8 url(../pages/fm/css/../img/im-delete.png) no-repeat; } .filelist .edit li a.preview { background:url(../pages/fm/css/../img/preview.png) no-repeat; } .filelist .edit li a.preview:hover { background:#e3e0d8 url(../pages/fm/css/../img/preview.png) no-repeat; } .filelist .edit li a.info { background:url(../pages/fm/css/../img/im-info.png) no-repeat; } .filelist .edit li a.info:hover { background:#e3e0d8 url(../pages/fm/css/../img/im-info.png) no-repeat; } .filelist tr { height: 22px; } *html .filelist .edit li a { display:inline; width:100%; } .filelist a.checkbox, .filelist .selected a.checkbox { display: block; width: 13px; height: 13px; background: transparent url('../pages/fm/css/../img/checkbox.gif') no-repeat 0 0; margin-left: 4px; overflow: hidden; } /* Rename input */ .filelist input.text { display: block; width: 75%; font-size: 11px; border: 1px solid gray; } .filelist .selected a.checkbox { background: transparent url('../pages/fm/css/../img/checkbox.gif') no-repeat 0 -13px; } .filelist .parent a.checkbox { display: none; } .filelist .checkbox { width: 22px; } #filemanagerlist { overflow: auto; overflow-x: hidden; } /* icons */ .filelist td.file a { padding:2px 0px 2px 22px; text-decoration:none; display: block; background-repeat: no-repeat; behavior:expression(PNG.fix(this)); width: 220px; overflow: hidden; } .filelist a { background-image: url(../pages/fm/css/../img/filetypes/unknown.gif); } /* Display captions */ .icon .caption { display:inline; } .caption-on { font-weight:bold; } .caption-off { color:#666; } /* List container */ #listcontainer { position:relative; } #listing { position: absolute; left: 215px; top: 0px; right: 0; max-width: 980px; padding-right: 20px;} .pagenav { padding:0px 0px 10px 0px; color:#484848; z-index:1; height: 16px; } .pagenav a, .pagenav a:visited { font-weight:bold; color:#484848; text-decoration:none; } .pagenav a:hover { color:#2e4e8c; } .pagenav select { margin:0px 2px; } /* Folder view */ /* ########################################################## */ #folders { margin:-5px 10px 10px 2px; position:absolute; top:0; left:0; width:192px; background:url(../pages/fm/css/../img/folder-middle-bg.png) bottom left; z-index:1; } #folders div.panel {background:url(../pages/fm/css/../img/folder-bottom-bg.png) no-repeat bottom left;} #folders h2 { background:url(../pages/fm/css/../img/folder-top-bg.png) top left; margin:0; padding:20px 10px 10px 10px; font-size:100%; color:#7791c4; } #folders h3 { margin:10px 2px 0px 2px; padding:10px 8px 10px 8px; font-size:100%; color:#7791c4; border-top:1px solid #9ab0d7; } #folders a { text-decoration:none; behavior:expression(PNG.fix(this)); } #folders .categories { margin:0px 6px 0px 10px; } #folders .categories li a { background:url(../pages/fm/css/../img/icons/category-closed.png) no-repeat; padding:2px 2px 0px 24px; display:block; min-height:16px; } #folders .categories li.current a { background:url(../pages/fm/css/../img/icons/category-open.png) no-repeat; font-weight:bold; } #folders .special { margin:5px 6px 0px 10px; } #folders .special li a { padding: 2px 2px 0px 24px; display: block; min-height: 16px; height: 16px; line-height: 16px; } #folders a:hover { color:#2e4e8c; } /* Preview iframe */ #preview { width: 170px; height: 170px; padding: 0px; margin: 0px; background-color: #f2f0ed; visibility: hidden; } #previewwrap { border: 1px solid #9ab0d7; width: 170px; height: 170px; } #previewinfo { overflow: hidden; width: 170px; padding-bottom: 5px;} #filepreview { padding:0px 0px 20px 10px; } #filepreview .actions ul, #filepreview .actions li { display: inline; } #filepreview .actions li.end { display: none; } #filepreview .actions { padding-top: 10px; text-align: center; width: 170px; } #filepreview .actions a { text-decoration:none; color:#3f5f9f; cursor: pointer; } #filepreview .actions a:hover { text-decoration:underline; color:#3f5f9f; } #filepreview .actions .disabled a, #filepreview .actions .disabled a:visited { color:#aaa; text-decoration:none; cursor: text; } #filepreview .actions .disabled a:hover { color: #aaa; text-decoration:none; cursor: text; } #filepreview .actions .hidden { display: none; } /* Sorting */ a.sort { background-image: none; padding: 2px 18px 2px 0px; } a.sortasc { background: url(../pages/fm/css/../img/sortasc.gif) no-repeat top right; padding: 2px 18px 2px 0px; } a.sortdesc { background: url(../pages/fm/css/../img/sortdesc.gif) no-repeat top right; padding: 2px 18px 2px 0px; } /* Edit menu */ /* ########################################################## */ .Menu { position:absolute; left:0; top:0; z-index:10; display:none; background:#eae9e5; border:1px solid #cac6bb; text-align:left; } .Menu li a { display:block; padding:2px 8px; text-decoration:none; } .Menu li a:hover { color:#2e4e8c; } .Menu li.disabled a { color: gray; cursor: text; } .Menu li.disabled a:hover { color: gray; } .Menu li.hidden { display:none; } *html .Menu li a { display:inline; width:auto; } .folder .name, .parent .name { font-weight:bold; } /* Template engine */ /* ########################################################## */ #toolbar.caption span.caption { display: inline; } #tools .hidden { display: none; } #tools li {font-size:11px} /* Validation classes */ label.msg { display:none; } label.invalid { color:#aa0000; display:inline; } input.invalid { background-color:#d63232; } div label.invalid { display:block; } /* Dialog facts */ #facts { height:30px; } /* Progress */ #progress { background: url('../pages/fm/css/../img/loading.gif') no-repeat; padding-left: 20px; } #dirinfo {display:none} /* Toolbar */ /* ########################################################## */ #topnav { background:url('../pages/fm/css/../img/toolbar.png') no-repeat bottom left; } #topwrap { background:url('../pages/fm/css/../img/toolbar.png') no-repeat bottom right; margin:0px 0px 0px 30px; } #settings { display:none; position:absolute; top:20px; right:-4px; width:14em; line-height:14px; text-align:right; background:#fff; padding:4px; border:1px solid #959595; opacity:0.9; -ms-filter:'alpha(opacity=90)'; filter:alpha(opacity=90); z-index:1; } #settings a { display:inline; padding:0px; } /* Inside stuff */ .toolbar { margin:0px; padding:2px 20px 10px 0px; font:90% tahoma, arial, sans-serif; } .toolbar .navigation { margin:0px 2px; padding:0px; float:left; width:170px; padding-bottom:12px; } .navigation .desc { margin:0px 0px 4px 0px; background:url('../pages/fm/css/../img/navdesc_bg.gif') no-repeat right; } .navigation .path { margin-bottom:5px; width:320px; overflow:hidden; } .toolbar .icons { margin:14px 0px 0px 0px; float:right; } .toolbar .icon { margin:0px 2px 0px 1px; padding:0px; float:left; line-height:0px; position:relative; } .toolbar .disabled img { opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30); } .toolbar .disabled a { color: #AAA; } .toolbar .disabled a:hover { background: transparent; cursor: default; } /* Icons */ .icon a { text-decoration:none; padding:2px; display:block; outline:0; } .icon a:hover { background:#d3d0ce; } .icon .caption { position:relative; top:-4px; display:none; padding:0px 4px 0px 4px; } .toolbar .separator { margin:0px 4px; float:left; } .icon span.caption { display: inline; } #tools { display:none; } /* dialog popups */ /* ########################################################## */ body { overflow: auto; } .dialog { position:relative; text-align:left; width: 100%; } .dialog .top { padding:10px 12px; background:#f3f2f0 url('../pages/fm/css/../img/dialog-top.png') no-repeat right bottom; behavior:expression(PNG.fix(this)); } .dialog .close { position:absolute; top:4px; right:4px; } .dialog h2 { font:bold 115% tahoma, arial, sans-serif; margin:0px; } .dialog .description { margin:0px; } .dialog .headline { padding:8px 0px 12px 40px; } .dialog .createdir { background: url('../pages/fm/css/../img/dialog-icon-newfolder.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../pages/fm/css/../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .createdoc { background: url('../pages/fm/css/../img/dialog-icon-newfile.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .edit { background: url('../pages/fm/css/../img/dialog-icon-edit.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .upload { background: url('../pages/fm/css/../img/dialog-icon-upload.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .createzip { background: url('../pages/fm/css/../img/dialog-icon-compress.png') no-repeat left; behavior:expression(PNG.fix(this)); } .dialog .facts { background:#f3f2f0; padding:8px 16px 12px 20px; font:90% tahoma, arial, sans-serif; } .dialog .body { padding:8px 16px 12px 20px; } #content { display: none; } /* Upload */ #uploadarea { position: relative; padding: 16px; height: 220px; overflow: hidden; } * html #uploadarea { height: 208px; } #uploadarea .small { margin: 2em 0 -1em; color: #6d88c4; font-size: 0.9em; text-transform: uppercase; } #uploadarea #add.hidden { display: none; } #uploadarea .addbutton, #uploadarea #uploadstart { display: block; width: 182px; height: 26px; margin: 0 0 1em; background: url(../pages/fm/css/../img/submit-greyWide.png) no-repeat; text-align: center; font-size: 1em; font-weight: bold; line-height: 26px; text-decoration: none; } #uploadarea #uploadstart { background: url(../pages/fm/css/../img/submit-wide.png) no-repeat; } #uploadarea #fileblock { position:relative; top:400px; } #uploadarea #filelist { position:relative; max-height: 7em; overflow: auto; margin-bottom: 6px; border: 1px solid #9fadc4; } * html #uploadarea #filelist { height: 7em; } #uploadarea #fileshead { width: 100%; font-weight: bold; background: #eee; border-bottom: 1px solid #fff; } #uploadarea #files { width: 490px; } #uploadarea #status { position: absolute; top: 4px; border: 1px solid #9fadc4; padding: 1px; width: 506px; height: 34px; display: none; } #uploadarea #progressbar { position: relative; width: 100%; height: 34px; background: url(../pages/fm/css/../img/progress.gif); z-index: 10; } #uploadarea .progresstext { position: absolute; top: 0; left: 0; width: 100%; text-align: center; color: #535353; font-weight: bold; line-height: 36px; z-index: 11; } #uploadarea .progresstext a { text-decoration: none; color: #535353; } #files .fname a {display:block; width:295px; overflow:hidden} #files .disabled {text-decoration:none; cursor:default} #files .done {color:gray} #files .failed {color:red} #multiupload_view {display:none} #singleupload_view {display:none} #multiupload_view #selectview {position:relative} #files input.text {width:290px; margin:0; padding:0} /* Createdoc */ a.preview { background: transparent url('../pages/fm/css/../img/preview.gif') no-repeat; width: 16px; height: 16px; display: block; } #createdoc { overflow: hidden; } /* Edit */ #edit form div {margin-bottom: 4px} #edit #textcontent { width: 500px; height: 250px; } /* Forms */ /* ########################################################## */ form { margin:0px; padding:0px; } select { font:100% tahoma; } input.file, input.text { font:90% tahoma, arial, sans-serif; } /* Submit buttons */ input.submit, .button { width:94px; height:26px; padding:0 0 2px; border:0; background:url('../pages/fm/css/../img/submit-grey.png') no-repeat; font:normal 100%/100% tahoma, arial, sans-serif; text-align: center; text-decoration: none; } .button.disabled { cursor: text; color: gray; } input.default { background:url('../pages/fm/css/../img/submit-default.png') no-repeat; font-weight:bold; } input.cancel { background:url('../pages/fm/css/../img/submit-grey.png') no-repeat; font-weight:normal; } a.button { padding-top: 6px; text-align: center; text-decoration: none; } /* File types */ a.folder { background-image: url(../pages/fm/css/../img/folder.png); } a.parent { background-image: url(../pages/fm/css/../img/icons/up.png); } a.jpg, a.gif, a.bmp, a.tif, a.jpeg, a.png { background-image: url(../pages/fm/css/../img/filetypes/image.gif); } a.html, a.htm, a.php, a.asp, a.aspx, a.jsp, a.cfm { background-image: url(../pages/fm/css/../img/filetypes/html.gif); } a.mov, a.avi, a.wmv, a.rm, a.qt, a.mpg, a.mpeg { background-image: url(../pages/fm/css/../img/filetypes/movie.gif); } a.ppt, a.ppm { background-image: url(../pages/fm/css/../img/filetypes/powerpoint.gif); } a.pdf { background-image: url(../pages/fm/css/../img/filetypes/pdf.gif); } a.txt, a.nfo { background-image: url(../pages/fm/css/../img/filetypes/txt.gif); } a.swf, a.flv { background-image: url(../pages/fm/css/../img/filetypes/swf.gif); } a.doc, a.dot, a.docx { background-image: url(../pages/fm/css/../img/filetypes/word.gif); } a.xls { background-image: url(../pages/fm/css/../img/filetypes/excel.gif); } a.zip, a.rar, a.arj, a.tar, a.tgz, a.gz, a.zoo, a.lha, a.lzh { background-image: url(../pages/fm/css/../img/filetypes/archive.gif); } a.xml, a.xsl, a.xsd, a.dtd { background-image: url(../pages/fm/css/../img/filetypes/xml.gif); } a.mp3, a.mp2, a.aif, a.aiff, a.wav { background-image: url(../pages/fm/css/../img/filetypes/sound.gif); } a.exe, a.com { background-image: url(../pages/fm/css/../img/filetypes/exe.gif); } /* * * clearlooks2 - Gnome theme * * */ .clearlooks2 { position: absolute; left: 20px; top: 20px; width: 320px; height: 240px; overflow: hidden; color: white; display: none; text-align: left; } .clearlooks2_progress { position: absolute; left: 0; top: 0; width: auto; height: 30px; z-index: 100100; display: none; border: 1px solid gray; background: #FFF url('../pages/fm/css/../img/loading.gif') no-repeat 5px 8px; text-align: left; } .clearlooks2_progress .message { padding-left: 30px; padding-right: 10px; font-family: Arial, Verdana; font-weight: bold; line-height: 30px; } .clearlooks2_event_blocker, .clearlooks2_visible_event_blocker { position: absolute; left: 0; top: 0; width: 100%; height: 100%; z-index: 100001; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2_visible_event_blocker { opacity:0.7; -ms-filter:'alpha(opacity=70)'; filter:alpha(opacity=70); background: #FFF; } .clearlooks2_placeholder { position: absolute; left: 0; top: 0; border: 1px dotted black; display: none; z-index: 100002; } /* Alert */ .clearlooks2 .alert { text-align: left; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; font-weight: bold; text-decoration: none; } .clearlooks2 .alert .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .bigicon { display: none; } .clearlooks2 .alert .bigicon, .clearlooks2 .confirm .bigicon, .clearlooks2 .status .bigicon { position: absolute; left: 15px; top: 15px; width: 32px; height: 32px; display: block; } .clearlooks2 .alert .info, .clearlooks2 .status .info { background-image: url('../pages/fm/css/../img/clearlooks2/alert_info.gif'); } .clearlooks2 .alert .warning, .clearlooks2 .status .warning { background-image: url('../pages/fm/css/../img/clearlooks2/alert_warn.gif'); } .clearlooks2 .alert .error, .clearlooks2 .status .error { background-image: url('../pages/fm/css/../img/clearlooks2/alert_error.gif'); } .clearlooks2 .alert .message, .clearlooks2 .confirm .message { position: absolute; left: 55px; top: 15px; width: 325px; height: 40px; overflow: auto; } .clearlooks2 .ok, .clearlooks2 .cancel { position: absolute; left: 160px; top: 65px; width: 80px; height: 30px; background-image: url('../pages/fm/css/../img/clearlooks2/button.gif'); text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 30px; font-weight: bold; text-decoration: none; } /* Confirm dialog */ .clearlooks2 .confirm .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .confirm .ok { left: 110px; } .clearlooks2 .confirm .cancel { left: 210px; } .clearlooks2 .confirm .ask { background-image: url('../pages/fm/css/../img/clearlooks2/alert_info.gif'); } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Status dialog */ .clearlooks2 .status .windowmiddle .middle { background-color: #d6d7d5; } .clearlooks2 .status .ok { top: 178px; } .clearlooks2 .status .statustext { position: absolute; left: 10px; top: 8px; width: 360px; height: 150px; border: 1px solid gray; overflow: auto; padding: 5px; } /* Custom stuff */ .statusrow { background: #f9f9f9; border: 1px solid #f3f3f3; padding: 3px; margin-bottom: 3px; } .statuscol1 { font-weight: bold; overflow: hidden; } .statuscol2 { } /* Chromeless window */ .clearlooks2 .chromeless .resize, .clearlooks2 .chromeless .action, .clearlooks2 .chromeless .statusbarbottom { display: none; } .clearlooks2 .chromeless .middle .action { display: block; } .clearlooks2 .chromeless .windowtop, .clearlooks2 .chromeless .window { height: 5px; } .clearlooks2 .chromeless .windowtop .left { position: absolute; left: 0; top: 0; width: 5px; height: 5px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_chromeless_left.gif') no-repeat; } .clearlooks2 .chromeless .windowtop .middle { position: absolute; right: 5px; width: 100%; height: 5px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_chromeless_middle.gif') no-repeat 5px 0; clip: rect(auto auto auto 10px); } .clearlooks2 .chromeless .windowtop .right { position: absolute; right: 0; top: 0; width: 5px; height: 5px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_chromeless_right.gif') no-repeat; } .clearlooks2 .chromeless .windowmiddle { top: 5px; } /* Top section */ .clearlooks2 .windowtop .middle-fg { display: none; } .clearlooks2 .windowtop { position: absolute; width: 100%; height: 23px; overflow: hidden; } .clearlooks2 .windowtop .left { position: absolute; left: 0; top: 0; width: 6px; height: 23px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_left.gif') no-repeat; } .clearlooks2 .windowtop .middle { position: absolute; right: 6px; width: 100%; height: 23px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_middle.gif') no-repeat 12px 0; clip: rect(auto auto auto 12px); /* Safari hack */ } .clearlooks2 .windowtop .right { position: absolute; right: 0; top: 0; width: 6px; height: 23px; background: transparent url('../pages/fm/css/../img/clearlooks2/top_right.gif') no-repeat; } .clearlooks2 .windowtop .title { position: absolute; left: 0; top: 0; width: 100%; height: 19px; text-align: center; vertical-align: middle; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; font-weight: bold; } /* Top section - Focus */ .clearlooks2 .focustop .left { background: transparent url('../pages/fm/css/../img/clearlooks2/top_left.gif') no-repeat -6px 0; } .clearlooks2 .focustop .middle { background: transparent url('../pages/fm/css/../img/clearlooks2/top_middle.gif') no-repeat 12px -23px; } .clearlooks2 .focustop .right { background: transparent url('../pages/fm/css/../img/clearlooks2/top_right.gif') no-repeat -6px 0; } .clearlooks2 .focus .title { color: #FFF; } /* Middle section */ .clearlooks2 .windowmiddle { position: absolute; top: 23px; width: 100%; z-index: 5; } .clearlooks2 .windowmiddle .left { position: absolute; left: 0; top: 0; width: 4px; height: 100%; background-image: url('../pages/fm/css/../img/clearlooks2/middle_left.gif'); } .clearlooks2 .windowmiddle .middle { position: absolute; left: 4px; top: 0; width: 100%; height: 100%; background-color: #FFF; color: #000; } .clearlooks2 .windowmiddle .right { position: absolute; right: 0; top: 0; width: 4px; height: 100%; background-image: url('../pages/fm/css/../img/clearlooks2/middle_right.gif'); } /* Bottom section */ .clearlooks2 .windowbottom { position: absolute; left: 0; bottom: 0; width: 100%; height: 5px; overflow: hidden; z-index: 5; } .clearlooks2 .windowbottom .left { position: absolute; left: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../pages/fm/css/../img/clearlooks2/bottom_left.gif'); overflow: hidden; } .clearlooks2 .windowbottom .middle { position: absolute; left: 5px; bottom: 0; width: 100%; height: 5px; background: url('../pages/fm/css/../img/clearlooks2/bottom_middle.gif'); overflow: hidden; } .clearlooks2 .windowbottom .right { position: absolute; right: 0; bottom: 0; width: 5px; height: 5px; background-image: url('../pages/fm/css/../img/clearlooks2/bottom_right.gif'); overflow: hidden; } /* Statusbar */ .clearlooks2 .statusbarbottom { height: 24px; overflow: hidden; z-index: 5; } .clearlooks2 .statusbarbottom .left { bottom: 0; width: 5px; height: 23px; background-image: url('../pages/fm/css/../img/clearlooks2/statusbar_left.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .middle { height: 23px; background-image: url('../pages/fm/css/../img/clearlooks2/statusbar_middle.gif'); overflow: hidden; } .clearlooks2 .statusbarbottom .right { width: 20px; height: 23px; background-image: url('../pages/fm/css/../img/clearlooks2/statusbar_right.gif'); overflow: hidden; } .clearlooks2 .windowbottom .statustext { display: none; } .clearlooks2 .statusbarbottom div.statustext { display: block; position: absolute; left: 6px; bottom: 0; font-family: Arial, Verdana; font-size: 11px; color: #000; line-height: 23px; } .clearlooks2 .resizable .statusbarbottom .resize-se { background-image: url('../pages/fm/css/../img/clearlooks2/statusbar_resize.gif'); width: 20px; height: 23px; } /* Actions */ .clearlooks2 .action { position: absolute; cursor: pointer; overflow: hidden; } .clearlooks2 .close, .clearlooks2 .min, .clearlooks2 .med, .clearlooks2 .max { z-index: 3; } .clearlooks2 .resizable .min { right: 68px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat 0 0; background-repeat: no-repeat; } .clearlooks2 .resizable .med { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -29px 0; background-repeat: no-repeat; } .clearlooks2 .resizable .max { right: 37px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -58px 0; background-repeat: no-repeat; } .clearlooks2 .close { right: 6px; top: 3px; width: 29px; height: 16px; background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -87px 0; } /* Actions - Focus */ .clearlooks2 .focustop .min { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat 0 -16px; } .clearlooks2 .focustop .med { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -29px -16px; } .clearlooks2 .focustop .max { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -58px -16px; } .clearlooks2 .focustop .close { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -87px -16px; } /* Actions - Hover */ .clearlooks2 .focustop .min:hover { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat 0 -32px; } .clearlooks2 .focustop .med:hover { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -29px -32px; } .clearlooks2 .focustop .max:hover { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -58px -32px; } .clearlooks2 .focustop .close:hover { background: transparent url('../pages/fm/css/../img/clearlooks2/buttons.gif') no-repeat -87px -32px; } /* Move and resize handles */ .clearlooks2 .move { top: 0; left: 0; width: 100%; height: 19px; cursor: move; z-index: 1; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resize { display: none; z-index: 4; } .clearlooks2 .resizable .resize { display: block; } .clearlooks2 .resizable .resize-w { top: 0; left: 0; width: 5px; height: 100%; cursor: w-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-e { top: 0; right: 0; width: 5px; height: 100%; cursor: e-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-n { top: 0; left: 0; width: 100%; height: 5px; cursor: n-resize; overflow: hidden; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-nw { top: 0; left: 0; width: 5px; height: 19px; cursor: nw-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-ne { top: 0; right: 0; width: 5px; height: 19px; cursor: ne-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-sw { bottom: 0; left: 0; width: 5px; height: 5px; cursor: sw-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-s { bottom: 0; left: 0; width: 100%; height: 5px; cursor: s-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } .clearlooks2 .resizable .resize-se { bottom: 0; right: 0; width: 5px; height: 5px; cursor: se-resize; background-image: url('../pages/fm/css/../img/clearlooks2/transparent.gif'); } #folders .special li a.history { background: url(../plugins/History/css/../img/clock.png) no-repeat; } #folders .special li a.favorites { background: url(../plugins/Favorites/css/../img/favorites.png) no-repeat; } plugins/filemanager/css/_cache/fm_index_css.css000066600000002162150472426320015656 0ustar00/* Menu */ .menu { margin: 0; padding: 0; position: absolute; border: 1px solid #d4d0c8; background: #EAE9E5; z-index: 1000; width: 100px; } .menu a { display: block; color: #000; text-decoration: none; padding: 3px; text-align: left; overflow:auto; /* FF */ } .menu a:hover { background-color: #dbecf3 } .menu .submenu { background: url(../pages/fm/css/../img/menu_arrow.gif) no-repeat center right } .menu .active { background: #dbecf3 url(../pages/fm/css/../img/menu_arrow.gif) no-repeat center right } .menu .active a:hover { background-color: transparent } .menu .separator { border-top: 1px solid gray; height: 1px; overflow: hidden } .menu .separator a { display: none } .menu .disabled a { cursor: default; color: #aaa } /* Menu icons */ .menu a { } .menu .add a { background-position: 0 -60px } .menu .delete a { background-position: 0 -80px } .menu .copy a { background-position: 0 0 } .menu .cut a { background-position: 0 -20px } .menu .paste a { background-position: 0 -40px } .menu .moveup a { background-position: 0 -100px } .menu .movedown a { background-position: 0 -120px } plugins/filemanager/css/_cache/fm_core_css.gz000066600000012673150472426320015337 0ustar00=ێJr3_рpcPhFĻ hMɐH=wIQхUu"}~}+чۻ(Kzu=t{Mh9xE 4/#W7;\nl#Qd%Y|ALpmID$QʫHt\Md-Cդ\~q4꿲OD$H#]bؼ*Fh2)p%mn` dJ29%$~?ZoZeDJF8-0%\zh{,&yk[l(y VR]mاl e<9%,LӤk s3tHz:gL Cj)kMӏodO]RxW-^t0QFJjk-Ծwa<ǥQ&4)#˒̀ō*YUkB9<ͨm0|*)ϒ1 QЮ׼uF+svE@$ౚ{2QIIXV%gj _3hhو#}:1*xwVN}]%/,xQ{%)8 #_YJISY#H%v⚋S,];'{uᾬwT V4S*:]0.weDbnzQyn2aJL5VmJ /-G`eqBX֛qmL].#sssCaNt?`0(>T(-TߕkӞ[r̭aM\l&Jҽg^qJ jK@{XjEcX@{Bs+"qLݵv|r9WȉT {|j]Ԁp a9\ ,4"/ 8c%o#ضATTK>^1yIF{Yzj[x^0z;oWy$ꉗpZl,VH\k]Zo^Bݑdk,\&9yUhs3di/ځJt! \T>SlW\bXiLrp;"T&;_S>`vԌRdquCtï(9w@eOQK0]1EB}me +pRc v|l&sq f*}g_H-&4Q~ ! 9%q)NƲgd+I@ |q7F1O\>;d!N[,N{9IbXdZmnsȤ j:GRYM,|CZD^֡7Oy?fu*oy*NvtMG*yq)SGT \}1KbEP` w*41l[bA(garA$揄L_N'6(6= ?$GqaLhiqoPLg%/1}oXG[>WbUjjL͒63Q" $Q<.1Y)ԉ jjTLӷx4~ו E*Dv-{FeP4blڪ@t†wϿL>Où*=QҟYݧE792v[T߲*۱z`N̰TA5;/ыo ~lبxM q-}s'RjbXje[Ʈ- Z)w kTm5 O5l&}⤴gaF99q.H)נH~ڧn2w0ѧO:ȢoD(>Um9[;hN|_3vNCK oc}j<~coҦx#U|u^4E5S-Ug&x65W_m0N6[ձ+,x1|#/0M2Cp,Wo펼ՠvVH(u&'LcQ鄘 d*Dh2ykװ`~Lt c}DLknLΥb.ޗz%A9Q8Sa/#/T\ ^J}-Zw5IRr-zhBRk]_HbS;@u=Dބ\leۧjiΐ\vPVŽEYnQo.VV"=ۆCW"(Q@w44|@PchWS$0v85Q@v5@v+Xk)k#WʆWpwuȅ?Z}#v:lFGLE݆`bat\t1Sv&GEؠnT=F#bN=1顙ow,JAfl6Vm!֭nflB,l^Cly٪ ES~Xٱ\A.Y9+Qq2˻`[Sxqwn*G  ņ*Xm+[ͿQX@0V51 PW0]!2'𔰷@sbG}9R%1W[(^"?ZZLQ Ql@#U"a@?qt9D ÀHwp_NI6|),r^--q VĿ՛o`j[trpnid.رo0=RGۖ)7Vɽ}~ 9p52Ҽ. i?g9-aNZ!]q{EFDUlMGU]e mdֶ@ =_ɟrj$ubʟ?{u@AÖ>ѿqv>7LtЋ.I>pe$< u OSb9_p[<5GEg4[4wF^fRcߙc#44!d+<4՗n*!sM}uh@RRmW1Kso᳧Фg~K0n=EўA@ט8=Ԑ- 19@xeg9<2ɷ2(=pM+b}3fд(=3%=CO U-?eg$c˜զ%^qb ;I n +J;r,m'hԹ 3 j<+8v:yW =Q0i~ "꧃tx$2HggIggv;VbK2T`,e|dzYRg}*z7!MOZչLQVZg߀ECh<89@Ůd뀠YR.lkPbz.A˫ ƆhM&sP=y0 _Nv63HfElx;xp\*/34ʆU=Y!bp46LmOB}exX`IeqS-k6lYZn3TəaC2iaDog_{_"M$+2M;MүUM0GPNLj9M >b $Tij>Sg1 )qyn C;šL譻d׎e5 [@ckw唕Lrd ̠!T[U) O$;;C-gVfjGrLR?Ss]8s[y}j_LIҠ 6{ttI/|nM2IՏfݧ!t?Dqtplugins/filemanager/css/index.php000066600000003443150472426320013124 0ustar00dispatchEvent("onPreInit", array($type)); $mcConfig = $man->getConfig(); $compressor = new Moxiecode_CSSCompressor(array( 'expires_offset' => 3600 * 24 * 10, 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => false, 'charset' => 'UTF-8', 'name' => $theme . "_" . $package, 'convert_urls' => true )); $resources = new Moxiecode_ClientResources(); // Load theme resources $resources->load('../pages/' . $theme . '/resources.xml'); // Load plugin resources $plugins = explode(',', $mcConfig["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); $files = $resources->getFiles($package); if ($resources->isDebugEnabled() || checkBool($mcConfig["general.debug"])) { header('Content-type: text/css'); $pagePath = dirname($_SERVER['SCRIPT_NAME']); echo "/* Debug enabled, css files will be loaded without compression */\n"; foreach ($files as $file) echo '@import url("' . $pagePath . '/' . $file->getPath() . '");' . "\n"; } else { foreach ($files as $file) $compressor->addFile($file->getPath(), $file->isRemoveWhiteSpaceEnabled()); $compressor->compress($package); } ?>plugins/filemanager/editor_plugin.js000066600000033373150472426320013723 0ustar00/** * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ * * @author Moxiecode * @copyright Copyright © 2004-2007, Moxiecode Systems AB, All rights reserved. */ // updated by ctepeo // me@ctepeo.net // replace path function str_replace(haystack, needle, replacement) { var temp = haystack.split(needle); return temp.join(replacement); } (function() { window.mcFileManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'file' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; i{$name}'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinymce.DOM.encode(v); } } )); } } }, v)); }); }, getInfo : function() { return mcFileManagerPlugin.getInfo(); }, createControl: function(n, cm) { var t = this, c, ed = t.editor, v; switch (n) { case 'insertfile': v = ed.getParam('filemanager_insert_template'); if (v instanceof Array) { c = cm.createMenuButton('insertfile', { title : 'Загрузка и добавление файлов', image : t.url + '/pages/fm/img/insertfile.gif', icons : false }); c.onRenderMenu.add(function(c, m) { tinymce.each(v, function(v) { m.add({title : v.title, onclick : function() { ed.execCommand('mceInsertFile', false, v); }}); }); }); } else { c = cm.createButton('insertfile', { title : 'Загрузка и добавление файлов', image : t.url + '/pages/fm/img/insertfile.gif', onclick : function() { ed.execCommand('mceInsertFile', false, {template : v}); } }); } return c; } return null; } }); tinymce.PluginManager.add('filemanager', tinymce.plugins.FileManagerPlugin); tinymce.ScriptLoader.load((tinymce.PluginManager.urls['filemanager'] || tinymce.baseURL + '/plugins/filemanager') + '/language/index.php?type=fm&format=tinymce_3_x&group=tinymce&prefix=filemanager_'); } // Setup TinyMCE 2.x plugin if (window.TinyMCE_Engine) { var TinyMCE_FileManagerPlugin = { setup : function() { var b = (window.realTinyMCE || tinyMCE).baseURL; mcFileManager.baseURL = b + '/plugins/filemanager/js'; document.write(''); }, initInstance : function(ed) { ed.settings.file_browser_callback = 'mcFileManager.filebrowserCallBack'; mcFileManager.settings.handle = tinyMCE.getParam('filemanager_handle', mcFileManager.settings.handle); }, getControlHTML : function(cn) { switch (cn) { case "insertfile": return tinyMCE.getButtonHTML(cn, 'Загрузка и добавление файлов', '{$pluginurl}/pages/fm/img/insertfile.gif', 'mceInsertFile', false); } return ""; }, getInfo : function() { return mcFileManagerPlugin.getInfo(); }, execCommand : function(id, el, cmd, ui, v) { var ed = tinyMCE.getInstanceById(id); alert(cmd); if (cmd == 'mceInsertFile') { mcFileManager.browse(tinyMCE.extend({ path : tinyMCE.getParam("filemanager_path"), rootpath : tinyMCE.getParam("filemanager_rootpath"), remember_last_path : tinyMCE.getParam("filemanager_remember_last_path"), custom_data : tinyMCE.getParam("filemanager_custom_data"), insert_filter : tinyMCE.getParam("filemanager_insert_filter"), oninsert : function(o) { var u, nl, i; if (!ed.selection.isCollapsed()) { ed.execCommand("createlink", false, "javascript:mce_temp_url();"); nl = tinyMCE.selectElements(ed.getBody(), 'A', function(n) { return tinyMCE.getAttrib(n, 'href') == "javascript:mce_temp_url();"; }); for (i = 0; i < nl.length; i++) { u = mcFileManagerPlugin.convertURL(o.focusedFile.url); nl[i].href = u; nl[i].setAttribute('mce_href', u); } } else { ed.execCommand('mceInsertContent', false, mcFileManagerPlugin.replace( tinyMCE.getParam('filemanager_insert_template', '{$name}'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinyMCE.xmlEncode(v); } } )); } } }, v)); return true; } return false; } }; TinyMCE_FileManagerPlugin.setup(); tinyMCE.addPlugin('filemanager', TinyMCE_FileManagerPlugin); } })(); plugins/filemanager/plugins/_Template/Template.php000066600000016102150472426320016367 0ustar00getConfig(); // Override option $config['somegroup.someoption'] = true; return true; } /** * Gets called before a file action occurs for example before a rename or copy. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param BaseFile $file1 File object 1 for example from in a copy operation. * @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeFileAction(&$man, $action, $file1, $file2) { return true; } /** * Gets called after a file action was perforem for example after a rename or copy. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param int $action File action constant for example DELETE_ACTION. * @param BaseFile $file1 File object 1 for example from in a copy operation. * @param BaseFile $file2 File object 2 for example to in a copy operation. Might be null in for example a delete. * @return bool true/false if the execution of the event chain should continue. */ function onFileAction(&$man, $action, $file1, $file2) { return true; } /** * Gets called before a RPC command is handled. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeRPC(&$man, $cmd, $input) { return null; } /** * Gets executed when a RPC command is to be executed. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { return null; } /** * Gets called before data is streamed to client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeStream(&$man, $cmd, $input) { return true; } /** * Gets called when data is streamed to client. This method should setup * HTTP headers, content type etc and simply send out the binary data to the client and the return false * ones that is done. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onStream(&$man, $cmd, $input) { return true; } /** * Gets called after data was streamed to client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Stream command that is to was performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onAfterStream(&$man, $cmd, $input) { return true; } /** * Gets called before data is streamed/uploaded from client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onBeforeUpload(&$man, $cmd, $input) { return true; } /** * Gets called when data is streamed/uploaded from client. This method should take care of * any uploaded files and move them to the correct location. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return object Result object data or null if the event wasn't handled. */ function onUpload(&$man, $cmd, $input) { return null; } /** * Gets called before data is streamed/uploaded from client. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param string $cmd Upload command that is to was performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onAfterUpload(&$man, $cmd, $input) { return true; } /** * Gets called when custom data is to be added for a file custom data can for example be * plugin specific name value items that should get added into a file listning. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param BaseFile $file File reference to add custom info/data to. * @param string $type Where is the info needed for example list or info. * @param Array $custom Name/Value array to add custom items to. * @return bool true/false if the execution of the event chain should continue. */ function onCustomInfo(&$man, &$file, $type, &$custom) { return true; } /** * Gets called when the user selects a file and inserts it into TinyMCE or a form or similar. * * @param ManagerEngine $man ManagerEngine reference that the plugin is assigned to. * @param BaseFile $file Implementation of the BaseFile class that was inserted/returned to external system. * @return bool true/false if the execution of the event chain should continue. */ function onInsertFile(&$man, &$file) { return true; } } // Add plugin to ManagerEngine $man->registerPlugin("template", new Moxiecode_TemplatePlugin()); ?>plugins/filemanager/plugins/Favorites/resources.xml000066600000000417150472426320016671 0ustar00 plugins/filemanager/plugins/Favorites/css/favorites.css000066600000000126150472426320017436 0ustar00#folders .special li a.favorites { background: url(../img/favorites.png) no-repeat; } plugins/filemanager/plugins/Favorites/js/favorites.js000066600000003115150472426320017107 0ustar00(function($){ var man = window.FileManager || window.ImageManager, type = window.FileManager ? 'fm' : 'im'; man.addSpecialFolder({title : '{#favorites.special_folder_title}', path : 'favorite:///', type : 'favorites'}); // Add menu items to context menu $().bind('DropMenu:beforeshow', function(e, m) { if (man.path.indexOf('://') == -1) { m.addSeparator(); m.add({title : $.translate('{#favorites.addfavorites}'), disabled : man.isDisabled('addfavorites') || !man.selectedFiles.length, onclick : addFavorites}); } if (man.path.indexOf('favorite://') != -1) { m.addSeparator(); m.add({title : $.translate('{#favorites.removefavorites}'), disabled : man.isDisabled('removefavorites') || !man.selectedFiles.length, onclick : removeFavorites}); } }); $().bind('filelist:changed', function() { if (man.path.indexOf('favorite://') != -1) { $(man.tools).each(function(i, v) { man.setDisabled(v, 1); }); } }); function addFavorites() { var args = {}; $(man.selectedFiles).each(function(i, f) { args['path' + i] = f.path; }); RPC.exec(type + '.addFavorites', args, function(data) { RPC.handleError({message : '{#error.addfavorites_failed}', visual_path : args.visual_path, response : data}); }); }; function removeFavorites() { var args = {}; $(man.selectedFiles).each(function(i, f) { args['path' + i] = f.path; }); RPC.exec(type + '.removeFavorites', args, function(data) { if (!RPC.handleError({message : '{#error.removefavorites_failed}', visual_path : args.visual_path, response : data})) man.listFiles(); }); }; })(jQuery); plugins/filemanager/plugins/Favorites/Favorites.php000066600000014455150472426320016617 0ustar00registerFileSystem('favorite', 'FavoriteFile'); return true; } function onRPC(&$man, $cmd, $input) { if ($cmd == "addFavorites") return $this->_addFavorites($man, $input); if ($cmd == "removeFavorites") return $this->_removeFavorites($man, $input); return null; } function _removeFavorites(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input['path' . $i]); $i++) { $status = $this->removeFavorite($man, $input["path". $i]); if ($status) $result->add("OK", $man->encryptPath($input["path". $i]), "Path was removed."); else $result->add("FAILED", $man->encryptPath($input["path". $i]), "Path was not removed."); } return $result->toArray(); } function _addFavorites(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input['path' . $i]); $i++) { $status = $this->addFavorite($man, $input["path". $i]); if ($status) $result->add("OK", $man->encryptPath($input["path". $i]), "Path was added."); else $result->add("FAILED", $man->encryptPath($input["path". $i]), "Path was not added."); } return $result->toArray(); } function addFavorite(&$man, $path) { $config = $man->getConfig(); $maxfavorites = isset($config["favorites.max"]) ? $config["favorites.max"] : $this->_maxfavorites; $type = $man->getType(); $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); if (count($patharray) > 0) { for($i=0;$i $maxfavorites) array_pop($patharray); } else $patharray[] = $path; $cookievalue = implode(",", $patharray); $this->setCookieData($type, $cookievalue); return true; } function getCookieData($type) { if ($this->_cookieData) return $this->_cookieData; if (isset($_COOKIE["MCManagerFavoriteCookie_". $type])) return $_COOKIE["MCManagerFavoriteCookie_". $type]; else return ""; } function setCookieData($type, $val) { $this->_cookieData = $val; setcookie("MCManagerFavoriteCookie_". $type, $val, time()+(3600*24*30)); // 30 days } function clearFavorites(&$man) { setcookie ("MCManagerFavoriteCookie_". $man->getType(), "", time() - 3600); // 1 hour ago return true; } function removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$isetCookieData($type, $cookievalue); return true; } } class FavoriteFile extends Moxiecode_BaseFileImpl { function FavoriteFile(&$manager, $absolute_path, $child_name = "", $type = MC_IS_FILE) { $absolute_path = str_replace('favorite://', '', $absolute_path); Moxiecode_BaseFileImpl::Moxiecode_BaseFileImpl($manager, $absolute_path, $child_name, $type); } function canRead() { return true; } function canWrite() { return false; } function exists() { return true; } function isDirectory() { return true; } function isFile() { return false; } function getParent() { return null; } function getParentFile() { return null; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new DummyFileFilter()); return $files; } /** * Returns an array of MCE_File instances based on the specified filter instance. * * @param MCE_FileFilter &$filter MCE_FileFilter instance to filter files by. * @return Array array of MCE_File instances based on the specified filter instance. */ function listFilesFiltered(&$filter) { $files = array(); $man = $this->_manager; $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); if (IndexOf($cookievalue, ",") != -1) $patharray = split(",", $cookievalue); else if ($cookievalue != "") $patharray[] = $cookievalue; foreach ($patharray as $path) { if (!$man->verifyPath($path)) continue; $file = $man->getFile($path); if (!$file->exists()) { $this->_removeFavorite($man, $path); continue; } if ($man->verifyFile($file) < 0) continue; if ($filter->accept($file) == BASIC_FILEFILTER_ACCEPTED) $files[] = $file; } return $files; } function _getCookieData($type) { if (isset($_COOKIE["MCManagerFavoriteCookie_". $type])) return $_COOKIE["MCManagerFavoriteCookie_". $type]; else return ""; } function _removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$i_setCookieData($type, $cookievalue); return true; } function _setCookieData($type, $val) { setcookie("MCManagerFavoriteCookie_". $type, $val, time() + (3600 * 24 * 30)); // 30 days } } // Add plugin to MCManager $man->registerPlugin("favorites", new Moxiecode_FavoritesPlugin()); ?>plugins/filemanager/plugins/Favorites/img/favorites.png000066600000001077150472426320017424 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxڤkQwhfBV[m*P\I1J7] "[?K|i1ږILj2$ۊHRj8}BJnu#_3uw#sKܷaʏ'}>D(pw=zZCT%Lu[x6uB#TGB)Ag*09 W3pyAl%hI],gD M'?Ыz`{Iӧ`pY-E*?X\kP)L_PzpQ$ JCf9[UKt];ໃ|(oXR:o5վ[:$ĔoZ>-suy+,T(~1xmg)[lCLGg=ZȻM1MKX ^.PگtNDb:v?.kbvi7!nSȢ6ubIENDB`plugins/filemanager/plugins/Trash/css/trash.css000066600000000115150472426320015672 0ustar00#folders .special li a.trash { background:url(../img/trash.png) no-repeat; } plugins/filemanager/plugins/Trash/img/trash_empty.png000066600000001217150472426320017074 0ustar00PNG  IHDRabKGDC pHYs B(xtIME*/3?IDAT8˥Ka?25E\3Эb")v/ ݪݲC CaD$ 2p-1e}y:[aK0;_3@ngU96tIvth}|bLxhÏXY㸸u,fzK}7GAHfDEDQ!\Y*:af厉=ծSV3Xhm1Zc!I :6c aГnoYߘW,%skYXfkv^S,ec#EK}zN~E[-_#p܈L!8|( il PN@-$I2W45@`!½?נrk((\w"4oj(`Z51%ϏuXC"f/@Z~{Fd1Blf=im;kD"h- Nc`% ٥ qIzdv IENDB`plugins/filemanager/plugins/Trash/img/trash.png000066600000001422150472426320015654 0ustar00PNG  IHDRabKGDNPMzQN pHYs B(xtIME*SIDAT8˕Mh\e޹301&%L'4B]%[WRIPPpcͦ!] .. *AHARh$qb# :NzsgtcOA gwއzّ9Nq7iX971{n.?x-tFsӣa&lYjꙻ6Oҍ!jܿ@)~tM7~R{/Nu6~ZKA築BR7nNX5X`? [7GG<+Ah G1FVUrx@<Պ>{nѫV@dE_#IENDB`plugins/filemanager/plugins/History/resources.xml000066600000000411150472426320016362 0ustar00 plugins/filemanager/plugins/History/History.php000066600000010740150472426320016006 0ustar00registerFileSystem('history', 'Moxiecode_HistoryFile'); return true; } function onInsertFile(&$man, $file) { $path = $file->getAbsolutePath(); $type = $man->getType(); $maxhistory = isset($config["history.max"]) ? $config["history.max"] : $this->_maxhistory; $cookievalue = $this->getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); if (count($patharray) > 0) { for($i=0;$i $maxhistory) array_pop($patharray); } else $patharray[] = $path; $cookievalue = implode(",", $patharray); $this->setCookieData($type, $cookievalue); return true; } function getCookieData($type) { if (isset($_COOKIE["MCManagerHistoryCookie_". $type])) return $_COOKIE["MCManagerHistoryCookie_". $type]; else return ""; } function setCookieData($type, $val) { setcookie("MCManagerHistoryCookie_". $type, $val, time()+(3600*24*30)); // 30 days } function onClearHistory(&$man) { setcookie ("MCManagerHistoryCookie_". $man->getType(), "", time() - 3600); // 1 hour ago return true; } } class Moxiecode_HistoryFile extends Moxiecode_BaseFileImpl { function Moxiecode_HistoryFile(&$manager, $absolute_path, $child_name = "", $type = MC_IS_FILE) { $absolute_path = str_replace('favorite://', '', $absolute_path); Moxiecode_BaseFileImpl::Moxiecode_BaseFileImpl($manager, $absolute_path, $child_name, $type); } function canRead() { return true; } function canWrite() { return false; } function exists() { return true; } function isDirectory() { return true; } function isFile() { return false; } function getParent() { return null; } function getParentFile() { return null; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Returns an array of MCE_File instances based on the specified filter instance. * * @param MCE_FileFilter &$filter MCE_FileFilter instance to filter files by. * @return Array array of MCE_File instances based on the specified filter instance. */ function listFilesFiltered(&$filter) { $files = array(); $man = $this->_manager; $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); if (IndexOf($cookievalue, ",") != -1) $patharray = split(",", $cookievalue); else if ($cookievalue != "") $patharray[] = $cookievalue; foreach ($patharray as $path) { if (!$man->verifyPath($path)) continue; $file = $man->getFile($path); if (!$file->exists()) { $this->_removeFavorite($man, $path); continue; } if ($man->verifyFile($file) < 0) continue; if ($filter->accept($file) == BASIC_FILEFILTER_ACCEPTED) $files[] = $file; } return $files; } function _getCookieData($type) { if (isset($_COOKIE["MCManagerHistoryCookie_". $type])) return $_COOKIE["MCManagerHistoryCookie_". $type]; else return ""; } function _removeFavorite(&$man, $path=array()) { $type = $man->getType(); $cookievalue = $this->_getCookieData($type); $patharray = array(); $patharray = split(",", $cookievalue); $break = false; if (count($patharray) > 0) { for($i=0;$i_setCookieData($type, $cookievalue); return true; } function _setCookieData($type, $val) { setcookie("MCManagerHistoryCookie_". $type, $val, time()+(3600*24*30)); // 30 days } } // Add plugin to MCManager $man->registerPlugin("history", new Moxiecode_HistoryPlugin()); ?>plugins/filemanager/plugins/History/css/history.css000066600000000120150472426320016626 0ustar00#folders .special li a.history { background: url(../img/clock.png) no-repeat; } plugins/filemanager/plugins/History/js/history.js000066600000000706150472426320016310 0ustar00(function($){ var man = window.FileManager || window.ImageManager; man.addSpecialFolder({title : '{#history.special_folder_title}', path : 'history:///', type : 'history'}); $().bind('filelist:changed', function() { if (man.path.indexOf('history://') != -1) { $(man.tools).each(function(i, v) { man.setDisabled(v, 1); }); $(['insert', 'download', 'view']).each(function(i, v) { man.setDisabled(v, 0); }); } }); })(jQuery); plugins/filemanager/plugins/History/img/clock.png000066600000001562150472426320016213 0ustar00PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8]kHSq}}( EAAЇnAXVdYդtvl6׌t7 M}پ 7EF܏&MszJf-KS0\u I!}ًf>Ʌ]zd&."^õJ,.4 2I3(PdEى zG˅מ=M'QH;ePQxt5/ހG0/ vT\}`gDhc8 /jRTp ex+JP/)T;ƥ0o8ާx^+e/<6iFہ ~G [app@NyY&^tRE]"taC T%}N+BŨyY&^xrk᪾6W݇$+Ϊ U0L`#ZyÙZ} $man, "basepath" => $basepath, "json" => $json, "input" => $input, "cmd" => $cmd, "cwd" => getcwd(), "MCErrorHandler" => $MCErrorHandler ); // Bootstap drupal @session_destroy(); chdir($basepath . "../../../../../../../../"); require_once("includes/bootstrap.inc"); require_once("includes/common.inc"); // Setup session level drupal_bootstrap(DRUPAL_BOOTSTRAP_SESSION); $isDrupalAuth = false; if (!isset($_SESSION['mc_drupal_auth']) || !$_SESSION['mc_drupal_auth']) { // Not cached in session check agains API drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL); $isDrupalAuth = user_access('access tinymce'); $_SESSION['mc_drupal_auth'] = $isDrupalAuth; } else $isDrupalAuth = $_SESSION['mc_drupal_auth']; // Restore everything chdir($access_check['cwd']); $MCErrorHandler = $access_check['MCErrorHandler']; $man = $access_check['manager']; $json = $access_check['json']; $cmd = $access_check['cmd']; $input = $access_check['input']; $basepath = $access_check['basepath']; /** * This class is a Drupal CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class Moxiecode_DrupalAuthenticator extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Main constructor. */ function Moxiecode_DrupalAuthenticator() { } function onAuthenticate(&$man) { global $isDrupalAuth; global $user; $config =& $man->getConfig(); // If authenticated then if ($isDrupalAuth && isset($user)) { foreach ($config as $key => $value) { if (is_string($value)) { $value = str_replace('${user}', $user->uid, $value); $config[$key] = $value; } } // Get rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); // Create rootpath if (!file_exists($rootPath)) mkdir($rootPath); } return $isDrupalAuth; } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("DrupalAuthenticator", new Moxiecode_DrupalAuthenticator()); ?>plugins/filemanager/plugins/CustomInfoExample/CustomInfoExample.php000066600000004240150472426320021706 0ustar00getName()); // Will be used as title/alt in TinyMCE link/image dialogs $input['description'] = $file->getName() . " (" . $this->_getSizeStr($file->getLength()) . ")"; break; // When the file is displayed in a more info dialog case "info": //$input['mycustomfield'] = strtoupper($file->getName()); break; // When the file is listed case "list": //$input['mycustomfield'] = strtoupper($file->getName()); break; } // Chain to next return true; } /** * Returns a filesize as a nice truncated string like "10.3 MB". * * @param int $size File size to convert. * @return String Nice truncated string of the file size. */ function _getSizeStr($size) { // MB if ($size > 1048576) return round($size / 1048576, 1) . "MB"; // KB if ($size > 1024) return round($size / 1024, 1) . "KB"; return trim($size) . "b"; } } // Add plugin to MCManager $man->registerPlugin("custominfoexample", new Moxiecode_CustomInfoExample()); ?>plugins/filemanager/plugins/PHPNukeAuthenticator/PHPNukeAuthenticator.php000066600000001525150472426320022717 0ustar00registerPlugin("PHPNukeAuthenticator", new Moxiecode_PHPNukeAuthenticator()); ?>plugins/filemanager/plugins/MamboAuthenticator/MamboAuthenticatorImpl.php000066600000003464150472426320023107 0ustar00initSession(); $mamboUser =& $mainframe->getUser(); chdir("mambots/editors/mosce/jscripts/tiny_mce/plugins/imagemanager/"); /** * This class is a Mambo CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class MamboAuthenticatorImpl extends BaseAuthenticator { /**#@+ * @access public */ var $_config; /** * Main constructor. */ function MamboAuthenticatorImpl() { } /** * Initializes the authenicator. * * @param Array $config Name/Value collection of config items. */ function init(&$config) { $this->_config =& $config; } /** * Returns a array with group names that the user is bound to. * * @return Array with group names that the user is bound to. */ function getGroups() { return ""; } /** * Returns true/false if the user is logged in or not. * * @return bool true/false if the user is logged in or not. */ function isLoggedin() { global $mamboUser; return preg_match($this->_config['authenticator.joomla.valid_users'], $mamboUser->username); } /**#@-*/ } ?>plugins/filemanager/plugins/JoomlaAuthenticator/JoomlaAuthenticator.php000066600000004403150472426320022633 0ustar00initSession(); $mamboUser = $mainframe->getUser(); // Try that if ($mamboUser->id == 0) { session_name(md5($mosConfig_live_site)); session_start(); $mamboUser = new mosUser($database); $mamboUser->id = intval(mosGetParam($_SESSION, 'session_user_id', '')); $mamboUser->username = strval(mosGetParam($_SESSION, 'session_username', '')); $mamboUser->usertype = strval(mosGetParam($_SESSION, 'session_usertype', '')); } chdir($mcOldCWD); /** * This class is a Drupal CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class Moxiecode_JoomlaAuthenticator extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Main constructor. */ function Moxiecode_JoomlaAuthenticator() { } function onAuthenticate(&$man) { global $mamboUser; $config =& $man->getConfig(); // Not logged in if ($mamboUser->id == 0) return false; // Replace ${user} in all config values foreach ($config as $key => $value) { // Skip replaceing {$user} in true/false stuff if ($value === true || $value === false) continue; $value = str_replace('${user}', $mamboUser->username, $value); $config[$key] = $value; } // Try create rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); $rootPathItems = explode(';', $rootPath); $rootPathItems = explode('=', $rootPathItems[0]); if (count($rootPathItems) > 1) $rootPath = $rootPathItems[1]; else $rootPath = $rootPathItems[0]; if (!file_exists($rootPath)) @mkdir($rootPath); // Is one of the valid user names return preg_match($config['JoomlaAuthenticator.valid_users'], $mamboUser->username); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("JoomlaAuthenticator", new Moxiecode_JoomlaAuthenticator()); ?>plugins/filemanager/plugins/JoomlaAuthenticator/JoomlaAuthenticator_1_5_8.php000066600000004747150472426320023541 0ustar00 $value) { if ($key != 'GLOBALS') Moxiecode_FixGlobals::$_globals[$key] = $value; } } function restore() { foreach (Moxiecode_FixGlobals::$_globals as $key => $value) $GLOBALS[$key] = $value; } } Moxiecode_FixGlobals::store(); // Include Joomla bootstrap logic @session_destroy(); define('mcOldCWD', getcwd()); chdir($basepath . "../../../../../../../../administrator"); define('_JEXEC', 1); define('JPATH_BASE', getcwd()); define('DS', DIRECTORY_SEPARATOR); require_once(JPATH_BASE .DS.'includes'.DS.'defines.php'); require_once(JPATH_BASE .DS.'includes'.DS.'framework.php'); $mainframe =& JFactory::getApplication('administrator'); $mainframe->initialise(array( 'language' => $mainframe->getUserState( "application.lang", 'lang' ) )); $mamboUser = $mainframe->getUser(); chdir(mcOldCWD); Moxiecode_FixGlobals::restore(); /** * This class is a Drupal CMS authenticator implementation. * * @package MCImageManager.Authenticators */ class Moxiecode_JoomlaAuthenticator extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Main constructor. */ function Moxiecode_JoomlaAuthenticator() { } function onAuthenticate(&$man) { global $mamboUser; $config =& $man->getConfig(); // Not logged in if ($mamboUser->id == 0) return false; // Replace ${user} in all config values foreach ($config as $key => $value) { // Skip replaceing {$user} in true/false stuff if ($value === true || $value === false) continue; $value = str_replace('${user}', $mamboUser->username, $value); $config[$key] = $value; } // Try create rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); $rootPathItems = explode(';', $rootPath); $rootPathItems = explode('=', $rootPathItems[0]); if (count($rootPathItems) > 1) $rootPath = $rootPathItems[1]; else $rootPath = $rootPathItems[0]; if (!file_exists($rootPath)) @mkdir($rootPath); // Is one of the valid user names return preg_match($config['JoomlaAuthenticator.valid_users'], $mamboUser->username); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("JoomlaAuthenticator", new Moxiecode_JoomlaAuthenticator()); ?>plugins/filemanager/plugins/ExternalAuthenticator/ExternalAuthenticator.php000066600000011115150472426320023533 0ustar00getConfig(); session_start(); $authURL = $config['ExternalAuthenticator.external_auth_url']; $secretKey = $config['ExternalAuthenticator.secret_key']; $prefix = isset($config['ExternalAuthenticator.session_prefix']) ? $config['ExternalAuthenticator.session_prefix'] : "mcmanager_"; $useCookie = isset($config['ExternalAuthenticator.use_cookie']) ? $config['ExternalAuthenticator.use_cookie'] == true : true; $dir = basename(dirname($_SERVER["PHP_SELF"])); // Always allow language packs to be loaded if ($dir == "language") { // Override language key if (isset($_SESSION[$prefix . "ExternalAuthenticator_general__language"])) $config["general.language"] = $_SESSION[$prefix . "ExternalAuthenticator_general__language"]; return true; } // Check local session if authenticated if ($dir == "rpc" || $dir == "stream") { if (isset($_SESSION[$prefix . 'ExternalAuthenticator']) && $_SESSION[$prefix . 'ExternalAuthenticator'] == true) { if (!$useCookie || isset($_COOKIE[$prefix . 'enabled']) && $_COOKIE[$prefix . 'enabled'] == md5($secretKey . $_SERVER['REMOTE_ADDR'])) { foreach ($_SESSION as $key => $value) { if (strpos($key, $prefix . "ExternalAuthenticator_") === 0) { $key = str_replace("__", ".", $key); $key = substr($key, strlen($prefix . "ExternalAuthenticator_")); $config[$key] = $value; } } // Try create rootpath $rootPath = $man->toAbsPath($config['filesystem.rootpath']); $rootPathItems = explode(';', $rootPath); $rootPathItems = explode('=', $rootPathItems[0]); if (count($rootPathItems) > 1) $rootPath = $rootPathItems[1]; else $rootPath = $rootPathItems[0]; if (!file_exists($rootPath)) @mkdir($rootPath); // Use rootpath as path if (!$config['filesystem.path'] || !$man->isChildPath($rootPath, $config['filesystem.path'])) $config['filesystem.path'] = $rootPath; return true; } } } if (isset($_POST['key'])) { // Generate data chunk $data = ""; $ignored = array("key"); foreach ($_POST as $key => $value) { if (!in_array($key, $ignored)) $data .= $value; } // Check input if ($_POST['key'] == md5($data . $secretKey)) { // Set authenticated session and cookie $_SESSION[$prefix . 'ExternalAuthenticator'] = true; if ($useCookie) setcookie($prefix . 'enabled', md5($secretKey . $_SERVER['REMOTE_ADDR']), 0, '/'); // Set config parameters foreach ($_POST as $key => $value) { if (!in_array($key, $ignored)) { $_SESSION[$prefix . 'ExternalAuthenticator_' . $key] = $value; $config[$key] = $value; } } return true; } else { sleep(1); // Sleep for bots die("Invalid input make sure that the secret keys match."); } } // Force absolute if (strpos($authURL, "http") !== 0 && strpos($authURL, "/") !== 0) $authURL = "plugins/ExternalAuthenticator/" . $authURL; // Setup return URL $prot = "http"; //$port = ""; if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") $prot = "https"; // Non default port //if ($_SERVER['SERVER_PORT'] != "80" && $_SERVER['SERVER_PORT'] != "443") // $port = ":" . $_SERVER['SERVER_PORT']; // If RPC or stream then return it using config if ($dir == "rpc" || $dir == "stream") { // This part doesn't work yet but isn't really needed. // Make it absolute if (strpos($authURL, "/") === 0) $authURL = $prot . "://" . $_SERVER['HTTP_HOST'] . $authURL; $returnURL = $prot . "://" . $_SERVER['HTTP_HOST'] . dirname(dirname($_SERVER['PHP_SELF'])) . "/index.php?type=" . $man->getType(); $config['authenticator.login_page'] = $authURL . "?return_url=" . urlencode($returnURL); return false; } // Not logged redirect to External backend $returnURL = $prot . "://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . "?type=" . $man->getType(); header('location: ' . $authURL . "?return_url=" . urlencode($returnURL)); die(); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("ExternalAuthenticator", new Moxiecode_ExternalAuthenticator()); ?>plugins/filemanager/plugins/ExternalAuthenticator/auth_example.asp000066600000002261150472426320021670 0ustar00<% @LANGUAGE="VBScript" %> <% Option Explicit %> <% ' Change this secret key so it matches the one in the imagemanager/filemanager config Private Const SECRET_KEY = "someSecretKey" Dim config, data, key, value ' Check if user is logged in here ' If Session("some_session") <> True Then ' Response.Write "You are not logged in." ' Response.End ' End If Set config = Server.CreateObject("Scripting.Dictionary") ' Override config values ' config("filesystem.path") = "c:/Inetpub/wwwroot/somepath" ' config("filesystem.rootpath") = "c:/Inetpub/wwwroot/somepath" ' Generate MD5 of config values data = "" For Each value In config.Items data = data & value Next key = MD5(data & SECRET_KEY) %>
        "> <% For Each key In config.Keys %> " value="<%= Server.HTMLEncode(config(key)) %>" /> <% Next %>
        plugins/filemanager/plugins/ExternalAuthenticator/md5.asp000066600000030135150472426320017702 0ustar00<% ' Derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm, ' as set out in the memo RFC1321. ' ' ' ASP VBScript code for generating an MD5 'digest' or 'signature' of a string. The ' MD5 algorithm is one of the industry standard methods for generating digital ' signatures. It is generically known as a digest, digital signature, one-way ' encryption, hash or checksum algorithm. A common use for MD5 is for password ' encryption as it is one-way in nature, that does not mean that your passwords ' are not free from a dictionary attack. ' ' This is 'free' software with the following restrictions: ' ' You may not redistribute this code as a 'sample' or 'demo'. However, you are free ' to use the source code in your own code, but you may not claim that you created ' the sample code. It is expressly forbidden to sell or profit from this source code ' other than by the knowledge gained or the enhanced value added by your own code. ' ' Use of this software is also done so at your own risk. The code is supplied as ' is without warranty or guarantee of any kind. ' ' Should you wish to commission some derivative work based on this code provided ' here, or any consultancy work, please do not hesitate to contact us. ' ' Web Site: http://www.frez.co.uk ' E-mail: sales@frez.co.uk Private Const BITS_TO_A_BYTE = 8 Private Const BYTES_TO_A_WORD = 4 Private Const BITS_TO_A_WORD = 32 Private m_lOnBits(30) Private m_l2Power(30) m_lOnBits(0) = CLng(1) m_lOnBits(1) = CLng(3) m_lOnBits(2) = CLng(7) m_lOnBits(3) = CLng(15) m_lOnBits(4) = CLng(31) m_lOnBits(5) = CLng(63) m_lOnBits(6) = CLng(127) m_lOnBits(7) = CLng(255) m_lOnBits(8) = CLng(511) m_lOnBits(9) = CLng(1023) m_lOnBits(10) = CLng(2047) m_lOnBits(11) = CLng(4095) m_lOnBits(12) = CLng(8191) m_lOnBits(13) = CLng(16383) m_lOnBits(14) = CLng(32767) m_lOnBits(15) = CLng(65535) m_lOnBits(16) = CLng(131071) m_lOnBits(17) = CLng(262143) m_lOnBits(18) = CLng(524287) m_lOnBits(19) = CLng(1048575) m_lOnBits(20) = CLng(2097151) m_lOnBits(21) = CLng(4194303) m_lOnBits(22) = CLng(8388607) m_lOnBits(23) = CLng(16777215) m_lOnBits(24) = CLng(33554431) m_lOnBits(25) = CLng(67108863) m_lOnBits(26) = CLng(134217727) m_lOnBits(27) = CLng(268435455) m_lOnBits(28) = CLng(536870911) m_lOnBits(29) = CLng(1073741823) m_lOnBits(30) = CLng(2147483647) m_l2Power(0) = CLng(1) m_l2Power(1) = CLng(2) m_l2Power(2) = CLng(4) m_l2Power(3) = CLng(8) m_l2Power(4) = CLng(16) m_l2Power(5) = CLng(32) m_l2Power(6) = CLng(64) m_l2Power(7) = CLng(128) m_l2Power(8) = CLng(256) m_l2Power(9) = CLng(512) m_l2Power(10) = CLng(1024) m_l2Power(11) = CLng(2048) m_l2Power(12) = CLng(4096) m_l2Power(13) = CLng(8192) m_l2Power(14) = CLng(16384) m_l2Power(15) = CLng(32768) m_l2Power(16) = CLng(65536) m_l2Power(17) = CLng(131072) m_l2Power(18) = CLng(262144) m_l2Power(19) = CLng(524288) m_l2Power(20) = CLng(1048576) m_l2Power(21) = CLng(2097152) m_l2Power(22) = CLng(4194304) m_l2Power(23) = CLng(8388608) m_l2Power(24) = CLng(16777216) m_l2Power(25) = CLng(33554432) m_l2Power(26) = CLng(67108864) m_l2Power(27) = CLng(134217728) m_l2Power(28) = CLng(268435456) m_l2Power(29) = CLng(536870912) m_l2Power(30) = CLng(1073741824) Private Function LShift(lValue, iShiftBits) If iShiftBits = 0 Then LShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And 1 Then LShift = &H80000000 Else LShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If If (lValue And m_l2Power(31 - iShiftBits)) Then LShift = ((lValue And m_lOnBits(31 - (iShiftBits + 1))) * m_l2Power(iShiftBits)) Or &H80000000 Else LShift = ((lValue And m_lOnBits(31 - iShiftBits)) * m_l2Power(iShiftBits)) End If End Function Private Function RShift(lValue, iShiftBits) If iShiftBits = 0 Then RShift = lValue Exit Function ElseIf iShiftBits = 31 Then If lValue And &H80000000 Then RShift = 1 Else RShift = 0 End If Exit Function ElseIf iShiftBits < 0 Or iShiftBits > 31 Then Err.Raise 6 End If RShift = (lValue And &H7FFFFFFE) \ m_l2Power(iShiftBits) If (lValue And &H80000000) Then RShift = (RShift Or (&H40000000 \ m_l2Power(iShiftBits - 1))) End If End Function Private Function RotateLeft(lValue, iShiftBits) RotateLeft = LShift(lValue, iShiftBits) Or RShift(lValue, (32 - iShiftBits)) End Function Private Function AddUnsigned(lX, lY) Dim lX4 Dim lY4 Dim lX8 Dim lY8 Dim lResult lX8 = lX And &H80000000 lY8 = lY And &H80000000 lX4 = lX And &H40000000 lY4 = lY And &H40000000 lResult = (lX And &H3FFFFFFF) + (lY And &H3FFFFFFF) If lX4 And lY4 Then lResult = lResult Xor &H80000000 Xor lX8 Xor lY8 ElseIf lX4 Or lY4 Then If lResult And &H40000000 Then lResult = lResult Xor &HC0000000 Xor lX8 Xor lY8 Else lResult = lResult Xor &H40000000 Xor lX8 Xor lY8 End If Else lResult = lResult Xor lX8 Xor lY8 End If AddUnsigned = lResult End Function Private Function F(x, y, z) F = (x And y) Or ((Not x) And z) End Function Private Function G(x, y, z) G = (x And z) Or (y And (Not z)) End Function Private Function H(x, y, z) H = (x Xor y Xor z) End Function Private Function I(x, y, z) I = (y Xor (x Or (Not z))) End Function Private Sub FF(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub GG(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub HH(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Sub II(a, b, c, d, x, s, ac) a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac)) a = RotateLeft(a, s) a = AddUnsigned(a, b) End Sub Private Function ConvertToWordArray(sMessage) Dim lMessageLength Dim lNumberOfWords Dim lWordArray() Dim lBytePosition Dim lByteCount Dim lWordCount Const MODULUS_BITS = 512 Const CONGRUENT_BITS = 448 lMessageLength = Len(sMessage) lNumberOfWords = (((lMessageLength + ((MODULUS_BITS - CONGRUENT_BITS) \ BITS_TO_A_BYTE)) \ (MODULUS_BITS \ BITS_TO_A_BYTE)) + 1) * (MODULUS_BITS \ BITS_TO_A_WORD) ReDim lWordArray(lNumberOfWords - 1) lBytePosition = 0 lByteCount = 0 Do Until lByteCount >= lMessageLength lWordCount = lByteCount \ BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(Asc(Mid(sMessage, lByteCount + 1, 1)), lBytePosition) lByteCount = lByteCount + 1 Loop lWordCount = lByteCount \ BYTES_TO_A_WORD lBytePosition = (lByteCount Mod BYTES_TO_A_WORD) * BITS_TO_A_BYTE lWordArray(lWordCount) = lWordArray(lWordCount) Or LShift(&H80, lBytePosition) lWordArray(lNumberOfWords - 2) = LShift(lMessageLength, 3) lWordArray(lNumberOfWords - 1) = RShift(lMessageLength, 29) ConvertToWordArray = lWordArray End Function Private Function WordToHex(lValue) Dim lByte Dim lCount For lCount = 0 To 3 lByte = RShift(lValue, lCount * BITS_TO_A_BYTE) And m_lOnBits(BITS_TO_A_BYTE - 1) WordToHex = WordToHex & Right("0" & Hex(lByte), 2) Next End Function Public Function MD5(sMessage) Dim x Dim k Dim AA Dim BB Dim CC Dim DD Dim a Dim b Dim c Dim d Const S11 = 7 Const S12 = 12 Const S13 = 17 Const S14 = 22 Const S21 = 5 Const S22 = 9 Const S23 = 14 Const S24 = 20 Const S31 = 4 Const S32 = 11 Const S33 = 16 Const S34 = 23 Const S41 = 6 Const S42 = 10 Const S43 = 15 Const S44 = 21 x = ConvertToWordArray(sMessage) a = &H67452301 b = &HEFCDAB89 c = &H98BADCFE d = &H10325476 For k = 0 To UBound(x) Step 16 AA = a BB = b CC = c DD = d FF a, b, c, d, x(k + 0), S11, &HD76AA478 FF d, a, b, c, x(k + 1), S12, &HE8C7B756 FF c, d, a, b, x(k + 2), S13, &H242070DB FF b, c, d, a, x(k + 3), S14, &HC1BDCEEE FF a, b, c, d, x(k + 4), S11, &HF57C0FAF FF d, a, b, c, x(k + 5), S12, &H4787C62A FF c, d, a, b, x(k + 6), S13, &HA8304613 FF b, c, d, a, x(k + 7), S14, &HFD469501 FF a, b, c, d, x(k + 8), S11, &H698098D8 FF d, a, b, c, x(k + 9), S12, &H8B44F7AF FF c, d, a, b, x(k + 10), S13, &HFFFF5BB1 FF b, c, d, a, x(k + 11), S14, &H895CD7BE FF a, b, c, d, x(k + 12), S11, &H6B901122 FF d, a, b, c, x(k + 13), S12, &HFD987193 FF c, d, a, b, x(k + 14), S13, &HA679438E FF b, c, d, a, x(k + 15), S14, &H49B40821 GG a, b, c, d, x(k + 1), S21, &HF61E2562 GG d, a, b, c, x(k + 6), S22, &HC040B340 GG c, d, a, b, x(k + 11), S23, &H265E5A51 GG b, c, d, a, x(k + 0), S24, &HE9B6C7AA GG a, b, c, d, x(k + 5), S21, &HD62F105D GG d, a, b, c, x(k + 10), S22, &H2441453 GG c, d, a, b, x(k + 15), S23, &HD8A1E681 GG b, c, d, a, x(k + 4), S24, &HE7D3FBC8 GG a, b, c, d, x(k + 9), S21, &H21E1CDE6 GG d, a, b, c, x(k + 14), S22, &HC33707D6 GG c, d, a, b, x(k + 3), S23, &HF4D50D87 GG b, c, d, a, x(k + 8), S24, &H455A14ED GG a, b, c, d, x(k + 13), S21, &HA9E3E905 GG d, a, b, c, x(k + 2), S22, &HFCEFA3F8 GG c, d, a, b, x(k + 7), S23, &H676F02D9 GG b, c, d, a, x(k + 12), S24, &H8D2A4C8A HH a, b, c, d, x(k + 5), S31, &HFFFA3942 HH d, a, b, c, x(k + 8), S32, &H8771F681 HH c, d, a, b, x(k + 11), S33, &H6D9D6122 HH b, c, d, a, x(k + 14), S34, &HFDE5380C HH a, b, c, d, x(k + 1), S31, &HA4BEEA44 HH d, a, b, c, x(k + 4), S32, &H4BDECFA9 HH c, d, a, b, x(k + 7), S33, &HF6BB4B60 HH b, c, d, a, x(k + 10), S34, &HBEBFBC70 HH a, b, c, d, x(k + 13), S31, &H289B7EC6 HH d, a, b, c, x(k + 0), S32, &HEAA127FA HH c, d, a, b, x(k + 3), S33, &HD4EF3085 HH b, c, d, a, x(k + 6), S34, &H4881D05 HH a, b, c, d, x(k + 9), S31, &HD9D4D039 HH d, a, b, c, x(k + 12), S32, &HE6DB99E5 HH c, d, a, b, x(k + 15), S33, &H1FA27CF8 HH b, c, d, a, x(k + 2), S34, &HC4AC5665 II a, b, c, d, x(k + 0), S41, &HF4292244 II d, a, b, c, x(k + 7), S42, &H432AFF97 II c, d, a, b, x(k + 14), S43, &HAB9423A7 II b, c, d, a, x(k + 5), S44, &HFC93A039 II a, b, c, d, x(k + 12), S41, &H655B59C3 II d, a, b, c, x(k + 3), S42, &H8F0CCC92 II c, d, a, b, x(k + 10), S43, &HFFEFF47D II b, c, d, a, x(k + 1), S44, &H85845DD1 II a, b, c, d, x(k + 8), S41, &H6FA87E4F II d, a, b, c, x(k + 15), S42, &HFE2CE6E0 II c, d, a, b, x(k + 6), S43, &HA3014314 II b, c, d, a, x(k + 13), S44, &H4E0811A1 II a, b, c, d, x(k + 4), S41, &HF7537E82 II d, a, b, c, x(k + 11), S42, &HBD3AF235 II c, d, a, b, x(k + 2), S43, &H2AD7D2BB II b, c, d, a, x(k + 9), S44, &HEB86D391 a = AddUnsigned(a, AA) b = AddUnsigned(b, BB) c = AddUnsigned(c, CC) d = AddUnsigned(d, DD) Next MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)) End Function %> plugins/filemanager/plugins/ExternalAuthenticator/auth_example.jsp000066600000004772150472426320021712 0ustar00<%@page import="java.util.*" %> <% String key, secretKey, data = ""; // Change this secret key so it matches the one in the imagemanager/filemanager config secretKey = "someSecretKey"; // Check here if the user is logged in or not /* if (session.getAttribute("some_session") != "somevalue") { out.print("You are not logged in."); return; } */ // Override any config values here Hashtable configuration = new Hashtable(); //configuration.put("filesystem.path", "c:/Inetpub/wwwroot/somepath"); //configuration.put("filesystem.rootpath", "c:/Inetpub/wwwroot/somepath"); // Generates a unique key of the config values with the secret key for (Enumeration e = configuration.keys(); e.hasMoreElements(); ) data += configuration.get(e.nextElement()); key = md5(data + secretKey); %> <%! public String md5(String str) { try { java.security.MessageDigest md5 = java.security.MessageDigest.getInstance("MD5"); char[] charArray = str.toCharArray(); byte[] byteArray = new byte[charArray.length]; for (int i=0; i': buff.append(">"); break; case '"': buff.append("""); break; case '&': buff.append("&"); break; default: buff.append(chr); } } return buff.toString(); } %>
        "> <% for (Enumeration e = configuration.keys(); e.hasMoreElements(); ) { key = (String) e.nextElement(); %> " value="<%= htmlEncode((String) configuration.get(key)) %>" /> <% } %>
        plugins/filemanager/plugins/ExternalAuthenticator/auth_example.php000066600000001732150472426320021676 0ustar00
        $value) { echo ''; } ?>
        plugins/filemanager/plugins/ExternalAuthenticator/auth_drupal.php000066600000002245150472426320021532 0ustar00uid; // Generates a unique key of the config values with the secret key $key = md5(implode('', array_values($config)) . $secretKey); ?>
        $value) { echo ''; } ?>
        plugins/filemanager/plugins/WordpressAuthenticator/WordpressAuthenticator.php000066600000001436150472426320024154 0ustar00registerPlugin("WordpressAuthenticator", new Moxiecode_WordpressAuthenticator()); ?>plugins/filemanager/changelog.txt000066600000053672150472426320013215 0ustar00Version 3.1.0.5 (2009-01-22) Added new custom_query option. To enable you to add custom query parameters to initial page request. Added new docx word icon and mime type item to mime.types. Fixed so that the upload form closes automatically if all files was uploaded correctly. Fixed bug where a request to menu_icons.gif where produced and it produced a 404 web server error. Fixed bug where the item config in the session collection would be overwritten if register_globals where enabled in php.ini. Fixed bug where inserting links would fail the second time if the inlinepopups wasn't used in TinyMCE. Fixed bug where the Flash uploader was sending an incorrect application/x-www-form-urlencoded content type. Fixed bug where the ExternalAuthenticator would add double port numbers. Fixed bug where a multiple path value for the session override of the filesystem.rootpath item would fail. Fixed bug where opening a standalone instance while having TinyMCE on the same page would produce incorrect callback results. Fixed bug where the remove_script_host option wouldn't work correctly. Version 3.1.0.4 (2008-11-27) Fixed bug where the Flash uploader was compiled with debugging on. Fixed bug where downloading of files with spaces didn't work correctly. Fixed bug where it wouldn't load correctly correctly in old TinyMCE 2.x versions. Version 3.1.0.3 (2008-11-20) Fixed bug where inline dialogs wasn't opened correctly when loading the product cross domain. Fixed bug where it was returning incorrect content-encoding headers. Fixed bug where the multiple upload feature didn't work correctly when * was used for the valid extensions settings. Fixed bug where language packs wasn't loading correctly when TinyMCE was compressed using the gzip compressor. Fixed bug where switching from FileManager to ImageManager would fail some times when used with TinyMCE. Version 3.1.0.2 (2008-11-13) Added new possibility to have a custom function for the filemanager_insert_template option. Fixed bug where errors passed back from the server would be ignored by the Google gears implementation. Fixed bug where the file upload progress bar wasn't moving if upload errors occured. Fixed bug where domain relaxing didn't work when TinyMCE and the FileManager was loaded from another domain. Version 3.1.0.1 (2008-11-10) Fixed bug where it wasn't possible to override the preview.wwwroot and preview.urlprefix settings with mc_access files. Fixed bug with notice messages for missing items when using display_errors on. Fixed bug where it wasn't possible to load TinyMCE and the filemanager plugin from another sub domain. Fixed bug where the upload.chunk_size option didn't work correctly. Fixed bug where it was impossible to enable remember_last_path by default. Fixed bug where the onchange event wasn't fired as it was before when form items was changed by a browse call. Fixed bug where the category list and special folders list where separated by an odd margin in IE. Fixed so it's possible to see the current upload runtime when enablig the general.debug option. Version 3.1 (2008-11-06) Fixed bug with using the filemanager on a non default http port. Fixed so all new integration callback functions have a file object. Fixed bug where the toolbar would get a trailing focus rectangle on Gecko. Fixed bug where sorting was incorrect on non Windows operating systems. Fixed bug where single upload didn't work correctly. Fixed bug where the ClientResources class would produce an error due to an invalid regexp. Version 3.1b2 (2008-10-30) Added new file path presentation for edit file dialog. Fixed bug where createdir wasn't reloading the file list ones a directory was created. Fixed bug where it wasn't possible to override general.language using an external authenticator. Fixed bug where keepAlive handler was missing. It will not hit the backend each 5 minutes. Fixed bug where Gecko browsers would produce an traling focus border for toolbar items. Fixed bug where directory path would be on two lines if it was very long. Fixed bug where loading the xml resource files would break on some PHP installations. Fixed bug where add file action wasn't executed when multiple files where uploaded. Fixed bug where it wasn't possible to override path and rootpath settings from TinyMCE init. Fixed bug where rootpath names didn't work when specified in javascript options. Fixed bug where links would be inserted to beginning of editor instances on IE. Fixed bug where singe file uploads wasn't working correctly. Fixed bug where native windows wasn't move to top. Fixed bug where upload with upper case extensions would fail. Replaced upload.replace_diacritics with filesystem.clean_names. To make it more general and also take care of whitespace. Optimized file listing logic by 600%. The sorting was improved by sorting by the file names first and then creating file instances. Version 3.1b1 (2008-10-23) Added new multiple file upload uses Flash, Google Gears and Silverlight. Chunks large files by default. Added new edit file support. Files can now be edited in plain text. Added new edit tool item so the edit function can be enabled/disabled. Added new API for client side plugin logic. You can now add menu items, dialogs and buttons from plugins. Added new resources.xml file for all themes and plugins. These are used to compress and concat js and css files. Added new support for file and directory filtering from page level. Added new upload.replace_diacritics option. Replaces national characters like to aaou. Added new upload.multiple_upload option. Enables you to disable/enable this support. Added new upload.chunk_size option. Enables you to change the chunk size for each request. Added new support for cross sub domain usage by relaxing the document.domain field. Added new edit.include_file_pattern option. Enables you to include only specific files for editing. Added new edit.exclude_file_pattern option. Enables you to exclude specific files for editing. Added new edit.extensions option. Enables you to only include specific files for editing. Added new zip.include_file_pattern option. Enables you to include only specific files for zip compression. Added new zip.exclude_file_pattern option. Enables you to exclude specific files from zip compression. Added new zip.extensions option. Enables you to only include specific files for compression. Added new unzip.include_file_pattern option. Enables you to include only specific files for zip uncompression. Added new unzip.exclude_file_pattern option. Enables you to exclude specific files from zip uncompression. Added new unzip.extensions option. Enables you to only include specific files for uncompression. Added new target_frame option. Enables you to open any part of the FileManager in a custom iframe or frame. Added new browse method to the mcFileManager.js file that replaces the old open method. Added new createDir method to the mcFileManager.js file. Enables you to open the create directory dialog directly from page. Added new createDoc method to the mcFileManager.js file. Enables you to open the create document dialog directly from page. Added new createZip method to the mcFileManager.js file. Enables you to open the create zip dialog directly from page. Added new upload method to the mcFileManager.js file. Enables you to open the upload dialog directly from page. Added new edit method to the mcFileManager.js file. Enables you to open the edit file dialog directly from page. Added new functionality to retrive all the selected files to the page level callback function. Fixed bug where selection of files could be incorrect if shift key was used. Fixed so the mcfilemanager.js file is merged into the editor_plugin.js file to increase gzip compression. Fixed so preview of documents in the createdoc dialog are in inline windows. Fixed so all dialogs adds a shim for the background items. Fixed so the user can't change file extension on files they rename. Fixed so the remember_last_path option is disabled by default. Fixed bug where the buttons in dialogs would look incorrect in FF 3. Fixed bug where paste menu item wasn't disabled if there was no contents in clipboard. Fixed bug where it wouldn't display the input path in error message if it couldn't find a specific filesystem. Optimized the LocalFileImpl class for speed particularly on Windows. Version 3.0.9.2 (2008-09-11) Fixed bug the default insert template didn't respect the TinyMCE url settings. Fixed bug where the an exception would be produced if you used the standalone mode on a page where TinyMCE was included but not loaded. Fixed bug with authenticators producing and error if they was overriding the filesystem.rootpath to a path not within the configured rootpath. Version 3.0.9.1 (2008-07-09) Fixed bug where Firefox 3 would produce an exception about empty id passed to getElementById. Fixed bug where Firefox 3 would produce an exception about window.console being undefined. Fixed bug where the insertfile command didn't work correctly if you didn't specify an template. Version 3.0.9 (2008-07-02) Added new support for adding multiple templates for the insertfile button. Fixed bug where loading the FileManager on demand didn't load the language packs correctly. Fixed so it's not possible to open a hidden directory. It will automatically go to the parent of that dir. Fixed issue where it wouldn't setup an correct baseURL if the script was loaded dynamically. Version 3.0.8 (2008-04-29) Added possibility to load plugins from out side the FileManager path. Fixed bug where the filemanager was producing an dialog on IE if it was loaded over https. Fixed so plugin names are lowercase internally to avoid confusion. Fixed auto detection logic for the API base URL. It will now do this client side to avoid PHP bugs. Fixed bug where using the standalone integration on a page with TinyMCE without any editor instances would produce an error. Fixed so that the custom_data setting gets passed in as a parameter to the initial request for the index.php. Fixed so the SessionAuthenticator is enabled by default since people tend to miss adding any authentication. Version 3.0.7 (2008-03-20) Fixed so the plugin info is displayed correctly in TinyMCE 3.0 about dialog. Fixed bug where cookies could be interpreted as input parameters. Version 3.0.6.1 (2008-02-21) Fixed compatibility issue with the TinyMCE gzip compressor. Fixed bug where the FileManager didn't work if the inlinepopups wasn't used in TinyMCE 3. Version 3.0.6 (2008-02-21) Added support for loading the TinyMCE plugin from an external location. Added support for inlinepopups if used with TinyMCE 3.x. Added detection for proxies that doesn't support non encoded HTTP posts. Added support for ${user} replacement variable for the JoomlaAuthenticator class. Added new insert_filter option enabled you to filter data passed back from FM before it's inserted. Fixed bug where some zip files didn't work correctly. Fixed bug where it was impossible to unselect files. Fixed bug where loading non english language packs for the TinyMCE insertfile icon didn't work. Fixed bug where an empty value for the general.plugins option would produce errors. Fixed so the getSiteRoot will use the script_name instead of document_root. Version 3.0.5 (2007-11-22) Added new filemanager_handle option to the TinyMCE editor plugin. Fixed compatibility with the TinyMCE 3.0b1 API. Fixed security issue thanks to a report from Michel Weimerskirch. Removed all deprecated =& new statements from the PHP code to reduce notices. Version 3.0.4 (2007-11-02) Added new ExternalAuthenticator.session_prefix option to ExternalAuthenticator to separate sessions. Added new ExternalAuthenticator.use_cookie option. This will create a cookie based on the session_prefix. Added new compatibility with TinyMCE 3.x. Fixed so that the external authentication page is runned each time the FileManager opens. Fixed issue where it was impossible to select a file if a user switched from IM to FM but only included one of them in the page. Version 3.0.3 (2007-08-21) Added new external authenticator enables you to authenticate between backend and cross domains. Added new asp and jsp example authentication pages for the external authenticator. Added new non flash upload que since the flash uploader was to buggy. Fixed bug compatibility issues with older TinyMCE gzip compressors like the one in Wordpress. Fixed bug where custom insert callback functions also execured default logic. Fixed bug where create zip failed when using check all link. Fixed some issues with symlinks, they where not resolved when used in JS init calls. Fixed issue with the need to have index.php as the default document. Fixed bug where the mcFileManager.init call didn't work as expected. Fixed so the upload.use_flash is now set to false by default, was not working correctly. Version 3.0.2 (2007-06-20) Added new logging options, enables you to specify level, format, rotation, max size. Added cancel buttons to all dialogs for usability reasons. Added new config_prefix option to the SessionAuthenticator class, enables you to override any config option with a session. Added new valid/invalid/extensions options for previewing of files. For example PDF:s can now be excluded from a preview. Fixed so that all dialogs are closed when a operation is completed successfully. Fixed so the template selection box gets removed if no templates are specified. Fixed so the dialogs will open more nicely, less visual maniplulation. Fixed so URL convertion logic is executed before custom callbacks. Fixed so the element names can be element id's in a mcFileManager.open call. Fixed bug where the filemanager wasn't loading correctly if it was compressed using the TinyMCE Gzip compressor. Fixed some issues with the JoomlaAuthenticator, it now works in a multisite environment. Changed the parent directory icons to be an arrow for usability reasons. Fixed bug where the animation of the fading menus didn't finish correctly some times. Version 3.0.1 (2007-05-21) Added new upload.use_flash option, enables you to disable the flash uploader. Added new use_url_path JS integration option. Added new use path from url functionalty. Fixed problem with error reporting in PHP 5.x+. Fixed bug where the gzip compression failed if the accept encoding headers where missing. Fixed bug with preview.wwwroot not working correctly. Fixed bug with message "path not allowed", some installations use symlinks for their wwwroot. Fixed bug where it was sometimes resolved the URL to the js dir wrong in some PHP installations. Fixed bug where preview didn't work on files with spaces in the file name. Fixed so that the preview isn't enabled when the user clicks on a checkbox in file list. Fixed issue where the remember_last_path feature remembered favorites and history as well. Fixed issues with very old PHP installations that doesn't have file_get_contents. Fixed issue with IE producing warning message if it was loaded over HTTPS. Version 3.0 (2007-05-15) Moved the general.login_page option to authenticator.login_page. Added new _Template plugin, this is a example plugin. Fixed bug in Safari where it was impossible to scroll the file list. Fixed bug where zip files couldn't be inserted or downloaded. Fixed so that downloading is forced by replacing the content type. Fixed so that you can change the default file system impelementation. Added better support for national characters like in filenames. Version 3.0b3 (2007-05-10) Added new CustomInfoExample plugin. Displays how to inject custom file information. Added new include/exclude/extensions config options for stream section. Added better error handling when loading XML language packs. Added missing language items for add file(s) in flash upload dialog. Added fallback JSON RPC method when Apache is configured with mod_security. Added more rapid demo mode response. It only ask the server once. Fixed so upload button is disabled until the user selects a file. Fixed bug where non english language packs where loaded twice. Fixed bug where utf-8 encodings of language packs didn't work correctly. Fixed bug where relative path didn't work for the filesystem.rootpath config option. Fixed so the translation of the page is faster, so it doesn't flicker. Renamed all "directory" to "folder" in the English language pack. Version 3.0b1 (2007-04-13) First beta release of the complete rewrite of the FileManager PHP. Version 1.9 (2006-02-22) Added new download options, enables you to control what files users may download. Added new custom_data jsoption field, this enables you to pass custom data from page to a authenticator. Added new iframe support, openInIframe javascript function. Added new multiple root paths support, this gives the ability to have virtual named root paths. Added new better error handling, this will present a nice error dialog when a fatal error occurs. Added new general.debug option, this is useful if you are developing custom extensions. Added new general.error_log option, this enables you to log any errors that happen to a file. Added new JoomlaAuthenticatorImpl, example config and documentation. Fixed so buttons are better styled with CSS instad of a scripted hover action. Fixed an issue with the logger, a warning was displayed when no logfile was found, removed. Fixed bug where force_directory_template and directory_templates options wasn't sometimes working correctly together. Fixed bug where valid extensions wasn't presented correctly in the upload form. Fixed bug where mc_access files wasn't working correctly under Windows. Fixed bug where filesystem.readable/filesystem.writable wasn't working as exprected. Fixed issues where directory info dialog wasn't updated correctly when some actions where performed. Version 1.8 (2005-11-10) Fixed so the mcfilemanager is a plugin for TinyMCE, makes the installation process easier. Fixed issue with parsing of the XML language packs in latest PHP versions. Fixed so the preview frame gets updated if a user creates a directory/document or uploads a file. Added new DrupalAuthenicatorImpl for integration with Drupal CMS. Added new PHPNukeAuthenicatorImpl for integration with PHPNuke. Added new alert message when filemanager popups is getting blocked by popup blockers. Added new not_loggedin.php file, this can be used to present a error message when the user session was lost. Added German language pack contributed by Markus Vetten. Added French language pack contributed by Olivier Gaillot. VVersion 1.7 (2005-10-26) Fixed an issue with the language pack array merge in general.php. Fixed issue with short_open_tag = "Off", replaced all Nz9ӧEBP ,6Y%+F *Z͓+,Ibqxȿݦ"ߤ2L;p'M7k,:C7\ 7XD+1ݭn!J`;܉8<).mMm|vS ?mxvHׇ12FQ_2-Na,ϣ |v*Bh/Yy #+\Ok\d6KY*ױ7J.*³ce8 Uy":;ύJC=HJ|h#Vs`:2j z޵|`aI-ז| OZ\N!ds1KV3΃`[ˢEHΫKV[<+(*w7 >de2@/IߋޕwM{3oԛM~&! =a\tv^ק'xIbȡEf֐`hJ2{y#]KI Zq>+*`fp0he4 Q'&b6TP]-,hBy#L4q rA3q#ԥH3+C ޽*?yڬ@C`yrUq,"h2ZZlZᡖ @wxXC/?F.Wq΃<LY/pTd[!؄FydLf3}1a 'P]G>?ᮨE60|n¸D?bvݘMZiӍ(-!?)>,7,Bhv 0$u Y~>kV*G dKI_~c`Y(;7g lNc$l~ v X&]aݽ"ޮJ&R@i(r*Zk*Ov.KqD@YkY-`lWP:`-Һ0(9v]c%ZCU7:Ѽ l\Ȓbj1E'eL"YrDx!n(lf5%gPjLmT\+g<?d_(Z2zb>s1Qe7w髟>zɫ~8O?=z㇏aQ{d)Z%N227ł21͕Jp!x$⾢^S-nE1h-#h٫4*Yɓ^FiW~ϯ=zޓcSד@Aw5P\mt|NMkO;I<µh육=ꍙ`3v;\zۗJAh*. [,Z/_\FFlqz,A=AlL1BBy 8৊>$G AٙmE&tv~{[9$dH9D|&?+?>fʦkCNQFVjaʥ4Ec}ϓEZ A@Zi4K2Ky"\mP-"hO7ó_َOciJ?p%/pdyUv(- 1Uwee'* ֤9,44LK0y,2M $7N <g/yeň'{ a[LpY܅;l`˹_I+NAl9c TlDzCK  w,h3[MCGSz\$?&5P@7ߤL0řBtuv`E,e-}dd-4w( Z҉pT4 T}7oHĕ'`p Sm<MJ- B6ajrz%:f\uETp{-TB*7(z_^۷B p10f@Z٥$ [' ޞ8ݭ TPC}A تOՅdrFR솺˹yu3SwnoU%@!ƻV2\~=<(*+GE^t,LܩGU(*P PU rvs x@(s|{(D6Pv+gۺY,"7:rFݣq4:k#A4pGT!- qc T81d,Py m+5̿wIY,wc5TA'?'W"=׻7bwK9iʽy|#J2NT0 I"<q9ySj$K`I2y'62t"]7>M9>w倸N9'Ƥś6b?#`qA9 1TrDNE~z􀍿9 #cGUPrU sa ٛ(rtVb0xbcU)2c.LӌrDX zᡡ#TxR+ &B#~Zܡ0J*,, iǞ2]h3zY@" ƲpXKAQa^`'bP8״s/`?3d퍨Xǘ l>(EHy*| ArA}{#3ve $ UKd RFe֢{8cz\jb(cu)pOՙ`NZ[uk4쯥 & #4z*{~x#Ld*Xy}':-NN-; 47v ./RoX  (}.g0T}ѿyC#ȾNC@}(s( K@򨨸't6 L9a⳧D!Ը7O\+3,ߤ x<"E%CQd2f"kl?]QgUI 5bȤ|tB#q$<)tԆcG)_>ݮM'<aT]U*ȠduS?Xc2w SGlde=( ,+)ږ}B<- ,LwLoru@KBx!2_˰VSw Kq:wJ-`(Q{`?qJ`F1#%P SX%Bw8Z Nz=w&0r"b*/a نQఢ"NJrEV M,rR~<UY\Ws7ƀ4U: ګNMu&Ik, 8QH Lr 4dmU>k I\zaZX6PkxOqXWuq9#V :{< .ͣrҵn3miZ]E4B]P~^rs9 y :aL-N+ Z5^*GoW|!xK A h#Qfo?hJ$ '5։Q>,a~5bR%Hu[)_'kgogjMГ HI1Bķ8q.ƺ{]BΠ7'ۆ~Ljͧ*trkHYgn꾾E[reVn&.k˾0}E'n'Æ.6q C-E4_Obi?Au8Chaҙ/e"c-m1齃^[heՔ]{tW?{,~὘r_ԓ$UBݻ[ݵZ*mGm9b*~:vfo-Hɴɍ4"hhJ8a:<73o5 w%wQ:{8YmRyKrp_)?&g6ȳsSC~ 쭼(b: pC|2(?c Pa.ޤɒ Y}ݓ' Ktl nanBL'WMiE =og!9x&\^Z*57ͳC@ΥNs1JuIycGU;jG$cX1qVH~!(p{L5pJ)9ɦ;f?}2Ύ / RpR$}1qHGRwL]?^kT\k|ݭ߷]hPJ^SQp./)WxK 5K4>`@ wiefXFۆ0MŚH2`f<JZİ>{IZHnNRq_i +Fw[28!NZ˥crQXL./ǞӇJ>3iUlѠ. ?%h7UK[,N~ysD1]+Ñ9E8\ub9 <xSw+fTRI.vMy:ߑW M:9*R34MqW/p`OϠχ1#(+Yyxېؾ )cJr\c|v0*!5L llC;[YJ.ڞC75od6S6Zx gwz⻶{\O񓩎 ":t84.9ydb'%SƙY: ]s@Փ|3Cu!LsKu|AN穋d(&>+:0\LI| 87 v<7Cf(YmeS8 NP]tCI6N=.o4pȩNw eŵq;GF: ^ iQ^i!,]Ѻ|Xk~OTM!eób5}E\bf:Y,Gշ?3!ALB" W%u{J Lbv7cHwEp2Ra*cu:EQÎN4=tBL"w"U=,*eMMVRn+w.?)`=;V"L+9!l[m%]RE=^ŭ擀2qJ:qeuŘurrھ*N<܃DmH,)#k.ѼkwBiiZ_ ,9Py{tؔ/+N NH:kL|-=O'J92<:m`~uTj|XT݅cRrFLs?+w#|.zE)g`4ޤexO H qpUc,Xw,oo)f*hEit.y2FޠҼUA+}8@y@2I]=[dyG]}#lkn7 /!RQ+++JV3W0]aU'hs%Nyh̪B1/24nU<[n ͕RF01'MPlP\f7*S =[+jH0ڬ=f쓻dg:/Gvv:՗6CxMɐ 'G cnVSc}b~":)u3>NcI~nQ!Vw0LaFEQ+[ R )Z [0*=R#JygwJ]{7r:lO#{Q cVQ6" N!^ȯv0[(: < 5^nt8T#LlZi=0(Ny~\/Z)'`cDl d֔r)ʆ,PlO {Ap|!-vx Fz&[o_z*~sнL7ۧ'd4­+e2CtXfSބV$iiv7X*I n~Z%EmNuH0~,/V,u8و( 7̈Ae|4[Q *G ;frD(fF ςخe&AFTz/ަ_@vB `ro2V9HHLeum+sk&;S]x$'4lٷyC<6/33hCkOOr$a:gw@4r=9; p'4fP!θ&d蝹r00VllǦ<~ptqf` g/2%ǕYޞ9lY}8qRK/#DҸplugins/filemanager/js/_cache/fm_core.gz000066600000060201150472426320014301 0ustar00Y{H(_D?,eICl,yVf6ؑޫX8laTjo-:-`t!&CLnd3Nen<^5.^g%sj]8U˖:=M,WtU,C*jjJo ~~yB>^`Ijyeܪ`Ql3<꾎'sS}BdZAGj|gL#xʦ oR4-m|z\O?&`Z+#{/,_ډ6DǐDܬͶYDZFQ /'(Lf)ߔG'`| 6Lr &&ĕT02fvN9?d:6pj=U@ƌE[ $wnh. mb3֎oH3 e[k3]'tu%l&b^c&n ~Û nli`4jq7py@M l`8c̝hcMDgFu?lUBFny9iV” Ӈ38/ 3{?&](ۇ]'uZ4/?,yނ'P{uBo޼HML/籗Z-ܬV3m$:5lI$́Ԕ[$~0T8yC!pɵ(Hujb8(U'yGC'^tي u1fOx "je\tqn`FV&L7E_&n[c"'|-Ӽ(‰(0 p]Rv]>Rkztfm%3x`or&@#i‹Q.@: L_ Iurcp\OlA M̨'tEfi (D/KWn<vtƒpLf3f1Wz{jq?~y59@e ##8q{^(f9-G$/HHۜԇ 91,v0۽u&ֹ*w@x1,jO㰜1 %ᥙ ;{N!]X'+H4M Cgn62yTsf&Y-NU" esOq2l6P$mX[i\N[김 YL)0`I<đW*MTpQZoYX`LSWq`vYx@Q` hn~ S TU&MfU-deSm!KDʎ =ʴ@(~L|.Jƕs5ߡg~Z* LF'b8#4QMO_1¼5Cmi&z@%Hӝ;SJɴijZ;-4:Y|SH"_ 7[%\xxܜ'K`rFX(DB\H>B@Xv!æ ,5Z(XCp=3ߝHjǗPF(t8KKt5RtvG{64YVOl 54 z GDjJ` aby*PF<*$p7Y؉Cw]P'S3t1V?.0Ngٝ8m,bHhEB~4v -Zـ|^h,Z$B<^NOluD1X@#AԱ R ȞuMjӘR| u@AFldj F 4 j KS-0d&[%"GJ0\`I<룡j*N %D׶\tk;Ō(863:/<5d* B~Q "(w.pbCJ_LbcP͓9 N",=mMG+ZQBR: 2B ի=̳}\ϘS0fq^Z-L#֨1܆Zt8TG'P _$B\sŋ=!\ onE<نH櫛EuXtG;s:d<-fNtG|OіSjO쌞J$q``-t+81^V>p/nU DrcDFrs ``)bj;εn|Y'#ZdCVTQZH9YeJEQ#>9Tiºк!p|noS05'+67u2]4;g(#2q2=U',{HS6+U ϱ"SҼ[C{0BʰQ(:P+.7_:kn_WSdb"wPkB^B}am:/Y2ZSMdqB?f.X'I8tZN(R@ʨ\h栭c\%f*x3m `>S;u^1Sij4SAV)їP]>*6${u1PڵE3{ WDS% ߜ!3ASXG\4`:`O;tzI掔/mCHrTtk%!scOFb\`[Ej# XŜԃ+j*QS:p=|zPo/N?0BXjMETr:9RtySlmk\б)~^0‰9fD)0YGYaj԰7Ji&cf8 *wo|i͂V "x"Bl?zpwίc.Y^LM6YYfkoby`YW ̺.J bȪY/<8Ɬ]زSLH'RX7`ȭ=fǯ$k wN 5[z2B"#FC_F^Nx?1s;@t՜[yyOm ltYb**c+VIz@Xh4sn7HmJ=S&+@V*DߥP6F+͸20[p VS.܊V eb&*iӮkՌbtoѳ~ʜ. Pkt S 3 <`fS6';˥ ؘH`o%+lXoC qIr Px)b? %-VR/oALՠ\>evЍu A6˾x3v UƧaJ|ȳk\_UQwHrze W Y~}9CُuRN@u~5=$Eh;ޫ}jWSY8CŎ[t8۸qٔM'BB՗[EdӅ3B_~>йf\i04Y-J ~:]e8{Wt4tdPyv/tTO_ ϫ`=j_jVu` V%(=$8)-F$u$b" 5tVPNh: PC,}Y\Mۗ`mDi kd1G+8GAQ;m Jku"RP!KFZiN$Kyh.DjS̰D.ZZ|\xC4 !V(4͈Fr+\ \[bEQ՞D#ΈUNiԲ1J!+֫fOAD:wMQJ$g*GyS"ܠ#0;^:8ӟz.n9Y+5]hKi7 \P+aFg<j5zXA-, Wo\|E _gD{dtI3feuiiLB/;S1IYGG塳Dw jU x|hCV^+y(iT]:7Np|;kc4)l hp: ՛zPG&PJU u-Ul!P:n<2c#:#CDF1i.ra[>nz&·pm[ Oj!V]ɱS5I;><ۍ fu/OY$酶J}M<2Sbg9(y)*ݠpyr"yȘ$?MȺ\5rWxU& P,cу6:d7ڔF޸cEl;m )3V]]>ָ֥ `a(-kq'M4Kk'\\y;|h8)V#p\_T=ծ{,TÒXHe98Xrǖ&U ľhAnS ]hIMu}I)F ۀ{ O ^GTozV!=R[VkZu+#SFE(yZ t7rAx  =).PͱU>. jHNɶ+e%Bj0v] /qEv+Qx1`#j \T" /g|y{;9\zP;I\cDHaisr޽,^::pov eς*D+Ɵ&#sTUnhY0 k^f`b&uﳓKh^EUynr=|W ҅6tuX&ӊRDi8)B&2zk33ےRg%V֞okc-9g =d}^4!Ӱ}BĪʓxm4])'8s\|U4 8]:[FlBM5aņ(xJ>I44fr1&U ;U*#Ƙ~=d,M]m2&&cdYy⢹dRhQk.r0榭LBCs4 TXmLmﲼiʳ7u86α˦Uc'(ÙHR]5"":bTϺijϦ<\02lU|#0vH.ӇEsS  Q#lp<1.C2 -݆Nc(`0kըI(jhO1~>vaet͞hA;6Ga#TCH4WP uX=˭@q9a\*P@M?d $Kn|bI,[-L>!6t J8XEc< <vjIV⠶Hu:}s}(χxĩęt]|&3Ӯj/9_|5Lɍz\860Э;T$@䃠"(ߞ+{uxQgߋiR-Abs/42_ ?Mv 3;ĞH'spoӾq4]MV[-SեSw8l_hXr˷a(<u𹲺A})4 VEYHz _ǘo ك!?`scgB:Pf$ÿJJTz3EdT /*n$tL!L4JJu n#tjR t{AlF~yla,u Oن)^ QL%YV(hVp9 54kw0&m@?S£8u2ip`i?A$&UlM?&;D3tyE$"S+"qdAG0Q:Di\f<˥$\o+\M9jcPuCPv%/[pe ^B`ZaOOs n d&hM`݁͟'+Oͥqʈ$w2-QU@|9&9j(],u-,̡ؐq0p셟S+ `z0WH.0EMiCDK89x7#nƂa Jfi/\!Q~RA=iV;1vJ7W^pkTƸztأb{&WeeٟW3/5vcJ=OGutQ?pN;s7%B_-xFԩ:wՎ;F pg^;FYRY K]V]:§j`Qr<(?Ӹ ~{!OibI H<_~ݷ0r$VF>B/;yaiB>x0a>.z5QY|aFÂp9ΰ2XHM&ؠ RK]Aߧ|D+ m 64A6PP3fH68|,7c"JЄ{4C`ȥ=uc[ݐT)&>.FxU~HJ]PꦫTr>{R~ۄx"rM"] V.-d#>TC- e 3JujecA@F;wD gLN&:䑍F5q'R'm(5FqFU1=$*_ `;8eJc΄eϚPr)gb+ ysFE@kxQd#jzځo0J=*jv.0dzߺUdypZ7l؆ ޳w>^$}l%X4@RlQ 83Չ4Dgq&<hzT 4T8z ,ʹLod~U6iKh9{{C Wbȴ ӱ 6i cQ@G:L0ꍊ)'G`?CA96NQD/dFSUc+sHʶ"eŠ&ӫ39t(*.`WE=T+ʚ}*"r )> *} zNj v4hQׂB i%Z16;mvv3];))eT\8tbb #"#R0Bq sHDE3J$EOVhD_~:c{|$["82;<[~crO1` $;rtC0sW&~Kb'gD">1r2Yoߦlw$zjcy)ͮVKn7%e v:Κae5!YJL@J7ьfTQft~>0}I("[jy74 Rɬ.<CJY}eezm=h(JNK#PHʛU.['cSH~hvv. zljQ;ytTVi8Q66T$ L0iӶZLd"oD4p!QA`IQ 1Eaz87?*;"rS^>|1z Bhw k8`UQ lF1}p=l^|Ϙ~*wMh@VD' όe% ^$L0Dɝ#M.6*b˃6oLsQ mMY-+J?{nʇf`׋M<]Q,zEº٬+pЫgaՌQp.bIbEALtӲ\[Q雙'<4L4{Q=ߏ6aͪ %'P-k'$'qh8/,M_ZNA#속lqdT"{N `R_I@ Rc?*W͘x87OJ^YbOˏ sM5}ve;(K[ΤǺKQx+S^/G \Ap7s,L:)kpi%3@վf^UTs곱|"^Bt+TUفC—h,vLViOUP݀YU8P.4] ߋ+wpb$ }zRԅ=o<՚h衝"|!0gTyt80 77LSg&/5x:Iʢ1*Ws~}1NXfdN7\"r^'* sqn>>(nP!!QQ 9M7QPk,{P-P@B,.Mhr3~uH)cwz؀[10x~&` lSPicN{"x>+w9Uω!8!p@$q:Ꜥ4Ƽ*͗Dih@Z'[pG5ģ Ȋ5F~]VasЯ+'_֠9i/Aa;^sFZ8Xkrr[pnh oP֓uwc&6BDz=;~0Fp!ʶ+Y hmĿ1(ى#+ϫ>İ,\Z'҇bGEבFt7 [h50~P0+S^D MPH7V#Uvl/9c̘cLw8o?p<0t estC6ш*VoHPёteC_ejI JW%R޿v..M6󌄚mVϺOZvcJ[tlKzUir y;< a>/ z8Dpi.H7. 3W;rEUyk@ NSR Pq]E6no+IrX" y&omȂ"CuX&(dmݵ'Y6ӌb̌!QzA@)طs~0Z^0r{#6 zzVꜻp8ȏJ{tq1!6ZQ 6D)]kV `VٛAWgGfc\9m DE?a_ò0CmV"sbVO.!Ӹȫ!$z*]ӰIGM. Sx6H5k9f63qAY;,։pӞާ4kC|'i/BV4gĔh's#˷կ#nxx50BAopWS`&|şoCV(^=L3п|eH i8Zoew`~>Etn!~ruz ic$jK*p0Ld<|M!}B E^G"G#|3PZm4jͳzD 7_/"ÒV6 q 7ŋOF ZV3:TIdֱ67&f#3"6>b5S#FK!y(2*rSb4 lZG:F|2ph"o A:īa(JsP5-ZzZNF Rہ77HwA.`:,fޜ$/d1ck}a!OJ?DHF] wA|^~⺫}ä՚>=çQԹvoQbǂ})zt0n|/x;뺵v&ɢɦdӖ7<;|@}IV6Hc "\soƜsxW1b03ZKJ:ޙu6=~w ~Z3 .ܒ, -j%|7! 2W>[ }ji:TWz4&O{14 rzb&hJv O _l3b)o++Iց/i>BvO{r.۬ ̞ ̚J1rɴH7Wgm2,7\VeGGʯa Y(}~02 \L` tao,Ygw:? jB=*mj(S]0Ǔ^`Q IԙYF4+jÊv+g(zlpP@>QK1I'DΊKɉ=^c)'QW%uIU|Lg2ŋV?]dd __f&vx4 ',bCLRA驁E;e 2(}ŧꢷ(4w׹kp&zh`AP` -ԛnS=b,| -BHRMJճS f~MW).Gp{u]}L[7_Oo_|χooݷ??oecžiof*ٞ!WdyIfg")U»X>) hh$MahX0~δ}8a4Niwd`ܴ~S  ގ㙺"jnjM_v3SW;N1Gի,8d`M6tɌE2=7hPT閨-)Jx 6~ŷ>>oƿDg3MefXrhs^ݯMTt!@$|& L9_eE!{X; J <|d}*lsݜkN?4''O@)\0G"R"u0!Fy }*ib*kB-ګG%1!JJh_8U_~QNA|)%抝iG_)yb~v (UP]j.^PegS˪t([EdɅS|`l':0n_*kN̛x?2uRg^ shodBolRRFN26).]z@fDzJ5{ la(M:밄Х Yla`SVӓ9`*f ^uF Kĭw{LaBi;H4Ney}bhN[H{>t^/j>"%YC!![|dW`ag,;c]Y=Guclη^a'zԥ\ozn 001PL3N(_R [LBu%ug2bC''rO JV5\y KÀQNڿ?MS^JT!6Bw!v 2ﻎV9.ļ2Tep;( Z0]汃$(3*]06_׼6y )ysdv ugy9B; C^ȵD% P \RmlSh!} -j*:ȱ .rh"B_B7`e\sˊOgpvmHb83ŵlޒBu-]Yszz"LTյr.\GqX[U K %:@Iw c^׏tonBZڃ#]Eu1lSjcĻRiYBl7<8H4L\Gdd nfzwqғ^#$=mi*@t'h3lϑ)hiL0\dgJt8 LwQ"B~1T w߾}ZXS- kֺŽvwN_g9(7[$@-+Je Xj1/}L=TmƎea5)[ogUBç&yꮩzdƂ[0IsF;'7uVOԼ19zQ@m*6lNuSͳM鄶tqV᭣kO[8jE*>/d*m{]Խ=ښ/$G=v݋EFY#^g3(L@[jKzmE B̊eFg,[Hc&TRKTqI[p|_2u {5<|6L,}Ψ0sw74FTl1$S!^S qh<ޫ}֫-qO j rXǦ^c  ) u6f@ڝ%7C `fJL`z{MY,X9]?+*N7 >2j[|Z O׀Z Rv5@tF[)jw/5hy3<QHJUY}3qEt!x*h$rj2֧꣓9q:=G3[޶UbDzxl'NvO]х+V+LPXך_:YatG/LٶԦMuQUWc+)SY}򭊋d(k -L]@qBVeI, $KhgHןdm"! _knuCFpn? ڦ"ۯۭV]O ٞS}'[IU%N[HZyh^ gI9D_mxjGB/@,48o5n]s<5}Fw'\mw^h(fŤc /i 3(<iɱfA,/=nIVubPB6-DmQYMƎMLM ?q=b~*d}݉ xՄy[>mm*if|B7a}m}8@+W>r)fղXoZV{CFqYnƶf7SŦVrBy 3gVwΖy~1iUv\}p/Oa]P)ϮrI{ٻ랭hyrL "}C*(ˑFK9yYRkG~{ p`*U>Iy C1!]˞ڇ)E"s>u4tG:g~g >Ե<T0Q={&eAY[GFY<نp[NqUUuyؼnb0#"zmix73s )Mk\(1v,5 7Z7ay |c`%m3:FX6$Vf g=w{9>,&/=E Dp/ͶG|e5/yQ(?d2cB6 Dfykjfa fbxȷ'\}r ۗ%ċ ě%\Ϝ~y// a"pm[4I8- W`0sF"E' Sq1HķC=^ZX, z͍#$.vpK%'=i]7u1_Yɿq$%%pc<5J? Fl@jFqbݪd {nf*WZZ^} v/w0 ( B@Skpl\Bڭř{wAbĻ ™WZǺ $htF?s9 k`XFK`s޿}`Gǟ{5v}չ,Ieۗسxw#kbKL]# DE%wz)_ {e0~'wx9e4Y6y \323APڌ1)>ȘvЮ+Sr?8*^UDTInav9o L<n|fM03{e# *7i8(1S ( ֌dbx=4yqr(Pl3O_>(7yN_{> FA;o F"v*ǯ:n_QGAYe|&nkOYȮ\Cayq9_/a2>N &6G PW/OzcIu(uk[~dgD>꨾p;Oo6ൄ"N._$`e#E^3PD/?"~{8q8382ےfTGĂù[pVgmFœ9v{Eb:^gqlY}yzY=( zx4\| BqqN%ӠY|V#g+qy U8E;rLV^ߺ xAhBPoO.!ŐWX-XL㼘 tsH\dz~nmD Q)I+a':f7!Ƅ#1D#z੬$9 /CɷSuqӑ_bT*'aF߭;G%sCVNL G8+? ~ oh_SY<]vgP^RFyy~9o__ɫ@ cZ7(`4s8ܒS#b߫dKyۗh_zƋ/N/29Cg`>:m]pn-$a]P _7?$92;Ra:G#0&y*|糛r>1 ٴHԏ,mMI!y:+vf6qk݋'4Wk 1?:?oz+\+]I'??>>7͢`C?OşH F F >$A5 /hs! vsAT@ ~FgȬ>ldK<|=^cԜMyo7L~biQ|?q61%OMo Cz4O/jz@̡ ox)O߰_ֹ,kqI'#I\ s% !3C 50?)p BG cXfgwZHe+փ@έȖS@r PBk o 6 LՁ/&NgJ t5e,)oqإ^i lԝ0ګJ^-8=9w< p*qv1ҷ!UVMg1yR: Y'n'0Rgd@ZSnyvNfDi]eFG=\SPwߴB_Z3 p5B1# !%M9,F؎ɲb*oD]b(;-SJ[=%\(PzLTvzMSaPoH f&`LH1XH j` zҐsgp8H/@3ts MY ^;ofPUӻ]+]&aY͌Ǘ=(d=v|o=i7ajꜮ~ yw[wu* a;sEz.Ġ|s-4}+:"ކMF%W''2Jyt0TiuK\K w)yJc*Y0, ,,JosnYRy"9YK$h5-U_YK=ZbG<(DφPL4Vpۿ[|9^}> Ӿ/8m(~e > u.T;L%V/([U~in~M>6΋PQi)*Eiഛľ̕~Vl:e{߮I%"B*(XJZ=^9E<.jƌf/o[#s!M?LAc+@'_Oq jف{{&q MM< 3yEYD qq@׷y"8$_Tj<_@ ;h!zX##uO0 Ū|=ُ Aey/9ldn}` 0UAeD\-LCQNMmsA :Nݎ72NŖ[GUˠGthW5KY8%N*ܠRülbW,ϫ7{<9`XѬAgb">D]0gKʬNO;@(syLS ^ eZxgWgH${rm(*^`lUs71Jx\h@>~Dg% 埡ovV=kA W3%y۝T+H%{թX,+h/zEtguM4f0tbbIO3gDL;ʠiJτnbBB# 'tZ3 T)y&#ģM=7/Ѐ{n{to Y5"`1mp|[Iٴr eJIg֢鬀$^ᵽGo8h~4'نQ sl^}Ż%(1GSxV!*CL&#L@a),.l^,6~֑&z֛WxN{e[z\YslIcPJx5`ts"_}j"֟=MY%^[,n'q`U(6jBqImo`԰{|ĥ[5~ zn(Ã^Ͳzll{.HV ;s/oU x8:6QDdc9e#>plugins/filemanager/js/_cache/fm_core.js000066600000237375150472426320014317 0ustar00(function(){try{var li=document.location.search.replace(/\?/,'').split('&'),query={},i;for(i=0;i)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
        "]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
        ","
        "]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&¬xml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return im[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("
        ").append(res.responseText.replace(//g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;ithis.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();(function($){function xmlEncode(s){return s?(''+s).replace(new RegExp('[<>&"\']','g'),function(c,b){switch(c){case '&':return '&';case '"':return '"';case '\'':return ''';case '<':return '<';case '>':return '>';}return c;}):s;};$.translate=function(s,e,va){return s.replace(/\{#([^\}]+)\}/g,function(a,b){var pa=b.split(/\./);if(MCManagerI18n[pa[0]])a=MCManagerI18n[pa[0]][pa[1]];a=a?a:'{#'+b+'}';if(va){a=a.replace(/\{([^\}]+)\}/g,function(a,b){return va[b]||a;});}return e?xmlEncode(a):a;});};$.translateElement=function(e){e=e||document.body;e.innerHTML=$.translate(e.innerHTML.replace(/=({#[a-z0-9_]+})/gi,'="$1"'),1);};document.title=$.translate(document.title.replace(/^(http|https):\/\/[a-z0-9._\-\s]+-/gi,''));$('body > *').each(function(i,v){if(!/(SCRIPT|BR|HR|INPUT|META|IMG|LINK|PARAM|IFRAME)/.test(v.nodeName))$.translateElement(v);});})(jQuery);(function($){$.fn.sortArray=function(by,desc){var data=$.makeArray(this);function numSort(a,b){a=parseFloat(a[by]);b=parseFloat(b[by]);a=isNaN(a)?0:a;b=isNaN(b)?0:b;return desc?b-a:a-b;};function strSort(a,b){try{a=''+a[by].toLowerCase();b=''+b[by].toLowerCase();if(a==b)return 0;if(desc?a>b:a');t.shim=$('#'+id+'_shim');}$(document.body).appendAll(['div',{id:id,'class':f.theme+' window'},['div',{id:id+'_container','class':'statusbar '+f.type},['div',{id:id+'_top','class':'windowtop'},['div',{'class':'left'}],['div',{'class':'middle'}],['div',{'class':'right'}],['div',{id:id+'_title','class':'title'},f.title],['a',{id:id+'_min',href:'','class':'action min'}],['a',{id:id+'_max',href:'','class':'action max'}],['a',{id:id+'_close',href:'','class':'action close'}],['a',{id:id+'_move','class':'action move',tabindex:'-1'}],['a',{id:id+'_resize_n','class':'action resize resize-n',tabindex:'-1'}],['a',{id:id+'_resize_nw','class':'action resize resize-nw',tabindex:'-1'}],['a',{id:id+'_resize_ne','class':'action resize resize-ne',tabindex:'-1'}] ],['div',{id:id+'_middle','class':'windowmiddle'},['div',{'class':'left'}],['div',{id:id+'_content','class':'middle'},' '],['div',{'class':'right'}],['div',{id:id+'_bigicon','class':'bigicon'}],['a',{id:id+'_resize_w','class':'action resize resize-w',tabindex:'-1'}],['a',{id:id+'_resize_e','class':'action resize resize-e',tabindex:'-1'}] ],['div',{id:id+'_bottom','class':'windowbottom'+(f.statusbar?' statusbarbottom':'')},['div',{'class':'left'}],['div',{'class':'middle'}],['div',{'class':'right'}],['div',{id:id+'_statustext','class':'statustext'},' '],['a',{id:id+'_resize_s','class':'action resize resize-s',tabindex:'-1'}],['a',{id:id+'_resize_sw','class':'action resize resize-sw',tabindex:'-1'}],['a',{id:id+'_resize_se','class':'action resize resize-se',tabindex:'-1'}] ] ] ]);if(f.bigicon)$('#'+id+'_bigicon').addClass(f.bigicon);if(f.chromeless)$('#'+id+'_container').addClass('chromeless');if(f.resizable)$('#'+id+'_container').addClass('resizable');if(f.statusbar){$('#'+id+'_container').addClass('statusbar');$('#'+id+'_bottom').addClass('statusbarbottom');}t.show().hide().resizeTo(f.width,f.height).moveTo(f.x,f.y).show();if(v=f.title)t.setTitle(v);if(v=f.content)t.setContent(v);if(v=f.url)t.setURL(v);function handleAction(e){var el=$(e.target),action,f;t.focus();if(el[0].nodeName=='A'&&el.hasClass('action')){action=$.grep(el[0].className.split(/\s+/),function(v){return !/^action|resize$/.test(v);}).join(' ');if(e.type=='mousedown')f=t.mouseDownActions[action];else{if(t.features.onaction){t.features.onaction.call(t,action);return false;}f=t.clickActions[action];}if(f){f.call(t,action,e);return false;}}};$('#'+id).click(handleAction).mousedown(handleAction);$($.WindowManager).trigger('WindowManager:open',[t]);return t;}});$.WindowManager={zIndex:100010,count:0,windows:[],i18n:{yes:'Yes',no:'No',ok:'Ok'},setup:function(){var w=window,lw,nwm,op,b;while((w=w.parent||w.opener)&&w!=lw){if(w.$&&w.$.WindowManager)nwm=w.$.WindowManager;lw=w;}if(nwm&&nwm!=this){$.CurrentWindowManager=$.WindowManager;b=document.location.pathname.replace(/[^\/]+$/,'');op=nwm.open;$.WindowManager=$.extend({},nwm,{open:function(f,a){if(!/^https?\:|\//.test(f.url))f.url=b+f.url;return op.call(nwm,f,a);}});nwm.find(window).setTitle(document.title);}else{$(window).bind('resize',function(){$($.WindowManager.windows).each(function(i,w){if(w.lastRect)w.resizeTo($.winWidth(),$.winHeight(),1);});});}$.WindowManager.currentWindow=$.WindowManager.find(window);},find:function(tw){var i,ifr,w;for(i=0;i'+msg+'
        '+''+this.i18n.yes+''+''+this.i18n.no+'');},modalBox:function(msg,f,cb){f=$.extend({type:'alert',bigicon:'error',width:400,height:130,onaction:function(a){if(a=='ok'){this.close();if(cb)cb.call(this,1);}else if(a=='close')this.close();}},f);return this.open(f).setContent('
        '+(msg||'')+'
        '+''+this.i18n.ok+'');},remove:function(w){var t=this,fr,z=0,nl=[];$(t.windows).each(function(i,cw){if(w==cw)return;if(cw.zIndex>z){z=cw.zIndex;fr=cw;}nl.push(cw);});t.windows=nl;if(fr)fr.focus();}};$.WindowManager.setup();})(jQuery);(function($){$.StatusWindow=function(f,a){var t=this;t.isIE6= /MSIE [56]/.test(navigator.userAgent);f=$.extend({type:'status',width:400,height:240,onaction:function(a){if(a=='ok')t.close();}},f);$.Window.call(t,f,a);};$.extend($.StatusWindow.prototype,$.Window.prototype,{setContent:function(co){var v,k,h='';if(typeof(co)!='string'){$(co).each(function(i,v){h+='
        '+'
        '+v.title+'
        '+'
        '+v.content+'
        '+'
        ';});}$('#'+this.id+'_statuscont').html(h||co);return this;},render:function(){var t=this,f,v;$.Window.prototype.render.call(t);$.Window.prototype.setContent.call(t,'
        '+''+$.WindowManager.i18n.ok+'');f=t.features;if(v=f.content)t.setContent(v);return t;}});if(!$.CurrentWindowManager){$.extend($.WindowManager,{status:function(f,cb){var t=this,w;f=$.extend({onaction:function(a){if(a=='ok'){w.close();if(cb)cb.call(t,1);}else if(a=='close')w.close();}},f);w=new $.StatusWindow(f).render();t.windows.push(w);return w.focus();},showProgress:function(f){var t=this,bl,id='progressWindow';t.hideProgress();t.progress=1;f=$.extend({theme:'clearlooks2',x:-1,y:-1},f);bl=$('#windowManProgressEventBlocker');if(!bl[0]){$(document.body).append($.createElm('div',{id:'windowManProgressEventBlocker','class':f.theme+'_event_blocker'}).addClass(f.theme+'_visible_event_blocker'));bl=$('#windowManProgressEventBlocker');}bl.show().css('z-index',t.zIndex++).css({width:$.winWidth(),height:$.winHeight(),position:t.isIE6?'absolute':'fixed'});$(document.body).appendAll(['div',{id:id,'class':f.theme+'_progress'},['div',{id:id+'_msg','class':'message'}] ]);$('#'+id+'_msg').html(f.message);$('#'+id).css({left:-1000,top:-1000}).show();if(f.x==-1)f.x=Math.round(($.winWidth() / 2) - ($('#' + id).width() / 2));if(f.y==-1)f.y=Math.round(($.winHeight() / 2) - ($('#' + id).height() / 2));$('#'+id).css({left:f.x,top:f.y});$(t).bind('WindowManager:open',function(){t.hideProgress();});},hideProgress:function(){var t=this;if(t.progress){$('#progressWindow').remove();$('#windowManProgressEventBlocker').hide();$(t).unbind('WindowManager:open',t.hideProgress);t.progress=0;}}});}})(jQuery);(function($){$.extend({createElm:function(n,a,h){n=$(document.createElement(n));n.attr(a).html(h);return n;},appendElements:function(te,ne){var i,n;if(typeof(ne)=='string')te.appendChild(document.createTextNode(ne));else if(ne.length){te=te.appendChild($.createElm(ne[0],ne[1])[0]);for(i=2;i)/gi,''))),opts);};$.extend($.template.helpers,{sizefix:function(v){v=parseInt(v);if(isNaN(v)||v==-1)return '';if(v>1048576)return Math.round(v/1048576,1)+" MB";if(v>1024)return Math.round(v/1024,1)+" KB";return v+" b";},encodeURIComponent:function(v){return encodeURIComponent(v);}});})(jQuery);(function($){function URI(u,s){var t=this,o,a,b;s=t.settings=s||{};if (/^(mailto|news|javascript|about):/i.test(u)|| /^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf(':/')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u= /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);$(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"]).each(function(i,v){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}};$.extend(URI.prototype,{setPath:function(p){var t=this;p= /^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;if(u==="./")return u;u=new URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i,l;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0,l=base.length;i=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0,l=base.length-(bp-1);i=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return '/'+o.reverse().join('/');return '/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});$.parseURI=function(u,s){s=s||{};return new URI(u,$.extend({base_uri:new URI(s.base_url||document.location.href)},s));};})(jQuery);(function($){$.cleanName=function(s){var i,lo;lo=[ /[\300-\306]/g,'A', /[\340-\346]/g,'a', /\307/g,'C', /\347/g,'c', /[\310-\313]/g,'E', /[\350-\353]/g,'e', /[\314-\317]/g,'I', /[\354-\357]/g,'i', /\321/g,'N', /\361/g,'n', /[\322-\330]/g,'O', /[\362-\370]/g,'o', /[\331-\334]/g,'U', /[\371-\374]/g,'u' ];for(i=0;i "+r.tofile,content:$.translate(r.message)});}if(r.file!=undefined){r.file=r.file.replace(/\{[0-9]+\}/,root);r.file=r.file.replace(/\/+/,'/');errors.push({title:r.file,content:$.translate(r.message)});}}});if(errors.length){$.WindowManager.status({title:$.translate(args.message),content:errors});return true;}}},insertFiles:function(s){var t=this,args={};$(s.paths).each(function(i,v){args['path'+i]=v;});if(s.progress_message)$.WindowManager.showProgress({message:s.progress_message});RPC.exec('fm.insertFiles',args,function(data){var o={files:[]};$.WindowManager.hideProgress();$(RPC.toArray(data.result)).each(function(i,v){var u=v.url;if(s.relative_urls)u=$.parseURI(s.document_base_url||s.default_base_url).toRelative(u);else if(s.document_base_url||s.no_host)u=$.parseURI(s.document_base_url).toAbsolute($.parseURI(u).getURI(1),s.no_host);v={name:v.name,path:v.path,url:u,size:v.size,type:v.type,created:v.created,modified:v.modified,attribs:v.attribs,custom:$.extend({},v.custom)};o.files.push(v);});if(s.oninsert){if(s.insert_filter){$(o.files).each(function(i,f){s.insert_filter(f);});}s.oninsert(o);}});},insertFile:function(s){var ins=s.oninsert;s.paths=[s.path];s.oninsert=function(o){o.file=o.files[0];ins.call(this,o);};this.insertFiles(s);}};RPC.init();})(jQuery);(function($){var w,ed,wm,args={};window.focus();w=opener||parent;if(w.mcFileManager)args=w.mcFileManager.windowArgs;if(w.tinyMCE&&(ed=w.tinyMCE.activeEditor)){if(ed&&(wm=ed.windowManager)){if(!args&&wm.params)args=wm.params;if(wm.setTitle)wm.setTitle(window,document.title);}}if(!$.CurrentWindowManager){$.WindowManager.defaultWin={getArgs:function(){return args;},close:function(){if(ed&&wm.bookmark&&top!=window)ed.selection.moveToBookmark(wm.bookmark);if(wm)wm.close(window);else window.close();}};}})(jQuery);plugins/filemanager/js/_cache/fm_edit.gz000066600000001247150472426320014303 0ustar00Un0 . ` մЋ.֣tMINQ8IÆbD$(ҤudIԵZ[)Y]Uo-h uQh<ʤ>aa#왿tLؕ+z|kX PC#znjm*'ldSw@(-$;oQN%Vh ypcF/g QA5{kV#CO4sEWFRʭ~\Бo8Ht}c436G:lR-1VְcA ِWVpg{n`)c,>zkHic{ J*RMC1v1(?vғYcϥ`džىTF/2Kdˢ ѿu!Ј`tI%X`({܄w`b.x.rOl, AБiSI:)\eGSt(v:iWdNawĹ`'3z:׌L,<[R6o/<,F(WBWbTJVy+?ዄ- i ǰəoW酭˜d[YC1COK WO񀞷W14tvš-k?sfbi62`MS4Z]7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="";_19+="";var _1d=this.getParams();for(var key in _1d){_19+="";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="";}_19+="";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.majorfv.major){return true;}if(this.minorfv.minor){return true;}if(this.rev=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;;(function($){var $scrollTo=$.scrollTo=function(target,duration,settings){$(window).scrollTo(target,duration,settings);};$scrollTo.defaults={axis:'y',duration:1};$scrollTo.window=function(scope){return $(window).scrollable();};$.fn.scrollable=function(){return this.map(function(){var win=this.parentWindow||this.defaultView,elem=this.nodeName=='#document'?win.frameElement||win:this,doc=elem.contentDocument||(elem.contentWindow||elem).document,isWin=elem.setInterval;return elem.nodeName=='IFRAME'||isWin&&$.browser.safari?doc.body:isWin?doc.documentElement:this;});};$.fn.scrollTo=function(target,duration,settings){if(typeof duration=='object'){settings=duration;duration=0;}if(typeof settings=='function')settings={onAfter:settings};settings=$.extend({},$scrollTo.defaults,settings);duration=duration||settings.speed||settings.duration;settings.queue=settings.queue&&settings.axis.length>1;if(settings.queue)duration/=2;settings.offset=both(settings.offset);settings.over=both(settings.over);return this.scrollable().each(function(){var elem=this,$elem=$(elem),targ=target,toff,attr={},win=$elem.is('html,body');switch(typeof targ){case 'number':case 'string':if( /^([+-]=)?\d+(px)?$/.test(targ)){targ=both(targ);break;}targ=$(targ,this);case 'object':if(targ.is||targ.style)toff=(targ=$(targ)).offset();}$.each(settings.axis.split(''),function(i,axis){var Pos=axis=='x'?'Left':'Top',pos=Pos.toLowerCase(),key='scroll'+Pos,old=elem[key],Dim=axis=='x'?'Width':'Height',dim=Dim.toLowerCase();if(toff){attr[key]=toff[pos]+(win?0:old-$elem.offset()[pos]);if(settings.margin){attr[key]-=parseInt(targ.css('margin'+Pos))||0;attr[key]-=parseInt(targ.css('border'+Pos+'Width'))||0;}attr[key]+=settings.offset[pos]||0;if(settings.over[pos])attr[key]+=targ[dim]()* settings.over[pos];}else attr[key]=targ[pos];if( /^\d+$/.test(attr[key]))attr[key]=attr[key]<=0?0:Math.min(attr[key],max(Dim));if(!i&&settings.queue){if(old!=attr[key])animate(settings.onAfterFirst);delete attr[key];}});animate(settings.onAfter);function animate(callback){$elem.animate(attr,duration,settings.easing,callback&&function(){callback.call(this,target,settings);});};function max(Dim){var attr='scroll'+Dim,doc=elem.ownerDocument;return win?Math.max(doc.documentElement[attr],doc.body[attr]):elem[attr];};}).end();};function both(val){return typeof val=='object'?val:{top:val,left:val};};})(jQuery);(function($){var id=0;$.multiUpload=function(s){var up=this,mul;up.id=up.generateID();up.settings={};up.settings=s=$.extend(up.settings,s);if(s.max_size)s.max_size=up.parseSize(s.max_size);if(s.chunk_size)s.chunk_size=up.parseSize(s.chunk_size);if(s.oninit){$(up).bind('multiUpload:init',function(){s.oninit.call(up,up);});}up.init();$(['setup','filesSelected','fileProgress','filesProgress','filesUploaded','fileUploaded','fileUploadProgress']).each(function(){if(s[(this)])$(up).bind('multiUpload:'+this,s[(this)]);});$(up).trigger('multiUpload:setup');$(up).bind('multiUpload:selectFiles',function(){this.cache={};});$(up).bind('multiUpload:filesSelected',function(e,fs){var mx=up.settings.max_size;function filter(f){var m= /\.([^.]+)$/.exec(f.name.toLowerCase()),ext=m?m[1]:null;return ext&&$.inArray(ext,s.filter)!=-1&&(!mx||f.size1048576)return Math.round(v/1048576,1)+" MB";if(v>1024)return Math.round(v/1024,1)+" KB";return v+" b";},generateID:function(){return 'u'+(id++);},parseSize:function(sz){var mul;if(typeof(sz)=='string'){sz= /^([0-9]+)([mk]+)$/.exec(sz.toLowerCase().replace(/[^0-9mk]/g,''));mul=sz[2];sz=parseInt(sz[1]);if(mul=='m')sz *=1048576;if(mul=='k')sz *=1024;}return sz;}});$.extend($.multiUpload,{instances:{},create:function(s){return this.add(new $.multiUpload(s));},remove:function(id){if(this.get(id))delete this.instances[id];},add:function(up){return this.instances[up.id]=up;},get:function(id){return this.instances[id];}});})(jQuery);(function($){if(!$.multiUpload.initialized&&window.google&&google.gears){$.multiUpload.initialized=1;$.multiUpload.runtime='gears';$.extend($.multiUpload.prototype,{init:function(){var up=this;$(up).trigger('multiUpload:init');$(up).bind('multiUpload:selectFiles',function(e){var up=this,desk=google.gears.factory.create('beta.desktop'),s={};if(up.settings.filter[0]!='*')s.filter=$.map(up.settings.filter,function(v){return '.'+v});desk.openFiles(function(f){var sf=[];if(f.length){up._fireEvent('multiUpload:beforeFilesSelected');$(f).each(function(){var fo={id:up.generateID(),name:this.name,blob:this.blob,size:this.blob.length,loaded:0};up.files.push(fo);sf.push(fo);});up._fireEvent('multiUpload:filesSelected',[{files:sf}]);up._fireEvent('multiUpload:filesChanged');}else up._fireEvent('multiUpload:filesSelectionCancelled');},s);});$(up).bind('multiUpload:uploadFile',function(e,fo){var req,up=this,chunkSize,chunk=0,chunks,i,start,loaded=0,curChunkSize;chunkSize=up.settings.chunk_size||1024 * 1024;chunks=Math.ceil(fo.blob.length/chunkSize);uploadNextChunk();function uploadNextChunk(){var url=up.settings.upload_url;if(fo.status)return;curChunkSize=Math.min(chunkSize,fo.blob.length-(chunk * chunkSize));req=google.gears.factory.create('beta.httprequest');req.open('POST',url+(url.indexOf('?')==-1?'?':'&')+'name='+escape(fo.name)+'&chunk='+chunk+'&chunks='+chunks+'&path='+escape(up.settings.path));req.setRequestHeader('Content-Disposition','attachment; filename="'+fo.name+'"');req.setRequestHeader('Content-Type','application/octet-stream');req.setRequestHeader('Content-Range','bytes '+chunk * chunkSize);req.upload.onprogress=function(pr){fo.loaded=loaded+pr.loaded;up._fireEvent('multiUpload:fileUploadProgress',[{file:fo,loaded:fo.loaded,total:fo.size}]);};req.onreadystatechange=function(){var ar;if(req.readyState==4){if(req.status==200){ar={file:fo,chunk:chunk,chunks:chunks,response:req.responseText};up._fireEvent('multiUpload:chunkUploaded',[ar]);if(ar.cancel){fo.status='failed';up._fireEvent('multiUpload:filesChanged');up.uploadNext();return;}loaded+=curChunkSize;if(++chunk>=chunks){fo.status='completed';up._fireEvent('multiUpload:fileUploaded',[{file:fo,response:req.responseText}]);up._fireEvent('multiUpload:filesChanged');up.uploadNext();}else uploadNextChunk();}else up._fireEvent('multiUpload:uploadChunkError',[{file:fo,chunk:chunk,chunks:chunks,error:'Status: '+req.status}]);}};if(chunk=10){$.multiUpload.initialized=1;$.multiUpload.runtime='flash';$.multiUpload.instances=[];$.multiUpload._fireEvent=function(na,p1,p2,p3,p4){window.setTimeout(function(){$($.multiUpload.instances).each(function(i,v){$(v).trigger('multiUpload:'+na,[p1,p2,p3,p4]);v.repaint();});},0);};$.extend($.multiUpload.prototype,{getFlash:function(){return $('#flashuploader')[0];},repaint:function(){var up=this,fb=$(up.settings.flash_browse_button),off=fb.offset();up.flashContainer.css({position:'absolute',top:off.top,left:off.left,width:fb.width(),height:fb.height(),backgr2ound:'red'});},init:function(){var up=this,s=up.settings,so,fb;$.multiUpload.instances.push(up);$(up).bind('multiUpload:flashInit',function(e){$(up).trigger('multiUpload:init');});$(document.body).append('
        ');so=new SWFObject("js/jquery/jquery.multiupload.flash.swf","flashuploader","100%","100%","10.0");so.addVariable("file_filter",$.map(up.settings.filter,function(v){return '*.'+v}).join(';'));so.addParam("wmode","transparent");so.write("flashUploaderContainer");up.flashContainer=$('#flashUploaderContainer');$(function(e){up.repaint();});up.repaint();$(up).bind('multiUpload:flashSelectFiles',function(e,sel){$(sel).each(function(i,fo){up.files.push(fo);});$(up).trigger('multiUpload:filesSelected',[{files:sel}]);$(up).trigger('multiUpload:filesChanged');});$(up).bind('multiUpload:flashUploadComplete',function(e,o){var fo;if(fo=up.getFile(o.id)){if(!fo.status){fo.status='completed';$(up).trigger('multiUpload:fileUploaded',[{file:fo,response:o.text}]);}}$(up).trigger('multiUpload:filesChanged');up.uploadNext();});$(up).bind('multiUpload:flashUploadProcess',function(e,pr){var fo=up.getFile(pr.id);if(!fo.status){fo.loaded=pr.loaded;$(up).trigger('multiUpload:fileUploadProgress',[{file:fo,loaded:fo.loaded,total:fo.size}]);}});$(up).bind('multiUpload:flashIOError',function(e,o){var fo;if(fo=up.getFile(o.id)){if(!fo.status){fo.status='failed';$(up).trigger('multiUpload:uploadChunkError',[{file:fo,error:o.message}]);}}});$(up).bind('multiUpload:stopUpload',function(e){up.getFlash().cancelUpload();});$(up).bind('multiUpload:removeFile',function(e,fo){up.getFlash().removeFile(fo.id);});$(up).bind('multiUpload:clearFiles',function(e){up.getFlash().clearFiles();});$(up).bind('multiUpload:uploadFile',function(e,fo){var pageURL=document.location.href.replace(/\/[^\/]+$/g,'/');up.getFlash().uploadFile(fo.id,{upload_url:pageURL+up.settings.upload_url+'&path='+escape(up.settings.path)+'&name='+escape(fo.name),chunk_size:up.settings.chunk_size,file_field:'file0',post_args:{name0:fo.name}});});$(up).bind('multiUpload:flashUploadChunkComplete',function(e,o){var fo=up.getFile(o.id),arg;arg={file:fo,chunk:o.chunk,chunks:o.chunks,response:o.text};if(!fo.status)$(up).trigger('multiUpload:chunkUploaded',[arg]);if(arg.cancel){fo.status='failed';up.getFlash().cancelUpload();}});}});}})(jQuery); function onSilverlightError(sender,args){alert("onSilverlightError: "+args.errormessage);};(function($){function isInstalled(version){var isVersionSupported=false;var container=null;try{var control=null;try{control=new ActiveXObject('AgControl.AgControl');if(version==null)isVersionSupported=true;else if(control.IsVersionSupported(version))isVersionSupported=true;control=null;}catch(e){var plugin=navigator.plugins["Silverlight Plug-In"];if(plugin){if(version===null){isVersionSupported=true;}else{var actualVer=plugin.description;if(actualVer==="1.0.30226.2")actualVer="2.0.30226.2";var actualVerArray=actualVer.split(".");while(actualVerArray.length>3)actualVerArray.pop();while(actualVerArray.length<4)actualVerArray.push(0);var reqVerArray=version.split(".");while(reqVerArray.length>4)reqVerArray.pop();var requiredVersionPart,actualVersionPart,index=0;do{requiredVersionPart=parseInt(reqVerArray[index]);actualVersionPart=parseInt(actualVerArray[index]);index++;}while(index'+''+'
        ');}$(up).bind('multiUpload:slSelectFile',function(e,id,na,sz){var fo={id:id,name:na,size:sz,loaded:0};sel.push(fo);up.files.push(fo);});$(up).bind('multiUpload:slSelectSuccessful',function(){$(up).trigger('multiUpload:filesSelected',[{files:sel}]);$(up).trigger('multiUpload:filesChanged');sel=[];});$(up).bind('multiUpload:slSelectCancelled',function(){$(up).trigger('multiUpload:filesSelectionCancelled',[sel]);sel=[];});$(up).bind('multiUpload:slUploadFileProgress',function(e,id,lod,tot){var file=up.getFile(id);file.loaded=lod;$(up).trigger('multiUpload:fileUploadProgress',[{file:file,loaded:lod,total:tot}]);});$(up).bind('multiUpload:slUploadSuccessful',function(e,id,resp){var fo;if(fo=up.getFile(id)){if(!fo.status){fo.status="completed";$(up).trigger('multiUpload:fileUploaded',[{file:fo,response:resp}]);}}$(up).trigger('multiUpload:filesChanged');up.uploadNext();});$(up).bind('multiUpload:stopUpload',function(e){$.multiUpload.plugin.CancelUpload();});$(up).bind('multiUpload:slUploadChunkSuccessful',function(e,id,chunk,chunks,resp){var fo=up.getFile(id),ar={file:fo,chunk:chunk,chunks:chunks,response:resp};$(up).trigger('multiUpload:chunkUploaded',[ar]);if(ar.cancel){fo.status="failed";$.multiUpload.plugin.CancelUpload();}});$(up).bind('multiUpload:slUploadChunkError',function(e,id,chunk,chunks,err){$(up).trigger('multiUpload:uploadChunkError',[{file:up.getFile(id),chunk:chunk,chunks:chunks,error:err}]);});$(up).bind('multiUpload:selectFiles',function(e){$.multiUpload.plugin.SelectFiles('Files |'+$.map(up.settings.filter,function(v){return '*.'+v}).join(';'));});$(up).bind('multiUpload:removeFile',function(e,fo){$.multiUpload.plugin.RemoveFile(fo.id);});$(up).bind('multiUpload:uploadFile',function(e,fo){$.multiUpload.plugin.UploadFile(fo.id,up.settings.upload_url+'&name='+escape(fo.name)+"&path="+escape(up.settings.path),parseInt(up.settings.chunk_size));});$(up).bind('multiUpload:clearFiles',function(e){$.multiUpload.plugin.ClearFiles();});}});}})(jQuery);(function($){window.UploadDialog={currentWin:$.WindowManager.find(window),init:function(){var t=this,args;t.args=args=$.extend({path:'{default}',visual_path:'/'},t.currentWin.getArgs());t.fileListTpl=$.templateFromScript('#filelist_item_template');$('.uploadtype').html($.translate('{#upload.basic_upload}',0,{a:'','/a':''}));$('#createin').html(args.visual_path);$('form input[name=path]').val(args.path);$('form input[name=file0]').change(function(e){$('form input[name=name0]').val(t.cleanName(/([^\/\\]+)$/.exec(e.target.value)[0].replace(/\.[^\.]+$/,'')));});$('form').submit(function(){$.WindowManager.showProgress({message:$.translate('{#upload.progress}')});});if(document.location.hostname!=document.domain)$('form input[name=domain]').val(document.domain);t.path=args.path;$('#singleupload').click(function(e){$('#multiupload_view').hide();$('#singleupload_view').show();});RPC.exec('fm.getConfig',{path:args.path},function(data){var config=data.result,maxSize,upExt,fsExt,outExt=[],i,x,found;maxSize=config['upload.maxsize'];fsExt=config['filesystem.extensions'].split(',');upExt=config['upload.extensions'].split(',');t.debug=config['general.debug']=="true";t.shouldCleanNames=config['filesystem.clean_names']=="true";t.chunkSize=config['upload.chunk_size']||'1mb';$('#content').show();if($.multiUpload.initialized)$('#multiupload_view').show();else $('#singleupload_view').show();if(config['upload.multiple_upload']!="true"){$('#multiupload_view').hide();$('#singleupload_view').show();}maxSize=maxSize.replace(/\s+/,'');maxSize=maxSize.replace(/([0-9]+)/g,'$1 ');if(upExt[0]=='*')upExt=fsExt;if(fsExt[0]=='*')fsExt=upExt;for(i=0;i');inp=$('#rename').val(parts[1]);t.renameEnabled=1;inp.focus().blur(function(){t.endRename();}).keydown(function(e){var c=e.keyCode;if(c==13||c==27){if(c==13){fo.name=t.cleanName(inp.val())+parts[2];a.html(fo.name);}t.endRename();}});}e.preventDefault();return false;});});up.settings.flash_browse_button='#addmore';up.repaint();$('#filelist')[0].scrollTop=0;});$(up).bind('multiUpload:fileUploaded',function(e,o){$('#'+o.file.id).removeClass('failed').addClass('done');});$(up).bind('multiUpload:filesChanged',function(){calc(up);up.repaint();t.endRename();});$(up).bind('multiUpload:fileUploadProgress',function(e,pr){if(up.status){if(!pr.file.scroll){$('#filelist').scrollTo($('#'+pr.file.id),50);pr.file.scroll=1;}$('#'+pr.file.id+' td.status').html(Math.round(pr.loaded/pr.total * 100.0)+'%');calc(up);}});$(up).bind('multiUpload:chunkUploaded',function(e,o){var res=$.parseJSON(o.response),data=RPC.toArray(res.result);if(data[0]["status"]!='OK'){o.file.loaded=o.file.size;calc(up);$('#'+o.file.id).addClass('failed');$('#'+o.file.id+' td.status').html($.translate(data[0]["message"]));o.cancel=1;}});$(up).bind('multiUpload:uploadChunkError',function(e,o){$('#'+o.file.id).addClass('failed');$('#'+o.file.id+' td.status').html('Failed').attr('title',o.error);});$('#add, #addmore').click(function(e){up.selectFiles();e.preventDefault();return false;});$('#abortupload').click(function(e){up.stopUpload();$.WindowManager.info($.translate('{#upload.cancelled}'),function(){t.currentWin.close();});});$('#uploadstart').click(function(e){$('#uploadstart').parent().hide();$('#status').show();$('#statsrow').hide();$('#files .status').html('-');$('#files .fname a').addClass('disabled');startTime=new Date().getTime();up.startUpload();e.preventDefault();return false;});$('#uploadstop').click(function(e){up.stopUpload();e.preventDefault();return false;});$('#clear').click(function(e){up.clearFiles();$('#files').hide();$('#files tbody').html('');e.preventDefault();return false;});},insertFiles:function(pa,cb){var s=this.currentWin.getArgs();if(s.onupload){RPC.insertFiles({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,paths:pa,insert_filter:s.insert_filter,oninsert:function(o){s.onupload(o);if(cb)cb();}});}},isDemo:function(){if(this.currentWin.getArgs().is_demo){$.WindowManager.info($.translate('{#error.demo}'));return true;}},endRename:function(){if(this.renameEnabled){$('#files input').remove();$('#files a').show();this.renameEnabled=0;}}};window.handleJSON=function(data){window.focus();UploadDialog.handleSingleUploadResponse(data);};$(function(e){UploadDialog.init();});})(jQuery);plugins/filemanager/js/_cache/fm_filemanager.gz000066600000013570150472426320015632 0ustar00L& x:HKLelziVڶZy=YrJr$}OOGT,^z=6ˈIoW 3 :Mц@7dTr!ٶ5 VBjqÑ&{3O;R)K)ozU~7^cKtнA@R5S+zյ(UUoۿ󡓴O33߱ZNg"|&8 &l뿘zo !Է*z%iIĻtS#y~hLdMŜvyL8o{jLnJO[}/2o+s@lOc<) f[ Vn!_ g0Xcq.ïz50zwjbh$.zJLp_cq,\UyYrPilRxQx-kmEdQB74Zß5Qؘ 6zWʉy+y%0%/ٌGU"m6 mꜥM!k$$i|So`ޒw^7t ڈ.vM(szЄk8An}2GZS\ 8 a.~,DGKU+(=\VM8y: (apV޼lw2jE8u,^ כ7Jl;^I_.lV~ʤ: DX~(dr ۛ'nY"F=1N/FZ4)<Ëtw1i."|"*9,dƽbʕrS4:R㌹$ːµs@(UN3r`,*|?;PZ|a{J;%!tx.d!Fx6"Q'R 1C`EQ)t_a?Pͺ1eiwTDnS<vbޡ rF4S[GCCГ`]u v<׻(okҊ7eJjckN\KiZG>6>Dpb5cU2d.tKsV9N c!=K^ʣ۶PʥF+pҸ)/]d};͔FbLE>? xaPRP4W0Xt^˰6!1Y{Z6 n'I,?zw*zɨTŤV+Z=!0ѫ}L \/0b: H3&kKDl)lD;6hqZ__=Qa;Z~Ok {c0<$}GR[xpS&ʧv:J$zʞ ݧeGq:W֮~̊|)U4oQBdc4 ??qo:W-vz Y۴*ccdD'l(@ Po¾_{+-/ bg;_`3l蘛kkغaem%pUdk0X1WU ɦ${?y]L q S3L^|>_b[Kzb):Vs5T˕]^0u Gp 1]MuB`IHn7 D FpLV?Zu ` 'ؐ|"pLZ7$pԡ|"FخD@ə}ϧ"'p5XGaE8*<ޤYETgm z,/[Sla;JZ?aGuu>][+}HA܂_J:|4{4mWhu7zpxx9E}2a$'/#*_{P>bi5hXiaKK>:cU?Ƭ$#&fgf_&++lS m*[0,jI?E ! dNVN5>aV1 ̌E~+p© ħ=xK~gOcbb]N 1K Cl@ڹt1 0N?)Eo. w+5ɯ Ƣ0I2G]tொv+R7e Wj]XCjO=Um,S.&ۤ;@-,%UxYAEhw@=#/R\(E5> ֙H8O^V#ۙA8VtT"Ļ" h* v<-kso)s8&/ "YjPYFOSG%U{$u>Atq9; 6)6fPV1o'T| mfv =>L3 th 7#bSnFI#of}t{^gW&v/ßODI Lb\3x*6<)1M0dD1>{Sk >d ;>gq ||pp2]ˁp.n쨳%SzBfT}D;\8 gJph4'qG04z Kʣu[A G]y2[{!6bbV䱪P?'̆i,~!dzAE. 5En4 PhDq?L,st xl6PR)U8bpjLӞmE"=f MTED8<ϴ8ŀov cH)pX/ G;:EA7{yc^y8>=kk #obV-{*-+}:V %ץ(c$(˃ fc_ޕ'l K-h;0>ƅL4o+A?0}[eG⧽z_WE>šk!(Yuqpи&w~fvbGN]F-D,}5Ə5,c b?'omZ%{5Xp?K%%MI9cǎp%Ao NȦN/g1݊ii/:_9\ 'st#  9Gzlf:$3Ol@n;K RHR?q˶זذCr=`nB΅S?!jABk;e Ke0j8^7z)#Yf51qO|r|:E#R3S2j޳C鐞TmvcSչ@*GuPf|A_8ށE$naGLrֳ5DE; 6]RwÅ=򃅾fzZ_ؼ@)kY&itAg)pQ#u/Ul\îWplugins/filemanager/js/_cache/fm_createdir.js000066600000003577150472426320015324 0ustar00(function($){window.CreateDirDialog={currentWin:$.WindowManager.find(window),init:function(){var t=this,args,cleanNames;args=$.extend({path:'{default}',visual_path:'/'},t.currentWin.getArgs());RPC.exec('fm.getConfig',{path:args.path},function(data){var config=data.result,templates=[],tpl;if(!RPC.handleError({message:'Get config error',visual_path:t.visualPath,response:data})){cleanNames=config['filesystem.clean_names']=="true";$(config['filesystem.directory_templates'].split(/,/)).each(function(i,v){if(v){v=$.trim(v).split('=');templates.push({name: /([^\/]+)$/.exec(v[0])[0],value:v[1]||v[0]});}});if(config['filesystem.force_directory_template']=="true"){$('#template').html('');if(templates.length==1)$('#templaterow').hide();}if(templates.length==0)$('#templaterow').hide();tpl=$.templateFromScript('#template_template');$(templates).each(function(i,v){$('#template').append(tpl,v);});$('#content').show();$('#createin').html(args.visual_path);$('form').submit(function(){var tpl=$('#template').val(),name=$('#dirname').val();if(cleanNames)name=$.cleanName(name);if(!t.isDemo()){RPC.exec('fm.createDirs',{path:args.path,name0:name,template0:tpl},function(data){var res=RPC.toArray(data.result),s=t.currentWin.getArgs();if(!RPC.handleError({message:'{#error.createdir_failed}',visual_path:args.visual_path,response:data})){if(s.oncreate){RPC.insertFile({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,path:res[0].file,progress_message:$.translate("{#message.insert}"),insert_filter:s.insert_filter,oninsert:function(o){s.oncreate(o);t.currentWin.close();}});}}});}return false;});$('#cancel').click(function(){t.currentWin.close();});}});},isDemo:function(){if(this.currentWin.getArgs().is_demo){$.WindowManager.info($.translate('{#error.demo}'));return true;}}};$(function(){CreateDirDialog.init();});})(jQuery);plugins/filemanager/js/_cache/fm_createzip.gz000066600000001072150472426320015340 0ustar00}T]o0+G{ma"ZRt2#i)Q;Iz_TDffvvn`/E6>w:MrjǢ:$eħtP:-J].KvGT~շW߂՝/.wo;6Ȣjp!%g&)LO|]4:շ3M 혜Ԍ6C[]ԋkk EM2kYZ/r,Ct{>1ѹe\/;$.winWidth()?$.winWidth()-m.width():x;y=y+m.height()>$.winHeight()?$.winHeight()-m.height():y;}m.css({left:x,top:y}).click(clickHandler);t.visible=1;$(t).trigger('DropMenu:show');$().trigger('DropMenu:show',[t]);return false;},hide:function(){if(!t.visible)return false;$('a[@rel='+t.id+']').parent().removeClass('active');$().unbind('mouseup',hideHandler);$('#'+t.id).unbind('mouseover',mouseOverHandler).hide();$('#'+t.id).unbind('click',clickHandler);t.visible=0;$.each(t.items,function(){if(this.hide)this.hide();});$(t).trigger('DropMenu:hide');$().trigger('DropMenu:hide',[t]);return false;},add:function(o){o.id=o.id||uniqueId();t.items.push(o);return o;},addSeparator:function(){return t.add({'class':s.separator_class,title:'separator'});},addMenu:function(o){if(!o.onClick)o.onClick=s.onClick;o=new DropMenu(o);o.parentMenu=t;return t.add(o);}});};jQuery.mcDropMenu=DropMenu;jQuery.fn.mcContextMenu=function(s){this.each(function(){var m=new $.mcDropMenu(s);m.render(this);$(this).bind('contextmenu',function(e){return m.show(e.clientX,e.clientY);});});};})(jQuery);(function($){window.BaseManager={currentWin:$.WindowManager.find(window),path:'{default}',visualPath:'',files:[],selectedFiles:[],focusedFile:null,demoMode:false,disabled:{},specialFolders:[],getFile:function(id){var o;$(this.files).each(function(){if(this.id==id)o=this;});return o;},setDisabled:function(v,st){this.disabled[v]=st;if(st)$('#'+v).addClass('disabled').addClass('deactivated');else $('#'+v).removeClass('disabled').removeClass('deactivated');},isDisabled:function(v){return this.disabled[v]?this.disabled[v]:0;},addSpecialFolder:function(o){this.specialFolders.push(o);},isDemo:function(){if(this.demoMode){$.WindowManager.info($.translate('{#error.demo}'));return true;}}};})(jQuery);(function($){window.FileManager=$.extend(BaseManager,{focusedIndex:-1,clipboard:null,access:'',tools:[ 'createdir','edit','createdoc','refresh','zip','upload','rename','cut','copy','paste','delete','view','download','insert','imagemanager','help' ],init:function(){var t=this,args=t.currentWin.getArgs(),uri,chunks;$('#selectall,#unselectall').removeClass('disabled');t.path=args.path||'{default}';t.rootPath=args.rootpath;t.extensions=args.extensions;t.include_file_pattern=args.include_file_pattern;t.exclude_file_pattern=args.exclude_file_pattern;t.include_directory_pattern=args.include_directory_pattern;t.exclude_directory_pattern=args.exclude_directory_pattern;t.remember_last_path=args.remember_last_path;t.urlSuffix='';if(document.domain!=document.location.hostname)t.urlSuffix='?domain='+document.domain;if(args.url){uri=$.parseURI(args.url,{base_url:args.document_base_url||args.default_base_url});if(uri)t.inputURL=uri.path.replace(/\/[^\/]+$/,'');}if(t.rootPath){chunks=t.rootPath.split(/=/);t.rootPathName=chunks.length>1?chunks[0]: /[^\/]+$/.exec(t.rootPath);t.rootPath=chunks[1]||t.rootPath;}t.fileListTpl=$.templateFromScript('#filelist_item_template');t.dirInfoTpl=$.templateFromScript('#dirinfo_template');t.caregoryListTpl=$.templateFromScript('#folders_template');t.previewFileTpl=$.templateFromScript('#preview_file_template');t.pathTpl=$.templateFromScript('#path_template');t.customDirsTpl=$.templateFromScript('#custom_dir_template');$('#filemanagerlist').css('height',$.winHeight()-140);$(window).bind('resize',function(){$('#filemanagerlist').css('height',$.winHeight()-140);});$().bind('action:selectall',function(){t.setFileSelection(0,t.files.length,true);});$().bind('action:unselectall',function(){t.focusFile(0);});$().bind('action:cut',function(){t.setClipBoard({files:t.selectedFiles,action:'cut'});});$().bind('action:copy',function(){t.setClipBoard({files:t.selectedFiles,action:'copy'});});$().bind('action:paste',function(){t.pasteFiles();});$().bind('action:rename',function(){t.renameFile(t.focusedFile);});$().bind('action:delete',function(){t.deleteFiles(t.selectedFiles);});$().bind('action:zip',function(){t.zipFiles();});$().bind('action:sortbyname',function(e){t.updateFileList('name',$(e.target).hasClass('sortasc'));});$().bind('action:sortbysize',function(e){t.updateFileList('size',$(e.target).hasClass('sortasc'));});$().bind('action:sortbytype',function(e){t.updateFileList('type',$(e.target).hasClass('sortasc'));});$().bind('action:sortbymodified',function(e){t.updateFileList('modified',$(e.target).hasClass('sortasc'));});$().bind('action:insert',function(){t.insertFiles();});$().bind('action:download',function(){t.downloadFile(t.focusedFile);});$().bind('action:view',function(){t.viewFile(t.focusedFile);});$().bind('action:createdir',function(){t.createDir();});$().bind('action:edit',function(){t.editFile(t.focusedFile);});$().bind('action:upload',function(){t.uploadFiles();});$().bind('action:createdoc',function(){t.createDoc();});$().bind('action:refresh',function(){t.listFiles();});$().bind('action:help',function(){});$().bind('action:imagemanager',function(){t.imageManager();});$().bind('filemanager:clipboardchanged',function(){if(t.clipboard&&!$('#paste').hasClass('deactivated'))$('#paste').removeClass('disabled');else $('#paste').addClass('disabled');});$().bind('selection:changed',function(){$(['cut','copy','delete','zip']).each(function(i,v){if(t.selectedFiles.length>0&&!$('#'+v).hasClass('deactivated'))$('#'+v).removeClass('disabled');else $('#'+v).addClass('disabled');});});$().bind('filelist:changed',function(){if(t.clipboard&&!$('#paste').hasClass('deactivated'))$('#paste').removeClass('disabled');else $('#paste').addClass('disabled');});$().bind('selection:changed',function(){if(t.focusedFile)$('#previewinfo').html(t.previewFileTpl,t.focusedFile);else $('#previewinfo').html(' ');$(['rename','insert','download','view','edit']).each(function(i,v){if(!t.focusedFile){$('#'+v).addClass('disabled');t.showPreview(0);}else if(!$('#'+v).hasClass('deactivated'))$('#'+v).removeClass('disabled');});if(t.focusedFile&&(!t.focusedFile.custom||!t.focusedFile.custom.editable))$('#edit').addClass('disabled');});$('#selection_actions li, #view_actions li, #tools li, #filemanagerlist a').each(function(i,v){$(v).click(function(e){if(!$(v).hasClass('disabled'))$().trigger('action:'+v.id,e);e.preventDefault();return false;});});$('#filemanagerlist').mousedown(function(e){if(e.shiftKey)e.preventDefault();});$('#filemanagerlist').bind('selectstart',function(e){e.preventDefault();});$('#category_list').click(function(e){var el=e.target;if(el.title)t.listFiles(el.title);e.preventDefault();return false;});$('#special_list').click(function(e){var el=e.target;if(el.title)t.listFiles(el.title);e.preventDefault();return false;});$('#filemanagerlist').click(t.handleSelection);$('#filemanagerlist').dblclick(t.handleSelection);$('#filemanagerlist').bind('contextmenu',t.handleSelection);$('#filemanagerlist').mcContextMenu({constrain:1,setup:function(m){$(m).bind('DropMenu:beforeshow',function(e,m){m.clear();m.add({title:$.translate('{#actions.cut}'),disabled:t.isDisabled('cut')||!t.selectedFiles.length,onclick:function(){t.setClipBoard({files:t.selectedFiles,action:'cut'});}});m.add({title:$.translate('{#actions.copy}'),disabled:t.isDisabled('copy')||!t.selectedFiles.length,onclick:function(){t.setClipBoard({files:t.selectedFiles,action:'copy'});}});m.add({title:$.translate('{#actions.paste}'),disabled:t.isDisabled('paste')||!t.clipboard,onclick:function(){t.pasteFiles();}});m.addSeparator();m.add({title:$.translate('{#actions.edit}'),disabled:!t.focusedFile||(!t.focusedFile.custom||!t.focusedFile.custom.editable)||t.isDisabled('edit')||!t.selectedFiles.length,onclick:function(){t.editFile(t.focusedFile);}});m.add({title:$.translate('{#actions.rename}'),disabled:t.isDisabled('rename')||!t.selectedFiles.length,onclick:function(){t.renameFile(t.focusedFile);}});m.add({title:$.translate('{#actions.deleteit}'),disabled:t.isDisabled('delete')||!t.selectedFiles.length,onclick:function(){t.deleteFiles(t.selectedFiles);}});m.add({title:$.translate('{#actions.zip}'),disabled:t.isDisabled('zip')||!t.selectedFiles.length,onclick:function(){t.zipFiles();}});});}});$().bind('DropMenu:show',function(e,m){$('#'+m.id).css('opacity',0).animate({opacity:0.9},100);});if(t.specialFolders.length){$(t.specialFolders).each(function(i,v){v.title=$.translate(v.title);$('#special_list').append(t.customDirsTpl,v);});$('#special_list').show();}setInterval(function(){RPC.exec('fm.keepAlive',{});},60 * 1000 * 5);},handleSelection:function(e){var t=FileManager,el=e.target,tr=$(el).parents('tr.listrow')[0],idx,type;if(tr&&el.nodeName!='INPUT'){idx=parseInt(tr.id.replace(/[^0-9]+/g,''));t.focusedFile=t.files[idx];type=t.focusedFile.type;$('#file_'+t.focusedIndex).removeClass('focused');if(e.shiftKey)t.setFileSelection(t.focusedIndex,idx,true,1);if($(el).hasClass('checkbox')){if($(tr).hasClass('selected')){$(tr).removeClass('focused');idx=-1;t.focusedFile=null;}else $(tr).addClass('focused');$(tr).toggleClass('selected');t.showPreview(0);}else{if(!e.shiftKey&&(type=='folder'||type=='parent'||type=='zip')&&e.type=='click'){if(type=='zip')t.listFiles('zip://'+t.focusedFile.path);else t.listFiles(t.focusedFile.path);t.showPreview(0);e.preventDefault();return false;}else if(e.type!='dblclick')t.showPreview(t.focusedFile);if(!e.shiftKey&&(e.type!='contextmenu'||!$(tr).hasClass('selected'))){$('#filemanagerlist tbody tr').removeClass('selected');$('#file_'+t.focusedIndex).removeClass('selected');}$(tr).addClass('focused').addClass('selected');}t.selectedFiles=[];$('#filemanagerlist tbody tr.selected').each(function(i,tr){t.selectedFiles.push(t.files[parseInt(tr.id.replace(/[^0-9]+/g,''))]);});t.focusedIndex=idx;$().trigger('selection:changed');if(e.type=='dblclick')t.insertFiles(t.selectedFiles);e.preventDefault();return false;}},createDir:function(){$.WindowManager.open({url:'createdir.html'+this.urlSuffix,width:520,height:320},{is_demo:this.demoMode,path:this.path,visual_path:this.visualPath,oncreate:function(){FileManager.listFiles();}});},createDoc:function(){$.WindowManager.open({url:'createdoc.html'+this.urlSuffix,width:520,height:320},{is_demo:this.demoMode,path:this.path,visual_path:this.visualPath,oncreate:function(){FileManager.listFiles();}});},uploadFiles:function(){$.WindowManager.open({url:'upload.html'+this.urlSuffix,width:550,height:360,scrolling:'no'},{is_demo:this.demoMode,path:this.path,visual_path:this.visualPath,onupload:function(){FileManager.listFiles();}});},zipFiles:function(){var files=[];$(this.selectedFiles).each(function(i,f){files.push(f.path);});$.WindowManager.open({url:'createzip.html'+this.urlSuffix,width:490,height:280},{is_demo:this.demoMode,files:files,path:this.path,visual_path:this.visualPath,oncreate:function(){FileManager.listFiles();}});},editFile:function(fi){$.WindowManager.open({url:'edit.html'+this.urlSuffix,width:750,height:450},{is_demo:this.demoMode,path:fi.path,visual_path:(this.visualPath+'/'+ /[^\/]+$/.exec(fi.path)).replace(/^\/\//,'/'),onsave:function(){FileManager.listFiles();}});},showPreview:function(fi){if(fi&&(!fi.custom||fi.custom.previewable)&&fi.type!='zip')$('#preview').attr('src','../../stream/index.php?cmd=fm.streamFile&path='+encodeURIComponent(fi.path)).css('visibility','visible');else $('#preview').attr('src',"javascript:''").css('visibility','hidden');},deleteFiles:function(fl){var t=this,args={};if(fl){$(fl).each(function(i,v){args['path'+i]=v.path;});$.WindowManager.confirm($.translate('{#message.confirm_delete}'),function(s){if(s){if(!t.isDemo()){RPC.exec('fm.deleteFiles',args,function(data){if(!RPC.handleError({message:'{#error.delete_failed}',visual_path:t.visualPath,response:data}))t.listFiles();});}}});}},pasteFiles:function(){var t=this,args={};if(t.clipboard&&!t.isDemo()){args.topath=t.path;$(t.clipboard.files).each(function(i,v){args['frompath'+i]=v.path;});$.WindowManager.showProgress({message:$.translate("{#message.paste_in_progress}")});if(t.clipboard.action=='cut'){RPC.exec('fm.moveFiles',args,function(data){$.WindowManager.hideProgress();if(!RPC.handleError({message:'{#error.move_failed}',visual_path:t.visualPath,response:data}))t.listFiles();});}else{RPC.exec('fm.copyFiles',args,function(data){$.WindowManager.hideProgress();if(!RPC.handleError({message:'{#error.copy_failed}',visual_path:t.visualPath,response:data}))t.listFiles();});}t.clipboard=null;$().trigger('filemanager:clipboardchanged');}},setClipBoard:function(clip){this.clipboard=clip;$().trigger('filemanager:clipboardchanged',clip);},insertFiles:function(){var t=this,s=t.currentWin.getArgs(),selectedPaths=[];$(t.selectedFiles).each(function(i,v){selectedPaths.push(v.path);});RPC.insertFiles({relative_urls:s.relative_urls,document_base_url:s.document_base_url,default_base_url:s.default_base_url,no_host:s.remove_script_host||s.no_host,paths:selectedPaths,insert_filter:s.insert_filter,progress_message:$.translate("{#message.insert}"),oninsert:function(o){if(s.oninsert){$(o.files).each(function(i,v){if(v.path==t.focusedFile.path)o.focusedFile=v;});s.oninsert(o);}t.currentWin.close();}});},renameFile:function(f){var t=this,inp,ext='',ma;t.curRenameFile=f;inp=$.createElm('input',{id:f.id+'_rename',type:"text","class":"text","value":f.name.replace(/\.[^\.]+$/,'')});$('#'+f.id+' td.file').append(inp).find('a').hide();if(ma= /\.[^\.]+$/.exec(f.name))ext=ma[0];inp.focus().blur(function(){t.endRename();}).keyup(function(e){var c=e.keyCode,na;if(c==13||c==27){if(c==13){if(!t.isDemo()){na=inp.val();if(t.shouldCleanNames)na=$.cleanName(na);RPC.exec('fm.moveFiles',{frompath0:f.path,toname0:na+ext},function(data){if(!RPC.handleError({message:'{#error.rename_failed}',visual_path:t.visualPath,response:data}))t.listFiles();});}}t.endRename();}})},endRename:function(){var td;if(this.curRenameFile){td=$('#'+this.curRenameFile.id+' td.file');td.find('input').remove();td.find('a').show();}},listFiles:function(p,col,des){var t=this,args=t.currentWin.getArgs();t.path=p||t.path;$('#dirinfo').hide();$('#progress').show();$('#filelist').html('');t.showPreview(0);RPC.exec('fm.listFiles',{path:t.path,root_path:t.rootPath,url:t.inputURL,extensions:t.extensions,include_file_pattern:t.include_file_pattern,exclude_file_pattern:t.exclude_file_pattern,include_directory_pattern:t.include_directory_pattern,exclude_directory_pattern:t.exclude_directory_pattern,config:'general,filesystem,imagemanager',remember_last_path:t.remember_last_path},function(data){var header,cfg,disabled,visible,argTools,argDisabledTools;if(!RPC.handleError({message:'List files error',visual_path:t.visualPath,response:data})){header=data.result.header;cfg=data.result.config;t.access=header.attribs;t.visualPath=header.visual_path;t.imageManagerURL=cfg['imagemanager.urlprefix'];t.demoMode=cfg['general.demo']=="true";t.path=header.path;function explode(s){return s?s.replace(/\s+/g,'').split(','):s;};t.shouldCleanNames=cfg['filesystem.clean_names']=="true";disabled=explode(cfg['general.disabled_tools']);visible=explode(cfg['general.tools']);if(argDisabledTools=explode(args.disabled_tools))disabled=jQuery.merge(argDisabledTools,disabled);if(argTools=explode(args.tools)){$(argTools).each(function(i,v){if(!$.inArray(v,visible))visible.push(v);});visible=$.grep(visible,function(v){return $.inArray(v,argTools);});}$(t.tools).each(function(i,v){var li=$('#'+v);t.setDisabled(v,$.inArray(v,disabled)!=-1);if($.inArray(v,visible)!=-1)li.show();else li.hide();});$('#tools').show();$('#progress').hide();$('#curpath').html(t.pathTpl,header).attr("title",t.visualPath);t.files=RPC.toArray(data.result);t.updateFileList(col,des);$().trigger('filelist:changed');}});},updateFileList:function(col,des){var t=this,info={dirs:0,files:0,filesize:0,access:t.access},co=0,fileLst;col=col||'name';$('thead a.sortdesc').removeClass('sortdesc');$('thead a.sortasc').removeClass('sortasc');$('#sortby'+col).removeClass('sort'+(des?'asc':'desc'));$('#sortby'+col).addClass('sort'+(des?'desc':'asc'));t.endRename();t.focusedIndex=-1;t.focusedFile=null;t.selectedFiles=[];$().trigger('selection:changed');this.files=$(this.files).sortArray(col,des);this.files=$.grep(this.files,function(v){return v.type=='folder'||v.type=='parent';}).concat($.grep(this.files,function(v){return v.type!='folder'&&v.type!='parent';}));$('#filelist').html('');$(this.files).each(function(i,f){if(f.type!='parent'){if(f.type=='folder')info.dirs++;else info.files++;if(f.size!=-1)info.filesize+=f.size;}f.id='file_'+i;});$('#dirinfo').html(t.dirInfoTpl,info);$('#dirinfo').show();fileLst=$('#filelist');$(this.files).each(function(){fileLst.append(t.fileListTpl,this);});},downloadFile:function(f){if(f.type!='folder'&&f.type!='parent')$('#preview').attr('src','../../stream/index.php?cmd=fm.download&path='+encodeURIComponent(f.path));},viewFile:function(f){if(f.type!='folder'&&f.type!='parent'&&f.type!='zip')window.open('../../stream/index.php?cmd=fm.streamFile&path='+encodeURIComponent(f.path),'View');},imageManager:function(){var suf;if(this.imageManagerURL.indexOf('?')!=-1)suf=this.urlSuffix.replace(/\?/,'&');document.location=this.imageManagerURL+suf;},focusFile:function(f){var t=this;if(f&&f.type=='parent')return;$('#filemanagerlist tbody tr').removeClass('selected').removeClass('focused');if(!f){t.selectedFiles=[];t.focusedFile=null;t.focusedIndex=-1;$().trigger('selection:changed');t.showPreview(0);return;}t.focusedIndex=f.index;t.focusedFile=f;t.selectedFiles=[f];$().trigger('selection:changed');$('#'+f.id).addClass('selected focused');t.showPreview(f);},setFileSelection:function(st,en,ck,nup){var t=this,i;function sel(v,i){if(v&&v.type!='parent'){v=$('#file_'+i);if(ck)v.addClass('selected');else if(!v.hasClass('focused'))v.removeClass('selected');}};for(i=st;i0[mHR .G{R+3*QcܥRJ[qpQhq"9r%̅SZpMVB9&ѱB$*"\[.P]-|]&sєX\#dy~ÏҿhKMj40Od2( W%",~Ȕy!1`#z6 /Ʋ7FheU@\n<\ҽ8pnq;8񭷍+wuYm,.9cBhHndo)8 RWkf> *4Nb(XorQ:9`VIiZKU5)x%Cw ;y/.>8~`?~i}ߖ1N plugins/filemanager/js/default.php000066600000000046150472426320013261 0ustar00plugins/filemanager/js/mcfilemanager.js000066600000015700150472426320014257 0ustar00/** * $Id: mcfilemanager.js 634 2009-01-08 16:52:45Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2008, Moxiecode Systems AB, All rights reserved. */ (function() { window.mcFileManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'file' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; idispatchEvent("onPreInit", array($type)); $mcConfig = $man->getConfig(); if ($package) { $compressor = new Moxiecode_JSCompressor(array( 'expires_offset' => 3600 * 24 * 10, 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'name' => $theme . "_" . $package )); require_once('../classes/Utils/ClientResources.php'); $resources = new Moxiecode_ClientResources(); // Load theme resources $resources->load('../pages/' . $theme . '/resources.xml'); // Load plugin resources $plugins = explode(',', $mcConfig["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); $files = $resources->getFiles($package); if ($resources->isDebugEnabled() || checkBool($mcConfig["general.debug"])) { header('Content-type: text/javascript'); $pagePath = dirname($_SERVER['SCRIPT_NAME']); echo "// Debug enabled, scripts will be loaded without compression\n"; echo "(function() {\n"; echo "var h = '';\n"; foreach ($files as $file) echo 'h += \'\';' . "\n"; echo "document.write(h);\n"; echo "})();\n"; } else { foreach ($files as $file) $compressor->addFile($file->getPath(), $file->isRemoveWhiteSpaceEnabled()); $compressor->compress($package); } die; } ?>plugins/filemanager/default.php000066600000000044150472426320012643 0ustar00plugins/filemanager/rpc/rpc.php000066600000006316150472426320012577 0ustar00decode($raw); // Parse prefix and method $chunks = explode('.', $input['method']); $type = $chunks[0]; $input['method'] = $chunks[1]; // Clean up type, only a-z stuff. $type = preg_replace("/[^a-z]/i", "", $type); if ($type == "") die('{"result":null,"id":null,"error":{"errstr":"No type set.","errfile":"","errline":null,"errcontext":"","level":"FATAL"}}'); // Include Base and Core and Config. $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $mcConfig =& $man->getConfig(); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch onInit event if ($man->isAuthenticated()) { $man->dispatchEvent("onBeforeRPC", array($input['method'], $input['params'][0])); $result = new stdClass(); $result->result = $man->executeEvent("onRPC", array($input['method'], $input['params'][0])); $result->id = $input['id']; $result->error = null; $data = $json->encode($result); //header('Content-Length: ' . strlen($data)); die($data); } else die('{"result":{"login_url":"' . addslashes($mcConfig["authenticator.login_page"]) . '"},"id":null,"error":{"errstr":"Access denied by authenicator.","errfile":"","errline":null,"errcontext":"","level":"AUTH"}}'); ?>plugins/filemanager/rpc/default.php000066600000000042150472426320013425 0ustar00plugins/filemanager/rpc/index.php000066600000000042150472426320013110 0ustar00plugins/filemanager/mime.types000066600000001672150472426320012533 0ustar00# # Mime types/Content Types for some common file extensions. (Apache style file format) # application/msword doc dot application/pdf pdf application/pgp-signature pgp application/postscript ps ai eps application/rtf rtf application/smil smi smil application/vnd.ms-excel xls xlb application/vnd.ms-powerpoint ppt pps pot application/zip zip application/x-java-archive jar application/x-javascript js application/x-shockwave-flash swf swfl application/vnd.openxmlformats docx pptx xlsx audio/x-pn-realaudio ra rm ram audio/mpeg mpga mpega mp2 mp3 audio/x-wav wav image/bmp bmp image/gif gif image/jpeg jpeg jpg jpe image/png png image/svg+xml svg svgz image/tiff tiff tif text/html htm html xhtml text/rtf rtf video/mpeg mpeg mpg mpe video/quicktime qt mov video/x-flv flv video/vnd.rn-realvideo rv text/plain asc txt text diff log plugins/filemanager/language/fm/fr.xml000066600000015046150472426320014034 0ustar00

        Francis THOMAS (frato@lecentre.net) This is the french language pack for the MCFileManager.
        Ce fichier existe dj. Le fichier source n'existe pas. Cette action est limite en mode dmonstration. Nom du fichier non valide. Vous n'avez pas de droits en criture sur ce fichier/dossier. La copie a choue. Le dplacement a chou. Template introuvable. La cration du document a choue. Vous ne disposez pas des droits pour raliser cette action. Ce fichier existe dj. L'envoi a chou, vrifiez les droits d'criture sur le dossier. La taille maximum est dpasse. Ce fichier n'existe pas. La suppression a choue. Le dossier existe dj. Aucun systme de fichier n'a t trouv. La cration du dossier a choue. La cration du zip a choue. Le changement de nom a chou. Zip termin. Copie termin. Dplacement termin. Le document a t cr. Suppression termine. Dossier cr. Keepalive Envoi termin. Voulez-vous vraiment couper les fichiers slectionns ? Voulez-vous vraiment copier les fichiers slectionns ? Voulez-vous vraiment coller les fichiers coups/copis ? Voulez-vous vraiment supprimer les fichiers slectionns ? Chargement du fichier, patientez... Collage en cours, patientez... Crer dossier Nouveau fichier Aide Rafrachir Upload dossier slectionn Image manager Moxiecode Gestionnaire de fichiers Ok Oui Non Crer Catgories Prvisualisation Favoris Historique Insrer Tlcharger Renommer Couper Copier Coller Supprimer Zipper Afficher Tout cocher Tout dcocher Ajouter aux favoris Supprimer des favoris Nom du fichier Taille Type Date de modification Avec la slection : Dossiers : Fichiers : Taille du fichier : accs : Chargement... Crer dossier Insrez le nom du dossier que vous voulez crer. Template : -- template -- Nom du dossier : Crer dans : Cration du dossier, patientez... Crer document Remplissez le formulaire pour crer un document depuis le template. Template : -- template -- Nom Chemin Prvisualisation Upload Utilisez le formulaire pour uploader des fichiers. Extensions valides : Taille max : Fichiers uploader : Comme : Chemin : Upload Parcourir Upload en cours, patientez... Crer un zip Nom du fichier zip crer. Nom : Chemin Insrer un fichier plugins/filemanager/language/fm/el.xml000066600000021552150472426320014024 0ustar00
        Dimitris Giannitsaros / MediSign SA This is the Greek language pack for the MCFileManager.
        HTML Script Flash Powerpoint Office Adobe acrobat Excel XML Moxiecode Moxiecode . / ; ; ; ; ;\n , . zip. Upload Download / / / / / / : / {path} . : /. : {path} , . / . : . : : : : : : : : : . / / : : : / . . : -- -- : : : . : . : . : .\\n : :; : . . : -- -- . : : : . : . : . : .\\n : ;. : . Upload upload . Upload : : : upload: : upload. Upload : . : . Remove zip . zip: : : CSize zip zip . zip : : .
        plugins/filemanager/language/fm/ru.xml000066600000146330150472426320014054 0ustar00
        dial.su Это Русский языковой пакет для TinyMCE
        требуется использовать WYSIWYG режим для этого поля? Применить Вставить Обновить Отменить Закрыть Просмотр Класс - не выбрано - Копировать / Вырезать / Вставить (не доступно в Mozilla и Firefox) \ n Вам интересная информация об этом? В данный момент не поддерживается Вашим браузером, используйте горячие клавиши 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 Ошибка: Введен ошибочное значение, отмечено красным Больше цветов Жирный (Ctrl + B) Курсив (Ctrl + I) Подчеркнутый (Ctrl + U) Зачеркнутый Список Список нумерованный Отменить (Ctrl + Z) Вернуть (Ctrl + Y) Удалить лишний код Стили Размер шрифта Шрифт Формат Абзац Div Стиль адреса Предварительно форматированный Заголовок 1 Заголовок 2 Заголовок 3 Заголовок 4 Заголовок 5 Заголовок 6 Цитата Код Пример кода Справочник термин Справочник описание Жирный (Ctrl + B) Курсив (Ctrl + I) Подчеркнутый (Ctrl + U) Зачеркнутый По левому краю По центру По правому краю По ширине Список Нумерованный список Уменьшить отступ Увеличить отступ Отменить (Ctrl + Z) Вернуть (Ctrl + Y) Вставить / изменить ссылку Удалить ссылку Добавить / изменить изображение Очистить лишний код Изменить HTML код Нижний индекс Верхний индекс Вставить горизонтальный разделитель Очистить форматирование Ваш произвольный описание здесь Выберите цвет текста Выберите цвет фона Вставить символ Toggle guidelines / invisible elements Добавить / изменить якорь Вырезать Копировать Вставить Свойства изображения Новый документ Помощь Цитата Копировать / Вырезать / Вставить (не доступно в Mozilla и Firefox) \ n Вам интересная информация об этом? Путь Вы уверены, что хотите все удалить? Перейти на панель кнопок - Alt + Q, Перейти к редактору - Alt-Z, Перейти на элемент пути - Alt-X Больше цветов О продукте TinyMCE О продукте ... Помощь Лицензия Плагины Плагин Автор Версия Загруженные плагины Добавить / изменить якорь Имя якоря Редактор HTML кода Переносить слова Выберите цвет Пипетка Пипетка цвета Палитра Палитра цветов По названию По названию Цвет: Наименование: Выбрать произвольный символ Добавить / изменить изображение Адрес Описание Список изображений Граница Размеры Верт. отступление Гориз. отступление Выравнивание По базовой линии По верхнему краю По центру По нижнему краю По верхнему краю текста По нижнему краю текста По левому краю По правому краю Добавить / изменить ссылку Адрес ссылки Открыть в ... этом же окне новом окне Заголовок Введенный URL похож на email адрес, вы хотите добавить необходимый префикс mailto:? Введенный URL похож на внешнюю ссылку, вы хотите добавить необходимый префикс http://? Список ссылок Выравнивание По левому краю По центру По правому краю По ширине % d.% m.% Y % H:% M:% S Вставить дату Вставить время январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь январь, февраль, март, апрель, май, июнь, июль, август, Сентябрь, Октябрь, Ноябрь, Декабрь воскресенье, понедельник, вторник, среда, четверг, пятницу, субботу, воскресенье Вс, Пн, Вт, Ср, Чт, Пт, Сб, Вс Печать Просмотр Направление слева направо Направление справа налево Вставить новый слой Вверх Переместить назад Toggle absolute positioning Новый слой ... Сохранить Отменить все изменения Вставить неразрывный пробел Запустить орфографию ieSpell не найдено. Хотите проинсталлировать? Горизонтальный разделитель Ширина Высота Без тени Смайлики Вставить смайл Смайлики Cool Cry Embarassed Foot in mouth Frown Innocent Kiss Laughing Money mouth Sealed Smile Surprised Tongue out Undecided Wink Yell Найти Найти / Заменить Найти еще Поиск завершен. Поисковый ряд не найден Найти Найти / Заменить Все вхождения строки были заменены Найти Заменить на Направление Вверх Вниз Учитывать регистр Найти далее Заменить Заменить все Вставить / изменить изображение 200 Общее Вид Дополнительно Общее Заголовок Просмотр Сохранять пропорции Направление языка Код языка Long description link Стиль Классы Слева направо Справа налево Id Image map Swap image Альтернативное изображение при наведении при отводе Другое Вид просмотра изображения 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 Добавить / изменить изображение Адрес изображения Описание Список изображений Граница Размеры Верт. отступ Гориз. отступ Выравнивание По базовой линии По верхнему краю По центру По нижнему краю По верхнему краю текста По нижнему краю текста По левому краю По правому краю Список изображений Вставить / изменить ссылку 200 Вставить / изменить ссылку Адрес Открыть в ... Заголовок Введенный URL похож на email адрес, вы хотите добавить необходимый префикс mailto? Введенный URL похож на внешнюю ссылку, вы хотите добавить необходимый префикс http://? Список ссылок Общее Popup События Дополнительно Общие свойства Свойства Popup События Расширение свойства Свойства Якоря Открыть в этом же окне / фрейме Открыть в родительском окне / фрейме Открыть в верхнем фрейме (заменить все фреймы) Открыть в новом окне Javascript popup Popup URL Название окна Вставить 'return false' Показывать скроллеры Показывать статус Показывать панели инструментов Показывать меню Показывать панель location Разрешать изменять размер Dependent (только для Mozilla / Firefox) Размер Позиция (X / Y) Id Стиль Классы Target name Направление языка Target language Код языка Target character encoding Target MIME type Relationship page to target Relationship target to page Tabindex Accesskey Слева направо Справа налево Список ссылок Citation Abbreviation Acronym Deletion Insertion Вставить / изменить атрибуты Заголовок ID Класс Стиль Цитата Дата / Время Направление текста Слева направо Справа налево Язык TabIndex AccessKey События Атрибуты Общее Атрибуты События Общие настройки Element Attributes Element Events Insertion Element Deletion Element Acronym Element Abbreviation Element Citation Element Удалить Вставить текущую дату / время Слева направо Справа налево Вставить / изменить атрибуты Редактировать CSS стиль Редактирование CSS стиля Применить Текст Фон Блок Box Граница Список Позиционирование Текст Шрифт Размер Толщина Стиль Variant Высота строки Case Цвет Оформление верхняя черта нижняя черта зачеркнутый мерцания ничего Цвет фона Фоновое изображение Повтор Attachment Горизонтальная позиция Вертикальная позиция Отступы между словами Отступы между буквами Вертикальное выравнивание Выравнивание текста Text indent Whitespace Display Ширина Высота Float Clear Padding Одинаково для всех Вверх Справа Снизу Слева Margin Стиль Ширина Высота Цвет Тип Bullet image Позиция Тип Видимость Z-index Overflow Placement Clip Вставить как текст Вставить из Word Выделить все Используйте CTRL + V для вставки текста в окно Сохранить переносы строк Используйте CTRL + V для вставки текста в окно Вставить новую таблицу Вставить строку до Добавить строку после Удалить строку Добавить столбец до Добавить столбец после Удалить столбец Разделить ячейки Объединить ячейки Свойства строке таблицы Свойства ячейки таблицы Свойства таблицы Вставить строку до Вставить строку после Вырезать строку таблицы Копировать строку таблицы Удалить таблицу Строка Поле Ячейка 30 Общее Дополнительно Общие свойства Расширенные свойства Row in table part Добавление / Изменение таблицы Ширина Высота Столбцы Сроки Расстояние между ячейками Отступы в ячейках Граница Выравнивание По умолчанию По левому краю По правому краю По центру Свойства строке таблицы Свойства ячейки таблицы Тип ячейки Вертикальное выравнивание По верхнему краю По нижнему краю цвет границы цвет фона Объединить ячейки Id Стиль Направление языка Код языка Target MIME-тип Слева направо Справа налево Фоновое изображение Общее Данные Заголовок Обновить текущую ячейку Обновить все ячейки в строке Обновить все ячейки в таблице Обновить текущую строку Обновить нечетные строки в таблице Обновить четные строки в таблице Обновить все строки в таблице Заголовок таблицы Тело таблицы Нижняя частсина Scope Row Group Col Group You've exceeded the maximum number of columns of ($ cols) You've exceeded the maximum number of rows of ($ rows) You've exceeded the maximum number of cells of ($ cells) 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 caption Фрейм none groups rows cols all Rules void above below hsides lhs rhs vsides box border Изменения, которые вы сделали, будут потеряны, если вы перейдете с этой страницы. Переключиться на весь экран Вставить / редактировать embedded media Редактировать embedded media Вставить / редактировать embedded media Общее Дополнительно Файл / URL Список Размеры Просмотр Сохранять пропорции Тип Id Название Класс верт.видступ гор.видступ Автоплей Луп Показывать меню Качество Scale Align SAlign WMode Фон Base Flashvars SWLiveConnect AutoHREF Кэш Hidden Controller Kiosk mode Play every frame Target cache No correction Enable JavaScript Start time End time Href Choke speed Target Громкость Автостарт Enabled Fullscreen Invoke URLs Mute Stretch to fit Windowless video Баланс Base URL Captioning id Current marker Current position Default frame Play count Rate UI Mode Flash options Quicktime options Windows media player options Real media player options Shockwave options Auto goto URL Center Image status Maintain aspect No java Prefetch Shuffle Console Num loops Controls Script callbacks Stretch style Stretch H-Align Stretch V-Align Sound Progress QT Src Streamed rtsp resources should be added to the QT Src field under the advanced tab \ nYou should also add a non streamed version to the Src field .. Top Right Bottom Left Center Top left Top right Bottom left Bottom right Flash video options Scale mode Buffer Start image Start time Default volumne Hidden GUI Auto start Loop Show scale modes Smooth video JS Callback Свойства документа Свойства документа Общее Вид Дополнительно Цель информации Язык и кодирования Заголовок Ключевые слова Описание Работы Doctype Код языка Направление языка Слева направо Справа налево XML declaration Кодировка Свойства фона Отступы Цвет ссылок Свойства текста Цвет фона Фоновое изображение Отступ слева Отступ справа Отступ сверху Отступ снизу Цвет текста Размер шрифта Шрифт Цвет ссылки Цвет ссылки при наведении Цвет нажатой ссылки Цвет активной ссылки Цвет Размер шрифта Семейство шрифта Index and follow the links Index and don't follow the links Do not index but follow the links Do not index and don \ 't follow the links Stylesheet and style properties Stylesheet Стиль Автор Копирайт Добавить новый элемент Удалить выделенный элемент Переместить элемент вверх Переместить элемент вниз Head elements Информация Title element Meta element Script element Style element Link element Base element Comment node Title element Script element Style element Base element Link element Meta элемент Комментарий Src Язык Href Target Type Charset Defer Media Properties Название Значение Содержание Rel Rev Href lang Общее Дополнительно Вставить шаблонный контент Шаблоны Шаблон Описание Вставить шаблонный контент Выберите шаблон Просмотр Внимание: обновления шаблона на другой может привести к потерям данных % Y-% m-% d% H:% M:% S % Y-% m-% d% H:% M:% S январь, февраль, март, апрель, май, июнь, июль, август, сентябрь, октябрь, ноябрь, декабрь январь, февраль, март, апрель, май, июнь, июль, август, Сентябрь, Октябрь, Ноябрь, Декабрь воскресенье, понедельник, вторник, среда, четверг, пятницу, субботу, воскресенье Вс, Пн, Вт, Ср, Чт, Пт, Сб, Вс Visual control characters on / off Переключить проверку Настройки проверки Игнорировать слово Игнорировать все Языки Пожалуйста, подождите ... Варианты Нет вариантов Ошибок не найдено Вставить разделитель страницы
        plugins/filemanager/language/fm/de.xml000066600000020034150472426320014006 0ustar00
        Moxiecode Systems AB / Translated by Markus Vetten This is the german language pack for the MCFileManager.
        Die Datei existiert bereits. Die Ausgangsdatei existiert nicht. Diese Option steht in der DEMO-Version nicht zur Verfgung. Der Dateiname ist ungltig. Es besteht kein Schreibzugriff auf die Datei/das Verzeichnis. Der Kopiervorgang ist fehlgeschlagen. Der Verschiebungsvorgang ist fehlgeschlagen. Die Ausgabeschablone konnte nicht gefunden werden. Die Datei konnte nicht erstellt werden. Sie haben nicht die ntigen Zugriffsrechte, um diese Aktion durchzufhren. Diese Datei existiert bereits. Der Hochladevorgang ist fehlgeschlagen, bitte prfen Sie die Schreibberechtigungen. Die maximale Dateigre wurde berschritten. Diese Datei existiert nicht. Der Lschvorgang ist fehlgeschlagen. Dieses Verzeichnis existiert bereits. Es konnte kein Dateisystem ermittelt werden. Das Verzeichnis konnte nicht erstellt werden. Die ZIP-Datei konnte nicht erstellt werden. Die Datei konnte nicht umbenannt werden. Die ZIP-Datei wurde erstellt. Der Kopiervorgang war erfolgreich. Der Verschiebungsvorgang war erfolgreich. Die Datei wurde erstellt. Der Lschvorgang war erfolgreich. Das Verzeichnis wurde erstellt. Ihre derzeitige Sitzung ist dabei auszulaufen. Der Hochladevorgang war erfolgreich. Sind Sie sicher, dass Sie die ausgewhlten Dateien ausschneiden mchten? Sind Sie sicher, dass Sie die ausgewhlten Dateien kopieren mchten? Sind Sie sicher, dass Sie die zuvor ausgeschnittenen bzw. kopierten Dateien hier einfgen mchten? Sind Sie sicher, dass Sie die ausgewhlten Dateien lschen mchten? Rufe Dateiinformationen ab, bitte warten... Verschiebungsvorgang luft, bitte warten... Verzeichnis erstellen Neue Datei Hilfe Aktualisieren Hochladen Ausgewhltes Verzeichnis Bilderverwaltung Dateiverwaltung Ok Ja Nein Erstellen Kategorien Vorschau Favoriten Verlauf Einfgen Herunterladen Umbenennen Ausschneiden Kopieren Einfgen Lschen zu ZIP-Archiv hinzufgen Ansehen alle auswhlen Auswahl aufheben Als Favorit eintragen Als Favorit entfernen Name Gre Typ nderungsdatum Operation: Verzeichnisse: Dateien: Dateigre insgesamt: Zugriffsrechte: Laden... Verzeichnis erstellen Geben Sie den Namen fr das Verzeichnis an, welches Sie erstellen mchten. Vorlage: -- Vorlage auswhlen -- Verzeichnisname: erstellen in: Erstelle Verzeichnis, bitte warten... Datei erstellen Fllen Sie das Formular aus, um eine Datei von einer Vorlage aus zu erstellen. Vorlage: -- Vorlage auswhlen -- Name Pfad Vorschau Hochladen Benutzen Sie dieses Formular, um Dateien hochzuladen. Zugelassene Dateiendungen: Maximale Dateigre: Datei: Name: Pfad: Hochladen Datei hinzufgen Lade Datei hoch, bitte warten... Archiv erstellen Geben Sie den Namen des Archivs an, das Sie erstellen mchten. Name: Pfad: Datei einfgen
        plugins/filemanager/language/fm/es.xml000066600000022316150472426320014032 0ustar00
        Moxiecode Systems AB Este es el paquete de lenguaje en espaol de MCFileManager.
        Archivo Ejecutable Archivo de Imagen Archivo Comprimido Archivo HTML o Script Archivo Media Archivo de sonido Archivo Flash Archivo Powerpoint Archivo de Documento Office documento Archivo Adobe acrobat Archivo Excel Archivo de texto Archivo XML Moxiecode File Browser Moxiecode File Browser Nombre de Archivo Tamao Fecha de Modificacin Est seguro de cortar y mover los archivos seleccionados? Est seguro de copiar los archivos seleccionados? Est seguro de colocar los archivos seleccionados del porta papeles? Est seguro de borrar los archivos seleccionados? Est seguro descomprimir el archivo seleccionado?\n Si el archivo comprimido es demasiado grande, la accin llevar su tiempo. Los siguientes archivos han sido borrados debido a que nos son archivos comprimidos (zip). Crear Directorio Crear Archivo Actualizar Subir nuevo archivo Descargar archivos seleccionados Propiedades de Archivo/Directorio Cortar archivos/directorios seleccionados Copiar archivos/directorios seleccionados Pegar archivos/directorios seleccionados Borrar archivos/directorios seleccionados Descomprimir el archivo seleccionado Comprimir los archivos/directorios seleccionados Cambiar a ImageManager Directorio Directorio Raz Toggle todos Error: El archivo/directorio {path} ya existe. Error: No tiene acceso a borrar Archivo o Directorios. Error: El directorio {path} No ha podido ser borrado, no est vaco. Informacin de Archivo / Directorio Informacin de Directorio Informacin de Archivo Fecha de creacin: Fecha de Modificacin: Acceso: Directorio: Subdirectorios: Archivos: Tamao total: Nombre: Tamao: descripcin: Previzualizar No puede previsualizarse. Seleccionar Ver Lectura No lectura Escritura No escritura Propiedades de Archivo / Directorio Propiedades de Archivo / Directorio Propiedades en: Nombre: Salvar Cancelar Error: Un archvio o directorio con el nombre especificado ya existe. Crear directorio Inserte el nombre del directorio que desea crear. Plantilla: -- Seleccionar Plantilla -- Nombre del Directorio: Crear en: Crear Cancelar Error: Debe especificar un nombre. Error: Debe seleccionar una plantilla. Error: La plantilla seleccionada no pudo ser localizada. Error: El nombre del directorio que intenta crear es invlido.\\nincluye caracteres no validos tales como: :; Error: El nombre del directorio especificado ya existe. Crear documento Llene la forma para crear un nuevo documento a partir de la plantilla. Plantilla: -- Seleccionar Plantilla -- Debe escribir un nombre de archivo para el nuevo documento. Nombre de Archivo: Crear en: Crear Cancelar Error: Debe especificar el nombre del documento. Error: Debe seleccionar una plantilla. Error: La plantilla seleccionada no pudo ser encontrada. Error: El nombre del archivo que intenta crear es invlido.\\nincluye caracteres no validos tales como: :;. Error: El nombre del archivo ya existe. Subir Use la forma para subir archivos. Subir a: Extensiones Validas: Mximo tamao permitido: Archivo para subir: Con nombre de archivo: Debe escribir un nombre de archivo para el archivo que desea subir. Subir Agregar Casilla Cancelar Error: El archivo que intenta subir ya existe. Error: El archivo que intenta subir sobrepasa el lmite del tamao permitido. Quitar Resumen de archivo comprimido Resumen de los archivos comprimidos seleccionados. Nombre del archivo comprimido: Carpeta actual: Archivos re-escribidos: Nombre Tamao Ctamao Existe Estatus Creado Descomprimir Cancelar Atrs Cerrar Aceptado Denegado Pasado Fallido Si No Crear zip Escriba el nombre del archivo zip que desea crear. El archivo zip ser creado en: Nombre: Debe escribir un nombre. Crear Cancelar
        plugins/filemanager/language/fm/ja_utf-8.xml000066600000022201150472426320015031 0ustar00
        Moxiecode Systems AB This is the japanese language pack for the MCFileManager.
        ファイル イメージファイル ZIPファイル HTMLファイル 映画 音声ファイル Flashファイル PowerPoint ドキュメントファイル ワードファイル PDF Excelファイル テキストファイル XMLファイル ファイル・ブラウザ ファイル・ブラウザ ファイル名 サイズ 更新日時 選択したファイルを切り取り? 選択したファイルをコピー? 貼り付けしますか? 選択したファイルを削除? 本当に選択されたファイルをunzipする?\nファイルが大きならば、時間がかかります。 次のファイルがzip形式ではないので外しました。 フォルダを新規作成 ファイルを新規作成 更新 ファイルをアップロード 選択したフィルをダウンロード ファイル・フォルダのプロパティ 選択したものを切り取り 選択したものをコピー 貼り付け 選択したものを削除 選択されたファイルをunzipする 選択されたファイルやフォルダをzipする 映像管理に行く フォルダ 上のフォルダ 全部をトグル エラー {path} がすでに存在する エラー:アクセス権利がないので、削除できない。 エラー: {path} が空ではないので、削除できない ファイル・フォルダの情報 フォルダ情報 ファイル情報 作成日時: 更新日時: アクセス: フォルダ: サッブフォルダ: ファイル: 合計ファイルサイズ: ファイル名: ファイルサイズ: ファイル説明: 下見 下見がない 選択 表示 読込み可 読込み不可 書込み可 書込み不可 ファイル・フォルダのプロパティ ファイル・フォルダのプロパティ プロパティ有効: 名前: 保存 キャンセル エラー:そのファイルやフォルダがすでに存在する フォルダ新規作成 フォルダ名 テンプレート: -- テンプレートを選択 -- フォルダ名: 作成先: 作成 キャンセル エラー:名前を設定していない エラー:テンプレートを設定していない エラー:テンプレートが見つからない エラー:フォルダ名が無効 エラー:そのフォルダがすでに存在する ファイル新規作成 テンプレートから作成 テンプレート: -- テンプレートを選択 -- ファイル名を記入する必要がある ファイル名: 作成先: 作成 キャンセル エラー:ファイル名が必要 Error: You must select a template. Error: The selected template could not be found. エラー:ファイル名が無効 エラー:そのファイルがすでに存在する アップロード ファイルをアップロードのフォルム アップロード先: 有効拡張形式: 最大サイズ: アップロードするファイル: ファイル名として: ファイル名を記入する必要がある アップロード アップロード追加 キャンセル エラー:そのファイルがすでに存在する エラー:そのファイルが大きすぎる 取り除く Unzipの概要 選択したzip形式のファイルの概要 zipファイル名: 現在のフォルダ: ファイルを上書き: 名前 サイズ Cーサイズ 存在する ステータス 作成した Unzip キャンセル 戻る 閉じる 受けた 否定した 成功した 失敗した はい いいえ zipを作成 作成したいzipファイルの名前を記入: zipファイルの保存先: 名前: ファイル名を入力する必要がある. 作成 キャンセル
        plugins/filemanager/language/fm/en.xml000066600000023713150472426320014027 0ustar00
        Moxiecode Systems AB Русский
        Файл уже сущесвует Файл не существует This action is restricted in demo mode. Неправильное имя файла Нет прав для чтения этого файла/папки Нет прав для записи в этот файл/папку Ошибка копирования Ошибка перемещения Шаблон не найден Ошибка создания документа У вас не достаточно прав для этого действия Файл уже существует Ошибка загрузки, проверьте права доступа Достигнут максимальный размер файла Файл не существует Ошибка удаления Папка уже существует No filesystem was found. Ошибка создания папки Создать архив Ошибка переименования Ошибка сохранения содержимого Архивирование прошло успешно Копирование прошло успешно Перемещение прошло успешно Создание документа прошло успешно Удаление прошло успешно Создание папки прошло успешно Keepalive Загрузка прошла успешно Вырезать выбранные файлы? Скопировать выбранные файлы? Вставить выбранные файлы? Удалить выбранные файлы? Получение информации, секундочку.. Идёт процес вставки Создать папку Новый файл Помощь Обновить Загрузить Текущая папка Менеджер картинок Загрузка и добавление файлов Ок Да Нет Создать Отмена Сохранить Папки Просмотр Избранное История Редактировать файл Редактировать содержимое файла Загрузка содержимого, секундочу Сохранение содержимого, сеундочку Путь к файлу: Вставить Загрузить Переименовать Вырезать Копировать Вставить Удалить Редактировать Архивировать Просмотр Выделить все Отменить выбор Добавить в избранное Удалить из избранного Имя Размер Тип Изменено С выбранным: Папки: Файлы: Общий размер файлов: Доступ: Загружаю... Создать папку Выберите имя папки Шаблон: -- Шаблоны -- Имя папки: Создать в: Создание папки, секундочку Создать документ Заполните форму для создания документа Шаблон: -- Шаблоны -- Имя Путь Просмотр Просмотр: {file} Загрузить Используйте данную форуму для загрузки файлов Разрешённые расширения: Максимальный размер файла: Файл для загрузки: Имя файла: Путь: Загрузить AДобавить файл(ы) Загружаю... Файлы уже загружены, хотите отменить загрузку? {files} файлов (размер {size}) находятся в ожидании загрузки. {loaded} из {total} загружено на скорости {speed}/сек. Отменить загрузку Добавить ещё Загрузить на сервер Загрузка отменена Выделите файлы Если возникают проблемы при загрузке, попробуйте {a}классический интерфейс{/a}. Удалить Файл Размер Статус Ни одного корректного файла не выбрано Создать архив Введите имя для создаваемого архива Имя: Путь Вставить файл Избранное Добавить в избранное Удалить из избранного Точно удалить из избранного Ошибка удаления из избранного История
        plugins/filemanager/language/fm/ja.xml000066600000022201150472426320014006 0ustar00
        Moxiecode Systems AB This is the japanese language pack for the MCFileManager.
        ファイル イメージファイル ZIPファイル HTMLファイル 映画 音声ファイル Flashファイル PowerPoint ドキュメントファイル ワードファイル PDF Excelファイル テキストファイル XMLファイル ファイル・ブラウザ ファイル・ブラウザ ファイル名 サイズ 更新日時 選択したファイルを切り取り? 選択したファイルをコピー? 貼り付けしますか? 選択したファイルを削除? 本当に選択されたファイルをunzipする?\nファイルが大きならば、時間がかかります。 次のファイルがzip形式ではないので外しました。 フォルダを新規作成 ファイルを新規作成 更新 ファイルをアップロード 選択したフィルをダウンロード ファイル・フォルダのプロパティ 選択したものを切り取り 選択したものをコピー 貼り付け 選択したものを削除 選択されたファイルをunzipする 選択されたファイルやフォルダをzipする 映像管理に行く フォルダ 上のフォルダ 全部をトグル エラー {path} がすでに存在する エラー:アクセス権利がないので、削除できない。 エラー: {path} が空ではないので、削除できない ファイル・フォルダの情報 フォルダ情報 ファイル情報 作成日時: 更新日時: アクセス: フォルダ: サッブフォルダ: ファイル: 合計ファイルサイズ: ファイル名: ファイルサイズ: ファイル説明: 下見 下見がない 選択 表示 読込み可 読込み不可 書込み可 書込み不可 ファイル・フォルダのプロパティ ファイル・フォルダのプロパティ プロパティ有効: 名前: 保存 キャンセル エラー:そのファイルやフォルダがすでに存在する フォルダ新規作成 フォルダ名 テンプレート: -- テンプレートを選択 -- フォルダ名: 作成先: 作成 キャンセル エラー:名前を設定していない エラー:テンプレートを設定していない エラー:テンプレートが見つからない エラー:フォルダ名が無効 エラー:そのフォルダがすでに存在する ファイル新規作成 テンプレートから作成 テンプレート: -- テンプレートを選択 -- ファイル名を記入する必要がある ファイル名: 作成先: 作成 キャンセル エラー:ファイル名が必要 Error: You must select a template. Error: The selected template could not be found. エラー:ファイル名が無効 エラー:そのファイルがすでに存在する アップロード ファイルをアップロードのフォルム アップロード先: 有効拡張形式: 最大サイズ: アップロードするファイル: ファイル名として: ファイル名を記入する必要がある アップロード アップロード追加 キャンセル エラー:そのファイルがすでに存在する エラー:そのファイルが大きすぎる 取り除く Unzipの概要 選択したzip形式のファイルの概要 zipファイル名: 現在のフォルダ: ファイルを上書き: 名前 サイズ Cーサイズ 存在する ステータス 作成した Unzip キャンセル 戻る 閉じる 受けた 否定した 成功した 失敗した はい いいえ zipを作成 作成したいzipファイルの名前を記入: zipファイルの保存先: 名前: ファイル名を入力する必要がある. 作成 キャンセル
        plugins/filemanager/language/fm/sv.xml000066600000021156150472426320014054 0ustar00
        Moxiecode Systems AB This is the Swedish language pack for the MCImageManager.
        Filen existerar redan. Kllfilen existerar inte. Denna operation r inte tillten i demostrations lget. Filens namn r inte tillten. Inga lsrttigheter till denna fil/katalog. Inga skrivrttigheter till denna fil/katalog. Kopieringen misslyckades. Frflyttningen/omdpningen misslyckades. Mallen kunde inte hittas. Dokumentet kunde inte skapas. Du har inga rttiheter att utfra denna operation. Mlfilen existerar redan. Uppladdningen misslyckades. Filen du frskte ladda upp r fr stor. Filen existerar inte. Rederingen misslyckades. Katalogen finns redan. Filsytem kunde inte hittas: {path}. Kunde inte skapa katalog. Kunde inte skapa zip fil. Kunde inte dpa om filen. Kunde inte spara filen. Zip filen har skapats. Kopieringen r utfrd. Frflyttningen r utfrd Dokumentet har skapats. Filen/katalogen har raderats. Katalogen har skapats. Keepalive Uppladdningen r utfrd. r du sker p att du vill klippaut de markerade filerna/katalogerna? r du sker p att du vill kopiera de markerade filerna/katalogerna? r du sker p att du vill klista in filerna hr? r du sker p att du vill radera de markerade filerna/katalogerna? Sammanstller information, var god vnta... Klista in pgr, var god vnta... Skapa katalog Nytt dokument Hjlp Uppdatera Ladda upp Katalog Image manager Moxiecode File Mananger Ok Ja Nej Skapa Avbryt Spara Kategorier Frhandsgranska Favoriter Historik Edit file Edit the contents of the file. Loading contents please wait. Saving contents please wait. File path: Vlj Laddahem Dpom Klipp ut Kopiera Klista in Radera Redigera Zippa Visa Markera alla Avmarkera alla Lggtill favoriter Radera favoriter Filnamn Storlek Filtyp ndrad Med markeringen: Kataloger: Filer: Total filstorlek: Rttigheter: Laddar... Skapa katalog Fyll i namnet p katalogen du vill skapa. Mall: -- Vlj mall -- Katalogens namn: Skapa i: Skapar katalog, var god vnta... Skapa katalog Fyll i formulret nedan fr att skapa ett dokument utifrn en mall. Mall: -- Vlj mall -- Namn Skvg Frhandsgranska Frhandsgranskning av: {file} Ladda upp Vlj filer att ladda upp nedan. Godknnda filndelser: Max storlek: Fill att ladda upp: Filnamn: Skvg: Ladda upp Lgg till fil(er) Laddar upp fil, var god vnta... Filer hller p att laddas upp, r du sker p att du vill avbryta? Du har {files} filer (totalt {size}) som vntar p att f bli uppladdade. {loaded} av {total} uppladdade med hastigheten {speed}/s. Avbryt uppladdning Lgg till fler? Ladda upp till servern Upladdningen avbruten Vlj filer Om du har problem att ladda upp kan du alltid anvnda den {a}enkla upladdaren{/a}. Radera Fil Storlek Status Du mste vlja ngra korrekta filer. Skapa zip arkiv Fyll i namnet p zip filen du vill skapa. Namn: Skvg Infoga fil Favoriter Lgg till favorit(er) Radera favorit r du sker p att du vill radera favoriten? Raderingen av favoriten misslyckades.. Historik
        plugins/filemanager/language/default.php000066600000000047150472426320014431 0ustar00plugins/filemanager/language/index.php000066600000000047150472426320014114 0ustar00plugins/filemanager/language/language.php000066600000006317150472426320014576 0ustar00dispatchEvent("onPreInit", array($type)); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch auth event to make authenticators override config options $man->isAuthenticated(); $langPack =& $man->getLangPack(); $groups =& $langPack->getGroups(); // TinyMCE specific format if ($format == "tinymce") { echo "tinyMCE.addToLang('',{\n"; $group = $groups['tinymce']; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});"; } else if ($format == "tinymce_3_x") { echo "tinyMCE.addI18n('" . $langPack->getLanguage() . "',{\n"; $group = $groups['tinymce']; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});"; } else if ($format == "old") { // Normal MC manager format echo "mox.require(['mox.lang.LangPack'], function() {\n"; foreach ($groups as $groupName => $group) { echo "mox.lang.LangPack.add('en', '" . $groupName . "', {\n"; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) echo ","; echo "\n"; } echo "});\n\n"; } echo "\n});\n\n"; echo "function translatePage() {"; echo "if (mox && mox.lang && mox.lang.LangPack)"; echo "mox.lang.LangPack.translatePage();"; echo "}"; } else { $content = ""; echo "var MCManagerI18n = {\n"; $groupNames = $groupIDs ? explode(',', $groupIDs) : array_keys($groups); foreach ($groupNames as $group) { if (strlen($content) > 0) $content .= ','; $content .= "'" . $group . "':{\n"; $group = $groups[$group]; $keys = array_keys($group); for ($i=0; $iencodeString($group[$keys[$i]]); if ($i != count($keys) - 1) $content .= ","; $content .= "\n"; } $content .= "}"; } echo $content . "};"; } ?>plugins/filemanager/index.php000066600000002765150472426320012342 0ustar00dispatchEvent("onPreInit", array($type)); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once($path); $config = $man->getConfig(); $suffix = ""; if ($domain) $suffix .= "?domain=" . $domain; // Dispatch onInityo event if ($man->isAuthenticated()) { $man->dispatchEvent("onInit"); header("Location: pages/". $config["general.theme"] ."/" . $page . $suffix); die(); } else { header("Location: ". $config["authenticator.login_page"] . "?return_url=" . urlencode($_SERVER['REQUEST_URI'])); die(); } ?>plugins/filemanager/stream/default.php000066600000000047150472426320014141 0ustar00plugins/filemanager/stream/index.php000066600000000047150472426320013624 0ustar00plugins/filemanager/stream/stream.php000066600000007716150472426320014022 0ustar00load('../pages/' . $theme . '/resources.xml'); if ($type) { $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $mcConfig = $man->getConfig(); // Load plugin resources $plugins = explode(',', $mcConfig["general.plugins"]); foreach ($plugins as $plugin) $resources->load('../plugins/' . $plugin . '/resources.xml'); } $file = $resources->getFile($package, $file); header('Content-type: ' . $file->getContentType()); readfile($file->getPath()); die(); } if ($cmd == "") die("No command."); $chunks = explode('.', $cmd); $type = $chunks[0]; $method = $cmd = $chunks[1]; // Clean up type, only a-z stuff. $type = preg_replace("/[^a-z]/i", "", $type); if ($type == "") die("No type set."); // Include Base and Core and Config. $man = new Moxiecode_ManagerEngine($type); require_once($basepath ."CorePlugin.php"); require_once("../config.php"); $man->dispatchEvent("onPreInit", array($type)); $mcConfig = $man->getConfig(); // Include all plugins $pluginPaths = $man->getPluginPaths(); foreach ($pluginPaths as $path) require_once("../". $path); // Dispatch onAuthenticate event if ($man->isAuthenticated()) { if ($_SERVER["REQUEST_METHOD"] == "GET") { $args = $_GET; // Dispatch event before starting to stream $man->dispatchEvent("onBeforeStream", array($cmd, &$args)); // Check command, do command, stream file. $man->dispatchEvent("onStream", array($cmd, &$args)); // Dispatch event after stream $man->dispatchEvent("onAfterStream", array($cmd, &$args)); } else if ($_SERVER["REQUEST_METHOD"] == "POST") { $args = array_merge($_POST, $_GET); $json = new Moxiecode_JSON(); // Dispatch event before starting to stream $man->dispatchEvent("onBeforeUpload", array($cmd, &$args)); // Check command, do command, stream file. $result = $man->executeEvent("onUpload", array($cmd, &$args)); $data = $result->toArray(); if (isset($args["chunk"])) { // Output JSON response to multiuploader die('{method:\'' . $method . '\',result:' . $json->encode($data) . ',error:null,id:\'m0\'}'); } else { // Output JSON function echo ''; } // Dispatch event after stream $man->dispatchEvent("onAfterUpload", array($cmd, &$args)); } } else { if (isset($_GET["format"]) && ($_GET["format"] == "flash")) header("HTTP/1.1 405 Method Not Allowed"); die('{"result":{login_url:"' . addslashes($mcConfig["authenticator.login_page"]) . '"},"id":null,"error":{"errstr":"Access denied by authenicator.","errfile":"","errline":null,"errcontext":"","level":"AUTH"}}'); } ?>plugins/filemanager/editor_plugin_src.js000066600000032747150472426320014576 0ustar00/** * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $ * * @author Moxiecode * @copyright Copyright 2004-2007, Moxiecode Systems AB, All rights reserved. */ (function() { window.mcFileManager = { settings : { document_base_url : '', relative_urls : false, remove_script_host : false, use_url_path : true, remember_last_path : 'auto', target_elements : '', target_form : '', handle : 'file' }, setup : function() { var t = this, o, d = document, cp = []; // Find document_base_url o = d.location.href; if (o.indexOf('?') != -1) o = o.substring(0, o.indexOf('?')); o = o.substring(0, o.lastIndexOf('/') + 1); t.settings.default_base_url = unescape(o); // Find script base URL function get(nl) { var i, n; for (i=0; i{$name}'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinymce.DOM.encode(v); } } )); } } }, v)); }); }, getInfo : function() { return mcFileManagerPlugin.getInfo(); }, createControl: function(n, cm) { var t = this, c, ed = t.editor, v; switch (n) { case 'insertfile': v = ed.getParam('filemanager_insert_template'); if (v instanceof Array) { c = cm.createMenuButton('insertfile', { title : 'filemanager_insertfile_desc', image : t.url + '/pages/fm/img/insertfile.gif', icons : false }); c.onRenderMenu.add(function(c, m) { tinymce.each(v, function(v) { m.add({title : v.title, onclick : function() { ed.execCommand('mceInsertFile', false, v); }}); }); }); } else { c = cm.createButton('insertfile', { title : 'filemanager_insertfile_desc', image : t.url + '/pages/fm/img/insertfile.gif', onclick : function() { ed.execCommand('mceInsertFile', false, {template : v}); } }); } return c; } return null; } }); tinymce.PluginManager.add('filemanager', tinymce.plugins.FileManagerPlugin); tinymce.ScriptLoader.load((tinymce.PluginManager.urls['filemanager'] || tinymce.baseURL + '/plugins/filemanager') + '/language/index.php?type=fm&format=tinymce_3_x&group=tinymce&prefix=filemanager_'); } // Setup TinyMCE 2.x plugin if (window.TinyMCE_Engine) { var TinyMCE_FileManagerPlugin = { setup : function() { var b = (window.realTinyMCE || tinyMCE).baseURL; mcFileManager.baseURL = b + '/plugins/filemanager/js'; document.write(''); }, initInstance : function(ed) { ed.settings.file_browser_callback = 'mcFileManager.filebrowserCallBack'; mcFileManager.settings.handle = tinyMCE.getParam('filemanager_handle', mcFileManager.settings.handle); }, getControlHTML : function(cn) { switch (cn) { case "insertfile": return tinyMCE.getButtonHTML(cn, 'lang_filemanager_insertfile_desc', '{$pluginurl}/pages/fm/img/insertfile.gif', 'mceInsertFile', false); } return ""; }, getInfo : function() { return mcFileManagerPlugin.getInfo(); }, execCommand : function(id, el, cmd, ui, v) { var ed = tinyMCE.getInstanceById(id); if (cmd == 'mceInsertFile') { mcFileManager.browse(tinyMCE.extend({ path : tinyMCE.getParam("filemanager_path"), rootpath : tinyMCE.getParam("filemanager_rootpath"), remember_last_path : tinyMCE.getParam("filemanager_remember_last_path"), custom_data : tinyMCE.getParam("filemanager_custom_data"), insert_filter : tinyMCE.getParam("filemanager_insert_filter"), oninsert : function(o) { var u, nl, i; if (!ed.selection.isCollapsed()) { ed.execCommand("createlink", false, "javascript:mce_temp_url();"); nl = tinyMCE.selectElements(ed.getBody(), 'A', function(n) { return tinyMCE.getAttrib(n, 'href') == "javascript:mce_temp_url();"; }); for (i = 0; i < nl.length; i++) { u = mcFileManagerPlugin.convertURL(o.focusedFile.url); nl[i].href = u; nl[i].setAttribute('mce_href', u); } } else { ed.execCommand('mceInsertContent', false, mcFileManagerPlugin.replace( tinyMCE.getParam('filemanager_insert_template', '{$name}'), o.focusedFile, { urlencode : function(v) { return escape(v); }, xmlEncode : function(v) { return tinyMCE.xmlEncode(v); } } )); } } }, v)); return true; } return false; } }; TinyMCE_FileManagerPlugin.setup(); tinyMCE.addPlugin('filemanager', TinyMCE_FileManagerPlugin); } })(); plugins/filemanager/config.php000066600000022254150472426320012473 0ustar00plugins/filemanager/includes/general.php000066600000010474150472426320014452 0ustar00 $value) $newarray[formatParam($name, $sanitize)] = formatParam($value, $sanitize); return $newarray; } return formatParam($httpRequestInput[$name], $sanitize); } function formatParam($str, $sanitize = false) { if ($sanitize) $str = preg_replace("/[^0-9a-z\-_,]+/i", "", $str); if (ini_get("magic_quotes_gpc")) $str = stripslashes($str); return $str; } function getClassName($obj) { return strtolower(get_class($obj)); } /** * Check if a value is true/false. * * @param string $str True/False value. * @return bool true/false */ function checkBool($str, $def = false) { if ($str === true) return true; if ($str === false) return false; $str = strtolower($str); if ($str == "true") return true; return $def; } /** * Returns a file extention from a path. * * @param string $path Path to grab extention from. * @return string File extention. */ function getFileExt($path) { $ar = explode('.', $path); return strtolower(array_pop($ar)); } /** * Returns the mime type of an path by resolving it agains a apache style "mime.types" file. * * @param String $path path to Map/get content type by * @patam String $mime_File Absolute filepath to mime.types style file. * @return String mime type of path or an empty string on failue. */ function mapMimeTypeFromUrl($path, $mime_file) { if (($fp = fopen($mime_file, "r"))) { $ar = explode('.', $path); $ext = strtolower(array_pop($ar)); while (!feof ($fp)) { $line = fgets($fp, 4096); $chunks = preg_split("/(\t+)|( +)/", $line); for ($i=1; $igetLogger(); if (!$mcLogger) { $mcLogger = new Moxiecode_Logger(); // Set logger options $mcLogger->setPath(dirname(__FILE__) . "/../logs"); $mcLogger->setMaxSize("100kb"); $mcLogger->setMaxFiles("10"); $mcLogger->setFormat("{time} - {message}"); } return $mcLogger; } function debug($msg) { $args = func_get_args(); $log =& getLogger(); $log->debug(implode(', ', $args)); } function info($msg) { $args = func_get_args(); $log =& getLogger(); $log->info(implode(', ', $args)); } function error($msg) { $args = func_get_args(); $log =& getLogger(); $log->error(implode(', ', $args)); } function warn($msg) { $args = func_get_args(); $log =& getLogger(); $log->warn(implode(', ', $args)); } function fatal($msg) { $args = func_get_args(); $log =& getLogger(); $log->fatal(implode(', ', $args)); } ?>plugins/filemanager/classes/FileManager/FileManagerPlugin.php000066600000037472150472426320020376 0ustar00setConfig($mcFileManagerConfig, false); $man->setLangPackPath("fm"); return false; } return true; } /** * Register file system. */ function onInit(&$man) { // Register file systems $man->registerFileSystem('zip', 'Moxiecode_ZipFileImpl'); return true; } /** * Gets executed when a RPC command is to be executed. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { switch ($cmd) { case "copyFiles": return $this->_copyFiles($man, $input); case "moveFiles": return $this->_moveFiles($man, $input); case "createDocs": return $this->_createDocs($man, $input); case "createZip": return $this->_createZip($man, $input); case "loadContent": return $this->_loadContent($man, $input); case "saveContent": return $this->_saveContent($man, $input); } return null; } /** * Gets called when custom data is to be added for a file custom data can for example be * plugin specific name value items that should get added into a file listning. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param BaseFile $file File reference to add custom info/data to. * @param string $type Where is the info needed for example list or info. * @param Array $custom Name/Value array to add custom items to. * @return bool true/false if the execution of the event chain should continue. */ function onCustomInfo(&$man, &$file, $type, &$input) { switch ($type) { case "list": $input['previewable'] = $file->isFile() && $man->verifyFile($file, "preview") >= 0; $input['editable'] = $file->isFile() && $man->verifyFile($file, "edit") >= 0; break; } return true; // Pass to next } // * * * * * * * * Private methods function _createZip(&$man, &$input) { $result = new Moxiecode_ResultSet("status,fromfile,tofile,message"); $config = $man->getConfig(); if (!$man->isToolEnabled("zip", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } $zipFile = $man->getFile($man->decryptPath($input["topath"]), $input["toname"] . ".zip"); if ($zipFile->exists()) { trigger_error("{#error.tofile_exists}", FATAL); die(); } $toZip = $man->getFile("zip://" . $man->decryptPath($input["topath"]), $input["toname"] . ".zip/"); for ($i=0; isset($input["frompath" . $i]); $i++) { $fromFile =& $man->getFile($man->decryptPath($input["frompath" . $i])); $toFile = $man->getFile("zip://" . $man->decryptPath($input["topath"]) . '/' . $input["toname"] . ".zip", $fromFile->getName()); $zipFile = $man->getFile($man->decryptPath($input["topath"]) . '/' . $input["toname"] . ".zip"); $config = $fromFile->getConfig(); if (checkBool($config['general.demo'])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.demo}"); continue; } // Check write access if (!checkBool($config["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } if ($man->verifyFile($fromFile, "createzip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if ($man->verifyFile($zipFile, "createzip") < 0) { $result->add("FAILED", $man->encryptPath($zipFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$fromFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_from_file}"); continue; } if ($man->verifyFile($fromFile, "zip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if ($fromFile->copyTo($toFile)) $result->add("OK", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#message.zip_success}"); else $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.createzip_failed}"); } return $result->toArray(); } function _copyFiles(&$man, &$input) { $result = new Moxiecode_ResultSet("status,fromfile,tofile,message"); $config = $man->getConfig(); if (!$man->isToolEnabled("copy", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } for ($i=0; isset($input["frompath" . $i]); $i++) { $fromFile =& $man->getFile($input["frompath" . $i]); $fromType = $fromFile->isFile() ? MC_IS_FILE : MC_IS_DIRECTORY; if (isset($input["toname" . $i])) { $toFile =& $man->getFile($fromFile->getParent(), $input["toname" . $i], $fromType); } else { if (isset($input["topath" . $i])) $toFile =& $man->getFile($input["topath" . $i], "", $fromType); else $toFile =& $man->getFile($input["topath"], $fromFile->getName(), $fromType); } if (!$fromFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_from_file}"); continue; } if ($toFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.tofile_exists}"); continue; } $toConfig = $toFile->getConfig(); if (checkBool($toConfig['general.demo'])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.demo}"); continue; } if ($man->verifyFile($toFile, "copy") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$toFile->canWrite()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!checkBool($toConfig["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } // Check if file can be zipped if (getClassName($toFile) == 'moxiecode_zipfileimpl') { if ($man->verifyFile($fromFile, "zip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } // Check if file can be unzipped if (getClassName($fromFile) == 'moxiecode_zipfileimpl') { if ($man->verifyFile($toFile, "unzip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } if ($fromFile->copyTo($toFile)) $result->add("OK", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#message.copy_success}"); else $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.copy_failed}"); } return $result->toArray(); } function _moveFiles(&$man, &$input) { $result = new Moxiecode_ResultSet("status,fromfile,tofile,message"); $config = $man->getConfig(); if (!$man->isToolEnabled("rename", $config) && !$man->isToolEnabled("cut", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } for ($i=0; isset($input["frompath" . $i]); $i++) { $fromFile =& $man->getFile($input["frompath" . $i]); $fromType = $fromFile->isFile() ? MC_IS_FILE : MC_IS_DIRECTORY; if (isset($input["toname" . $i])) { $toFile =& $man->getFile($fromFile->getParent(), $input["toname" . $i], $fromType); } else { if (isset($input["topath" . $i])) $toFile =& $man->getFile($input["topath" . $i], "", $fromType); else $toFile =& $man->getFile($input["topath"], $fromFile->getName(), $fromType); } // User tried to change extension if ($fromFile->isFile() && getFileExt($fromFile->getName()) != getFileExt($toFile->getName())) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.move_failed}"); continue; } if (!$fromFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_from_file}"); continue; } if ($toFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.tofile_exists}"); continue; } $toConfig = $toFile->getConfig(); if (checkBool($toConfig['general.demo'])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.demo}"); continue; } if ($man->verifyFile($toFile, "rename") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$toFile->canWrite()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!checkBool($toConfig["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } // Check if file can be zipped if (getClassName($toFile) == 'moxiecode_zipfileimpl') { if ($man->verifyFile($fromFile, "zip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } // Check if file can be unzipped if (getClassName($fromFile) == 'moxiecode_zipfileimpl') { if ($man->verifyFile($toFile, "unzip") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } if ($fromFile->renameTo($toFile)) $result->add("OK", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#message.move_success}"); else $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.move_failed}"); } return $result->toArray(); } function _createDocs(&$man, &$input) { $result = new Moxiecode_ResultSet("status,fromfile,tofile,message"); $config = $man->getConfig(); if (!$man->isToolEnabled("createdoc", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } for ($i=0; isset($input["frompath" . $i]) && isset($input["toname" . $i]); $i++) { $fromFile =& $man->getFile($input["frompath" . $i]); $ext = getFileExt($fromFile->getName()); $toFile =& $man->getFile($input["topath" . $i], $input["toname" . $i] . '.' . $ext); $toConfig = $toFile->getConfig(); if (checkBool($toConfig['general.demo'])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.demo}"); continue; } if ($man->verifyFile($toFile, "createdoc") < 0) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$toFile->canWrite()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!checkBool($toConfig["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!$fromFile->exists()) { $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.template_missing}"); continue; } if ($fromFile->copyTo($toFile)) { // Replace title $fields = $input["fields"]; // Replace all fields if ($fields) { // Read all data $stream = $toFile->open('r'); $fileData = $stream->readToEnd(); $stream->close(); // Replace fields foreach ($fields as $name => $value) $fileData = str_replace('${' . $name . '}', htmlentities($value), $fileData); // Write file data $stream = $toFile->open('w'); $stream->write($fileData); $stream->close(); } $result->add("OK", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#message.createdoc_success}"); } else $result->add("FAILED", $man->encryptPath($fromFile->getAbsolutePath()), $man->encryptPath($toFile->getAbsolutePath()), "{#error.createdoc_failed}"); } return $result->toArray(); } function _loadContent(&$man, &$input) { $file = $man->getFile($input["path"]); $config = $file->getConfig(); if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } if (!checkBool($config["filesystem.writable"])) { trigger_error("{#error.no_write_access}", FATAL); die(); } if ($man->verifyFile($file, "edit") < 0) { trigger_error($man->getInvalidFileMsg(), FATAL); die(); } if (!$file->canWrite()) { trigger_error("{#error.no_write_access}", FATAL); die(); } $reader = $file->open('r'); if ($reader) { $content = $reader->readToEnd(); $reader->close(); } else { trigger_error("{#error.no_read_access}", FATAL); die(); } return array("content" => $content); } function _saveContent(&$man, &$input) { $file = $man->getFile($input["path"]); $config = $file->getConfig(); if (!$man->isToolEnabled("edit", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } if (checkBool($config['general.demo'])) { trigger_error("{#error.demo}", FATAL); die(); } if (!checkBool($config["filesystem.writable"])) { trigger_error("{#error.no_write_access}", FATAL); die(); } if ($man->verifyFile($file, "edit") < 0) { trigger_error($man->getInvalidFileMsg(), FATAL); die(); } if (!$file->canWrite()) { trigger_error("{#error.no_write_access}", FATAL); die(); } $writer = $file->open('w'); if ($writer) { $writer->write($input["content"]); $writer->close(); } else { trigger_error("{#error.no_write_access}", FATAL); die(); } return array("status" => "OK"); } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("filemanager", new Moxiecode_FileManagerPlugin(), "fm"); ?>plugins/filemanager/classes/FileManager/FileSystems/ZipFileImpl.php000066600000032145150472426320021470 0ustar00_absPath = str_replace("zip://", "", $this->_absPath); preg_match("/^(.*?.zip)(.*?)$/i", $this->_absPath, $matches); $this->_zipPath = $matches[1]; $this->_innerPath = $matches[2]; if (!$this->_innerPath) $this->_innerPath = "/"; } /** * Returns the file name of a file. * * @return string File name of file. */ function getName() { return basename($this->_absPath); } /** * Returns the absolute path of the file. * * @return String absolute path of the file. */ function getAbsolutePath() { return "zip://" . $this->_absPath; } /** * Returns the parent files absolute path. * * @return String parent files absolute path. */ function getParent() { // If get parent on root the give it the local FS parent if ($this->_innerPath == "/") { $file = $this->_manager->getFile($this->_zipPath); return $file->getParent(); } return Moxiecode_BaseFileImpl::getParent(); } /** * Returns the parent files File instance. * * @return File parent files File instance or false if there is no more parents. */ function &getParentFile() { if ($this->_innerPath == "/") return $this->_manager->getFile($this->getParent()); $file = new Moxiecode_ZipFileImpl($this->_manager, $this->getParent()); return $file; } /** * Imports a local file to the file system, for example when users upload files. * * @param String $local_absolute_path Absolute path to local file to import. */ function importFile($local_absolute_path = "") { $zip =& $this->_getZip(); $zip->open(); if (is_file($local_absolute_path)) $zip->addFile($this->_innerPath, $local_absolute_path); else $zip->addDirectory($this->_innerPath, $local_absolute_path); $status = $zip->commit(); $zip->close(); return $status; } /** * Exports the file to the local system, for example a file from a zip or db file system. * * @param String $local_absolute_path Absolute path to local file. * @return true/false state if it was exported or not. */ function exportFile($local_absolute_path) { $zip =& $this->_getZip(); $zip->open(); $zip->extract($this->_innerPath, $local_absolute_path, true); $zip->close(); return true; } /** * Returns true if the file exists. * * @return boolean true if the file exists. */ function exists() { // If zip root if ($this->_innerPath == "/") return true; // Look for item inside zip $entry =& $this->_getZipEntry(); return $entry != null; } /** * Returns true if the file is a directory. * * @return boolean true if the file is a directory. */ function isDirectory() { // If zip root if ($this->_innerPath == "/") return true; if (!$this->exists()) return $this->_type == MC_IS_DIRECTORY; $entry =& $this->_getZipEntry(); return $entry->isDirectory(); } /** * Returns last modification date in ms as an long. * * @return long last modification date in ms as an long. */ function getLastModified() { $entry =& $this->_getZipEntry(); return $entry->getLastModified(); } /** * Returns creation date in ms as an long. * * @return long creation date in ms as an long. */ function getCreationDate() { $entry =& $this->_getZipEntry(); return $entry->getLastModified(); } /** * Returns true if the files is readable. * * @return boolean true if the files is readable. */ function canRead() { return true; } /** * Returns true if the files is writable. * * @return boolean true if the files is writable. */ function canWrite() { return true; } /** * Returns file size as an long. * * @return long file size as an long. */ function getLength() { $entry =& $this->_getZipEntry(); return $entry->getSize(); } /** * Copies this file to the specified file instance. * * @param File $dest File to copy to. * @return boolean true - success, false - failure */ function copyTo(&$dest) { if (getClassName($dest) == 'moxiecode_localfileimpl') return $this->exportFile($dest->getAbsolutePath()); if ($this->isDirectory()) { $handle_as_add_event = true; $treeHandler = new _ZipFileCopyDirTreeHandler($this->_manager, $this, $dest, $handle_as_add_event); $this->listTree($treeHandler); return true; } else { // From/To Zip if (getClassName($dest) == 'moxiecode_zipfileimpl') { $zip =& $this->_getZip(); $toZip =& $dest->_getZip(); $zip->open(); $toZip->open(); // Copy single file $entry =& $zip->getEntryByPath($this->_innerPath); if ($entry && $entry->isFile()) { $toZip->addData($dest->_innerPath, $entry->getData()); } else { // Copy directory $entries =& $zip->listEntries($this->_innerPath, true); for ($i=0; $iisFile()) $toZip->addData($dest->_innerPath, $entry->getData()); else $toZip->addDirectory($dest->_innerPath); } } $zip->close(); $toZip->commit(); $toZip->close(); } else { // Copy non local fs file $inStream =& $this->open('rb'); $outStream =& $dest->open('wb'); if ($inStream && $outStream) { while (($buff = $inStream->read()) != null) $outStream->write($buff); } if ($inStream) $inStream->close(); if ($outStream) $outStream->close(); } } return true; } /** * Deletes the file. * * @param boolean $deep If this option is enabled files will be deleted recurive. * @return boolean true - success, false - failure */ function delete($deep = false) { $zip =& $this->_getZip(); $zip->open(); if ($this->isFile()) $state = $zip->deleteFile($this->_innerPath); else $state = $zip->deleteDir($this->_innerPath, $deep); $zip->commit(); $zip->close(); return $state; } /** * Returns an array of BaseFile instances based on the specified filter instance. * * @param FileFilter &$filter FileFilter instance to filter files by. * @return Array array of File instances based on the specified filter instance. */ function &listFilesFiltered(&$filter) { $dirs = array(); $files = array(); $zip =& $this->_getZip(); $entries = $zip->listEntries($this->_innerPath); // Dirs foreach ($entries as $entry) { $zipFile = new Moxiecode_ZipFileImpl($this->_manager, $this->_absPath, $entry->getName()); $zipFile->_setZipEntry($entry); if ($filter->accept($zipFile) == BASIC_FILEFILTER_ACCEPTED) { if ($zipFile->isFile()) $files[] = $zipFile; else $dirs[] = $zipFile; } } $zip->close(); $ar = array_merge($dirs, $files); // Stupid PHP 5 notices return $ar; } /** * Creates a new directory. * * @return boolean true- success, false - failure */ function mkdir() { $zip =& $this->_getZip(); $zip->open(); $state = $zip->addDirectory($this->_innerPath); $zip->commit(); $zip->close(); return $state; } /** * Renames/Moves this file to the specified file instance. * * @param File $dest File to rename/move to. * @return boolean true- success, false - failure */ function renameTo(&$dest) { // If move within the same zip if (getClassName($dest) == 'moxiecode_zipfileimpl' && $this->_zipPath == $dest->_zipPath) { $zip =& $this->_getZip(); $zip->open(); $zip->moveEntry($this->_innerPath, $dest->_innerPath); $zip->commit(); $zip->close(); } else { // Copy and delete $this->copyTo($dest); $this->delete(true); } return true; } /* * Sets the last-modified time of the file or directory. * * @param String $datetime The new date/time to set the file, in timestamp format * @return boolean true- success, false - failure */ function setLastModified($datetime) { $zip =& $this->_getZip(); $zip->open(); // Check for file $entry =& $zip->getEntryByPath($this->_innerPath); // Check for dir if (!$entry) $entry =& $zip->getEntryByPath($this->_innerPath . '/'); // Update mod time $entry->setLastModified($datetime); $zip->commit(); $zip->close(); return $state; } /** * Returns a merged name/value array of config elements. * * @return Array Merged name/value array of config elements. */ function getConfig() { $file =& $this->_manager->getFile($this->_zipPath); return $file->getConfig(); } /** * Opens a file stream by the specified mode. The default mode is rb. * * @param String $mode Mode to open file by, r, rb, w, wb etc. * @return FileStream File stream implementation for the file system. */ function &open($mode = 'rb') { $ent = new Moxiecode_ZipFileStream($this, $mode); return $ent; } // * * Private methods function &_getZip() { $file = new Moxiecode_ZipFile($this->_zipPath); return $file; } function _setZipEntry(&$entry) { $this->_zipEntry = $entry; } function _getZipEntry() { if (!$this->_zipEntry) { $zip =& $this->_getZip(); $zip->open(); // Check for file $this->_zipEntry =& $zip->getEntryByPath($this->_innerPath); // Check for dir if (!$this->_zipEntry) $this->_zipEntry =& $zip->getEntryByPath($this->_innerPath . '/'); $zip->close(); } return $this->_zipEntry; } } class _ZipFileCopyDirTreeHandler extends Moxiecode_FileTreeHandler { var $_fromFile; var $_destFile; var $_manager; var $_handle_as_add_event; function _LocalCopyDirTreeHandler(&$manager, $from_file, $dest_file, $handle_as_add_event) { $this->_manager = $manager; $this->_fromFile = $from_file; $this->_destFile = $dest_file; $this->_handle_as_add_event = $handle_as_add_event; } /** * Handles a file instance while looping an tree of directories. * * @param File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $toPath = $this->_destFile->getAbsolutePath(); $toPath .= substr($file->getAbsolutePath(), strlen($this->_fromFile->getAbsolutePath())); $toFile = $this->_manager->getFile($toPath); // Do action if ($file->isDirectory()) $toFile->mkdir(); else $file->copyTo($toFile); return $this->CONTINUE; } } class Moxiecode_ZipFileStream extends Moxiecode_FileStream { var $_file; var $_mode; var $_pos; var $_buff; function Moxiecode_ZipFileStream(&$file, $mode) { $this->_file =& $file; $this->_mode = $mode; $this->_buff = ""; $this->_pos = 0; } function skip($bytes) { $data = read($bytes); return strlen($data); } function read($len = 1024) { // End of stream if ($this->_pos > 0) return null; $this->_pos++; // Open zip and extract the requested data $zip =& $this->_file->_getZip(); $zip->open(); $entry =& $zip->getEntryByPath($this->_file->_innerPath); $data = $entry->getData(); $zip->close(); return $data; } function readToEnd() { $data = ""; while (($chunk = $this->read(1024)) != null) $data .= $chunk; return $data; } function write($buff, $len = -1) { if ($len == -1) $len = strlen($buff); else $buff = substr($buff, 0, $len); $this->_pos += $len; $this->_buff .= $buff; } function close() { if ($this->_mode == 'w' || $this->_mode == 'wb' || $this->_mode == 'a' || $this->_mode == 'ab') { // Open zip and write the requested data $zip =& $this->_file->_getZip(); $zip->open(); $entry =& $zip->getEntryByPath($this->_file->_innerPath); // Overwrite existing file or create new if (!$entry) $zip->addData($this->_file->_innerPath, $this->_buff); else { if ($this->_mode == 'a' || $this->_mode == 'ab') $entry->setData($entry->getData() . $this->_buff); else $entry->setData($this->_buff); } $this->_buff = null; $zip->commit(); $zip->close(); } } } /* // Copy from local to other filesystem $to->importFile($from->getAbsolutePath()); // Move from local to other filesystem $to->importFile($from->getAbsolutePath()); $from->delete(); // Copy from other to local filesystem $from->exportFile($to->getAbsolutePath()); // Move from local to other filesystem $from->exportFile($to->getAbsolutePath()); $from->delete(); // Stream contents from two filesystems $in =& $from->open('rb'); $out =& $to->open('wb'); while ($buff = $in->read(8192)) $out->write($buff); $out->close(); */ ?>plugins/filemanager/classes/FileManager/Utils/ZipFile.class.php000066600000072425150472426320020610 0ustar00 * // Create a zip file and add a file and directory to it * $zip = new Moxiecode_ZipFile("test.zip"); * $zip->open(); * $zip->addFile("/mydir/myfile.txt", "c:/mylocalfile.txt"); * $zip->addDir("/mydir", "c:/mylocaldir"); * $zip->commit(); * $zip->close(); * * // Extract the zip file. * $zip = new Moxiecode_ZipFile("test.zip"); * $zip->open(); * $zip->extract('/', "c:/mylocaldir"); * $zip->close(); * * * @package MoxieZip */ class Moxiecode_ZipFile { /**#@+ * @access private */ var $_entries; var $_path; var $_fp; var $_offset; var $_size; var $_header; var $_entryLookup; var $_compressionLevel; /**#@-*/ /** * Constructor for the ZipFile. * * @param string $path Path to zip file. For example: mydir/test.zip */ function Moxiecode_ZipFile($path) { $header = array(); $header['disk'] = 0; $header['disks'] = 0; $header['comment'] = 0; $header['comment_len'] = 0; $this->_path = $path; $this->_header = $header; $this->_entryLookup = array(); $this->_compressionLevel = 5; } /** * Sets the compression level 0-9. Defaults to 5. * * @param int $level Compression level. */ function setCompressionLevel($level) { $this->_compressionLevel = $level; } /** * Sets the comment contents of the whole zip file. * * @param string $comment Comment to set on Zip file. */ function setComment($comment) { $this->_header['comment'] = $comment; $this->_header['comment_len'] = strlen($comment); } /** * Adds a string of data as a specific file inside the zip. * * @param string $zip_path File path inside the zip to store the data in for example /mydir/myfile.txt. * @param string $data Data to store inside the file. * @param string $comment Optional comment to add to the file inside the zip. */ function addData($zip_path, $data, $comment = "") { $zip_path = preg_replace('/^\//', '', $zip_path); $this->deleteFile($zip_path); $entry =& new Moxiecode_ZipEntry($this); $entry->setPath($zip_path); $entry->setData($data); $entry->setComment($comment); $this->buildPath($entry->getPath()); $this->addEntry($entry); } /** * Adds a local file to the zip file. * * @param string $zip_path Path to store the local file as inside the zip. For example /mydir/myfile.txt. * @param string $path Local file path to store inside the zip for example c:/myfile.txt * @param string $comment Optional comment to add to the file inside the zip. */ function addFile($zip_path, $path = "", $comment = "") { $zip_path = preg_replace('/^\//', '', $zip_path); $this->deleteFile($zip_path); $entry =& new Moxiecode_ZipEntry($this); if ($path != '') $entry->setLocalPath($path); $entry->setPath($zip_path); $entry->setComment($comment); $this->buildPath($entry->getPath()); $this->addEntry($entry); } /** * Adds a directory inside the zip file. This can be an empty directory or a local directory that * is to be added to the zip. * * @param string $zip_path Path to store the directory as inside the zip. For example /mydir/dir. * @param string $path Optional local file path for example c:/mydir. * @param string $comment Optional comment to add for directory inside the zip file. * @param bool $recursive Optional state to do a recursive add or not this is true by default. */ function addDirectory($zip_path, $path = "", $comment = "", $recursive = true) { $zip_path = preg_replace('/^\//', '', $zip_path); $zip_path = $this->_addTrailingSlash($zip_path); $this->deleteDir($zip_path); if ($path) { $path = realpath($path); $files = $this->_listTree($path, $recursive); foreach ($files as $file) { $entry =& new Moxiecode_ZipEntry($this); $entry->setPath($zip_path . substr($file, strlen($path) + 1)); $entry->setLocalPath($file); $entry->setComment($comment); $entry->setType(is_dir($file)); $this->addEntry($entry); $this->buildPath($entry->getPath(), is_dir($file)); } $this->buildPath($zip_path . substr($file, strlen($path) + 1), is_dir($file)); } else { $entry =& new Moxiecode_ZipEntry($this); $entry->setPath($zip_path); $entry->setComment($comment); $entry->setType(1); $this->addEntry($entry); $this->buildPath($entry->getPath()); } } /** * Moves/renames an entry inside the zip file. * * @param string $from_path Path to move the file/directory from. * @param string $to_oath Path to move the file/directory to. */ function moveEntry($from_path, $to_path) { $from_path = preg_replace('/^\//', '', $from_path); $to_path = preg_replace('/^\//', '', $to_path); $entry =& $this->getEntryByPath($from_path); if ($entry->isFile()) { unset($this->_entryLookup[$entry->getPath()]); $entry->setPath($to_path); $this->_entryLookup[$to_path] =& $entry; $this->buildPath($to_path); } else { $from_path = preg_replace('/\/$/', '', $from_path) . '/'; $to_path = preg_replace('/\/$/', '', $to_path) . '/'; $newEntries = array(); for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; // Move all entries if (strpos($entry->getPath(), $from_path) === 0) { unset($this->_entryLookup[$entry->getPath()]); $entry->setPath($to_path . substr($entry->getPath(), strlen($from_path))); $this->_entryLookup[$entry->getPath()] =& $entry; } } $this->buildPath($to_path); } } /** * Adds a new entry to the zip. An entry is an instance of the Moxiecode_ZipEntry class. * * @param Moxiecode_ZipEntry $entry Entry to add to zip file structure. */ function addEntry(&$entry) { if ($entry) { $this->_entries[] =& $entry; $this->_entryLookup[$entry->getPath()] =& $entry; } } /** * Builds a path inside the zip. This method will be executed by addFile/addDirectory to * build a complete structure inside the zip if a file like /a/b/c/d.txt would be added. * * @param string $path Path inside the zip file to build. * @param bool $is_dir Optional is it a directory or an file defaults to false. */ function buildPath($path, $is_dir = false) { $pos = strrpos($path, '/'); if ($pos === false) return; $path = substr($path, 0, $pos); // Check for dir $entry =& $this->getEntryByPath($path); if ($entry) return; // Dir not found create all parents $items = explode('/', $path); $path = ""; if ($is_dir) array_pop($items); foreach ($items as $item) { $path .= $item . '/'; // Look for entry $entry =& $this->getEntryByPath($path); if (!$entry) { $entry = new Moxiecode_ZipEntry($this); $entry->setPath($path); $this->addEntry($entry); } } } /** * Returns an entry instance by a specific path. * * @param string $path Path inside the zip to retrive. * @return Moxiecode_ZipEntry Zip entry instance for the specified zip path or null. */ function &getEntryByPath($path) { $path = preg_replace('/^\//', '', $path); if (isset($this->_entryLookup[$path])) return $this->_entryLookup[$path]; for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; if ($entry->getPath() == $path || $entry->getPath() == $path . '/') { $this->_entryLookup[$path] =& $entry; return $entry; } } $obj = null; // Stupid PHP 5 notices return $obj; } /** * Deletes a file inside the zip. * * @param string $path Path inside the zip to delete for example. /mydir/myfile.txt. * @return bool state if the file was deleted or not. */ function deleteFile($path) { $path = preg_replace('/^\//', '', $path); $newEntries = array(); $deleted = false; // No dir, no file = no need if (!isset($this->_entryLookup[$path]) && !isset($this->_entryLookup[$path . '/'])) return; for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; if ($entry->getPath() != $path) $newEntries[] =& $entry; else { unset($this->_entryLookup[$path]); $deleted = true; } } $this->_entries =& $newEntries; return $deleted; } /** * Deletes the specified directory inside the zip. * * @param string $path Path inside zip file to delete. For example: /mydir/mydir2. * @param bool $deep Optional state if it should delete the directory recursive. * @return bool state if the directory was deleted or not. */ function deleteDir($path, $deep = true) { $path = preg_replace('/^\//', '', $path); $path = $this->_addTrailingSlash($path); $deleted = false; // No dir, no file = no need if (!isset($this->_entryLookup[$path]) && !isset($this->_entryLookup[$path . '/'])) return; if (!$deep) { for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; if (strpos($entry->getPath(), $path) !== 0 && strlen($entry->getPath()) > strlen($path)) return false; } } $newEntries = array(); for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; if (strpos($entry->getPath(), $path) !== 0) $newEntries[] =& $entry; else { $deleted = true; unset($this->_entryLookup[$path]); } } $this->_entries =& $newEntries; return $deleted; } /** * Commits/stores the zip file to a specific path or the path specified in contructor. * * @param string $path Optional local file system path to store the zip to. * @return bool true/false state if the zip was stored or not. */ function commit($path = '') { $paths = array(); $status = false; // Get entry paths for ($i=0; $i_entries); $i++) $paths[] = $this->_entries[$i]->getPath(); // Sort entry paths sort($paths); $tmpFile = false; if (!$path) $path = $this->_path; $this->_size = 0; $this->_offset = 0; // If zip is the same and open use tmp file if ($this->_fp && $path == $this->_path) { $tmpFile = true; $path = $path . ".tmp"; } // Write output file if (file_exists($path)) @unlink($path); $fp = @fopen($path, 'wb'); if ($fp) { for ($i=0; $igetEntryByPath($paths[$i]); $this->_writeLocalFileHeader($fp, $entry); } for ($i=0; $igetEntryByPath($paths[$i]); $this->_writeCentralDirHeader($fp, $entry); } $this->_writeCentralDirEnd($fp); @fclose($fp); $status = true; } // If zip is the same and open use tmp file if ($tmpFile) { $this->close(); if (file_exists($this->_path)) @unlink($this->_path); @rename($this->_toOSPath($path), $this->_toOSPath($this->_path)); } return $status; } /** * Opens the zip file for read or write access. */ function open() { if (!$this->_fp) { // Load zip if (!file_exists($this->_path)) return; $this->_fp = @fopen($this->_path, "rb"); if ($this->_fp) { // Parse local file headers while ($header = $this->_readLocalFileHeader()) { /*echo "Local file header:\n"; var_dump($header);*/ $entry =& new Moxiecode_ZipEntry($this, $header); $this->_entries[] =& $entry; $this->_entryLookup[$entry->getPath()] =& $entry; } // Parse central dir headers while ($header = $this->_readCentralDirHeader()) { /*echo "Central dir header:\n"; var_dump($header);*/ // Append to existing headers for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; if ($entry->getPath() == $header['filename']) $entry->_addHeader($header); } } // Parse central dir end header if ($header = $this->_readCentralDirEnd()) { /*echo "Central dir end:\n"; var_dump($header);*/ $this->_setHeader($header); } } } } /** * Closes the zip file. */ function close() { if ($this->_fp) { @fclose($this->_fp); $this->_fp = null; } } /** * Extract the specified zip path as a local path. * * @param string $zip_path Location inside the zip to extract for example: /mydir/myfile or / for the whole zip. * @param string $path Local file system path to unpack the zip to. * @param bool $is_target Optional state if the contents should be unpacks inside the specified path or as the specified path. */ function extract($zip_path, $path, $is_target = false) { $path = $this->_toUnixPath($path); // Extract single file $entry =& $this->getEntryByPath($zip_path); if ($entry && $entry->isFile()) { if ($is_target) $this->_extractEntry($entry, $path); else $this->_extractEntry($entry, $path . "/" . $entry->getName()); return; } // Extract files $entries =& $this->listEntries($zip_path, true); for ($i=0; $i_addTrailingSlash($path) . preg_replace('/^([^\/]+\/)/', '', $entries[$i]->getPath()); else $outPath = $this->_addTrailingSlash($path) . $entries[$i]->getPath(); if ($entry->isDirectory()) $this->_mkdirs($this->_toOSPath($outPath)); else $this->_extractEntry($entry, $outPath); } } /** * Returns all entries inside the zip file as an array. * * @return Array Array of all zip entries. */ function getEntries() { $this->open(); return $this->_entries; } /** * Lists entires inside the zip file. * * @param string $path Zip path to list files inside. For example: /mydir. * @param bool $deep List files recursive or not. Defaults to false. * @return Array Array of zip entries. */ function &listEntries($path = '/', $deep = false) { $path = preg_replace('/^\//', '', $path); $path = $this->_addTrailingSlash($path); if ($path == '') $path = '/'; $slashCount = substr_count($path, '/'); $entries = $this->getEntries(); $output = array(); for ($i=0; $i_entries); $i++) { $entry =& $this->_entries[$i]; $entryPath = $entry->getPath(); $entryPath = preg_replace('/\/$/', '', $entryPath); if (!$deep) { if ($path == '/' && substr_count($entryPath, '/') == 0) $output[] =& $entry; else if (strpos($entryPath, $path) === 0 && substr_count($entryPath, '/') == $slashCount) $output[] =& $entry; } else { if ($path == '/' || strpos($entryPath, $path) === 0) $output[] =& $entry; } } return $output; } /**#@+ * @access private */ function _setHeader($header) { $this->_header; } function _getHeader() { return $this->_header; } function _extractEntry(&$entry, $path) { // Make parent dir $ar = explode('/', $path); array_pop($ar); $this->_mkdirs(implode('/', $ar)); // Extract file contents $fp = @fopen($path, "wb"); if ($fp) { fwrite($fp, $entry->getData()); fclose($fp); } } function _writeLocalFileHeader($fp, &$entry) { $header = $entry->_getHeader(); $data = ''; // Compress data and set some headers $header['filename_len'] = strlen($entry->getPath()); // Convert unix time to dos time $date = getdate($header['unixtime']); $header['mtime'] = ($date['hours'] << 11) + ($date['minutes'] << 5) + $date['seconds'] / 2; $header['mdate'] = (($date['year'] - 1980) << 9) + ($date['mon'] << 5) + $date['mday']; // Total commander has strange issues if ($header['size'] == 0) $header['compressed_size'] = 0; // Data to compress if ($header['size'] > 0 || ($entry->_isDirty && $entry->isFile())) { if ($entry->_isDirty) { $data = $entry->getData(); $header['size'] = strlen($data); $header['crc'] = crc32($data); $header['compression'] = 0x0008; // deflate $header['flag'] = 0x0002; // Compress $data = @gzdeflate($data, $this->_compressionLevel); $header['compressed_size'] = strlen($data); } else $data = $entry->getRawData(); } // Pack and write header fwrite($fp, pack("VvvvvvVVVvv", 0x04034b50, // Signature $header['version'], $header['flag'], $header['compression'], $header['mtime'], $header['mdate'], $header['crc'], $header['compressed_size'], $header['size'], $header['filename_len'], $header['extra_len'] ), 30); // Write filename and compressed data fwrite($fp, $entry->getPath(), $header['filename_len']); if (isset($header['extra'])) fwrite($fp, $header['extra'], $header['extra_len']); fwrite($fp, $data, $header['compressed_size']); $header['offset'] = $this->_offset; $this->_offset += 30 + $header['filename_len'] + $header['extra_len'] + $header['compressed_size']; $entry->_setHeader($header); } function _writeCentralDirHeader($fp, &$entry) { $header = $entry->_getHeader(); // Set extra parameters $header['version'] = 0x0014; $header['version_extracted'] = $header['compression'] == 8 ? 0x0014 : 0x000A; $header['disk'] = 0x0000; $header['iattr'] = 0x0001; $header['eattr'] = $entry->isDirectory() ? 0x00000010 : 0x00000020; // Write central directory record fwrite($fp, pack("VvvvvvvVVVvvvvvVV", 0x02014b50, // Signature $header['version'], $header['version_extracted'], $header['flag'], $header['compression'], $header['mtime'], $header['mdate'], $header['crc'], $header['compressed_size'], $header['size'], $header['filename_len'], $header['extra_len'], $header['comment_len'], $header['disk'], $header['iattr'], $header['eattr'], $header['offset'] ), 46); // Write filename fwrite($fp, $entry->getPath(), $header['filename_len']); if (isset($header['extra'])) fwrite($fp, $header['extra'], $header['extra_len']); if (isset($header['comment'])) fwrite($fp, $header['comment'], $header['comment_len']); $this->_size += 46 + $header['filename_len'] + $header['extra_len'] + $header['comment_len']; } function _writeCentralDirEnd($fp) { $header = $this->_header; $header['start'] = count($this->_entries); $header['entries'] = count($this->_entries); $header['size'] = $this->_size; $header['offset'] = $this->_offset; // Write end of central directory record fwrite($fp, pack("VvvvvVVv", 0x06054b50, // Signature $header['disk'], $header['disks'], $header['start'], $header['entries'], $header['size'], $header['offset'], $header['comment_len'] ), 22); fwrite($fp, $header['comment'], $header['comment_len']); } function _readLocalFileHeader() { $header = array(); // Read signature $oldPos = ftell($this->_fp); $buff = @fread($this->_fp, 4); $data = unpack('Vsignature', $buff); // Is not local file header if ($data['signature'] != 0x04034b50) { fseek($this->_fp, $oldPos, SEEK_SET); return null; } // Read header $buff = fread($this->_fp, 26); $data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $buff); $header = array_merge($data, $header); // Read filename if ($header['filename_len'] > 0) $header['filename'] = fread($this->_fp, $header['filename_len']); // Read extra if ($header['extra_len'] != 0) $header['extra'] = fread($this->_fp, $header['extra_len']); // Convert DOS date/time to UNIX Timestamp if ($header['mdate'] && $header['mtime']) { $header['unixtime'] = gmmktime(($header['mtime'] & 0xF800) >> 11, ($header['mtime'] & 0x07E0) >> 5, ($header['mtime'] & 0x001F) * 2, ($header['mdate'] & 0x01E0) >> 5, $header['mdate'] & 0x001F, (($header['mdate'] & 0xFE00) >> 9) + 1980); } // Store away data offset and jump behind data $header['data_offset'] = ftell($this->_fp); fseek($this->_fp, $header['compressed_size'], SEEK_CUR); return $header; } function _readCentralDirHeader() { $header = array(); // Read signature $oldPos = ftell($this->_fp); $buff = @fread($this->_fp, 4); $data = unpack('Vsignature', $buff); // Is not central dir header if ($data['signature'] != 0x02014B50) { fseek($this->_fp, $oldPos); return null; } // Read header $buff = fread($this->_fp, 42); $data = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/viattr/Veattr/Voffset', $buff); $header = array_merge($data, $header); // Read filename if ($header['filename_len'] != 0) $header['filename'] = fread($this->_fp, $header['filename_len']); // Read extra if ($header['extra_len'] != 0) $header['extra'] = fread($this->_fp, $header['extra_len']); // Read comment if ($header['comment_len'] != 0) $header['comment'] = fread($this->_fp, $header['comment_len']); // Convert DOS date/time to UNIX Timestamp if ($header['mdate'] && $header['mtime']) { $header['unixtime'] = gmmktime(($header['mtime'] & 0xF800) >> 11, ($header['mtime'] & 0x07E0) >> 5, ($header['mtime'] & 0x001F) * 2, ($header['mdate'] & 0x01E0) >> 5, $header['mdate'] & 0x001F, (($header['mdate'] & 0xFE00) >> 9) + 1980); } return $header; } function _readCentralDirEnd() { $header = array(); // Read signature $oldPos = ftell($this->_fp); $buff = @fread($this->_fp, 4); $data = unpack('Vsignature', $buff); // Is not central dir header if ($data['signature'] != 0x06054b50) { fseek($this->_fp, $oldPos); return null; } // Read header $buff = fread($this->_fp, 22); $data = unpack('vdisk/vdisks/vstart/ventries/Vsize/Voffset/vcomment_len', $buff); $header = array_merge($data, $header); // Read comment if ($header['comment_len'] > 0) $header['comment'] = fread($this->_fp, $header['comment_len']); return $header; } function _getFileData($header, $uncompres = true) { $data = ""; if ($this->_fp) { $oldPos = ftell($this->_fp); fseek($this->_fp, $header['data_offset']); $buff = @fread($this->_fp, $header['compressed_size']); if ($uncompres && $header['compression'] == 8 && $header['compressed_size'] > 0) $data = @gzinflate($buff); else $data = $buff; fseek($this->_fp, $oldPos); } return $data; } function _addTrailingSlash($path) { if (strlen($path) > 0 && $path[strlen($path)-1] != '/') $path .= '/'; return $path; } function _removeTrailingSlash($path) { // Is root if ($path == "/") return $path; if ($path == "") return $path; if ($path[strlen($path)-1] == '/') $path = substr($path, 0, strlen($path)-1); return $path; } function _toUnixPath($path) { return str_replace(DIRECTORY_SEPARATOR, "/", $path); } function _toOSPath($path) { return str_replace("/", DIRECTORY_SEPARATOR, $path); } function _listTree($path, $recursive = true) { $files = array(); if ($dir = opendir($path)) { while (false !== ($file = readdir($dir))) { if ($file == "." || $file == "..") continue; $file = $path . "/" . $file; $files[] = $file; if (is_dir($file) && $recursive) $files = array_merge($files, $this->_listTree($file, $recursive)); } closedir($dir); } return $files; } function _mkdirs($path, $rights = 0777) { $path = preg_replace('/\/$/', '', $path); $dirs = array(); // Figure out what needs to be created while ($path) { if (file_exists($path)) break; $dirs[] = $path; $pathAr = explode("/", $path); array_pop($pathAr); $path = implode("/", $pathAr); } // Create the dirs $dirs = array_reverse($dirs); foreach ($dirs as $path) { if (!@is_dir($path) && strlen($path) > 0) mkdir($path, $rights); } } /**#@-*/ } /** * Zip file entry this class represents a entry within the zip for example a file or a directory. * * Example of usage: *
         * // Create a zip file and add a file and directory to it
         * $zip = new Moxiecode_ZipFile("test.zip");
         * $zip->open();
         * $entries = $zip->listEntries('/', true);
         * foreach ($entries as $entry) {
         * 	echo $entry->getPath();
         * }
         * $zip->close();
         * 
        * * @package MoxieZip */ class Moxiecode_ZipEntry { /**#@+ * @access private */ var $_zip; var $_header; var $_data; var $_rawData; var $_isDirty; var $_localPath; /**#@-*/ /** * Constructs a new zip entry. * * @param Moxiecode_ZipFile $zip Zip file to bind entry to. * @param Array $header Optional header array. */ function Moxiecode_ZipEntry(&$zip, $header = false) { if (!$header) { $header = array(); $header['version'] = 0x0014; $header['version_extracted'] = 0x0000; $header['flag'] = 0; $header['compression'] = 0; $header['mtime'] = 0; $header['mdate'] = 0; $header['crc'] = 0; $header['compressed_size'] = 0; $header['size'] = 0; $header['filename_len'] = 0; $header['extra_len'] = 0; $header['comment_len'] = 0; $header['disk'] = 0; $header['iattr'] = 0; $header['eattr'] = 0; $header['offset'] = 0; $header['filename'] = ''; $header['extra'] = ''; $header['comment'] = ''; $header['unixtime'] = time(); } $this->_zip = $zip; $this->_header = $header; $this->_isDirty = false; } /** * Returns the raw uncompressed data inside the zip for the entry. * * @return string Raw data string. */ function getRawData() { if (!$this->_rawData) $this->_rawData = $this->_zip->_getFileData($this->_header, false); return $this->_rawData; } /** * Sets the raw uncompressed data inside the zip of the entry. * * @param string $data Raw data string. */ function setRawData($data) { $this->_rawData = $data; } /** * Returns the uncompressed data of the entry. * * @return string Uncompressed zip entry data. */ function getData() { if ($this->_localPath) $this->setData(file_get_contents($this->_localPath)); if ($this->_data) return $this->_data; return $this->_zip->_getFileData($this->_header); } /** * Sets the date for the zip entry. * * @param string $data Data to set inside zip entry. */ function setData($data) { $this->_header['unixtime'] = time(); $this->_header['size'] = strlen($data); $this->_data = $data; $this->_isDirty = true; } /** * Sets the local path for the entry. The specified file will be stored * inside the zip for the specific entry. * * @param string $path Local file system path to store inside zip entry. */ function setLocalPath($path) { $this->_header['unixtime'] = filemtime($path); $this->_localPath = $path; $this->_isDirty = true; } /** * Returns the local file system path for the entry. * * @return string Local file system path for the entry. */ function getLocalPath() { return $this->_localPath; } /** * Returns the last modified time of the zip entry as a unix timestamp. * * @return int Last modified time of the zip entry as a unix timestamp. */ function getLastModified() { return $this->_header['unixtime']; } /** * Sets the last modified time of the zip entry as a unix timestamp. * * @param int $date Last modified time of the zip entry as a unix timestamp. */ function setLastModified($date) { $this->_header['unixtime'] = $date; } /** * Returns the internal zip path. For example /mydir/myfile.txt. * * @return string Internal zip path. For example /mydir/myfile.txt. */ function getPath() { return $this->_header['filename']; } /** * Sets the internal zip path. For example /mydir/myfile.txt. * * @param string $path Internal zip path. For example /mydir/myfile.txt. */ function setPath($path) { $path = preg_replace('/^\//', '', $path); $path = $this->_zip->_toUnixPath($path); $this->_header['filename'] = $path; $this->_header['filename_len'] = strlen($path); } /** * Sets the comment for the zip entry. * * @param string $comment Comment for the zip entry. */ function setComment($comment) { $this->_header['comment'] = $comment; $this->_header['comment_len'] = strlen($comment); } /** * Gets the comment for the zip entry. * * @return string Comment for the zip entry. */ function getComment() { return $this->_header['comment']; } /** * Sets the extra field for the zip entry. * * @param string $extra Extra field for the zip entry. */ function setExtra($extra) { $this->_header['extra'] = $extra; $this->_header['extra_len'] = strlen($extra); } /** * Gets the extra field for the zip entry. * * @return string Extra field for the zip entry. */ function getExtra() { return $this->_header['extra']; } /** * Returns the zip entry size in bytes. * * @return int Numner of bytes for the zip entry. */ function getSize() { return $this->_header['size']; } /** * Returns the file name/directory name for the zip entry. * * @return string File name/directory name for the zip entry. */ function getName() { $ar = explode('/', $this->_zip->_removeTrailingSlash($this->_header['filename'])); return array_pop($ar); } /** * Sets the type for the entry. 1 equals directory 0 equals file. * * @param int $type Type for the entry. 1 equals directory 0 equals file. */ function setType($type) { if ($type == 1) $this->_header['filename'] = $this->_zip->_addTrailingSlash($this->_header['filename']); } /** * Returns true/false if the entry is a file or not. * * @return bool true/false if the entry is a file or not. */ function isFile() { return !$this->isDirectory(); } /** * Returns true/false if the entry is a directory or not. * * @return bool true/false if the entry is a directory or not. */ function isDirectory() { return substr($this->getPath(), strlen($this->getPath()) - 1) == '/'; } /**#@+ * @access private */ function _addHeader($header) { $this->_header = array_merge($this->_header, $header); } function _getHeader() { return $this->_header; } function _setHeader($header) { $this->_header = $header; } /**#@-*/ } ?>plugins/filemanager/classes/ManagerPlugin.php000066600000020410150472426320015404 0ustar00plugins/filemanager/classes/Authenticators/IPAuthenticator.php000066600000002303150472426320020714 0ustar00getConfig(); $ipNums = split(',', $config['IPAuthenticator.ip_numbers']); $currentIP = $this->_ip2int($_SERVER["REMOTE_ADDR"]); foreach ($ipNums as $ip) { $ipRange = split('-', $ip); if (count($ipRange) == 1 && $this->_ip2int($ipRange[0]) == $currentIP) return true; if (count($ipRange) == 2 && $currentIP >= $this->_ip2int($ipRange[0]) && $currentIP <= $this->_ip2int($ipRange[1])) return true; } return false; } function _ip2int($addr) { $ips = split("\.", $addr); return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256); } } // Add plugin to MCManager $man->registerPlugin("IPAuthenticator", new Moxiecode_IPAuthenticator()); ?>plugins/filemanager/classes/Authenticators/BaseAuthenticator.php000066600000001215150472426320021257 0ustar00registerPlugin("BaseAuthenticator", new Moxiecode_BaseAuthenticator()); ?>plugins/filemanager/classes/Authenticators/SessionAuthenticator.php000066600000005403150472426320022033 0ustar00getConfig(); // Support both old and new format $loggedInKey = isset($config['SessionAuthenticator.logged_in_key']) ? $config['SessionAuthenticator.logged_in_key'] : $config["authenticator.session.logged_in_key"]; $userKey = isset($config['SessionAuthenticator.user_key']) ? $config['SessionAuthenticator.user_key'] : $config["authenticator.session.user_key"]; $pathKey = isset($config['SessionAuthenticator.path_key']) ? $config['SessionAuthenticator.path_key'] : $config["authenticator.session.path_key"]; $rootPathKey = isset($config['SessionAuthenticator.rootpath_key']) ? $config['SessionAuthenticator.rootpath_key'] : $config["authenticator.session.rootpath_key"]; $configPrefix = (isset($config['SessionAuthenticator.config_prefix']) ? $config['SessionAuthenticator.config_prefix'] : "mcmanager") . "."; // Switch path if (isset($_SESSION[$pathKey])) $config['filesystem.path'] = $_SESSION[$pathKey]; // Switch root if (isset($_SESSION[$rootPathKey])) $config['filesystem.rootpath'] = $_SESSION[$rootPathKey]; $user = isset($_SESSION[$userKey]) ? $_SESSION[$userKey] : ""; $user = preg_replace('/[\\\\\\/:]/i', '', $user); // Override by prefix foreach ($_SESSION as $key => $value) { if (strpos($key, $configPrefix) === 0) $config[substr($key, strlen($configPrefix))] = $value; } foreach ($config as $key => $value) { // Skip replaceing {$user} in true/false stuff if ($value === true || $value === false) continue; $value = str_replace('${user}', $user, $value); $config[$key] = $value; } // Force update of internal state $man->setConfig($config); return isset($_SESSION[$loggedInKey]) && checkBool($_SESSION[$loggedInKey]); } } // Add plugin to MCManager $man->registerPlugin("SessionAuthenticator", new Moxiecode_SessionAuthenticator()); ?>plugins/filemanager/classes/FileSystems/LocalFileImpl.php000066600000061433150472426320017610 0ustar00_manager =& $manager; $this->_type = $type; if ($child_name != "") $this->_absPath = $this->_manager->removeTrailingSlash($absolute_path) . "/" . $child_name; else $this->_absPath = $absolute_path; // Force it absolute if (strpos($this->_absPath, '..') !== false) $this->_absPath = $this->_manager->toUnixPath(realpath($this->_absPath)); } /** * Set a bool regarding events triggering. * * @param Bool $trigger Trigger or not to trigger. */ function setTriggerEvents($trigger) { $this->_events = $trigger; } /** * Returns bool if events are to be triggered or not. * * @return Bool bool for triggering events or not. */ function getTriggerEvents() { return $this->_events; } /** * Returns the parent files absolute path. * * @return String parent files absolute path. */ function getParent() { $pathAr = explode("/", $this->_absPath); array_pop($pathAr); $path = implode("/", $pathAr); // TODO: Check this return ($path == "") ? null : $path; } /** * Returns the parent files File instance. * * @return File parent files File instance or false if there is no more parents. */ function &getParentFile() { $file = new Moxiecode_LocalFileImpl($this->_manager, $this->getParent()); return $file; } /** * Returns the file name of a file. * * @return string File name of file. */ function getName() { return basename($this->_manager->toOSPath($this->_absPath)); } /** * Returns the absolute path of the file. * * @return String absolute path of the file. */ function getAbsolutePath() { return $this->_absPath; } /** * Imports a local file to the file system, for example when users upload files. * * @param String $local_absolute_path Absolute path to local file to import. */ function importFile($local_absolute_path = "") { $this->_clearCache(); // Add action if ($this->_events) { if ($this->isFile()) { $this->_manager->dispatchEvent("onBeforeFileAction", array(ADD_ACTION, &$this)); $this->_manager->dispatchEvent("onFileAction", array(ADD_ACTION, &$this)); } else { $this->_manager->dispatchEvent("onBeforeFileAction", array(MKDIR_ACTION, &$this)); $this->_manager->dispatchEvent("onFileAction", array(MKDIR_ACTION, &$this)); } } // Chmod the file if (($mask = $this->_getConfigValue("filesystem.local.file_mask", false)) !== false) @chmod($this->_manager->toOSPath($this->_absPath), intval($mask, 8)); // Chown the file if (($owner = $this->_getConfigValue("filesystem.local.file_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($this->_absPath), $owner); } /** * Returns true if the file exists. * * @return boolean true if the file exists. */ function exists() { if (isset($this->_statCache['exists'])) return $this->_statCache['exists']; // Returns false if safe mode is on and the user/group is not the same as apache return ($this->_statCache['exists'] = file_exists($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the file is a directory. * * @return boolean true if the file is a directory. */ function isDirectory() { if (!$this->exists()) return $this->_type == MC_IS_DIRECTORY; if (isset($this->_statCache['is_dir'])) return $this->_statCache['is_dir']; return ($this->_statCache['is_dir'] = is_dir($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the file is a file. * * @return boolean true if the file is a file. */ function isFile() { if (!$this->exists()) return $this->_type == MC_IS_FILE; if (isset($this->_statCache['is_file'])) return $this->_statCache['is_file']; return ($this->_statCache['is_file'] = is_file($this->_manager->toOSPath($this->_absPath))); } /** * Returns last modification date in ms as an long. * * @return long last modification date in ms as an long. */ function getLastModified() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][9]; } /** * Returns creation date in ms as an long. * * @return long creation date in ms as an long. */ function getCreationDate() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][10]; } /** * Returns true if the files is readable. * * @return boolean true if the files is readable. */ function canRead() { if (isset($this->_statCache['is_readable'])) return $this->_statCache['is_readable']; return ($this->_statCache['is_readable'] = is_readable($this->_manager->toOSPath($this->_absPath))); } /** * Returns true if the files is writable. * * @return boolean true if the files is writable. */ function canWrite() { // Check parent if (!$this->exists()) { $file =& $this->getParentFile(); if ($this->getAbsolutePath() == $file->getAbsolutePath()) return false; return $file->canWrite(); } if (isset($this->_statCache['is_writeable'])) return $this->_statCache['is_writeable']; // Is windows if (DIRECTORY_SEPARATOR == "\\") { $path = $this->_manager->toOSPath($this->_absPath); if (is_file($path)) { $fp = @fopen($path, 'ab'); if ($fp) { fclose($fp); return true; } } else if (is_dir($path)) { $tmpnam = time() . md5(uniqid('iswritable')); if (@touch($path . '\\' . $tmpnam)) { unlink($path . '\\' . $tmpnam); return true; } } return false; } // Other OS:es return ($this->_statCache['is_writeable'] = is_writeable($this->_manager->toOSPath($this->_absPath))); } /** * Returns file size as an long. * * @return long file size as an long. */ function getLength() { if (!isset($this->_statCache['stat'])) $this->_statCache['stat'] = @stat($this->_manager->toOSPath($this->_absPath)); return $this->_statCache['stat'][7]; } /** * Copies this file to the specified file instance. * * @param File $dest File to copy to. * @return boolean true - success, false - failure */ function copyTo(&$dest) { $this->_clearCache(); if ($dest->exists()) return false; // Copy in to your self? if (strpos($dest->getAbsolutePath(), $this->getAbsolutePath()) === 0) return false; // Different file system then import if (getClassName($dest) != 'moxiecode_localfileimpl') return $dest->importFile($this->getAbsolutePath()); $dest->_clearCache(); if ($this->isDirectory()) { $handle_as_add_event = true; $treeHandler = new _LocalCopyDirTreeHandler($this->_manager, $this, $dest, $handle_as_add_event); $this->listTree($treeHandler); return true; } else { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(COPY_ACTION, &$this, &$dest)); $status = $this->_absPath == $dest->_absPath || copy($this->_manager->toOSPath($this->_absPath), $this->_manager->toOSPath($dest->_absPath)); // Chmod the file if (($mask = $dest->_getConfigValue("filesystem.local.file_mask", false)) !== false) @chmod($this->_manager->toOSPath($dest->_absPath), intval($mask, 8)); // Chown the file if (($owner = $dest->_getConfigValue("filesystem.local.file_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($dest->_absPath), $owner); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(COPY_ACTION, &$this, &$dest)); return $status; } } /** * Deletes the file. * * @param boolean $deep If this option is enabled files will be deleted recurive. * @return boolean true - success, false - failure */ function delete($deep = false) { if (!$this->exists()) return false; $this->_clearCache(); if (is_dir($this->_manager->toOSPath($this->_absPath))) { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(RMDIR_ACTION, &$this)); if ($deep) { // Get all the files $treeHandler = new _LocalDeleteDirTreeHandler($this->_manager, $this); $this->listTree($treeHandler); // Delete the files $files = array_reverse($treeHandler->getFiles()); foreach ($files as $file) $file->delete(); // Hmm, should be better return true; } if (($status = rmdir($this->_manager->toOSPath($this->_absPath))) && ($this->_events)) $this->_manager->dispatchEvent("onFileAction", array(RMDIR_ACTION, &$this)); } else { if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(DELETE_ACTION, &$this)); if (($status = unlink($this->_manager->toOSPath($this->_absPath))) && ($this->_events)) $this->_manager->dispatchEvent("onFileAction", array(DELETE_ACTION, &$this)); } return $status; } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Returns an array of BaseFile instances based on the specified filter instance. * * @param FileFilter &$filter FileFilter instance to filter files by. * @return Array array of File instances based on the specified filter instance. */ function &listFilesFiltered(&$filter) { $dir = $this->_absPath; $files = array(); $dirs = array(); $fileArray = array(); $dirArray = array(); if ($fHnd = opendir($this->_manager->toOSPath($dir))) { // Is there a trailing slash on the dir? Get rid of it //if ($dir[sizeof($dir)] == "/") // $dir = substr($dir, 0, sizeof($dir) -1); while (false !== ($file = readdir($fHnd))) { if ($file == "." || $file == "..") continue; // Returns false if safe mode is on and the user/group is not the same as apache $path = $dir . "/" . $file; if (file_exists($path)) { // We are at root! if ($dir == "/") $dir = ""; if (is_file($path)) $fileArray[] = $file; else $dirArray[] = $file; } } // Close handle closedir($fHnd); sort($dirArray); sort($fileArray); // Add dirs foreach ($dirArray as $adir) { $file = new Moxiecode_LocalFileImpl($this->_manager, $dir . "/" . $adir); if ($filter->accept($file) < 0) continue; array_push($files, $file); } // Add files foreach ($fileArray as $afile) { $file = new Moxiecode_LocalFileImpl($this->_manager, $dir . "/" . $afile); if ($filter->accept($file) < 0) continue; array_push($files, $file); } } return $files; } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. */ function listTree(&$file_tree_handler) { $this->_listTree($this, $file_tree_handler, new Moxiecode_DummyFileFilter(), 0); } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file * if the file filter accepts the file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. * @param FileTreeHandler &$file_filter FileFilter instance to filter files by. */ function listTreeFiltered(&$file_tree_handler, &$file_filter) { $this->_listTree($this, $file_tree_handler, $file_filter, 0); } /** * Creates a new directory. * * @return boolean true- success, false - failure */ function mkdir() { $this->_clearCache(); if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(MKDIR_ACTION, &$this)); $tpl = $this->_getConfigValue("filesystem.local.directory_template", false); if ($tpl) $status = copy($this->_manager->toAbsPath($tpl), $this->_manager->toOSPath($this->_absPath)); else $status = mkdir($this->_manager->toOSPath($this->_absPath)); // Chmod the dir if (($mask = $this->_getConfigValue("filesystem.local.directory_mask", false)) !== false) @chmod($this->_manager->toOSPath($this->_absPath), intval($mask, 8)); // Chown the dir if (($owner = $this->_getConfigValue("filesystem.local.directory_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($this->_absPath), $owner); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(MKDIR_ACTION, &$this)); return $status; } /** * Renames/Moves this file to the specified file instance. * * @param File $dest File to rename/move to. * @return boolean true- success, false - failure */ function renameTo(&$dest) { $this->_clearCache(); // Already exists if ($dest->exists()) return false; if ($this->_events) $this->_manager->dispatchEvent("onBeforeFileAction", array(RENAME_ACTION, &$this, &$dest)); if ($this->_absPath != $dest->_absPath) $status = rename($this->_manager->toOSPath($this->_absPath), $this->_manager->toOSPath($dest->_absPath)); if ($status && $this->_events) $this->_manager->dispatchEvent("onFileAction", array(RENAME_ACTION, &$this, &$dest)); $isFile = is_file($this->_manager->toOSPath($this->_absPath)); // Chmod the file/directory if (($mask = $dest->_getConfigValue("filesystem.local." . ($isFile ? "file" : "directory") . "_mask", false)) !== false) @chmod($this->_manager->toOSPath($dest->_absPath), intval($mask, 8)); // Chown the file/directory if (($owner = $dest->_getConfigValue("filesystem.local." . ($isFile ? "file" : "directory") . "_owner", false)) !== false) $this->_chown($this->_manager->toOSPath($dest->_absPath), $owner); return $status; } /* * Sets the last-modified time of the file or directory. * * @param String $datetime The new date/time to set the file, in timestamp format * @return boolean true- success, false - failure */ function setLastModified($datetime) { $this->_clearCache(); return touch($this->_manager->toOSPath($this->_absPath), $datetime); } /** * Opens a file stream by the specified mode. The default mode is rb. * * @param String $mode Mode to open file by, r, rb, w, wb etc. * @return FileStream File stream implementation for the file system. */ function &open($mode = 'rb') { $this->_clearCache(); $stream = new Moxiecode_LocalFileStream($this, $mode); return $stream; } // * * Private methods function _clearCache() { $this->_statCache = array(); } /** * Lists files recursive, and places the files in the specified array. */ function _listTree($file, &$file_tree_handler, &$file_filter, $level) { $state = $file_tree_handler->CONTINUE; if ($file_filter->accept($file)) { $state = $file_tree_handler->handle($file, $level); if ($state == $file_tree_handler->ABORT || $state == $file_tree_handler->ABORT_FOLDER) return $state; } $files = $file->listFiles(); foreach ($files as $file) { if ($file_filter->accept($file)) { if ($file->isFile()) { // This is some weird shit! //if (!is_object($file_filter)) $state = $file_tree_handler->handle($file, $level); } else { $state = $this->_listTree($file, $file_tree_handler, $file_filter, ++$level); --$level; } } if ($state == $file_tree_handler->ABORT) return $state; } return $file_tree_handler->CONTINUE; } /** * Returns a merged name/value array of config elements. * * @return Array Merged name/value array of config elements. */ function getConfig() { $globalConf = $this->_manager->getConfig(); // Not cached config if (!$this->_config) { $localConfig = array(); $this->_config = $globalConf; // Get files up the tree $accessFiles = array(); $file =& $this; if ($file->isFile()) $file =& $file->getParentFile(); while ($file->exists() && $file->getAbsolutePath() != "/") { $accessFile = new Moxiecode_LocalFileImpl($this->_manager, $file->getAbsolutePath(), $globalConf["filesystem.local.access_file_name"]); if ($accessFile->exists()) $accessFiles[] = $accessFile; // Is not a valid path break loop if (!$this->_manager->verifyPath($file->getParent())) break; $file =& $file->getParentFile(); } // Parse and merge $allowoverrideKeys = array(); foreach ($this->_config as $key => $value) { $keyChunks = explode('.', $key); if ($keyChunks[count($keyChunks)-1] == "allow_override") { foreach (explode(',', $value) as $keySuffix) { $keyChunks[count($keyChunks)-1] = $keySuffix; $allowoverrideKeys[] = implode('.', $keyChunks); } } } foreach (array_reverse($accessFiles) as $accessFile) { $config = array(); // Parse ini file if (($fp = fopen($this->_manager->toOSPath($accessFile->getAbsolutePath()), "r"))) { while (!feof($fp)) { $line = trim(fgets($fp)); // Skip comments if (substr($line, 0, 1) == "#") continue; // Split rows if (($pos = strpos($line, "=")) !== FALSE) $config[substr($line, 0, $pos)] = substr($line, $pos+1); } fclose($fp); } // Handle local config values $curDir = $this->isFile() ? $this->getParent() : $this->getAbsolutePath(); if ($accessFile->getParent() == $curDir) { foreach ($config as $key => $value) { if (substr($key, 0, 1) == '_') $localConfig[substr($key, 1)] = $value; } } // Parse allow keys and deny keys $denyOverrideKeys = array(); foreach ($config as $key => $value) { $keyChunks = explode('.', $key); $lastChunk = $keyChunks[count($keyChunks)-1]; if ($lastChunk == "allow_override" || $lastChunk == "deny_override") { foreach (explode(',', $value) as $keySuffix) { $keyChunks[count($keyChunks)-1] = $keySuffix; $allowDenyKey = implode('.', $keyChunks); if (in_array($allowDenyKey, $allowoverrideKeys)) { if ($lastChunk == "allow_override") $allowoverrideKeys[] = $allowDenyKey; else $denyOverrideKeys[] = $allowDenyKey; } } } } // Remove the denied keys from the allow list /* foreach ($denyOverrideKeys as $denyKey) { for ($i=0; $i $value) { $validAllKey = false; foreach ($allowoverrideKeys as $allowkey) { if (strpos($allowkey, "*") > 0) { $allowkey = str_replace("*", "", $allowkey); // echo $allowkey . "," . $key . strpos($allowkey, $key) . "
        "; if (strpos($key, $allowkey) === 0) { $validAllKey = true; break; } } } if ((in_array($key, $allowoverrideKeys) || $validAllKey) && !in_array($key, $denyOverrideKeys)) { if (strpos($value, '${') !== false) $value = str_replace('${configpath}', $accessFile->getParent(), $value); $this->_config[$key] = $value; } } } // Variable substitute the values foreach ($this->_config as $key => $value) { if (!is_array($value) && strpos($value, '${') !== false) { if ($this->isFile()) $path = $this->getAbsolutePath(); else $path = $this->getParent(); $value = str_replace('${path}', $path, $value); $value = str_replace('${rootpath}', $this->_manager->toUnixPath($this->_manager->_rootPaths[0]), $value); // Handle multiple rootpaths for ($i=0; $i_manager->_rootPaths); $i++) $value = str_replace('${rootpath' . $i . '}', $this->_manager->toUnixPath($this->_manager->_rootPaths[$i]), $value); $this->_config[$key] = $value; } } // Force local config foreach ($localConfig as $key => $value) { //$this->_config[$key] = $value; $validAllKey = false; foreach ($allowoverrideKeys as $allowkey) { if (strpos($allowkey, "*") > 0) { $allowkey = str_replace("*", "", $allowkey); // echo $allowkey . "," . $key . strpos($allowkey, $key) . "
        "; if (strpos($key, $allowkey) === 0) { $validAllKey = true; break; } } } if ((in_array($key, $allowoverrideKeys) || $validAllKey) && !in_array($key, $denyOverrideKeys)) { if (strpos($value, '${') !== false) $value = str_replace('${configpath}', $accessFile->getParent(), $value); $this->_config[$key] = $value; } } /* foreach ($this->_config as $key => $value) { if (in_array($key, $allowoverrideKeys)) { // Seems to be a variable if (strpos($value, '${') !== false) { $matches = array(); preg_match_all('/\${(.*)}/i', $value, $matches); var_dump($matches); foreach ($matches as $match) $this->_config[$key] = str_replace('${' . $match . '}', $this->_config[$match], $this->_config[$key]); } } }*/ } return $this->_config; } /** * Returns a config value by the specified key. * * @param String key Key to return value by. * @param String default_value Optional default value. * @return String Value returned from config. */ function _getConfigValue($key, $default_value = "") { $config = $this->getConfig(); if (isset($config[$key])) return $config[$key] ? $config[$key] : $default_value; else return $default_value; } function _chown($path, $owner) { if ($owner == "") return; $owner = explode(":", $owner); // Only user if (count($owner) == 1) array_push($owner, ""); // Hmm if (count($owner) != 2) return; // Set user if ($owner[0] != "") @chown($path, $owner[0]); // Set group if ($owner[1] != "") @chgrp($path, $owner[1]); } function _cmpByName($file1, $file2) { $al = strtolower($file1->getName()); $bl = strtolower($file2->getName()); if ($al == $bl) return 0; return $al > $bl ? 1 : -1; } } class _LocalCopyDirTreeHandler extends Moxiecode_FileTreeHandler { var $_fromFile; var $_destFile; var $_manager; var $_handle_as_add_event; function _LocalCopyDirTreeHandler(&$manager, $from_file, $dest_file, $handle_as_add_event) { $this->_manager = $manager; $this->_fromFile = $from_file; $this->_destFile = $dest_file; $this->_handle_as_add_event = $handle_as_add_event; } /** * Handles a file instance while looping an tree of directories. * * @param File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $toPath = $this->_destFile->getAbsolutePath(); $toPath .= substr($file->getAbsolutePath(), strlen($this->_fromFile->getAbsolutePath())); $toFile = $this->_manager->getFile($toPath); //debug($file->getAbsolutePath() . "->" . $toPath); // Do action if ($file->isDirectory()) $toFile->mkdir(); else $file->copyTo($toFile); return $this->CONTINUE; } } class _LocalDeleteDirTreeHandler extends Moxiecode_FileTreeHandler { var $_manager; var $_dir; var $_files; function _LocalDeleteDirTreeHandler(&$manager, $dir) { $this->_manager = $manager; $this->_dir = $dir; $this->_files = array(); } /** * Returns all the files and dirs. * * @return Array All the files and dirs. */ function getFiles() { return $this->_files; } /** * Handles a file instance while looping an tree of directories. * * @param File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $this->_files[] = $file; //$file->delete(); return $this->CONTINUE; } } class Moxiecode_LocalFileStream extends Moxiecode_FileStream { var $_fp; var $_file; function Moxiecode_LocalFileStream(&$file, $mode) { $this->_file = $file; $this->_fp = fopen($file->getAbsolutePath(), $mode); } function skip($bytes) { $pos = ftell($this->_fp); fseek($this->_fp, $bytes, SEEK_CUR); return ftell($this->_fp) - $pos; } function read($len = 1024) { return fread($this->_fp, $len); } function readToEnd() { $data = ""; while (($chunk = $this->read(1024)) != null) $data .= $chunk; return $data; } function write($buff, $len = -1) { if ($len == -1) return fwrite($this->_fp, $buff); return fwrite($this->_fp, $buff, $len); } function close() { $this->_file->_clearCache(); @fclose($this->_fp); $this->_fp = null; } } ?>plugins/filemanager/classes/FileSystems/BaseFileImpl.php000066600000010530150472426320017420 0ustar00_manager =& $manager; $this->_type = $type; if ($child_name != "") $this->_absPath = $this->_manager->removeTrailingSlash($absolute_path) . "/" . $child_name; else $this->_absPath = $absolute_path; } /** * Set a bool regarding events triggering. * * @param Bool $trigger Trigger or not to trigger. */ function setTriggerEvents($trigger) { $this->_events = $trigger; } /** * Returns bool if events are to be triggered or not. * * @return Bool bool for triggering events or not. */ function getTriggerEvents() { return $this->_events; } /** * Returns the parent files absolute path. * * @return String parent files absolute path. */ function getParent() { $pathAr = explode("/", $this->getAbsolutePath()); array_pop($pathAr); $path = implode("/", $pathAr); return ($path == "") ? "/" : $path; } /** * Returns the file name of a file. * * @return string File name of file. */ function getName() { return basename($this->_absPath); } /** * Returns the absolute path of the file. * * @return String absolute path of the file. */ function getAbsolutePath() { return $this->_absPath; } /** * Returns true if the file is a directory. * * @return boolean true if the file is a directory. */ function isDirectory() { if (!$this->exists()) return $this->_type == MC_IS_DIRECTORY; return is_dir($this->_manager->toOSPath($this->_absPath)); } /** * Returns true if the file is a file. * * @return boolean true if the file is a file. */ function isFile() { if (!$this->exists()) return $this->_type == MC_IS_FILE; return !$this->isDirectory(); } /** * Returns an array of File instances. * * @return Array array of File instances. */ function &listFiles() { $files = $this->listFilesFiltered(new Moxiecode_DummyFileFilter()); return $files; } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. */ function listTree(&$file_tree_handler) { $this->_listTree($this, $file_tree_handler, new Moxiecode_DummyFileFilter(), 0); } /** * Lists the file as an tree and calls the specified FileTreeHandler instance on each file * if the file filter accepts the file. * * @param FileTreeHandler &$file_tree_handler FileTreeHandler to invoke on each file. * @param FileTreeHandler &$file_filter FileFilter instance to filter files by. */ function listTreeFiltered(&$file_tree_handler, &$file_filter) { $this->_listTree($this, $file_tree_handler, $file_filter, 0); } // * * Private methods /** * Lists files recursive, and places the files in the specified array. */ function _listTree($file, &$file_tree_handler, &$file_filter, $level) { $state = $file_tree_handler->CONTINUE; if ($file_filter->accept($file)) { $state = $file_tree_handler->handle($file, $level); if ($state == $file_tree_handler->ABORT || $state == $file_tree_handler->ABORT_FOLDER) return $state; } $files = $file->listFiles(); foreach ($files as $file) { if ($file_filter->accept($file)) { if ($file->isFile()) { // This is some weird shit! //if (!is_object($file_filter)) $state = $file_tree_handler->handle($file, $level); } else { $state = $this->_listTree($file, $file_tree_handler, $file_filter, ++$level); --$level; } } if ($state == $file_tree_handler->ABORT) return $state; } return $file_tree_handler->CONTINUE; } } ?>plugins/filemanager/classes/FileSystems/BaseFile.php000066600000014545150472426320016610 0ustar00plugins/filemanager/classes/FileSystems/FileStream.php000066600000002526150472426320017165 0ustar00plugins/filemanager/classes/FileSystems/RootFileImpl.php000066600000002617150472426320017500 0ustar00_manager; $files = array(); $roots = $man->getRootPaths(); foreach ($roots as $root) { $file = $man->getFile($root); // Configured root doesn't exists if (!$file->exists()) { error("Configured root: " . $root . " could not be found."); continue; } if ($filter->accept($file)) $files[] = $file; } return $files; } } ?>plugins/filemanager/classes/FileSystems/FileTreeHandler.php000066600000011423150472426320020123 0ustar00_onlyFiles = false; $this->_onlyDirs = false; } /** * Sets only files mode. * * @param bool $only_files true if only files should be added to output. */ function setOnlyFiles($only_files) { $this->_onlyFiles = $only_files; } /** * Gets only files mode. * * @return bool true if only files should be added to output. */ function getOnlyFiles() { return $this->_onlyFiles; } /** * Sets only dirs mode. * * @param bool $only_dirs true if only dirs should be added to output. */ function setOnlyDirs($only_dirs) { $this->_onlyDirs = $only_dirs; } /** * Gets only dirs mode. * * @return bool true if only dirs should be added to output. */ function getOnlyDirs() { return $this->_onlyDirs; } /** * Sets the max level to include in tree parse. * * @param int $level max level to include in tree parse. */ function setMaxLevel($level) { $this->_maxLevel = $level; } /** * Sets is the result is to be built in to an array or not. * The result is returned by getFileArray when the tree list completes. * Note: The default value of this state is false. * * @param boolean $state True if the result is to be built in to an array or not. */ function setMakeArray($state) { $this->_makeArray = $state; if ($this->_makeArray) $this->_array = array(); } /** * Returns the tree as an array of MCE_File instances. This method * will not return anything if the setMakeArray isn't set to true. * * @return Array Array of MCE_File instances. */ function &getFileArray() { return $this->_array; } /** * Handles a file instance while looping an tree of directories. * * @param MCE_File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { $add = true; if (is_array($this->_array) && $this->_onlyDirs && $file->isFile()) $add = false; if (is_array($this->_array) && $this->_onlyFiles && $file->isDir()) $add = false; if ($add) $this->_array[] = $file; if ($this->_maxLevel && $level >= $this->_maxLevel) return $this->ABORT_FOLDER; return $this->CONTINUE; } /**#@-*/ } class Moxiecode_ConfigFilteredFileTreeHandler extends Moxiecode_BasicFileTreeHandler { var $_config; /** * Handles a file instance while looping an tree of directories. * * @param MCE_File $file File object reference * @param int $level Current level of tree parse * @return int State of what to do next can be CONTINUE, ABORT or ABORTFOLDER. */ function handle($file, $level) { if ($file->isDirectory() || !is_array($this->_config)) { if ($level == 0) return parent::handle($file, $level); else $parentFile = $file->getParentFile(); $this->_config = $parentFile->getConfig(); } $filter = new Moxiecode_BasicFileFilter(); $filter->setIncludeFilePattern($this->_config['filesystem.include_file_pattern']); $filter->setExcludeFilePattern($this->_config['filesystem.exclude_file_pattern']); $filter->setIncludeDirectoryPattern($this->_config['filesystem.include_directory_pattern']); $filter->setExcludeDirectoryPattern($this->_config['filesystem.exclude_directory_pattern']); $filter->setOnlyDirs($this->_onlyDirs); if (!$filter->accept($file)) return $this->ABORT_FOLDER; return parent::handle($file, $level); } } ?>plugins/filemanager/classes/FileSystems/FileFilter.php000066600000026267150472426320017167 0ustar00_filters = array(); } /** * Adds a new filter to check. * * @param Moxiecode_FileFilter $file_filter Filter to add. */ function addFilter(&$file_filter) { $this->_filters[] = $file_filter; } /** * Returns true or false if the file is accepted or not. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { for ($i = 0; $i < count($this->_filters); $i++) { $state = $this->_filters[$i]->accept($file); if ($state < 0) return $state; } return 1; } } /** * DummyFileFiler this filter accepts all files. * * @package mce.core */ class Moxiecode_DummyFileFilter extends Moxiecode_FileFilter { /** * Returns true or false if the file is accepted or not. * Note: This dummb method allways returns true. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { return true; } } // Define reason constants define('BASIC_FILEFILTER_ACCEPTED', 1); define('BASIC_FILEFILTER_INVALID_EXTENSION', -1); define('BASIC_FILEFILTER_INVALID_NAME', -2); /** * Basic file filter, this class handles some common filter problems * and is possible to extend if needed. * * @package mce.core */ class Moxiecode_BasicFileFilter extends Moxiecode_FileFilter { /**#@+ * @access private */ var $_excludeFolders; var $_includeFolders; var $_excludeFiles; var $_includeFiles; var $_includeFilePattern; var $_excludeFilePattern; var $_includeDirectoryPattern; var $_excludeDirectoryPattern; var $_filesOnly; var $_dirsOnly; var $_includeWildcardPattern; var $_excludeWildcardPattern; var $_extensions; var $_maxLevels; var $_debug; /**#@+ * @access public */ /** * Main constructor. */ function BasicFileFilter() { $this->_debug = false; $this->_extensions = ""; } /** * Sets if debug mode is on or off, default off. * * @param boolean $state if true debug mode is enabled. */ function setDebugMode($state) { $this->_debug = $state; } /** * Sets if only files are to be accepted in result. * * @param boolean $files_only True if only files are to be accepted. */ function setOnlyFiles($files_only) { $this->_filesOnly = $files_only; } /** * Sets if only dirs are to be accepted in result. * * @param boolean $dirs_only True if only dirs are to be accepted. */ function setOnlyDirs($dirs_only) { $this->_dirsOnly = $dirs_only; } /** * Sets maximum number of directory levels to accept. * * @param int $max_levels Maximum number of directory levels to accept. */ function setMaxLevels($max_levels) { $this->_maxLevels = $max_levels; } /** * Sets a comma separated list of valid file extensions. * * @param String $extensions Comma separated list of valid file extensions. */ function setIncludeExtensions($extensions) { if ($extensions == "*" || $extensions == "") return; $this->_extensions = explode(',', strtolower($extensions)); } /** * Sets comma separated string list of filenames to exclude. * * @param String $files separated string list of filenames to exclude. */ function setExcludeFiles($files) { if ($files != "") $this->_excludeFiles = split(',', $files); } /** * Sets comma separated string list of filenames to include. * * @param String $files separated string list of filenames to include. */ function setIncludeFiles($files) { if ($files != "") $this->_includeFiles = split(',', $files); } /** * Sets comma separated string list of foldernames to exclude. * * @param String $folders separated string list of foldernames to exclude. */ function setExcludeFolders($folders) { if ($folders != "") $this->_excludeFolders = split(',', $folders); } /** * Sets comma separated string list of foldernames to include. * * @param String $folders separated string list of foldernames to include. */ function setIncludeFolders($folders) { if ($folders != "") $this->_includeFolders = split(',', $folders); } /** * Sets a regexp pattern that is used to accept files path parts. * * @param String $pattern regexp pattern that is used to accept files path parts. */ function setIncludeFilePattern($pattern) { $this->_includeFilePattern = $pattern; } /** * Sets a regexp pattern that is used to deny files path parts. * * @param String $pattern regexp pattern that is used to deny files path parts. */ function setExcludeFilePattern($pattern) { $this->_excludeFilePattern = $pattern; } /** * Sets a regexp pattern that is used to accept directory path parts. * * @param String $pattern regexp pattern that is used to accept directory path parts. */ function setIncludeDirectoryPattern($pattern) { $this->_includeDirectoryPattern = $pattern; } /** * Sets a regexp pattern that is used to deny directory path parts. * * @param String $pattern regexp pattern that is used to deny directory path parts. */ function setExcludeDirectoryPattern($pattern) { $this->_excludeDirectoryPattern = $pattern; } /** * Sets a wildcard pattern that is used to accept files path parts. * * @param String $pattern wildcard pattern that is used to accept files path parts. */ function setIncludeWildcardPattern($pattern) { if ($pattern != "") $this->_includeWildcardPattern = $pattern; } /** * Sets a wildcard pattern that is used to deny files path parts. * * @param String $pattern wildcard pattern that is used to deny files path parts. */ function setExcludeWildcardPattern($pattern) { if ($pattern != "") $this->_excludeWildcardPattern = $pattern; } /** * Returns true or false if the file is accepted or not. * * @param MCE_File $file File to grant or deny. * @return boolean true or false if the file is accepted or not. */ function accept(&$file) { $name = $file->getName(); $absPath = $file->getAbsolutePath(); $isFile = $file->isFile(); // Handle exclude folders if (is_array($this->_excludeFolders)) { foreach ($this->_excludeFolders as $folder) { if (strpos($absPath, $folder) != "") { if ($this->_debug) debug("File denied \"" . $absPath . "\" by \"excludeFolders\"."); return BASIC_FILEFILTER_INVALID_NAME; } } } // Handle include folders if (is_array($this->_includeFolders)) { $state = false; foreach ($this->_includeFolders as $folder) { if (strpos($absPath, $folder) != "") { $state = true; break; } } if (!$state) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFolders\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle exclude files if (is_array($this->_excludeFiles) && $isFile) { foreach ($this->_excludeFiles as $fileName) { if ($name == $fileName) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeFiles\"."); return BASIC_FILEFILTER_INVALID_NAME; } } } // Handle include files if (is_array($this->_includeFiles) && $isFile) { $state = false; foreach ($this->_includeFiles as $fileName) { if ($name == $fileName) { $state = true; break; } } if (!$state) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFiles\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle file patterns if ($isFile) { if ($this->_dirsOnly) { if ($this->_debug) debug("File denied \"" . $absPath . "\" by \"dirsOnly\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude pattern if ($this->_excludeFilePattern && preg_match($this->_excludeFilePattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeFilePattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle include pattern if ($this->_includeFilePattern && !preg_match($this->_includeFilePattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeFilePattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } } else { if ($this->_filesOnly) { if ($this->_debug) debug("Dir denied \"" . $absPath . "\" by \"filesOnly\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude pattern if ($this->_excludeDirectoryPattern && preg_match($this->_excludeDirectoryPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeDirectoryPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle include pattern if ($this->_includeDirectoryPattern && !preg_match($this->_includeDirectoryPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeDirectoryPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } } // Handle include wildcard pattern if ($this->_includeWildcardPattern && !$this->_fnmatch($this->_includeWildcardPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"includeWildcardPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle exclude wildcard pattern if ($this->_excludeWildcardPattern && $this->_fnmatch($this->_excludeWildcardPattern, $name)) { if ($this->_debug) debug("File \"" . $absPath . "\" denied by \"excludeWildcardPattern\"."); return BASIC_FILEFILTER_INVALID_NAME; } // Handle file exntetion pattern if (is_array($this->_extensions) && $isFile) { $ar = explode('.', $absPath); $ext = strtolower(array_pop($ar)); $valid = false; foreach ($this->_extensions as $extension) { if ($extension == $ext) { $valid = true; break; } } if (!$valid) return BASIC_FILEFILTER_INVALID_EXTENSION; } return BASIC_FILEFILTER_ACCEPTED; } function _fnmatch($pattern, $file) { return ereg($this->_fnmatch2regexp(strtolower($pattern)), strtolower($file)); } function _fnmatch2regexp($str) { $s = ""; for ($i = 0; $iplugins/filemanager/classes/ManagerEngine.php000066600000100543150472426320015361 0ustar00_plugins = array(); $this->_prefixes = array(); $this->_rootPaths = array(); $this->_config = array(); $this->_type = $type; } /** * Sets the name/value array of config options. This method will also force some relative config option paths to absolute. * * @param Array $config Name/value array of config options. * @param bool $setup_values True/false if the paths etc of the config should be set to default values or not. */ function setConfig($config, $setup_values = true) { $this->_rootPaths = array(); if ($setup_values) { // Auto add rootpaths and force them absolute in config $newRoots = array(); $roots = explode(';', $config['filesystem.rootpath']); foreach ($roots as $root) { $rootParts = explode('=', $root); // Unnamed root if (count($rootParts) == 1) { $rootParts[0] = $this->removeTrailingSlash($this->toAbsPath($rootParts[0])); $this->addRootPath($rootParts[0]); } // Named root if (count($rootParts) == 2) { $rootParts[1] = $this->removeTrailingSlash($this->toAbsPath($rootParts[1])); $this->addRootPath($rootParts[1]); } $newRoots[] = implode('=', $rootParts); } $config['filesystem.rootpath'] = implode(';', $newRoots); // Force absolute path if ($config['filesystem.path'] == "") $config['filesystem.path'] = $this->_rootPaths[0]; else $config['filesystem.path'] = $this->removeTrailingSlash($this->toAbsPath($config['filesystem.path'])); // Check if path is within any of the roots $found = false; foreach ($this->_rootPaths as $root) { if ($this->isChildPath($root, $config['filesystem.path'])) { $found = true; break; } } // Path was not within any of the rootpaths use the first one if (!$found) $config['filesystem.path'] = $this->_rootPaths[0]; // Setup absolute wwwroot if (isset($config['preview.wwwroot']) && $config['preview.wwwroot']) $config['preview.wwwroot'] = $this->toUnixPath($this->toAbsPath($config['preview.wwwroot'])); else $config['preview.wwwroot'] = $this->getSiteRoot(); // Setup preview.urlprefix if ($config["preview.urlprefix"]) { if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") $config["preview.urlprefix"] = str_replace("{proto}", "https", $config["preview.urlprefix"]); else $config["preview.urlprefix"] = str_replace("{proto}", "http", $config["preview.urlprefix"]); $config["preview.urlprefix"] = str_replace("{host}", $_SERVER['HTTP_HOST'], $config["preview.urlprefix"]); $config["preview.urlprefix"] = str_replace("{port}", $_SERVER['SERVER_PORT'], $config["preview.urlprefix"]); } } $this->_config =& $config; } function getType() { return $this->_type; } function setLangPackPath($path) { $this->_langPackPath = $path; } function getLangPackPath() { return $this->_langPackPath; } /** * Returns a LanguagePack instance of the current language pack. * * @return LanguagePack Instance of the current language pack. */ function &getLangPack() { if (!$this->_language) { $config = $this->getConfig(); $this->_language = new Moxiecode_LanguagePack(); $this->_language->load($this->toAbsPath("language/" . $this->_langPackPath . "/" . $config['general.language'] . ".xml")); } return $this->_language; } /** * Returns a lang item by group and key. * * @param string $group Language group to look in. * @param string $item Item to get inside group. * @param Array $replace Name/Value array of variables to replace in language pack. * @return string Language pack string loaded from XML file. */ function getLangItem($group, $item, $replace = array()) { $pack =& $this->getLangPack(); $string = $pack->get($group, $item); foreach ($replace as $key => $val) $string = str_replace("{". $key ."}", $val, $string); return $string; } /** * Returns an array of plugin paths to be loaded/required/includes. * * @return Array Array of file paths to load. */ function getPluginPaths() { global $basepath; $config = $this->getConfig(); $plugins = array(); if (isset($config["general.plugins"]) && $config["general.plugins"]) $plugins = preg_split("/,/i", $config["general.plugins"]); $out = array(); foreach($plugins as $plugin) { if (!isset($this->_plugins[strtolower($plugin)])) { // Check for single file plugins if (file_exists($basepath . "../plugins/" . $plugin . ".php")) $out[] = "plugins/" . $plugin . ".php"; else $out[] = "plugins/" . $plugin . "/". $plugin . ".php"; } } // Check the string first if ($config["authenticator"] == "") $config["authenticator"] = "BaseAuthenticator"; $authenticators = array(); // Check string for delimiter, preg_split returns php warning if delimiter is not found! if (strpos($config["authenticator"], "+") || strpos($config["authenticator"], "|")) $authenticators = preg_split("/\+|\|/i", $config["authenticator"], -1, PREG_SPLIT_NO_EMPTY); if (count($authenticators) != 0) { foreach ($authenticators as $auth) { // Check for single file plugins if (!isset($this->_plugins[strtolower($auth)])) { if (file_exists($basepath . "../plugins/" . $auth . ".php")) $out[] = "plugins/" . $auth . ".php"; else $out[] = "plugins/" . $auth . "/". $auth . ".php"; } } } else { if (!isset($this->_plugins[strtolower($config["authenticator"])])) { if (file_exists($basepath . "Authenticators/" . $config["authenticator"] . ".php")) $out[] = "classes/Authenticators/" . $config["authenticator"] . ".php"; else if (file_exists($basepath . "../plugins/" . $config["authenticator"] . ".php")) $out[] = "plugins/" . $config["authenticator"] . ".php"; else $out[] = "plugins/" . $config["authenticator"] . "/" . $config["authenticator"] . ".php"; } } // Check so that they all exists foreach ($out as $path) { if (!file_exists($basepath . "../" . $path)) trigger_error("Plugin could not be found: " . $path, FATAL); } return $out; } /** * Adds a path to the list of root paths. * * @param String $path Path to add must be a absolute path. */ function addRootPath($path) { $this->_rootPaths[] = $path; } /** * Returns an array of root paths. * * @return Array Root paths. */ function getRootPaths() { return $this->_rootPaths; } /** * Returns a plugin by id/name. * * @param String $name Plugin id/name. * @return MCManagerPlugin instance object. */ function getPlugin($name) { return isset($this->_plugins[$name]) ? $this->_plugins[$name] : null; } /** * Returns a true/false check for plugin. * * @param String $name Plugin id/name. * @return Bool true/false */ function hasPlugin($name) { return isset($this->_plugins[$name]); } /** * Returns a name/value array of plugins. * * @return Array name/value array of MCManagerPlugin instances. */ function getPlugins() { return $this->_plugins; } /** * Registers a plugin by id/name. * * @param $name Id/name to register plugin by. * @param $plugin Plugin instance to register/add to list. * * @return SmallMCEPlugin The added plugin instance. */ function ®isterPlugin($name, &$plugin, $prefix = false) { $name = strtolower($name); $this->_plugins[$name] =& $plugin; if ($prefix != false) $this->_prefixes[$name] = $prefix; return $plugin; } /** * Returns the MCManager config as name/value array. * * @return Array MCManager config as name/value array. */ function &getConfig() { return $this->_config; } /** * Returns the a config item by name. * * @param string $key Config item key to retrive. * @param string $def Default value to return. * @return mixed config item by name. */ function getConfigItem($key, $def = false) { return isset($this->_config[$key]) ? $this->_config[$key] : $def; } /** * Returns a merged JS config. It will only export configured items controlled by the allow_export suffix. * * @return Array Name/Value array of JS config options. */ function &getJSConfig($config = false, $prefixes = '*') { $encrypted = array("filesystem.path", "filesystem.rootpath", "filesystem.directory_templates"); $jsConfig = array(); $prefixes = explode(",", $prefixes); if (!$config) $config = $this->getConfig(); foreach ($config as $name => $value) { $pos = strpos($name, ".allow_export"); if ($pos > 0) { $names = explode(",", $value); $prefix = substr($name, 0, $pos); if (in_array("*", $prefixes) || in_array($prefix, $prefixes)) { foreach ($names as $key) { $key = $prefix . "." . $key ; // Encrypt some paths if (in_array($key, $encrypted)) $jsConfig[$key] = "" . $this->encryptPath($config[$key]); else $jsConfig[$key] = "" . is_bool($config[$key]) ? ($config[$key] ? "true" : "false") : $config[$key]; } } } } return $jsConfig; } /** * Encrypts the specified path so that it doesn't contain full paths on the client side of the application. * * @param string $path Path to encrypt. * @return string Encrypted short path. */ function encryptPath($path) { $config = $this->getConfig(); if (checkBool($config['general.encrypt_paths'])) { $count = 0; foreach ($this->_rootPaths as $rootPath) { // Needs encryption? if ($rootPath != "/") $path = str_replace($rootPath, "{" . $count++ . "}", $path); } } return utf8_encode($path); } /** * Decrypts the specified path from a non absolute path to a absolute path. * * @param string $path Path to decrypt. * @return string Decrypted absolute path. */ function decryptPath($path) { if (!$path) return ""; $count = 0; $path = $this->toUnixPath($path); // Is relative path if (!(strpos($path, '/') === 0 || strpos($path, ':') !== false || strpos($path, '{') !== false)) $path = realpath(dirname(__FILE__) . '/../' . $path); foreach ($this->_rootPaths as $rootPath) $path = str_replace("{" . $count++ . "}", $rootPath, $path); $path = str_replace("{default}", $this->_config["filesystem.path"], $path); return $path; } /** * isAuthenticated checks against the configuration and sends events to auth plugins. * This method will also call the onBeforeInit, onInit and onAfterInit methods if the user was authenticated. * * @return bool Returns true if authenticated, false if not. */ function isAuthenticated() { $config = $this->getConfig(); $authenticators = strtolower($config["authenticator"]); // Check the string first if ($authenticators != "" && $authenticators != "BaseAuthenticator") { if (strpos($authenticators, "|") && strpos($authenticators, "+")) trigger_error("You can not use both + and | at the same time for adding authenticators.", FATAL); $pass = false; // Check for AND authenticators if (strpos($authenticators, "+")) { $authArray = preg_split("/\+/i", $authenticators, -1, PREG_SPLIT_NO_EMPTY); if (!$authArray) trigger_error("No Authenticator could be used.", FATAL); // Verify that all authenticators exists foreach($authArray as $auth) { if (!$this->hasPlugin($auth)) trigger_error("Authenticator \"". htmlentities($auth) ."\" was not found.", FATAL); } // Default to true $pass = true; // Send AND event foreach ($authArray as $auth) { $plugin = $this->getPlugin($auth); if ($pass && !$plugin->onAuthenticate($this)) $pass = false; } // Check for OR authentocator string } else if (strpos($authenticators, "|")) { $authArray = preg_split("/\|/i", $authenticators, -1, PREG_SPLIT_NO_EMPTY); if (!$authArray) trigger_error("No Authenticator could be used.", FATAL); // Verify that all authenticators exists foreach ($authArray as $auth) { if (!$this->hasPlugin($auth)) trigger_error("Authenticator \"". htmlentities($auth) ."\" was not found.", FATAL); } // Default to false $pass = false; // Send OR event foreach ($authArray as $auth) { $plugin = $this->getPlugin($auth); if ($plugin->onAuthenticate($this)) $pass = true; } } else { $plugin = $this->getPlugin($authenticators); if ($plugin->onAuthenticate($this)) $pass = true; } } else $pass = true; // Is authenticated, call onInit if ($pass) $this->dispatchEvent("onInit"); // Set config again to update rootpaths etc $this->setConfig($this->_config); return $pass; } /** * Dispatches a event to all registered plugins. This method will loop through all plugins and call the specific event if this * event method returns false the chain will be terminated. * * @param String $event Event name to be dispatched for example onAjaxCommand. * @param Array $args Optional array with arguments. * @return Bool Returns true of a plugin returned true, false if not. */ function dispatchEvent($event, $args=false) { // Setup event arguments $keys = array_keys($this->_plugins); for ($i=0; $i_plugins[$keys[$i]]; // Valid prefix if (isset($this->_prefixes[$keys[$i]])) { if ($this->_type != $this->_prefixes[$keys[$i]]) continue; } switch ($event) { case "onAuthenticate": if (!$plugin->onAuthenticate($this)) return false; break; case "onInit": if (!$plugin->onInit($this)) return false; break; case "onPreInit": if (!$plugin->onPreInit($this, $args[0])) return false; break; case "onLogin": if (!$plugin->onLogin($this)) return false; break; case "onLogout": if (!$plugin->onLogout($this)) return false; break; case "onBeforeFileAction": if (!isset($args[2])) $args[2] = null; if (!$plugin->onBeforeFileAction($this, $args[0], $args[1], $args[2])) return false; break; case "onFileAction": if (!isset($args[2])) $args[2] = null; if (!$plugin->onFileAction($this, $args[0], $args[1], $args[2])) return false; break; case "onBeforeRPC": if (!$plugin->onBeforeRPC($this, $args[0], $args[1])) return false; break; case "onBeforeStream": if (!$plugin->onBeforeStream($this, $args[0], $args[1])) return false; break; case "onStream": if (!$plugin->onStream($this, $args[0], $args[1])) return false; break; case "onAfterStream": if (!$plugin->onAfterStream($this, $args[0], $args[1])) return false; break; case "onBeforeUpload": if (!$plugin->onBeforeUpload($this, $args[0], $args[1])) return false; break; case "onAfterUpload": if (!$plugin->onAfterUpload($this, $args[0], $args[1])) return false; break; case "onCustomInfo": if (!$plugin->onCustomInfo($this, $args[0], $args[1], $args[2])) return false; break; case "onListFiles": if (!$plugin->onListFiles($this, $args[0], $args[1])) return false; break; case "onInsertFile": if (!$plugin->onInsertFile($this, $args[0])) return false; break; } } return true; } /** * Executes a event in all registered plugins if a plugin returns a object or array the execution chain will be * terminated. * * @param String $event Event name to be dispatched for example onAjaxCommand. * @param Array $args Optional array with arguments. * @return Bool Returns true of a plugin returned true, false if not. */ function executeEvent($event, $args=false) { // Setup event arguments $keys = array_keys($this->_plugins); for ($i=0; $i_plugins[$keys[$i]]; // Valid prefix if (isset($this->_prefixes[$keys[$i]])) { if ($this->_type != $this->_prefixes[$keys[$i]]) continue; } switch ($event) { case "onRPC": $result =& $plugin->onRPC($this, $args[0], $args[1]); if (!is_null($result)) return $result; break; case "onUpload": $result =& $plugin->onUpload($this, $args[0], $args[1]); if (!is_null($result)) return $result; break; } } return null; } function getInvalidFileMsg() { return $this->_invalidFileMsg; } /** * Returns the wwwroot if it fails it will trigger a fatal error. * * @return String wwwroot or null string if it was impossible to get. */ function getSiteRoot() { // Check config if (isset($this->_config['preview.wwwroot']) && $this->_config['preview.wwwroot']) return $this->toUnixPath(realpath($this->_config['preview.wwwroot'])); // Try script file if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["SCRIPT_FILENAME"])) { $path = str_replace($this->toUnixPath($_SERVER["SCRIPT_NAME"]), "", $this->toUnixPath($_SERVER["SCRIPT_FILENAME"])); if (is_dir($path)) return $this->toUnixPath(realpath($path)); } // If all else fails, try this. if (isset($_SERVER["SCRIPT_NAME"]) && isset($_SERVER["PATH_TRANSLATED"])) { $path = str_replace($this->toUnixPath($_SERVER["SCRIPT_NAME"]), "", str_replace("//", "/", $this->toUnixPath($_SERVER["PATH_TRANSLATED"]))); if (is_dir($path)) return $this->toUnixPath(realpath($path)); } // Check document root if (isset($_SERVER['DOCUMENT_ROOT'])) return $this->toUnixPath(realpath($_SERVER['DOCUMENT_ROOT'])); trigger_error("Could not resolve WWWROOT path, please set an absolute path in preview.wwwroot config option. Check the Wiki documentation for details.", FATAL); return null; } /** * Returns a absolute file system path of a absolute URI path for example /mydir/myfile.htm * will be resolved to /www/mywwwroot/mydir/myfile.htm. * * @param String $uri Absolute URI path for example /mydir/myfile.htm * @param String $root Option site root to use. * @return String Absolute file system path or empty string on failure. */ function resolveURI($uri, $root = false) { // Use default root if not specified if (!$root) $root = $this->getSiteRoot(); return realpath($root . $uri); } /** * Returns a site absolute path from a absolute file system path for example /www/mywwwroot/mydir/myfile.htm * will be converted to /mydir/myfile.htm. * * @param String $abs_path Absolute path for example /mydir/myfile.htm * @return String Site absolute path (URI) or empty string on failure. */ function convertPathToURI($abs_path, $root = false) { $log =& $this->getLogger(); // No root defined use specified root if (!$root) $root = $this->getSiteRoot(); if (!$root) { trigger_error("Could not resolve WWWROOT path, please set an absolute path in preview.wwwroot config option.", FATAL); die(); } if ($root == "/") { if ($log && $log->isDebugEnabled()) $log->info("ConvertPathToURI: SiteRoot=" . $root . ", Path: " . $abs_path . " -> URI: " . $abs_path); return $abs_path; } $uri = substr($abs_path, strlen($root)); if ($log && $log->isDebugEnabled()) $log->info("ConvertPathToURI: SiteRoot=" . $root . ", Path: " . $abs_path . " -> URI: " . $uri); return $uri; } /** * Converts a URI such as /somedir/somefile.gif to /system/path/somedir/somefile.gif * * @param String $uri URI to convert to path. * @param String $root Optional site root to use. * @return String Path out of URI. */ function convertURIToPath($uri, $root = false) { $log =& $this->getLogger(); if (!$root) $root = $this->getSiteRoot(); if ($log && $log->isDebugEnabled()) $log->info("ConvertURIToPath: SiteRoot=" . $root . ", URI: " . $uri . " -> Path: " . $this->removeTrailingSlash($root) . $uri); return $this->removeTrailingSlash($root) . $uri; } /** * Converts an path into a visualy presentatble path. So that special folder names * gets translated and root paths gets replaced with their names. * * @param String $path Path to convert into a visual path. * @return String Visual path based on input path. */ function toVisualPath($path, $root = false) { $fs = "file"; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } $path = $this->decryptPath($path); // Speficied root if ($root) { $pos = strpos($path, $root); if ($pos === 0) $path = substr($path, strlen($root)); if ($path == "") $path = "/"; // Re-attach fs if ($fs != "file") $path = $fs . "://" . $path; return $this->encryptPath($path); } // Use config roots $rootNames = $this->_getRootNames(); foreach ($rootNames as $rootPath => $name) { $pos = strpos($path, $rootPath); if ($pos === 0) { $path = substr($path, strlen($rootPath)); if ($name == "/") $name = ""; $path = "/" . $name . $path; } } if (!$path) $path = "/"; // Re-attach fs if ($fs != "file") $path = $fs . "://" . $path; return $this->encryptPath($path); } /** * Verifies that a path is within the parent path. * * @param String $parent_path Parent path that must contain the path. * @param String $path Path that must contained the parent path. * @return Bool true if it's valid, false if it's not. */ function isChildPath($parent_path, $path) { return strpos(strtolower($path), strtolower($parent_path)) === 0; } /** * Checks if a specific tool is enabled or not. * * @param string $tool Tool to check for. * @param Array $config Name/Value config array to check tool against. * @return bool true/false if the tool is enabled or not. */ function isToolEnabled($tool, $config = false) { if (!$config) $config = $this->getConfig(); $ar = explode(',', $config['general.disabled_tools']); if (in_array($tool, $ar)) return false; $ar = explode(',', $config['general.tools']); if (in_array($tool, $ar)) return true; return false; } /** * Verifies that the specified path is within valid root paths. * * @param String $path Path to verify. * @return Bool true if the path is valid, false if it's invalid. */ function verifyPath($path) { $fs = "file"; $valid = false; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } // Filesystem wasn't found if (!isset($this->_fileSystems[$fs])) { trigger_error($this->getLangItem("error", "no_filesystem", array("path" => $path)), FATAL); die(); } $path = $this->decryptPath($path); // /../ is never valid if (indexOf($this->addTrailingSlash($path), "/../") != -1) return false; if ($fs != 'file') return true; foreach ($this->_rootPaths as $rootPath) { if ($this->isChildPath($rootPath, $path)) $valid = true; } return $valid; } /** * Returns the file system for a path for file if it couldn't be extracted. * * @param string $path Path to get FS from. * @return string Filesystem for path. */ function getFSFromPath($path) { $fs = "file"; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) $fs = $matches[1]; return $fs; } /** * Verifies that the specified file is valid agains the filters specified in config. * * @param String $path Path to verify. * @param String $action Action to get config options by. * @param Array $config Name/Value array of config options. * @return int Reason why it was denied. */ function verifyFile($file, $action = false, $config = false) { $config = $config ? $config : $file->getConfig(); // Verify filesystem config $fileFilter = new Moxiecode_BasicFileFilter(); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); $this->_invalidFileMsg = "{#error.invalid_filename}"; $status = $fileFilter->accept($file); if ($status != BASIC_FILEFILTER_ACCEPTED) { if ($status == BASIC_FILEFILTER_INVALID_NAME) { if ($file->isFile() && isset($config['filesystem.invalid_file_name_msg'])) $this->_invalidFileMsg = $config['filesystem.invalid_file_name_msg']; else if (!$file->isFile() && isset($config['filesystem.invalid_directory_name_msg'])) $this->_invalidFileMsg = $config['filesystem.invalid_directory_name_msg']; if (!$this->_invalidFileMsg) $this->_invalidFileMsg = "{#error.invalid_filename}"; } return $status; } // Verify action specific config $fileFilter = new Moxiecode_BasicFileFilter(); if ($action) { if (isset($config[$action . '.include_directory_pattern'])) $fileFilter->setIncludeDirectoryPattern($config[$action . '.include_directory_pattern']); if (isset($config[$action . '.exclude_directory_pattern'])) $fileFilter->setExcludeDirectoryPattern($config[$action . '.exclude_directory_pattern']); if (isset($config[$action . '.include_file_pattern'])) $fileFilter->setIncludeFilePattern($config[$action . '.include_file_pattern']); if (isset($config[$action . '.exclude_file_pattern'])) $fileFilter->setExcludeFilePattern($config[$action . '.exclude_file_pattern']); if (isset($config[$action . '.extensions'])) $fileFilter->setIncludeExtensions($config[$action . '.extensions']); } else return BASIC_FILEFILTER_ACCEPTED; $status = $fileFilter->accept($file); if ($status != BASIC_FILEFILTER_ACCEPTED) { if ($status == BASIC_FILEFILTER_INVALID_NAME) { $this->_invalidFileMsg = "{#error.invalid_filename}"; if ($file->isFile()) { if (isset($config[$action . '.invalid_file_name_msg'])) $this->_invalidFileMsg = $config[$action . '.invalid_file_name_msg']; } else { if (isset($config[$action . '.invalid_directory_name_msg'])) $this->_invalidFileMsg = $config[$action . '.invalid_directory_name_msg']; } } return $status; } return BASIC_FILEFILTER_ACCEPTED; } /** * Returns a file object represtentation of a file path this * will also do security checks agains the list of valid paths * so that file IO can't be done outside the valid paths. * * @param String $path Path to return as File object. * @param String $file_name Optional file name. * @param String $type Optional file type. * @return File File object representation of a file. */ function &getFile($path, $file_name = "", $type = MC_IS_FILE) { $path = utf8_decode($path); $file_name = utf8_decode($file_name); $fs = 'file'; $matches = array(); $oldpath = $path; // Parse out FS if (preg_match('/([a-z]+):\/\/(.+)/', $path, $matches)) { $fs = $matches[1]; $path = $matches[2]; } // Filesystem wasn't found if (!isset($this->_fileSystems[$fs])) { trigger_error($this->getLangItem("error", "no_filesystem", array("path" => $path)), FATAL); die(); } $path = $this->decryptPath($path); $path = $this->removeTrailingSlash($this->toUnixPath($path)); // Verfiy path if no file was returned if ($fs == 'file' && !$this->verifyPath($path)) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } // Validate file name if ($fs == 'file' && $file_name) { if (preg_match('/[\\\\\\/:]+/', $file_name, $matches)) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } } // Get file instance $file = new $this->_fileSystems[$fs]($this, $path, $file_name, $type); // Verfiy path if no file was returned if ($fs == 'file' && !$this->verifyPath($file->getAbsolutePath())) { $log =& $this->getLogger(); if ($log && $log->isDebugEnabled()) $log->debug("Could not access path: " . $path); trigger_error("{#error.no_access}", FATAL); die(); } return $file; } /** * Converts a relative path to absolute path. * * @param string $path Path to convert to absolute. * @param string $basepath Optional base path default to ../. */ function toAbsPath($path, $basepath = false) { $path = $this->toUnixPath($path); if (!$basepath) $basepath = dirname(__FILE__) . "/../"; // Is absolute unix or windows if (substr($path, 0, 1) == '/' || strpos($path, ":") !== false) { // Resolve symlinks $tmp = realpath($path); if ($tmp) $path = $tmp; return $this->toUnixPath($path); } $path = $this->toUnixPath($this->addTrailingSlash($this->toUnixPath(realpath($basepath))) . $path); // Local FS and exists remove any ../../ if (strpos($path, "://") === false && file_exists($path)) $path = $this->toUnixPath(realpath($path)); return $path; } /** * Converts a Unix path to OS specific path. * * @param String $path Unix path to convert. */ function toOSPath($path) { return str_replace("/", DIRECTORY_SEPARATOR, $path); } /** * Converts a OS specific path to Unix path. * * @param String $path OS path to convert to Unix style. */ function toUnixPath($path) { return str_replace(DIRECTORY_SEPARATOR, "/", $path); } /** * Adds a trailing slash to a path. * * @param String path Path to add trailing slash on. * @return String New path with trailing slash. */ function addTrailingSlash($path) { if (strlen($path) > 0 && $path[strlen($path)-1] != '/') $path .= '/'; return $path; } /** * Removes the trailing slash from a path. * * @param String path Path to remove trailing slash from. * @return String New path without trailing slash. */ function removeTrailingSlash($path) { // Is root if ($path == "/") return $path; if ($path == "") return $path; if ($path[strlen($path)-1] == '/') $path = substr($path, 0, strlen($path)-1); return $path; } /** * Adds a new file system bu name. * * @param String $protocol File protocol like zip/ftp etc. * @param String $file_system Name of class to create instances by. */ function registerFileSystem($protocol, $file_system) { $this->_fileSystems[$protocol] = $file_system; } /** * Returns a logger instance. * * @return Logger New logger instance. */ function &getLogger() { if (!$this->_logger) { $log = new Moxiecode_Logger(); $null = null; // PHP why!!! Other languages can return null if (!checkBool($this->getConfigItem("log.enabled"))) return $null; // Set logger options $log->setLevel($this->getConfigItem("log.level", "fatal")); $log->setPath($this->toAbsPath($this->getConfigItem("log.path", "logs"))); $log->setFileName($this->getConfigItem("log.filename", "{level}.log")); $log->setFormat($this->getConfigItem("log.format", "[{time}] [{level}] {message}")); $log->setMaxSize($this->getConfigItem("log.max_size", "100k")); $log->setMaxFiles($this->getConfigItem("log.max_files", "10")); $this->_logger = $log; } return $this->_logger; } // * * * * * * * Private methods function _getRootNames() { $config = $this->getConfig(); $output = array(); $roots = explode(';', $config['filesystem.rootpath']); foreach ($roots as $root) { $rootParts = explode('=', $root); if (count($rootParts) > 1) $output[$rootParts[1]] = $rootParts[0]; else { $output[$rootParts[0]] = basename($root); // If it's root if ($output[$rootParts[0]] == "") $output[$rootParts[0]] = "/"; } } return $output; } /**#@-*/ } ?>plugins/filemanager/classes/CorePlugin.php000066600000074416150472426320014741 0ustar00 $val){ if ($val == '..') {array_pop($tmp);} else {array_push($tmp,$val);} } $xpath = implode("/",$tmp); return $xpath; } /** * $Id: CorePlugin.php 618 2008-11-27 16:03:32Z spocke $ * * @package MCManagerCore * @author Moxiecode * @copyright Copyright 2007, Moxiecode Systems AB, All rights reserved. */ // Load local file system require_once($basepath . "FileSystems/LocalFileImpl.php"); require_once($basepath . "FileSystems/RootFileImpl.php"); /** * This plugin contains the Core logic shared between manager products. * * @package MCManagerCore */ class Moxiecode_CorePlugin extends Moxiecode_ManagerPlugin { /**#@+ * @access public */ /** * Constructs a new MCManagerCore instance. */ function Moxiecode_CorePlugin() { } /** * Register file system. */ function onInit(&$man) { $config = $man->getConfig(); // Register local and root file system $man->registerFileSystem('file', isset($config['filesystem']) ? $config['filesystem'] : 'Moxiecode_LocalFileImpl'); $man->registerFileSystem('root', 'Moxiecode_RootFileImpl'); return true; } /** * Gets executed when a RPC command is to be executed. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd RPC Command to be executed. * @param object $input RPC input object data. * @return object Result data from RPC call or null if it should be passed to the next handler in chain. */ function onRPC(&$man, $cmd, $input) { switch ($cmd) { case "deleteFiles": return $this->_deleteFile($man, $input); case "listFiles": return $this->_listFiles($man, $input); case "createDirs": return $this->_createDirs($man, $input); case "getConfig": return $this->_getConfig($man, $input); case "insertFiles": return $this->_insertFiles($man, $input); case "loopBack": return $this->_loopBack($input); case "keepAlive": return $this->_keepAlive($man, $input); } return null; } /** * Gets called when data is streamed to client. This method should setup * HTTP headers, content type etc and simply send out the binary data to the client and the return false * ones that is done. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd Stream command that is to be performed. * @param string $input Array of input arguments. * @return bool true/false if the execution of the event chain should continue. */ function onStream(&$man, $cmd, $input) { $config = $man->getConfig(); // Download stream if ($cmd == "download") { if ($man->verifyPath($input["path"])) { $file =& $man->getFile($input["path"]); $config = $file->getConfig(); if ($man->verifyFile($file, "download") > 0 && $file->exists()) { // Get the mimetype, need to go to ../ parent folder cause... well we have to. //$mimeType = mapMimeTypeFromUrl($file->getAbsolutePath(), "../". $config['stream.mimefile']); header("Content-type: application/octet-stream"); header("Content-Disposition: attachment; filename=\"" . $file->getName() . "\""); // Stream data $stream =& $file->open('rb'); if ($stream) { while (($buff = $stream->read()) != null) echo $buff; $stream->close(); } return false; } } else { header('HTTP/1.0 404 Not found'); header('status: 404 Not found'); echo "Requested resource could not be found. Or access was denied."; die(); } // Do not pass to next return false; } // Normal stream if ($cmd == "streamFile") { if (!$man->verifyPath($input["path"]) < 0) { trigger_error("Path verification failed.", FATAL); die(); } $file = $man->getFile($input["path"]); $config = $file->getConfig(); if (!$file->exists()) { trigger_error("File not found.", FATAL); die(); } else { if (getClassName($file) == 'moxiecode_localfileimpl') { // Redirect to data $url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getParent() . "/" . str_replace("+", "%20", urlencode($file->getName())), $config["preview.wwwroot"]) . $config['preview.urlsuffix']; // Passthrough rnd if (isset($input["rnd"])) $url .= (strpos($url, "?") === false ? "?" : "&") . "rnd=" . $input["rnd"]; header('location: ' . $url); die(); } else { // Verify that we can stream this one if ($man->verifyFile($file, "stream") < 0) { header('HTTP/1.0 404 Not found'); header('status: 404 Not found'); echo "Requested resource could not be found. Or access was denied."; die(); } // Get the mimetype, need to go to ../ parent folder cause... well we have to. $mimeType = mapMimeTypeFromUrl($file->getAbsolutePath(), "../". $config['stream.mimefile']); header("Content-type: " . $mimeType); // Stream data $stream =& $file->open('rb'); if ($stream) { while (($buff = $stream->read()) != null) echo $buff; $stream->close(); } } return false; } } // Devkit commands switch ($cmd) { case "viewServerInfo": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); phpinfo(); break; case "downloadServerInfo": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); // Get all ini settings $data = ini_get_all(); // Setup all headers header("Content-type: text/plain; charset=UTF-8"); header("Content-Disposition: attachment; filename=dump.txt"); header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); echo "# Config from config.php" . "\r\n\r\n"; foreach ($config as $key => $value) { if (is_bool($value)) echo $key . "=" . ($value ? "true" : "false") . "\r\n"; else echo $key . "=" . $value . "\r\n"; } // Dump INI settings echo "\r\n# PHP INI settings file\r\n\r\n"; foreach ($data as $key => $value) echo $key . "=" . $value['local_value'] . "\r\n"; // Dump function support echo "\r\n# Function check" . "\r\n\r\n"; $functions = array( "ImagecreateFromJpeg", "ImageJpeg", "ImagecreateFromGif", "ImageGif", "ImagecreateFromPng", "ImagePng", "gzdeflate", "gzinflate" ); foreach ($functions as $function) echo $function . "=" . (function_exists($function) ? "ok" : "missing") . "\r\n"; // Dump rootpath access echo "\r\n# Rootpath access" . "\r\n\r\n"; foreach ($man->getRootPaths() as $rootpath) { $stat = stat($rootpath); echo $rootpath . "\r\n"; echo " is_readable=" . (is_readable($rootpath) ? "readable" : "not readable") . "\r\n"; echo " is_writable=" . (is_writable($rootpath) ? "writable" : "not writable") . "\r\n"; foreach ($stat as $key => $value) echo " " . $key . "=" . $value . "\r\n"; } break; case "viewLog": if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); header('Content-type: text/plain'); if ($input['level'] == "debug") echo @file_get_contents("../logs/debug.log"); else echo @file_get_contents("../logs/error.log"); break; case "clearLog": header('Content-type: text/plain'); if (!checkBool($config['general.debug'])) die("You have to enable debugging in config by setting general.debug to true."); if ($input['level'] == "debug") $log = "../logs/debug.log"; else $log = "../logs/error.log"; @unlink($log); for ($i=0; $i<10; $i++) @unlink($log . "." . $i); echo "Logs cleared."; break; } // Pass to next return true; } /** * Gets called when data is streamed/uploaded from client. This method should take care of * any uploaded files and move them to the correct location. * * @param MCManager $man MCManager reference that the plugin is assigned to. * @param string $cmd Upload command that is to be performed. * @param string $input Array of input arguments. * @return object Result object data or null if the event wasn't handled. */ function onUpload(&$man, $cmd, $input) { if ($cmd == "upload") { // Setup response $result = new Moxiecode_ResultSet("status,file,message"); $path = $man->decryptPath($input["path"]); $config = $man->getConfig(); if ($man->verifyPath($path)) { $file =& $man->getFile($path); $config = $file->getConfig(); $maxSizeBytes = preg_replace("/[^0-9]/", "", $config["upload.maxsize"]); if (strpos((strtolower($config["upload.maxsize"])), "k") > 0) $maxSizeBytes *= 1024; if (strpos((strtolower($config["upload.maxsize"])), "m") > 0) $maxSizeBytes *= (1024 * 1024); // Is chunked upload if (isset($input["chunk"])) { $filename = $input["name"]; $chunk = intval($input["chunk"]); $chunks = intval($input["chunks"]); // No access, tool disabled if (in_array("upload", explode(',', $config['general.disabled_tools'])) || !$file->canWrite() || !checkBool($config["filesystem.writable"])) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); return $result; } $file =& $man->getFile($path, $filename, MC_IS_FILE); if ($man->verifyFile($file, "upload") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result; } // Hack attempt if ($filename == $config['filesystem.local.access_file_name']) { $result->add("MCACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); return $result; } // Only peform IO when not in demo mode if (!checkBool($config['general.demo'])) { if ($chunk == 0 && $file->exists() && (!isset($config["upload.overwrite"]) || $config["upload.overwrite"] == false)) { $result->add("OVERWRITE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.file_exists}"); return $result; } if ($chunk == 0 && $file->exists() && $config["upload.overwrite"] == true) $file->delete(); // Write file $stream =& $file->open($chunk == 0 ? 'wb' : 'ab'); if ($stream) { $in = fopen("php://input", "rb"); if ($in) { while ($buff = fread($in, 4096)) $stream->write($buff); } $stream->close(); } // Check file size if ($file->getLength() > $maxSizeBytes) { $file->delete(); $result->add("SIZE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.error_to_large}"); return $result; } // Verify uploaded file, if it fails delete it $status = $man->verifyFile($file, "upload"); if ($status < 0) { $file->delete(); $result->add("FILTER_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); return $result; } // Import file when all chunks are complete if ($chunk == $chunks - 1) { clearstatcache(); debug($chunk, $chunks, filesize($file->getAbsolutePath()), $chunk == 0 ? 'wb' : 'ab'); $file->importFile(); } } $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.upload_ok}"); return $result; } else { // Ok lets check the files array out. for ($i=0; isset($_FILES['file' . $i]['tmp_name']); $i++) { $filename = utf8_encode($input["name" . $i]); // Do nothing in demo mode if (checkBool($config['general.demo'])) { $result->add("DEMO_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.demo}"); continue; } // No access, tool disabled if (in_array("upload", explode(',', $config['general.disabled_tools'])) || !$file->canWrite() || !checkBool($config["filesystem.writable"])) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); continue; } // Get ext to glue back on $ext = ""; if (strpos(basename($_FILES['file' . $i]['name']), ".") > 0) { $ar = explode('.', basename($_FILES['file' . $i]['name'])); $ext = array_pop($ar); } $file =& $man->getFile($path, $filename . "." . $ext, "", MC_IS_FILE); if ($man->verifyFile($file, "upload") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } $config = $file->getConfig(); if (is_uploaded_file($_FILES['file' . $i]['tmp_name'])) { // Hack attempt if ($filename == $config['filesystem.local.access_file_name']) { @unlink($_FILES['file' . $i]['tmp_name']); $result->add("MCACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.no_access}"); continue; } if ($file->exists() && (!isset($config["upload.overwrite"]) || $config["upload.overwrite"] == false)) { @unlink($_FILES['file' . $i]['tmp_name']); $result->add("OVERWRITE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.file_exists}"); continue; } if ($file->exists() && $config["upload.overwrite"] == true) $file->delete(); if (getClassName($file) == 'moxiecode_localfileimpl') { if (!move_uploaded_file($_FILES['file' . $i]['tmp_name'], $file->getAbsolutePath())) { $result->add("RW_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.upload_failed}"); continue; } // Dispatch add event $file->importFile(); } else $file->importFile($_FILES['file' . $i]['tmp_name']); if ($file->getLength() > $maxSizeBytes) { $file->delete(); $result->add("SIZE_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.error_to_large}"); continue; } // Verify uploaded file, if it fails delete it $status = $man->verifyFile($file, "upload"); if ($status < 0) { $file->delete(); $result->add("FILTER_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.upload_ok}"); } else $result->add("GENERAL_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.upload_failed}"); } } } else $result->add("PATH_ERROR", $man->encryptPath($path), "{#error.upload_failed}"); return $result; } } // * * * * * * * * Private methods function _deleteFile(&$man, &$input) { $result = new Moxiecode_ResultSet("status,file,message"); for ($i=0; isset($input["path" . $i]); $i++) { $file =& $man->getFile($input["path" . $i]); $config = $file->getConfig(); if (checkBool($config['general.demo'])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.demo}"); continue; } if (!$man->isToolEnabled("delete", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } if (!$file->exists()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.file_not_exists}"); continue; } if ($man->verifyFile($file, "delete") < 0) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } if (!$file->canWrite()) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } if (!checkBool($config["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } if ($file->delete($config['filesystem.delete_recursive'])) $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.delete_success}"); else $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.delete_failed}"); } return $result->toArray(); } function _insertFiles(&$man, $input) { $result = new Moxiecode_ResultSet("name,path,url,size,type,created,modified,attribs,custom"); $indata = array(); for ($i=0; isset($input['path' . $i]); $i++) { $custom = array(); $file = $man->getFile($input["path". $i]); if (!$file->exists()) { trigger_error("{#error.file_not_exists}", FATAL); die; } $ar = explode('.', $file->getName()); $ext = array_pop($ar); $man->dispatchEvent("onCustomInfo", array(&$file, "insert", &$custom)); $status = $man->dispatchEvent("onInsertFile", array(&$file)); $config = $file->getConfig(); $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $url = $man->removeTrailingSlash($config['preview.urlprefix']) . $man->convertPathToURI($file->getAbsolutePath(), $config["preview.wwwroot"]); $result->add($file->getName(), $man->encryptPath($file->getAbsolutePath()), utf8_encode($url), $file->getLength(), $ext, $file->getCreationDate(), $file->getLastModified(), $attribs, $custom); } return $result->toArray(); } function _listDefault(&$man, $file, $input, &$result, $filter_root_path) { $config = $man->getConfig(); // Setup input file filter $inputFileFilter = new Moxiecode_BasicFileFilter(); if (isset($input['include_directory_pattern']) && $input['include_directory_pattern']) $inputFileFilter->setIncludeDirectoryPattern($input['include_directory_pattern']); if (isset($input['exclude_directory_pattern']) && $input['exclude_directory_pattern']) $inputFileFilter->setExcludeDirectoryPattern($input['exclude_directory_pattern']); if (isset($input['include_file_pattern']) && $input['include_file_pattern']) $inputFileFilter->setIncludeFilePattern($input['include_file_pattern']); if (isset($input['exclude_file_pattern']) && $input['exclude_file_pattern']) $inputFileFilter->setExcludeFilePattern($input['exclude_file_pattern']); if (isset($input['extensions']) && $input['extensions']) $inputFileFilter->setIncludeExtensions($input['extensions']); // If file doesn't exists use default path if (!$file->exists()) { $file = $man->getFile($config['filesystem.path']); $result->setHeader("path", $man->encryptPath($file->getAbsolutePath())); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($file->getAbsolutePath()) : $man->encryptPath($file->getAbsolutePath())); } // List files $config = $file->getConfig(); if ($file->isDirectory()) { // Setup file filter $fileFilter = new Moxiecode_BasicFileFilter(); //$fileFilter->setDebugMode(true); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); // If file is hidden then try the parent if ($fileFilter->accept($file) <= 0) { $file = $file->getParentFile(); $result->setHeader("path", $man->encryptPath($file->getAbsolutePath())); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($file->getAbsolutePath()) : $man->encryptPath($file->getAbsolutePath())); } if (isset($input["filter"]) && $input["filter"] != null) $fileFilter->setIncludeWildcardPattern($input["filter"]); if (isset($input["only_dirs"]) && checkBool($input["only_dirs"])) $fileFilter->setOnlyDirs(true); else if (!checkBool($config["filesystem.list_directories"], true) || (isset($input["only_files"]) && checkBool($input["only_files"]))) $fileFilter->setOnlyFiles(true); // List files $combinedFilter = new Moxiecode_CombinedFileFilter(); $combinedFilter->addFilter($fileFilter); $combinedFilter->addFilter($inputFileFilter); $files =& $file->listFilesFiltered($combinedFilter); $showparent = isset($input["no_parent"]) ? checkBool($input["no_parent"]) : true; $showparent = $showparent && $man->verifyPath($file->getParent()); if (!isset($input["only_dirs"])) $showparent = $showparent && checkBool($config["filesystem.list_directories"], true); // Add parent if ($showparent && !isset($input["only_files"])) { // Remove files below root if ($filter_root_path && getClassName($file) == 'moxiecode_localfileimpl') { if (!$man->isChildPath($filter_root_path, $file->getParent())) return $files; } if ($file->getAbsolutePath() != $filter_root_path) $result->add("..", $man->encryptPath($file->getParent()), -1, "parent", "", "", "", array()); } } else trigger_error("The specified path is not a directory. Probably an incorrect setting for the filesystem.rootpath option.", FATAL); return $files; } /** * Lists files. */ function _listFiles(&$man, $input) { $result = new Moxiecode_ResultSet("name,path,size,type,created,modified,attribs,custom"); $config = $man->getConfig(); $files = array(); $rootNames = $man->_getRootNames(); if (isset($input["path"]) && $input["path"]) { // URL specified if (isset($input["url"]) && $input["path"] == '{default}') $input["path"] = $man->convertURIToPath($input["url"]); if (isset($input['remember_last_path'])) { if ($input['remember_last_path'] !== 'auto') $remember = checkBool($input['remember_last_path']); else $remember = checkBool($config['general.remember_last_path']); if ($remember) { if (isset($_COOKIE["MCManager_". $man->getType() . "_lastPath"]) && $input["path"] == '{default}') { $tmpPath = $_COOKIE["MCManager_". $man->getType() . "_lastPath"]; if ($man->getFSFromPath($tmpPath) == "file" && $tmpPath) $input["path"] = $tmpPath; } else { if ($man->getFSFromPath($input["path"]) == "file") setcookie("MCManager_". $man->getType() . "_lastPath", $input["path"], time() + (3600*24*30)); // 30 days } } } $input["path"] = $man->toAbsPath($man->decryptPath($input["path"])); $input["path"] = normalizePath($input['path']); $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"]) : $man->encryptPath($input["path"])); // Move path inside rootpath if it's localfs if ($filterRootPath && $man->getFSFromPath($input["path"]) == 'file') { if (!$man->isChildPath($filterRootPath, $input["path"])) $input["path"] = $filterRootPath; $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"], $filterRootPath) : $man->encryptPath($input["path"])); } // Not valid path use default path if ($man->getFSFromPath($input["path"]) == 'file' && !$man->verifyPath($input["path"])) { $input["path"] = $config['filesystem.path']; $result->setHeader("path", $man->encryptPath($input["path"])); $result->setHeader("visual_path", checkBool($config['general.user_friendly_paths']) ? $man->toVisualPath($input["path"]) : $man->encryptPath($input["path"])); } $file =& $man->getFile($input["path"]); $config = $file->getConfig(); $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $result->setHeader("attribs", $attribs); $files = $this->_listDefault($man, $file, $input, $result, $filterRootPath); } else { trigger_error("ListFiles input not valid.", FATAL); die(); } if (isset($input["page_size"])) { if ($file->getAbsolutePath() != $filterRootPath && $man->verifyPath($file->getParent())) $pageSize = $input["page_size"] - 1; else $pageSize = $input["page_size"]; $pages = ceil(count($files) / $pageSize); // Setup response $result->setHeader("pages", $pages > 1 ? $pages : 1); $result->setHeader("count", count($files)); if (!isset($input["page"])) $input["page"] = 0; // Remove non visible files $files = array_slice($files, ($input["page"] * $pageSize), $pageSize); } // Add directories $listFS = $man->getFSFromPath($input["path"]); foreach ($files as $file) { // Remove files below root if ($filterRootPath && $listFS == 'file') { if (!$man->isChildPath($filterRootPath, $file->getAbsolutePath())) continue; } // Setup fields $custom = array(); // Attribs: R = Read, W = Write (cut/delete/rename), D = Download, S = Stream/Preview, I = Insert $attribs = ($file->canRead() && checkBool($config["filesystem.readable"]) ? "R" : "-") . ($file->canWrite() && checkBool($config["filesystem.writable"]) ? "W" : "-"); $cdate = date($config['filesystem.datefmt'], $file->getCreationDate()); $mdate = date($config['filesystem.datefmt'], $file->getLastModified()); $filePath = $man->encryptPath($file->getAbsolutePath()); if ($file->isFile()) $type = getFileExt($file->getName()); else $type = "folder"; $man->dispatchEvent("onCustomInfo", array(&$file, "list", &$custom)); // Special treatment of roots $name = $file->getName(); if ($input["path"] == "root:///") { foreach ($rootNames as $rootPath => $rootName) { if ($file->getAbsolutePath() == $rootPath) { $name = $rootName; break; } } } $result->add(utf8_encode($name), $filePath, $file->isFile() ? $file->getLength() : -1, $type, $cdate, $mdate, $attribs, $custom); } if (isset($input["config"])) $result->setConfig($man->getJSConfig($config, $input["config"])); return $result->toArray(); } function _filterFile(&$file, $input) { $config = $file->getConfig(); // Setup file filter $fileFilter = new Moxiecode_BasicFileFilter(); //$fileFilter->setDebugMode(true); $fileFilter->setIncludeDirectoryPattern($config['filesystem.include_directory_pattern']); $fileFilter->setExcludeDirectoryPattern($config['filesystem.exclude_directory_pattern']); $fileFilter->setIncludeFilePattern($config['filesystem.include_file_pattern']); $fileFilter->setExcludeFilePattern($config['filesystem.exclude_file_pattern']); $fileFilter->setIncludeExtensions($config['filesystem.extensions']); if (isset($input["only_dirs"]) && checkBool($input["only_dirs"])) $fileFilter->setOnlyDirs(true); return ($fileFilter->accept($file) > 0); } function _createDirs(&$man, $input) { $result = new Moxiecode_ResultSet("status,file,message"); // Get input data $path = $man->decryptPath($input['path']); $dir =& $man->getFile($path); $config = $dir->getConfig(); if (checkBool($config["general.demo"])) { $result->add("DEMO_ERROR", $man->encryptPath($dir->getAbsolutePath()), "{#error.demo}"); return $result->toArray(); } if (!$man->isToolEnabled("createdir", $config)) { trigger_error("{#error.no_access}", FATAL); die(); } for ($i=0; isset($input['name' . $i]); $i++) { // Get dir info $name = $input['name' . $i]; $template = false; if (isset($input['template' . $i])) $template = $man->decryptPath($input['template' . $i]); // Setup target file $file =& $man->getFile($path, $name, MC_IS_DIRECTORY); if ($man->verifyFile($file, "createdir") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } // Check write access if (!checkBool($config["filesystem.writable"])) { $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); continue; } // Setup template dir if ($template) { $templateFile =& $man->getFile($template, "", MC_IS_DIRECTORY); if (!$templateFile->exists()) { $result->add("TEMPLATE_ERROR", $man->encryptPath($templateFile->getAbsolutePath()), "{#error.template_missing}"); continue; } if ($man->verifyFile($templateFile, "createdir") < 0) { $result->add("ACCESS_ERROR", $man->encryptPath($file->getAbsolutePath()), $man->getInvalidFileMsg()); continue; } } else $templateFile = null; // Check if target exists if ($file->exists()) { $result->add("EXISTS_ERROR", $man->encryptPath($file->getAbsolutePath()), "{#error.folder_exists}"); continue; } // Create directory if ($templateFile) $status = $templateFile->copyTo($file); else $status = $file->mkdir(); if ($status) $result->add("OK", $man->encryptPath($file->getAbsolutePath()), "{#message.directory_ok}"); else $result->add("FAILED", $man->encryptPath($file->getAbsolutePath()), "{#error.no_write_access}"); } return $result->toArray(); } function _getConfig(&$man, $input) { $globalConfig = $man->getConfig(); if (!isset($input['prefixes'])) $input["prefixes"] = "*"; // If debug mode return all if (!isset($input['path']) && isset($input['debug']) && checkBool($globalConfig['general.debug'])) return $man->getConfig(); if (!isset($input['path'])) { trigger_error("{#error.file_not_exists}", FATAL); die; } $file =& $man->getFile($input['path']); if (!$file->exists()) { trigger_error("{#error.file_not_exists}", FATAL); die; } $config = $file->getConfig(); // If debug mode return all if (isset($input['debug']) && checkBool($globalConfig['general.debug'])) return $config; return $man->getJSConfig($config, $input["prefixes"]); } /** * Simple keepalive function. */ function _keepAlive(&$man, $input) { $result = new Moxiecode_ResultSet("status,time,message"); $man->dispatchEvent("onKeepAlive"); // Return status KEEPALIVE, current time on server and message. $result->add("KEEPALIVE", time(), "{#message.keepalive}"); return $result->toArray(); } /** * Simple loopback function. Used for debugging purposes of the RPC functionality. */ function _loopBack($input) { return $input; } /**#@-*/ } // Add plugin to MCManager $man->registerPlugin("core", new Moxiecode_CorePlugin()); ?>plugins/filemanager/classes/Utils/LanguagePack.php000066600000021437150472426320016307 0ustar00_header = array(); $this->_items = array(); $this->_cdataArr = array(); $this->_currentTarget = ""; $this->_currentLanguage = "en"; $this->_currentDir = "ltr"; $this->_header["major"] = 0; $this->_header["minor"] = 1; $this->_header["releasedate"] = date("Y-m-d"); } function setLanguage($language) { $this->_currentLanguage = $language; } function getLanguage() { return $this->_currentLanguage; } /* Loads XML string */ function loadXML($data) { // Check encoding on data preg_match('//m', $data, $matches); $encoding = "UTF-8"; // Found XML encoding if (count($matches) > 1) $encoding = strtoupper($matches[1]); $this->_encoding = $encoding; // OMG! PHP Xpath is crappy, cant detect CDATA, haxx! $data = preg_replace("/<\!\[CDATA\[/", "_parser = xml_parser_create($encoding); // Auto detect for PHP4/PHP5 xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, "_saxStartElement", "_saxEndElement"); xml_set_character_data_handler($this->_parser, "_saxCharacterData"); xml_parser_set_option($this->_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); if (!xml_parse($this->_parser, $data, true)) trigger_error(sprintf("Language pack loading failed, XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser)), E_USER_ERROR); xml_parser_free($this->_parser); } /* Loads XML file */ function load($file) { if (($fp = @fopen($file, "r"))) { $data = ''; while (!feof($fp)) $data .= fread($fp, 8192); fclose($fp); if (ini_get("magic_quotes_gpc")) $data = stripslashes($data); $this->loadXML($data); } else trigger_error("Could not open XML: ". $file, E_USER_ERROR); } function save($file, $enc="UTF-8") { if (($fp = @fopen($file, "w"))) { fwrite($fp, $this->toString($enc)); fclose($fp); } else trigger_error("Could not open XML for writing: ". $file, E_USER_ERROR); } function getGroups() { return $this->_items[$this->_currentLanguage]["data"]; } function setGroups($groups) { $this->_items[$this->_currentLanguage]["data"] = $groups; } function getGroup($name) { return $this->_items[$this->_currentLanguage]["data"][$name]; } function get($target, $name) { return isset($this->_items[$this->_currentLanguage]["data"][$target][$name]) ? $this->_items[$this->_currentLanguage]["data"][$target][$name] : ("$" . $name . "$"); } function set($target, $name, $value, $cdata = 3) { if ($cdata != 3) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$target])) $this->_cdataArr[$this->_currentLanguage][$target] = array(); $this->_cdataArr[$this->_currentLanguage][$target][$name] = $cdata; } if (!isset($this->_items[$this->_currentLanguage]["data"][$target])) $this->_items[$this->_currentLanguage]["data"][$target] = array(); $this->_items[$this->_currentLanguage]["data"][$target][$name] = $value; } function getLanguageTitle() { return $this->_items[$this->_currentLanguage]["title"]; } function setAuthor($author) { $this->_header["author"] = $author; } function getAuthor() { return $this->_header["author"]; } function setVersion($major, $minor, $releasedate) { $this->_header["major"] = $major; $this->_header["minor"] = $minor; $this->_header["releasedate"] = $releasedate; } function getMinor() { return $this->_header["minor"]; } function getMajor() { return $this->_header["major"]; } function getReleaseDate() { return $this->_header["releasedate"]; } function getDescription() { return $this->_header["description"]; } function setDescription($description) { $this->_header["description"] = $description; } function createLanguage($lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = array("dir" => $dir, "title" => $title, "data" => array()); } function updateLanguage($target, $lang, $dir, $title) { $this->_currentLanguage = $lang; $this->_items[$lang] = $this->_items[$target]; unset($this->_items[$target]); $this->_items[$lang]["dir"] = $dir; $this->_items[$lang]["title"] = $title; $this->_cdataArr[$lang] = $this->_cdataArr[$target]; unset($this->_cdataArr[$target]); } // * * Private methods function _saxStartElement($parser, $name, $attrs) { $this->_tag = $name; $this->_tagAttrs = $attrs; $this->_tagContent = ""; switch($name) { case "LANGUAGE": $this->_currentLanguage = $this->_tagAttrs["CODE"]; $this->_currentDir = $this->_tagAttrs["DIR"]; $this->_items[$this->_currentLanguage] = array("dir" => $this->_currentDir, "title" => $this->_tagAttrs["TITLE"], "data" => array()); break; case "GROUP": $this->_currentTarget = $this->_tagAttrs["TARGET"]; $this->_items[$this->_currentLanguage]["data"][$this->_tagAttrs["TARGET"]] = array(); break; } } function _saxEndElement($parser, $name) { preg_match('/^#CDATA#/', $this->_tagContent, $matches); $this->_tagContent = preg_replace("/^#CDATA#/", "", $this->_tagContent); if (count($matches) == 0) $this->_tagContent = trim($this->_tagContent); switch($name) { case "ITEM": if (count($matches) != 0) { if (!isset($this->_cdataArr[$this->_currentLanguage])) $this->_cdataArr[$this->_currentLanguage] = array(); if (!isset($this->_cdataArr[$this->_currentLanguage][$this->_currentTarget])) $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget] = array(); $this->_cdataArr[$this->_currentLanguage][$this->_currentTarget][$this->_tagAttrs["NAME"]] = true; } $this->_items[$this->_currentLanguage]["data"][$this->_currentTarget][$this->_tagAttrs["NAME"]] = $this->_tagContent; break; case "AUTHOR": $this->_header["author"] = $this->_tagContent; break; case "VERSION": $this->_header["minor"] = trim($this->_tagAttrs["MINOR"]); $this->_header["major"] = trim($this->_tagAttrs["MAJOR"]); $this->_header["releasedate"] = trim($this->_tagAttrs["RELEASEDATE"]); break; case "DESCRIPTION": $this->_header["description"] = $this->_tagContent; break; } // Clear memory! $this->_tagContent = ""; $this->_tag = ""; $this->_tagAttrs = ""; } function _saxCharacterData($parser, $data) { $this->_tagContent .= $data; } function xmlEncode($str) { if (strtolower($this->_encoding) == "utf-8") return utf8_encode(htmlspecialchars($str, ENT_QUOTES, $this->_encoding)); return htmlspecialchars($str, ENT_QUOTES, $this->_encoding); } function toString($enc = "") { $oldenc = ""; if ($enc == "") $enc = $this->_encoding; else { $oldenc = $this->_encoding; $this->_encoding = $enc; } $doc = ""; $doc .= ''. "\n"; $doc .= ''. "\n"; $doc .= '
        '. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["author"]) .''. "\n"; $doc .= ' '. "\n"; $doc .= ' '. $this->xmlEncode($this->_header["description"]) .''. "\n"; $doc .= '
        '. "\n"; foreach($this->_items as $code => $language) { $doc .= ' '. "\n"; foreach($language["data"] as $target => $group) { $doc .= ' '. "\n"; foreach($group as $name => $item) { if (isset($this->_cdataArr[$code]) && isset($this->_cdataArr[$code][$target]) && isset($this->_cdataArr[$code][$target][$name]) && $this->_cdataArr[$code][$target][$name]) { $doc .= ' '. "\n"; } else $doc .= ' '. $this->xmlEncode($item) .''. "\n"; } $doc .= ' '. "\n"; } $doc .= ' '. "\n"; } $doc .= '
        '. "\n"; if ($oldenc != "") $this->_encoding = $oldenc; return $doc; } } ?>plugins/filemanager/classes/Utils/Error.php000066600000016367150472426320015064 0ustar00id = $id; } function handleError($errno, $errstr, $errfile, $errline, $errcontext) { global $man; $error = array(); $log = false; $error['title'] = ""; $error['break'] = false; $error['errstr'] = $errstr; //$error['errcontext'] = $errcontext; $error['errcontext'] = ""; $error['errfile'] = ""; $error['errline'] = ""; // Add file and line only in debug mode if (isset($man)) { $mcConfig = $man->getConfig(); $log = $man->getLogger(); if (checkBool($mcConfig['general.debug'])) { $error['errfile'] = $errfile; $error['errline'] = $errline; } } switch ($errno) { case E_USER_ERROR: $error['title'] = "Fatal Error"; $error['break'] = true; break; case E_USER_NOTICE: $error['title'] = "Notice"; $error['break'] = false; break; case E_USER_WARNING: $error['title'] = "Warning"; $error['break'] = true; break; case E_PARSE: $error['title'] = "PHP Parse Error"; $error['break'] = true; if ($log) $log->fatal($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_ERROR: $error['title'] = "PHP Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_WARNING: $error['title'] = "PHP Warning"; $error['break'] = false; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_CORE_ERROR: $error['title'] = "PHP Error : Core Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_CORE_WARNING: $error['title'] = "PHP Error : Core Warning"; $error['break'] = true; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_COMPILE_ERROR: $error['title'] = "PHP Error : Compile Error"; $error['break'] = true; if ($log) $log->error($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_COMPILE_WARNING: $error['title'] = "PHP Error : Compile Warning"; $error['break'] = true; if ($log) $log->warn($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_NOTICE: $error['title'] = "PHP Notice"; $error['break'] = false; if ($log) $log->info($error['title'] . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; case E_STRICT: $error['title'] = "PHP Strict"; $error['break'] = false; if ($log) $log->info($error['title'] . " (" . $errno . ")" . ", Msg: " . $error['errstr'] . " in " . $error['errfile'] . "(" . $error['errline'] . ")"); break; } // Add error number $error['title'] = $error['title'] . " (". $errno .")"; return $error; } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function JSONErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { unset($data['break']); unset($data['title']); $data['level'] = "FATAL"; $json = new Moxiecode_JSON(); $result = new stdClass(); $result->result = null; $result->id = 'err'; $result->error = $data; echo $json->encode($result); die(); } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function JSErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { echo 'alert(\'' . addslashes($data['errstr']) . '\');'; die(); } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function StreamErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { if ($_SERVER["REQUEST_METHOD"] == "GET") { header("HTTP/1.1 500 Internal server error"); die($errstr); } else { unset($data['break']); unset($data['title']); $data['level'] = "FATAL"; $json = new Moxiecode_JSON(); $result = new stdClass(); $result->result = null; $result->id = 'err'; $result->error = $data; echo ''; die(); } } } /** * Calls the MCError class, returns true. * * @param Int $errno Number of the error. * @param String $errstr Error message. * @param String $errfile The file the error occured in. * @param String $errline The line in the file where error occured. * @param Array $errcontext Error context array, contains all variables. * @return Bool Just return true for now. */ function HTMLErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { global $MCErrorHandler; // Ignore these if ($errno == E_STRICT) return true; // Just pass it through to the class. $data = $MCErrorHandler->handleError($errno, $errstr, $errfile, $errline, $errcontext); if ($data['break']) { die($errstr); } } ?>plugins/filemanager/classes/Utils/ClientResources.php000066600000006443150472426320017076 0ustar00_settings = array_merge($default, $settings); $this->_files = array(); } function isDebugEnabled() { return $this->_debug; } function getSetting($name, $default = false) { return isset($this->_settings["name"]) ? $this->_settings["name"] : $default; } function getPackageIDs() { return array_keys($this->_files); } function &getFile($package, $file_id) { $files = $this->getFiles($package); foreach ($files as $file) { if ($file->getId() == $file_id) return $file; } return null; } function getFiles($package) { return isset($this->_files[$package]) ? $this->_files[$package] : array(); } function load($xml_file) { $this->_path = dirname($xml_file); if (!file_exists($xml_file)) return; $fp = @fopen($xml_file, "r"); if ($fp) { $data = ''; while (!feof($fp)) $data .= fread($fp, 8192); fclose($fp); if (ini_get("magic_quotes_gpc")) $data = stripslashes($data); } $this->_parser = xml_parser_create('UTF-8'); xml_set_object($this->_parser, $this); xml_set_element_handler($this->_parser, "_saxStartElement", "_saxEndElement"); xml_parser_set_option($this->_parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); if (!xml_parse($this->_parser, $data, true)) trigger_error(sprintf("Language pack loading failed, XML error: %s at line %d.", xml_error_string(xml_get_error_code($this->_parser)), xml_get_current_line_number($this->_parser)), E_USER_ERROR); xml_parser_free($this->_parser); } // * * Private methods function _saxStartElement($parser, $name, $attrs) { switch ($name) { case "RESOURCES": if (!$this->_debug) $this->_debug = isset($attrs["DEBUG"]) && $attrs["DEBUG"] == 'yes'; break; case "PACKAGE": $this->_packageID = isset($attrs["ID"]) ? $attrs["ID"] : 'noid'; if (!isset($this->_files[$this->_packageID])) $this->_files[$this->_packageID] = array(); break; case "FILE": $this->_files[$this->_packageID][] = new Moxiecode_ClientResourceFile( isset($attrs["ID"]) ? $attrs["ID"] : "", str_replace("\\", DIRECTORY_SEPARATOR, $this->_path . '/' . $attrs["PATH"]), !isset($attrs["KEEPWHITESPACE"]) || $attrs["KEEPWHITESPACE"] != "yes", isset($attrs["TYPE"]) ? $attrs["TYPE"] : '' ); break; } } function _saxEndElement($parser, $name) { } } class Moxiecode_ClientResourceFile { /**#@+ @access private */ var $_id, $_contentType, $_path, $_remove_whitespace; /**#@-*/ function Moxiecode_ClientResourceFile($id, $path, $remove_whitespace, $content_type) { $this->_id = $id; $this->_path = $path; $this->_remove_whitespace = $remove_whitespace; $this->_contentType = $content_type; } function isRemoveWhitespaceEnabled() { return $this->_remove_whitespace; } function getId() { return $this->_id; } function getContentType() { return $this->_contentType; } function getPath() { return $this->_path; } } ?>plugins/filemanager/classes/Utils/JSCompressor.php000066600000017337150472426320016362 0ustar00_items = array(); $default = array( 'expires_offset' => '10d', 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'patch_ie' => true, 'remove_firebug' => false, 'name' => '' ); $this->_settings = array_merge($default, $settings); $this->_lastUpdate = 0; } /** * Add raw contents as part of the concatenation/compression. This method should only be used if * you really need to. * * @param String $content Content to add as part of the concatenation process. */ function addContent($content) { $this->_items[] = array('content', $content); } /** * Adds a file to the concatenation/compression process. * * @param String $path Path to the file to include in the compressed package/output. * @param bool $whitespace Set this state to false to skip whitespace removal for the specified file. */ function addFile($path, $whitespace = true) { $this->_items[] = array('file', $path, $whitespace); $mtime = @filemtime($path); if ($mtime > $this->_lastUpdate) $this->_lastUpdate = $mtime; } /** * Compress and output all files that got added to the process by addFile. */ function compress() { $key = ""; foreach ($this->_items as $item) $key .= $item[1]; // Setup some variables $cacheFile = $this->_settings['cache_dir'] . "/"; if ($this->_settings['name']) $cacheFile .= preg_replace('/[^a-z0-9_]/i', '', $this->_settings['name']); else $cacheFile .= md5($key); $supportsGzip = false; $content = ""; $encodings = array(); // Check if it supports gzip if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); if ($this->_settings['gzip_compress'] && (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('gzencode') && !ini_get('zlib.output_compression')) { $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; $supportsGzip = true; $cacheFile .= ".gz"; } else $cacheFile .= ".js"; // Set headers header("Content-type: text/javascript;charset=" . $this->_settings['charset']); header("Vary: Accept-Encoding"); // Handle proxies header("Expires: " . gmdate("D, d M Y H:i:s", time() + $this->_parseTime($this->_settings['expires_offset'])) . " GMT"); header("Cache-Control: public, max-age=" . $this->_parseTime($this->_settings['expires_offset'])); // Output explorer workaround or compressed file if (!isset($_GET["gz"]) && $supportsGzip && $this->_settings['patch_ie'] && strpos($_SERVER["HTTP_USER_AGENT"], "MSIE") !== false) { // Build request URL $url = $_SERVER["PHP_SELF"]; if (isset($_SERVER["QUERY_STRING"]) && $_SERVER["QUERY_STRING"]) $url .= "?" . $_SERVER["QUERY_STRING"] . "&gz=1"; else $url .= "?gz=1"; // This script will ensure that the gzipped script gets loaded on IE versions with the Gzip request chunk bug echo 'var gz;try {gz = new XMLHttpRequest();} catch(gz) { try {gz = new ActiveXObject("Microsoft.XMLHTTP");}'; echo 'catch (gz) {gz = new ActiveXObject("Msxml2.XMLHTTP");}}'; echo 'gz.open("GET", "' . $url . '", false);gz.send(null);eval(gz.responseText);'; die(); } // Use cached file if ($this->_settings['disk_cache'] && file_exists($cacheFile) && @filemtime($cacheFile) == $this->_lastUpdate) { if ($supportsGzip) header("Content-Encoding: " . $enc); echo $this->_getFileContents($cacheFile); return; } // Load content foreach ($this->_items as $item) { if ($item[0] == 'file') $chunk = $this->_getFileContents($item[1]); else $chunk = $item[1]; // Remove UTF-8 BOM if (substr($chunk, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) $chunk = substr($chunk, 3); if ($this->_settings['remove_whitespace'] && $item[2]) $chunk = $this->_removeWhiteSpace($chunk); if (!$item[2]) $chunk = "\n" . $chunk . ";\n"; $content .= $chunk; } // Remove firebug calls if ($this->_settings['remove_firebug']) $content = preg_replace('/console\\.[^;]+;/', '', $content); // GZip content if ($supportsGzip) { header("Content-Encoding: " . $enc); $content = gzencode($content, 9, FORCE_GZIP); } // Write cache file if ($this->_settings['disk_cache']) { if (!is_dir($this->_settings['cache_dir'])) @mkdir($this->_settings['cache_dir']); $this->_putFileContents($cacheFile, $content); if (@file_exists($cacheFile)) @touch($cacheFile, $this->_lastUpdate); } // Output content to client echo $content; } /**#@+ @access private */ function _removeWhiteSpace($content) { $this->_strings = array(); $this->_count = 0; // Replace strings and regexps $content = preg_replace_callback('/\\\\(\"|\'|\\/)/', array(&$this, '_encode'), $content); // Replace all \/, \", \' with tokens $content = preg_replace_callback('/(\'[^\'\\n\\r]*\')|("[^"\\n\\r]*")|(\\s+(\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?))|([^\\w\\x24\\/\'"*)\\?:]\\/[^\\/\\n\\r\\*][^\\/\\n\\r]*\\/g?i?)/', array(&$this, '_strToItems'), $content); // Remove comments $content = preg_replace('/(\\/\\/[^\\n\\r]*[\\n\\r])|(\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/)/', '', $content); // Remove whitespace $content = preg_replace('/[\r\n]+/', ' ', $content); $content = preg_replace('/\s*([=&|!+\\-\\/?:;,\\^\\(\\)\\{\\}<>%]+)\s*/', '$1', $content); $content = preg_replace('/(;)\s+/', '$1', $content); $content = preg_replace('/\s+/', ' ', $content); // Restore strings and regexps $content = preg_replace_callback('/@([^]+)/', array(&$this, '_itemsToStr'), $content); $content = preg_replace_callback('/#([^]+)/', array(&$this, '_decode'), $content); // Restore all \/, \", \' return $content; } function _putFileContents($path, $content) { if (function_exists("file_put_contents")) return @file_put_contents($path, $content); $fp = @fopen($path, "wb"); if ($fp) { fwrite($fp, $content); fclose($fp); } } function _getFileContents($path) { $path = realpath($path); if (!$path || !@is_file($path)) return ""; if (function_exists("file_get_contents")) return @file_get_contents($path); $content = ""; $fp = @fopen($path, "r"); if (!$fp) return ""; while (!feof($fp)) $content .= fread($fp, 1024); fclose($fp); return $content; } function _strToItems($matches) { $this->_strings[] = $matches[0]; return '@' . ($this->_count++) . ''; } function _itemsToStr($matches) { return $this->_strings[intval($matches[1])]; } function _encode($matches) { $this->_strings[] = $matches[0]; return '#' . ($this->_count++) . ''; } function _decode($matches) { return $this->_strings[intval($matches[1])]; } function _parseTime($time) { $multipel = 1; // Hours if (strpos($time, "h") != false) $multipel = 60 * 60; // Days if (strpos($time, "d") != false) $multipel = 24 * 60 * 60; // Months if (strpos($time, "m") != false) $multipel = 24 * 60 * 60 * 30; // Trim string return intval($time) * $multipel; } /**#@-*/ } ?>plugins/filemanager/classes/Utils/Logger.class.php000066600000012531150472426320016303 0ustar00_path = ""; $this->_filename = "{level}.log"; $this->setMaxSize("100k"); $this->_maxFiles = 10; $this->_level = MC_LOGGER_DEBUG; $this->_format = "[{time}] [{level}] {message}"; } /** * Sets the current log level, use the MC_LOGGER constants. * * @param int $level Log level instance for example MC_LOGGER_DEBUG. */ function setLevel($level) { if (is_string($level)) { switch (strtolower($level)) { case "debug": $level = MC_LOGGER_DEBUG; break; case "info": $level = MC_LOGGER_INFO; break; case "warn": case "warning": $level = MC_LOGGER_WARN; break; case "error": $level = MC_LOGGER_ERROR; break; case "fatal": $level = MC_LOGGER_FATAL; break; default: $level = MC_LOGGER_FATAL; } } $this->_level = $level; } /** * Returns the current log level for example MC_LOGGER_DEBUG. * * @return int Current log level for example MC_LOGGER_DEBUG. */ function getLevel() { return $this->_level; } function setPath($path) { $this->_path = $path; } function getPath() { return $this->_path; } function setFileName($file_name) { $this->_filename = $file_name; } function getFileName() { return $this->_filename; } function setFormat($format) { $this->_format = $format; } function getFormat() { return $this->_format; } function setMaxSize($size) { // Fix log max size $logMaxSizeBytes = intval(preg_replace("/[^0-9]/", "", $size)); // Is KB if (strpos((strtolower($size)), "k") > 0) $logMaxSizeBytes *= 1024; // Is MB if (strpos((strtolower($size)), "m") > 0) $logMaxSizeBytes *= (1024 * 1024); $this->_maxSizeBytes = $logMaxSizeBytes; $this->_maxSize = $size; } function getMaxSize() { return $this->_maxSize; } function setMaxFiles($max_files) { $this->_maxFiles = $max_files; } function getMaxFiles() { return $this->_maxFiles; } function debug($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_DEBUG, implode(', ', $args)); } function info($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_INFO, implode(', ', $args)); } function warn($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_WARN, implode(', ', $args)); } function error($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_ERROR, implode(', ', $args)); } function fatal($msg) { $args = func_get_args(); $this->_logMsg(MC_LOGGER_FATAL, implode(', ', $args)); } function isDebugEnabled() { return $this->_level >= MC_LOGGER_DEBUG; } function isInfoEnabled() { return $this->_level >= MC_LOGGER_INFO; } function isWarnEnabled() { return $this->_level >= MC_LOGGER_WARN; } function isErrorEnabled() { return $this->_level >= MC_LOGGER_ERROR; } function isFatalEnabled() { return $this->_level >= MC_LOGGER_FATAL; } function _logMsg($level, $message) { $roll = false; if ($level < $this->_level) return; $logFile = $this->toOSPath($this->_path . "/" . $this->_filename); switch ($level) { case MC_LOGGER_DEBUG: $levelName = "DEBUG"; break; case MC_LOGGER_INFO: $levelName = "INFO"; break; case MC_LOGGER_WARN: $levelName = "WARN"; break; case MC_LOGGER_ERROR: $levelName = "ERROR"; break; case MC_LOGGER_FATAL: $levelName = "FATAL"; break; } $logFile = str_replace('{level}', strtolower($levelName), $logFile); $text = $this->_format; $text = str_replace('{time}', date("Y-m-d H:i:s"), $text); $text = str_replace('{level}', strtolower($levelName), $text); $text = str_replace('{message}', $message, $text); $message = $text . "\r\n"; // Check filesize if (file_exists($logFile)) { $size = @filesize($logFile); if ($size + strlen($message) > $this->_maxSizeBytes) $roll = true; } // Roll if the size is right if ($roll) { for ($i=$this->_maxFiles-1; $i>=1; $i--) { $rfile = $this->toOSPath($logFile . "." . $i); $nfile = $this->toOSPath($logFile . "." . ($i+1)); if (@file_exists($rfile)) @rename($rfile, $nfile); } @rename($logFile, $this->toOSPath($logFile . ".1")); // Delete last logfile $delfile = $this->toOSPath($logFile . "." . ($this->_maxFiles + 1)); if (@file_exists($delfile)) @unlink($delfile); } // Append log line if (($fp = @fopen($logFile, "a")) != null) { @fputs($fp, $message); @fflush($fp); @fclose($fp); } } /** * Converts a Unix path to OS specific path. * * @param String $path Unix path to convert. */ function toOSPath($path) { return str_replace("/", DIRECTORY_SEPARATOR, $path); } } ?>plugins/filemanager/classes/Utils/JSON.php000066600000027146150472426320014541 0ustar00_data = $data; $this->_len = strlen($data); $this->_pos = -1; $this->_location = JSON_IN_BETWEEN; $this->_lastLocations = array(); $this->_needProp = false; } function getToken() { return $this->_token; } function getLocation() { return $this->_location; } function getTokenName() { switch ($this->_token) { case JSON_BOOL: return 'JSON_BOOL'; case JSON_INT: return 'JSON_INT'; case JSON_STR: return 'JSON_STR'; case JSON_FLOAT: return 'JSON_FLOAT'; case JSON_NULL: return 'JSON_NULL'; case JSON_START_OBJ: return 'JSON_START_OBJ'; case JSON_END_OBJ: return 'JSON_END_OBJ'; case JSON_START_ARRAY: return 'JSON_START_ARRAY'; case JSON_END_ARRAY: return 'JSON_END_ARRAY'; case JSON_KEY: return 'JSON_KEY'; } return 'UNKNOWN'; } function getValue() { return $this->_value; } function readToken() { $chr = $this->read(); if ($chr != null) { switch ($chr) { case '[': $this->_lastLocation[] = $this->_location; $this->_location = JSON_IN_ARRAY; $this->_token = JSON_START_ARRAY; $this->_value = null; $this->readAway(); return true; case ']': $this->_location = array_pop($this->_lastLocation); $this->_token = JSON_END_ARRAY; $this->_value = null; $this->readAway(); if ($this->_location == JSON_IN_OBJECT) $this->_needProp = true; return true; case '{': $this->_lastLocation[] = $this->_location; $this->_location = JSON_IN_OBJECT; $this->_needProp = true; $this->_token = JSON_START_OBJ; $this->_value = null; $this->readAway(); return true; case '}': $this->_location = array_pop($this->_lastLocation); $this->_token = JSON_END_OBJ; $this->_value = null; $this->readAway(); if ($this->_location == JSON_IN_OBJECT) $this->_needProp = true; return true; // String case '"': case '\'': return $this->_readString($chr); // Null case 'n': return $this->_readNull(); // Bool case 't': case 'f': return $this->_readBool($chr); default: // Is number if (is_numeric($chr) || $chr == '-' || $chr == '.') return $this->_readNumber($chr); return true; } } return false; } function _readBool($chr) { $this->_token = JSON_BOOL; $this->_value = $chr == 't'; if ($chr == 't') $this->skip(3); // rue else $this->skip(4); // alse $this->readAway(); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _readNull() { $this->_token = JSON_NULL; $this->_value = null; $this->skip(3); // ull $this->readAway(); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _readString($quote) { $output = ""; $this->_token = JSON_STR; $endString = false; while (($chr = $this->peek()) != -1) { switch ($chr) { case '\\': // Read away slash $this->read(); // Read escape code $chr = $this->read(); switch ($chr) { case 't': $output .= "\t"; break; case 'b': $output .= "\b"; break; case 'f': $output .= "\f"; break; case 'r': $output .= "\r"; break; case 'n': $output .= "\n"; break; case 'u': $output .= $this->_int2utf8(hexdec($this->read(4))); break; default: $output .= $chr; break; } break; case '\'': case '"': if ($chr == $quote) $endString = true; $chr = $this->read(); if ($chr != -1 && $chr != $quote) $output .= $chr; break; default: $output .= $this->read(); } // String terminated if ($endString) break; } $this->readAway(); $this->_value = $output; // Needed a property if ($this->_needProp) { $this->_token = JSON_KEY; $this->_needProp = false; return true; } if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function _int2utf8($int) { $int = intval($int); switch ($int) { case 0: return chr(0); case ($int & 0x7F): return chr($int); case ($int & 0x7FF): return chr(0xC0 | (($int >> 6) & 0x1F)) . chr(0x80 | ($int & 0x3F)); case ($int & 0xFFFF): return chr(0xE0 | (($int >> 12) & 0x0F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr (0x80 | ($int & 0x3F)); case ($int & 0x1FFFFF): return chr(0xF0 | ($int >> 18)) . chr(0x80 | (($int >> 12) & 0x3F)) . chr(0x80 | (($int >> 6) & 0x3F)) . chr(0x80 | ($int & 0x3F)); } } function _readNumber($start) { $value = ""; $isFloat = false; $this->_token = JSON_INT; $value .= $start; while (($chr = $this->peek()) != -1) { if (is_numeric($chr) || $chr == '-' || $chr == '.') { if ($chr == '.') $isFloat = true; $value .= $this->read(); } else break; } $this->readAway(); if ($isFloat) { $this->_token = JSON_FLOAT; $this->_value = floatval($value); } else $this->_value = intval($value); if ($this->_location == JSON_IN_OBJECT && !$this->_needProp) $this->_needProp = true; return true; } function readAway() { while (($chr = $this->peek()) != null) { if ($chr != ':' && $chr != ',' && $chr != ' ') return; $this->read(); } } function read($len = 1) { if ($this->_pos < $this->_len) { if ($len > 1) { $str = substr($this->_data, $this->_pos + 1, $len); $this->_pos += $len; return $str; } else return $this->_data[++$this->_pos]; } return null; } function skip($len) { $this->_pos += $len; } function peek() { if ($this->_pos < $this->_len) return $this->_data[$this->_pos + 1]; return null; } } /** * This class handles JSON stuff. * * @package MCManager.utils */ class Moxiecode_JSON { function Moxiecode_JSON() { } function decode($input) { $reader = new Moxiecode_JSONReader($input); return $this->readValue($reader); } function readValue(&$reader) { $this->data = array(); $this->parents = array(); $this->cur =& $this->data; $key = null; $loc = JSON_IN_ARRAY; while ($reader->readToken()) { switch ($reader->getToken()) { case JSON_STR: case JSON_INT: case JSON_BOOL: case JSON_FLOAT: case JSON_NULL: switch ($reader->getLocation()) { case JSON_IN_OBJECT: $this->cur[$key] = $reader->getValue(); break; case JSON_IN_ARRAY: $this->cur[] = $reader->getValue(); break; default: return $reader->getValue(); } break; case JSON_KEY: $key = $reader->getValue(); break; case JSON_START_OBJ: case JSON_START_ARRAY: if ($loc == JSON_IN_OBJECT) $this->addArray($key); else $this->addArray(null); $cur =& $obj; $loc = $reader->getLocation(); break; case JSON_END_OBJ: case JSON_END_ARRAY: $loc = $reader->getLocation(); if (count($this->parents) > 0) { $this->cur =& $this->parents[count($this->parents) - 1]; array_pop($this->parents); } break; } } return $this->data[0]; } // This method was needed since PHP is crapy and doesn't have pointers/references function addArray($key) { $this->parents[] =& $this->cur; $ar = array(); if ($key) $this->cur[$key] =& $ar; else $this->cur[] =& $ar; $this->cur =& $ar; } function getDelim($index, &$reader) { switch ($reader->getLocation()) { case JSON_IN_ARRAY: case JSON_IN_OBJECT: if ($index > 0) return ","; break; } return ""; } function encode($input) { switch (gettype($input)) { case 'boolean': return $input ? 'true' : 'false'; case 'integer': return (int) $input; case 'float': case 'double': return (float) $input; case 'NULL': return 'null'; case 'string': return $this->encodeString($input); case 'array': return $this->_encodeArray($input); case 'object': return $this->_encodeArray(get_object_vars($input)); } return ''; } function encodeString($input) { // Needs to be escaped if (preg_match('/[^a-zA-Z0-9]/', $input)) { $output = ''; for ($i=0; $i_utf82utf16($char))); } if (($byte & 0xF0) == 0xE0) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2])); $i += 2; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xF8) == 0xF0) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]))); $i += 3; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xFC) == 0xF8) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]))); $i += 4; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } if (($byte & 0xFE) == 0xFC) { $char = pack('C*', $byte, ord($input[$i + 1]), ord($input[$i + 2], ord($input[$i + 3]), ord($input[$i + 4]), ord($input[$i + 5]))); $i += 5; $output .= sprintf('\u%04s', bin2hex($this->_utf82utf16($char))); } else if ($byte < 128) $output .= $input[$i]; } } return '"' . $output . '"'; } return '"' . $input . '"'; } function _utf82utf16($utf8) { if (function_exists('mb_convert_encoding')) return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); switch (strlen($utf8)) { case 1: return $utf8; case 2: return chr(0x07 & (ord($utf8[0]) >> 2)) . chr((0xC0 & (ord($utf8[0]) << 6)) | (0x3F & ord($utf8[1]))); case 3: return chr((0xF0 & (ord($utf8[0]) << 4)) | (0x0F & (ord($utf8[1]) >> 2))) . chr((0xC0 & (ord($utf8[1]) << 6)) | (0x7F & ord($utf8[2]))); } return ''; } function _encodeArray($input) { $output = ''; $isIndexed = true; $keys = array_keys($input); for ($i=0; $iencodeString($keys[$i]) . ':' . $this->encode($input[$keys[$i]]); $isIndexed = false; } else $output .= $this->encode($input[$keys[$i]]); if ($i != count($keys) - 1) $output .= ','; } return $isIndexed ? '[' . $output . ']' : '{' . $output . '}'; } } ?> plugins/filemanager/classes/Utils/CSSCompressor.php000066600000014545150472426320016474 0ustar00_items = array(); $default = array( 'expires_offset' => '10d', 'disk_cache' => true, 'cache_dir' => '_cache', 'gzip_compress' => true, 'remove_whitespace' => true, 'charset' => 'UTF-8', 'convert_urls' => true, 'name' => '' ); $this->_settings = array_merge($default, $settings); $this->_lastUpdate = 0; } /** * Add raw contents as part of the concatenation/compression. This method should only be used if * you really need to. * * @param String $content Content to add as part of the concatenation process. */ function addContent($content) { $this->_items[] = array('content', $content); } /** * Adds a file to the concatenation/compression process. * * @param String $path Path to the file to include in the compressed package/output. * @param bool $whitespace Set this state to false to skip whitespace removal for the specified file. */ function addFile($path, $whitespace = true) { $this->_items[] = array('file', $path, $whitespace); $mtime = @filemtime($path); if ($mtime > $this->_lastUpdate) $this->_lastUpdate = $mtime; } /** * Compress and output all files that got added to the process by addFile. */ function compress() { $key = ""; foreach ($this->_items as $item) $key .= $item[1]; // Setup some variables $cacheFile = $this->_settings['cache_dir'] . "/"; if ($this->_settings['name']) $cacheFile .= preg_replace('/[^a-z0-9_]/i', '', $this->_settings['name']); else $cacheFile .= md5($key); $supportsGzip = false; $content = ""; $encodings = array(); // Check if it supports gzip if (isset($_SERVER['HTTP_ACCEPT_ENCODING'])) $encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING']))); if ($this->_settings['gzip_compress'] && (in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('gzencode') && !ini_get('zlib.output_compression')) { $enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip"; $supportsGzip = true; $cacheFile .= ".gz"; } else $cacheFile .= ".css"; // Set headers header("Content-type: text/css;charset=" . $this->_settings['charset']); header("Cache-Control: must-revalidate"); // Must be there for IE 6 header("Vary: Accept-Encoding"); // Handle proxies header("Expires: " . gmdate("D, d M Y H:i:s", time() + $this->_parseTime($this->_settings['expires_offset'])) . " GMT"); // Use cached file if ($this->_settings['disk_cache'] && file_exists($cacheFile) && @filemtime($cacheFile) == $this->_lastUpdate) { if ($supportsGzip) header("Content-Encoding: " . $enc); echo $this->_getFileContents($cacheFile); return; } // Load content foreach ($this->_items as $item) { if ($item[0] == 'file') $chunk = $this->_getFileContents($item[1]); else $chunk = $item[1]; // Remove UTF-8 BOM if (substr($chunk, 0, 3) == pack("CCC", 0xef, 0xbb, 0xbf)) $chunk = substr($chunk, 3); if (!preg_match('/[\r\n]$/', $chunk)) $chunk .= "\n"; if ($this->_settings['remove_whitespace'] && $item[2]) $chunk = $this->_removeWhiteSpace($chunk); // Convert urls if ($this->_settings['convert_urls']) { $chunk = preg_replace('/\\$base/', dirname($_SERVER['SCRIPT_NAME']), $chunk); $chunk = preg_replace('/url\\([\'"]?(?!\\/|http)/', '$0' . dirname($item[1]) . '/', $chunk); } $content .= $chunk; } // GZip content if ($supportsGzip) { header("Content-Encoding: " . $enc); $content = gzencode($content, 9, FORCE_GZIP); } // Write cache file if ($this->_settings['disk_cache']) { if (!is_dir($this->_settings['cache_dir'])) @mkdir($this->_settings['cache_dir']); $this->_putFileContents($cacheFile, $content); if (@file_exists($cacheFile)) @touch($cacheFile, $this->_lastUpdate); } // Output content to client echo $content; } /**#@+ @access private */ function _removeWhiteSpace($content) { // Remove comments $content = preg_replace('/(\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/)/', '', $content); // Remove whitespace at the beginning and end of CSS $content = preg_replace('/^[\r\n]+/', '', $content); $content = preg_replace('/[\r\n]+$/', "\n", $content); // Remove redundant linebreaks $content = preg_replace('/\r\n/', "\n", $content); $content = preg_replace('/\n+/', "\n", $content); // Remove whitespace before/after styles inside rules $content = preg_replace('/\\{\\s*(.*?)\\s*\\}/', '{$1}', $content); // Remove remove whitespace between style rules and after the last one $content = preg_replace('/;\\s+/', ';', $content); $content = preg_replace('/\\{([^\\}]+);\\}/', '{$1}', $content); // Remove whitespace between : $content = preg_replace('/\\s*\\:\\s*/', ':', $content); return $content; } function _putFileContents($path, $content) { if (function_exists("file_put_contents")) return @file_put_contents($path, $content); $fp = @fopen($path, "wb"); if ($fp) { fwrite($fp, $content); fclose($fp); } } function _getFileContents($path) { $path = realpath($path); if (!$path || !@is_file($path)) return ""; if (function_exists("file_get_contents")) return @file_get_contents($path); $content = ""; $fp = @fopen($path, "r"); if (!$fp) return ""; while (!feof($fp)) $content .= fread($fp, 1024); fclose($fp); return $content; } function _parseTime($time) { $multipel = 1; // Hours if (strpos($time, "h") != false) $multipel = 60 * 60; // Days if (strpos($time, "d") != false) $multipel = 24 * 60 * 60; // Months if (strpos($time, "m") != false) $multipel = 24 * 60 * 60 * 30; // Trim string return intval($time) * $multipel; } /**#@-*/ } ?>plugins/filemanager/classes/Utils/ResultSet.php000066600000002526150472426320015715 0ustar00_cols = explode(',', $cols); $this->_rows = array(); $this->_config = null; } function add() { $this->_rows[] = func_get_args(); } function setHeader($name, $value) { $this->_header[$name] = $value; } function setConfig($config) { $this->_config = $config; } function getRowCount() { return count($this->_rows); } function getRows() { $rowsArr = array(); for ($i=0; $i_rows);$i++) $rowsArr[] = $this->getRow($i); return $rowsArr; } function getRow($index) { if ($index < 0) return null; $row = $this->_rows[$index]; $obj = array(); for ($i=0; $i_cols[$i]] = $row[$i]; return $obj; } function toArray() { $ar = array( "header" => $this->_header, "columns" => $this->_cols, "data" => $this->_rows ); if (is_array($this->_config)) $ar["config"] = $this->_config; return $ar; } } ?>plugins/filemanager/login_session_auth.php000066600000006146150472426320015124 0ustar00Wiki for more details.'; if (isset($_POST['submit_button'])) { // If password match, then set login if ($_POST['login'] == $username && $_POST['password'] == $password && $password) { // Set session session_start(); $_SESSION['isLoggedIn'] = true; $_SESSION['user'] = $_POST['login']; // Override any config option //$_SESSION['imagemanager.filesystem.rootpath'] = 'some path'; //$_SESSION['filemanager.filesystem.rootpath'] = 'some path'; // Redirect header("location: " . $_POST['return_url']); die; } else $msg = "Wrong username/password."; } ?> Sample login page
        " />
        Example login
        " />
        " />
        plugins/filemanager/docs/license.html000066600000015274150472426320013761 0ustar00 Commercial license - Single site license

        Commercial license - Single site license

        End User License Agreement For Moxiecode FileManager (MCFileManager)

        This license is for 1 copy of the Moxiecode FileManager Software on 1 web site/domain.

        THE MOXIECODE MCFILEMANAGER SOFTWARE LICENSE AGREEMENT

        This License Agreement is a legal agreement between you ("LICENSEE") (either an individual or a single entity) and Moxiecode Systems AB ("MOXIECODE") for the software product Moxiecode FileManager which includes computer software and electronic documentation (collectively the "SOFTWARE"). Read it carefully before completing the installation process and using the SOFTWARE. If you did not obtain this copy of the SOFTWARE legally, please destroy the copy immediately.

        By installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this License Agreement.

        If you do not agree to the terms of this License Agreement, MOXIECODE is unwilling to license the SOFTWARE. In such event, you may not install, copy or otherwise use the SOFTWARE.

        YOU AGREE THAT YOUR USE OF THE SOFTWARE ACKNOWLEDGES THAT YOU HAVE READ THIS LICENSE, UNDERSTAND IT, AND AGREE TO BE BOUND BY ITS TERMS AND CONDITIONS.

        1. Using the SOFTWARE

        If you have purchased a license for the SOFTWARE, subject to the terms and conditions of this Agreement, MOXIECODE grants you, LICENSEE, a limited, non-exclusive, non-transferable, non-sublicenseable license to install one (1) copy of the SOFTWARE only on a single web site/domain and use that copy of the SOFTWARE only in accordance with this Agreement.

        LICENSEE may use the SOFTWARE to operate in conjunction with other SOFTWARE.

        If the SOFTWARE is to be installed on multiple web sites (development web sites not included), a separate SOFTWARE license must be acquired for each individual web site or a server SOFTWARE license if multiple sites use the SOFTWARE on the same server.

        LICENSEE may make a copy of the SOFTWARE solely for backup or archival purposes, provided that LICENSEE reproduces and includes all copyright and other proprietary notice(s) on the copy.

        2. Restrictions

        LICENSEE may not:
        (i) Rent, lease, lend, transfer or otherwise transfer rights to the SOFTWARE.
        (ii) Translate, adapt, modify the SOFTWARE or create derivative works based upon the SOFTWARE or any part thereof except configuration.
        (iii) Distribute copies of the SOFTWARE.
        (iv) Electronically transfer the SOFTWARE over a network, a telephone circuit or the Internet to a non-LICENCEE.
        (v) Remove any proprietary notices or labels on the SOFTWARE.
        (vi) Use the SOFTWARE to encode, reproduce or copy any material or intellectual property you do not have the right to encode, reproduce or copy.

        3. Termination

        This License Agreement is effective until terminated. MOXIECODE may terminate this License Agreement if LICENSEE fails to comply with the terms and conditions of this License Agreement. In such event, LICENSEE must destroy all copies of the SOFTWARE and all of its component parts. All provisions relating the ownership, disclaimer of warranties, limitation of liability and the general provisions shall survive the termination of this License Agreement.

        4. Ownership

        The SOFTWARE is licensed, NOT sold. The foregoing License Agreement gives LICENSEE limited rights to use the SOFTWARE. All rights, title and interest, including all copyrights, in and to the SOFTWARE and any copies LICENSEE is permitted to make herein are exclusively owned by MOXIECODE and/or its suppliers and are protected by copyright, trademark and trade secret law and international treaties. MOXIECODE retains all rights not expressly granted to LICENSEE in this License Agreement.

        5. Limited Warranty.

        MOXIECODE warrants to you that for a period of fifteen (15) days from the date of purchase, as evidenced by a copy of the receipt, the media on which SOFTWARE is furnished (if any) will be free of defects in materials and workmanship under normal use. Except for the foregoing, SOFTWARE is provided "AS IS". Your exclusive remedy and MOXIECODE's entire liability under this limited warranty will be at MOXIECODE's option to replace SOFTWARE or refund the fee paid for SOFTWARE.

        6. DISCLAIMER OF WARRANTY.

        UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.

        7. LIMITATION OF LIABILITY.

        TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL MOXIECODE OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF MOXIECODE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. In no event will MOXIECODE's liability to you, whether in contract, tort (including negligence), or otherwise, exceed the amount paid by you for SOFTWARE under this Agreement. The foregoing limitations will apply even if the above stated warranty fails of its essential purpose.

        9. Governing Law.

        Any action related to this Agreement will be governed by Swedish law. No choice of law rules of any jurisdiction will apply.

        10. Severability.

        If any provision of this Agreement is held to be unenforceable, This Agreement will remain in effect with the provision omitted, unless omission would frustrate the intent of the parties, in which case this Agreement will immediately terminate.

        11. Entire Agreement

        This License Agreement constitutes the entire agreement between LICENSEE and MOXIECODE and supersedes any other prior agreements or understandings, whether oral or written, regarding the SOFTWARE. If a provision of this agreement is deemed null and void, invalid or without effect, the remainder of this agreement shall remain in effect.

        plugins/filemanager/examples.html000066600000007015150472426320013217 0ustar00 MCFileManager Example

        Simple example

        This is the most simple form of integration.

        [MCFileManager]

        Relative URL example

        This example will output the selected files as relative to the current document.

        [MCFileManager]

        Absolute URL with document_base_url option

        This example will output the selected files as absolute URLs but with a different domain prefix.

        [MCFileManager]

        Absolute URL without host

        This example will output the selected files as absolute URLs but without the protocol and host name parts.

        [MCFileManager]

        Specify default path

        This example shows how the default path can be specified with JavaScript, it also disables the remember last path feature.

        [MCFileManager]

        Specify rootpath

        This example shows how the rootpath can be specified with JavaScript.

        [MCFileManager]

        Custom JavaScript insert script

        This example shows how one could implement a custom insertion JavaScript.

        [MCFileManager]

        Custom filter script

        This example shows you how to change/filter data passed back.

        [MCFileManager]

        Filtered file list example

        This is the most simple form of integration.

        [MCFileManager]










        plugins/example/editor_plugin.js000066600000001534150472426320013076 0ustar00(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})();plugins/example/js/dialog.js000066600000001116150472426320012101 0ustar00tinyMCEPopup.requireLangPack(); var ExampleDialog = { init : function() { var f = document.forms[0]; // Get the selected contents as text and place it in the input f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'}); f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg'); }, insert : function() { // Insert the contents from the input into the document tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value); tinyMCEPopup.close(); } }; tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog); plugins/example/dialog.htm000066600000001566150472426320011652 0ustar00 {#example_dlg.title}

        Here is a example dialog.

        Selected text:

        Custom arg:

        plugins/example/langs/en.js000066600000000114150472426320011731 0ustar00tinyMCE.addI18n('en.example',{ desc : 'This is just a template button' }); plugins/example/langs/en_dlg.js000066600000000117150472426320012562 0ustar00tinyMCE.addI18n('en.example_dlg',{ title : 'This is just a example title' }); plugins/example/editor_plugin_src.js000066600000005532150472426320013747 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { // Load plugin specific language pack tinymce.PluginManager.requireLangPack('example'); tinymce.create('tinymce.plugins.ExamplePlugin', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed, url) { // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); ed.addCommand('mceExample', function() { ed.windowManager.open({ file : url + '/dialog.htm', width : 320 + parseInt(ed.getLang('example.delta_width', 0)), height : 120 + parseInt(ed.getLang('example.delta_height', 0)), inline : 1 }, { plugin_url : url, // Plugin absolute URL some_custom_arg : 'custom arg' // Custom argument }); }); // Register example button ed.addButton('example', { title : 'example.desc', cmd : 'mceExample', image : url + '/img/example.gif' }); // Add a node change handler, selects the button in the UI when a image is selected ed.onNodeChange.add(function(ed, cm, n) { cm.setActive('example', n.nodeName == 'IMG'); }); }, /** * Creates control instances based in the incomming name. This method is normally not * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons * but you sometimes need to create more complex controls like listboxes, split buttons etc then this * method can be used to create those. * * @param {String} n Name of the control to create. * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control. * @return {tinymce.ui.Control} New control instance or null if no control was created. */ createControl : function(n, cm) { return null; }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Example plugin', author : 'Some author', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example', version : "1.0" }; } }); // Register plugin tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin); })();plugins/example/img/example.gif000066600000000127150472426320012567 0ustar00GIF89a!,. Ok̺}qQ(̞5(`Db;plugins/bbcode/editor_plugin.js000066600000006237150472426320012666 0ustar00(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/(.*?)<\/font>/gi,"$1");b(//gi,"[img]$1[/img]");b(/(.*?)<\/span>/gi,"[code]$1[/code]");b(/(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/(.*?)<\/span>/gi,"[u]$1[/u]");b(//gi,"[u]");b(/]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/
        /gi,"\n");b(//gi,"\n");b(/
        /gi,"\n");b(/

        /gi,"");b(/<\/p>/gi,"\n");b(/ |\u00a0/gi," ");b(/"/gi,'"');b(/</gi,"<");b(/>/gi,">");b(/&/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"
        ");b(/\[b\]/gi,"");b(/\[\/b\]/gi,"");b(/\[i\]/gi,"");b(/\[\/i\]/gi,"");b(/\[u\]/gi,"");b(/\[\/u\]/gi,"");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2');b(/\[url\](.*?)\[\/url\]/gi,'$1');b(/\[img\](.*?)\[\/img\]/gi,'');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2');b(/\[code\](.*?)\[\/code\]/gi,'$1 ');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 ');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})();plugins/bbcode/editor_plugin_src.js000066600000010222150472426320013522 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.BBCodePlugin', { init : function(ed, url) { var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase(); ed.onBeforeSetContent.add(function(ed, o) { o.content = t['_' + dialect + '_bbcode2html'](o.content); }); ed.onPostProcess.add(function(ed, o) { if (o.set) o.content = t['_' + dialect + '_bbcode2html'](o.content); if (o.get) o.content = t['_' + dialect + '_html2bbcode'](o.content); }); }, getInfo : function() { return { longname : 'BBCode Plugin', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private methods // HTML -> BBCode in PunBB dialect _punbb_html2bbcode : function(s) { s = tinymce.trim(s); function rep(re, str) { s = s.replace(re, str); }; // example: to [b] rep(/(.*?)<\/a>/gi,"[url=$1]$2[/url]"); rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"); rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"); rep(/(.*?)<\/span>/gi,"[color=$1]$2[/color]"); rep(/(.*?)<\/font>/gi,"[color=$1]$2[/color]"); rep(/(.*?)<\/span>/gi,"[size=$1]$2[/size]"); rep(/(.*?)<\/font>/gi,"$1"); rep(//gi,"[img]$1[/img]"); rep(/(.*?)<\/span>/gi,"[code]$1[/code]"); rep(/(.*?)<\/span>/gi,"[quote]$1[/quote]"); rep(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"); rep(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"); rep(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"); rep(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"); rep(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"); rep(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"); rep(/<\/(strong|b)>/gi,"[/b]"); rep(/<(strong|b)>/gi,"[b]"); rep(/<\/(em|i)>/gi,"[/i]"); rep(/<(em|i)>/gi,"[i]"); rep(/<\/u>/gi,"[/u]"); rep(/(.*?)<\/span>/gi,"[u]$1[/u]"); rep(//gi,"[u]"); rep(/]*>/gi,"[quote]"); rep(/<\/blockquote>/gi,"[/quote]"); rep(/
        /gi,"\n"); rep(//gi,"\n"); rep(/
        /gi,"\n"); rep(/

        /gi,""); rep(/<\/p>/gi,"\n"); rep(/ |\u00a0/gi," "); rep(/"/gi,"\""); rep(/</gi,"<"); rep(/>/gi,">"); rep(/&/gi,"&"); return s; }, // BBCode -> HTML from PunBB dialect _punbb_bbcode2html : function(s) { s = tinymce.trim(s); function rep(re, str) { s = s.replace(re, str); }; // example: [b] to rep(/\n/gi,"
        "); rep(/\[b\]/gi,""); rep(/\[\/b\]/gi,""); rep(/\[i\]/gi,""); rep(/\[\/i\]/gi,""); rep(/\[u\]/gi,""); rep(/\[\/u\]/gi,""); rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2"); rep(/\[url\](.*?)\[\/url\]/gi,"$1"); rep(/\[img\](.*?)\[\/img\]/gi,""); rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"$2"); rep(/\[code\](.*?)\[\/code\]/gi,"$1 "); rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"$1 "); return s; } }); // Register plugin tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin); })();plugins/iespell/editor_plugin.js000066600000001615150472426320013100 0ustar00(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})();plugins/iespell/editor_plugin_src.js000066600000002627150472426320013753 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.IESpell', { init : function(ed, url) { var t = this, sp; if (!tinymce.isIE) return; t.editor = ed; // Register commands ed.addCommand('mceIESpell', function() { try { sp = new ActiveXObject("ieSpell.ieSpellExtension"); sp.CheckDocumentNode(ed.getDoc().documentElement); } catch (e) { if (e.number == -2146827859) { ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) { if (s) window.open('http://www.iespell.com/download.php', 'ieSpellDownload', ''); }); } else ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number); } }); // Register buttons ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'}); }, getInfo : function() { return { longname : 'IESpell (IE Only)', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell); })();plugins/typograf/css/typograf.css000066600000001152150472426320013225 0ustar00body { margin:0; padding:0; } table { width:100%; } table td{ vertical-align:top; } #edit { text-decoration:none; border-bottom:dashed 1px; } #tbefore_text { width:100%; height:400px; } .wrapper { width:98%; position:relative; padding:5px; padding-bottom:60px; } .loader { background:transparent url(../img/loader.gif) no-repeat 50% 100px; height:200px; } #send { margin-top:100px; } .bottom{ height:25px; border-top:solid 1px #ccc; position:fixed; bottom:0; left:0; right:0; text-align:center; background:#ddd; padding:5px; } .bottom button{ margin:0 20px; } plugins/typograf/editor_plugin.js000066600000001521150472426320013272 0ustar00(function(){tinymce.create('tinymce.plugins.typograf',{getInfo:function(){return{longname:'Russian Typograf',author:'Alexandr Shvets',authorurl:'http://drupaldance.com/',infourl:'http://drupaldance.com/russian-typograf-for-tinyMCE',version:'1.0'}},init:function(ed,url){ed.addCommand('mceInsertTypography',function(ui,v){if(ui){editor_text=ed.getContent();strip=editor_text.replace(/<[^>]*>/g,"");if(strip.length){ed.windowManager.open({file:url+'/typograf.html',width:700,height:580,scrollbars:'yes',inline:1},{plugin_url:url,text:editor_text})}else{alert('Введите немного текста, для начала.')}}else{ed.setContent(v.html)}});ed.addButton('typograf',{title:'typograf.insert',cmd:'mceInsertTypography',image:url+'/img/typograf.gif',ui:true})}});tinymce.PluginManager.add('typograf',tinymce.plugins.typograf)})();plugins/typograf/js/typograf.js000066600000006761150472426320012710 0ustar00function urlencode( str ) { // http://kevin.vanzonneveld.net // + original by: Philip Peterson // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // + input by: AJ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // % note: info on what encoding functions to use from: http://xkr.us/articles/javascript/encode-compare/ // * example 1: urlencode('Kevin van Zonneveld!'); // * returns 1: 'Kevin+van+Zonneveld%21' // * example 2: urlencode('http://kevin.vanzonneveld.net/'); // * returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F' // * example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'); // * returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a' var histogram = {}, histogram_r = {}, code = 0, tmp_arr = []; var ret = str.toString(); var replacer = function(search, replace, str) { var tmp_arr = []; tmp_arr = str.split(search); return tmp_arr.join(replace); }; // The histogram is identical to the one in urldecode. histogram['!'] = '%21'; histogram['%20'] = '+'; // Begin with encodeURIComponent, which most resembles PHP's encoding functions ret = encodeURIComponent(ret); for (search in histogram) { replace = histogram[search]; ret = replacer(search, replace, ret) // Custom replace. No regexing } // Uppercase for full PHP compatibility return ret.replace(/(\%([a-z0-9]{2}))/g, function(full, m1, m2) { return "%"+m2.toUpperCase(); }); return ret; } // edit link click function edit_source() { text = document.getElementById('tbefore_text'); div = document.getElementById('tbefore'); text.value = div.innerHTML; div.style.display = 'none'; text.style.display = 'block'; } // refresh button click function send_data() { text = document.getElementById('tbefore_text'); div = document.getElementById('tbefore'); // if textarea is visible, we should first update data div if (text.style.display == 'block'){ div.innerHTML = text.value; text.style.display = 'none'; div.style.display = 'block'; } // send data to typograf TypografDialog.send(div.innerHTML); } var TypografDialog = { init : function(ed) { before = tinyMCEPopup.getWindowArg("text"); plugin_url = tinyMCEPopup.getWindowArg("plugin_url"); document.getElementById("tbefore").innerHTML = before; this.send(before); }, send : function(text) { document.getElementById('tafter').innerHTML = '

        '; request = new XMLHttpRequest(); request.open("POST", plugin_url + '/handler.php'); request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset:UTF-8'); request.onreadystatechange = function(aEvt){ if (request.readyState == 4){ if(request.status == 200){ document.getElementById('tafter').innerHTML = request.responseText; } } } request.send('text='+urlencode(text)); }, saveContent : function() { tinyMCEPopup.execCommand("mceInsertTypography", false, { html : document.getElementById('tafter').innerHTML, }); tinyMCEPopup.close(); } }; tinyMCEPopup.onInit.add(TypografDialog.init, TypografDialog); plugins/typograf/editor_plugin_src.js000066600000002674150472426320014153 0ustar00/** * $RCSfile: editor_plugin_src.js,v $ * $Revision: 1.3 $ * $Date: 2006/03/27 17:41:43 $ * * @author Alexandr Shvets * */ (function() { tinymce.create('tinymce.plugins.typograf', { getInfo : function() { return { longname : 'Russian Typograf', author : 'Alexandr Shvets', authorurl : 'http://drupaldance.com/', infourl : 'http://drupaldance.com/russian-typograf-for-tinyMCE', version : '1.0' }; }, init : function(ed, url) { ed.addCommand('mceInsertTypography', function(ui, v) { if (ui) { editor_text = ed.getContent(); strip = editor_text.replace(/<[^>]*>/g, ""); if (strip.length) { ed.windowManager.open({ file : url + '/typograf.html', width : 700, height : 580, scrollbars : 'yes', inline : 1 }, { plugin_url : url, text : editor_text } ); } else { alert('Введите немного текста, для начала.'); } } else { ed.setContent(v.html); } }); ed.addButton('typograf', {title : 'typograf.insert', cmd : 'mceInsertTypography', image : url + '/img/typograf.gif', ui : true}); } }); // Register plugin tinymce.PluginManager.add('typograf', tinymce.plugins.typograf); })();plugins/typograf/typograf.html000066600000003103150472426320012607 0ustar00 Typograf
        До типографирования (изменить) После типографирования
        plugins/typograf/typographus.php000066600000034525150472426320013200 0ustar00 false, self::HTML_ENTITIES => false ); private $_encoding; private $_sym = array( 'nbsp' => ' ', 'lnowrap' => '', 'rnowrap' => '', 'lquote' => '«', 'rquote' => '»', 'lquote2' => '„', 'rquote2' => '“', 'mdash' => '—', 'ndash' => '–', 'minus' => '–', // соотв. по ширине символу +, есть во всех шрифтах 'hellip' => '…', 'copy' => '©', 'trade' => '', 'apos' => ''', // см. http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos 'reg' => '®', 'multiply' => '×', '1/2' => '½', '1/4' => '¼', '3/4' => '¾', 'plusmn' => '±', 'rarr' => '→', 'larr' => '←', 'rsquo' => '’' ); /** * Укажите кодировку для обработки текста в кодировке, отличной от WINDOWS-1251. * @param String $encoding */ public function __construct($encoding = null){ $this->_encoding = $encoding; } private $_safeBlocks = array( ']*>' => '<\/pre>', ']*>' => '<\/style>', ']*>' => '<\/script>', '', ']*>' => '<\/code>', ); /** * Добавляет безопасный блок, который не будет обрабатываться типографом. * * @param String $openTag * @param String $closeTag */ public function addSafeBlock($openTag, $closeTag){ $this->_safeBlocks[$openTag] = $closeTag; } /** * Устанавливает соответствие между символом и его представлением. * * @param String $sym * @param String $entity */ public function setSym($sym, $entity){ $this->_sym[$sym] = $entity; } public function setOpt($key, $value){ $this->$_options[$key] = $value; } /** * При $opt = true все ё преобразуются в е. */ public function convertE($opt = false){ $this->setOpt[self::CONVERT_E] = $opt; } /** * Вызывает типограф, обходя html-блоки и безопасные блоки * * @param String $str * @return String */ public function process($str){ if($this->_encoding!=null){ $str = iconv($this->_encoding, 'WINDOWS-1251', $str); } $str = html_entity_decode($str); $pattern = '('; foreach ($this->_safeBlocks as $start => $end){ $pattern .= "$start.*$end|"; } $pattern .= '<[^>]*[\s][^>]*>)'; $str = preg_replace_callback("~$pattern~isU", array('self', '_stack'), $str); $str = $this->typo_text($str); $str = strtr($str, self::_stack()); if($this->_encoding!=null){ $str = iconv('WINDOWS-1251', $this->_encoding, $str); } return $str; } /** * Накапливает исходный код безопасных блоков при использовании в качестве * обратного вызова. При отдельном использовании возвращает накопленный * массив. * * @param array $matches * @return array */ private static function _stack($matches = false){ static $safe_blocks = array(); if ($matches !== false){ $key = '<'.count($safe_blocks).'>'; $safe_blocks[$key] = $matches[0]; return $key; } else{ $tmp = $safe_blocks; unset($safe_blocks); return $tmp; } } /** * Применяет все переданные правила к тексту * @param array * @return String */ private function apply_rules($rules, $str){ return preg_replace(array_keys($rules), array_values($rules), $str); } /** * Главная функция типографа. * @param String $str * @return String */ private function typo_text($str){ $sym = $this->_sym; if (trim($str) == '') return ''; $html_tag = '(?:(?U)<.*>)'; $hellip = '\.{3,5}'; //Слово $word = '[a-zA-Zа-яА-Я_]'; //Начало слова $phrase_begin = "(?:$hellip|$word|\n)"; //Конец слова $phrase_end = '(?:[)!?.:;#*\\\]|$|'.$word.'|'.$sym['rquote'].'|'.$sym['rquote2'].'|"|"|'.$sym['hellip'].'|'.$sym['copy'].'|'.$sym['trade'].'|'.$sym['apos'].'|'.$sym['reg'].'|\')'; //Знаки препинания (троеточие и точка - отдельный случай!) $punctuation = '[?!:,;]'; //Аббревиатуры $abbr = '(?:ООО|ОАО|ЗАО|ЧП|ИП|НПФ|НИИ)'; //Предлоги и союзы $prepos = 'а|в|во|вне|и|или|к|о|с|у|о|со|об|обо|от|ото|то|на|не|ни|но|из|изо|за|уж|на|по|под|подо|пред|предо|про|над|надо|как|без|безо|что|да|для|до|там|ещё|их|или|ко|меж|между|перед|передо|около|через|сквозь|для|при|я'; $metrics = 'мм|см|м|км|г|кг|б|кб|мб|гб|dpi|px'; $shortages = 'г|гр|тов|пос|c|ул|д|пер|м'; $money = 'руб\.|долл\.|евро|у\.е\.'; $counts = 'млн\.|тыс\.'; $any_quote = "(?:$sym[lquote]|$sym[rquote]|$sym[lquote2]|$sym[rquote2]|"|\")"; $rules_strict = array( // Много пробелов или табуляций -> один пробел '~( |\t)+~' => ' ', // Запятые после «а» и «но». Если уже есть — не ставим. '~([^,])\s(а|но)\s~' => '$1, $2 ', ); $rules_symbols = array( //Лишние знаки. //TODO: сделать красиво '~([^!])!!([^!])~' => '$1!$2', '~([^?])\?\?([^?])~' => '$1?$2', '~(\w);;(\s)~' => '$1;$2', '~(\w)\.\.(\s)~' => '$1.$2', '~(\w),,(\s)~' => '$1,$2', '~(\w)::(\s)~' => '$1:$2', '~(\w)([,.!?;:])\s([,.!?;:])(\s)~' => '$1$2$4', '~(!!!)!+~' => '$1', '~(\?\?\?)\?+~' => '$1', '~(;;;);+~' => '$1', '~(\.\.\.)\.+~' => '$1', '~(,,,),+~' => '$1', '~(:::):+\s~' => '$1', //Занятная комбинация '~!\?~' => '?!', // Знаки (c), (r), (tm) '~\((c|с)\)~i' => $sym['copy'], '~\(r\)~i' => $sym['reg'], '~\(tm\)~i' => $sym['trade'], // От 2 до 5 знака точки подряд - на знак многоточия (больше - мб авторской задумкой). "~$hellip~" => $sym['hellip'], // Спецсимволы для 1/2 1/4 3/4 '~\b1/2\b~' => $sym['1/2'], '~\b1/4\b~' => $sym['1/4'], '~\b3/4\b~' => $sym['3/4'], //LО'Лайт "~([a-zA-Z])'([а-яА-Я])~i" => '$1'.$sym['rsquo'].'$2', "~'~" => $sym['apos'], //str_replace? // Размеры 10x10, правильный знак + убираем лишние пробелы '~(\d+)\s{0,}?[x|X|х|Х|*]\s{0,}(\d+)~' => '$1'.$sym['multiply'].'$2', //+- '~([^\+]|^)\+-~' => '$1'.$sym['plusmn'], //Стрелки '~([^-]|^)->~' => '$1'.$sym['rarr'], '~<-([^-]|$)~' => $sym['larr'].'$1', ); $rules_quotes = array( // Разносим неправильные кавычки '~([^"]\w+)"(\w+)"~' => '$1 "$2"', '~"(\w+)"(\w+)~' => '"$1" $2', // Превращаем кавычки в ёлочки. Двойные кавычки склеиваем. "~(?<=\\s|^|[>(])($html_tag*)($any_quote)($html_tag*$phrase_begin$html_tag*)~" => '$1'.$sym['lquote'].'$3', "~($html_tag*(?:$phrase_end|[0-9]+)$html_tag*)($any_quote)($html_tag*$phrase_end$html_tag*|\\s|[,<-])~" => '$1'.$sym['rquote'].'$3', ); $rules_braces = array( // Оторвать скобку от слова '~(\w)\(~' => '$1 (', //Слепляем скобки со словами '~\(\s~s' => '(', '~\s\)~s' => ')', ); $rules_main = array( // Оторвать тире от слова '~(\w)- ~' => '$1 - ', //Знаки с предшествующим пробелом… нехорошо! '~('.$phrase_end.') +('.$punctuation.'|'.$sym['hellip'].')~' => '$1$2', '~('.$punctuation.')('.$phrase_begin.')~' => '$1 $2', //Для точки отдельно '~(\w)\s(?:\.)(\s|$)~' => '$1.$2', //Неразрывные названия организаций и абревиатуры форм собственности // ~ почему не один  ? // ! названия организаций тоже могут содержать пробел ! '~('.$abbr.')\s+"(.*)"~' => $sym['lnowrap'].'$1 "$2"'.$sym['rnowrap'], //Нельзя отрывать сокращение от относящегося к нему слова. //Например: тов. Сталин, г. Воронеж //Ставит пробел, если его нет. И точку тоже ставит на всякий случай. :) '~(^|[^a-zA-Zа-яА-Я])('.$shortages.')\.?\s?([А-Я0-9]+)~s' => '$1$2.'.$sym['nbsp'].'$3', //Не отделять стр., с. и т.д. от номера. '~(стр|с|табл|рис|илл)\.?\s*(\d+)~si' => '$1.'.$sym['nbsp'].'$2', //Не разделять 2007 г., ставить пробел, если его нет. Ставит точку, если её нет. '~([0-9]+)\s*([гГ])\.\s~s' => '$1'.$sym['nbsp'].'$2. ', //Неразрывный пробел между цифрой и единицей измерения '~([0-9]+)\s*('.$metrics.')~s' => '$1'.$sym['nbsp'].'$2', //Сантиметр в квадрате '~(\s'.$metrics.')(\d+)~' => '$1$2', // Знак дефиса или два знака дефиса подряд — на знак длинного тире. // + Нельзя разрывать строку перед тире, например: Знание — сила, Курить — здоровью вредить. '/(\s+)(--?|—|—)(?=\s)/' => $sym['nbsp'].$sym['mdash'], '/(^)(--?|—|—)(?=\s)/' => $sym['mdash'], // Знак дефиса, ограниченный с обоих сторон цифрами — на знак короткого тире. '/(?<=\d)-(?=\d)/' => $sym['ndash'], // Нельзя оставлять в конце строки предлоги и союзы '/(?<=\s|^|\W)('.$prepos.')(\s+)/i' => '$1'.$sym['nbsp'], // Нельзя отрывать частицы бы, ли, же от предшествующего слова, например: как бы, вряд ли, так же. "/(?<=\\S)(\\s+)(ж|бы|б|же|ли|ль|либо|или)(?=$html_tag*[\\s)!?.])/i" => $sym['nbsp'].'$2', // Неразрывный пробел после инициалов. '~([А-ЯA-Z]\.)\s?([А-ЯA-Z]\.)\s?([А-Яа-яA-Za-z]+)~s' => '$1$2'.$sym['nbsp'].'$3', // Сокращения сумм не отделяются от чисел. '~(\d+)\s?('.$counts.')~s' => '$1'.$sym['nbsp'].'$2', //«уе» в денежных суммах '~(\d+|'.$counts.')\s?уе~s' => '$1'.$sym['nbsp'].'у.е.', // Денежные суммы, расставляя пробелы в нужных местах. '~(\d+|'.$counts.')\s?('.$money.')~s' => '$1'.$sym['nbsp'].'$2', // Неразрывные пробелы в кавычках //"/($sym[lquote]\S*)(\s+)(\S*$sym[rquote])/U" => '$1'.$sym["nbsp"].'$3', //Номер версии программы пишем неразрывно с буковкой v. '~([vв]\.) ?([0-9])~i' => '$1'.$sym['nbsp'].'$2', '~(\w) ([vв]\.)~i' => '$1'.$sym['nbsp'].'$2', //% не отделяется от числа '~([0-9]+)\s+%~' => '$1%', ); $str = $this->apply_rules($rules_quotes, $str); // Вложенные кавыки. $i=0; $lev = 5; while (($i<$lev) && preg_match('~«(?:[^»]*?)«~', $str)){ $i++; $str = preg_replace('~«([^»]*?)«(.*?)»~s', '«$1'.$sym['lquote2'].'$2'.$sym['rquote2'], $str); } $i=0; while (($i++<$lev) && preg_match('~»(?:[^«]*?)»~', $str)){ $i++; $str = preg_replace('~»([^«]*?)»~', $sym['rquote2'].'$1»', $str); } $str = $this->apply_rules($rules_strict, $str); $str = $this->apply_rules($rules_main, $str); $str = $this->apply_rules($rules_symbols, $str); $str = $this->apply_rules($rules_braces, $str); if($this->_options[self::CONVERT_E]){ $str = str_replace(array('Ё', 'ё'), array('Е', 'е'), $str); } if($this->_options[self::HTML_ENTITIES]){ $str = htmlentities($str); } return $str; } } plugins/typograf/handler.php000066600000001163150472426320012220 0ustar00process($word); print $out_txt;plugins/typograf/img/loader.gif000066600000004761150472426320012612 0ustar00GIF89aѦنʞoon~~}bba! NETSCAPE2.0!Created with ajaxload.info! , $AeZ <䠒ÌQ46<A ßHa:ID0Fa\xG3! O:-RjTJ*  t ~" ds]  )t-"i;H>nQg]_* R3 GI? ˴v$ýj3!! , $0eZy0q PУW )";qX^D50 Ո%`rJ{ 1$ʈ!! , $@e6$Ơ` 3*=  P\"F`P-d5V"2|?n"!( )e4xyc?   3 #wyJ l% o^[b_0 V T[0m $4>'VZ c3$X%!! , $`e:D3 H0,'j0Qs L(2HMj#ȉB \Oi`u=YEVL=I  > suI WJm| \"_b0 BcV"d]*K1" H|@B?I4# S$-||!! , $4ea:D hI /K$W- 0(`3F=pf@tQ  {f~*yS*mg) enu E^Z^ g@ kw(b& -w#" xW"t ##%U$`to!! , $4ea:* 1v/Kdzk#  F Y" % E  Cb AI4$ (z:2 mI Ll## F##>F!! , $4ea:* 1v/KdVtKG227D"$)Qqp8 y l |~6zw2j# F " % VC ]6a$ Q :2 \  EF I&x "͓F4$]#x!! , $4eZi䠒J16e E,C\3 ^3[ S|?!;plugins/typograf/img/typograf.gif000066600000000477150472426320013177 0ustar00GIF89a6poniigIHFba_TTR[ZXĵʘVVV֣|DCAjjjdddkjjOOONNL@@?^^^kkkqqpwvtutr{zxIIHppp!6,\@pH,ȤR Ux&P6@!a̦|lM@V H03%DG- DG5D#G&0B,KBA;plugins/noneditable/editor_plugin.js000066600000012520150472426320013724 0ustar00(function(){var c=tinymce.dom.TreeWalker;var a="contenteditable",d="data-mce-"+a;var e=tinymce.VK;function b(n){var j=n.dom,p=n.selection,r,o="mce_noneditablecaret";r=tinymce.isGecko?"\u200B":"\uFEFF";function m(t){var s;if(t.nodeType===1){s=t.getAttribute(d);if(s&&s!=="inherit"){return s}s=t.contentEditable;if(s!=="inherit"){return s}}return null}function g(s){var t;while(s){t=m(s);if(t){return t==="false"?s:null}s=s.parentNode}}function l(s){while(s){if(s.id===o){return s}s=s.parentNode}}function k(s){var t;if(s){t=new c(s,s);for(s=t.current();s;s=t.next()){if(s.nodeType===3){return s}}}}function f(v,u){var s,t;if(m(v)==="false"){if(j.isBlock(v)){p.select(v);return}}t=j.createRng();if(m(v)==="true"){if(!v.firstChild){v.appendChild(n.getDoc().createTextNode("\u00a0"))}v=v.firstChild;u=true}s=j.create("span",{id:o,"data-mce-bogus":true},r);if(u){v.parentNode.insertBefore(s,v)}else{j.insertAfter(s,v)}t.setStart(s.firstChild,1);t.collapse(true);p.setRng(t);return s}function i(s){var v,t,u;if(s){rng=p.getRng(true);rng.setStartBefore(s);rng.setEndBefore(s);v=k(s);if(v&&v.nodeValue.charAt(0)==r){v=v.deleteData(0,1)}j.remove(s,true);p.setRng(rng)}else{t=l(p.getStart());while((s=j.get(o))&&s!==u){if(t!==s){v=k(s);if(v&&v.nodeValue.charAt(0)==r){v=v.deleteData(0,1)}j.remove(s,true)}u=s}}}function q(){var s,w,u,t,v;function x(B,D){var A,F,E,C,z;A=t.startContainer;F=t.startOffset;if(A.nodeType==3){z=A.nodeValue.length;if((F>0&&F0?F-1:F;A=A.childNodes[G];if(A.hasChildNodes()){A=A.firstChild}}else{return !D?B:null}}E=new c(A,B);while(C=E[D?"prev":"next"]()){if(C.nodeType===3&&C.nodeValue.length>0){return}else{if(m(C)==="true"){return C}}}return B}i();u=p.isCollapsed();s=g(p.getStart());w=g(p.getEnd());if(s||w){t=p.getRng(true);if(u){s=s||w;var y=p.getStart();if(v=x(s,true)){f(v,true)}else{if(v=x(s,false)){f(v,false)}else{p.select(s)}}}else{t=p.getRng(true);if(s){t.setStartBefore(s)}if(w){t.setEndAfter(w)}p.setRng(t)}}}function h(z,B){var F=B.keyCode,x,C,D,v;function u(H,G){while(H=H[G?"previousSibling":"nextSibling"]){if(H.nodeType!==3||H.nodeValue.length>0){return H}}}function y(G,H){p.select(G);p.collapse(H)}function t(K){var J,I,M,H;function G(O){var N=I;while(N){if(N===O){return}N=N.parentNode}j.remove(O);q()}function L(){var O,P,N=z.schema.getNonEmptyElements();P=new tinymce.dom.TreeWalker(I,z.getBody());while(O=(K?P.prev():P.next())){if(N[O.nodeName.toLowerCase()]){break}if(O.nodeType===3&&tinymce.trim(O.nodeValue).length>0){break}if(m(O)==="false"){G(O);return true}}if(g(O)){return true}return false}if(p.isCollapsed()){J=p.getRng(true);I=J.startContainer;M=J.startOffset;I=l(I)||I;if(H=g(I)){G(H);return false}if(I.nodeType==3&&(K?M>0:M124)&&F!=e.DELETE&&F!=e.BACKSPACE){if((tinymce.isMac?B.metaKey:B.ctrlKey)&&(F==67||F==88||F==86)){return}B.preventDefault();if(F==e.LEFT||F==e.RIGHT){var w=F==e.LEFT;if(z.dom.isBlock(x)){var A=w?x.previousSibling:x.nextSibling;var s=new c(A,A);var E=w?s.prev():s.next();y(E,!w)}else{y(x,w)}}}else{if(F==e.LEFT||F==e.RIGHT||F==e.BACKSPACE||F==e.DELETE){C=l(D);if(C){if(F==e.LEFT||F==e.BACKSPACE){x=u(C,true);if(x&&m(x)==="false"){B.preventDefault();if(F==e.LEFT){y(x,true)}else{j.remove(x);return}}else{i(C)}}if(F==e.RIGHT||F==e.DELETE){x=u(C);if(x&&m(x)==="false"){B.preventDefault();if(F==e.RIGHT){y(x,false)}else{j.remove(x);return}}else{i(C)}}}if((F==e.BACKSPACE||F==e.DELETE)&&!t(F==e.BACKSPACE)){B.preventDefault();return false}}}}n.onMouseDown.addToTop(function(s,u){var t=s.selection.getNode();if(m(t)==="false"&&t==u.target){q()}});n.onMouseUp.addToTop(q);n.onKeyDown.addToTop(h);n.onKeyUp.addToTop(q)}tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(i,k){var h,g,j;function f(m,n){var o=j.length,p=n.content,l=tinymce.trim(g);if(n.format=="raw"){return}while(o--){p=p.replace(j[o],function(s){var r=arguments,q=r[r.length-2];if(q>0&&p.charAt(q-1)=='"'){return s}return''+m.dom.encode(typeof(r[1])==="string"?r[1]:r[0])+""})}n.content=p}h=" "+tinymce.trim(i.getParam("noneditable_editable_class","mceEditable"))+" ";g=" "+tinymce.trim(i.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";j=i.getParam("noneditable_regexp");if(j&&!j.length){j=[j]}i.onPreInit.add(function(){b(i);if(j){i.selection.onBeforeSetContent.add(f);i.onBeforeSetContent.add(f)}i.parser.addAttributeFilter("class",function(l){var m=l.length,n,o;while(m--){o=l[m];n=" "+o.attr("class")+" ";if(n.indexOf(h)!==-1){o.attr(d,"true")}else{if(n.indexOf(g)!==-1){o.attr(d,"false")}}}});i.serializer.addAttributeFilter(d,function(l,m){var n=l.length,o;while(n--){o=l[n];if(j&&o.attr("data-mce-content")){o.name="#text";o.type=3;o.raw=true;o.value=o.attr("data-mce-content")}else{o.attr(a,null);o.attr(d,null)}}});i.parser.addAttributeFilter(a,function(l,m){var n=l.length,o;while(n--){o=l[n];o.attr(d,o.attr(a));o.attr(a,null)}})})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})();plugins/noneditable/editor_plugin_src.js000066600000040573150472426320014604 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var TreeWalker = tinymce.dom.TreeWalker; var externalName = 'contenteditable', internalName = 'data-mce-' + externalName; var VK = tinymce.VK; function handleContentEditableSelection(ed) { var dom = ed.dom, selection = ed.selection, invisibleChar, caretContainerId = 'mce_noneditablecaret'; // Setup invisible character use zero width space on Gecko since it doesn't change the height of the container invisibleChar = tinymce.isGecko ? '\u200B' : '\uFEFF'; // Returns the content editable state of a node "true/false" or null function getContentEditable(node) { var contentEditable; // Ignore non elements if (node.nodeType === 1) { // Check for fake content editable contentEditable = node.getAttribute(internalName); if (contentEditable && contentEditable !== "inherit") { return contentEditable; } // Check for real content editable contentEditable = node.contentEditable; if (contentEditable !== "inherit") { return contentEditable; } } return null; }; // Returns the noneditable parent or null if there is a editable before it or if it wasn't found function getNonEditableParent(node) { var state; while (node) { state = getContentEditable(node); if (state) { return state === "false" ? node : null; } node = node.parentNode; } }; // Get caret container parent for the specified node function getParentCaretContainer(node) { while (node) { if (node.id === caretContainerId) { return node; } node = node.parentNode; } }; // Finds the first text node in the specified node function findFirstTextNode(node) { var walker; if (node) { walker = new TreeWalker(node, node); for (node = walker.current(); node; node = walker.next()) { if (node.nodeType === 3) { return node; } } } }; // Insert caret container before/after target or expand selection to include block function insertCaretContainerOrExpandToBlock(target, before) { var caretContainer, rng; // Select block if (getContentEditable(target) === "false") { if (dom.isBlock(target)) { selection.select(target); return; } } rng = dom.createRng(); if (getContentEditable(target) === "true") { if (!target.firstChild) { target.appendChild(ed.getDoc().createTextNode('\u00a0')); } target = target.firstChild; before = true; } //caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true, style:'border: 1px solid red'}, invisibleChar); caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true}, invisibleChar); if (before) { target.parentNode.insertBefore(caretContainer, target); } else { dom.insertAfter(caretContainer, target); } rng.setStart(caretContainer.firstChild, 1); rng.collapse(true); selection.setRng(rng); return caretContainer; }; // Removes any caret container except the one we might be in function removeCaretContainer(caretContainer) { var child, currentCaretContainer, lastContainer; if (caretContainer) { rng = selection.getRng(true); rng.setStartBefore(caretContainer); rng.setEndBefore(caretContainer); child = findFirstTextNode(caretContainer); if (child && child.nodeValue.charAt(0) == invisibleChar) { child = child.deleteData(0, 1); } dom.remove(caretContainer, true); selection.setRng(rng); } else { currentCaretContainer = getParentCaretContainer(selection.getStart()); while ((caretContainer = dom.get(caretContainerId)) && caretContainer !== lastContainer) { if (currentCaretContainer !== caretContainer) { child = findFirstTextNode(caretContainer); if (child && child.nodeValue.charAt(0) == invisibleChar) { child = child.deleteData(0, 1); } dom.remove(caretContainer, true); } lastContainer = caretContainer; } } }; // Modifies the selection to include contentEditable false elements or insert caret containers function moveSelection() { var nonEditableStart, nonEditableEnd, isCollapsed, rng, element; // Checks if there is any contents to the left/right side of caret returns the noneditable element or any editable element if it finds one inside function hasSideContent(element, left) { var container, offset, walker, node, len; container = rng.startContainer; offset = rng.startOffset; // If endpoint is in middle of text node then expand to beginning/end of element if (container.nodeType == 3) { len = container.nodeValue.length; if ((offset > 0 && offset < len) || (left ? offset == len : offset == 0)) { return; } } else { // Can we resolve the node by index if (offset < container.childNodes.length) { // Browser represents caret position as the offset at the start of an element. When moving right // this is the element we are moving into so we consider our container to be child node at offset-1 var pos = !left && offset > 0 ? offset-1 : offset; container = container.childNodes[pos]; if (container.hasChildNodes()) { container = container.firstChild; } } else { // If not then the caret is at the last position in it's container and the caret container should be inserted after the noneditable element return !left ? element : null; } } // Walk left/right to look for contents walker = new TreeWalker(container, element); while (node = walker[left ? 'prev' : 'next']()) { if (node.nodeType === 3 && node.nodeValue.length > 0) { return; } else if (getContentEditable(node) === "true") { // Found contentEditable=true element return this one to we can move the caret inside it return node; } } return element; }; // Remove any existing caret containers removeCaretContainer(); // Get noneditable start/end elements isCollapsed = selection.isCollapsed(); nonEditableStart = getNonEditableParent(selection.getStart()); nonEditableEnd = getNonEditableParent(selection.getEnd()); // Is any fo the range endpoints noneditable if (nonEditableStart || nonEditableEnd) { rng = selection.getRng(true); // If it's a caret selection then look left/right to see if we need to move the caret out side or expand if (isCollapsed) { nonEditableStart = nonEditableStart || nonEditableEnd; var start = selection.getStart(); if (element = hasSideContent(nonEditableStart, true)) { // We have no contents to the left of the caret then insert a caret container before the noneditable element insertCaretContainerOrExpandToBlock(element, true); } else if (element = hasSideContent(nonEditableStart, false)) { // We have no contents to the right of the caret then insert a caret container after the noneditable element insertCaretContainerOrExpandToBlock(element, false); } else { // We are in the middle of a noneditable so expand to select it selection.select(nonEditableStart); } } else { rng = selection.getRng(true); // Expand selection to include start non editable element if (nonEditableStart) { rng.setStartBefore(nonEditableStart); } // Expand selection to include end non editable element if (nonEditableEnd) { rng.setEndAfter(nonEditableEnd); } selection.setRng(rng); } } }; function handleKey(ed, e) { var keyCode = e.keyCode, nonEditableParent, caretContainer, startElement, endElement; function getNonEmptyTextNodeSibling(node, prev) { while (node = node[prev ? 'previousSibling' : 'nextSibling']) { if (node.nodeType !== 3 || node.nodeValue.length > 0) { return node; } } }; function positionCaretOnElement(element, start) { selection.select(element); selection.collapse(start); } function canDelete(backspace) { var rng, container, offset, nonEditableParent; function removeNodeIfNotParent(node) { var parent = container; while (parent) { if (parent === node) { return; } parent = parent.parentNode; } dom.remove(node); moveSelection(); } function isNextPrevTreeNodeNonEditable() { var node, walker, nonEmptyElements = ed.schema.getNonEmptyElements(); walker = new tinymce.dom.TreeWalker(container, ed.getBody()); while (node = (backspace ? walker.prev() : walker.next())) { // Found IMG/INPUT etc if (nonEmptyElements[node.nodeName.toLowerCase()]) { break; } // Found text node with contents if (node.nodeType === 3 && tinymce.trim(node.nodeValue).length > 0) { break; } // Found non editable node if (getContentEditable(node) === "false") { removeNodeIfNotParent(node); return true; } } // Check if the content node is within a non editable parent if (getNonEditableParent(node)) { return true; } return false; } if (selection.isCollapsed()) { rng = selection.getRng(true); container = rng.startContainer; offset = rng.startOffset; container = getParentCaretContainer(container) || container; // Is in noneditable parent if (nonEditableParent = getNonEditableParent(container)) { removeNodeIfNotParent(nonEditableParent); return false; } // Check if the caret is in the middle of a text node if (container.nodeType == 3 && (backspace ? offset > 0 : offset < container.nodeValue.length)) { return true; } // Resolve container index if (container.nodeType == 1) { container = container.childNodes[offset] || container; } // Check if previous or next tree node is non editable then block the event if (isNextPrevTreeNodeNonEditable()) { return false; } } return true; } startElement = selection.getStart() endElement = selection.getEnd(); // Disable all key presses in contentEditable=false except delete or backspace nonEditableParent = getNonEditableParent(startElement) || getNonEditableParent(endElement); if (nonEditableParent && (keyCode < 112 || keyCode > 124) && keyCode != VK.DELETE && keyCode != VK.BACKSPACE) { // Is Ctrl+c, Ctrl+v or Ctrl+x then use default browser behavior if ((tinymce.isMac ? e.metaKey : e.ctrlKey) && (keyCode == 67 || keyCode == 88 || keyCode == 86)) { return; } e.preventDefault(); // Arrow left/right select the element and collapse left/right if (keyCode == VK.LEFT || keyCode == VK.RIGHT) { var left = keyCode == VK.LEFT; // If a block element find previous or next element to position the caret if (ed.dom.isBlock(nonEditableParent)) { var targetElement = left ? nonEditableParent.previousSibling : nonEditableParent.nextSibling; var walker = new TreeWalker(targetElement, targetElement); var caretElement = left ? walker.prev() : walker.next(); positionCaretOnElement(caretElement, !left); } else { positionCaretOnElement(nonEditableParent, left); } } } else { // Is arrow left/right, backspace or delete if (keyCode == VK.LEFT || keyCode == VK.RIGHT || keyCode == VK.BACKSPACE || keyCode == VK.DELETE) { caretContainer = getParentCaretContainer(startElement); if (caretContainer) { // Arrow left or backspace if (keyCode == VK.LEFT || keyCode == VK.BACKSPACE) { nonEditableParent = getNonEmptyTextNodeSibling(caretContainer, true); if (nonEditableParent && getContentEditable(nonEditableParent) === "false") { e.preventDefault(); if (keyCode == VK.LEFT) { positionCaretOnElement(nonEditableParent, true); } else { dom.remove(nonEditableParent); return; } } else { removeCaretContainer(caretContainer); } } // Arrow right or delete if (keyCode == VK.RIGHT || keyCode == VK.DELETE) { nonEditableParent = getNonEmptyTextNodeSibling(caretContainer); if (nonEditableParent && getContentEditable(nonEditableParent) === "false") { e.preventDefault(); if (keyCode == VK.RIGHT) { positionCaretOnElement(nonEditableParent, false); } else { dom.remove(nonEditableParent); return; } } else { removeCaretContainer(caretContainer); } } } if ((keyCode == VK.BACKSPACE || keyCode == VK.DELETE) && !canDelete(keyCode == VK.BACKSPACE)) { e.preventDefault(); return false; } } } }; ed.onMouseDown.addToTop(function(ed, e) { var node = ed.selection.getNode(); if (getContentEditable(node) === "false" && node == e.target) { // Expand selection on mouse down we can't block the default event since it's used for drag/drop moveSelection(); } }); ed.onMouseUp.addToTop(moveSelection); ed.onKeyDown.addToTop(handleKey); ed.onKeyUp.addToTop(moveSelection); }; tinymce.create('tinymce.plugins.NonEditablePlugin', { init : function(ed, url) { var editClass, nonEditClass, nonEditableRegExps; // Converts configured regexps to noneditable span items function convertRegExpsToNonEditable(ed, args) { var i = nonEditableRegExps.length, content = args.content, cls = tinymce.trim(nonEditClass); // Don't replace the variables when raw is used for example on undo/redo if (args.format == "raw") { return; } while (i--) { content = content.replace(nonEditableRegExps[i], function(match) { var args = arguments, index = args[args.length - 2]; // Is value inside an attribute then don't replace if (index > 0 && content.charAt(index - 1) == '"') { return match; } return '' + ed.dom.encode(typeof(args[1]) === "string" ? args[1] : args[0]) + ''; }); } args.content = content; }; editClass = " " + tinymce.trim(ed.getParam("noneditable_editable_class", "mceEditable")) + " "; nonEditClass = " " + tinymce.trim(ed.getParam("noneditable_noneditable_class", "mceNonEditable")) + " "; // Setup noneditable regexps array nonEditableRegExps = ed.getParam("noneditable_regexp"); if (nonEditableRegExps && !nonEditableRegExps.length) { nonEditableRegExps = [nonEditableRegExps]; } ed.onPreInit.add(function() { handleContentEditableSelection(ed); if (nonEditableRegExps) { ed.selection.onBeforeSetContent.add(convertRegExpsToNonEditable); ed.onBeforeSetContent.add(convertRegExpsToNonEditable); } // Apply contentEditable true/false on elements with the noneditable/editable classes ed.parser.addAttributeFilter('class', function(nodes) { var i = nodes.length, className, node; while (i--) { node = nodes[i]; className = " " + node.attr("class") + " "; if (className.indexOf(editClass) !== -1) { node.attr(internalName, "true"); } else if (className.indexOf(nonEditClass) !== -1) { node.attr(internalName, "false"); } } }); // Remove internal name ed.serializer.addAttributeFilter(internalName, function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; if (nonEditableRegExps && node.attr('data-mce-content')) { node.name = "#text"; node.type = 3; node.raw = true; node.value = node.attr('data-mce-content'); } else { node.attr(externalName, null); node.attr(internalName, null); } } }); // Convert external name into internal name ed.parser.addAttributeFilter(externalName, function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; node.attr(internalName, node.attr(externalName)); node.attr(externalName, null); } }); }); }, getInfo : function() { return { longname : 'Non editable elements', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin); })();plugins/save/editor_plugin.js000066600000003041150472426320012374 0ustar00(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})();plugins/save/editor_plugin_src.js000066600000004575150472426320013260 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.Save', { init : function(ed, url) { var t = this; t.editor = ed; // Register commands ed.addCommand('mceSave', t._save, t); ed.addCommand('mceCancel', t._cancel, t); // Register buttons ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'}); ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'}); ed.onNodeChange.add(t._nodeChange, t); ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave'); }, getInfo : function() { return { longname : 'Save', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save', version : tinymce.majorVersion + "." + tinymce.minorVersion }; }, // Private methods _nodeChange : function(ed, cm, n) { var ed = this.editor; if (ed.getParam('save_enablewhendirty')) { cm.setDisabled('save', !ed.isDirty()); cm.setDisabled('cancel', !ed.isDirty()); } }, // Private methods _save : function() { var ed = this.editor, formObj, os, i, elementId; formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form'); if (ed.getParam("save_enablewhendirty") && !ed.isDirty()) return; tinyMCE.triggerSave(); // Use callback instead if (os = ed.getParam("save_onsavecallback")) { if (ed.execCallback('save_onsavecallback', ed)) { ed.startContent = tinymce.trim(ed.getContent({format : 'raw'})); ed.nodeChanged(); } return; } if (formObj) { ed.isNotDirty = true; if (formObj.onsubmit == null || formObj.onsubmit() != false) formObj.submit(); ed.nodeChanged(); } else ed.windowManager.alert("Error: No form element found."); }, _cancel : function() { var ed = this.editor, os, h = tinymce.trim(ed.startContent); // Use callback instead if (os = ed.getParam("save_oncancelcallback")) { ed.execCallback('save_oncancelcallback', ed); return; } ed.setContent(h); ed.undoManager.clear(); ed.nodeChanged(); } }); // Register plugin tinymce.PluginManager.add('save', tinymce.plugins.Save); })();plugins/searchreplace/css/searchreplace.css000066600000000252150472426320015141 0ustar00.panel_wrapper {height:85px;} .panel_wrapper div.current {height:85px;} /* IE */ * html .panel_wrapper {height:100px;} * html .panel_wrapper div.current {height:100px;} plugins/searchreplace/editor_plugin.js000066600000002026150472426320014241 0ustar00(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();plugins/searchreplace/js/searchreplace.js000066600000006732150472426320014622 0ustar00tinyMCEPopup.requireLangPack(); var SearchReplaceDialog = { init : function(ed) { var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode"); t.switchMode(m); f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string"); // Focus input field f[m + '_panel_searchstring'].focus(); mcTabs.onChange.add(function(tab_id, panel_id) { t.switchMode(tab_id.substring(0, tab_id.indexOf('_'))); }); }, switchMode : function(m) { var f, lm = this.lastMode; if (lm != m) { f = document.forms[0]; if (lm) { f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value; f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked; f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked; f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked; } mcTabs.displayTab(m + '_tab', m + '_panel'); document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none"; document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none"; this.lastMode = m; } }, searchNext : function(a) { var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0; // Get input f = document.forms[0]; s = f[m + '_panel_searchstring'].value; b = f[m + '_panel_backwardsu'].checked; ca = f[m + '_panel_casesensitivebox'].checked; rs = f['replace_panel_replacestring'].value; if (tinymce.isIE) { r = ed.getDoc().selection.createRange(); } if (s == '') return; function fix() { // Correct Firefox graphics glitches // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions? r = se.getRng().cloneRange(); ed.getDoc().execCommand('SelectAll', false, null); se.setRng(r); }; function replace() { ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE }; // IE flags if (ca) fl = fl | 4; switch (a) { case 'all': // Move caret to beginning of text ed.execCommand('SelectAll'); ed.selection.collapse(true); if (tinymce.isIE) { ed.focus(); r = ed.getDoc().selection.createRange(); while (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); replace(); fo = 1; if (b) { r.moveEnd("character", -(rs.length)); // Otherwise will loop forever } } tinyMCEPopup.storeSelection(); } else { while (w.find(s, ca, b, false, false, false, false)) { replace(); fo = 1; } } if (fo) tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced')); else tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); return; case 'current': if (!ed.selection.isCollapsed()) replace(); break; } se.collapse(b); r = se.getRng(); // Whats the point if (!s) return; if (tinymce.isIE) { ed.focus(); r = ed.getDoc().selection.createRange(); if (r.findText(s, b ? -1 : 1, fl)) { r.scrollIntoView(); r.select(); } else tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); tinyMCEPopup.storeSelection(); } else { if (!w.find(s, ca, b, false, false, false, false)) tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound')); else fix(); } } }; tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog); plugins/searchreplace/langs/ru_dlg.js000066600000002365150472426320013763 0ustar00tinyMCE.addI18n('ru.searchreplace_dlg',{ searchnext_desc:"\u041D\u0430\u0439\u0442\u0438 \u0435\u0449\u0435", notfound:"\u041F\u043E\u0438\u0441\u043A \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D. \u041F\u043E\u0438\u0441\u043A\u043E\u0432\u044B\u0439 \u0440\u044F\u0434 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D", search_title:"\u041D\u0430\u0439\u0442\u0438", replace_title:"\u041D\u0430\u0439\u0442\u0438 / \u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C", allreplaced:"\u0412\u0441\u0435 \u0432\u0445\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0441\u0442\u0440\u043E\u043A\u0438 \u0431\u044B\u043B\u0438 \u0437\u0430\u043C\u0435\u043D\u0435\u043D\u044B", findwhat:"\u041D\u0430\u0439\u0442\u0438", replacewith:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u043D\u0430", direction:"\u041D\u0430\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435", up:"\u0412\u0432\u0435\u0440\u0445 ", down:"\u0412\u043D\u0438\u0437", mcase:"\u0423\u0447\u0438\u0442\u044B\u0432\u0430\u0442\u044C \u0440\u0435\u0433\u0438\u0441\u0442\u0440", findnext:"\u041D\u0430\u0439\u0442\u0438 \u0434\u0430\u043B\u0435\u0435", replace:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C", replaceall:"\u0417\u0430\u043C\u0435\u043D\u0438\u0442\u044C \u0432\u0441\u0435" });plugins/searchreplace/langs/en_dlg.js000066600000000675150472426320013741 0ustar00tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"});plugins/searchreplace/editor_plugin_src.js000066600000003307150472426320015113 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.SearchReplacePlugin', { init : function(ed, url) { function open(m) { // Keep IE from writing out the f/r character to the editor // instance while initializing a new dialog. See: #3131190 window.focus(); ed.windowManager.open({ file : url + '/searchreplace.htm', width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)), height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)), inline : 1, auto_focus : 0 }, { mode : m, search_string : ed.selection.getContent({format : 'text'}), plugin_url : url }); }; // Register commands ed.addCommand('mceSearch', function() { open('search'); }); ed.addCommand('mceReplace', function() { open('replace'); }); // Register buttons ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'}); ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'}); ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch'); }, getInfo : function() { return { longname : 'Search/Replace', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin); })();plugins/searchreplace/searchreplace.htm000066600000012162150472426320014354 0ustar00 {#searchreplace_dlg.replace_title}
        plugins/wordcount/editor_plugin.js000066600000003650150472426320013470 0ustar00(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(c,d){var e=this,f=0,g=tinymce.VK;e.countre=c.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);e.cleanre=c.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);e.update_rate=c.getParam("wordcount_update_rate",2000);e.update_on_delete=c.getParam("wordcount_update_on_delete",false);e.id=c.id+"-word-count";c.onPostRender.add(function(i,h){var j,k;k=i.getParam("wordcount_target_id");if(!k){j=tinymce.DOM.get(i.id+"_path_row");if(j){tinymce.DOM.add(j.parentNode,"div",{style:"float: right"},i.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(k,"span",{},'0')}});c.onInit.add(function(h){h.selection.onSetContent.add(function(){e._count(h)});e._count(h)});c.onSetContent.add(function(h){e._count(h)});function b(h){return h!==f&&(h===g.ENTER||f===g.SPACEBAR||a(f))}function a(h){return h===g.DELETE||h===g.BACKSPACE}c.onKeyUp.add(function(h,i){if(b(i.keyCode)||e.update_on_delete&&a(i.keyCode)){e._count(h)}f=i.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){if(!a.destroyed){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},b.update_rate)}},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})();plugins/wordcount/editor_plugin_src.js000066600000006211150472426320014333 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { tinymce.create('tinymce.plugins.WordCount', { block : 0, id : null, countre : null, cleanre : null, init : function(ed, url) { var t = this, last = 0, VK = tinymce.VK; t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’ t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g); t.update_rate = ed.getParam('wordcount_update_rate', 2000); t.update_on_delete = ed.getParam('wordcount_update_on_delete', false); t.id = ed.id + '-word-count'; ed.onPostRender.add(function(ed, cm) { var row, id; // Add it to the specified id or the theme advanced path id = ed.getParam('wordcount_target_id'); if (!id) { row = tinymce.DOM.get(ed.id + '_path_row'); if (row) tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0'); } else { tinymce.DOM.add(id, 'span', {}, '0'); } }); ed.onInit.add(function(ed) { ed.selection.onSetContent.add(function() { t._count(ed); }); t._count(ed); }); ed.onSetContent.add(function(ed) { t._count(ed); }); function checkKeys(key) { return key !== last && (key === VK.ENTER || last === VK.SPACEBAR || checkDelOrBksp(last)); } function checkDelOrBksp(key) { return key === VK.DELETE || key === VK.BACKSPACE; } ed.onKeyUp.add(function(ed, e) { if (checkKeys(e.keyCode) || t.update_on_delete && checkDelOrBksp(e.keyCode)) { t._count(ed); } last = e.keyCode; }); }, _getCount : function(ed) { var tc = 0; var tx = ed.getContent({ format: 'raw' }); if (tx) { tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars // deal with html entities tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' '); tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation var wordArray = tx.match(this.countre); if (wordArray) { tc = wordArray.length; } } return tc; }, _count : function(ed) { var t = this; // Keep multiple calls from happening at the same time if (t.block) return; t.block = 1; setTimeout(function() { if (!ed.destroyed) { var tc = t._getCount(ed); tinymce.DOM.setHTML(t.id, tc.toString()); setTimeout(function() {t.block = 0;}, t.update_rate); } }, 1); }, getInfo: function() { return { longname : 'Word Count plugin', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount); })(); plugins/autoresize/editor_plugin.js000066600000002742150472426320013637 0ustar00(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this,e=0;if(a.getParam("fullscreen_is_enabled")){return}function b(){var j,i=a.getDoc(),f=i.body,l=i.documentElement,h=tinymce.DOM,k=d.autoresize_min_height,g;g=tinymce.isIE?f.scrollHeight:(tinymce.isWebKit&&f.clientHeight==0?0:f.offsetHeight);if(g>d.autoresize_min_height){k=g}if(d.autoresize_max_height&&g>d.autoresize_max_height){k=d.autoresize_max_height;f.style.overflowY="auto";l.style.overflowY="auto"}else{f.style.overflowY="hidden";l.style.overflowY="hidden";f.scrollTop=0}if(k!==e){j=k-e;h.setStyle(h.get(a.id+"_ifr"),"height",k+"px");e=k;if(tinymce.isWebKit&&j<0){b()}}}d.editor=a;d.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight));d.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0));a.onInit.add(function(f){f.dom.setStyle(f.getBody(),"paddingBottom",f.getParam("autoresize_bottom_margin",50)+"px")});a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onLoad.add(b);a.onLoadContent.add(b)}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})();plugins/autoresize/editor_plugin_src.js000066600000007707150472426320014514 0ustar00/** * editor_plugin_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { /** * Auto Resize * * This plugin automatically resizes the content area to fit its content height. * It will retain a minimum height, which is the height of the content area when * it's initialized. */ tinymce.create('tinymce.plugins.AutoResizePlugin', { /** * Initializes the plugin, this will be executed after the plugin has been created. * This call is done before the editor instance has finished it's initialization so use the onInit event * of the editor instance to intercept that event. * * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in. * @param {string} url Absolute URL to where the plugin is located. */ init : function(ed, url) { var t = this, oldSize = 0; if (ed.getParam('fullscreen_is_enabled')) return; /** * This method gets executed each time the editor needs to resize. */ function resize() { var deltaSize, d = ed.getDoc(), body = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight; // Get height differently depending on the browser used myHeight = tinymce.isIE ? body.scrollHeight : (tinymce.isWebKit && body.clientHeight == 0 ? 0 : body.offsetHeight); // Don't make it smaller than the minimum height if (myHeight > t.autoresize_min_height) resizeHeight = myHeight; // If a maximum height has been defined don't exceed this height if (t.autoresize_max_height && myHeight > t.autoresize_max_height) { resizeHeight = t.autoresize_max_height; body.style.overflowY = "auto"; de.style.overflowY = "auto"; // Old IE } else { body.style.overflowY = "hidden"; de.style.overflowY = "hidden"; // Old IE body.scrollTop = 0; } // Resize content element if (resizeHeight !== oldSize) { deltaSize = resizeHeight - oldSize; DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px'); oldSize = resizeHeight; // WebKit doesn't decrease the size of the body element until the iframe gets resized // So we need to continue to resize the iframe down until the size gets fixed if (tinymce.isWebKit && deltaSize < 0) resize(); } }; t.editor = ed; // Define minimum height t.autoresize_min_height = parseInt(ed.getParam('autoresize_min_height', ed.getElement().offsetHeight)); // Define maximum height t.autoresize_max_height = parseInt(ed.getParam('autoresize_max_height', 0)); // Add padding at the bottom for better UX ed.onInit.add(function(ed){ ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px'); }); // Add appropriate listeners for resizing content area ed.onChange.add(resize); ed.onSetContent.add(resize); ed.onPaste.add(resize); ed.onKeyUp.add(resize); ed.onPostRender.add(resize); if (ed.getParam('autoresize_on_init', true)) { ed.onLoad.add(resize); ed.onLoadContent.add(resize); } // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample'); ed.addCommand('mceAutoResize', resize); }, /** * Returns information about the plugin as a name/value array. * The current keys are longname, author, authorurl, infourl and version. * * @return {Object} Name/value array containing information about the plugin. */ getInfo : function() { return { longname : 'Auto Resize', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize', version : tinymce.majorVersion + "." + tinymce.minorVersion }; } }); // Register plugin tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin); })(); plugins/insertdatetime/editor_plugin.js000066600000003613150472426320014464 0ustar00(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length0){if(l=tinyMCE.get(m[0].id)){return l.getContent()}}}}function h(m){var l=null;(m)&&(m.id)&&(d.tinymce)&&(l=tinyMCE.get(m.id));return l}function g(l){return !!((l)&&(l.length)&&(d.tinymce)&&(l.is(":tinymce")))}var j={};c.each(["text","html","val"],function(n,l){var o=j[l]=c.fn[l],m=(l==="text");c.fn[l]=function(s){var p=this;if(!g(p)){return o.apply(p,arguments)}if(s!==b){k.call(p.filter(":tinymce"),s);o.apply(p.not(":tinymce"),arguments);return p}else{var r="";var q=arguments;(m?p:p.eq(0)).each(function(u,v){var t=h(v);r+=t?(m?t.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):t.getContent()):o.apply(c(v),q)});return r}}});c.each(["append","prepend"],function(n,m){var o=j[m]=c.fn[m],l=(m==="prepend");c.fn[m]=function(q){var p=this;if(!g(p)){return o.apply(p,arguments)}if(q!==b){p.filter(":tinymce").each(function(s,t){var r=h(t);r&&r.setContent(l?q+r.getContent():r.getContent()+q)});o.apply(p.not(":tinymce"),arguments);return p}}});c.each(["remove","replaceWith","replaceAll","empty"],function(m,l){var n=j[l]=c.fn[l];c.fn[l]=function(){i.call(this,l);return n.apply(this,arguments)}});j.attr=c.fn.attr;c.fn.attr=function(n,p){var m=this;if((!n)||(n!=="value")||(!g(m))){if(p!==b){return j.attr.call(m,n,p)}else{return j.attr.call(m,n)}}if(p!==b){k.call(m.filter(":tinymce"),p);j.attr.call(m.not(":tinymce"),n,p);return m}else{var o=m[0],l=h(o);return l?l.getContent():j.attr.call(c(o),n,p)}}}})(jQuery);tiny_mce_src.js000066600001571103150472426320007601 0ustar00// FILE IS GENERATED BY COMBINING THE SOURCES IN THE "classes" DIRECTORY SO DON'T MODIFY THIS FILE DIRECTLY (function(win) { var whiteSpaceRe = /^\s*|\s*$/g, undef, isRegExpBroken = 'B'.replace(/A(.)|B/, '$1') === '$1'; var tinymce = { majorVersion : '3', minorVersion : '5.2', releaseDate : '2012-05-31', _init : function() { var t = this, d = document, na = navigator, ua = na.userAgent, i, nl, n, base, p, v; t.isOpera = win.opera && opera.buildNumber; t.isWebKit = /WebKit/.test(ua); t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName); t.isIE6 = t.isIE && /MSIE [56]/.test(ua); t.isIE7 = t.isIE && /MSIE [7]/.test(ua); t.isIE8 = t.isIE && /MSIE [8]/.test(ua); t.isIE9 = t.isIE && /MSIE [9]/.test(ua); t.isGecko = !t.isWebKit && /Gecko/.test(ua); t.isMac = ua.indexOf('Mac') != -1; t.isAir = /adobeair/i.test(ua); t.isIDevice = /(iPad|iPhone)/.test(ua); t.isIOS5 = t.isIDevice && ua.match(/AppleWebKit\/(\d*)/)[1]>=534; // TinyMCE .NET webcontrol might be setting the values for TinyMCE if (win.tinyMCEPreInit) { t.suffix = tinyMCEPreInit.suffix; t.baseURL = tinyMCEPreInit.base; t.query = tinyMCEPreInit.query; return; } // Get suffix and base t.suffix = ''; // If base element found, add that infront of baseURL nl = d.getElementsByTagName('base'); for (i=0; i : s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s); cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name // Create namespace for new class ns = t.createNS(s[3].replace(/\.\w+$/, ''), root); // Class already exists if (ns[cn]) return; // Make pure static class if (s[2] == 'static') { ns[cn] = p; if (this.onCreate) this.onCreate(s[2], s[3], ns[cn]); return; } // Create default constructor if (!p[cn]) { p[cn] = function() {}; de = 1; } // Add constructor and methods ns[cn] = p[cn]; t.extend(ns[cn].prototype, p); // Extend if (s[5]) { sp = t.resolve(s[5]).prototype; scn = s[5].match(/\.(\w+)$/i)[1]; // Class name // Extend constructor c = ns[cn]; if (de) { // Add passthrough constructor ns[cn] = function() { return sp[scn].apply(this, arguments); }; } else { // Add inherit constructor ns[cn] = function() { this.parent = sp[scn]; return c.apply(this, arguments); }; } ns[cn].prototype[cn] = ns[cn]; // Add super methods t.each(sp, function(f, n) { ns[cn].prototype[n] = sp[n]; }); // Add overridden methods t.each(p, function(f, n) { // Extend methods if needed if (sp[n]) { ns[cn].prototype[n] = function() { this.parent = sp[n]; return f.apply(this, arguments); }; } else { if (n != cn) ns[cn].prototype[n] = f; } }); } // Add static methods t.each(p['static'], function(f, n) { ns[cn][n] = f; }); if (this.onCreate) this.onCreate(s[2], s[3], ns[cn].prototype); }, walk : function(o, f, n, s) { s = s || this; if (o) { if (n) o = o[n]; tinymce.each(o, function(o, i) { if (f.call(s, o, i, n) === false) return false; tinymce.walk(o, f, n, s); }); } }, createNS : function(n, o) { var i, v; o = o || win; n = n.split('.'); for (i=0; i 0 ? args : [listener.scope]); if (returnValue === false) break; } self.inDispatch = false; return returnValue; } }); (function() { var each = tinymce.each; tinymce.create('tinymce.util.URI', { URI : function(u, s) { var t = this, o, a, b, base_url; // Trim whitespace u = tinymce.trim(u); // Default settings s = t.settings = s || {}; // Strange app protocol that isn't http/https or local anchor // For example: mailto,skype,tel etc. if (/^([\w\-]+):([^\/]{2})/i.test(u) || /^\s*#/.test(u)) { t.source = u; return; } // Absolute path with no host, fake host and protocol if (u.indexOf('/') === 0 && u.indexOf('//') !== 0) u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u; // Relative path http:// or protocol relative //path if (!/^[\w\-]*:?\/\//.test(u)) { base_url = s.base_uri ? s.base_uri.path : new tinymce.util.URI(location.href).directory; u = ((s.base_uri && s.base_uri.protocol) || 'http') + '://mce_host' + t.toAbsPath(base_url, u); } // Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri) u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u); each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) { var s = u[i]; // Zope 3 workaround, they use @@something if (s) s = s.replace(/\(mce_at\)/g, '@@'); t[v] = s; }); b = s.base_uri; if (b) { if (!t.protocol) t.protocol = b.protocol; if (!t.userInfo) t.userInfo = b.userInfo; if (!t.port && t.host === 'mce_host') t.port = b.port; if (!t.host || t.host === 'mce_host') t.host = b.host; t.source = ''; } //t.path = t.path || '/'; }, setPath : function(p) { var t = this; p = /^(.*?)\/?(\w+)?$/.exec(p); // Update path parts t.path = p[0]; t.directory = p[1]; t.file = p[2]; // Rebuild source t.source = ''; t.getURI(); }, toRelative : function(u) { var t = this, o; if (u === "./") return u; u = new tinymce.util.URI(u, {base_uri : t}); // Not on same domain/port or protocol if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol) return u.getURI(); var tu = t.getURI(), uu = u.getURI(); // Allow usage of the base_uri when relative_urls = true if(tu == uu || (tu.charAt(tu.length - 1) == "/" && tu.substr(0, tu.length - 1) == uu)) return tu; o = t.toRelPath(t.path, u.path); // Add query if (u.query) o += '?' + u.query; // Add anchor if (u.anchor) o += '#' + u.anchor; return o; }, toAbsolute : function(u, nh) { u = new tinymce.util.URI(u, {base_uri : this}); return u.getURI(this.host == u.host && this.protocol == u.protocol ? nh : 0); }, toRelPath : function(base, path) { var items, bp = 0, out = '', i, l; // Split the paths base = base.substring(0, base.lastIndexOf('/')); base = base.split('/'); items = path.split('/'); if (base.length >= items.length) { for (i = 0, l = base.length; i < l; i++) { if (i >= items.length || base[i] != items[i]) { bp = i + 1; break; } } } if (base.length < items.length) { for (i = 0, l = items.length; i < l; i++) { if (i >= base.length || base[i] != items[i]) { bp = i + 1; break; } } } if (bp === 1) return path; for (i = 0, l = base.length - (bp - 1); i < l; i++) out += "../"; for (i = bp - 1, l = items.length; i < l; i++) { if (i != bp - 1) out += "/" + items[i]; else out += items[i]; } return out; }, toAbsPath : function(base, path) { var i, nb = 0, o = [], tr, outPath; // Split paths tr = /\/$/.test(path) ? '/' : ''; base = base.split('/'); path = path.split('/'); // Remove empty chunks each(base, function(k) { if (k) o.push(k); }); base = o; // Merge relURLParts chunks for (i = path.length - 1, o = []; i >= 0; i--) { // Ignore empty or . if (path[i].length === 0 || path[i] === ".") continue; // Is parent if (path[i] === '..') { nb++; continue; } // Move up if (nb > 0) { nb--; continue; } o.push(path[i]); } i = base.length - nb; // If /a/b/c or / if (i <= 0) outPath = o.reverse().join('/'); else outPath = base.slice(0, i).join('/') + '/' + o.reverse().join('/'); // Add front / if it's needed if (outPath.indexOf('/') !== 0) outPath = '/' + outPath; // Add traling / if it's needed if (tr && outPath.lastIndexOf('/') !== outPath.length - 1) outPath += tr; return outPath; }, getURI : function(nh) { var s, t = this; // Rebuild source if (!t.source || nh) { s = ''; if (!nh) { if (t.protocol) s += t.protocol + '://'; if (t.userInfo) s += t.userInfo + '@'; if (t.host) s += t.host; if (t.port) s += ':' + t.port; } if (t.path) s += t.path; if (t.query) s += '?' + t.query; if (t.anchor) s += '#' + t.anchor; t.source = s; } return t.source; } }); })(); (function() { var each = tinymce.each; tinymce.create('static tinymce.util.Cookie', { getHash : function(n) { var v = this.get(n), h; if (v) { each(v.split('&'), function(v) { v = v.split('='); h = h || {}; h[unescape(v[0])] = unescape(v[1]); }); } return h; }, setHash : function(n, v, e, p, d, s) { var o = ''; each(v, function(v, k) { o += (!o ? '' : '&') + escape(k) + '=' + escape(v); }); this.set(n, o, e, p, d, s); }, get : function(n) { var c = document.cookie, e, p = n + "=", b; // Strict mode if (!c) return; b = c.indexOf("; " + p); if (b == -1) { b = c.indexOf(p); if (b !== 0) return null; } else b += 2; e = c.indexOf(";", b); if (e == -1) e = c.length; return unescape(c.substring(b + p.length, e)); }, set : function(n, v, e, p, d, s) { document.cookie = n + "=" + escape(v) + ((e) ? "; expires=" + e.toGMTString() : "") + ((p) ? "; path=" + escape(p) : "") + ((d) ? "; domain=" + d : "") + ((s) ? "; secure" : ""); }, remove : function(name, path, domain) { var date = new Date(); date.setTime(date.getTime() - 1000); this.set(name, '', date, path, domain); } }); })(); (function() { function serialize(o, quote) { var i, v, t, name; quote = quote || '"'; if (o == null) return 'null'; t = typeof o; if (t == 'string') { v = '\bb\tt\nn\ff\rr\""\'\'\\\\'; return quote + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g, function(a, b) { // Make sure single quotes never get encoded inside double quotes for JSON compatibility if (quote === '"' && a === "'") return a; i = v.indexOf(b); if (i + 1) return '\\' + v.charAt(i + 1); a = b.charCodeAt().toString(16); return '\\u' + '0000'.substring(a.length) + a; }) + quote; } if (t == 'object') { if (o.hasOwnProperty && o instanceof Array) { for (i=0, v = '['; i 0 ? ',' : '') + serialize(o[i], quote); return v + ']'; } v = '{'; for (name in o) { if (o.hasOwnProperty(name)) { v += typeof o[name] != 'function' ? (v.length > 1 ? ',' + quote : quote) + name + quote +':' + serialize(o[name], quote) : ''; } } return v + '}'; } return '' + o; }; tinymce.util.JSON = { serialize: serialize, parse: function(s) { try { return eval('(' + s + ')'); } catch (ex) { // Ignore } } }; })(); tinymce.create('static tinymce.util.XHR', { send : function(o) { var x, t, w = window, c = 0; function ready() { if (!o.async || x.readyState == 4 || c++ > 10000) { if (o.success && c < 10000 && x.status == 200) o.success.call(o.success_scope, '' + x.responseText, x, o); else if (o.error) o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o); x = null; } else w.setTimeout(ready, 10); }; // Default settings o.scope = o.scope || this; o.success_scope = o.success_scope || o.scope; o.error_scope = o.error_scope || o.scope; o.async = o.async === false ? false : true; o.data = o.data || ''; function get(s) { x = 0; try { x = new ActiveXObject(s); } catch (ex) { } return x; }; x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP'); if (x) { if (x.overrideMimeType) x.overrideMimeType(o.content_type); x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async); if (o.content_type) x.setRequestHeader('Content-Type', o.content_type); x.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); x.send(o.data); // Syncronous request if (!o.async) return ready(); // Wait for response, onReadyStateChange can not be used since it leaks memory in IE t = w.setTimeout(ready, 10); } } }); (function() { var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR; tinymce.create('tinymce.util.JSONRequest', { JSONRequest : function(s) { this.settings = extend({ }, s); this.count = 0; }, send : function(o) { var ecb = o.error, scb = o.success; o = extend(this.settings, o); o.success = function(c, x) { c = JSON.parse(c); if (typeof(c) == 'undefined') { c = { error : 'JSON Parse error.' }; } if (c.error) ecb.call(o.error_scope || o.scope, c.error, x); else scb.call(o.success_scope || o.scope, c.result); }; o.error = function(ty, x) { if (ecb) ecb.call(o.error_scope || o.scope, ty, x); }; o.data = JSON.serialize({ id : o.id || 'c' + (this.count++), method : o.method, params : o.params }); // JSON content type for Ruby on rails. Bug: #1883287 o.content_type = 'application/json'; XHR.send(o); }, 'static' : { sendRPC : function(o) { return new tinymce.util.JSONRequest().send(o); } } }); }()); (function(tinymce){ tinymce.VK = { BACKSPACE: 8, DELETE: 46, DOWN: 40, ENTER: 13, LEFT: 37, RIGHT: 39, SPACEBAR: 32, TAB: 9, UP: 38, modifierPressed: function (e) { return e.shiftKey || e.ctrlKey || e.altKey; } }; })(tinymce); tinymce.util.Quirks = function(editor) { var VK = tinymce.VK, BACKSPACE = VK.BACKSPACE, DELETE = VK.DELETE, dom = editor.dom, selection = editor.selection, settings = editor.settings; function setEditorCommandState(cmd, state) { try { editor.getDoc().execCommand(cmd, false, state); } catch (ex) { // Ignore } } function cleanupStylesWhenDeleting() { function removeMergedFormatSpans(isDelete) { var rng, blockElm, node, clonedSpan; rng = selection.getRng(); // Find root block blockElm = dom.getParent(rng.startContainer, dom.isBlock); // On delete clone the root span of the next block element if (isDelete) blockElm = dom.getNext(blockElm, dom.isBlock); // Locate root span element and clone it since it would otherwise get merged by the "apple-style-span" on delete/backspace if (blockElm) { node = blockElm.firstChild; // Ignore empty text nodes while (node && node.nodeType == 3 && node.nodeValue.length === 0) node = node.nextSibling; if (node && node.nodeName === 'SPAN') { clonedSpan = node.cloneNode(false); } } // Do the backspace/delete action editor.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false, null); // Find all odd apple-style-spans blockElm = dom.getParent(rng.startContainer, dom.isBlock); tinymce.each(dom.select('span.Apple-style-span,font.Apple-style-span', blockElm), function(span) { var bm = selection.getBookmark(); if (clonedSpan) { dom.replace(clonedSpan.cloneNode(false), span, true); } else { dom.remove(span, true); } // Restore the selection selection.moveToBookmark(bm); }); }; editor.onKeyDown.add(function(editor, e) { var isDelete; isDelete = e.keyCode == DELETE; if (!e.isDefaultPrevented() && (isDelete || e.keyCode == BACKSPACE) && !VK.modifierPressed(e)) { e.preventDefault(); removeMergedFormatSpans(isDelete); } }); editor.addCommand('Delete', function() {removeMergedFormatSpans();}); }; function emptyEditorWhenDeleting() { function getEndPointNode(rng, start) { var container, offset, prefix = start ? 'start' : 'end'; container = rng[prefix + 'Container']; offset = rng[prefix + 'Offset']; // Resolve indexed container if (container.nodeType == 1 && container.hasChildNodes()) { container = container.childNodes[Math.min(start ? offset : (offset > 0 ? offset - 1 : 0), container.childNodes.length - 1)] } return container; }; function isAtStartEndOfBody(rng, start) { var container, offset, root, childNode, prefix = start ? 'start' : 'end', isAfter; container = rng[prefix + 'Container']; offset = rng[prefix + 'Offset']; root = dom.getRoot(); // Resolve indexed container if (container.nodeType == 1) { isAfter = offset >= container.childNodes.length; container = getEndPointNode(rng, start); if (container.nodeType == 3) { offset = start && !isAfter ? 0 : container.nodeValue.length; } } // Check if start/end is in the middle of text if (container.nodeType == 3 && ((start && offset > 0) || (!start && offset < container.nodeValue.length))) { return false; } // Walk up the DOM tree to see if the endpoint is at the beginning/end of body while (container !== root) { childNode = container.parentNode[start ? 'firstChild' : 'lastChild']; // If first/last element is a BR then jump to it's sibling in case:

        x

        if (childNode.nodeName == "BR") { childNode = childNode[start ? 'nextSibling' : 'previousSibling'] || childNode; } // If the childNode isn't the container node then break in case

        A[X]

        if (childNode !== container) { return false; } container = container.parentNode; } return true; }; editor.onKeyDown.addToTop(function(editor, e) { var rng, keyCode = e.keyCode; if (!e.isDefaultPrevented() && (keyCode == DELETE || keyCode == BACKSPACE)) { rng = selection.getRng(true); if (isAtStartEndOfBody(rng, true) && isAtStartEndOfBody(rng, false) && (rng.collapsed || dom.findCommonAncestor(getEndPointNode(rng, true), getEndPointNode(rng)) === dom.getRoot())) { editor.setContent(''); editor.nodeChanged(); e.preventDefault(); } } }); }; function inputMethodFocus() { if (!editor.settings.content_editable) { // Case 1 IME doesn't initialize if you focus the document dom.bind(editor.getDoc(), 'focusin', function(e) { selection.setRng(selection.getRng()); }); // Case 2 IME doesn't initialize if you click the documentElement it also doesn't properly fire the focusin event dom.bind(editor.getDoc(), 'mousedown', function(e) { if (e.target == editor.getDoc().documentElement) { editor.getWin().focus(); selection.setRng(selection.getRng()); } }); } }; function removeHrOnBackspace() { editor.onKeyDown.add(function(editor, e) { if (!e.isDefaultPrevented() && e.keyCode === BACKSPACE) { if (selection.isCollapsed() && selection.getRng(true).startOffset === 0) { var node = selection.getNode(); var previousSibling = node.previousSibling; if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "hr") { dom.remove(previousSibling); tinymce.dom.Event.cancel(e); } } } }) } function focusBody() { // Fix for a focus bug in FF 3.x where the body element // wouldn't get proper focus if the user clicked on the HTML element if (!Range.prototype.getClientRects) { // Detect getClientRects got introduced in FF 4 editor.onMouseDown.add(function(editor, e) { if (e.target.nodeName === "HTML") { var body = editor.getBody(); // Blur the body it's focused but not correctly focused body.blur(); // Refocus the body after a little while setTimeout(function() { body.focus(); }, 0); } }); } }; function selectControlElements() { editor.onClick.add(function(editor, e) { e = e.target; // Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250 // WebKit can't even do simple things like selecting an image // Needs tobe the setBaseAndExtend or it will fail to select floated images if (/^(IMG|HR)$/.test(e.nodeName)) { selection.getSel().setBaseAndExtent(e, 0, e, 1); } if (e.nodeName == 'A' && dom.hasClass(e, 'mceItemAnchor')) { selection.select(e); } editor.nodeChanged(); }); }; function removeStylesWhenDeletingAccrossBlockElements() { function getAttributeApplyFunction() { var template = dom.getAttribs(selection.getStart().cloneNode(false)); return function() { var target = selection.getStart(); if (target !== editor.getBody()) { dom.setAttrib(target, "style", null); tinymce.each(template, function(attr) { target.setAttributeNode(attr.cloneNode(true)); }); } }; } function isSelectionAcrossElements() { return !selection.isCollapsed() && selection.getStart() != selection.getEnd(); } function blockEvent(editor, e) { e.preventDefault(); return false; } editor.onKeyPress.add(function(editor, e) { var applyAttributes; if ((e.keyCode == 8 || e.keyCode == 46) && isSelectionAcrossElements()) { applyAttributes = getAttributeApplyFunction(); editor.getDoc().execCommand('delete', false, null); applyAttributes(); e.preventDefault(); return false; } }); dom.bind(editor.getDoc(), 'cut', function(e) { var applyAttributes; if (isSelectionAcrossElements()) { applyAttributes = getAttributeApplyFunction(); editor.onKeyUp.addToTop(blockEvent); setTimeout(function() { applyAttributes(); editor.onKeyUp.remove(blockEvent); }, 0); } }); } function selectionChangeNodeChanged() { var lastRng, selectionTimer; dom.bind(editor.getDoc(), 'selectionchange', function() { if (selectionTimer) { clearTimeout(selectionTimer); selectionTimer = 0; } selectionTimer = window.setTimeout(function() { var rng = selection.getRng(); // Compare the ranges to see if it was a real change or not if (!lastRng || !tinymce.dom.RangeUtils.compareRanges(rng, lastRng)) { editor.nodeChanged(); lastRng = rng; } }, 50); }); } function ensureBodyHasRoleApplication() { document.body.setAttribute("role", "application"); } function disableBackspaceIntoATable() { editor.onKeyDown.add(function(editor, e) { if (!e.isDefaultPrevented() && e.keyCode === BACKSPACE) { if (selection.isCollapsed() && selection.getRng(true).startOffset === 0) { var previousSibling = selection.getNode().previousSibling; if (previousSibling && previousSibling.nodeName && previousSibling.nodeName.toLowerCase() === "table") { return tinymce.dom.Event.cancel(e); } } } }) } function addNewLinesBeforeBrInPre() { var documentMode = editor.getDoc().documentMode; // IE8+ rendering mode does the right thing with BR in PRE if (documentMode && documentMode > 7) { return; } // Enable display: none in area and add a specific class that hides all BR elements in PRE to // avoid the caret from getting stuck at the BR elements while pressing the right arrow key setEditorCommandState('RespectVisibilityInDesign', true); dom.addClass(editor.getBody(), 'mceHideBrInPre'); // Adds a \n before all BR elements in PRE to get them visual editor.parser.addNodeFilter('pre', function(nodes, name) { var i = nodes.length, brNodes, j, brElm, sibling; while (i--) { brNodes = nodes[i].getAll('br'); j = brNodes.length; while (j--) { brElm = brNodes[j]; // Add \n before BR in PRE elements on older IE:s so the new lines get rendered sibling = brElm.prev; if (sibling && sibling.type === 3 && sibling.value.charAt(sibling.value - 1) != '\n') { sibling.value += '\n'; } else { brElm.parent.insert(new tinymce.html.Node('#text', 3), brElm, true).value = '\n'; } } } }); // Removes any \n before BR elements in PRE since other browsers and in contentEditable=false mode they will be visible editor.serializer.addNodeFilter('pre', function(nodes, name) { var i = nodes.length, brNodes, j, brElm, sibling; while (i--) { brNodes = nodes[i].getAll('br'); j = brNodes.length; while (j--) { brElm = brNodes[j]; sibling = brElm.prev; if (sibling && sibling.type == 3) { sibling.value = sibling.value.replace(/\r?\n$/, ''); } } } }); } function removePreSerializedStylesWhenSelectingControls() { dom.bind(editor.getBody(), 'mouseup', function(e) { var value, node = selection.getNode(); // Moved styles to attributes on IMG eements if (node.nodeName == 'IMG') { // Convert style width to width attribute if (value = dom.getStyle(node, 'width')) { dom.setAttrib(node, 'width', value.replace(/[^0-9%]+/g, '')); dom.setStyle(node, 'width', ''); } // Convert style height to height attribute if (value = dom.getStyle(node, 'height')) { dom.setAttrib(node, 'height', value.replace(/[^0-9%]+/g, '')); dom.setStyle(node, 'height', ''); } } }); } function keepInlineElementOnDeleteBackspace() { editor.onKeyDown.add(function(editor, e) { var isDelete, rng, container, offset, brElm, sibling, collapsed; isDelete = e.keyCode == DELETE; if (!e.isDefaultPrevented() && (isDelete || e.keyCode == BACKSPACE) && !VK.modifierPressed(e)) { rng = selection.getRng(); container = rng.startContainer; offset = rng.startOffset; collapsed = rng.collapsed; // Override delete if the start container is a text node and is at the beginning of text or // just before/after the last character to be deleted in collapsed mode if (container.nodeType == 3 && container.nodeValue.length > 0 && ((offset === 0 && !collapsed) || (collapsed && offset === (isDelete ? 0 : 1)))) { nonEmptyElements = editor.schema.getNonEmptyElements(); // Prevent default logic since it's broken e.preventDefault(); // Insert a BR before the text node this will prevent the containing element from being deleted/converted brElm = dom.create('br', {id: '__tmp'}); container.parentNode.insertBefore(brElm, container); // Do the browser delete editor.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false, null); // Check if the previous sibling is empty after deleting for example:

        |

        container = selection.getRng().startContainer; sibling = container.previousSibling; if (sibling && sibling.nodeType == 1 && !dom.isBlock(sibling) && dom.isEmpty(sibling) && !nonEmptyElements[sibling.nodeName.toLowerCase()]) { dom.remove(sibling); } // Remove the temp element we inserted dom.remove('__tmp'); } } }); } function removeBlockQuoteOnBackSpace() { // Add block quote deletion handler editor.onKeyDown.add(function(editor, e) { var rng, container, offset, root, parent; if (e.isDefaultPrevented() || e.keyCode != VK.BACKSPACE) { return; } rng = selection.getRng(); container = rng.startContainer; offset = rng.startOffset; root = dom.getRoot(); parent = container; if (!rng.collapsed || offset !== 0) { return; } while (parent && parent.parentNode && parent.parentNode.firstChild == parent && parent.parentNode != root) { parent = parent.parentNode; } // Is the cursor at the beginning of a blockquote? if (parent.tagName === 'BLOCKQUOTE') { // Remove the blockquote editor.formatter.toggle('blockquote', null, parent); // Move the caret to the beginning of container rng.setStart(container, 0); rng.setEnd(container, 0); selection.setRng(rng); selection.collapse(false); } }); }; function setGeckoEditingOptions() { function setOpts() { editor._refreshContentEditable(); setEditorCommandState("StyleWithCSS", false); setEditorCommandState("enableInlineTableEditing", false); if (!settings.object_resizing) { setEditorCommandState("enableObjectResizing", false); } }; if (!settings.readonly) { editor.onBeforeExecCommand.add(setOpts); editor.onMouseDown.add(setOpts); } }; function addBrAfterLastLinks() { function fixLinks(editor, o) { tinymce.each(dom.select('a'), function(node) { var parentNode = node.parentNode, root = dom.getRoot(); if (parentNode.lastChild === node) { while (parentNode && !dom.isBlock(parentNode)) { if (parentNode.parentNode.lastChild !== parentNode || parentNode === root) { return; } parentNode = parentNode.parentNode; } dom.add(parentNode, 'br', {'data-mce-bogus' : 1}); } }); }; editor.onExecCommand.add(function(editor, cmd) { if (cmd === 'CreateLink') { fixLinks(editor); } }); editor.onSetContent.add(selection.onSetContent.add(fixLinks)); }; function setDefaultBlockType() { if (settings.forced_root_block) { editor.onInit.add(function() { setEditorCommandState('DefaultParagraphSeparator', settings.forced_root_block); }); } } function removeGhostSelection() { function repaint(sender, args) { if (!sender || !args.initial) { editor.execCommand('mceRepaint'); } }; editor.onUndo.add(repaint); editor.onRedo.add(repaint); editor.onSetContent.add(repaint); }; function deleteImageOnBackSpace() { editor.onKeyDown.add(function(editor, e) { if (!e.isDefaultPrevented() && e.keyCode == 8 && selection.getNode().nodeName == 'IMG') { e.preventDefault(); editor.undoManager.beforeChange(); dom.remove(selection.getNode()); editor.undoManager.add(); } }); }; // All browsers disableBackspaceIntoATable(); removeBlockQuoteOnBackSpace(); emptyEditorWhenDeleting(); // WebKit if (tinymce.isWebKit) { keepInlineElementOnDeleteBackspace(); cleanupStylesWhenDeleting(); inputMethodFocus(); selectControlElements(); setDefaultBlockType(); // iOS if (tinymce.isIDevice) { selectionChangeNodeChanged(); } } // IE if (tinymce.isIE) { removeHrOnBackspace(); ensureBodyHasRoleApplication(); addNewLinesBeforeBrInPre(); removePreSerializedStylesWhenSelectingControls(); deleteImageOnBackSpace(); } // Gecko if (tinymce.isGecko) { removeHrOnBackspace(); focusBody(); removeStylesWhenDeletingAccrossBlockElements(); setGeckoEditingOptions(); addBrAfterLastLinks(); removeGhostSelection(); } }; (function(tinymce) { var namedEntities, baseEntities, reverseEntities, attrsCharsRegExp = /[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, textCharsRegExp = /[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g, rawCharsRegExp = /[<>&\"\']/g, entityRegExp = /&(#x|#)?([\w]+);/g, asciiMap = { 128 : "\u20AC", 130 : "\u201A", 131 : "\u0192", 132 : "\u201E", 133 : "\u2026", 134 : "\u2020", 135 : "\u2021", 136 : "\u02C6", 137 : "\u2030", 138 : "\u0160", 139 : "\u2039", 140 : "\u0152", 142 : "\u017D", 145 : "\u2018", 146 : "\u2019", 147 : "\u201C", 148 : "\u201D", 149 : "\u2022", 150 : "\u2013", 151 : "\u2014", 152 : "\u02DC", 153 : "\u2122", 154 : "\u0161", 155 : "\u203A", 156 : "\u0153", 158 : "\u017E", 159 : "\u0178" }; // Raw entities baseEntities = { '\"' : '"', // Needs to be escaped since the YUI compressor would otherwise break the code "'" : ''', '<' : '<', '>' : '>', '&' : '&' }; // Reverse lookup table for raw entities reverseEntities = { '<' : '<', '>' : '>', '&' : '&', '"' : '"', ''' : "'" }; // Decodes text by using the browser function nativeDecode(text) { var elm; elm = document.createElement("div"); elm.innerHTML = text; return elm.textContent || elm.innerText || text; }; // Build a two way lookup table for the entities function buildEntitiesLookup(items, radix) { var i, chr, entity, lookup = {}; if (items) { items = items.split(','); radix = radix || 10; // Build entities lookup table for (i = 0; i < items.length; i += 2) { chr = String.fromCharCode(parseInt(items[i], radix)); // Only add non base entities if (!baseEntities[chr]) { entity = '&' + items[i + 1] + ';'; lookup[chr] = entity; lookup[entity] = chr; } } return lookup; } }; // Unpack entities lookup where the numbers are in radix 32 to reduce the size namedEntities = buildEntitiesLookup( '50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,' + '5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,' + '5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,' + '5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,' + '68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,' + '6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,' + '6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,' + '75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,' + '7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,' + '7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,' + 'sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,' + 'st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,' + 't9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,' + 'tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,' + 'u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,' + '81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,' + '8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,' + '8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,' + '8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,' + '8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,' + 'nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,' + 'rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,' + 'Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,' + '80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,' + '811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro', 32); tinymce.html = tinymce.html || {}; tinymce.html.Entities = { encodeRaw : function(text, attr) { return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { return baseEntities[chr] || chr; }); }, encodeAllRaw : function(text) { return ('' + text).replace(rawCharsRegExp, function(chr) { return baseEntities[chr] || chr; }); }, encodeNumeric : function(text, attr) { return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { // Multi byte sequence convert it to a single entity if (chr.length > 1) return '&#' + (((chr.charCodeAt(0) - 0xD800) * 0x400) + (chr.charCodeAt(1) - 0xDC00) + 0x10000) + ';'; return baseEntities[chr] || '&#' + chr.charCodeAt(0) + ';'; }); }, encodeNamed : function(text, attr, entities) { entities = entities || namedEntities; return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { return baseEntities[chr] || entities[chr] || chr; }); }, getEncodeFunc : function(name, entities) { var Entities = tinymce.html.Entities; entities = buildEntitiesLookup(entities) || namedEntities; function encodeNamedAndNumeric(text, attr) { return text.replace(attr ? attrsCharsRegExp : textCharsRegExp, function(chr) { return baseEntities[chr] || entities[chr] || '&#' + chr.charCodeAt(0) + ';' || chr; }); }; function encodeCustomNamed(text, attr) { return Entities.encodeNamed(text, attr, entities); }; // Replace + with , to be compatible with previous TinyMCE versions name = tinymce.makeMap(name.replace(/\+/g, ',')); // Named and numeric encoder if (name.named && name.numeric) return encodeNamedAndNumeric; // Named encoder if (name.named) { // Custom names if (entities) return encodeCustomNamed; return Entities.encodeNamed; } // Numeric if (name.numeric) return Entities.encodeNumeric; // Raw encoder return Entities.encodeRaw; }, decode : function(text) { return text.replace(entityRegExp, function(all, numeric, value) { if (numeric) { value = parseInt(value, numeric.length === 2 ? 16 : 10); // Support upper UTF if (value > 0xFFFF) { value -= 0x10000; return String.fromCharCode(0xD800 + (value >> 10), 0xDC00 + (value & 0x3FF)); } else return asciiMap[value] || String.fromCharCode(value); } return reverseEntities[all] || namedEntities[all] || nativeDecode(all); }); } }; })(tinymce); tinymce.html.Styles = function(settings, schema) { var rgbRegExp = /rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi, urlOrStrRegExp = /(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi, styleRegExp = /\s*([^:]+):\s*([^;]+);?/g, trimRightRegExp = /\s+$/, urlColorRegExp = /rgb/, undef, i, encodingLookup = {}, encodingItems; settings = settings || {}; encodingItems = '\\" \\\' \\; \\: ; : \uFEFF'.split(' '); for (i = 0; i < encodingItems.length; i++) { encodingLookup[encodingItems[i]] = '\uFEFF' + i; encodingLookup['\uFEFF' + i] = encodingItems[i]; } function toHex(match, r, g, b) { function hex(val) { val = parseInt(val).toString(16); return val.length > 1 ? val : '0' + val; // 0 -> 00 }; return '#' + hex(r) + hex(g) + hex(b); }; return { toHex : function(color) { return color.replace(rgbRegExp, toHex); }, parse : function(css) { var styles = {}, matches, name, value, isEncoded, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope || this; function compress(prefix, suffix) { var top, right, bottom, left; // Get values and check it it needs compressing top = styles[prefix + '-top' + suffix]; if (!top) return; right = styles[prefix + '-right' + suffix]; if (top != right) return; bottom = styles[prefix + '-bottom' + suffix]; if (right != bottom) return; left = styles[prefix + '-left' + suffix]; if (bottom != left) return; // Compress styles[prefix + suffix] = left; delete styles[prefix + '-top' + suffix]; delete styles[prefix + '-right' + suffix]; delete styles[prefix + '-bottom' + suffix]; delete styles[prefix + '-left' + suffix]; }; function canCompress(key) { var value = styles[key], i; if (!value || value.indexOf(' ') < 0) return; value = value.split(' '); i = value.length; while (i--) { if (value[i] !== value[0]) return false; } styles[key] = value[0]; return true; }; function compress2(target, a, b, c) { if (!canCompress(a)) return; if (!canCompress(b)) return; if (!canCompress(c)) return; // Compress styles[target] = styles[a] + ' ' + styles[b] + ' ' + styles[c]; delete styles[a]; delete styles[b]; delete styles[c]; }; // Encodes the specified string by replacing all \" \' ; : with _ function encode(str) { isEncoded = true; return encodingLookup[str]; }; // Decodes the specified string by replacing all _ with it's original value \" \' etc // It will also decode the \" \' if keep_slashes is set to fale or omitted function decode(str, keep_slashes) { if (isEncoded) { str = str.replace(/\uFEFF[0-9]/g, function(str) { return encodingLookup[str]; }); } if (!keep_slashes) str = str.replace(/\\([\'\";:])/g, "$1"); return str; }; function processUrl(match, url, url2, url3, str, str2) { str = str || str2; if (str) { str = decode(str); // Force strings into single quote format return "'" + str.replace(/\'/g, "\\'") + "'"; } url = decode(url || url2 || url3); // Convert the URL to relative/absolute depending on config if (urlConverter) url = urlConverter.call(urlConverterScope, url, 'style'); // Output new URL format return "url('" + url.replace(/\'/g, "\\'") + "')"; }; if (css) { // Encode \" \' % and ; and : inside strings so they don't interfere with the style parsing css = css.replace(/\\[\"\';:\uFEFF]/g, encode).replace(/\"[^\"]+\"|\'[^\']+\'/g, function(str) { return str.replace(/[;:]/g, encode); }); // Parse styles while (matches = styleRegExp.exec(css)) { name = matches[1].replace(trimRightRegExp, '').toLowerCase(); value = matches[2].replace(trimRightRegExp, ''); if (name && value.length > 0) { // Opera will produce 700 instead of bold in their style values if (name === 'font-weight' && value === '700') value = 'bold'; else if (name === 'color' || name === 'background-color') // Lowercase colors like RED value = value.toLowerCase(); // Convert RGB colors to HEX value = value.replace(rgbRegExp, toHex); // Convert URLs and force them into url('value') format value = value.replace(urlOrStrRegExp, processUrl); styles[name] = isEncoded ? decode(value, true) : value; } styleRegExp.lastIndex = matches.index + matches[0].length; } // Compress the styles to reduce it's size for example IE will expand styles compress("border", ""); compress("border", "-width"); compress("border", "-color"); compress("border", "-style"); compress("padding", ""); compress("margin", ""); compress2('border', 'border-width', 'border-style', 'border-color'); // Remove pointless border, IE produces these if (styles.border === 'medium none') delete styles.border; } return styles; }, serialize : function(styles, element_name) { var css = '', name, value; function serializeStyles(name) { var styleList, i, l, value; styleList = schema.styles[name]; if (styleList) { for (i = 0, l = styleList.length; i < l; i++) { name = styleList[i]; value = styles[name]; if (value !== undef && value.length > 0) css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; } } }; // Serialize styles according to schema if (element_name && schema && schema.styles) { // Serialize global styles and element specific styles serializeStyles('*'); serializeStyles(element_name); } else { // Output the styles in the order they are inside the object for (name in styles) { value = styles[name]; if (value !== undef && value.length > 0) css += (css.length > 0 ? ' ' : '') + name + ': ' + value + ';'; } } return css; } }; }; (function(tinymce) { var mapCache = {}, makeMap = tinymce.makeMap, each = tinymce.each; function split(str, delim) { return str.split(delim || ','); }; function unpack(lookup, data) { var key, elements = {}; function replace(value) { return value.replace(/[A-Z]+/g, function(key) { return replace(lookup[key]); }); }; // Unpack lookup for (key in lookup) { if (lookup.hasOwnProperty(key)) lookup[key] = replace(lookup[key]); } // Unpack and parse data into object map replace(data).replace(/#/g, '#text').replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g, function(str, name, attributes, children) { attributes = split(attributes, '|'); elements[name] = { attributes : makeMap(attributes), attributesOrder : attributes, children : makeMap(children, '|', {'#comment' : {}}) } }); return elements; }; function getHTML5() { var html5 = mapCache.html5; if (!html5) { html5 = mapCache.html5 = unpack({ A : 'id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title', B : '#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|meta|' + 'meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video', C : '#|a|abbr|area|address|article|aside|audio|b|bdo|blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|dl|em|embed|fieldset|' + 'figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|nav|noscript|ol|object|output|' + 'p|pre|progress|q|ruby|samp|script|section|select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video' }, 'html[A|manifest][body|head]' + 'head[A][base|command|link|meta|noscript|script|style|title]' + 'title[A][#]' + 'base[A|href|target][]' + 'link[A|href|rel|media|type|sizes][]' + 'meta[A|http-equiv|name|content|charset][]' + 'style[A|type|media|scoped][#]' + 'script[A|charset|type|src|defer|async][#]' + 'noscript[A][C]' + 'body[A][C]' + 'section[A][C]' + 'nav[A][C]' + 'article[A][C]' + 'aside[A][C]' + 'h1[A][B]' + 'h2[A][B]' + 'h3[A][B]' + 'h4[A][B]' + 'h5[A][B]' + 'h6[A][B]' + 'hgroup[A][h1|h2|h3|h4|h5|h6]' + 'header[A][C]' + 'footer[A][C]' + 'address[A][C]' + 'p[A][B]' + 'br[A][]' + 'pre[A][B]' + 'dialog[A][dd|dt]' + 'blockquote[A|cite][C]' + 'ol[A|start|reversed][li]' + 'ul[A][li]' + 'li[A|value][C]' + 'dl[A][dd|dt]' + 'dt[A][B]' + 'dd[A][C]' + 'a[A|href|target|ping|rel|media|type][B]' + 'em[A][B]' + 'strong[A][B]' + 'small[A][B]' + 'cite[A][B]' + 'q[A|cite][B]' + 'dfn[A][B]' + 'abbr[A][B]' + 'code[A][B]' + 'var[A][B]' + 'samp[A][B]' + 'kbd[A][B]' + 'sub[A][B]' + 'sup[A][B]' + 'i[A][B]' + 'b[A][B]' + 'mark[A][B]' + 'progress[A|value|max][B]' + 'meter[A|value|min|max|low|high|optimum][B]' + 'time[A|datetime][B]' + 'ruby[A][B|rt|rp]' + 'rt[A][B]' + 'rp[A][B]' + 'bdo[A][B]' + 'span[A][B]' + 'ins[A|cite|datetime][B]' + 'del[A|cite|datetime][B]' + 'figure[A][C|legend|figcaption]' + 'figcaption[A][C]' + 'img[A|alt|src|height|width|usemap|ismap][]' + 'iframe[A|name|src|height|width|sandbox|seamless][]' + 'embed[A|src|height|width|type][]' + 'object[A|data|type|height|width|usemap|name|form|classid][param]' + 'param[A|name|value][]' + 'details[A|open][C|legend]' + 'command[A|type|label|icon|disabled|checked|radiogroup][]' + 'menu[A|type|label][C|li]' + 'legend[A][C|B]' + 'div[A][C]' + 'source[A|src|type|media][]' + 'audio[A|src|autobuffer|autoplay|loop|controls][source]' + 'video[A|src|autobuffer|autoplay|loop|controls|width|height|poster][source]' + 'hr[A][]' + 'form[A|accept-charset|action|autocomplete|enctype|method|name|novalidate|target][C]' + 'fieldset[A|disabled|form|name][C|legend]' + 'label[A|form|for][B]' + 'input[A|type|accept|alt|autocomplete|checked|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|height|list|max|maxlength|min|' + 'multiple|pattern|placeholder|readonly|required|size|src|step|width|files|value|name][]' + 'button[A|autofocus|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|name|value|type][B]' + 'select[A|autofocus|disabled|form|multiple|name|size][option|optgroup]' + 'datalist[A][B|option]' + 'optgroup[A|disabled|label][option]' + 'option[A|disabled|selected|label|value][]' + 'textarea[A|autofocus|disabled|form|maxlength|name|placeholder|readonly|required|rows|cols|wrap][]' + 'keygen[A|autofocus|challenge|disabled|form|keytype|name][]' + 'output[A|for|form|name][B]' + 'canvas[A|width|height][]' + 'map[A|name][B|C]' + 'area[A|shape|coords|href|alt|target|media|rel|ping|type][]' + 'mathml[A][]' + 'svg[A][]' + 'table[A|border][caption|colgroup|thead|tfoot|tbody|tr]' + 'caption[A][C]' + 'colgroup[A|span][col]' + 'col[A|span][]' + 'thead[A][tr]' + 'tfoot[A][tr]' + 'tbody[A][tr]' + 'tr[A][th|td]' + 'th[A|headers|rowspan|colspan|scope][B]' + 'td[A|headers|rowspan|colspan][C]' ); } return html5; }; function getHTML4() { var html4 = mapCache.html4; if (!html4) { // This is the XHTML 1.0 transitional elements with it's attributes and children packed to reduce it's size html4 = mapCache.html4 = unpack({ Z : 'H|K|N|O|P', Y : 'X|form|R|Q', ZG : 'E|span|width|align|char|charoff|valign', X : 'p|T|div|U|W|isindex|fieldset|table', ZF : 'E|align|char|charoff|valign', W : 'pre|hr|blockquote|address|center|noframes', ZE : 'abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height', ZD : '[E][S]', U : 'ul|ol|dl|menu|dir', ZC : 'p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q', T : 'h1|h2|h3|h4|h5|h6', ZB : 'X|S|Q', S : 'R|P', ZA : 'a|G|J|M|O|P', R : 'a|H|K|N|O', Q : 'noscript|P', P : 'ins|del|script', O : 'input|select|textarea|label|button', N : 'M|L', M : 'em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym', L : 'sub|sup', K : 'J|I', J : 'tt|i|b|u|s|strike', I : 'big|small|font|basefont', H : 'G|F', G : 'br|span|bdo', F : 'object|applet|img|map|iframe', E : 'A|B|C', D : 'accesskey|tabindex|onfocus|onblur', C : 'onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup', B : 'lang|xml:lang|dir', A : 'id|class|style|title' }, 'script[id|charset|type|language|src|defer|xml:space][]' + 'style[B|id|type|media|title|xml:space][]' + 'object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]' + 'param[id|name|value|valuetype|type][]' + 'p[E|align][#|S]' + 'a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]' + 'br[A|clear][]' + 'span[E][#|S]' + 'bdo[A|C|B][#|S]' + 'applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]' + 'h1[E|align][#|S]' + 'img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]' + 'map[B|C|A|name][X|form|Q|area]' + 'h2[E|align][#|S]' + 'iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]' + 'h3[E|align][#|S]' + 'tt[E][#|S]' + 'i[E][#|S]' + 'b[E][#|S]' + 'u[E][#|S]' + 's[E][#|S]' + 'strike[E][#|S]' + 'big[E][#|S]' + 'small[E][#|S]' + 'font[A|B|size|color|face][#|S]' + 'basefont[id|size|color|face][]' + 'em[E][#|S]' + 'strong[E][#|S]' + 'dfn[E][#|S]' + 'code[E][#|S]' + 'q[E|cite][#|S]' + 'samp[E][#|S]' + 'kbd[E][#|S]' + 'var[E][#|S]' + 'cite[E][#|S]' + 'abbr[E][#|S]' + 'acronym[E][#|S]' + 'sub[E][#|S]' + 'sup[E][#|S]' + 'input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]' + 'select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]' + 'optgroup[E|disabled|label][option]' + 'option[E|selected|disabled|label|value][]' + 'textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]' + 'label[E|for|accesskey|onfocus|onblur][#|S]' + 'button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]' + 'h4[E|align][#|S]' + 'ins[E|cite|datetime][#|Y]' + 'h5[E|align][#|S]' + 'del[E|cite|datetime][#|Y]' + 'h6[E|align][#|S]' + 'div[E|align][#|Y]' + 'ul[E|type|compact][li]' + 'li[E|type|value][#|Y]' + 'ol[E|type|compact|start][li]' + 'dl[E|compact][dt|dd]' + 'dt[E][#|S]' + 'dd[E][#|Y]' + 'menu[E|compact][li]' + 'dir[E|compact][li]' + 'pre[E|width|xml:space][#|ZA]' + 'hr[E|align|noshade|size|width][]' + 'blockquote[E|cite][#|Y]' + 'address[E][#|S|p]' + 'center[E][#|Y]' + 'noframes[E][#|Y]' + 'isindex[A|B|prompt][]' + 'fieldset[E][#|legend|Y]' + 'legend[E|accesskey|align][#|S]' + 'table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]' + 'caption[E|align][#|S]' + 'col[ZG][]' + 'colgroup[ZG][col]' + 'thead[ZF][tr]' + 'tr[ZF|bgcolor][th|td]' + 'th[E|ZE][#|Y]' + 'form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]' + 'noscript[E][#|Y]' + 'td[E|ZE][#|Y]' + 'tfoot[ZF][tr]' + 'tbody[ZF][tr]' + 'area[E|D|shape|coords|href|nohref|alt|target][]' + 'base[id|href|target][]' + 'body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]' ); } return html4; }; tinymce.html.Schema = function(settings) { var self = this, elements = {}, children = {}, patternElements = [], validStyles, schemaItems; var whiteSpaceElementsMap, selfClosingElementsMap, shortEndedElementsMap, boolAttrMap, blockElementsMap, nonEmptyElementsMap, customElementsMap = {}; // Creates an lookup table map object for the specified option or the default value function createLookupTable(option, default_value, extend) { var value = settings[option]; if (!value) { // Get cached default map or make it if needed value = mapCache[option]; if (!value) { value = makeMap(default_value, ' ', makeMap(default_value.toUpperCase(), ' ')); value = tinymce.extend(value, extend); mapCache[option] = value; } } else { // Create custom map value = makeMap(value, ',', makeMap(value.toUpperCase(), ' ')); } return value; }; settings = settings || {}; schemaItems = settings.schema == "html5" ? getHTML5() : getHTML4(); // Allow all elements and attributes if verify_html is set to false if (settings.verify_html === false) settings.valid_elements = '*[*]'; // Build styles list if (settings.valid_styles) { validStyles = {}; // Convert styles into a rule list each(settings.valid_styles, function(value, key) { validStyles[key] = tinymce.explode(value); }); } // Setup map objects whiteSpaceElementsMap = createLookupTable('whitespace_elements', 'pre script style textarea'); selfClosingElementsMap = createLookupTable('self_closing_elements', 'colgroup dd dt li option p td tfoot th thead tr'); shortEndedElementsMap = createLookupTable('short_ended_elements', 'area base basefont br col frame hr img input isindex link meta param embed source'); boolAttrMap = createLookupTable('boolean_attributes', 'checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls'); nonEmptyElementsMap = createLookupTable('non_empty_elements', 'td th iframe video audio object', shortEndedElementsMap); blockElementsMap = createLookupTable('block_elements', 'h1 h2 h3 h4 h5 h6 hr p div address pre form table tbody thead tfoot ' + 'th tr td li ol ul caption blockquote center dl dt dd dir fieldset ' + 'noscript menu isindex samp header footer article section hgroup aside nav figure option datalist select optgroup'); // Converts a wildcard expression string to a regexp for example *a will become /.*a/. function patternToRegExp(str) { return new RegExp('^' + str.replace(/([?+*])/g, '.$1') + '$'); }; // Parses the specified valid_elements string and adds to the current rules // This function is a bit hard to read since it's heavily optimized for speed function addValidElements(valid_elements) { var ei, el, ai, al, yl, matches, element, attr, attrData, elementName, attrName, attrType, attributes, attributesOrder, prefix, outputName, globalAttributes, globalAttributesOrder, transElement, key, childKey, value, elementRuleRegExp = /^([#+\-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/, attrRuleRegExp = /^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/, hasPatternsRegExp = /[*?+]/; if (valid_elements) { // Split valid elements into an array with rules valid_elements = split(valid_elements); if (elements['@']) { globalAttributes = elements['@'].attributes; globalAttributesOrder = elements['@'].attributesOrder; } // Loop all rules for (ei = 0, el = valid_elements.length; ei < el; ei++) { // Parse element rule matches = elementRuleRegExp.exec(valid_elements[ei]); if (matches) { // Setup local names for matches prefix = matches[1]; elementName = matches[2]; outputName = matches[3]; attrData = matches[4]; // Create new attributes and attributesOrder attributes = {}; attributesOrder = []; // Create the new element element = { attributes : attributes, attributesOrder : attributesOrder }; // Padd empty elements prefix if (prefix === '#') element.paddEmpty = true; // Remove empty elements prefix if (prefix === '-') element.removeEmpty = true; // Copy attributes from global rule into current rule if (globalAttributes) { for (key in globalAttributes) attributes[key] = globalAttributes[key]; attributesOrder.push.apply(attributesOrder, globalAttributesOrder); } // Attributes defined if (attrData) { attrData = split(attrData, '|'); for (ai = 0, al = attrData.length; ai < al; ai++) { matches = attrRuleRegExp.exec(attrData[ai]); if (matches) { attr = {}; attrType = matches[1]; attrName = matches[2].replace(/::/g, ':'); prefix = matches[3]; value = matches[4]; // Required if (attrType === '!') { element.attributesRequired = element.attributesRequired || []; element.attributesRequired.push(attrName); attr.required = true; } // Denied from global if (attrType === '-') { delete attributes[attrName]; attributesOrder.splice(tinymce.inArray(attributesOrder, attrName), 1); continue; } // Default value if (prefix) { // Default value if (prefix === '=') { element.attributesDefault = element.attributesDefault || []; element.attributesDefault.push({name: attrName, value: value}); attr.defaultValue = value; } // Forced value if (prefix === ':') { element.attributesForced = element.attributesForced || []; element.attributesForced.push({name: attrName, value: value}); attr.forcedValue = value; } // Required values if (prefix === '<') attr.validValues = makeMap(value, '?'); } // Check for attribute patterns if (hasPatternsRegExp.test(attrName)) { element.attributePatterns = element.attributePatterns || []; attr.pattern = patternToRegExp(attrName); element.attributePatterns.push(attr); } else { // Add attribute to order list if it doesn't already exist if (!attributes[attrName]) attributesOrder.push(attrName); attributes[attrName] = attr; } } } } // Global rule, store away these for later usage if (!globalAttributes && elementName == '@') { globalAttributes = attributes; globalAttributesOrder = attributesOrder; } // Handle substitute elements such as b/strong if (outputName) { element.outputName = elementName; elements[outputName] = element; } // Add pattern or exact element if (hasPatternsRegExp.test(elementName)) { element.pattern = patternToRegExp(elementName); patternElements.push(element); } else elements[elementName] = element; } } } }; function setValidElements(valid_elements) { elements = {}; patternElements = []; addValidElements(valid_elements); each(schemaItems, function(element, name) { children[name] = element.children; }); }; // Adds custom non HTML elements to the schema function addCustomElements(custom_elements) { var customElementRegExp = /^(~)?(.+)$/; if (custom_elements) { each(split(custom_elements), function(rule) { var matches = customElementRegExp.exec(rule), inline = matches[1] === '~', cloneName = inline ? 'span' : 'div', name = matches[2]; children[name] = children[cloneName]; customElementsMap[name] = cloneName; // If it's not marked as inline then add it to valid block elements if (!inline) blockElementsMap[name] = {}; // Add custom elements at span/div positions each(children, function(element, child) { if (element[cloneName]) element[name] = element[cloneName]; }); }); } }; // Adds valid children to the schema object function addValidChildren(valid_children) { var childRuleRegExp = /^([+\-]?)(\w+)\[([^\]]+)\]$/; if (valid_children) { each(split(valid_children), function(rule) { var matches = childRuleRegExp.exec(rule), parent, prefix; if (matches) { prefix = matches[1]; // Add/remove items from default if (prefix) parent = children[matches[2]]; else parent = children[matches[2]] = {'#comment' : {}}; parent = children[matches[2]]; each(split(matches[3], '|'), function(child) { if (prefix === '-') delete parent[child]; else parent[child] = {}; }); } }); } }; function getElementRule(name) { var element = elements[name], i; // Exact match found if (element) return element; // No exact match then try the patterns i = patternElements.length; while (i--) { element = patternElements[i]; if (element.pattern.test(name)) return element; } }; if (!settings.valid_elements) { // No valid elements defined then clone the elements from the schema spec each(schemaItems, function(element, name) { elements[name] = { attributes : element.attributes, attributesOrder : element.attributesOrder }; children[name] = element.children; }); // Switch these on HTML4 if (settings.schema != "html5") { each(split('strong/b,em/i'), function(item) { item = split(item, '/'); elements[item[1]].outputName = item[0]; }); } // Add default alt attribute for images elements.img.attributesDefault = [{name: 'alt', value: ''}]; // Remove these if they are empty by default each(split('ol,ul,sub,sup,blockquote,span,font,a,table,tbody,tr,strong,em,b,i'), function(name) { if (elements[name]) { elements[name].removeEmpty = true; } }); // Padd these by default each(split('p,h1,h2,h3,h4,h5,h6,th,td,pre,div,address,caption'), function(name) { elements[name].paddEmpty = true; }); } else setValidElements(settings.valid_elements); addCustomElements(settings.custom_elements); addValidChildren(settings.valid_children); addValidElements(settings.extended_valid_elements); // Todo: Remove this when we fix list handling to be valid addValidChildren('+ol[ul|ol],+ul[ul|ol]'); // Delete invalid elements if (settings.invalid_elements) { tinymce.each(tinymce.explode(settings.invalid_elements), function(item) { if (elements[item]) delete elements[item]; }); } // If the user didn't allow span only allow internal spans if (!getElementRule('span')) addValidElements('span[!data-mce-type|*]'); self.children = children; self.styles = validStyles; self.getBoolAttrs = function() { return boolAttrMap; }; self.getBlockElements = function() { return blockElementsMap; }; self.getShortEndedElements = function() { return shortEndedElementsMap; }; self.getSelfClosingElements = function() { return selfClosingElementsMap; }; self.getNonEmptyElements = function() { return nonEmptyElementsMap; }; self.getWhiteSpaceElements = function() { return whiteSpaceElementsMap; }; self.isValidChild = function(name, child) { var parent = children[name]; return !!(parent && parent[child]); }; self.isValid = function(name, attr) { var attrPatterns, i, rule = getElementRule(name); // Check if it's a valid element if (rule) { if (attr) { // Check if attribute name exists if (rule.attributes[attr]) { return true; } // Check if attribute matches a regexp pattern attrPatterns = rule.attributePatterns; if (attrPatterns) { i = attrPatterns.length; while (i--) { if (attrPatterns[i].pattern.test(name)) { return true; } } } } else { return true; } } // No match return false; }; self.getElementRule = getElementRule; self.getCustomElements = function() { return customElementsMap; }; self.addValidElements = addValidElements; self.setValidElements = setValidElements; self.addCustomElements = addCustomElements; self.addValidChildren = addValidChildren; }; })(tinymce); (function(tinymce) { tinymce.html.SaxParser = function(settings, schema) { var self = this, noop = function() {}; settings = settings || {}; self.schema = schema = schema || new tinymce.html.Schema(); if (settings.fix_self_closing !== false) settings.fix_self_closing = true; // Add handler functions from settings and setup default handlers tinymce.each('comment cdata text start end pi doctype'.split(' '), function(name) { if (name) self[name] = settings[name] || noop; }); self.parse = function(html) { var self = this, matches, index = 0, value, endRegExp, stack = [], attrList, i, text, name, isInternalElement, removeInternalElements, shortEndedElements, fillAttrsMap, isShortEnded, validate, elementRule, isValidElement, attr, attribsValue, invalidPrefixRegExp, validAttributesMap, validAttributePatterns, attributesRequired, attributesDefault, attributesForced, selfClosing, tokenRegExp, attrRegExp, specialElements, attrValue, idCount = 0, decode = tinymce.html.Entities.decode, fixSelfClosing, isIE; function processEndTag(name) { var pos, i; // Find position of parent of the same type pos = stack.length; while (pos--) { if (stack[pos].name === name) break; } // Found parent if (pos >= 0) { // Close all the open elements for (i = stack.length - 1; i >= pos; i--) { name = stack[i]; if (name.valid) self.end(name.name); } // Remove the open elements from the stack stack.length = pos; } }; function parseAttribute(match, name, value, val2, val3) { var attrRule, i; name = name.toLowerCase(); value = name in fillAttrsMap ? name : decode(value || val2 || val3 || ''); // Handle boolean attribute than value attribute // Validate name and value if (validate && !isInternalElement && name.indexOf('data-') !== 0) { attrRule = validAttributesMap[name]; // Find rule by pattern matching if (!attrRule && validAttributePatterns) { i = validAttributePatterns.length; while (i--) { attrRule = validAttributePatterns[i]; if (attrRule.pattern.test(name)) break; } // No rule matched if (i === -1) attrRule = null; } // No attribute rule found if (!attrRule) return; // Validate value if (attrRule.validValues && !(value in attrRule.validValues)) return; } // Add attribute to list and map attrList.map[name] = value; attrList.push({ name: name, value: value }); }; // Precompile RegExps and map objects tokenRegExp = new RegExp('<(?:' + '(?:!--([\\w\\W]*?)-->)|' + // Comment '(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|' + // CDATA '(?:!DOCTYPE([\\w\\W]*?)>)|' + // DOCTYPE '(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|' + // PI '(?:\\/([^>]+)>)|' + // End element '(?:([A-Za-z0-9\\-\\:]+)((?:\\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\\/|\\s+)>)' + // Start element ')', 'g'); attrRegExp = /([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g; specialElements = { 'script' : /<\/script[^>]*>/gi, 'style' : /<\/style[^>]*>/gi, 'noscript' : /<\/noscript[^>]*>/gi }; // Setup lookup tables for empty elements and boolean attributes shortEndedElements = schema.getShortEndedElements(); selfClosing = settings.self_closing_elements || schema.getSelfClosingElements(); fillAttrsMap = schema.getBoolAttrs(); validate = settings.validate; removeInternalElements = settings.remove_internals; fixSelfClosing = settings.fix_self_closing; isIE = tinymce.isIE; invalidPrefixRegExp = /^:/; while (matches = tokenRegExp.exec(html)) { // Text if (index < matches.index) self.text(decode(html.substr(index, matches.index - index))); if (value = matches[6]) { // End element value = value.toLowerCase(); // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements if (isIE && invalidPrefixRegExp.test(value)) value = value.substr(1); processEndTag(value); } else if (value = matches[7]) { // Start element value = value.toLowerCase(); // IE will add a ":" in front of elements it doesn't understand like custom elements or HTML5 elements if (isIE && invalidPrefixRegExp.test(value)) value = value.substr(1); isShortEnded = value in shortEndedElements; // Is self closing tag for example an
      • after an open
      • if (fixSelfClosing && selfClosing[value] && stack.length > 0 && stack[stack.length - 1].name === value) processEndTag(value); // Validate element if (!validate || (elementRule = schema.getElementRule(value))) { isValidElement = true; // Grab attributes map and patters when validation is enabled if (validate) { validAttributesMap = elementRule.attributes; validAttributePatterns = elementRule.attributePatterns; } // Parse attributes if (attribsValue = matches[8]) { isInternalElement = attribsValue.indexOf('data-mce-type') !== -1; // Check if the element is an internal element // If the element has internal attributes then remove it if we are told to do so if (isInternalElement && removeInternalElements) isValidElement = false; attrList = []; attrList.map = {}; attribsValue.replace(attrRegExp, parseAttribute); } else { attrList = []; attrList.map = {}; } // Process attributes if validation is enabled if (validate && !isInternalElement) { attributesRequired = elementRule.attributesRequired; attributesDefault = elementRule.attributesDefault; attributesForced = elementRule.attributesForced; // Handle forced attributes if (attributesForced) { i = attributesForced.length; while (i--) { attr = attributesForced[i]; name = attr.name; attrValue = attr.value; if (attrValue === '{$uid}') attrValue = 'mce_' + idCount++; attrList.map[name] = attrValue; attrList.push({name: name, value: attrValue}); } } // Handle default attributes if (attributesDefault) { i = attributesDefault.length; while (i--) { attr = attributesDefault[i]; name = attr.name; if (!(name in attrList.map)) { attrValue = attr.value; if (attrValue === '{$uid}') attrValue = 'mce_' + idCount++; attrList.map[name] = attrValue; attrList.push({name: name, value: attrValue}); } } } // Handle required attributes if (attributesRequired) { i = attributesRequired.length; while (i--) { if (attributesRequired[i] in attrList.map) break; } // None of the required attributes where found if (i === -1) isValidElement = false; } // Invalidate element if it's marked as bogus if (attrList.map['data-mce-bogus']) isValidElement = false; } if (isValidElement) self.start(value, attrList, isShortEnded); } else isValidElement = false; // Treat script, noscript and style a bit different since they may include code that looks like elements if (endRegExp = specialElements[value]) { endRegExp.lastIndex = index = matches.index + matches[0].length; if (matches = endRegExp.exec(html)) { if (isValidElement) text = html.substr(index, matches.index - index); index = matches.index + matches[0].length; } else { text = html.substr(index); index = html.length; } if (isValidElement && text.length > 0) self.text(text, true); if (isValidElement) self.end(value); tokenRegExp.lastIndex = index; continue; } // Push value on to stack if (!isShortEnded) { if (!attribsValue || attribsValue.indexOf('/') != attribsValue.length - 1) stack.push({name: value, valid: isValidElement}); else if (isValidElement) self.end(value); } } else if (value = matches[1]) { // Comment self.comment(value); } else if (value = matches[2]) { // CDATA self.cdata(value); } else if (value = matches[3]) { // DOCTYPE self.doctype(value); } else if (value = matches[4]) { // PI self.pi(value, matches[5]); } index = matches.index + matches[0].length; } // Text if (index < html.length) self.text(decode(html.substr(index))); // Close any open elements for (i = stack.length - 1; i >= 0; i--) { value = stack[i]; if (value.valid) self.end(value.name); } }; } })(tinymce); (function(tinymce) { var whiteSpaceRegExp = /^[ \t\r\n]*$/, typeLookup = { '#text' : 3, '#comment' : 8, '#cdata' : 4, '#pi' : 7, '#doctype' : 10, '#document-fragment' : 11 }; // Walks the tree left/right function walk(node, root_node, prev) { var sibling, parent, startName = prev ? 'lastChild' : 'firstChild', siblingName = prev ? 'prev' : 'next'; // Walk into nodes if it has a start if (node[startName]) return node[startName]; // Return the sibling if it has one if (node !== root_node) { sibling = node[siblingName]; if (sibling) return sibling; // Walk up the parents to look for siblings for (parent = node.parent; parent && parent !== root_node; parent = parent.parent) { sibling = parent[siblingName]; if (sibling) return sibling; } } }; function Node(name, type) { this.name = name; this.type = type; if (type === 1) { this.attributes = []; this.attributes.map = {}; } } tinymce.extend(Node.prototype, { replace : function(node) { var self = this; if (node.parent) node.remove(); self.insert(node, self); self.remove(); return self; }, attr : function(name, value) { var self = this, attrs, i, undef; if (typeof name !== "string") { for (i in name) self.attr(i, name[i]); return self; } if (attrs = self.attributes) { if (value !== undef) { // Remove attribute if (value === null) { if (name in attrs.map) { delete attrs.map[name]; i = attrs.length; while (i--) { if (attrs[i].name === name) { attrs = attrs.splice(i, 1); return self; } } } return self; } // Set attribute if (name in attrs.map) { // Set attribute i = attrs.length; while (i--) { if (attrs[i].name === name) { attrs[i].value = value; break; } } } else attrs.push({name: name, value: value}); attrs.map[name] = value; return self; } else { return attrs.map[name]; } } }, clone : function() { var self = this, clone = new Node(self.name, self.type), i, l, selfAttrs, selfAttr, cloneAttrs; // Clone element attributes if (selfAttrs = self.attributes) { cloneAttrs = []; cloneAttrs.map = {}; for (i = 0, l = selfAttrs.length; i < l; i++) { selfAttr = selfAttrs[i]; // Clone everything except id if (selfAttr.name !== 'id') { cloneAttrs[cloneAttrs.length] = {name: selfAttr.name, value: selfAttr.value}; cloneAttrs.map[selfAttr.name] = selfAttr.value; } } clone.attributes = cloneAttrs; } clone.value = self.value; clone.shortEnded = self.shortEnded; return clone; }, wrap : function(wrapper) { var self = this; self.parent.insert(wrapper, self); wrapper.append(self); return self; }, unwrap : function() { var self = this, node, next; for (node = self.firstChild; node; ) { next = node.next; self.insert(node, self, true); node = next; } self.remove(); }, remove : function() { var self = this, parent = self.parent, next = self.next, prev = self.prev; if (parent) { if (parent.firstChild === self) { parent.firstChild = next; if (next) next.prev = null; } else { prev.next = next; } if (parent.lastChild === self) { parent.lastChild = prev; if (prev) prev.next = null; } else { next.prev = prev; } self.parent = self.next = self.prev = null; } return self; }, append : function(node) { var self = this, last; if (node.parent) node.remove(); last = self.lastChild; if (last) { last.next = node; node.prev = last; self.lastChild = node; } else self.lastChild = self.firstChild = node; node.parent = self; return node; }, insert : function(node, ref_node, before) { var parent; if (node.parent) node.remove(); parent = ref_node.parent || this; if (before) { if (ref_node === parent.firstChild) parent.firstChild = node; else ref_node.prev.next = node; node.prev = ref_node.prev; node.next = ref_node; ref_node.prev = node; } else { if (ref_node === parent.lastChild) parent.lastChild = node; else ref_node.next.prev = node; node.next = ref_node.next; node.prev = ref_node; ref_node.next = node; } node.parent = parent; return node; }, getAll : function(name) { var self = this, node, collection = []; for (node = self.firstChild; node; node = walk(node, self)) { if (node.name === name) collection.push(node); } return collection; }, empty : function() { var self = this, nodes, i, node; // Remove all children if (self.firstChild) { nodes = []; // Collect the children for (node = self.firstChild; node; node = walk(node, self)) nodes.push(node); // Remove the children i = nodes.length; while (i--) { node = nodes[i]; node.parent = node.firstChild = node.lastChild = node.next = node.prev = null; } } self.firstChild = self.lastChild = null; return self; }, isEmpty : function(elements) { var self = this, node = self.firstChild, i, name; if (node) { do { if (node.type === 1) { // Ignore bogus elements if (node.attributes.map['data-mce-bogus']) continue; // Keep empty elements like if (elements[node.name]) return false; // Keep elements with data attributes or name attribute like i = node.attributes.length; while (i--) { name = node.attributes[i].name; if (name === "name" || name.indexOf('data-') === 0) return false; } } // Keep comments if (node.type === 8) return false; // Keep non whitespace text nodes if ((node.type === 3 && !whiteSpaceRegExp.test(node.value))) return false; } while (node = walk(node, self)); } return true; }, walk : function(prev) { return walk(this, null, prev); } }); tinymce.extend(Node, { create : function(name, attrs) { var node, attrName; // Create node node = new Node(name, typeLookup[name] || 1); // Add attributes if needed if (attrs) { for (attrName in attrs) node.attr(attrName, attrs[attrName]); } return node; } }); tinymce.html.Node = Node; })(tinymce); (function(tinymce) { var Node = tinymce.html.Node; tinymce.html.DomParser = function(settings, schema) { var self = this, nodeFilters = {}, attributeFilters = [], matchedNodes = {}, matchedAttributes = {}; settings = settings || {}; settings.validate = "validate" in settings ? settings.validate : true; settings.root_name = settings.root_name || 'body'; self.schema = schema = schema || new tinymce.html.Schema(); function fixInvalidChildren(nodes) { var ni, node, parent, parents, newParent, currentNode, tempNode, childNode, i, childClone, nonEmptyElements, nonSplitableElements, sibling, nextNode; nonSplitableElements = tinymce.makeMap('tr,td,th,tbody,thead,tfoot,table'); nonEmptyElements = schema.getNonEmptyElements(); for (ni = 0; ni < nodes.length; ni++) { node = nodes[ni]; // Already removed if (!node.parent) continue; // Get list of all parent nodes until we find a valid parent to stick the child into parents = [node]; for (parent = node.parent; parent && !schema.isValidChild(parent.name, node.name) && !nonSplitableElements[parent.name]; parent = parent.parent) parents.push(parent); // Found a suitable parent if (parent && parents.length > 1) { // Reverse the array since it makes looping easier parents.reverse(); // Clone the related parent and insert that after the moved node newParent = currentNode = self.filterNode(parents[0].clone()); // Start cloning and moving children on the left side of the target node for (i = 0; i < parents.length - 1; i++) { if (schema.isValidChild(currentNode.name, parents[i].name)) { tempNode = self.filterNode(parents[i].clone()); currentNode.append(tempNode); } else tempNode = currentNode; for (childNode = parents[i].firstChild; childNode && childNode != parents[i + 1]; ) { nextNode = childNode.next; tempNode.append(childNode); childNode = nextNode; } currentNode = tempNode; } if (!newParent.isEmpty(nonEmptyElements)) { parent.insert(newParent, parents[0], true); parent.insert(node, newParent); } else { parent.insert(node, parents[0], true); } // Check if the element is empty by looking through it's contents and special treatment for


        parent = parents[0]; if (parent.isEmpty(nonEmptyElements) || parent.firstChild === parent.lastChild && parent.firstChild.name === 'br') { parent.empty().remove(); } } else if (node.parent) { // If it's an LI try to find a UL/OL for it or wrap it if (node.name === 'li') { sibling = node.prev; if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { sibling.append(node); continue; } sibling = node.next; if (sibling && (sibling.name === 'ul' || sibling.name === 'ul')) { sibling.insert(node, sibling.firstChild, true); continue; } node.wrap(self.filterNode(new Node('ul', 1))); continue; } // Try wrapping the element in a DIV if (schema.isValidChild(node.parent.name, 'div') && schema.isValidChild('div', node.name)) { node.wrap(self.filterNode(new Node('div', 1))); } else { // We failed wrapping it, then remove or unwrap it if (node.name === 'style' || node.name === 'script') node.empty().remove(); else node.unwrap(); } } } }; self.filterNode = function(node) { var i, name, list; // Run element filters if (name in nodeFilters) { list = matchedNodes[name]; if (list) list.push(node); else matchedNodes[name] = [node]; } // Run attribute filters i = attributeFilters.length; while (i--) { name = attributeFilters[i].name; if (name in node.attributes.map) { list = matchedAttributes[name]; if (list) list.push(node); else matchedAttributes[name] = [node]; } } return node; }; self.addNodeFilter = function(name, callback) { tinymce.each(tinymce.explode(name), function(name) { var list = nodeFilters[name]; if (!list) nodeFilters[name] = list = []; list.push(callback); }); }; self.addAttributeFilter = function(name, callback) { tinymce.each(tinymce.explode(name), function(name) { var i; for (i = 0; i < attributeFilters.length; i++) { if (attributeFilters[i].name === name) { attributeFilters[i].callbacks.push(callback); return; } } attributeFilters.push({name: name, callbacks: [callback]}); }); }; self.parse = function(html, args) { var parser, rootNode, node, nodes, i, l, fi, fl, list, name, validate, blockElements, startWhiteSpaceRegExp, invalidChildren = [], isInWhiteSpacePreservedElement, endWhiteSpaceRegExp, allWhiteSpaceRegExp, isAllWhiteSpaceRegExp, whiteSpaceElements, children, nonEmptyElements, rootBlockName; args = args || {}; matchedNodes = {}; matchedAttributes = {}; blockElements = tinymce.extend(tinymce.makeMap('script,style,head,html,body,title,meta,param'), schema.getBlockElements()); nonEmptyElements = schema.getNonEmptyElements(); children = schema.children; validate = settings.validate; rootBlockName = "forced_root_block" in args ? args.forced_root_block : settings.forced_root_block; whiteSpaceElements = schema.getWhiteSpaceElements(); startWhiteSpaceRegExp = /^[ \t\r\n]+/; endWhiteSpaceRegExp = /[ \t\r\n]+$/; allWhiteSpaceRegExp = /[ \t\r\n]+/g; isAllWhiteSpaceRegExp = /^[ \t\r\n]+$/; function addRootBlocks() { var node = rootNode.firstChild, next, rootBlockNode; while (node) { next = node.next; if (node.type == 3 || (node.type == 1 && node.name !== 'p' && !blockElements[node.name] && !node.attr('data-mce-type'))) { if (!rootBlockNode) { // Create a new root block element rootBlockNode = createNode(rootBlockName, 1); rootNode.insert(rootBlockNode, node); rootBlockNode.append(node); } else rootBlockNode.append(node); } else { rootBlockNode = null; } node = next; }; }; function createNode(name, type) { var node = new Node(name, type), list; if (name in nodeFilters) { list = matchedNodes[name]; if (list) list.push(node); else matchedNodes[name] = [node]; } return node; }; function removeWhitespaceBefore(node) { var textNode, textVal, sibling; for (textNode = node.prev; textNode && textNode.type === 3; ) { textVal = textNode.value.replace(endWhiteSpaceRegExp, ''); if (textVal.length > 0) { textNode.value = textVal; textNode = textNode.prev; } else { sibling = textNode.prev; textNode.remove(); textNode = sibling; } } }; function cloneAndExcludeBlocks(input) { var name, output = {}; for (name in input) { if (name !== 'li' && name != 'p') { output[name] = input[name]; } } return output; }; parser = new tinymce.html.SaxParser({ validate : validate, // Exclude P and LI from DOM parsing since it's treated better by the DOM parser self_closing_elements: cloneAndExcludeBlocks(schema.getSelfClosingElements()), cdata: function(text) { node.append(createNode('#cdata', 4)).value = text; }, text: function(text, raw) { var textNode; // Trim all redundant whitespace on non white space elements if (!isInWhiteSpacePreservedElement) { text = text.replace(allWhiteSpaceRegExp, ' '); if (node.lastChild && blockElements[node.lastChild.name]) text = text.replace(startWhiteSpaceRegExp, ''); } // Do we need to create the node if (text.length !== 0) { textNode = createNode('#text', 3); textNode.raw = !!raw; node.append(textNode).value = text; } }, comment: function(text) { node.append(createNode('#comment', 8)).value = text; }, pi: function(name, text) { node.append(createNode(name, 7)).value = text; removeWhitespaceBefore(node); }, doctype: function(text) { var newNode; newNode = node.append(createNode('#doctype', 10)); newNode.value = text; removeWhitespaceBefore(node); }, start: function(name, attrs, empty) { var newNode, attrFiltersLen, elementRule, textNode, attrName, text, sibling, parent; elementRule = validate ? schema.getElementRule(name) : {}; if (elementRule) { newNode = createNode(elementRule.outputName || name, 1); newNode.attributes = attrs; newNode.shortEnded = empty; node.append(newNode); // Check if node is valid child of the parent node is the child is // unknown we don't collect it since it's probably a custom element parent = children[node.name]; if (parent && children[newNode.name] && !parent[newNode.name]) invalidChildren.push(newNode); attrFiltersLen = attributeFilters.length; while (attrFiltersLen--) { attrName = attributeFilters[attrFiltersLen].name; if (attrName in attrs.map) { list = matchedAttributes[attrName]; if (list) list.push(newNode); else matchedAttributes[attrName] = [newNode]; } } // Trim whitespace before block if (blockElements[name]) removeWhitespaceBefore(newNode); // Change current node if the element wasn't empty i.e not
        or if (!empty) node = newNode; // Check if we are inside a whitespace preserved element if (!isInWhiteSpacePreservedElement && whiteSpaceElements[name]) { isInWhiteSpacePreservedElement = true; } } }, end: function(name) { var textNode, elementRule, text, sibling, tempNode; elementRule = validate ? schema.getElementRule(name) : {}; if (elementRule) { if (blockElements[name]) { if (!isInWhiteSpacePreservedElement) { // Trim whitespace of the first node in a block textNode = node.firstChild; if (textNode && textNode.type === 3) { text = textNode.value.replace(startWhiteSpaceRegExp, ''); // Any characters left after trim or should we remove it if (text.length > 0) { textNode.value = text; textNode = textNode.next; } else { sibling = textNode.next; textNode.remove(); textNode = sibling; } // Remove any pure whitespace siblings while (textNode && textNode.type === 3) { text = textNode.value; sibling = textNode.next; if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) { textNode.remove(); textNode = sibling; } textNode = sibling; } } // Trim whitespace of the last node in a block textNode = node.lastChild; if (textNode && textNode.type === 3) { text = textNode.value.replace(endWhiteSpaceRegExp, ''); // Any characters left after trim or should we remove it if (text.length > 0) { textNode.value = text; textNode = textNode.prev; } else { sibling = textNode.prev; textNode.remove(); textNode = sibling; } // Remove any pure whitespace siblings while (textNode && textNode.type === 3) { text = textNode.value; sibling = textNode.prev; if (text.length === 0 || isAllWhiteSpaceRegExp.test(text)) { textNode.remove(); textNode = sibling; } textNode = sibling; } } } // Trim start white space textNode = node.prev; if (textNode && textNode.type === 3) { text = textNode.value.replace(startWhiteSpaceRegExp, ''); if (text.length > 0) textNode.value = text; else textNode.remove(); } } // Check if we exited a whitespace preserved element if (isInWhiteSpacePreservedElement && whiteSpaceElements[name]) { isInWhiteSpacePreservedElement = false; } // Handle empty nodes if (elementRule.removeEmpty || elementRule.paddEmpty) { if (node.isEmpty(nonEmptyElements)) { if (elementRule.paddEmpty) node.empty().append(new Node('#text', '3')).value = '\u00a0'; else { // Leave nodes that have a name like if (!node.attributes.map.name && !node.attributes.map.id) { tempNode = node.parent; node.empty().remove(); node = tempNode; return; } } } } node = node.parent; } } }, schema); rootNode = node = new Node(args.context || settings.root_name, 11); parser.parse(html); // Fix invalid children or report invalid children in a contextual parsing if (validate && invalidChildren.length) { if (!args.context) fixInvalidChildren(invalidChildren); else args.invalid = true; } // Wrap nodes in the root into block elements if the root is body if (rootBlockName && rootNode.name == 'body') addRootBlocks(); // Run filters only when the contents is valid if (!args.invalid) { // Run node filters for (name in matchedNodes) { list = nodeFilters[name]; nodes = matchedNodes[name]; // Remove already removed children fi = nodes.length; while (fi--) { if (!nodes[fi].parent) nodes.splice(fi, 1); } for (i = 0, l = list.length; i < l; i++) list[i](nodes, name, args); } // Run attribute filters for (i = 0, l = attributeFilters.length; i < l; i++) { list = attributeFilters[i]; if (list.name in matchedAttributes) { nodes = matchedAttributes[list.name]; // Remove already removed children fi = nodes.length; while (fi--) { if (!nodes[fi].parent) nodes.splice(fi, 1); } for (fi = 0, fl = list.callbacks.length; fi < fl; fi++) list.callbacks[fi](nodes, list.name, args); } } } return rootNode; }; // Remove
        at end of block elements Gecko and WebKit injects BR elements to // make it possible to place the caret inside empty blocks. This logic tries to remove // these elements and keep br elements that where intended to be there intact if (settings.remove_trailing_brs) { self.addNodeFilter('br', function(nodes, name) { var i, l = nodes.length, node, blockElements = tinymce.extend({}, schema.getBlockElements()), nonEmptyElements = schema.getNonEmptyElements(), parent, lastParent, prev, prevName; // Remove brs from body element as well blockElements.body = 1; // Must loop forwards since it will otherwise remove all brs in

        a


        for (i = 0; i < l; i++) { node = nodes[i]; parent = node.parent; if (blockElements[node.parent.name] && node === parent.lastChild) { // Loop all nodes to the left of the current node and check for other BR elements // excluding bookmarks since they are invisible prev = node.prev; while (prev) { prevName = prev.name; // Ignore bookmarks if (prevName !== "span" || prev.attr('data-mce-type') !== 'bookmark') { // Found a non BR element if (prevName !== "br") break; // Found another br it's a

        structure then don't remove anything if (prevName === 'br') { node = null; break; } } prev = prev.prev; } if (node) { node.remove(); // Is the parent to be considered empty after we removed the BR if (parent.isEmpty(nonEmptyElements)) { elementRule = schema.getElementRule(parent.name); // Remove or padd the element depending on schema rule if (elementRule) { if (elementRule.removeEmpty) parent.remove(); else if (elementRule.paddEmpty) parent.empty().append(new tinymce.html.Node('#text', 3)).value = '\u00a0'; } } } } else { // Replaces BR elements inside inline elements like


        so they become

         

        lastParent = node; while (parent.firstChild === lastParent && parent.lastChild === lastParent) { lastParent = parent; if (blockElements[parent.name]) { break; } parent = parent.parent; } if (lastParent === parent) { textNode = new tinymce.html.Node('#text', 3); textNode.value = '\u00a0'; node.replace(textNode); } } } }); } // Force anchor names closed, unless the setting "allow_html_in_named_anchor" is explicitly included. if (!settings.allow_html_in_named_anchor) { self.addAttributeFilter('id,name', function(nodes, name) { var i = nodes.length, sibling, prevSibling, parent, node; while (i--) { node = nodes[i]; if (node.name === 'a' && node.firstChild && !node.attr('href')) { parent = node.parent; // Move children after current node sibling = node.lastChild; do { prevSibling = sibling.prev; parent.insert(sibling, node); sibling = prevSibling; } while (sibling); } } }); } } })(tinymce); tinymce.html.Writer = function(settings) { var html = [], indent, indentBefore, indentAfter, encode, htmlOutput; settings = settings || {}; indent = settings.indent; indentBefore = tinymce.makeMap(settings.indent_before || ''); indentAfter = tinymce.makeMap(settings.indent_after || ''); encode = tinymce.html.Entities.getEncodeFunc(settings.entity_encoding || 'raw', settings.entities); htmlOutput = settings.element_format == "html"; return { start: function(name, attrs, empty) { var i, l, attr, value; if (indent && indentBefore[name] && html.length > 0) { value = html[html.length - 1]; if (value.length > 0 && value !== '\n') html.push('\n'); } html.push('<', name); if (attrs) { for (i = 0, l = attrs.length; i < l; i++) { attr = attrs[i]; html.push(' ', attr.name, '="', encode(attr.value, true), '"'); } } if (!empty || htmlOutput) html[html.length] = '>'; else html[html.length] = ' />'; if (empty && indent && indentAfter[name] && html.length > 0) { value = html[html.length - 1]; if (value.length > 0 && value !== '\n') html.push('\n'); } }, end: function(name) { var value; /*if (indent && indentBefore[name] && html.length > 0) { value = html[html.length - 1]; if (value.length > 0 && value !== '\n') html.push('\n'); }*/ html.push(''); if (indent && indentAfter[name] && html.length > 0) { value = html[html.length - 1]; if (value.length > 0 && value !== '\n') html.push('\n'); } }, text: function(text, raw) { if (text.length > 0) html[html.length] = raw ? text : encode(text); }, cdata: function(text) { html.push(''); }, comment: function(text) { html.push(''); }, pi: function(name, text) { if (text) html.push(''); else html.push(''); if (indent) html.push('\n'); }, doctype: function(text) { html.push('', indent ? '\n' : ''); }, reset: function() { html.length = 0; }, getContent: function() { return html.join('').replace(/\n$/, ''); } }; }; (function(tinymce) { tinymce.html.Serializer = function(settings, schema) { var self = this, writer = new tinymce.html.Writer(settings); settings = settings || {}; settings.validate = "validate" in settings ? settings.validate : true; self.schema = schema = schema || new tinymce.html.Schema(); self.writer = writer; self.serialize = function(node) { var handlers, validate; validate = settings.validate; handlers = { // #text 3: function(node, raw) { writer.text(node.value, node.raw); }, // #comment 8: function(node) { writer.comment(node.value); }, // Processing instruction 7: function(node) { writer.pi(node.name, node.value); }, // Doctype 10: function(node) { writer.doctype(node.value); }, // CDATA 4: function(node) { writer.cdata(node.value); }, // Document fragment 11: function(node) { if ((node = node.firstChild)) { do { walk(node); } while (node = node.next); } } }; writer.reset(); function walk(node) { var handler = handlers[node.type], name, isEmpty, attrs, attrName, attrValue, sortedAttrs, i, l, elementRule; if (!handler) { name = node.name; isEmpty = node.shortEnded; attrs = node.attributes; // Sort attributes if (validate && attrs && attrs.length > 1) { sortedAttrs = []; sortedAttrs.map = {}; elementRule = schema.getElementRule(node.name); for (i = 0, l = elementRule.attributesOrder.length; i < l; i++) { attrName = elementRule.attributesOrder[i]; if (attrName in attrs.map) { attrValue = attrs.map[attrName]; sortedAttrs.map[attrName] = attrValue; sortedAttrs.push({name: attrName, value: attrValue}); } } for (i = 0, l = attrs.length; i < l; i++) { attrName = attrs[i].name; if (!(attrName in sortedAttrs.map)) { attrValue = attrs.map[attrName]; sortedAttrs.map[attrName] = attrValue; sortedAttrs.push({name: attrName, value: attrValue}); } } attrs = sortedAttrs; } writer.start(node.name, attrs, isEmpty); if (!isEmpty) { if ((node = node.firstChild)) { do { walk(node); } while (node = node.next); } writer.end(name); } } else handler(node); } // Serialize element and treat all non elements as fragments if (node.type == 1 && !settings.inner) walk(node); else handlers[11](node); return writer.getContent(); }; } })(tinymce); // JSLint defined globals /*global tinymce:false, window:false */ tinymce.dom = {}; (function(namespace, expando) { var w3cEventModel = !!document.addEventListener; function addEvent(target, name, callback, capture) { if (target.addEventListener) { target.addEventListener(name, callback, capture || false); } else if (target.attachEvent) { target.attachEvent('on' + name, callback); } } function removeEvent(target, name, callback, capture) { if (target.removeEventListener) { target.removeEventListener(name, callback, capture || false); } else if (target.detachEvent) { target.detachEvent('on' + name, callback); } } function fix(original_event, data) { var name, event = data || {}; // Dummy function that gets replaced on the delegation state functions function returnFalse() { return false; } // Dummy function that gets replaced on the delegation state functions function returnTrue() { return true; } // Copy all properties from the original event for (name in original_event) { // layerX/layerY is deprecated in Chrome and produces a warning if (name !== "layerX" && name !== "layerY") { event[name] = original_event[name]; } } // Normalize target IE uses srcElement if (!event.target) { event.target = event.srcElement || document; } // Add preventDefault method event.preventDefault = function() { event.isDefaultPrevented = returnTrue; // Execute preventDefault on the original event object if (original_event) { if (original_event.preventDefault) { original_event.preventDefault(); } else { original_event.returnValue = false; // IE } } }; // Add stopPropagation event.stopPropagation = function() { event.isPropagationStopped = returnTrue; // Execute stopPropagation on the original event object if (original_event) { if (original_event.stopPropagation) { original_event.stopPropagation(); } else { original_event.cancelBubble = true; // IE } } }; // Add stopImmediatePropagation event.stopImmediatePropagation = function() { event.isImmediatePropagationStopped = returnTrue; event.stopPropagation(); }; // Add event delegation states if (!event.isDefaultPrevented) { event.isDefaultPrevented = returnFalse; event.isPropagationStopped = returnFalse; event.isImmediatePropagationStopped = returnFalse; } return event; } function bindOnReady(win, callback, event_utils) { var doc = win.document, event = {type: 'ready'}; // Gets called when the DOM is ready function readyHandler() { if (!event_utils.domLoaded) { event_utils.domLoaded = true; callback(event); } } // Use W3C method if (w3cEventModel) { addEvent(win, 'DOMContentLoaded', readyHandler); } else { // Use IE method addEvent(doc, "readystatechange", function() { if (doc.readyState === "complete") { removeEvent(doc, "readystatechange", arguments.callee); readyHandler(); } }); // Wait until we can scroll, when we can the DOM is initialized if (doc.documentElement.doScroll && win === win.top) { (function() { try { // If IE is used, use the trick by Diego Perini licensed under MIT by request to the author. // http://javascript.nwbox.com/IEContentLoaded/ doc.documentElement.doScroll("left"); } catch (ex) { setTimeout(arguments.callee, 0); return; } readyHandler(); })(); } } // Fallback if any of the above methods should fail for some odd reason addEvent(win, 'load', readyHandler); } function EventUtils(proxy) { var self = this, events = {}, count, isFocusBlurBound, hasFocusIn, hasMouseEnterLeave, mouseEnterLeave; hasMouseEnterLeave = "onmouseenter" in document.documentElement; hasFocusIn = "onfocusin" in document.documentElement; mouseEnterLeave = {mouseenter: 'mouseover', mouseleave: 'mouseout'}; count = 1; // State if the DOMContentLoaded was executed or not self.domLoaded = false; self.events = events; function executeHandlers(evt, id) { var callbackList, i, l, callback; callbackList = events[id][evt.type]; if (callbackList) { for (i = 0, l = callbackList.length; i < l; i++) { callback = callbackList[i]; // Check if callback exists might be removed if a unbind is called inside the callback if (callback && callback.func.call(callback.scope, evt) === false) { evt.preventDefault(); } // Should we stop propagation to immediate listeners if (evt.isImmediatePropagationStopped()) { return; } } } } self.bind = function(target, names, callback, scope) { var id, callbackList, i, name, fakeName, nativeHandler, capture, win = window; // Native event handler function patches the event and executes the callbacks for the expando function defaultNativeHandler(evt) { executeHandlers(fix(evt || win.event), id); } // Don't bind to text nodes or comments if (!target || target.nodeType === 3 || target.nodeType === 8) { return; } // Create or get events id for the target if (!target[expando]) { id = count++; target[expando] = id; events[id] = {}; } else { id = target[expando]; if (!events[id]) { events[id] = {}; } } // Setup the specified scope or use the target as a default scope = scope || target; // Split names and bind each event, enables you to bind multiple events with one call names = names.split(' '); i = names.length; while (i--) { name = names[i]; nativeHandler = defaultNativeHandler; fakeName = capture = false; // Use ready instead of DOMContentLoaded if (name === "DOMContentLoaded") { name = "ready"; } // DOM is already ready if ((self.domLoaded || target.readyState == 'complete') && name === "ready") { self.domLoaded = true; callback.call(scope, fix({type: name})); continue; } // Handle mouseenter/mouseleaver if (!hasMouseEnterLeave) { fakeName = mouseEnterLeave[name]; if (fakeName) { nativeHandler = function(evt) { var current, related; current = evt.currentTarget; related = evt.relatedTarget; // Check if related is inside the current target if it's not then the event should be ignored since it's a mouseover/mouseout inside the element if (related && current.contains) { // Use contains for performance related = current.contains(related); } else { while (related && related !== current) { related = related.parentNode; } } // Fire fake event if (!related) { evt = fix(evt || win.event); evt.type = evt.type === 'mouseout' ? 'mouseleave' : 'mouseenter'; evt.target = current; executeHandlers(evt, id); } }; } } // Fake bubbeling of focusin/focusout if (!hasFocusIn && (name === "focusin" || name === "focusout")) { capture = true; fakeName = name === "focusin" ? "focus" : "blur"; nativeHandler = function(evt) { evt = fix(evt || win.event); evt.type = evt.type === 'focus' ? 'focusin' : 'focusout'; executeHandlers(evt, id); }; } // Setup callback list and bind native event callbackList = events[id][name]; if (!callbackList) { events[id][name] = callbackList = [{func: callback, scope: scope}]; callbackList.fakeName = fakeName; callbackList.capture = capture; // Add the nativeHandler to the callback list so that we can later unbind it callbackList.nativeHandler = nativeHandler; if (!w3cEventModel) { callbackList.proxyHandler = proxy(id); } // Check if the target has native events support if (name === "ready") { bindOnReady(target, nativeHandler, self); } else { addEvent(target, fakeName || name, w3cEventModel ? nativeHandler : callbackList.proxyHandler, capture); } } else { // If it already has an native handler then just push the callback callbackList.push({func: callback, scope: scope}); } } target = callbackList = 0; // Clean memory for IE return callback; }; self.unbind = function(target, names, callback) { var id, callbackList, i, ci, name, eventMap; // Don't bind to text nodes or comments if (!target || target.nodeType === 3 || target.nodeType === 8) { return self; } // Unbind event or events if the target has the expando id = target[expando]; if (id) { eventMap = events[id]; // Specific callback if (names) { names = names.split(' '); i = names.length; while (i--) { name = names[i]; callbackList = eventMap[name]; // Unbind the event if it exists in the map if (callbackList) { // Remove specified callback if (callback) { ci = callbackList.length; while (ci--) { if (callbackList[ci].func === callback) { callbackList.splice(ci, 1); } } } // Remove all callbacks if there isn't a specified callback or there is no callbacks left if (!callback || callbackList.length === 0) { delete eventMap[name]; removeEvent(target, callbackList.fakeName || name, w3cEventModel ? callbackList.nativeHandler : callbackList.proxyHandler, callbackList.capture); } } } } else { // All events for a specific element for (name in eventMap) { callbackList = eventMap[name]; removeEvent(target, callbackList.fakeName || name, w3cEventModel ? callbackList.nativeHandler : callbackList.proxyHandler, callbackList.capture); } eventMap = {}; } // Check if object is empty, if it isn't then we won't remove the expando map for (name in eventMap) { return self; } // Delete event object delete events[id]; // Remove expando from target try { // IE will fail here since it can't delete properties from window delete target[expando]; } catch (ex) { // IE will set it to null target[expando] = null; } } return self; }; self.fire = function(target, name, args) { var id, event; // Don't bind to text nodes or comments if (!target || target.nodeType === 3 || target.nodeType === 8) { return self; } // Build event object by patching the args event = fix(null, args); event.type = name; do { // Found an expando that means there is listeners to execute id = target[expando]; if (id) { executeHandlers(event, id); } // Walk up the DOM target = target.parentNode || target.ownerDocument || target.defaultView || target.parentWindow; } while (target && !event.isPropagationStopped()); return self; }; self.clean = function(target) { var i, children, unbind = self.unbind; // Don't bind to text nodes or comments if (!target || target.nodeType === 3 || target.nodeType === 8) { return self; } // Unbind any element on the specificed target if (target[expando]) { unbind(target); } // Target doesn't have getElementsByTagName it's probably a window object then use it's document to find the children if (!target.getElementsByTagName) { target = target.document; } // Remove events from each child element if (target && target.getElementsByTagName) { unbind(target); children = target.getElementsByTagName('*'); i = children.length; while (i--) { target = children[i]; if (target[expando]) { unbind(target); } } } return self; }; self.callNativeHandler = function(id, evt) { if (events) { events[id][evt.type].nativeHandler(evt); } }; self.destory = function() { events = {}; }; // Legacy function calls self.add = function(target, events, func, scope) { // Old API supported direct ID assignment if (typeof(target) === "string") { target = document.getElementById(target); } // Old API supported multiple targets if (target && target instanceof Array) { var i = target; while (i--) { self.add(target[i], events, func, scope); } return; } // Old API called ready init if (events === "init") { events = "ready"; } return self.bind(target, events instanceof Array ? events.join(' ') : events, func, scope); }; self.remove = function(target, events, func, scope) { if (!target) { return self; } // Old API supported direct ID assignment if (typeof(target) === "string") { target = document.getElementById(target); } // Old API supported multiple targets if (target instanceof Array) { var i = target.length; while (i--) { self.remove(target[i], events, func, scope); } return self; } return self.unbind(target, events instanceof Array ? events.join(' ') : events, func); }; self.clear = function(target) { // Old API supported direct ID assignment if (typeof(target) === "string") { target = document.getElementById(target); } return self.clean(target); }; self.cancel = function(e) { if (e) { self.prevent(e); self.stop(e); } return false; }; self.prevent = function(e) { if (!e.preventDefault) { e = fix(e); } e.preventDefault(); return false; }; self.stop = function(e) { if (!e.stopPropagation) { e = fix(e); } e.stopPropagation(); return false; }; } namespace.EventUtils = EventUtils; namespace.Event = new EventUtils(function(id) { return function(evt) { tinymce.dom.Event.callNativeHandler(id, evt); }; }); // Bind ready event when tinymce script is loaded namespace.Event.bind(window, 'ready', function() {}); namespace = 0; })(tinymce.dom, 'data-mce-expando'); // Namespace and expando tinymce.dom.TreeWalker = function(start_node, root_node) { var node = start_node; function findSibling(node, start_name, sibling_name, shallow) { var sibling, parent; if (node) { // Walk into nodes if it has a start if (!shallow && node[start_name]) return node[start_name]; // Return the sibling if it has one if (node != root_node) { sibling = node[sibling_name]; if (sibling) return sibling; // Walk up the parents to look for siblings for (parent = node.parentNode; parent && parent != root_node; parent = parent.parentNode) { sibling = parent[sibling_name]; if (sibling) return sibling; } } } }; this.current = function() { return node; }; this.next = function(shallow) { return (node = findSibling(node, 'firstChild', 'nextSibling', shallow)); }; this.prev = function(shallow) { return (node = findSibling(node, 'lastChild', 'previousSibling', shallow)); }; }; (function(tinymce) { // Shorten names var each = tinymce.each, is = tinymce.is, isWebKit = tinymce.isWebKit, isIE = tinymce.isIE, Entities = tinymce.html.Entities, simpleSelectorRe = /^([a-z0-9],?)+$/i, whiteSpaceRegExp = /^[ \t\r\n]*$/; tinymce.create('tinymce.dom.DOMUtils', { doc : null, root : null, files : null, pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/, props : { "for" : "htmlFor", "class" : "className", className : "className", checked : "checked", disabled : "disabled", maxlength : "maxLength", readonly : "readOnly", selected : "selected", value : "value", id : "id", name : "name", type : "type" }, DOMUtils : function(d, s) { var t = this, globalStyle, name, blockElementsMap; t.doc = d; t.win = window; t.files = {}; t.cssFlicker = false; t.counter = 0; t.stdMode = !tinymce.isIE || d.documentMode >= 8; t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat" || t.stdMode; t.hasOuterHTML = "outerHTML" in d.createElement("a"); t.settings = s = tinymce.extend({ keep_values : false, hex_colors : 1 }, s); t.schema = s.schema; t.styles = new tinymce.html.Styles({ url_converter : s.url_converter, url_converter_scope : s.url_converter_scope }, s.schema); // Fix IE6SP2 flicker and check it failed for pre SP2 if (tinymce.isIE6) { try { d.execCommand('BackgroundImageCache', false, true); } catch (e) { t.cssFlicker = true; } } t.fixDoc(d); t.events = s.ownEvents ? new tinymce.dom.EventUtils(s.proxy) : tinymce.dom.Event; tinymce.addUnload(t.destroy, t); blockElementsMap = s.schema ? s.schema.getBlockElements() : {}; t.isBlock = function(node) { // This function is called in module pattern style since it might be executed with the wrong this scope var type = node.nodeType; // If it's a node then check the type and use the nodeName if (type) return !!(type === 1 && blockElementsMap[node.nodeName]); return !!blockElementsMap[node]; }; }, fixDoc: function(doc) { var settings = this.settings, name; if (isIE && settings.schema) { // Add missing HTML 4/5 elements to IE ('abbr article aside audio canvas ' + 'details figcaption figure footer ' + 'header hgroup mark menu meter nav ' + 'output progress section summary ' + 'time video').replace(/\w+/g, function(name) { doc.createElement(name); }); // Create all custom elements for (name in settings.schema.getCustomElements()) { doc.createElement(name); } } }, clone: function(node, deep) { var self = this, clone, doc; // TODO: Add feature detection here in the future if (!isIE || node.nodeType !== 1 || deep) { return node.cloneNode(deep); } doc = self.doc; // Make a HTML5 safe shallow copy if (!deep) { clone = doc.createElement(node.nodeName); // Copy attribs each(self.getAttribs(node), function(attr) { self.setAttrib(clone, attr.nodeName, self.getAttrib(node, attr.nodeName)); }); return clone; } /* // Setup HTML5 patched document fragment if (!self.frag) { self.frag = doc.createDocumentFragment(); self.fixDoc(self.frag); } // Make a deep copy by adding it to the document fragment then removing it this removed the :section clone = doc.createElement('div'); self.frag.appendChild(clone); clone.innerHTML = node.outerHTML; self.frag.removeChild(clone); */ return clone.firstChild; }, getRoot : function() { var t = this, s = t.settings; return (s && t.get(s.root_element)) || t.doc.body; }, getViewPort : function(w) { var d, b; w = !w ? this.win : w; d = w.document; b = this.boxModel ? d.documentElement : d.body; // Returns viewport size excluding scrollbars return { x : w.pageXOffset || b.scrollLeft, y : w.pageYOffset || b.scrollTop, w : w.innerWidth || b.clientWidth, h : w.innerHeight || b.clientHeight }; }, getRect : function(e) { var p, t = this, sr; e = t.get(e); p = t.getPos(e); sr = t.getSize(e); return { x : p.x, y : p.y, w : sr.w, h : sr.h }; }, getSize : function(e) { var t = this, w, h; e = t.get(e); w = t.getStyle(e, 'width'); h = t.getStyle(e, 'height'); // Non pixel value, then force offset/clientWidth if (w.indexOf('px') === -1) w = 0; // Non pixel value, then force offset/clientWidth if (h.indexOf('px') === -1) h = 0; return { w : parseInt(w, 10) || e.offsetWidth || e.clientWidth, h : parseInt(h, 10) || e.offsetHeight || e.clientHeight }; }, getParent : function(n, f, r) { return this.getParents(n, f, r, false); }, getParents : function(n, f, r, c) { var t = this, na, se = t.settings, o = []; n = t.get(n); c = c === undefined; if (se.strict_root) r = r || t.getRoot(); // Wrap node name as func if (is(f, 'string')) { na = f; if (f === '*') { f = function(n) {return n.nodeType == 1;}; } else { f = function(n) { return t.is(n, na); }; } } while (n) { if (n == r || !n.nodeType || n.nodeType === 9) break; if (!f || f(n)) { if (c) o.push(n); else return n; } n = n.parentNode; } return c ? o : null; }, get : function(e) { var n; if (e && this.doc && typeof(e) == 'string') { n = e; e = this.doc.getElementById(e); // IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick if (e && e.id !== n) return this.doc.getElementsByName(n)[1]; } return e; }, getNext : function(node, selector) { return this._findSib(node, selector, 'nextSibling'); }, getPrev : function(node, selector) { return this._findSib(node, selector, 'previousSibling'); }, add : function(p, n, a, h, c) { var t = this; return this.run(p, function(p) { var e, k; e = is(n, 'string') ? t.doc.createElement(n) : n; t.setAttribs(e, a); if (h) { if (h.nodeType) e.appendChild(h); else t.setHTML(e, h); } return !c ? p.appendChild(e) : e; }); }, create : function(n, a, h) { return this.add(this.doc.createElement(n), n, a, h, 1); }, createHTML : function(n, a, h) { var o = '', t = this, k; o += '<' + n; for (k in a) { if (a.hasOwnProperty(k)) o += ' ' + k + '="' + t.encode(a[k]) + '"'; } // A call to tinymce.is doesn't work for some odd reason on IE9 possible bug inside their JS runtime if (typeof(h) != "undefined") return o + '>' + h + ''; return o + ' />'; }, remove : function(node, keep_children) { return this.run(node, function(node) { var child, parent = node.parentNode; if (!parent) return null; if (keep_children) { while (child = node.firstChild) { // IE 8 will crash if you don't remove completely empty text nodes if (!tinymce.isIE || child.nodeType !== 3 || child.nodeValue) parent.insertBefore(child, node); else node.removeChild(child); } } return parent.removeChild(node); }); }, setStyle : function(n, na, v) { var t = this; return t.run(n, function(e) { var s, i; s = e.style; // Camelcase it, if needed na = na.replace(/-(\D)/g, function(a, b){ return b.toUpperCase(); }); // Default px suffix on these if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v))) v += 'px'; switch (na) { case 'opacity': // IE specific opacity if (isIE) { s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")"; if (!n.currentStyle || !n.currentStyle.hasLayout) s.display = 'inline-block'; } // Fix for older browsers s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || ''; break; case 'float': isIE ? s.styleFloat = v : s.cssFloat = v; break; default: s[na] = v || ''; } // Force update of the style data if (t.settings.update_styles) t.setAttrib(e, 'data-mce-style'); }); }, getStyle : function(n, na, c) { n = this.get(n); if (!n) return; // Gecko if (this.doc.defaultView && c) { // Remove camelcase na = na.replace(/[A-Z]/g, function(a){ return '-' + a; }); try { return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na); } catch (ex) { // Old safari might fail return null; } } // Camelcase it, if needed na = na.replace(/-(\D)/g, function(a, b){ return b.toUpperCase(); }); if (na == 'float') na = isIE ? 'styleFloat' : 'cssFloat'; // IE & Opera if (n.currentStyle && c) return n.currentStyle[na]; return n.style ? n.style[na] : undefined; }, setStyles : function(e, o) { var t = this, s = t.settings, ol; ol = s.update_styles; s.update_styles = 0; each(o, function(v, n) { t.setStyle(e, n, v); }); // Update style info s.update_styles = ol; if (s.update_styles) t.setAttrib(e, s.cssText); }, removeAllAttribs: function(e) { return this.run(e, function(e) { var i, attrs = e.attributes; for (i = attrs.length - 1; i >= 0; i--) { e.removeAttributeNode(attrs.item(i)); } }); }, setAttrib : function(e, n, v) { var t = this; // Whats the point if (!e || !n) return; // Strict XML mode if (t.settings.strict) n = n.toLowerCase(); return this.run(e, function(e) { var s = t.settings; var originalValue = e.getAttribute(n); if (v !== null) { switch (n) { case "style": if (!is(v, 'string')) { each(v, function(v, n) { t.setStyle(e, n, v); }); return; } // No mce_style for elements with these since they might get resized by the user if (s.keep_values) { if (v && !t._isRes(v)) e.setAttribute('data-mce-style', v, 2); else e.removeAttribute('data-mce-style', 2); } e.style.cssText = v; break; case "class": e.className = v || ''; // Fix IE null bug break; case "src": case "href": if (s.keep_values) { if (s.url_converter) v = s.url_converter.call(s.url_converter_scope || t, v, n, e); t.setAttrib(e, 'data-mce-' + n, v, 2); } break; case "shape": e.setAttribute('data-mce-style', v); break; } } if (is(v) && v !== null && v.length !== 0) e.setAttribute(n, '' + v, 2); else e.removeAttribute(n, 2); // fire onChangeAttrib event for attributes that have changed if (tinyMCE.activeEditor && originalValue != v) { var ed = tinyMCE.activeEditor; ed.onSetAttrib.dispatch(ed, e, n, v); } }); }, setAttribs : function(e, o) { var t = this; return this.run(e, function(e) { each(o, function(v, n) { t.setAttrib(e, n, v); }); }); }, getAttrib : function(e, n, dv) { var v, t = this, undef; e = t.get(e); if (!e || e.nodeType !== 1) return dv === undef ? false : dv; if (!is(dv)) dv = ''; // Try the mce variant for these if (/^(src|href|style|coords|shape)$/.test(n)) { v = e.getAttribute("data-mce-" + n); if (v) return v; } if (isIE && t.props[n]) { v = e[t.props[n]]; v = v && v.nodeValue ? v.nodeValue : v; } if (!v) v = e.getAttribute(n, 2); // Check boolean attribs if (/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(n)) { if (e[t.props[n]] === true && v === '') return n; return v ? n : ''; } // Inner input elements will override attributes on form elements if (e.nodeName === "FORM" && e.getAttributeNode(n)) return e.getAttributeNode(n).nodeValue; if (n === 'style') { v = v || e.style.cssText; if (v) { v = t.serializeStyle(t.parseStyle(v), e.nodeName); if (t.settings.keep_values && !t._isRes(v)) e.setAttribute('data-mce-style', v); } } // Remove Apple and WebKit stuff if (isWebKit && n === "class" && v) v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, ''); // Handle IE issues if (isIE) { switch (n) { case 'rowspan': case 'colspan': // IE returns 1 as default value if (v === 1) v = ''; break; case 'size': // IE returns +0 as default value for size if (v === '+0' || v === 20 || v === 0) v = ''; break; case 'width': case 'height': case 'vspace': case 'checked': case 'disabled': case 'readonly': if (v === 0) v = ''; break; case 'hspace': // IE returns -1 as default value if (v === -1) v = ''; break; case 'maxlength': case 'tabindex': // IE returns default value if (v === 32768 || v === 2147483647 || v === '32768') v = ''; break; case 'multiple': case 'compact': case 'noshade': case 'nowrap': if (v === 65535) return n; return dv; case 'shape': v = v.toLowerCase(); break; default: // IE has odd anonymous function for event attributes if (n.indexOf('on') === 0 && v) v = tinymce._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/, '$1', '' + v); } } return (v !== undef && v !== null && v !== '') ? '' + v : dv; }, getPos : function(n, ro) { var t = this, x = 0, y = 0, e, d = t.doc, r; n = t.get(n); ro = ro || d.body; if (n) { // Use getBoundingClientRect if it exists since it's faster than looping offset nodes if (n.getBoundingClientRect) { n = n.getBoundingClientRect(); e = t.boxModel ? d.documentElement : d.body; // Add scroll offsets from documentElement or body since IE with the wrong box model will use d.body and so do WebKit // Also remove the body/documentelement clientTop/clientLeft on IE 6, 7 since they offset the position x = n.left + (d.documentElement.scrollLeft || d.body.scrollLeft) - e.clientTop; y = n.top + (d.documentElement.scrollTop || d.body.scrollTop) - e.clientLeft; return {x : x, y : y}; } r = n; while (r && r != ro && r.nodeType) { x += r.offsetLeft || 0; y += r.offsetTop || 0; r = r.offsetParent; } r = n.parentNode; while (r && r != ro && r.nodeType) { x -= r.scrollLeft || 0; y -= r.scrollTop || 0; r = r.parentNode; } } return {x : x, y : y}; }, parseStyle : function(st) { return this.styles.parse(st); }, serializeStyle : function(o, name) { return this.styles.serialize(o, name); }, loadCSS : function(u) { var t = this, d = t.doc, head; if (!u) u = ''; head = d.getElementsByTagName('head')[0]; each(u.split(','), function(u) { var link; if (t.files[u]) return; t.files[u] = true; link = t.create('link', {rel : 'stylesheet', href : tinymce._addVer(u)}); // IE 8 has a bug where dynamically loading stylesheets would produce a 1 item remaining bug // This fix seems to resolve that issue by realcing the document ones a stylesheet finishes loading // It's ugly but it seems to work fine. if (isIE && d.documentMode && d.recalc) { link.onload = function() { if (d.recalc) d.recalc(); link.onload = null; }; } head.appendChild(link); }); }, addClass : function(e, c) { return this.run(e, function(e) { var o; if (!c) return 0; if (this.hasClass(e, c)) return e.className; o = this.removeClass(e, c); return e.className = (o != '' ? (o + ' ') : '') + c; }); }, removeClass : function(e, c) { var t = this, re; return t.run(e, function(e) { var v; if (t.hasClass(e, c)) { if (!re) re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g"); v = e.className.replace(re, ' '); v = tinymce.trim(v != ' ' ? v : ''); e.className = v; // Empty class attr if (!v) { e.removeAttribute('class'); e.removeAttribute('className'); } return v; } return e.className; }); }, hasClass : function(n, c) { n = this.get(n); if (!n || !c) return false; return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1; }, show : function(e) { return this.setStyle(e, 'display', 'block'); }, hide : function(e) { return this.setStyle(e, 'display', 'none'); }, isHidden : function(e) { e = this.get(e); return !e || e.style.display == 'none' || this.getStyle(e, 'display') == 'none'; }, uniqueId : function(p) { return (!p ? 'mce_' : p) + (this.counter++); }, setHTML : function(element, html) { var self = this; return self.run(element, function(element) { if (isIE) { // Remove all child nodes, IE keeps empty text nodes in DOM while (element.firstChild) element.removeChild(element.firstChild); try { // IE will remove comments from the beginning // unless you padd the contents with something element.innerHTML = '
        ' + html; element.removeChild(element.firstChild); } catch (ex) { // IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p // This seems to fix this problem // Create new div with HTML contents and a BR infront to keep comments element = self.create('div'); element.innerHTML = '
        ' + html; // Add all children from div to target each (element.childNodes, function(node, i) { // Skip br element if (i) element.appendChild(node); }); } } else element.innerHTML = html; return html; }); }, getOuterHTML : function(elm) { var doc, self = this; elm = self.get(elm); if (!elm) return null; if (elm.nodeType === 1 && self.hasOuterHTML) return elm.outerHTML; doc = (elm.ownerDocument || self.doc).createElement("body"); doc.appendChild(elm.cloneNode(true)); return doc.innerHTML; }, setOuterHTML : function(e, h, d) { var t = this; function setHTML(e, h, d) { var n, tp; tp = d.createElement("body"); tp.innerHTML = h; n = tp.lastChild; while (n) { t.insertAfter(n.cloneNode(true), e); n = n.previousSibling; } t.remove(e); }; return this.run(e, function(e) { e = t.get(e); // Only set HTML on elements if (e.nodeType == 1) { d = d || e.ownerDocument || t.doc; if (isIE) { try { // Try outerHTML for IE it sometimes produces an unknown runtime error if (isIE && e.nodeType == 1) e.outerHTML = h; else setHTML(e, h, d); } catch (ex) { // Fix for unknown runtime error setHTML(e, h, d); } } else setHTML(e, h, d); } }); }, decode : Entities.decode, encode : Entities.encodeAllRaw, insertAfter : function(node, reference_node) { reference_node = this.get(reference_node); return this.run(node, function(node) { var parent, nextSibling; parent = reference_node.parentNode; nextSibling = reference_node.nextSibling; if (nextSibling) parent.insertBefore(node, nextSibling); else parent.appendChild(node); return node; }); }, replace : function(n, o, k) { var t = this; if (is(o, 'array')) n = n.cloneNode(true); return t.run(o, function(o) { if (k) { each(tinymce.grep(o.childNodes), function(c) { n.appendChild(c); }); } return o.parentNode.replaceChild(n, o); }); }, rename : function(elm, name) { var t = this, newElm; if (elm.nodeName != name.toUpperCase()) { // Rename block element newElm = t.create(name); // Copy attribs to new block each(t.getAttribs(elm), function(attr_node) { t.setAttrib(newElm, attr_node.nodeName, t.getAttrib(elm, attr_node.nodeName)); }); // Replace block t.replace(newElm, elm, 1); } return newElm || elm; }, findCommonAncestor : function(a, b) { var ps = a, pe; while (ps) { pe = b; while (pe && ps != pe) pe = pe.parentNode; if (ps == pe) break; ps = ps.parentNode; } if (!ps && a.ownerDocument) return a.ownerDocument.documentElement; return ps; }, toHex : function(s) { var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s); function hex(s) { s = parseInt(s, 10).toString(16); return s.length > 1 ? s : '0' + s; // 0 -> 00 }; if (c) { s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]); return s; } return s; }, getClasses : function() { var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov; if (t.classes) return t.classes; function addClasses(s) { // IE style imports each(s.imports, function(r) { addClasses(r); }); each(s.cssRules || s.rules, function(r) { // Real type or fake it on IE switch (r.type || 1) { // Rule case 1: if (r.selectorText) { each(r.selectorText.split(','), function(v) { v = v.replace(/^\s*|\s*$|^\s\./g, ""); // Is internal or it doesn't contain a class if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v)) return; // Remove everything but class name ov = v; v = tinymce._replace(/.*\.([a-z0-9_\-]+).*/i, '$1', v); // Filter classes if (f && !(v = f(v, ov))) return; if (!lo[v]) { cl.push({'class' : v}); lo[v] = 1; } }); } break; // Import case 3: addClasses(r.styleSheet); break; } }); }; try { each(t.doc.styleSheets, addClasses); } catch (ex) { // Ignore } if (cl.length > 0) t.classes = cl; return cl; }, run : function(e, f, s) { var t = this, o; if (t.doc && typeof(e) === 'string') e = t.get(e); if (!e) return false; s = s || this; if (!e.nodeType && (e.length || e.length === 0)) { o = []; each(e, function(e, i) { if (e) { if (typeof(e) == 'string') e = t.doc.getElementById(e); o.push(f.call(s, e, i)); } }); return o; } return f.call(s, e); }, getAttribs : function(n) { var o; n = this.get(n); if (!n) return []; if (isIE) { o = []; // Object will throw exception in IE if (n.nodeName == 'OBJECT') return n.attributes; // IE doesn't keep the selected attribute if you clone option elements if (n.nodeName === 'OPTION' && this.getAttrib(n, 'selected')) o.push({specified : 1, nodeName : 'selected'}); // It's crazy that this is faster in IE but it's because it returns all attributes all the time n.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi, '').replace(/[\w:\-]+/gi, function(a) { o.push({specified : 1, nodeName : a}); }); return o; } return n.attributes; }, isEmpty : function(node, elements) { var self = this, i, attributes, type, walker, name, brCount = 0; node = node.firstChild; if (node) { walker = new tinymce.dom.TreeWalker(node, node.parentNode); elements = elements || self.schema ? self.schema.getNonEmptyElements() : null; do { type = node.nodeType; if (type === 1) { // Ignore bogus elements if (node.getAttribute('data-mce-bogus')) continue; // Keep empty elements like name = node.nodeName.toLowerCase(); if (elements && elements[name]) { // Ignore single BR elements in blocks like


        or


        if (name === 'br') { brCount++; continue; } return false; } // Keep elements with data-bookmark attributes or name attribute like
        attributes = self.getAttribs(node); i = node.attributes.length; while (i--) { name = node.attributes[i].nodeName; if (name === "name" || name === 'data-mce-bookmark') return false; } } // Keep comment nodes if (type == 8) return false; // Keep non whitespace text nodes if ((type === 3 && !whiteSpaceRegExp.test(node.nodeValue))) return false; } while (node = walker.next()); } return brCount <= 1; }, destroy : function(s) { var t = this; t.win = t.doc = t.root = t.events = t.frag = null; // Manual destroy then remove unload handler if (!s) tinymce.removeUnload(t.destroy); }, createRng : function() { var d = this.doc; return d.createRange ? d.createRange() : new tinymce.dom.Range(this); }, nodeIndex : function(node, normalized) { var idx = 0, lastNodeType, lastNode, nodeType; if (node) { for (lastNodeType = node.nodeType, node = node.previousSibling, lastNode = node; node; node = node.previousSibling) { nodeType = node.nodeType; // Normalize text nodes if (normalized && nodeType == 3) { if (nodeType == lastNodeType || !node.nodeValue.length) continue; } idx++; lastNodeType = nodeType; } } return idx; }, split : function(pe, e, re) { var t = this, r = t.createRng(), bef, aft, pa; // W3C valid browsers tend to leave empty nodes to the left/right side of the contents, this makes sense // but we don't want that in our code since it serves no purpose for the end user // For example if this is chopped: //

        text 1CHOPtext 2

        // would produce: //

        text 1

        CHOP

        text 2

        // this function will then trim of empty edges and produce: //

        text 1

        CHOP

        text 2

        function trim(node) { var i, children = node.childNodes, type = node.nodeType; function surroundedBySpans(node) { var previousIsSpan = node.previousSibling && node.previousSibling.nodeName == 'SPAN'; var nextIsSpan = node.nextSibling && node.nextSibling.nodeName == 'SPAN'; return previousIsSpan && nextIsSpan; } if (type == 1 && node.getAttribute('data-mce-type') == 'bookmark') return; for (i = children.length - 1; i >= 0; i--) trim(children[i]); if (type != 9) { // Keep non whitespace text nodes if (type == 3 && node.nodeValue.length > 0) { // If parent element isn't a block or there isn't any useful contents for example "

        " // Also keep text nodes with only spaces if surrounded by spans. // eg. "

        a b

        " should keep space between a and b var trimmedLength = tinymce.trim(node.nodeValue).length; if (!t.isBlock(node.parentNode) || trimmedLength > 0 || trimmedLength === 0 && surroundedBySpans(node)) return; } else if (type == 1) { // If the only child is a bookmark then move it up children = node.childNodes; if (children.length == 1 && children[0] && children[0].nodeType == 1 && children[0].getAttribute('data-mce-type') == 'bookmark') node.parentNode.insertBefore(children[0], node); // Keep non empty elements or img, hr etc if (children.length || /^(br|hr|input|img)$/i.test(node.nodeName)) return; } t.remove(node); } return node; }; if (pe && e) { // Get before chunk r.setStart(pe.parentNode, t.nodeIndex(pe)); r.setEnd(e.parentNode, t.nodeIndex(e)); bef = r.extractContents(); // Get after chunk r = t.createRng(); r.setStart(e.parentNode, t.nodeIndex(e) + 1); r.setEnd(pe.parentNode, t.nodeIndex(pe) + 1); aft = r.extractContents(); // Insert before chunk pa = pe.parentNode; pa.insertBefore(trim(bef), pe); // Insert middle chunk if (re) pa.replaceChild(re, e); else pa.insertBefore(e, pe); // Insert after chunk pa.insertBefore(trim(aft), pe); t.remove(pe); return re || e; } }, bind : function(target, name, func, scope) { return this.events.add(target, name, func, scope || this); }, unbind : function(target, name, func) { return this.events.remove(target, name, func); }, fire : function(target, name, evt) { return this.events.fire(target, name, evt); }, // Returns the content editable state of a node getContentEditable: function(node) { var contentEditable; // Check type if (node.nodeType != 1) { return null; } // Check for fake content editable contentEditable = node.getAttribute("data-mce-contenteditable"); if (contentEditable && contentEditable !== "inherit") { return contentEditable; } // Check for real content editable return node.contentEditable !== "inherit" ? node.contentEditable : null; }, _findSib : function(node, selector, name) { var t = this, f = selector; if (node) { // If expression make a function of it using is if (is(f, 'string')) { f = function(node) { return t.is(node, selector); }; } // Loop all siblings for (node = node[name]; node; node = node[name]) { if (f(node)) return node; } } return null; }, _isRes : function(c) { // Is live resizble element return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c); } /* walk : function(n, f, s) { var d = this.doc, w; if (d.createTreeWalker) { w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false); while ((n = w.nextNode()) != null) f.call(s || this, n); } else tinymce.walk(n, f, 'childNodes', s); } */ /* toRGB : function(s) { var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s); if (c) { // #FFF -> #FFFFFF if (!is(c[3])) c[3] = c[2] = c[1]; return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")"; } return s; } */ }); tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0}); })(tinymce); (function(ns) { // Range constructor function Range(dom) { var t = this, doc = dom.doc, EXTRACT = 0, CLONE = 1, DELETE = 2, TRUE = true, FALSE = false, START_OFFSET = 'startOffset', START_CONTAINER = 'startContainer', END_CONTAINER = 'endContainer', END_OFFSET = 'endOffset', extend = tinymce.extend, nodeIndex = dom.nodeIndex; extend(t, { // Inital states startContainer : doc, startOffset : 0, endContainer : doc, endOffset : 0, collapsed : TRUE, commonAncestorContainer : doc, // Range constants START_TO_START : 0, START_TO_END : 1, END_TO_END : 2, END_TO_START : 3, // Public methods setStart : setStart, setEnd : setEnd, setStartBefore : setStartBefore, setStartAfter : setStartAfter, setEndBefore : setEndBefore, setEndAfter : setEndAfter, collapse : collapse, selectNode : selectNode, selectNodeContents : selectNodeContents, compareBoundaryPoints : compareBoundaryPoints, deleteContents : deleteContents, extractContents : extractContents, cloneContents : cloneContents, insertNode : insertNode, surroundContents : surroundContents, cloneRange : cloneRange, toStringIE : toStringIE }); function createDocumentFragment() { return doc.createDocumentFragment(); }; function setStart(n, o) { _setEndPoint(TRUE, n, o); }; function setEnd(n, o) { _setEndPoint(FALSE, n, o); }; function setStartBefore(n) { setStart(n.parentNode, nodeIndex(n)); }; function setStartAfter(n) { setStart(n.parentNode, nodeIndex(n) + 1); }; function setEndBefore(n) { setEnd(n.parentNode, nodeIndex(n)); }; function setEndAfter(n) { setEnd(n.parentNode, nodeIndex(n) + 1); }; function collapse(ts) { if (ts) { t[END_CONTAINER] = t[START_CONTAINER]; t[END_OFFSET] = t[START_OFFSET]; } else { t[START_CONTAINER] = t[END_CONTAINER]; t[START_OFFSET] = t[END_OFFSET]; } t.collapsed = TRUE; }; function selectNode(n) { setStartBefore(n); setEndAfter(n); }; function selectNodeContents(n) { setStart(n, 0); setEnd(n, n.nodeType === 1 ? n.childNodes.length : n.nodeValue.length); }; function compareBoundaryPoints(h, r) { var sc = t[START_CONTAINER], so = t[START_OFFSET], ec = t[END_CONTAINER], eo = t[END_OFFSET], rsc = r.startContainer, rso = r.startOffset, rec = r.endContainer, reo = r.endOffset; // Check START_TO_START if (h === 0) return _compareBoundaryPoints(sc, so, rsc, rso); // Check START_TO_END if (h === 1) return _compareBoundaryPoints(ec, eo, rsc, rso); // Check END_TO_END if (h === 2) return _compareBoundaryPoints(ec, eo, rec, reo); // Check END_TO_START if (h === 3) return _compareBoundaryPoints(sc, so, rec, reo); }; function deleteContents() { _traverse(DELETE); }; function extractContents() { return _traverse(EXTRACT); }; function cloneContents() { return _traverse(CLONE); }; function insertNode(n) { var startContainer = this[START_CONTAINER], startOffset = this[START_OFFSET], nn, o; // Node is TEXT_NODE or CDATA if ((startContainer.nodeType === 3 || startContainer.nodeType === 4) && startContainer.nodeValue) { if (!startOffset) { // At the start of text startContainer.parentNode.insertBefore(n, startContainer); } else if (startOffset >= startContainer.nodeValue.length) { // At the end of text dom.insertAfter(n, startContainer); } else { // Middle, need to split nn = startContainer.splitText(startOffset); startContainer.parentNode.insertBefore(n, nn); } } else { // Insert element node if (startContainer.childNodes.length > 0) o = startContainer.childNodes[startOffset]; if (o) startContainer.insertBefore(n, o); else startContainer.appendChild(n); } }; function surroundContents(n) { var f = t.extractContents(); t.insertNode(n); n.appendChild(f); t.selectNode(n); }; function cloneRange() { return extend(new Range(dom), { startContainer : t[START_CONTAINER], startOffset : t[START_OFFSET], endContainer : t[END_CONTAINER], endOffset : t[END_OFFSET], collapsed : t.collapsed, commonAncestorContainer : t.commonAncestorContainer }); }; // Private methods function _getSelectedNode(container, offset) { var child; if (container.nodeType == 3 /* TEXT_NODE */) return container; if (offset < 0) return container; child = container.firstChild; while (child && offset > 0) { --offset; child = child.nextSibling; } if (child) return child; return container; }; function _isCollapsed() { return (t[START_CONTAINER] == t[END_CONTAINER] && t[START_OFFSET] == t[END_OFFSET]); }; function _compareBoundaryPoints(containerA, offsetA, containerB, offsetB) { var c, offsetC, n, cmnRoot, childA, childB; // In the first case the boundary-points have the same container. A is before B // if its offset is less than the offset of B, A is equal to B if its offset is // equal to the offset of B, and A is after B if its offset is greater than the // offset of B. if (containerA == containerB) { if (offsetA == offsetB) return 0; // equal if (offsetA < offsetB) return -1; // before return 1; // after } // In the second case a child node C of the container of A is an ancestor // container of B. In this case, A is before B if the offset of A is less than or // equal to the index of the child node C and A is after B otherwise. c = containerB; while (c && c.parentNode != containerA) c = c.parentNode; if (c) { offsetC = 0; n = containerA.firstChild; while (n != c && offsetC < offsetA) { offsetC++; n = n.nextSibling; } if (offsetA <= offsetC) return -1; // before return 1; // after } // In the third case a child node C of the container of B is an ancestor container // of A. In this case, A is before B if the index of the child node C is less than // the offset of B and A is after B otherwise. c = containerA; while (c && c.parentNode != containerB) { c = c.parentNode; } if (c) { offsetC = 0; n = containerB.firstChild; while (n != c && offsetC < offsetB) { offsetC++; n = n.nextSibling; } if (offsetC < offsetB) return -1; // before return 1; // after } // In the fourth case, none of three other cases hold: the containers of A and B // are siblings or descendants of sibling nodes. In this case, A is before B if // the container of A is before the container of B in a pre-order traversal of the // Ranges' context tree and A is after B otherwise. cmnRoot = dom.findCommonAncestor(containerA, containerB); childA = containerA; while (childA && childA.parentNode != cmnRoot) childA = childA.parentNode; if (!childA) childA = cmnRoot; childB = containerB; while (childB && childB.parentNode != cmnRoot) childB = childB.parentNode; if (!childB) childB = cmnRoot; if (childA == childB) return 0; // equal n = cmnRoot.firstChild; while (n) { if (n == childA) return -1; // before if (n == childB) return 1; // after n = n.nextSibling; } }; function _setEndPoint(st, n, o) { var ec, sc; if (st) { t[START_CONTAINER] = n; t[START_OFFSET] = o; } else { t[END_CONTAINER] = n; t[END_OFFSET] = o; } // If one boundary-point of a Range is set to have a root container // other than the current one for the Range, the Range is collapsed to // the new position. This enforces the restriction that both boundary- // points of a Range must have the same root container. ec = t[END_CONTAINER]; while (ec.parentNode) ec = ec.parentNode; sc = t[START_CONTAINER]; while (sc.parentNode) sc = sc.parentNode; if (sc == ec) { // The start position of a Range is guaranteed to never be after the // end position. To enforce this restriction, if the start is set to // be at a position after the end, the Range is collapsed to that // position. if (_compareBoundaryPoints(t[START_CONTAINER], t[START_OFFSET], t[END_CONTAINER], t[END_OFFSET]) > 0) t.collapse(st); } else t.collapse(st); t.collapsed = _isCollapsed(); t.commonAncestorContainer = dom.findCommonAncestor(t[START_CONTAINER], t[END_CONTAINER]); }; function _traverse(how) { var c, endContainerDepth = 0, startContainerDepth = 0, p, depthDiff, startNode, endNode, sp, ep; if (t[START_CONTAINER] == t[END_CONTAINER]) return _traverseSameContainer(how); for (c = t[END_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { if (p == t[START_CONTAINER]) return _traverseCommonStartContainer(c, how); ++endContainerDepth; } for (c = t[START_CONTAINER], p = c.parentNode; p; c = p, p = p.parentNode) { if (p == t[END_CONTAINER]) return _traverseCommonEndContainer(c, how); ++startContainerDepth; } depthDiff = startContainerDepth - endContainerDepth; startNode = t[START_CONTAINER]; while (depthDiff > 0) { startNode = startNode.parentNode; depthDiff--; } endNode = t[END_CONTAINER]; while (depthDiff < 0) { endNode = endNode.parentNode; depthDiff++; } // ascend the ancestor hierarchy until we have a common parent. for (sp = startNode.parentNode, ep = endNode.parentNode; sp != ep; sp = sp.parentNode, ep = ep.parentNode) { startNode = sp; endNode = ep; } return _traverseCommonAncestors(startNode, endNode, how); }; function _traverseSameContainer(how) { var frag, s, sub, n, cnt, sibling, xferNode, start, len; if (how != DELETE) frag = createDocumentFragment(); // If selection is empty, just return the fragment if (t[START_OFFSET] == t[END_OFFSET]) return frag; // Text node needs special case handling if (t[START_CONTAINER].nodeType == 3 /* TEXT_NODE */) { // get the substring s = t[START_CONTAINER].nodeValue; sub = s.substring(t[START_OFFSET], t[END_OFFSET]); // set the original text node to its new value if (how != CLONE) { n = t[START_CONTAINER]; start = t[START_OFFSET]; len = t[END_OFFSET] - t[START_OFFSET]; if (start === 0 && len >= n.nodeValue.length - 1) { n.parentNode.removeChild(n); } else { n.deleteData(start, len); } // Nothing is partially selected, so collapse to start point t.collapse(TRUE); } if (how == DELETE) return; if (sub.length > 0) { frag.appendChild(doc.createTextNode(sub)); } return frag; } // Copy nodes between the start/end offsets. n = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]); cnt = t[END_OFFSET] - t[START_OFFSET]; while (n && cnt > 0) { sibling = n.nextSibling; xferNode = _traverseFullySelected(n, how); if (frag) frag.appendChild( xferNode ); --cnt; n = sibling; } // Nothing is partially selected, so collapse to start point if (how != CLONE) t.collapse(TRUE); return frag; }; function _traverseCommonStartContainer(endAncestor, how) { var frag, n, endIdx, cnt, sibling, xferNode; if (how != DELETE) frag = createDocumentFragment(); n = _traverseRightBoundary(endAncestor, how); if (frag) frag.appendChild(n); endIdx = nodeIndex(endAncestor); cnt = endIdx - t[START_OFFSET]; if (cnt <= 0) { // Collapse to just before the endAncestor, which // is partially selected. if (how != CLONE) { t.setEndBefore(endAncestor); t.collapse(FALSE); } return frag; } n = endAncestor.previousSibling; while (cnt > 0) { sibling = n.previousSibling; xferNode = _traverseFullySelected(n, how); if (frag) frag.insertBefore(xferNode, frag.firstChild); --cnt; n = sibling; } // Collapse to just before the endAncestor, which // is partially selected. if (how != CLONE) { t.setEndBefore(endAncestor); t.collapse(FALSE); } return frag; }; function _traverseCommonEndContainer(startAncestor, how) { var frag, startIdx, n, cnt, sibling, xferNode; if (how != DELETE) frag = createDocumentFragment(); n = _traverseLeftBoundary(startAncestor, how); if (frag) frag.appendChild(n); startIdx = nodeIndex(startAncestor); ++startIdx; // Because we already traversed it cnt = t[END_OFFSET] - startIdx; n = startAncestor.nextSibling; while (n && cnt > 0) { sibling = n.nextSibling; xferNode = _traverseFullySelected(n, how); if (frag) frag.appendChild(xferNode); --cnt; n = sibling; } if (how != CLONE) { t.setStartAfter(startAncestor); t.collapse(TRUE); } return frag; }; function _traverseCommonAncestors(startAncestor, endAncestor, how) { var n, frag, commonParent, startOffset, endOffset, cnt, sibling, nextSibling; if (how != DELETE) frag = createDocumentFragment(); n = _traverseLeftBoundary(startAncestor, how); if (frag) frag.appendChild(n); commonParent = startAncestor.parentNode; startOffset = nodeIndex(startAncestor); endOffset = nodeIndex(endAncestor); ++startOffset; cnt = endOffset - startOffset; sibling = startAncestor.nextSibling; while (cnt > 0) { nextSibling = sibling.nextSibling; n = _traverseFullySelected(sibling, how); if (frag) frag.appendChild(n); sibling = nextSibling; --cnt; } n = _traverseRightBoundary(endAncestor, how); if (frag) frag.appendChild(n); if (how != CLONE) { t.setStartAfter(startAncestor); t.collapse(TRUE); } return frag; }; function _traverseRightBoundary(root, how) { var next = _getSelectedNode(t[END_CONTAINER], t[END_OFFSET] - 1), parent, clonedParent, prevSibling, clonedChild, clonedGrandParent, isFullySelected = next != t[END_CONTAINER]; if (next == root) return _traverseNode(next, isFullySelected, FALSE, how); parent = next.parentNode; clonedParent = _traverseNode(parent, FALSE, FALSE, how); while (parent) { while (next) { prevSibling = next.previousSibling; clonedChild = _traverseNode(next, isFullySelected, FALSE, how); if (how != DELETE) clonedParent.insertBefore(clonedChild, clonedParent.firstChild); isFullySelected = TRUE; next = prevSibling; } if (parent == root) return clonedParent; next = parent.previousSibling; parent = parent.parentNode; clonedGrandParent = _traverseNode(parent, FALSE, FALSE, how); if (how != DELETE) clonedGrandParent.appendChild(clonedParent); clonedParent = clonedGrandParent; } }; function _traverseLeftBoundary(root, how) { var next = _getSelectedNode(t[START_CONTAINER], t[START_OFFSET]), isFullySelected = next != t[START_CONTAINER], parent, clonedParent, nextSibling, clonedChild, clonedGrandParent; if (next == root) return _traverseNode(next, isFullySelected, TRUE, how); parent = next.parentNode; clonedParent = _traverseNode(parent, FALSE, TRUE, how); while (parent) { while (next) { nextSibling = next.nextSibling; clonedChild = _traverseNode(next, isFullySelected, TRUE, how); if (how != DELETE) clonedParent.appendChild(clonedChild); isFullySelected = TRUE; next = nextSibling; } if (parent == root) return clonedParent; next = parent.nextSibling; parent = parent.parentNode; clonedGrandParent = _traverseNode(parent, FALSE, TRUE, how); if (how != DELETE) clonedGrandParent.appendChild(clonedParent); clonedParent = clonedGrandParent; } }; function _traverseNode(n, isFullySelected, isLeft, how) { var txtValue, newNodeValue, oldNodeValue, offset, newNode; if (isFullySelected) return _traverseFullySelected(n, how); if (n.nodeType == 3 /* TEXT_NODE */) { txtValue = n.nodeValue; if (isLeft) { offset = t[START_OFFSET]; newNodeValue = txtValue.substring(offset); oldNodeValue = txtValue.substring(0, offset); } else { offset = t[END_OFFSET]; newNodeValue = txtValue.substring(0, offset); oldNodeValue = txtValue.substring(offset); } if (how != CLONE) n.nodeValue = oldNodeValue; if (how == DELETE) return; newNode = dom.clone(n, FALSE); newNode.nodeValue = newNodeValue; return newNode; } if (how == DELETE) return; return dom.clone(n, FALSE); }; function _traverseFullySelected(n, how) { if (how != DELETE) return how == CLONE ? dom.clone(n, TRUE) : n; n.parentNode.removeChild(n); }; function toStringIE() { return dom.create('body', null, cloneContents()).outerText; } return t; }; ns.Range = Range; // Older IE versions doesn't let you override toString by it's constructor so we have to stick it in the prototype Range.prototype.toString = function() { return this.toStringIE(); }; })(tinymce.dom); (function() { function Selection(selection) { var self = this, dom = selection.dom, TRUE = true, FALSE = false; function getPosition(rng, start) { var checkRng, startIndex = 0, endIndex, inside, children, child, offset, index, position = -1, parent; // Setup test range, collapse it and get the parent checkRng = rng.duplicate(); checkRng.collapse(start); parent = checkRng.parentElement(); // Check if the selection is within the right document if (parent.ownerDocument !== selection.dom.doc) return; // IE will report non editable elements as it's parent so look for an editable one while (parent.contentEditable === "false") { parent = parent.parentNode; } // If parent doesn't have any children then return that we are inside the element if (!parent.hasChildNodes()) { return {node : parent, inside : 1}; } // Setup node list and endIndex children = parent.children; endIndex = children.length - 1; // Perform a binary search for the position while (startIndex <= endIndex) { index = Math.floor((startIndex + endIndex) / 2); // Move selection to node and compare the ranges child = children[index]; checkRng.moveToElementText(child); position = checkRng.compareEndPoints(start ? 'StartToStart' : 'EndToEnd', rng); // Before/after or an exact match if (position > 0) { endIndex = index - 1; } else if (position < 0) { startIndex = index + 1; } else { return {node : child}; } } // Check if child position is before or we didn't find a position if (position < 0) { // No element child was found use the parent element and the offset inside that if (!child) { checkRng.moveToElementText(parent); checkRng.collapse(true); child = parent; inside = true; } else checkRng.collapse(false); // Walk character by character in text node until we hit the selected range endpoint, hit the end of document or parent isn't the right one // We need to walk char by char since rng.text or rng.htmlText will trim line endings offset = 0; while (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) !== 0) { if (checkRng.move('character', 1) === 0 || parent != checkRng.parentElement()) { break; } offset++; } } else { // Child position is after the selection endpoint checkRng.collapse(true); // Walk character by character in text node until we hit the selected range endpoint, hit the end of document or parent isn't the right one offset = 0; while (checkRng.compareEndPoints(start ? 'StartToStart' : 'StartToEnd', rng) !== 0) { if (checkRng.move('character', -1) === 0 || parent != checkRng.parentElement()) { break; } offset++; } } return {node : child, position : position, offset : offset, inside : inside}; }; // Returns a W3C DOM compatible range object by using the IE Range API function getRange() { var ieRange = selection.getRng(), domRange = dom.createRng(), element, collapsed, tmpRange, element2, bookmark, fail; // If selection is outside the current document just return an empty range element = ieRange.item ? ieRange.item(0) : ieRange.parentElement(); if (element.ownerDocument != dom.doc) return domRange; collapsed = selection.isCollapsed(); // Handle control selection if (ieRange.item) { domRange.setStart(element.parentNode, dom.nodeIndex(element)); domRange.setEnd(domRange.startContainer, domRange.startOffset + 1); return domRange; } function findEndPoint(start) { var endPoint = getPosition(ieRange, start), container, offset, textNodeOffset = 0, sibling, undef, nodeValue; container = endPoint.node; offset = endPoint.offset; if (endPoint.inside && !container.hasChildNodes()) { domRange[start ? 'setStart' : 'setEnd'](container, 0); return; } if (offset === undef) { domRange[start ? 'setStartBefore' : 'setEndAfter'](container); return; } if (endPoint.position < 0) { sibling = endPoint.inside ? container.firstChild : container.nextSibling; if (!sibling) { domRange[start ? 'setStartAfter' : 'setEndAfter'](container); return; } if (!offset) { if (sibling.nodeType == 3) domRange[start ? 'setStart' : 'setEnd'](sibling, 0); else domRange[start ? 'setStartBefore' : 'setEndBefore'](sibling); return; } // Find the text node and offset while (sibling) { nodeValue = sibling.nodeValue; textNodeOffset += nodeValue.length; // We are at or passed the position we where looking for if (textNodeOffset >= offset) { container = sibling; textNodeOffset -= offset; textNodeOffset = nodeValue.length - textNodeOffset; break; } sibling = sibling.nextSibling; } } else { // Find the text node and offset sibling = container.previousSibling; if (!sibling) return domRange[start ? 'setStartBefore' : 'setEndBefore'](container); // If there isn't any text to loop then use the first position if (!offset) { if (container.nodeType == 3) domRange[start ? 'setStart' : 'setEnd'](sibling, container.nodeValue.length); else domRange[start ? 'setStartAfter' : 'setEndAfter'](sibling); return; } while (sibling) { textNodeOffset += sibling.nodeValue.length; // We are at or passed the position we where looking for if (textNodeOffset >= offset) { container = sibling; textNodeOffset -= offset; break; } sibling = sibling.previousSibling; } } domRange[start ? 'setStart' : 'setEnd'](container, textNodeOffset); }; try { // Find start point findEndPoint(true); // Find end point if needed if (!collapsed) findEndPoint(); } catch (ex) { // IE has a nasty bug where text nodes might throw "invalid argument" when you // access the nodeValue or other properties of text nodes. This seems to happend when // text nodes are split into two nodes by a delete/backspace call. So lets detect it and try to fix it. if (ex.number == -2147024809) { // Get the current selection bookmark = self.getBookmark(2); // Get start element tmpRange = ieRange.duplicate(); tmpRange.collapse(true); element = tmpRange.parentElement(); // Get end element if (!collapsed) { tmpRange = ieRange.duplicate(); tmpRange.collapse(false); element2 = tmpRange.parentElement(); element2.innerHTML = element2.innerHTML; } // Remove the broken elements element.innerHTML = element.innerHTML; // Restore the selection self.moveToBookmark(bookmark); // Since the range has moved we need to re-get it ieRange = selection.getRng(); // Find start point findEndPoint(true); // Find end point if needed if (!collapsed) findEndPoint(); } else throw ex; // Throw other errors } return domRange; }; this.getBookmark = function(type) { var rng = selection.getRng(), start, end, bookmark = {}; function getIndexes(node) { var parent, root, children, i, indexes = []; parent = node.parentNode; root = dom.getRoot().parentNode; while (parent != root && parent.nodeType !== 9) { children = parent.children; i = children.length; while (i--) { if (node === children[i]) { indexes.push(i); break; } } node = parent; parent = parent.parentNode; } return indexes; }; function getBookmarkEndPoint(start) { var position; position = getPosition(rng, start); if (position) { return { position : position.position, offset : position.offset, indexes : getIndexes(position.node), inside : position.inside }; } }; // Non ubstructive bookmark if (type === 2) { // Handle text selection if (!rng.item) { bookmark.start = getBookmarkEndPoint(true); if (!selection.isCollapsed()) bookmark.end = getBookmarkEndPoint(); } else bookmark.start = {ctrl : true, indexes : getIndexes(rng.item(0))}; } return bookmark; }; this.moveToBookmark = function(bookmark) { var rng, body = dom.doc.body; function resolveIndexes(indexes) { var node, i, idx, children; node = dom.getRoot(); for (i = indexes.length - 1; i >= 0; i--) { children = node.children; idx = indexes[i]; if (idx <= children.length - 1) { node = children[idx]; } } return node; }; function setBookmarkEndPoint(start) { var endPoint = bookmark[start ? 'start' : 'end'], moveLeft, moveRng, undef; if (endPoint) { moveLeft = endPoint.position > 0; moveRng = body.createTextRange(); moveRng.moveToElementText(resolveIndexes(endPoint.indexes)); offset = endPoint.offset; if (offset !== undef) { moveRng.collapse(endPoint.inside || moveLeft); moveRng.moveStart('character', moveLeft ? -offset : offset); } else moveRng.collapse(start); rng.setEndPoint(start ? 'StartToStart' : 'EndToStart', moveRng); if (start) rng.collapse(true); } }; if (bookmark.start) { if (bookmark.start.ctrl) { rng = body.createControlRange(); rng.addElement(resolveIndexes(bookmark.start.indexes)); rng.select(); } else { rng = body.createTextRange(); setBookmarkEndPoint(true); setBookmarkEndPoint(); rng.select(); } } }; this.addRange = function(rng) { var ieRng, ctrlRng, startContainer, startOffset, endContainer, endOffset, sibling, doc = selection.dom.doc, body = doc.body; function setEndPoint(start) { var container, offset, marker, tmpRng, nodes; marker = dom.create('a'); container = start ? startContainer : endContainer; offset = start ? startOffset : endOffset; tmpRng = ieRng.duplicate(); if (container == doc || container == doc.documentElement) { container = body; offset = 0; } if (container.nodeType == 3) { container.parentNode.insertBefore(marker, container); tmpRng.moveToElementText(marker); tmpRng.moveStart('character', offset); dom.remove(marker); ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); } else { nodes = container.childNodes; if (nodes.length) { if (offset >= nodes.length) { dom.insertAfter(marker, nodes[nodes.length - 1]); } else { container.insertBefore(marker, nodes[offset]); } tmpRng.moveToElementText(marker); } else if (container.canHaveHTML) { // Empty node selection for example
        |
        // Setting innerHTML with a span marker then remove that marker seems to keep empty block elements open container.innerHTML = '\uFEFF'; marker = container.firstChild; tmpRng.moveToElementText(marker); tmpRng.collapse(FALSE); // Collapse false works better than true for some odd reason } ieRng.setEndPoint(start ? 'StartToStart' : 'EndToEnd', tmpRng); dom.remove(marker); } } // Setup some shorter versions startContainer = rng.startContainer; startOffset = rng.startOffset; endContainer = rng.endContainer; endOffset = rng.endOffset; ieRng = body.createTextRange(); // If single element selection then try making a control selection out of it if (startContainer == endContainer && startContainer.nodeType == 1) { // Trick to place the caret inside an empty block element like

        if (startOffset == endOffset && !startContainer.hasChildNodes()) { if (startContainer.canHaveHTML) { // Check if previous sibling is an empty block if it is then we need to render it // IE would otherwise move the caret into the sibling instead of the empty startContainer see: #5236 // Example this:

        |

        would become this:

        |

        sibling = startContainer.previousSibling; if (sibling && !sibling.hasChildNodes() && dom.isBlock(sibling)) { sibling.innerHTML = '\uFEFF'; } else { sibling = null; } startContainer.innerHTML = '\uFEFF\uFEFF'; ieRng.moveToElementText(startContainer.lastChild); ieRng.select(); dom.doc.selection.clear(); startContainer.innerHTML = ''; if (sibling) { sibling.innerHTML = ''; } return; } else { startOffset = dom.nodeIndex(startContainer); startContainer = startContainer.parentNode; } } if (startOffset == endOffset - 1) { try { ctrlRng = body.createControlRange(); ctrlRng.addElement(startContainer.childNodes[startOffset]); ctrlRng.select(); return; } catch (ex) { // Ignore } } } // Set start/end point of selection setEndPoint(true); setEndPoint(); // Select the new range and scroll it into view ieRng.select(); }; // Expose range method this.getRangeAt = getRange; }; // Expose the selection object tinymce.dom.TridentSelection = Selection; })(); (function(tinymce) { tinymce.dom.Element = function(id, settings) { var t = this, dom, el; t.settings = settings = settings || {}; t.id = id; t.dom = dom = settings.dom || tinymce.DOM; // Only IE leaks DOM references, this is a lot faster if (!tinymce.isIE) el = dom.get(t.id); tinymce.each( ('getPos,getRect,getParent,add,setStyle,getStyle,setStyles,' + 'setAttrib,setAttribs,getAttrib,addClass,removeClass,' + 'hasClass,getOuterHTML,setOuterHTML,remove,show,hide,' + 'isHidden,setHTML,get').split(/,/), function(k) { t[k] = function() { var a = [id], i; for (i = 0; i < arguments.length; i++) a.push(arguments[i]); a = dom[k].apply(dom, a); t.update(k); return a; }; } ); tinymce.extend(t, { on : function(n, f, s) { return tinymce.dom.Event.add(t.id, n, f, s); }, getXY : function() { return { x : parseInt(t.getStyle('left')), y : parseInt(t.getStyle('top')) }; }, getSize : function() { var n = dom.get(t.id); return { w : parseInt(t.getStyle('width') || n.clientWidth), h : parseInt(t.getStyle('height') || n.clientHeight) }; }, moveTo : function(x, y) { t.setStyles({left : x, top : y}); }, moveBy : function(x, y) { var p = t.getXY(); t.moveTo(p.x + x, p.y + y); }, resizeTo : function(w, h) { t.setStyles({width : w, height : h}); }, resizeBy : function(w, h) { var s = t.getSize(); t.resizeTo(s.w + w, s.h + h); }, update : function(k) { var b; if (tinymce.isIE6 && settings.blocker) { k = k || ''; // Ignore getters if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0) return; // Remove blocker on remove if (k == 'remove') { dom.remove(t.blocker); return; } if (!t.blocker) { t.blocker = dom.uniqueId(); b = dom.add(settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'}); dom.setStyle(b, 'opacity', 0); } else b = dom.get(t.blocker); dom.setStyles(b, { left : t.getStyle('left', 1), top : t.getStyle('top', 1), width : t.getStyle('width', 1), height : t.getStyle('height', 1), display : t.getStyle('display', 1), zIndex : parseInt(t.getStyle('zIndex', 1) || 0) - 1 }); } } }); }; })(tinymce); (function(tinymce) { function trimNl(s) { return s.replace(/[\n\r]+/g, ''); }; // Shorten names var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each, TreeWalker = tinymce.dom.TreeWalker; tinymce.create('tinymce.dom.Selection', { Selection : function(dom, win, serializer, editor) { var t = this; t.dom = dom; t.win = win; t.serializer = serializer; t.editor = editor; // Add events each([ 'onBeforeSetContent', 'onBeforeGetContent', 'onSetContent', 'onGetContent' ], function(e) { t[e] = new tinymce.util.Dispatcher(t); }); // No W3C Range support if (!t.win.getSelection) t.tridentSel = new tinymce.dom.TridentSelection(t); if (tinymce.isIE && dom.boxModel) this._fixIESelection(); // Prevent leaks tinymce.addUnload(t.destroy, t); }, setCursorLocation: function(node, offset) { var t = this; var r = t.dom.createRng(); r.setStart(node, offset); r.setEnd(node, offset); t.setRng(r); t.collapse(false); }, getContent : function(s) { var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n; s = s || {}; wb = wa = ''; s.get = true; s.format = s.format || 'html'; s.forced_root_block = ''; t.onBeforeGetContent.dispatch(t, s); if (s.format == 'text') return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : '')); if (r.cloneContents) { n = r.cloneContents(); if (n) e.appendChild(n); } else if (is(r.item) || is(r.htmlText)) { // IE will produce invalid markup if elements are present that // it doesn't understand like custom elements or HTML5 elements. // Adding a BR in front of the contents and then remoiving it seems to fix it though. e.innerHTML = '
        ' + (r.item ? r.item(0).outerHTML : r.htmlText); e.removeChild(e.firstChild); } else e.innerHTML = r.toString(); // Keep whitespace before and after if (/^\s/.test(e.innerHTML)) wb = ' '; if (/\s+$/.test(e.innerHTML)) wa = ' '; s.getInner = true; s.content = t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa; t.onGetContent.dispatch(t, s); return s.content; }, setContent : function(content, args) { var self = this, rng = self.getRng(), caretNode, doc = self.win.document, frag, temp; args = args || {format : 'html'}; args.set = true; content = args.content = content; // Dispatch before set content event if (!args.no_events) self.onBeforeSetContent.dispatch(self, args); content = args.content; if (rng.insertNode) { // Make caret marker since insertNode places the caret in the beginning of text after insert content += '_'; // Delete and insert new node if (rng.startContainer == doc && rng.endContainer == doc) { // WebKit will fail if the body is empty since the range is then invalid and it can't insert contents doc.body.innerHTML = content; } else { rng.deleteContents(); if (doc.body.childNodes.length === 0) { doc.body.innerHTML = content; } else { // createContextualFragment doesn't exists in IE 9 DOMRanges if (rng.createContextualFragment) { rng.insertNode(rng.createContextualFragment(content)); } else { // Fake createContextualFragment call in IE 9 frag = doc.createDocumentFragment(); temp = doc.createElement('div'); frag.appendChild(temp); temp.outerHTML = content; rng.insertNode(frag); } } } // Move to caret marker caretNode = self.dom.get('__caret'); // Make sure we wrap it compleatly, Opera fails with a simple select call rng = doc.createRange(); rng.setStartBefore(caretNode); rng.setEndBefore(caretNode); self.setRng(rng); // Remove the caret position self.dom.remove('__caret'); try { self.setRng(rng); } catch (ex) { // Might fail on Opera for some odd reason } } else { if (rng.item) { // Delete content and get caret text selection doc.execCommand('Delete', false, null); rng = self.getRng(); } // Explorer removes spaces from the beginning of pasted contents if (/^\s+/.test(content)) { rng.pasteHTML('_' + content); self.dom.remove('__mce_tmp'); } else rng.pasteHTML(content); } // Dispatch set content event if (!args.no_events) self.onSetContent.dispatch(self, args); }, getStart : function() { var rng = this.getRng(), startElement, parentElement, checkRng, node; if (rng.duplicate || rng.item) { // Control selection, return first item if (rng.item) return rng.item(0); // Get start element checkRng = rng.duplicate(); checkRng.collapse(1); startElement = checkRng.parentElement(); // Check if range parent is inside the start element, then return the inner parent element // This will fix issues when a single element is selected, IE would otherwise return the wrong start element parentElement = node = rng.parentElement(); while (node = node.parentNode) { if (node == startElement) { startElement = parentElement; break; } } return startElement; } else { startElement = rng.startContainer; if (startElement.nodeType == 1 && startElement.hasChildNodes()) startElement = startElement.childNodes[Math.min(startElement.childNodes.length - 1, rng.startOffset)]; if (startElement && startElement.nodeType == 3) return startElement.parentNode; return startElement; } }, getEnd : function() { var t = this, r = t.getRng(), e, eo; if (r.duplicate || r.item) { if (r.item) return r.item(0); r = r.duplicate(); r.collapse(0); e = r.parentElement(); if (e && e.nodeName == 'BODY') return e.lastChild || e; return e; } else { e = r.endContainer; eo = r.endOffset; if (e.nodeType == 1 && e.hasChildNodes()) e = e.childNodes[eo > 0 ? eo - 1 : eo]; if (e && e.nodeType == 3) return e.parentNode; return e; } }, getBookmark : function(type, normalized) { var t = this, dom = t.dom, rng, rng2, id, collapsed, name, element, index, chr = '\uFEFF', styles; function findIndex(name, element) { var index = 0; each(dom.select(name), function(node, i) { if (node == element) index = i; }); return index; }; function normalizeTableCellSelection(rng) { function moveEndPoint(start) { var container, offset, childNodes, prefix = start ? 'start' : 'end'; container = rng[prefix + 'Container']; offset = rng[prefix + 'Offset']; if (container.nodeType == 1 && container.nodeName == "TR") { childNodes = container.childNodes; container = childNodes[Math.min(start ? offset : offset - 1, childNodes.length - 1)]; if (container) { offset = start ? 0 : container.childNodes.length; rng['set' + (start ? 'Start' : 'End')](container, offset); } } }; moveEndPoint(true); moveEndPoint(); return rng; }; function getLocation() { var rng = t.getRng(true), root = dom.getRoot(), bookmark = {}; function getPoint(rng, start) { var container = rng[start ? 'startContainer' : 'endContainer'], offset = rng[start ? 'startOffset' : 'endOffset'], point = [], node, childNodes, after = 0; if (container.nodeType == 3) { if (normalized) { for (node = container.previousSibling; node && node.nodeType == 3; node = node.previousSibling) offset += node.nodeValue.length; } point.push(offset); } else { childNodes = container.childNodes; if (offset >= childNodes.length && childNodes.length) { after = 1; offset = Math.max(0, childNodes.length - 1); } point.push(t.dom.nodeIndex(childNodes[offset], normalized) + after); } for (; container && container != root; container = container.parentNode) point.push(t.dom.nodeIndex(container, normalized)); return point; }; bookmark.start = getPoint(rng, true); if (!t.isCollapsed()) bookmark.end = getPoint(rng); return bookmark; }; if (type == 2) { if (t.tridentSel) return t.tridentSel.getBookmark(type); return getLocation(); } // Handle simple range if (type) return {rng : t.getRng()}; rng = t.getRng(); id = dom.uniqueId(); collapsed = tinyMCE.activeEditor.selection.isCollapsed(); styles = 'overflow:hidden;line-height:0px'; // Explorer method if (rng.duplicate || rng.item) { // Text selection if (!rng.item) { rng2 = rng.duplicate(); try { // Insert start marker rng.collapse(); rng.pasteHTML('' + chr + ''); // Insert end marker if (!collapsed) { rng2.collapse(false); // Detect the empty space after block elements in IE and move the end back one character

        ] becomes

        ]

        rng.moveToElementText(rng2.parentElement()); if (rng.compareEndPoints('StartToEnd', rng2) === 0) rng2.move('character', -1); rng2.pasteHTML('' + chr + ''); } } catch (ex) { // IE might throw unspecified error so lets ignore it return null; } } else { // Control selection element = rng.item(0); name = element.nodeName; return {name : name, index : findIndex(name, element)}; } } else { element = t.getNode(); name = element.nodeName; if (name == 'IMG') return {name : name, index : findIndex(name, element)}; // W3C method rng2 = normalizeTableCellSelection(rng.cloneRange()); // Insert end marker if (!collapsed) { rng2.collapse(false); rng2.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_end', style : styles}, chr)); } rng = normalizeTableCellSelection(rng); rng.collapse(true); rng.insertNode(dom.create('span', {'data-mce-type' : "bookmark", id : id + '_start', style : styles}, chr)); } t.moveToBookmark({id : id, keep : 1}); return {id : id}; }, moveToBookmark : function(bookmark) { var t = this, dom = t.dom, marker1, marker2, rng, root, startContainer, endContainer, startOffset, endOffset; function setEndPoint(start) { var point = bookmark[start ? 'start' : 'end'], i, node, offset, children; if (point) { offset = point[0]; // Find container node for (node = root, i = point.length - 1; i >= 1; i--) { children = node.childNodes; if (point[i] > children.length - 1) return; node = children[point[i]]; } // Move text offset to best suitable location if (node.nodeType === 3) offset = Math.min(point[0], node.nodeValue.length); // Move element offset to best suitable location if (node.nodeType === 1) offset = Math.min(point[0], node.childNodes.length); // Set offset within container node if (start) rng.setStart(node, offset); else rng.setEnd(node, offset); } return true; }; function restoreEndPoint(suffix) { var marker = dom.get(bookmark.id + '_' + suffix), node, idx, next, prev, keep = bookmark.keep; if (marker) { node = marker.parentNode; if (suffix == 'start') { if (!keep) { idx = dom.nodeIndex(marker); } else { node = marker.firstChild; idx = 1; } startContainer = endContainer = node; startOffset = endOffset = idx; } else { if (!keep) { idx = dom.nodeIndex(marker); } else { node = marker.firstChild; idx = 1; } endContainer = node; endOffset = idx; } if (!keep) { prev = marker.previousSibling; next = marker.nextSibling; // Remove all marker text nodes each(tinymce.grep(marker.childNodes), function(node) { if (node.nodeType == 3) node.nodeValue = node.nodeValue.replace(/\uFEFF/g, ''); }); // Remove marker but keep children if for example contents where inserted into the marker // Also remove duplicated instances of the marker for example by a split operation or by WebKit auto split on paste feature while (marker = dom.get(bookmark.id + '_' + suffix)) dom.remove(marker, 1); // If siblings are text nodes then merge them unless it's Opera since it some how removes the node // and we are sniffing since adding a lot of detection code for a browser with 3% of the market isn't worth the effort. Sorry, Opera but it's just a fact if (prev && next && prev.nodeType == next.nodeType && prev.nodeType == 3 && !tinymce.isOpera) { idx = prev.nodeValue.length; prev.appendData(next.nodeValue); dom.remove(next); if (suffix == 'start') { startContainer = endContainer = prev; startOffset = endOffset = idx; } else { endContainer = prev; endOffset = idx; } } } } }; function addBogus(node) { // Adds a bogus BR element for empty block elements if (dom.isBlock(node) && !node.innerHTML && !isIE) node.innerHTML = '
        '; return node; }; if (bookmark) { if (bookmark.start) { rng = dom.createRng(); root = dom.getRoot(); if (t.tridentSel) return t.tridentSel.moveToBookmark(bookmark); if (setEndPoint(true) && setEndPoint()) { t.setRng(rng); } } else if (bookmark.id) { // Restore start/end points restoreEndPoint('start'); restoreEndPoint('end'); if (startContainer) { rng = dom.createRng(); rng.setStart(addBogus(startContainer), startOffset); rng.setEnd(addBogus(endContainer), endOffset); t.setRng(rng); } } else if (bookmark.name) { t.select(dom.select(bookmark.name)[bookmark.index]); } else if (bookmark.rng) t.setRng(bookmark.rng); } }, select : function(node, content) { var t = this, dom = t.dom, rng = dom.createRng(), idx; function setPoint(node, start) { var walker = new TreeWalker(node, node); do { // Text node if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length !== 0) { if (start) rng.setStart(node, 0); else rng.setEnd(node, node.nodeValue.length); return; } // BR element if (node.nodeName == 'BR') { if (start) rng.setStartBefore(node); else rng.setEndBefore(node); return; } } while (node = (start ? walker.next() : walker.prev())); }; if (node) { idx = dom.nodeIndex(node); rng.setStart(node.parentNode, idx); rng.setEnd(node.parentNode, idx + 1); // Find first/last text node or BR element if (content) { setPoint(node, 1); setPoint(node); } t.setRng(rng); } return node; }, isCollapsed : function() { var t = this, r = t.getRng(), s = t.getSel(); if (!r || r.item) return false; if (r.compareEndPoints) return r.compareEndPoints('StartToEnd', r) === 0; return !s || r.collapsed; }, collapse : function(to_start) { var self = this, rng = self.getRng(), node; // Control range on IE if (rng.item) { node = rng.item(0); rng = self.win.document.body.createTextRange(); rng.moveToElementText(node); } rng.collapse(!!to_start); self.setRng(rng); }, getSel : function() { var t = this, w = this.win; return w.getSelection ? w.getSelection() : w.document.selection; }, getRng : function(w3c) { var self = this, selection, rng, elm, doc = self.win.document; // Found tridentSel object then we need to use that one if (w3c && self.tridentSel) { return self.tridentSel.getRangeAt(0); } try { if (selection = self.getSel()) { rng = selection.rangeCount > 0 ? selection.getRangeAt(0) : (selection.createRange ? selection.createRange() : doc.createRange()); } } catch (ex) { // IE throws unspecified error here if TinyMCE is placed in a frame/iframe } // We have W3C ranges and it's IE then fake control selection since IE9 doesn't handle that correctly yet if (tinymce.isIE && rng && rng.setStart && doc.selection.createRange().item) { elm = doc.selection.createRange().item(0); rng = doc.createRange(); rng.setStartBefore(elm); rng.setEndAfter(elm); } // No range found then create an empty one // This can occur when the editor is placed in a hidden container element on Gecko // Or on IE when there was an exception if (!rng) { rng = doc.createRange ? doc.createRange() : doc.body.createTextRange(); } // If range is at start of document then move it to start of body if (rng.setStart && rng.startContainer.nodeType === 9 && rng.collapsed) { elm = self.dom.getRoot(); rng.setStart(elm, 0); rng.setEnd(elm, 0); } if (self.selectedRange && self.explicitRange) { if (rng.compareBoundaryPoints(rng.START_TO_START, self.selectedRange) === 0 && rng.compareBoundaryPoints(rng.END_TO_END, self.selectedRange) === 0) { // Safari, Opera and Chrome only ever select text which causes the range to change. // This lets us use the originally set range if the selection hasn't been changed by the user. rng = self.explicitRange; } else { self.selectedRange = null; self.explicitRange = null; } } return rng; }, setRng : function(r, forward) { var s, t = this; if (!t.tridentSel) { s = t.getSel(); if (s) { t.explicitRange = r; try { s.removeAllRanges(); } catch (ex) { // IE9 might throw errors here don't know why } s.addRange(r); // Forward is set to false and we have an extend function if (forward === false && s.extend) { s.collapse(r.endContainer, r.endOffset); s.extend(r.startContainer, r.startOffset); } // adding range isn't always successful so we need to check range count otherwise an exception can occur t.selectedRange = s.rangeCount > 0 ? s.getRangeAt(0) : null; } } else { // Is W3C Range if (r.cloneRange) { try { t.tridentSel.addRange(r); return; } catch (ex) { //IE9 throws an error here if called before selection is placed in the editor } } // Is IE specific range try { r.select(); } catch (ex) { // Needed for some odd IE bug #1843306 } } }, setNode : function(n) { var t = this; t.setContent(t.dom.getOuterHTML(n)); return n; }, getNode : function() { var t = this, rng = t.getRng(), sel = t.getSel(), elm, start = rng.startContainer, end = rng.endContainer; function skipEmptyTextNodes(n, forwards) { var orig = n; while (n && n.nodeType === 3 && n.length === 0) { n = forwards ? n.nextSibling : n.previousSibling; } return n || orig; }; // Range maybe lost after the editor is made visible again if (!rng) return t.dom.getRoot(); if (rng.setStart) { elm = rng.commonAncestorContainer; // Handle selection a image or other control like element such as anchors if (!rng.collapsed) { if (rng.startContainer == rng.endContainer) { if (rng.endOffset - rng.startOffset < 2) { if (rng.startContainer.hasChildNodes()) elm = rng.startContainer.childNodes[rng.startOffset]; } } // If the anchor node is a element instead of a text node then return this element //if (tinymce.isWebKit && sel.anchorNode && sel.anchorNode.nodeType == 1) // return sel.anchorNode.childNodes[sel.anchorOffset]; // Handle cases where the selection is immediately wrapped around a node and return that node instead of it's parent. // This happens when you double click an underlined word in FireFox. if (start.nodeType === 3 && end.nodeType === 3) { if (start.length === rng.startOffset) { start = skipEmptyTextNodes(start.nextSibling, true); } else { start = start.parentNode; } if (rng.endOffset === 0) { end = skipEmptyTextNodes(end.previousSibling, false); } else { end = end.parentNode; } if (start && start === end) return start; } } if (elm && elm.nodeType == 3) return elm.parentNode; return elm; } return rng.item ? rng.item(0) : rng.parentElement(); }, getSelectedBlocks : function(st, en) { var t = this, dom = t.dom, sb, eb, n, bl = []; sb = dom.getParent(st || t.getStart(), dom.isBlock); eb = dom.getParent(en || t.getEnd(), dom.isBlock); if (sb) bl.push(sb); if (sb && eb && sb != eb) { n = sb; var walker = new TreeWalker(sb, dom.getRoot()); while ((n = walker.next()) && n != eb) { if (dom.isBlock(n)) bl.push(n); } } if (eb && sb != eb) bl.push(eb); return bl; }, isForward: function(){ var dom = this.dom, sel = this.getSel(), anchorRange, focusRange; // No support for selection direction then always return true if (!sel || sel.anchorNode == null || sel.focusNode == null) { return true; } anchorRange = dom.createRng(); anchorRange.setStart(sel.anchorNode, sel.anchorOffset); anchorRange.collapse(true); focusRange = dom.createRng(); focusRange.setStart(sel.focusNode, sel.focusOffset); focusRange.collapse(true); return anchorRange.compareBoundaryPoints(anchorRange.START_TO_START, focusRange) <= 0; }, normalize : function() { var self = this, rng, normalized, collapsed, node, sibling; function normalizeEndPoint(start) { var container, offset, walker, dom = self.dom, body = dom.getRoot(), node, nonEmptyElementsMap, nodeName; function hasBrBeforeAfter(node, left) { var walker = new TreeWalker(node, dom.getParent(node.parentNode, dom.isBlock) || body); while (node = walker[left ? 'prev' : 'next']()) { if (node.nodeName === "BR") { return true; } } }; // Walks the dom left/right to find a suitable text node to move the endpoint into // It will only walk within the current parent block or body and will stop if it hits a block or a BR/IMG function findTextNodeRelative(left, startNode) { var walker, lastInlineElement; startNode = startNode || container; walker = new TreeWalker(startNode, dom.getParent(startNode.parentNode, dom.isBlock) || body); // Walk left until we hit a text node we can move to or a block/br/img while (node = walker[left ? 'prev' : 'next']()) { // Found text node that has a length if (node.nodeType === 3 && node.nodeValue.length > 0) { container = node; offset = left ? node.nodeValue.length : 0; normalized = true; return; } // Break if we find a block or a BR/IMG/INPUT etc if (dom.isBlock(node) || nonEmptyElementsMap[node.nodeName.toLowerCase()]) { return; } lastInlineElement = node; } // Only fetch the last inline element when in caret mode for now if (collapsed && lastInlineElement) { container = lastInlineElement; normalized = true; offset = 0; } }; container = rng[(start ? 'start' : 'end') + 'Container']; offset = rng[(start ? 'start' : 'end') + 'Offset']; nonEmptyElementsMap = dom.schema.getNonEmptyElements(); // If the container is a document move it to the body element if (container.nodeType === 9) { container = dom.getRoot(); offset = 0; } // If the container is body try move it into the closest text node or position if (container === body) { // If start is before/after a image, table etc if (start) { node = container.childNodes[offset > 0 ? offset - 1 : 0]; if (node) { nodeName = node.nodeName.toLowerCase(); if (nonEmptyElementsMap[node.nodeName] || node.nodeName == "TABLE") { return; } } } // Resolve the index if (container.hasChildNodes()) { container = container.childNodes[Math.min(!start && offset > 0 ? offset - 1 : offset, container.childNodes.length - 1)]; offset = 0; // Don't walk into elements that doesn't have any child nodes like a IMG if (container.hasChildNodes() && !/TABLE/.test(container.nodeName)) { // Walk the DOM to find a text node to place the caret at or a BR node = container; walker = new TreeWalker(container, body); do { // Found a text node use that position if (node.nodeType === 3 && node.nodeValue.length > 0) { offset = start ? 0 : node.nodeValue.length; container = node; normalized = true; break; } // Found a BR/IMG element that we can place the caret before if (nonEmptyElementsMap[node.nodeName.toLowerCase()]) { offset = dom.nodeIndex(node); container = node.parentNode; // Put caret after image when moving the end point if (node.nodeName == "IMG" && !start) { offset++; } normalized = true; break; } } while (node = (start ? walker.next() : walker.prev())); } } } // Lean the caret to the left if possible if (collapsed) { // So this: x|x // Becomes: x|x // Seems that only gecko has issues with this if (container.nodeType === 3 && offset === 0) { findTextNodeRelative(true); } // Lean left into empty inline elements when the caret is before a BR // So this: |
        // Becomes: |
        // Seems that only gecko has issues with this if (container.nodeType === 1) { node = container.childNodes[offset]; if(node && node.nodeName === 'BR' && !hasBrBeforeAfter(node) && !hasBrBeforeAfter(node, true)) { findTextNodeRelative(true, container.childNodes[offset]); } } } // Lean the start of the selection right if possible // So this: x[x] // Becomes: x[x] if (start && !collapsed && container.nodeType === 3 && offset === container.nodeValue.length) { findTextNodeRelative(false); } // Set endpoint if it was normalized if (normalized) rng['set' + (start ? 'Start' : 'End')](container, offset); }; // Normalize only on non IE browsers for now if (tinymce.isIE) return; rng = self.getRng(); collapsed = rng.collapsed; // Normalize the end points normalizeEndPoint(true); if (!collapsed) normalizeEndPoint(); // Set the selection if it was normalized if (normalized) { // If it was collapsed then make sure it still is if (collapsed) { rng.collapse(true); } //console.log(self.dom.dumpRng(rng)); self.setRng(rng, self.isForward()); } }, selectorChanged: function(selector, callback) { var self = this, currentSelectors; if (!self.selectorChangedData) { self.selectorChangedData = {}; currentSelectors = {}; self.editor.onNodeChange.addToTop(function(ed, cm, node) { var dom = self.dom, parents = dom.getParents(node, null, dom.getRoot()), matchedSelectors = {}; // Check for new matching selectors each(self.selectorChangedData, function(callbacks, selector) { each(parents, function(node) { if (dom.is(node, selector)) { if (!currentSelectors[selector]) { // Execute callbacks each(callbacks, function(callback) { callback(true, {node: node, selector: selector, parents: parents}); }); currentSelectors[selector] = callbacks; } matchedSelectors[selector] = callbacks; return false; } }); }); // Check if current selectors still match each(currentSelectors, function(callbacks, selector) { if (!matchedSelectors[selector]) { delete currentSelectors[selector]; each(callbacks, function(callback) { callback(false, {node: node, selector: selector, parents: parents}); }); } }); }); } // Add selector listeners if (!self.selectorChangedData[selector]) { self.selectorChangedData[selector] = []; } self.selectorChangedData[selector].push(callback); return self; }, destroy : function(manual) { var self = this; self.win = null; // Manual destroy then remove unload handler if (!manual) tinymce.removeUnload(self.destroy); }, // IE has an issue where you can't select/move the caret by clicking outside the body if the document is in standards mode _fixIESelection : function() { var dom = this.dom, doc = dom.doc, body = doc.body, started, startRng, htmlElm; // Return range from point or null if it failed function rngFromPoint(x, y) { var rng = body.createTextRange(); try { rng.moveToPoint(x, y); } catch (ex) { // IE sometimes throws and exception, so lets just ignore it rng = null; } return rng; }; // Fires while the selection is changing function selectionChange(e) { var pointRng; // Check if the button is down or not if (e.button) { // Create range from mouse position pointRng = rngFromPoint(e.x, e.y); if (pointRng) { // Check if pointRange is before/after selection then change the endPoint if (pointRng.compareEndPoints('StartToStart', startRng) > 0) pointRng.setEndPoint('StartToStart', startRng); else pointRng.setEndPoint('EndToEnd', startRng); pointRng.select(); } } else endSelection(); } // Removes listeners function endSelection() { var rng = doc.selection.createRange(); // If the range is collapsed then use the last start range if (startRng && !rng.item && rng.compareEndPoints('StartToEnd', rng) === 0) startRng.select(); dom.unbind(doc, 'mouseup', endSelection); dom.unbind(doc, 'mousemove', selectionChange); startRng = started = 0; }; // Make HTML element unselectable since we are going to handle selection by hand doc.documentElement.unselectable = true; // Detect when user selects outside BODY dom.bind(doc, ['mousedown', 'contextmenu'], function(e) { if (e.target.nodeName === 'HTML') { if (started) endSelection(); // Detect vertical scrollbar, since IE will fire a mousedown on the scrollbar and have target set as HTML htmlElm = doc.documentElement; if (htmlElm.scrollHeight > htmlElm.clientHeight) return; started = 1; // Setup start position startRng = rngFromPoint(e.x, e.y); if (startRng) { // Listen for selection change events dom.bind(doc, 'mouseup', endSelection); dom.bind(doc, 'mousemove', selectionChange); dom.win.focus(); startRng.select(); } } }); } }); })(tinymce); (function(tinymce) { tinymce.dom.Serializer = function(settings, dom, schema) { var onPreProcess, onPostProcess, isIE = tinymce.isIE, each = tinymce.each, htmlParser; // Support the old apply_source_formatting option if (!settings.apply_source_formatting) settings.indent = false; // Default DOM and Schema if they are undefined dom = dom || tinymce.DOM; schema = schema || new tinymce.html.Schema(settings); settings.entity_encoding = settings.entity_encoding || 'named'; settings.remove_trailing_brs = "remove_trailing_brs" in settings ? settings.remove_trailing_brs : true; onPreProcess = new tinymce.util.Dispatcher(self); onPostProcess = new tinymce.util.Dispatcher(self); htmlParser = new tinymce.html.DomParser(settings, schema); // Convert move data-mce-src, data-mce-href and data-mce-style into nodes or process them if needed htmlParser.addAttributeFilter('src,href,style', function(nodes, name) { var i = nodes.length, node, value, internalName = 'data-mce-' + name, urlConverter = settings.url_converter, urlConverterScope = settings.url_converter_scope, undef; while (i--) { node = nodes[i]; value = node.attributes.map[internalName]; if (value !== undef) { // Set external name to internal value and remove internal node.attr(name, value.length > 0 ? value : null); node.attr(internalName, null); } else { // No internal attribute found then convert the value we have in the DOM value = node.attributes.map[name]; if (name === "style") value = dom.serializeStyle(dom.parseStyle(value), node.name); else if (urlConverter) value = urlConverter.call(urlConverterScope, value, name, node.name); node.attr(name, value.length > 0 ? value : null); } } }); // Remove internal classes mceItem<..> or mceSelected htmlParser.addAttributeFilter('class', function(nodes, name) { var i = nodes.length, node, value; while (i--) { node = nodes[i]; value = node.attr('class').replace(/(?:^|\s)mce(Item\w+|Selected)(?!\S)/g, ''); node.attr('class', value.length > 0 ? value : null); } }); // Remove bookmark elements htmlParser.addAttributeFilter('data-mce-type', function(nodes, name, args) { var i = nodes.length, node; while (i--) { node = nodes[i]; if (node.attributes.map['data-mce-type'] === 'bookmark' && !args.cleanup) node.remove(); } }); // Remove expando attributes htmlParser.addAttributeFilter('data-mce-expando', function(nodes, name, args) { var i = nodes.length; while (i--) { nodes[i].attr(name, null); } }); // Force script into CDATA sections and remove the mce- prefix also add comments around styles htmlParser.addNodeFilter('script,style', function(nodes, name) { var i = nodes.length, node, value; function trim(value) { return value.replace(/()/g, '\n') .replace(/^[\r\n]*|[\r\n]*$/g, '') .replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g, ''); }; while (i--) { node = nodes[i]; value = node.firstChild ? node.firstChild.value : ''; if (name === "script") { // Remove mce- prefix from script elements node.attr('type', (node.attr('type') || 'text/javascript').replace(/^mce\-/, '')); if (value.length > 0) node.firstChild.value = '// '; } else { if (value.length > 0) node.firstChild.value = ''; } } }); // Convert comments to cdata and handle protected comments htmlParser.addNodeFilter('#comment', function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; if (node.value.indexOf('[CDATA[') === 0) { node.name = '#cdata'; node.type = 4; node.value = node.value.replace(/^\[CDATA\[|\]\]$/g, ''); } else if (node.value.indexOf('mce:protected ') === 0) { node.name = "#text"; node.type = 3; node.raw = true; node.value = unescape(node.value).substr(14); } } }); htmlParser.addNodeFilter('xml:namespace,input', function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; if (node.type === 7) node.remove(); else if (node.type === 1) { if (name === "input" && !("type" in node.attributes.map)) node.attr('type', 'text'); } } }); // Fix list elements, TODO: Replace this later if (settings.fix_list_elements) { htmlParser.addNodeFilter('ul,ol', function(nodes, name) { var i = nodes.length, node, parentNode; while (i--) { node = nodes[i]; parentNode = node.parent; if (parentNode.name === 'ul' || parentNode.name === 'ol') { if (node.prev && node.prev.name === 'li') { node.prev.append(node); } } } }); } // Remove internal data attributes htmlParser.addAttributeFilter('data-mce-src,data-mce-href,data-mce-style', function(nodes, name) { var i = nodes.length; while (i--) { nodes[i].attr(name, null); } }); // Return public methods return { schema : schema, addNodeFilter : htmlParser.addNodeFilter, addAttributeFilter : htmlParser.addAttributeFilter, onPreProcess : onPreProcess, onPostProcess : onPostProcess, serialize : function(node, args) { var impl, doc, oldDoc, htmlSerializer, content; // Explorer won't clone contents of script and style and the // selected index of select elements are cleared on a clone operation. if (isIE && dom.select('script,style,select,map').length > 0) { content = node.innerHTML; node = node.cloneNode(false); dom.setHTML(node, content); } else node = node.cloneNode(true); // Nodes needs to be attached to something in WebKit/Opera // Older builds of Opera crashes if you attach the node to an document created dynamically // and since we can't feature detect a crash we need to sniff the acutal build number // This fix will make DOM ranges and make Sizzle happy! impl = node.ownerDocument.implementation; if (impl.createHTMLDocument) { // Create an empty HTML document doc = impl.createHTMLDocument(""); // Add the element or it's children if it's a body element to the new document each(node.nodeName == 'BODY' ? node.childNodes : [node], function(node) { doc.body.appendChild(doc.importNode(node, true)); }); // Grab first child or body element for serialization if (node.nodeName != 'BODY') node = doc.body.firstChild; else node = doc.body; // set the new document in DOMUtils so createElement etc works oldDoc = dom.doc; dom.doc = doc; } args = args || {}; args.format = args.format || 'html'; // Pre process if (!args.no_events) { args.node = node; onPreProcess.dispatch(self, args); } // Setup serializer htmlSerializer = new tinymce.html.Serializer(settings, schema); // Parse and serialize HTML args.content = htmlSerializer.serialize( htmlParser.parse(tinymce.trim(args.getInner ? node.innerHTML : dom.getOuterHTML(node)), args) ); // Replace all BOM characters for now until we can find a better solution if (!args.cleanup) args.content = args.content.replace(/\uFEFF|\u200B/g, ''); // Post process if (!args.no_events) onPostProcess.dispatch(self, args); // Restore the old document if it was changed if (oldDoc) dom.doc = oldDoc; args.node = null; return args.content; }, addRules : function(rules) { schema.addValidElements(rules); }, setRules : function(rules) { schema.setValidElements(rules); } }; }; })(tinymce); (function(tinymce) { tinymce.dom.ScriptLoader = function(settings) { var QUEUED = 0, LOADING = 1, LOADED = 2, states = {}, queue = [], scriptLoadedCallbacks = {}, queueLoadedCallbacks = [], loading = 0, undef; function loadScript(url, callback) { var t = this, dom = tinymce.DOM, elm, uri, loc, id; // Execute callback when script is loaded function done() { dom.remove(id); if (elm) elm.onreadystatechange = elm.onload = elm = null; callback(); }; function error() { // Report the error so it's easier for people to spot loading errors if (typeof(console) !== "undefined" && console.log) console.log("Failed to load: " + url); // We can't mark it as done if there is a load error since // A) We don't want to produce 404 errors on the server and // B) the onerror event won't fire on all browsers. // done(); }; id = dom.uniqueId(); if (tinymce.isIE6) { uri = new tinymce.util.URI(url); loc = location; // If script is from same domain and we // use IE 6 then use XHR since it's more reliable if (uri.host == loc.hostname && uri.port == loc.port && (uri.protocol + ':') == loc.protocol && uri.protocol.toLowerCase() != 'file') { tinymce.util.XHR.send({ url : tinymce._addVer(uri.getURI()), success : function(content) { // Create new temp script element var script = dom.create('script', { type : 'text/javascript' }); // Evaluate script in global scope script.text = content; document.getElementsByTagName('head')[0].appendChild(script); dom.remove(script); done(); }, error : error }); return; } } // Create new script element elm = document.createElement('script'); elm.id = id; elm.type = 'text/javascript'; elm.src = tinymce._addVer(url); // Add onload listener for non IE browsers since IE9 // fires onload event before the script is parsed and executed if (!tinymce.isIE) elm.onload = done; // Add onerror event will get fired on some browsers but not all of them elm.onerror = error; // Opera 9.60 doesn't seem to fire the onreadystate event at correctly if (!tinymce.isOpera) { elm.onreadystatechange = function() { var state = elm.readyState; // Loaded state is passed on IE 6 however there // are known issues with this method but we can't use // XHR in a cross domain loading if (state == 'complete' || state == 'loaded') done(); }; } // Most browsers support this feature so we report errors // for those at least to help users track their missing plugins etc // todo: Removed since it produced error if the document is unloaded by navigating away, re-add it as an option /*elm.onerror = function() { alert('Failed to load: ' + url); };*/ // Add script to document (document.getElementsByTagName('head')[0] || document.body).appendChild(elm); }; this.isDone = function(url) { return states[url] == LOADED; }; this.markDone = function(url) { states[url] = LOADED; }; this.add = this.load = function(url, callback, scope) { var item, state = states[url]; // Add url to load queue if (state == undef) { queue.push(url); states[url] = QUEUED; } if (callback) { // Store away callback for later execution if (!scriptLoadedCallbacks[url]) scriptLoadedCallbacks[url] = []; scriptLoadedCallbacks[url].push({ func : callback, scope : scope || this }); } }; this.loadQueue = function(callback, scope) { this.loadScripts(queue, callback, scope); }; this.loadScripts = function(scripts, callback, scope) { var loadScripts; function execScriptLoadedCallbacks(url) { // Execute URL callback functions tinymce.each(scriptLoadedCallbacks[url], function(callback) { callback.func.call(callback.scope); }); scriptLoadedCallbacks[url] = undef; }; queueLoadedCallbacks.push({ func : callback, scope : scope || this }); loadScripts = function() { var loadingScripts = tinymce.grep(scripts); // Current scripts has been handled scripts.length = 0; // Load scripts that needs to be loaded tinymce.each(loadingScripts, function(url) { // Script is already loaded then execute script callbacks directly if (states[url] == LOADED) { execScriptLoadedCallbacks(url); return; } // Is script not loading then start loading it if (states[url] != LOADING) { states[url] = LOADING; loading++; loadScript(url, function() { states[url] = LOADED; loading--; execScriptLoadedCallbacks(url); // Load more scripts if they where added by the recently loaded script loadScripts(); }); } }); // No scripts are currently loading then execute all pending queue loaded callbacks if (!loading) { tinymce.each(queueLoadedCallbacks, function(callback) { callback.func.call(callback.scope); }); queueLoadedCallbacks.length = 0; } }; loadScripts(); }; }; // Global script loader tinymce.ScriptLoader = new tinymce.dom.ScriptLoader(); })(tinymce); (function(tinymce) { tinymce.dom.RangeUtils = function(dom) { var INVISIBLE_CHAR = '\uFEFF'; this.walk = function(rng, callback) { var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset, ancestor, startPoint, endPoint, node, parent, siblings, nodes; // Handle table cell selection the table plugin enables // you to fake select table cells and perform formatting actions on them nodes = dom.select('td.mceSelected,th.mceSelected'); if (nodes.length > 0) { tinymce.each(nodes, function(node) { callback([node]); }); return; } function exclude(nodes) { var node; // First node is excluded node = nodes[0]; if (node.nodeType === 3 && node === startContainer && startOffset >= node.nodeValue.length) { nodes.splice(0, 1); } // Last node is excluded node = nodes[nodes.length - 1]; if (endOffset === 0 && nodes.length > 0 && node === endContainer && node.nodeType === 3) { nodes.splice(nodes.length - 1, 1); } return nodes; }; function collectSiblings(node, name, end_node) { var siblings = []; for (; node && node != end_node; node = node[name]) siblings.push(node); return siblings; }; function findEndPoint(node, root) { do { if (node.parentNode == root) return node; node = node.parentNode; } while(node); }; function walkBoundary(start_node, end_node, next) { var siblingName = next ? 'nextSibling' : 'previousSibling'; for (node = start_node, parent = node.parentNode; node && node != end_node; node = parent) { parent = node.parentNode; siblings = collectSiblings(node == start_node ? node : node[siblingName], siblingName); if (siblings.length) { if (!next) siblings.reverse(); callback(exclude(siblings)); } } }; // If index based start position then resolve it if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) startContainer = startContainer.childNodes[startOffset]; // If index based end position then resolve it if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) endContainer = endContainer.childNodes[Math.min(endOffset - 1, endContainer.childNodes.length - 1)]; // Same container if (startContainer == endContainer) return callback(exclude([startContainer])); // Find common ancestor and end points ancestor = dom.findCommonAncestor(startContainer, endContainer); // Process left side for (node = startContainer; node; node = node.parentNode) { if (node === endContainer) return walkBoundary(startContainer, ancestor, true); if (node === ancestor) break; } // Process right side for (node = endContainer; node; node = node.parentNode) { if (node === startContainer) return walkBoundary(endContainer, ancestor); if (node === ancestor) break; } // Find start/end point startPoint = findEndPoint(startContainer, ancestor) || startContainer; endPoint = findEndPoint(endContainer, ancestor) || endContainer; // Walk left leaf walkBoundary(startContainer, startPoint, true); // Walk the middle from start to end point siblings = collectSiblings( startPoint == startContainer ? startPoint : startPoint.nextSibling, 'nextSibling', endPoint == endContainer ? endPoint.nextSibling : endPoint ); if (siblings.length) callback(exclude(siblings)); // Walk right leaf walkBoundary(endContainer, endPoint); }; this.split = function(rng) { var startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset; function splitText(node, offset) { return node.splitText(offset); }; // Handle single text node if (startContainer == endContainer && startContainer.nodeType == 3) { if (startOffset > 0 && startOffset < startContainer.nodeValue.length) { endContainer = splitText(startContainer, startOffset); startContainer = endContainer.previousSibling; if (endOffset > startOffset) { endOffset = endOffset - startOffset; startContainer = endContainer = splitText(endContainer, endOffset).previousSibling; endOffset = endContainer.nodeValue.length; startOffset = 0; } else { endOffset = 0; } } } else { // Split startContainer text node if needed if (startContainer.nodeType == 3 && startOffset > 0 && startOffset < startContainer.nodeValue.length) { startContainer = splitText(startContainer, startOffset); startOffset = 0; } // Split endContainer text node if needed if (endContainer.nodeType == 3 && endOffset > 0 && endOffset < endContainer.nodeValue.length) { endContainer = splitText(endContainer, endOffset).previousSibling; endOffset = endContainer.nodeValue.length; } } return { startContainer : startContainer, startOffset : startOffset, endContainer : endContainer, endOffset : endOffset }; }; }; tinymce.dom.RangeUtils.compareRanges = function(rng1, rng2) { if (rng1 && rng2) { // Compare native IE ranges if (rng1.item || rng1.duplicate) { // Both are control ranges and the selected element matches if (rng1.item && rng2.item && rng1.item(0) === rng2.item(0)) return true; // Both are text ranges and the range matches if (rng1.isEqual && rng2.isEqual && rng2.isEqual(rng1)) return true; } else { // Compare w3c ranges return rng1.startContainer == rng2.startContainer && rng1.startOffset == rng2.startOffset; } } return false; }; })(tinymce); (function(tinymce) { var Event = tinymce.dom.Event, each = tinymce.each; tinymce.create('tinymce.ui.KeyboardNavigation', { KeyboardNavigation: function(settings, dom) { var t = this, root = settings.root, items = settings.items, enableUpDown = settings.enableUpDown, enableLeftRight = settings.enableLeftRight || !settings.enableUpDown, excludeFromTabOrder = settings.excludeFromTabOrder, itemFocussed, itemBlurred, rootKeydown, rootFocussed, focussedId; dom = dom || tinymce.DOM; itemFocussed = function(evt) { focussedId = evt.target.id; }; itemBlurred = function(evt) { dom.setAttrib(evt.target.id, 'tabindex', '-1'); }; rootFocussed = function(evt) { var item = dom.get(focussedId); dom.setAttrib(item, 'tabindex', '0'); item.focus(); }; t.focus = function() { dom.get(focussedId).focus(); }; t.destroy = function() { each(items, function(item) { var elm = dom.get(item.id); dom.unbind(elm, 'focus', itemFocussed); dom.unbind(elm, 'blur', itemBlurred); }); var rootElm = dom.get(root); dom.unbind(rootElm, 'focus', rootFocussed); dom.unbind(rootElm, 'keydown', rootKeydown); items = dom = root = t.focus = itemFocussed = itemBlurred = rootKeydown = rootFocussed = null; t.destroy = function() {}; }; t.moveFocus = function(dir, evt) { var idx = -1, controls = t.controls, newFocus; if (!focussedId) return; each(items, function(item, index) { if (item.id === focussedId) { idx = index; return false; } }); idx += dir; if (idx < 0) { idx = items.length - 1; } else if (idx >= items.length) { idx = 0; } newFocus = items[idx]; dom.setAttrib(focussedId, 'tabindex', '-1'); dom.setAttrib(newFocus.id, 'tabindex', '0'); dom.get(newFocus.id).focus(); if (settings.actOnFocus) { settings.onAction(newFocus.id); } if (evt) Event.cancel(evt); }; rootKeydown = function(evt) { var DOM_VK_LEFT = 37, DOM_VK_RIGHT = 39, DOM_VK_UP = 38, DOM_VK_DOWN = 40, DOM_VK_ESCAPE = 27, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_SPACE = 32; switch (evt.keyCode) { case DOM_VK_LEFT: if (enableLeftRight) t.moveFocus(-1); break; case DOM_VK_RIGHT: if (enableLeftRight) t.moveFocus(1); break; case DOM_VK_UP: if (enableUpDown) t.moveFocus(-1); break; case DOM_VK_DOWN: if (enableUpDown) t.moveFocus(1); break; case DOM_VK_ESCAPE: if (settings.onCancel) { settings.onCancel(); Event.cancel(evt); } break; case DOM_VK_ENTER: case DOM_VK_RETURN: case DOM_VK_SPACE: if (settings.onAction) { settings.onAction(focussedId); Event.cancel(evt); } break; } }; // Set up state and listeners for each item. each(items, function(item, idx) { var tabindex, elm; if (!item.id) { item.id = dom.uniqueId('_mce_item_'); } elm = dom.get(item.id); if (excludeFromTabOrder) { dom.bind(elm, 'blur', itemBlurred); tabindex = '-1'; } else { tabindex = (idx === 0 ? '0' : '-1'); } elm.setAttribute('tabindex', tabindex); dom.bind(elm, 'focus', itemFocussed); }); // Setup initial state for root element. if (items[0]){ focussedId = items[0].id; } dom.setAttrib(root, 'tabindex', '-1'); // Setup listeners for root element. var rootElm = dom.get(root); dom.bind(rootElm, 'focus', rootFocussed); dom.bind(rootElm, 'keydown', rootKeydown); } }); })(tinymce); (function(tinymce) { // Shorten class names var DOM = tinymce.DOM, is = tinymce.is; tinymce.create('tinymce.ui.Control', { Control : function(id, s, editor) { this.id = id; this.settings = s = s || {}; this.rendered = false; this.onRender = new tinymce.util.Dispatcher(this); this.classPrefix = ''; this.scope = s.scope || this; this.disabled = 0; this.active = 0; this.editor = editor; }, setAriaProperty : function(property, value) { var element = DOM.get(this.id + '_aria') || DOM.get(this.id); if (element) { DOM.setAttrib(element, 'aria-' + property, !!value); } }, focus : function() { DOM.get(this.id).focus(); }, setDisabled : function(s) { if (s != this.disabled) { this.setAriaProperty('disabled', s); this.setState('Disabled', s); this.setState('Enabled', !s); this.disabled = s; } }, isDisabled : function() { return this.disabled; }, setActive : function(s) { if (s != this.active) { this.setState('Active', s); this.active = s; this.setAriaProperty('pressed', s); } }, isActive : function() { return this.active; }, setState : function(c, s) { var n = DOM.get(this.id); c = this.classPrefix + c; if (s) DOM.addClass(n, c); else DOM.removeClass(n, c); }, isRendered : function() { return this.rendered; }, renderHTML : function() { }, renderTo : function(n) { DOM.setHTML(n, this.renderHTML()); }, postRender : function() { var t = this, b; // Set pending states if (is(t.disabled)) { b = t.disabled; t.disabled = -1; t.setDisabled(b); } if (is(t.active)) { b = t.active; t.active = -1; t.setActive(b); } }, remove : function() { DOM.remove(this.id); this.destroy(); }, destroy : function() { tinymce.dom.Event.clear(this.id); } }); })(tinymce); tinymce.create('tinymce.ui.Container:tinymce.ui.Control', { Container : function(id, s, editor) { this.parent(id, s, editor); this.controls = []; this.lookup = {}; }, add : function(c) { this.lookup[c.id] = c; this.controls.push(c); return c; }, get : function(n) { return this.lookup[n]; } }); tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', { Separator : function(id, s) { this.parent(id, s); this.classPrefix = 'mceSeparator'; this.setDisabled(true); }, renderHTML : function() { return tinymce.DOM.createHTML('span', {'class' : this.classPrefix, role : 'separator', 'aria-orientation' : 'vertical', tabindex : '-1'}); } }); (function(tinymce) { var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', { MenuItem : function(id, s) { this.parent(id, s); this.classPrefix = 'mceMenuItem'; }, setSelected : function(s) { this.setState('Selected', s); this.setAriaProperty('checked', !!s); this.selected = s; }, isSelected : function() { return this.selected; }, postRender : function() { var t = this; t.parent(); // Set pending state if (is(t.selected)) t.setSelected(t.selected); } }); })(tinymce); (function(tinymce) { var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk; tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', { Menu : function(id, s) { var t = this; t.parent(id, s); t.items = {}; t.collapsed = false; t.menuCount = 0; t.onAddItem = new tinymce.util.Dispatcher(this); }, expand : function(d) { var t = this; if (d) { walk(t, function(o) { if (o.expand) o.expand(); }, 'items', t); } t.collapsed = false; }, collapse : function(d) { var t = this; if (d) { walk(t, function(o) { if (o.collapse) o.collapse(); }, 'items', t); } t.collapsed = true; }, isCollapsed : function() { return this.collapsed; }, add : function(o) { if (!o.settings) o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o); this.onAddItem.dispatch(this, o); return this.items[o.id] = o; }, addSeparator : function() { return this.add({separator : true}); }, addMenu : function(o) { if (!o.collapse) o = this.createMenu(o); this.menuCount++; return this.add(o); }, hasMenus : function() { return this.menuCount !== 0; }, remove : function(o) { delete this.items[o.id]; }, removeAll : function() { var t = this; walk(t, function(o) { if (o.removeAll) o.removeAll(); else o.remove(); o.destroy(); }, 'items', t); t.items = {}; }, createMenu : function(o) { var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o); m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem); return m; } }); })(tinymce); (function(tinymce) { var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element; tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', { DropMenu : function(id, s) { s = s || {}; s.container = s.container || DOM.doc.body; s.offset_x = s.offset_x || 0; s.offset_y = s.offset_y || 0; s.vp_offset_x = s.vp_offset_x || 0; s.vp_offset_y = s.vp_offset_y || 0; if (is(s.icons) && !s.icons) s['class'] += ' mceNoIcons'; this.parent(id, s); this.onShowMenu = new tinymce.util.Dispatcher(this); this.onHideMenu = new tinymce.util.Dispatcher(this); this.classPrefix = 'mceMenu'; }, createMenu : function(s) { var t = this, cs = t.settings, m; s.container = s.container || cs.container; s.parent = t; s.constrain = s.constrain || cs.constrain; s['class'] = s['class'] || cs['class']; s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x; s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y; s.keyboard_focus = cs.keyboard_focus; m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s); m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem); return m; }, focus : function() { var t = this; if (t.keyboardNav) { t.keyboardNav.focus(); } }, update : function() { var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th; tw = s.max_width ? Math.min(tb.offsetWidth, s.max_width) : tb.offsetWidth; th = s.max_height ? Math.min(tb.offsetHeight, s.max_height) : tb.offsetHeight; if (!DOM.boxModel) t.element.setStyles({width : tw + 2, height : th + 2}); else t.element.setStyles({width : tw, height : th}); if (s.max_width) DOM.setStyle(co, 'width', tw); if (s.max_height) { DOM.setStyle(co, 'height', th); if (tb.clientHeight < s.max_height) DOM.setStyle(co, 'overflow', 'hidden'); } }, showMenu : function(x, y, px) { var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix; t.collapse(1); if (t.isMenuVisible) return; if (!t.rendered) { co = DOM.add(t.settings.container, t.renderNode()); each(t.items, function(o) { o.postRender(); }); t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); } else co = DOM.get('menu_' + t.id); // Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug if (!tinymce.isOpera) DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF}); DOM.show(co); t.update(); x += s.offset_x || 0; y += s.offset_y || 0; vp.w -= 4; vp.h -= 4; // Move inside viewport if not submenu if (s.constrain) { w = co.clientWidth - ot; h = co.clientHeight - ot; mx = vp.x + vp.w; my = vp.y + vp.h; if ((x + s.vp_offset_x + w) > mx) x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w); if ((y + s.vp_offset_y + h) > my) y = Math.max(0, (my - s.vp_offset_y) - h); } DOM.setStyles(co, {left : x , top : y}); t.element.update(); t.isMenuVisible = 1; t.mouseClickFunc = Event.add(co, 'click', function(e) { var m; e = e.target; if (e && (e = DOM.getParent(e, 'tr')) && !DOM.hasClass(e, cp + 'ItemSub')) { m = t.items[e.id]; if (m.isDisabled()) return; dm = t; while (dm) { if (dm.hideMenu) dm.hideMenu(); dm = dm.settings.parent; } if (m.settings.onclick) m.settings.onclick(e); return false; // Cancel to fix onbeforeunload problem } }); if (t.hasMenus()) { t.mouseOverFunc = Event.add(co, 'mouseover', function(e) { var m, r, mi; e = e.target; if (e && (e = DOM.getParent(e, 'tr'))) { m = t.items[e.id]; if (t.lastMenu) t.lastMenu.collapse(1); if (m.isDisabled()) return; if (e && DOM.hasClass(e, cp + 'ItemSub')) { //p = DOM.getPos(s.container); r = DOM.getRect(e); m.showMenu((r.x + r.w - ot), r.y - ot, r.x); t.lastMenu = m; DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive'); } } }); } Event.add(co, 'keydown', t._keyHandler, t); t.onShowMenu.dispatch(t); if (s.keyboard_focus) { t._setupKeyboardNav(); } }, hideMenu : function(c) { var t = this, co = DOM.get('menu_' + t.id), e; if (!t.isMenuVisible) return; if (t.keyboardNav) t.keyboardNav.destroy(); Event.remove(co, 'mouseover', t.mouseOverFunc); Event.remove(co, 'click', t.mouseClickFunc); Event.remove(co, 'keydown', t._keyHandler); DOM.hide(co); t.isMenuVisible = 0; if (!c) t.collapse(1); if (t.element) t.element.hide(); if (e = DOM.get(t.id)) DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive'); t.onHideMenu.dispatch(t); }, add : function(o) { var t = this, co; o = t.parent(o); if (t.isRendered && (co = DOM.get('menu_' + t.id))) t._add(DOM.select('tbody', co)[0], o); return o; }, collapse : function(d) { this.parent(d); this.hideMenu(1); }, remove : function(o) { DOM.remove(o.id); this.destroy(); return this.parent(o); }, destroy : function() { var t = this, co = DOM.get('menu_' + t.id); if (t.keyboardNav) t.keyboardNav.destroy(); Event.remove(co, 'mouseover', t.mouseOverFunc); Event.remove(DOM.select('a', co), 'focus', t.mouseOverFunc); Event.remove(co, 'click', t.mouseClickFunc); Event.remove(co, 'keydown', t._keyHandler); if (t.element) t.element.remove(); DOM.remove(co); }, renderNode : function() { var t = this, s = t.settings, n, tb, co, w; w = DOM.create('div', {role: 'listbox', id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000;outline:0'}); if (t.settings.parent) { DOM.setAttrib(w, 'aria-parent', 'menu_' + t.settings.parent.id); } co = DOM.add(w, 'div', {role: 'presentation', id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')}); t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container}); if (s.menu_line) DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'}); // n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'}); n = DOM.add(co, 'table', {role: 'presentation', id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0}); tb = DOM.add(n, 'tbody'); each(t.items, function(o) { t._add(tb, o); }); t.rendered = true; return w; }, // Internal functions _setupKeyboardNav : function(){ var contextMenu, menuItems, t=this; contextMenu = DOM.get('menu_' + t.id); menuItems = DOM.select('a[role=option]', 'menu_' + t.id); menuItems.splice(0,0,contextMenu); t.keyboardNav = new tinymce.ui.KeyboardNavigation({ root: 'menu_' + t.id, items: menuItems, onCancel: function() { t.hideMenu(); }, enableUpDown: true }); contextMenu.focus(); }, _keyHandler : function(evt) { var t = this, e; switch (evt.keyCode) { case 37: // Left if (t.settings.parent) { t.hideMenu(); t.settings.parent.focus(); Event.cancel(evt); } break; case 39: // Right if (t.mouseOverFunc) t.mouseOverFunc(evt); break; } }, _add : function(tb, o) { var n, s = o.settings, a, ro, it, cp = this.classPrefix, ic; if (s.separator) { ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'}); DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'}); if (n = ro.previousSibling) DOM.addClass(n, 'mceLast'); return; } n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'}); n = it = DOM.add(n, s.titleItem ? 'th' : 'td'); n = a = DOM.add(n, 'a', {id: o.id + '_aria', role: s.titleItem ? 'presentation' : 'option', href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'}); if (s.parent) { DOM.setAttrib(a, 'aria-haspopup', 'true'); DOM.setAttrib(a, 'aria-owns', 'menu_' + o.id); } DOM.addClass(it, s['class']); // n = DOM.add(n, 'span', {'class' : 'item'}); ic = DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')}); if (s.icon_src) DOM.add(ic, 'img', {src : s.icon_src}); n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title); if (o.settings.style) { if (typeof o.settings.style == "function") o.settings.style = o.settings.style(); DOM.setAttrib(n, 'style', o.settings.style); } if (tb.childNodes.length == 1) DOM.addClass(ro, 'mceFirst'); if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator')) DOM.addClass(ro, 'mceFirst'); if (o.collapse) DOM.addClass(ro, cp + 'ItemSub'); if (n = ro.previousSibling) DOM.removeClass(n, 'mceLast'); DOM.addClass(ro, 'mceLast'); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM; tinymce.create('tinymce.ui.Button:tinymce.ui.Control', { Button : function(id, s, ed) { this.parent(id, s, ed); this.classPrefix = 'mceButton'; }, renderHTML : function() { var cp = this.classPrefix, s = this.settings, h, l; l = DOM.encode(s.label || ''); h = ''; if (s.image && !(this.editor &&this.editor.forcedHighContrastMode) ) h += '' + DOM.encode(s.title) + '' + l; else h += '' + (l ? '' + l + '' : ''); h += ''; h += ''; return h; }, postRender : function() { var t = this, s = t.settings, imgBookmark; // In IE a large image that occupies the entire editor area will be deselected when a button is clicked, so // need to keep the selection in case the selection is lost if (tinymce.isIE && t.editor) { tinymce.dom.Event.add(t.id, 'mousedown', function(e) { var nodeName = t.editor.selection.getNode().nodeName; imgBookmark = nodeName === 'IMG' ? t.editor.selection.getBookmark() : null; }); } tinymce.dom.Event.add(t.id, 'click', function(e) { if (!t.isDisabled()) { // restore the selection in case the selection is lost in IE if (tinymce.isIE && t.editor && imgBookmark !== null) { t.editor.selection.moveToBookmark(imgBookmark); } return s.onclick.call(s.scope, e); } }); tinymce.dom.Event.add(t.id, 'keyup', function(e) { if (!t.isDisabled() && e.keyCode==tinymce.VK.SPACEBAR) return s.onclick.call(s.scope, e); }); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, undef; tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', { ListBox : function(id, s, ed) { var t = this; t.parent(id, s, ed); t.items = []; t.onChange = new Dispatcher(t); t.onPostRender = new Dispatcher(t); t.onAdd = new Dispatcher(t); t.onRenderMenu = new tinymce.util.Dispatcher(this); t.classPrefix = 'mceListBox'; t.marked = {}; }, select : function(va) { var t = this, fv, f; t.marked = {}; if (va == undef) return t.selectByIndex(-1); // Is string or number make function selector if (va && typeof(va)=="function") f = va; else { f = function(v) { return v == va; }; } // Do we need to do something? if (va != t.selectedValue) { // Find item each(t.items, function(o, i) { if (f(o.value)) { fv = 1; t.selectByIndex(i); return false; } }); if (!fv) t.selectByIndex(-1); } }, selectByIndex : function(idx) { var t = this, e, o, label; t.marked = {}; if (idx != t.selectedIndex) { e = DOM.get(t.id + '_text'); label = DOM.get(t.id + '_voiceDesc'); o = t.items[idx]; if (o) { t.selectedValue = o.value; t.selectedIndex = idx; DOM.setHTML(e, DOM.encode(o.title)); DOM.setHTML(label, t.settings.title + " - " + o.title); DOM.removeClass(e, 'mceTitle'); DOM.setAttrib(t.id, 'aria-valuenow', o.title); } else { DOM.setHTML(e, DOM.encode(t.settings.title)); DOM.setHTML(label, DOM.encode(t.settings.title)); DOM.addClass(e, 'mceTitle'); t.selectedValue = t.selectedIndex = null; DOM.setAttrib(t.id, 'aria-valuenow', t.settings.title); } e = 0; } }, mark : function(value) { this.marked[value] = true; }, add : function(n, v, o) { var t = this; o = o || {}; o = tinymce.extend(o, { title : n, value : v }); t.items.push(o); t.onAdd.dispatch(t, o); }, getLength : function() { return this.items.length; }, renderHTML : function() { var h = '', t = this, s = t.settings, cp = t.classPrefix; h = ''; h += ''; h += ''; h += ''; return h; }, showMenu : function() { var t = this, p2, e = DOM.get(this.id), m; if (t.isDisabled() || t.items.length === 0) return; if (t.menu && t.menu.isMenuVisible) return t.hideMenu(); if (!t.isMenuRendered) { t.renderMenu(); t.isMenuRendered = true; } p2 = DOM.getPos(e); m = t.menu; m.settings.offset_x = p2.x; m.settings.offset_y = p2.y; m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy when it comes to auto focus // Select in menu each(t.items, function(o) { if (m.items[o.id]) { m.items[o.id].setSelected(0); } }); each(t.items, function(o) { if (m.items[o.id] && t.marked[o.value]) { m.items[o.id].setSelected(1); } if (o.value === t.selectedValue) { m.items[o.id].setSelected(1); } }); m.showMenu(0, e.clientHeight); Event.add(DOM.doc, 'mousedown', t.hideMenu, t); DOM.addClass(t.id, t.classPrefix + 'Selected'); //DOM.get(t.id + '_text').focus(); }, hideMenu : function(e) { var t = this; if (t.menu && t.menu.isMenuVisible) { DOM.removeClass(t.id, t.classPrefix + 'Selected'); // Prevent double toogles by canceling the mouse click event to the button if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open')) return; if (!e || !DOM.getParent(e.target, '.mceMenu')) { DOM.removeClass(t.id, t.classPrefix + 'Selected'); Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); t.menu.hideMenu(); } } }, renderMenu : function() { var t = this, m; m = t.settings.control_manager.createDropMenu(t.id + '_menu', { menu_line : 1, 'class' : t.classPrefix + 'Menu mceNoIcons', max_width : 250, max_height : 150 }); m.onHideMenu.add(function() { t.hideMenu(); t.focus(); }); m.add({ title : t.settings.title, 'class' : 'mceMenuItemTitle', onclick : function() { if (t.settings.onselect('') !== false) t.select(''); // Must be runned after } }); each(t.items, function(o) { // No value then treat it as a title if (o.value === undef) { m.add({ title : o.title, role : "option", 'class' : 'mceMenuItemTitle', onclick : function() { if (t.settings.onselect('') !== false) t.select(''); // Must be runned after } }); } else { o.id = DOM.uniqueId(); o.role= "option"; o.onclick = function() { if (t.settings.onselect(o.value) !== false) t.select(o.value); // Must be runned after }; m.add(o); } }); t.onRenderMenu.dispatch(t, m); t.menu = m; }, postRender : function() { var t = this, cp = t.classPrefix; Event.add(t.id, 'click', t.showMenu, t); Event.add(t.id, 'keydown', function(evt) { if (evt.keyCode == 32) { // Space t.showMenu(evt); Event.cancel(evt); } }); Event.add(t.id, 'focus', function() { if (!t._focused) { t.keyDownHandler = Event.add(t.id, 'keydown', function(e) { if (e.keyCode == 40) { t.showMenu(); Event.cancel(e); } }); t.keyPressHandler = Event.add(t.id, 'keypress', function(e) { var v; if (e.keyCode == 13) { // Fake select on enter v = t.selectedValue; t.selectedValue = null; // Needs to be null to fake change Event.cancel(e); t.settings.onselect(v); } }); } t._focused = 1; }); Event.add(t.id, 'blur', function() { Event.remove(t.id, 'keydown', t.keyDownHandler); Event.remove(t.id, 'keypress', t.keyPressHandler); t._focused = 0; }); // Old IE doesn't have hover on all elements if (tinymce.isIE6 || !DOM.boxModel) { Event.add(t.id, 'mouseover', function() { if (!DOM.hasClass(t.id, cp + 'Disabled')) DOM.addClass(t.id, cp + 'Hover'); }); Event.add(t.id, 'mouseout', function() { if (!DOM.hasClass(t.id, cp + 'Disabled')) DOM.removeClass(t.id, cp + 'Hover'); }); } t.onPostRender.dispatch(t, DOM.get(t.id)); }, destroy : function() { this.parent(); Event.clear(this.id + '_text'); Event.clear(this.id + '_open'); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, undef; tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', { NativeListBox : function(id, s) { this.parent(id, s); this.classPrefix = 'mceNativeListBox'; }, setDisabled : function(s) { DOM.get(this.id).disabled = s; this.setAriaProperty('disabled', s); }, isDisabled : function() { return DOM.get(this.id).disabled; }, select : function(va) { var t = this, fv, f; if (va == undef) return t.selectByIndex(-1); // Is string or number make function selector if (va && typeof(va)=="function") f = va; else { f = function(v) { return v == va; }; } // Do we need to do something? if (va != t.selectedValue) { // Find item each(t.items, function(o, i) { if (f(o.value)) { fv = 1; t.selectByIndex(i); return false; } }); if (!fv) t.selectByIndex(-1); } }, selectByIndex : function(idx) { DOM.get(this.id).selectedIndex = idx + 1; this.selectedValue = this.items[idx] ? this.items[idx].value : null; }, add : function(n, v, a) { var o, t = this; a = a || {}; a.value = v; if (t.isRendered()) DOM.add(DOM.get(this.id), 'option', a, n); o = { title : n, value : v, attribs : a }; t.items.push(o); t.onAdd.dispatch(t, o); }, getLength : function() { return this.items.length; }, renderHTML : function() { var h, t = this; h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --'); each(t.items, function(it) { h += DOM.createHTML('option', {value : it.value}, it.title); }); h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox', 'aria-labelledby': t.id + '_aria'}, h); h += DOM.createHTML('span', {id : t.id + '_aria', 'style': 'display: none'}, t.settings.title); return h; }, postRender : function() { var t = this, ch, changeListenerAdded = true; t.rendered = true; function onChange(e) { var v = t.items[e.target.selectedIndex - 1]; if (v && (v = v.value)) { t.onChange.dispatch(t, v); if (t.settings.onselect) t.settings.onselect(v); } }; Event.add(t.id, 'change', onChange); // Accessibility keyhandler Event.add(t.id, 'keydown', function(e) { var bf; Event.remove(t.id, 'change', ch); changeListenerAdded = false; bf = Event.add(t.id, 'blur', function() { if (changeListenerAdded) return; changeListenerAdded = true; Event.add(t.id, 'change', onChange); Event.remove(t.id, 'blur', bf); }); //prevent default left and right keys on chrome - so that the keyboard navigation is used. if (tinymce.isWebKit && (e.keyCode==37 ||e.keyCode==39)) { return Event.prevent(e); } if (e.keyCode == 13 || e.keyCode == 32) { onChange(e); return Event.cancel(e); } }); t.onPostRender.dispatch(t, DOM.get(t.id)); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', { MenuButton : function(id, s, ed) { this.parent(id, s, ed); this.onRenderMenu = new tinymce.util.Dispatcher(this); s.menu_container = s.menu_container || DOM.doc.body; }, showMenu : function() { var t = this, p1, p2, e = DOM.get(t.id), m; if (t.isDisabled()) return; if (!t.isMenuRendered) { t.renderMenu(); t.isMenuRendered = true; } if (t.isMenuVisible) return t.hideMenu(); p1 = DOM.getPos(t.settings.menu_container); p2 = DOM.getPos(e); m = t.menu; m.settings.offset_x = p2.x; m.settings.offset_y = p2.y; m.settings.vp_offset_x = p2.x; m.settings.vp_offset_y = p2.y; m.settings.keyboard_focus = t._focused; m.showMenu(0, e.firstChild.clientHeight); Event.add(DOM.doc, 'mousedown', t.hideMenu, t); t.setState('Selected', 1); t.isMenuVisible = 1; }, renderMenu : function() { var t = this, m; m = t.settings.control_manager.createDropMenu(t.id + '_menu', { menu_line : 1, 'class' : this.classPrefix + 'Menu', icons : t.settings.icons }); m.onHideMenu.add(function() { t.hideMenu(); t.focus(); }); t.onRenderMenu.dispatch(t, m); t.menu = m; }, hideMenu : function(e) { var t = this; // Prevent double toogles by canceling the mouse click event to the button if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';})) return; if (!e || !DOM.getParent(e.target, '.mceMenu')) { t.setState('Selected', 0); Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); if (t.menu) t.menu.hideMenu(); } t.isMenuVisible = 0; }, postRender : function() { var t = this, s = t.settings; Event.add(t.id, 'click', function() { if (!t.isDisabled()) { if (s.onclick) s.onclick(t.value); t.showMenu(); } }); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each; tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', { SplitButton : function(id, s, ed) { this.parent(id, s, ed); this.classPrefix = 'mceSplitButton'; }, renderHTML : function() { var h, t = this, s = t.settings, h1; h = ''; if (s.image) h1 = DOM.createHTML('img ', {src : s.image, role: 'presentation', 'class' : 'mceAction ' + s['class']}); else h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, ''); h1 += DOM.createHTML('span', {'class': 'mceVoiceLabel mceIconOnly', id: t.id + '_voice', style: 'display:none;'}, s.title); h += '' + DOM.createHTML('a', {role: 'button', id : t.id + '_action', tabindex: '-1', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']}, ''); h += '' + DOM.createHTML('a', {role: 'button', id : t.id + '_open', tabindex: '-1', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + ''; h += ''; h = DOM.createHTML('table', { role: 'presentation', 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', title : s.title}, h); return DOM.createHTML('div', {id : t.id, role: 'button', tabindex: '0', 'aria-labelledby': t.id + '_voice', 'aria-haspopup': 'true'}, h); }, postRender : function() { var t = this, s = t.settings, activate; if (s.onclick) { activate = function(evt) { if (!t.isDisabled()) { s.onclick(t.value); Event.cancel(evt); } }; Event.add(t.id + '_action', 'click', activate); Event.add(t.id, ['click', 'keydown'], function(evt) { var DOM_VK_SPACE = 32, DOM_VK_ENTER = 14, DOM_VK_RETURN = 13, DOM_VK_UP = 38, DOM_VK_DOWN = 40; if ((evt.keyCode === 32 || evt.keyCode === 13 || evt.keyCode === 14) && !evt.altKey && !evt.ctrlKey && !evt.metaKey) { activate(); Event.cancel(evt); } else if (evt.type === 'click' || evt.keyCode === DOM_VK_DOWN) { t.showMenu(); Event.cancel(evt); } }); } Event.add(t.id + '_open', 'click', function (evt) { t.showMenu(); Event.cancel(evt); }); Event.add([t.id, t.id + '_open'], 'focus', function() {t._focused = 1;}); Event.add([t.id, t.id + '_open'], 'blur', function() {t._focused = 0;}); // Old IE doesn't have hover on all elements if (tinymce.isIE6 || !DOM.boxModel) { Event.add(t.id, 'mouseover', function() { if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) DOM.addClass(t.id, 'mceSplitButtonHover'); }); Event.add(t.id, 'mouseout', function() { if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled')) DOM.removeClass(t.id, 'mceSplitButtonHover'); }); } }, destroy : function() { this.parent(); Event.clear(this.id + '_action'); Event.clear(this.id + '_open'); Event.clear(this.id); } }); })(tinymce); (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each; tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', { ColorSplitButton : function(id, s, ed) { var t = this; t.parent(id, s, ed); t.settings = s = tinymce.extend({ colors : '000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF', grid_width : 8, default_color : '#888888' }, t.settings); t.onShowMenu = new tinymce.util.Dispatcher(t); t.onHideMenu = new tinymce.util.Dispatcher(t); t.value = s.default_color; }, showMenu : function() { var t = this, r, p, e, p2; if (t.isDisabled()) return; if (!t.isMenuRendered) { t.renderMenu(); t.isMenuRendered = true; } if (t.isMenuVisible) return t.hideMenu(); e = DOM.get(t.id); DOM.show(t.id + '_menu'); DOM.addClass(e, 'mceSplitButtonSelected'); p2 = DOM.getPos(e); DOM.setStyles(t.id + '_menu', { left : p2.x, top : p2.y + e.firstChild.clientHeight, zIndex : 200000 }); e = 0; Event.add(DOM.doc, 'mousedown', t.hideMenu, t); t.onShowMenu.dispatch(t); if (t._focused) { t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) { if (e.keyCode == 27) t.hideMenu(); }); DOM.select('a', t.id + '_menu')[0].focus(); // Select first link } t.isMenuVisible = 1; }, hideMenu : function(e) { var t = this; if (t.isMenuVisible) { // Prevent double toogles by canceling the mouse click event to the button if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';})) return; if (!e || !DOM.getParent(e.target, '.mceSplitButtonMenu')) { DOM.removeClass(t.id, 'mceSplitButtonSelected'); Event.remove(DOM.doc, 'mousedown', t.hideMenu, t); Event.remove(t.id + '_menu', 'keydown', t._keyHandler); DOM.hide(t.id + '_menu'); } t.isMenuVisible = 0; t.onHideMenu.dispatch(); } }, renderMenu : function() { var t = this, m, i = 0, s = t.settings, n, tb, tr, w, context; w = DOM.add(s.menu_container, 'div', {role: 'listbox', id : t.id + '_menu', 'class' : s.menu_class + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'}); m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'}); DOM.add(m, 'span', {'class' : 'mceMenuLine'}); n = DOM.add(m, 'table', {role: 'presentation', 'class' : 'mceColorSplitMenu'}); tb = DOM.add(n, 'tbody'); // Generate color grid i = 0; each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) { c = c.replace(/^#/, ''); if (!i--) { tr = DOM.add(tb, 'tr'); i = s.grid_width - 1; } n = DOM.add(tr, 'td'); var settings = { href : 'javascript:;', style : { backgroundColor : '#' + c }, 'title': t.editor.getLang('colors.' + c, c), 'data-mce-color' : '#' + c }; // adding a proper ARIA role = button causes JAWS to read things incorrectly on IE. if (!tinymce.isIE ) { settings.role = 'option'; } n = DOM.add(n, 'a', settings); if (t.editor.forcedHighContrastMode) { n = DOM.add(n, 'canvas', { width: 16, height: 16, 'aria-hidden': 'true' }); if (n.getContext && (context = n.getContext("2d"))) { context.fillStyle = '#' + c; context.fillRect(0, 0, 16, 16); } else { // No point leaving a canvas element around if it's not supported for drawing on anyway. DOM.remove(n); } } }); if (s.more_colors_func) { n = DOM.add(tb, 'tr'); n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'}); n = DOM.add(n, 'a', {role: 'option', id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title); Event.add(n, 'click', function(e) { s.more_colors_func.call(s.more_colors_scope || this); return Event.cancel(e); // Cancel to fix onbeforeunload problem }); } DOM.addClass(m, 'mceColorSplitMenu'); new tinymce.ui.KeyboardNavigation({ root: t.id + '_menu', items: DOM.select('a', t.id + '_menu'), onCancel: function() { t.hideMenu(); t.focus(); } }); // Prevent IE from scrolling and hindering click to occur #4019 Event.add(t.id + '_menu', 'mousedown', function(e) {return Event.cancel(e);}); Event.add(t.id + '_menu', 'click', function(e) { var c; e = DOM.getParent(e.target, 'a', tb); if (e && e.nodeName.toLowerCase() == 'a' && (c = e.getAttribute('data-mce-color'))) t.setColor(c); return false; // Prevent IE auto save warning }); return w; }, setColor : function(c) { this.displayColor(c); this.hideMenu(); this.settings.onselect(c); }, displayColor : function(c) { var t = this; DOM.setStyle(t.id + '_preview', 'backgroundColor', c); t.value = c; }, postRender : function() { var t = this, id = t.id; t.parent(); DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'}); DOM.setStyle(t.id + '_preview', 'backgroundColor', t.value); }, destroy : function() { this.parent(); Event.clear(this.id + '_menu'); Event.clear(this.id + '_more'); DOM.remove(this.id + '_menu'); } }); })(tinymce); (function(tinymce) { // Shorten class names var dom = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event; tinymce.create('tinymce.ui.ToolbarGroup:tinymce.ui.Container', { renderHTML : function() { var t = this, h = [], controls = t.controls, each = tinymce.each, settings = t.settings; h.push('
        '); //TODO: ACC test this out - adding a role = application for getting the landmarks working well. h.push(""); h.push(''); each(controls, function(toolbar) { h.push(toolbar.renderHTML()); }); h.push(""); h.push('
        '); return h.join(''); }, focus : function() { var t = this; dom.get(t.id).focus(); }, postRender : function() { var t = this, items = []; each(t.controls, function(toolbar) { each (toolbar.controls, function(control) { if (control.id) { items.push(control); } }); }); t.keyNav = new tinymce.ui.KeyboardNavigation({ root: t.id, items: items, onCancel: function() { //Move focus if webkit so that navigation back will read the item. if (tinymce.isWebKit) { dom.get(t.editor.id+"_ifr").focus(); } t.editor.focus(); }, excludeFromTabOrder: !t.settings.tab_focus_toolbar }); }, destroy : function() { var self = this; self.parent(); self.keyNav.destroy(); Event.clear(self.id); } }); })(tinymce); (function(tinymce) { // Shorten class names var dom = tinymce.DOM, each = tinymce.each; tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', { renderHTML : function() { var t = this, h = '', c, co, s = t.settings, i, pr, nx, cl; cl = t.controls; for (i=0; i')); } // Add toolbar end before list box and after the previous button // This is to fix the o2k7 editor skins if (pr && co.ListBox) { if (pr.Button || pr.SplitButton) h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '')); } // Render control HTML // IE 8 quick fix, needed to propertly generate a hit area for anchors if (dom.stdMode) h += '' + co.renderHTML() + ''; else h += '' + co.renderHTML() + ''; // Add toolbar start after list box and before the next button // This is to fix the o2k7 editor skins if (nx && co.ListBox) { if (nx.Button || nx.SplitButton) h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '')); } } c = 'mceToolbarEnd'; if (co.Button) c += ' mceToolbarEndButton'; else if (co.SplitButton) c += ' mceToolbarEndSplitButton'; else if (co.ListBox) c += ' mceToolbarEndListBox'; h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '')); return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || '', role: 'presentation', tabindex: '-1'}, '' + h + ''); } }); })(tinymce); (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each; tinymce.create('tinymce.AddOnManager', { AddOnManager : function() { var self = this; self.items = []; self.urls = {}; self.lookup = {}; self.onAdd = new Dispatcher(self); }, get : function(n) { if (this.lookup[n]) { return this.lookup[n].instance; } else { return undefined; } }, dependencies : function(n) { var result; if (this.lookup[n]) { result = this.lookup[n].dependencies; } return result || []; }, requireLangPack : function(n) { var s = tinymce.settings; if (s && s.language && s.language_load !== false) tinymce.ScriptLoader.add(this.urls[n] + '/langs/' + s.language + '.js'); }, add : function(id, o, dependencies) { this.items.push(o); this.lookup[id] = {instance:o, dependencies:dependencies}; this.onAdd.dispatch(this, id, o); return o; }, createUrl: function(baseUrl, dep) { if (typeof dep === "object") { return dep } else { return {prefix: baseUrl.prefix, resource: dep, suffix: baseUrl.suffix}; } }, addComponents: function(pluginName, scripts) { var pluginUrl = this.urls[pluginName]; tinymce.each(scripts, function(script){ tinymce.ScriptLoader.add(pluginUrl+"/"+script); }); }, load : function(n, u, cb, s) { var t = this, url = u; function loadDependencies() { var dependencies = t.dependencies(n); tinymce.each(dependencies, function(dep) { var newUrl = t.createUrl(u, dep); t.load(newUrl.resource, newUrl, undefined, undefined); }); if (cb) { if (s) { cb.call(s); } else { cb.call(tinymce.ScriptLoader); } } } if (t.urls[n]) return; if (typeof u === "object") url = u.prefix + u.resource + u.suffix; if (url.indexOf('/') !== 0 && url.indexOf('://') == -1) url = tinymce.baseURL + '/' + url; t.urls[n] = url.substring(0, url.lastIndexOf('/')); if (t.lookup[n]) { loadDependencies(); } else { tinymce.ScriptLoader.add(url, loadDependencies, s); } } }); // Create plugin and theme managers tinymce.PluginManager = new tinymce.AddOnManager(); tinymce.ThemeManager = new tinymce.AddOnManager(); }(tinymce)); (function(tinymce) { // Shorten names var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, explode = tinymce.explode, Dispatcher = tinymce.util.Dispatcher, undef, instanceCounter = 0; // Setup some URLs where the editor API is located and where the document is tinymce.documentBaseURL = window.location.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, ''); if (!/[\/\\]$/.test(tinymce.documentBaseURL)) tinymce.documentBaseURL += '/'; tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL); tinymce.baseURI = new tinymce.util.URI(tinymce.baseURL); // Add before unload listener // This was required since IE was leaking memory if you added and removed beforeunload listeners // with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event tinymce.onBeforeUnload = new Dispatcher(tinymce); // Must be on window or IE will leak if the editor is placed in frame or iframe Event.add(window, 'beforeunload', function(e) { tinymce.onBeforeUnload.dispatch(tinymce, e); }); tinymce.onAddEditor = new Dispatcher(tinymce); tinymce.onRemoveEditor = new Dispatcher(tinymce); tinymce.EditorManager = extend(tinymce, { editors : [], i18n : {}, activeEditor : null, init : function(s) { var t = this, pl, sl = tinymce.ScriptLoader, e, el = [], ed; function createId(elm) { var id = elm.id; // Use element id, or unique name or generate a unique id if (!id) { id = elm.name; if (id && !DOM.get(id)) { id = elm.name; } else { // Generate unique name id = DOM.uniqueId(); } elm.setAttribute('id', id); } return id; }; function execCallback(se, n, s) { var f = se[n]; if (!f) return; if (tinymce.is(f, 'string')) { s = f.replace(/\.\w+$/, ''); s = s ? tinymce.resolve(s) : 0; f = tinymce.resolve(f); } return f.apply(s || this, Array.prototype.slice.call(arguments, 2)); }; function hasClass(n, c) { return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c); }; t.settings = s; // Legacy call Event.bind(window, 'ready', function() { var l, co; execCallback(s, 'onpageload'); switch (s.mode) { case "exact": l = s.elements || ''; if(l.length > 0) { each(explode(l), function(v) { if (DOM.get(v)) { ed = new tinymce.Editor(v, s); el.push(ed); ed.render(1); } else { each(document.forms, function(f) { each(f.elements, function(e) { if (e.name === v) { v = 'mce_editor_' + instanceCounter++; DOM.setAttrib(e, 'id', v); ed = new tinymce.Editor(v, s); el.push(ed); ed.render(1); } }); }); } }); } break; case "textareas": case "specific_textareas": each(DOM.select('textarea'), function(elm) { if (s.editor_deselector && hasClass(elm, s.editor_deselector)) return; if (!s.editor_selector || hasClass(elm, s.editor_selector)) { ed = new tinymce.Editor(createId(elm), s); el.push(ed); ed.render(1); } }); break; default: if (s.types) { // Process type specific selector each(s.types, function(type) { each(DOM.select(type.selector), function(elm) { var editor = new tinymce.Editor(createId(elm), tinymce.extend({}, s, type)); el.push(editor); editor.render(1); }); }); } else if (s.selector) { // Process global selector each(DOM.select(s.selector), function(elm) { var editor = new tinymce.Editor(createId(elm), s); el.push(editor); editor.render(1); }); } } // Call onInit when all editors are initialized if (s.oninit) { l = co = 0; each(el, function(ed) { co++; if (!ed.initialized) { // Wait for it ed.onInit.add(function() { l++; // All done if (l == co) execCallback(s, 'oninit'); }); } else l++; // All done if (l == co) execCallback(s, 'oninit'); }); } }); }, get : function(id) { if (id === undef) return this.editors; return this.editors[id]; }, getInstanceById : function(id) { return this.get(id); }, add : function(editor) { var self = this, editors = self.editors; // Add named and index editor instance editors[editor.id] = editor; editors.push(editor); self._setActive(editor); self.onAddEditor.dispatch(self, editor); // Patch the tinymce.Editor instance with jQuery adapter logic if (tinymce.adapter) tinymce.adapter.patchEditor(editor); return editor; }, remove : function(editor) { var t = this, i, editors = t.editors; // Not in the collection if (!editors[editor.id]) return null; delete editors[editor.id]; for (i = 0; i < editors.length; i++) { if (editors[i] == editor) { editors.splice(i, 1); break; } } // Select another editor since the active one was removed if (t.activeEditor == editor) t._setActive(editors[0]); editor.destroy(); t.onRemoveEditor.dispatch(t, editor); return editor; }, execCommand : function(c, u, v) { var t = this, ed = t.get(v), w; function clr() { ed.destroy(); w.detachEvent('onunload', clr); w = w.tinyMCE = w.tinymce = null; // IE leak }; // Manager commands switch (c) { case "mceFocus": ed.focus(); return true; case "mceAddEditor": case "mceAddControl": if (!t.get(v)) new tinymce.Editor(v, t.settings).render(); return true; case "mceAddFrameControl": w = v.window; // Add tinyMCE global instance and tinymce namespace to specified window w.tinyMCE = tinyMCE; w.tinymce = tinymce; tinymce.DOM.doc = w.document; tinymce.DOM.win = w; ed = new tinymce.Editor(v.element_id, v); ed.render(); // Fix IE memory leaks if (tinymce.isIE) { w.attachEvent('onunload', clr); } v.page_window = null; return true; case "mceRemoveEditor": case "mceRemoveControl": if (ed) ed.remove(); return true; case 'mceToggleEditor': if (!ed) { t.execCommand('mceAddControl', 0, v); return true; } if (ed.isHidden()) ed.show(); else ed.hide(); return true; } // Run command on active editor if (t.activeEditor) return t.activeEditor.execCommand(c, u, v); return false; }, execInstanceCommand : function(id, c, u, v) { var ed = this.get(id); if (ed) return ed.execCommand(c, u, v); return false; }, triggerSave : function() { each(this.editors, function(e) { e.save(); }); }, addI18n : function(p, o) { var lo, i18n = this.i18n; if (!tinymce.is(p, 'string')) { each(p, function(o, lc) { each(o, function(o, g) { each(o, function(o, k) { if (g === 'common') i18n[lc + '.' + k] = o; else i18n[lc + '.' + g + '.' + k] = o; }); }); }); } else { each(o, function(o, k) { i18n[p + '.' + k] = o; }); } }, // Private methods _setActive : function(editor) { this.selectedInstance = this.activeEditor = editor; } }); })(tinymce); (function(tinymce) { // Shorten these names var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, explode = tinymce.explode; tinymce.create('tinymce.Editor', { Editor : function(id, settings) { var self = this, TRUE = true; self.settings = settings = extend({ id : id, language : 'en', theme : 'advanced', skin : 'default', delta_width : 0, delta_height : 0, popup_css : '', plugins : '', document_base_url : tinymce.documentBaseURL, add_form_submit_trigger : TRUE, submit_patch : TRUE, add_unload_trigger : TRUE, convert_urls : TRUE, relative_urls : TRUE, remove_script_host : TRUE, table_inline_editing : false, object_resizing : TRUE, accessibility_focus : TRUE, doctype : tinymce.isIE6 ? '' : '', // Use old doctype on IE 6 to avoid horizontal scroll visual : TRUE, font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large', font_size_legacy_values : 'xx-small,small,medium,large,x-large,xx-large,300%', // See: http://www.w3.org/TR/CSS2/fonts.html#propdef-font-size apply_source_formatting : TRUE, directionality : 'ltr', forced_root_block : 'p', hidden_input : TRUE, padd_empty_editor : TRUE, render_ui : TRUE, indentation : '30px', fix_table_elements : TRUE, inline_styles : TRUE, convert_fonts_to_spans : TRUE, indent : 'simple', indent_before : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist', indent_after : 'p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist', validate : TRUE, entity_encoding : 'named', url_converter : self.convertURL, url_converter_scope : self, ie7_compat : TRUE }, settings); self.id = self.editorId = id; self.isNotDirty = false; self.plugins = {}; self.documentBaseURI = new tinymce.util.URI(settings.document_base_url || tinymce.documentBaseURL, { base_uri : tinyMCE.baseURI }); self.baseURI = tinymce.baseURI; self.contentCSS = []; // Creates all events like onClick, onSetContent etc see Editor.Events.js for the actual logic self.setupEvents(); // Internal command handler objects self.execCommands = {}; self.queryStateCommands = {}; self.queryValueCommands = {}; // Call setup self.execCallback('setup', self); }, render : function(nst) { var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader; // Page is not loaded yet, wait for it if (!Event.domLoaded) { Event.add(window, 'ready', function() { t.render(); }); return; } tinyMCE.settings = s; // Element not found, then skip initialization if (!t.getElement()) return; // Is a iPad/iPhone and not on iOS5, then skip initialization. We need to sniff // here since the browser says it has contentEditable support but there is no visible caret. if (tinymce.isIDevice && !tinymce.isIOS5) return; // Add hidden input for non input elements inside form elements if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form')) DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id); // Hide target element early to prevent content flashing if (!s.content_editable) { t.orgVisibility = t.getElement().style.visibility; t.getElement().style.visibility = 'hidden'; } if (tinymce.WindowManager) t.windowManager = new tinymce.WindowManager(t); if (s.encoding == 'xml') { t.onGetContent.add(function(ed, o) { if (o.save) o.content = DOM.encode(o.content); }); } if (s.add_form_submit_trigger) { t.onSubmit.addToTop(function() { if (t.initialized) { t.save(); t.isNotDirty = 1; } }); } if (s.add_unload_trigger) { t._beforeUnload = tinyMCE.onBeforeUnload.add(function() { if (t.initialized && !t.destroyed && !t.isHidden()) t.save({format : 'raw', no_events : true}); }); } tinymce.addUnload(t.destroy, t); if (s.submit_patch) { t.onBeforeRenderUI.add(function() { var n = t.getElement().form; if (!n) return; // Already patched if (n._mceOldSubmit) return; // Check page uses id="submit" or name="submit" for it's submit button if (!n.submit.nodeType && !n.submit.length) { t.formElement = n; n._mceOldSubmit = n.submit; n.submit = function() { // Save all instances tinymce.triggerSave(); t.isNotDirty = 1; return t.formElement._mceOldSubmit(t.formElement); }; } n = null; }); } // Load scripts function loadScripts() { if (s.language && s.language_load !== false) sl.add(tinymce.baseURL + '/langs/' + s.language + '.js'); if (s.theme && typeof s.theme != "function" && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme]) ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js'); each(explode(s.plugins), function(p) { if (p &&!PluginManager.urls[p]) { if (p.charAt(0) == '-') { p = p.substr(1, p.length); var dependencies = PluginManager.dependencies(p); each(dependencies, function(dep) { var defaultSettings = {prefix:'plugins/', resource: dep, suffix:'/editor_plugin' + tinymce.suffix + '.js'}; dep = PluginManager.createUrl(defaultSettings, dep); PluginManager.load(dep.resource, dep); }); } else { // Skip safari plugin, since it is removed as of 3.3b1 if (p == 'safari') { return; } PluginManager.load(p, {prefix:'plugins/', resource: p, suffix:'/editor_plugin' + tinymce.suffix + '.js'}); } } }); // Init when que is loaded sl.loadQueue(function() { if (!t.removed) t.init(); }); }; loadScripts(); }, init : function() { var n, t = this, s = t.settings, w, h, mh, e = t.getElement(), o, ti, u, bi, bc, re, i, initializedPlugins = []; tinymce.add(t); s.aria_label = s.aria_label || DOM.getAttrib(e, 'aria-label', t.getLang('aria.rich_text_area')); if (s.theme) { if (typeof s.theme != "function") { s.theme = s.theme.replace(/-/, ''); o = ThemeManager.get(s.theme); t.theme = new o(); if (t.theme.init) t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, '')); } else { t.theme = s.theme; } } function initPlugin(p) { var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po; if (c && tinymce.inArray(initializedPlugins,p) === -1) { each(PluginManager.dependencies(p), function(dep){ initPlugin(dep); }); po = new c(t, u); t.plugins[p] = po; if (po.init) { po.init(t, u); initializedPlugins.push(p); } } } // Create all plugins each(explode(s.plugins.replace(/\-/g, '')), initPlugin); // Setup popup CSS path(s) if (s.popup_css !== false) { if (s.popup_css) s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css); else s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css"); } if (s.popup_css_add) s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add); t.controlManager = new tinymce.ControlManager(t); t.onExecCommand.add(function(ed, c) { // Don't refresh the select lists until caret move if (!/^(FontName|FontSize)$/.test(c)) t.nodeChanged(); }); // Enables users to override the control factory t.onBeforeRenderUI.dispatch(t, t.controlManager); // Measure box if (s.render_ui && t.theme) { t.orgDisplay = e.style.display; if (typeof s.theme != "function") { w = s.width || e.style.width || e.offsetWidth; h = s.height || e.style.height || e.offsetHeight; mh = s.min_height || 100; re = /^[0-9\.]+(|px)$/i; if (re.test('' + w)) w = Math.max(parseInt(w, 10) + (o.deltaWidth || 0), 100); if (re.test('' + h)) h = Math.max(parseInt(h, 10) + (o.deltaHeight || 0), mh); // Render UI o = t.theme.renderUI({ targetNode : e, width : w, height : h, deltaWidth : s.delta_width, deltaHeight : s.delta_height }); // Resize editor DOM.setStyles(o.sizeContainer || o.editorContainer, { width : w, height : h }); h = (o.iframeHeight || h) + (typeof(h) == 'number' ? (o.deltaHeight || 0) : ''); if (h < mh) h = mh; } else { o = s.theme(t, e); // Convert element type to id:s if (o.editorContainer.nodeType) { o.editorContainer = o.editorContainer.id = o.editorContainer.id || t.id + "_parent"; } // Convert element type to id:s if (o.iframeContainer.nodeType) { o.iframeContainer = o.iframeContainer.id = o.iframeContainer.id || t.id + "_iframecontainer"; } // Use specified iframe height or the targets offsetHeight h = o.iframeHeight || e.offsetHeight; // Store away the selection when it's changed to it can be restored later with a editor.focus() call if (isIE) { t.onInit.add(function(ed) { ed.dom.bind(ed.getBody(), 'beforedeactivate keydown', function() { ed.lastIERng = ed.selection.getRng(); }); }); } } t.editorContainer = o.editorContainer; } // Load specified content CSS last if (s.content_css) { each(explode(s.content_css), function(u) { t.contentCSS.push(t.documentBaseURI.toAbsolute(u)); }); } // Content editable mode ends here if (s.content_editable) { e = n = o = null; // Fix IE leak return t.initContentBody(); } // User specified a document.domain value if (document.domain && location.hostname != document.domain) tinymce.relaxedDomain = document.domain; t.iframeHTML = s.doctype + ''; // We only need to override paths if we have to // IE has a bug where it remove site absolute urls to relative ones if this is specified if (s.document_base_url != tinymce.documentBaseURL) t.iframeHTML += ''; // IE8 doesn't support carets behind images setting ie7_compat would force IE8+ to run in IE7 compat mode. if (s.ie7_compat) t.iframeHTML += ''; else t.iframeHTML += ''; t.iframeHTML += ''; // Load the CSS by injecting them into the HTML this will reduce "flicker" for (i = 0; i < t.contentCSS.length; i++) { t.iframeHTML += ''; } t.contentCSS = []; bi = s.body_id || 'tinymce'; if (bi.indexOf('=') != -1) { bi = t.getParam('body_id', '', 'hash'); bi = bi[t.id] || bi; } bc = s.body_class || ''; if (bc.indexOf('=') != -1) { bc = t.getParam('body_class', '', 'hash'); bc = bc[t.id] || ''; } t.iframeHTML += '
        '; // Domain relaxing enabled, then set document domain if (tinymce.relaxedDomain && (isIE || (tinymce.isOpera && parseFloat(opera.version()) < 11))) { // We need to write the contents here in IE since multiple writes messes up refresh button and back button u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.initContentBody();})()'; } // Create iframe // TODO: ACC add the appropriate description on this. n = DOM.add(o.iframeContainer, 'iframe', { id : t.id + "_ifr", src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7 frameBorder : '0', allowTransparency : "true", title : s.aria_label, style : { width : '100%', height : h, display : 'block' // Important for Gecko to render the iframe correctly } }); t.contentAreaContainer = o.iframeContainer; if (o.editorContainer) { DOM.get(o.editorContainer).style.display = t.orgDisplay; } // Restore visibility on target element e.style.visibility = t.orgVisibility; DOM.get(t.id).style.display = 'none'; DOM.setAttrib(t.id, 'aria-hidden', true); if (!tinymce.relaxedDomain || !u) t.initContentBody(); e = n = o = null; // Cleanup }, initContentBody : function() { var self = this, settings = self.settings, targetElm = DOM.get(self.id), doc = self.getDoc(), html, body; // Setup iframe body if ((!isIE || !tinymce.relaxedDomain) && !settings.content_editable) { doc.open(); doc.write(self.iframeHTML); doc.close(); if (tinymce.relaxedDomain) doc.domain = tinymce.relaxedDomain; } if (settings.content_editable) { DOM.addClass(targetElm, 'mceContentBody'); self.contentDocument = doc = settings.content_document || document; self.contentWindow = settings.content_window || window; self.bodyElement = targetElm; // Prevent leak in IE settings.content_document = settings.content_window = null; } // It will not steal focus while setting contentEditable body = self.getBody(); body.disabled = true; if (!settings.readonly) body.contentEditable = self.getParam('content_editable_state', true); body.disabled = false; self.schema = new tinymce.html.Schema(settings); self.dom = new tinymce.dom.DOMUtils(doc, { keep_values : true, url_converter : self.convertURL, url_converter_scope : self, hex_colors : settings.force_hex_style_colors, class_filter : settings.class_filter, update_styles : true, root_element : settings.content_editable ? self.id : null, schema : self.schema }); self.parser = new tinymce.html.DomParser(settings, self.schema); // Convert src and href into data-mce-src, data-mce-href and data-mce-style self.parser.addAttributeFilter('src,href,style', function(nodes, name) { var i = nodes.length, node, dom = self.dom, value, internalName; while (i--) { node = nodes[i]; value = node.attr(name); internalName = 'data-mce-' + name; // Add internal attribute if we need to we don't on a refresh of the document if (!node.attributes.map[internalName]) { if (name === "style") node.attr(internalName, dom.serializeStyle(dom.parseStyle(value), node.name)); else node.attr(internalName, self.convertURL(value, name, node.name)); } } }); // Keep scripts from executing self.parser.addNodeFilter('script', function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; node.attr('type', 'mce-' + (node.attr('type') || 'text/javascript')); } }); self.parser.addNodeFilter('#cdata', function(nodes, name) { var i = nodes.length, node; while (i--) { node = nodes[i]; node.type = 8; node.name = '#comment'; node.value = '[CDATA[' + node.value + ']]'; } }); self.parser.addNodeFilter('p,h1,h2,h3,h4,h5,h6,div', function(nodes, name) { var i = nodes.length, node, nonEmptyElements = self.schema.getNonEmptyElements(); while (i--) { node = nodes[i]; if (node.isEmpty(nonEmptyElements)) node.empty().append(new tinymce.html.Node('br', 1)).shortEnded = true; } }); self.serializer = new tinymce.dom.Serializer(settings, self.dom, self.schema); self.selection = new tinymce.dom.Selection(self.dom, self.getWin(), self.serializer, self); self.formatter = new tinymce.Formatter(self); self.undoManager = new tinymce.UndoManager(self); self.forceBlocks = new tinymce.ForceBlocks(self); self.enterKey = new tinymce.EnterKey(self); self.editorCommands = new tinymce.EditorCommands(self); // Pass through self.serializer.onPreProcess.add(function(se, o) { return self.onPreProcess.dispatch(self, o, se); }); self.serializer.onPostProcess.add(function(se, o) { return self.onPostProcess.dispatch(self, o, se); }); self.onPreInit.dispatch(self); if (!settings.browser_spellcheck && !settings.gecko_spellcheck) doc.body.spellcheck = false; if (!settings.readonly) { self.bindNativeEvents(); } self.controlManager.onPostRender.dispatch(self, self.controlManager); self.onPostRender.dispatch(self); self.quirks = tinymce.util.Quirks(self); if (settings.directionality) body.dir = settings.directionality; if (settings.nowrap) body.style.whiteSpace = "nowrap"; if (settings.protect) { self.onBeforeSetContent.add(function(ed, o) { each(settings.protect, function(pattern) { o.content = o.content.replace(pattern, function(str) { return ''; }); }); }); } // Add visual aids when new contents is added self.onSetContent.add(function() { self.addVisual(self.getBody()); }); // Remove empty contents if (settings.padd_empty_editor) { self.onPostProcess.add(function(ed, o) { o.content = o.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
        [\r\n]*)$/, ''); }); } self.load({initial : true, format : 'html'}); self.startContent = self.getContent({format : 'raw'}); self.initialized = true; self.onInit.dispatch(self); self.execCallback('setupcontent_callback', self.id, body, doc); self.execCallback('init_instance_callback', self); self.focus(true); self.nodeChanged({initial : true}); // Load specified content CSS last each(self.contentCSS, function(url) { self.dom.loadCSS(url); }); // Handle auto focus if (settings.auto_focus) { setTimeout(function () { var ed = tinymce.get(settings.auto_focus); ed.selection.select(ed.getBody(), 1); ed.selection.collapse(1); ed.getBody().focus(); ed.getWin().focus(); }, 100); } // Clean up references for IE targetElm = doc = body = null; }, focus : function(skip_focus) { var oed, self = this, selection = self.selection, contentEditable = self.settings.content_editable, ieRng, controlElm, doc = self.getDoc(), body; if (!skip_focus) { if (self.lastIERng) { selection.setRng(self.lastIERng); } // Get selected control element ieRng = selection.getRng(); if (ieRng.item) { controlElm = ieRng.item(0); } self._refreshContentEditable(); // Focus the window iframe if (!contentEditable) { self.getWin().focus(); } // Focus the body as well since it's contentEditable if (tinymce.isGecko || contentEditable) { body = self.getBody(); // Check for setActive since it doesn't scroll to the element if (body.setActive) { body.setActive(); } else { body.focus(); } if (contentEditable) { selection.normalize(); } } // Restore selected control element // This is needed when for example an image is selected within a // layer a call to focus will then remove the control selection if (controlElm && controlElm.ownerDocument == doc) { ieRng = doc.body.createControlRange(); ieRng.addElement(controlElm); ieRng.select(); } } if (tinymce.activeEditor != self) { if ((oed = tinymce.activeEditor) != null) oed.onDeactivate.dispatch(oed, self); self.onActivate.dispatch(self, oed); } tinymce._setActive(self); }, execCallback : function(n) { var t = this, f = t.settings[n], s; if (!f) return; // Look through lookup if (t.callbackLookup && (s = t.callbackLookup[n])) { f = s.func; s = s.scope; } if (is(f, 'string')) { s = f.replace(/\.\w+$/, ''); s = s ? tinymce.resolve(s) : 0; f = tinymce.resolve(f); t.callbackLookup = t.callbackLookup || {}; t.callbackLookup[n] = {func : f, scope : s}; } return f.apply(s || t, Array.prototype.slice.call(arguments, 1)); }, translate : function(s) { var c = this.settings.language || 'en', i18n = tinymce.i18n; if (!s) return ''; return i18n[c + '.' + s] || s.replace(/\{\#([^\}]+)\}/g, function(a, b) { return i18n[c + '.' + b] || '{#' + b + '}'; }); }, getLang : function(n, dv) { return tinymce.i18n[(this.settings.language || 'en') + '.' + n] || (is(dv) ? dv : '{#' + n + '}'); }, getParam : function(n, dv, ty) { var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o; if (ty === 'hash') { o = {}; if (is(v, 'string')) { each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) { v = v.split('='); if (v.length > 1) o[tr(v[0])] = tr(v[1]); else o[tr(v[0])] = tr(v); }); } else o = v; return o; } return v; }, nodeChanged : function(o) { var self = this, selection = self.selection, node; // Fix for bug #1896577 it seems that this can not be fired while the editor is loading if (self.initialized) { o = o || {}; // Get start node node = selection.getStart() || self.getBody(); node = isIE && node.ownerDocument != self.getDoc() ? self.getBody() : node; // Fix for IE initial state // Get parents and add them to object o.parents = []; self.dom.getParent(node, function(node) { if (node.nodeName == 'BODY') return true; o.parents.push(node); }); self.onNodeChange.dispatch( self, o ? o.controlManager || self.controlManager : self.controlManager, node, selection.isCollapsed(), o ); } }, addButton : function(name, settings) { var self = this; self.buttons = self.buttons || {}; self.buttons[name] = settings; }, addCommand : function(name, callback, scope) { this.execCommands[name] = {func : callback, scope : scope || this}; }, addQueryStateHandler : function(name, callback, scope) { this.queryStateCommands[name] = {func : callback, scope : scope || this}; }, addQueryValueHandler : function(name, callback, scope) { this.queryValueCommands[name] = {func : callback, scope : scope || this}; }, addShortcut : function(pa, desc, cmd_func, sc) { var t = this, c; if (t.settings.custom_shortcuts === false) return false; t.shortcuts = t.shortcuts || {}; if (is(cmd_func, 'string')) { c = cmd_func; cmd_func = function() { t.execCommand(c, false, null); }; } if (is(cmd_func, 'object')) { c = cmd_func; cmd_func = function() { t.execCommand(c[0], c[1], c[2]); }; } each(explode(pa), function(pa) { var o = { func : cmd_func, scope : sc || this, desc : t.translate(desc), alt : false, ctrl : false, shift : false }; each(explode(pa, '+'), function(v) { switch (v) { case 'alt': case 'ctrl': case 'shift': o[v] = true; break; default: o.charCode = v.charCodeAt(0); o.keyCode = v.toUpperCase().charCodeAt(0); } }); t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o; }); return true; }, execCommand : function(cmd, ui, val, a) { var t = this, s = 0, o, st; if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus)) t.focus(); a = extend({}, a); t.onBeforeExecCommand.dispatch(t, cmd, ui, val, a); if (a.terminate) return false; // Command callback if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) { t.onExecCommand.dispatch(t, cmd, ui, val, a); return true; } // Registred commands if (o = t.execCommands[cmd]) { st = o.func.call(o.scope, ui, val); // Fall through on true if (st !== true) { t.onExecCommand.dispatch(t, cmd, ui, val, a); return st; } } // Plugin commands each(t.plugins, function(p) { if (p.execCommand && p.execCommand(cmd, ui, val)) { t.onExecCommand.dispatch(t, cmd, ui, val, a); s = 1; return false; } }); if (s) return true; // Theme commands if (t.theme && t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) { t.onExecCommand.dispatch(t, cmd, ui, val, a); return true; } // Editor commands if (t.editorCommands.execCommand(cmd, ui, val)) { t.onExecCommand.dispatch(t, cmd, ui, val, a); return true; } // Browser commands t.getDoc().execCommand(cmd, ui, val); t.onExecCommand.dispatch(t, cmd, ui, val, a); }, queryCommandState : function(cmd) { var t = this, o, s; // Is hidden then return undefined if (t._isHidden()) return; // Registred commands if (o = t.queryStateCommands[cmd]) { s = o.func.call(o.scope); // Fall though on true if (s !== true) return s; } // Registred commands o = t.editorCommands.queryCommandState(cmd); if (o !== -1) return o; // Browser commands try { return this.getDoc().queryCommandState(cmd); } catch (ex) { // Fails sometimes see bug: 1896577 } }, queryCommandValue : function(c) { var t = this, o, s; // Is hidden then return undefined if (t._isHidden()) return; // Registred commands if (o = t.queryValueCommands[c]) { s = o.func.call(o.scope); // Fall though on true if (s !== true) return s; } // Registred commands o = t.editorCommands.queryCommandValue(c); if (is(o)) return o; // Browser commands try { return this.getDoc().queryCommandValue(c); } catch (ex) { // Fails sometimes see bug: 1896577 } }, show : function() { var self = this; DOM.show(self.getContainer()); DOM.hide(self.id); self.load(); }, hide : function() { var self = this, doc = self.getDoc(); // Fixed bug where IE has a blinking cursor left from the editor if (isIE && doc) doc.execCommand('SelectAll'); // We must save before we hide so Safari doesn't crash self.save(); DOM.hide(self.getContainer()); DOM.setStyle(self.id, 'display', self.orgDisplay); }, isHidden : function() { return !DOM.isHidden(this.id); }, setProgressState : function(b, ti, o) { this.onSetProgressState.dispatch(this, b, ti, o); return b; }, load : function(o) { var t = this, e = t.getElement(), h; if (e) { o = o || {}; o.load = true; // Double encode existing entities in the value h = t.setContent(is(e.value) ? e.value : e.innerHTML, o); o.element = e; if (!o.no_events) t.onLoadContent.dispatch(t, o); o.element = e = null; return h; } }, save : function(o) { var t = this, e = t.getElement(), h, f; if (!e || !t.initialized) return; o = o || {}; o.save = true; o.element = e; h = o.content = t.getContent(o); if (!o.no_events) t.onSaveContent.dispatch(t, o); h = o.content; if (!/TEXTAREA|INPUT/i.test(e.nodeName)) { e.innerHTML = h; // Update hidden form element if (f = DOM.getParent(t.id, 'form')) { each(f.elements, function(e) { if (e.name == t.id) { e.value = h; return false; } }); } } else e.value = h; o.element = e = null; return h; }, setContent : function(content, args) { var self = this, rootNode, body = self.getBody(), forcedRootBlockName; // Setup args object args = args || {}; args.format = args.format || 'html'; args.set = true; args.content = content; // Do preprocessing if (!args.no_events) self.onBeforeSetContent.dispatch(self, args); content = args.content; // Padd empty content in Gecko and Safari. Commands will otherwise fail on the content // It will also be impossible to place the caret in the editor unless there is a BR element present if (!tinymce.isIE && (content.length === 0 || /^\s+$/.test(content))) { forcedRootBlockName = self.settings.forced_root_block; if (forcedRootBlockName) content = '<' + forcedRootBlockName + '>
        '; else content = '
        '; body.innerHTML = content; self.selection.select(body, true); self.selection.collapse(true); return; } // Parse and serialize the html if (args.format !== 'raw') { content = new tinymce.html.Serializer({}, self.schema).serialize( self.parser.parse(content) ); } // Set the new cleaned contents to the editor args.content = tinymce.trim(content); self.dom.setHTML(body, args.content); // Do post processing if (!args.no_events) self.onSetContent.dispatch(self, args); // Don't normalize selection if the focused element isn't the body in content editable mode since it will steal focus otherwise if (!self.settings.content_editable || document.activeElement === self.getBody()) { self.selection.normalize(); } return args.content; }, getContent : function(args) { var self = this, content; // Setup args object args = args || {}; args.format = args.format || 'html'; args.get = true; args.getInner = true; // Do preprocessing if (!args.no_events) self.onBeforeGetContent.dispatch(self, args); // Get raw contents or by default the cleaned contents if (args.format == 'raw') content = self.getBody().innerHTML; else content = self.serializer.serialize(self.getBody(), args); args.content = tinymce.trim(content); // Do post processing if (!args.no_events) self.onGetContent.dispatch(self, args); return args.content; }, isDirty : function() { var self = this; return tinymce.trim(self.startContent) != tinymce.trim(self.getContent({format : 'raw', no_events : 1})) && !self.isNotDirty; }, getContainer : function() { var self = this; if (!self.container) self.container = DOM.get(self.editorContainer || self.id + '_parent'); return self.container; }, getContentAreaContainer : function() { return this.contentAreaContainer; }, getElement : function() { return DOM.get(this.settings.content_element || this.id); }, getWin : function() { var self = this, elm; if (!self.contentWindow) { elm = DOM.get(self.id + "_ifr"); if (elm) self.contentWindow = elm.contentWindow; } return self.contentWindow; }, getDoc : function() { var self = this, win; if (!self.contentDocument) { win = self.getWin(); if (win) self.contentDocument = win.document; } return self.contentDocument; }, getBody : function() { return this.bodyElement || this.getDoc().body; }, convertURL : function(url, name, elm) { var self = this, settings = self.settings; // Use callback instead if (settings.urlconverter_callback) return self.execCallback('urlconverter_callback', url, elm, true, name); // Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs if (!settings.convert_urls || (elm && elm.nodeName == 'LINK') || url.indexOf('file:') === 0) return url; // Convert to relative if (settings.relative_urls) return self.documentBaseURI.toRelative(url); // Convert to absolute url = self.documentBaseURI.toAbsolute(url, settings.remove_script_host); return url; }, addVisual : function(elm) { var self = this, settings = self.settings, dom = self.dom, cls; elm = elm || self.getBody(); if (!is(self.hasVisual)) self.hasVisual = settings.visual; each(dom.select('table,a', elm), function(elm) { var value; switch (elm.nodeName) { case 'TABLE': cls = settings.visual_table_class || 'mceItemTable'; value = dom.getAttrib(elm, 'border'); if (!value || value == '0') { if (self.hasVisual) dom.addClass(elm, cls); else dom.removeClass(elm, cls); } return; case 'A': if (!elm.href) { value = dom.getAttrib(elm, 'name') || elm.id; cls = 'mceItemAnchor'; if (value) { if (self.hasVisual) dom.addClass(elm, cls); else dom.removeClass(elm, cls); } } return; } }); self.onVisualAid.dispatch(self, elm, self.hasVisual); }, remove : function() { var self = this, elm = self.getContainer(); if (!self.removed) { self.removed = 1; // Cancels post remove event execution self.hide(); // Don't clear the window or document if content editable // is enabled since other instances might still be present if (!self.settings.content_editable) { Event.clear(self.getWin()); Event.clear(self.getDoc()); } Event.clear(self.getBody()); Event.clear(self.formElement); Event.unbind(elm); self.execCallback('remove_instance_callback', self); self.onRemove.dispatch(self); // Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command self.onExecCommand.listeners = []; tinymce.remove(self); DOM.remove(elm); } }, destroy : function(s) { var t = this; // One time is enough if (t.destroyed) return; // We must unbind on Gecko since it would otherwise produce the pesky "attempt to run compile-and-go script on a cleared scope" message if (isGecko) { Event.unbind(t.getDoc()); Event.unbind(t.getWin()); Event.unbind(t.getBody()); } if (!s) { tinymce.removeUnload(t.destroy); tinyMCE.onBeforeUnload.remove(t._beforeUnload); // Manual destroy if (t.theme && t.theme.destroy) t.theme.destroy(); // Destroy controls, selection and dom t.controlManager.destroy(); t.selection.destroy(); t.dom.destroy(); } if (t.formElement) { t.formElement.submit = t.formElement._mceOldSubmit; t.formElement._mceOldSubmit = null; } t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null; if (t.selection) t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null; t.destroyed = 1; }, // Internal functions _refreshContentEditable : function() { var self = this, body, parent; // Check if the editor was hidden and the re-initalize contentEditable mode by removing and adding the body again if (self._isHidden()) { body = self.getBody(); parent = body.parentNode; parent.removeChild(body); parent.appendChild(body); body.focus(); } }, _isHidden : function() { var s; if (!isGecko) return 0; // Weird, wheres that cursor selection? s = this.selection.getSel(); return (!s || !s.rangeCount || s.rangeCount === 0); } }); })(tinymce); (function(tinymce) { var each = tinymce.each; tinymce.Editor.prototype.setupEvents = function() { var self = this, settings = self.settings; // Add events to the editor each([ 'onPreInit', 'onBeforeRenderUI', 'onPostRender', 'onLoad', 'onInit', 'onRemove', 'onActivate', 'onDeactivate', 'onClick', 'onEvent', 'onMouseUp', 'onMouseDown', 'onDblClick', 'onKeyDown', 'onKeyUp', 'onKeyPress', 'onContextMenu', 'onSubmit', 'onReset', 'onPaste', 'onPreProcess', 'onPostProcess', 'onBeforeSetContent', 'onBeforeGetContent', 'onSetContent', 'onGetContent', 'onLoadContent', 'onSaveContent', 'onNodeChange', 'onChange', 'onBeforeExecCommand', 'onExecCommand', 'onUndo', 'onRedo', 'onVisualAid', 'onSetProgressState', 'onSetAttrib' ], function(name) { self[name] = new tinymce.util.Dispatcher(self); }); // Handle legacy cleanup_callback option if (settings.cleanup_callback) { self.onBeforeSetContent.add(function(ed, o) { o.content = ed.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); }); self.onPreProcess.add(function(ed, o) { if (o.set) ed.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o); if (o.get) ed.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o); }); self.onPostProcess.add(function(ed, o) { if (o.set) o.content = ed.execCallback('cleanup_callback', 'insert_to_editor', o.content, o); if (o.get) o.content = ed.execCallback('cleanup_callback', 'get_from_editor', o.content, o); }); } // Handle legacy save_callback option if (settings.save_callback) { self.onGetContent.add(function(ed, o) { if (o.save) o.content = ed.execCallback('save_callback', ed.id, o.content, ed.getBody()); }); } // Handle legacy handle_event_callback option if (settings.handle_event_callback) { self.onEvent.add(function(ed, e, o) { if (self.execCallback('handle_event_callback', e, ed, o) === false) Event.cancel(e); }); } // Handle legacy handle_node_change_callback option if (settings.handle_node_change_callback) { self.onNodeChange.add(function(ed, cm, n) { ed.execCallback('handle_node_change_callback', ed.id, n, -1, -1, true, ed.selection.isCollapsed()); }); } // Handle legacy save_callback option if (settings.save_callback) { self.onSaveContent.add(function(ed, o) { var h = ed.execCallback('save_callback', ed.id, o.content, ed.getBody()); if (h) o.content = h; }); } // Handle legacy onchange_callback option if (settings.onchange_callback) { self.onChange.add(function(ed, l) { ed.execCallback('onchange_callback', ed, l); }); } }; tinymce.Editor.prototype.bindNativeEvents = function() { // 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset var self = this, i, settings = self.settings, dom = self.dom, nativeToDispatcherMap; nativeToDispatcherMap = { mouseup : 'onMouseUp', mousedown : 'onMouseDown', click : 'onClick', keyup : 'onKeyUp', keydown : 'onKeyDown', keypress : 'onKeyPress', submit : 'onSubmit', reset : 'onReset', contextmenu : 'onContextMenu', dblclick : 'onDblClick', paste : 'onPaste' // Doesn't work in all browsers yet }; // Handler that takes a native event and sends it out to a dispatcher like onKeyDown function eventHandler(evt, args) { var type = evt.type; // Don't fire events when it's removed if (self.removed) return; // Sends the native event out to a global dispatcher then to the specific event dispatcher if (self.onEvent.dispatch(self, evt, args) !== false) { self[nativeToDispatcherMap[evt.fakeType || evt.type]].dispatch(self, evt, args); } }; // Opera doesn't support focus event for contentEditable elements so we need to fake it function doOperaFocus(e) { self.focus(true); }; function nodeChanged() { // Normalize selection for example a|a becomes a|a self.selection.normalize(); self.nodeChanged(); } // Add DOM events each(nativeToDispatcherMap, function(dispatcherName, nativeName) { var root = settings.content_editable ? self.getBody() : self.getDoc(); switch (nativeName) { case 'contextmenu': dom.bind(root, nativeName, eventHandler); break; case 'paste': dom.bind(self.getBody(), nativeName, eventHandler); break; case 'submit': case 'reset': dom.bind(self.getElement().form || tinymce.DOM.getParent(self.id, 'form'), nativeName, eventHandler); break; default: dom.bind(root, nativeName, eventHandler); } }); // Set the editor as active when focused dom.bind(settings.content_editable ? self.getBody() : (tinymce.isGecko ? self.getDoc() : self.getWin()), 'focus', function(e) { self.focus(true); }); if (settings.content_editable && tinymce.isOpera) { dom.bind(self.getBody(), 'click', doOperaFocus); dom.bind(self.getBody(), 'keydown', doOperaFocus); } // Add node change handler self.onMouseUp.add(nodeChanged); self.onKeyUp.add(function(ed, e) { var keyCode = e.keyCode; if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 13 || keyCode == 45 || keyCode == 46 || keyCode == 8 || (tinymce.isMac && (keyCode == 91 || keyCode == 93)) || e.ctrlKey) nodeChanged(); }); // Add reset handler self.onReset.add(function() { self.setContent(self.startContent, {format : 'raw'}); }); // Add shortcuts function handleShortcut(e, execute) { if (e.altKey || e.ctrlKey || e.metaKey) { each(self.shortcuts, function(shortcut) { var ctrlState = tinymce.isMac ? e.metaKey : e.ctrlKey; if (shortcut.ctrl != ctrlState || shortcut.alt != e.altKey || shortcut.shift != e.shiftKey) return; if (e.keyCode == shortcut.keyCode || (e.charCode && e.charCode == shortcut.charCode)) { e.preventDefault(); if (execute) { shortcut.func.call(shortcut.scope); } return true; } }); } }; self.onKeyUp.add(function(ed, e) { handleShortcut(e); }); self.onKeyPress.add(function(ed, e) { handleShortcut(e); }); self.onKeyDown.add(function(ed, e) { handleShortcut(e, true); }); if (tinymce.isOpera) { self.onClick.add(function(ed, e) { e.preventDefault(); }); } }; })(tinymce); (function(tinymce) { // Added for compression purposes var each = tinymce.each, undef, TRUE = true, FALSE = false; tinymce.EditorCommands = function(editor) { var dom = editor.dom, selection = editor.selection, commands = {state: {}, exec : {}, value : {}}, settings = editor.settings, formatter = editor.formatter, bookmark; function execCommand(command, ui, value) { var func; command = command.toLowerCase(); if (func = commands.exec[command]) { func(command, ui, value); return TRUE; } return FALSE; }; function queryCommandState(command) { var func; command = command.toLowerCase(); if (func = commands.state[command]) return func(command); return -1; }; function queryCommandValue(command) { var func; command = command.toLowerCase(); if (func = commands.value[command]) return func(command); return FALSE; }; function addCommands(command_list, type) { type = type || 'exec'; each(command_list, function(callback, command) { each(command.toLowerCase().split(','), function(command) { commands[type][command] = callback; }); }); }; // Expose public methods tinymce.extend(this, { execCommand : execCommand, queryCommandState : queryCommandState, queryCommandValue : queryCommandValue, addCommands : addCommands }); // Private methods function execNativeCommand(command, ui, value) { if (ui === undef) ui = FALSE; if (value === undef) value = null; return editor.getDoc().execCommand(command, ui, value); }; function isFormatMatch(name) { return formatter.match(name); }; function toggleFormat(name, value) { formatter.toggle(name, value ? {value : value} : undef); }; function storeSelection(type) { bookmark = selection.getBookmark(type); }; function restoreSelection() { selection.moveToBookmark(bookmark); }; // Add execCommand overrides addCommands({ // Ignore these, added for compatibility 'mceResetDesignMode,mceBeginUndoLevel' : function() {}, // Add undo manager logic 'mceEndUndoLevel,mceAddUndoLevel' : function() { editor.undoManager.add(); }, 'Cut,Copy,Paste' : function(command) { var doc = editor.getDoc(), failed; // Try executing the native command try { execNativeCommand(command); } catch (ex) { // Command failed failed = TRUE; } // Present alert message about clipboard access not being available if (failed || !doc.queryCommandSupported(command)) { if (tinymce.isGecko) { editor.windowManager.confirm(editor.getLang('clipboard_msg'), function(state) { if (state) open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', '_blank'); }); } else editor.windowManager.alert(editor.getLang('clipboard_no_support')); } }, // Override unlink command unlink : function(command) { if (selection.isCollapsed()) selection.select(selection.getNode()); execNativeCommand(command); selection.collapse(FALSE); }, // Override justify commands to use the text formatter engine 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { var align = command.substring(7); // Remove all other alignments first each('left,center,right,full'.split(','), function(name) { if (align != name) formatter.remove('align' + name); }); toggleFormat('align' + align); execCommand('mceRepaint'); }, // Override list commands to fix WebKit bug 'InsertUnorderedList,InsertOrderedList' : function(command) { var listElm, listParent; execNativeCommand(command); // WebKit produces lists within block elements so we need to split them // we will replace the native list creation logic to custom logic later on // TODO: Remove this when the list creation logic is removed listElm = dom.getParent(selection.getNode(), 'ol,ul'); if (listElm) { listParent = listElm.parentNode; // If list is within a text block then split that block if (/^(H[1-6]|P|ADDRESS|PRE)$/.test(listParent.nodeName)) { storeSelection(); dom.split(listParent, listElm); restoreSelection(); } } }, // Override commands to use the text formatter engine 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { toggleFormat(command); }, // Override commands to use the text formatter engine 'ForeColor,HiliteColor,FontName' : function(command, ui, value) { toggleFormat(command, value); }, FontSize : function(command, ui, value) { var fontClasses, fontSizes; // Convert font size 1-7 to styles if (value >= 1 && value <= 7) { fontSizes = tinymce.explode(settings.font_size_style_values); fontClasses = tinymce.explode(settings.font_size_classes); if (fontClasses) value = fontClasses[value - 1] || value; else value = fontSizes[value - 1] || value; } toggleFormat(command, value); }, RemoveFormat : function(command) { formatter.remove(command); }, mceBlockQuote : function(command) { toggleFormat('blockquote'); }, FormatBlock : function(command, ui, value) { return toggleFormat(value || 'p'); }, mceCleanup : function() { var bookmark = selection.getBookmark(); editor.setContent(editor.getContent({cleanup : TRUE}), {cleanup : TRUE}); selection.moveToBookmark(bookmark); }, mceRemoveNode : function(command, ui, value) { var node = value || selection.getNode(); // Make sure that the body node isn't removed if (node != editor.getBody()) { storeSelection(); editor.dom.remove(node, TRUE); restoreSelection(); } }, mceSelectNodeDepth : function(command, ui, value) { var counter = 0; dom.getParent(selection.getNode(), function(node) { if (node.nodeType == 1 && counter++ == value) { selection.select(node); return FALSE; } }, editor.getBody()); }, mceSelectNode : function(command, ui, value) { selection.select(value); }, mceInsertContent : function(command, ui, value) { var parser, serializer, parentNode, rootNode, fragment, args, marker, nodeRect, viewPortRect, rng, node, node2, bookmarkHtml, viewportBodyElement; //selection.normalize(); // Setup parser and serializer parser = editor.parser; serializer = new tinymce.html.Serializer({}, editor.schema); bookmarkHtml = '\uFEFF'; // Run beforeSetContent handlers on the HTML to be inserted args = {content: value, format: 'html'}; selection.onBeforeSetContent.dispatch(selection, args); value = args.content; // Add caret at end of contents if it's missing if (value.indexOf('{$caret}') == -1) value += '{$caret}'; // Replace the caret marker with a span bookmark element value = value.replace(/\{\$caret\}/, bookmarkHtml); // Insert node maker where we will insert the new HTML and get it's parent if (!selection.isCollapsed()) editor.getDoc().execCommand('Delete', false, null); parentNode = selection.getNode(); // Parse the fragment within the context of the parent node args = {context : parentNode.nodeName.toLowerCase()}; fragment = parser.parse(value, args); // Move the caret to a more suitable location node = fragment.lastChild; if (node.attr('id') == 'mce_marker') { marker = node; for (node = node.prev; node; node = node.walk(true)) { if (node.type == 3 || !dom.isBlock(node.name)) { node.parent.insert(marker, node, node.name === 'br'); break; } } } // If parser says valid we can insert the contents into that parent if (!args.invalid) { value = serializer.serialize(fragment); // Check if parent is empty or only has one BR element then set the innerHTML of that parent node = parentNode.firstChild; node2 = parentNode.lastChild; if (!node || (node === node2 && node.nodeName === 'BR')) dom.setHTML(parentNode, value); else selection.setContent(value); } else { // If the fragment was invalid within that context then we need // to parse and process the parent it's inserted into // Insert bookmark node and get the parent selection.setContent(bookmarkHtml); parentNode = editor.selection.getNode(); rootNode = editor.getBody(); // Opera will return the document node when selection is in root if (parentNode.nodeType == 9) parentNode = node = rootNode; else node = parentNode; // Find the ancestor just before the root element while (node !== rootNode) { parentNode = node; node = node.parentNode; } // Get the outer/inner HTML depending on if we are in the root and parser and serialize that value = parentNode == rootNode ? rootNode.innerHTML : dom.getOuterHTML(parentNode); value = serializer.serialize( parser.parse( // Need to replace by using a function since $ in the contents would otherwise be a problem value.replace(//i, function() { return serializer.serialize(fragment); }) ) ); // Set the inner/outer HTML depending on if we are in the root or not if (parentNode == rootNode) dom.setHTML(rootNode, value); else dom.setOuterHTML(parentNode, value); } marker = dom.get('mce_marker'); // Scroll range into view scrollIntoView on element can't be used since it will scroll the main view port as well nodeRect = dom.getRect(marker); viewPortRect = dom.getViewPort(editor.getWin()); // Check if node is out side the viewport if it is then scroll to it if ((nodeRect.y + nodeRect.h > viewPortRect.y + viewPortRect.h || nodeRect.y < viewPortRect.y) || (nodeRect.x > viewPortRect.x + viewPortRect.w || nodeRect.x < viewPortRect.x)) { viewportBodyElement = tinymce.isIE ? editor.getDoc().documentElement : editor.getBody(); viewportBodyElement.scrollLeft = nodeRect.x; viewportBodyElement.scrollTop = nodeRect.y - viewPortRect.h + 25; } // Move selection before marker and remove it rng = dom.createRng(); // If previous sibling is a text node set the selection to the end of that node node = marker.previousSibling; if (node && node.nodeType == 3) { rng.setStart(node, node.nodeValue.length); } else { // If the previous sibling isn't a text node or doesn't exist set the selection before the marker node rng.setStartBefore(marker); rng.setEndBefore(marker); } // Remove the marker node and set the new range dom.remove(marker); selection.setRng(rng); // Dispatch after event and add any visual elements needed selection.onSetContent.dispatch(selection, args); editor.addVisual(); }, mceInsertRawHTML : function(command, ui, value) { selection.setContent('tiny_mce_marker'); editor.setContent(editor.getContent().replace(/tiny_mce_marker/g, function() { return value })); }, mceSetContent : function(command, ui, value) { editor.setContent(value); }, 'Indent,Outdent' : function(command) { var intentValue, indentUnit, value; // Setup indent level intentValue = settings.indentation; indentUnit = /[a-z%]+$/i.exec(intentValue); intentValue = parseInt(intentValue); if (!queryCommandState('InsertUnorderedList') && !queryCommandState('InsertOrderedList')) { // If forced_root_blocks is set to false we don't have a block to indent so lets create a div if (!settings.forced_root_block && !dom.getParent(selection.getNode(), dom.isBlock)) { formatter.apply('div'); } each(selection.getSelectedBlocks(), function(element) { if (command == 'outdent') { value = Math.max(0, parseInt(element.style.paddingLeft || 0) - intentValue); dom.setStyle(element, 'paddingLeft', value ? value + indentUnit : ''); } else dom.setStyle(element, 'paddingLeft', (parseInt(element.style.paddingLeft || 0) + intentValue) + indentUnit); }); } else execNativeCommand(command); }, mceRepaint : function() { var bookmark; if (tinymce.isGecko) { try { storeSelection(TRUE); if (selection.getSel()) selection.getSel().selectAllChildren(editor.getBody()); selection.collapse(TRUE); restoreSelection(); } catch (ex) { // Ignore } } }, mceToggleFormat : function(command, ui, value) { formatter.toggle(value); }, InsertHorizontalRule : function() { editor.execCommand('mceInsertContent', false, '
        '); }, mceToggleVisualAid : function() { editor.hasVisual = !editor.hasVisual; editor.addVisual(); }, mceReplaceContent : function(command, ui, value) { editor.execCommand('mceInsertContent', false, value.replace(/\{\$selection\}/g, selection.getContent({format : 'text'}))); }, mceInsertLink : function(command, ui, value) { var anchor; if (typeof(value) == 'string') value = {href : value}; anchor = dom.getParent(selection.getNode(), 'a'); // Spaces are never valid in URLs and it's a very common mistake for people to make so we fix it here. value.href = value.href.replace(' ', '%20'); // Remove existing links if there could be child links or that the href isn't specified if (!anchor || !value.href) { formatter.remove('link'); } // Apply new link to selection if (value.href) { formatter.apply('link', value, anchor); } }, selectAll : function() { var root = dom.getRoot(), rng = dom.createRng(); rng.setStart(root, 0); rng.setEnd(root, root.childNodes.length); editor.selection.setRng(rng); } }); // Add queryCommandState overrides addCommands({ // Override justify commands 'JustifyLeft,JustifyCenter,JustifyRight,JustifyFull' : function(command) { var name = 'align' + command.substring(7); var nodes = selection.isCollapsed() ? [dom.getParent(selection.getNode(), dom.isBlock)] : selection.getSelectedBlocks(); var matches = tinymce.map(nodes, function(node) { return !!formatter.matchNode(node, name); }); return tinymce.inArray(matches, TRUE) !== -1; }, 'Bold,Italic,Underline,Strikethrough,Superscript,Subscript' : function(command) { return isFormatMatch(command); }, mceBlockQuote : function() { return isFormatMatch('blockquote'); }, Outdent : function() { var node; if (settings.inline_styles) { if ((node = dom.getParent(selection.getStart(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) return TRUE; if ((node = dom.getParent(selection.getEnd(), dom.isBlock)) && parseInt(node.style.paddingLeft) > 0) return TRUE; } return queryCommandState('InsertUnorderedList') || queryCommandState('InsertOrderedList') || (!settings.inline_styles && !!dom.getParent(selection.getNode(), 'BLOCKQUOTE')); }, 'InsertUnorderedList,InsertOrderedList' : function(command) { return dom.getParent(selection.getNode(), command == 'insertunorderedlist' ? 'UL' : 'OL'); } }, 'state'); // Add queryCommandValue overrides addCommands({ 'FontSize,FontName' : function(command) { var value = 0, parent; if (parent = dom.getParent(selection.getNode(), 'span')) { if (command == 'fontsize') value = parent.style.fontSize; else value = parent.style.fontFamily.replace(/, /g, ',').replace(/[\'\"]/g, '').toLowerCase(); } return value; } }, 'value'); // Add undo manager logic addCommands({ Undo : function() { editor.undoManager.undo(); }, Redo : function() { editor.undoManager.redo(); } }); }; })(tinymce); (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher; tinymce.UndoManager = function(editor) { var self, index = 0, data = [], beforeBookmark, onAdd, onUndo, onRedo; function getContent() { // Remove whitespace before/after and remove pure bogus nodes return tinymce.trim(editor.getContent({format : 'raw', no_events : 1}).replace(/]+data-mce-bogus[^>]+>[\u200B\uFEFF]+<\/span>/g, '')); }; function addNonTypingUndoLevel() { self.typing = false; self.add(); }; // Create event instances onBeforeAdd = new Dispatcher(self); onAdd = new Dispatcher(self); onUndo = new Dispatcher(self); onRedo = new Dispatcher(self); // Pass though onAdd event from UndoManager to Editor as onChange onAdd.add(function(undoman, level) { if (undoman.hasUndo()) return editor.onChange.dispatch(editor, level, undoman); }); // Pass though onUndo event from UndoManager to Editor onUndo.add(function(undoman, level) { return editor.onUndo.dispatch(editor, level, undoman); }); // Pass though onRedo event from UndoManager to Editor onRedo.add(function(undoman, level) { return editor.onRedo.dispatch(editor, level, undoman); }); // Add initial undo level when the editor is initialized editor.onInit.add(function() { self.add(); }); // Get position before an execCommand is processed editor.onBeforeExecCommand.add(function(ed, cmd, ui, val, args) { if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!args || !args.skip_undo)) { self.beforeChange(); } }); // Add undo level after an execCommand call was made editor.onExecCommand.add(function(ed, cmd, ui, val, args) { if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!args || !args.skip_undo)) { self.add(); } }); // Add undo level on save contents, drag end and blur/focusout editor.onSaveContent.add(addNonTypingUndoLevel); editor.dom.bind(editor.dom.getRoot(), 'dragend', addNonTypingUndoLevel); editor.dom.bind(editor.getDoc(), tinymce.isGecko ? 'blur' : 'focusout', function(e) { if (!editor.removed && self.typing) { addNonTypingUndoLevel(); } }); editor.onKeyUp.add(function(editor, e) { var keyCode = e.keyCode; if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45 || keyCode == 13 || e.ctrlKey) { addNonTypingUndoLevel(); } }); editor.onKeyDown.add(function(editor, e) { var keyCode = e.keyCode; // Is caracter positon keys left,right,up,down,home,end,pgdown,pgup,enter if ((keyCode >= 33 && keyCode <= 36) || (keyCode >= 37 && keyCode <= 40) || keyCode == 45) { if (self.typing) { addNonTypingUndoLevel(); } return; } // If key isn't shift,ctrl,alt,capslock,metakey if ((keyCode < 16 || keyCode > 20) && keyCode != 224 && keyCode != 91 && !self.typing) { self.beforeChange(); self.typing = true; self.add(); } }); editor.onMouseDown.add(function(editor, e) { if (self.typing) { addNonTypingUndoLevel(); } }); // Add keyboard shortcuts for undo/redo keys editor.addShortcut('ctrl+z', 'undo_desc', 'Undo'); editor.addShortcut('ctrl+y', 'redo_desc', 'Redo'); self = { // Explose for debugging reasons data : data, typing : false, onBeforeAdd: onBeforeAdd, onAdd : onAdd, onUndo : onUndo, onRedo : onRedo, beforeChange : function() { beforeBookmark = editor.selection.getBookmark(2, true); }, add : function(level) { var i, settings = editor.settings, lastLevel; level = level || {}; level.content = getContent(); self.onBeforeAdd.dispatch(self, level); // Add undo level if needed lastLevel = data[index]; if (lastLevel && lastLevel.content == level.content) return null; // Set before bookmark on previous level if (data[index]) data[index].beforeBookmark = beforeBookmark; // Time to compress if (settings.custom_undo_redo_levels) { if (data.length > settings.custom_undo_redo_levels) { for (i = 0; i < data.length - 1; i++) data[i] = data[i + 1]; data.length--; index = data.length; } } // Get a non intrusive normalized bookmark level.bookmark = editor.selection.getBookmark(2, true); // Crop array if needed if (index < data.length - 1) data.length = index + 1; data.push(level); index = data.length - 1; self.onAdd.dispatch(self, level); editor.isNotDirty = 0; return level; }, undo : function() { var level, i; if (self.typing) { self.add(); self.typing = false; } if (index > 0) { level = data[--index]; editor.setContent(level.content, {format : 'raw'}); editor.selection.moveToBookmark(level.beforeBookmark); self.onUndo.dispatch(self, level); } return level; }, redo : function() { var level; if (index < data.length - 1) { level = data[++index]; editor.setContent(level.content, {format : 'raw'}); editor.selection.moveToBookmark(level.bookmark); self.onRedo.dispatch(self, level); } return level; }, clear : function() { data = []; index = 0; self.typing = false; }, hasUndo : function() { return index > 0 || this.typing; }, hasRedo : function() { return index < data.length - 1 && !this.typing; } }; return self; }; })(tinymce); tinymce.ForceBlocks = function(editor) { var settings = editor.settings, dom = editor.dom, selection = editor.selection, blockElements = editor.schema.getBlockElements(); function addRootBlocks() { var node = selection.getStart(), rootNode = editor.getBody(), rng, startContainer, startOffset, endContainer, endOffset, rootBlockNode, tempNode, offset = -0xFFFFFF, wrapped; if (!node || node.nodeType !== 1 || !settings.forced_root_block) return; // Check if node is wrapped in block while (node && node != rootNode) { if (blockElements[node.nodeName]) return; node = node.parentNode; } // Get current selection rng = selection.getRng(); if (rng.setStart) { startContainer = rng.startContainer; startOffset = rng.startOffset; endContainer = rng.endContainer; endOffset = rng.endOffset; } else { // Force control range into text range if (rng.item) { node = rng.item(0); rng = editor.getDoc().body.createTextRange(); rng.moveToElementText(node); } tmpRng = rng.duplicate(); tmpRng.collapse(true); startOffset = tmpRng.move('character', offset) * -1; if (!tmpRng.collapsed) { tmpRng = rng.duplicate(); tmpRng.collapse(false); endOffset = (tmpRng.move('character', offset) * -1) - startOffset; } } // Wrap non block elements and text nodes node = rootNode.firstChild; while (node) { if (node.nodeType === 3 || (node.nodeType == 1 && !blockElements[node.nodeName])) { if (!rootBlockNode) { rootBlockNode = dom.create(settings.forced_root_block); node.parentNode.insertBefore(rootBlockNode, node); wrapped = true; } tempNode = node; node = node.nextSibling; rootBlockNode.appendChild(tempNode); } else { rootBlockNode = null; node = node.nextSibling; } } if (rng.setStart) { rng.setStart(startContainer, startOffset); rng.setEnd(endContainer, endOffset); selection.setRng(rng); } else { try { rng = editor.getDoc().body.createTextRange(); rng.moveToElementText(rootNode); rng.collapse(true); rng.moveStart('character', startOffset); if (endOffset > 0) rng.moveEnd('character', endOffset); rng.select(); } catch (ex) { // Ignore } } // Only trigger nodeChange when we wrapped nodes to prevent a forever loop if (wrapped) { editor.nodeChanged(); } }; // Force root blocks if (settings.forced_root_block) { editor.onKeyUp.add(addRootBlocks); editor.onNodeChange.add(addRootBlocks); } }; (function(tinymce) { // Shorten names var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend; tinymce.create('tinymce.ControlManager', { ControlManager : function(ed, s) { var t = this, i; s = s || {}; t.editor = ed; t.controls = {}; t.onAdd = new tinymce.util.Dispatcher(t); t.onPostRender = new tinymce.util.Dispatcher(t); t.prefix = s.prefix || ed.id + '_'; t._cls = {}; t.onPostRender.add(function() { each(t.controls, function(c) { c.postRender(); }); }); }, get : function(id) { return this.controls[this.prefix + id] || this.controls[id]; }, setActive : function(id, s) { var c = null; if (c = this.get(id)) c.setActive(s); return c; }, setDisabled : function(id, s) { var c = null; if (c = this.get(id)) c.setDisabled(s); return c; }, add : function(c) { var t = this; if (c) { t.controls[c.id] = c; t.onAdd.dispatch(c, t); } return c; }, createControl : function(name) { var ctrl, i, l, self = this, editor = self.editor, factories, ctrlName; // Build control factory cache if (!self.controlFactories) { self.controlFactories = []; each(editor.plugins, function(plugin) { if (plugin.createControl) { self.controlFactories.push(plugin); } }); } // Create controls by asking cached factories factories = self.controlFactories; for (i = 0, l = factories.length; i < l; i++) { ctrl = factories[i].createControl(name, self); if (ctrl) { return self.add(ctrl); } } // Create sepearator if (name === "|" || name === "separator") { return self.createSeparator(); } // Create control from button collection if (editor.buttons && (ctrl = editor.buttons[name])) { return self.createButton(name, ctrl); } return self.add(ctrl); }, createDropMenu : function(id, s, cc) { var t = this, ed = t.editor, c, bm, v, cls; s = extend({ 'class' : 'mceDropDown', constrain : ed.settings.constrain_menus }, s); s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin'; if (v = ed.getParam('skin_variant')) s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1); s['class'] += ed.settings.directionality == "rtl" ? ' mceRtl' : ''; id = t.prefix + id; cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu; c = t.controls[id] = new cls(id, s); c.onAddItem.add(function(c, o) { var s = o.settings; s.title = ed.getLang(s.title, s.title); if (!s.onclick) { s.onclick = function(v) { if (s.cmd) ed.execCommand(s.cmd, s.ui || false, s.value); }; } }); ed.onRemove.add(function() { c.destroy(); }); // Fix for bug #1897785, #1898007 if (tinymce.isIE) { c.onShowMenu.add(function() { // IE 8 needs focus in order to store away a range with the current collapsed caret location ed.focus(); bm = ed.selection.getBookmark(1); }); c.onHideMenu.add(function() { if (bm) { ed.selection.moveToBookmark(bm); bm = 0; } }); } return t.add(c); }, createListBox : function(id, s, cc) { var t = this, ed = t.editor, cmd, c, cls; if (t.get(id)) return null; s.title = ed.translate(s.title); s.scope = s.scope || ed; if (!s.onselect) { s.onselect = function(v) { ed.execCommand(s.cmd, s.ui || false, v || s.value); }; } s = extend({ title : s.title, 'class' : 'mce_' + id, scope : s.scope, control_manager : t }, s); id = t.prefix + id; function useNativeListForAccessibility(ed) { return ed.settings.use_accessible_selects && !tinymce.isGecko } if (ed.settings.use_native_selects || useNativeListForAccessibility(ed)) c = new tinymce.ui.NativeListBox(id, s); else { cls = cc || t._cls.listbox || tinymce.ui.ListBox; c = new cls(id, s, ed); } t.controls[id] = c; // Fix focus problem in Safari if (tinymce.isWebKit) { c.onPostRender.add(function(c, n) { // Store bookmark on mousedown Event.add(n, 'mousedown', function() { ed.bookmark = ed.selection.getBookmark(1); }); // Restore on focus, since it might be lost Event.add(n, 'focus', function() { ed.selection.moveToBookmark(ed.bookmark); ed.bookmark = null; }); }); } if (c.hideMenu) ed.onMouseDown.add(c.hideMenu, c); return t.add(c); }, createButton : function(id, s, cc) { var t = this, ed = t.editor, o, c, cls; if (t.get(id)) return null; s.title = ed.translate(s.title); s.label = ed.translate(s.label); s.scope = s.scope || ed; if (!s.onclick && !s.menu_button) { s.onclick = function() { ed.execCommand(s.cmd, s.ui || false, s.value); }; } s = extend({ title : s.title, 'class' : 'mce_' + id, unavailable_prefix : ed.getLang('unavailable', ''), scope : s.scope, control_manager : t }, s); id = t.prefix + id; if (s.menu_button) { cls = cc || t._cls.menubutton || tinymce.ui.MenuButton; c = new cls(id, s, ed); ed.onMouseDown.add(c.hideMenu, c); } else { cls = t._cls.button || tinymce.ui.Button; c = new cls(id, s, ed); } return t.add(c); }, createMenuButton : function(id, s, cc) { s = s || {}; s.menu_button = 1; return this.createButton(id, s, cc); }, createSplitButton : function(id, s, cc) { var t = this, ed = t.editor, cmd, c, cls; if (t.get(id)) return null; s.title = ed.translate(s.title); s.scope = s.scope || ed; if (!s.onclick) { s.onclick = function(v) { ed.execCommand(s.cmd, s.ui || false, v || s.value); }; } if (!s.onselect) { s.onselect = function(v) { ed.execCommand(s.cmd, s.ui || false, v || s.value); }; } s = extend({ title : s.title, 'class' : 'mce_' + id, scope : s.scope, control_manager : t }, s); id = t.prefix + id; cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton; c = t.add(new cls(id, s, ed)); ed.onMouseDown.add(c.hideMenu, c); return c; }, createColorSplitButton : function(id, s, cc) { var t = this, ed = t.editor, cmd, c, cls, bm; if (t.get(id)) return null; s.title = ed.translate(s.title); s.scope = s.scope || ed; if (!s.onclick) { s.onclick = function(v) { if (tinymce.isIE) bm = ed.selection.getBookmark(1); ed.execCommand(s.cmd, s.ui || false, v || s.value); }; } if (!s.onselect) { s.onselect = function(v) { ed.execCommand(s.cmd, s.ui || false, v || s.value); }; } s = extend({ title : s.title, 'class' : 'mce_' + id, 'menu_class' : ed.getParam('skin') + 'Skin', scope : s.scope, more_colors_title : ed.getLang('more_colors') }, s); id = t.prefix + id; cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton; c = new cls(id, s, ed); ed.onMouseDown.add(c.hideMenu, c); // Remove the menu element when the editor is removed ed.onRemove.add(function() { c.destroy(); }); // Fix for bug #1897785, #1898007 if (tinymce.isIE) { c.onShowMenu.add(function() { // IE 8 needs focus in order to store away a range with the current collapsed caret location ed.focus(); bm = ed.selection.getBookmark(1); }); c.onHideMenu.add(function() { if (bm) { ed.selection.moveToBookmark(bm); bm = 0; } }); } return t.add(c); }, createToolbar : function(id, s, cc) { var c, t = this, cls; id = t.prefix + id; cls = cc || t._cls.toolbar || tinymce.ui.Toolbar; c = new cls(id, s, t.editor); if (t.get(id)) return null; return t.add(c); }, createToolbarGroup : function(id, s, cc) { var c, t = this, cls; id = t.prefix + id; cls = cc || this._cls.toolbarGroup || tinymce.ui.ToolbarGroup; c = new cls(id, s, t.editor); if (t.get(id)) return null; return t.add(c); }, createSeparator : function(cc) { var cls = cc || this._cls.separator || tinymce.ui.Separator; return new cls(); }, setControlType : function(n, c) { return this._cls[n.toLowerCase()] = c; }, destroy : function() { each(this.controls, function(c) { c.destroy(); }); this.controls = null; } }); })(tinymce); (function(tinymce) { var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera; tinymce.create('tinymce.WindowManager', { WindowManager : function(ed) { var t = this; t.editor = ed; t.onOpen = new Dispatcher(t); t.onClose = new Dispatcher(t); t.params = {}; t.features = {}; }, open : function(s, p) { var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u; // Default some options s = s || {}; p = p || {}; sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window sh = isOpera ? vp.h : screen.height; s.name = s.name || 'mc_' + new Date().getTime(); s.width = parseInt(s.width || 320); s.height = parseInt(s.height || 240); s.resizable = true; s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0); s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0); p.inline = false; p.mce_width = s.width; p.mce_height = s.height; p.mce_auto_focus = s.auto_focus; if (mo) { if (isIE) { s.center = true; s.help = false; s.dialogWidth = s.width + 'px'; s.dialogHeight = s.height + 'px'; s.scroll = s.scrollbars || false; } } // Build features string each(s, function(v, k) { if (tinymce.is(v, 'boolean')) v = v ? 'yes' : 'no'; if (!/^(name|url)$/.test(k)) { if (isIE && mo) f += (f ? ';' : '') + k + ':' + v; else f += (f ? ',' : '') + k + '=' + v; } }); t.features = s; t.params = p; t.onOpen.dispatch(t, s, p); u = s.url || s.file; u = tinymce._addVer(u); try { if (isIE && mo) { w = 1; window.showModalDialog(u, window, f); } else w = window.open(u, s.name, f); } catch (ex) { // Ignore } if (!w) alert(t.editor.getLang('popup_blocked')); }, close : function(w) { w.close(); this.onClose.dispatch(this); }, createInstance : function(cl, a, b, c, d, e) { var f = tinymce.resolve(cl); return new f(a, b, c, d, e); }, confirm : function(t, cb, s, w) { w = w || window; cb.call(s || this, w.confirm(this._decode(this.editor.getLang(t, t)))); }, alert : function(tx, cb, s, w) { var t = this; w = w || window; w.alert(t._decode(t.editor.getLang(tx, tx))); if (cb) cb.call(s || t); }, resizeBy : function(dw, dh, win) { win.resizeBy(dw, dh); }, // Internal functions _decode : function(s) { return tinymce.DOM.decode(s).replace(/\\n/g, '\n'); } }); }(tinymce)); (function(tinymce) { tinymce.Formatter = function(ed) { var formats = {}, each = tinymce.each, dom = ed.dom, selection = ed.selection, TreeWalker = tinymce.dom.TreeWalker, rangeUtils = new tinymce.dom.RangeUtils(dom), isValid = ed.schema.isValidChild, isBlock = dom.isBlock, forcedRootBlock = ed.settings.forced_root_block, nodeIndex = dom.nodeIndex, INVISIBLE_CHAR = tinymce.isGecko ? '\u200B' : '\uFEFF', MCE_ATTR_RE = /^(src|href|style)$/, FALSE = false, TRUE = true, formatChangeData, undef, getContentEditable = dom.getContentEditable; function isArray(obj) { return obj instanceof Array; }; function getParents(node, selector) { return dom.getParents(node, selector, dom.getRoot()); }; function isCaretNode(node) { return node.nodeType === 1 && node.id === '_mce_caret'; }; function defaultFormats() { register({ alignleft : [ {selector : 'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'left'}, defaultBlock: 'div'}, {selector : 'img,table', collapsed : false, styles : {'float' : 'left'}} ], aligncenter : [ {selector : 'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'center'}, defaultBlock: 'div'}, {selector : 'img', collapsed : false, styles : {display : 'block', marginLeft : 'auto', marginRight : 'auto'}}, {selector : 'table', collapsed : false, styles : {marginLeft : 'auto', marginRight : 'auto'}} ], alignright : [ {selector : 'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'right'}, defaultBlock: 'div'}, {selector : 'img,table', collapsed : false, styles : {'float' : 'right'}} ], alignfull : [ {selector : 'figure,p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li', styles : {textAlign : 'justify'}, defaultBlock: 'div'} ], bold : [ {inline : 'strong', remove : 'all'}, {inline : 'span', styles : {fontWeight : 'bold'}}, {inline : 'b', remove : 'all'} ], italic : [ {inline : 'em', remove : 'all'}, {inline : 'span', styles : {fontStyle : 'italic'}}, {inline : 'i', remove : 'all'} ], underline : [ {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}, {inline : 'u', remove : 'all'} ], strikethrough : [ {inline : 'span', styles : {textDecoration : 'line-through'}, exact : true}, {inline : 'strike', remove : 'all'} ], forecolor : {inline : 'span', styles : {color : '%value'}, wrap_links : false}, hilitecolor : {inline : 'span', styles : {backgroundColor : '%value'}, wrap_links : false}, fontname : {inline : 'span', styles : {fontFamily : '%value'}}, fontsize : {inline : 'span', styles : {fontSize : '%value'}}, fontsize_class : {inline : 'span', attributes : {'class' : '%value'}}, blockquote : {block : 'blockquote', wrapper : 1, remove : 'all'}, subscript : {inline : 'sub'}, superscript : {inline : 'sup'}, link : {inline : 'a', selector : 'a', remove : 'all', split : true, deep : true, onmatch : function(node) { return true; }, onformat : function(elm, fmt, vars) { each(vars, function(value, key) { dom.setAttrib(elm, key, value); }); } }, removeformat : [ {selector : 'b,strong,em,i,font,u,strike', remove : 'all', split : true, expand : false, block_expand : true, deep : true}, {selector : 'span', attributes : ['style', 'class'], remove : 'empty', split : true, expand : false, deep : true}, {selector : '*', attributes : ['style', 'class'], split : false, expand : false, deep : true} ] }); // Register default block formats each('p h1 h2 h3 h4 h5 h6 div address pre div code dt dd samp'.split(/\s/), function(name) { register(name, {block : name, remove : 'all'}); }); // Register user defined formats register(ed.settings.formats); }; function addKeyboardShortcuts() { // Add some inline shortcuts ed.addShortcut('ctrl+b', 'bold_desc', 'Bold'); ed.addShortcut('ctrl+i', 'italic_desc', 'Italic'); ed.addShortcut('ctrl+u', 'underline_desc', 'Underline'); // BlockFormat shortcuts keys for (var i = 1; i <= 6; i++) { ed.addShortcut('ctrl+' + i, '', ['FormatBlock', false, 'h' + i]); } ed.addShortcut('ctrl+7', '', ['FormatBlock', false, 'p']); ed.addShortcut('ctrl+8', '', ['FormatBlock', false, 'div']); ed.addShortcut('ctrl+9', '', ['FormatBlock', false, 'address']); }; // Public functions function get(name) { return name ? formats[name] : formats; }; function register(name, format) { if (name) { if (typeof(name) !== 'string') { each(name, function(format, name) { register(name, format); }); } else { // Force format into array and add it to internal collection format = format.length ? format : [format]; each(format, function(format) { // Set deep to false by default on selector formats this to avoid removing // alignment on images inside paragraphs when alignment is changed on paragraphs if (format.deep === undef) format.deep = !format.selector; // Default to true if (format.split === undef) format.split = !format.selector || format.inline; // Default to true if (format.remove === undef && format.selector && !format.inline) format.remove = 'none'; // Mark format as a mixed format inline + block level if (format.selector && format.inline) { format.mixed = true; format.block_expand = true; } // Split classes if needed if (typeof(format.classes) === 'string') format.classes = format.classes.split(/\s+/); }); formats[name] = format; } } }; var getTextDecoration = function(node) { var decoration; ed.dom.getParent(node, function(n) { decoration = ed.dom.getStyle(n, 'text-decoration'); return decoration && decoration !== 'none'; }); return decoration; }; var processUnderlineAndColor = function(node) { var textDecoration; if (node.nodeType === 1 && node.parentNode && node.parentNode.nodeType === 1) { textDecoration = getTextDecoration(node.parentNode); if (ed.dom.getStyle(node, 'color') && textDecoration) { ed.dom.setStyle(node, 'text-decoration', textDecoration); } else if (ed.dom.getStyle(node, 'textdecoration') === textDecoration) { ed.dom.setStyle(node, 'text-decoration', null); } } }; function apply(name, vars, node) { var formatList = get(name), format = formatList[0], bookmark, rng, i, isCollapsed = selection.isCollapsed(); function setElementFormat(elm, fmt) { fmt = fmt || format; if (elm) { if (fmt.onformat) { fmt.onformat(elm, fmt, vars, node); } each(fmt.styles, function(value, name) { dom.setStyle(elm, name, replaceVars(value, vars)); }); each(fmt.attributes, function(value, name) { dom.setAttrib(elm, name, replaceVars(value, vars)); }); each(fmt.classes, function(value) { value = replaceVars(value, vars); if (!dom.hasClass(elm, value)) dom.addClass(elm, value); }); } }; function adjustSelectionToVisibleSelection() { function findSelectionEnd(start, end) { var walker = new TreeWalker(end); for (node = walker.current(); node; node = walker.prev()) { if (node.childNodes.length > 1 || node == start || node.tagName == 'BR') { return node; } } }; // Adjust selection so that a end container with a end offset of zero is not included in the selection // as this isn't visible to the user. var rng = ed.selection.getRng(); var start = rng.startContainer; var end = rng.endContainer; if (start != end && rng.endOffset === 0) { var newEnd = findSelectionEnd(start, end); var endOffset = newEnd.nodeType == 3 ? newEnd.length : newEnd.childNodes.length; rng.setEnd(newEnd, endOffset); } return rng; } function applyStyleToList(node, bookmark, wrapElm, newWrappers, process){ var nodes = [], listIndex = -1, list, startIndex = -1, endIndex = -1, currentWrapElm; // find the index of the first child list. each(node.childNodes, function(n, index) { if (n.nodeName === "UL" || n.nodeName === "OL") { listIndex = index; list = n; return false; } }); // get the index of the bookmarks each(node.childNodes, function(n, index) { if (n.nodeName === "SPAN" && dom.getAttrib(n, "data-mce-type") == "bookmark") { if (n.id == bookmark.id + "_start") { startIndex = index; } else if (n.id == bookmark.id + "_end") { endIndex = index; } } }); // if the selection spans across an embedded list, or there isn't an embedded list - handle processing normally if (listIndex <= 0 || (startIndex < listIndex && endIndex > listIndex)) { each(tinymce.grep(node.childNodes), process); return 0; } else { currentWrapElm = dom.clone(wrapElm, FALSE); // create a list of the nodes on the same side of the list as the selection each(tinymce.grep(node.childNodes), function(n, index) { if ((startIndex < listIndex && index < listIndex) || (startIndex > listIndex && index > listIndex)) { nodes.push(n); n.parentNode.removeChild(n); } }); // insert the wrapping element either before or after the list. if (startIndex < listIndex) { node.insertBefore(currentWrapElm, list); } else if (startIndex > listIndex) { node.insertBefore(currentWrapElm, list.nextSibling); } // add the new nodes to the list. newWrappers.push(currentWrapElm); each(nodes, function(node) { currentWrapElm.appendChild(node); }); return currentWrapElm; } }; function applyRngStyle(rng, bookmark, node_specific) { var newWrappers = [], wrapName, wrapElm, contentEditable = true; // Setup wrapper element wrapName = format.inline || format.block; wrapElm = dom.create(wrapName); setElementFormat(wrapElm); rangeUtils.walk(rng, function(nodes) { var currentWrapElm; function process(node) { var nodeName, parentName, found, hasContentEditableState, lastContentEditable; lastContentEditable = contentEditable; nodeName = node.nodeName.toLowerCase(); parentName = node.parentNode.nodeName.toLowerCase(); // Node has a contentEditable value if (node.nodeType === 1 && getContentEditable(node)) { lastContentEditable = contentEditable; contentEditable = getContentEditable(node) === "true"; hasContentEditableState = true; // We don't want to wrap the container only it's children } // Stop wrapping on br elements if (isEq(nodeName, 'br')) { currentWrapElm = 0; // Remove any br elements when we wrap things if (format.block) dom.remove(node); return; } // If node is wrapper type if (format.wrapper && matchNode(node, name, vars)) { currentWrapElm = 0; return; } // Can we rename the block if (contentEditable && !hasContentEditableState && format.block && !format.wrapper && isTextBlock(nodeName)) { node = dom.rename(node, wrapName); setElementFormat(node); newWrappers.push(node); currentWrapElm = 0; return; } // Handle selector patterns if (format.selector) { // Look for matching formats each(formatList, function(format) { // Check collapsed state if it exists if ('collapsed' in format && format.collapsed !== isCollapsed) { return; } if (dom.is(node, format.selector) && !isCaretNode(node)) { setElementFormat(node, format); found = true; } }); // Continue processing if a selector match wasn't found and a inline element is defined if (!format.inline || found) { currentWrapElm = 0; return; } } // Is it valid to wrap this item if (contentEditable && !hasContentEditableState && isValid(wrapName, nodeName) && isValid(parentName, wrapName) && !(!node_specific && node.nodeType === 3 && node.nodeValue.length === 1 && node.nodeValue.charCodeAt(0) === 65279) && !isCaretNode(node)) { // Start wrapping if (!currentWrapElm) { // Wrap the node currentWrapElm = dom.clone(wrapElm, FALSE); node.parentNode.insertBefore(currentWrapElm, node); newWrappers.push(currentWrapElm); } currentWrapElm.appendChild(node); } else if (nodeName == 'li' && bookmark) { // Start wrapping - if we are in a list node and have a bookmark, then we will always begin by wrapping in a new element. currentWrapElm = applyStyleToList(node, bookmark, wrapElm, newWrappers, process); } else { // Start a new wrapper for possible children currentWrapElm = 0; each(tinymce.grep(node.childNodes), process); if (hasContentEditableState) { contentEditable = lastContentEditable; // Restore last contentEditable state from stack } // End the last wrapper currentWrapElm = 0; } }; // Process siblings from range each(nodes, process); }); // Wrap links inside as well, for example color inside a link when the wrapper is around the link if (format.wrap_links === false) { each(newWrappers, function(node) { function process(node) { var i, currentWrapElm, children; if (node.nodeName === 'A') { currentWrapElm = dom.clone(wrapElm, FALSE); newWrappers.push(currentWrapElm); children = tinymce.grep(node.childNodes); for (i = 0; i < children.length; i++) currentWrapElm.appendChild(children[i]); node.appendChild(currentWrapElm); } each(tinymce.grep(node.childNodes), process); }; process(node); }); } // Cleanup each(newWrappers, function(node) { var childCount; function getChildCount(node) { var count = 0; each(node.childNodes, function(node) { if (!isWhiteSpaceNode(node) && !isBookmarkNode(node)) count++; }); return count; }; function mergeStyles(node) { var child, clone; each(node.childNodes, function(node) { if (node.nodeType == 1 && !isBookmarkNode(node) && !isCaretNode(node)) { child = node; return FALSE; // break loop } }); // If child was found and of the same type as the current node if (child && matchName(child, format)) { clone = dom.clone(child, FALSE); setElementFormat(clone); dom.replace(clone, node, TRUE); dom.remove(child, 1); } return clone || node; }; childCount = getChildCount(node); // Remove empty nodes but only if there is multiple wrappers and they are not block // elements so never remove single

        since that would remove the currrent empty block element where the caret is at if ((newWrappers.length > 1 || !isBlock(node)) && childCount === 0) { dom.remove(node, 1); return; } if (format.inline || format.wrapper) { // Merges the current node with it's children of similar type to reduce the number of elements if (!format.exact && childCount === 1) node = mergeStyles(node); // Remove/merge children each(formatList, function(format) { // Merge all children of similar type will move styles from child to parent // this: text // will become: text each(dom.select(format.inline, node), function(child) { var parent; // When wrap_links is set to false we don't want // to remove the format on children within links if (format.wrap_links === false) { parent = child.parentNode; do { if (parent.nodeName === 'A') return; } while (parent = parent.parentNode); } removeFormat(format, vars, child, format.exact ? child : null); }); }); // Remove child if direct parent is of same type if (matchNode(node.parentNode, name, vars)) { dom.remove(node, 1); node = 0; return TRUE; } // Look for parent with similar style format if (format.merge_with_parents) { dom.getParent(node.parentNode, function(parent) { if (matchNode(parent, name, vars)) { dom.remove(node, 1); node = 0; return TRUE; } }); } // Merge next and previous siblings if they are similar texttext becomes texttext if (node && format.merge_siblings !== false) { node = mergeSiblings(getNonWhiteSpaceSibling(node), node); node = mergeSiblings(node, getNonWhiteSpaceSibling(node, TRUE)); } } }); }; if (format) { if (node) { if (node.nodeType) { rng = dom.createRng(); rng.setStartBefore(node); rng.setEndAfter(node); applyRngStyle(expandRng(rng, formatList), null, true); } else { applyRngStyle(node, null, true); } } else { if (!isCollapsed || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { // Obtain selection node before selection is unselected by applyRngStyle() var curSelNode = ed.selection.getNode(); // If the formats have a default block and we can't find a parent block then start wrapping it with a DIV this is for forced_root_blocks: false // It's kind of a hack but people should be using the default block type P since all desktop editors work that way if (!forcedRootBlock && formatList[0].defaultBlock && !dom.getParent(curSelNode, dom.isBlock)) { apply(formatList[0].defaultBlock); } // Apply formatting to selection ed.selection.setRng(adjustSelectionToVisibleSelection()); bookmark = selection.getBookmark(); applyRngStyle(expandRng(selection.getRng(TRUE), formatList), bookmark); // Colored nodes should be underlined so that the color of the underline matches the text color. if (format.styles && (format.styles.color || format.styles.textDecoration)) { tinymce.walk(curSelNode, processUnderlineAndColor, 'childNodes'); processUnderlineAndColor(curSelNode); } selection.moveToBookmark(bookmark); moveStart(selection.getRng(TRUE)); ed.nodeChanged(); } else performCaretAction('apply', name, vars); } } }; function remove(name, vars, node) { var formatList = get(name), format = formatList[0], bookmark, i, rng, contentEditable = true; // Merges the styles for each node function process(node) { var children, i, l, localContentEditable, lastContentEditable, hasContentEditableState; // Node has a contentEditable value if (node.nodeType === 1 && getContentEditable(node)) { lastContentEditable = contentEditable; contentEditable = getContentEditable(node) === "true"; hasContentEditableState = true; // We don't want to wrap the container only it's children } // Grab the children first since the nodelist might be changed children = tinymce.grep(node.childNodes); // Process current node if (contentEditable && !hasContentEditableState) { for (i = 0, l = formatList.length; i < l; i++) { if (removeFormat(formatList[i], vars, node, node)) break; } } // Process the children if (format.deep) { if (children.length) { for (i = 0, l = children.length; i < l; i++) process(children[i]); if (hasContentEditableState) { contentEditable = lastContentEditable; // Restore last contentEditable state from stack } } } }; function findFormatRoot(container) { var formatRoot; // Find format root each(getParents(container.parentNode).reverse(), function(parent) { var format; // Find format root element if (!formatRoot && parent.id != '_start' && parent.id != '_end') { // Is the node matching the format we are looking for format = matchNode(parent, name, vars); if (format && format.split !== false) formatRoot = parent; } }); return formatRoot; }; function wrapAndSplit(format_root, container, target, split) { var parent, clone, lastClone, firstClone, i, formatRootParent; // Format root found then clone formats and split it if (format_root) { formatRootParent = format_root.parentNode; for (parent = container.parentNode; parent && parent != formatRootParent; parent = parent.parentNode) { clone = dom.clone(parent, FALSE); for (i = 0; i < formatList.length; i++) { if (removeFormat(formatList[i], vars, clone, clone)) { clone = 0; break; } } // Build wrapper node if (clone) { if (lastClone) clone.appendChild(lastClone); if (!firstClone) firstClone = clone; lastClone = clone; } } // Never split block elements if the format is mixed if (split && (!format.mixed || !isBlock(format_root))) container = dom.split(format_root, container); // Wrap container in cloned formats if (lastClone) { target.parentNode.insertBefore(lastClone, target); firstClone.appendChild(target); } } return container; }; function splitToFormatRoot(container) { return wrapAndSplit(findFormatRoot(container), container, container, true); }; function unwrap(start) { var node = dom.get(start ? '_start' : '_end'), out = node[start ? 'firstChild' : 'lastChild']; // If the end is placed within the start the result will be removed // So this checks if the out node is a bookmark node if it is it // checks for another more suitable node if (isBookmarkNode(out)) out = out[start ? 'firstChild' : 'lastChild']; dom.remove(node, true); return out; }; function removeRngStyle(rng) { var startContainer, endContainer, node; rng = expandRng(rng, formatList, TRUE); if (format.split) { startContainer = getContainer(rng, TRUE); endContainer = getContainer(rng); if (startContainer != endContainer) { // WebKit will render the table incorrectly if we wrap a TD in a SPAN so lets see if the can use the first child instead // This will happen if you tripple click a table cell and use remove formatting if (/^(TR|TD)$/.test(startContainer.nodeName) && startContainer.firstChild) { startContainer = (startContainer.nodeName == "TD" ? startContainer.firstChild : startContainer.firstChild.firstChild) || startContainer; } // Wrap start/end nodes in span element since these might be cloned/moved startContainer = wrap(startContainer, 'span', {id : '_start', 'data-mce-type' : 'bookmark'}); endContainer = wrap(endContainer, 'span', {id : '_end', 'data-mce-type' : 'bookmark'}); // Split start/end splitToFormatRoot(startContainer); splitToFormatRoot(endContainer); // Unwrap start/end to get real elements again startContainer = unwrap(TRUE); endContainer = unwrap(); } else startContainer = endContainer = splitToFormatRoot(startContainer); // Update range positions since they might have changed after the split operations rng.startContainer = startContainer.parentNode; rng.startOffset = nodeIndex(startContainer); rng.endContainer = endContainer.parentNode; rng.endOffset = nodeIndex(endContainer) + 1; } // Remove items between start/end rangeUtils.walk(rng, function(nodes) { each(nodes, function(node) { process(node); // Remove parent span if it only contains text-decoration: underline, yet a parent node is also underlined. if (node.nodeType === 1 && ed.dom.getStyle(node, 'text-decoration') === 'underline' && node.parentNode && getTextDecoration(node.parentNode) === 'underline') { removeFormat({'deep': false, 'exact': true, 'inline': 'span', 'styles': {'textDecoration' : 'underline'}}, null, node); } }); }); }; // Handle node if (node) { if (node.nodeType) { rng = dom.createRng(); rng.setStartBefore(node); rng.setEndAfter(node); removeRngStyle(rng); } else { removeRngStyle(node); } return; } if (!selection.isCollapsed() || !format.inline || dom.select('td.mceSelected,th.mceSelected').length) { bookmark = selection.getBookmark(); removeRngStyle(selection.getRng(TRUE)); selection.moveToBookmark(bookmark); // Check if start element still has formatting then we are at: "text|text" and need to move the start into the next text node if (format.inline && match(name, vars, selection.getStart())) { moveStart(selection.getRng(true)); } ed.nodeChanged(); } else performCaretAction('remove', name, vars); }; function toggle(name, vars, node) { var fmt = get(name); if (match(name, vars, node) && (!('toggle' in fmt[0]) || fmt[0].toggle)) remove(name, vars, node); else apply(name, vars, node); }; function matchNode(node, name, vars, similar) { var formatList = get(name), format, i, classes; function matchItems(node, format, item_name) { var key, value, items = format[item_name], i; // Custom match if (format.onmatch) { return format.onmatch(node, format, item_name); } // Check all items if (items) { // Non indexed object if (items.length === undef) { for (key in items) { if (items.hasOwnProperty(key)) { if (item_name === 'attributes') value = dom.getAttrib(node, key); else value = getStyle(node, key); if (similar && !value && !format.exact) return; if ((!similar || format.exact) && !isEq(value, replaceVars(items[key], vars))) return; } } } else { // Only one match needed for indexed arrays for (i = 0; i < items.length; i++) { if (item_name === 'attributes' ? dom.getAttrib(node, items[i]) : getStyle(node, items[i])) return format; } } } return format; }; if (formatList && node) { // Check each format in list for (i = 0; i < formatList.length; i++) { format = formatList[i]; // Name name, attributes, styles and classes if (matchName(node, format) && matchItems(node, format, 'attributes') && matchItems(node, format, 'styles')) { // Match classes if (classes = format.classes) { for (i = 0; i < classes.length; i++) { if (!dom.hasClass(node, classes[i])) return; } } return format; } } } }; function match(name, vars, node) { var startNode; function matchParents(node) { // Find first node with similar format settings node = dom.getParent(node, function(node) { return !!matchNode(node, name, vars, true); }); // Do an exact check on the similar format element return matchNode(node, name, vars); }; // Check specified node if (node) return matchParents(node); // Check selected node node = selection.getNode(); if (matchParents(node)) return TRUE; // Check start node if it's different startNode = selection.getStart(); if (startNode != node) { if (matchParents(startNode)) return TRUE; } return FALSE; }; function matchAll(names, vars) { var startElement, matchedFormatNames = [], checkedMap = {}, i, ni, name; // Check start of selection for formats startElement = selection.getStart(); dom.getParent(startElement, function(node) { var i, name; for (i = 0; i < names.length; i++) { name = names[i]; if (!checkedMap[name] && matchNode(node, name, vars)) { checkedMap[name] = true; matchedFormatNames.push(name); } } }, dom.getRoot()); return matchedFormatNames; }; function canApply(name) { var formatList = get(name), startNode, parents, i, x, selector; if (formatList) { startNode = selection.getStart(); parents = getParents(startNode); for (x = formatList.length - 1; x >= 0; x--) { selector = formatList[x].selector; // Format is not selector based, then always return TRUE if (!selector) return TRUE; for (i = parents.length - 1; i >= 0; i--) { if (dom.is(parents[i], selector)) return TRUE; } } } return FALSE; }; function formatChanged(formats, callback) { var currentFormats; // Setup format node change logic if (!formatChangeData) { formatChangeData = {}; currentFormats = {}; ed.onNodeChange.addToTop(function(ed, cm, node) { var parents = getParents(node), matchedFormats = {}; // Check for new formats each(formatChangeData, function(callbacks, format) { each(parents, function(node) { if (matchNode(node, format, {}, true)) { if (!currentFormats[format]) { // Execute callbacks each(callbacks, function(callback) { callback(true, {node: node, format: format, parents: parents}); }); currentFormats[format] = callbacks; } matchedFormats[format] = callbacks; return false; } }); }); // Check if current formats still match each(currentFormats, function(callbacks, format) { if (!matchedFormats[format]) { delete currentFormats[format]; each(callbacks, function(callback) { callback(false, {node: node, format: format, parents: parents}); }); } }); }); } // Add format listeners each(formats.split(','), function(format) { if (!formatChangeData[format]) { formatChangeData[format] = []; } formatChangeData[format].push(callback); }); return this; }; // Expose to public tinymce.extend(this, { get : get, register : register, apply : apply, remove : remove, toggle : toggle, match : match, matchAll : matchAll, matchNode : matchNode, canApply : canApply, formatChanged: formatChanged }); // Initialize defaultFormats(); addKeyboardShortcuts(); // Private functions function matchName(node, format) { // Check for inline match if (isEq(node, format.inline)) return TRUE; // Check for block match if (isEq(node, format.block)) return TRUE; // Check for selector match if (format.selector) return dom.is(node, format.selector); }; function isEq(str1, str2) { str1 = str1 || ''; str2 = str2 || ''; str1 = '' + (str1.nodeName || str1); str2 = '' + (str2.nodeName || str2); return str1.toLowerCase() == str2.toLowerCase(); }; function getStyle(node, name) { var styleVal = dom.getStyle(node, name); // Force the format to hex if (name == 'color' || name == 'backgroundColor') styleVal = dom.toHex(styleVal); // Opera will return bold as 700 if (name == 'fontWeight' && styleVal == 700) styleVal = 'bold'; return '' + styleVal; }; function replaceVars(value, vars) { if (typeof(value) != "string") value = value(vars); else if (vars) { value = value.replace(/%(\w+)/g, function(str, name) { return vars[name] || str; }); } return value; }; function isWhiteSpaceNode(node) { return node && node.nodeType === 3 && /^([\t \r\n]+|)$/.test(node.nodeValue); }; function wrap(node, name, attrs) { var wrapper = dom.create(name, attrs); node.parentNode.insertBefore(wrapper, node); wrapper.appendChild(node); return wrapper; }; function expandRng(rng, format, remove) { var sibling, lastIdx, leaf, endPoint, startContainer = rng.startContainer, startOffset = rng.startOffset, endContainer = rng.endContainer, endOffset = rng.endOffset; // This function walks up the tree if there is no siblings before/after the node function findParentContainer(start) { var container, parent, child, sibling, siblingName, root; container = parent = start ? startContainer : endContainer; siblingName = start ? 'previousSibling' : 'nextSibling'; root = dom.getRoot(); // If it's a text node and the offset is inside the text if (container.nodeType == 3 && !isWhiteSpaceNode(container)) { if (start ? startOffset > 0 : endOffset < container.nodeValue.length) { return container; } } for (;;) { // Stop expanding on block elements if (!format[0].block_expand && isBlock(parent)) return parent; // Walk left/right for (sibling = parent[siblingName]; sibling; sibling = sibling[siblingName]) { if (!isBookmarkNode(sibling) && !isWhiteSpaceNode(sibling)) { return parent; } } // Check if we can move up are we at root level or body level if (parent.parentNode == root) { container = parent; break; } parent = parent.parentNode; } return container; }; // This function walks down the tree to find the leaf at the selection. // The offset is also returned as if node initially a leaf, the offset may be in the middle of the text node. function findLeaf(node, offset) { if (offset === undef) offset = node.nodeType === 3 ? node.length : node.childNodes.length; while (node && node.hasChildNodes()) { node = node.childNodes[offset]; if (node) offset = node.nodeType === 3 ? node.length : node.childNodes.length; } return { node: node, offset: offset }; } // If index based start position then resolve it if (startContainer.nodeType == 1 && startContainer.hasChildNodes()) { lastIdx = startContainer.childNodes.length - 1; startContainer = startContainer.childNodes[startOffset > lastIdx ? lastIdx : startOffset]; if (startContainer.nodeType == 3) startOffset = 0; } // If index based end position then resolve it if (endContainer.nodeType == 1 && endContainer.hasChildNodes()) { lastIdx = endContainer.childNodes.length - 1; endContainer = endContainer.childNodes[endOffset > lastIdx ? lastIdx : endOffset - 1]; if (endContainer.nodeType == 3) endOffset = endContainer.nodeValue.length; } // Expands the node to the closes contentEditable false element if it exists function findParentContentEditable(node) { var parent = node; while (parent) { if (parent.nodeType === 1 && getContentEditable(parent)) { return getContentEditable(parent) === "false" ? parent : node; } parent = parent.parentNode; } return node; }; function findWordEndPoint(container, offset, start) { var walker, node, pos, lastTextNode; function findSpace(node, offset) { var pos, pos2, str = node.nodeValue; if (typeof(offset) == "undefined") { offset = start ? str.length : 0; } if (start) { pos = str.lastIndexOf(' ', offset); pos2 = str.lastIndexOf('\u00a0', offset); pos = pos > pos2 ? pos : pos2; // Include the space on remove to avoid tag soup if (pos !== -1 && !remove) { pos++; } } else { pos = str.indexOf(' ', offset); pos2 = str.indexOf('\u00a0', offset); pos = pos !== -1 && (pos2 === -1 || pos < pos2) ? pos : pos2; } return pos; }; if (container.nodeType === 3) { pos = findSpace(container, offset); if (pos !== -1) { return {container : container, offset : pos}; } lastTextNode = container; } // Walk the nodes inside the block walker = new TreeWalker(container, dom.getParent(container, isBlock) || ed.getBody()); while (node = walker[start ? 'prev' : 'next']()) { if (node.nodeType === 3) { lastTextNode = node; pos = findSpace(node); if (pos !== -1) { return {container : node, offset : pos}; } } else if (isBlock(node)) { break; } } if (lastTextNode) { if (start) { offset = 0; } else { offset = lastTextNode.length; } return {container: lastTextNode, offset: offset}; } }; function findSelectorEndPoint(container, sibling_name) { var parents, i, y, curFormat; if (container.nodeType == 3 && container.nodeValue.length === 0 && container[sibling_name]) container = container[sibling_name]; parents = getParents(container); for (i = 0; i < parents.length; i++) { for (y = 0; y < format.length; y++) { curFormat = format[y]; // If collapsed state is set then skip formats that doesn't match that if ("collapsed" in curFormat && curFormat.collapsed !== rng.collapsed) continue; if (dom.is(parents[i], curFormat.selector)) return parents[i]; } } return container; }; function findBlockEndPoint(container, sibling_name, sibling_name2) { var node; // Expand to block of similar type if (!format[0].wrapper) node = dom.getParent(container, format[0].block); // Expand to first wrappable block element or any block element if (!node) node = dom.getParent(container.nodeType == 3 ? container.parentNode : container, isBlock); // Exclude inner lists from wrapping if (node && format[0].wrapper) node = getParents(node, 'ul,ol').reverse()[0] || node; // Didn't find a block element look for first/last wrappable element if (!node) { node = container; while (node[sibling_name] && !isBlock(node[sibling_name])) { node = node[sibling_name]; // Break on BR but include it will be removed later on // we can't remove it now since we need to check if it can be wrapped if (isEq(node, 'br')) break; } } return node || container; }; // Expand to closest contentEditable element startContainer = findParentContentEditable(startContainer); endContainer = findParentContentEditable(endContainer); // Exclude bookmark nodes if possible if (isBookmarkNode(startContainer.parentNode) || isBookmarkNode(startContainer)) { startContainer = isBookmarkNode(startContainer) ? startContainer : startContainer.parentNode; startContainer = startContainer.nextSibling || startContainer; if (startContainer.nodeType == 3) startOffset = 0; } if (isBookmarkNode(endContainer.parentNode) || isBookmarkNode(endContainer)) { endContainer = isBookmarkNode(endContainer) ? endContainer : endContainer.parentNode; endContainer = endContainer.previousSibling || endContainer; if (endContainer.nodeType == 3) endOffset = endContainer.length; } if (format[0].inline) { if (rng.collapsed) { // Expand left to closest word boundery endPoint = findWordEndPoint(startContainer, startOffset, true); if (endPoint) { startContainer = endPoint.container; startOffset = endPoint.offset; } // Expand right to closest word boundery endPoint = findWordEndPoint(endContainer, endOffset); if (endPoint) { endContainer = endPoint.container; endOffset = endPoint.offset; } } // Avoid applying formatting to a trailing space. leaf = findLeaf(endContainer, endOffset); if (leaf.node) { while (leaf.node && leaf.offset === 0 && leaf.node.previousSibling) leaf = findLeaf(leaf.node.previousSibling); if (leaf.node && leaf.offset > 0 && leaf.node.nodeType === 3 && leaf.node.nodeValue.charAt(leaf.offset - 1) === ' ') { if (leaf.offset > 1) { endContainer = leaf.node; endContainer.splitText(leaf.offset - 1); } } } } // Move start/end point up the tree if the leaves are sharp and if we are in different containers // Example * becomes !: !

        *texttext*

        ! // This will reduce the number of wrapper elements that needs to be created // Move start point up the tree if (format[0].inline || format[0].block_expand) { if (!format[0].inline || (startContainer.nodeType != 3 || startOffset === 0)) { startContainer = findParentContainer(true); } if (!format[0].inline || (endContainer.nodeType != 3 || endOffset === endContainer.nodeValue.length)) { endContainer = findParentContainer(); } } // Expand start/end container to matching selector if (format[0].selector && format[0].expand !== FALSE && !format[0].inline) { // Find new startContainer/endContainer if there is better one startContainer = findSelectorEndPoint(startContainer, 'previousSibling'); endContainer = findSelectorEndPoint(endContainer, 'nextSibling'); } // Expand start/end container to matching block element or text node if (format[0].block || format[0].selector) { // Find new startContainer/endContainer if there is better one startContainer = findBlockEndPoint(startContainer, 'previousSibling'); endContainer = findBlockEndPoint(endContainer, 'nextSibling'); // Non block element then try to expand up the leaf if (format[0].block) { if (!isBlock(startContainer)) startContainer = findParentContainer(true); if (!isBlock(endContainer)) endContainer = findParentContainer(); } } // Setup index for startContainer if (startContainer.nodeType == 1) { startOffset = nodeIndex(startContainer); startContainer = startContainer.parentNode; } // Setup index for endContainer if (endContainer.nodeType == 1) { endOffset = nodeIndex(endContainer) + 1; endContainer = endContainer.parentNode; } // Return new range like object return { startContainer : startContainer, startOffset : startOffset, endContainer : endContainer, endOffset : endOffset }; } function removeFormat(format, vars, node, compare_node) { var i, attrs, stylesModified; // Check if node matches format if (!matchName(node, format)) return FALSE; // Should we compare with format attribs and styles if (format.remove != 'all') { // Remove styles each(format.styles, function(value, name) { value = replaceVars(value, vars); // Indexed array if (typeof(name) === 'number') { name = value; compare_node = 0; } if (!compare_node || isEq(getStyle(compare_node, name), value)) dom.setStyle(node, name, ''); stylesModified = 1; }); // Remove style attribute if it's empty if (stylesModified && dom.getAttrib(node, 'style') == '') { node.removeAttribute('style'); node.removeAttribute('data-mce-style'); } // Remove attributes each(format.attributes, function(value, name) { var valueOut; value = replaceVars(value, vars); // Indexed array if (typeof(name) === 'number') { name = value; compare_node = 0; } if (!compare_node || isEq(dom.getAttrib(compare_node, name), value)) { // Keep internal classes if (name == 'class') { value = dom.getAttrib(node, name); if (value) { // Build new class value where everything is removed except the internal prefixed classes valueOut = ''; each(value.split(/\s+/), function(cls) { if (/mce\w+/.test(cls)) valueOut += (valueOut ? ' ' : '') + cls; }); // We got some internal classes left if (valueOut) { dom.setAttrib(node, name, valueOut); return; } } } // IE6 has a bug where the attribute doesn't get removed correctly if (name == "class") node.removeAttribute('className'); // Remove mce prefixed attributes if (MCE_ATTR_RE.test(name)) node.removeAttribute('data-mce-' + name); node.removeAttribute(name); } }); // Remove classes each(format.classes, function(value) { value = replaceVars(value, vars); if (!compare_node || dom.hasClass(compare_node, value)) dom.removeClass(node, value); }); // Check for non internal attributes attrs = dom.getAttribs(node); for (i = 0; i < attrs.length; i++) { if (attrs[i].nodeName.indexOf('_') !== 0) return FALSE; } } // Remove the inline child if it's empty for example or if (format.remove != 'none') { removeNode(node, format); return TRUE; } }; function removeNode(node, format) { var parentNode = node.parentNode, rootBlockElm; function find(node, next, inc) { node = getNonWhiteSpaceSibling(node, next, inc); return !node || (node.nodeName == 'BR' || isBlock(node)); }; if (format.block) { if (!forcedRootBlock) { // Append BR elements if needed before we remove the block if (isBlock(node) && !isBlock(parentNode)) { if (!find(node, FALSE) && !find(node.firstChild, TRUE, 1)) node.insertBefore(dom.create('br'), node.firstChild); if (!find(node, TRUE) && !find(node.lastChild, FALSE, 1)) node.appendChild(dom.create('br')); } } else { // Wrap the block in a forcedRootBlock if we are at the root of document if (parentNode == dom.getRoot()) { if (!format.list_block || !isEq(node, format.list_block)) { each(tinymce.grep(node.childNodes), function(node) { if (isValid(forcedRootBlock, node.nodeName.toLowerCase())) { if (!rootBlockElm) rootBlockElm = wrap(node, forcedRootBlock); else rootBlockElm.appendChild(node); } else rootBlockElm = 0; }); } } } } // Never remove nodes that isn't the specified inline element if a selector is specified too if (format.selector && format.inline && !isEq(format.inline, node)) return; dom.remove(node, 1); }; function getNonWhiteSpaceSibling(node, next, inc) { if (node) { next = next ? 'nextSibling' : 'previousSibling'; for (node = inc ? node : node[next]; node; node = node[next]) { if (node.nodeType == 1 || !isWhiteSpaceNode(node)) return node; } } }; function isBookmarkNode(node) { return node && node.nodeType == 1 && node.getAttribute('data-mce-type') == 'bookmark'; }; function mergeSiblings(prev, next) { var marker, sibling, tmpSibling; function compareElements(node1, node2) { // Not the same name if (node1.nodeName != node2.nodeName) return FALSE; function getAttribs(node) { var attribs = {}; each(dom.getAttribs(node), function(attr) { var name = attr.nodeName.toLowerCase(); // Don't compare internal attributes or style if (name.indexOf('_') !== 0 && name !== 'style') attribs[name] = dom.getAttrib(node, name); }); return attribs; }; function compareObjects(obj1, obj2) { var value, name; for (name in obj1) { // Obj1 has item obj2 doesn't have if (obj1.hasOwnProperty(name)) { value = obj2[name]; // Obj2 doesn't have obj1 item if (value === undef) return FALSE; // Obj2 item has a different value if (obj1[name] != value) return FALSE; // Delete similar value delete obj2[name]; } } // Check if obj 2 has something obj 1 doesn't have for (name in obj2) { // Obj2 has item obj1 doesn't have if (obj2.hasOwnProperty(name)) return FALSE; } return TRUE; }; // Attribs are not the same if (!compareObjects(getAttribs(node1), getAttribs(node2))) return FALSE; // Styles are not the same if (!compareObjects(dom.parseStyle(dom.getAttrib(node1, 'style')), dom.parseStyle(dom.getAttrib(node2, 'style')))) return FALSE; return TRUE; }; function findElementSibling(node, sibling_name) { for (sibling = node; sibling; sibling = sibling[sibling_name]) { if (sibling.nodeType == 3 && sibling.nodeValue.length !== 0) return node; if (sibling.nodeType == 1 && !isBookmarkNode(sibling)) return sibling; } return node; }; // Check if next/prev exists and that they are elements if (prev && next) { // If previous sibling is empty then jump over it prev = findElementSibling(prev, 'previousSibling'); next = findElementSibling(next, 'nextSibling'); // Compare next and previous nodes if (compareElements(prev, next)) { // Append nodes between for (sibling = prev.nextSibling; sibling && sibling != next;) { tmpSibling = sibling; sibling = sibling.nextSibling; prev.appendChild(tmpSibling); } // Remove next node dom.remove(next); // Move children into prev node each(tinymce.grep(next.childNodes), function(node) { prev.appendChild(node); }); return prev; } } return next; }; function isTextBlock(name) { return /^(h[1-6]|p|div|pre|address|dl|dt|dd)$/.test(name); }; function getContainer(rng, start) { var container, offset, lastIdx, walker; container = rng[start ? 'startContainer' : 'endContainer']; offset = rng[start ? 'startOffset' : 'endOffset']; if (container.nodeType == 1) { lastIdx = container.childNodes.length - 1; if (!start && offset) offset--; container = container.childNodes[offset > lastIdx ? lastIdx : offset]; } // If start text node is excluded then walk to the next node if (container.nodeType === 3 && start && offset >= container.nodeValue.length) { container = new TreeWalker(container, ed.getBody()).next() || container; } // If end text node is excluded then walk to the previous node if (container.nodeType === 3 && !start && offset === 0) { container = new TreeWalker(container, ed.getBody()).prev() || container; } return container; }; function performCaretAction(type, name, vars) { var caretContainerId = '_mce_caret', debug = ed.settings.caret_debug; // Creates a caret container bogus element function createCaretContainer(fill) { var caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true, style: debug ? 'color:red' : ''}); if (fill) { caretContainer.appendChild(ed.getDoc().createTextNode(INVISIBLE_CHAR)); } return caretContainer; }; function isCaretContainerEmpty(node, nodes) { while (node) { if ((node.nodeType === 3 && node.nodeValue !== INVISIBLE_CHAR) || node.childNodes.length > 1) { return false; } // Collect nodes if (nodes && node.nodeType === 1) { nodes.push(node); } node = node.firstChild; } return true; }; // Returns any parent caret container element function getParentCaretContainer(node) { while (node) { if (node.id === caretContainerId) { return node; } node = node.parentNode; } }; // Finds the first text node in the specified node function findFirstTextNode(node) { var walker; if (node) { walker = new TreeWalker(node, node); for (node = walker.current(); node; node = walker.next()) { if (node.nodeType === 3) { return node; } } } }; // Removes the caret container for the specified node or all on the current document function removeCaretContainer(node, move_caret) { var child, rng; if (!node) { node = getParentCaretContainer(selection.getStart()); if (!node) { while (node = dom.get(caretContainerId)) { removeCaretContainer(node, false); } } } else { rng = selection.getRng(true); if (isCaretContainerEmpty(node)) { if (move_caret !== false) { rng.setStartBefore(node); rng.setEndBefore(node); } dom.remove(node); } else { child = findFirstTextNode(node); if (child.nodeValue.charAt(0) === INVISIBLE_CHAR) { child = child.deleteData(0, 1); } dom.remove(node, 1); } selection.setRng(rng); } }; // Applies formatting to the caret postion function applyCaretFormat() { var rng, caretContainer, textNode, offset, bookmark, container, text; rng = selection.getRng(true); offset = rng.startOffset; container = rng.startContainer; text = container.nodeValue; caretContainer = getParentCaretContainer(selection.getStart()); if (caretContainer) { textNode = findFirstTextNode(caretContainer); } // Expand to word is caret is in the middle of a text node and the char before/after is a alpha numeric character if (text && offset > 0 && offset < text.length && /\w/.test(text.charAt(offset)) && /\w/.test(text.charAt(offset - 1))) { // Get bookmark of caret position bookmark = selection.getBookmark(); // Collapse bookmark range (WebKit) rng.collapse(true); // Expand the range to the closest word and split it at those points rng = expandRng(rng, get(name)); rng = rangeUtils.split(rng); // Apply the format to the range apply(name, vars, rng); // Move selection back to caret position selection.moveToBookmark(bookmark); } else { if (!caretContainer || textNode.nodeValue !== INVISIBLE_CHAR) { caretContainer = createCaretContainer(true); textNode = caretContainer.firstChild; rng.insertNode(caretContainer); offset = 1; apply(name, vars, caretContainer); } else { apply(name, vars, caretContainer); } // Move selection to text node selection.setCursorLocation(textNode, offset); } }; function removeCaretFormat() { var rng = selection.getRng(true), container, offset, bookmark, hasContentAfter, node, formatNode, parents = [], i, caretContainer; container = rng.startContainer; offset = rng.startOffset; node = container; if (container.nodeType == 3) { if (offset != container.nodeValue.length || container.nodeValue === INVISIBLE_CHAR) { hasContentAfter = true; } node = node.parentNode; } while (node) { if (matchNode(node, name, vars)) { formatNode = node; break; } if (node.nextSibling) { hasContentAfter = true; } parents.push(node); node = node.parentNode; } // Node doesn't have the specified format if (!formatNode) { return; } // Is there contents after the caret then remove the format on the element if (hasContentAfter) { // Get bookmark of caret position bookmark = selection.getBookmark(); // Collapse bookmark range (WebKit) rng.collapse(true); // Expand the range to the closest word and split it at those points rng = expandRng(rng, get(name), true); rng = rangeUtils.split(rng); // Remove the format from the range remove(name, vars, rng); // Move selection back to caret position selection.moveToBookmark(bookmark); } else { caretContainer = createCaretContainer(); node = caretContainer; for (i = parents.length - 1; i >= 0; i--) { node.appendChild(dom.clone(parents[i], false)); node = node.firstChild; } // Insert invisible character into inner most format element node.appendChild(dom.doc.createTextNode(INVISIBLE_CHAR)); node = node.firstChild; // Insert caret container after the formated node dom.insertAfter(caretContainer, formatNode); // Move selection to text node selection.setCursorLocation(node, 1); } }; // Checks if the parent caret container node isn't empty if that is the case it // will remove the bogus state on all children that isn't empty function unmarkBogusCaretParents() { var i, caretContainer, node; caretContainer = getParentCaretContainer(selection.getStart()); if (caretContainer && !dom.isEmpty(caretContainer)) { tinymce.walk(caretContainer, function(node) { if (node.nodeType == 1 && node.id !== caretContainerId && !dom.isEmpty(node)) { dom.setAttrib(node, 'data-mce-bogus', null); } }, 'childNodes'); } }; // Only bind the caret events once if (!self._hasCaretEvents) { // Mark current caret container elements as bogus when getting the contents so we don't end up with empty elements ed.onBeforeGetContent.addToTop(function() { var nodes = [], i; if (isCaretContainerEmpty(getParentCaretContainer(selection.getStart()), nodes)) { // Mark children i = nodes.length; while (i--) { dom.setAttrib(nodes[i], 'data-mce-bogus', '1'); } } }); // Remove caret container on mouse up and on key up tinymce.each('onMouseUp onKeyUp'.split(' '), function(name) { ed[name].addToTop(function() { removeCaretContainer(); unmarkBogusCaretParents(); }); }); // Remove caret container on keydown and it's a backspace, enter or left/right arrow keys ed.onKeyDown.addToTop(function(ed, e) { var keyCode = e.keyCode; if (keyCode == 8 || keyCode == 37 || keyCode == 39) { removeCaretContainer(getParentCaretContainer(selection.getStart())); } unmarkBogusCaretParents(); }); // Remove bogus state if they got filled by contents using editor.selection.setContent selection.onSetContent.add(unmarkBogusCaretParents); self._hasCaretEvents = true; } // Do apply or remove caret format if (type == "apply") { applyCaretFormat(); } else { removeCaretFormat(); } }; function moveStart(rng) { var container = rng.startContainer, offset = rng.startOffset, isAtEndOfText, walker, node, nodes, tmpNode; // Convert text node into index if possible if (container.nodeType == 3 && offset >= container.nodeValue.length) { // Get the parent container location and walk from there offset = nodeIndex(container); container = container.parentNode; isAtEndOfText = true; } // Move startContainer/startOffset in to a suitable node if (container.nodeType == 1) { nodes = container.childNodes; container = nodes[Math.min(offset, nodes.length - 1)]; walker = new TreeWalker(container, dom.getParent(container, dom.isBlock)); // If offset is at end of the parent node walk to the next one if (offset > nodes.length - 1 || isAtEndOfText) walker.next(); for (node = walker.current(); node; node = walker.next()) { if (node.nodeType == 3 && !isWhiteSpaceNode(node)) { // IE has a "neat" feature where it moves the start node into the closest element // we can avoid this by inserting an element before it and then remove it after we set the selection tmpNode = dom.create('a', null, INVISIBLE_CHAR); node.parentNode.insertBefore(tmpNode, node); // Set selection and remove tmpNode rng.setStart(node, 0); selection.setRng(rng); dom.remove(tmpNode); return; } } } }; }; })(tinymce); tinymce.onAddEditor.add(function(tinymce, ed) { var filters, fontSizes, dom, settings = ed.settings; function replaceWithSpan(node, styles) { tinymce.each(styles, function(value, name) { if (value) dom.setStyle(node, name, value); }); dom.rename(node, 'span'); }; function convert(editor, params) { dom = editor.dom; if (settings.convert_fonts_to_spans) { tinymce.each(dom.select('font,u,strike', params.node), function(node) { filters[node.nodeName.toLowerCase()](ed.dom, node); }); } }; if (settings.inline_styles) { fontSizes = tinymce.explode(settings.font_size_legacy_values); filters = { font : function(dom, node) { replaceWithSpan(node, { backgroundColor : node.style.backgroundColor, color : node.color, fontFamily : node.face, fontSize : fontSizes[parseInt(node.size, 10) - 1] }); }, u : function(dom, node) { replaceWithSpan(node, { textDecoration : 'underline' }); }, strike : function(dom, node) { replaceWithSpan(node, { textDecoration : 'line-through' }); } }; ed.onPreProcess.add(convert); ed.onSetContent.add(convert); ed.onInit.add(function() { ed.selection.onSetContent.add(convert); }); } }); (function(tinymce) { var TreeWalker = tinymce.dom.TreeWalker; tinymce.EnterKey = function(editor) { var dom = editor.dom, selection = editor.selection, settings = editor.settings, undoManager = editor.undoManager; function handleEnterKey(evt) { var rng = selection.getRng(true), tmpRng, editableRoot, container, offset, parentBlock, documentMode, newBlock, fragment, containerBlock, parentBlockName, containerBlockName, newBlockName, isAfterLastNodeInContainer; // Returns true if the block can be split into two blocks or not function canSplitBlock(node) { return node && dom.isBlock(node) && !/^(TD|TH|CAPTION)$/.test(node.nodeName) && !/^(fixed|absolute)/i.test(node.style.position) && dom.getContentEditable(node) !== "true"; }; // Moves the caret to a suitable position within the root for example in the first non pure whitespace text node or before an image function moveToCaretPosition(root) { var walker, node, rng, y, viewPort, lastNode = root, tempElm; rng = dom.createRng(); if (root.hasChildNodes()) { walker = new TreeWalker(root, root); while (node = walker.current()) { if (node.nodeType == 3) { rng.setStart(node, 0); rng.setEnd(node, 0); break; } if (/^(BR|IMG)$/.test(node.nodeName)) { rng.setStartBefore(node); rng.setEndBefore(node); break; } lastNode = node; node = walker.next(); } if (!node) { rng.setStart(lastNode, 0); rng.setEnd(lastNode, 0); } } else { if (root.nodeName == 'BR') { if (root.nextSibling && dom.isBlock(root.nextSibling)) { // Trick on older IE versions to render the caret before the BR between two lists if (!documentMode || documentMode < 9) { tempElm = dom.create('br'); root.parentNode.insertBefore(tempElm, root); } rng.setStartBefore(root); rng.setEndBefore(root); } else { rng.setStartAfter(root); rng.setEndAfter(root); } } else { rng.setStart(root, 0); rng.setEnd(root, 0); } } selection.setRng(rng); // Remove tempElm created for old IE:s dom.remove(tempElm); viewPort = dom.getViewPort(editor.getWin()); // scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs y = dom.getPos(root).y; if (y < viewPort.y || y + 25 > viewPort.y + viewPort.h) { editor.getWin().scrollTo(0, y < viewPort.y ? y : y - viewPort.h + 25); // Needs to be hardcoded to roughly one line of text if a huge text block is broken into two blocks } }; // Creates a new block element by cloning the current one or creating a new one if the name is specified // This function will also copy any text formatting from the parent block and add it to the new one function createNewBlock(name) { var node = container, block, clonedNode, caretNode; block = name || parentBlockName == "TABLE" ? dom.create(name || newBlockName) : parentBlock.cloneNode(false); caretNode = block; // Clone any parent styles if (settings.keep_styles !== false) { do { if (/^(SPAN|STRONG|B|EM|I|FONT|STRIKE|U)$/.test(node.nodeName)) { clonedNode = node.cloneNode(false); dom.setAttrib(clonedNode, 'id', ''); // Remove ID since it needs to be document unique if (block.hasChildNodes()) { clonedNode.appendChild(block.firstChild); block.appendChild(clonedNode); } else { caretNode = clonedNode; block.appendChild(clonedNode); } } } while (node = node.parentNode); } // BR is needed in empty blocks on non IE browsers if (!tinymce.isIE) { caretNode.innerHTML = '
        '; } return block; }; // Returns true/false if the caret is at the start/end of the parent block element function isCaretAtStartOrEndOfBlock(start) { var walker, node, name; // Caret is in the middle of a text node like "a|b" if (container.nodeType == 3 && (start ? offset > 0 : offset < container.nodeValue.length)) { return false; } // If after the last element in block node edge case for #5091 if (container.parentNode == parentBlock && isAfterLastNodeInContainer && !start) { return true; } // Caret can be before/after a table if (container.nodeName === "TABLE" || (container.previousSibling && container.previousSibling.nodeName == "TABLE")) { return (isAfterLastNodeInContainer && !start) || (!isAfterLastNodeInContainer && start); } // Walk the DOM and look for text nodes or non empty elements walker = new TreeWalker(container, parentBlock); while (node = (start ? walker.prev() : walker.next())) { if (node.nodeType === 1) { // Ignore bogus elements if (node.getAttribute('data-mce-bogus')) { continue; } // Keep empty elements like name = node.nodeName.toLowerCase(); if (name === 'IMG') { return false; } } else if (node.nodeType === 3 && !/^[ \t\r\n]*$/.test(node.nodeValue)) { return false; } } return true; }; // Wraps any text nodes or inline elements in the specified forced root block name function wrapSelfAndSiblingsInDefaultBlock(container, offset) { var newBlock, parentBlock, startNode, node, next, blockName = newBlockName || 'P'; // Not in a block element or in a table cell or caption parentBlock = dom.getParent(container, dom.isBlock); if (!parentBlock || !canSplitBlock(parentBlock)) { parentBlock = parentBlock || editableRoot; if (!parentBlock.hasChildNodes()) { newBlock = dom.create(blockName); parentBlock.appendChild(newBlock); rng.setStart(newBlock, 0); rng.setEnd(newBlock, 0); return newBlock; } // Find parent that is the first child of parentBlock node = container; while (node.parentNode != parentBlock) { node = node.parentNode; } // Loop left to find start node start wrapping at while (node && !dom.isBlock(node)) { startNode = node; node = node.previousSibling; } if (startNode) { newBlock = dom.create(blockName); startNode.parentNode.insertBefore(newBlock, startNode); // Start wrapping until we hit a block node = startNode; while (node && !dom.isBlock(node)) { next = node.nextSibling; newBlock.appendChild(node); node = next; } // Restore range to it's past location rng.setStart(container, offset); rng.setEnd(container, offset); } } return container; }; // Inserts a block or br before/after or in the middle of a split list of the LI is empty function handleEmptyListItem() { function isFirstOrLastLi(first) { var node = containerBlock[first ? 'firstChild' : 'lastChild']; // Find first/last element since there might be whitespace there while (node) { if (node.nodeType == 1) { break; } node = node[first ? 'nextSibling' : 'previousSibling']; } return node === parentBlock; }; newBlock = newBlockName ? createNewBlock(newBlockName) : dom.create('BR'); if (isFirstOrLastLi(true) && isFirstOrLastLi()) { // Is first and last list item then replace the OL/UL with a text block dom.replace(newBlock, containerBlock); } else if (isFirstOrLastLi(true)) { // First LI in list then remove LI and add text block before list containerBlock.parentNode.insertBefore(newBlock, containerBlock); } else if (isFirstOrLastLi()) { // Last LI in list then temove LI and add text block after list dom.insertAfter(newBlock, containerBlock); } else { // Middle LI in list the split the list and insert a text block in the middle // Extract after fragment and insert it after the current block tmpRng = rng.cloneRange(); tmpRng.setStartAfter(parentBlock); tmpRng.setEndAfter(containerBlock); fragment = tmpRng.extractContents(); dom.insertAfter(fragment, containerBlock); dom.insertAfter(newBlock, containerBlock); } dom.remove(parentBlock); moveToCaretPosition(newBlock); undoManager.add(); }; // Walks the parent block to the right and look for BR elements function hasRightSideBr() { var walker = new TreeWalker(container, parentBlock), node; while (node = walker.current()) { if (node.nodeName == 'BR') { return true; } node = walker.next(); } } // Inserts a BR element if the forced_root_block option is set to false or empty string function insertBr() { var brElm, extraBr; if (container && container.nodeType == 3 && offset >= container.nodeValue.length) { // Insert extra BR element at the end block elements if (!tinymce.isIE && !hasRightSideBr()) { brElm = dom.create('br') rng.insertNode(brElm); rng.setStartAfter(brElm); rng.setEndAfter(brElm); extraBr = true; } } brElm = dom.create('br'); rng.insertNode(brElm); // Rendering modes below IE8 doesn't display BR elements in PRE unless we have a \n before it if (tinymce.isIE && parentBlockName == 'PRE' && (!documentMode || documentMode < 8)) { brElm.parentNode.insertBefore(dom.doc.createTextNode('\r'), brElm); } if (!extraBr) { rng.setStartAfter(brElm); rng.setEndAfter(brElm); } else { rng.setStartBefore(brElm); rng.setEndBefore(brElm); } selection.setRng(rng); undoManager.add(); }; // Trims any linebreaks at the beginning of node user for example when pressing enter in a PRE element function trimLeadingLineBreaks(node) { do { if (node.nodeType === 3) { node.nodeValue = node.nodeValue.replace(/^[\r\n]+/, ''); } node = node.firstChild; } while (node); }; function getEditableRoot(node) { var root = dom.getRoot(), parent, editableRoot; // Get all parents until we hit a non editable parent or the root parent = node; while (parent !== root && dom.getContentEditable(parent) !== "false") { if (dom.getContentEditable(parent) === "true") { editableRoot = parent; } parent = parent.parentNode; } return parent !== root ? editableRoot : root; }; // Delete any selected contents if (!rng.collapsed) { editor.execCommand('Delete'); return; } // Event is blocked by some other handler for example the lists plugin if (evt.isDefaultPrevented()) { return; } // Setup range items and newBlockName container = rng.startContainer; offset = rng.startOffset; newBlockName = settings.forced_root_block; newBlockName = newBlockName ? newBlockName.toUpperCase() : ''; documentMode = dom.doc.documentMode; // Resolve node index if (container.nodeType == 1 && container.hasChildNodes()) { isAfterLastNodeInContainer = offset > container.childNodes.length - 1; container = container.childNodes[Math.min(offset, container.childNodes.length - 1)] || container; offset = 0; } // Get editable root node normaly the body element but sometimes a div or span editableRoot = getEditableRoot(container); // If there is no editable root then enter is done inside a contentEditable false element if (!editableRoot) { return; } undoManager.beforeChange(); // If editable root isn't block nor the root of the editor if (!dom.isBlock(editableRoot) && editableRoot != dom.getRoot()) { if (!newBlockName || evt.shiftKey) { insertBr(); } return; } // Wrap the current node and it's sibling in a default block if it's needed. // for example this text|text2 will become this

        text|text2

        // This won't happen if root blocks are disabled or the shiftKey is pressed if ((newBlockName && !evt.shiftKey) || (!newBlockName && evt.shiftKey)) { container = wrapSelfAndSiblingsInDefaultBlock(container, offset); } // Find parent block and setup empty block paddings parentBlock = dom.getParent(container, dom.isBlock); containerBlock = parentBlock ? dom.getParent(parentBlock.parentNode, dom.isBlock) : null; // Setup block names parentBlockName = parentBlock ? parentBlock.nodeName.toUpperCase() : ''; // IE < 9 & HTML5 containerBlockName = containerBlock ? containerBlock.nodeName.toUpperCase() : ''; // IE < 9 & HTML5 // Handle enter inside an empty list item if (parentBlockName == 'LI' && dom.isEmpty(parentBlock)) { // Let the list plugin or browser handle nested lists for now if (/^(UL|OL|LI)$/.test(containerBlock.parentNode.nodeName)) { return false; } handleEmptyListItem(); return; } // Don't split PRE tags but insert a BR instead easier when writing code samples etc if (parentBlockName == 'PRE' && settings.br_in_pre !== false) { if (!evt.shiftKey) { insertBr(); return; } } else { // If no root block is configured then insert a BR by default or if the shiftKey is pressed if ((!newBlockName && !evt.shiftKey && parentBlockName != 'LI') || (newBlockName && evt.shiftKey)) { insertBr(); return; } } // Default block name if it's not configured newBlockName = newBlockName || 'P'; // Insert new block before/after the parent block depending on caret location if (isCaretAtStartOrEndOfBlock()) { // If the caret is at the end of a header we produce a P tag after it similar to Word unless we are in a hgroup if (/^(H[1-6]|PRE)$/.test(parentBlockName) && containerBlockName != 'HGROUP') { newBlock = createNewBlock(newBlockName); } else { newBlock = createNewBlock(); } // Split the current container block element if enter is pressed inside an empty inner block element if (settings.end_container_on_empty_block && canSplitBlock(containerBlock) && dom.isEmpty(parentBlock)) { // Split container block for example a BLOCKQUOTE at the current blockParent location for example a P newBlock = dom.split(containerBlock, parentBlock); } else { dom.insertAfter(newBlock, parentBlock); } } else if (isCaretAtStartOrEndOfBlock(true)) { // Insert new block before newBlock = parentBlock.parentNode.insertBefore(createNewBlock(), parentBlock); } else { // Extract after fragment and insert it after the current block tmpRng = rng.cloneRange(); tmpRng.setEndAfter(parentBlock); fragment = tmpRng.extractContents(); trimLeadingLineBreaks(fragment); newBlock = fragment.firstChild; dom.insertAfter(fragment, parentBlock); } dom.setAttrib(newBlock, 'id', ''); // Remove ID since it needs to be document unique moveToCaretPosition(newBlock); undoManager.add(); } editor.onKeyDown.add(function(ed, evt) { if (evt.keyCode == 13) { if (handleEnterKey(evt) !== false) { evt.preventDefault(); } } }); }; })(tinymce); elfinder.html000066600000004316150472426320007237 0ustar00 elFinder 2.0
        tiny_mce.js000066600000627470150472426320006742 0ustar00(function(e){var a=/^\s*|\s*$/g,b,d="B".replace(/A(.)|B/,"$1")==="$1";var c={majorVersion:"3",minorVersion:"5.2",releaseDate:"2012-05-31",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=e.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isIE7=s.isIE&&/MSIE [7]/.test(g);s.isIE8=s.isIE&&/MSIE [8]/.test(g);s.isIE9=s.isIE&&/MSIE [9]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(e.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m0?b:[f.scope]);if(e===false){break}}a.inDispatch=false;return e}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,i,d,c,h;e=tinymce.trim(e);g=f.settings=g||{};if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^[\w\-]*:?\/\//.test(e)){h=g.base_uri?g.base_uri.path:new tinymce.util.URI(location.href).directory;e=((g.base_uri&&g.base_uri.protocol)||"http")+"://mce_host"+f.toAbsPath(h,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});c=g.base_uri;if(c){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host==="mce_host"){f.port=c.port}if(!f.host||f.host==="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var d=this,f;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:d});if((b.host!="mce_host"&&d.host!=b.host&&b.host)||d.port!=b.port||d.protocol!=b.protocol){return b.getURI()}var c=d.getURI(),e=b.getURI();if(c==e||(c.charAt(c.length-1)=="/"&&c.substr(0,c.length-1)==e)){return c}f=d.toRelPath(d.path,b.path);if(b.query){f+="?"+b.query}if(b.anchor){f+="#"+b.anchor}return f},toAbsolute:function(b,c){b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f===1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length===0||f[c]==="."){continue}if(f[c]===".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!==0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(c,e,d){var b=new Date();b.setTime(b.getTime()-1000);this.set(c,"",b,e,d)}})})();(function(){function serialize(o,quote){var i,v,t,name;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&o instanceof Array){for(i=0,v="[";i0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(name in o){if(o.hasOwnProperty(name)){v+=typeof o[name]!="function"?(v.length>1?","+quote:quote)+name+quote+":"+serialize(o[name],quote):""}}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(a){a.VK={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(b){return b.shiftKey||b.ctrlKey||b.altKey}}})(tinymce);tinymce.util.Quirks=function(d){var l=tinymce.VK,r=l.BACKSPACE,s=l.DELETE,o=d.dom,A=d.selection,q=d.settings;function c(E,D){try{d.getDoc().execCommand(E,false,D)}catch(C){}}function h(){function C(F){var D,H,E,G;D=A.getRng();H=o.getParent(D.startContainer,o.isBlock);if(F){H=o.getNext(H,o.isBlock)}if(H){E=H.firstChild;while(E&&E.nodeType==3&&E.nodeValue.length===0){E=E.nextSibling}if(E&&E.nodeName==="SPAN"){G=E.cloneNode(false)}}d.getDoc().execCommand(F?"ForwardDelete":"Delete",false,null);H=o.getParent(D.startContainer,o.isBlock);tinymce.each(o.select("span.Apple-style-span,font.Apple-style-span",H),function(I){var J=A.getBookmark();if(G){o.replace(G.cloneNode(false),I,true)}else{o.remove(I,true)}A.moveToBookmark(J)})}d.onKeyDown.add(function(D,F){var E;E=F.keyCode==s;if(!F.isDefaultPrevented()&&(E||F.keyCode==r)&&!l.modifierPressed(F)){F.preventDefault();C(E)}});d.addCommand("Delete",function(){C()})}function B(){function D(F,I){var E,H,G=I?"start":"end";E=F[G+"Container"];H=F[G+"Offset"];if(E.nodeType==1&&E.hasChildNodes()){E=E.childNodes[Math.min(I?H:(H>0?H-1:0),E.childNodes.length-1)]}return E}function C(H,L){var G,K,F,I,J=L?"start":"end",E;G=H[J+"Container"];K=H[J+"Offset"];F=o.getRoot();if(G.nodeType==1){E=K>=G.childNodes.length;G=D(H,L);if(G.nodeType==3){K=L&&!E?0:G.nodeValue.length}}if(G.nodeType==3&&((L&&K>0)||(!L&&K7){return}c("RespectVisibilityInDesign",true);o.addClass(d.getBody(),"mceHideBrInPre");d.parser.addNodeFilter("pre",function(D,F){var G=D.length,I,E,J,H;while(G--){I=D[G].getAll("br");E=I.length;while(E--){J=I[E];H=J.prev;if(H&&H.type===3&&H.value.charAt(H.value-1)!="\n"){H.value+="\n"}else{J.parent.insert(new tinymce.html.Node("#text",3),J,true).value="\n"}}}});d.serializer.addNodeFilter("pre",function(D,F){var G=D.length,I,E,J,H;while(G--){I=D[G].getAll("br");E=I.length;while(E--){J=I[E];H=J.prev;if(H&&H.type==3){H.value=H.value.replace(/\r?\n$/,"")}}}})}function f(){o.bind(d.getBody(),"mouseup",function(E){var D,C=A.getNode();if(C.nodeName=="IMG"){if(D=o.getStyle(C,"width")){o.setAttrib(C,"width",D.replace(/[^0-9%]+/g,""));o.setStyle(C,"width","")}if(D=o.getStyle(C,"height")){o.setAttrib(C,"height",D.replace(/[^0-9%]+/g,""));o.setStyle(C,"height","")}}})}function p(){d.onKeyDown.add(function(I,J){var H,C,D,F,G,K,E;H=J.keyCode==s;if(!J.isDefaultPrevented()&&(H||J.keyCode==r)&&!l.modifierPressed(J)){C=A.getRng();D=C.startContainer;F=C.startOffset;E=C.collapsed;if(D.nodeType==3&&D.nodeValue.length>0&&((F===0&&!E)||(E&&F===(H?0:1)))){nonEmptyElements=I.schema.getNonEmptyElements();J.preventDefault();G=o.create("br",{id:"__tmp"});D.parentNode.insertBefore(G,D);I.getDoc().execCommand(H?"ForwardDelete":"Delete",false,null);D=A.getRng().startContainer;K=D.previousSibling;if(K&&K.nodeType==1&&!o.isBlock(K)&&o.isEmpty(K)&&!nonEmptyElements[K.nodeName.toLowerCase()]){o.remove(K)}o.remove("__tmp")}}})}function e(){d.onKeyDown.add(function(G,H){var E,D,I,C,F;if(H.isDefaultPrevented()||H.keyCode!=l.BACKSPACE){return}E=A.getRng();D=E.startContainer;I=E.startOffset;C=o.getRoot();F=D;if(!E.collapsed||I!==0){return}while(F&&F.parentNode&&F.parentNode.firstChild==F&&F.parentNode!=C){F=F.parentNode}if(F.tagName==="BLOCKQUOTE"){G.formatter.toggle("blockquote",null,F);E.setStart(D,0);E.setEnd(D,0);A.setRng(E);A.collapse(false)}})}function k(){function C(){d._refreshContentEditable();c("StyleWithCSS",false);c("enableInlineTableEditing",false);if(!q.object_resizing){c("enableObjectResizing",false)}}if(!q.readonly){d.onBeforeExecCommand.add(C);d.onMouseDown.add(C)}}function n(){function C(D,E){tinymce.each(o.select("a"),function(H){var F=H.parentNode,G=o.getRoot();if(F.lastChild===H){while(F&&!o.isBlock(F)){if(F.parentNode.lastChild!==F||F===G){return}F=F.parentNode}o.add(F,"br",{"data-mce-bogus":1})}})}d.onExecCommand.add(function(D,E){if(E==="CreateLink"){C(D)}});d.onSetContent.add(A.onSetContent.add(C))}function t(){if(q.forced_root_block){d.onInit.add(function(){c("DefaultParagraphSeparator",q.forced_root_block)})}}function a(){function C(E,D){if(!E||!D.initial){d.execCommand("mceRepaint")}}d.onUndo.add(C);d.onRedo.add(C);d.onSetContent.add(C)}function j(){d.onKeyDown.add(function(C,D){if(!D.isDefaultPrevented()&&D.keyCode==8&&A.getNode().nodeName=="IMG"){D.preventDefault();C.undoManager.beforeChange();o.remove(A.getNode());C.undoManager.add()}})}v();e();B();if(tinymce.isWebKit){p();h();u();x();t();if(tinymce.isIDevice){i()}}if(tinymce.isIE){m();z();g();f();j()}if(tinymce.isGecko){m();b();y();k();n();a()}};(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':""","'":"'","<":"<",">":">","&":"&"};d={"<":"<",">":">","&":"&",""":'"',"'":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n1){return"&#"+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||"&#"+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||"&#"+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(s){var z={},q,n,x,r,v=d.url_converter,y=d.url_converter_scope||this;function p(D,G){var F,C,B,E;F=z[D+"-top"+G];if(!F){return}C=z[D+"-right"+G];if(F!=C){return}B=z[D+"-bottom"+G];if(C!=B){return}E=z[D+"-left"+G];if(B!=E){return}z[D+G]=E;delete z[D+"-top"+G];delete z[D+"-right"+G];delete z[D+"-bottom"+G];delete z[D+"-left"+G]}function u(C){var D=z[C],B;if(!D||D.indexOf(" ")<0){return}D=D.split(" ");B=D.length;while(B--){if(D[B]!==D[0]){return false}}z[C]=D[0];return true}function A(D,C,B,E){if(!u(C)){return}if(!u(B)){return}if(!u(E)){return}z[D]=z[C]+" "+z[B]+" "+z[E];delete z[C];delete z[B];delete z[E]}function t(B){r=true;return a[B]}function i(C,B){if(r){C=C.replace(/\uFEFF[0-9]/g,function(D){return a[D]})}if(!B){C=C.replace(/\\([\'\";:])/g,"$1")}return C}function o(C,B,F,E,G,D){G=G||D;if(G){G=i(G);return"'"+G.replace(/\'/g,"\\'")+"'"}B=i(B||F||E);if(v){B=v.call(y,B,"style")}return"url('"+B.replace(/\'/g,"\\'")+"')"}if(s){s=s.replace(/\\[\"\';:\uFEFF]/g,t).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(B){return B.replace(/[;:]/g,t)});while(q=b.exec(s)){n=q[1].replace(l,"").toLowerCase();x=q[2].replace(l,"");if(n&&x.length>0){if(n==="font-weight"&&x==="700"){x="bold"}else{if(n==="color"||n==="background-color"){x=x.toLowerCase()}}x=x.replace(k,c);x=x.replace(h,o);z[n]=r?i(x,true):x}b.lastIndex=q.index+q[0].length}p("border","");p("border","-width");p("border","-color");p("border","-style");p("padding","");p("margin","");A("border","border-width","border-style","border-color");if(z.border==="medium none"){delete z.border}}return z},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(f){var a={},e=f.makeMap,g=f.each;function d(j,i){return j.split(i||",")}function h(m,l){var j,k={};function i(n){return n.replace(/[A-Z]+/g,function(o){return i(m[o])})}for(j in m){if(m.hasOwnProperty(j)){m[j]=i(m[j])}}i(l).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(q,o,n,p){n=d(n,"|");k[o]={attributes:e(n),attributesOrder:n,children:e(p,"|",{"#comment":{}})}});return k}function b(){var i=a.html5;if(!i){i=a.html5=h({A:"id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title",B:"#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|meta|meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video",C:"#|a|abbr|area|address|article|aside|audio|b|bdo|blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|dl|em|embed|fieldset|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|nav|noscript|ol|object|output|p|pre|progress|q|ruby|samp|script|section|select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video"},"html[A|manifest][body|head]head[A][base|command|link|meta|noscript|script|style|title]title[A][#]base[A|href|target][]link[A|href|rel|media|type|sizes][]meta[A|http-equiv|name|content|charset][]style[A|type|media|scoped][#]script[A|charset|type|src|defer|async][#]noscript[A][C]body[A][C]section[A][C]nav[A][C]article[A][C]aside[A][C]h1[A][B]h2[A][B]h3[A][B]h4[A][B]h5[A][B]h6[A][B]hgroup[A][h1|h2|h3|h4|h5|h6]header[A][C]footer[A][C]address[A][C]p[A][B]br[A][]pre[A][B]dialog[A][dd|dt]blockquote[A|cite][C]ol[A|start|reversed][li]ul[A][li]li[A|value][C]dl[A][dd|dt]dt[A][B]dd[A][C]a[A|href|target|ping|rel|media|type][B]em[A][B]strong[A][B]small[A][B]cite[A][B]q[A|cite][B]dfn[A][B]abbr[A][B]code[A][B]var[A][B]samp[A][B]kbd[A][B]sub[A][B]sup[A][B]i[A][B]b[A][B]mark[A][B]progress[A|value|max][B]meter[A|value|min|max|low|high|optimum][B]time[A|datetime][B]ruby[A][B|rt|rp]rt[A][B]rp[A][B]bdo[A][B]span[A][B]ins[A|cite|datetime][B]del[A|cite|datetime][B]figure[A][C|legend|figcaption]figcaption[A][C]img[A|alt|src|height|width|usemap|ismap][]iframe[A|name|src|height|width|sandbox|seamless][]embed[A|src|height|width|type][]object[A|data|type|height|width|usemap|name|form|classid][param]param[A|name|value][]details[A|open][C|legend]command[A|type|label|icon|disabled|checked|radiogroup][]menu[A|type|label][C|li]legend[A][C|B]div[A][C]source[A|src|type|media][]audio[A|src|autobuffer|autoplay|loop|controls][source]video[A|src|autobuffer|autoplay|loop|controls|width|height|poster][source]hr[A][]form[A|accept-charset|action|autocomplete|enctype|method|name|novalidate|target][C]fieldset[A|disabled|form|name][C|legend]label[A|form|for][B]input[A|type|accept|alt|autocomplete|checked|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|height|list|max|maxlength|min|multiple|pattern|placeholder|readonly|required|size|src|step|width|files|value|name][]button[A|autofocus|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|name|value|type][B]select[A|autofocus|disabled|form|multiple|name|size][option|optgroup]datalist[A][B|option]optgroup[A|disabled|label][option]option[A|disabled|selected|label|value][]textarea[A|autofocus|disabled|form|maxlength|name|placeholder|readonly|required|rows|cols|wrap][]keygen[A|autofocus|challenge|disabled|form|keytype|name][]output[A|for|form|name][B]canvas[A|width|height][]map[A|name][B|C]area[A|shape|coords|href|alt|target|media|rel|ping|type][]mathml[A][]svg[A][]table[A|border][caption|colgroup|thead|tfoot|tbody|tr]caption[A][C]colgroup[A|span][col]col[A|span][]thead[A][tr]tfoot[A][tr]tbody[A][tr]tr[A][th|td]th[A|headers|rowspan|colspan|scope][B]td[A|headers|rowspan|colspan][C]")}return i}function c(){var i=a.html4;if(!i){i=a.html4=h({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]")}return i}f.html.Schema=function(A){var u=this,s={},k={},j=[],D,y;var o,q,z,r,v,n,p={};function m(F,E,H){var G=A[F];if(!G){G=a[F];if(!G){G=e(E," ",e(E.toUpperCase()," "));G=f.extend(G,H);a[F]=G}}else{G=e(G,",",e(G.toUpperCase()," "))}return G}A=A||{};y=A.schema=="html5"?b():c();if(A.verify_html===false){A.valid_elements="*[*]"}if(A.valid_styles){D={};g(A.valid_styles,function(F,E){D[E]=f.explode(F)})}o=m("whitespace_elements","pre script style textarea");q=m("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr");z=m("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source");r=m("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls");n=m("non_empty_elements","td th iframe video audio object",z);v=m("block_elements","h1 h2 h3 h4 h5 h6 hr p div address pre form table tbody thead tfoot th tr td li ol ul caption blockquote center dl dt dd dir fieldset noscript menu isindex samp header footer article section hgroup aside nav figure option datalist select optgroup");function i(E){return new RegExp("^"+E.replace(/([?+*])/g,".$1")+"$")}function C(L){var K,G,Z,V,aa,F,I,U,X,Q,Y,ac,O,J,W,E,S,H,ab,ad,P,T,N=/^([#+\-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,R=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,M=/[*?+]/;if(L){L=d(L);if(s["@"]){S=s["@"].attributes;H=s["@"].attributesOrder}for(K=0,G=L.length;K=0){for(U=A.length-1;U>=V;U--){T=A[U];if(T.valid){n.end(T.name)}}A.length=V}}function p(U,T,Y,X,W){var Z,V;T=T.toLowerCase();Y=T in H?T:j(Y||X||W||"");if(v&&!z&&T.indexOf("data-")!==0){Z=P[T];if(!Z&&F){V=F.length;while(V--){Z=F[V];if(Z.pattern.test(T)){break}}if(V===-1){Z=null}}if(!Z){return}if(Z.validValues&&!(Y in Z.validValues)){return}}N.map[T]=Y;N.push({name:T,value:Y})}l=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([A-Za-z0-9\\-\\:]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g");D=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:\\.|[^\"])*)\")|(?:\'((?:\\.|[^\'])*)\')|([^>\s]+)))?/g;K={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};M=e.getShortEndedElements();J=c.self_closing_elements||e.getSelfClosingElements();H=e.getBoolAttrs();v=c.validate;s=c.remove_internals;y=c.fix_self_closing;q=a.isIE;o=/^:/;while(g=l.exec(E)){if(G0&&A[A.length-1].name===I){u(I)}if(!v||(m=e.getElementRule(I))){k=true;if(v){P=m.attributes;F=m.attributePatterns}if(R=g[8]){z=R.indexOf("data-mce-type")!==-1;if(z&&s){k=false}N=[];N.map={};R.replace(D,p)}else{N=[];N.map={}}if(v&&!z){S=m.attributesRequired;L=m.attributesDefault;f=m.attributesForced;if(f){Q=f.length;while(Q--){t=f[Q];r=t.name;h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}if(L){Q=L.length;while(Q--){t=L[Q];r=t.name;if(!(r in N.map)){h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}}if(S){Q=S.length;while(Q--){if(S[Q] in N.map){break}}if(Q===-1){k=false}}if(N.map["data-mce-bogus"]){k=false}}if(k){n.start(I,N,O)}}else{k=false}if(B=K[I]){B.lastIndex=G=g.index+g[0].length;if(g=B.exec(E)){if(k){C=E.substr(G,g.index-G)}G=g.index+g[0].length}else{C=E.substr(G);G=E.length}if(k&&C.length>0){n.text(C,true)}if(k){n.end(I)}l.lastIndex=G;continue}if(!O){if(!R||R.indexOf("/")!=R.length-1){A.push({name:I,valid:k})}else{if(k){n.end(I)}}}}else{if(I=g[1]){n.comment(I)}else{if(I=g[2]){n.cdata(I)}else{if(I=g[3]){n.doctype(I)}else{if(I=g[4]){n.pi(I,g[5])}}}}}}G=g.index+g[0].length}if(G=0;Q--){I=A[Q];if(I.valid){n.end(I.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h1){v.reverse();z=n=f.filterNode(v[0].clone());for(t=0;t0){Q.value=l;Q=Q.prev}else{O=Q.prev;Q.remove();Q=O}}}function H(O){var P,l={};for(P in O){if(P!=="li"&&P!="p"){l[P]=O[P]}}return l}n=new b.html.SaxParser({validate:z,self_closing_elements:H(h.getSelfClosingElements()),cdata:function(l){B.append(K("#cdata",4)).value=l},text:function(P,l){var O;if(!L){P=P.replace(k," ");if(B.lastChild&&o[B.lastChild.name]){P=P.replace(E,"")}}if(P.length!==0){O=K("#text",3);O.raw=!!l;B.append(O).value=P}},comment:function(l){B.append(K("#comment",8)).value=l},pi:function(l,O){B.append(K(l,7)).value=O;I(B)},doctype:function(O){var l;l=B.append(K("#doctype",10));l.value=O;I(B)},start:function(l,W,P){var U,R,Q,O,S,X,V,T;Q=z?h.getElementRule(l):{};if(Q){U=K(Q.outputName||l,1);U.attributes=W;U.shortEnded=P;B.append(U);T=p[B.name];if(T&&p[U.name]&&!T[U.name]){M.push(U)}R=d.length;while(R--){S=d[R].name;if(S in W.map){F=c[S];if(F){F.push(U)}else{c[S]=[U]}}}if(o[l]){I(U)}if(!P){B=U}if(!L&&s[l]){L=true}}},end:function(l){var S,P,R,O,Q;P=z?h.getElementRule(l):{};if(P){if(o[l]){if(!L){S=B.firstChild;if(S&&S.type===3){R=S.value.replace(E,"");if(R.length>0){S.value=R;S=S.next}else{O=S.next;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.next;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}S=B.lastChild;if(S&&S.type===3){R=S.value.replace(t,"");if(R.length>0){S.value=R;S=S.prev}else{O=S.prev;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.prev;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}}S=B.prev;if(S&&S.type===3){R=S.value.replace(E,"");if(R.length>0){S.value=R}else{S.remove()}}}if(L&&s[l]){L=false}if(P.removeEmpty||P.paddEmpty){if(B.isEmpty(u)){if(P.paddEmpty){B.empty().append(new a("#text","3")).value="\u00a0"}else{if(!B.attributes.map.name&&!B.attributes.map.id){Q=B.parent;B.empty().remove();B=Q;return}}}}B=B.parent}}},h);J=B=new a(m.context||g.root_name,11);n.parse(v);if(z&&M.length){if(!m.context){j(M)}else{m.invalid=true}}if(q&&J.name=="body"){G()}if(!m.invalid){for(N in i){F=e[N];A=i[N];x=A.length;while(x--){if(!A[x].parent){A.splice(x,1)}}for(D=0,C=F.length;D0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("")},comment:function(h){c.push("")},pi:function(h,i){if(i){c.push("")}else{c.push("")}if(a){c.push("\n")}},doctype:function(h){c.push("",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n=8;k.boxModel=!e.isIE||o.compatMode=="CSS1Compat"||k.stdMode;k.hasOuterHTML="outerHTML" in o.createElement("a");k.settings=l=e.extend({keep_values:false,hex_colors:1},l);k.schema=l.schema;k.styles=new e.html.Styles({url_converter:l.url_converter,url_converter_scope:l.url_converter_scope},l.schema);if(e.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(m){k.cssFlicker=true}}k.fixDoc(o);k.events=l.ownEvents?new e.dom.EventUtils(l.proxy):e.dom.Event;e.addUnload(k.destroy,k);n=l.schema?l.schema.getBlockElements():{};k.isBlock=function(q){var p=q.nodeType;if(p){return !!(p===1&&n[q.nodeName])}return !!n[q]}},fixDoc:function(k){var j=this.settings,i;if(b&&j.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(l){k.createElement(l)});for(i in j.schema.getCustomElements()){k.createElement(i)}}},clone:function(k,i){var j=this,m,l;if(!b||k.nodeType!==1||i){return k.cloneNode(i)}l=j.doc;if(!i){m=l.createElement(k.nodeName);g(j.getAttribs(k),function(n){j.setAttrib(m,n.nodeName,j.getAttrib(k,n.nodeName))});return m}return m.firstChild},getRoot:function(){var i=this,j=i.settings;return(j&&i.get(j.root_element))||i.doc.body},getViewPort:function(j){var k,i;j=!j?this.win:j;k=j.document;i=this.boxModel?k.documentElement:k.body;return{x:j.pageXOffset||i.scrollLeft,y:j.pageYOffset||i.scrollTop,w:j.innerWidth||i.clientWidth,h:j.innerHeight||i.clientHeight}},getRect:function(l){var k,i=this,j;l=i.get(l);k=i.getPos(l);j=i.getSize(l);return{x:k.x,y:k.y,w:j.w,h:j.h}},getSize:function(l){var j=this,i,k;l=j.get(l);i=j.getStyle(l,"width");k=j.getStyle(l,"height");if(i.indexOf("px")===-1){i=0}if(k.indexOf("px")===-1){k=0}return{w:parseInt(i,10)||l.offsetWidth||l.clientWidth,h:parseInt(k,10)||l.offsetHeight||l.clientHeight}},getParent:function(k,j,i){return this.getParents(k,j,i,false)},getParents:function(s,m,k,q){var j=this,i,l=j.settings,p=[];s=j.get(s);q=q===undefined;if(l.strict_root){k=k||j.getRoot()}if(d(m,"string")){i=m;if(m==="*"){m=function(o){return o.nodeType==1}}else{m=function(o){return j.is(o,i)}}}while(s){if(s==k||!s.nodeType||s.nodeType===9){break}if(!m||m(s)){if(q){p.push(s)}else{return s}}s=s.parentNode}return q?p:null},get:function(i){var j;if(i&&this.doc&&typeof(i)=="string"){j=i;i=this.doc.getElementById(i);if(i&&i.id!==j){return this.doc.getElementsByName(j)[1]}}return i},getNext:function(j,i){return this._findSib(j,i,"nextSibling")},getPrev:function(j,i){return this._findSib(j,i,"previousSibling")},add:function(l,o,i,k,m){var j=this;return this.run(l,function(r){var q,n;q=d(o,"string")?j.doc.createElement(o):o;j.setAttribs(q,i);if(k){if(k.nodeType){q.appendChild(k)}else{j.setHTML(q,k)}}return !m?r.appendChild(q):q})},create:function(k,i,j){return this.add(this.doc.createElement(k),k,i,j,1)},createHTML:function(q,i,m){var p="",l=this,j;p+="<"+q;for(j in i){if(i.hasOwnProperty(j)){p+=" "+j+'="'+l.encode(i[j])+'"'}}if(typeof(m)!="undefined"){return p+">"+m+""}return p+" />"},remove:function(i,j){return this.run(i,function(l){var m,k=l.parentNode;if(!k){return null}if(j){while(m=l.firstChild){if(!e.isIE||m.nodeType!==3||m.nodeValue){k.insertBefore(m,l)}else{l.removeChild(m)}}}return k.removeChild(l)})},setStyle:function(l,i,j){var k=this;return k.run(l,function(o){var n,m;n=o.style;i=i.replace(/-(\D)/g,function(q,p){return p.toUpperCase()});if(k.pixelStyles.test(i)&&(e.is(j,"number")||/^[\-0-9\.]+$/.test(j))){j+="px"}switch(i){case"opacity":if(b){n.filter=j===""?"":"alpha(opacity="+(j*100)+")";if(!l.currentStyle||!l.currentStyle.hasLayout){n.display="inline-block"}}n[i]=n["-moz-opacity"]=n["-khtml-opacity"]=j||"";break;case"float":b?n.styleFloat=j:n.cssFloat=j;break;default:n[i]=j||""}if(k.settings.update_styles){k.setAttrib(o,"data-mce-style")}})},getStyle:function(l,i,k){l=this.get(l);if(!l){return}if(this.doc.defaultView&&k){i=i.replace(/[A-Z]/g,function(m){return"-"+m});try{return this.doc.defaultView.getComputedStyle(l,null).getPropertyValue(i)}catch(j){return null}}i=i.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(i=="float"){i=b?"styleFloat":"cssFloat"}if(l.currentStyle&&k){return l.currentStyle[i]}return l.style?l.style[i]:undefined},setStyles:function(l,m){var j=this,k=j.settings,i;i=k.update_styles;k.update_styles=0;g(m,function(o,p){j.setStyle(l,p,o)});k.update_styles=i;if(k.update_styles){j.setAttrib(l,k.cssText)}},removeAllAttribs:function(i){return this.run(i,function(l){var k,j=l.attributes;for(k=j.length-1;k>=0;k--){l.removeAttributeNode(j.item(k))}})},setAttrib:function(k,l,i){var j=this;if(!k||!l){return}if(j.settings.strict){l=l.toLowerCase()}return this.run(k,function(p){var o=j.settings;var m=p.getAttribute(l);if(i!==null){switch(l){case"style":if(!d(i,"string")){g(i,function(q,r){j.setStyle(p,r,q)});return}if(o.keep_values){if(i&&!j._isRes(i)){p.setAttribute("data-mce-style",i,2)}else{p.removeAttribute("data-mce-style",2)}}p.style.cssText=i;break;case"class":p.className=i||"";break;case"src":case"href":if(o.keep_values){if(o.url_converter){i=o.url_converter.call(o.url_converter_scope||j,i,l,p)}j.setAttrib(p,"data-mce-"+l,i,2)}break;case"shape":p.setAttribute("data-mce-style",i);break}}if(d(i)&&i!==null&&i.length!==0){p.setAttribute(l,""+i,2)}else{p.removeAttribute(l,2)}if(tinyMCE.activeEditor&&m!=i){var n=tinyMCE.activeEditor;n.onSetAttrib.dispatch(n,p,l,i)}})},setAttribs:function(j,k){var i=this;return this.run(j,function(l){g(k,function(m,o){i.setAttrib(l,o,m)})})},getAttrib:function(m,o,k){var i,j=this,l;m=j.get(m);if(!m||m.nodeType!==1){return k===l?false:k}if(!d(k)){k=""}if(/^(src|href|style|coords|shape)$/.test(o)){i=m.getAttribute("data-mce-"+o);if(i){return i}}if(b&&j.props[o]){i=m[j.props[o]];i=i&&i.nodeValue?i.nodeValue:i}if(!i){i=m.getAttribute(o,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(o)){if(m[j.props[o]]===true&&i===""){return o}return i?o:""}if(m.nodeName==="FORM"&&m.getAttributeNode(o)){return m.getAttributeNode(o).nodeValue}if(o==="style"){i=i||m.style.cssText;if(i){i=j.serializeStyle(j.parseStyle(i),m.nodeName);if(j.settings.keep_values&&!j._isRes(i)){m.setAttribute("data-mce-style",i)}}}if(f&&o==="class"&&i){i=i.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(o){case"rowspan":case"colspan":if(i===1){i=""}break;case"size":if(i==="+0"||i===20||i===0){i=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(i===0){i=""}break;case"hspace":if(i===-1){i=""}break;case"maxlength":case"tabindex":if(i===32768||i===2147483647||i==="32768"){i=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(i===65535){return o}return k;case"shape":i=i.toLowerCase();break;default:if(o.indexOf("on")===0&&i){i=e._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+i)}}}return(i!==l&&i!==null&&i!=="")?""+i:k},getPos:function(q,l){var j=this,i=0,p=0,m,o=j.doc,k;q=j.get(q);l=l||o.body;if(q){if(q.getBoundingClientRect){q=q.getBoundingClientRect();m=j.boxModel?o.documentElement:o.body;i=q.left+(o.documentElement.scrollLeft||o.body.scrollLeft)-m.clientTop;p=q.top+(o.documentElement.scrollTop||o.body.scrollTop)-m.clientLeft;return{x:i,y:p}}k=q;while(k&&k!=l&&k.nodeType){i+=k.offsetLeft||0;p+=k.offsetTop||0;k=k.offsetParent}k=q.parentNode;while(k&&k!=l&&k.nodeType){i-=k.scrollLeft||0;p-=k.scrollTop||0;k=k.parentNode}}return{x:i,y:p}},parseStyle:function(i){return this.styles.parse(i)},serializeStyle:function(j,i){return this.styles.serialize(j,i)},loadCSS:function(i){var k=this,l=k.doc,j;if(!i){i=""}j=l.getElementsByTagName("head")[0];g(i.split(","),function(m){var n;if(k.files[m]){return}k.files[m]=true;n=k.create("link",{rel:"stylesheet",href:e._addVer(m)});if(b&&l.documentMode&&l.recalc){n.onload=function(){if(l.recalc){l.recalc()}n.onload=null}}j.appendChild(n)})},addClass:function(i,j){return this.run(i,function(k){var l;if(!j){return 0}if(this.hasClass(k,j)){return k.className}l=this.removeClass(k,j);return k.className=(l!=""?(l+" "):"")+j})},removeClass:function(k,l){var i=this,j;return i.run(k,function(n){var m;if(i.hasClass(n,l)){if(!j){j=new RegExp("(^|\\s+)"+l+"(\\s+|$)","g")}m=n.className.replace(j," ");m=e.trim(m!=" "?m:"");n.className=m;if(!m){n.removeAttribute("class");n.removeAttribute("className")}return m}return n.className})},hasClass:function(j,i){j=this.get(j);if(!j||!i){return false}return(" "+j.className+" ").indexOf(" "+i+" ")!==-1},show:function(i){return this.setStyle(i,"display","block")},hide:function(i){return this.setStyle(i,"display","none")},isHidden:function(i){i=this.get(i);return !i||i.style.display=="none"||this.getStyle(i,"display")=="none"},uniqueId:function(i){return(!i?"mce_":i)+(this.counter++)},setHTML:function(k,j){var i=this;return i.run(k,function(m){if(b){while(m.firstChild){m.removeChild(m.firstChild)}try{m.innerHTML="
        "+j;m.removeChild(m.firstChild)}catch(l){m=i.create("div");m.innerHTML="
        "+j;g(m.childNodes,function(o,n){if(n){m.appendChild(o)}})}}else{m.innerHTML=j}return j})},getOuterHTML:function(k){var j,i=this;k=i.get(k);if(!k){return null}if(k.nodeType===1&&i.hasOuterHTML){return k.outerHTML}j=(k.ownerDocument||i.doc).createElement("body");j.appendChild(k.cloneNode(true));return j.innerHTML},setOuterHTML:function(l,j,m){var i=this;function k(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){i.insertAfter(s.cloneNode(true),p);s=s.previousSibling}i.remove(p)}return this.run(l,function(o){o=i.get(o);if(o.nodeType==1){m=m||o.ownerDocument||i.doc;if(b){try{if(b&&o.nodeType==1){o.outerHTML=j}else{k(o,j,m)}}catch(n){k(o,j,m)}}else{k(o,j,m)}}})},decode:h.decode,encode:h.encodeAllRaw,insertAfter:function(i,j){j=this.get(j);return this.run(i,function(l){var k,m;k=j.parentNode;m=j.nextSibling;if(m){k.insertBefore(l,m)}else{k.appendChild(l)}return l})},replace:function(m,l,i){var j=this;if(d(l,"array")){m=m.cloneNode(true)}return j.run(l,function(k){if(i){g(e.grep(k.childNodes),function(n){m.appendChild(n)})}return k.parentNode.replaceChild(m,k)})},rename:function(l,i){var k=this,j;if(l.nodeName!=i.toUpperCase()){j=k.create(i);g(k.getAttribs(l),function(m){k.setAttrib(j,m.nodeName,k.getAttrib(l,m.nodeName))});k.replace(j,l,1)}return j||l},findCommonAncestor:function(k,i){var l=k,j;while(l){j=i;while(j&&l!=j){j=j.parentNode}if(l==j){break}l=l.parentNode}if(!l&&k.ownerDocument){return k.ownerDocument.documentElement}return l},toHex:function(i){var k=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(i);function j(l){l=parseInt(l,10).toString(16);return l.length>1?l:"0"+l}if(k){i="#"+j(k[1])+j(k[2])+j(k[3]);return i}return i},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(i){g(i.imports,function(s){q(s)});g(i.cssRules||i.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){g(s.selectorText.split(","),function(r){r=r.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(r)||!/\.[\w\-]+$/.test(r)){return}l=r;r=e._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",r);if(p&&!(r=p(r,l))){return}if(!o[r]){j.push({"class":r});o[r]=1}})}break;case 3:q(s.styleSheet);break}})}try{g(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(l,k,j){var i=this,m;if(i.doc&&typeof(l)==="string"){l=i.get(l)}if(!l){return false}j=j||this;if(!l.nodeType&&(l.length||l.length===0)){m=[];g(l,function(o,n){if(o){if(typeof(o)=="string"){o=i.doc.getElementById(o)}m.push(k.call(j,o,n))}});return m}return k.call(j,l)},getAttribs:function(j){var i;j=this.get(j);if(!j){return[]}if(b){i=[];if(j.nodeName=="OBJECT"){return j.attributes}if(j.nodeName==="OPTION"&&this.getAttrib(j,"selected")){i.push({specified:1,nodeName:"selected"})}j.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(k){i.push({specified:1,nodeName:k})});return i}return j.attributes},isEmpty:function(m,k){var r=this,o,n,q,j,l,p=0;m=m.firstChild;if(m){j=new e.dom.TreeWalker(m,m.parentNode);k=k||r.schema?r.schema.getNonEmptyElements():null;do{q=m.nodeType;if(q===1){if(m.getAttribute("data-mce-bogus")){continue}l=m.nodeName.toLowerCase();if(k&&k[l]){if(l==="br"){p++;continue}return false}n=r.getAttribs(m);o=m.attributes.length;while(o--){l=m.attributes[o].nodeName;if(l==="name"||l==="data-mce-bookmark"){return false}}}if(q==8){return false}if((q===3&&!a.test(m.nodeValue))){return false}}while(m=j.next())}return p<=1},destroy:function(j){var i=this;i.win=i.doc=i.root=i.events=i.frag=null;if(!j){e.removeUnload(i.destroy)}},createRng:function(){var i=this.doc;return i.createRange?i.createRange():new e.dom.Range(this)},nodeIndex:function(m,n){var i=0,k,l,j;if(m){for(k=m.nodeType,m=m.previousSibling,l=m;m;m=m.previousSibling){j=m.nodeType;if(n&&j==3){if(j==k||!m.nodeValue.length){continue}}i++;k=j}}return i},split:function(m,l,p){var q=this,i=q.createRng(),n,k,o;function j(v){var t,s=v.childNodes,u=v.nodeType;function x(A){var z=A.previousSibling&&A.previousSibling.nodeName=="SPAN";var y=A.nextSibling&&A.nextSibling.nodeName=="SPAN";return z&&y}if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=s.length-1;t>=0;t--){j(s[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){var r=e.trim(v.nodeValue).length;if(!q.isBlock(v.parentNode)||r>0||r===0&&x(v)){return}}else{if(u==1){s=v.childNodes;if(s.length==1&&s[0]&&s[0].nodeType==1&&s[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(s[0],v)}if(s.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}q.remove(v)}return v}if(m&&l){i.setStart(m.parentNode,q.nodeIndex(m));i.setEnd(l.parentNode,q.nodeIndex(l));n=i.extractContents();i=q.createRng();i.setStart(l.parentNode,q.nodeIndex(l)+1);i.setEnd(m.parentNode,q.nodeIndex(m)+1);k=i.extractContents();o=m.parentNode;o.insertBefore(j(n),m);if(p){o.replaceChild(p,l)}else{o.insertBefore(l,m)}o.insertBefore(j(k),m);q.remove(m);return p||l}},bind:function(l,i,k,j){return this.events.add(l,i,k,j||this)},unbind:function(k,i,j){return this.events.remove(k,i,j)},fire:function(k,j,i){return this.events.fire(k,j,i)},getContentEditable:function(j){var i;if(j.nodeType!=1){return null}i=j.getAttribute("data-mce-contenteditable");if(i&&i!=="inherit"){return i}return j.contentEditable!=="inherit"?j.contentEditable:null},_findSib:function(l,i,j){var k=this,m=i;if(l){if(d(m,"string")){m=function(n){return k.is(n,i)}}for(l=l[j];l;l=l[j]){if(m(l)){return l}}}return null},_isRes:function(i){return/^(top|left|bottom|right|width|height)/i.test(i)||/;\s*(top|left|bottom|right|width|height)/i.test(i)}});e.DOM=new e.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var O=this,e=c.doc,U=0,F=1,j=2,E=true,S=false,W="startOffset",h="startContainer",Q="endContainer",A="endOffset",k=tinymce.extend,n=c.nodeIndex;k(O,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:E,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:J,setEndBefore:K,setEndAfter:u,collapse:B,selectNode:y,selectNodeContents:G,compareBoundaryPoints:v,deleteContents:p,extractContents:I,cloneContents:d,insertNode:D,surroundContents:N,cloneRange:L,toStringIE:T});function x(){return e.createDocumentFragment()}function q(X,t){C(E,X,t)}function s(X,t){C(S,X,t)}function g(t){q(t.parentNode,n(t))}function J(t){q(t.parentNode,n(t)+1)}function K(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function B(t){if(t){O[Q]=O[h];O[A]=O[W]}else{O[h]=O[Q];O[W]=O[A]}O.collapsed=E}function y(t){g(t);u(t)}function G(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(aa,t){var ad=O[h],Y=O[W],ac=O[Q],X=O[A],ab=t.startContainer,af=t.startOffset,Z=t.endContainer,ae=t.endOffset;if(aa===0){return H(ad,Y,ab,af)}if(aa===1){return H(ac,X,ab,af)}if(aa===2){return H(ac,X,Z,ae)}if(aa===3){return H(ad,Y,Z,ae)}}function p(){l(j)}function I(){return l(U)}function d(){return l(F)}function D(aa){var X=this[h],t=this[W],Z,Y;if((X.nodeType===3||X.nodeType===4)&&X.nodeValue){if(!t){X.parentNode.insertBefore(aa,X)}else{if(t>=X.nodeValue.length){c.insertAfter(aa,X)}else{Z=X.splitText(t);X.parentNode.insertBefore(aa,Z)}}}else{if(X.childNodes.length>0){Y=X.childNodes[t]}if(Y){X.insertBefore(aa,Y)}else{X.appendChild(aa)}}}function N(X){var t=O.extractContents();O.insertNode(X);X.appendChild(t);O.selectNode(X)}function L(){return k(new b(c),{startContainer:O[h],startOffset:O[W],endContainer:O[Q],endOffset:O[A],collapsed:O.collapsed,commonAncestorContainer:O.commonAncestorContainer})}function P(t,X){var Y;if(t.nodeType==3){return t}if(X<0){return t}Y=t.firstChild;while(Y&&X>0){--X;Y=Y.nextSibling}if(Y){return Y}return t}function m(){return(O[h]==O[Q]&&O[W]==O[A])}function H(Z,ab,X,aa){var ac,Y,t,ad,af,ae;if(Z==X){if(ab==aa){return 0}if(ab0){O.collapse(X)}}else{O.collapse(X)}O.collapsed=m();O.commonAncestorContainer=c.findCommonAncestor(O[h],O[Q])}function l(ad){var ac,Z=0,af=0,X,ab,Y,aa,t,ae;if(O[h]==O[Q]){return f(ad)}for(ac=O[Q],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[h]){return r(ac,ad)}++Z}for(ac=O[h],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[Q]){return V(ac,ad)}++af}ab=af-Z;Y=O[h];while(ab>0){Y=Y.parentNode;ab--}aa=O[Q];while(ab<0){aa=aa.parentNode;ab++}for(t=Y.parentNode,ae=aa.parentNode;t!=ae;t=t.parentNode,ae=ae.parentNode){Y=t;aa=ae}return o(Y,aa,ad)}function f(ac){var ae,af,t,Y,Z,ad,aa,X,ab;if(ac!=j){ae=x()}if(O[W]==O[A]){return ae}if(O[h].nodeType==3){af=O[h].nodeValue;t=af.substring(O[W],O[A]);if(ac!=F){Y=O[h];X=O[W];ab=O[A]-O[W];if(X===0&&ab>=Y.nodeValue.length-1){Y.parentNode.removeChild(Y)}else{Y.deleteData(X,ab)}O.collapse(E)}if(ac==j){return}if(t.length>0){ae.appendChild(e.createTextNode(t))}return ae}Y=P(O[h],O[W]);Z=O[A]-O[W];while(Y&&Z>0){ad=Y.nextSibling;aa=z(Y,ac);if(ae){ae.appendChild(aa)}--Z;Y=ad}if(ac!=F){O.collapse(E)}return ae}function r(ad,aa){var ac,ab,X,t,Z,Y;if(aa!=j){ac=x()}ab=i(ad,aa);if(ac){ac.appendChild(ab)}X=n(ad);t=X-O[W];if(t<=0){if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}ab=ad.previousSibling;while(t>0){Z=ab.previousSibling;Y=z(ab,aa);if(ac){ac.insertBefore(Y,ac.firstChild)}--t;ab=Z}if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}function V(ab,aa){var ad,X,ac,t,Z,Y;if(aa!=j){ad=x()}ac=R(ab,aa);if(ad){ad.appendChild(ac)}X=n(ab);++X;t=O[A]-X;ac=ab.nextSibling;while(ac&&t>0){Z=ac.nextSibling;Y=z(ac,aa);if(ad){ad.appendChild(Y)}--t;ac=Z}if(aa!=F){O.setStartAfter(ab);O.collapse(E)}return ad}function o(ab,t,ae){var Y,ag,aa,ac,ad,X,af,Z;if(ae!=j){ag=x()}Y=R(ab,ae);if(ag){ag.appendChild(Y)}aa=ab.parentNode;ac=n(ab);ad=n(t);++ac;X=ad-ac;af=ab.nextSibling;while(X>0){Z=af.nextSibling;Y=z(af,ae);if(ag){ag.appendChild(Y)}af=Z;--X}Y=i(t,ae);if(ag){ag.appendChild(Y)}if(ae!=F){O.setStartAfter(ab);O.collapse(E)}return ag}function i(ac,ad){var Y=P(O[Q],O[A]-1),ae,ab,aa,t,X,Z=Y!=O[Q];if(Y==ac){return M(Y,Z,S,ad)}ae=Y.parentNode;ab=M(ae,S,S,ad);while(ae){while(Y){aa=Y.previousSibling;t=M(Y,Z,S,ad);if(ad!=j){ab.insertBefore(t,ab.firstChild)}Z=E;Y=aa}if(ae==ac){return ab}Y=ae.previousSibling;ae=ae.parentNode;X=M(ae,S,S,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function R(ac,ad){var Z=P(O[h],O[W]),aa=Z!=O[h],ae,ab,Y,t,X;if(Z==ac){return M(Z,aa,E,ad)}ae=Z.parentNode;ab=M(ae,S,E,ad);while(ae){while(Z){Y=Z.nextSibling;t=M(Z,aa,E,ad);if(ad!=j){ab.appendChild(t)}aa=E;Z=Y}if(ae==ac){return ab}Z=ae.nextSibling;ae=ae.parentNode;X=M(ae,S,E,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function M(t,aa,ad,ae){var Z,Y,ab,X,ac;if(aa){return z(t,ae)}if(t.nodeType==3){Z=t.nodeValue;if(ad){X=O[W];Y=Z.substring(X);ab=Z.substring(0,X)}else{X=O[A];Y=Z.substring(0,X);ab=Z.substring(X)}if(ae!=F){t.nodeValue=ab}if(ae==j){return}ac=c.clone(t,S);ac.nodeValue=Y;return ac}if(ae==j){return}return c.clone(t,S)}function z(X,t){if(t!=j){return t==F?c.clone(X,E):X}X.parentNode.removeChild(X)}function T(){return c.create("body",null,d()).outerText}return O}a.Range=b;b.prototype.toString=function(){return this.toStringIE()}})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",1)===0||s!=k.parentElement()){break}o++}}else{k.collapse(true);o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",-1)===0||s!=k.parentElement()){break}o++}}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p&&t.nodeType!==9){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,t,q,s,r=d.dom.doc,m=r.body;function j(A){var v,z,u,y,x;u=h.create("a");v=A?k:t;z=A?p:q;y=n.duplicate();if(v==r||v==r.documentElement){v=m;z=0}if(v.nodeType==3){v.parentNode.insertBefore(u,v);y.moveToElementText(u);y.moveStart("character",z);h.remove(u);n.setEndPoint(A?"StartToStart":"EndToEnd",y)}else{x=v.childNodes;if(x.length){if(z>=x.length){h.insertAfter(u,x[x.length-1])}else{v.insertBefore(u,x[z])}y.moveToElementText(u)}else{if(v.canHaveHTML){v.innerHTML="\uFEFF";u=v.firstChild;y.moveToElementText(u);y.collapse(f)}}n.setEndPoint(A?"StartToStart":"EndToEnd",y);h.remove(u)}}k=i.startContainer;p=i.startOffset;t=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==t&&k.nodeType==1){if(p==q&&!k.hasChildNodes()){if(k.canHaveHTML){s=k.previousSibling;if(s&&!s.hasChildNodes()&&h.isBlock(s)){s.innerHTML="\uFEFF"}else{s=null}k.innerHTML="\uFEFF\uFEFF";n.moveToElementText(k.lastChild);n.select();h.doc.selection.clear();k.innerHTML="";if(s){s.innerHTML=""}return}else{p=h.nodeIndex(k);k=k.parentNode}}if(p==q-1){try{l=m.createControlRange();l.addElement(k.childNodes[p]);l.select();return}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(a){a.dom.Element=function(f,d){var b=this,e,c;b.settings=d=d||{};b.id=f;b.dom=e=d.dom||a.DOM;if(!a.isIE){c=e.get(b.id)}a.each(("getPos,getRect,getParent,add,setStyle,getStyle,setStyles,setAttrib,setAttribs,getAttrib,addClass,removeClass,hasClass,getOuterHTML,setOuterHTML,remove,show,hide,isHidden,setHTML,get").split(/,/),function(g){b[g]=function(){var h=[f],j;for(j=0;j"+(i.item?i.item(0).outerHTML:i.htmlText);m.removeChild(m.firstChild)}else{m.innerHTML=i.toString()}}if(/^\s/.test(m.innerHTML)){j=" "}if(/\s+$/.test(m.innerHTML)){l=" "}h.getInner=true;h.content=g.isCollapsed()?"":j+g.serializer.serialize(m,h)+l;g.onGetContent.dispatch(g,h);return h.content},setContent:function(h,j){var o=this,g=o.getRng(),k,l=o.win.document,n,m;j=j||{format:"html"};j.set=true;h=j.content=h;if(!j.no_events){o.onBeforeSetContent.dispatch(o,j)}h=j.content;if(g.insertNode){h+='_';if(g.startContainer==l&&g.endContainer==l){l.body.innerHTML=h}else{g.deleteContents();if(l.body.childNodes.length===0){l.body.innerHTML=h}else{if(g.createContextualFragment){g.insertNode(g.createContextualFragment(h))}else{n=l.createDocumentFragment();m=l.createElement("div");n.appendChild(m);m.outerHTML=h;g.insertNode(n)}}}k=o.dom.get("__caret");g=l.createRange();g.setStartBefore(k);g.setEndBefore(k);o.setRng(g);o.dom.remove("__caret");try{o.setRng(g)}catch(i){}}else{if(g.item){l.execCommand("Delete",false,null);g=o.getRng()}if(/^\s+/.test(h)){g.pasteHTML('_'+h);o.dom.remove("__mce_tmp")}else{g.pasteHTML(h)}}if(!j.no_events){o.onSetContent.dispatch(o,j)}},getStart:function(){var h=this.getRng(),i,g,k,j;if(h.duplicate||h.item){if(h.item){return h.item(0)}k=h.duplicate();k.collapse(1);i=k.parentElement();g=j=h.parentElement();while(j=j.parentNode){if(j==i){i=g;break}}return i}else{i=h.startContainer;if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[Math.min(i.childNodes.length-1,h.startOffset)]}if(i&&i.nodeType==3){return i.parentNode}return i}},getEnd:function(){var h=this,i=h.getRng(),j,g;if(i.duplicate||i.item){if(i.item){return i.item(0)}i=i.duplicate();i.collapse(0);j=i.parentElement();if(j&&j.nodeName=="BODY"){return j.lastChild||j}return j}else{j=i.endContainer;g=i.endOffset;if(j.nodeType==1&&j.hasChildNodes()){j=j.childNodes[g>0?g-1:g]}if(j&&j.nodeType==3){return j.parentNode}return j}},getBookmark:function(s,v){var y=this,n=y.dom,h,k,j,o,i,p,q,m="\uFEFF",x;function g(z,A){var t=0;e(n.select(z),function(C,B){if(C==A){t=B}});return t}function u(t){function z(E){var A,D,C,B=E?"start":"end";A=t[B+"Container"];D=t[B+"Offset"];if(A.nodeType==1&&A.nodeName=="TR"){C=A.childNodes;A=C[Math.min(E?D:D-1,C.length-1)];if(A){D=E?0:A.childNodes.length;t["set"+(E?"Start":"End")](A,D)}}}z(true);z();return t}function l(){var z=y.getRng(true),t=n.getRoot(),A={};function B(E,J){var D=E[J?"startContainer":"endContainer"],I=E[J?"startOffset":"endOffset"],C=[],F,H,G=0;if(D.nodeType==3){if(v){for(F=D.previousSibling;F&&F.nodeType==3;F=F.previousSibling){I+=F.nodeValue.length}}C.push(I)}else{H=D.childNodes;if(I>=H.length&&H.length){G=1;I=Math.max(0,H.length-1)}C.push(y.dom.nodeIndex(H[I],v)+G)}for(;D&&D!=t;D=D.parentNode){C.push(y.dom.nodeIndex(D,v))}return C}A.start=B(z,true);if(!y.isCollapsed()){A.end=B(z)}return A}if(s==2){if(y.tridentSel){return y.tridentSel.getBookmark(s)}return l()}if(s){return{rng:y.getRng()}}h=y.getRng();j=n.uniqueId();o=tinyMCE.activeEditor.selection.isCollapsed();x="overflow:hidden;line-height:0px";if(h.duplicate||h.item){if(!h.item){k=h.duplicate();try{h.collapse();h.pasteHTML(''+m+"");if(!o){k.collapse(false);h.moveToElementText(k.parentElement());if(h.compareEndPoints("StartToEnd",k)===0){k.move("character",-1)}k.pasteHTML(''+m+"")}}catch(r){return null}}else{p=h.item(0);i=p.nodeName;return{name:i,index:g(i,p)}}}else{p=y.getNode();i=p.nodeName;if(i=="IMG"){return{name:i,index:g(i,p)}}k=u(h.cloneRange());if(!o){k.collapse(false);k.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_end",style:x},m))}h=u(h);h.collapse(true);h.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_start",style:x},m))}y.moveToBookmark({id:j,keep:1});return{id:j}},moveToBookmark:function(o){var s=this,m=s.dom,j,i,g,r,k,u,p,q;function h(A){var t=o[A?"start":"end"],x,y,z,v;if(t){z=t[0];for(y=r,x=t.length-1;x>=1;x--){v=y.childNodes;if(t[x]>v.length-1){return}y=v[t[x]]}if(y.nodeType===3){z=Math.min(t[0],y.nodeValue.length)}if(y.nodeType===1){z=Math.min(t[0],y.childNodes.length)}if(A){g.setStart(y,z)}else{g.setEnd(y,z)}}return true}function l(B){var v=m.get(o.id+"_"+B),A,t,y,z,x=o.keep;if(v){A=v.parentNode;if(B=="start"){if(!x){t=m.nodeIndex(v)}else{A=v.firstChild;t=1}k=u=A;p=q=t}else{if(!x){t=m.nodeIndex(v)}else{A=v.firstChild;t=1}u=A;q=t}if(!x){z=v.previousSibling;y=v.nextSibling;e(d.grep(v.childNodes),function(C){if(C.nodeType==3){C.nodeValue=C.nodeValue.replace(/\uFEFF/g,"")}});while(v=m.get(o.id+"_"+B)){m.remove(v,1)}if(z&&y&&z.nodeType==y.nodeType&&z.nodeType==3&&!d.isOpera){t=z.nodeValue.length;z.appendData(y.nodeValue);m.remove(y);if(B=="start"){k=u=z;p=q=t}else{u=z;q=t}}}}}function n(t){if(m.isBlock(t)&&!t.innerHTML&&!b){t.innerHTML='
        '}return t}if(o){if(o.start){g=m.createRng();r=m.getRoot();if(s.tridentSel){return s.tridentSel.moveToBookmark(o)}if(h(true)&&h()){s.setRng(g)}}else{if(o.id){l("start");l("end");if(k){g=m.createRng();g.setStart(n(k),p);g.setEnd(n(u),q);s.setRng(g)}}else{if(o.name){s.select(m.select(o.name)[o.index])}else{if(o.rng){s.setRng(o.rng)}}}}}},select:function(l,k){var j=this,m=j.dom,h=m.createRng(),g;function i(n,p){var o=new a(n,n);do{if(n.nodeType==3&&d.trim(n.nodeValue).length!==0){if(p){h.setStart(n,0)}else{h.setEnd(n,n.nodeValue.length)}return}if(n.nodeName=="BR"){if(p){h.setStartBefore(n)}else{h.setEndBefore(n)}return}}while(n=(p?o.next():o.prev()))}if(l){g=m.nodeIndex(l);h.setStart(l.parentNode,g);h.setEnd(l.parentNode,g+1);if(k){i(l,1);i(l)}j.setRng(h)}return l},isCollapsed:function(){var g=this,i=g.getRng(),h=g.getSel();if(!i||i.item){return false}if(i.compareEndPoints){return i.compareEndPoints("StartToEnd",i)===0}return !h||i.collapsed},collapse:function(g){var i=this,h=i.getRng(),j;if(h.item){j=h.item(0);h=i.win.document.body.createTextRange();h.moveToElementText(j)}h.collapse(!!g);i.setRng(h)},getSel:function(){var h=this,g=this.win;return g.getSelection?g.getSelection():g.document.selection},getRng:function(m){var h=this,j,g,l,k=h.win.document;if(m&&h.tridentSel){return h.tridentSel.getRangeAt(0)}try{if(j=h.getSel()){g=j.rangeCount>0?j.getRangeAt(0):(j.createRange?j.createRange():k.createRange())}}catch(i){}if(d.isIE&&g&&g.setStart&&k.selection.createRange().item){l=k.selection.createRange().item(0);g=k.createRange();g.setStartBefore(l);g.setEndAfter(l)}if(!g){g=k.createRange?k.createRange():k.body.createTextRange()}if(g.setStart&&g.startContainer.nodeType===9&&g.collapsed){l=h.dom.getRoot();g.setStart(l,0);g.setEnd(l,0)}if(h.selectedRange&&h.explicitRange){if(g.compareBoundaryPoints(g.START_TO_START,h.selectedRange)===0&&g.compareBoundaryPoints(g.END_TO_END,h.selectedRange)===0){g=h.explicitRange}else{h.selectedRange=null;h.explicitRange=null}}return g},setRng:function(k,g){var j,i=this;if(!i.tridentSel){j=i.getSel();if(j){i.explicitRange=k;try{j.removeAllRanges()}catch(h){}j.addRange(k);if(g===false&&j.extend){j.collapse(k.endContainer,k.endOffset);j.extend(k.startContainer,k.startOffset)}i.selectedRange=j.rangeCount>0?j.getRangeAt(0):null}}else{if(k.cloneRange){try{i.tridentSel.addRange(k);return}catch(h){}}try{k.select()}catch(h){}}},setNode:function(h){var g=this;g.setContent(g.dom.getOuterHTML(h));return h},getNode:function(){var i=this,h=i.getRng(),j=i.getSel(),m,l=h.startContainer,g=h.endContainer;function k(q,o){var p=q;while(q&&q.nodeType===3&&q.length===0){q=o?q.nextSibling:q.previousSibling}return q||p}if(!h){return i.dom.getRoot()}if(h.setStart){m=h.commonAncestorContainer;if(!h.collapsed){if(h.startContainer==h.endContainer){if(h.endOffset-h.startOffset<2){if(h.startContainer.hasChildNodes()){m=h.startContainer.childNodes[h.startOffset]}}}if(l.nodeType===3&&g.nodeType===3){if(l.length===h.startOffset){l=k(l.nextSibling,true)}else{l=l.parentNode}if(h.endOffset===0){g=k(g.previousSibling,false)}else{g=g.parentNode}if(l&&l===g){return l}}}if(m&&m.nodeType==3){return m.parentNode}return m}return h.item?h.item(0):h.parentElement()},getSelectedBlocks:function(p,h){var o=this,k=o.dom,m,l,i,j=[];m=k.getParent(p||o.getStart(),k.isBlock);l=k.getParent(h||o.getEnd(),k.isBlock);if(m){j.push(m)}if(m&&l&&m!=l){i=m;var g=new a(m,k.getRoot());while((i=g.next())&&i!=l){if(k.isBlock(i)){j.push(i)}}}if(l&&m!=l){j.push(l)}return j},isForward:function(){var i=this.dom,g=this.getSel(),j,h;if(!g||g.anchorNode==null||g.focusNode==null){return true}j=i.createRng();j.setStart(g.anchorNode,g.anchorOffset);j.collapse(true);h=i.createRng();h.setStart(g.focusNode,g.focusOffset);h.collapse(true);return j.compareBoundaryPoints(j.START_TO_START,h)<=0},normalize:function(){var h=this,g,m,l,j,i;function k(p){var o,r,n,s=h.dom,u=s.getRoot(),q,t,v;function y(z,A){var B=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(z=B[A?"prev":"next"]()){if(z.nodeName==="BR"){return true}}}function x(B,z){var C,A;z=z||o;C=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(q=C[B?"prev":"next"]()){if(q.nodeType===3&&q.nodeValue.length>0){o=q;r=B?q.nodeValue.length:0;m=true;return}if(s.isBlock(q)||t[q.nodeName.toLowerCase()]){return}A=q}if(l&&A){o=A;m=true;r=0}}o=g[(p?"start":"end")+"Container"];r=g[(p?"start":"end")+"Offset"];t=s.schema.getNonEmptyElements();if(o.nodeType===9){o=s.getRoot();r=0}if(o===u){if(p){q=o.childNodes[r>0?r-1:0];if(q){v=q.nodeName.toLowerCase();if(t[q.nodeName]||q.nodeName=="TABLE"){return}}}if(o.hasChildNodes()){o=o.childNodes[Math.min(!p&&r>0?r-1:r,o.childNodes.length-1)];r=0;if(o.hasChildNodes()&&!/TABLE/.test(o.nodeName)){q=o;n=new a(o,u);do{if(q.nodeType===3&&q.nodeValue.length>0){r=p?0:q.nodeValue.length;o=q;m=true;break}if(t[q.nodeName.toLowerCase()]){r=s.nodeIndex(q);o=q.parentNode;if(q.nodeName=="IMG"&&!p){r++}m=true;break}}while(q=(p?n.next():n.prev()))}}}if(l){if(o.nodeType===3&&r===0){x(true)}if(o.nodeType===1){q=o.childNodes[r];if(q&&q.nodeName==="BR"&&!y(q)&&!y(q,true)){x(true,o.childNodes[r])}}}if(p&&!l&&o.nodeType===3&&r===o.nodeValue.length){x(false)}if(m){g["set"+(p?"Start":"End")](o,r)}}if(d.isIE){return}g=h.getRng();l=g.collapsed;k(true);if(!l){k()}if(m){if(l){g.collapse(true)}h.setRng(g,h.isForward())}},selectorChanged:function(g,j){var h=this,i;if(!h.selectorChangedData){h.selectorChangedData={};i={};h.editor.onNodeChange.addToTop(function(l,k,o){var p=h.dom,m=p.getParents(o,null,p.getRoot()),n={};e(h.selectorChangedData,function(r,q){e(m,function(s){if(p.is(s,q)){if(!i[q]){e(r,function(t){t(true,{node:s,selector:q,parents:m})});i[q]=r}n[q]=r;return false}})});e(i,function(r,q){if(!n[q]){delete i[q];e(r,function(s){s(false,{node:o,selector:q,parents:m})})}})})}if(!h.selectorChangedData[g]){h.selectorChangedData[g]=[]}h.selectorChangedData[g].push(j);return h},destroy:function(h){var g=this;g.win=null;if(!h){d.removeUnload(g.destroy)}},_fixIESelection:function(){var h=this.dom,n=h.doc,i=n.body,k,o,g;function j(p,s){var q=i.createTextRange();try{q.moveToPoint(p,s)}catch(r){q=null}return q}function m(q){var p;if(q.button){p=j(q.x,q.y);if(p){if(p.compareEndPoints("StartToStart",o)>0){p.setEndPoint("StartToStart",o)}else{p.setEndPoint("EndToEnd",o)}p.select()}}else{l()}}function l(){var p=n.selection.createRange();if(o&&!p.item&&p.compareEndPoints("StartToEnd",p)===0){o.select()}h.unbind(n,"mouseup",l);h.unbind(n,"mousemove",m);o=k=0}n.documentElement.unselectable=true;h.bind(n,["mousedown","contextmenu"],function(p){if(p.target.nodeName==="HTML"){if(k){l()}g=n.documentElement;if(g.scrollHeight>g.clientHeight){return}k=1;o=j(p.x,p.y);if(o){h.bind(n,"mouseup",l);h.bind(n,"mousemove",m);h.win.focus();o.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";e.remove_trailing_brs="remove_trailing_brs" in e?e.remove_trailing_brs:true;h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/(?:^|\s)mce(Item\w+|Selected)(?!\S)/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addAttributeFilter("data-mce-expando",function(j,l,k){var m=j.length;while(m--){j[m].attr(l,null)}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// "}}else{if(o.length>0){n.firstChild.value=""}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select,map").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(a.trim(m.getInner?o.innerHTML:i.getOuterHTML(o)),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF|\u200B/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],e={},d=[],g=0,f;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=document.createElement("script");s.id=n;s.type="text/javascript";s.src=a._addVer(m);if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==f){j.push(m);l[m]=c}if(q){if(!e[m]){e[m]=[]}e[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(e[r],function(s){s.func.call(s.scope)});e[r]=f}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,s){var i=d.startContainer,l=d.startOffset,t=d.endContainer,m=d.endOffset,j,g,o,h,r,q,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(u){s([u])});return}function f(u){var v;v=u[0];if(v.nodeType===3&&v===i&&l>=v.nodeValue.length){u.splice(0,1)}v=u[u.length-1];if(m===0&&u.length>0&&v===t&&v.nodeType===3){u.splice(u.length-1,1)}return u}function p(x,v,u){var y=[];for(;x&&x!=u;x=x[v]){y.push(x)}return y}function n(v,u){do{if(v.parentNode==u){return v}v=v.parentNode}while(v)}function k(x,v,y){var u=y?"nextSibling":"previousSibling";for(h=x,r=h.parentNode;h&&h!=v;h=r){r=h.parentNode;q=p(h==x?h:h[u],u);if(q.length){if(!y){q.reverse()}s(f(q))}}}if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[l]}if(t.nodeType==1&&t.hasChildNodes()){t=t.childNodes[Math.min(m-1,t.childNodes.length-1)]}if(i==t){return s(f([i]))}j=c.findCommonAncestor(i,t);for(h=i;h;h=h.parentNode){if(h===t){return k(i,j,true)}if(h===j){break}}for(h=t;h;h=h.parentNode){if(h===i){return k(t,j)}if(h===j){break}}g=n(i,j)||i;o=n(t,j)||t;k(i,g,true);q=p(g==i?g:g.nextSibling,"nextSibling",o==t?o.nextSibling:o);if(q.length){s(f(q))}k(t,o)};this.split=function(e){var h=e.startContainer,d=e.startOffset,i=e.endContainer,g=e.endOffset;function f(j,k){return j.splitText(k)}if(h==i&&h.nodeType==3){if(d>0&&dd){g=g-d;h=i=f(i,g).previousSibling;g=i.nodeValue.length;d=0}else{g=0}}}else{if(h.nodeType==3&&d>0&&d0&&g=m.length){r=0}}t=m[r];f.setAttrib(g,"tabindex","-1");f.setAttrib(t.id,"tabindex","0");f.get(t.id).focus();if(e.actOnFocus){e.onAction(t.id)}if(s){a.cancel(s)}};p=function(z){var v=37,u=39,y=38,A=40,r=27,t=14,s=13,x=32;switch(z.keyCode){case v:if(i){q.moveFocus(-1)}break;case u:if(i){q.moveFocus(1)}break;case y:if(o){q.moveFocus(-1)}break;case A:if(o){q.moveFocus(1)}break;case r:if(e.onCancel){e.onCancel();a.cancel(z)}break;case t:case s:case x:if(e.onAction){e.onAction(g);a.cancel(z)}break}};c(m,function(t,r){var s,u;if(!t.id){t.id=f.uniqueId("_mce_item_")}u=f.get(t.id);if(l){f.bind(u,"blur",h);s="-1"}else{s=(r===0?"0":"-1")}u.setAttribute("tabindex",s);f.bind(u,"focus",k)});if(m[0]){g=m[0].id}f.setAttrib(n,"tabindex","-1");var j=f.get(n);f.bind(j,"focus",d);f.bind(j,"keydown",p)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.offsetWidth,j.max_width):g.offsetWidth;k=j.max_height?Math.min(g.offsetHeight,j.max_height):g.offsetHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeightv){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return false}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.get("menu_"+g.id);h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){if(typeof h.settings.style=="function"){h.settings.style=h.settings.style()}c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+=''+a.encode(e.title)+''+c}else{d+=''+(c?''+c+"":"")}d+='";d+="";return d},postRender:function(){var d=this,e=d.settings,c;if(b.isIE&&d.editor){b.dom.Event.add(d.id,"mousedown",function(f){var g=d.editor.selection.getNode().nodeName;c=g==="IMG"?d.editor.selection.getBookmark():null})}b.dom.Event.add(d.id,"click",function(f){if(!d.isDisabled()){if(b.isIE&&d.editor&&c!==null){d.editor.selection.moveToBookmark(c)}return e.onclick.call(e.scope,f)}});b.dom.Event.add(d.id,"keyup",function(f){if(!d.isDisabled()&&f.keyCode==b.VK.SPACEBAR){return e.onclick.call(e.scope,f)}})}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(j,i,g){var h=this;h.parent(j,i,g);h.items=[];h.onChange=new a(h);h.onPostRender=new a(h);h.onAdd=new a(h);h.onRenderMenu=new e.util.Dispatcher(this);h.classPrefix="mceListBox";h.marked={}},select:function(h){var g=this,j,i;g.marked={};if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){var i=this,j,k,h;i.marked={};if(g!=i.selectedIndex){j=d.get(i.id+"_text");h=d.get(i.id+"_voiceDesc");k=i.items[g];if(k){i.selectedValue=k.value;i.selectedIndex=g;d.setHTML(j,d.encode(k.title));d.setHTML(h,i.settings.title+" - "+k.title);d.removeClass(j,"mceTitle");d.setAttrib(i.id,"aria-valuenow",k.title)}else{d.setHTML(j,d.encode(i.settings.title));d.setHTML(h,d.encode(i.settings.title));d.addClass(j,"mceTitle");i.selectedValue=i.selectedIndex=null;d.setAttrib(i.id,"aria-valuenow",i.settings.title)}j=0}},mark:function(g){this.marked[g]=true},add:function(j,g,i){var h=this;i=i||{};i=e.extend(i,{title:j,value:g});h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var j="",g=this,i=g.settings,k=g.classPrefix;j='';j+="";j+="";j+="";return j},showMenu:function(){var h=this,j,i=d.get(this.id),g;if(h.isDisabled()||h.items.length===0){return}if(h.menu&&h.menu.isMenuVisible){return h.hideMenu()}if(!h.isMenuRendered){h.renderMenu();h.isMenuRendered=true}j=d.getPos(i);g=h.menu;g.settings.offset_x=j.x;g.settings.offset_y=j.y;g.settings.keyboard_focus=!e.isOpera;f(h.items,function(k){if(g.items[k.id]){g.items[k.id].setSelected(0)}});f(h.items,function(k){if(g.items[k.id]&&h.marked[k.value]){g.items[k.id].setSelected(1)}if(k.value===h.selectedValue){g.items[k.id].setSelected(1)}});g.showMenu(0,i.clientHeight);b.add(d.doc,"mousedown",h.hideMenu,h);d.addClass(h.id,h.classPrefix+"Selected")},hideMenu:function(h){var g=this;if(g.menu&&g.menu.isMenuVisible){d.removeClass(g.id,g.classPrefix+"Selected");if(h&&h.type=="mousedown"&&(h.target.id==g.id+"_text"||h.target.id==g.id+"_open")){return}if(!h||!d.getParent(h.target,".mceMenu")){d.removeClass(g.id,g.classPrefix+"Selected");b.remove(d.doc,"mousedown",g.hideMenu,g);g.menu.hideMenu()}}},renderMenu:function(){var h=this,g;g=h.settings.control_manager.createDropMenu(h.id+"_menu",{menu_line:1,"class":h.classPrefix+"Menu mceNoIcons",max_width:250,max_height:150});g.onHideMenu.add(function(){h.hideMenu();h.focus()});g.add({title:h.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}});f(h.items,function(i){if(i.value===c){g.add({title:i.title,role:"option","class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}})}else{i.id=d.uniqueId();i.role="option";i.onclick=function(){if(h.settings.onselect(i.value)!==false){h.select(i.value)}};g.add(i)}});h.onRenderMenu.dispatch(h,g);h.menu=g},postRender:function(){var g=this,h=g.classPrefix;b.add(g.id,"click",g.showMenu,g);b.add(g.id,"keydown",function(i){if(i.keyCode==32){g.showMenu(i);b.cancel(i)}});b.add(g.id,"focus",function(){if(!g._focused){g.keyDownHandler=b.add(g.id,"keydown",function(i){if(i.keyCode==40){g.showMenu();b.cancel(i)}});g.keyPressHandler=b.add(g.id,"keypress",function(j){var i;if(j.keyCode==13){i=g.selectedValue;g.selectedValue=null;b.cancel(j);g.settings.onselect(i)}})}g._focused=1});b.add(g.id,"blur",function(){b.remove(g.id,"keydown",g.keyDownHandler);b.remove(g.id,"keypress",g.keyPressHandler);g._focused=0});if(e.isIE6||!d.boxModel){b.add(g.id,"mouseover",function(){if(!d.hasClass(g.id,h+"Disabled")){d.addClass(g.id,h+"Hover")}});b.add(g.id,"mouseout",function(){if(!d.hasClass(g.id,h+"Disabled")){d.removeClass(g.id,h+"Hover")}})}g.onPostRender.dispatch(g,d.get(g.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(h,g){this.parent(h,g);this.classPrefix="mceNativeListBox"},setDisabled:function(g){d.get(this.id).disabled=g;this.setAriaProperty("disabled",g)},isDisabled:function(){return d.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){d.get(this.id).selectedIndex=g+1;this.selectedValue=this.items[g]?this.items[g].value:null},add:function(k,h,g){var j,i=this;g=g||{};g.value=h;if(i.isRendered()){d.add(d.get(this.id),"option",g,k)}j={title:k,value:h,attribs:g};i.items.push(j);i.onAdd.dispatch(i,j)},getLength:function(){return this.items.length},renderHTML:function(){var i,g=this;i=d.createHTML("option",{value:""},"-- "+g.settings.title+" --");f(g.items,function(h){i+=d.createHTML("option",{value:h.value},h.title)});i=d.createHTML("select",{id:g.id,"class":"mceNativeListBox","aria-labelledby":g.id+"_aria"},i);i+=d.createHTML("span",{id:g.id+"_aria",style:"display: none"},g.settings.title);return i},postRender:function(){var h=this,i,j=true;h.rendered=true;function g(l){var k=h.items[l.target.selectedIndex-1];if(k&&(k=k.value)){h.onChange.dispatch(h,k);if(h.settings.onselect){h.settings.onselect(k)}}}b.add(h.id,"change",g);b.add(h.id,"keydown",function(l){var k;b.remove(h.id,"change",i);j=false;k=b.add(h.id,"blur",function(){if(j){return}j=true;b.add(h.id,"change",g);b.remove(h.id,"blur",k)});if(e.isWebKit&&(l.keyCode==37||l.keyCode==39)){return b.prevent(l)}if(l.keyCode==13||l.keyCode==32){g(l);return b.cancel(l)}});h.onPostRender.dispatch(h,d.get(h.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.firstChild.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+=""+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'');i+=""+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+"";i+="";i=b.createHTML("table",{role:"presentation","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("div",{id:f.id,role:"button",tabindex:"0","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.firstChild.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0;f.onHideMenu.dispatch()}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(m){m=m.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");var i={href:"javascript:;",style:{backgroundColor:"#"+m},title:p.editor.getLang("colors."+m,m),"data-mce-color":"#"+m};if(!d.isIE){i.role="option"}g=c.add(g,"a",i);if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+m;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");new d.ui.KeyboardNavigation({root:p.id+"_menu",items:c.select("a",p.id+"_menu"),onCancel:function(){p.hideMenu();p.focus()}});a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return false});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){this.parent();a.clear(this.id+"_menu");a.clear(this.id+"_more");c.remove(this.id+"_menu")}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('
        ');i.push("");i.push('");j(e,function(h){i.push(h.renderHTML())});i.push("");i.push("
        ");return i.join("")},focus:function(){var e=this;d.get(e.id).focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){if(b.isWebKit){d.get(f.editor.id+"_ifr").focus()}f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,""))}}if(c.stdMode){f+=''+k.renderHTML()+""}else{f+=""+k.renderHTML()+""}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,""))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,""));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},""+f+"")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!==0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(x){var v=this,o,n=j.ScriptLoader,u,l=[],r;function q(t){var s=t.id;if(!s){s=t.name;if(s&&!k.get(s)){s=t.name}else{s=k.uniqueId()}t.setAttribute("id",s)}return s}function m(z,A,t){var y=z[A];if(!y){return}if(j.is(y,"string")){t=y.replace(/\.\w+$/,"");t=t?j.resolve(t):0;y=j.resolve(y)}return y.apply(t||this,Array.prototype.slice.call(arguments,2))}function p(t,s){return s.constructor===RegExp?s.test(t.className):k.hasClass(t,s)}v.settings=x;i.bind(window,"ready",function(){var s,t;m(x,"onpageload");switch(x.mode){case"exact":s=x.elements||"";if(s.length>0){g(e(s),function(y){if(k.get(y)){r=new j.Editor(y,x);l.push(r);r.render(1)}else{g(document.forms,function(z){g(z.elements,function(A){if(A.name===y){y="mce_editor_"+c++;k.setAttrib(A,"id",y);r=new j.Editor(y,x);l.push(r);r.render(1)}})})}})}break;case"textareas":case"specific_textareas":g(k.select("textarea"),function(y){if(x.editor_deselector&&p(y,x.editor_deselector)){return}if(!x.editor_selector||p(y,x.editor_selector)){r=new j.Editor(q(y),x);l.push(r);r.render(1)}});break;default:if(x.types){g(x.types,function(y){g(k.select(y.selector),function(A){var z=new j.Editor(q(A),j.extend({},x,y));l.push(z);z.render(1)})})}else{if(x.selector){g(k.select(x.selector),function(z){var y=new j.Editor(q(z),x);l.push(y);y.render(1)})}}}if(x.oninit){s=t=0;g(l,function(y){t++;if(!y.initialized){y.onInit.add(function(){s++;if(s==t){m(x,"oninit")}})}else{s++}if(s==t){m(x,"oninit")}})}})},get:function(l){if(l===a){return this.editors}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);if(j.adapter){j.adapter.patchEditor(m)}return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual:n,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",apply_source_formatting:n,directionality:"ltr",forced_root_block:"p",hidden_input:n,padd_empty_editor:n,render_ui:n,indentation:"30px",fix_table_elements:n,inline_styles:n,convert_fonts_to_spans:n,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",validate:n,entity_encoding:"named",url_converter:m.convertURL,url_converter_scope:m,ie7_compat:n},o);m.id=m.editorId=p;m.isNotDirty=false;m.plugins={};m.documentBaseURI=new k.util.URI(o.document_base_url||k.documentBaseURL,{base_uri:tinyMCE.baseURI});m.baseURI=k.baseURI;m.contentCSS=[];m.setupEvents();m.execCommands={};m.queryStateCommands={};m.queryValueCommands={};m.execCallback("setup",m)},render:function(o){var p=this,q=p.settings,r=p.id,m=k.ScriptLoader;if(!j.domLoaded){j.add(window,"ready",function(){p.render()});return}tinyMCE.settings=q;if(!p.getElement()){return}if(k.isIDevice&&!k.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(p.getElement().nodeName)&&q.hidden_input&&l.getParent(r,"form")){l.insertAfter(l.create("input",{type:"hidden",name:r}),r)}if(!q.content_editable){p.orgVisibility=p.getElement().style.visibility;p.getElement().style.visibility="hidden"}if(k.WindowManager){p.windowManager=new k.WindowManager(p)}if(q.encoding=="xml"){p.onGetContent.add(function(s,t){if(t.save){t.content=l.encode(t.content)}})}if(q.add_form_submit_trigger){p.onSubmit.addToTop(function(){if(p.initialized){p.save();p.isNotDirty=1}})}if(q.add_unload_trigger){p._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(p.initialized&&!p.destroyed&&!p.isHidden()){p.save({format:"raw",no_events:true})}})}k.addUnload(p.destroy,p);if(q.submit_patch){p.onBeforeRenderUI.add(function(){var s=p.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){p.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){k.triggerSave();p.isNotDirty=1;return p.formElement._mceOldSubmit(p.formElement)}}s=null})}function n(){if(q.language&&q.language_load!==false){m.add(k.baseURL+"/langs/"+q.language+".js")}if(q.theme&&typeof q.theme!="function"&&q.theme.charAt(0)!="-"&&!h.urls[q.theme]){h.load(q.theme,"themes/"+q.theme+"/editor_template"+k.suffix+".js")}i(g(q.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(v){var u={prefix:"plugins/",resource:v,suffix:"/editor_plugin"+k.suffix+".js"};v=c.createUrl(u,v);c.load(v.resource,v)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+k.suffix+".js"})}}});m.loadQueue(function(){if(!p.removed){p.init()}})}n()},init:function(){var q,G=this,H=G.settings,D,y,z,C=G.getElement(),p,m,E,v,B,F,x,r=[];k.add(G);H.aria_label=H.aria_label||l.getAttrib(C,"aria-label",G.getLang("aria.rich_text_area"));if(H.theme){if(typeof H.theme!="function"){H.theme=H.theme.replace(/-/,"");p=h.get(H.theme);G.theme=new p();if(G.theme.init){G.theme.init(G,h.urls[H.theme]||k.documentBaseURL.replace(/\/$/,""))}}else{G.theme=H.theme}}function A(s){var t=c.get(s),o=c.urls[s]||k.documentBaseURL.replace(/\/$/,""),n;if(t&&k.inArray(r,s)===-1){i(c.dependencies(s),function(u){A(u)});n=new t(G,o);G.plugins[s]=n;if(n.init){n.init(G,o);r.push(s)}}}i(g(H.plugins.replace(/\-/g,"")),A);if(H.popup_css!==false){if(H.popup_css){H.popup_css=G.documentBaseURI.toAbsolute(H.popup_css)}else{H.popup_css=G.baseURI.toAbsolute("themes/"+H.theme+"/skins/"+H.skin+"/dialog.css")}}if(H.popup_css_add){H.popup_css+=","+G.documentBaseURI.toAbsolute(H.popup_css_add)}G.controlManager=new k.ControlManager(G);G.onExecCommand.add(function(n,o){if(!/^(FontName|FontSize)$/.test(o)){G.nodeChanged()}});G.onBeforeRenderUI.dispatch(G,G.controlManager);if(H.render_ui&&G.theme){G.orgDisplay=C.style.display;if(typeof H.theme!="function"){D=H.width||C.style.width||C.offsetWidth;y=H.height||C.style.height||C.offsetHeight;z=H.min_height||100;F=/^[0-9\.]+(|px)$/i;if(F.test(""+D)){D=Math.max(parseInt(D,10)+(p.deltaWidth||0),100)}if(F.test(""+y)){y=Math.max(parseInt(y,10)+(p.deltaHeight||0),z)}p=G.theme.renderUI({targetNode:C,width:D,height:y,deltaWidth:H.delta_width,deltaHeight:H.delta_height});l.setStyles(p.sizeContainer||p.editorContainer,{width:D,height:y});y=(p.iframeHeight||y)+(typeof(y)=="number"?(p.deltaHeight||0):"");if(y';if(H.document_base_url!=k.documentBaseURL){G.iframeHTML+=''}if(H.ie7_compat){G.iframeHTML+=''}else{G.iframeHTML+=''}G.iframeHTML+='';for(x=0;x'}G.contentCSS=[];v=H.body_id||"tinymce";if(v.indexOf("=")!=-1){v=G.getParam("body_id","","hash");v=v[G.id]||v}B=H.body_class||"";if(B.indexOf("=")!=-1){B=G.getParam("body_class","","hash");B=B[G.id]||""}G.iframeHTML+='
        ";if(k.relaxedDomain&&(b||(k.isOpera&&parseFloat(opera.version())<11))){E='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+G.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody();})()'}q=l.add(p.iframeContainer,"iframe",{id:G.id+"_ifr",src:E||'javascript:""',frameBorder:"0",allowTransparency:"true",title:H.aria_label,style:{width:"100%",height:y,display:"block"}});G.contentAreaContainer=p.iframeContainer;if(p.editorContainer){l.get(p.editorContainer).style.display=G.orgDisplay}C.style.visibility=G.orgVisibility;l.get(G.id).style.display="none";l.setAttrib(G.id,"aria-hidden",true);if(!k.relaxedDomain||!E){G.initContentBody()}C=q=p=null},initContentBody:function(){var n=this,p=n.settings,q=l.get(n.id),r=n.getDoc(),o,m;if((!b||!k.relaxedDomain)&&!p.content_editable){r.open();r.write(n.iframeHTML);r.close();if(k.relaxedDomain){r.domain=k.relaxedDomain}}if(p.content_editable){l.addClass(q,"mceContentBody");n.contentDocument=r=p.content_document||document;n.contentWindow=p.content_window||window;n.bodyElement=q;p.content_document=p.content_window=null}m=n.getBody();m.disabled=true;if(!p.readonly){m.contentEditable=n.getParam("content_editable_state",true)}m.disabled=false;n.schema=new k.html.Schema(p);n.dom=new k.dom.DOMUtils(r,{keep_values:true,url_converter:n.convertURL,url_converter_scope:n,hex_colors:p.force_hex_style_colors,class_filter:p.class_filter,update_styles:true,root_element:p.content_editable?n.id:null,schema:n.schema});n.parser=new k.html.DomParser(p,n.schema);n.parser.addAttributeFilter("src,href,style",function(s,t){var u=s.length,x,z=n.dom,y,v;while(u--){x=s[u];y=x.attr(t);v="data-mce-"+t;if(!x.attributes.map[v]){if(t==="style"){x.attr(v,z.serializeStyle(z.parseStyle(y),x.name))}else{x.attr(v,n.convertURL(y,t,x.name))}}}});n.parser.addNodeFilter("script",function(s,t){var u=s.length,v;while(u--){v=s[u];v.attr("type","mce-"+(v.attr("type")||"text/javascript"))}});n.parser.addNodeFilter("#cdata",function(s,t){var u=s.length,v;while(u--){v=s[u];v.type=8;v.name="#comment";v.value="[CDATA["+v.value+"]]"}});n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(t,u){var v=t.length,x,s=n.schema.getNonEmptyElements();while(v--){x=t[v];if(x.isEmpty(s)){x.empty().append(new k.html.Node("br",1)).shortEnded=true}}});n.serializer=new k.dom.Serializer(p,n.dom,n.schema);n.selection=new k.dom.Selection(n.dom,n.getWin(),n.serializer,n);n.formatter=new k.Formatter(n);n.undoManager=new k.UndoManager(n);n.forceBlocks=new k.ForceBlocks(n);n.enterKey=new k.EnterKey(n);n.editorCommands=new k.EditorCommands(n);n.serializer.onPreProcess.add(function(s,t){return n.onPreProcess.dispatch(n,t,s)});n.serializer.onPostProcess.add(function(s,t){return n.onPostProcess.dispatch(n,t,s)});n.onPreInit.dispatch(n);if(!p.browser_spellcheck&&!p.gecko_spellcheck){r.body.spellcheck=false}if(!p.readonly){n.bindNativeEvents()}n.controlManager.onPostRender.dispatch(n,n.controlManager);n.onPostRender.dispatch(n);n.quirks=k.util.Quirks(n);if(p.directionality){m.dir=p.directionality}if(p.nowrap){m.style.whiteSpace="nowrap"}if(p.protect){n.onBeforeSetContent.add(function(s,t){i(p.protect,function(u){t.content=t.content.replace(u,function(v){return""})})})}n.onSetContent.add(function(){n.addVisual(n.getBody())});if(p.padd_empty_editor){n.onPostProcess.add(function(s,t){t.content=t.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
        [\r\n]*)$/,"")})}n.load({initial:true,format:"html"});n.startContent=n.getContent({format:"raw"});n.initialized=true;n.onInit.dispatch(n);n.execCallback("setupcontent_callback",n.id,m,r);n.execCallback("init_instance_callback",n);n.focus(true);n.nodeChanged({initial:true});i(n.contentCSS,function(s){n.dom.loadCSS(s)});if(p.auto_focus){setTimeout(function(){var s=k.get(p.auto_focus);s.selection.select(s.getBody(),1);s.selection.collapse(1);s.getBody().focus();s.getWin().focus()},100)}q=r=m=null},focus:function(p){var o,u=this,t=u.selection,q=u.settings.content_editable,n,r,s=u.getDoc(),m;if(!p){if(u.lastIERng){t.setRng(u.lastIERng)}n=t.getRng();if(n.item){r=n.item(0)}u._refreshContentEditable();if(!q){u.getWin().focus()}if(k.isGecko||q){m=u.getBody();if(m.setActive){m.setActive()}else{m.focus()}if(q){t.normalize()}}if(r&&r.ownerDocument==s){n=s.body.createControlRange();n.addElement(r);n.select()}}if(k.activeEditor!=u){if((o=k.activeEditor)!=null){o.onDeactivate.dispatch(o,u)}u.onActivate.dispatch(u,o)}k._setActive(u)},execCallback:function(q){var m=this,p=m.settings[q],o;if(!p){return}if(m.callbackLookup&&(o=m.callbackLookup[q])){p=o.func;o=o.scope}if(d(p,"string")){o=p.replace(/\.\w+$/,"");o=o?k.resolve(o):0;p=k.resolve(p);m.callbackLookup=m.callbackLookup||{};m.callbackLookup[q]={func:p,scope:o}}return p.apply(o||m,Array.prototype.slice.call(arguments,1))},translate:function(m){var o=this.settings.language||"en",n=k.i18n;if(!m){return""}return n[o+"."+m]||m.replace(/\{\#([^\}]+)\}/g,function(q,p){return n[o+"."+p]||"{#"+p+"}"})},getLang:function(o,m){return k.i18n[(this.settings.language||"en")+"."+o]||(d(m)?m:"{#"+o+"}")},getParam:function(t,q,m){var r=k.trim,p=d(this.settings[t])?this.settings[t]:q,s;if(m==="hash"){s={};if(d(p,"string")){i(p.indexOf("=")>0?p.split(/[;,](?![^=;,]*(?:[;,]|$))/):p.split(","),function(n){n=n.split("=");if(n.length>1){s[r(n[0])]=r(n[1])}else{s[r(n[0])]=r(n)}})}else{s=p}return s}return p},nodeChanged:function(q){var m=this,n=m.selection,p;if(m.initialized){q=q||{};p=n.getStart()||m.getBody();p=b&&p.ownerDocument!=m.getDoc()?m.getBody():p;q.parents=[];m.dom.getParent(p,function(o){if(o.nodeName=="BODY"){return true}q.parents.push(o)});m.onNodeChange.dispatch(m,q?q.controlManager||m.controlManager:m.controlManager,p,n.isCollapsed(),q)}},addButton:function(n,o){var m=this;m.buttons=m.buttons||{};m.buttons[n]=o},addCommand:function(m,o,n){this.execCommands[m]={func:o,scope:n||this}},addQueryStateHandler:function(m,o,n){this.queryStateCommands[m]={func:o,scope:n||this}},addQueryValueHandler:function(m,o,n){this.queryValueCommands[m]={func:o,scope:n||this}},addShortcut:function(o,q,m,p){var n=this,r;if(n.settings.custom_shortcuts===false){return false}n.shortcuts=n.shortcuts||{};if(d(m,"string")){r=m;m=function(){n.execCommand(r,false,null)}}if(d(m,"object")){r=m;m=function(){n.execCommand(r[0],r[1],r[2])}}i(g(o),function(s){var t={func:m,scope:p||this,desc:n.translate(q),alt:false,ctrl:false,shift:false};i(g(s,"+"),function(u){switch(u){case"alt":case"ctrl":case"shift":t[u]=true;break;default:t.charCode=u.charCodeAt(0);t.keyCode=u.toUpperCase().charCodeAt(0)}});n.shortcuts[(t.ctrl?"ctrl":"")+","+(t.alt?"alt":"")+","+(t.shift?"shift":"")+","+t.keyCode]=t});return true},execCommand:function(u,r,x,m){var p=this,q=0,v,n;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(u)&&(!m||!m.skip_focus)){p.focus()}m=f({},m);p.onBeforeExecCommand.dispatch(p,u,r,x,m);if(m.terminate){return false}if(p.execCallback("execcommand_callback",p.id,p.selection.getNode(),u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(v=p.execCommands[u]){n=v.func.call(v.scope,r,x);if(n!==true){p.onExecCommand.dispatch(p,u,r,x,m);return n}}i(p.plugins,function(o){if(o.execCommand&&o.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);q=1;return false}});if(q){return true}if(p.theme&&p.theme.execCommand&&p.theme.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(p.editorCommands.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}p.getDoc().execCommand(u,r,x);p.onExecCommand.dispatch(p,u,r,x,m)},queryCommandState:function(q){var n=this,r,p;if(n._isHidden()){return}if(r=n.queryStateCommands[q]){p=r.func.call(r.scope);if(p!==true){return p}}r=n.editorCommands.queryCommandState(q);if(r!==-1){return r}try{return this.getDoc().queryCommandState(q)}catch(m){}},queryCommandValue:function(r){var n=this,q,p;if(n._isHidden()){return}if(q=n.queryValueCommands[r]){p=q.func.call(q.scope);if(p!==true){return p}}q=n.editorCommands.queryCommandValue(r);if(d(q)){return q}try{return this.getDoc().queryCommandValue(r)}catch(m){}},show:function(){var m=this;l.show(m.getContainer());l.hide(m.id);m.load()},hide:function(){var m=this,n=m.getDoc();if(b&&n){n.execCommand("SelectAll")}m.save();l.hide(m.getContainer());l.setStyle(m.id,"display",m.orgDisplay)},isHidden:function(){return !l.isHidden(this.id)},setProgressState:function(m,n,p){this.onSetProgressState.dispatch(this,m,n,p);return m},load:function(q){var m=this,p=m.getElement(),n;if(p){q=q||{};q.load=true;n=m.setContent(d(p.value)?p.value:p.innerHTML,q);q.element=p;if(!q.no_events){m.onLoadContent.dispatch(m,q)}q.element=p=null;return n}},save:function(r){var m=this,q=m.getElement(),n,p;if(!q||!m.initialized){return}r=r||{};r.save=true;r.element=q;n=r.content=m.getContent(r);if(!r.no_events){m.onSaveContent.dispatch(m,r)}n=r.content;if(!/TEXTAREA|INPUT/i.test(q.nodeName)){q.innerHTML=n;if(p=l.getParent(m.id,"form")){i(p.elements,function(o){if(o.name==m.id){o.value=n;return false}})}}else{q.value=n}r.element=q=null;return n},setContent:function(r,p){var o=this,n,m=o.getBody(),q;p=p||{};p.format=p.format||"html";p.set=true;p.content=r;if(!p.no_events){o.onBeforeSetContent.dispatch(o,p)}r=p.content;if(!k.isIE&&(r.length===0||/^\s+$/.test(r))){q=o.settings.forced_root_block;if(q){r="<"+q+'>
        "}else{r='
        '}m.innerHTML=r;o.selection.select(m,true);o.selection.collapse(true);return}if(p.format!=="raw"){r=new k.html.Serializer({},o.schema).serialize(o.parser.parse(r))}p.content=k.trim(r);o.dom.setHTML(m,p.content);if(!p.no_events){o.onSetContent.dispatch(o,p)}if(!o.settings.content_editable||document.activeElement===o.getBody()){o.selection.normalize()}return p.content},getContent:function(n){var m=this,o;n=n||{};n.format=n.format||"html";n.get=true;n.getInner=true;if(!n.no_events){m.onBeforeGetContent.dispatch(m,n)}if(n.format=="raw"){o=m.getBody().innerHTML}else{o=m.serializer.serialize(m.getBody(),n)}n.content=k.trim(o);if(!n.no_events){m.onGetContent.dispatch(m,n)}return n.content},isDirty:function(){var m=this;return k.trim(m.startContent)!=k.trim(m.getContent({format:"raw",no_events:1}))&&!m.isNotDirty},getContainer:function(){var m=this;if(!m.container){m.container=l.get(m.editorContainer||m.id+"_parent")}return m.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return l.get(this.settings.content_element||this.id)},getWin:function(){var m=this,n;if(!m.contentWindow){n=l.get(m.id+"_ifr");if(n){m.contentWindow=n.contentWindow}}return m.contentWindow},getDoc:function(){var m=this,n;if(!m.contentDocument){n=m.getWin();if(n){m.contentDocument=n.document}}return m.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(o,n,q){var m=this,p=m.settings;if(p.urlconverter_callback){return m.execCallback("urlconverter_callback",o,q,true,n)}if(!p.convert_urls||(q&&q.nodeName=="LINK")||o.indexOf("file:")===0){return o}if(p.relative_urls){return m.documentBaseURI.toRelative(o)}o=m.documentBaseURI.toAbsolute(o,p.remove_script_host);return o},addVisual:function(q){var n=this,o=n.settings,p=n.dom,m;q=q||n.getBody();if(!d(n.hasVisual)){n.hasVisual=o.visual}i(p.select("table,a",q),function(s){var r;switch(s.nodeName){case"TABLE":m=o.visual_table_class||"mceItemTable";r=p.getAttrib(s,"border");if(!r||r=="0"){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}return;case"A":if(!s.href){r=p.getAttrib(s,"name")||s.id;m="mceItemAnchor";if(r){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}}return}});n.onVisualAid.dispatch(n,q,n.hasVisual)},remove:function(){var m=this,n=m.getContainer();if(!m.removed){m.removed=1;m.hide();if(!m.settings.content_editable){j.clear(m.getWin());j.clear(m.getDoc())}j.clear(m.getBody());j.clear(m.formElement);j.unbind(n);m.execCallback("remove_instance_callback",m);m.onRemove.dispatch(m);m.onExecCommand.listeners=[];k.remove(m);l.remove(n)}},destroy:function(n){var m=this;if(m.destroyed){return}if(a){j.unbind(m.getDoc());j.unbind(m.getWin());j.unbind(m.getBody())}if(!n){k.removeUnload(m.destroy);tinyMCE.onBeforeUnload.remove(m._beforeUnload);if(m.theme&&m.theme.destroy){m.theme.destroy()}m.controlManager.destroy();m.selection.destroy();m.dom.destroy()}if(m.formElement){m.formElement.submit=m.formElement._mceOldSubmit;m.formElement._mceOldSubmit=null}m.contentAreaContainer=m.formElement=m.container=m.settings.content_element=m.bodyElement=m.contentDocument=m.contentWindow=null;if(m.selection){m.selection=m.selection.win=m.selection.dom=m.selection.dom.doc=null}m.destroyed=1},_refreshContentEditable:function(){var n=this,m,o;if(n._isHidden()){m=n.getBody();o=m.parentNode;o.removeChild(m);o.appendChild(m);m.focus()}},_isHidden:function(){var m;if(!a){return 0}m=this.selection.getSel();return(!m||!m.rangeCount||m.rangeCount===0)}})})(tinymce);(function(a){var b=a.each;a.Editor.prototype.setupEvents=function(){var c=this,d=c.settings;b(["onPreInit","onBeforeRenderUI","onPostRender","onLoad","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState","onSetAttrib"],function(e){c[e]=new a.util.Dispatcher(c)});if(d.cleanup_callback){c.onBeforeSetContent.add(function(e,f){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)});c.onPreProcess.add(function(e,f){if(f.set){e.execCallback("cleanup_callback","insert_to_editor_dom",f.node,f)}if(f.get){e.execCallback("cleanup_callback","get_from_editor_dom",f.node,f)}});c.onPostProcess.add(function(e,f){if(f.set){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)}if(f.get){f.content=e.execCallback("cleanup_callback","get_from_editor",f.content,f)}})}if(d.save_callback){c.onGetContent.add(function(e,f){if(f.save){f.content=e.execCallback("save_callback",e.id,f.content,e.getBody())}})}if(d.handle_event_callback){c.onEvent.add(function(f,g,h){if(c.execCallback("handle_event_callback",g,f,h)===false){Event.cancel(g)}})}if(d.handle_node_change_callback){c.onNodeChange.add(function(f,e,g){f.execCallback("handle_node_change_callback",f.id,g,-1,-1,true,f.selection.isCollapsed())})}if(d.save_callback){c.onSaveContent.add(function(e,g){var f=e.execCallback("save_callback",e.id,g.content,e.getBody());if(f){g.content=f}})}if(d.onchange_callback){c.onChange.add(function(f,e){f.execCallback("onchange_callback",f,e)})}};a.Editor.prototype.bindNativeEvents=function(){var l=this,f,d=l.settings,e=l.dom,h;h={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function c(i,m){var n=i.type;if(l.removed){return}if(l.onEvent.dispatch(l,i,m)!==false){l[h[i.fakeType||i.type]].dispatch(l,i,m)}}function j(i){l.focus(true)}function k(){l.selection.normalize();l.nodeChanged()}b(h,function(m,n){var i=d.content_editable?l.getBody():l.getDoc();switch(n){case"contextmenu":e.bind(i,n,c);break;case"paste":e.bind(l.getBody(),n,c);break;case"submit":case"reset":e.bind(l.getElement().form||a.DOM.getParent(l.id,"form"),n,c);break;default:e.bind(i,n,c)}});e.bind(d.content_editable?l.getBody():(a.isGecko?l.getDoc():l.getWin()),"focus",function(i){l.focus(true)});if(d.content_editable&&a.isOpera){e.bind(l.getBody(),"click",j);e.bind(l.getBody(),"keydown",j)}l.onMouseUp.add(k);l.onKeyUp.add(function(i,n){var m=n.keyCode;if((m>=33&&m<=36)||(m>=37&&m<=40)||m==13||m==45||m==46||m==8||(a.isMac&&(m==91||m==93))||n.ctrlKey){k()}});l.onReset.add(function(){l.setContent(l.startContent,{format:"raw"})});function g(m,i){if(m.altKey||m.ctrlKey||m.metaKey){b(l.shortcuts,function(n){var o=a.isMac?m.metaKey:m.ctrlKey;if(n.ctrl!=o||n.alt!=m.altKey||n.shift!=m.shiftKey){return}if(m.keyCode==n.keyCode||(m.charCode&&m.charCode==n.charCode)){m.preventDefault();if(i){n.func.call(n.scope)}return true}})}}l.onKeyUp.add(function(i,m){g(m)});l.onKeyPress.add(function(i,m){g(m)});l.onKeyDown.add(function(i,m){g(m,true)});if(a.isOpera){l.onClick.add(function(i,m){m.preventDefault()})}}})(tinymce);(function(d){var e=d.each,b,a=true,c=false;d.EditorCommands=function(n){var m=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,q=n.formatter,o;function r(z,y,x){var v;z=z.toLowerCase();if(v=j.exec[z]){v(z,y,x);return a}return c}function l(x){var v;x=x.toLowerCase();if(v=j.state[x]){return v(x)}return -1}function h(x){var v;x=x.toLowerCase();if(v=j.value[x]){return v(x)}return c}function u(v,x){x=x||"exec";e(v,function(z,y){e(y.toLowerCase().split(","),function(A){j[x][A]=z})})}d.extend(this,{execCommand:r,queryCommandState:l,queryCommandValue:h,addCommands:u});function f(y,x,v){if(x===b){x=c}if(v===b){v=null}return n.getDoc().execCommand(y,x,v)}function t(v){return q.match(v)}function s(v,x){q.toggle(v,x?{value:x}:b)}function i(v){o=p.getBookmark(v)}function g(){p.moveToBookmark(o)}u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(z){var y=n.getDoc(),v;try{f(z)}catch(x){v=a}if(v||!y.queryCommandSupported(z)){if(d.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(A){if(A){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(v){if(p.isCollapsed()){p.select(p.getNode())}f(v);p.collapse(c)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){var x=v.substring(7);e("left,center,right,full".split(","),function(y){if(x!=y){q.remove("align"+y)}});s("align"+x);r("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(y){var v,x;f(y);v=m.getParent(p.getNode(),"ol,ul");if(v){x=v.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(x.nodeName)){i();m.split(x,v);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){s(v)},"ForeColor,HiliteColor,FontName":function(y,x,v){s(y,v)},FontSize:function(z,y,x){var v,A;if(x>=1&&x<=7){A=d.explode(k.font_size_style_values);v=d.explode(k.font_size_classes);if(v){x=v[x-1]||x}else{x=A[x-1]||x}}s(z,x)},RemoveFormat:function(v){q.remove(v)},mceBlockQuote:function(v){s("blockquote")},FormatBlock:function(y,x,v){return s(v||"p")},mceCleanup:function(){var v=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(v)},mceRemoveNode:function(z,y,x){var v=x||p.getNode();if(v!=n.getBody()){i();n.dom.remove(v,a);g()}},mceSelectNodeDepth:function(z,y,x){var v=0;m.getParent(p.getNode(),function(A){if(A.nodeType==1&&v++==x){p.select(A);return c}},n.getBody())},mceSelectNode:function(y,x,v){p.select(v)},mceInsertContent:function(B,I,K){var y,J,E,z,F,G,D,C,L,x,A,M,v,H;y=n.parser;J=new d.html.Serializer({},n.schema);v='\uFEFF';G={content:K,format:"html"};p.onBeforeSetContent.dispatch(p,G);K=G.content;if(K.indexOf("{$caret}")==-1){K+="{$caret}"}K=K.replace(/\{\$caret\}/,v);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}E=p.getNode();G={context:E.nodeName.toLowerCase()};F=y.parse(K,G);A=F.lastChild;if(A.attr("id")=="mce_marker"){D=A;for(A=A.prev;A;A=A.walk(true)){if(A.type==3||!m.isBlock(A.name)){A.parent.insert(D,A,A.name==="br");break}}}if(!G.invalid){K=J.serialize(F);A=E.firstChild;M=E.lastChild;if(!A||(A===M&&A.nodeName==="BR")){m.setHTML(E,K)}else{p.setContent(K)}}else{p.setContent(v);E=n.selection.getNode();z=n.getBody();if(E.nodeType==9){E=A=z}else{A=E}while(A!==z){E=A;A=A.parentNode}K=E==z?z.innerHTML:m.getOuterHTML(E);K=J.serialize(y.parse(K.replace(//i,function(){return J.serialize(F)})));if(E==z){m.setHTML(z,K)}else{m.setOuterHTML(E,K)}}D=m.get("mce_marker");C=m.getRect(D);L=m.getViewPort(n.getWin());if((C.y+C.h>L.y+L.h||C.yL.x+L.w||C.x")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(y,x,v){n.execCommand("mceInsertContent",false,v.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(z,y,x){var v;if(typeof(x)=="string"){x={href:x}}v=m.getParent(p.getNode(),"a");x.href=x.href.replace(" ","%20");if(!v||!x.href){q.remove("link")}if(x.href){q.apply("link",x,v)}},selectAll:function(){var x=m.getRoot(),v=m.createRng();v.setStart(x,0);v.setEnd(x,x.childNodes.length);n.selection.setRng(v)}});u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(z){var x="align"+z.substring(7);var v=p.isCollapsed()?[m.getParent(p.getNode(),m.isBlock)]:p.getSelectedBlocks();var y=d.map(v,function(A){return !!q.matchNode(A,x)});return d.inArray(y,a)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){return t(v)},mceBlockQuote:function(){return t("blockquote")},Outdent:function(){var v;if(k.inline_styles){if((v=m.getParent(p.getStart(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}if((v=m.getParent(p.getEnd(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}}return l("InsertUnorderedList")||l("InsertOrderedList")||(!k.inline_styles&&!!m.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(v){return m.getParent(p.getNode(),v=="insertunorderedlist"?"UL":"OL")}},"state");u({"FontSize,FontName":function(y){var x=0,v;if(v=m.getParent(p.getNode(),"span")){if(y=="fontsize"){x=v.style.fontSize}else{x=v.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return x}},"value");u({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(h){var l,i=0,e=[],g,k,j,f;function c(){return b.trim(h.getContent({format:"raw",no_events:1}).replace(/]+data-mce-bogus[^>]+>[\u200B\uFEFF]+<\/span>/g,""))}function d(){l.typing=false;l.add()}onBeforeAdd=new a(l);k=new a(l);j=new a(l);f=new a(l);k.add(function(m,n){if(m.hasUndo()){return h.onChange.dispatch(h,n,m)}});j.add(function(m,n){return h.onUndo.dispatch(h,n,m)});f.add(function(m,n){return h.onRedo.dispatch(h,n,m)});h.onInit.add(function(){l.add()});h.onBeforeExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.beforeChange()}});h.onExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.add()}});h.onSaveContent.add(d);h.dom.bind(h.dom.getRoot(),"dragend",d);h.dom.bind(h.getDoc(),b.isGecko?"blur":"focusout",function(m){if(!h.removed&&l.typing){d()}});h.onKeyUp.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45||n==13||o.ctrlKey){d()}});h.onKeyDown.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45){if(l.typing){d()}return}if((n<16||n>20)&&n!=224&&n!=91&&!l.typing){l.beforeChange();l.typing=true;l.add()}});h.onMouseDown.add(function(m,n){if(l.typing){d()}});h.addShortcut("ctrl+z","undo_desc","Undo");h.addShortcut("ctrl+y","redo_desc","Redo");l={data:e,typing:false,onBeforeAdd:onBeforeAdd,onAdd:k,onUndo:j,onRedo:f,beforeChange:function(){g=h.selection.getBookmark(2,true)},add:function(p){var m,n=h.settings,o;p=p||{};p.content=c();l.onBeforeAdd.dispatch(l,p);o=e[i];if(o&&o.content==p.content){return null}if(e[i]){e[i].beforeBookmark=g}if(n.custom_undo_redo_levels){if(e.length>n.custom_undo_redo_levels){for(m=0;m0){n=e[--i];h.setContent(n.content,{format:"raw"});h.selection.moveToBookmark(n.beforeBookmark);l.onUndo.dispatch(l,n)}return n},redo:function(){var m;if(i0||this.typing},hasRedo:function(){return i0){g.moveEnd("character",q)}g.select()}catch(n){}}if(p){c.nodeChanged()}}if(b.forced_root_block){c.onKeyUp.add(f);c.onNodeChange.add(f)}};(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(j){var o,k,g,h=this,m=h.editor,n,f;if(!h.controlFactories){h.controlFactories=[];d(m.plugins,function(i){if(i.createControl){h.controlFactories.push(i)}})}n=h.controlFactories;for(k=0,g=n.length;k1||ag==ay||ag.tagName=="BR"){return ag}}}var aq=aa.selection.getRng();var av=aq.startContainer;var ap=aq.endContainer;if(av!=ap&&aq.endOffset===0){var au=ar(av,ap);var at=au.nodeType==3?au.length:au.childNodes.length;aq.setEnd(au,at)}return aq}function ad(at,ay,aw,av,aq){var ap=[],ar=-1,ax,aA=-1,au=-1,az;T(at.childNodes,function(aC,aB){if(aC.nodeName==="UL"||aC.nodeName==="OL"){ar=aB;ax=aC;return false}});T(at.childNodes,function(aC,aB){if(aC.nodeName==="SPAN"&&c.getAttrib(aC,"data-mce-type")=="bookmark"){if(aC.id==ay.id+"_start"){aA=aB}else{if(aC.id==ay.id+"_end"){au=aB}}}});if(ar<=0||(aAar)){T(a.grep(at.childNodes),aq);return 0}else{az=c.clone(aw,X);T(a.grep(at.childNodes),function(aC,aB){if((aAar&&aB>ar)){ap.push(aC);aC.parentNode.removeChild(aC)}});if(aAar){at.insertBefore(az,ax.nextSibling)}}av.push(az);T(ap,function(aB){az.appendChild(aB)});return az}}function an(aq,at,aw){var ap=[],av,ar,au=true;av=am.inline||am.block;ar=c.create(av);ab(ar);N.walk(aq,function(ax){var ay;function az(aA){var aF,aD,aB,aC,aE;aE=au;aF=aA.nodeName.toLowerCase();aD=aA.parentNode.nodeName.toLowerCase();if(aA.nodeType===1&&x(aA)){aE=au;au=x(aA)==="true";aC=true}if(g(aF,"br")){ay=0;if(am.block){c.remove(aA)}return}if(am.wrapper&&y(aA,ae,al)){ay=0;return}if(au&&!aC&&am.block&&!am.wrapper&&I(aF)){aA=c.rename(aA,av);ab(aA);ap.push(aA);ay=0;return}if(am.selector){T(ah,function(aG){if("collapsed" in aG&&aG.collapsed!==ai){return}if(c.is(aA,aG.selector)&&!b(aA)){ab(aA,aG);aB=true}});if(!am.inline||aB){ay=0;return}}if(au&&!aC&&d(av,aF)&&d(aD,av)&&!(!aw&&aA.nodeType===3&&aA.nodeValue.length===1&&aA.nodeValue.charCodeAt(0)===65279)&&!b(aA)){if(!ay){ay=c.clone(ar,X);aA.parentNode.insertBefore(ay,aA);ap.push(ay)}ay.appendChild(aA)}else{if(aF=="li"&&at){ay=ad(aA,at,ar,ap,az)}else{ay=0;T(a.grep(aA.childNodes),az);if(aC){au=aE}ay=0}}}T(ax,az)});if(am.wrap_links===false){T(ap,function(ax){function ay(aC){var aB,aA,az;if(aC.nodeName==="A"){aA=c.clone(ar,X);ap.push(aA);az=a.grep(aC.childNodes);for(aB=0;aB1||!H(az))&&ax===0){c.remove(az,1);return}if(am.inline||am.wrapper){if(!am.exact&&ax===1){az=ay(az)}T(ah,function(aB){T(c.select(aB.inline,az),function(aD){var aC;if(aB.wrap_links===false){aC=aD.parentNode;do{if(aC.nodeName==="A"){return}}while(aC=aC.parentNode)}Z(aB,al,aD,aB.exact?aD:null)})});if(y(az.parentNode,ae,al)){c.remove(az,1);az=0;return C}if(am.merge_with_parents){c.getParent(az.parentNode,function(aB){if(y(aB,ae,al)){c.remove(az,1);az=0;return C}})}if(az&&am.merge_siblings!==false){az=u(E(az),az);az=u(az,E(az,C))}}})}if(am){if(ag){if(ag.nodeType){ac=c.createRng();ac.setStartBefore(ag);ac.setEndAfter(ag);an(p(ac,ah),null,true)}else{an(ag,null,true)}}else{if(!ai||!am.inline||c.select("td.mceSelected,th.mceSelected").length){var ao=aa.selection.getNode();if(!m&&ah[0].defaultBlock&&!c.getParent(ao,c.isBlock)){Y(ah[0].defaultBlock)}aa.selection.setRng(af());ak=r.getBookmark();an(p(r.getRng(C),ah),ak);if(am.styles&&(am.styles.color||am.styles.textDecoration)){a.walk(ao,L,"childNodes");L(ao)}r.moveToBookmark(ak);R(r.getRng(C));aa.nodeChanged()}else{U("apply",ae,al)}}}}function B(ad,am,af){var ag=V(ad),ao=ag[0],ak,aj,ac,al=true;function ae(av){var au,at,ar,aq,ax,aw;if(av.nodeType===1&&x(av)){ax=al;al=x(av)==="true";aw=true}au=a.grep(av.childNodes);if(al&&!aw){for(at=0,ar=ag.length;at=0;ac--){ab=ah[ac].selector;if(!ab){return C}for(ag=ad.length-1;ag>=0;ag--){if(c.is(ad[ag],ab)){return C}}}}return X}function J(ab,ad){var ac;if(!P){P={};ac={};aa.onNodeChange.addToTop(function(af,ae,ah){var ag=n(ah),ai={};T(P,function(aj,ak){T(ag,function(al){if(y(al,ak,{},true)){if(!ac[ak]){T(aj,function(am){am(true,{node:al,format:ak,parents:ag})});ac[ak]=aj}ai[ak]=aj;return false}})});T(ac,function(aj,ak){if(!ai[ak]){delete ac[ak];T(aj,function(al){al(false,{node:ah,format:ak,parents:ag})})}})})}T(ab.split(","),function(ae){if(!P[ae]){P[ae]=[]}P[ae].push(ad)});return this}a.extend(this,{get:V,register:l,apply:Y,remove:B,toggle:F,match:k,matchAll:v,matchNode:y,canApply:z,formatChanged:J});j();W();function h(ab,ac){if(g(ab,ac.inline)){return C}if(g(ab,ac.block)){return C}if(ac.selector){return c.is(ab,ac.selector)}}function g(ac,ab){ac=ac||"";ab=ab||"";ac=""+(ac.nodeName||ac);ab=""+(ab.nodeName||ab);return ac.toLowerCase()==ab.toLowerCase()}function O(ac,ab){var ad=c.getStyle(ac,ab);if(ab=="color"||ab=="backgroundColor"){ad=c.toHex(ad)}if(ab=="fontWeight"&&ad==700){ad="bold"}return""+ad}function q(ab,ac){if(typeof(ab)!="string"){ab=ab(ac)}else{if(ac){ab=ab.replace(/%(\w+)/g,function(ae,ad){return ac[ad]||ae})}}return ab}function f(ab){return ab&&ab.nodeType===3&&/^([\t \r\n]+|)$/.test(ab.nodeValue)}function S(ad,ac,ab){var ae=c.create(ac,ab);ad.parentNode.insertBefore(ae,ad);ae.appendChild(ad);return ae}function p(ab,am,ae){var ap,an,ah,al,ad=ab.startContainer,ai=ab.startOffset,ar=ab.endContainer,ak=ab.endOffset;function ao(az){var au,ax,ay,aw,av,at;au=ax=az?ad:ar;av=az?"previousSibling":"nextSibling";at=c.getRoot();if(au.nodeType==3&&!f(au)){if(az?ai>0:akan?an:ai];if(ad.nodeType==3){ai=0}}if(ar.nodeType==1&&ar.hasChildNodes()){an=ar.childNodes.length-1;ar=ar.childNodes[ak>an?an:ak-1];if(ar.nodeType==3){ak=ar.nodeValue.length}}function aq(au){var at=au;while(at){if(at.nodeType===1&&x(at)){return x(at)==="false"?at:au}at=at.parentNode}return au}function aj(au,ay,aA){var ax,av,az,at;function aw(aC,aE){var aF,aB,aD=aC.nodeValue;if(typeof(aE)=="undefined"){aE=aA?aD.length:0}if(aA){aF=aD.lastIndexOf(" ",aE);aB=aD.lastIndexOf("\u00a0",aE);aF=aF>aB?aF:aB;if(aF!==-1&&!ae){aF++}}else{aF=aD.indexOf(" ",aE);aB=aD.indexOf("\u00a0",aE);aF=aF!==-1&&(aB===-1||aF0&&ah.node.nodeType===3&&ah.node.nodeValue.charAt(ah.offset-1)===" "){if(ah.offset>1){ar=ah.node;ar.splitText(ah.offset-1)}}}}if(am[0].inline||am[0].block_expand){if(!am[0].inline||(ad.nodeType!=3||ai===0)){ad=ao(true)}if(!am[0].inline||(ar.nodeType!=3||ak===ar.nodeValue.length)){ar=ao()}}if(am[0].selector&&am[0].expand!==X&&!am[0].inline){ad=af(ad,"previousSibling");ar=af(ar,"nextSibling")}if(am[0].block||am[0].selector){ad=ac(ad,"previousSibling");ar=ac(ar,"nextSibling");if(am[0].block){if(!H(ad)){ad=ao(true)}if(!H(ar)){ar=ao()}}}if(ad.nodeType==1){ai=s(ad);ad=ad.parentNode}if(ar.nodeType==1){ak=s(ar)+1;ar=ar.parentNode}return{startContainer:ad,startOffset:ai,endContainer:ar,endOffset:ak}}function Z(ah,ag,ae,ab){var ad,ac,af;if(!h(ae,ah)){return X}if(ah.remove!="all"){T(ah.styles,function(aj,ai){aj=q(aj,ag);if(typeof(ai)==="number"){ai=aj;ab=0}if(!ab||g(O(ab,ai),aj)){c.setStyle(ae,ai,"")}af=1});if(af&&c.getAttrib(ae,"style")==""){ae.removeAttribute("style");ae.removeAttribute("data-mce-style")}T(ah.attributes,function(ak,ai){var aj;ak=q(ak,ag);if(typeof(ai)==="number"){ai=ak;ab=0}if(!ab||g(c.getAttrib(ab,ai),ak)){if(ai=="class"){ak=c.getAttrib(ae,ai);if(ak){aj="";T(ak.split(/\s+/),function(al){if(/mce\w+/.test(al)){aj+=(aj?" ":"")+al}});if(aj){c.setAttrib(ae,ai,aj);return}}}if(ai=="class"){ae.removeAttribute("className")}if(e.test(ai)){ae.removeAttribute("data-mce-"+ai)}ae.removeAttribute(ai)}});T(ah.classes,function(ai){ai=q(ai,ag);if(!ab||c.hasClass(ab,ai)){c.removeClass(ae,ai)}});ac=c.getAttribs(ae);for(ad=0;adad?ad:af]}if(ab.nodeType===3&&ag&&af>=ab.nodeValue.length){ab=new t(ab,aa.getBody()).next()||ab}if(ab.nodeType===3&&!ag&&af===0){ab=new t(ab,aa.getBody()).prev()||ab}return ab}function U(ak,ab,ai){var al="_mce_caret",ac=aa.settings.caret_debug;function ad(ap){var ao=c.create("span",{id:al,"data-mce-bogus":true,style:ac?"color:red":""});if(ap){ao.appendChild(aa.getDoc().createTextNode(G))}return ao}function aj(ap,ao){while(ap){if((ap.nodeType===3&&ap.nodeValue!==G)||ap.childNodes.length>1){return false}if(ao&&ap.nodeType===1){ao.push(ap)}ap=ap.firstChild}return true}function ag(ao){while(ao){if(ao.id===al){return ao}ao=ao.parentNode}}function af(ao){var ap;if(ao){ap=new t(ao,ao);for(ao=ap.current();ao;ao=ap.next()){if(ao.nodeType===3){return ao}}}}function ae(aq,ap){var ar,ao;if(!aq){aq=ag(r.getStart());if(!aq){while(aq=c.get(al)){ae(aq,false)}}}else{ao=r.getRng(true);if(aj(aq)){if(ap!==false){ao.setStartBefore(aq);ao.setEndBefore(aq)}c.remove(aq)}else{ar=af(aq);if(ar.nodeValue.charAt(0)===G){ar=ar.deleteData(0,1)}c.remove(aq,1)}r.setRng(ao)}}function ah(){var aq,ao,av,au,ar,ap,at;aq=r.getRng(true);au=aq.startOffset;ap=aq.startContainer;at=ap.nodeValue;ao=ag(r.getStart());if(ao){av=af(ao)}if(at&&au>0&&au=0;at--){aq.appendChild(c.clone(ax[at],false));aq=aq.firstChild}aq.appendChild(c.doc.createTextNode(G));aq=aq.firstChild;c.insertAfter(aw,ay);r.setCursorLocation(aq,1)}}function an(){var ap,ao,aq;ao=ag(r.getStart());if(ao&&!c.isEmpty(ao)){a.walk(ao,function(ar){if(ar.nodeType==1&&ar.id!==al&&!c.isEmpty(ar)){c.setAttrib(ar,"data-mce-bogus",null)}},"childNodes")}}if(!self._hasCaretEvents){aa.onBeforeGetContent.addToTop(function(){var ao=[],ap;if(aj(ag(r.getStart()),ao)){ap=ao.length;while(ap--){c.setAttrib(ao[ap],"data-mce-bogus","1")}}});a.each("onMouseUp onKeyUp".split(" "),function(ao){aa[ao].addToTop(function(){ae();an()})});aa.onKeyDown.addToTop(function(ao,aq){var ap=aq.keyCode;if(ap==8||ap==37||ap==39){ae(ag(r.getStart()))}an()});r.onSetContent.add(an);self._hasCaretEvents=true}if(ak=="apply"){ah()}else{am()}}function R(ac){var ab=ac.startContainer,ai=ac.startOffset,ae,ah,ag,ad,af;if(ab.nodeType==3&&ai>=ab.nodeValue.length){ai=s(ab);ab=ab.parentNode;ae=true}if(ab.nodeType==1){ad=ab.childNodes;ab=ad[Math.min(ai,ad.length-1)];ah=new t(ab,c.getParent(ab,c.isBlock));if(ai>ad.length-1||ae){ah.next()}for(ag=ah.current();ag;ag=ah.next()){if(ag.nodeType==3&&!f(ag)){af=c.create("a",null,G);ag.parentNode.insertBefore(af,ag);ac.setStart(ag,0);r.setRng(ac);c.remove(af);return}}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}if(c.inline_styles){h=e.explode(c.font_size_legacy_values);d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size,10)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});(function(b){var a=b.dom.TreeWalker;b.EnterKey=function(e){var h=e.dom,d=e.selection,c=e.settings,g=e.undoManager;function f(y){var u=d.getRng(true),C,i,x,t,o,H,n,j,l,s,E,v,z;function B(I){return I&&h.isBlock(I)&&!/^(TD|TH|CAPTION)$/.test(I.nodeName)&&!/^(fixed|absolute)/i.test(I.style.position)&&h.getContentEditable(I)!=="true"}function m(J){var O,M,I,P,N,L=J,K;I=h.createRng();if(J.hasChildNodes()){O=new a(J,J);while(M=O.current()){if(M.nodeType==3){I.setStart(M,0);I.setEnd(M,0);break}if(/^(BR|IMG)$/.test(M.nodeName)){I.setStartBefore(M);I.setEndBefore(M);break}L=M;M=O.next()}if(!M){I.setStart(L,0);I.setEnd(L,0)}}else{if(J.nodeName=="BR"){if(J.nextSibling&&h.isBlock(J.nextSibling)){if(!H||H<9){K=h.create("br");J.parentNode.insertBefore(K,J)}I.setStartBefore(J);I.setEndBefore(J)}else{I.setStartAfter(J);I.setEndAfter(J)}}else{I.setStart(J,0);I.setEnd(J,0)}}d.setRng(I);h.remove(K);N=h.getViewPort(e.getWin());P=h.getPos(J).y;if(PN.y+N.h){e.getWin().scrollTo(0,P"}return M}function p(L){var K,J,I;if(x.nodeType==3&&(L?t>0:t=x.nodeValue.length){if(!b.isIE&&!A()){J=h.create("br");u.insertNode(J);u.setStartAfter(J);u.setEndAfter(J);I=true}}J=h.create("br");u.insertNode(J);if(b.isIE&&s=="PRE"&&(!H||H<8)){J.parentNode.insertBefore(h.doc.createTextNode("\r"),J)}if(!I){u.setStartAfter(J);u.setEndAfter(J)}else{u.setStartBefore(J);u.setEndBefore(J)}d.setRng(u);g.add()}function r(I){do{if(I.nodeType===3){I.nodeValue=I.nodeValue.replace(/^[\r\n]+/,"")}I=I.firstChild}while(I)}function F(K){var I=h.getRoot(),J,L;J=K;while(J!==I&&h.getContentEditable(J)!=="false"){if(h.getContentEditable(J)==="true"){L=J}J=J.parentNode}return J!==I?L:I}if(!u.collapsed){e.execCommand("Delete");return}if(y.isDefaultPrevented()){return}x=u.startContainer;t=u.startOffset;v=c.forced_root_block;v=v?v.toUpperCase():"";H=h.doc.documentMode;if(x.nodeType==1&&x.hasChildNodes()){z=t>x.childNodes.length-1;x=x.childNodes[Math.min(t,x.childNodes.length-1)]||x;t=0}i=F(x);if(!i){return}g.beforeChange();if(!h.isBlock(i)&&i!=h.getRoot()){if(!v||y.shiftKey){G()}return}if((v&&!y.shiftKey)||(!v&&y.shiftKey)){x=k(x,t)}o=h.getParent(x,h.isBlock);l=o?h.getParent(o.parentNode,h.isBlock):null;s=o?o.nodeName.toUpperCase():"";E=l?l.nodeName.toUpperCase():"";if(s=="LI"&&h.isEmpty(o)){if(/^(UL|OL|LI)$/.test(l.parentNode.nodeName)){return false}D();return}if(s=="PRE"&&c.br_in_pre!==false){if(!y.shiftKey){G();return}}else{if((!v&&!y.shiftKey&&s!="LI")||(v&&y.shiftKey)){G();return}}v=v||"P";if(p()){if(/^(H[1-6]|PRE)$/.test(s)&&E!="HGROUP"){n=q(v)}else{n=q()}if(c.end_container_on_empty_block&&B(l)&&h.isEmpty(o)){n=h.split(l,o)}else{h.insertAfter(n,o)}}else{if(p(true)){n=o.parentNode.insertBefore(q(),o)}else{C=u.cloneRange();C.setEndAfter(o);j=C.extractContents();r(j);n=j.firstChild;h.insertAfter(j,o)}}h.setAttrib(n,"id","");m(n);g.add()}e.onKeyDown.add(function(j,i){if(i.keyCode==13){if(f(i)!==false){i.preventDefault()}}})}})(tinymce);utils/mctabs.js000066600000007466150472426320007541 0ustar00/** * mctabs.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ function MCTabs() { this.settings = []; this.onChange = tinyMCEPopup.editor.windowManager.createInstance('tinymce.util.Dispatcher'); }; MCTabs.prototype.init = function(settings) { this.settings = settings; }; MCTabs.prototype.getParam = function(name, default_value) { var value = null; value = (typeof(this.settings[name]) == "undefined") ? default_value : this.settings[name]; // Fix bool values if (value == "true" || value == "false") return (value == "true"); return value; }; MCTabs.prototype.showTab =function(tab){ tab.className = 'current'; tab.setAttribute("aria-selected", true); tab.setAttribute("aria-expanded", true); tab.tabIndex = 0; }; MCTabs.prototype.hideTab =function(tab){ var t=this; tab.className = ''; tab.setAttribute("aria-selected", false); tab.setAttribute("aria-expanded", false); tab.tabIndex = -1; }; MCTabs.prototype.showPanel = function(panel) { panel.className = 'current'; panel.setAttribute("aria-hidden", false); }; MCTabs.prototype.hidePanel = function(panel) { panel.className = 'panel'; panel.setAttribute("aria-hidden", true); }; MCTabs.prototype.getPanelForTab = function(tabElm) { return tinyMCEPopup.dom.getAttrib(tabElm, "aria-controls"); }; MCTabs.prototype.displayTab = function(tab_id, panel_id, avoid_focus) { var panelElm, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i, t = this; tabElm = document.getElementById(tab_id); if (panel_id === undefined) { panel_id = t.getPanelForTab(tabElm); } panelElm= document.getElementById(panel_id); panelContainerElm = panelElm ? panelElm.parentNode : null; tabContainerElm = tabElm ? tabElm.parentNode : null; selectionClass = t.getParam('selection_class', 'current'); if (tabElm && tabContainerElm) { nodes = tabContainerElm.childNodes; // Hide all other tabs for (i = 0; i < nodes.length; i++) { if (nodes[i].nodeName == "LI") { t.hideTab(nodes[i]); } } // Show selected tab t.showTab(tabElm); } if (panelElm && panelContainerElm) { nodes = panelContainerElm.childNodes; // Hide all other panels for (i = 0; i < nodes.length; i++) { if (nodes[i].nodeName == "DIV") t.hidePanel(nodes[i]); } if (!avoid_focus) { tabElm.focus(); } // Show selected panel t.showPanel(panelElm); } }; MCTabs.prototype.getAnchor = function() { var pos, url = document.location.href; if ((pos = url.lastIndexOf('#')) != -1) return url.substring(pos + 1); return ""; }; //Global instance var mcTabs = new MCTabs(); tinyMCEPopup.onInit.add(function() { var tinymce = tinyMCEPopup.getWin().tinymce, dom = tinyMCEPopup.dom, each = tinymce.each; each(dom.select('div.tabs'), function(tabContainerElm) { var keyNav; dom.setAttrib(tabContainerElm, "role", "tablist"); var items = tinyMCEPopup.dom.select('li', tabContainerElm); var action = function(id) { mcTabs.displayTab(id, mcTabs.getPanelForTab(id)); mcTabs.onChange.dispatch(id); }; each(items, function(item) { dom.setAttrib(item, 'role', 'tab'); dom.bind(item, 'click', function(evt) { action(item.id); }); }); dom.bind(dom.getRoot(), 'keydown', function(evt) { if (evt.keyCode === 9 && evt.ctrlKey && !evt.altKey) { // Tab keyNav.moveFocus(evt.shiftKey ? -1 : 1); tinymce.dom.Event.cancel(evt); } }); each(dom.select('a', tabContainerElm), function(a) { dom.setAttrib(a, 'tabindex', '-1'); }); keyNav = tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { root: tabContainerElm, items: items, onAction: action, actOnFocus: true, enableLeftRight: true, enableUpDown: true }, tinyMCEPopup.dom); }); });utils/form_utils.js000066600000013225150472426320010441 0ustar00/** * form_utils.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme")); function getColorPickerHTML(id, target_form_element) { var h = "", dom = tinyMCEPopup.dom; if (label = dom.select('label[for=' + target_form_element + ']')[0]) { label.id = label.id || dom.uniqueId(); } h += ''; h += ' '; return h; } function updateColor(img_id, form_element_id) { document.getElementById(img_id).style.backgroundColor = document.forms[0].elements[form_element_id].value; } function setBrowserDisabled(id, state) { var img = document.getElementById(id); var lnk = document.getElementById(id + "_link"); if (lnk) { if (state) { lnk.setAttribute("realhref", lnk.getAttribute("href")); lnk.removeAttribute("href"); tinyMCEPopup.dom.addClass(img, 'disabled'); } else { if (lnk.getAttribute("realhref")) lnk.setAttribute("href", lnk.getAttribute("realhref")); tinyMCEPopup.dom.removeClass(img, 'disabled'); } } } function getBrowserHTML(id, target_form_element, type, prefix) { var option = prefix + "_" + type + "_browser_callback", cb, html; cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback")); if (!cb) return ""; html = ""; html += ''; html += ' '; return html; } function openBrowser(img_id, target_form_element, type, option) { var img = document.getElementById(img_id); if (img.className != "mceButtonDisabled") tinyMCEPopup.openBrowser(target_form_element, type, option); } function selectByValue(form_obj, field_name, value, add_custom, ignore_case) { if (!form_obj || !form_obj.elements[field_name]) return; if (!value) value = ""; var sel = form_obj.elements[field_name]; var found = false; for (var i=0; i parseInt(v)) st = this.mark(f, n); } } return st; }, hasClass : function(n, c, d) { return new RegExp('\\b' + c + (d ? '[0-9]+' : '') + '\\b', 'g').test(n.className); }, getNum : function(n, c) { c = n.className.match(new RegExp('\\b' + c + '([0-9]+)\\b', 'g'))[0]; c = c.replace(/[^0-9]/g, ''); return c; }, addClass : function(n, c, b) { var o = this.removeClass(n, c); n.className = b ? c + (o != '' ? (' ' + o) : '') : (o != '' ? (o + ' ') : '') + c; }, removeClass : function(n, c) { c = n.className.replace(new RegExp("(^|\\s+)" + c + "(\\s+|$)"), ' '); return n.className = c != ' ' ? c : ''; }, tags : function(f, s) { return f.getElementsByTagName(s); }, mark : function(f, n) { var s = this.settings; this.addClass(n, s.invalid_cls); n.setAttribute('aria-invalid', 'true'); this.markLabels(f, n, s.invalid_cls); return false; }, markLabels : function(f, n, ic) { var nl, i; nl = this.tags(f, "label"); for (i=0; i '; return $out; } ?>themes/simple/editor_template_src.js000066600000006062150472426320013725 0ustar00/** * editor_template_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function() { var DOM = tinymce.DOM; // Tell it to load theme specific language pack(s) tinymce.ThemeManager.requireLangPack('simple'); tinymce.create('tinymce.themes.SimpleTheme', { init : function(ed, url) { var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings; t.editor = ed; ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css"); ed.onInit.add(function() { ed.onNodeChange.add(function(ed, cm) { tinymce.each(states, function(c) { cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c)); }); }); }); DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css"); }, renderUI : function(o) { var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc; n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n); n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'}); n = tb = DOM.add(n, 'tbody'); // Create iframe container n = DOM.add(tb, 'tr'); n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'}); // Create toolbar container n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'}); // Create toolbar tb = t.toolbar = cf.createToolbar("tools1"); tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'})); tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'})); tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'})); tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'})); tb.add(cf.createSeparator()); tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'})); tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'})); tb.add(cf.createSeparator()); tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'})); tb.add(cf.createSeparator()); tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'})); tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'})); tb.renderTo(n); return { iframeContainer : ic, editorContainer : ed.id + '_container', sizeContainer : sc, deltaHeight : -20 }; }, getInfo : function() { return { longname : 'Simple theme', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', version : tinymce.majorVersion + "." + tinymce.minorVersion } } }); tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme); })();themes/simple/langs/ru.js000066600000001414150472426320011423 0ustar00tinyMCE.addI18n('ru.simple',{ bold_desc:"\u0416\u0438\u0440\u043D\u044B\u0439 (Ctrl + B)", italic_desc:"\u041A\u0443\u0440\u0441\u0438\u0432 (Ctrl + I)", underline_desc:"\u041F\u043E\u0434\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439 (Ctrl + U)", striketrough_desc:"\u0417\u0430\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439", bullist_desc:"\u0421\u043F\u0438\u0441\u043E\u043A", numlist_desc:"\u0421\u043F\u0438\u0441\u043E\u043A \u043D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439", undo_desc:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C (Ctrl + Z)", redo_desc:"\u0412\u0435\u0440\u043D\u0443\u0442\u044C (Ctrl + Y)", cleanup_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u043B\u0438\u0448\u043D\u0438\u0439 \u043A\u043E\u0434" });themes/simple/langs/en.js000066600000000533150472426320011400 0ustar00tinyMCE.addI18n('en.simple',{"cleanup_desc":"Cleanup Messy Code","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","striketrough_desc":"Strikethrough","underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)"});themes/simple/skins/o2k7/content.css000066600000000674150472426320013437 0ustar00body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} body {background: #FFF;} .mceVisualAid {border: 1px dashed #BBB;} /* IE */ * html body { 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; } themes/simple/skins/o2k7/ui.css000066600000004401150472426320012372 0ustar00/* Reset */ .o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} /* Containers */ .o2k7SimpleSkin {position:relative} .o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;} .o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;} .o2k7SimpleSkin .mceToolbar {height:26px;} /* Layout */ .o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; } .o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} .o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px} .o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} /* Button */ .o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} .o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px} .o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} .o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px} .o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} /* Separator */ .o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} /* Theme */ .o2k7SimpleSkin span.mce_bold {background-position:0 0} .o2k7SimpleSkin span.mce_italic {background-position:-60px 0} .o2k7SimpleSkin span.mce_underline {background-position:-140px 0} .o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0} .o2k7SimpleSkin span.mce_undo {background-position:-160px 0} .o2k7SimpleSkin span.mce_redo {background-position:-100px 0} .o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0} .o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} .o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0} themes/simple/skins/o2k7/img/button_bg.png000066600000011756150472426320014523 0ustar00PNG  IHDR(BOdc pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FPLTEΙ߃ÃÄĄÛ࠼䕯ՠ▯ԸV}⟻ᠼ⠻ܟޠޟݴIMMNNV`defjvߍux|܁܃كڄڄߋߍyyxzلutvu_`hji·͆ψUVWW`Ԙبڪʴɴ٩۶ڵʴɳӵӵڵ8DtRNSS%IDATxloFFQ QDucOUQ8,YD !% {3dAh 䈽!HAHv_JRT xK l{a-p_tOsɷnt.=t:p8sklVg!8H$o‡>uᩛp& FtŮQ G7w%^pD"a!Tdd)B 艵Xl)@߈O2V^Dl"fi!]I$I>!$$9=H4MMASE1=ۈ ) &f) '6֞O Ae>2 }vaaDl#0dfvavefa'b_`=zyfeq_99n^?\2-۷ Ù@0`  Az*4z(PVq\[8. qcnzy#:Fz<ByqMvnkt\wIi$RT."JrTT*ʥ00ˊYQv=QEQE ̉1{(٬bV<Db3'q ʫ} SiRUUUS5U4\GMS5MSUS5MT ?>>>>~gws AdI$IdI%Y2(6y-˒$K,2*o%YMUeY|>䯃èT 0 0N*''jr%咮Wczxxx2;bQ)EQR, "ykop[a+Ol7x@!x x0ه^GǏݫ~^~^]]`n_e۝N/͋ߚM{l^\4q4M4341M4Ml,˲eVjYxjYV˲ XVeYV ky6zQ^z^o4긓95M4zvfy=k{qbTqR1 eJժWKjo18(E({XTpPvR>䷓ l'q $/'y\G><-I^Hn 'pl7Iwnf7d2tBAg(wM`gKIENDB`themes/simple/skins/default/content.css000066600000000750150472426320014274 0ustar00body, td, pre { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; } body { background-color: #FFFFFF; } .mceVisualAid { border: 1px dashed #BBBBBB; } /* MSIE specific */ * html body { 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; } themes/simple/skins/default/ui.css000066600000004031150472426320013233 0ustar00/* Reset */ .defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000} /* Containers */ .defaultSimpleSkin {position:relative} .defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;} .defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;} .defaultSimpleSkin .mceToolbar {height:24px;} /* Layout */ .defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px} .defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} /* Button */ .defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px} .defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} .defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0} .defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} /* Separator */ .defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px} /* Theme */ .defaultSimpleSkin span.mce_bold {background-position:0 0} .defaultSimpleSkin span.mce_italic {background-position:-60px 0} .defaultSimpleSkin span.mce_underline {background-position:-140px 0} .defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0} .defaultSimpleSkin span.mce_undo {background-position:-160px 0} .defaultSimpleSkin span.mce_redo {background-position:-100px 0} .defaultSimpleSkin span.mce_cleanup {background-position:-40px 0} .defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0} .defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0} themes/simple/img/icons.gif000066600000001446150472426320011716 0ustar00GIF89a)৳y4Kc1QXԚ=8)؊xYY]fm񑣹ĸϰQ˴ƴqЍ_oBܱWn9c!),@pH,Ȥrl:Шt XVN$V9H*a'<oTGuurBsE kS#[ Io[""KYKHPB  "BFYX%gJi|JrQ M|Z{Ns‹[I[' &L gr3.m@)hQ$U$K!`zF6%Qͱ#N4"F7&;GCI,ŜQ )H `,J)" 7tVU!#ʝK.R˷߿K2((fյYxFAT#v,h +ɑғ!\e)٘p"3L@fbXɆI(`̉ X[(mY$M~,7 &p|P6 {#advanced_dlg.image_title}
         
        x
        themes/advanced/shortcuts.htm000066600000003225150472426320012361 0ustar00 {#advanced_dlg.accessibility_help}

        {#advanced_dlg.accessibility_usage_title}

        Toolbars

        Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys. Press enter to activate a button and return focus to the editor. Press escape to return focus to the editor without performing any actions.

        Status Bar

        To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path. Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.

        Context Menu

        Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key. To close submenus press the left arrow key. Press escape to close the context menu.

        Keyboard Shortcuts

        Keystroke Function
        Control-BBold
        Control-IItalic
        Control-ZUndo
        Control-YRedo
        themes/advanced/anchor.htm000066600000002165150472426320011577 0ustar00 {#advanced_dlg.anchor_title}
        {#advanced_dlg.anchor_title}
        themes/advanced/about.htm000066600000005131150472426320011433 0ustar00 {#advanced_dlg.about_title}

        {#advanced_dlg.about_title}

        Version: ()

        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 © 2003-2008, Moxiecode Systems AB, All rights reserved.

        For more information about this software visit the TinyMCE website.

        Got Moxie?

        {#advanced_dlg.about_loaded}

         

        themes/advanced/js/source_editor.js000066600000003120150472426320013423 0ustar00tinyMCEPopup.requireLangPack(); tinyMCEPopup.onInit.add(onLoadInit); function saveContent() { tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true}); tinyMCEPopup.close(); } function onLoadInit() { tinyMCEPopup.resizeToInnerSize(); // Remove Gecko spellchecking if (tinymce.isGecko) document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck"); document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true}); if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) { turnWrapOn(); document.getElementById('wraped').checked = true; } resizeInputs(); } function setWrap(val) { var v, n, s = document.getElementById('htmlSource'); s.wrap = val; if (!tinymce.isIE) { v = s.value; n = s.cloneNode(false); n.setAttribute("wrap", val); s.parentNode.replaceChild(n, s); n.value = v; } } function setWhiteSpaceCss(value) { var el = document.getElementById('htmlSource'); tinymce.DOM.setStyle(el, 'white-space', value); } function turnWrapOff() { if (tinymce.isWebKit) { setWhiteSpaceCss('pre'); } else { setWrap('off'); } } function turnWrapOn() { if (tinymce.isWebKit) { setWhiteSpaceCss('pre-wrap'); } else { setWrap('soft'); } } function toggleWordWrap(elm) { if (elm.checked) { turnWrapOn(); } else { turnWrapOff(); } } function resizeInputs() { var vp = tinyMCEPopup.dom.getViewPort(window), el; el = document.getElementById('htmlSource'); if (el) { el.style.width = (vp.w - 20) + 'px'; el.style.height = (vp.h - 65) + 'px'; } } themes/advanced/js/charmap.js000066600000036106150472426320012202 0ustar00/** * charmap.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ tinyMCEPopup.requireLangPack(); var 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'], ['♠', '♠', true, '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'] ]; tinyMCEPopup.onInit.add(function() { tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML()); addKeyboardNavigation(); }); function addKeyboardNavigation(){ var tableElm, cells, settings; cells = tinyMCEPopup.dom.select("a.charmaplink", "charmapgroup"); settings ={ root: "charmapgroup", items: cells }; cells[0].tabindex=0; tinyMCEPopup.dom.addClass(cells[0], "mceFocus"); if (tinymce.isGecko) { cells[0].focus(); } else { setTimeout(function(){ cells[0].focus(); }, 100); } tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom); } function renderCharMapHTML() { var charsPerRow = 20, tdWidth=20, tdHeight=20, i; var html = '
        '+ ''; var cols=-1; for (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 += '
        '; html = html.replace(/<\/tr>/g, ''); return html; } function insertChar(chr) { tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';'); // Refocus in window if (tinyMCEPopup.isWindow) window.focus(); tinyMCEPopup.editor.focus(); tinyMCEPopup.close(); } 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; } themes/advanced/js/color_picker.js000066600000033606150472426320013244 0ustar00tinyMCEPopup.requireLangPack(); var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false; var colors = [ "#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" ]; var named = { '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige', '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown', '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue', '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod', '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green', '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue', '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue', '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green', '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey', '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory', '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue', '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green', '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey', '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon', '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue', '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin', '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid', '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff', '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue', '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver', '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green', '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet', '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green' }; var namedLookup = {}; function init() { var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value; tinyMCEPopup.resizeToInnerSize(); generatePicker(); generateWebColors(); generateNamedColors(); if (inputColor) { changeFinalColor(inputColor); col = convertHexToRGB(inputColor); if (col) updateLight(col.r, col.g, col.b); } for (key in named) { value = named[key]; namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase(); } } function toHexColor(color) { var matches, red, green, blue, toInt = parseInt; function hex(value) { value = parseInt(value).toString(16); return value.length > 1 ? value : '0' + value; // Padd with leading zero }; color = tinymce.trim(color); color = color.replace(/^[#]/, '').toLowerCase(); // remove leading '#' color = namedLookup[color] || color; matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/.exec(color); if (matches) { red = toInt(matches[1]); green = toInt(matches[2]); blue = toInt(matches[3]); } else { matches = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(color); if (matches) { red = toInt(matches[1], 16); green = toInt(matches[2], 16); blue = toInt(matches[3], 16); } else { matches = /^([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(color); if (matches) { red = toInt(matches[1] + matches[1], 16); green = toInt(matches[2] + matches[2], 16); blue = toInt(matches[3] + matches[3], 16); } else { return ''; } } } return '#' + hex(red) + hex(green) + hex(blue); } function insertAction() { var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func'); var hexColor = toHexColor(color); if (hexColor === '') { var text = tinyMCEPopup.editor.getLang('advanced_dlg.invalid_color_value'); tinyMCEPopup.alert(text + ': ' + color); } else { tinyMCEPopup.restoreSelection(); if (f) f(hexColor); tinyMCEPopup.close(); } } function showColor(color, name) { if (name) document.getElementById("colorname").innerHTML = name; document.getElementById("preview").style.backgroundColor = color; document.getElementById("color").value = color.toUpperCase(); } function convertRGBToHex(col) { var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi"); if (!col) return col; 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 {r : r, g : g, b : b}; } return null; } function generatePicker() { var el = document.getElementById('light'), h = '', i; for (i = 0; i < detail; i++){ h += '
        '; } el.innerHTML = h; } function generateWebColors() { var el = document.getElementById('webcolors'), h = '', i; if (el.className == 'generated') return; // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby. h += ''; el.innerHTML = h; el.className = 'generated'; paintCanvas(el); enableKeyboardNavigation(el.firstChild); } function paintCanvas(el) { tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) { var context; if (canvas.getContext && (context = canvas.getContext("2d"))) { context.fillStyle = canvas.getAttribute('data-color'); context.fillRect(0, 0, 10, 10); } }); } function generateNamedColors() { var el = document.getElementById('namedcolors'), h = '', n, v, i = 0; if (el.className == 'generated') return; for (n in named) { v = named[n]; h += ''; if (tinyMCEPopup.editor.forcedHighContrastMode) { h += ''; } h += ''; h += ''; i++; } el.innerHTML = h; el.className = 'generated'; paintCanvas(el); enableKeyboardNavigation(el); } function enableKeyboardNavigation(el) { tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', { root: el, items: tinyMCEPopup.dom.select('a', el) }, tinyMCEPopup.dom); } function dechex(n) { return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16); } function computeColor(e) { var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target); x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0); y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0); partWidth = document.getElementById('colors').width / 6; partDetail = detail / 2; imHeight = document.getElementById('colors').height; r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255; g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth); b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth); coef = (imHeight - y) / imHeight; r = 128 + (r - 128) * coef; g = 128 + (g - 128) * coef; b = 128 + (b - 128) * coef; changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b)); updateLight(r, g, b); } function updateLight(r, g, b) { var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color; for (i=0; i=0) && (i'); }, init : function() { var f = document.forms[0], ed = tinyMCEPopup.editor; // Setup browse button document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image'); if (isVisible('srcbrowser')) document.getElementById('src').style.width = '180px'; e = ed.selection.getNode(); this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList')); if (e.nodeName == 'IMG') { f.src.value = ed.dom.getAttrib(e, 'src'); f.alt.value = ed.dom.getAttrib(e, 'alt'); f.border.value = this.getAttrib(e, 'border'); f.vspace.value = this.getAttrib(e, 'vspace'); f.hspace.value = this.getAttrib(e, 'hspace'); f.width.value = ed.dom.getAttrib(e, 'width'); f.height.value = ed.dom.getAttrib(e, 'height'); f.insert.value = ed.getLang('update'); this.styleVal = ed.dom.getAttrib(e, 'style'); selectByValue(f, 'image_list', f.src.value); selectByValue(f, 'align', this.getAttrib(e, 'align')); this.updateStyle(); } }, fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; l = typeof(l) === 'function' ? l() : window[l]; if (l && l.length > 0) { lst.options[lst.options.length] = new Option('', ''); tinymce.each(l, function(o) { lst.options[lst.options.length] = new Option(o[0], o[1]); }); } else dom.remove(dom.getParent(id, 'tr')); }, update : function() { var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el; tinyMCEPopup.restoreSelection(); if (f.src.value === '') { if (ed.selection.getNode().nodeName == 'IMG') { ed.dom.remove(ed.selection.getNode()); ed.execCommand('mceRepaint'); } tinyMCEPopup.close(); return; } if (!ed.settings.inline_styles) { args = tinymce.extend(args, { vspace : nl.vspace.value, hspace : nl.hspace.value, border : nl.border.value, align : getSelectValue(f, 'align') }); } else args.style = this.styleVal; tinymce.extend(args, { src : f.src.value.replace(/ /g, '%20'), alt : f.alt.value, width : f.width.value, height : f.height.value }); el = ed.selection.getNode(); if (el && el.nodeName == 'IMG') { ed.dom.setAttribs(el, args); tinyMCEPopup.editor.execCommand('mceRepaint'); tinyMCEPopup.editor.focus(); } else { tinymce.each(args, function(value, name) { if (value === "") { delete args[name]; } }); ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1}); ed.undoManager.add(); } tinyMCEPopup.close(); }, updateStyle : function() { var dom = tinyMCEPopup.dom, st = {}, v, f = document.forms[0]; if (tinyMCEPopup.editor.settings.inline_styles) { tinymce.each(tinyMCEPopup.dom.parseStyle(this.styleVal), function(value, key) { st[key] = value; }); // Handle align v = getSelectValue(f, 'align'); if (v) { if (v == 'left' || v == 'right') { st['float'] = v; delete st['vertical-align']; } else { st['vertical-align'] = v; delete st['float']; } } else { delete st['float']; delete st['vertical-align']; } // Handle border v = f.border.value; if (v || v == '0') { if (v == '0') st['border'] = '0'; else st['border'] = v + 'px solid black'; } else delete st['border']; // Handle hspace v = f.hspace.value; if (v) { delete st['margin']; st['margin-left'] = v + 'px'; st['margin-right'] = v + 'px'; } else { delete st['margin-left']; delete st['margin-right']; } // Handle vspace v = f.vspace.value; if (v) { delete st['margin']; st['margin-top'] = v + 'px'; st['margin-bottom'] = v + 'px'; } else { delete st['margin-top']; delete st['margin-bottom']; } // Merge st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img'); this.styleVal = dom.serializeStyle(st, 'img'); } }, getAttrib : function(e, at) { var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2; if (ed.settings.inline_styles) { switch (at) { case 'align': if (v = dom.getStyle(e, 'float')) return v; if (v = dom.getStyle(e, 'vertical-align')) return v; break; case 'hspace': v = dom.getStyle(e, 'margin-left') v2 = dom.getStyle(e, 'margin-right'); if (v && v == v2) return parseInt(v.replace(/[^0-9]/g, '')); break; case 'vspace': v = dom.getStyle(e, 'margin-top') v2 = dom.getStyle(e, 'margin-bottom'); if (v && v == v2) return parseInt(v.replace(/[^0-9]/g, '')); break; case 'border': v = 0; tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) { sv = dom.getStyle(e, 'border-' + sv + '-width'); // False or not the same as prev if (!sv || (sv != v && v !== 0)) { v = 0; return false; } if (sv) v = sv; }); if (v) return parseInt(v.replace(/[^0-9]/g, '')); break; } } if (v = dom.getAttrib(e, at)) return v; return ''; }, resetImageData : function() { var f = document.forms[0]; f.width.value = f.height.value = ""; }, updateImageData : function() { var f = document.forms[0], t = ImageDialog; if (f.width.value == "") f.width.value = t.preloadImg.width; if (f.height.value == "") f.height.value = t.preloadImg.height; }, getImageData : function() { var f = document.forms[0]; this.preloadImg = new Image(); this.preloadImg.onload = this.updateImageData; this.preloadImg.onerror = this.resetImageData; this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value); } }; ImageDialog.preInit(); tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog); themes/advanced/js/anchor.js000066600000002642150472426320012037 0ustar00tinyMCEPopup.requireLangPack(); var AnchorDialog = { init : function(ed) { var action, elm, f = document.forms[0]; this.editor = ed; elm = ed.dom.getParent(ed.selection.getNode(), 'A'); v = ed.dom.getAttrib(elm, 'name') || ed.dom.getAttrib(elm, 'id'); if (v) { this.action = 'update'; f.anchorName.value = v; } f.insert.value = ed.getLang(elm ? 'update' : 'insert'); }, update : function() { var ed = this.editor, elm, name = document.forms[0].anchorName.value, attribName; if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) { tinyMCEPopup.alert('advanced_dlg.anchor_invalid'); return; } tinyMCEPopup.restoreSelection(); if (this.action != 'update') ed.selection.collapse(1); var aRule = ed.schema.getElementRule('a'); if (!aRule || aRule.attributes.name) { attribName = 'name'; } else { attribName = 'id'; } elm = ed.dom.getParent(ed.selection.getNode(), 'A'); if (elm) { elm.setAttribute(attribName, name); elm[attribName] = name; ed.undoManager.add(); } else { // create with zero-sized nbsp so that in Webkit where anchor is on last line by itself caret cannot be placed after it var attrs = {'class' : 'mceItemAnchor'}; attrs[attribName] = name; ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', attrs, '\uFEFF')); ed.nodeChanged(); } tinyMCEPopup.close(); } }; tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog); themes/advanced/js/about.js000066600000004122150472426320011672 0ustar00tinyMCEPopup.requireLangPack(); function init() { var ed, tcont; tinyMCEPopup.resizeToInnerSize(); ed = tinyMCEPopup.editor; // Give FF some time window.setTimeout(insertHelpIFrame, 10); tcont = document.getElementById('plugintablecontainer'); document.getElementById('plugins_tab').style.display = 'none'; var html = ""; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; html += ''; tinymce.each(ed.plugins, function(p, n) { var info; if (!p.getInfo) return; html += ''; info = p.getInfo(); if (info.infourl != null && info.infourl != '') html += ''; else html += ''; if (info.authorurl != null && info.authorurl != '') html += ''; else html += ''; html += ''; html += ''; document.getElementById('plugins_tab').style.display = ''; }); html += ''; html += '
        ' + ed.getLang('advanced_dlg.about_plugin') + '' + ed.getLang('advanced_dlg.about_author') + '' + ed.getLang('advanced_dlg.about_version') + '
        ' + info.longname + '' + info.longname + '' + info.author + '' + info.author + '' + info.version + '
        '; tcont.innerHTML = html; tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion; tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate; } function insertHelpIFrame() { var html; if (tinyMCEPopup.getParam('docs_url')) { html = ''; document.getElementById('iframecontainer').innerHTML = html; document.getElementById('help_tab').style.display = 'block'; document.getElementById('help_tab').setAttribute("aria-hidden", "false"); } } tinyMCEPopup.onInit.add(init); themes/advanced/js/link.js000066600000011264150472426320011522 0ustar00tinyMCEPopup.requireLangPack(); var LinkDialog = { preInit : function() { var url; if (url = tinyMCEPopup.getParam("external_link_list_url")) document.write(''); }, init : function() { var f = document.forms[0], ed = tinyMCEPopup.editor; // Setup browse button document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link'); if (isVisible('hrefbrowser')) document.getElementById('href').style.width = '180px'; this.fillClassList('class_list'); this.fillFileList('link_list', 'tinyMCELinkList'); this.fillTargetList('target_list'); if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) { f.href.value = ed.dom.getAttrib(e, 'href'); f.linktitle.value = ed.dom.getAttrib(e, 'title'); f.insert.value = ed.getLang('update'); selectByValue(f, 'link_list', f.href.value); selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target')); selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class')); } }, update : function() { var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20'); tinyMCEPopup.restoreSelection(); e = ed.dom.getParent(ed.selection.getNode(), 'A'); // Remove element if there is no href if (!f.href.value) { if (e) { b = ed.selection.getBookmark(); ed.dom.remove(e, 1); ed.selection.moveToBookmark(b); tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); return; } } // Create new anchor elements if (e == null) { ed.getDoc().execCommand("unlink", false, null); tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1}); tinymce.each(ed.dom.select("a"), function(n) { if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') { e = n; ed.dom.setAttribs(e, { href : href, title : f.linktitle.value, target : f.target_list ? getSelectValue(f, "target_list") : null, 'class' : f.class_list ? getSelectValue(f, "class_list") : null }); } }); } else { ed.dom.setAttribs(e, { href : href, title : f.linktitle.value }); if (f.target_list) { ed.dom.setAttrib(e, 'target', getSelectValue(f, "target_list")); } if (f.class_list) { ed.dom.setAttrib(e, 'class', getSelectValue(f, "class_list")); } } // Don't move caret if selection was image if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') { ed.focus(); ed.selection.select(e); ed.selection.collapse(0); tinyMCEPopup.storeSelection(); } tinyMCEPopup.execCommand("mceEndUndoLevel"); tinyMCEPopup.close(); }, checkPrefix : function(n) { if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email'))) n.value = 'mailto:' + n.value; if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external'))) n.value = 'http://' + n.value; }, fillFileList : function(id, l) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; l = window[l]; if (l && l.length > 0) { lst.options[lst.options.length] = new Option('', ''); tinymce.each(l, function(o) { lst.options[lst.options.length] = new Option(o[0], o[1]); }); } else dom.remove(dom.getParent(id, 'tr')); }, fillClassList : function(id) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl; if (v = tinyMCEPopup.getParam('theme_advanced_styles')) { cl = []; tinymce.each(v.split(';'), function(v) { var p = v.split('='); cl.push({'title' : p[0], 'class' : p[1]}); }); } else cl = tinyMCEPopup.editor.dom.getClasses(); if (cl.length > 0) { lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); tinymce.each(cl, function(o) { lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']); }); } else dom.remove(dom.getParent(id, 'tr')); }, fillTargetList : function(id) { var dom = tinyMCEPopup.dom, lst = dom.get(id), v; lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), ''); lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self'); lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank'); if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) { tinymce.each(v.split(','), function(v) { v = v.split('='); lst.options[lst.options.length] = new Option(v[0], v[1]); }); } } }; LinkDialog.preInit(); tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog); themes/advanced/color_picker.htm000066600000006257150472426320013006 0ustar00 {#advanced_dlg.colorpicker_title}
        {#advanced_dlg.colorpicker_picker_title}

        {#advanced_dlg.colorpicker_palette_title}

        {#advanced_dlg.colorpicker_named_title}

        {#advanced_dlg.colorpicker_name}
        themes/advanced/source_editor.htm000066600000002311150472426320013164 0ustar00 {#advanced_dlg.code_title}

        themes/advanced/editor_template_src.js000066600000121650150472426320014202 0ustar00/** * editor_template_src.js * * Copyright 2009, Moxiecode Systems AB * Released under LGPL License. * * License: http://tinymce.moxiecode.com/license * Contributing: http://tinymce.moxiecode.com/contributing */ (function(tinymce) { var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode; // Generates a preview for a format function getPreviewCss(ed, fmt) { var previewElm, dom = ed.dom, previewCss = '', parentFontSize, previewStylesName; previewStyles = ed.settings.preview_styles; // No preview forced if (previewStyles === false) return ''; // Default preview if (!previewStyles) previewStyles = 'font-family font-size font-weight text-decoration text-transform color background-color'; // Removes any variables since these can't be previewed function removeVars(val) { return val.replace(/%(\w+)/g, ''); }; // Create block/inline element to use for preview name = fmt.block || fmt.inline || 'span'; previewElm = dom.create(name); // Add format styles to preview element each(fmt.styles, function(value, name) { value = removeVars(value); if (value) dom.setStyle(previewElm, name, value); }); // Add attributes to preview element each(fmt.attributes, function(value, name) { value = removeVars(value); if (value) dom.setAttrib(previewElm, name, value); }); // Add classes to preview element each(fmt.classes, function(value) { value = removeVars(value); if (!dom.hasClass(previewElm, value)) dom.addClass(previewElm, value); }); // Add the previewElm outside the visual area dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF}); ed.getBody().appendChild(previewElm); // Get parent container font size so we can compute px values out of em/% for older IE:s parentFontSize = dom.getStyle(ed.getBody(), 'fontSize', true); parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0; each(previewStyles.split(' '), function(name) { var value = dom.getStyle(previewElm, name, true); // If background is transparent then check if the body has a background color we can use if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) { value = dom.getStyle(ed.getBody(), name, true); // Ignore white since it's the default color, not the nicest fix if (dom.toHex(value).toLowerCase() == '#ffffff') { return; } } // Old IE won't calculate the font size so we need to do that manually if (name == 'font-size') { if (/em|%$/.test(value)) { if (parentFontSize === 0) { return; } // Convert font size from em/% to px value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1); value = (value * parentFontSize) + 'px'; } } previewCss += name + ':' + value + ';'; }); dom.remove(previewElm); return previewCss; }; // Tell it to load theme specific language pack(s) tinymce.ThemeManager.requireLangPack('advanced'); tinymce.create('tinymce.themes.AdvancedTheme', { sizes : [8, 10, 12, 14, 18, 24, 36], // Control name lookup, format: title, command controls : { bold : ['bold_desc', 'Bold'], italic : ['italic_desc', 'Italic'], underline : ['underline_desc', 'Underline'], strikethrough : ['striketrough_desc', 'Strikethrough'], justifyleft : ['justifyleft_desc', 'JustifyLeft'], justifycenter : ['justifycenter_desc', 'JustifyCenter'], justifyright : ['justifyright_desc', 'JustifyRight'], justifyfull : ['justifyfull_desc', 'JustifyFull'], bullist : ['bullist_desc', 'InsertUnorderedList'], numlist : ['numlist_desc', 'InsertOrderedList'], outdent : ['outdent_desc', 'Outdent'], indent : ['indent_desc', 'Indent'], cut : ['cut_desc', 'Cut'], copy : ['copy_desc', 'Copy'], paste : ['paste_desc', 'Paste'], undo : ['undo_desc', 'Undo'], redo : ['redo_desc', 'Redo'], link : ['link_desc', 'mceLink'], unlink : ['unlink_desc', 'unlink'], image : ['image_desc', 'mceImage'], cleanup : ['cleanup_desc', 'mceCleanup'], help : ['help_desc', 'mceHelp'], code : ['code_desc', 'mceCodeEditor'], hr : ['hr_desc', 'InsertHorizontalRule'], removeformat : ['removeformat_desc', 'RemoveFormat'], sub : ['sub_desc', 'subscript'], sup : ['sup_desc', 'superscript'], forecolor : ['forecolor_desc', 'ForeColor'], forecolorpicker : ['forecolor_desc', 'mceForeColor'], backcolor : ['backcolor_desc', 'HiliteColor'], backcolorpicker : ['backcolor_desc', 'mceBackColor'], charmap : ['charmap_desc', 'mceCharMap'], visualaid : ['visualaid_desc', 'mceToggleVisualAid'], anchor : ['anchor_desc', 'mceInsertAnchor'], newdocument : ['newdocument_desc', 'mceNewDocument'], blockquote : ['blockquote_desc', 'mceBlockQuote'] }, stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'], init : function(ed, url) { var t = this, s, v, o; t.editor = ed; t.url = url; t.onResolveName = new tinymce.util.Dispatcher(this); s = ed.settings; ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast(); ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin; // Setup default buttons if (!s.theme_advanced_buttons1) { s = extend({ theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect", theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code", theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap" }, s); } // Default settings t.settings = s = extend({ theme_advanced_path : true, theme_advanced_toolbar_location : 'top', theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6", theme_advanced_toolbar_align : "left", theme_advanced_statusbar_location : "bottom", theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats", theme_advanced_more_colors : 1, theme_advanced_row_height : 23, theme_advanced_resize_horizontal : 1, theme_advanced_resizing_use_cookie : 1, theme_advanced_font_sizes : "1,2,3,4,5,6,7", theme_advanced_font_selector : "span", theme_advanced_show_current_color: 0, readonly : ed.settings.readonly }, s); // Setup default font_size_style_values if (!s.font_size_style_values) s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt"; if (tinymce.is(s.theme_advanced_font_sizes, 'string')) { s.font_size_style_values = tinymce.explode(s.font_size_style_values); s.font_size_classes = tinymce.explode(s.font_size_classes || ''); // Parse string value o = {}; ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes; each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) { var cl; if (k == v && v >= 1 && v <= 7) { k = v + ' (' + t.sizes[v - 1] + 'pt)'; cl = s.font_size_classes[v - 1]; v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt'); } if (/^\s*\./.test(v)) cl = v.replace(/\./g, ''); o[k] = cl ? {'class' : cl} : {fontSize : v}; }); s.theme_advanced_font_sizes = o; } if ((v = s.theme_advanced_path_location) && v != 'none') s.theme_advanced_statusbar_location = s.theme_advanced_path_location; if (s.theme_advanced_statusbar_location == 'none') s.theme_advanced_statusbar_location = 0; if (ed.settings.content_css !== false) ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css")); // Init editor ed.onInit.add(function() { if (!ed.settings.readonly) { ed.onNodeChange.add(t._nodeChanged, t); ed.onKeyUp.add(t._updateUndoStatus, t); ed.onMouseUp.add(t._updateUndoStatus, t); ed.dom.bind(ed.dom.getRoot(), 'dragend', function() { t._updateUndoStatus(ed); }); } }); ed.onSetProgressState.add(function(ed, b, ti) { var co, id = ed.id, tb; if (b) { t.progressTimer = setTimeout(function() { co = ed.getContainer(); co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild); tb = DOM.get(ed.id + '_tbl'); DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}}); DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}}); }, ti || 0); } else { DOM.remove(id + '_blocker'); DOM.remove(id + '_progress'); clearTimeout(t.progressTimer); } }); DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css"); if (s.skin_variant) DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"); }, _isHighContrast : function() { var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'}); actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, ''); DOM.remove(div); return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56'; }, createControl : function(n, cf) { var cd, c; if (c = cf.createControl(n)) return c; switch (n) { case "styleselect": return this._createStyleSelect(); case "formatselect": return this._createBlockFormats(); case "fontselect": return this._createFontSelect(); case "fontsizeselect": return this._createFontSizeSelect(); case "forecolor": return this._createForeColorMenu(); case "backcolor": return this._createBackColorMenu(); } if ((cd = this.controls[n])) return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]}); }, execCommand : function(cmd, ui, val) { var f = this['_' + cmd]; if (f) { f.call(this, ui, val); return true; } return false; }, _importClasses : function(e) { var ed = this.editor, ctrl = ed.controlManager.get('styleselect'); if (ctrl.getLength() == 0) { each(ed.dom.getClasses(), function(o, idx) { var name = 'style_' + idx, fmt; fmt = { inline : 'span', attributes : {'class' : o['class']}, selector : '*' }; ed.formatter.register(name, fmt); ctrl.add(o['class'], name, { style: function() { return getPreviewCss(ed, fmt); } }); }); } }, _createStyleSelect : function(n) { var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl; // Setup style select box ctrl = ctrlMan.createListBox('styleselect', { title : 'advanced.style_select', onselect : function(name) { var matches, formatNames = [], removedFormat; each(ctrl.items, function(item) { formatNames.push(item.value); }); ed.focus(); ed.undoManager.add(); // Toggle off the current format(s) matches = ed.formatter.matchAll(formatNames); tinymce.each(matches, function(match) { if (!name || match == name) { if (match) ed.formatter.remove(match); removedFormat = true; } }); if (!removedFormat) ed.formatter.apply(name); ed.undoManager.add(); ed.nodeChanged(); return false; // No auto select } }); // Handle specified format ed.onPreInit.add(function() { var counter = 0, formats = ed.getParam('style_formats'); if (formats) { each(formats, function(fmt) { var name, keys = 0; each(fmt, function() {keys++;}); if (keys > 1) { name = fmt.name = fmt.name || 'style_' + (counter++); ed.formatter.register(name, fmt); ctrl.add(fmt.title, name, { style: function() { return getPreviewCss(ed, fmt); } }); } else ctrl.add(fmt.title); }); } else { each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) { var name, fmt; if (val) { name = 'style_' + (counter++); fmt = { inline : 'span', classes : val, selector : '*' }; ed.formatter.register(name, fmt); ctrl.add(t.editor.translate(key), name, { style: function() { return getPreviewCss(ed, fmt); } }); } }); } }); // Auto import classes if the ctrl box is empty if (ctrl.getLength() == 0) { ctrl.onPostRender.add(function(ed, n) { if (!ctrl.NativeListBox) { Event.add(n.id + '_text', 'focus', t._importClasses, t); Event.add(n.id + '_text', 'mousedown', t._importClasses, t); Event.add(n.id + '_open', 'focus', t._importClasses, t); Event.add(n.id + '_open', 'mousedown', t._importClasses, t); } else Event.add(n.id, 'focus', t._importClasses, t); }); } return ctrl; }, _createFontSelect : function() { var c, t = this, ed = t.editor; c = ed.controlManager.createListBox('fontselect', { title : 'advanced.fontdefault', onselect : function(v) { var cur = c.items[c.selectedIndex]; if (!v && cur) { ed.execCommand('FontName', false, cur.value); return; } ed.execCommand('FontName', false, v); // Fake selection, execCommand will fire a nodeChange and update the selection c.select(function(sv) { return v == sv; }); if (cur && cur.value == v) { c.select(null); } return false; // No auto select } }); if (c) { each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) { c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''}); }); } return c; }, _createFontSizeSelect : function() { var t = this, ed = t.editor, c, i = 0, cl = []; c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) { var cur = c.items[c.selectedIndex]; if (!v && cur) { cur = cur.value; if (cur['class']) { ed.formatter.toggle('fontsize_class', {value : cur['class']}); ed.undoManager.add(); ed.nodeChanged(); } else { ed.execCommand('FontSize', false, cur.fontSize); } return; } if (v['class']) { ed.focus(); ed.undoManager.add(); ed.formatter.toggle('fontsize_class', {value : v['class']}); ed.undoManager.add(); ed.nodeChanged(); } else ed.execCommand('FontSize', false, v.fontSize); // Fake selection, execCommand will fire a nodeChange and update the selection c.select(function(sv) { return v == sv; }); if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] && cur.value['class'] == v['class'])) { c.select(null); } return false; // No auto select }}); if (c) { each(t.settings.theme_advanced_font_sizes, function(v, k) { var fz = v.fontSize; if (fz >= 1 && fz <= 7) fz = t.sizes[parseInt(fz) - 1] + 'pt'; c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))}); }); } return c; }, _createBlockFormats : function() { var c, fmts = { p : 'advanced.paragraph', address : 'advanced.address', pre : 'advanced.pre', h1 : 'advanced.h1', h2 : 'advanced.h2', h3 : 'advanced.h3', h4 : 'advanced.h4', h5 : 'advanced.h5', h6 : 'advanced.h6', div : 'advanced.div', blockquote : 'advanced.blockquote', code : 'advanced.code', dt : 'advanced.dt', dd : 'advanced.dd', samp : 'advanced.samp' }, t = this; c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) { t.editor.execCommand('FormatBlock', false, v); return false; }}); if (c) { each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) { c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v, style: function() { return getPreviewCss(t.editor, {block: v}); }}); }); } return c; }, _createForeColorMenu : function() { var c, t = this, s = t.settings, o = {}, v; if (s.theme_advanced_more_colors) { o.more_colors_func = function() { t._mceColorPicker(0, { color : c.value, func : function(co) { c.setColor(co); } }); }; } if (v = s.theme_advanced_text_colors) o.colors = v; if (s.theme_advanced_default_foreground_color) o.default_color = s.theme_advanced_default_foreground_color; o.title = 'advanced.forecolor_desc'; o.cmd = 'ForeColor'; o.scope = this; c = t.editor.controlManager.createColorSplitButton('forecolor', o); return c; }, _createBackColorMenu : function() { var c, t = this, s = t.settings, o = {}, v; if (s.theme_advanced_more_colors) { o.more_colors_func = function() { t._mceColorPicker(0, { color : c.value, func : function(co) { c.setColor(co); } }); }; } if (v = s.theme_advanced_background_colors) o.colors = v; if (s.theme_advanced_default_background_color) o.default_color = s.theme_advanced_default_background_color; o.title = 'advanced.backcolor_desc'; o.cmd = 'HiliteColor'; o.scope = this; c = t.editor.controlManager.createColorSplitButton('backcolor', o); return c; }, renderUI : function(o) { var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl; if (ed.settings) { ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut'); } // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for. // Maybe actually inherit it from the original textara? n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '') + (ed.settings.directionality == "rtl" ? ' mceRtl' : '')}); DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label); if (!DOM.boxModel) n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'}); n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0}); n = tb = DOM.add(n, 'tbody'); switch ((s.theme_advanced_layout_manager || '').toLowerCase()) { case "rowlayout": ic = t._rowLayout(s, tb, o); break; case "customlayout": ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p); break; default: ic = t._simpleLayout(s, tb, o, p); } n = o.targetNode; // Add classes to first and last TRs nl = sc.rows; DOM.addClass(nl[0], 'mceFirst'); DOM.addClass(nl[nl.length - 1], 'mceLast'); // Add classes to first and last TDs each(DOM.select('tr', tb), function(n) { DOM.addClass(n.firstChild, 'mceFirst'); DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast'); }); if (DOM.get(s.theme_advanced_toolbar_container)) DOM.get(s.theme_advanced_toolbar_container).appendChild(p); else DOM.insertAfter(p, n); Event.add(ed.id + '_path_row', 'click', function(e) { e = e.target; if (e.nodeName == 'A') { t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1')); return false; } }); /* if (DOM.get(ed.id + '_path_row')) { Event.add(ed.id + '_tbl', 'mouseover', function(e) { var re; e = e.target; if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) { re = DOM.get(ed.id + '_path_row'); t.lastPath = re.innerHTML; DOM.setHTML(re, e.parentNode.title); } }); Event.add(ed.id + '_tbl', 'mouseout', function(e) { if (t.lastPath) { DOM.setHTML(ed.id + '_path_row', t.lastPath); t.lastPath = 0; } }); } */ if (!ed.getParam('accessibility_focus')) Event.add(DOM.add(p, 'a', {href : '#'}, ''), 'focus', function() {tinyMCE.get(ed.id).focus();}); if (s.theme_advanced_toolbar_location == 'external') o.deltaHeight = 0; t.deltaHeight = o.deltaHeight; o.targetNode = null; ed.onKeyDown.add(function(ed, evt) { var DOM_VK_F10 = 121, DOM_VK_F11 = 122; if (evt.altKey) { if (evt.keyCode === DOM_VK_F10) { // Make sure focus is given to toolbar in Safari. // We can't do this in IE as it prevents giving focus to toolbar when editor is in a frame if (tinymce.isWebKit) { window.focus(); } t.toolbarGroup.focus(); return Event.cancel(evt); } else if (evt.keyCode === DOM_VK_F11) { DOM.get(ed.id + '_path_row').focus(); return Event.cancel(evt); } } }); // alt+0 is the UK recommended shortcut for accessing the list of access controls. ed.addShortcut('alt+0', '', 'mceShortcuts', t); return { iframeContainer : ic, editorContainer : ed.id + '_parent', sizeContainer : sc, deltaHeight : o.deltaHeight }; }, getInfo : function() { return { longname : 'Advanced theme', author : 'Moxiecode Systems AB', authorurl : 'http://tinymce.moxiecode.com', version : tinymce.majorVersion + "." + tinymce.minorVersion } }, resizeBy : function(dw, dh) { var e = DOM.get(this.editor.id + '_ifr'); this.resizeTo(e.clientWidth + dw, e.clientHeight + dh); }, resizeTo : function(w, h, store) { var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'); // Boundery fix box w = Math.max(s.theme_advanced_resizing_min_width || 100, w); h = Math.max(s.theme_advanced_resizing_min_height || 100, h); w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w); h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h); // Resize iframe and container DOM.setStyle(e, 'height', ''); DOM.setStyle(ifr, 'height', h); if (s.theme_advanced_resize_horizontal) { DOM.setStyle(e, 'width', ''); DOM.setStyle(ifr, 'width', w); // Make sure that the size is never smaller than the over all ui if (w < e.clientWidth) { w = e.clientWidth; DOM.setStyle(ifr, 'width', e.clientWidth); } } // Store away the size if (store && s.theme_advanced_resizing_use_cookie) { Cookie.setHash("TinyMCE_" + ed.id + "_size", { cw : w, ch : h }); } }, destroy : function() { var id = this.editor.id; Event.clear(id + '_resize'); Event.clear(id + '_path_row'); Event.clear(id + '_external_close'); }, // Internal functions _simpleLayout : function(s, tb, o, p) { var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c; if (s.readonly) { n = DOM.add(tb, 'tr'); n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); return ic; } // Create toolbar container at top if (lo == 'top') t._addToolbars(tb, o); // Create external toolbar if (lo == 'external') { n = c = DOM.create('div', {style : 'position:relative'}); n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'}); DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'}); n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0}); etb = DOM.add(n, 'tbody'); if (p.firstChild.className == 'mceOldBoxModel') p.firstChild.appendChild(c); else p.insertBefore(c, p.firstChild); t._addToolbars(etb, o); ed.onMouseUp.add(function() { var e = DOM.get(ed.id + '_external'); DOM.show(e); DOM.hide(lastExtID); var f = Event.add(ed.id + '_external_close', 'click', function() { DOM.hide(ed.id + '_external'); Event.remove(ed.id + '_external_close', 'click', f); }); DOM.show(e); DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1); // Fixes IE rendering bug DOM.hide(e); DOM.show(e); e.style.filter = ''; lastExtID = ed.id + '_external'; e = null; }); } if (sl == 'top') t._addStatusBar(tb, o); // Create iframe container if (!s.theme_advanced_toolbar_container) { n = DOM.add(tb, 'tr'); n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); } // Create toolbar container at bottom if (lo == 'bottom') t._addToolbars(tb, o); if (sl == 'bottom') t._addStatusBar(tb, o); return ic; }, _rowLayout : function(s, tb, o) { var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a; dc = s.theme_advanced_containers_default_class || ''; da = s.theme_advanced_containers_default_align || 'center'; each(explode(s.theme_advanced_containers || ''), function(c, i) { var v = s['theme_advanced_container_' + c] || ''; switch (c.toLowerCase()) { case 'mceeditor': n = DOM.add(tb, 'tr'); n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'}); break; case 'mceelementpath': t._addStatusBar(tb, o); break; default: a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase(); a = 'mce' + t._ufirst(a); n = DOM.add(DOM.add(tb, 'tr'), 'td', { 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da }); to = cf.createToolbar("toolbar" + i); t._addControls(v, to); DOM.setHTML(n, to.renderHTML()); o.deltaHeight -= s.theme_advanced_row_height; } }); return ic; }, _addControls : function(v, tb) { var t = this, s = t.settings, di, cf = t.editor.controlManager; if (s.theme_advanced_disable && !t._disabled) { di = {}; each(explode(s.theme_advanced_disable), function(v) { di[v] = 1; }); t._disabled = di; } else di = t._disabled; each(explode(v), function(n) { var c; if (di && di[n]) return; // Compatiblity with 2.x if (n == 'tablecontrols') { each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) { n = t.createControl(n, cf); if (n) tb.add(n); }); return; } c = t.createControl(n, cf); if (c) tb.add(c); }); }, _addToolbars : function(c, o) { var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup, toolbarsExist = false; toolbarGroup = cf.createToolbarGroup('toolbargroup', { 'name': ed.getLang('advanced.toolbar'), 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar') }); t.toolbarGroup = toolbarGroup; a = s.theme_advanced_toolbar_align.toLowerCase(); a = 'mce' + t._ufirst(a); n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"presentation"}); // Create toolbar and add the controls for (i=1; (v = s['theme_advanced_buttons' + i]); i++) { toolbarsExist = true; tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i}); if (s['theme_advanced_buttons' + i + '_add']) v += ',' + s['theme_advanced_buttons' + i + '_add']; if (s['theme_advanced_buttons' + i + '_add_before']) v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v; t._addControls(v, tb); toolbarGroup.add(tb); o.deltaHeight -= s.theme_advanced_row_height; } // Handle case when there are no toolbar buttons and ensure editor height is adjusted accordingly if (!toolbarsExist) o.deltaHeight -= s.theme_advanced_row_height; h.push(toolbarGroup.renderHTML()); h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '')); DOM.setHTML(n, h.join('')); }, _addStatusBar : function(tb, o) { var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td; n = DOM.add(tb, 'tr'); n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'}); n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'}); if (s.theme_advanced_path) { DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path')); DOM.add(n, 'span', {}, ': '); } else { DOM.add(n, 'span', {}, ' '); } if (s.theme_advanced_resizing) { DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"}); if (s.theme_advanced_resizing_use_cookie) { ed.onPostRender.add(function() { var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl'); if (!o) return; t.resizeTo(o.cw, o.ch); }); } ed.onPostRender.add(function() { Event.add(ed.id + '_resize', 'click', function(e) { e.preventDefault(); }); Event.add(ed.id + '_resize', 'mousedown', function(e) { var mouseMoveHandler1, mouseMoveHandler2, mouseUpHandler1, mouseUpHandler2, startX, startY, startWidth, startHeight, width, height, ifrElm; function resizeOnMove(e) { e.preventDefault(); width = startWidth + (e.screenX - startX); height = startHeight + (e.screenY - startY); t.resizeTo(width, height); }; function endResize(e) { // Stop listening Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1); Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2); Event.remove(DOM.doc, 'mouseup', mouseUpHandler1); Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2); width = startWidth + (e.screenX - startX); height = startHeight + (e.screenY - startY); t.resizeTo(width, height, true); }; e.preventDefault(); // Get the current rect size startX = e.screenX; startY = e.screenY; ifrElm = DOM.get(t.editor.id + '_ifr'); startWidth = width = ifrElm.clientWidth; startHeight = height = ifrElm.clientHeight; // Register envent handlers mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove); mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove); mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize); mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize); }); }); } o.deltaHeight -= 21; n = tb = null; }, _updateUndoStatus : function(ed) { var cm = ed.controlManager, um = ed.undoManager; cm.setDisabled('undo', !um.hasUndo() && !um.typing); cm.setDisabled('redo', !um.hasRedo()); }, _nodeChanged : function(ed, cm, n, co, ob) { var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches; tinymce.each(t.stateControls, function(c) { cm.setActive(c, ed.queryCommandState(t.controls[c][1])); }); function getParent(name) { var i, parents = ob.parents, func = name; if (typeof(name) == 'string') { func = function(node) { return node.nodeName == name; }; } for (i = 0; i < parents.length; i++) { if (func(parents[i])) return parents[i]; } }; cm.setActive('visualaid', ed.hasVisual); t._updateUndoStatus(ed); cm.setDisabled('outdent', !ed.queryCommandState('Outdent')); p = getParent('A'); if (c = cm.get('link')) { c.setDisabled((!p && co) || (p && !p.href)); c.setActive(!!p && (!p.name && !p.id)); } if (c = cm.get('unlink')) { c.setDisabled(!p && co); c.setActive(!!p && !p.name && !p.id); } if (c = cm.get('anchor')) { c.setActive(!co && !!p && (p.name || (p.id && !p.href))); } p = getParent('IMG'); if (c = cm.get('image')) c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1); if (c = cm.get('styleselect')) { t._importClasses(); formatNames = []; each(c.items, function(item) { formatNames.push(item.value); }); matches = ed.formatter.matchAll(formatNames); c.select(matches[0]); tinymce.each(matches, function(match, index) { if (index > 0) { c.mark(match); } }); } if (c = cm.get('formatselect')) { p = getParent(ed.dom.isBlock); if (p) c.select(p.nodeName.toLowerCase()); } // Find out current fontSize, fontFamily and fontClass getParent(function(n) { if (n.nodeName === 'SPAN') { if (!cl && n.className) cl = n.className; } if (ed.dom.is(n, s.theme_advanced_font_selector)) { if (!fz && n.style.fontSize) fz = n.style.fontSize; if (!fn && n.style.fontFamily) fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase(); if (!fc && n.style.color) fc = n.style.color; if (!bc && n.style.backgroundColor) bc = n.style.backgroundColor; } return false; }); if (c = cm.get('fontselect')) { c.select(function(v) { return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn; }); } // Select font size if (c = cm.get('fontsizeselect')) { // Use computed style if (s.theme_advanced_runtime_fontsize && !fz && !cl) fz = ed.dom.getStyle(n, 'fontSize', true); c.select(function(v) { if (v.fontSize && v.fontSize === fz) return true; if (v['class'] && v['class'] === cl) return true; }); } if (s.theme_advanced_show_current_color) { function updateColor(controlId, color) { if (c = cm.get(controlId)) { if (!color) color = c.settings.default_color; if (color !== c.value) { c.displayColor(color); } } } updateColor('forecolor', fc); updateColor('backcolor', bc); } if (s.theme_advanced_show_current_color) { function updateColor(controlId, color) { if (c = cm.get(controlId)) { if (!color) color = c.settings.default_color; if (color !== c.value) { c.displayColor(color); } } }; updateColor('forecolor', fc); updateColor('backcolor', bc); } if (s.theme_advanced_path && s.theme_advanced_statusbar_location) { p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'}); if (t.statusKeyboardNavigation) { t.statusKeyboardNavigation.destroy(); t.statusKeyboardNavigation = null; } DOM.setHTML(p, ''); getParent(function(n) { var na = n.nodeName.toLowerCase(), u, pi, ti = ''; // Ignore non element and bogus/hidden elements if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')) return; // Handle prefix if (tinymce.isIE && n.scopeName !== 'HTML' && n.scopeName) na = n.scopeName + ':' + na; // Remove internal prefix na = na.replace(/mce\:/g, ''); // Handle node name switch (na) { case 'b': na = 'strong'; break; case 'i': na = 'em'; break; case 'img': if (v = DOM.getAttrib(n, 'src')) ti += 'src: ' + v + ' '; break; case 'a': if (v = DOM.getAttrib(n, 'name')) { ti += 'name: ' + v + ' '; na += '#' + v; } if (v = DOM.getAttrib(n, 'href')) ti += 'href: ' + v + ' '; break; case 'font': if (v = DOM.getAttrib(n, 'face')) ti += 'font: ' + v + ' '; if (v = DOM.getAttrib(n, 'size')) ti += 'size: ' + v + ' '; if (v = DOM.getAttrib(n, 'color')) ti += 'color: ' + v + ' '; break; case 'span': if (v = DOM.getAttrib(n, 'style')) ti += 'style: ' + v + ' '; break; } if (v = DOM.getAttrib(n, 'id')) ti += 'id: ' + v + ' '; if (v = n.className) { v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '') if (v) { ti += 'class: ' + v + ' '; if (ed.dom.isBlock(n) || na == 'img' || na == 'span') na += '.' + v; } } na = na.replace(/(html:)/g, ''); na = {name : na, node : n, title : ti}; t.onResolveName.dispatch(t, na); ti = na.title; na = na.name; //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');"; pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na); if (p.hasChildNodes()) { p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild); p.insertBefore(pi, p.firstChild); } else p.appendChild(pi); }, ed.getBody()); if (DOM.select('a', p).length > 0) { t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({ root: ed.id + "_path_row", items: DOM.select('a', p), excludeFromTabOrder: true, onCancel: function() { ed.focus(); } }, DOM); } } }, // Commands gets called by execCommand _sel : function(v) { this.editor.execCommand('mceSelectNodeDepth', false, v); }, _mceInsertAnchor : function(ui, v) { var ed = this.editor; ed.windowManager.open({ url : this.url + '/anchor.htm', width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)), height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)), inline : true }, { theme_url : this.url }); }, _mceCharMap : function() { var ed = this.editor; ed.windowManager.open({ url : this.url + '/charmap.htm', width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)), height : 265 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)), inline : true }, { theme_url : this.url }); }, _mceHelp : function() { var ed = this.editor; ed.windowManager.open({ url : this.url + '/about.htm', width : 480, height : 380, inline : true }, { theme_url : this.url }); }, _mceShortcuts : function() { var ed = this.editor; ed.windowManager.open({ url: this.url + '/shortcuts.htm', width: 480, height: 380, inline: true }, { theme_url: this.url }); }, _mceColorPicker : function(u, v) { var ed = this.editor; v = v || {}; ed.windowManager.open({ url : this.url + '/color_picker.htm', width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)), height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)), close_previous : false, inline : true }, { input_color : v.color, func : v.func, theme_url : this.url }); }, _mceCodeEditor : function(ui, val) { var ed = this.editor; ed.windowManager.open({ url : this.url + '/source_editor.htm', width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)), height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)), inline : true, resizable : true, maximizable : true }, { theme_url : this.url }); }, _mceImage : function(ui, val) { var ed = this.editor; // Internal image object like a flash placeholder if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1) return; ed.windowManager.open({ url : this.url + '/image.htm', width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)), height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)), inline : true }, { theme_url : this.url }); }, _mceLink : function(ui, val) { var ed = this.editor; ed.windowManager.open({ url : this.url + '/link.htm', width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)), height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)), inline : true }, { theme_url : this.url }); }, _mceNewDocument : function() { var ed = this.editor; ed.windowManager.confirm('advanced.newdocument', function(s) { if (s) ed.execCommand('mceSetContent', false, ''); }); }, _mceForeColor : function() { var t = this; this._mceColorPicker(0, { color: t.fgColor, func : function(co) { t.fgColor = co; t.editor.execCommand('ForeColor', false, co); } }); }, _mceBackColor : function() { var t = this; this._mceColorPicker(0, { color: t.bgColor, func : function(co) { t.bgColor = co; t.editor.execCommand('HiliteColor', false, co); } }); }, _ufirst : function(s) { return s.substring(0, 1).toUpperCase() + s.substring(1); } }); tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme); }(tinymce)); themes/advanced/charmap.htm000066600000004224150472426320011736 0ustar00 {#advanced_dlg.charmap_title}
         
         
         
         
         
        {#advanced_dlg.charmap_usage}
        themes/advanced/langs/ru.js000066600000013776150472426320011715 0ustar00tinyMCE.addI18n('ru.advanced',{ style_select:"\u0421\u0442\u0438\u043B\u0438", font_size:"\u0420\u0430\u0437\u043C\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430", fontdefault:"\u0428\u0440\u0438\u0444\u0442", block:"\u0424\u043E\u0440\u043C\u0430\u0442", paragraph:"\u0410\u0431\u0437\u0430\u0446", div:"Div", address:"\u0421\u0442\u0438\u043B\u044C \u0430\u0434\u0440\u0435\u0441\u0430", pre:"\u041F\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439", h1:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 1", h2:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 2", h3:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 3", h4:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 4", h5:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 5", h6:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A 6", blockquote:"\u0426\u0438\u0442\u0430\u0442\u0430", code:"\u041A\u043E\u0434", samp:"\u041F\u0440\u0438\u043C\u0435\u0440 \u043A\u043E\u0434\u0430", dt:"\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u0442\u0435\u0440\u043C\u0438\u043D", dd:"\u0421\u043F\u0440\u0430\u0432\u043E\u0447\u043D\u0438\u043A \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", bold_desc:"\u0416\u0438\u0440\u043D\u044B\u0439 (Ctrl + B)", italic_desc:"\u041A\u0443\u0440\u0441\u0438\u0432 (Ctrl + I)", underline_desc:"\u041F\u043E\u0434\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439 (Ctrl + U)", striketrough_desc:"\u0417\u0430\u0447\u0435\u0440\u043A\u043D\u0443\u0442\u044B\u0439", justifyleft_desc:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", justifycenter_desc:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443", justifyright_desc:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", justifyfull_desc:"\u041F\u043E \u0448\u0438\u0440\u0438\u043D\u0435", bullist_desc:"\u0421\u043F\u0438\u0441\u043E\u043A", numlist_desc:"\u041D\u0443\u043C\u0435\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A", outdent_desc:"\u0423\u043C\u0435\u043D\u044C\u0448\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F", indent_desc:"\u0423\u0432\u0435\u043B\u0438\u0447\u0438\u0442\u044C \u043E\u0442\u0441\u0442\u0443\u043F", undo_desc:"\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C (Ctrl + Z)", redo_desc:"\u0412\u0435\u0440\u043D\u0443\u0442\u044C (Ctrl + Y)", link_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443", unlink_desc:"\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443", image_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", cleanup_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u043B\u0438\u0448\u043D\u0438\u0439 \u043A\u043E\u0434", code_desc:"\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C HTML \u043A\u043E\u0434", sub_desc:"\u041D\u0438\u0436\u043D\u0438\u0439 \u0438\u043D\u0434\u0435\u043A\u0441", sup_desc:"\u0412\u0435\u0440\u0445\u043D\u0438\u0439 \u0438\u043D\u0434\u0435\u043A\u0441", hr_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0433\u043E\u0440\u0438\u0437\u043E\u043D\u0442\u0430\u043B\u044C\u043D\u044B\u0439 \u0440\u0430\u0437\u0434\u0435\u043B\u0438\u0442\u0435\u043B\u044C", removeformat_desc:"\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u044C \u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435", custom1_desc:"\u0412\u0430\u0448 \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u044B\u0439 \u043E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0437\u0434\u0435\u0441\u044C", forecolor_desc:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0442\u0435\u043A\u0441\u0442\u0430", backcolor_desc:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442 \u0444\u043E\u043D\u0430", charmap_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C \u0441\u0438\u043C\u0432\u043E\u043B", visualaid_desc:"Toggle guidelines / invisible elements", anchor_desc:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044F\u043A\u043E\u0440\u044C", cut_desc:"\u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C", copy_desc:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C", paste_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C", image_props_desc:"\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F", newdocument_desc:"\u041D\u043E\u0432\u044B\u0439 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442", help_desc:"\u041F\u043E\u043C\u043E\u0449\u044C", blockquote_desc:"\u0426\u0438\u0442\u0430\u0442\u0430", clipboard_msg:"\u041A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u0442\u044C / \u0412\u044B\u0440\u0435\u0437\u0430\u0442\u044C / \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044C (\u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0432 Mozilla \u0438 Firefox) \ n \u0412\u0430\u043C \u0438\u043D\u0442\u0435\u0440\u0435\u0441\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E\u0431 \u044D\u0442\u043E\u043C?", path:"\u041F\u0443\u0442\u044C", newdocument:"\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0432\u0441\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C?", toolbar_focus:"\u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u043F\u0430\u043D\u0435\u043B\u044C \u043A\u043D\u043E\u043F\u043E\u043A - Alt + Q, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043A \u0440\u0435\u0434\u0430\u043A\u0442\u043E\u0440\u0443 - Alt-Z, \u041F\u0435\u0440\u0435\u0439\u0442\u0438 \u043D\u0430 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u043F\u0443\u0442\u0438 - Alt-X", more_colors:"\u0411\u043E\u043B\u044C\u0448\u0435 \u0446\u0432\u0435\u0442\u043E\u0432" });themes/advanced/langs/en.js000066600000004445150472426320011662 0ustar00tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition Description",dt:"Definition Term ",samp:"Code Sample",code:"Code",blockquote:"Block Quote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"DIV",paragraph:"Paragraph",block:"Format",fontdefault:"Font Family","font_size":"Font Size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More Colors...","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Block Quote","help_desc":"Help","newdocument_desc":"New Document","image_props_desc":"Image Properties","paste_desc":"Paste (Ctrl+V)","copy_desc":"Copy (Ctrl+C)","cut_desc":"Cut (Ctrl+X)","anchor_desc":"Insert/Edit Anchor","visualaid_desc":"show/Hide Guidelines/Invisible Elements","charmap_desc":"Insert Special Character","backcolor_desc":"Select Background Color","forecolor_desc":"Select Text Color","custom1_desc":"Your Custom Description Here","removeformat_desc":"Remove Formatting","hr_desc":"Insert Horizontal Line","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup Messy Code","image_desc":"Insert/Edit Image","unlink_desc":"Unlink","link_desc":"Insert/Edit Link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Increase Indent","outdent_desc":"Decrease Indent","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","justifyfull_desc":"Align Full","justifyright_desc":"Align Right","justifycenter_desc":"Align Center","justifyleft_desc":"Align Left","striketrough_desc":"Strikethrough","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"});themes/advanced/langs/ru_dlg.js000066600000012020150472426320012520 0ustar00tinyMCE.addI18n('ru.advanced_dlg',{ about_title:"\u041E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0435 TinyMCE", about_general:"\u041E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0435 ...", about_help:"\u041F\u043E\u043C\u043E\u0449\u044C", about_license:"\u041B\u0438\u0446\u0435\u043D\u0437\u0438\u044F", about_plugins:"\u041F\u043B\u0430\u0433\u0438\u043D\u044B", about_plugin:"\u041F\u043B\u0430\u0433\u0438\u043D", about_author:"\u0410\u0432\u0442\u043E\u0440", about_version:"\u0412\u0435\u0440\u0441\u0438\u044F", about_loaded:"\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B", anchor_title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u044F\u043A\u043E\u0440\u044C", anchor_name:"\u0418\u043C\u044F \u044F\u043A\u043E\u0440\u044F", code_title:"\u0420\u0435\u0434\u0430\u043A\u0442\u043E\u0440 HTML \u043A\u043E\u0434\u0430", code_wordwrap:"\u041F\u0435\u0440\u0435\u043D\u043E\u0441\u0438\u0442\u044C \u0441\u043B\u043E\u0432\u0430", colorpicker_title:"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u0446\u0432\u0435\u0442", colorpicker_picker_tab:"\u041F\u0438\u043F\u0435\u0442\u043A\u0430", colorpicker_picker_title:"\u041F\u0438\u043F\u0435\u0442\u043A\u0430 \u0446\u0432\u0435\u0442\u0430", colorpicker_palette_tab:"\u041F\u0430\u043B\u0438\u0442\u0440\u0430", colorpicker_palette_title:"\u041F\u0430\u043B\u0438\u0442\u0440\u0430 \u0446\u0432\u0435\u0442\u043E\u0432", colorpicker_named_tab:"\u041F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E", colorpicker_named_title:"\u041F\u043E \u043D\u0430\u0437\u0432\u0430\u043D\u0438\u044E", colorpicker_color:"\u0426\u0432\u0435\u0442:", colorpicker_name:"\u041D\u0430\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435:", charmap_title:"\u0412\u044B\u0431\u0440\u0430\u0442\u044C \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u044B\u0439 \u0441\u0438\u043C\u0432\u043E\u043B", image_title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0435", image_src:"\u0410\u0434\u0440\u0435\u0441", image_alt:"\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435", image_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439", image_border:"\u0413\u0440\u0430\u043D\u0438\u0446\u0430", image_dimensions:"\u0420\u0430\u0437\u043C\u0435\u0440\u044B", image_vspace:"\u0412\u0435\u0440\u0442. \u043E\u0442\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435", image_hspace:"\u0413\u043E\u0440\u0438\u0437. \u043E\u0442\u0441\u0442\u0443\u043F\u043B\u0435\u043D\u0438\u0435", image_align:"\u0412\u044B\u0440\u0430\u0432\u043D\u0438\u0432\u0430\u043D\u0438\u0435", image_align_baseline:"\u041F\u043E \u0431\u0430\u0437\u043E\u0432\u043E\u0439 \u043B\u0438\u043D\u0438\u0438", image_align_top:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", image_align_middle:"\u041F\u043E \u0446\u0435\u043D\u0442\u0440\u0443", image_align_bottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E", image_align_texttop:"\u041F\u043E \u0432\u0435\u0440\u0445\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430", image_align_textbottom:"\u041F\u043E \u043D\u0438\u0436\u043D\u0435\u043C\u0443 \u043A\u0440\u0430\u044E \u0442\u0435\u043A\u0441\u0442\u0430", image_align_left:"\u041F\u043E \u043B\u0435\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", image_align_right:"\u041F\u043E \u043F\u0440\u0430\u0432\u043E\u043C\u0443 \u043A\u0440\u0430\u044E", link_title:"\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C / \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u0441\u0441\u044B\u043B\u043A\u0443", link_url:"\u0410\u0434\u0440\u0435\u0441 \u0441\u0441\u044B\u043B\u043A\u0438", link_target:"\u041E\u0442\u043A\u0440\u044B\u0442\u044C \u0432 ...", link_target_same:"\u044D\u0442\u043E\u043C \u0436\u0435 \u043E\u043A\u043D\u0435", link_target_blank:"\u043D\u043E\u0432\u043E\u043C \u043E\u043A\u043D\u0435", link_titlefield:"\u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A", link_is_email:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 URL \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 email \u0430\u0434\u0440\u0435\u0441, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 mailto:?", link_is_external:"\u0412\u0432\u0435\u0434\u0435\u043D\u043D\u044B\u0439 URL \u043F\u043E\u0445\u043E\u0436 \u043D\u0430 \u0432\u043D\u0435\u0448\u043D\u044E\u044E \u0441\u0441\u044B\u043B\u043A\u0443, \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0434\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u044B\u0439 \u043F\u0440\u0435\u0444\u0438\u043A\u0441 http://?", link_list:"\u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0441\u044B\u043B\u043E\u043A" });themes/advanced/langs/en_dlg.js000066600000003674150472426330012514 0ustar00tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","invalid_color_value":"Invalid color value","":""}); themes/advanced/link.htm000066600000004646150472426330011271 0ustar00 {#advanced_dlg.link_title}
         
        themes/advanced/skins/highcontrast/content.css000066600000002161150472426330015620 0ustar00body, td, pre { margin:8px;} body.mceForceColors {background:#FFF; color:#000;} h1 {font-size: 2em} h2 {font-size: 1.5em} h3 {font-size: 1.17em} h4 {font-size: 1em} h5 {font-size: .83em} h6 {font-size: .75em} .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} span.mceItemNbsp {background: #DDD} td.mceSelected, th.mceSelected {background-color:#3399ff !important} img {border:0;} table, img, hr, .mceItemAnchor {cursor:default} table td, table th {cursor:text} ins {border-bottom:1px solid green; text-decoration: none; color:green} del {color:red; text-decoration:line-through} cite {border-bottom:1px dashed blue} acronym {border-bottom:1px dotted #CCC; cursor:help} abbr {border-bottom:1px dashed #CCC; cursor:help} img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} *[contentEditable]:focus {outline:0} .mceHideBrInPre pre br {display: none} themes/advanced/skins/highcontrast/ui.css000066600000021114150472426330014562 0ustar00/* Reset */ .highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;} .highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;} .highcontrastSkin table td {vertical-align:middle} .highcontrastSkin .mceIconOnly {display: block !important;} /* External */ .highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;} .highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} .highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;} /* Layout */ .highcontrastSkin table.mceLayout {border: 1px solid;} .highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid} .highcontrastSkin .mceStatusbar a:hover {text-decoration:underline} .highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;} .highcontrastSkin .mceStatusbar div {float:left} .highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0} .highcontrastSkin .mceToolbar td { display: inline-block; float: left;} .highcontrastSkin .mceToolbar tr { display: block;} .highcontrastSkin .mceToolbar table { display: block; } /* Button */ .highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;} .highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em} .highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} .highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;} /* Separator */ .highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;} /* ListBox */ .highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;} .highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;} .highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);} .highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} .highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} .highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;} .highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;} .highcontrastSkin .mceListBoxMenu {overflow-y:auto} /* SplitButton */ .highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} .highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;} .highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;} .highcontrastSkin .mceSplitButton tr { display: table-row; } .highcontrastSkin table.mceSplitButton { display: table; } .highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;} .highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;} .highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; } .highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;} .highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;} /* Menu */ .highcontrastSkin .mceNoIcons span.mceIcon {width:0;} .highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; direction:ltr} .highcontrastSkin .mceMenu table {background:white; color: black} .highcontrastSkin .mceNoIcons a .mceText {padding-left:10px} .highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black} .highcontrastSkin .mceMenu td {height:2em} .highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;} .highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;} .highcontrastSkin .mceMenu pre.mceText {font-family:Monospace} .highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;} .highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px} .highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid} .highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px} .highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";} .highcontrastSkin .mceMenu span.mceMenuLine {display:none} .highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"} .highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal} /* ColorSplitButton */ .highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000} .highcontrastSkin .mceColorSplitMenu td {padding:2px} .highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;} .highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} .highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} .highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2} .highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;} .highcontrastSkin .mceColorPreview {display:none;} .highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden} /* Progress,Resize */ .highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} .highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} /* Rtl */ .mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0} .mceRtl .mceMenuItem .mceText {text-align: right} /* Formats */ .highcontrastSkin .mce_p span.mceText {} .highcontrastSkin .mce_address span.mceText {font-style:italic} .highcontrastSkin .mce_pre span.mceText {font-family:monospace} .highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} .highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} .highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} .highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} .highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} .highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} themes/advanced/skins/highcontrast/dialog.css000066600000011771150472426330015414 0ustar00/* Generic */ body { font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px; background:#F0F0EE; color: black; padding:0; margin:8px 8px 0 8px; } html {background:#F0F0EE; color:#000;} td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} textarea {resize:none;outline:none;} a:link, a:visited {color:black;background-color:transparent;} a:hover {color:#2B6FB6;background-color:transparent;} .nowrap {white-space: nowrap} /* Forms */ fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} legend {color:#2B6FB6; font-weight:bold;} label.msg {display:none;} label.invalid {color:#EE0000; display:inline;background-color:transparent;} input.invalid {border:1px solid #EE0000;background-color:transparent;} input {background:#FFF; border:1px solid #CCC;color:black;} input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} input, select, textarea {border:1px solid #808080;} input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} .input_noborder {border:0;} /* Buttons */ #insert, #cancel, input.button, .updateButton { font-weight:bold; width:94px; height:23px; cursor:pointer; padding-bottom:2px; float:left; } #cancel {float:right} /* Browse */ a.pickcolor, a.browse {text-decoration:none} a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} .mceOldBoxModel a.browse span {width:22px; height:20px;} a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} .mceOldBoxModel a.pickcolor span {width:21px; height:17px;} a.pickcolor:hover span {background-color:#B2BBD0;} a.pickcolor:hover span.disabled {} /* Charmap */ table.charmap {border:1px solid #AAA; text-align:center} td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} #charmap a {display:block; color:#000; text-decoration:none; border:0} #charmap a:hover {background:#CCC;color:#2B6FB6} #charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} #charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} /* Source */ .wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} .mceActionPanel {margin-top:5px;} /* Tabs classes */ .tabs {width:100%; height:18px; line-height:normal;} .tabs ul {margin:0; padding:0; list-style:none;} .tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;} .tabs li.current {font-weight: bold; margin-right:2px;} .tabs span {float:left; display:block; padding:0px 10px 0 0;} .tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} .tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} /* Panels */ .panel_wrapper div.panel {display:none;} .panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} .panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;} /* Columns */ .column {float:left;} .properties {width:100%;} .properties .column1 {} .properties .column2 {text-align:left;} /* Titles */ h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} h3 {font-size:14px;} .title {font-size:12px; font-weight:bold; color:#2B6FB6;} /* Dialog specific */ #link .panel_wrapper, #link div.current {height:125px;} #image .panel_wrapper, #image div.current {height:200px;} #plugintable thead {font-weight:bold; background:#DDD;} #plugintable, #about #plugintable td {border:1px solid #919B9C;} #plugintable {width:96%; margin-top:10px;} #pluginscontainer {height:290px; overflow:auto;} #colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} #colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} #colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} #colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} #colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} #colorpicker #light div {overflow:hidden;} #colorpicker .panel_wrapper div.current {height:175px;} #colorpicker #namedcolors {width:150px;} #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} #colorpicker #colornamecontainer {margin-top:5px;} themes/advanced/skins/o2k7/content.css000066600000004422150472426330013707 0ustar00body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} body {background:#FFF;} body.mceForceColors {background:#FFF; color:#000;} h1 {font-size: 2em} h2 {font-size: 1.5em} h3 {font-size: 1.17em} h4 {font-size: 1em} h5 {font-size: .83em} h6 {font-size: .75em} .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;} span.mceItemNbsp {background: #DDD} td.mceSelected, th.mceSelected {background-color:#3399ff !important} img {border:0;} table, img, hr, .mceItemAnchor {cursor:default} table td, table th {cursor:text} ins {border-bottom:1px solid green; text-decoration: none; color:green} del {color:red; text-decoration:line-through} cite {border-bottom:1px dashed blue} acronym {border-bottom:1px dotted #CCC; cursor:help} abbr {border-bottom:1px dashed #CCC; cursor:help} /* IE */ * html body { scrollbar-3dlight-color:#F0F0EE; scrollbar-arrow-color:#676662; scrollbar-base-color:#F0F0EE; scrollbar-darkshadow-color:#DDD; scrollbar-face-color:#E0E0DD; scrollbar-highlight-color:#F0F0EE; scrollbar-shadow-color:#F0F0EE; scrollbar-track-color:#F5F5F5; } img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} *[contentEditable]:focus {outline:0} .mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} .mceItemShockWave {background-image:url(../../img/shockwave.gif)} .mceItemFlash {background-image:url(../../img/flash.gif)} .mceItemQuickTime {background-image:url(../../img/quicktime.gif)} .mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} .mceItemRealMedia {background-image:url(../../img/realmedia.gif)} .mceItemVideo {background-image:url(../../img/video.gif)} .mceItemAudio {background-image:url(../../img/video.gif)} .mceItemIframe {background-image:url(../../img/iframe.gif)} .mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} .mceHideBrInPre pre br {display: none} themes/advanced/skins/o2k7/ui.css000066600000035517150472426330012663 0ustar00/* Reset */ .o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} .o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} .o2k7Skin table td {vertical-align:middle} /* Containers */ .o2k7Skin table {background:transparent} .o2k7Skin iframe {display:block;} .o2k7Skin .mceToolbar {height:26px} /* External */ .o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none} .o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;} .o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} /* Layout */ .o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD} .o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD} .o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD} .o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0} .o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD} .o2k7Skin td.mceToolbar{background:#E5EFFD} .o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px} .o2k7Skin .mceStatusbar div {float:left; padding:2px} .o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} .o2k7Skin .mceStatusbar a:hover {text-decoration:underline} .o2k7Skin table.mceToolbar {margin-left:3px} .o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;} .o2k7Skin .mceToolbar td.mceFirst span {margin:0} .o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px} .o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none} .o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px} .o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} .o2k7Skin td.mceCenter {text-align:center;} .o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;} .o2k7Skin td.mceRight table {margin:0 0 0 auto;} /* Button */ .o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px} .o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px} .o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px} .o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px} .o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px} .o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} .o2k7Skin .mceButtonLabeled {width:auto} .o2k7Skin .mceButtonLabeled span.mceIcon {float:left} .o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} .o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888} /* Separator */ .o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px} /* ListBox */ .o2k7Skin .mceListBox {padding-left: 3px} .o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block} .o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} .o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0} .o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF} .o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px} .o2k7Skin .mceListBoxDisabled .mceText {color:gray} .o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden; margin-left:3px} .o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px} .o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;} /* SplitButton */ .o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr} .o2k7Skin .mceSplitButton {background:url(img/button_bg.png)} .o2k7Skin .mceSplitButton a.mceAction {width:22px} .o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)} .o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0} .o2k7Skin .mceSplitButton span.mceOpen {display:none} .o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px} .o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px} .o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} .o2k7Skin .mceSplitButtonActive {background-position:0 -44px} /* ColorSplitButton */ .o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} .o2k7Skin .mceColorSplitMenu td {padding:2px} .o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} .o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} .o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} .o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} .o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A} .o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden} .o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden} /* Menu */ .o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD; direction:ltr} .o2k7Skin .mceNoIcons span.mceIcon {width:0;} .o2k7Skin .mceNoIcons a .mceText {padding-left:10px} .o2k7Skin .mceMenu table {background:#FFF} .o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block} .o2k7Skin .mceMenu td {height:20px} .o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0} .o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} .o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px} .o2k7Skin .mceMenu pre.mceText {font-family:Monospace} .o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} .o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3} .o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px} .o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD} .o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} .o2k7Skin .mceMenuItemDisabled .mceText {color:#888} .o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)} .o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center} .o2k7Skin .mceMenu span.mceMenuLine {display:none} .o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;} .o2k7Skin .mceMenuItem td, .o2k7Skin .mceMenuItem th {line-height: normal} /* Progress,Resize */ .o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF} .o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} /* Rtl */ .mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0} .mceRtl .mceMenuItem .mceText {text-align: right} /* Formats */ .o2k7Skin .mce_formatPreview a {font-size:10px} .o2k7Skin .mce_p span.mceText {} .o2k7Skin .mce_address span.mceText {font-style:italic} .o2k7Skin .mce_pre span.mceText {font-family:monospace} .o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} .o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} .o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} .o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} .o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} .o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} /* Theme */ .o2k7Skin span.mce_bold {background-position:0 0} .o2k7Skin span.mce_italic {background-position:-60px 0} .o2k7Skin span.mce_underline {background-position:-140px 0} .o2k7Skin span.mce_strikethrough {background-position:-120px 0} .o2k7Skin span.mce_undo {background-position:-160px 0} .o2k7Skin span.mce_redo {background-position:-100px 0} .o2k7Skin span.mce_cleanup {background-position:-40px 0} .o2k7Skin span.mce_bullist {background-position:-20px 0} .o2k7Skin span.mce_numlist {background-position:-80px 0} .o2k7Skin span.mce_justifyleft {background-position:-460px 0} .o2k7Skin span.mce_justifyright {background-position:-480px 0} .o2k7Skin span.mce_justifycenter {background-position:-420px 0} .o2k7Skin span.mce_justifyfull {background-position:-440px 0} .o2k7Skin span.mce_anchor {background-position:-200px 0} .o2k7Skin span.mce_indent {background-position:-400px 0} .o2k7Skin span.mce_outdent {background-position:-540px 0} .o2k7Skin span.mce_link {background-position:-500px 0} .o2k7Skin span.mce_unlink {background-position:-640px 0} .o2k7Skin span.mce_sub {background-position:-600px 0} .o2k7Skin span.mce_sup {background-position:-620px 0} .o2k7Skin span.mce_removeformat {background-position:-580px 0} .o2k7Skin span.mce_newdocument {background-position:-520px 0} .o2k7Skin span.mce_image {background-position:-380px 0} .o2k7Skin span.mce_help {background-position:-340px 0} .o2k7Skin span.mce_code {background-position:-260px 0} .o2k7Skin span.mce_hr {background-position:-360px 0} .o2k7Skin span.mce_visualaid {background-position:-660px 0} .o2k7Skin span.mce_charmap {background-position:-240px 0} .o2k7Skin span.mce_paste {background-position:-560px 0} .o2k7Skin span.mce_copy {background-position:-700px 0} .o2k7Skin span.mce_cut {background-position:-680px 0} .o2k7Skin span.mce_blockquote {background-position:-220px 0} .o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0} .o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0} .o2k7Skin span.mce_forecolorpicker {background-position:-720px 0} .o2k7Skin span.mce_backcolorpicker {background-position:-760px 0} /* Plugins */ .o2k7Skin span.mce_advhr {background-position:-0px -20px} .o2k7Skin span.mce_ltr {background-position:-20px -20px} .o2k7Skin span.mce_rtl {background-position:-40px -20px} .o2k7Skin span.mce_emotions {background-position:-60px -20px} .o2k7Skin span.mce_fullpage {background-position:-80px -20px} .o2k7Skin span.mce_fullscreen {background-position:-100px -20px} .o2k7Skin span.mce_iespell {background-position:-120px -20px} .o2k7Skin span.mce_insertdate {background-position:-140px -20px} .o2k7Skin span.mce_inserttime {background-position:-160px -20px} .o2k7Skin span.mce_absolute {background-position:-180px -20px} .o2k7Skin span.mce_backward {background-position:-200px -20px} .o2k7Skin span.mce_forward {background-position:-220px -20px} .o2k7Skin span.mce_insert_layer {background-position:-240px -20px} .o2k7Skin span.mce_insertlayer {background-position:-260px -20px} .o2k7Skin span.mce_movebackward {background-position:-280px -20px} .o2k7Skin span.mce_moveforward {background-position:-300px -20px} .o2k7Skin span.mce_media {background-position:-320px -20px} .o2k7Skin span.mce_nonbreaking {background-position:-340px -20px} .o2k7Skin span.mce_pastetext {background-position:-360px -20px} .o2k7Skin span.mce_pasteword {background-position:-380px -20px} .o2k7Skin span.mce_selectall {background-position:-400px -20px} .o2k7Skin span.mce_preview {background-position:-420px -20px} .o2k7Skin span.mce_print {background-position:-440px -20px} .o2k7Skin span.mce_cancel {background-position:-460px -20px} .o2k7Skin span.mce_save {background-position:-480px -20px} .o2k7Skin span.mce_replace {background-position:-500px -20px} .o2k7Skin span.mce_search {background-position:-520px -20px} .o2k7Skin span.mce_styleprops {background-position:-560px -20px} .o2k7Skin span.mce_table {background-position:-580px -20px} .o2k7Skin span.mce_cell_props {background-position:-600px -20px} .o2k7Skin span.mce_delete_table {background-position:-620px -20px} .o2k7Skin span.mce_delete_col {background-position:-640px -20px} .o2k7Skin span.mce_delete_row {background-position:-660px -20px} .o2k7Skin span.mce_col_after {background-position:-680px -20px} .o2k7Skin span.mce_col_before {background-position:-700px -20px} .o2k7Skin span.mce_row_after {background-position:-720px -20px} .o2k7Skin span.mce_row_before {background-position:-740px -20px} .o2k7Skin span.mce_merge_cells {background-position:-760px -20px} .o2k7Skin span.mce_table_props {background-position:-980px -20px} .o2k7Skin span.mce_row_props {background-position:-780px -20px} .o2k7Skin span.mce_split_cells {background-position:-800px -20px} .o2k7Skin span.mce_template {background-position:-820px -20px} .o2k7Skin span.mce_visualchars {background-position:-840px -20px} .o2k7Skin span.mce_abbr {background-position:-860px -20px} .o2k7Skin span.mce_acronym {background-position:-880px -20px} .o2k7Skin span.mce_attribs {background-position:-900px -20px} .o2k7Skin span.mce_cite {background-position:-920px -20px} .o2k7Skin span.mce_del {background-position:-940px -20px} .o2k7Skin span.mce_ins {background-position:-960px -20px} .o2k7Skin span.mce_pagebreak {background-position:0 -40px} .o2k7Skin span.mce_restoredraft {background-position:-20px -40px} .o2k7Skin span.mce_spellchecker {background-position:-540px -20px} .o2k7Skin span.mce_visualblocks {background-position: -40px -40px} themes/advanced/skins/o2k7/ui_black.css000066600000003230150472426330014002 0ustar00/* Black */ .o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)} .o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF} .o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0} .o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0} .o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;} .o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)} .o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1}themes/advanced/skins/o2k7/ui_silver.css000066600000001527150472426330014241 0ustar00/* Silver */ .o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)} .o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee} .o2k7SkinSilver .mceListBox .mceText {background:#FFF} .o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb} themes/advanced/skins/o2k7/dialog.css000066600000013143150472426330013474 0ustar00/* Generic */ body { 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; background:#F0F0EE; padding:0; margin:8px 8px 0 8px; } html {background:#F0F0EE;} td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} textarea {resize:none;outline:none;} a:link, a:visited {color:black;} a:hover {color:#2B6FB6;} .nowrap {white-space: nowrap} /* Forms */ fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} legend {color:#2B6FB6; font-weight:bold;} label.msg {display:none;} label.invalid {color:#EE0000; display:inline;} input.invalid {border:1px solid #EE0000;} input {background:#FFF; border:1px solid #CCC;} input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} input, select, textarea {border:1px solid #808080;} input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} .input_noborder {border:0;} /* Buttons */ #insert, #cancel, input.button, .updateButton { border:0; margin:0; padding:0; font-weight:bold; width:94px; height:26px; background:url(../default/img/buttons.png) 0 -26px; cursor:pointer; padding-bottom:2px; float:left; } #insert {background:url(../default/img/buttons.png) 0 -52px} #cancel {background:url(../default/img/buttons.png) 0 0; float:right} /* Browse */ a.pickcolor, a.browse {text-decoration:none} a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} .mceOldBoxModel a.browse span {width:22px; height:20px;} a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} .mceOldBoxModel a.pickcolor span {width:21px; height:17px;} a.pickcolor:hover span {background-color:#B2BBD0;} a.pickcolor:hover span.disabled {} /* Charmap */ table.charmap {border:1px solid #AAA; text-align:center} td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} #charmap a {display:block; color:#000; text-decoration:none; border:0} #charmap a:hover {background:#CCC;color:#2B6FB6} #charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} #charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} /* Source */ .wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} .mceActionPanel {margin-top:5px;} /* Tabs classes */ .tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;} .tabs ul {margin:0; padding:0; list-style:none;} .tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} .tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} .tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} .tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;} .tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} .tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} /* Panels */ .panel_wrapper div.panel {display:none;} .panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} .panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} /* Columns */ .column {float:left;} .properties {width:100%;} .properties .column1 {} .properties .column2 {text-align:left;} /* Titles */ h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} h3 {font-size:14px;} .title {font-size:12px; font-weight:bold; color:#2B6FB6;} /* Dialog specific */ #link .panel_wrapper, #link div.current {height:125px;} #image .panel_wrapper, #image div.current {height:200px;} #plugintable thead {font-weight:bold; background:#DDD;} #plugintable, #about #plugintable td {border:1px solid #919B9C;} #plugintable {width:96%; margin-top:10px;} #pluginscontainer {height:290px; overflow:auto;} #colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} #colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} #colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} #colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} #colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} #colorpicker #light div {overflow:hidden;} #colorpicker .panel_wrapper div.current {height:175px;} #colorpicker #namedcolors {width:150px;} #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} #colorpicker #colornamecontainer {margin-top:5px;} #colorpicker #picker_panel fieldset {margin:auto;width:325px;} themes/advanced/skins/o2k7/img/button_bg_black.png000066600000001213150472426330016117 0ustar00PNG  IHDRXB pHYs  PLTESSSrv|ĻƻǼȾɿ?MPTW[^beimrv{ǀɄˉ͎uz߄btRNS,ЩWIDATX핱jA   jL&]g/ FTA{X6ZofoO6|)wG/X}Ƈ"qK`^æ)}j6lIՒVA3s}j ѯgT2hr/-@@6ǘGWN-NGmIXu]&ؼ!o`fuTy?nWLz1&ع?Tpu{֘޸7E}{:߼6~5Y3߳ϑѾ{}dkzJ/`W~hA=pHʃ&~[9gR33hχ <kq3"Wu$k363ڠkxG"A%xX_0dh)%%̖7nҿrg>OGtqƚQ:x+<烿`må),N!\#ew|g}o/esF`5Wpf.?~6w!sܝkC횛A//}o~F:pt!XjGD~y@qnG;8ox3 ='] ?NIPנOpZ}&o4sw0%1_(QנSp(e9# Ʒ9D \]O~!Ψ# ^+g Sa1\CͻY+r|(;sZvs~(D?"!xcl~fL9Y`QD99`~}vwrS+ O~zh1iu ؽTyZbpQ׹*>MD0&s7 + 8ݴC0Mวsܴ?-`gmYApS?^vsT1:KzAs5FDM9>-;V~U Z݄rcS΍9qOG)`3-%tۆrEK2SEk1 ^{ܿ_;2_i1̧IENDB`themes/advanced/skins/o2k7/img/button_bg.png000066600000005316150472426330014773 0ustar00PNG  IHDRXBPLTEΙ߃ÃÄĄÛ࠼䕯ՠ▯ԸV}⟻ᠼ⠻ܟޠޟݴIMMNNV`defjvߍux|܁܃كڄڄߋߍyyxzلutvu_`hji·͆ψUVWW`Ԙبڪʴɴ٩۶ڵʴɳӵӵڵ8DtRNSS%}IDATOgyv̬,P kV! z'VLLT\g"3v>|bOŬ\jHk30MWȝ .Vl8 kU|w#L/!5 naԡSNEztPu*!G_;Dau* ϊ Bacpp7E {<-@jТѢ8/!WaYaZ|AV:. R xX8`T@h5ZZ켡T~12wa{M Gc6ÿzG|RQЃ6P` 8Ƕـ`0UуGQ" #T3J@i~u"NQ N7'dl1tkUqtH{o+p๭0Jer<2$sOI̍t$jM͐!u:uV̑\N %]=y*yJ@& ÁF a.De,uXuQR ;!rcaG-GiFkΣx+#'"_]|OԐ흢6zbG䞦@p]uE@3u<*R0ܨ3TTK{Ly<,;{/g"N3|F- 20׫dS%r{9y|zg|5!5/EXumE.9;2_v%YT]kf- T)9;crt#=;Ou]2{)rnR$wyD)'-=$g0 UAڸ@F(cûD8oޒ.YL&HMG8Cfn3PCpf:t@,9!g>& X-V=kd_'*AO@%E?Orߜ9F2^,YO @ x$E.QWBR]%2(c Vb D-=,kRV%(cc@u8:A9* A##nJ  QVD9VW(c1$K/qÀ 8ϑI(c `18g0?ƏIu*QK9 M>+D3n9N3ќlN9RƑ H8Ki>]RJ8jXz%e(c͒ڢ*(Cܡ8Z,CEY"^ Qq'BjڪQq2s8N4uU#8݇ lU0(ॆL Kb c-zUO؟LCDTH9y%l((*sz>.mff~=IENDB`themes/advanced/skins/default/content.css000066600000005044150472426330014552 0ustar00body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;} body {background:#FFF;} body.mceForceColors {background:#FFF; color:#000;} body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;} h1 {font-size: 2em} h2 {font-size: 1.5em} h3 {font-size: 1.17em} h4 {font-size: 1em} h5 {font-size: .83em} h6 {font-size: .75em} .mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;} a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center} span.mceItemNbsp {background: #DDD} td.mceSelected, th.mceSelected {background-color:#3399ff !important} img {border:0;} table, img, hr, .mceItemAnchor {cursor:default} table td, table th {cursor:text} ins {border-bottom:1px solid green; text-decoration: none; color:green} del {color:red; text-decoration:line-through} cite {border-bottom:1px dashed blue} acronym {border-bottom:1px dotted #CCC; cursor:help} abbr {border-bottom:1px dashed #CCC; cursor:help} /* IE */ * html body { scrollbar-3dlight-color:#F0F0EE; scrollbar-arrow-color:#676662; scrollbar-base-color:#F0F0EE; scrollbar-darkshadow-color:#DDD; scrollbar-face-color:#E0E0DD; scrollbar-highlight-color:#F0F0EE; scrollbar-shadow-color:#F0F0EE; scrollbar-track-color:#F5F5F5; } img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px} font[face=mceinline] {font-family:inherit !important} *[contentEditable]:focus {outline:0} .mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc} .mceItemShockWave {background-image:url(../../img/shockwave.gif)} .mceItemFlash {background-image:url(../../img/flash.gif)} .mceItemQuickTime {background-image:url(../../img/quicktime.gif)} .mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)} .mceItemRealMedia {background-image:url(../../img/realmedia.gif)} .mceItemVideo {background-image:url(../../img/video.gif)} .mceItemAudio {background-image:url(../../img/video.gif)} .mceItemEmbeddedAudio {background-image:url(../../img/video.gif)} .mceItemIframe {background-image:url(../../img/iframe.gif)} .mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;} .mceHideBrInPre pre br {display: none} themes/advanced/skins/default/ui.css000066600000036574150472426330013531 0ustar00/* Reset */ .defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left} .defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000} .defaultSkin table td {vertical-align:middle} /* Containers */ .defaultSkin table {direction:ltr;background:transparent} .defaultSkin iframe {display:block;} .defaultSkin .mceToolbar {height:26px} .defaultSkin .mceLeft {text-align:left} .defaultSkin .mceRight {text-align:right} /* External */ .defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;} .defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;} .defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0} /* Layout */ .defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC} .defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC} .defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC} .defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;} .defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top} .defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC} .defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px} .defaultSkin .mceStatusbar div {float:left; margin:2px} .defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0} .defaultSkin .mceStatusbar a:hover {text-decoration:underline} .defaultSkin table.mceToolbar {margin-left:3px} .defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px} .defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px} .defaultSkin td.mceCenter {text-align:center;} .defaultSkin td.mceCenter table {margin:0 auto; text-align:left;} .defaultSkin td.mceRight table {margin:0 0 0 auto;} /* Button */ .defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px} .defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0} .defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0} .defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} .defaultSkin .mceButtonLabeled {width:auto} .defaultSkin .mceButtonLabeled span.mceIcon {float:left} .defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica} .defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888} /* Separator */ .defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px} /* ListBox */ .defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block} .defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden} .defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;} .defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF} .defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0} .defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;} .defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden} .defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px} .defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;} .defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;} /* SplitButton */ .defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr} .defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block} .defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;} .defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);} .defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;} .defaultSkin .mceSplitButton span.mceOpen {display:none} .defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0} .defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;} .defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} .defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0} .defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;} /* ColorSplitButton */ .defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray} .defaultSkin .mceColorSplitMenu td {padding:2px} .defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080} .defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px} .defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF} .defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2} .defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A} .defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a} .defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px} /* Menu */ .defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8; direction:ltr} .defaultSkin .mceNoIcons span.mceIcon {width:0;} .defaultSkin .mceNoIcons a .mceText {padding-left:10px} .defaultSkin .mceMenu table {background:#FFF} .defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block} .defaultSkin .mceMenu td {height:20px} .defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0} .defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block} .defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px} .defaultSkin .mceMenu pre.mceText {font-family:Monospace} .defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;} .defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3} .defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px} .defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD} .defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px} .defaultSkin .mceMenuItemDisabled .mceText {color:#888} .defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)} .defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center} .defaultSkin .mceMenu span.mceMenuLine {display:none} .defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;} .defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal} /* Progress,Resize */ .defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF} .defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px} /* Rtl */ .mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0} .mceRtl .mceMenuItem .mceText {text-align: right} /* Formats */ .defaultSkin .mce_formatPreview a {font-size:10px} .defaultSkin .mce_p span.mceText {} .defaultSkin .mce_address span.mceText {font-style:italic} .defaultSkin .mce_pre span.mceText {font-family:monospace} .defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em} .defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em} .defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em} .defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em} .defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em} .defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em} /* Theme */ .defaultSkin span.mce_bold {background-position:0 0} .defaultSkin span.mce_italic {background-position:-60px 0} .defaultSkin span.mce_underline {background-position:-140px 0} .defaultSkin span.mce_strikethrough {background-position:-120px 0} .defaultSkin span.mce_undo {background-position:-160px 0} .defaultSkin span.mce_redo {background-position:-100px 0} .defaultSkin span.mce_cleanup {background-position:-40px 0} .defaultSkin span.mce_bullist {background-position:-20px 0} .defaultSkin span.mce_numlist {background-position:-80px 0} .defaultSkin span.mce_justifyleft {background-position:-460px 0} .defaultSkin span.mce_justifyright {background-position:-480px 0} .defaultSkin span.mce_justifycenter {background-position:-420px 0} .defaultSkin span.mce_justifyfull {background-position:-440px 0} .defaultSkin span.mce_anchor {background-position:-200px 0} .defaultSkin span.mce_indent {background-position:-400px 0} .defaultSkin span.mce_outdent {background-position:-540px 0} .defaultSkin span.mce_link {background-position:-500px 0} .defaultSkin span.mce_unlink {background-position:-640px 0} .defaultSkin span.mce_sub {background-position:-600px 0} .defaultSkin span.mce_sup {background-position:-620px 0} .defaultSkin span.mce_removeformat {background-position:-580px 0} .defaultSkin span.mce_newdocument {background-position:-520px 0} .defaultSkin span.mce_image {background-position:-380px 0} .defaultSkin span.mce_help {background-position:-340px 0} .defaultSkin span.mce_code {background-position:-260px 0} .defaultSkin span.mce_hr {background-position:-360px 0} .defaultSkin span.mce_visualaid {background-position:-660px 0} .defaultSkin span.mce_charmap {background-position:-240px 0} .defaultSkin span.mce_paste {background-position:-560px 0} .defaultSkin span.mce_copy {background-position:-700px 0} .defaultSkin span.mce_cut {background-position:-680px 0} .defaultSkin span.mce_blockquote {background-position:-220px 0} .defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0} .defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0} .defaultSkin span.mce_forecolorpicker {background-position:-720px 0} .defaultSkin span.mce_backcolorpicker {background-position:-760px 0} /* Plugins */ .defaultSkin span.mce_advhr {background-position:-0px -20px} .defaultSkin span.mce_ltr {background-position:-20px -20px} .defaultSkin span.mce_rtl {background-position:-40px -20px} .defaultSkin span.mce_emotions {background-position:-60px -20px} .defaultSkin span.mce_fullpage {background-position:-80px -20px} .defaultSkin span.mce_fullscreen {background-position:-100px -20px} .defaultSkin span.mce_iespell {background-position:-120px -20px} .defaultSkin span.mce_insertdate {background-position:-140px -20px} .defaultSkin span.mce_inserttime {background-position:-160px -20px} .defaultSkin span.mce_absolute {background-position:-180px -20px} .defaultSkin span.mce_backward {background-position:-200px -20px} .defaultSkin span.mce_forward {background-position:-220px -20px} .defaultSkin span.mce_insert_layer {background-position:-240px -20px} .defaultSkin span.mce_insertlayer {background-position:-260px -20px} .defaultSkin span.mce_movebackward {background-position:-280px -20px} .defaultSkin span.mce_moveforward {background-position:-300px -20px} .defaultSkin span.mce_media {background-position:-320px -20px} .defaultSkin span.mce_nonbreaking {background-position:-340px -20px} .defaultSkin span.mce_pastetext {background-position:-360px -20px} .defaultSkin span.mce_pasteword {background-position:-380px -20px} .defaultSkin span.mce_selectall {background-position:-400px -20px} .defaultSkin span.mce_preview {background-position:-420px -20px} .defaultSkin span.mce_print {background-position:-440px -20px} .defaultSkin span.mce_cancel {background-position:-460px -20px} .defaultSkin span.mce_save {background-position:-480px -20px} .defaultSkin span.mce_replace {background-position:-500px -20px} .defaultSkin span.mce_search {background-position:-520px -20px} .defaultSkin span.mce_styleprops {background-position:-560px -20px} .defaultSkin span.mce_table {background-position:-580px -20px} .defaultSkin span.mce_cell_props {background-position:-600px -20px} .defaultSkin span.mce_delete_table {background-position:-620px -20px} .defaultSkin span.mce_delete_col {background-position:-640px -20px} .defaultSkin span.mce_delete_row {background-position:-660px -20px} .defaultSkin span.mce_col_after {background-position:-680px -20px} .defaultSkin span.mce_col_before {background-position:-700px -20px} .defaultSkin span.mce_row_after {background-position:-720px -20px} .defaultSkin span.mce_row_before {background-position:-740px -20px} .defaultSkin span.mce_merge_cells {background-position:-760px -20px} .defaultSkin span.mce_table_props {background-position:-980px -20px} .defaultSkin span.mce_row_props {background-position:-780px -20px} .defaultSkin span.mce_split_cells {background-position:-800px -20px} .defaultSkin span.mce_template {background-position:-820px -20px} .defaultSkin span.mce_visualchars {background-position:-840px -20px} .defaultSkin span.mce_abbr {background-position:-860px -20px} .defaultSkin span.mce_acronym {background-position:-880px -20px} .defaultSkin span.mce_attribs {background-position:-900px -20px} .defaultSkin span.mce_cite {background-position:-920px -20px} .defaultSkin span.mce_del {background-position:-940px -20px} .defaultSkin span.mce_ins {background-position:-960px -20px} .defaultSkin span.mce_pagebreak {background-position:0 -40px} .defaultSkin span.mce_restoredraft {background-position:-20px -40px} .defaultSkin span.mce_spellchecker {background-position:-540px -20px} .defaultSkin span.mce_visualblocks {background-position: -40px -40px} themes/advanced/skins/default/dialog.css000066600000013013150472426330014332 0ustar00/* Generic */ body { 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; background:#F0F0EE; padding:0; margin:8px 8px 0 8px; } html {background:#F0F0EE;} td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} textarea {resize:none;outline:none;} a:link, a:visited {color:black;} a:hover {color:#2B6FB6;} .nowrap {white-space: nowrap} /* Forms */ fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;} legend {color:#2B6FB6; font-weight:bold;} label.msg {display:none;} label.invalid {color:#EE0000; display:inline;} input.invalid {border:1px solid #EE0000;} input {background:#FFF; border:1px solid #CCC;} input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;} input, select, textarea {border:1px solid #808080;} input.radio {border:1px none #000000; background:transparent; vertical-align:middle;} input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;} .input_noborder {border:0;} /* Buttons */ #insert, #cancel, input.button, .updateButton { border:0; margin:0; padding:0; font-weight:bold; width:94px; height:26px; background:url(img/buttons.png) 0 -26px; cursor:pointer; padding-bottom:2px; float:left; } #insert {background:url(img/buttons.png) 0 -52px} #cancel {background:url(img/buttons.png) 0 0; float:right} /* Browse */ a.pickcolor, a.browse {text-decoration:none} a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;} .mceOldBoxModel a.browse span {width:22px; height:20px;} a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;} a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)} a.browse:hover span.disabled {border:1px solid white; background-color:transparent;} a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;} .mceOldBoxModel a.pickcolor span {width:21px; height:17px;} a.pickcolor:hover span {background-color:#B2BBD0;} a.pickcolor:hover span.disabled {} /* Charmap */ table.charmap {border:1px solid #AAA; text-align:center} td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;} #charmap a {display:block; color:#000; text-decoration:none; border:0} #charmap a:hover {background:#CCC;color:#2B6FB6} #charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center} #charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center} /* Source */ .wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;} .mceActionPanel {margin-top:5px;} /* Tabs classes */ .tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;} .tabs ul {margin:0; padding:0; list-style:none;} .tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;} .tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;} .tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;} .tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;} .tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;} .tabs a:link, .tabs a:visited, .tabs a:hover {color:black;} /* Panels */ .panel_wrapper div.panel {display:none;} .panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;} .panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;} /* Columns */ .column {float:left;} .properties {width:100%;} .properties .column1 {} .properties .column2 {text-align:left;} /* Titles */ h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;} h3 {font-size:14px;} .title {font-size:12px; font-weight:bold; color:#2B6FB6;} /* Dialog specific */ #link .panel_wrapper, #link div.current {height:125px;} #image .panel_wrapper, #image div.current {height:200px;} #plugintable thead {font-weight:bold; background:#DDD;} #plugintable, #about #plugintable td {border:1px solid #919B9C;} #plugintable {width:96%; margin-top:10px;} #pluginscontainer {height:290px; overflow:auto;} #colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px} #colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline} #colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap} #colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;} #colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;} #colorpicker #light div {overflow:hidden;} #colorpicker .panel_wrapper div.current {height:175px;} #colorpicker #namedcolors {width:150px;} #colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;} #colorpicker #colornamecontainer {margin-top:5px;} #colorpicker #picker_panel fieldset {margin:auto;width:325px;} themes/advanced/skins/default/img/buttons.png000066600000006075150472426330015353 0ustar00PNG  IHDR^NQOPLTE! 𴳲[[[^žu\ apī' xxxlllHHH»***kkkܻĽǿ޾444JJJ׷ĻٹyyyzzzKKK߿]]]ȿvvvü^0}#999UUUBBB111KYYYᑢ9```nnnDY>>>rrrMMMӿtttgggċ%%%bq慅쑐1M IDATxڵ_SWor0[3 i 0 f$A8"ʦ -Uu[8֥>mgKJ |sJ?W(..^P W _n LӦ?QxXXx)wT5k֬=T0SKcPJ^Yh3yp "%C_J,`NNNj LXZJlY<Ճjqԡ$w(0QjCpr^v?fTJP@'ի8",QZKIIQCCHڒ,cYCԮSJjuzYR~uD\&\KCv&srh/T](שԚ.3 Nb7RYjen1jlhn6\ǩihpnl`u :͌hC/F3ڠ KW 75560. ̧X #l5.dҤW5M&[{Z\L*M2ԈؐlE{ИQ"[mJ2bTvuu ;`dD4 Gts?qVnf& B Mf5 WG/Mh Hu=M/~!gƍW^piJ}܁}O;/XOQ#rqj8mË9!|}1k^߬7k8޾s*eifsmpp9' w.[^; &O0PQSSLzzRc3Ka)6 bfr` +ZT`&EE+T@/E mUоx&Xe1J딕'bXY,vEekb#B ++ke*+?sU8wEih$:)~/@,YYXLZp9*+&~>hnx''b 3uSN׳(ݴXP|sqf3&KISG=+W/Ds{񱱱q!m8tZ8n{cc86{Ibӿ:9|>e˖*Bibq2 u-><6333nw|R-Yx-0^36#GG:70dyݛGK{L--Үᵻ-P2U$ΤOeBܳܛ>JQd\g{J[8$$k'{=I Ç;r>XQW.}`Qy]z;@q)C`n_MЧi!OG|4GPs02!Yqф??Ws}}?NۏFg'UJ\#dCf!cDfu+7n ?-*Y`b{圪xn;蛞Ue#ŋ Nq?Satr!\{ ʗwyN\_V9n'̷9#^|8]az[]X4똼vYF:΄q+V>Y~ =nueYsl-x3(,l Lm9q&XmgϮgVl[j߾Ukn.-ӆʕRFD1e ,)h2H}9'[6BF_.ۧ43+Sn{Mpfka#wi)>햭|[87=s%w*IjCd*fFTcJ6?.mQXC /B"Ja%?*儏.m⡁.MTקui)ڥY nJV&:8<Tqs 046tH.դo.MҐA0j4.Mz%bBv{NHGJ@=K3 'xXo@q&[O9#hE#`ؖ6lp+NIENDB`themes/advanced/skins/default/img/progress.gif000066600000003373150472426330015500 0ustar00GIF89a 򺺺444ėTTT! NETSCAPE2.0!, I)KͧJJ5URK(&05+/mbp z 1;$1CI* HCh`Ao"3qT5\8aBdwxG=YgwHbvA=0V\\; ;H0t%HsrY™ ,bLv|?4BvʛPu9+& 2x& k& U] vo opraT&!,{ 'e7\l-)S7@&4+`yTSL\:=Jk:;eĈ8cA8Oj@b/+:{ tyt#|- mN qK!,lI+8b̠y h*Zp=3`C`B"pX 9bPB`Z= 8>u,St"ΦOT\um|; 8~*!,xIA]GeAPb)"!s BI М V 5q((X2=,I n#&AVq5t sny\)_g|r5!,gD+8[{`&y_hI)(L "+gN8l5"LA .%@%O@8NgL+Ƀpus/ jȩjVj c7 I!,\0t p hQm6Tqmx( 6'sa@`]-lz0 _g ir!` !,s ءXP\|)pWʄQ稊G.}!*1p v;Tݩ2 X )|f%9`}0PFd~ezGw);themes/advanced/skins/default/img/menu_arrow.gif000066600000000104150472426330015777 0ustar00GIF89a!, zq(׉*;themes/advanced/skins/default/img/items.gif000066600000000100150472426330014736 0ustar00GIF89a !, @Dwڃq|a4b;themes/advanced/skins/default/img/tabs.gif000066600000002452150472426330014562 0ustar00GIF89a,Z62Jb͑󡳻!6,,Z@@CQ(Ȥrl:ШtJZج6[XxL.zn|N(~562*(, H*\ #JHŋ3jȱǏ CI$"HXɲ˗0cʜI͛8sɳ@}GѣH*]ʴӧPJJիXƢ`ÊKóhӶKЀڷpVSܻxk®޿ Lp+^̸d ̘L˘3k̹ϠCMӨOaװc˞M۸sͻ  +_μУKNسkνwVNOӫ_Ͼ˟O3p (h& 6F(a[ue$eevJZ$hb/ Չ,⋞4h8.n:Aԁ ZFn;1P圫杇 un:;R~`:?cB_nG %Cg{3|4[VU[[Y@[% EG:#$I.![A OH08=Z[ ,1Q;[ NL[)9F <[&R Ɩ+<݂BdETKXr ,/*d % \rP ;themes/advanced/img/video.gif000066600000001125150472426330012160 0ustar00GIF89afWWWKKKwww:::eeehhh888nnn|||iii^p,K}?ccc\OEO`جˮ\\\6pbbb---lllzWMMMtttPeibgjBNNNhBBBlm555n%%%y[[[ZQ```Usss mmmLLL̈́999xvvv؄qqq===^^^|owr____ؘHHHVVVrfffcsq䙅AAAtQQQ///VPPP222xzzz!f,f'D;_V9, %Y1X*@EH]3  "&6 [e !IQ# 2 .UJBW47S8˂ GcA=/LM)PZ$-\'R>N(?b@hKxy<б$C"A T` ;themes/advanced/img/quicktime.gif000066600000000455150472426330013052 0ustar00GIF89aM6nX brt |)t7 !,@'Ga1pxLtd iCY(D08)d b2HJd#w |yON*#d x x"Bil-/"hj. #;8 > " R  G+D !;themes/advanced/img/trans.gif000066600000000053150472426330012200 0ustar00GIF89a!,D;themes/advanced/img/icons.gif000066600000027316150472426330012177 0ustar00GIF89a<`n%4O8*opqyn4Kcpz1QﮏХX̣XݹpQQRԚ=8)؊Ssb/i䴕T|ՍxY.-Y]fr[vOmAwl𑣹tlaUOPhĸ5f-M97ϰQϨ˴g急ٺO5`pˑ6MGYur虙Rkƴq*KKzBRc򅊝򨩶suRyMFH|lOf>봱0ChBgd}ΓR{kW@Ks@`A8?g..<QkܱS"X^Sp%cWnNX 9Lp𨸸Jvc"Zڎr̦PUg2Rr6[[Z?ː()'Р9c!,< H*\ȰÇ#JHŋ3jȱǏ CIɓ(}ԨeC0cʜ)ʛ8sɳϟ@ JѣH;x`iӗJJUͤXjpQ.I((ٳhܥKۋ*6ݻx~vu^~ LÈzM3]u؉\*-z(g 0.ti ? ĺHlጐ򉧏%|*s|z > dF萑ą6J{kL8dD.\ {=VѷGhqK. rp Vham. 6f@H A C$aD TleB j<~GV}I 9I 5>jT #dIq1CD, af`fjV"p gDP5Yt?'B!(!ߠUFޑ G]]GFtX %`d;^ڑ38HD(q m4fH뭺jPkFt &aH. @A# 1o enB,l 0A@i3%PG?P L0ލNN5\s^S].jB"D$#rwBPChD?W2{ѳq&D@FfE}E~!&sq.$zԉD G TDjB=#61J*k__$%H-CvI|FXK&bBV/K3I:'@0BGG\8K 7+D5tLP/r}iܕH 6.*T'5C)F(@ 7 I-n@@"' D$(Qq$`p^_! ^Vt/r=MӘב&4A|R!PG'"LPUޔ+V|\ߠ| Yr?1:cI7M?CN.S 2e@}D BRL0A38H!*y.`PC2$v1)y悞-sfvxĢ״EAD 0/X}ַx2Fw %:O tq&.MLSzp@6(n?h8Qr+~T2[i$Eg? -((Dla0B q2 2S dI bM"fE7 1#F&$ 405 W[6E Xv\2UI'ZcփTK8!=[5H0ZiF0ъr 0nKQ%i.Ep7PB.p̲Zfsl!x@J0!, \#8*N:&[@}G ڙM6A҅2b ,gq喅<A"Hs`9W2j]Aq:XxDBV&f,D|?&'fĺ풡e3EEɵa3Zط64aNho,d@>CnKNg4A;dD qB[6fjD\7!T0]\H1TkZú ` R=1$=mBqB46\!EMC"tU Ә(H"$-1q!XWMT4%5v)JiKfz[/{ɴ."]P"1Vm#FOLr?ιdOsdr31d1#r B.ApfXlL)HMxlWe8NzSa^rsVV_ [jS5̎]@ºw_2aE@8Cͺ(ebY͠sA"GdfC"9SH$4H b7JSֈX ]SĦ Vԉ7JJ(]=QIO"$g!լ5rEY]#8 $ q@ AT^3Y?gE{K#tA5.g9OS"FPtZ@t$Fr PVr"d^".ufPh@Pj6yJ 1zL y!kqwNc'waTt93x$ (b |FāGEPzpWPsAG@ 7'8h wW7 qaaL !6${gX6|T0s37drUuV>{ W}AqG+}'Aq+s(gc7|#vG@Bt tQ3]g> uǘ>Y',Udt^cŅlUR(j!hP ).rn $jv@Q<\-Cl1&yEHG͐ f $p S`2b&iXexquA1!`cacsov8W#wMp-%6p ͕SUOX#lc(l1# =7W=wWhwsK\P4xAPkE8sTiH`1C.W]vQ8R{YGų G (XY8S@ 4ё U!i8{qTUӅry&.@qNh>4y&H&f W3U^@٩:Zz:|:Zzګ++Zj Țo`(X]7zκC0P"8W`lmpqml0Dd0 pAЯ:! : GP ; K >*p21۱ pP *aIC.O2;28г0 U0UF{p[0p  SЊԚb O0n]` px{ZP  J06pTWp\ p;S '@P@`@ @d >cpI! ۹+ Z%++ePؓ;`c ˼K;Q{ + 8[`:%r"_"@@{` BPl ` ¬.b  p š@ ;{=[*נ[88*%8P:5 aYpzPZxPVl/Z `@` +l< n0 b7q<q6`nP1 0 rRLȃRLrѷQ`'$7>pW05.>pP RRRP2Ygk"@Y ']+  pO0 Vpl <-`@`@1 ƀE H`4}pÛpZ`]rP>5 pl0vx q 8+aL hl a Nj]"- e œž=^ϐAﲵqUkȭ` P ?mp9m-0Sb(qQ'@v!]lOn@P Mk Թ=;[JP?  < /;P;`6 ]0ί3"^j ϟa 2>;rt&6a_]+AQ L1!R^0 ?t ֽ&.`ow-NP  LpWP |nې0VP[r0`/p ` n H NA 1p#&0:٭ ps0@i9߿OHdx0C< t3PXO2|c^zEV2BEdg /6K#`L_A}!kQ&LpӠƥM&ݸUYvj#M ,$H.hc/RFJ{r#Xc!z Zl*x`a!%N!% tQ ~r HR'OiGN a5Ҏjas(>ܫn ԆR{:Buތ"'Lɑc|WlN?]=OR8RUX 8  `' & 0v!(>5Fh +pE*)$6/sܱG>x 5"#| %|HuǤrˬ$tJA`G 0`Ǖj@ `2h83G xk^hKأx^!6zo "tv`>@j J\9ܠu4 Xa0dڨcX4V $$lAMgOQ OiѢ[8PVK $ZYhFe. &| $H2I"y+C:L$Cxv؃n2x'{'`23^1|-XI}#>jS)eZ҂h &>&C^3"߈&IY$ B_}eUz/{}OGJ-A 46ax T;y/Gg04 (aH3xC B1Q pؔ.dp`jd 0DatAr t0Jկ^TXoA$2BA[xHȭʴc@ (ĺ6. FfND -C'"2 W-`bIiF1vBE\)1EIe*bj2B.^d'vHJRd"IԌd<$@c6gMp(ZdGd87gǃ!QC6 6lh;9v 'VФ@ pZĥ2ԡHy2!mC 4nwpa!(HсqHaG8'8r3Y`9 kHցϩ&T1<ZCU50( E5o2$7ܲyX܄J8`+a a:Ba7N kC%G@V  Le1{ЯelaKFA=8Z~`&(vTNv“JpP e`T( B"fIE#a/8uxjYhF!# A+`!Z䢯`" a5DźF_4^C3adQs(Gp Ex=#-8h`H{.8H"Gz-zZԢ0J)R'.@X%ɕkK\2IL:eSDrLK◴gpMNęf8 G4p[@zD @15ORcèFBFZX$(1hi!V2OtvIxp0Ci0Bq Àf4pIMq't#V Tc3De!CɈL $h? pGՂ d2\ H@C V!h]2?= hO şpFaw82T\^W>xF8Ab[n.@-н@BN06 !`QZ ^. 7U 7OpEhDr ^0ӨBpx$\C ̂@DlDR /pAGkA9)` ?dp(?NlR56Na-ؗ?| d y'?fQiZRZQ>rB}X*Ie1—f#d1 @ b`Np3O5uO /tuj'D9byj Y1i`K KK@@_4MxS#( .H5]^^akhb66?`)hh;1i*UlSnCbp7ۈ+`P`K`H5>F V7!7 ?>09>C*E\#D\7PĊ'9? A,ęD\Fřߑ:9"SSZ`X p./h+YAHX<_􂧋:Dp1'^:Jh˅0ӆ$;+x/+0s`)ʻ" xIWZ@i <.P<%@1 Ppp#3H0xo: K.#1"8ט E#cH {8AHR[A3Ky# ,fϚ JɆ` X;0JHJ (>02#R k ˙I1xbzs?lBӃ73N?:ӿz>4>0C+@M}X r@dw:4dQC p0< 耰y+V0->>'( ;!@hC}݀EP&7xgU ͨ NTP%zP{p5HHBx"`Уm@ Q WXpCfxJd$ҧC>H:l0j܈m ^7h'h@4Xǃp p/+sdGZ0z ,K!%Xٔ׬ՠ`([=dfݿ `a4H\ & ?mʮJ pVr^&\yso?]Y}}0lL;ၚA[,JYm/c\`x<'ciɄ6BhL8h :S`S** > ݂Kd7uՊ [@"[M[7X[&lexeǒ@,[`¥%Z XmBf\!H$ uFhe݈odh؃o]G \ph8(@`-ph|LE $(<(qPHMITK=s6C#(uQCՆ`~cm~1iI#>vc~{8&֊_%0p"~.P^Ra"Fj'aQ>#p&K|?#"#Y>: ;p@TTH, J[KpVu}(&Ug [k֊;h XB(F`N{JP ŐNli$ʙv,ߖI ʣ8قׂPB Wn x8g'o,0MGɨ~n7-)SSjZ@ZHThG]<@䂐 Tf_ 8H0(NM|MM&Ԏʖl %Ȋ Pj^Gfqpq^᪶j>EpJ r&Snr[m)Ͻ!x^,r-r2i L Ӟr~m s9s:7٪9ݨs>7js:J}AVHtE_DU/4ɰk| L LPCuR/uS?R/CuVouWuXuYuZu[u\u]u^u_u`vavb/vc?vdOve_vfovgvhvivjguvljvnvovpwq#3XxW7wxwywzw{@s?_xHB@Y͙Xͅ h7Xwwxxx7}to$h+WxG"xyyzG_xwpB|x7"7ȃ@ZyXC_zozzwrxt$|x$x(/z/z?{O{_p{{w{`BHx1_Wy4e{/|?|_$BHKN+D$|>؆}}/}^YG}_g}?$XU݇!{?W)SI?~O~_~X/`UG Y`:"w":">t~?~/]fTKO0[;,h „ 2l!Ĉ'Rh"6rرA3bR .h{#Μ:w'РB-j(ҤJ2miSPjMb4i)YX|ax-ܸrҭk.޼z틴T{< [e\4h3ТG.m4jƗ RPh\|k8B͎ʗ3o9ҧjabp5 ǏoA8Qo=ӯV_g 8 x zV* J8!Zx!j!;themes/advanced/img/colorpicker.jpg000066600000005030150472426330013400 0ustar00JFIF>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality C    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222,"1A!"2!" ?4xzu!^Y:5xo(D\;>5ӭF"3F_fX(˦>ZY9(r֮JFDw&m_YcƟD343^*晚FiE1/}K_oC~?G+?]#}7‡\y8Ly3۳OnO=cg?L#2Ŗ(ǖ8\SGlq=\Qq-kZ+PByL2lNZiv,yBYǞO=:| Nu<}9^?O+DWקu85h΍4e4`IYy)rQVJEy2g 4ХǟD34G)ddc'b/93Ng>\ 9^Dyۯ=|ٮ6:N?dq峟>ɌuC Wcv>\p8]hW?M+B %䰥bu : 䚫]X ^5pON?ztx~E[Yp_NgG-E;Qྜྷ. zr/G^uF]1Cay? W&)ۢb'rSYD 9'Wr\pEUr)qѓ)2S92sm2g8ǧ;sCLdsno_>}oǖ8V2ьqqƜBqqU?C x9KaG!+av`,$+`,6XKYzt8XwM$W]q7HZ:<5ק3h,՛F+0/ut7[ 6BYNg0(E_b(gmGeJ9MFn9JRftLy9fc ci掗,`Rs9V2͒Z1Fuc|XFBV6‡b1 =׃lv, {0b 64V*tmUuf(8hٳq6qPzHJ7qV-9u@~u.iPw7G`YF麤귘k"RQ9HG%)LE r(3ȣӻ#f鏕ntyc,o|fv0\/iyȵ~ 2Ac'b9;1X!Ƭg 33 wh,.՛+`,6YubFXt^V?5qƮ6Yqз zQqAnf]~3PZjTV4@ꕪ=RZ@(oJ?4QE)rQp3y)GC$ǦnFNF 63rAQaɇ%-r!_g'f+979Q~e s;΃35A~`l2Fl]a~=bh؍'3v? ?=H-ѫd?aP lu h?LzjhZh% _mA*T")K}vV/tT2Lz'l?dDDIqqpaQ&Mf[+&Yə2d; L3!(.(,t*, X[4V`K,]ΕKE ʭU٤̲rcT?44铃f*‚ڲ D6u%Z2pkiy93Wu["z'F5Tm2'PFB6fC2vfҁ;7 QD$Hto6J}+4}ҺJt> H@( UGC%2iGt_WO;Uhһw͢U]Q;_a;YIO_a;]#vha]'TUUeE `l]Yu"nU2uʿ˿e2)W}&]'N}TT}/~t>ҍt>>]DDXE'DӴG:8O'D'i#:9:'H:D;DCڑ'DWHވ(:ND퐝/D;'dDG 'I"N"themes/advanced/img/windowsmedia.gif000066600000000637150472426330013553 0ustar00GIF89a?uS-ѩaY0@G愅p+fҎG,LWKqxwwV&^qKNCiiimKx+tnV^K~3fp!BWuWr(a;vTHo9!?," %lhhD 4],G:jͤ\fఄTs5 !*$/  ;-!&1/<'9;=7+; :78(3.2 "+%?>))'=., ? ., B 2%3cB(  ~;themes/advanced/img/realmedia.gif000066600000000667150472426330013007 0ustar00GIF89a%RPM@kű@=;.+)c5xHVusq}$pX Jfff!,%' * G4ac eg7j#BG&-ier]0H =G48}x;themes/advanced/editor_template.js000066600000064132150472426330013335 0ustar00(function(h){var i=h.DOM,g=h.dom.Event,c=h.extend,f=h.each,a=h.util.Cookie,e,d=h.explode;function b(m,k){var q,p=m.dom,n="",o,l;previewStyles=m.settings.preview_styles;if(previewStyles===false){return""}if(!previewStyles){previewStyles="font-family font-size font-weight text-decoration text-transform color background-color"}function j(r){return r.replace(/%(\w+)/g,"")}name=k.block||k.inline||"span";q=p.create(name);f(k.styles,function(s,r){s=j(s);if(s){p.setStyle(q,r,s)}});f(k.attributes,function(s,r){s=j(s);if(s){p.setAttrib(q,r,s)}});f(k.classes,function(r){r=j(r);if(!p.hasClass(q,r)){p.addClass(q,r)}});p.setStyles(q,{position:"absolute",left:-65535});m.getBody().appendChild(q);o=p.getStyle(m.getBody(),"fontSize",true);o=/px$/.test(o)?parseInt(o,10):0;f(previewStyles.split(" "),function(r){var s=p.getStyle(q,r,true);if(r=="background-color"&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(s)){s=p.getStyle(m.getBody(),r,true);if(p.toHex(s).toLowerCase()=="#ffffff"){return}}if(r=="font-size"){if(/em|%$/.test(s)){if(o===0){return}s=parseFloat(s,10)/(/%$/.test(s)?100:1);s=(s*o)+"px"}}n+=r+":"+s+";"});p.remove(q);return n}h.ThemeManager.requireLangPack("advanced");h.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(k,l){var m=this,n,j,p;m.editor=k;m.url=l;m.onResolveName=new h.util.Dispatcher(this);n=k.settings;k.forcedHighContrastMode=k.settings.detect_highcontrast&&m._isHighContrast();k.settings.skin=k.forcedHighContrastMode?"highcontrast":k.settings.skin;if(!n.theme_advanced_buttons1){n=c({theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap"},n)}m.settings=n=c({theme_advanced_path:true,theme_advanced_toolbar_location:"top",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"left",theme_advanced_statusbar_location:"bottom",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:k.settings.readonly},n);if(!n.font_size_style_values){n.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(h.is(n.theme_advanced_font_sizes,"string")){n.font_size_style_values=h.explode(n.font_size_style_values);n.font_size_classes=h.explode(n.font_size_classes||"");p={};k.settings.theme_advanced_font_sizes=n.theme_advanced_font_sizes;f(k.getParam("theme_advanced_font_sizes","","hash"),function(r,q){var o;if(q==r&&r>=1&&r<=7){q=r+" ("+m.sizes[r-1]+"pt)";o=n.font_size_classes[r-1];r=n.font_size_style_values[r-1]||(m.sizes[r-1]+"pt")}if(/^\s*\./.test(r)){o=r.replace(/\./g,"")}p[q]=o?{"class":o}:{fontSize:r}});n.theme_advanced_font_sizes=p}if((j=n.theme_advanced_path_location)&&j!="none"){n.theme_advanced_statusbar_location=n.theme_advanced_path_location}if(n.theme_advanced_statusbar_location=="none"){n.theme_advanced_statusbar_location=0}if(k.settings.content_css!==false){k.contentCSS.push(k.baseURI.toAbsolute(l+"/skins/"+k.settings.skin+"/content.css"))}k.onInit.add(function(){if(!k.settings.readonly){k.onNodeChange.add(m._nodeChanged,m);k.onKeyUp.add(m._updateUndoStatus,m);k.onMouseUp.add(m._updateUndoStatus,m);k.dom.bind(k.dom.getRoot(),"dragend",function(){m._updateUndoStatus(k)})}});k.onSetProgressState.add(function(r,o,s){var t,u=r.id,q;if(o){m.progressTimer=setTimeout(function(){t=r.getContainer();t=t.insertBefore(i.create("DIV",{style:"position:relative"}),t.firstChild);q=i.get(r.id+"_tbl");i.add(t,"div",{id:u+"_blocker","class":"mceBlocker",style:{width:q.clientWidth+2,height:q.clientHeight+2}});i.add(t,"div",{id:u+"_progress","class":"mceProgress",style:{left:q.clientWidth/2,top:q.clientHeight/2}})},s||0)}else{i.remove(u+"_blocker");i.remove(u+"_progress");clearTimeout(m.progressTimer)}});i.loadCSS(n.editor_css?k.documentBaseURI.toAbsolute(n.editor_css):l+"/skins/"+k.settings.skin+"/ui.css");if(n.skin_variant){i.loadCSS(l+"/skins/"+k.settings.skin+"/ui_"+n.skin_variant+".css")}},_isHighContrast:function(){var j,k=i.add(i.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});j=(i.getStyle(k,"background-color",true)+"").toLowerCase().replace(/ /g,"");i.remove(k);return j!="rgb(171,239,86)"&&j!="#abef56"},createControl:function(m,j){var k,l;if(l=j.createControl(m)){return l}switch(m){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((k=this.controls[m])){return j.createButton(m,{title:"advanced."+k[0],cmd:k[1],ui:k[2],value:k[3]})}},execCommand:function(l,k,m){var j=this["_"+l];if(j){j.call(this,k,m);return true}return false},_importClasses:function(l){var j=this.editor,k=j.controlManager.get("styleselect");if(k.getLength()==0){f(j.dom.getClasses(),function(q,m){var p="style_"+m,n;n={inline:"span",attributes:{"class":q["class"]},selector:"*"};j.formatter.register(p,n);k.add(q["class"],p,{style:function(){return b(j,n)}})})}},_createStyleSelect:function(o){var l=this,j=l.editor,k=j.controlManager,m;m=k.createListBox("styleselect",{title:"advanced.style_select",onselect:function(q){var r,n=[],p;f(m.items,function(s){n.push(s.value)});j.focus();j.undoManager.add();r=j.formatter.matchAll(n);h.each(r,function(s){if(!q||s==q){if(s){j.formatter.remove(s)}p=true}});if(!p){j.formatter.apply(q)}j.undoManager.add();j.nodeChanged();return false}});j.onPreInit.add(function(){var p=0,n=j.getParam("style_formats");if(n){f(n,function(q){var r,s=0;f(q,function(){s++});if(s>1){r=q.name=q.name||"style_"+(p++);j.formatter.register(r,q);m.add(q.title,r,{style:function(){return b(j,q)}})}else{m.add(q.title)}})}else{f(j.getParam("theme_advanced_styles","","hash"),function(t,s){var r,q;if(t){r="style_"+(p++);q={inline:"span",classes:t,selector:"*"};j.formatter.register(r,q);m.add(l.editor.translate(s),r,{style:function(){return b(j,q)}})}})}});if(m.getLength()==0){m.onPostRender.add(function(p,q){if(!m.NativeListBox){g.add(q.id+"_text","focus",l._importClasses,l);g.add(q.id+"_text","mousedown",l._importClasses,l);g.add(q.id+"_open","focus",l._importClasses,l);g.add(q.id+"_open","mousedown",l._importClasses,l)}else{g.add(q.id,"focus",l._importClasses,l)}})}return m},_createFontSelect:function(){var l,k=this,j=k.editor;l=j.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(m){var n=l.items[l.selectedIndex];if(!m&&n){j.execCommand("FontName",false,n.value);return}j.execCommand("FontName",false,m);l.select(function(o){return m==o});if(n&&n.value==m){l.select(null)}return false}});if(l){f(j.getParam("theme_advanced_fonts",k.settings.theme_advanced_fonts,"hash"),function(n,m){l.add(j.translate(m),n,{style:n.indexOf("dings")==-1?"font-family:"+n:""})})}return l},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(o){var p=n.items[n.selectedIndex];if(!o&&p){p=p.value;if(p["class"]){k.formatter.toggle("fontsize_class",{value:p["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,p.fontSize)}return}if(o["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}n.select(function(q){return o==q});if(p&&(p.value.fontSize==o.fontSize||p.value["class"]&&p.value["class"]==o["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(p,o){var q=p.fontSize;if(q>=1&&q<=7){q=m.sizes[parseInt(q)-1]+"pt"}n.add(o,p,{style:"font-size:"+q,"class":"mceFontSize"+(l++)+(" "+(p["class"]||""))})})}return n},_createBlockFormats:function(){var l,j={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},k=this;l=k.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(m){k.editor.execCommand("FormatBlock",false,m);return false}});if(l){f(k.editor.getParam("theme_advanced_blockformats",k.settings.theme_advanced_blockformats,"hash"),function(n,m){l.add(k.editor.translate(m!=n?m:j[n]),n,{"class":"mce_formatPreview mce_"+n,style:function(){return b(k.editor,{block:n})}})})}return l},_createForeColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_text_colors){m.colors=j}if(l.theme_advanced_default_foreground_color){m.default_color=l.theme_advanced_default_foreground_color}m.title="advanced.forecolor_desc";m.cmd="ForeColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("forecolor",m);return n},_createBackColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_background_colors){m.colors=j}if(l.theme_advanced_default_background_color){m.default_color=l.theme_advanced_default_background_color}m.title="advanced.backcolor_desc";m.cmd="HiliteColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("backcolor",m);return n},renderUI:function(l){var q,m,r,w=this,u=w.editor,x=w.settings,v,k,j;if(u.settings){u.settings.aria_label=x.aria_label+u.getLang("advanced.help_shortcut")}q=k=i.create("span",{role:"application","aria-labelledby":u.id+"_voice",id:u.id+"_parent","class":"mceEditor "+u.settings.skin+"Skin"+(x.skin_variant?" "+u.settings.skin+"Skin"+w._ufirst(x.skin_variant):"")+(u.settings.directionality=="rtl"?" mceRtl":"")});i.add(q,"span",{"class":"mceVoiceLabel",style:"display:none;",id:u.id+"_voice"},x.aria_label);if(!i.boxModel){q=i.add(q,"div",{"class":"mceOldBoxModel"})}q=v=i.add(q,"table",{role:"presentation",id:u.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});q=r=i.add(q,"tbody");switch((x.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":m=w._rowLayout(x,r,l);break;case"customlayout":m=u.execCallback("theme_advanced_custom_layout",x,r,l,k);break;default:m=w._simpleLayout(x,r,l,k)}q=l.targetNode;j=v.rows;i.addClass(j[0],"mceFirst");i.addClass(j[j.length-1],"mceLast");f(i.select("tr",r),function(o){i.addClass(o.firstChild,"mceFirst");i.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(i.get(x.theme_advanced_toolbar_container)){i.get(x.theme_advanced_toolbar_container).appendChild(k)}else{i.insertAfter(k,q)}g.add(u.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){w._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return false}});if(!u.getParam("accessibility_focus")){g.add(i.add(k,"a",{href:"#"},""),"focus",function(){tinyMCE.get(u.id).focus()})}if(x.theme_advanced_toolbar_location=="external"){l.deltaHeight=0}w.deltaHeight=l.deltaHeight;l.targetNode=null;u.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){if(h.isWebKit){window.focus()}w.toolbarGroup.focus();return g.cancel(n)}else{if(n.keyCode===o){i.get(p.id+"_path_row").focus();return g.cancel(n)}}}});u.addShortcut("alt+0","","mceShortcuts",w);return{iframeContainer:m,editorContainer:u.id+"_parent",sizeContainer:v,deltaHeight:l.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:h.majorVersion+"."+h.minorVersion}},resizeBy:function(j,k){var l=i.get(this.editor.id+"_ifr");this.resizeTo(l.clientWidth+j,l.clientHeight+k)},resizeTo:function(j,n,l){var k=this.editor,m=this.settings,o=i.get(k.id+"_tbl"),p=i.get(k.id+"_ifr");j=Math.max(m.theme_advanced_resizing_min_width||100,j);n=Math.max(m.theme_advanced_resizing_min_height||100,n);j=Math.min(m.theme_advanced_resizing_max_width||65535,j);n=Math.min(m.theme_advanced_resizing_max_height||65535,n);i.setStyle(o,"height","");i.setStyle(p,"height",n);if(m.theme_advanced_resize_horizontal){i.setStyle(o,"width","");i.setStyle(p,"width",j);if(j"));i.setHTML(l,r.join(""))},_addStatusBar:function(p,k){var l,w=this,q=w.editor,x=w.settings,j,u,v,m;l=i.add(p,"tr");l=m=i.add(l,"td",{"class":"mceStatusbar"});l=i.add(l,"div",{id:q.id+"_path_row",role:"group","aria-labelledby":q.id+"_path_voice"});if(x.theme_advanced_path){i.add(l,"span",{id:q.id+"_path_voice"},q.translate("advanced.path"));i.add(l,"span",{},": ")}else{i.add(l,"span",{}," ")}if(x.theme_advanced_resizing){i.add(m,"a",{id:q.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize",tabIndex:"-1"});if(x.theme_advanced_resizing_use_cookie){q.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+q.id+"_size"),r=i.get(q.id+"_tbl");if(!n){return}w.resizeTo(n.cw,n.ch)})}q.onPostRender.add(function(){g.add(q.id+"_resize","click",function(n){n.preventDefault()});g.add(q.id+"_resize","mousedown",function(E){var t,r,s,o,D,A,B,G,n,F,y;function z(H){H.preventDefault();n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F)}function C(H){g.remove(i.doc,"mousemove",t);g.remove(q.getDoc(),"mousemove",r);g.remove(i.doc,"mouseup",s);g.remove(q.getDoc(),"mouseup",o);n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F,true)}E.preventDefault();D=E.screenX;A=E.screenY;y=i.get(w.editor.id+"_ifr");B=n=y.clientWidth;G=F=y.clientHeight;t=g.add(i.doc,"mousemove",z);r=g.add(q.getDoc(),"mousemove",z);s=g.add(i.doc,"mouseup",C);o=g.add(q.getDoc(),"mouseup",C)})})}k.deltaHeight-=21;l=p=null},_updateUndoStatus:function(k){var j=k.controlManager,l=k.undoManager;j.setDisabled("undo",!l.hasUndo()&&!l.typing);j.setDisabled("redo",!l.hasRedo())},_nodeChanged:function(o,u,E,r,F){var z=this,D,G=0,y,H,A=z.settings,x,l,w,C,m,k,j;h.each(z.stateControls,function(n){u.setActive(n,o.queryCommandState(z.controls[n][1]))});function q(p){var s,n=F.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){H.mark(p)}})}if(H=u.get("formatselect")){D=q(o.dom.isBlock);if(D){H.select(D.nodeName.toLowerCase())}}q(function(p){if(p.nodeName==="SPAN"){if(!x&&p.className){x=p.className}}if(o.dom.is(p,A.theme_advanced_font_selector)){if(!l&&p.style.fontSize){l=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!C&&p.style.color){C=p.style.color}if(!m&&p.style.backgroundColor){m=p.style.backgroundColor}}return false});if(H=u.get("fontselect")){H.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(H=u.get("fontsizeselect")){if(A.theme_advanced_runtime_fontsize&&!l&&!x){l=o.dom.getStyle(E,"fontSize",true)}H.select(function(n){if(n.fontSize&&n.fontSize===l){return true}if(n["class"]&&n["class"]===x){return true}})}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_path&&A.theme_advanced_statusbar_location){D=i.get(o.id+"_path")||i.add(o.id+"_path_row","span",{id:o.id+"_path"});if(z.statusKeyboardNavigation){z.statusKeyboardNavigation.destroy();z.statusKeyboardNavigation=null}i.setHTML(D,"");q(function(I){var p=I.nodeName.toLowerCase(),s,v,t="";if(I.nodeType!=1||p==="br"||I.getAttribute("data-mce-bogus")||i.hasClass(I,"mceItemHidden")||i.hasClass(I,"mceItemRemoved")){return}if(h.isIE&&I.scopeName!=="HTML"&&I.scopeName){p=I.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(y=i.getAttrib(I,"src")){t+="src: "+y+" "}break;case"a":if(y=i.getAttrib(I,"name")){t+="name: "+y+" ";p+="#"+y}if(y=i.getAttrib(I,"href")){t+="href: "+y+" "}break;case"font":if(y=i.getAttrib(I,"face")){t+="font: "+y+" "}if(y=i.getAttrib(I,"size")){t+="size: "+y+" "}if(y=i.getAttrib(I,"color")){t+="color: "+y+" "}break;case"span":if(y=i.getAttrib(I,"style")){t+="style: "+y+" "}break}if(y=i.getAttrib(I,"id")){t+="id: "+y+" "}if(y=I.className){y=y.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(y){t+="class: "+y+" ";if(o.dom.isBlock(I)||p=="img"||p=="span"){p+="."+y}}}p=p.replace(/(html:)/g,"");p={name:p,node:I,title:t};z.onResolveName.dispatch(z,p);t=p.title;p=p.name;v=i.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(G++)},p);if(D.hasChildNodes()){D.insertBefore(i.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),D.firstChild);D.insertBefore(v,D.firstChild)}else{D.appendChild(v)}},o.getBody());if(i.select("a",D).length>0){z.statusKeyboardNavigation=new h.ui.KeyboardNavigation({root:o.id+"_path_row",items:i.select("a",D),excludeFromTabOrder:true,onCancel:function(){o.focus()}},i)}}},_sel:function(j){this.editor.execCommand("mceSelectNodeDepth",false,j)},_mceInsertAnchor:function(l,k){var j=this.editor;j.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(j.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(j.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var j=this.editor;j.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(j.getLang("advanced.charmap_delta_width",0)),height:265+parseInt(j.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var j=this.editor;j.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var j=this.editor;j.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(l,k){var j=this.editor;k=k||{};j.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(j.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(j.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:k.color,func:k.func,theme_url:this.url})},_mceCodeEditor:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(j.getParam("theme_advanced_source_editor_width",720)),height:parseInt(j.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(k,l){var j=this.editor;if(j.dom.getAttrib(j.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}j.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(j.getLang("advanced.image_delta_width",0)),height:275+parseInt(j.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(j.getLang("advanced.link_delta_width",0)),height:200+parseInt(j.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var j=this.editor;j.windowManager.confirm("advanced.newdocument",function(k){if(k){j.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var j=this;this._mceColorPicker(0,{color:j.fgColor,func:function(k){j.fgColor=k;j.editor.execCommand("ForeColor",false,k)}})},_mceBackColor:function(){var j=this;this._mceColorPicker(0,{color:j.bgColor,func:function(k){j.bgColor=k;j.editor.execCommand("HiliteColor",false,k)}})},_ufirst:function(j){return j.substring(0,1).toUpperCase()+j.substring(1)}});h.ThemeManager.add("advanced",h.themes.AdvancedTheme)}(tinymce));Thumbs.db000066600000005000150472426330006322 0ustar00ࡱ> Root Entry\c256_37c8bda47ac64851*q>n.EމPNG  IHDRasRGBgAMA a0IDAT8Oc?% Yԡ@KF  ф9fgp IENDB`style.gif000066600000001117150472426330006405 0ustar00GIF89ah=rDNXFNY$+3=sTTV'-2.4:bp;qQ_yCNZ'@idx!@wvJZ~k{MPY(Fzfu'Gz&@y#@hȬG_~Ran\`cr!Azddd<@Abm1U(Hy"+/.R_og~;p!@y'-4XXZUk.5?QT[ni`t#Bnso[Z_SRWXV[IXuOg9Z;GW^^^϶ց{EN]!ArHR^ =gTs%Ds=nXY[~UU]AY{NVXv!,{vf"691$edKPc7I2'8pb gi?h_<\AxV]:&T|`XULZn*sa(B\~)%^+k-5  l0#r=t;RNHFwQ juMoCJ,!>ИQEz\yr䀂]ӦM<ĉ,@.zIQ ;icon-jare.gif000066600000000116150472426330007112 0ustar00GIF89a@DG!,% sX\dF^gb)jG;