Index: freepbx/tags/2.9.0beta1/buildtools/README.directory
===================================================================
--- freepbx/tags/2.9.0beta1/buildtools/README.directory (revision 11272)
+++ freepbx/tags/2.9.0beta1/buildtools/README.directory (revision 11272)
@@ -0,0 +1,41 @@
+Build Tools:
+
+This directory contains tools that are used to build and package FreePBX.
+This document will describe the tools available, what they do and how you
+use them.
+
+WARNING: Some of these tools will do direct svn checkin's and should be used
+ with caution. Please review the scripts before doing a publish
+ and make sure they do no need to be updated. At this time they do
+ very little error checking and should evolve to improve over time.
+
+/--------------------------------------------------------------------------------------------
+pack_javascripts.php:
+
+This script is used to package the libfreebx.javascripts.js by taking
+all the javascript libraries that are used under the common directory and
+running them through the jsmin class included with pack_javascripts.php.
+
+
+/--------------------------------------------------------------------------------------------
+generate-release.sh
+
+This script automates most of the process of generating the release tarballs and
+associated tags to do a release. It is outlined on the wiki and the key stages
+are listed here (from the wiki):
+
+ * Now run the "generate-release.sh " script which will:
+ * package and checking libfreepbx.javascripts.js if needed
+ * generate the md5 hash for the new version and commit it
+ * create a tag from the current branch
+ * svn cp the core and framework modules into ~amp_conf/htdocs/admin/modules of the tag
+ * creates and cd to /usr/src/freepbx-release directory
+ * svn exports the tag to create a normal freepbx-''''.tar.gz
+ * uses the modlist.sh list to export all the modules and creates a freepbx-''''-withmodules.tar.gz
+
+/--------------------------------------------------------------------------------------------
+md5-amp_conf.sh
+
+This script is not really used any longer as the functionality is incorporated into
+generate-release.sh. It's purpose is to generate the md5 sum files. It does not checkin
+files to svn.
Index: freepbx/tags/2.9.0beta1/buildtools/generate-release.sh
===================================================================
--- freepbx/tags/2.9.0beta1/buildtools/generate-release.sh (revision 9746)
+++ freepbx/tags/2.9.0beta1/buildtools/generate-release.sh (revision 9746)
@@ -0,0 +1,101 @@
+#!/bin/bash
+# use this script like:
+# md5-amp_conf.sh 1.10.00X
+
+# WARNING: THIS IS HARDCODED TO THE 2.3 BRANCH
+#
+# TODO: SHOULD CHECK THE VERSION OF THE MODULES BEFORE PROCEEDING
+#
+module_url="http://www.freepbx.org/v2/svn/modules/branches/2.8"
+core_url=${module_url}/core
+framework_url=${module_url}/framework
+dashboard_url=${module_url}/dashboard
+customappsreg_url=${module_url}/customappsreg
+voicemail_url=${module_url}/voicemail
+recordings_url=${module_url}/recordings
+music_url=${module_url}/music
+featurecodeadmin_url=${module_url}/featurecodeadmin
+infoservices_url=${module_url}/infoservices
+
+case "$1" in
+ ?*)
+
+ver=$1
+
+cd ..
+
+# Make sure everything is up-to-date
+svn update
+
+# Now make sure javascript library reflects all the changes
+cd buildtools
+./pack_javascripts.php
+cd ..
+svn ci --message "Auto checkin packed libfreepbx.javascripts.js as part of build process" amp_conf/htdocs/admin/common/libfreepbx.javascripts.js
+
+# This adds the MD5 Sum for all the relevant files that gets checked in on the next steps below
+#
+cd amp_conf
+find agi-bin astetc bin htdocs htdocs_panel moh sbin sounds -type f | xargs md5sum | grep -v .svn > ../upgrades/$ver.md5
+
+ ;;
+ *)
+
+echo "usage: generate-release.sh ";
+exit
+
+ ;;
+esac
+
+
+# Prepare and checkin the MD5 Sum
+#
+cd ../upgrades
+svn add $ver.md5
+svn ps svn:mime-type text/plain $ver.md5
+svn ps svn:eol-style native $ver.md5
+svn ci -m "Creating release $ver"
+
+# Back up to the top, do an svn info to get the URL so we can use it to create a tag
+#
+cd ..
+cur=`svn info | grep URL | awk ' { print $2 }'`
+svn cp -m "Automatic tag of $ver" $cur http://www.freepbx.org/v2/svn/freepbx/tags/$ver
+
+# Now that the tag is made, we want to add core and framework to the tag so that
+# the tag reflects the tarball. Then we will use the tag to generate the releases
+#
+svn cp -m "Automatic packaging of core with $ver" $core_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of framework with $ver" $framework_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of dashboard with $ver" $dashboard_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of customappsreg with $ver" $customappsreg_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of voicemail with $ver" $voicemail_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of recordings with $ver" $recordings_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of music with $ver" $music_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of featurecodeadmin with $ver" $featurecodeadmin_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+svn cp -m "Automatic packaging of infoservices with $ver" $infoservices_url http://www.freepbx.org/v2/svn/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/
+
+# Now clear out the release diretory where we will build the tarballs and grab it from the tag to get core and framework
+#
+mkdir -p /usr/src/freepbx-release
+rm -rf /usr/src/freepbx-release/freepbx-$ver
+
+# Use the tag to build the tarball
+#
+svn export http://www.freepbx.org/v2/svn/freepbx/tags/$ver /usr/src/freepbx-release/freepbx-$ver
+
+cd /usr/src/freepbx-release
+tar zcvf freepbx-$ver.tar.gz freepbx-$ver
+
+#########################################################################################
+# We don't make a full version with modules anymore so comment this out
+# cd freepbx-$ver/amp_conf/htdocs/admin/modules/
+# . ./import.sh
+#
+# # import should not bring in core and framework, those were removed from its list
+# #
+# find . -name .svn -exec rm -rf {} \;
+# cd /usr/src/freepbx-release
+# tar zcvf freepbx-$ver-withmodules.tar.gz freepbx-$ver
+#
+#########################################################################################
Index: freepbx/tags/2.9.0beta1/buildtools/pack_javascripts.php
===================================================================
--- freepbx/tags/2.9.0beta1/buildtools/pack_javascripts.php (revision 11240)
+++ freepbx/tags/2.9.0beta1/buildtools/pack_javascripts.php (revision 11240)
@@ -0,0 +1,359 @@
+#!/usr/bin/php -q
+ $dir/$libfreepbx\n\n";
+
+//system('cat '.implode(' ',$final)." | ./jsmin.rb > $dir/$libfreepbx");
+
+/**
+ * jsmin.php - PHP implementation of Douglas Crockford's JSMin.
+ *
+ * This is pretty much a direct port of jsmin.c to PHP with just a few
+ * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and
+ * outputs to stdout, this library accepts a string as input and returns another
+ * string as output.
+ *
+ * PHP 5 or higher is required.
+ *
+ * Permission is hereby granted to use this version of the library under the
+ * same terms as jsmin.c, which has the following license:
+ *
+ * --
+ * Copyright (c) 2002 Douglas Crockford (www.crockford.com)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * The Software shall be used for Good, not Evil.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ * --
+ *
+ * @package JSMin
+ * @author Ryan Grove
+ * @copyright 2002 Douglas Crockford (jsmin.c)
+ * @copyright 2008 Ryan Grove (PHP port)
+ * @license http://opensource.org/licenses/mit-license.php MIT License
+ * @version 1.1.1 (2008-03-02)
+ * @link http://code.google.com/p/jsmin-php/
+ */
+
+class JSMin {
+ const ORD_LF = 10;
+ const ORD_SPACE = 32;
+
+ protected $a = '';
+ protected $b = '';
+ protected $input = '';
+ protected $inputIndex = 0;
+ protected $inputLength = 0;
+ protected $lookAhead = null;
+ protected $output = '';
+
+ // -- Public Static Methods --------------------------------------------------
+
+ public static function minify($js) {
+ $jsmin = new JSMin($js);
+ return $jsmin->min();
+ }
+
+ // -- Public Instance Methods ------------------------------------------------
+
+ public function __construct($input) {
+ $this->input = str_replace("\r\n", "\n", $input);
+ $this->inputLength = strlen($this->input);
+ }
+
+ // -- Protected Instance Methods ---------------------------------------------
+
+
+
+ /* action -- do something! What you do is determined by the argument:
+ 1 Output A. Copy B to A. Get the next B.
+ 2 Copy B to A. Get the next B. (Delete A).
+ 3 Get the next B. (Delete B).
+ action treats a string as a single character. Wow!
+ action recognizes a regular expression if it is preceded by ( or , or =.
+ */
+ protected function action($d) {
+ switch($d) {
+ case 1:
+ $this->output .= $this->a;
+
+ case 2:
+ $this->a = $this->b;
+
+ if ($this->a === "'" || $this->a === '"') {
+ for (;;) {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+
+ if ($this->a === $this->b) {
+ break;
+ }
+
+ if (ord($this->a) <= self::ORD_LF) {
+ throw new JSMinException('Unterminated string literal.');
+ }
+
+ if ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ }
+ }
+ }
+
+ case 3:
+ $this->b = $this->next();
+
+ if ($this->b === '/' && (
+ $this->a === '(' || $this->a === ',' || $this->a === '=' ||
+ $this->a === ':' || $this->a === '[' || $this->a === '!' ||
+ $this->a === '&' || $this->a === '|' || $this->a === '?' ||
+ $this->a === '{' || $this->a === '}' || $this->a === ';' ||
+ $this->a === "\n" )) {
+
+ $this->output .= $this->a . $this->b;
+
+ for (;;) {
+ $this->a = $this->get();
+
+ if ($this->a === '/') {
+ break;
+ } elseif ($this->a === '\\') {
+ $this->output .= $this->a;
+ $this->a = $this->get();
+ } elseif (ord($this->a) <= self::ORD_LF) {
+ throw new JSMinException('Unterminated regular expression '.
+ 'literal.');
+ }
+
+ $this->output .= $this->a;
+ }
+
+ $this->b = $this->next();
+ }
+ }
+ }
+
+ protected function get() {
+ $c = $this->lookAhead;
+ $this->lookAhead = null;
+
+ if ($c === null) {
+ if ($this->inputIndex < $this->inputLength) {
+ $c = substr($this->input, $this->inputIndex, 1);
+ $this->inputIndex += 1;
+ } else {
+ $c = null;
+ }
+ }
+
+ if ($c === "\r") {
+ return "\n";
+ }
+
+ if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {
+ return $c;
+ }
+
+ return ' ';
+ }
+
+ /* isAlphanum -- return true if the character is a letter, digit, underscore,
+ dollar sign, or non-ASCII character.
+ */
+ protected function isAlphaNum($c) {
+ return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1;
+ }
+
+ protected function min() {
+ $this->a = "\n";
+ $this->action(3);
+
+ while ($this->a !== null) {
+ switch ($this->a) {
+ case ' ':
+ if ($this->isAlphaNum($this->b)) {
+ $this->action(1);
+ } else {
+ $this->action(2);
+ }
+ break;
+
+ case "\n":
+ switch ($this->b) {
+ case '{':
+ case '[':
+ case '(':
+ case '+':
+ case '-':
+ $this->action(1);
+ break;
+
+ case ' ':
+ $this->action(3);
+ break;
+
+ default:
+ if ($this->isAlphaNum($this->b)) {
+ $this->action(1);
+ }
+ else {
+ $this->action(2);
+ }
+ }
+ break;
+
+ default:
+ switch ($this->b) {
+ case ' ':
+ if ($this->isAlphaNum($this->a)) {
+ $this->action(1);
+ break;
+ }
+
+ $this->action(3);
+ break;
+
+ case "\n":
+ switch ($this->a) {
+ case '}':
+ case ']':
+ case ')':
+ case '+':
+ case '-':
+ case '"':
+ case "'":
+ $this->action(1);
+ break;
+
+ default:
+ if ($this->isAlphaNum($this->a)) {
+ $this->action(1);
+ }
+ else {
+ $this->action(3);
+ }
+ }
+ break;
+
+ default:
+ $this->action(1);
+ break;
+ }
+ }
+ }
+
+ return $this->output;
+ }
+
+ /* next -- get the next character, excluding comments. peek() is used to see
+ if a '/' is followed by a '/' or '*'.
+ */
+ protected function next() {
+ $c = $this->get();
+
+ if ($c === '/') {
+ switch($this->peek()) {
+ case '/':
+ for (;;) {
+ $c = $this->get();
+
+ if (ord($c) <= self::ORD_LF) {
+ return $c;
+ }
+ }
+
+ case '*':
+ $this->get();
+
+ for (;;) {
+ switch($this->get()) {
+ case '*':
+ if ($this->peek() === '/') {
+ $this->get();
+ return ' ';
+ }
+ break;
+
+ case null:
+ throw new JSMinException('Unterminated comment.');
+ }
+ }
+
+ default:
+ return $c;
+ }
+ }
+
+ return $c;
+ }
+
+ protected function peek() {
+ $this->lookAhead = $this->get();
+ return $this->lookAhead;
+ }
+}
+
+// -- Exceptions ---------------------------------------------------------------
+class JSMinException extends Exception {}
+?>
Index: freepbx/tags/2.9.0beta1/buildtools/md5-amp_conf.sh
===================================================================
--- freepbx/tags/2.9.0beta1/buildtools/md5-amp_conf.sh (revision 9043)
+++ freepbx/tags/2.9.0beta1/buildtools/md5-amp_conf.sh (revision 9043)
@@ -0,0 +1,18 @@
+#!/bin/bash
+# use this script like:
+# md5-amp_conf.sh 1.10.00X
+
+case "$1" in
+ ?*)
+
+cd ../amp_conf
+
+find agi-bin astetc bin cgi-bin htdocs htdocs_panel moh sbin sounds -type f | xargs md5sum | grep -v .svn > ../upgrades/$1.md5
+
+ ;;
+ *)
+
+echo "usage: md5-amp_conf ";
+
+ ;;
+esac
Index: freepbx/tags/2.9.0beta1/LICENSE
===================================================================
--- freepbx/tags/2.9.0beta1/LICENSE (revision 3392)
+++ freepbx/tags/2.9.0beta1/LICENSE (revision 3392)
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) 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; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, 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 executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. 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 Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. 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 Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. 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 program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; 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.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ , 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/cdr_mysql.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/cdr_mysql.conf (revision 9484)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/cdr_mysql.conf (revision 9484)
@@ -0,0 +1,20 @@
+;
+; Note - if the database server is hosted on the same machine as the
+; asterisk server, you can achieve a local Unix socket connection by
+; setting hostname = localhost
+;
+; port and sock are both optional parameters. If hostname is specified
+; and is not "localhost", then cdr_mysql will attempt to connect to the
+; port specified or use the default port. If hostname is not specified
+; or if hostname is "localhost", then cdr_mysql will attempt to connect
+; to the socket file specified by sock or otherwise use the default socket
+; file.
+;
+[global]
+hostname = localhost
+dbname=asteriskcdrdb
+password = AMPDBPASS
+user = AMPDBUSER
+userfield=1
+;port=3306
+;sock=/tmp/mysql.sock
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_featurecodes.conf.template
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_featurecodes.conf.template (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_featurecodes.conf.template (revision 10122)
@@ -0,0 +1,39 @@
+; Feature Code Default Override Configuration File
+;
+; freepbx_featurecodes.conf
+;
+; This file is used to override the default featurecode values provided
+; by each FreePBX module. It will not change modified values. This can
+; be used to localize featurecodes different from those chosen by each
+; module and hardcoded into the system.
+;
+; The format is standard ini file format where each section is a raw
+; modulename and each entry under a section is the featurecode.
+;
+; You can typically see the feature codes present in a module by looking
+; at their install.php script or otherwise look at the featurecodes sql
+; table.
+;
+; As an example, the module donotdisturb, you will see some entries in
+; the install.php script that look like:
+;
+; $fcc = new featurecode('donotdisturb', 'dnd_on');
+; $fcc = new featurecode('donotdisturb', 'dnd_off');
+; $fcc = new featurecode('donotdisturb', 'dnd_toggle');
+;
+; To override those featurecodes to something *21, *22 and *23, you would
+; create standard ini entries such as:
+;
+; [donnotdisturb]
+; dnd_on = *21
+; dnd_off = *22
+; dnd_toggle = *23
+;
+; FreePBX will then begin using those entries. You will seem them displayed
+; on the Featurecode Admin page and next time a configuration is generated
+; they should be updated in the featurecode sql table.
+;
+; This ini file must remain in place since modules regularly reset such
+; codes when new versions are uploaded but the presence of this file and
+; its settings will override any such changes
+;
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/modem.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/modem.conf (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/modem.conf (revision 8)
@@ -0,0 +1,74 @@
+;
+; Internet Phone Jack
+;
+; Configuration file
+;
+[interfaces]
+;
+; By default, incoming calls should come in on the "remote" context
+;
+context=remote
+;
+; Modem Drivers to load
+;
+driver=aopen
+;
+; Default language
+;
+;language=en
+;
+; We can optionally override the auto detection. This is necessary
+; particularly if asterisk does not know about our kind of modem.
+;
+;type=autodetect
+;type=aopen
+;
+; We can strip a given number of digits on outgoing dialing, so, for example
+; you can have it dial "8871042" when given "98871042".
+;
+stripmsd=1
+;
+; Type of dialing
+;
+dialtype=tone
+;dialtype=pulse
+;
+; Mode selection. "Immediate" means that as soon as you dial, you're connected
+; and the line is considered up. "Ring" means we wait until the ring cadence
+; occurs at least once. "Answer" means we wait until the other end picks up.
+;
+;mode=answer
+;mode=ring
+mode=immediate
+;
+; List all devices we can use.
+;
+;device => /dev/ttyS3
+;
+; ISDN example
+;
+;msn=39907835
+;device => /dev/ttyI0
+
+;===============
+; More complex ISDN example
+;
+; A single device which listens to 3 MSNs
+; the wildcard '*' can be used when all MSN's should be accepted.
+; (The incoming number can be used to go directly into the extension
+; with the matching number. I.e. if MSN 33 is called, (context,33)
+; will tried first, than (context,s) and finally (default,s).
+;
+;msn=50780020
+;incomingmsn=50780020,50780021,50780022
+;device => /dev/ttyI2
+;
+; two other devices, which are in group '1' and are used when an
+; outgoing dial used: exten => s,1,Dial,Modem/g1:1234|60|r
+; (we do not need more outgoing devices, since ISDN2 has only 2 channels.)
+; Lines can be in more than one group (1-31); comma seperated list.
+;
+group=1 ; group=1,2,3,9-12
+;msn=50780023
+;device => /dev/ttyI3
+;device => /dev/ttyI4
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_general.inc
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_general.inc (revision 10733)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_general.inc (revision 10733)
@@ -0,0 +1,42 @@
+; 1st listed format gets emailed
+format=wav49|wav
+
+attach=yes
+pbxskip=yes ; Don't put [PBX]: in the subject line
+serveremail=vm@asterisk ; Who the e-mail notification should appear to come from
+fromstring=Voicemail System ; Real name of email sender
+maxsilence=5 ; Wait for 5 silent seconds and end the voicemail
+silencethreshold=128 ; What do we consider to be silence
+skipms=3000 ; How many miliseconds to skip forward/back when rew/ff in message playback
+review=yes ; Allow sender to review/rerecord their message before saving it
+operator=yes ; Allow caller to press 0
+nextaftercmd=yes ; Automagically play next message when current message is deleted or saved
+
+; Asterisk pre 1.6.2 options:
+;maxmessage=180 ; max length of vm message
+;minmessage=3 ; Minimum length of a voicemail message in seconds
+
+; Asterisk post 1.6.2 options the minmessage and maxmessage are deprecated in favor of these
+; which are per user settable also:
+;maxsecs=180 ; max length of vm message
+;minsecs=3 ; Minimum length of a voicemail message in seconds
+
+; If using Asterisk 1.6 and ARI or other sources for mail, you should set pollmailboxes to
+; yes and pollfreq if you want to change the default 30 sec polling
+;
+;pollmailboxes=yes
+;pollfreq=30
+; If using IMAP storage, the username and password are specified in the user/extension
+; configuration, while the global settings are here
+;
+;imapserver=server.domain.com ; Specify the IP address or hostname of the IMAP server
+;imapflags=notls ; Specify any IMAP flags needed here ("notls" for example)
+;imapfolder=Inbox ; Specify the IMAP folder where voicemails and/or greetings are stored
+;expungeonhangup=yes ; Mark messages for deletion on hangup
+;imapgreetings=yes ; Store greetings in IMAP as well
+;
+;forcename=yes ; Forces a new user to record their name. A new user is
+ ; determined by the password being the same as
+ ; the mailbox number. The default is "no".
+;forcegreetings=yes ; This is the same as forcename, except for recording
+ ; greetings. The default is "no".
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/enum.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/enum.conf (revision 190)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/enum.conf (revision 190)
@@ -0,0 +1,4 @@
+[general]
+search => e164.arpa
+search => e164.org
+
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/indications.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/indications.conf (revision 10542)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/indications.conf (revision 10542)
@@ -0,0 +1,22 @@
+;--------------------------------------------------------------------------------;
+; Do NOT edit this file as it is auto-generated by FreePBX. All modifications to ;
+; this file must be done via the web gui. ;
+;--------------------------------------------------------------------------------;
+
+[general]
+country=us
+
+[us]
+description = United States / North America
+ringcadence = 2000,4000
+dial = 350+440
+busy = 480+620/500,0/500
+ring = 440+480/2000,0/4000
+congestion = 480+620/250,0/250
+callwaiting = 440/300,0/10000
+dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
+record = 1400/500,0/15000
+info = !950/330,!1400/330,!1800/330,0
+stutter = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/rtp.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/rtp.conf (revision 7529)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/rtp.conf (revision 7529)
@@ -0,0 +1,11 @@
+;
+; RTP Configuration
+;
+[general]
+;
+; RTP start and RTP end configure start and end addresses
+; These are the addresses where your system will RECEIVE audio and video streams.
+; If you have connections across a firewall, make sure that these are open.
+;
+rtpstart=10000
+rtpend=20000
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/queues.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/queues.conf (revision 4993)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/queues.conf (revision 4993)
@@ -0,0 +1,20 @@
+[general]
+;
+; Global settings for call queues
+; (none exist currently)
+;
+; Note that a timeout to fail out of a queue may be passed as part of application call
+; from extensions.conf:
+; Queue(queuename|[options]|[optionalurl]|[announceoverride]|[timeout])
+; example: Queue(dave|t|||45)
+#include queues_general_additional.conf
+#include queues_custom_general.conf
+
+[default]
+;
+; Default settings for queues (currently unused)
+;
+
+#include queues_custom.conf
+#include queues_additional.conf
+#include queues_post_custom.conf
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_module_admin.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_module_admin.conf (revision 6125)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_module_admin.conf (revision 6125)
@@ -0,0 +1,21 @@
+; This file is used to hide modules from the Module Admin
+; GUI that you do not want to have appear there. Its main
+; purpose is to keep modules that you never plan on
+; installing from appearing in the gui.
+;
+; The format is standard ini file format such as where
+; all the modules appear in a general section at the
+; top and each is listed with the word 'hidden' if it is
+; not to appear in the GUI. At this time that is the
+; only supported attribute.
+;
+; The module's 'rawname' is used for the key, so for
+; example to keep the Speed Dial and Phone book modules
+; from appearing, you would have two lines in the general
+; section that looked like:
+; [general]
+; speeddial=hidden
+; phonebook=hidden
+;
+[general]
+builtin=hidden
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/modules.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/modules.conf (revision 9043)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/modules.conf (revision 9043)
@@ -0,0 +1,75 @@
+;
+; Asterisk Module Loader configuration file
+;
+;
+
+[modules]
+autoload=yes
+;
+; Any modules that need to be loaded before the Asterisk core has been
+; initialized (just after the logger has been initialized) can be loaded
+; using 'preload'. This will frequently be needed if you wish to map all
+; module configuration files into Realtime storage, since the Realtime
+; driver will need to be loaded before the modules using those configuration
+; files are initialized.
+;
+; An example of loading ODBC support would be:
+;preload => res_odbc.so
+;preload => res_config_odbc.so
+;
+; As FreePBX is using Local as the channel for queue members we need to make sure
+; that pbx_config.so and chan_local.so are preloaded. If not, queue members
+; will be marked as invalid until app_queue is reloaded.
+preload => pbx_config.so
+preload => chan_local.so
+;
+; Uncomment the following if you wish to use the Speech Recognition API
+;preload => res_speech.so
+;
+; If you want, load the GTK console right away.
+; KDE console is obsolete and was removed from Asterisk 2008-01-10
+;
+noload => pbx_gtkconsole.so
+;load => pbx_gtkconsole.so
+noload => pbx_kdeconsole.so
+;
+; Intercom application is obsoleted by
+; chan_oss. Don't load it.
+;
+noload => app_intercom.so
+;
+; DON'T load the chan_modem.so, as they are obsolete in * 1.2
+
+noload => chan_modem.so
+noload => chan_modem_aopen.so
+noload => chan_modem_bestdata.so
+noload => chan_modem_i4l.so
+
+; Trunkisavail is a broken module supplied by Trixbox
+noload => app_trunkisavail.so
+
+; Ensure that format_* modules are loaded before res_musiconhold
+;load => format_ogg_vorbis.so
+load => format_wav.so
+load => format_pcm.so
+
+; format_au.so is removed from Asterisk 1.4 and later, remove ; to enable
+;load => format_au.so
+
+; This isn't part of 'Asterisk' iteslf, it's part of asterisk-addons. If this isn't
+; installed, asterisk will fail to start. But it does need to go here for native MOH
+; to work using mp3's.
+; Note that on a system with a high number of calls, using a compressed audio format for
+; musiconhold takes CPU resources. Converting these files to ulaw/alaw makes the job
+; much easier for your CPU.
+load => format_mp3.so
+load => res_musiconhold.so
+;
+; Load either OSS or ALSA, not both
+; By default, load no console driver
+;
+noload => chan_alsa.so
+noload => chan_oss.so
+;
+noload => app_directory_odbcstorage.so
+noload => app_voicemail_odbcstorage.so
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/phpagi.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/phpagi.conf (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/phpagi.conf (revision 8)
@@ -0,0 +1,3 @@
+[festival]
+text2wave=/usr/src/festival/bin/text2wave
+tempdir=/var/lib/asterisk/sounds/tmp/
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/extensions_custom.conf.sample
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/extensions_custom.conf.sample (revision 8599)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/extensions_custom.conf.sample (revision 8599)
@@ -0,0 +1,64 @@
+; This file contains example extensions_custom.conf entries.
+; extensions_custom.conf should be used to include customizations
+; to AMP's Asterisk dialplan.
+
+; Extensions in AMP have access to the 'from-internal' context.
+; The context 'from-internal-custom' is included in 'from-internal' by default
+
+[from-internal-custom]
+exten => 1234,1,Playback(demo-congrats) ; extensions can dial 1234
+exten => 1234,2,Hangup()
+exten => h,1,Hangup()
+include => custom-recordme ; extensions can also dial 5678
+
+; custom-count2four,s,1 can be used as a custom target for
+; a Digital Receptionist menu or a Ring Group
+[custom-count2four]
+exten => s,1,SayDigits(1234)
+exten => s,2,Hangup
+
+; custom-recordme,5678,1 can be used as a custom target for
+; a Digital Receptionist menu or a Ring Group
+[custom-recordme]
+exten => 5678,1,Wait(2)
+exten => 5678,2,Record(/tmp/asterisk-recording:gsm)
+exten => 5678,3,Wait(2)
+exten => 5678,4,Playback(/tmp/asterisk-recording)
+exten => 5678,5,Wait(2)
+exten => 5678,6,Hangup
+
+; This macro is for dev purposes and just dumps channel/app variables. Useful when designing new contexts.
+[macro-dumpvars]
+exten => s,1,Noop(ACCOUNTCODE=${ACCOUNTCODE})
+exten => s,2,Noop(ANSWEREDTIME=${ANSWEREDTIME})
+exten => s,3,Noop(BLINDTRANSFER=${BLINDTRANSFER})
+exten => s,4,Noop(CALLERID=${CALLERID(all)})
+exten => s,5,Noop(CALLERID(name)=${CALLERID(name)})
+exten => s,6,Noop(CALLERID(number)=${CALLERID(number)})
+exten => s,7,Noop(CALLINGPRES=${CALLINGPRES})
+exten => s,8,Noop(CHANNEL=${CHANNEL})
+exten => s,9,Noop(CONTEXT=${CONTEXT})
+exten => s,10,Noop(DATETIME=${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)})
+exten => s,11,Noop(DIALEDPEERNAME=${DIALEDPEERNAME})
+exten => s,12,Noop(DIALEDPEERNUMBER=${DIALEDPEERNUMBER})
+exten => s,13,Noop(DIALEDTIME=${DIALEDTIME})
+exten => s,14,Noop(DIALSTATUS=${DIALSTATUS})
+exten => s,15,Noop(DNID=${CALLERID(dnid)})
+exten => s,16,Noop(EPOCH=${EPOCH})
+exten => s,17,Noop(EXTEN=${EXTEN})
+exten => s,18,Noop(HANGUPCAUSE=${HANGUPCAUSE})
+exten => s,19,Noop(INVALID_EXTEN=${INVALID_EXTEN})
+exten => s,20,Noop(LANGUAGE=${LANGUAGE()})
+exten => s,21,Noop(MEETMESECS=${MEETMESECS})
+exten => s,22,Noop(PRIORITY=${PRIORITY})
+exten => s,23,Noop(RDNIS=${CALLERID(rdnis)}})
+exten => s,24,Noop(SIPDOMAIN=${SIPDOMAIN})
+exten => s,25,Noop(SIP_CODEC=${SIP_CODEC})
+exten => s,26,Noop(SIPCALLID=${SIPCALLID})
+exten => s,27,Noop(SIPUSERAGENT=${SIPUSERAGENT})
+exten => s,29,Noop(TXTCIDNAME=${TXTCIDNAME})
+exten => s,30,Noop(UNIQUEID=${UNIQUEID})
+exten => s,31,Noop(TOUCH_MONITOR=${TOUCH_MONITOR})
+exten => s,32,Noop(MACRO_CONTEXT=${MACRO_CONTEXT})
+exten => s,33,Noop(MACRO_EXTEN=${MACRO_EXTEN})
+exten => s,34,Noop(MACRO_PRIORITY=${MACRO_PRIORITY})
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/phone.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/phone.conf (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/phone.conf (revision 8)
@@ -0,0 +1,47 @@
+;
+; Linux Telephony Interface
+;
+; Configuration file
+;
+[interfaces]
+;
+; Select a mode, either the phone jack provides dialtone, reads digits,
+; then starts PBX with the given extension (dialtone mode), or
+; immediately provides the PBX without reading any digits or providing
+; any dialtone (this is the immediate mode, the default). Also, you
+; can set the mode to "fxo" if you have a linejack to make it operate
+; properly.
+;
+mode=immediate
+;mode=dialtone
+;mode=fxo
+;
+; You can decide which format to use by default, "g723.1" or "slinear".
+; XXX Be careful, sometimes the card causes kernel panics when running
+; in signed linear mode for some reason... XXX
+;
+;format=slinear
+format=g723.1
+;
+; And set the echo cancellation to "off", "low", "medium", and "high".
+; This is not supported on all phones.
+;
+echocancel=medium
+;
+; You can optionally use VAD/CNG silence supression
+;
+;silencesupression=yes
+;
+; List all devices we can use. Contexts may also be specified
+;
+;context=local
+;
+; You can set txgain and rxgain for each device in the same way as context.
+; If you want to change default gain value (1.0 =~ 100%) for device, simple
+; add txgain or rxgain line before device line. But rememeber, if you change
+; volume all cards listed below will be affected by these values. You can
+; use float values (1.0, 0.5, 2.0) or percentage values (100%, 150%, 50%).
+;
+;txgain=100%
+;rxgain=1.0
+;device => /dev/phone0
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/manager.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/manager.conf (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/manager.conf (revision 10122)
@@ -0,0 +1,26 @@
+;
+; AMI - Asterisk Manager interface
+;
+; FreePBX needs this to be enabled. Note that if you enable it on a different IP, you need
+; to assure that this can't be reached from un-authorized hosts with the ACL settings (permit/deny).
+; Also, remember to configure non-default port or IP-addresses in amportal.conf.
+;
+; The AMI connection is used both by the portal and the operator's panel in FreePBX.
+;
+; FreePBX assumes an AMI connection to localhost:5038 by default.
+;
+[general]
+enabled = yes
+port = 5038
+bindaddr = 0.0.0.0
+displayconnects=no ;only effects 1.6+
+
+[AMPMGRUSER]
+secret = AMPMGRPASS
+deny=0.0.0.0/0.0.0.0
+permit=127.0.0.1/255.255.255.0
+read = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
+write = system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
+
+#include manager_additional.conf
+#include manager_custom.conf
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/chan_dahdi.conf.template
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/chan_dahdi.conf.template (revision 6600)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/chan_dahdi.conf.template (revision 6600)
@@ -0,0 +1,34 @@
+;# Flash Operator Panel will parse this file for dahdi trunk buttons
+;# AMPLABEL will be used for the display labels on the buttons
+
+;# %c Dahdi Channel number
+;# %n Line number
+;# %N Line number, but restart counter
+;# Example:
+;# ;AMPLABEL:Channel %c - Button %n
+
+;# For Dahdi/* buttons use the following
+;# (where x=number of buttons to dislpay)
+;# ;AMPWILDCARDLABEL(x):MyLabel
+
+
+[channels]
+language=en
+
+; include dahdi extensions defined in FreePBX
+#include chan_dahdi_additional.conf
+
+; XTDM20B Port #1,2 plugged into PSTN
+;AMPLABEL:Channel %c - Button %n
+context=from-pstn
+signalling=fxs_ks
+faxdetect=incoming
+usecallerid=yes
+echocancel=yes
+echocancelwhenbridged=no
+echotraining=800
+group=0
+channel=1-2
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/meetme.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/meetme.conf (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/meetme.conf (revision 8)
@@ -0,0 +1,2 @@
+[rooms]
+#include meetme_additional.conf
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/privacy.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/privacy.conf (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/privacy.conf (revision 8)
@@ -0,0 +1,3 @@
+[general]
+
+maxretries = 2 ;How many chances the caller has to enter their number
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_email.inc
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_email.inc (revision 8599)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/vm_email.inc (revision 8599)
@@ -0,0 +1,7 @@
+; To be able to localize text in the email by using utf-8 characters you can remove the remark on the next line so that the charset will be utf-8
+; charset=utf-8
+; Change the email body, variables: VM_NAME, VM_DUR, VM_MSGNUM, VM_MAILBOX, VM_CALLERID, VM_DATE
+
+emailbody=${VM_NAME},\n\nThere is a new voicemail in mailbox ${VM_MAILBOX}:\n\n\tFrom:\t${VM_CALLERID}\n\tLength:\t${VM_DUR} seconds\n\tDate:\t${VM_DATE}\n\nDial *98 to access your voicemail by phone.\nVisit http://AMPWEBADDRESS/recordings/index.php to check your voicemail with a web browser.\n
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/logger.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/logger.conf (revision 7529)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/logger.conf (revision 7529)
@@ -0,0 +1,38 @@
+;
+; Logging Configuration
+;
+; In this file, you configure logging to files or to
+; the syslog system.
+;
+; For each file, specify what to log.
+;
+; For console logging, you set options at start of
+; Asterisk with -v for verbose and -d for debug
+; See 'asterisk -h' for more information.
+;
+; Directory for log files is configures in asterisk.conf
+; option astlogdir
+;
+[logfiles]
+;
+; Format is "filename" and then "levels" of debugging to be included:
+; debug
+; notice
+; warning
+; error
+; verbose
+;
+; Special filename "console" represents the system console
+;
+;debug => debug
+; The DTMF log is very handy if you have issues with IVR's
+;dtmf => dtmf
+;console => notice,warning,error
+;console => notice,warning,error,debug
+;messages => notice,warning,error
+full => notice,warning,error,debug,verbose
+
+;syslog keyword : This special keyword logs to syslog facility
+;
+;syslog.local0 => notice,warning,error
+;
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/voicemail.conf.template
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/voicemail.conf.template (revision 8)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/voicemail.conf.template (revision 8)
@@ -0,0 +1,5 @@
+[general]
+#include vm_general.inc
+#include vm_email.inc
+[default]
+
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/musiconhold.conf
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/musiconhold.conf (revision 2448)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/musiconhold.conf (revision 2448)
@@ -0,0 +1,7 @@
+;
+; Music on hold class definitions
+; This is using the new 1.2 config file format, and will not work with 1.0
+; based Asterisk systems
+;
+#include musiconhold_custom.conf
+#include musiconhold_additional.conf
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_menu.conf.template
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_menu.conf.template (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/freepbx_menu.conf.template (revision 10122)
@@ -0,0 +1,48 @@
+; This is an optional configuration file used to rearrange your left navigation
+; bar in the FreePBX GUI. To enable it, change the name to freepbx_menu.conf and put
+; in the desired configuration. Lines starting with ";" are comments.
+;
+; It provdes the followming options:
+;
+; - Move menu items to different categories
+; - Create New Categories
+; - Rename the item
+; - Change the tab items appear in between setup and tool
+; - Remove menu items that you don't want displayed
+; - Change the sort order of items
+;
+; If you create a new cateogry called "Favorites" it will
+; be placed right under the Admin Category in the left navigation
+; bar.
+;
+; The following examples provide you with a demonstration of how you
+; might go about changing a setup.
+;
+; There is no 'permanent' change made by invoking this file, if the
+; system finds the file freepbx_menu.conf it will parse it as an
+; ini formated file and make the requested changes to the format
+;
+; [extensions]
+; type=setup
+; category=Favorites
+
+; [findmefollow]
+; type=setup
+; category=Favorites
+; name=Find-Me Follow
+
+; [fax]
+; type=setup
+; category=Media
+
+; [recordings]
+; type=setup
+; category=Media
+
+; [music]
+; type=setup
+; category=Media
+; sort=-9
+
+; [wiki]
+; remove=Yes
Index: freepbx/tags/2.9.0beta1/amp_conf/astetc/zapata.conf.template
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/astetc/zapata.conf.template (revision 390)
+++ freepbx/tags/2.9.0beta1/amp_conf/astetc/zapata.conf.template (revision 390)
@@ -0,0 +1,34 @@
+;# Flash Operator Panel will parse this file for zap trunk buttons
+;# AMPLABEL will be used for the display labels on the buttons
+
+;# %c Zap Channel number
+;# %n Line number
+;# %N Line number, but restart counter
+;# Example:
+;# ;AMPLABEL:Channel %c - Button %n
+
+;# For Zap/* buttons use the following
+;# (where x=number of buttons to dislpay)
+;# ;AMPWILDCARDLABEL(x):MyLabel
+
+
+[channels]
+language=en
+
+; include zap extensions defined in AMP
+#include zapata_additional.conf
+
+; XTDM20B Port #1,2 plugged into PSTN
+;AMPLABEL:Channel %c - Button %n
+context=from-pstn
+signalling=fxs_ks
+faxdetect=incoming
+usecallerid=yes
+echocancel=yes
+echocancelwhenbridged=no
+echotraining=800
+group=0
+channel=1-2
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ca.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ca.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ca.cfg (revision 8095)
@@ -0,0 +1,35 @@
+; Language configuration file
+dialing=Marcant
+calling=Trucant a $1
+incoming=Rebent una trucada de $1
+parked=Aparcat a $1
+registered=Registrat
+notregistered=No registrat
+reachable =Assolible $1
+unreachable=No assolible $1
+lagged=Enderrarit $1
+newold=Nous $1, Vells $2
+waitingonqueue=$1 usuari$2 a l'espera
+memberonconference=$1 participant$2
+version_mismatch=Versio incorrecte entre Client i Servidor!
+; client side
+clid_label=CLID
+detail_title=Detalls ultima trucada
+detail_from=De:
+detail_to=Per:
+detail_duration=Duracio:
+security_code_title=Introdueixi el codi de seguretat
+btn_security_text=Obrir finestra d'ingres de codi
+btn_restart_text=Reinicia Asterisk
+btn_reload_text=Recarrega la configuracio
+btn_debug_text=Obrir/Tancar finestra de Debug
+btn_help_text=Obrir ajuda
+tab_call_text=Trucada
+tab_queue_text=Cua
+calls_taken_text=Trucades ateses
+no_data_text=No hi ha dades
+debug_window_title=Finestra de Debug
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ru.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ru.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_ru.cfg (revision 8095)
@@ -0,0 +1,33 @@
+; Language configuration file
+dialing=ÐÐŽÑÑ ÐœÐ°Ð±ÐŸÑ
+calling=ÐÐ°Ð±ÐŸÑ $1
+incoming=ÐÑ
+ПЎÑÑОй звПМПк ÐŸÑ $1
+parked=ÐаÑкПваМ Ма $1
+registered=ÐаÑегОÑÑÑОÑПваМ
+notregistered=Ðе заÑегОÑÑÑОÑПваМ
+reachable=ÐПÑÑÑпеМ $1
+unreachable=Ðе ЎПÑÑÑпеМ $1
+lagged=ÐавОÑаМОе $1
+newold=ÐПвÑй $1, СÑаÑÑй $2
+waitingonqueue=$1 пПлÑзПваÑелÑ$2 ПжОЎаеÑ
+memberonconference=$1 ÑÑаÑÑМОк$2
+version_mismatch=ÐеÑППÑвеÑÑÑвОе веÑÑОй клОеМÑа О ÑеÑвеÑа!
+; client side
+clid_label=ÐМÑП
+detail_title=ÐПЎÑПбМПÑÑО пПÑлеЎМегП звПМка
+detail_from=ÐÑ:
+detail_to=Ð:
+detail_duration=ÐлОÑелÑМПÑÑÑ:
+security_code_title=ÐПжалÑйÑÑа ввеЎОÑе кПЎ безПпаÑМПÑÑО
+btn_security_text=ÐÑкÑÑÑÑ Ð¿ÐŸÐ»Ðµ ввПЎа кПЎа безПпаÑМПÑÑО
+btn_restart_text=ÐеÑезапÑÑÑОÑÑ Asterisk
+btn_reload_text=ÐеÑезагÑÑзОÑÑ ÐºÐŸÐœÑОгÑÑаÑОÑ
+btn_debug_text=ÐÑкÑÑÑÑ/ÐакÑÑÑÑ ÐкМП ÐÑлаЎкО
+btn_help_text=ÐÑкÑÑÑÑ ÐŸÐºÐœÐŸ пПЌПÑО
+tab_call_text=ÐвПМПк
+tab_queue_text=ÐÑеÑеЎÑ
+calls_taken_text=ÐÑОМÑÑП звПМкПв
+no_data_text=ÐÐµÑ ÐŽÐ°ÐœÐœÑÑ
+
+debug_window_title=ÐкМП ÐÑлаЎкО
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_de.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_de.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_de.cfg (revision 8095)
@@ -0,0 +1,35 @@
+; German Language configuration file
+dialing=Waehlt
+calling=Ruft $1
+incoming=Eingehendes Gespraech von $1
+parked=Gehalten auf $1
+registered=Registriert
+notregistered=Nicht registriert
+reachable=$1 erreichbar
+unreachable=$1 nicht erreichbar
+lagged=$1 verzoegert
+newold=$1 neue, $2 alte
+waitingonqueue=$1 Nutzer warten
+memberonconference=$1 Teilnehmer
+version_mismatch=Client/Server Versionsfehler!
+; client side
+clid_label=Info
+detail_title=Letzte Anrufdetails
+detail_from=Von:
+detail_to=An:
+detail_duration=Dauer:
+security_code_title=Bitte den Sicherheitscode eingeben
+btn_security_text=Eingabe Sicherheitscode
+btn_restart_text=Asterisk-Neustart
+btn_reload_text=Konfiguration neu laden
+btn_debug_text=Debug-Fenster ein/aus
+btn_help_text=Hilfefenster oeffnen
+tab_call_text=Anruf
+tab_queue_text=Warteschlange
+calls_taken_text=Angenommene Anrufe
+no_data_text=Keine Daten vorhanden
+debug_window_title=Debug-Fenster
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/UPGRADE
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/UPGRADE (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/UPGRADE (revision 8095)
@@ -0,0 +1,628 @@
+Notes on upgrading from an older release
+========================================
+
+o Upgrading from version .28 to .29:
+
+ No special features, just bugfixing and serving the policy file
+ from op_server.pl for newer flash clients.
+
+o Upgrading from version .27 to .28:
+
+ New parameters in op_buttons.cfg
+
+ SpyExt=100@spy
+ It lets you specify an extension@context to triger a chanspy
+ action for that call when dropping your phone over the Arrow
+
+ no_label_counter=1
+ To not show increment counter when specifying multiple
+ positions for a button.
+
+ New experimental button type [DID/5555555]
+ It will try to match Freepbx FROM_DID incoming calls
+
+
+ New paramter "passvars" in op_server.cfg to pass extra values to
+ popups. It will pass the variable that is set to the channel via Set
+ in the dialplan before dialing to it in the GET request on the popup.
+
+o Upgrading from version .26 to .27:
+
+ ASTDB checks were changes. Now you have to enable it per button using
+ "astdbkey". Just add that parameter to the button you want to make the
+ check with the appropiate key to check for, eg:
+
+ [SIP/10]
+ Position=1
+ Astdbkey=10
+ ...
+
+ You can specify the callerid name in clid_format under op_server.cfg
+ so you can choose to display the name, number or both, like:
+
+ clid_format=${CLIDNAME} XXX-XXX-XXXX
+
+ New parameter in op_buttons.cfg
+
+ groupcount
+ If set to 1, will show number of channels in use for
+ the button instead of the last callerid. Useful for
+ trunk buttons.
+
+ New button type
+
+ [IMAGE]
+ To draw a jpg image anywhere on the screen, see op_buttons.cfg
+ for an example
+
+
+ New parameter in op_style.cfg
+
+ clid_centered
+ If set to 1, it will try to center the clid display
+
+ nomail_alpha
+ Amount of alpha to apply to MWI when there is no voicemail
+
+ show_borders
+ Enable or disable border to button legend (useful for debuging
+ layout config)
+
+ label_extent_x
+ label_extent_y
+ If the label does not fit horizontally or vertically, increase
+ these numbers
+
+
+o Upgrading from version .25 to .26:
+
+ New DTHML client. The directory structure on the tarball has changed
+ to accommodate the new DHTML client. The former html subdirectory was
+ renamed to flash, and the new client is inside the dhtml subdirectory.
+
+ The new DHTLM client works in a similar way to the flash client, it has
+ a couple of scripts that read the same config files than the flash
+ version to draw the buttons. It is not yet complete but it mostly works.
+
+ New parameter in op_style.cfg:
+
+ shake_pixels
+ Sets the number of pixels to shake the icon when ringing
+
+ dimm_noregister_by
+ Ammount of alpha dimm to apply when channel is not registred
+
+ dimm_lagged_by
+ Ammount of alpha dimm to apply when channel is lagged
+
+ New parameters in op_buttons.cfg:
+
+ VoiceMailExt
+ To set the extension@context to use when transferring directly
+ to voicemail
+
+ Background
+ To specify a jpg image to use as button background. You have to
+ set No_rectangle=true on that button for the background to become
+ active. The .jpg file should be of the same size as the button width
+ and height as specified in op_style.cfg
+
+ Privacy
+ If set to true, it won't display caller id or dialed number info
+ for that button.
+
+o Upgrading from version .24 to .25:
+
+ Queue buttons now must be defined as:
+
+ [QUEUE/SUPPORT]
+
+ With this new syntax, queue names with numbers
+ only as used in AMP will work without collisions.
+
+ You have to rename all queue buttons in your config
+ file to use the new syntax or they won't work.
+
+ Added some attributes to LEGENDS in op_buttons.cfg:
+
+ URL
+ TARGET
+ NO_BASE64
+
+ If set, the legend will become an hyperlink to URL@TARGET
+ If NO_BASE64 is set, the text won't be encoded
+
+ Added attributes to any button in op_buttons.cfg:
+
+ URL
+ TARGET
+
+ If set, it will add an hyperlink to the button label pointing
+ to that URL and opening it inside TARGET.
+
+ Added enable_label_background to op_style.cfg
+
+ This parameter will set the background color to the button label
+ to the same colors as the led. You can use it together with
+ "no_rectangle" in the buttons and Icon=0 and a small width, height
+ and font to fit hundreds of buttons on one screen. I was able to
+ fit 630 buttons (but only for monitoring as you don't have the led
+ or icon to transfer or hangup calls)
+
+ Added dimm (alpha) for noregistered and lagged buttons to op_style.cfg
+
+ dimm_noregister_by=20
+ dimm_lagged_by=60
+
+ Added listen_addr keyword
+ If you want op_server.pl to bind to only one IP address instead of
+ all avaialbe addresses.
+
+ Added manager_port keyword
+
+ If your manager is not running on the default port, you
+ can specify the port now for each connection with this
+ option. Example:
+
+ manager_port = 5039
+
+ Added support for astmanproxy
+
+ In op_server.cfg you have to defined the astmanproxy host & port
+ (the ip address where astmanproxy is listening) & server (the
+ same ip or name you use in astmanproxy.conf). If you
+ monitor more than one asterisk server trough astmanproxy, you
+ will have to enumerate them using the astmanproxy_server keyword.
+ Example:
+
+ astmanproxy_host = 127.0.0.1
+ astmanproxy_port = 1234
+ astmanproxy_server = 192.168.10.1
+ astmanproxy_server = 192.168.10.2
+
+ Added buttons for MEETME participants. Just specify more
+ than one position for a meetme button and they will show
+ meetme participants indiviually as they join or leave the
+ conference.
+
+ Added [QUEUEAGENT] buttons. They will be taken by static
+ or dynamic queue members automatically.
+
+ Added buttons for QUEUE positions. Just specify more than
+ one position for the button and they will show each queue
+ position instead of a queue summary
+
+
+o Upgrading from version .23 to .24:
+
+ Nothing new, just a bug fix release in op_server.pl
+
+o Upgrading from version .22 to .23:
+
+ Client and server must be upgraded or it will not work well.
+
+ Internationalization support:
+
+ Parameter ADDED to op_server.cfg:
+
+ language
+
+ To set the language to use in the general section
+ and optionally in every panel context defined.
+
+ The language files are named op_lang_XX.cfg where XX is the
+ language to use defined in the language option. Each panel
+ context might have a distinct language. The default language
+ is 'en' (english).
+
+ You can create your own language file. If you do, please
+ send it back to me so I can include it in the tarball.
+ Some strings include variables, they are represented as
+ $1 and $2. You can ommit the variables or use them as you
+ see fit.
+
+ The help file is now called help-XX.html. Be sure to add that file
+ or rename the one you have. Please contribute with translations or
+ beautifying them if you can.
+
+ Parameters REMOVED from op_style.cfg (they were moved to the language
+ configuration file):
+
+ clid_label
+ detail_title
+ detail_from
+ detail_to
+ detail_duration
+
+ Parameters ADDED to op_style.cfg (to set the button label color, the
+ button label shadow color, and the clid text color):
+
+ label_font_color = 000000
+ label_shadow_color = FFFFFF
+ clid_font_color = 00DD00
+ timer_font_color = 200070
+
+ New option for LEGENDS in op_buttons.cfg
+
+ font_color = 102030
+
+ Support for command line options. Run op_server.pl with --help to
+ see the available options
+
+
+o Upgrading from version .21 to .22:
+
+ Just replace op_server.pl that has minor bugfixes
+
+o Upgrading from version .20 to .21:
+ New configuration file: op_astdb.cfg used to monitor asterisk
+ db values and change states for a button based on them.
+
+ New option: voicemail_extension parameter in op_server.cfg.
+ If set, FOP will originate a call to that extension when
+ double clicking on the MWI icon.
+
+ The PARK buttons are now specified as PARK/XXX
+ instead of PARKXXX to make it more consistent with
+ channel naming conventions. The old name will still
+ work.
+
+ To enable agent_status (displays agent idle
+ time and refresh queue status after each
+ call). In op_server.cfg:
+
+ agent_status=1
+
+
+ If there is a background.jpg image in the same
+ directory as the swf file, it will be used as
+ the background for the panel. Resolution: 996x600
+
+ The syntax for wildcard buttons has changed, if
+ you have [SIP/*] change it to [_SIP/.*]
+ The new matching routine allows full regexps to
+ be used. To use regexps buttons start them with
+ an underscore followed by your expression.
+
+ To disable the security code, leave it blank. In
+ op_server.cfg:
+ security_code = ""
+
+ To enable timeout on transfers, you have to set the
+ transfer_timeout paramenter to op_server.cfg
+
+ You can set the reload button to perform an asterisk
+ restart if you set enable_restart to 1 in op_server.cfg
+
+o Upgrading from version .19 to .20:
+
+ You can define the server number of a button in op_buttons.cfg
+ using the 'server' directive. If you leave it empty, it will
+ default to Server=1
+
+ To monitor more than one asterisk box, just repeat the sequence of
+ connection parameters in op_server.cfg
+
+ ; Server 1
+ manager_host=1.2.3.4
+ manager_user=john
+ manager_secret=doe
+
+ ; Server 2
+ manager_host=1.2.3.5
+ manager_user=mary
+ manager_secret=poppins
+
+ To add text legends, the format is:
+
+ [LEGEND]
+ x=535
+ y=50
+ text=Conferences
+ font_size=32
+ font_family=Arial
+ use_embed_fonts=1
+
+ To add park slot buttons, the format is:
+
+ [PARK701]
+ Position=17
+ Icon=3
+ Extension=700
+ Label="Park 701"
+
+ You can specify the mailbox for a button with the mailbox parameter:
+
+ [SIP/100]
+ Position=1
+ Mailbox=100@default
+ ...
+
+ The 'old way' still works, by using the combination of Extension and
+ Voicemail_Context. I recommend you to use the new format as it is more
+ flexible (you can monitor a mailbox independant from the extension of
+ that button).
+
+
+ New directives in op_server.cfg
+
+ rename_label_wildcard
+ barge_muted
+ clid_privacy
+ show_ip
+
+o Upgrading from version .18 to .19:
+
+ In op_style.cfg there is a new paramter to confgure the
+ highlighting color for the buttons:
+
+ btn_highlight_color=ff0000
+
+o Upgrading from version .17 to .18:
+
+ The default .swf client is now the ming port. The new features
+ are available only in the ming port. The flash .swf is included
+ but it was not tested.
+
+ In op_style.cfg there are new parameters (to configure led colors):
+
+ ledcolor_ready
+ ledcolor_busy
+ ledcolor_agent
+
+ The parameter led_color is not used anymore. (It is used by the
+ flash client only, not the default ming client)
+
+ In op_server.cfg there are new options too (all commented in
+ op_server.cfg itsef):
+
+ rename_label_agentlogin
+ rename_label_callbacklogin
+ rename_to_agent_name
+ rename_queue_member
+ change_led_agent
+ clicktodial_insecure
+
+ It is possible now to draw rectangles, see op_buttons.cfg for
+ an example.
+
+ If you use click-to-dial, the button used to originate the call
+ must be specified when invoking the .swf file. The parameter used
+ is 'dial'. See index-clicktodial.html for an example.
+
+o Upgrading from version .16 to .17:
+
+ Just replace op_server.pl and your favorite .swf client. Its
+ mostly a bug fix release. The new features do not require
+ configuration changes.
+
+o Upgrading from version .15 to .16:
+
+ The help window is now a browser windows that loads help.html
+ (instead of being a flash window that loads the help.txt file)
+ So you need to put a help.html page in the same location as the
+ .swf file.
+
+ There are a couple of new parameters. In op_server.cfg
+
+ poll_voicemail
+
+ Will check for voicemail status every poll_interval seconds.
+ Remeber that poll_interval will also check for sip peers.
+
+ rename_label_agentlogin
+ rename_label_callbacklogin
+
+ Both parameters acomplish the same goal: to rename a button
+ label when an Agent logs in. One of them works with the regular
+ AgentLogin application. The other one with AgentCallbackLogin.
+ For the later, you need to have a button with the same extension
+ and context for the callback for it to work.
+
+ There is also a new parameter in op_style.cfg
+
+ enable_crypto (1 for enable, 0 for disable)
+
+ If you want to encrypt server to client messages, turn this on.
+
+o Upgrading from version .14 to .15:
+
+ The format of the configuration file is different. You have to
+ run ./convert_config_pre_14.pl in order to convert your old
+ configuration files to the new format. The conversion utility
+ must reside in the same directory as the old configuration files:
+
+ op_server.cfg
+ op_style.cfg
+ op_buttons.cfg
+
+ When you run the conversion routine, it will backup your old
+ configuration files and do its thing. Just in case, backup the
+ files yourself. The conversion program does not have extensive
+ error checking.
+
+ The barge-in functionality has changed also. You no longer need
+ an auto_conference_extension in your dialplan. The panel will
+ keep track of the conferences itself. You *do* need to add the
+ conference room numbers that must be used for barge-in. The
+ conversion routine adds the parameter, you have to modify it to
+ suit your needs. The new parameter (in op_server.cfg) is:
+
+ barge_rooms
+
+ It must have at least two rooms defined, with the format:
+ "minor-major". Those rooms must be defined in your extensions.conf
+ under the context defined by conference_context. The extension
+ number must match the meetme room number. See op_server.cfg for
+ an example.
+
+ To authenticate using MD5 to Asterisk Manager you can add the parameter
+ auth_md5=1 in op_server.cfg. It is enabled by default.
+
+ There are new parameter in op_style.cfg:
+
+ enable_animation: it will animate the phone icons when ringing.
+
+ use_embed_font: lets you choose between embed fonts or system fonts.
+
+ (1 for enable, 0 for disable)
+
+
+o Upgrading from version .13 to .14:
+
+ In Asterisk RC1, the IAX naming convention has changed. There are
+ no more brackets in IAX2 channel names. If you run RC1 (try it!)
+ you will have to name your IAX2 channels like:
+
+ IAX2/user
+
+ You will have to rename your op_buttons.cfg if you use IAX2 channels.
+
+ The code for handling the previous naming convention is still there
+ but I have not tested it. It might or might not work.
+
+ There are new elements in op_style that affects the button style:
+
+ arrow_scale
+ arrow_margin_top
+ arrow_margin_left
+
+ The above parameters indicate the size and position of a little
+ arrow that shows the 'direction' of the call.
+
+ detail_title=Last call details
+ detail_from=From:
+ detail_to=To:
+ detail_duration=Duration:
+
+ These four parameters are for setting the text displayed in the
+ detail box when you double click on the little arrow after a call
+ is made.
+
+ led_color
+
+ The color scheme for the available/busy led.
+ 0 for leds green/red. (default)
+ 1 for leds grey/green
+
+ label_shadow
+
+ You can add a shadow to the text label
+ 0 for disabling the shadow (default)
+ 1 for enabling the shadow
+
+
+ There is a new parameter in op_server.cfg:
+
+ clid_format
+
+ This mask will apply to the callerid field to format the
+ number as you see fit. Every 'x' will be replaced by a number
+ from right to left. Any other char will be preserved. Ex:
+ (xxx) xxx-xxxx
+
+o Upgrading from version .12 to .13:
+
+ For the timer to work, you need to add four new parameters to
+ op_style.cfg
+
+ timer_font_size
+ timer_font_family
+ timer_margin_top
+ timer_margin_left
+
+o Upgrading from version .11 to .12:
+
+ There are 4 new parameters in op_style.cfg for the caller id
+ display on each button.
+
+ clid_font_size
+ clid_font_family
+ clid_margin_top
+ clid_margin_left
+
+o Upgrading from version .10 to .11:
+
+ There are no new parameters in the configuration files. Your .10
+ configuration should work fine with version .11
+
+ The debug level bitmap is now different:
+
+ 1 Show Manager Events Received
+ 2 Show Commands set to Manager
+ 4 Show Flash events Received
+ 8 Show events sent to Flash Clients
+ 16 1st level Debug on op_server.pl
+ 32 2nd level Debug on op_server.pl
+ 64 3rd level Debug on op_server.pl
+
+o Upgrading from version .09 to .10:
+
+ There are 2 new parameters in op_style.cfg for a new element
+ in the toolbar (a reload button)
+
+ btn_reload_label
+ show_btn_reload
+
+
+o Upgrading from version .08 to .09:
+
+ The debug level (op_server.cfg) is now a bitmap. Now you have more
+ control of the output produced by debug. The possible values are:
+
+ 1 Show Manager Events Received
+ 2 Show Commands set to Manager
+ 4 1st level debug on op_server.pl
+ 8 2nd level debug on op_server.pl
+ 16 3rd level debug on op_server.pl
+
+ If you want full debug, set the value to 31 in op_server.cfg
+ If you want to see just the events received and sent, set it to 3 (1+2)
+
+ The fade matrix for the buttons is slightly different. Its the first
+ step towards a visual button layout configurator.
+
+o Upgrading from version .07 to .08:
+
+ The offset and size of the icons have changed. You will need to adjust
+ your op_style.cfg. Now all the icons are aproximatly the same size and
+ have the same center offset, so the margins and scale parameters will
+ match from icon to icon. New layout configurations should be simpler.
+
+ There are several new parameters in op_style.cfg, related to the
+ configurability of the toolbar. You have to add them in your current
+ configuration, if you don't do it you will not see any toolbar. The
+ parameters to add are:
+
+ clid_label=Extra Info:
+ security_label=Security Code:
+ btn_help_label=Help
+ btn_log_label=Debug
+ show_security_code=1
+ show_clid_info=2
+ show_status=3
+ show_btn_help=4
+ show_btn_debug=5
+
+ The number in show_xxx represents the order in which it is rendered. If
+ you want to hide an element of the toolbar, set it to 0.
+
+o Upgrading from version .06 to .07:
+
+ There are two new parameters in op_server.cfg:
+
+ auto_conference_extension = 900
+ conference_context = conferences
+
+ Add them to your existing configuration file. In op_server.cfg there are
+ also examples of asterisk configuration files to use the 3way auto
+ conferences.
+
+o Upgrading from previous versions:
+
+ There are three new parameters in op_sytle.cfg and a new one in
+ op_buttons.cfg. See CHANGES. Just add those parameters to your current
+ config files, and replace op_server.pl with the new one. The fixed 24
+ buttons flash movie does not support voicemail notifications. There is a
+ new index.html that scales the applet to the size of the browser window.
+ Try it and use the one you like more.
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/operator_panel.pl
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/operator_panel.pl (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/operator_panel.pl (revision 8166)
@@ -0,0 +1,11454 @@
+#!/usr/bin/perl -w
+# Flash Operator Panel. http://www.asternic.org
+#
+# Copyright (c) 2004 Nicolas Gudino. All rights reserved.
+#
+# Nicolas Gudino
+#
+# This program is free software, distributed under the terms of
+# the GNU General Public License.
+#
+# THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``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 CONTRIBUTORS 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.
+
+use SWF qw(:ALL);
+use SWF::Constants qw(:Text :Button :DisplayItem :Fill);
+
+$stage_width = 996;
+$stage_height = 600;
+
+SWF::setScale(2);
+SWF::useSWFVersion(7);
+my $movie = new SWF::Movie();
+$movie->setDimension($stage_width * 10, $stage_height * 10);
+$movie->setBackground(0xFF, 0xFF, 0xFF);
+$movie->setRate(20);
+
+
+
+$fuente="/usr/src/ming/util/fonts/Arial.fdb";
+$fuente_nombre="Arial";
+
+sub maketextfield {
+ $name = shift;
+ $font = shift;
+ $str = shift;
+
+ $txtfield = new SWF::TextField( SWFTEXTFIELD_MULTILINE | SWFTEXTFIELD_WORDWRAP | SWFTEXTFIELD_USEFONT );
+ $txtfield->setHeight(254);
+ $txtfield->setBounds(200,30);
+ $txtfield->setName($name);
+ $txtfield->setColor(0x00, 0x00, 0x00);
+ $txtfield->setFont(new SWF::Font($font));
+ $txtfield->addChars("\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff\x100\x101\x102\x103\x104\x105\x106\x107\x108\x109\x110\x111\x112\x113\x114\x115\x116\x116\x118\x119\x11a\x11b\x11c\x11d\x11e\x11f\x120\x121\x122\x123\x124\x125\x126\x127\x128\x129\x12a\x12b\x12c\x12d\x12e\x12f\x130\x131\x132\x133\x134\x135\x136\x137\x138\x139\x13a\x13b\x13c\x13d\x13e\x13f\x140\x141\x142\x143\x144\x145\x146\x147\x148\x149\x14a\x14b\x14c\x14d\x14e\x14f\x150\x151\x152\x153\x154\x155\x156\x157\x158\x159\x15a\x15b\x15c\x15d\x15e\x15f\x160\x161\x162\x163\x164\x165\x166\x167\x168\x169\x16a\x16b\x16c\x16d\x16e\x16f\x170\x171\x172\x173\x174\x175\x176\x177\x178\x179\x17a\x17b\x17c\x17d\x17e\x17f\x180\x181\x182\x183\x184\x185\x186\x187\x188\x189\x18a\x18b\x18c\x18d\x18e\x18f\x190\x191\x192\x193\x194\x195\x196\x197\x198\x199\x19a\x19b\x19c\x19d\x19e\x19f\x1a0\x1a1\x1a2\x1a3\x1a4\x1a5\x1a6\x1a7\x1a8\x1a9\x1aa\x1ab\x1ac\x1ad\x1ae\x1af\x1b0\x1b1\x1b2\x1b3\x1b4\x1b5\x1b6\x1b7\x1b8\x1b9\x1ba\x1bb\x1bc\x1bd\x1be\x1bf\x1c0\x1c1\x1c2\x1c3\x1c4\x1c5\x1c6\x1c7\x1c8\x1c9\x1ca\x1cb\x1cc\x1cd\x1ce\x1cf\x1d0\x1d1\x1d2\x1d3\x1d4\x1d5\x1d6\x1d7\x1d8\x1d9\x1da\x1db\x1dc\x1dd\x1de\x1df\x1e0\x1e1\x1e2\x1e3\x1e4\x1e5\x1e6\x1e7\x1e8\x1e9\x1ea\x1eb\x1ec\x1ed\x1ee\x1ef\x1f0\x1f1\x1f2\x1f3\x1f4\x1f5\x1f6\x1f7\x1f8\x1f9\x1fa\x1fb\x1fc\x1fd\x1fe\x1ff\x200\x201\x202\x203\x204\x205\x206\x207\x208\x209\x20a\x20b\x20c\x20d\x20e\x20f\x210\x211\x212\x213\x214\x215\x216\x217\x218\x219\x21a\x21b\x21c\x21d\x21e\x21f\x220\x221\x222\x223\x224\x225\x226\x227\x228\x229\x22a\x22b\x22c\x22d\x22e\x22f\x230\x231\x232\x233\x234\x235\x236\x237\x238\x239\x23a\x23b\x23c\x23d\x23e\x23f\x240\x241\x242\x243\x244\x245\x246\x247\x248\x249\x24a\x24b\x24c\x24d\x24e\x24f\x250\x251\x252\x253\x254\x255\x256\x257\x258\x259\x25a\x25b\x25c\x25d\x25e\x25f\x260\x261\x262\x263\x264\x265\x266\x267\x268\x269\x26a\x26b\x26c\x26d\x26e\x26f\x270\x271\x272\x273\x274\x275\x276\x277\x278\x279\x27a\x27b\x27c\x27d\x27e\x27f\x280\x281\x282\x283\x284\x285\x286\x287\x288\x289\x28a\x28b\x28c\x28d\x28e\x28f\x290\x291\x292\x293\x294\x295\x296\x297\x298\x299\x29a\x29b\x29c\x29d\x29e\x29f\x2a0\x2a1\x2a2\x2a3\x2a4\x2a5\x2a6\x2a7\x2a8\x2a9\x2aa\x2ab\x2ac\x2ad\x2ae\x2af\x2b0\x2b1\x2b2\x2b3\x2b4\x2b5\x2b6\x2b7\x2b8\x2b9");
+ $txtfield->addString($str);
+ return $txtfield;
+}
+
+$txtv = maketextfield("txtv",$fuente,"Nico");
+$txt=$movie->add($txtv);
+$txt->moveTo(-2400,-2800);
+#$txt->moveTo(10,10);
+$txt->setName("textoload");
+
+#################################################
+## SELECT TIMEOUT BOX
+#################################################
+$dropbox1 = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(5600, 0);
+$s1->setRightFill(0xf2, 0xf2, 0xf6);
+#$s1->setLine(1, 0xbe, 0xbe, 0xbe);
+$s1->drawLine(0, 3400);
+$s1->drawLine(-5600, 0);
+#$s1->setLine(1, 0xf2, 0xf2, 0xf6);
+$s1->drawLine(0, -3400);
+$s1->drawLine(5600, 0);
+
+### MovieClip 2 ###
+$s2 = new SWF::MovieClip(); # 1 frames
+$s2->add($s1);
+$s2->nextFrame(); # end of clip frame 1
+
+$i1 = $dropbox1->add($s2);
+#$i1->scaleTo(0.714279, 0.105881);
+$i1->scaleTo(0.328, 0.0635);
+$i1->setName('bg');
+
+### Shape 3 ###
+# Scroll DOWN #
+$s3 = new SWF::Shape();
+$s3->movePenTo(320, 0);
+$s3->setRightFill(0x6f, 0x7f, 0x7f);
+$s3->setLine(1, 0xbe, 0xbe, 0xbe);
+$s3->drawLine(0, 340);
+$s3->drawLine(-320, 0);
+$s3->setLine(0,0,0,0);
+$s3->drawLine(0, -340);
+$s3->drawLine(320, 0);
+$s3->setLeftFill();
+$s3->setRightFill();
+$s3->setLine(0,0,0,0);
+$s3->movePenTo(160, 220);
+$s3->setRightFill(0x7f, 0x7f, 0x7f);
+$s3->drawLine(-80, -80);
+$s3->drawLine(160, 0);
+$s3->drawLine(-80, 80);
+### MovieClip 4 ###
+$s4 = new SWF::MovieClip(); # 1 frames
+$s4->add($s3);
+
+$s4->add(new SWF::Action("
+this.onPress = function() {
+ if(_parent._currentframe == 1) {
+ _root.despliega_select();
+ } else {
+ var incremento = 1;
+ var cuantashay = _global.opcionesTimeout.length;
+ cuantashay = cuantashay - 4;
+ if (_global.positionselect < cuantashay) {
+ for(a=0;a<5;a++) {
+ var indice = a + _global.positionselect;
+ if (_global.opcionesTimeout[indice] != undefined) {
+ _root['option'+a].legend = _global.opcionesTimeout[indice];
+ incremento = 1;
+ } else {
+ incremento = 0;
+ }
+ }
+ _global.positionselect=_global.positionselect+incremento;
+ }
+ }
+};
+
+"));
+$s4->nextFrame(); # end of clip frame 1
+### END SCROLL DOWN #####
+
+
+#### SCROLL UP ######
+### Shape 5 ###
+$s5 = new SWF::Shape();
+$s5->movePenTo(320, 0);
+$s5->setRightFill(0x6f, 0x7f, 0x7f);
+$s5->setLine(1, 0xbe, 0xbe, 0xbe);
+$s5->drawLine(0, 340);
+$s5->drawLine(-320, 0);
+$s5->setLine(0,0,0,0);
+$s5->drawLine(0, -340);
+$s5->drawLine(320, 0);
+$s5->setLeftFill();
+$s5->setRightFill();
+$s5->setLine(0,0,0,0);
+$s5->movePenTo(160, 140);
+$s5->setRightFill(0x7f, 0x7f, 0x7f);
+$s5->drawLine(-80, 80);
+$s5->drawLine(160, 0);
+$s5->drawLine(-80, -80);
+### MovieClip 6 ###
+$s6 = new SWF::MovieClip(); # 1 frames
+$s6->add($s5);
+$s6->add(new SWF::Action("
+this.onPress = function() {
+ var incremento = 1;
+ if (_global.positionselect > 0) {
+ for(a=0;a<5;a++) {
+ var indice = a + _global.positionselect - 1;
+ if (_global.opcionesTimeout[indice] != undefined) {
+ _root['option'+a].legend = _global.opcionesTimeout[indice];
+ incremento = -1;
+ } else {
+ incremento = 0;
+ }
+ }
+ _global.positionselect=_global.positionselect+incremento;
+ }
+};
+
+"));
+$s6->nextFrame(); # end of clip frame 1
+##### END SCROLL UP ######
+
+$i3 = $dropbox1->add($s4);
+$i3->moveTo(1640, 10);
+$i3->scaleTo(0.6, 0.6);
+$i3->setName('ScrollDown');
+
+$dropbox1->nextFrame(); # end of frame 1
+$dropbox1->remove($i3);
+
+$i1 = $dropbox1->add($s2);
+$i1->scaleTo(0.328, 0.4);
+$i1->setName('bg');
+$i3 = $dropbox1->add($s4);
+$i3->moveTo(1640,1160);
+$i3->scaleTo(0.6, 0.6);
+$i3->setName('ScrollDown');
+
+
+$i3 = $dropbox1->add($s6);
+$i3->moveTo(1640, 10);
+$i3->scaleTo(0.6, 0.6);
+$i3->setName('ScrollUp');
+
+$option = new SWF::MovieClip();
+$i3 = $option->add($s2);
+$i3->scaleTo(0.29, 0.0635);
+$i3->setName('bg');
+
+$font_general = new SWF::Font($fuente);
+
+$s8 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT | SWFTEXTFIELD_NOSELECT );
+$s8->setBounds(1411, 398);
+$s8->setFont($font_general);
+#$s8->setFont(new SWF::Font("_sans"));
+$s8->setHeight(180);
+$s8->setColor(0x00, 0x00, 0x00, 0xff);
+$s8->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s8->setName('legend');
+$s8->addString('Select Timeout');
+
+$i3 = $option->add($s8);
+$i3->moveTo(70,10);
+
+$option->nextFrame();
+$dropbox1->nextFrame(); # end of frame 2
+##################################################
+# END SELECT TIMEOUT BOX
+##################################################
+
+## MovieCLIP progress graphic
+##
+$progressclip = new SWF::Sprite();
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(140, -53);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(140, -62);
+$s2->drawLine(-40, -70);
+$s2->drawLine(-124, 91);
+$s2->drawCurve(16, 19, 8, 22);
+$s2->movePenTo(95, -115);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s2->setRightFill();
+#$s2->setLine(0,255,255,255);
+$s2->drawLine(90, -125);
+$s2->drawLine(-70, -40);
+$s2->drawLine(-62, 140);
+$s2->drawLine(42, 25);
+$s2->movePenTo(40, -300);
+$s2->setLeftFill(0xff, 0xff, 0xff);
+$s2->setRightFill();
+#$s2->setLine(0,255,255,255);
+$s2->drawLine(-80, 0);
+$s2->drawLine(16, 152);
+$s2->drawLine(23, -1);
+$s2->drawLine(26, 2);
+$s2->drawLine(15, -153);
+$s2->movePenTo(148, -24);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s2->setRightFill();
+#$s2->setLine(0,255,255,255);
+$s2->drawLine(2, 24);
+$s2->drawLine(-2, 25);
+$s2->drawLine(152, 15);
+$s2->drawLine(0, -80);
+$s2->drawLine(-152, 16);
+$s2->movePenTo(280, 115);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-140, -62);
+$s2->drawCurve(-8, 22, -16, 20);
+$s2->drawLine(124, 90);
+$s2->drawLine(40, -70);
+$s2->movePenTo(53, 141);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(62, 139);
+$s2->drawLine(70, -40);
+$s2->drawLine(-90, -124);
+$s2->drawLine(-42, 25);
+$s2->movePenTo(25, 149);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-26, 2);
+$s2->drawLine(-23, -2);
+$s2->drawLine(-16, 151);
+$s2->drawLine(80, 0);
+$s2->drawLine(-15, -151);
+$s2->movePenTo(-239, -185);
+$s2->setLeftFill();
+$s2->setRightFill(0xff, 0xff, 0xff, 0xcc);
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(123, 90);
+$s2->drawCurve(-17, 19, -8, 23);
+$s2->drawLine(-138, -62);
+$s2->drawLine(40, -70);
+$s2->movePenTo(-53, -140);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-62, -140);
+$s2->drawLine(-70, 40);
+$s2->drawLine(90, 124);
+$s2->drawCurve(19, -16, 23, -8);
+$s2->movePenTo(-148, -24);
+$s2->setLeftFill();
+$s2->setRightFill(0xff, 0xff, 0xff, 0xc0);
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-2, 24);
+$s2->drawLine(2, 25);
+$s2->drawLine(-152, 15);
+$s2->drawLine(0, -80);
+$s2->drawLine(152, 16);
+$s2->movePenTo(-141, 53);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-138, 62);
+$s2->drawLine(40, 70);
+$s2->drawLine(123, -89);
+$s2->drawLine(-25, -43);
+$s2->movePenTo(-95, 117);
+$s2->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s2->setRightFill();
+#$s2->setLine(0,0,0,0);
+$s2->drawLine(-90, 123);
+$s2->drawLine(70, 40);
+$s2->drawLine(62, -138);
+$s2->drawCurve(-23, -9, -19, -16);
+
+### Shape 3 ###
+$s3 = new SWF::Shape();
+$s3->movePenTo(116, -94);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawCurve(16, 19, 8, 22);
+$s3->drawLine(140, -62);
+$s3->drawLine(-40, -70);
+$s3->drawLine(-124, 90);
+$s3->drawLine(0, 1);
+$s3->movePenTo(185, -240);
+$s3->setLeftFill(0xff, 0xff, 0xff);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-69, -40);
+$s3->drawLine(-63, 140);
+$s3->drawLine(42, 25);
+$s3->drawLine(90, -125);
+$s3->movePenTo(40, -300);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-80, 0);
+$s3->drawLine(16, 152);
+$s3->drawLine(23, -1);
+$s3->drawLine(25, 2);
+$s3->drawLine(16, -153);
+$s3->movePenTo(148, -24);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(2, 24);
+$s3->drawLine(-2, 24);
+$s3->drawLine(152, 16);
+$s3->drawLine(1, -80);
+$s3->drawLine(-153, 16);
+$s3->movePenTo(280, 116);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-140, -63);
+$s3->drawCurve(-8, 22, -16, 20);
+$s3->drawLine(124, 90);
+$s3->drawLine(40, -69);
+$s3->movePenTo(95, 116);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-41, 25);
+$s3->drawLine(62, 139);
+$s3->drawLine(69, -40);
+$s3->drawLine(-90, -124);
+$s3->movePenTo(40, 300);
+$s3->setLeftFill();
+$s3->setRightFill(0xff, 0xff, 0xff, 0x8d);
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-80, 0);
+$s3->drawLine(16, -151);
+$s3->drawLine(23, 2);
+$s3->drawLine(25, -2);
+$s3->drawLine(16, 151);
+$s3->movePenTo(-240, -184);
+$s3->setLeftFill();
+$s3->setRightFill(0xff, 0xff, 0xff, 0xc0);
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(124, 89);
+$s3->drawCurve(-17, 19, -8, 23);
+$s3->drawLine(-139, -62);
+$s3->drawLine(40, -69);
+$s3->movePenTo(-52, -140);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-63, -140);
+$s3->drawLine(-69, 40);
+$s3->drawLine(89, 124);
+$s3->drawCurve(19, -16, 23, -8);
+$s3->drawLine(1, 0);
+$s3->movePenTo(-148, -24);
+$s3->setLeftFill();
+$s3->setRightFill(0xff, 0xff, 0xff, 0xb3);
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-2, 24);
+$s3->drawLine(2, 24);
+$s3->drawLine(-151, 16);
+$s3->drawLine(0, -80);
+$s3->drawLine(151, 16);
+$s3->movePenTo(-141, 53);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-139, 62);
+$s3->drawLine(40, 70);
+$s3->drawLine(124, -89);
+$s3->drawLine(-25, -43);
+$s3->movePenTo(-95, 117);
+$s3->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s3->setRightFill();
+#$s3->setLine(0,0,0,0);
+$s3->drawLine(-89, 123);
+$s3->drawLine(69, 40);
+$s3->drawLine(62, -138);
+$s3->drawCurve(-23, -9, -19, -16);
+
+### Shape 4 ###
+$s4 = new SWF::Shape();
+$s4->movePenTo(25, -147);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(16, -153);
+$s4->drawLine(-81, 0);
+$s4->drawLine(16, 152);
+$s4->drawLine(23, -1);
+$s4->drawLine(25, 2);
+$s4->drawLine(1, 0);
+$s4->movePenTo(116, -94);
+$s4->setLeftFill(0xff, 0xff, 0xff);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawCurve(16, 19, 8, 22);
+$s4->drawLine(0, 1);
+$s4->drawLine(140, -63);
+$s4->drawLine(-40, -69);
+$s4->drawLine(-124, 89);
+$s4->drawLine(0, 1);
+$s4->movePenTo(185, -240);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-69, -40);
+$s4->drawLine(-63, 140);
+$s4->drawLine(41, 25);
+$s4->drawLine(91, -125);
+$s4->movePenTo(148, -24);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(2, 24);
+$s4->drawLine(-2, 24);
+$s4->drawLine(152, 16);
+$s4->drawLine(0, -80);
+$s4->drawLine(-152, 16);
+$s4->movePenTo(280, 116);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-140, -63);
+$s4->drawCurve(-8, 22, -16, 20);
+$s4->drawLine(124, 90);
+$s4->drawLine(40, -69);
+$s4->movePenTo(95, 116);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-41, 25);
+$s4->drawLine(-1, 0);
+$s4->drawLine(63, 139);
+$s4->drawLine(69, -40);
+$s4->drawLine(-90, -124);
+$s4->movePenTo(24, 149);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-25, 2);
+$s4->drawLine(-23, -2);
+$s4->drawLine(-16, 151);
+$s4->drawLine(81, 0);
+$s4->drawLine(-16, -151);
+$s4->drawLine(-1, 0);
+$s4->movePenTo(-239, -184);
+$s4->setLeftFill();
+$s4->setRightFill(0xff, 0xff, 0xff, 0xb3);
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(123, 89);
+$s4->drawCurve(-17, 19, -8, 23);
+$s4->drawLine(-138, -62);
+$s4->drawLine(40, -69);
+$s4->movePenTo(-53, -140);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-62, -140);
+$s4->drawLine(-69, 40);
+$s4->drawLine(89, 124);
+$s4->drawCurve(19, -16, 23, -8);
+$s4->movePenTo(-148, -24);
+$s4->setLeftFill();
+$s4->setRightFill(0xff, 0xff, 0xff, 0xa6);
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-2, 24);
+$s4->drawLine(2, 24);
+$s4->drawLine(0, 1);
+$s4->drawLine(-152, 15);
+$s4->drawLine(0, -80);
+$s4->drawLine(152, 16);
+$s4->movePenTo(-141, 53);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-139, 63);
+$s4->drawLine(40, 69);
+$s4->drawLine(124, -89);
+$s4->drawLine(-25, -43);
+$s4->movePenTo(-95, 117);
+$s4->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s4->setRightFill();
+#$s4->setLine(0,0,0,0);
+$s4->drawLine(-89, 123);
+$s4->drawLine(69, 40);
+$s4->drawLine(62, -138);
+$s4->drawCurve(-23, -9, -19, -16);
+
+### Shape 5 ###
+$s5 = new SWF::Shape();
+$s5->movePenTo(25, -147);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(15, -153);
+$s5->drawLine(-80, 0);
+$s5->drawLine(16, 152);
+$s5->drawLine(23, -1);
+$s5->drawLine(25, 2);
+$s5->drawLine(1, 0);
+$s5->movePenTo(95, -115);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(90, -124);
+$s5->drawLine(-69, -41);
+$s5->drawLine(-63, 140);
+$s5->drawLine(41, 25);
+$s5->drawLine(1, 0);
+$s5->movePenTo(140, -53);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(140, -62);
+$s5->drawLine(-40, -69);
+$s5->drawLine(-124, 89);
+$s5->drawLine(0, 1);
+$s5->drawLine(24, 41);
+$s5->movePenTo(148, -24);
+$s5->setLeftFill(0xff, 0xff, 0xff);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(2, 24);
+$s5->drawLine(-2, 24);
+$s5->drawLine(0, 1);
+$s5->drawLine(152, 15);
+$s5->drawLine(0, -80);
+$s5->drawLine(-152, 16);
+$s5->movePenTo(280, 115);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-140, -62);
+$s5->drawCurve(-8, 22, -16, 20);
+$s5->drawLine(124, 90);
+$s5->drawLine(40, -70);
+$s5->movePenTo(95, 116);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-41, 25);
+$s5->drawLine(62, 139);
+$s5->drawLine(69, -40);
+$s5->drawLine(-90, -124);
+$s5->movePenTo(24, 149);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-25, 2);
+$s5->drawLine(-23, -2);
+$s5->drawLine(-16, 151);
+$s5->drawLine(80, 0);
+$s5->drawLine(-15, -151);
+$s5->drawLine(-1, 0);
+$s5->movePenTo(-239, -185);
+$s5->setLeftFill();
+$s5->setRightFill(0xff, 0xff, 0xff, 0xa6);
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(123, 90);
+$s5->drawCurve(-17, 19, -8, 23);
+$s5->drawLine(-139, -62);
+$s5->drawLine(41, -70);
+$s5->movePenTo(-52, -140);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-63, -139);
+$s5->drawLine(-69, 40);
+$s5->drawLine(89, 123);
+$s5->drawCurve(19, -16, 23, -8);
+$s5->drawLine(1, 0);
+$s5->movePenTo(-148, -24);
+$s5->setLeftFill();
+$s5->setRightFill(0xff, 0xff, 0xff, 0x99);
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-2, 24);
+$s5->drawLine(2, 24);
+$s5->drawLine(0, 1);
+$s5->drawLine(-152, 15);
+$s5->drawLine(0, -80);
+$s5->drawLine(152, 16);
+$s5->movePenTo(-141, 53);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawLine(-138, 62);
+$s5->drawLine(40, 70);
+$s5->drawLine(123, -89);
+$s5->drawLine(-25, -43);
+$s5->movePenTo(-53, 142);
+$s5->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s5->setRightFill();
+#$s5->setLine(0,0,0,0);
+$s5->drawCurve(-23, -9, -19, -16);
+$s5->drawLine(-89, 123);
+$s5->drawLine(69, 40);
+$s5->drawLine(62, -138);
+
+### Shape 6 ###
+$s6 = new SWF::Shape();
+$s6->movePenTo(25, -147);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(15, -152);
+$s6->drawLine(-80, 0);
+$s6->drawLine(16, 151);
+$s6->drawLine(23, -1);
+$s6->drawLine(25, 2);
+$s6->drawLine(1, 0);
+$s6->movePenTo(95, -115);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(90, -125);
+$s6->drawLine(-69, -40);
+$s6->drawLine(-63, 140);
+$s6->drawLine(41, 25);
+$s6->drawLine(1, 0);
+$s6->movePenTo(140, -52);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(140, -63);
+$s6->drawLine(-40, -69);
+$s6->drawLine(-124, 89);
+$s6->drawLine(0, 1);
+$s6->drawLine(24, 41);
+$s6->drawLine(0, 1);
+$s6->movePenTo(148, -24);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(2, 24);
+$s6->drawLine(-2, 24);
+$s6->drawLine(152, 16);
+$s6->drawLine(0, -80);
+$s6->drawLine(-152, 16);
+$s6->movePenTo(280, 116);
+$s6->setLeftFill(0xff, 0xff, 0xff);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-140, -63);
+$s6->drawCurve(-8, 22, -16, 20);
+$s6->drawLine(124, 90);
+$s6->drawLine(40, -69);
+$s6->movePenTo(95, 116);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-41, 25);
+$s6->drawLine(62, 139);
+$s6->drawLine(69, -40);
+$s6->drawLine(-90, -124);
+$s6->movePenTo(24, 149);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-25, 2);
+$s6->drawLine(-23, -2);
+$s6->drawLine(-16, 151);
+$s6->drawLine(80, 0);
+$s6->drawLine(-15, -151);
+$s6->drawLine(-1, 0);
+$s6->movePenTo(-240, -184);
+$s6->setLeftFill();
+$s6->setRightFill(0xff, 0xff, 0xff, 0x99);
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(124, 89);
+$s6->drawCurve(-17, 19, -8, 23);
+$s6->drawLine(-139, -62);
+$s6->drawLine(40, -69);
+$s6->movePenTo(-52, -140);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-63, -140);
+$s6->drawLine(-69, 40);
+$s6->drawLine(89, 124);
+$s6->drawCurve(19, -16, 23, -8);
+$s6->drawLine(1, 0);
+$s6->movePenTo(-148, -24);
+$s6->setLeftFill();
+$s6->setRightFill(0xff, 0xff, 0xff, 0x8d);
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-2, 24);
+$s6->drawLine(2, 24);
+$s6->drawLine(-151, 16);
+$s6->drawLine(0, -80);
+$s6->drawLine(151, 16);
+$s6->movePenTo(-95, 117);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-89, 123);
+$s6->drawLine(69, 40);
+$s6->drawLine(62, -138);
+$s6->drawCurve(-23, -9, -19, -16);
+$s6->movePenTo(-141, 54);
+$s6->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s6->setRightFill();
+#$s6->setLine(0,0,0,0);
+$s6->drawLine(-139, 62);
+$s6->drawLine(41, 69);
+$s6->drawLine(123, -89);
+$s6->drawLine(-25, -42);
+
+### Shape 7 ###
+$s7 = new SWF::Shape();
+$s7->movePenTo(25, -147);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(16, -153);
+$s7->drawLine(-81, 0);
+$s7->drawLine(16, 152);
+$s7->drawLine(23, -1);
+$s7->drawLine(25, 2);
+$s7->drawLine(1, 0);
+$s7->movePenTo(95, -115);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(90, -124);
+$s7->drawLine(-70, -40);
+$s7->drawLine(-62, 139);
+$s7->drawLine(41, 25);
+$s7->drawLine(1, 0);
+$s7->movePenTo(140, -52);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(140, -63);
+$s7->drawLine(-40, -69);
+$s7->drawLine(-124, 90);
+$s7->drawLine(24, 41);
+$s7->drawLine(0, 1);
+$s7->movePenTo(300, -40);
+$s7->setLeftFill();
+$s7->setRightFill(0xff, 0xff, 0xff, 0xcc);
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(0, 81);
+$s7->drawLine(-152, -16);
+$s7->drawLine(0, -1);
+$s7->drawLine(2, -24);
+$s7->drawLine(-2, -24);
+$s7->drawLine(152, -16);
+$s7->movePenTo(280, 116);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(-140, -63);
+$s7->drawCurve(-8, 22, -16, 20);
+$s7->drawLine(124, 90);
+$s7->drawLine(40, -69);
+$s7->movePenTo(95, 116);
+$s7->setLeftFill(0xff, 0xff, 0xff);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(-41, 25);
+$s7->drawLine(-1, 0);
+$s7->drawLine(63, 139);
+$s7->drawLine(69, -40);
+$s7->drawLine(-90, -124);
+$s7->movePenTo(24, 149);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(-25, 2);
+$s7->drawLine(-23, -2);
+$s7->drawLine(-16, 151);
+$s7->drawLine(81, 0);
+$s7->drawLine(-16, -151);
+$s7->drawLine(-1, 0);
+$s7->movePenTo(-239, -184);
+$s7->setLeftFill();
+$s7->setRightFill(0xff, 0xff, 0xff, 0x8d);
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(123, 89);
+$s7->drawCurve(-17, 19, -8, 23);
+$s7->drawLine(-138, -62);
+$s7->drawLine(40, -69);
+$s7->movePenTo(-53, -140);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(-62, -140);
+$s7->drawLine(-69, 40);
+$s7->drawLine(89, 124);
+$s7->drawCurve(19, -16, 23, -8);
+$s7->movePenTo(-300, -40);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(0, 81);
+$s7->drawLine(152, -16);
+$s7->drawLine(0, -1);
+$s7->drawLine(-2, -24);
+$s7->drawLine(2, -24);
+$s7->drawLine(-152, -16);
+$s7->movePenTo(-141, 53);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawLine(-139, 63);
+$s7->drawLine(40, 69);
+$s7->drawLine(124, -89);
+$s7->drawLine(-25, -43);
+$s7->movePenTo(-53, 142);
+$s7->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s7->setRightFill();
+#$s7->setLine(0,0,0,0);
+$s7->drawCurve(-23, -9, -19, -16);
+$s7->drawLine(-89, 123);
+$s7->drawLine(69, 40);
+$s7->drawLine(62, -138);
+
+### Shape 8 ###
+$s8 = new SWF::Shape();
+$s8->movePenTo(25, -147);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(15, -153);
+$s8->drawLine(-80, 0);
+$s8->drawLine(16, 152);
+$s8->drawLine(23, -1);
+$s8->drawLine(25, 2);
+$s8->drawLine(1, 0);
+$s8->movePenTo(95, -115);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(90, -124);
+$s8->drawLine(-69, -41);
+$s8->drawLine(-63, 140);
+$s8->drawLine(41, 25);
+$s8->drawLine(1, 0);
+$s8->movePenTo(140, -52);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(140, -63);
+$s8->drawLine(-40, -69);
+$s8->drawLine(-124, 90);
+$s8->drawLine(24, 41);
+$s8->drawLine(0, 1);
+$s8->movePenTo(300, -40);
+$s8->setLeftFill();
+$s8->setRightFill(0xff, 0xff, 0xff, 0xc0);
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(0, 80);
+$s8->drawLine(-152, -15);
+$s8->drawLine(0, -1);
+$s8->drawLine(2, -24);
+$s8->drawLine(-2, -24);
+$s8->drawLine(152, -16);
+$s8->movePenTo(240, 185);
+$s8->setLeftFill();
+$s8->setRightFill(0xff, 0xff, 0xff, 0xcc);
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(-124, -90);
+$s8->drawCurve(16, -20, 8, -22);
+$s8->drawLine(140, 63);
+$s8->drawLine(-40, 69);
+$s8->movePenTo(95, 116);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(-41, 25);
+$s8->drawLine(62, 139);
+$s8->drawLine(69, -40);
+$s8->drawLine(-90, -124);
+$s8->movePenTo(24, 149);
+$s8->setLeftFill(0xff, 0xff, 0xff);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(-25, 2);
+$s8->drawLine(-23, -2);
+$s8->drawLine(-16, 151);
+$s8->drawLine(80, 0);
+$s8->drawLine(-15, -151);
+$s8->drawLine(-1, 0);
+$s8->movePenTo(-280, -115);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(139, 62);
+$s8->drawCurve(8, -23, 17, -19);
+$s8->drawLine(-124, -89);
+$s8->drawLine(-40, 69);
+$s8->movePenTo(-52, -140);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(-63, -139);
+$s8->drawLine(-69, 40);
+$s8->drawLine(89, 123);
+$s8->drawCurve(19, -16, 23, -8);
+$s8->drawLine(1, 0);
+$s8->movePenTo(-300, -40);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(0, 80);
+$s8->drawLine(152, -15);
+$s8->drawLine(0, -1);
+$s8->drawLine(-2, -24);
+$s8->drawLine(2, -24);
+$s8->drawLine(-152, -16);
+$s8->movePenTo(-140, 54);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawLine(-140, 62);
+$s8->drawLine(40, 69);
+$s8->drawLine(124, -89);
+$s8->drawCurve(-17, -20, -7, -22);
+$s8->movePenTo(-53, 142);
+$s8->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s8->setRightFill();
+#$s8->setLine(0,0,0,0);
+$s8->drawCurve(-23, -9, -19, -16);
+$s8->drawLine(-89, 123);
+$s8->drawLine(69, 40);
+$s8->drawLine(62, -138);
+
+### Shape 9 ###
+$s9 = new SWF::Shape();
+$s9->movePenTo(25, -147);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(15, -152);
+$s9->drawLine(-80, 0);
+$s9->drawLine(16, 151);
+$s9->drawLine(23, -1);
+$s9->drawLine(25, 2);
+$s9->drawLine(1, 0);
+$s9->movePenTo(95, -115);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(90, -125);
+$s9->drawLine(-69, -40);
+$s9->drawLine(-63, 140);
+$s9->drawLine(41, 25);
+$s9->drawLine(1, 0);
+$s9->movePenTo(140, -52);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(140, -63);
+$s9->drawLine(-40, -69);
+$s9->drawLine(-124, 89);
+$s9->drawLine(0, 1);
+$s9->drawLine(24, 41);
+$s9->drawLine(0, 1);
+$s9->movePenTo(300, -40);
+$s9->setLeftFill();
+$s9->setRightFill(0xff, 0xff, 0xff, 0xb3);
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(0, 80);
+$s9->drawLine(-152, -15);
+$s9->drawLine(0, -1);
+$s9->drawLine(2, -24);
+$s9->drawLine(-2, -24);
+$s9->drawLine(152, -16);
+$s9->movePenTo(240, 185);
+$s9->setLeftFill();
+$s9->setRightFill(0xff, 0xff, 0xff, 0xc0);
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-124, -90);
+$s9->drawCurve(16, -20, 8, -22);
+$s9->drawLine(140, 63);
+$s9->drawLine(-40, 69);
+$s9->movePenTo(95, 116);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-41, 25);
+$s9->drawLine(-1, 0);
+$s9->drawLine(62, 139);
+$s9->drawLine(70, -40);
+$s9->drawLine(-90, -124);
+$s9->movePenTo(24, 149);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-25, 2);
+$s9->drawLine(-23, -2);
+$s9->drawLine(-16, 151);
+$s9->drawLine(80, 0);
+$s9->drawLine(-15, -151);
+$s9->drawLine(-1, 0);
+$s9->movePenTo(-280, -115);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(139, 62);
+$s9->drawCurve(8, -23, 17, -19);
+$s9->drawLine(-124, -89);
+$s9->drawLine(-40, 69);
+$s9->movePenTo(-53, -140);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-62, -140);
+$s9->drawLine(-70, 41);
+$s9->drawLine(90, 123);
+$s9->drawCurve(19, -16, 23, -8);
+$s9->movePenTo(-300, -40);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(0, 80);
+$s9->drawLine(152, -15);
+$s9->drawLine(0, -1);
+$s9->drawLine(-2, -24);
+$s9->drawLine(2, -24);
+$s9->drawLine(-152, -16);
+$s9->movePenTo(-95, 117);
+$s9->setLeftFill(0xff, 0xff, 0xff);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-89, 123);
+$s9->drawLine(69, 40);
+$s9->drawLine(62, -138);
+$s9->drawCurve(-23, -9, -19, -16);
+$s9->movePenTo(-141, 54);
+$s9->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s9->setRightFill();
+#$s9->setLine(0,0,0,0);
+$s9->drawLine(-139, 62);
+$s9->drawLine(41, 69);
+$s9->drawLine(123, -89);
+$s9->drawLine(-25, -42);
+
+### Shape 10 ###
+$s10 = new SWF::Shape();
+$s10->movePenTo(95, -115);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(90, -124);
+$s10->drawLine(-70, -40);
+$s10->drawLine(-62, 139);
+$s10->drawLine(41, 25);
+$s10->drawLine(1, 0);
+$s10->movePenTo(140, -52);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(140, -63);
+$s10->drawLine(-40, -69);
+$s10->drawLine(-124, 90);
+$s10->drawLine(24, 41);
+$s10->drawLine(0, 1);
+$s10->movePenTo(300, -40);
+$s10->setLeftFill();
+$s10->setRightFill(0xff, 0xff, 0xff, 0xa6);
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(0, 81);
+$s10->drawLine(-152, -16);
+$s10->drawLine(0, -1);
+$s10->drawLine(2, -24);
+$s10->drawLine(-2, -24);
+$s10->drawLine(152, -16);
+$s10->movePenTo(40, -300);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-80, 0);
+$s10->drawLine(16, 152);
+$s10->drawLine(23, -1);
+$s10->drawLine(25, 2);
+$s10->drawLine(16, -153);
+$s10->movePenTo(240, 185);
+$s10->setLeftFill();
+$s10->setRightFill(0xff, 0xff, 0xff, 0xb3);
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-124, -90);
+$s10->drawCurve(16, -20, 8, -22);
+$s10->drawLine(140, 62);
+$s10->drawLine(-40, 70);
+$s10->movePenTo(95, 116);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-41, 25);
+$s10->drawLine(-1, 0);
+$s10->drawLine(63, 139);
+$s10->drawLine(69, -40);
+$s10->drawLine(-90, -124);
+$s10->movePenTo(24, 149);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-25, 2);
+$s10->drawLine(-23, -2);
+$s10->drawLine(-16, 151);
+$s10->drawLine(80, 0);
+$s10->drawLine(-15, -151);
+$s10->drawLine(-1, 0);
+$s10->movePenTo(-280, -115);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(139, 62);
+$s10->drawCurve(8, -23, 16, -19);
+$s10->drawLine(-123, -89);
+$s10->drawLine(-40, 69);
+$s10->movePenTo(-53, -140);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-62, -140);
+$s10->drawLine(-69, 40);
+$s10->drawLine(89, 124);
+$s10->drawCurve(19, -16, 23, -8);
+$s10->movePenTo(-300, -40);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(0, 81);
+$s10->drawLine(152, -16);
+$s10->drawLine(0, -1);
+$s10->drawLine(-2, -24);
+$s10->drawLine(2, -24);
+$s10->drawLine(-152, -16);
+$s10->movePenTo(-141, 53);
+$s10->setLeftFill(0xff, 0xff, 0xff);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawLine(-139, 63);
+$s10->drawLine(40, 69);
+$s10->drawLine(124, -89);
+$s10->drawLine(-25, -43);
+$s10->movePenTo(-53, 142);
+$s10->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s10->setRightFill();
+#$s10->setLine(0,0,0,0);
+$s10->drawCurve(-23, -9, -19, -16);
+$s10->drawLine(-89, 123);
+$s10->drawLine(69, 40);
+$s10->drawLine(62, -138);
+
+### Shape 11 ###
+$s11 = new SWF::Shape();
+$s11->movePenTo(25, -147);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(15, -153);
+$s11->drawLine(-80, 0);
+$s11->drawLine(16, 152);
+$s11->drawLine(23, -1);
+$s11->drawLine(25, 2);
+$s11->drawLine(1, 0);
+$s11->movePenTo(95, -115);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(90, -125);
+$s11->drawLine(-70, -40);
+$s11->drawLine(-62, 140);
+$s11->drawLine(41, 25);
+$s11->drawLine(1, 0);
+$s11->movePenTo(140, -52);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0x8d);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(140, -63);
+$s11->drawLine(-40, -69);
+$s11->drawLine(-124, 90);
+$s11->drawLine(24, 41);
+$s11->drawLine(0, 1);
+$s11->movePenTo(300, -40);
+$s11->setLeftFill();
+$s11->setRightFill(0xff, 0xff, 0xff, 0x99);
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(0, 80);
+$s11->drawLine(-152, -15);
+$s11->drawLine(0, -1);
+$s11->drawLine(2, -24);
+$s11->drawLine(-2, -24);
+$s11->drawLine(152, -16);
+$s11->movePenTo(240, 185);
+$s11->setLeftFill();
+$s11->setRightFill(0xff, 0xff, 0xff, 0xa6);
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(-124, -90);
+$s11->drawCurve(16, -20, 8, -22);
+$s11->drawLine(140, 63);
+$s11->drawLine(-40, 69);
+$s11->movePenTo(53, 141);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(62, 139);
+$s11->drawLine(70, -40);
+$s11->drawLine(-90, -124);
+$s11->drawLine(-41, 25);
+$s11->drawLine(-1, 0);
+$s11->movePenTo(24, 149);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(-25, 2);
+$s11->drawLine(-23, -2);
+$s11->drawLine(-16, 151);
+$s11->drawLine(80, 0);
+$s11->drawLine(-15, -151);
+$s11->drawLine(-1, 0);
+$s11->movePenTo(-280, -115);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(139, 62);
+$s11->drawCurve(8, -23, 17, -19);
+$s11->drawLine(-124, -89);
+$s11->drawLine(-40, 69);
+$s11->movePenTo(-53, -140);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(-62, -140);
+$s11->drawLine(-69, 40);
+$s11->drawLine(89, 124);
+$s11->drawCurve(19, -16, 23, -8);
+$s11->movePenTo(-300, -40);
+$s11->setLeftFill(0xff, 0xff, 0xff);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(0, 80);
+$s11->drawLine(152, -15);
+$s11->drawLine(0, -1);
+$s11->drawLine(-2, -24);
+$s11->drawLine(2, -24);
+$s11->drawLine(-152, -16);
+$s11->movePenTo(-95, 117);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(-90, 123);
+$s11->drawLine(70, 40);
+$s11->drawLine(62, -138);
+$s11->drawCurve(-23, -9, -19, -16);
+$s11->movePenTo(-140, 54);
+$s11->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s11->setRightFill();
+#$s11->setLine(0,0,0,0);
+$s11->drawLine(-140, 62);
+$s11->drawLine(40, 69);
+$s11->drawLine(124, -89);
+$s11->drawCurve(-17, -20, -7, -22);
+
+### Shape 12 ###
+$s12 = new SWF::Shape();
+$s12->movePenTo(95, -115);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(90, -125);
+$s12->drawLine(-69, -40);
+$s12->drawLine(-63, 140);
+$s12->drawLine(41, 25);
+$s12->drawLine(1, 0);
+$s12->movePenTo(140, -53);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(140, -62);
+$s12->drawLine(-40, -70);
+$s12->drawLine(-124, 90);
+$s12->drawLine(0, 1);
+$s12->drawLine(24, 41);
+$s12->movePenTo(300, -40);
+$s12->setLeftFill();
+$s12->setRightFill(0xff, 0xff, 0xff, 0x8d);
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(0, 80);
+$s12->drawLine(-152, -15);
+$s12->drawLine(0, -1);
+$s12->drawLine(2, -24);
+$s12->drawLine(-2, -24);
+$s12->drawLine(152, -16);
+$s12->movePenTo(40, -300);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-80, 0);
+$s12->drawLine(16, 152);
+$s12->drawLine(23, -1);
+$s12->drawLine(25, 2);
+$s12->drawLine(16, -153);
+$s12->movePenTo(240, 185);
+$s12->setLeftFill();
+$s12->setRightFill(0xff, 0xff, 0xff, 0x99);
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-124, -90);
+$s12->drawCurve(16, -20, 8, -22);
+$s12->drawLine(140, 63);
+$s12->drawLine(-40, 69);
+$s12->movePenTo(95, 116);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-41, 25);
+$s12->drawLine(-1, 0);
+$s12->drawLine(62, 139);
+$s12->drawLine(70, -40);
+$s12->drawLine(-90, -124);
+$s12->movePenTo(40, 300);
+$s12->setLeftFill();
+$s12->setRightFill(0xff, 0xff, 0xff, 0xb3);
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-80, 0);
+$s12->drawLine(16, -151);
+$s12->drawLine(23, 2);
+$s12->drawLine(25, -2);
+$s12->drawLine(16, 151);
+$s12->movePenTo(-280, -115);
+$s12->setLeftFill(0xff, 0xff, 0xff);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(139, 62);
+$s12->drawCurve(8, -23, 17, -19);
+$s12->drawLine(-124, -89);
+$s12->drawLine(-40, 69);
+$s12->movePenTo(-53, -140);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-62, -140);
+$s12->drawLine(-70, 41);
+$s12->drawLine(90, 123);
+$s12->drawCurve(19, -16, 23, -8);
+$s12->movePenTo(-300, -40);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(0, 80);
+$s12->drawLine(152, -15);
+$s12->drawLine(0, -1);
+$s12->drawLine(-2, -24);
+$s12->drawLine(2, -24);
+$s12->drawLine(-152, -16);
+$s12->movePenTo(-95, 117);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-89, 123);
+$s12->drawLine(69, 40);
+$s12->drawLine(62, -138);
+$s12->drawCurve(-23, -9, -19, -16);
+$s12->movePenTo(-141, 53);
+$s12->setLeftFill(0xff, 0xff, 0xff, 0xcc);
+$s12->setRightFill();
+#$s12->setLine(0,0,0,0);
+$s12->drawLine(-139, 62);
+$s12->drawLine(40, 70);
+$s12->drawLine(124, -89);
+$s12->drawLine(-25, -43);
+
+### Shape 13 ###
+$s13 = new SWF::Shape();
+$s13->movePenTo(140, -52);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0x73);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(140, -63);
+$s13->drawLine(-40, -69);
+$s13->drawLine(-124, 89);
+$s13->drawLine(0, 1);
+$s13->drawLine(24, 41);
+$s13->drawLine(0, 1);
+$s13->movePenTo(94, -115);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0x66);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(91, -125);
+$s13->drawLine(-69, -40);
+$s13->drawLine(-63, 140);
+$s13->drawLine(41, 25);
+$s13->movePenTo(148, -24);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0x80);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(2, 24);
+$s13->drawLine(-2, 24);
+$s13->drawLine(152, 16);
+$s13->drawLine(0, -80);
+$s13->drawLine(-152, 16);
+$s13->movePenTo(40, -300);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0x5a);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-80, 0);
+$s13->drawLine(16, 152);
+$s13->drawLine(23, -1);
+$s13->drawLine(25, 2);
+$s13->drawLine(16, -153);
+$s13->movePenTo(240, 185);
+$s13->setLeftFill();
+$s13->setRightFill(0xff, 0xff, 0xff, 0x8d);
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-124, -90);
+$s13->drawCurve(16, -20, 8, -22);
+$s13->drawLine(140, 62);
+$s13->drawLine(-40, 70);
+$s13->movePenTo(95, 116);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0x99);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-41, 25);
+$s13->drawLine(-1, 0);
+$s13->drawLine(63, 139);
+$s13->drawLine(69, -40);
+$s13->drawLine(-90, -124);
+$s13->movePenTo(24, 149);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0xa6);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-25, 2);
+$s13->drawLine(-23, -2);
+$s13->drawLine(-16, 151);
+$s13->drawLine(80, 0);
+$s13->drawLine(-15, -151);
+$s13->drawLine(-1, 0);
+$s13->movePenTo(-280, -115);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0xe6);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(139, 62);
+$s13->drawCurve(8, -23, 16, -19);
+$s13->drawLine(-123, -89);
+$s13->drawLine(-40, 69);
+$s13->movePenTo(-53, -140);
+$s13->setLeftFill(0xff, 0xff, 0xff);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-62, -140);
+$s13->drawLine(-69, 40);
+$s13->drawLine(89, 124);
+$s13->drawCurve(19, -16, 23, -8);
+$s13->movePenTo(-148, -24);
+$s13->setLeftFill();
+$s13->setRightFill(0xff, 0xff, 0xff, 0xcc);
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-2, 24);
+$s13->drawLine(2, 24);
+$s13->drawLine(0, 1);
+$s13->drawLine(-152, 15);
+$s13->drawLine(0, -80);
+$s13->drawLine(152, 16);
+$s13->movePenTo(-95, 117);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0xb3);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-89, 123);
+$s13->drawLine(69, 40);
+$s13->drawLine(62, -138);
+$s13->drawCurve(-23, -9, -19, -16);
+$s13->movePenTo(-141, 53);
+$s13->setLeftFill(0xff, 0xff, 0xff, 0xc0);
+$s13->setRightFill();
+#$s13->setLine(0,0,0,0);
+$s13->drawLine(-139, 63);
+$s13->drawLine(40, 69);
+$s13->drawLine(124, -89);
+$s13->drawLine(-25, -43);
+
+### MovieClip 1 ###
+$s1 = new SWF::MovieClip(); # 14 frames
+$s1->add(new SWF::Action("
+this.gotoAndPlay(random(12) + 1);
+;
+
+"));
+$j1 = $s1->add($s2);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 1
+
+$s1->nextFrame(); # end of clip frame 2
+
+$s1->remove($j1);
+$j1 = $s1->add($s3);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 3
+
+$s1->remove($j1);
+$j1 = $s1->add($s4);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 4
+
+$s1->remove($j1);
+$j1 = $s1->add($s5);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 5
+
+$s1->remove($j1);
+$j1 = $s1->add($s6);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 6
+
+$s1->remove($j1);
+$j1 = $s1->add($s7);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 7
+
+$s1->remove($j1);
+$j1 = $s1->add($s8);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 8
+
+$s1->remove($j1);
+$j1 = $s1->add($s9);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 9
+
+$s1->remove($j1);
+$j1 = $s1->add($s10);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 10
+
+$s1->remove($j1);
+$j1 = $s1->add($s11);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 11
+
+$s1->remove($j1);
+$j1 = $s1->add($s12);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 12
+
+$s1->remove($j1);
+$j1 = $s1->add($s13);
+$j1->multColor(1.000000, 1.000000, 1.000000);
+$j1->addColor(0x00, 0x00, 0x00);
+$s1->nextFrame(); # end of clip frame 13
+
+$s1->add(new SWF::Action("
+this.gotoAndPlay(2);
+;
+
+"));
+$s1->nextFrame(); # end of clip frame 14
+
+$s14 = new SWF::MovieClip(); # 1 frames
+$j1 = $s14->add($s1);
+$j1->scaleTo(0.666672);
+$j1->moveTo(200, 200);
+$j1->multColor(0.000000, 0.000000, 0.000000);
+$j1->addColor(0x81, 0xac, 0xdb);
+$s14->nextFrame(); # end of clip frame 1
+
+
+$i1 = $progressclip->add($s14);
+$i1->moveTo(20, 20);
+$i1->multColor(1.000000, 1.000000, 1.000000);
+$i1->addColor(0x00, 0x00, 0x00);
+$progressclip->nextFrame(); # end of frame 1
+
+
+$i1 = $movie->add($progressclip);
+$i1->scaleTo(0.5);
+$i1->moveTo(4700,2550);
+$movie->nextFrame();
+$movie->nextFrame();
+$movie->nextFrame();
+
+
+$movie->add(new SWF::Action(< 4) {
+ _root.preload.text="background";
+}
+
+
+var totalTotal = _root.getBytesTotal() + fondo.mihijo.getBytesTotal();
+var totalLoaded = _root.getBytesLoaded() + fondo.mihijo.getBytesLoaded();
+
+
+if (totalLoaded < totalTotal){
+ var percent = Math.floor(totalLoaded*100/totalTotal);
+ //_root.preload.text=percent+ "% ";
+ prevFrame();
+ play();
+} else {
+ _root.preload.text="";
+ nextFrame();
+}
+
+ENDSCRIPT
+));
+$movie->nextFrame( );
+$movie->remove($i1);
+
+$movie->add(new SWF::Action(<<"EndOfActionScript"));
+
+_root.createEmptyMovieClip("soundHolder", -14345);
+_root.soundHolder.mySound = new Sound(_root.soundHolder);
+//_root.soundHolder.mySound.loadSound("pepe.mp3", true);
+//_root.soundHolder.mySound.stop();
+
+dummyVar=(getTimer()+random(100000));
+
+if(context != undefined) {
+ context = context.toUpperCase();
+ if(context == "DEFAULT") { context=""; }
+} else {
+ context="";
+}
+
+if(nohighlight != undefined) {
+ _global.nohighlight = Number(nohighlight);
+} else {
+ _global.nohighlight = 0;
+}
+
+if(mybutton != undefined) {
+ mybutton = Number(mybutton);
+}
+
+if(restrict != undefined) {
+ _global.restrict = restrict;
+} else {
+ delete _global.restrict;
+}
+
+if(dial != undefined) {
+// dial = Number(dial);
+ dial = dial;
+ _root.logea("dial "+dial);
+} else {
+ dial = 0;
+}
+
+var archivo = "variables"+context+".txt?aldope="+dummyVar;
+
+vr = new LoadVars ();
+
+vr.onLoad = function (success)
+{
+ if (success == true) {
+ nextFrame();
+ } else {
+ with (_root['preload']) {
+ text = "Couldn't load "+archivo;
+ errorconfiguration=1;
+ multiline = true;
+ wordWrap = true;
+// border = true;
+// prevFrame();
+ }
+ stop();
+ }
+};
+
+vr.load(archivo);
+
+EndOfActionScript
+
+$movie->nextFrame();
+
+#$font_general = new SWF::Font($fuente);
+
+# Ventana INPUT del security code
+$codebox = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$g = new SWF::Gradient();
+$g->addEntry(0.000000, 0xff, 0xff, 0xff);
+$g->addEntry(0.015686, 0xe2, 0xe2, 0xe2);
+$g->addEntry(0.964706, 0x9d, 0x9d, 0x9d);
+$g->addEntry(1.000000, 0x5a, 0x5a, 0x5a);
+$f2 = $s1->addFill($g, SWFFILL_LINEAR_GRADIENT);
+$f2->scaleTo(0.24, 0.24);
+$f2->moveTo(-35, 37);
+$s1->movePenTo(2074, -1915);
+$s1->setLeftFill(0x66, 0x66, 0x66, 0x39);
+$s1->setLine(20, 0xc5, 0xc5, 0xc5, 0x39);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 32, 0, 44);
+$s1->drawLine(0, 3945);
+$s1->drawCurve(0, 44, 29, 31);
+$s1->drawCurve(30, 33, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -33);
+$s1->drawCurve(30, -31, 0, -44);
+$s1->drawLine(0, -3945);
+$s1->drawCurve(0, -44, -30, -32);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(2005, -2023);
+$s1->setLeftFill($f2);
+$s1->setLine(20, 0x66, 0x66, 0x66);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 33, 0, 44);
+$s1->drawLine(0, 3966);
+$s1->drawCurve(0, 44, 29, 32);
+$s1->drawCurve(30, 32, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -32);
+$s1->drawCurve(30, -32, 0, -44);
+$s1->drawLine(0, -3966);
+$s1->drawCurve(0, -44, -30, -33);
+
+### MovieClip 2 ###
+$s2 = new SWF::MovieClip(); # 1 frames
+$s2->add($s1);
+$s2->nextFrame(); # end of clip frame 1
+
+
+$i1 = $codebox->add($s2);
+$i1->scaleTo(1.427750, 0.540558);
+$i1->moveTo(5509, 3957);
+$i1->setName('inputCode');
+
+### Shape 3 ###
+$s3 = new SWF::Shape();
+$s3->movePenTo(3094, 4290);
+$s3->setRightFill(0xcc, 0xcc, 0xcc);
+$s3->setLine(20, 0x99, 0x99, 0x99);
+$s3->drawLine(0, -580);
+$s3->drawLine(4713, 0);
+$s3->setLine(20, 0xcc, 0xcc, 0xcc);
+$s3->drawLine(0, 580);
+$s3->drawLine(-4713, 0);
+$i4 = $codebox->add($s3);
+
+$s5 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_MULTILINE | SWFTEXTFIELD_NOSELECT | SWFTEXTFIELD_USEFONT );
+$s5->setBounds(5650, 653);
+$s5->setFont($font_general);
+$s5->setHeight(320);
+$s5->setColor(0x00, 0x00, 0x00, 0xff);
+$s5->align(SWFTEXTFIELD_ALIGN_CENTER);
+$s5->setName('title');
+$s5->addString('Please enter the security code:');
+$i5 = $codebox->add($s5);
+$i5->moveTo(2704, 3067);
+
+$s6 = new SWF::TextField( SWFTEXTFIELD_PASSWORD | SWFTEXTFIELD_USEFONT );
+$s6->setBounds(4579, 398);
+$s6->setFont($font_general);
+$s6->setHeight(320);
+$s6->setColor(0x00, 0x00, 0x00, 0xff);
+$s6->align(SWFTEXTFIELD_ALIGN_LEFT);
+$i6 = $codebox->add($s6);
+$i6->moveTo(3189, 3821);
+$i6->setName('claveform');
+
+### Shape 7 ###
+$s7 = new SWF::Shape();
+$s7->movePenTo(-500, 200);
+$s7->setRightFill(0xcc, 0xcc, 0xcc);
+$s7->setLine(20, 0x99, 0x99, 0x99);
+$s7->drawLine(0, -400);
+$s7->drawLine(1000, 0);
+$s7->setLine(20, 0x00, 0x00, 0x00);
+$s7->drawLine(0, 400);
+$s7->drawLine(-1000, 0);
+
+$s8 = new SWF::Text;
+$s8->setFont($font_general);
+$s8->setHeight(280);
+$s8->setColor(0x00, 0x00, 0x33, 0xff);
+$s8->moveTo(-180,100);
+$s8->addString('OK');
+
+### Shape 9 ###
+$s9 = new SWF::Shape();
+$s9->movePenTo(-500, 200);
+$s9->setRightFill(0xcc, 0xcc, 0xcc);
+$s9->setLine(20, 0x99, 0x99, 0x99);
+$s9->drawLine(0, -400);
+$s9->drawLine(1000, 0);
+$s9->setLine(20, 0x00, 0x00, 0x00);
+$s9->drawLine(0, 400);
+$s9->drawLine(-1000, 0);
+
+$s11 = new SWF::Shape();
+$s11->movePenTo(500, -200);
+$s11->setRightFill(0xcc, 0xcc, 0xcc);
+$s11->setLine(20, 0x99, 0x99, 0x99);
+$s11->drawLine(0, 400);
+$s11->drawLine(-1000, 0);
+$s11->setLine(20, 0x00, 0x00, 0x00);
+$s11->drawLine(0, -400);
+$s11->drawLine(1000, 0);
+
+
+### Button2 13 ###
+$s13 = new SWF::Button();
+$s13->addShape($s7, SWFBUTTON_UP);
+$s13->addShape($s8, SWFBUTTON_UP);
+$s13->addShape($s9, SWFBUTTON_OVER);
+$s13->addShape($s8, SWFBUTTON_OVER);
+$s13->addShape($s11, SWFBUTTON_HIT | SWFBUTTON_DOWN);
+$s13->addShape($s8, SWFBUTTON_HIT | SWFBUTTON_DOWN);
+$a = new SWF::Action("
+_global.claveingresada = this.claveform.text;
+_root.LocalSave('auth','clave',_global.claveingresada);
+this._visible = false;
+_root.envia_comando('bogus', 0, 0);
+;
+");
+$s13->addAction($a, SWFBUTTON_MOUSEUP);
+
+$i7 = $codebox->add($s13);
+$i7->moveTo(5454, 4725);
+
+### Shape 14 ###
+$s14 = new SWF::Shape();
+$s14->movePenTo(228, -228);
+$s14->setRightFill(0x99, 0x99, 0x99);
+$s14->setLine(20, 0x00, 0x00, 0x00);
+$s14->drawLine(0, 456);
+$s14->drawLine(-456, 0);
+$s14->setLine(20, 0xcc, 0xcc, 0xcc);
+$s14->drawLine(0, -456);
+$s14->drawLine(456, 0);
+$s14->setLeftFill();
+$s14->setRightFill();
+$s14->movePenTo(120, 132);
+$s14->setLine(60, 0xcc, 0xcc, 0xcc);
+$s14->drawLine(-120, -117);
+$s14->drawLine(-112, 121);
+$s14->movePenTo(-120, -102);
+$s14->drawLine(120, 117);
+$s14->drawLine(112, -120);
+$s14->setLeftFill();
+$s14->setRightFill();
+$s14->movePenTo(120, 102);
+$s14->setLine(60, 0x00, 0x00, 0x00);
+$s14->drawLine(-120, -117);
+$s14->drawLine(-112, 121);
+$s14->movePenTo(-120, -132);
+$s14->drawLine(120, 117);
+$s14->drawLine(112, -120);
+
+### Shape 15 ###
+$s15 = new SWF::Shape();
+$s15->movePenTo(228, -228);
+$s15->setRightFill(0x99, 0x99, 0x99);
+$s15->setLine(20, 0x00, 0x00, 0x00);
+$s15->drawLine(0, 456);
+$s15->drawLine(-456, 0);
+$s15->setLine(20, 0xcc, 0xcc, 0xcc);
+$s15->drawLine(0, -456);
+$s15->drawLine(456, 0);
+$s15->setLeftFill();
+$s15->setRightFill();
+$s15->movePenTo(120, 132);
+$s15->setLine(60, 0xcc, 0xcc, 0xcc);
+$s15->drawLine(-120, -117);
+$s15->drawLine(-112, 121);
+$s15->movePenTo(-120, -102);
+$s15->drawLine(120, 117);
+$s15->drawLine(112, -120);
+$s15->setLeftFill();
+$s15->setRightFill();
+$s15->movePenTo(120, 102);
+$s15->setLine(60, 0x00, 0x00, 0x00);
+$s15->drawLine(-120, -117);
+$s15->drawLine(-112, 121);
+$s15->movePenTo(-120, -132);
+$s15->drawLine(120, 117);
+$s15->drawLine(112, -120);
+
+### Shape 16 ###
+$s16 = new SWF::Shape();
+$s16->movePenTo(228, -228);
+$s16->setRightFill(0x99, 0x99, 0x99);
+$s16->setLine(20, 0x00, 0x00, 0x00);
+$s16->drawLine(0, 456);
+$s16->drawLine(-456, 0);
+$s16->setLine(20, 0xcc, 0xcc, 0xcc);
+$s16->drawLine(0, -456);
+$s16->drawLine(456, 0);
+$s16->setLeftFill();
+$s16->setRightFill();
+$s16->movePenTo(120, 132);
+$s16->setLine(60, 0xcc, 0xcc, 0xcc);
+$s16->drawLine(-120, -117);
+$s16->drawLine(-112, 121);
+$s16->movePenTo(-120, -102);
+$s16->drawLine(120, 117);
+$s16->drawLine(112, -120);
+$s16->setLeftFill();
+$s16->setRightFill();
+$s16->movePenTo(122, 120);
+$s16->setLine(60, 0x00, 0x00, 0x00);
+$s16->drawLine(-120, -117);
+$s16->drawLine(-112, 121);
+$s16->movePenTo(-118, -114);
+$s16->drawLine(120, 117);
+$s16->drawLine(112, -120);
+
+### Button2 17 ###
+$s17 = new SWF::Button();
+$s17->addShape($s14, SWFBUTTON_UP);
+$s17->addShape($s15, SWFBUTTON_OVER);
+$s17->addShape($s16, SWFBUTTON_DOWN);
+$s17->addShape($s16, SWFBUTTON_HIT);
+$a = new SWF::Action("
+this._visible = false;
+");
+$s17->addAction($a, SWFBUTTON_MOUSEUP);
+$i10 = $codebox->add($s17);
+$i10->scaleTo(0.657883);
+$i10->moveTo(8118, 3100);
+
+
+$codebox->nextFrame(); # end of frame 1
+
+# FIN DE Ventana INPUT del security code
+
+$i1=$movie->add($codebox);
+$i1->scaleTo(0.5);
+$i1->setDepth(101);
+$i1->moveTo(2400,500);
+$i1->setName("codebox");
+
+$fin = $movie->add($dropbox1); # XXXX
+$fin->setName("selectbox1");
+$fin->moveTo(8000,60);
+#
+# Number Dialer Catcher
+#
+# We can control movie playback from javascript, but just
+# the frame number. This bogus movieclip sets a global variable
+# with the number constructed from javascript while setting
+# the frame of the movieclip.
+#
+$numdial = new SWF::Sprite();
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="0";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 1
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="1";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 2
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="2";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 3
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="3";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 4
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="4";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 5
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="5";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 6
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="6";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 7
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="7";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 8
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="8";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 9
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar+="9";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 10
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ _global.numero_a_discar="";
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 11
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ if(_root.dial!=0) {
+ _root.logea("Dial Number "+_global.numero_a_discar);
+ _root.logea("Restrict "+_global.restrict);
+ _root.logea("Dialing from "+_root.dial);
+ if(_global.restrict != undefined)
+ {
+ _root.envia_comando("dial",_global.restrict,_global.numero_a_discar);
+ } else {
+ _root.envia_comando("dial",_root.dial,_global.numero_a_discar);
+ }
+ } else {
+ _root.logea("Dial not defined in index.html "+numero_a_discar);
+ }
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 13
+$numdial->add(new SWF::Action(<<"EndOfActionScript"));
+ stop();
+EndOfActionScript
+$numdial->nextFrame(); # End Frame 13
+
+$i1 = $movie->add($numdial);
+$i1->moveTo(-2000,-2000);
+$i1->setName("numdial");
+
+
+
+
+# Detail Window movieclip
+
+$detail_window = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$g = new SWF::Gradient();
+$g->addEntry(0.000000, 0xff, 0xff, 0xff);
+$g->addEntry(0.015686, 0xe2, 0xe2, 0xe2);
+$g->addEntry(0.964706, 0x9d, 0x9d, 0x9d);
+$g->addEntry(1.000000, 0x5a, 0x5a, 0x5a);
+$f2 = $s1->addFill($g, SWFFILL_LINEAR_GRADIENT);
+$f2->scaleTo(0.24, 0.24);
+$f2->moveTo(-35, 37);
+$s1->movePenTo(2074, -1915);
+$s1->setLeftFill(0x66, 0x66, 0x66, 0x39);
+$s1->setLine(20, 0xc5, 0xc5, 0xc5, 0x39);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 32, 0, 44);
+$s1->drawLine(0, 3945);
+$s1->drawCurve(0, 44, 29, 31);
+$s1->drawCurve(30, 33, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -33);
+$s1->drawCurve(30, -31, 0, -44);
+$s1->drawLine(0, -3945);
+$s1->drawCurve(0, -44, -30, -32);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->setLine(0,0,0,0);
+$s1->movePenTo(2005, -2023);
+$s1->setLeftFill($f2);
+$s1->setLine(20, 0x66, 0x66, 0x66);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 33, 0, 44);
+$s1->drawLine(0, 3966);
+$s1->drawCurve(0, 44, 29, 32);
+$s1->drawCurve(30, 32, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -32);
+$s1->drawCurve(30, -32, 0, -44);
+$s1->drawLine(0, -3966);
+$s1->drawCurve(0, -44, -30, -33);
+
+$s3 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT );
+$s3->setBounds(3112, 377);
+$s3->setFont($font_general);
+$s3->setHeight(280);
+$s3->setColor(0x33, 0x33, 0x33, 0xff);
+$s3->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s3->setName('title');
+$s3->addString('Last call details:');
+
+$s5 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT );
+$s5->setBounds(907, 330);
+$s5->setFont($font_general);
+$s5->setHeight(260);
+$s5->setColor(0x33, 0x33, 0x33, 0xff);
+$s5->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s5->setName('label');
+$s5->addString('From:');
+
+$s6 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT );
+$s6->setBounds(1097, 330);
+$s6->setFont($font_general);
+$s6->setHeight(260);
+$s6->setColor(0x33, 0x33, 0x33, 0xff);
+$s6->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s6->setName('duration_label');
+$s6->addString('Duration:');
+
+$s7 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT );
+$s7->setBounds(2517, 330);
+$s7->setFont($font_general);
+$s7->setHeight(260);
+$s7->setColor(0x33, 0x33, 0x33, 0xff);
+$s7->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s7->setName('clid');
+
+$s8 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_USEFONT );
+$s8->setBounds(2116, 330);
+$s8->setFont($font_general);
+$s8->setHeight(260);
+$s8->setColor(0x33, 0x33, 0x33, 0xff);
+$s8->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s8->setName('duration');
+
+### Shape 9 ###
+$s9 = new SWF::Shape();
+$s9->movePenTo(142, -141);
+$s9->setRightFill(0x33, 0x33, 0x33);
+$s9->drawCurve(58, 58, 0, 83);
+$s9->drawCurve(0, 83, -58, 59);
+$s9->drawCurve(-59, 58, -83, 0);
+$s9->drawCurve(-83, 0, -58, -58);
+$s9->drawCurve(-59, -59, 0, -83);
+$s9->drawCurve(0, -83, 59, -58);
+$s9->drawCurve(58, -59, 83, 0);
+$s9->drawCurve(83, 0, 59, 59);
+$s9->setLeftFill();
+$s9->setRightFill();
+$s9->setLine(0,0,0,0);
+$s9->movePenTo(-43, -137);
+$s9->setRightFill(0xff, 0xff, 0xff);
+$s9->drawLine(192, 136);
+$s9->drawLine(-192, 139);
+$s9->drawLine(0, -67);
+$s9->drawLine(-66, -1);
+$s9->drawLine(0, -143);
+$s9->drawLine(66, 0);
+$s9->drawLine(0, -64);
+
+### Button2 10 ###
+$s10 = new SWF::Button();
+$s10->addShape($s9, SWFBUTTON_HIT | SWFBUTTON_DOWN | SWFBUTTON_OVER | SWFBUTTON_UP);
+$a = new SWF::Action("
+_root.superdetails._visible = true;
+_root.detail._visible = false;
+//_root.superdetails.tab1.gotoAndStop(1);
+//_root.superdetails.tab2.gotoAndStop(2);
+
+ if(_global.superdetailstexttab1 == undefined) {
+ _global.superdetailstexttab1 = 'no data';
+ }
+ if(_global.superdetailstexttab1 == 'no data') {
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ }
+");
+$s10->addAction($a, SWFBUTTON_MOUSEUP);
+
+### Shape 11 ###
+$s11 = new SWF::Shape();
+$s11->movePenTo(228, -228);
+$s11->setRightFill(0x99, 0x99, 0x99);
+$s11->setLine(20, 0x00, 0x00, 0x00);
+$s11->drawLine(0, 456);
+$s11->drawLine(-456, 0);
+$s11->setLine(20, 0xcc, 0xcc, 0xcc);
+$s11->drawLine(0, -456);
+$s11->drawLine(456, 0);
+$s11->setLeftFill();
+$s11->setRightFill();
+$s11->setLine(0,0,0,0);
+$s11->movePenTo(120, 132);
+$s11->setLine(60, 0xcc, 0xcc, 0xcc);
+$s11->drawLine(-120, -117);
+$s11->drawLine(-112, 121);
+$s11->movePenTo(-120, -102);
+$s11->drawLine(120, 117);
+$s11->drawLine(112, -120);
+$s11->setLeftFill();
+$s11->setRightFill();
+$s11->setLine(0,0,0,0);
+$s11->movePenTo(120, 102);
+$s11->setLine(60, 0x00, 0x00, 0x00);
+$s11->drawLine(-120, -117);
+$s11->drawLine(-112, 121);
+$s11->movePenTo(-120, -132);
+$s11->drawLine(120, 117);
+$s11->drawLine(112, -120);
+
+### Shape 12 ###
+$s12 = new SWF::Shape();
+$s12->movePenTo(228, -228);
+$s12->setRightFill(0x99, 0x99, 0x99);
+$s12->setLine(20, 0x00, 0x00, 0x00);
+$s12->drawLine(0, 456);
+$s12->drawLine(-456, 0);
+$s12->setLine(20, 0xcc, 0xcc, 0xcc);
+$s12->drawLine(0, -456);
+$s12->drawLine(456, 0);
+$s12->setLeftFill();
+$s12->setRightFill();
+$s12->setLine(0,0,0,0);
+$s12->movePenTo(120, 132);
+$s12->setLine(60, 0xcc, 0xcc, 0xcc);
+$s12->drawLine(-120, -117);
+$s12->drawLine(-112, 121);
+$s12->movePenTo(-120, -102);
+$s12->drawLine(120, 117);
+$s12->drawLine(112, -120);
+$s12->setLeftFill();
+$s12->setRightFill();
+$s12->setLine(0,0,0,0);
+$s12->movePenTo(120, 102);
+$s12->setLine(60, 0x00, 0x00, 0x00);
+$s12->drawLine(-120, -117);
+$s12->drawLine(-112, 121);
+$s12->movePenTo(-120, -132);
+$s12->drawLine(120, 117);
+$s12->drawLine(112, -120);
+
+### Shape 13 ###
+$s13 = new SWF::Shape();
+$s13->movePenTo(228, -228);
+$s13->setRightFill(0x99, 0x99, 0x99);
+$s13->setLine(20, 0x00, 0x00, 0x00);
+$s13->drawLine(0, 456);
+$s13->drawLine(-456, 0);
+$s13->setLine(20, 0xcc, 0xcc, 0xcc);
+$s13->drawLine(0, -456);
+$s13->drawLine(456, 0);
+$s13->setLeftFill();
+$s13->setRightFill();
+$s13->setLine(0,0,0,0);
+$s13->movePenTo(120, 132);
+$s13->setLine(60, 0xcc, 0xcc, 0xcc);
+$s13->drawLine(-120, -117);
+$s13->drawLine(-112, 121);
+$s13->movePenTo(-120, -102);
+$s13->drawLine(120, 117);
+$s13->drawLine(112, -120);
+$s13->setLeftFill();
+$s13->setRightFill();
+$s13->setLine(0,0,0,0);
+$s13->movePenTo(122, 120);
+$s13->setLine(60, 0x00, 0x00, 0x00);
+$s13->drawLine(-120, -117);
+$s13->drawLine(-112, 121);
+$s13->movePenTo(-118, -114);
+$s13->drawLine(120, 117);
+$s13->drawLine(112, -120);
+
+### Button2 14 ###
+$s14 = new SWF::Button();
+$s14->addShape($s11, SWFBUTTON_UP);
+$s14->addShape($s12, SWFBUTTON_OVER);
+$s14->addShape($s13, SWFBUTTON_DOWN);
+$s14->addShape($s13, SWFBUTTON_HIT);
+$a = new SWF::Action("
+_root.detail._visible = false;
+this._visible = false;
+_root.superdetails._visible = false;
+
+");
+$s14->addAction($a, SWFBUTTON_MOUSEUP);
+
+$j2 = $detail_window->add($s1);
+$j2->scaleTo(0.950256, 0.391327);
+$j2->moveTo(2036, 737);
+$j3 = $detail_window->add($s3);
+$j3->moveTo(163, 37);
+$j4 = $detail_window->add($s5);
+$j4->moveTo(207, 523);
+$j5 = $detail_window->add($s6);
+$j5->moveTo(207, 979);
+$j6 = $detail_window->add($s7);
+$j6->moveTo(1402, 526);
+$j7 = $detail_window->add($s8);
+$j7->moveTo(1404, 995);
+$j8 = $detail_window->add($s10);
+$j8->scaleTo(0.800003);
+$j8->moveTo(3746, 1267);
+$j11 = $detail_window->add($s14);
+$j11->scaleTo(0.561401);
+$j11->moveTo(3720, 180);
+$detail_window->nextFrame(); # end of clip frame 1
+
+$i1=$movie->add($detail_window);
+$i1->scaleTo(0.5);
+$i1->setName("detail");
+
+
+
+# Superdetail window
+$superdetails = new SWF::Sprite();
+$s1 = new SWF::Shape();
+$g = new SWF::Gradient();
+$g->addEntry(0.000000, 0xff, 0xff, 0xff);
+$g->addEntry(0.015686, 0xe2, 0xe2, 0xe2);
+$g->addEntry(0.964706, 0x9d, 0x9d, 0x9d);
+$g->addEntry(1.000000, 0x5a, 0x5a, 0x5a);
+$f2 = $s1->addFill($g, SWFFILL_LINEAR_GRADIENT);
+$f2->scaleTo(0.25, 0.25);
+$f2->moveTo(-35, 37);
+$s1->movePenTo(2074, -1915);
+$s1->setLeftFill(0x66, 0x66, 0x66, 0x39);
+$s1->setLine(20, 0xc5, 0xc5, 0xc5, 0x39);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 32, 0, 44);
+$s1->drawLine(0, 3945);
+$s1->drawCurve(0, 44, 29, 31);
+$s1->drawCurve(30, 33, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -33);
+$s1->drawCurve(30, -31, 0, -44);
+$s1->drawLine(0, -3945);
+$s1->drawCurve(0, -44, -30, -32);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->setLine(0,0,0,0);
+$s1->movePenTo(2005, -2023);
+$s1->setLeftFill($f2);
+$s1->setLine(20, 0x66, 0x66, 0x66);
+$s1->drawCurve(-29, -31, -41, 0);
+$s1->drawLine(-3939, 0);
+$s1->drawCurve(-41, 0, -30, 31);
+$s1->drawCurve(-29, 33, 0, 44);
+$s1->drawLine(0, 3966);
+$s1->drawCurve(0, 44, 29, 32);
+$s1->drawCurve(30, 32, 41, 0);
+$s1->drawLine(3939, 0);
+$s1->drawCurve(41, 0, 29, -32);
+$s1->drawCurve(30, -32, 0, -44);
+$s1->drawLine(0, -3966);
+$s1->drawCurve(0, -44, -30, -33);
+
+$s3 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_MULTILINE | SWFTEXTFIELD_USEFONT );
+$s3->setBounds(4939, 4740);
+$s3->setFont($font_general);
+$s3->setHeight(260);
+$s3->setColor(0x00, 0x00, 0x00, 0xff);
+$s3->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s3->setName('texto');
+
+### Shape 4 ###
+$s4 = new SWF::Shape();
+$s4->movePenTo(228, -228);
+$s4->setRightFill(0x99, 0x99, 0x99);
+$s4->setLine(20, 0x00, 0x00, 0x00);
+$s4->drawLine(0, 456);
+$s4->drawLine(-456, 0);
+$s4->setLine(20, 0xcc, 0xcc, 0xcc);
+$s4->drawLine(0, -456);
+$s4->drawLine(456, 0);
+$s4->setLeftFill();
+$s4->setRightFill();
+$s4->setLine(0,0,0,0);
+$s4->movePenTo(120, 132);
+$s4->setLine(60, 0xcc, 0xcc, 0xcc);
+$s4->drawLine(-120, -117);
+$s4->drawLine(-112, 121);
+$s4->movePenTo(-120, -102);
+$s4->drawLine(120, 117);
+$s4->drawLine(112, -120);
+$s4->setLeftFill();
+$s4->setRightFill();
+$s4->setLine(0,0,0,0);
+$s4->movePenTo(120, 102);
+$s4->setLine(60, 0x00, 0x00, 0x00);
+$s4->drawLine(-120, -117);
+$s4->drawLine(-112, 121);
+$s4->movePenTo(-120, -132);
+$s4->drawLine(120, 117);
+$s4->drawLine(112, -120);
+
+### Shape 5 ###
+$s5 = new SWF::Shape();
+$s5->movePenTo(228, -228);
+$s5->setRightFill(0x99, 0x99, 0x99);
+$s5->setLine(20, 0x00, 0x00, 0x00);
+$s5->drawLine(0, 456);
+$s5->drawLine(-456, 0);
+$s5->setLine(20, 0xcc, 0xcc, 0xcc);
+$s5->drawLine(0, -456);
+$s5->drawLine(456, 0);
+$s5->setLeftFill();
+$s5->setRightFill();
+$s5->setLine(0,0,0,0);
+$s5->movePenTo(120, 132);
+$s5->setLine(60, 0xcc, 0xcc, 0xcc);
+$s5->drawLine(-120, -117);
+$s5->drawLine(-112, 121);
+$s5->movePenTo(-120, -102);
+$s5->drawLine(120, 117);
+$s5->drawLine(112, -120);
+$s5->setLeftFill();
+$s5->setRightFill();
+$s5->setLine(0,0,0,0);
+$s5->movePenTo(120, 102);
+$s5->setLine(60, 0x00, 0x00, 0x00);
+$s5->drawLine(-120, -117);
+$s5->drawLine(-112, 121);
+$s5->movePenTo(-120, -132);
+$s5->drawLine(120, 117);
+$s5->drawLine(112, -120);
+
+### Shape 6 ###
+$s6 = new SWF::Shape();
+$s6->movePenTo(228, -228);
+$s6->setRightFill(0x99, 0x99, 0x99);
+$s6->setLine(20, 0x00, 0x00, 0x00);
+$s6->drawLine(0, 456);
+$s6->drawLine(-456, 0);
+$s6->setLine(20, 0xcc, 0xcc, 0xcc);
+$s6->drawLine(0, -456);
+$s6->drawLine(456, 0);
+$s6->setLeftFill();
+$s6->setRightFill();
+$s6->setLine(0,0,0,0);
+$s6->movePenTo(120, 132);
+$s6->setLine(60, 0xcc, 0xcc, 0xcc);
+$s6->drawLine(-120, -117);
+$s6->drawLine(-112, 121);
+$s6->movePenTo(-120, -102);
+$s6->drawLine(120, 117);
+$s6->drawLine(112, -120);
+$s6->setLeftFill();
+$s6->setRightFill();
+$s6->setLine(0,0,0,0);
+$s6->movePenTo(122, 120);
+$s6->setLine(60, 0x00, 0x00, 0x00);
+$s6->drawLine(-120, -117);
+$s6->drawLine(-112, 121);
+$s6->movePenTo(-118, -114);
+$s6->drawLine(120, 117);
+$s6->drawLine(112, -120);
+
+### Button2 7 ###
+$s7 = new SWF::Button();
+$s7->addShape($s4, SWFBUTTON_UP);
+$s7->addShape($s5, SWFBUTTON_OVER);
+$s7->addShape($s6, SWFBUTTON_DOWN);
+$s7->addShape($s6, SWFBUTTON_HIT);
+$a = new SWF::Action("
+this._visible = false;
+_root.detail._visible = false;
+
+");
+$s7->addAction($a, SWFBUTTON_MOUSEUP);
+
+
+$s8 = new SWF::Shape();
+$s8->movePenTo(228, -228);
+$s8->setRightFill(0xdd, 0xdd, 0xdd);
+$s8->setLine(40, 0xdd, 0xdd, 0xdd);
+$s8->drawLine(-1640, 0);
+$s8->setLine(40, 0x00, 0x00, 0x00);
+$s8->drawLine(0, -600);
+$s8->setLine(40, 0x00, 0x00, 0x00);
+$s8->drawLine(1640, 0);
+$s8->setLine(40, 0x00, 0x00, 0x00);
+$s8->drawLine(0, 600);
+
+$s8b = new SWF::Shape();
+$s8b->movePenTo(228, -228);
+$s8b->setRightFill(0xdd, 0xdd, 0xdd);
+$s8b->setLine(40, 0x00, 0x00, 0x00);
+$s8b->drawLine(-1640, 0);
+$s8b->setLine(40, 0x00, 0x00, 0x00);
+$s8b->drawLine(0, -600);
+$s8b->setLine(40, 0x00, 0x00, 0x00);
+$s8b->drawLine(1640, 0);
+$s8b->setLine(40, 0x00, 0x00, 0x00);
+$s8b->drawLine(0, 600);
+
+$s8a = new SWF::Action("
+stop();
+onRelease = function() {
+ var tab = this._name.substring(3,4);
+ if(tab == 1) {
+ gotoAndStop(1);
+ _parent.tab2.gotoAndStop(2);
+ _parent.texto = _global.superdetailstexttab1;
+ } else {
+ gotoAndStop(1);
+ _parent.tab1.gotoAndStop(2);
+ _parent.texto = _global.superdetailstexttab2;
+ }
+};
+
+");
+
+
+$fs3 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_NOSELECT | SWFTEXTFIELD_USEFONT );
+$fs3->setBounds(939, 200);
+$fs3->setName('titlefs3');
+$fs3->setFont($font_general);
+$fs3->setHeight(220);
+$fs3->setColor(0x00, 0x00, 0x00, 0xff);
+$fs3->align(SWFTEXTFIELD_ALIGN_LEFT);
+$fs3->addString('Queue');
+
+$fs2 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_NOSELECT | SWFTEXTFIELD_USEFONT );
+$fs2->setBounds(939, 200);
+$fs2->setName('titlefs2');
+$fs2->setFont($font_general);
+$fs2->setHeight(220);
+$fs2->setColor(0x00, 0x00, 0x00, 0xff);
+$fs2->align(SWFTEXTFIELD_ALIGN_LEFT);
+$fs2->addString('Call');
+
+$sptab = new SWF::Sprite();
+$sptab->add($s8);
+$sptab->add($s8a);
+$sptab->nextFrame();
+$sptab->add($s8b);
+$sptab->add($s8a);
+$sptab->nextFrame();
+
+
+$s9 = new SWF::Shape();
+$s9->movePenTo(1, 1);
+$s9->setRightFill(0xdd, 0xdd, 0xdd);
+$s9->setLine(40, 0x00, 0x00, 0x00);
+$s9->drawLine(-8000, 0);
+$s9->setLine(40, 0x00, 0x00, 0x00);
+$s9->drawLine(0, -7700);
+$s9->setLine(40, 0x00, 0x00, 0x00);
+$s9->drawLine(8000, 0);
+$s9->setLine(40, 0x00, 0x00, 0x00);
+$s9->drawLine(0, 7700);
+
+
+
+
+$j2 = $superdetails->add($s1);
+$j2->scaleTo(1.349503, 1.391388);
+
+$j5 = $superdetails->add($s9);
+$j5->scaleTo(0.657898);
+$j5->moveTo(2565, 2700);
+
+$j5 = $superdetails->add($sptab);
+$j5->scaleTo(0.657898);
+$j5->moveTo(-1740, -2214);
+$j5->setName("tab1");
+
+$j5 = $superdetails->add($sptab);
+$j5->scaleTo(0.657898);
+$j5->moveTo(-620, -2214);
+$j5->setName("tab2");
+
+$j3 = $superdetails->add($s3);
+$j3->moveTo(-2540, -2200);
+$j3->setName('textos');
+
+$j4 = $superdetails->add($s7);
+$j4->scaleTo(0.657898);
+$j4->moveTo(2472, -2610);
+
+$ia = $superdetails->add($fs2);
+$ia->moveTo(-2580,-2680);
+
+$ia = $superdetails->add($fs3);
+$ia->moveTo(-1460,-2680);
+
+$superdetails->nextFrame(); # end of clip frame 1
+
+$i1 = $movie->add($superdetails);
+$i1->scaleTo(0.5);
+$i1->setName("superdetails");
+$i1->moveTo(4900,3000);
+
+
+
+$ventana_debug = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(120, -120);
+$s1->setRightFill(0x99, 0xcc, 0xcc, 0x03);
+$s1->drawLine(0, 240);
+$s1->drawLine(-240, 0);
+$s1->drawLine(0, -240);
+$s1->drawLine(240, 0);
+
+### Button2 3 ###
+$s3 = new SWF::Button();
+$s3->addShape($s1, SWFBUTTON_HIT | SWFBUTTON_DOWN | SWFBUTTON_OVER | SWFBUTTON_UP);
+$a = new SWF::Action("
+beginDrag(this, 0);
+var este = this.getDepth();
+var aquel = _level0.codebox.getDepth();
+
+if(aquel > este)
+{
+ swapDepths(_level0.codebox);
+ ;
+}
+
+");
+$s3->addAction($a, SWFBUTTON_MOUSEDOWN);
+$a = new SWF::Action("
+endDrag();
+
+");
+$s3->addAction($a, SWFBUTTON_MOUSEUPOUTSIDE | SWFBUTTON_MOUSEUP);
+
+### Shape 4 ###
+$s4 = new SWF::Shape();
+$g = new SWF::Gradient();
+$g->addEntry(0.000000, 0xff, 0xff, 0xff);
+$g->addEntry(0.015686, 0xe2, 0xe2, 0xe2);
+$g->addEntry(0.964706, 0x9d, 0x9d, 0x9d);
+$g->addEntry(1.000000, 0x5a, 0x5a, 0x5a);
+$f2 = $s4->addFill($g, SWFFILL_LINEAR_GRADIENT);
+$f2->scaleTo(0.25, 0.25);
+$f2->moveTo(-35, 37);
+$s4->movePenTo(2074, -1915);
+$s4->setLeftFill(0x66, 0x66, 0x66, 0x39);
+$s4->setLine(20, 0xc5, 0xc5, 0xc5, 0x39);
+$s4->drawCurve(-29, -31, -41, 0);
+$s4->drawLine(-3939, 0);
+$s4->drawCurve(-41, 0, -30, 31);
+$s4->drawCurve(-29, 32, 0, 44);
+$s4->drawLine(0, 3945);
+$s4->drawCurve(0, 44, 29, 31);
+$s4->drawCurve(30, 33, 41, 0);
+$s4->drawLine(3939, 0);
+$s4->drawCurve(41, 0, 29, -33);
+$s4->drawCurve(30, -31, 0, -44);
+$s4->drawLine(0, -3945);
+$s4->drawCurve(0, -44, -30, -32);
+$s4->setLeftFill();
+$s4->setRightFill();
+$s4->setLine(0,0,0,0);
+$s4->movePenTo(2005, -2023);
+$s4->setLeftFill($f2);
+$s4->setLine(20, 0x66, 0x66, 0x66);
+$s4->drawCurve(-29, -31, -41, 0);
+$s4->drawLine(-3939, 0);
+$s4->drawCurve(-41, 0, -30, 31);
+$s4->drawCurve(-29, 33, 0, 44);
+$s4->drawLine(0, 3966);
+$s4->drawCurve(0, 44, 29, 32);
+$s4->drawCurve(30, 32, 41, 0);
+$s4->drawLine(3939, 0);
+$s4->drawCurve(41, 0, 29, -32);
+$s4->drawCurve(30, -32, 0, -44);
+$s4->drawLine(0, -3966);
+$s4->drawCurve(0, -44, -30, -33);
+
+$s6 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_NOSELECT | SWFTEXTFIELD_USEFONT );
+$s6->setBounds(8104, 398);
+$s6->setFont($font_general);
+$s6->setHeight(320);
+$s6->setColor(0x00, 0x00, 0x00, 0xff);
+$s6->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s6->setName("title");
+$s6->addString('Debug Window');
+
+### Shape 7 ###
+$s7 = new SWF::Shape();
+$s7->movePenTo(228, -228);
+$s7->setRightFill(0x99, 0x99, 0x99);
+$s7->setLine(20, 0x00, 0x00, 0x00);
+$s7->drawLine(0, 456);
+$s7->drawLine(-456, 0);
+$s7->setLine(20, 0xcc, 0xcc, 0xcc);
+$s7->drawLine(0, -456);
+$s7->drawLine(456, 0);
+$s7->setLeftFill();
+$s7->setRightFill();
+$s7->setLine(0,0,0,0);
+$s7->movePenTo(120, 132);
+$s7->setLine(60, 0xcc, 0xcc, 0xcc);
+$s7->drawLine(-120, -117);
+$s7->drawLine(-112, 121);
+$s7->movePenTo(-120, -102);
+$s7->drawLine(120, 117);
+$s7->drawLine(112, -120);
+$s7->setLeftFill();
+$s7->setRightFill();
+$s7->setLine(0,0,0,0);
+$s7->movePenTo(120, 102);
+$s7->setLine(60, 0x00, 0x00, 0x00);
+$s7->drawLine(-120, -117);
+$s7->drawLine(-112, 121);
+$s7->movePenTo(-120, -132);
+$s7->drawLine(120, 117);
+$s7->drawLine(112, -120);
+
+### Shape 8 ###
+$s8 = new SWF::Shape();
+$s8->movePenTo(228, -228);
+$s8->setRightFill(0x99, 0x99, 0x99);
+$s8->setLine(20, 0x00, 0x00, 0x00);
+$s8->drawLine(0, 456);
+$s8->drawLine(-456, 0);
+$s8->setLine(20, 0xcc, 0xcc, 0xcc);
+$s8->drawLine(0, -456);
+$s8->drawLine(456, 0);
+$s8->setLeftFill();
+$s8->setRightFill();
+$s8->setLine(0,0,0,0);
+$s8->movePenTo(120, 132);
+$s8->setLine(60, 0xcc, 0xcc, 0xcc);
+$s8->drawLine(-120, -117);
+$s8->drawLine(-112, 121);
+$s8->movePenTo(-120, -102);
+$s8->drawLine(120, 117);
+$s8->drawLine(112, -120);
+$s8->setLeftFill();
+$s8->setRightFill();
+$s8->setLine(0,0,0,0);
+$s8->movePenTo(120, 102);
+$s8->setLine(60, 0x00, 0x00, 0x00);
+$s8->drawLine(-120, -117);
+$s8->drawLine(-112, 121);
+$s8->movePenTo(-120, -132);
+$s8->drawLine(120, 117);
+$s8->drawLine(112, -120);
+
+### Shape 9 ###
+$s9 = new SWF::Shape();
+$s9->movePenTo(228, -228);
+$s9->setRightFill(0x99, 0x99, 0x99);
+$s9->setLine(20, 0x00, 0x00, 0x00);
+$s9->drawLine(0, 456);
+$s9->drawLine(-456, 0);
+$s9->setLine(20, 0xcc, 0xcc, 0xcc);
+$s9->drawLine(0, -456);
+$s9->drawLine(456, 0);
+$s9->setLeftFill();
+$s9->setRightFill();
+$s9->setLine(0,0,0,0);
+$s9->movePenTo(120, 132);
+$s9->setLine(60, 0xcc, 0xcc, 0xcc);
+$s9->drawLine(-120, -117);
+$s9->drawLine(-112, 121);
+$s9->movePenTo(-120, -102);
+$s9->drawLine(120, 117);
+$s9->drawLine(112, -120);
+$s9->setLeftFill();
+$s9->setRightFill();
+$s9->setLine(0,0,0,0);
+$s9->movePenTo(122, 120);
+$s9->setLine(60, 0x00, 0x00, 0x00);
+$s9->drawLine(-120, -117);
+$s9->drawLine(-112, 121);
+$s9->movePenTo(-118, -114);
+$s9->drawLine(120, 117);
+$s9->drawLine(112, -120);
+
+### Button2 10 ###
+$s10 = new SWF::Button();
+$s10->addShape($s7, SWFBUTTON_UP);
+$s10->addShape($s8, SWFBUTTON_OVER);
+$s10->addShape($s9, SWFBUTTON_DOWN);
+$s10->addShape($s9, SWFBUTTON_HIT);
+$a = new SWF::Action("
+this._visible = false;
+
+");
+$s10->addAction($a, SWFBUTTON_MOUSEUP);
+
+### Shape 11 ###
+$s11 = new SWF::Shape();
+$s11->movePenTo(3825, -1782);
+$s11->setRightFill(0xf0, 0xf0, 0xf0);
+$s11->setLine(20, 0x66, 0x66, 0x66);
+$s11->drawLine(0, 3620);
+$s11->drawLine(-8158, 0);
+$s11->drawLine(0, -3620);
+$s11->drawLine(8158, 0);
+
+$s13 = new SWF::TextField(SWFTEXTFIELD_NOEDIT | SWFTEXTFIELD_MULTILINE | SWFTEXTFIELD_USEFONT );
+$s13->setBounds(8000, 3606);
+$s13->setFont($font_general);
+$s13->setHeight(320);
+$s13->setColor(0x00, 0x00, 0x00, 0xff);
+$s13->align(SWFTEXTFIELD_ALIGN_LEFT);
+$s13->setRightMargin(80);
+$s13->setIndentation(40);
+$s13->setName('logcontent');
+
+### MovieClip 14 ###
+$j2 = $ventana_debug->add($s4);
+$j2->scaleTo(2.121078, 1.087326);
+$j2->moveTo(0, -87);
+$j3 = $ventana_debug->add($s3);
+$j3->scaleTo(34.419983, 1.277756);
+$j3->moveTo(-233, -2030);
+$j5 = $ventana_debug->add($s6);
+$j5->moveTo(-4323, -2220);
+$j5->setName('title');
+$j6 = $ventana_debug->add($s10);
+$j6->scaleTo(0.657898);
+$j6->moveTo(4015, -2031);
+$ventana_debug->add($s11);
+$j11 = $ventana_debug->add($s13);
+#$j11->scaleTo(1.289948, 0.945129);
+#$j11->scaleTo(1.2, 0.9);
+$j11->moveTo(-4281, -1710);
+$j11->setName('Field1');
+$ventana_debug->nextFrame(); # end of ventana_debug
+
+####################################################
+
+
+$i1=$movie->add($ventana_debug);
+$i1->scaleTo(0.5);
+$i1->setDepth(100);
+$i1->moveTo(5000,2500);
+$i1->setName("log");
+
+
+
+
+
+$ledcolor = new SWF::Sprite();
+$s1 = new SWF::Shape();
+$s1->movePenTo(524, 125);
+$s1->setLeftFill(255, 0x00, 0x00);
+$s1->drawCurve(-112, -86, -125, 0);
+$s1->drawCurve(-127, 0, -66, 86);
+$s1->drawLine(-21, 33);
+$s1->drawCurve(-38, 76, 27, 99);
+$s1->drawLine(11, 35);
+$s1->drawCurve(37, 99, 96, 73);
+$s1->drawLine(13, 10);
+$s1->drawCurve(107, 75, 118, 1);
+$s1->drawCurve(118, -1, 65, -75);
+$s1->drawLine(9, -10);
+$s1->drawCurve(66, -86, -33, -121);
+$s1->drawCurve(-33, -122, -112, -86);
+$i1 = $ledcolor->add($s1);
+$i1->scaleTo(0.5);
+$i1->moveTo(-185, -174);
+$ledcolor->nextFrame(); # end of frame 1
+
+
+$ledsombra = new SWF::Sprite();
+$s2 = new SWF::Shape();
+$s2->movePenTo(216, -124);
+$s2->setRightFill(0x00, 0x00, 0x00, 0x32);
+$s2->drawCurve(30, 58, -21, 78);
+$s2->drawLine(-8, 25);
+$s2->drawCurve(-26, 71, -68, 52);
+$s2->drawLine(-1, 1);
+$s2->drawLine(-8, 6);
+$s2->drawCurve(-77, 54, -84, 0);
+$s2->drawCurve(-94, -1, -50, -60);
+$s2->drawLine(-6, -6);
+$s2->drawLine(0, -2);
+$s2->drawCurve(-54, -68, 25, -95);
+$s2->drawCurve(23, -87, 80, -62);
+$s2->drawCurve(80, -62, 90, 1);
+$s2->drawCurve(99, -1, 52, 70);
+$s2->drawLine(0, 1);
+$s2->drawLine(18, 27);
+$s2->movePenTo(191, -146);
+$s2->setLeftFill(0x00, 0x00, 0x00, 0x32);
+$s2->setRightFill(0x00, 0x00, 0x00, 0x65);
+$s2->drawLine(16, 25);
+$s2->drawCurve(29, 57, -20, 74);
+$s2->drawLine(-7, 24);
+$s2->drawCurve(-26, 68, -66, 51);
+$s2->drawLine(0, 1);
+$s2->drawCurve(-5, 2, -4, 4);
+$s2->drawCurve(-73, 52, -82, 0);
+$s2->drawCurve(-89, -1, -49, -57);
+$s2->drawLine(-4, -7);
+$s2->drawLine(-1, -1);
+$s2->drawCurve(-52, -64, 25, -91);
+$s2->drawCurve(22, -85, 78, -59);
+$s2->drawCurve(77, -60, 87, 1);
+$s2->drawCurve(95, -1, 49, 66);
+$s2->drawLine(0, 1);
+$s2->movePenTo(184, -141);
+$s2->setLeftFill(0x00, 0x00, 0x00, 0x65);
+$s2->setRightFill(0x00, 0x00, 0x00, 0x98);
+$s2->drawLine(15, 25);
+$s2->drawCurve(28, 53, -19, 71);
+$s2->drawLine(-8, 23);
+$s2->drawLine(0, -1);
+$s2->drawCurve(-24, 67, -64, 49);
+$s2->drawLine(-9, 7);
+$s2->drawCurve(-71, 50, -79, 0);
+$s2->drawCurve(-85, -1, -46, -54);
+$s2->drawLine(-5, -6);
+$s2->drawLine(-1, -1);
+$s2->drawCurve(-48, -61, 24, -87);
+$s2->drawCurve(21, -81, 75, -58);
+$s2->drawCurve(75, -58, 84, 1);
+$s2->drawCurve(89, -1, 48, 62);
+$s2->drawLine(0, 1);
+$s2->movePenTo(177, -135);
+$s2->setLeftFill(0x00, 0x00, 0x00, 0x98);
+$s2->setRightFill(0x00, 0x00, 0x00, 0xcb);
+$s2->drawLine(14, 22);
+$s2->drawCurve(26, 52, -18, 66);
+$s2->drawLine(-7, 23);
+$s2->drawCurve(-24, 63, -61, 48);
+$s2->drawLine(-9, 6);
+$s2->drawCurve(-69, 49, -76, 0);
+$s2->drawCurve(-80, -1, -43, -51);
+$s2->drawLine(-6, -6);
+$s2->drawLine(-1, 0);
+$s2->drawCurve(-45, -59, 22, -81);
+$s2->drawCurve(21, -79, 73, -56);
+$s2->drawCurve(72, -56, 81, 1);
+$s2->drawCurve(85, -1, 45, 59);
+$s2->drawLine(0, 1);
+$s2->movePenTo(183, -108);
+$s2->setLeftFill(0x00, 0x00, 0x00, 0xcb);
+$s2->setRightFill(0x00, 0x00, 0x00);
+$s2->drawCurve(24, 47, -17, 63);
+$s2->drawLine(-6, 22);
+$s2->drawCurve(-23, 62, -60, 46);
+$s2->drawLine(-8, 5);
+$s2->drawCurve(-66, 48, -74, 0);
+$s2->drawCurve(-76, 0, -41, -49);
+$s2->drawLine(-5, -6);
+$s2->drawLine(-1, 0);
+$s2->drawCurve(-42, -55, 21, -77);
+$s2->drawCurve(21, -77, 70, -53);
+$s2->drawCurve(69, -54, 78, 1);
+$s2->drawCurve(80, -1, 43, 56);
+$s2->drawLine(13, 22);
+$i2 = $ledsombra->add($s2);
+#$i2->scaleTo(1.574982, -1.574982);
+$i2->scaleTo(0.72, -0.72);
+$i2->rotateTo(-180);
+#$i2->moveTo(369, 348);
+#$i2->moveTo(185, 174);
+$i2->multColor(1.000000, 1.000000, 1.000000, 0.351562);
+$i2->addColor(0x00, 0x00, 0x00);
+$ledsombra->nextFrame();
+
+$ledbrillo = new SWF::Sprite();
+$s4 = new SWF::Shape();
+$g = new SWF::Gradient();
+$g->addEntry(0.368627, 0x00, 0x00, 0x00, 0x00);
+$g->addEntry(0.913725, 0x00, 0x00, 0x00, 0x99);
+$f1 = $s4->addFill($g, SWFFILL_RADIAL_GRADIENT);
+$f1->skewXTo(0.234316);
+$f1->scaleTo(0.06, -0.06);
+$f1->rotateTo(165.488144);
+$f1->moveTo(383, 415);
+$g = new SWF::Gradient();
+$g->addEntry(0.000000, 0xff, 0xff, 0xff);
+$g->addEntry(0.282353, 0xff, 0xff, 0xff, 0x8d);
+$g->addEntry(1.000000, 0xff, 0xff, 0xff, 0x00);
+$f2 = $s4->addFill($g, SWFFILL_RADIAL_GRADIENT);
+$f2->skewXTo(0.234808);
+$f2->scaleTo(0.030644, -0.027754);
+$f2->rotateTo(165.465546);
+$f2->moveTo(405, 500);
+$g = new SWF::Gradient();
+$g->addEntry(0.196078, 0xff, 0xff, 0xff);
+$g->addEntry(0.921569, 0xff, 0xff, 0xff, 0x00);
+$f3 = $s4->addFill($g, SWFFILL_RADIAL_GRADIENT);
+$f3->skewXTo(0.103049);
+$f3->scaleTo(0.015, -0.009);
+$f3->rotateTo(170.450867);
+$f3->moveTo(291, 115);
+$s4->movePenTo(669, 336);
+$s4->setRightFill($f1);
+$s4->drawCurve(-34, -124, -113, -85);
+$s4->drawCurve(-110, -86, -126, 0);
+$s4->drawCurve(-126, 0, -67, 86);
+$s4->drawCurve(-66, 85, 34, 124);
+$s4->drawCurve(32, 119, 112, 88);
+$s4->drawCurve(113, 85, 126, 0);
+$s4->drawCurve(126, 0, 65, -85);
+$s4->drawCurve(65, -88, -31, -119);
+$s4->setLeftFill();
+$s4->setRightFill();
+#brillo grande inferior
+$s4->movePenTo(286, 41);
+$s4->setRightFill($f2);
+$s4->drawCurve(-126, -2, -65, 88);
+$s4->drawCurve(-65, 85, 31, 122);
+$s4->drawCurve(34, 121, 110, 86);
+$s4->drawCurve(113, 85, 126, 0);
+$s4->drawCurve(126, 0, 65, -85);
+$s4->drawCurve(67, -86, -33, -121);
+$s4->drawCurve(-32, -122, -112, -85);
+$s4->drawCurve(-113, -88, -126, 2);
+$s4->setLeftFill();
+$s4->setRightFill();
+# brillo superior
+$s4->movePenTo(184, 57);
+$s4->setRightFill($f3);
+$s4->drawCurve(-32, 24, 9, 34);
+$s4->drawCurve(9, 34, 45, 23);
+$s4->drawCurve(45, 25, 53, 0);
+$s4->drawCurve(54, 0, 32, -25);
+$s4->drawCurve(32, -23, -10, -34);
+$s4->drawCurve(-8, -34, -45, -24);
+$s4->drawCurve(-45, -24, -54, 0);
+$s4->drawCurve(-53, 0, -32, 24);
+$i6 = $ledbrillo->add($s4);
+$i6->scaleTo(0.5);
+$i6->moveTo(-185, -174);
+$ledbrillo->nextFrame();
+
+
+# Icons movieclips
+
+####### Arrow
+
+my $fle = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(5642, 3859);
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawCurve(58, 58, 0, 83);
+$s1->drawCurve(0, 83, -58, 59);
+$s1->drawCurve(-59, 58, -83, 0);
+$s1->drawCurve(-83, 0, -58, -58);
+$s1->drawCurve(-59, -59, 0, -83);
+$s1->drawCurve(0, -83, 59, -58);
+$s1->drawCurve(58, -59, 83, 0);
+$s1->drawCurve(83, 0, 59, 59);
+$s1->movePenTo(5543, 3930);
+$s1->setLeftFill(0x33, 0x33, 0x33);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawLine(66, 0);
+$s1->drawLine(0, 144);
+$s1->drawLine(-66, -1);
+$s1->drawLine(0, 65);
+$s1->drawLine(-191, -136);
+$s1->drawLine(191, -139);
+$s1->drawLine(0, 67);
+$i1 = $fle->add($s1);
+$i1->moveTo(-2750,-2000);
+$i1->scaleTo(0.5);
+$fle->nextFrame(); # end of frame 1
+$fle->remove($i1);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(5500, 3800);
+$s2->setRightFill(0x33, 0x33, 0x33);
+$s2->drawCurve(83, 0, 59, 59);
+$s2->drawCurve(58, 58, 0, 83);
+$s2->drawCurve(0, 83, -58, 59);
+$s2->drawCurve(-59, 58, -83, 0);
+$s2->drawCurve(-83, 0, -58, -58);
+$s2->drawCurve(-59, -59, 0, -83);
+$s2->drawCurve(0, -83, 59, -58);
+$s2->drawCurve(58, -59, 83, 0);
+$s2->movePenTo(5457, 3927);
+$s2->setLeftFill(0x33, 0x33, 0x33);
+$s2->setRightFill(0xff, 0xff, 0xff);
+$s2->drawLine(0, -64);
+$s2->drawLine(192, 136);
+$s2->drawLine(-192, 139);
+$s2->drawLine(0, -67);
+$s2->drawLine(-66, -1);
+$s2->drawLine(0, -143);
+$s2->drawLine(66, 0);
+$i1 = $fle->add($s2);
+$i1->moveTo(-2750,-2000);
+$i1->scaleTo(0.5);
+$fle->nextFrame(); # end of frame 2
+$fle->remove($i1);
+
+### Shape 3 ###
+$s3 = new SWF::Shape();
+$s3->movePenTo(5500, 3800);
+$s3->setRightFill(0x33, 0x33, 0x33);
+$s3->drawCurve(83, 0, 59, 59);
+$s3->drawCurve(58, 58, 0, 83);
+$s3->drawCurve(0, 83, -58, 59);
+$s3->drawCurve(-59, 58, -83, 0);
+$s3->drawCurve(-83, 0, -58, -58);
+$s3->drawCurve(-59, -59, 0, -83);
+$s3->drawCurve(0, -83, 59, -58);
+$s3->drawCurve(58, -59, 83, 0);
+$s3->movePenTo(5574, 3891);
+$s3->setLeftFill(0x33, 0x33, 0x33);
+$s3->setRightFill(0xff, 0xff, 0xff);
+$s3->drawLine(-1, 66);
+$s3->drawLine(65, 0);
+$s3->drawLine(-136, 192);
+$s3->drawLine(-139, -192);
+$s3->drawLine(67, 0);
+$s3->drawLine(0, -66);
+$s3->drawLine(144, 0);
+$i1 = $fle->add($s3);
+$i1->moveTo(-2750,-2000);
+$i1->scaleTo(0.5);
+$fle->nextFrame(); # end of frame 3
+$fle->remove($i1);
+
+
+
+
+
+
+# Icon 3 Shape
+my $s_icon2 = new SWF::Shape();
+$s_icon2->movePenTo(3339, 2660);
+$s_icon2->setRightFill(0xcc, 0xcc, 0xcc, 0x00);
+$s_icon2->drawLine(-6639, 0);
+$s_icon2->drawLine(0, -5340);
+$s_icon2->drawLine(6639, 0);
+$s_icon2->drawLine(0, 5340);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(2622, -2528);
+$s_icon2->setLeftFill(0x00, 0x00, 0x00);
+$s_icon2->drawCurve(-129, -82, -182, -26);
+$s_icon2->drawLine(-329, -25);
+$s_icon2->drawCurve(-648, -45, -912, 195);
+$s_icon2->drawCurve(-744, 158, -633, 349);
+$s_icon2->drawCurve(-748, 412, -329, 551);
+$s_icon2->drawCurve(-141, 237, -51, 287);
+$s_icon2->drawCurve(-53, 294, 58, 257);
+$s_icon2->drawCurve(62, 279, 180, 170);
+$s_icon2->drawCurve(200, 189, 319, 26);
+$s_icon2->drawCurve(216, 17, 238, -98);
+$s_icon2->drawCurve(235, -96, 173, -175);
+$s_icon2->drawCurve(184, -185, 55, -214);
+$s_icon2->drawCurve(61, -239, -116, -229);
+$s_icon2->drawCurve(-52, -105, -126, -100);
+$s_icon2->drawCurve(-62, -49, -166, -106);
+$s_icon2->drawCurve(-3, 282, -101, 178);
+$s_icon2->drawCurve(-125, 220, -251, 0);
+$s_icon2->drawCurve(111, -550, 272, -330);
+$s_icon2->drawCurve(277, -329, 620, -295);
+$s_icon2->drawCurve(993, -472, 807, -4);
+$s_icon2->drawCurve(-80, 192, -228, 70);
+$s_icon2->drawCurve(-106, 32, -335, 29);
+$s_icon2->drawCurve(-279, 25, -118, 70);
+$s_icon2->drawCurve(-172, 104, -2, 258);
+$s_icon2->drawCurve(-51, 5, -120, 41);
+$s_icon2->drawCurve(-110, 39, -59, -2);
+$s_icon2->drawCurve(-69, -4, -107, -35);
+$s_icon2->drawLine(-170, -51);
+$s_icon2->drawCurve(-196, -41, -128, 171);
+$s_icon2->drawCurve(-95, 129, 38, 131);
+$s_icon2->drawCurve(28, 96, 120, 135);
+$s_icon2->drawLine(203, 230);
+$s_icon2->drawCurve(103, 137, 3, 119);
+$s_icon2->drawCurve(4, 185, -112, 228);
+$s_icon2->drawCurve(-69, 140, -157, 226);
+$s_icon2->drawLine(-125, 142);
+$s_icon2->drawCurve(-84, 96, -4, 62);
+$s_icon2->drawCurve(-2, 71, 112, 115);
+$s_icon2->drawCurve(60, 62, 107, 92);
+$s_icon2->drawCurve(600, 600, 500, 150);
+$s_icon2->drawCurve(831, 245, 809, -555);
+$s_icon2->drawCurve(237, -169, 36, -34);
+$s_icon2->drawCurve(152, -145, -45, -132);
+$s_icon2->drawCurve(-160, 62, -299, 191);
+$s_icon2->drawCurve(-296, 188, -165, 62);
+$s_icon2->drawCurve(-374, 141, -411, -83);
+$s_icon2->drawCurve(-389, -79, -326, -256);
+$s_icon2->drawCurve(-108, -86, -212, -211);
+$s_icon2->drawCurve(-202, -200, -118, -89);
+$s_icon2->drawLine(0, -20);
+$s_icon2->drawCurve(183, -140, 118, -250);
+$s_icon2->drawCurve(115, -245, 11, -262);
+$s_icon2->drawCurve(12, -278, -114, -206);
+$s_icon2->drawCurve(-126, -229, -259, -89);
+$s_icon2->drawCurve(62, -182, 144, -25);
+$s_icon2->drawCurve(148, -25, 106, 172);
+$s_icon2->drawCurve(124, -21, 161, -65);
+$s_icon2->drawCurve(187, -75, 68, -73);
+$s_icon2->drawCurve(37, -39, 30, -107);
+$s_icon2->drawCurve(32, -118, 27, -39);
+$s_icon2->drawCurve(88, -134, 149, 2);
+$s_icon2->drawCurve(145, 3, 92, 126);
+$s_icon2->drawCurve(154, -44, 210, -119);
+$s_icon2->drawCurve(241, -136, 68, -108);
+$s_icon2->drawCurve(30, -49, 16, -93);
+$s_icon2->drawLine(21, -151);
+$s_icon2->drawCurve(-666, 0, -553, 127);
+$s_icon2->drawCurve(-597, 137, -544, 302);
+$s_icon2->drawCurve(-689, 377, -228, 437);
+$s_icon2->drawCurve(-183, 355, 0, 704);
+$s_icon2->drawCurve(369, 0, 209, -219);
+$s_icon2->drawCurve(181, -192, 81, -388);
+$s_icon2->drawCurve(213, 220, -59, 276);
+$s_icon2->drawCurve(-53, 246, -237, 183);
+$s_icon2->drawCurve(-238, 184, -270, -1);
+$s_icon2->drawCurve(-302, -2, -198, -247);
+$s_icon2->drawCurve(-232, -292, 179, -487);
+$s_icon2->drawCurve(141, -381, 296, -316);
+$s_icon2->drawCurve(363, -387, 717, -320);
+$s_icon2->drawCurve(1330, -603, 950, 93);
+$s_icon2->drawCurve(243, 22, 222, 130);
+$s_icon2->drawCurve(220, 128, 130, 192);
+$s_icon2->drawCurve(138, 204, -4, 219);
+$s_icon2->drawCurve(-5, 242, -181, 217);
+$s_icon2->drawCurve(-82, 99, -151, 23);
+$s_icon2->drawCurve(-138, 21, -158, -47);
+$s_icon2->drawCurve(-155, -46, -114, -93);
+$s_icon2->drawCurve(-122, -99, -33, -118);
+$s_icon2->drawCurve(-17, -55, 31, -76);
+$s_icon2->drawLine(56, -129);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(53, 265, 224, 122);
+$s_icon2->drawCurve(215, 117, 268, -64);
+$s_icon2->drawCurve(-38, -177, -122, -27);
+$s_icon2->drawLine(-126, -17);
+$s_icon2->drawCurve(-86, -12, -68, -34);
+$s_icon2->drawCurve(-217, -105, -63, -288);
+$s_icon2->drawCurve(-320, 171, 54, 289);
+$s_icon2->drawCurve(43, 235, 263, 245);
+$s_icon2->drawCurve(-32, -19, -244, -117);
+$s_icon2->drawCurve(-173, -83, -85, -75);
+$s_icon2->drawCurve(-45, -38, -98, -166);
+$s_icon2->drawCurve(-79, -133, -104, -36);
+$s_icon2->drawCurve(-165, -56, -79, 193);
+$s_icon2->drawCurve(-32, 79, 1, 87);
+$s_icon2->drawCurve(0, 89, 35, 55);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(26, -54, 24, -26);
+$s_icon2->drawCurve(112, -131, 75, 74);
+$s_icon2->drawLine(63, 87);
+$s_icon2->drawCurve(43, 67, 30, 29);
+$s_icon2->drawCurve(35, 37, 81, 34);
+$s_icon2->drawLine(131, 53);
+$s_icon2->drawCurve(1018, 508, 332, 841);
+$s_icon2->drawCurve(107, 286, 33, 129);
+$s_icon2->drawCurve(69, 266, -46, 159);
+$s_icon2->drawCurve(-39, 133, -133, 137);
+$s_icon2->drawCurve(-61, 63, -180, 150);
+$s_icon2->drawCurve(-374, 306, -372, 148);
+$s_icon2->drawCurve(-452, 179, -402, -76);
+$s_icon2->drawCurve(-469, -88, -484, -377);
+$s_icon2->drawLine(-405, -339);
+$s_icon2->drawCurve(-254, -217, -168, -119);
+$s_icon2->drawCurve(-80, 281, 251, 280);
+$s_icon2->drawCurve(88, 99, 154, 125);
+$s_icon2->drawLine(247, 198);
+$s_icon2->drawCurve(536, 454, 708, 42);
+$s_icon2->drawCurve(699, 41, 597, -374);
+$s_icon2->drawCurve(223, -143, 283, -294);
+$s_icon2->drawCurve(357, -370, 117, -99);
+$s_icon2->drawCurve(-95, -688, -323, -580);
+$s_icon2->drawCurve(-372, -668, -550, -263);
+$s_icon2->drawLine(179, 13);
+$s_icon2->drawLine(184, 26);
+$s_icon2->drawCurve(224, 25, 129, -78);
+$s_icon2->drawCurve(208, -128, 96, -235);
+$s_icon2->drawCurve(88, -215, -23, -261);
+$s_icon2->drawCurve(-21, -252, -117, -218);
+$s_icon2->drawCurve(-121, -225, -186, -119);
+$s_icon2->movePenTo(-782, -2506);
+$s_icon2->drawCurve(-149, -33, -83, -2);
+$s_icon2->drawCurve(-259, -6, -25, 266);
+$s_icon2->drawCurve(-290, -76, -185, 73);
+$s_icon2->drawCurve(-225, 89, 0, 294);
+$s_icon2->drawCurve(-141, -25, -128, 24);
+$s_icon2->drawCurve(-129, 24, -80, 69);
+$s_icon2->drawCurve(-187, 161, 165, 287);
+$s_icon2->drawLine(-230, 10);
+$s_icon2->drawCurve(-136, 18, -71, 65);
+$s_icon2->drawCurve(-126, 109, 28, 183);
+$s_icon2->drawCurve(28, 181, 147, 74);
+$s_icon2->drawLine(0, 20);
+$s_icon2->drawCurve(-194, 18, -117, 128);
+$s_icon2->drawCurve(-106, 116, -3, 155);
+$s_icon2->drawCurve(-2, 157, 103, 106);
+$s_icon2->drawCurve(116, 118, 203, 1);
+$s_icon2->drawLine(0, 20);
+$s_icon2->drawCurve(-208, 97, -38, 224);
+$s_icon2->drawCurve(-40, 230, 186, 139);
+$s_icon2->drawCurve(74, 54, 107, 12);
+$s_icon2->drawCurve(35, 4, 164, 0);
+$s_icon2->drawLine(-60, 137);
+$s_icon2->drawCurve(-28, 79, 11, 64);
+$s_icon2->drawCurve(29, 212, 260, 95);
+$s_icon2->drawCurve(212, 77, 236, -28);
+$s_icon2->drawCurve(179, -21, 199, -113);
+$s_icon2->drawCurve(41, -23, 301, -199);
+$s_icon2->drawCurve(-117, -134, -83, 14);
+$s_icon2->drawCurve(-75, 15, -83, 46);
+$s_icon2->drawLine(-138, 86);
+$s_icon2->drawCurve(-173, 108, -151, -15);
+$s_icon2->drawCurve(-126, -12, -90, -60);
+$s_icon2->drawCurve(-86, -57, -28, -82);
+$s_icon2->drawCurve(-30, -85, 40, -84);
+$s_icon2->drawCurve(43, -92, 117, -68);
+$s_icon2->drawLine(0, -20);
+$s_icon2->drawCurve(-701, 0, 91, -340);
+$s_icon2->drawCurve(24, -81, 83, -89);
+$s_icon2->drawCurve(100, -97, 43, -53);
+$s_icon2->drawCurve(-151, -41, -72, -29);
+$s_icon2->drawCurve(-123, -49, -64, -84);
+$s_icon2->drawCurve(-149, -193, 200, -133);
+$s_icon2->drawCurve(161, -107, 218, -3);
+$s_icon2->drawLine(0, -20);
+$s_icon2->drawCurve(-72, -45, -65, -75);
+$s_icon2->drawCurve(-215, -237, 221, -118);
+$s_icon2->drawCurve(159, -85, 292, 0);
+$s_icon2->drawLine(-82, -164);
+$s_icon2->drawCurve(-50, -100, -2, -76);
+$s_icon2->drawCurve(-2, -184, 225, -21);
+$s_icon2->drawLine(351, 25);
+$s_icon2->drawCurve(-50, -142, -4, -38);
+$s_icon2->drawCurve(-19, -292, 267, 5);
+$s_icon2->drawCurve(148, 2, 298, 85);
+$s_icon2->drawCurve(-113, -272, 214, -40);
+$s_icon2->drawCurve(100, -19, 319, 51);
+$s_icon2->drawLine(40, -120);
+$s_icon2->drawLine(-224, -45);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(2838, -1701);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawCurve(-9, -387, -364, -223);
+$s_icon2->drawCurve(-310, -190, -413, 0);
+$s_icon2->drawCurve(-688, 0, -717, 217);
+$s_icon2->drawCurve(-699, 212, -596, 377);
+$s_icon2->drawCurve(-609, 384, -171, 390);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(317, -418, 522, -307);
+$s_icon2->drawCurve(396, -235, 625, -224);
+$s_icon2->drawCurve(782, -281, 518, -12);
+$s_icon2->drawCurve(1039, -30, 257, 547);
+$s_icon2->drawCurve(64, 137, 0, 323);
+$s_icon2->drawCurve(33, -55, 5, -80);
+$s_icon2->drawCurve(3, -35, -5, -110);
+$s_icon2->movePenTo(-598, -2341);
+$s_icon2->drawCurve(-225, -62, -86, -5);
+$s_icon2->drawCurve(-200, -11, -49, 138);
+$s_icon2->drawLine(520, 40);
+$s_icon2->drawLine(40, -100);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1782, -2181);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawCurve(-965, 4, -1075, 586);
+$s_icon2->drawCurve(-670, 361, -210, 489);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(385, -610, 887, -381);
+$s_icon2->drawCurve(806, -347, 802, -2);
+$s_icon2->drawLine(20, -100);
+$s_icon2->movePenTo(-1669, -2135);
+$s_icon2->drawCurve(-97, 52, -32, 102);
+$s_icon2->drawCurve(154, -93, 165, 20);
+$s_icon2->drawCurve(126, 15, 195, 98);
+$s_icon2->drawCurve(-23, -101, -91, -64);
+$s_icon2->drawCurve(-85, -59, -111, -9);
+$s_icon2->drawCurve(-113, -8, -88, 47);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1822, -1981);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawLine(-640, 380);
+$s_icon2->drawCurve(-51, -103, -88, -29);
+$s_icon2->drawCurve(-79, -25, -90, 37);
+$s_icon2->drawCurve(-85, 35, -65, 76);
+$s_icon2->drawCurve(-66, 79, -16, 90);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(49, -114, 94, -53);
+$s_icon2->drawCurve(104, -59, 113, 52);
+$s_icon2->drawCurve(28, 15, 55, 46);
+$s_icon2->drawCurve(53, 38, 44, -2);
+$s_icon2->drawCurve(69, -4, 117, -80);
+$s_icon2->drawLine(174, -123);
+$s_icon2->drawLine(171, -101);
+$s_icon2->drawCurve(104, -75, -15, -80);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(-2338, -1501);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(83, -105, 157, -8);
+$s_icon2->drawCurve(86, -4, 194, 37);
+$s_icon2->drawCurve(-31, -85, -86, -36);
+$s_icon2->drawCurve(-78, -34, -96, 16);
+$s_icon2->drawCurve(-96, 16, -68, 56);
+$s_icon2->drawCurve(-74, 61, -11, 86);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1782, -1661);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawLine(-100, 220);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(80, -100);
+$s_icon2->drawCurve(45, 260, 236, 116);
+$s_icon2->drawCurve(218, 108, 261, -64);
+$s_icon2->drawCurve(-29, -71, -184, -32);
+$s_icon2->drawCurve(-229, -40, -38, -21);
+$s_icon2->drawCurve(-95, -50, -69, -119);
+$s_icon2->drawCurve(-69, -140, -47, -67);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(-2598, -1361);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawLine(100, 0);
+$s_icon2->drawLine(-100, -220);
+$s_icon2->drawLine(0, 220);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1242, -1541);
+$s_icon2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon2->drawLine(-60, 40);
+$s_icon2->drawLine(120, 240);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(-80, -280);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1982, -861);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawCurve(181, 126, 206, 18);
+$s_icon2->drawCurve(235, 20, 154, -144);
+$s_icon2->drawCurve(131, -130, -7, -90);
+$s_icon2->drawCurve(-188, 202, -230, 24);
+$s_icon2->drawCurve(-132, 14, -350, -60);
+$s_icon2->drawLine(0, 20);
+$s_icon2->movePenTo(722, -1241);
+$s_icon2->drawLine(20, 180);
+$s_icon2->drawLine(40, 0);
+$s_icon2->drawLine(40, -120);
+$s_icon2->drawLine(-100, -60);
+$s_icon2->movePenTo(-595, -849);
+$s_icon2->drawCurve(41, 83, 106, 120);
+$s_icon2->drawCurve(131, 148, 36, 52);
+$s_icon2->drawCurve(84, 122, 19, 123);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(48, -216, -203, -264);
+$s_icon2->drawCurve(-252, -280, -73, -140);
+$s_icon2->drawCurve(-17, 132, 60, 120);
+$s_icon2->movePenTo(-2778, -901);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(73, -138, 162, -29);
+$s_icon2->drawCurve(99, -17, 206, 24);
+$s_icon2->drawCurve(-55, -80, -91, -23);
+$s_icon2->drawCurve(-84, -21, -92, 30);
+$s_icon2->drawCurve(-89, 30, -65, 66);
+$s_icon2->drawCurve(-68, 71, -16, 87);
+$s_icon2->movePenTo(-2858, -721);
+$s_icon2->drawLine(-200, -280);
+$s_icon2->drawCurve(-47, 325, 247, -25);
+$s_icon2->drawLine(0, -20);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1102, -795);
+$s_icon2->setLeftFill(0x00, 0x00, 0x00);
+$s_icon2->drawCurve(-299, 24, -163, 104);
+$s_icon2->drawCurve(-189, 120, -83, 266);
+$s_icon2->drawCurve(-82, 264, 53, 286);
+$s_icon2->drawCurve(51, 274, 161, 235);
+$s_icon2->drawCurve(163, 237, 236, 137);
+$s_icon2->drawCurve(251, 146, 281, 0);
+$s_icon2->drawLine(340, -16);
+$s_icon2->drawCurve(185, -36, 108, -128);
+$s_icon2->drawCurve(216, -256, -19, -343);
+$s_icon2->drawCurve(-18, -315, -203, -281);
+$s_icon2->drawCurve(-203, -282, -294, -119);
+$s_icon2->drawCurve(-320, -129, -312, 119);
+$s_icon2->drawCurve(-213, 81, -41, 294);
+$s_icon2->drawCurve(-37, 261, 107, 210);
+$s_icon2->drawCurve(236, 471, 668, 49);
+$s_icon2->drawLine(-60, -260);
+$s_icon2->drawCurve(-204, -19, -180, -124);
+$s_icon2->drawCurve(-195, -133, -55, -184);
+$s_icon2->drawCurve(-69, -228, 153, -170);
+$s_icon2->drawCurve(156, -172, 234, 64);
+$s_icon2->drawCurve(164, 47, 156, 173);
+$s_icon2->drawCurve(152, 168, 76, 212);
+$s_icon2->drawCurve(81, 226, -43, 182);
+$s_icon2->drawCurve(-48, 206, -202, 98);
+$s_icon2->drawCurve(-171, 82, -325, -75);
+$s_icon2->drawCurve(-207, -47, -189, -174);
+$s_icon2->drawCurve(-184, -168, -102, -227);
+$s_icon2->drawCurve(-108, -238, 23, -218);
+$s_icon2->drawCurve(26, -242, 184, -162);
+$s_icon2->drawCurve(156, -140, 223, -12);
+$s_icon2->drawCurve(98, -5, 320, 41);
+$s_icon2->drawCurve(-32, -107, -152, -45);
+$s_icon2->drawCurve(-119, -34, -137, 12);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(997, -640);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawCurve(-267, 49, -108, 250);
+$s_icon2->drawCurve(225, -156, 192, -34);
+$s_icon2->drawCurve(159, -28, 304, 38);
+$s_icon2->drawLine(0, -100);
+$s_icon2->drawCurve(-345, -48, -160, 29);
+$s_icon2->movePenTo(-838, -601);
+$s_icon2->drawLine(-20, -180);
+$s_icon2->drawLine(0, 180);
+$s_icon2->drawLine(20, 0);
+$s_icon2->movePenTo(-698, -661);
+$s_icon2->drawLine(140, 480);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(41, -332, -201, -148);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(1422, -641);
+$s_icon2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon2->drawLine(0, 20);
+$s_icon2->drawLine(60, 0);
+$s_icon2->drawLine(-60, -20);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(-2978, -361);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawCurve(148, -149, 272, 29);
+$s_icon2->drawCurve(-113, -105, -147, 35);
+$s_icon2->drawCurve(-151, 36, -29, 154);
+$s_icon2->movePenTo(-878, -581);
+$s_icon2->drawLine(0, 60);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(-20, -60);
+$s_icon2->movePenTo(-1498, -561);
+$s_icon2->drawLine(-80, 799);
+$s_icon2->drawCurve(587, 0, 113, -379);
+$s_icon2->drawCurve(-189, 151, -116, 54);
+$s_icon2->drawCurve(-157, 74, -198, 0);
+$s_icon2->drawLine(40, -699);
+$s_icon2->setLeftFill();
+$s_icon2->setRightFill();
+$s_icon2->movePenTo(3262, 1358);
+$s_icon2->setLeftFill(0xb8, 0xb8, 0xd9);
+$s_icon2->drawCurve(-86, 165, -193, 189);
+$s_icon2->drawCurve(-112, 109, -229, 187);
+$s_icon2->drawCurve(-629, 502, -708, 55);
+$s_icon2->drawCurve(-743, 57, -640, -458);
+$s_icon2->drawCurve(-197, -141, -249, -270);
+$s_icon2->drawCurve(-333, -360, -81, -75);
+$s_icon2->drawCurve(-13, 109, 53, 89);
+$s_icon2->drawCurve(21, 35, 112, 127);
+$s_icon2->drawCurve(276, 313, 351, 260);
+$s_icon2->drawCurve(645, 481, 791, -73);
+$s_icon2->drawCurve(742, -68, 638, -523);
+$s_icon2->drawCurve(253, -204, 108, -111);
+$s_icon2->drawCurve(210, -217, 33, -178);
+$s_icon2->drawLine(-20, 0);
+$s_icon2->movePenTo(1002, -141);
+$s_icon2->drawCurve(217, -130, 198, 37);
+$s_icon2->drawCurve(176, 34, 142, 160);
+$s_icon2->drawCurve(128, 145, 73, 217);
+$s_icon2->drawCurve(70, 210, -4, 206);
+$s_icon2->drawCurve(122, -229, -122, -321);
+$s_icon2->drawCurve(-115, -301, -225, -148);
+$s_icon2->drawCurve(-182, -119, -191, 20);
+$s_icon2->drawCurve(-212, 22, -75, 197);
+$s_icon2->movePenTo(715, 67);
+$s_icon2->drawCurve(-9, -110, -24, -58);
+$s_icon2->drawCurve(-37, 463, 266, 293);
+$s_icon2->drawCurve(261, 287, 470, 36);
+$s_icon2->drawCurve(-21, -95, -230, -77);
+$s_icon2->drawLine(-185, -61);
+$s_icon2->drawCurve(-99, -37, -45, -37);
+$s_icon2->drawCurve(-261, -203, -63, -230);
+$s_icon2->drawCurve(-13, -46, -10, -125);
+$s_icon2->movePenTo(302, -101);
+$s_icon2->drawCurve(-83, 436, 216, 406);
+$s_icon2->drawCurve(216, 409, 411, 174);
+$s_icon2->drawCurve(281, 122, 321, -39);
+$s_icon2->drawCurve(375, -45, 103, -264);
+$s_icon2->drawCurve(-223, 155, -254, 35);
+$s_icon2->drawCurve(-241, 33, -238, -79);
+$s_icon2->drawCurve(-233, -78, -192, -171);
+$s_icon2->drawCurve(-196, -173, -120, -242);
+$s_icon2->drawCurve(-59, -117, -21, -227);
+$s_icon2->drawCurve(-24, -239, -39, -96);
+$s_icon2->movePenTo(-2258, -441);
+$s_icon2->drawLine(0, 140);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(-20, -140);
+$s_icon2->movePenTo(-2278, -201);
+$s_icon2->drawCurve(0, 568, 246, 224);
+$s_icon2->drawCurve(166, 146, 238, 49);
+$s_icon2->drawCurve(227, 47, 234, -52);
+$s_icon2->drawCurve(237, -54, 174, -140);
+$s_icon2->drawCurve(188, -151, 70, -218);
+$s_icon2->drawLine(-20, 0);
+$s_icon2->drawCurve(-128, 172, -184, 124);
+$s_icon2->drawCurve(-189, 127, -204, 47);
+$s_icon2->drawCurve(-472, 109, -320, -339);
+$s_icon2->drawCurve(-109, -115, -53, -204);
+$s_icon2->drawLine(-41, -169);
+$s_icon2->drawCurve(-27, -100, -33, -71);
+$s_icon2->movePenTo(-3318, -281);
+$s_icon2->drawCurve(-27, 225, 136, 145);
+$s_icon2->drawCurve(147, 158, 204, -129);
+$s_icon2->drawLine(0, -20);
+$s_icon2->drawCurve(-188, -5, -105, -110);
+$s_icon2->drawCurve(-31, -34, -136, -230);
+$s_icon2->movePenTo(-2722, 231);
+$s_icon2->drawCurve(-60, 81, -16, 106);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(220, -240);
+$s_icon2->drawCurve(-89, -49, -75, 102);
+$s_icon2->movePenTo(-3138, 518);
+$s_icon2->drawCurve(0, 134, 17, 70);
+$s_icon2->drawCurve(26, 104, 77, 65);
+$s_icon2->drawCurve(96, 85, 141, 10);
+$s_icon2->drawCurve(159, 11, 44, -119);
+$s_icon2->drawCurve(-222, 0, -117, -85);
+$s_icon2->drawCurve(-87, -64, -134, -211);
+$s_icon2->movePenTo(-2398, 998);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(180, -160);
+$s_icon2->drawCurve(-80, -32, -56, 57);
+$s_icon2->drawCurve(-46, 47, -18, 88);
+$s_icon2->movePenTo(-598, -21);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(-20, -60);
+$s_icon2->drawLine(0, 60);
+$s_icon2->movePenTo(-578, -161);
+$s_icon2->drawLine(0, 60);
+$s_icon2->drawLine(20, 0);
+$s_icon2->drawLine(-20, -60);
+$s_icon2->movePenTo(-168, 562);
+$s_icon2->drawCurve(94, -131, -24, -93);
+$s_icon2->drawLine(-260, 380);
+$s_icon2->drawLine(20, 20);
+$s_icon2->drawCurve(101, -81, 69, -95);
+$s_icon2->movePenTo(-698, 818);
+$s_icon2->drawLine(-60, 60);
+$s_icon2->drawLine(0, 20);
+$s_icon2->drawCurve(307, 308, 131, 122);
+$s_icon2->drawCurve(265, 244, 228, 154);
+$s_icon2->drawCurve(599, 403, 570, -75);
+$s_icon2->drawCurve(309, -39, 351, -191);
+$s_icon2->drawCurve(294, -154, 122, -85);
+$s_icon2->drawCurve(275, -191, 9, -156);
+$s_icon2->drawLine(-390, 293);
+$s_icon2->drawCurve(-232, 175, -178, 85);
+$s_icon2->drawCurve(-430, 205, -467, -64);
+$s_icon2->drawCurve(-434, -60, -409, -284);
+$s_icon2->drawCurve(-184, -127, -256, -250);
+$s_icon2->drawCurve(-315, -306, -105, -87);
+$s_icon2->movePenTo(-1658, 1431);
+$s_icon2->drawCurve(-313, 133, -261, -74);
+$s_icon2->drawCurve(-262, -75, -184, -277);
+$s_icon2->drawCurve(0, 267, 181, 123);
+$s_icon2->drawCurve(158, 107, 265, -18);
+$s_icon2->drawCurve(240, -17, 240, -109);
+$s_icon2->drawCurve(239, -109, 117, -144);
+$s_icon2->drawCurve(-86, -8, -129, 78);
+$s_icon2->drawLine(-205, 123);
+$s_icon2->movePenTo(-898, 1298);
+$s_icon2->drawLine(-20, -60);
+$s_icon2->drawLine(0, 60);
+$s_icon2->drawLine(20, 0);
+
+# icon3 Movieclip
+my $i_icon2 = new SWF::Sprite();
+my $item = $i_icon2->add($s_icon2);
+$item->scaleTo(0.5);
+$i_icon2->nextFrame();
+
+# icon1 Shapes
+my $s_icon1 = new SWF::Shape();
+$s_icon1->movePenTo(6960, 2721);
+$s_icon1->setLeftFill(0xab, 0x97, 0xfd);
+$s_icon1->setRightFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(-210, 0, -370, -108);
+$s_icon1->drawCurve(-397, -117, -183, -12);
+$s_icon1->drawCurve(-191, -13, -375, 85);
+$s_icon1->drawCurve(-367, 83, -187, -18);
+$s_icon1->drawCurve(-80, -8, -114, -61);
+$s_icon1->drawCurve(-142, -76, -44, -15);
+$s_icon1->drawCurve(-17, 176, 7, 76);
+$s_icon1->drawCurve(13, 135, 80, 93);
+$s_icon1->drawCurve(70, 80, 122, 54);
+$s_icon1->drawCurve(120, 52, 130, 9);
+$s_icon1->drawCurve(309, 19, 106, -214);
+$s_icon1->drawCurve(-302, 0, -158, -220);
+$s_icon1->drawCurve(64, -12, 125, 24);
+$s_icon1->drawCurve(127, 24, 64, -10);
+$s_icon1->drawCurve(45, -7, 102, -38);
+$s_icon1->drawCurve(93, -34, 60, -4);
+$s_icon1->drawCurve(228, -17, 308, 73);
+$s_icon1->drawCurve(177, 42, 347, 102);
+$s_icon1->drawLine(343, 97);
+$s_icon1->drawCurve(193, 67, 117, 99);
+$s_icon1->drawCurve(91, 75, 54, 126);
+$s_icon1->drawCurve(24, 54, 51, 174);
+$s_icon1->drawCurve(41, 141, 45, 72);
+$s_icon1->drawCurve(66, 103, 115, 49);
+$s_icon1->drawCurve(356, 155, 280, -58);
+$s_icon1->drawCurve(334, -69, 90, -368);
+$s_icon1->drawCurve(31, -119, -31, -141);
+$s_icon1->drawCurve(-226, 104, -217, -10);
+$s_icon1->drawCurve(-189, -10, -248, -104);
+$s_icon1->drawLine(0, -40);
+$s_icon1->drawCurve(68, -13, 102, 16);
+$s_icon1->drawLine(179, 32);
+$s_icon1->drawCurve(223, 38, 121, -90);
+$s_icon1->drawCurve(262, -193, -276, -280);
+$s_icon1->drawCurve(-161, -164, -318, -170);
+$s_icon1->drawCurve(-330, -173, -454, -126);
+$s_icon1->drawLine(-816, -194);
+$s_icon1->drawCurve(-357, -91, -179, -40);
+$s_icon1->drawCurve(-311, -70, -233, -2);
+$s_icon1->drawCurve(-268, 0, -168, 30);
+$s_icon1->drawCurve(-229, 42, -175, 111);
+$s_icon1->drawCurve(-112, 68, -41, 105);
+$s_icon1->drawCurve(-46, 117, 75, 103);
+$s_icon1->drawCurve(142, 191, 288, -44);
+$s_icon1->drawCurve(81, -12, 163, -46);
+$s_icon1->drawCurve(159, -45, 71, -10);
+$s_icon1->drawCurve(256, -37, 349, 65);
+$s_icon1->drawLine(595, 142);
+$s_icon1->drawCurve(179, 44, 67, 25);
+$s_icon1->drawCurve(146, 53, 68, 78);
+$s_icon1->movePenTo(8890, 3055);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill();
+$s_icon1->drawLine(-184, -161);
+$s_icon1->drawCurve(-44, -46, -92, -148);
+$s_icon1->drawCurve(-79, -126, -75, -60);
+$s_icon1->drawCurve(-365, -300, -771, -257);
+$s_icon1->drawCurve(-573, -192, -402, -78);
+$s_icon1->drawCurve(-544, -105, -461, 45);
+$s_icon1->drawCurve(-503, 48, -237, 96);
+$s_icon1->drawCurve(-60, 23, -111, 68);
+$s_icon1->drawCurve(-111, 67, -58, 22);
+$s_icon1->drawCurve(-40, 15, -82, 3);
+$s_icon1->drawCurve(-82, 3, -40, 15);
+$s_icon1->drawCurve(-53, 20, -119, 105);
+$s_icon1->drawCurve(-107, 94, -71, 11);
+$s_icon1->drawCurve(-56, 9, -118, -51);
+$s_icon1->drawCurve(-129, -61, -43, -17);
+$s_icon1->drawCurve(-527, -190, -273, 164);
+$s_icon1->drawCurve(-188, 109, 28, 283);
+$s_icon1->drawCurve(13, 121, 53, 108);
+$s_icon1->drawCurve(54, 110, 80, 59);
+$s_icon1->drawCurve(258, 187, 355, -123);
+$s_icon1->drawCurve(333, -116, 174, -288);
+$s_icon1->drawCurve(-23, 128, -126, 169);
+$s_icon1->drawCurve(-70, 95, -141, 168);
+$s_icon1->drawCurve(-405, 538, -135, 304);
+$s_icon1->drawCurve(-244, 549, 214, 409);
+$s_icon1->drawCurve(103, 203, 218, 138);
+$s_icon1->drawCurve(114, 73, 315, 136);
+$s_icon1->drawLine(980, 430);
+$s_icon1->drawCurve(1131, 483, 649, 193);
+$s_icon1->drawCurve(888, 261, 572, -261);
+$s_icon1->drawCurve(214, -102, 246, -247);
+$s_icon1->drawLine(400, -427);
+$s_icon1->drawLine(377, -387);
+$s_icon1->drawCurve(216, -246, 67, -207);
+$s_icon1->drawCurve(46, -139, 10, -207);
+$s_icon1->drawLine(7, -354);
+$s_icon1->drawCurve(16, -277, -3, -138);
+$s_icon1->drawCurve(-6, -239, -77, -166);
+$s_icon1->drawLine(-27, -51);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawLine(14, 85);
+$s_icon1->drawCurve(23, 232, -120, 314);
+$s_icon1->drawCurve(-250, 661, -643, 925);
+$s_icon1->drawCurve(-183, 258, -82, 85);
+$s_icon1->drawCurve(-159, 165, -206, 66);
+$s_icon1->drawCurve(-309, 97, -361, -54);
+$s_icon1->drawCurve(-207, -31, -443, -136);
+$s_icon1->drawCurve(-1336, -403, -844, -343);
+$s_icon1->drawCurve(-396, -159, -159, -91);
+$s_icon1->drawCurve(-296, -170, -149, -234);
+$s_icon1->drawCurve(-275, -428, 295, -570);
+$s_icon1->drawCurve(100, -194, 198, -266);
+$s_icon1->drawLine(302, -405);
+$s_icon1->drawCurve(37, -55, 111, -125);
+$s_icon1->drawCurve(102, -115, 40, -68);
+$s_icon1->drawCurve(14, -23, 11, -42);
+$s_icon1->drawLine(18, -69);
+$s_icon1->drawCurve(27, -78, 76, -8);
+$s_icon1->drawCurve(64, -7, 23, 86);
+$s_icon1->drawCurve(18, 68, -15, 63);
+$s_icon1->drawLine(-57, 248);
+$s_icon1->drawCurve(-23, 149, 44, 99);
+$s_icon1->drawCurve(45, 104, 161, 111);
+$s_icon1->drawCurve(77, 54, 187, 101);
+$s_icon1->drawCurve(362, 200, 568, 165);
+$s_icon1->drawCurve(323, 95, 647, 170);
+$s_icon1->drawCurve(227, 67, 465, 162);
+$s_icon1->drawCurve(420, 137, 288, 34);
+$s_icon1->drawCurve(199, 24, 202, -62);
+$s_icon1->drawCurve(198, -60, 156, -128);
+$s_icon1->drawCurve(161, -133, 79, -177);
+$s_icon1->drawCurve(84, -190, -26, -210);
+$s_icon1->drawCurve(-8, -72, -55, -83);
+$s_icon1->drawLine(-90, -145);
+$s_icon1->drawLine(50, 14);
+$s_icon1->setLeftFill();
+$s_icon1->drawCurve(221, 72, 55, 223);
+$s_icon1->movePenTo(8526, 5034);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(-3, 3, 7, 14);
+$s_icon1->drawCurve(3, -24, -7, 7);
+$s_icon1->movePenTo(7747, 4921);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(101, 43, 112, 17);
+$s_icon1->drawCurve(30, -58, 61, -105);
+$s_icon1->drawCurve(51, -93, 18, -84);
+$s_icon1->drawCurve(-86, -31, -274, -69);
+$s_icon1->drawLine(-95, 113);
+$s_icon1->drawCurve(-55, 71, -4, 56);
+$s_icon1->drawCurve(-2, 78, 143, 62);
+$s_icon1->movePenTo(7403, 4394);
+$s_icon1->drawCurve(-98, -20, -82, 50);
+$s_icon1->drawCurve(-98, 58, -2, 82);
+$s_icon1->drawCurve(-2, 71, 68, 67);
+$s_icon1->drawCurve(64, 63, 85, 24);
+$s_icon1->drawCurve(92, 26, 60, -38);
+$s_icon1->drawCurve(104, -64, 12, -88);
+$s_icon1->drawCurve(10, -77, -62, -69);
+$s_icon1->drawCurve(-60, -66, -91, -19);
+$s_icon1->movePenTo(7011, 4245);
+$s_icon1->drawCurve(-112, -53, -59, 12);
+$s_icon1->drawCurve(-118, 23, -15, 111);
+$s_icon1->drawCurve(-14, 99, 66, 102);
+$s_icon1->drawCurve(68, 104, 90, 8);
+$s_icon1->drawCurve(106, 10, 80, -140);
+$s_icon1->drawCurve(22, -41, 55, -159);
+$s_icon1->drawCurve(-17, -5, -152, -71);
+$s_icon1->movePenTo(6604, 4692);
+$s_icon1->setLeftFill(0xff, 0x01, 0x01);
+$s_icon1->setRightFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(-115, 19, -29, 150);
+$s_icon1->drawCurve(117, 56, 163, 44);
+$s_icon1->drawCurve(75, -146, 25, -74);
+$s_icon1->drawCurve(-150, -63, -86, 14);
+$s_icon1->movePenTo(6543, 4644);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawCurve(-89, 47, -29, 96);
+$s_icon1->drawCurve(-32, 103, 87, 54);
+$s_icon1->drawCurve(56, 31, 64, 19);
+$s_icon1->drawCurve(76, 27, 104, 0);
+$s_icon1->drawCurve(83, -157, 3, -80);
+$s_icon1->drawCurve(4, -65, -114, -42);
+$s_icon1->drawCurve(-142, -71, -71, 38);
+$s_icon1->movePenTo(6969, 4928);
+$s_icon1->drawCurve(-70, 113, 21, 40);
+$s_icon1->drawCurve(27, 56, 110, 23);
+$s_icon1->drawCurve(93, 18, -10, 43);
+$s_icon1->drawLine(90, -13);
+$s_icon1->drawCurve(31, -11, 39, -56);
+$s_icon1->drawLine(68, -93);
+$s_icon1->drawCurve(42, -62, -10, -45);
+$s_icon1->drawCurve(-13, -48, -129, -57);
+$s_icon1->drawCurve(-129, -57, -49, 22);
+$s_icon1->drawCurve(-45, 19, -66, 108);
+$s_icon1->movePenTo(7029, 5315);
+$s_icon1->drawCurve(-83, -34, -46, -7);
+$s_icon1->drawCurve(-70, -13, -104, 114);
+$s_icon1->drawCurve(-103, 114, 20, 68);
+$s_icon1->drawCurve(24, 74, 140, 45);
+$s_icon1->drawCurve(139, 46, 64, -41);
+$s_icon1->drawCurve(66, -39, 42, -103);
+$s_icon1->drawCurve(36, -86, 6, -92);
+$s_icon1->drawCurve(-41, -9, -90, -37);
+$s_icon1->movePenTo(7193, 5081);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->setRightFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(65, -18, 82, -142);
+$s_icon1->drawLine(-260, -80);
+$s_icon1->drawLine(-100, 200);
+$s_icon1->drawCurve(160, 55, 53, -15);
+$s_icon1->movePenTo(6552, 5178);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawCurve(-74, -72, -198, -45);
+$s_icon1->drawCurve(-144, 202, 61, 112);
+$s_icon1->drawCurve(55, 100, 248, 66);
+$s_icon1->drawCurve(140, -215, -58, -109);
+$s_icon1->drawLine(-23, -32);
+$s_icon1->setRightFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(-12, 47, -67, 149);
+$s_icon1->drawCurve(-160, -16, -120, -64);
+$s_icon1->drawCurve(41, -157, 90, -17);
+$s_icon1->drawCurve(63, -12, 158, 63);
+$s_icon1->setLeftFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawLine(8, 3);
+$s_icon1->drawLine(-1, 4);
+$s_icon1->movePenTo(7232, 5819);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawCurve(77, 40, 124, -28);
+$s_icon1->drawCurve(125, -28, 52, -72);
+$s_icon1->drawCurve(61, -82, -88, -95);
+$s_icon1->drawCurve(-26, -28, -81, -32);
+$s_icon1->drawCurve(-93, -38, -23, -15);
+$s_icon1->drawCurve(-93, 85, -27, 38);
+$s_icon1->drawCurve(-37, 55, -17, 42);
+$s_icon1->drawCurve(-43, 112, 89, 46);
+$s_icon1->movePenTo(7007, 5486);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->setRightFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(38, -69, 15, -56);
+$s_icon1->drawLine(-200, -60);
+$s_icon1->drawCurve(-125, 199, -15, 41);
+$s_icon1->drawLine(220, 60);
+$s_icon1->drawLine(67, -115);
+$s_icon1->movePenTo(7826, 5260);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawCurve(50, -84, 4, -115);
+$s_icon1->drawCurve(-223, -60, -72, 26);
+$s_icon1->drawCurve(-73, 26, -132, 188);
+$s_icon1->drawCurve(72, 96, 89, 33);
+$s_icon1->drawCurve(83, 30, 77, -31);
+$s_icon1->drawCurve(77, -30, 48, -79);
+$s_icon1->movePenTo(7796, 5107);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->setRightFill(0x01, 0x01, 0x01);
+$s_icon1->drawCurve(-63, -129, -129, 70);
+$s_icon1->drawCurve(-117, 63, -27, 110);
+$s_icon1->drawLine(140, 53);
+$s_icon1->drawCurve(74, 20, 77, -52);
+$s_icon1->drawCurve(82, -56, -37, -79);
+$s_icon1->movePenTo(7350, 6527);
+$s_icon1->drawLine(2, -9);
+$s_icon1->drawCurve(-1, -8, -5, 7);
+$s_icon1->drawCurve(-3, 20, 7, -10);
+$s_icon1->movePenTo(3956, 3921);
+$s_icon1->drawCurve(-277, 390, -59, 210);
+$s_icon1->drawCurve(175, 97, 290, 110);
+$s_icon1->drawLine(475, 186);
+$s_icon1->drawCurve(345, 163, 131, -46);
+$s_icon1->drawCurve(56, -21, 58, -77);
+$s_icon1->drawLine(90, -126);
+$s_icon1->drawCurve(324, -399, -61, -141);
+$s_icon1->drawCurve(-33, -74, -242, -61);
+$s_icon1->drawLine(-328, -75);
+$s_icon1->drawCurve(-306, -105, -234, -108);
+$s_icon1->drawLine(-117, -59);
+$s_icon1->drawCurve(-75, -35, -45, 4);
+$s_icon1->drawCurve(-49, 4, -49, 62);
+$s_icon1->drawCurve(-28, 34, -41, 67);
+$s_icon1->movePenTo(3904, 3788);
+$s_icon1->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1->drawLine(-114, 173);
+$s_icon1->drawLine(-195, 276);
+$s_icon1->drawCurve(-125, 202, 23, 102);
+$s_icon1->drawCurve(17, 70, 131, 75);
+$s_icon1->drawLine(199, 95);
+$s_icon1->drawCurve(519, 256, 421, 97);
+$s_icon1->drawCurve(254, 61, 99, -54);
+$s_icon1->drawCurve(66, -38, 79, -117);
+$s_icon1->drawLine(112, -185);
+$s_icon1->drawCurve(111, -145, 56, -85);
+$s_icon1->drawCurve(101, -154, -8, -106);
+$s_icon1->drawCurve(-6, -78, -78, -50);
+$s_icon1->drawCurve(-31, -20, -115, -46);
+$s_icon1->drawCurve(-240, -90, -480, -166);
+$s_icon1->drawCurve(-208, -66, -252, -101);
+$s_icon1->drawCurve(-63, -31, -34, -13);
+$s_icon1->drawCurve(-61, -23, -39, 17);
+$s_icon1->drawCurve(-61, 29, -78, 115);
+$s_icon1->movePenTo(5780, 4921);
+$s_icon1->drawCurve(65, -21, 75, 18);
+$s_icon1->drawCurve(44, 11, 96, 32);
+$s_icon1->drawLine(-100, -100);
+$s_icon1->drawLine(-104, 3);
+$s_icon1->drawCurve(-48, 9, -28, 48);
+$s_icon1->movePenTo(5952, 4584);
+$s_icon1->drawCurve(-9, 69, 44, 70);
+$s_icon1->drawCurve(44, 68, 69, 31);
+$s_icon1->drawCurve(74, 33, 66, -31);
+$s_icon1->drawCurve(118, -56, 23, -85);
+$s_icon1->drawCurve(21, -73, -53, -71);
+$s_icon1->drawCurve(-51, -68, -85, -24);
+$s_icon1->drawCurve(-92, -26, -78, 43);
+$s_icon1->drawCurve(-80, 43, -11, 77);
+$s_icon1->movePenTo(5936, 5301);
+$s_icon1->drawCurve(86, -14, 50, -116);
+$s_icon1->drawCurve(45, -105, -17, -85);
+$s_icon1->drawCurve(-98, 97, -62, 123);
+$s_icon1->drawLine(-240, -100);
+$s_icon1->drawLine(39, -87);
+$s_icon1->drawCurve(21, -52, 0, -41);
+$s_icon1->drawLine(-67, 83);
+$s_icon1->drawCurve(-38, 53, -2, 40);
+$s_icon1->drawCurve(-5, 70, 113, 73);
+$s_icon1->drawCurve(106, 69, 69, -8);
+$s_icon1->movePenTo(6104, 6526);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->setRightFill();
+$s_icon1->drawLine(9, 1);
+$s_icon1->drawCurve(0, -20, -10, 10);
+$s_icon1->drawLine(1, 9);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(3686, 2737);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawCurve(-3, 20, 7, -10);
+$s_icon1->drawLine(2, -9);
+$s_icon1->drawCurve(-1, -8, -5, 7);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(5820, 3007);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(354, 77, 366, 147);
+$s_icon1->drawCurve(97, 41, 103, 107);
+$s_icon1->drawCurve(125, 131, 55, 37);
+$s_icon1->drawCurve(70, 49, 132, 42);
+$s_icon1->drawLine(218, 63);
+$s_icon1->drawLine(-20, -140);
+$s_icon1->drawCurve(-180, -6, -119, -122);
+$s_icon1->drawLine(-100, -113);
+$s_icon1->drawCurve(-64, -70, -64, -43);
+$s_icon1->drawCurve(-237, -156, -383, -72);
+$s_icon1->drawCurve(-397, -74, -256, 76);
+$s_icon1->drawCurve(48, 20, 97, -1);
+$s_icon1->drawLine(155, 7);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(8720, 3541);
+$s_icon1->setLeftFill(0xee, 0xeb, 0xff);
+$s_icon1->drawLine(0, 80);
+$s_icon1->drawCurve(15, -39, -15, -41);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(8700, 3621);
+$s_icon1->setLeftFill(0xee, 0xeb, 0xff);
+$s_icon1->drawLine(0, 60);
+$s_icon1->drawCurve(12, -29, -12, -31);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(8686, 3697);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(-3, 20, 7, -10);
+$s_icon1->drawLine(2, -9);
+$s_icon1->drawCurve(-1, -8, -5, 7);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(9280, 3701);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(-21, 153, -121, 227);
+$s_icon1->drawCurve(-145, 250, -57, 110);
+$s_icon1->drawCurve(-382, 775, -301, 465);
+$s_icon1->drawCurve(-200, 310, -149, 131);
+$s_icon1->drawCurve(-214, 188, -290, 27);
+$s_icon1->drawCurve(-207, 22, -262, -62);
+$s_icon1->drawCurve(-61, -15, -390, -118);
+$s_icon1->drawLine(-1420, -477);
+$s_icon1->drawLine(-823, -263);
+$s_icon1->drawCurve(-464, -160, -333, -167);
+$s_icon1->drawCurve(-552, -271, -68, -425);
+$s_icon1->drawCurve(-58, 139, 79, 165);
+$s_icon1->drawCurve(68, 143, 131, 96);
+$s_icon1->drawCurve(229, 171, 372, 166);
+$s_icon1->drawCurve(213, 96, 426, 174);
+$s_icon1->drawCurve(1304, 565, 856, 225);
+$s_icon1->drawCurve(402, 106, 154, 20);
+$s_icon1->drawCurve(318, 41, 246, -94);
+$s_icon1->drawCurve(344, -134, 314, -351);
+$s_icon1->drawCurve(175, -197, 317, -471);
+$s_icon1->drawLine(186, -263);
+$s_icon1->drawCurve(112, -158, 66, -108);
+$s_icon1->drawCurve(189, -311, 40, -280);
+$s_icon1->drawCurve(47, -317, -70, -123);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(7013, 4251);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(6693, 4691);
+$s_icon1->setLeftFill(0xb8, 0x01, 0x01);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(7093, 4791);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(3890, 4811);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(16, 3);
+$s_icon1->drawCurve(7, -7, -23, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(6033, 4931);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->movePenTo(6453, 4931);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(5773, 5131);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(4780, 5141);
+$s_icon1->setLeftFill(0xdd, 0xdd, 0xdd);
+$s_icon1->drawCurve(41, 20, 59, 0);
+$s_icon1->drawCurve(-40, -15, -60, -5);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(5913, 5311);
+$s_icon1->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1->drawLine(10, 3);
+$s_icon1->drawCurve(10, -7, -20, 4);
+$s_icon1->setLeftFill();
+$s_icon1->setRightFill();
+
+$s_icon1->movePenTo(7260, 5721);
+$s_icon1->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1->drawCurve(85, 31, 31, 2);
+$s_icon1->drawCurve(78, 7, 26, -59);
+$s_icon1->drawCurve(23, -51, -26, -61);
+$s_icon1->drawCurve(-27, -62, -49, -2);
+$s_icon1->drawCurve(-57, -1, -54, 96);
+$s_icon1->drawCurve(-17, 29, -13, 71);
+
+my $s_icon1_f2 = new SWF::Shape();
+$s_icon1_f2->movePenTo(8877, 3643);
+$s_icon1_f2->setLeftFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->setRightFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(82, -165, -25, -185);
+$s_icon1_f2->drawCurve(-8, -64, -54, -71);
+$s_icon1_f2->drawCurve(-47, -63, -518, -190);
+$s_icon1_f2->drawCurve(-613, -225, -866, -239);
+$s_icon1_f2->drawCurve(-1929, -534, -108, 38);
+$s_icon1_f2->drawLine(-178, 16);
+$s_icon1_f2->drawCurve(-71, 5, -160, 230);
+$s_icon1_f2->drawCurve(-73, 104, -51, 158);
+$s_icon1_f2->drawCurve(-51, 161, 17, 85);
+$s_icon1_f2->drawLine(11, 98);
+$s_icon1_f2->drawCurve(8, 53, 135, 163);
+$s_icon1_f2->drawCurve(16, 27, 87, 41);
+$s_icon1_f2->drawLine(327, 147);
+$s_icon1_f2->drawCurve(493, 229, 265, 68);
+$s_icon1_f2->drawLine(955, 232);
+$s_icon1_f2->drawCurve(235, 63, 445, 138);
+$s_icon1_f2->drawCurve(413, 120, 284, 30);
+$s_icon1_f2->drawCurve(194, 20, 200, -54);
+$s_icon1_f2->drawCurve(194, -52, 155, -112);
+$s_icon1_f2->drawCurve(158, -118, 78, -154);
+$s_icon1_f2->movePenTo(9166, 3350);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(9, 35, 5, 50);
+$s_icon1_f2->drawCurve(23, 234, -120, 312);
+$s_icon1_f2->drawCurve(-251, 663, -642, 923);
+$s_icon1_f2->drawCurve(-183, 258, -82, 85);
+$s_icon1_f2->drawCurve(-159, 165, -206, 66);
+$s_icon1_f2->drawCurve(-308, 97, -362, -54);
+$s_icon1_f2->drawCurve(-214, -33, -436, -134);
+$s_icon1_f2->drawCurve(-1342, -405, -838, -341);
+$s_icon1_f2->drawCurve(-399, -160, -156, -90);
+$s_icon1_f2->drawCurve(-297, -170, -148, -234);
+$s_icon1_f2->drawCurve(-275, -429, 295, -569);
+$s_icon1_f2->drawCurve(103, -199, 195, -261);
+$s_icon1_f2->drawCurve(221, -289, 81, -116);
+$s_icon1_f2->drawCurve(39, -58, 109, -122);
+$s_icon1_f2->drawCurve(100, -114, 42, -69);
+$s_icon1_f2->drawCurve(15, -25, 10, -40);
+$s_icon1_f2->drawLine(18, -69);
+$s_icon1_f2->drawCurve(27, -79, 76, -7);
+$s_icon1_f2->drawCurve(64, -7, 23, 86);
+$s_icon1_f2->drawCurve(18, 68, -15, 63);
+$s_icon1_f2->drawLine(-57, 248);
+$s_icon1_f2->drawCurve(-23, 149, 44, 99);
+$s_icon1_f2->drawCurve(45, 104, 161, 111);
+$s_icon1_f2->drawCurve(79, 56, 185, 99);
+$s_icon1_f2->drawCurve(363, 201, 567, 164);
+$s_icon1_f2->drawCurve(346, 102, 624, 163);
+$s_icon1_f2->drawCurve(240, 72, 452, 157);
+$s_icon1_f2->drawCurve(420, 137, 288, 34);
+$s_icon1_f2->drawCurve(198, 24, 203, -62);
+$s_icon1_f2->drawCurve(197, -60, 157, -128);
+$s_icon1_f2->drawCurve(161, -134, 79, -176);
+$s_icon1_f2->drawCurve(84, -189, -26, -211);
+$s_icon1_f2->drawCurve(-8, -73, -55, -82);
+$s_icon1_f2->drawLine(-90, -145);
+$s_icon1_f2->drawLine(50, 14);
+$s_icon1_f2->setRightFill();
+$s_icon1_f2->drawCurve(-98, -84, -1940, -604);
+$s_icon1_f2->drawCurve(-453, -141, -353, -106);
+$s_icon1_f2->drawLine(-226, -67);
+$s_icon1_f2->drawCurve(-962, -282, -76, 30);
+$s_icon1_f2->drawLine(-181, 18);
+$s_icon1_f2->drawCurve(-166, 15, -46, 28);
+$s_icon1_f2->drawCurve(-107, 65, -62, 24);
+$s_icon1_f2->drawCurve(-41, 15, -81, 3);
+$s_icon1_f2->drawCurve(-81, 3, -41, 15);
+$s_icon1_f2->drawCurve(-53, 20, -119, 105);
+$s_icon1_f2->drawCurve(-106, 94, -72, 11);
+$s_icon1_f2->drawCurve(-55, 9, -119, -51);
+$s_icon1_f2->drawCurve(-131, -62, -41, -16);
+$s_icon1_f2->drawCurve(-401, -145, -254, 61);
+$s_icon1_f2->drawLine(-295, 512);
+$s_icon1_f2->drawCurve(17, 87, 39, 80);
+$s_icon1_f2->drawCurve(55, 111, 79, 58);
+$s_icon1_f2->drawCurve(257, 187, 356, -123);
+$s_icon1_f2->drawCurve(333, -115, 174, -289);
+$s_icon1_f2->drawCurve(-22, 127, -127, 170);
+$s_icon1_f2->drawLine(-211, 263);
+$s_icon1_f2->drawCurve(-406, 540, -134, 302);
+$s_icon1_f2->drawCurve(-244, 549, 214, 409);
+$s_icon1_f2->drawCurve(104, 203, 217, 138);
+$s_icon1_f2->drawCurve(109, 70, 320, 139);
+$s_icon1_f2->drawLine(980, 430);
+$s_icon1_f2->drawCurve(1128, 482, 652, 194);
+$s_icon1_f2->drawCurve(888, 261, 572, -261);
+$s_icon1_f2->drawCurve(215, -102, 245, -247);
+$s_icon1_f2->drawCurve(139, -140, 261, -287);
+$s_icon1_f2->drawLine(377, -387);
+$s_icon1_f2->drawCurve(215, -245, 68, -208);
+$s_icon1_f2->drawCurve(45, -136, 11, -210);
+$s_icon1_f2->drawLine(7, -354);
+$s_icon1_f2->drawCurve(16, -271, -3, -144);
+$s_icon1_f2->drawCurve(-6, -237, -77, -168);
+$s_icon1_f2->drawLine(-27, -51);
+$s_icon1_f2->setLeftFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(-55, -223, -221, -72);
+$s_icon1_f2->movePenTo(8530, 5051);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(3, -24, -7, 7);
+$s_icon1_f2->drawCurve(-3, 3, 7, 14);
+$s_icon1_f2->movePenTo(7606, 4781);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(-2, 78, 143, 62);
+$s_icon1_f2->drawCurve(101, 43, 112, 17);
+$s_icon1_f2->drawCurve(30, -58, 61, -105);
+$s_icon1_f2->drawCurve(51, -93, 18, -84);
+$s_icon1_f2->drawCurve(-86, -31, -274, -69);
+$s_icon1_f2->drawLine(-95, 113);
+$s_icon1_f2->drawCurve(-55, 71, -4, 56);
+$s_icon1_f2->movePenTo(7490, 4777);
+$s_icon1_f2->drawCurve(104, -64, 12, -88);
+$s_icon1_f2->drawCurve(10, -77, -62, -69);
+$s_icon1_f2->drawCurve(-60, -66, -91, -19);
+$s_icon1_f2->drawCurve(-98, -20, -82, 50);
+$s_icon1_f2->drawCurve(-98, 58, -2, 82);
+$s_icon1_f2->drawCurve(-2, 71, 68, 67);
+$s_icon1_f2->drawCurve(64, 63, 85, 24);
+$s_icon1_f2->drawCurve(92, 26, 60, -38);
+$s_icon1_f2->movePenTo(7011, 4245);
+$s_icon1_f2->drawCurve(-112, -53, -59, 12);
+$s_icon1_f2->drawCurve(-118, 23, -15, 111);
+$s_icon1_f2->drawCurve(-14, 99, 66, 102);
+$s_icon1_f2->drawCurve(68, 104, 90, 8);
+$s_icon1_f2->drawCurve(106, 10, 80, -140);
+$s_icon1_f2->drawCurve(22, -41, 55, -159);
+$s_icon1_f2->drawCurve(-17, -5, -152, -71);
+$s_icon1_f2->movePenTo(7080, 4801);
+$s_icon1_f2->drawCurve(-45, 19, -66, 108);
+$s_icon1_f2->drawCurve(-70, 113, 21, 40);
+$s_icon1_f2->drawCurve(27, 56, 110, 23);
+$s_icon1_f2->drawCurve(93, 18, -10, 43);
+$s_icon1_f2->drawLine(90, -13);
+$s_icon1_f2->drawCurve(31, -11, 39, -56);
+$s_icon1_f2->drawLine(68, -93);
+$s_icon1_f2->drawCurve(42, -62, -10, -45);
+$s_icon1_f2->drawCurve(-13, -48, -129, -57);
+$s_icon1_f2->drawCurve(-129, -57, -49, 22);
+$s_icon1_f2->movePenTo(6900, 5274);
+$s_icon1_f2->drawCurve(-70, -13, -104, 114);
+$s_icon1_f2->drawCurve(-103, 114, 20, 68);
+$s_icon1_f2->drawCurve(24, 74, 140, 45);
+$s_icon1_f2->drawCurve(139, 46, 64, -41);
+$s_icon1_f2->drawCurve(66, -39, 42, -103);
+$s_icon1_f2->drawCurve(36, -86, 6, -92);
+$s_icon1_f2->drawCurve(-41, -9, -90, -37);
+$s_icon1_f2->drawCurve(-83, -34, -46, -7);
+$s_icon1_f2->movePenTo(7193, 5081);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(65, -18, 82, -142);
+$s_icon1_f2->drawLine(-260, -80);
+$s_icon1_f2->drawLine(-100, 200);
+$s_icon1_f2->drawCurve(160, 55, 53, -15);
+$s_icon1_f2->movePenTo(6552, 5178);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(-74, -72, -198, -45);
+$s_icon1_f2->drawCurve(-144, 202, 61, 112);
+$s_icon1_f2->drawCurve(55, 100, 248, 66);
+$s_icon1_f2->drawCurve(140, -215, -58, -109);
+$s_icon1_f2->drawLine(-23, -32);
+$s_icon1_f2->setRightFill(0xff, 0xff, 0xff);
+$s_icon1_f2->drawCurve(-12, 47, -67, 149);
+$s_icon1_f2->drawCurve(-160, -16, -120, -64);
+$s_icon1_f2->drawCurve(41, -157, 90, -17);
+$s_icon1_f2->drawCurve(63, -12, 158, 63);
+$s_icon1_f2->setLeftFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawLine(8, 3);
+$s_icon1_f2->drawLine(-1, 4);
+$s_icon1_f2->movePenTo(7186, 5661);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(-43, 112, 89, 46);
+$s_icon1_f2->drawCurve(77, 40, 124, -28);
+$s_icon1_f2->drawCurve(125, -28, 52, -72);
+$s_icon1_f2->drawCurve(61, -82, -88, -95);
+$s_icon1_f2->drawCurve(-26, -28, -81, -32);
+$s_icon1_f2->drawCurve(-93, -38, -23, -15);
+$s_icon1_f2->drawCurve(-93, 85, -27, 38);
+$s_icon1_f2->drawCurve(-37, 55, -17, 42);
+$s_icon1_f2->movePenTo(7007, 5486);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(38, -69, 15, -56);
+$s_icon1_f2->drawLine(-200, -60);
+$s_icon1_f2->drawCurve(-125, 199, -15, 41);
+$s_icon1_f2->drawLine(220, 60);
+$s_icon1_f2->drawLine(67, -115);
+$s_icon1_f2->movePenTo(7826, 5260);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(50, -84, 4, -115);
+$s_icon1_f2->drawCurve(-223, -60, -72, 26);
+$s_icon1_f2->drawCurve(-73, 26, -132, 188);
+$s_icon1_f2->drawCurve(72, 96, 89, 33);
+$s_icon1_f2->drawCurve(83, 30, 77, -31);
+$s_icon1_f2->drawCurve(77, -30, 48, -79);
+$s_icon1_f2->movePenTo(7796, 5107);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(-63, -129, -129, 70);
+$s_icon1_f2->drawCurve(-117, 63, -27, 110);
+$s_icon1_f2->drawLine(140, 53);
+$s_icon1_f2->drawCurve(74, 20, 77, -52);
+$s_icon1_f2->drawCurve(82, -56, -37, -79);
+$s_icon1_f2->movePenTo(7346, 6517);
+$s_icon1_f2->drawCurve(-3, 20, 7, -10);
+$s_icon1_f2->drawLine(2, -9);
+$s_icon1_f2->drawCurve(-1, -8, -5, 7);
+$s_icon1_f2->movePenTo(3904, 3788);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawLine(-114, 173);
+$s_icon1_f2->drawLine(-195, 276);
+$s_icon1_f2->drawCurve(-125, 202, 23, 102);
+$s_icon1_f2->drawCurve(17, 70, 131, 75);
+$s_icon1_f2->drawLine(199, 95);
+$s_icon1_f2->drawCurve(519, 256, 421, 97);
+$s_icon1_f2->drawCurve(254, 61, 99, -54);
+$s_icon1_f2->drawCurve(66, -38, 79, -117);
+$s_icon1_f2->drawLine(112, -185);
+$s_icon1_f2->drawCurve(111, -145, 56, -85);
+$s_icon1_f2->drawCurve(101, -154, -8, -106);
+$s_icon1_f2->drawCurve(-6, -78, -78, -50);
+$s_icon1_f2->drawCurve(-31, -20, -115, -46);
+$s_icon1_f2->drawCurve(-240, -90, -480, -166);
+$s_icon1_f2->drawCurve(-208, -66, -252, -101);
+$s_icon1_f2->drawCurve(-63, -31, -34, -13);
+$s_icon1_f2->drawCurve(-61, -23, -39, 17);
+$s_icon1_f2->drawCurve(-61, 29, -78, 115);
+$s_icon1_f2->movePenTo(3956, 3921);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(-277, 390, -59, 210);
+$s_icon1_f2->drawCurve(175, 97, 290, 110);
+$s_icon1_f2->drawLine(475, 186);
+$s_icon1_f2->drawCurve(345, 163, 131, -46);
+$s_icon1_f2->drawCurve(56, -21, 58, -77);
+$s_icon1_f2->drawLine(90, -126);
+$s_icon1_f2->drawCurve(324, -399, -61, -141);
+$s_icon1_f2->drawCurve(-33, -74, -242, -61);
+$s_icon1_f2->drawLine(-328, -75);
+$s_icon1_f2->drawCurve(-306, -105, -234, -108);
+$s_icon1_f2->drawLine(-117, -59);
+$s_icon1_f2->drawCurve(-75, -35, -45, 4);
+$s_icon1_f2->drawCurve(-49, 4, -49, 62);
+$s_icon1_f2->drawCurve(-28, 34, -41, 67);
+$s_icon1_f2->movePenTo(5952, 4584);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->setRightFill(0xc9, 0xc9, 0xc9);
+$s_icon1_f2->drawCurve(-9, 69, 44, 70);
+$s_icon1_f2->drawCurve(44, 68, 69, 31);
+$s_icon1_f2->drawCurve(74, 33, 66, -31);
+$s_icon1_f2->drawCurve(118, -56, 23, -85);
+$s_icon1_f2->drawCurve(21, -73, -53, -71);
+$s_icon1_f2->drawCurve(-51, -68, -85, -24);
+$s_icon1_f2->drawCurve(-92, -26, -78, 43);
+$s_icon1_f2->drawCurve(-80, 43, -11, 77);
+$s_icon1_f2->movePenTo(6072, 5171);
+$s_icon1_f2->drawCurve(45, -105, -17, -85);
+$s_icon1_f2->drawCurve(-98, 97, -62, 123);
+$s_icon1_f2->drawLine(-240, -100);
+$s_icon1_f2->drawLine(39, -87);
+$s_icon1_f2->drawCurve(21, -52, 0, -41);
+$s_icon1_f2->drawLine(-67, 83);
+$s_icon1_f2->drawCurve(-38, 53, -2, 40);
+$s_icon1_f2->drawCurve(-5, 70, 113, 73);
+$s_icon1_f2->drawCurve(106, 69, 69, -8);
+$s_icon1_f2->drawCurve(86, -14, 50, -116);
+$s_icon1_f2->movePenTo(6104, 6526);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->setRightFill();
+$s_icon1_f2->drawLine(9, 1);
+$s_icon1_f2->drawCurve(0, -20, -10, 10);
+$s_icon1_f2->drawLine(1, 9);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(3686, 2737);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawCurve(-3, 20, 7, -10);
+$s_icon1_f2->drawLine(2, -9);
+$s_icon1_f2->drawCurve(-1, -8, -5, 7);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(9280, 3701);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->drawCurve(-21, 153, -121, 227);
+$s_icon1_f2->drawCurve(-145, 250, -57, 110);
+$s_icon1_f2->drawCurve(-382, 775, -301, 465);
+$s_icon1_f2->drawCurve(-200, 310, -149, 131);
+$s_icon1_f2->drawCurve(-214, 188, -290, 27);
+$s_icon1_f2->drawCurve(-207, 22, -262, -62);
+$s_icon1_f2->drawCurve(-61, -15, -390, -118);
+$s_icon1_f2->drawLine(-1420, -477);
+$s_icon1_f2->drawLine(-823, -263);
+$s_icon1_f2->drawCurve(-464, -160, -333, -167);
+$s_icon1_f2->drawCurve(-552, -271, -68, -425);
+$s_icon1_f2->drawCurve(-58, 139, 79, 165);
+$s_icon1_f2->drawCurve(68, 143, 131, 96);
+$s_icon1_f2->drawCurve(229, 171, 372, 166);
+$s_icon1_f2->drawCurve(213, 96, 426, 174);
+$s_icon1_f2->drawCurve(1304, 565, 856, 225);
+$s_icon1_f2->drawCurve(402, 106, 154, 20);
+$s_icon1_f2->drawCurve(318, 41, 246, -94);
+$s_icon1_f2->drawCurve(344, -134, 314, -351);
+$s_icon1_f2->drawCurve(175, -197, 317, -471);
+$s_icon1_f2->drawLine(186, -263);
+$s_icon1_f2->drawCurve(112, -158, 66, -108);
+$s_icon1_f2->drawCurve(189, -311, 40, -280);
+$s_icon1_f2->drawCurve(47, -317, -70, -123);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(7013, 4251);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(6780, 5021);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(83, -157, 3, -80);
+$s_icon1_f2->drawCurve(4, -65, -114, -42);
+$s_icon1_f2->drawCurve(-142, -71, -71, 38);
+$s_icon1_f2->drawCurve(-89, 47, -29, 96);
+$s_icon1_f2->drawCurve(-32, 103, 87, 54);
+$s_icon1_f2->drawCurve(56, 31, 64, 19);
+$s_icon1_f2->drawCurve(76, 27, 104, 0);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(6460, 4861);
+$s_icon1_f2->setLeftFill(0xff, 0x01, 0x01);
+$s_icon1_f2->drawCurve(117, 56, 163, 44);
+$s_icon1_f2->drawCurve(75, -146, 25, -74);
+$s_icon1_f2->drawCurve(-150, -63, -86, 14);
+$s_icon1_f2->drawCurve(-115, 19, -29, 150);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(6693, 4691);
+$s_icon1_f2->setLeftFill(0xb8, 0x01, 0x01);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(7093, 4791);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(3890, 4811);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(16, 3);
+$s_icon1_f2->drawCurve(7, -7, -23, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(5780, 4921);
+$s_icon1_f2->setLeftFill(0x01, 0x01, 0x01);
+$s_icon1_f2->drawCurve(65, -21, 75, 18);
+$s_icon1_f2->drawCurve(44, 11, 96, 32);
+$s_icon1_f2->drawLine(-100, -100);
+$s_icon1_f2->drawLine(-104, 3);
+$s_icon1_f2->drawCurve(-48, 9, -28, 48);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(6033, 4931);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->movePenTo(6453, 4931);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(5773, 5131);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(4780, 5141);
+$s_icon1_f2->setLeftFill(0xdd, 0xdd, 0xdd);
+$s_icon1_f2->drawCurve(41, 20, 59, 0);
+$s_icon1_f2->drawCurve(-40, -15, -60, -5);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(7120, 5181);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(0, 40);
+$s_icon1_f2->drawLine(26, -11);
+$s_icon1_f2->drawLine(14, -29);
+$s_icon1_f2->drawLine(-40, 0);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(5913, 5311);
+$s_icon1_f2->setLeftFill(0xec, 0xec, 0xec);
+$s_icon1_f2->drawLine(10, 3);
+$s_icon1_f2->drawCurve(10, -7, -20, 4);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(7260, 5721);
+$s_icon1_f2->setLeftFill(0xff, 0xff, 0xff);
+$s_icon1_f2->drawCurve(85, 31, 31, 2);
+$s_icon1_f2->drawCurve(78, 7, 26, -59);
+$s_icon1_f2->drawCurve(23, -51, -26, -61);
+$s_icon1_f2->drawCurve(-27, -62, -49, -2);
+$s_icon1_f2->drawCurve(-57, -1, -54, 96);
+$s_icon1_f2->drawCurve(-17, 29, -13, 71);
+$s_icon1_f2->setLeftFill();
+$s_icon1_f2->setRightFill();
+
+$s_icon1_f2->movePenTo(1674, 4251);
+$s_icon1_f2->setLeftFill(0xab, 0x97, 0xfd);
+$s_icon1_f2->setRightFill(0x00, 0x00, 0x00);
+$s_icon1_f2->drawCurve(-18, 232, 61, 198);
+$s_icon1_f2->drawCurve(36, 126, 92, 66);
+$s_icon1_f2->drawCurve(101, 76, 118, -47);
+$s_icon1_f2->drawCurve(222, -87, 31, -290);
+$s_icon1_f2->drawCurve(10, -81, -2, -170);
+$s_icon1_f2->drawCurve(-2, -164, 8, -72);
+$s_icon1_f2->drawCurve(30, -256, 154, -321);
+$s_icon1_f2->drawCurve(32, -65, 259, -473);
+$s_icon1_f2->drawCurve(89, -161, 41, -59);
+$s_icon1_f2->drawCurve(89, -127, 94, -46);
+$s_icon1_f2->drawCurve(-55, 203, -200, 330);
+$s_icon1_f2->drawCurve(-216, 353, -58, 174);
+$s_icon1_f2->drawCurve(-63, 180, -15, 385);
+$s_icon1_f2->drawCurve(-15, 376, -65, 176);
+$s_icon1_f2->drawCurve(-29, 75, -89, 94);
+$s_icon1_f2->drawCurve(-109, 118, -27, 39);
+$s_icon1_f2->drawCurve(166, 61, 76, 14);
+$s_icon1_f2->drawCurve(133, 22, 111, -53);
+$s_icon1_f2->drawCurve(95, -47, 84, -104);
+$s_icon1_f2->drawCurve(82, -103, 41, -123);
+$s_icon1_f2->drawCurve(99, -294, -179, -157);
+$s_icon1_f2->drawCurve(-79, 292, -252, 95);
+$s_icon1_f2->drawCurve(4, -65, 55, -114);
+$s_icon1_f2->drawCurve(56, -117, 8, -64);
+$s_icon1_f2->drawCurve(5, -45, -11, -109);
+$s_icon1_f2->drawCurve(-9, -99, 13, -59);
+$s_icon1_f2->drawCurve(42, -224, 150, -278);
+$s_icon1_f2->drawCurve(86, -160, 189, -310);
+$s_icon1_f2->drawLine(182, -306);
+$s_icon1_f2->drawCurve(115, -169, 126, -87);
+$s_icon1_f2->drawCurve(95, -69, 136, -19);
+$s_icon1_f2->drawLine(240, -14);
+$s_icon1_f2->drawCurve(146, -2, 82, -26);
+$s_icon1_f2->drawCurve(116, -37, 78, -98);
+$s_icon1_f2->drawCurve(241, -304, 17, -285);
+$s_icon1_f2->drawCurve(20, -341, -333, -182);
+$s_icon1_f2->drawCurve(-107, -60, -144, -8);
+$s_icon1_f2->drawCurve(43, 246, -66, 207);
+$s_icon1_f2->drawCurve(-59, 180, -164, 212);
+$s_icon1_f2->drawLine(-39, -10);
+$s_icon1_f2->drawCurve(5, -69, 42, -95);
+$s_icon1_f2->drawLine(77, -164);
+$s_icon1_f2->drawCurve(95, -205, -56, -141);
+$s_icon1_f2->drawCurve(-119, -303, -342, 195);
+$s_icon1_f2->drawCurve(-200, 112, -247, 263);
+$s_icon1_f2->drawCurve(-252, 275, -240, 406);
+$s_icon1_f2->drawCurve(-66, 115, -332, 623);
+$s_icon1_f2->drawCurve(-180, 321, -85, 163);
+$s_icon1_f2->drawCurve(-148, 282, -62, 224);
+$s_icon1_f2->drawCurve(-70, 259, -14, 170);
+$s_icon1_f2->movePenTo(1610, 4252);
+$s_icon1_f2->setLeftFill(0x00, 0x00, 0x00);
+$s_icon1_f2->setRightFill();
+$s_icon1_f2->drawCurve(-16, 242, 71, 209);
+$s_icon1_f2->drawCurve(41, 133, 104, 72);
+$s_icon1_f2->drawCurve(45, 31, 171, 72);
+$s_icon1_f2->drawCurve(159, 66, -2, 3);
+$s_icon1_f2->drawCurve(191, 70, 76, 13);
+$s_icon1_f2->drawCurve(148, 24, 122, -53);
+$s_icon1_f2->drawCurve(105, -48, 91, -107);
+$s_icon1_f2->drawCurve(87, -103, 46, -132);
+$s_icon1_f2->drawCurve(116, -339, -213, -135);
+$s_icon1_f2->drawCurve(-93, -59, -91, -26);
+$s_icon1_f2->drawCurve(-51, -12, -7, -64);
+$s_icon1_f2->drawCurve(-9, -79, 11, -59);
+$s_icon1_f2->drawCurve(18, -98, 86, -148);
+$s_icon1_f2->drawLine(161, -268);
+$s_icon1_f2->drawCurve(100, -178, 193, -304);
+$s_icon1_f2->drawCurve(83, -140, 130, -173);
+$s_icon1_f2->drawCurve(145, -193, 65, -40);
+$s_icon1_f2->drawCurve(42, -30, 209, -3);
+$s_icon1_f2->drawLine(351, 2);
+$s_icon1_f2->drawCurve(56, 0, 138, -119);
+$s_icon1_f2->drawCurve(107, -94, 64, -77);
+$s_icon1_f2->drawCurve(262, -315, 13, -299);
+$s_icon1_f2->drawCurve(7, -151, -260, -172);
+$s_icon1_f2->drawCurve(-123, -80, -176, -79);
+$s_icon1_f2->drawCurve(-500, -222, -227, 120);
+$s_icon1_f2->drawCurve(-219, 115, -269, 273);
+$s_icon1_f2->drawCurve(-277, 286, -257, 419);
+$s_icon1_f2->drawCurve(-88, 149, -340, 619);
+$s_icon1_f2->drawCurve(-182, 312, -105, 191);
+$s_icon1_f2->drawCurve(-159, 295, -65, 233);
+$s_icon1_f2->drawCurve(-73, 273, -12, 177);
+
+# Icon1 Movieclip
+my $i_icon1 = new SWF::Sprite();
+$item = $i_icon1->add($s_icon1);
+$item->scaleTo(0.5);
+$item->moveTo(-3000, -2100);
+$i_icon1->nextFrame();
+$i_icon1->remove($item);
+$item = $i_icon1->add($s_icon1_f2);
+$item->scaleTo(0.5);
+$item->moveTo(-3000, -2100);
+$i_icon1->nextFrame();
+
+
+$envelope = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(8722, 1745);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawCurve(-7, -42, 6, -35);
+$s1->drawCurve(3, -14, -68, -18);
+$s1->drawLine(-40, -15);
+$s1->drawLine(0, -2);
+$s1->drawLine(-5, -2);
+$s1->drawCurve(-11, -9, 7, -9);
+$s1->drawLine(10, -12);
+$s1->drawLine(-7, 7);
+$s1->drawLine(-15, 17);
+$s1->drawCurve(-372, -133, -468, -40);
+$s1->drawCurve(-301, -26, -578, 7);
+$s1->drawCurve(-1570, 19, -1710, 381);
+$s1->drawCurve(-751, 162, -409, 194);
+$s1->drawCurve(-136, 59, -73, 40);
+$s1->drawCurve(-132, 72, -29, 76);
+$s1->drawCurve(-41, 106, 107, 251);
+$s1->drawLine(165, 376);
+$s1->drawCurve(96, 223, 43, 161);
+$s1->drawCurve(153, 581, 43, 714);
+$s1->drawCurve(21, 339, 3, 741);
+$s1->drawLine(-1, 0);
+$s1->drawCurve(-14, 37, 15, 145);
+$s1->drawLine(0, 43);
+$s1->drawLine(4, -4);
+$s1->drawCurve(24, 194, 71, 65);
+$s1->drawCurve(34, 31, 27, 39);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawCurve(8, -74, 37, -92);
+$s1->drawCurve(30, -75, 49, -88);
+$s1->drawLine(78, -126);
+$s1->drawLine(110, -195);
+$s1->drawCurve(252, -493, 132, -246);
+$s1->drawCurve(226, -424, 193, -297);
+$s1->drawCurve(114, -212, 78, -119);
+$s1->drawCurve(143, -219, 129, -17);
+$s1->drawCurve(81, -12, 149, 47);
+$s1->drawLine(230, 75);
+$s1->drawLine(641, 180);
+$s1->drawCurve(397, 96, 262, -36);
+$s1->drawCurve(153, -20, 215, -136);
+$s1->drawCurve(121, -76, 211, -165);
+$s1->drawLine(128, -121);
+$s1->drawCurve(88, -78, 64, 6);
+$s1->drawCurve(89, 6, 125, 95);
+$s1->drawLine(186, 156);
+$s1->drawCurve(272, 221, 181, 245);
+$s1->drawCurve(167, 227, 153, 337);
+$s1->drawCurve(25, 55, 109, 192);
+$s1->drawLine(14, 29);
+$s1->drawCurve(37, 75, 14, 55);
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawLine(62, -139);
+$s1->setRightFill();
+$s1->drawLine(8, -17);
+$s1->drawLine(2, 16);
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawLine(12, 0);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawLine(-8, -29);
+$s1->drawLine(-14, -43);
+$s1->drawCurve(-175, -524, -586, -670);
+$s1->drawLine(-250, -216);
+$s1->drawCurve(-173, -149, -24, -95);
+$s1->drawCurve(-16, -68, 116, -105);
+$s1->drawCurve(62, -56, 112, -81);
+$s1->drawCurve(343, -294, 317, -316);
+$s1->drawLine(115, -125);
+$s1->drawLine(42, -49);
+$s1->drawCurve(75, -80, 67, -43);
+$s1->drawCurve(21, -13, 20, -10);
+$s1->drawCurve(168, 451, 15, 659);
+$s1->drawCurve(8, 339, -51, 791);
+$s1->drawCurve(-26, 317, -13, 83);
+$s1->drawCurve(-41, 252, -81, 74);
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawCurve(38, 1, 5, 9);
+$s1->drawCurve(12, 23, -21, 49);
+$s1->setRightFill();
+$s1->drawLine(63, -55);
+$s1->drawLine(27, -80);
+$s1->drawCurve(82, -72, 40, -254);
+$s1->drawCurve(13, -82, 26, -318);
+$s1->drawCurve(51, -773, -8, -357);
+$s1->drawCurve(-8, -325, -63, -346);
+$s1->drawLine(-53, -306);
+$s1->drawCurve(-30, -156, -36, -97);
+$s1->drawLine(4, -26);
+$s1->drawCurve(7, -40, -11, -42);
+$s1->drawLine(-20, -64);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawCurve(-25, 107, -69, 111);
+$s1->drawCurve(-78, 127, -128, 131);
+$s1->drawLine(-104, 100);
+$s1->drawCurve(-112, 101, -201, 160);
+$s1->drawLine(-276, 228);
+$s1->drawCurve(-104, 93, -224, 227);
+$s1->drawCurve(-209, 214, -128, 117);
+$s1->drawCurve(-409, 376, -366, 113);
+$s1->drawCurve(-200, 62, -323, -54);
+$s1->drawLine(-517, -118);
+$s1->drawCurve(-873, -199, -527, -258);
+$s1->drawCurve(-115, -55, -627, -345);
+$s1->drawCurve(-340, -188, -265, -110);
+$s1->drawLine(-153, -58);
+$s1->drawCurve(28, 111, 153, 92);
+$s1->drawLine(136, 74);
+$s1->drawLine(123, 59);
+$s1->drawLine(696, 405);
+$s1->drawCurve(418, 225, 326, 74);
+$s1->drawCurve(-35, 163, -200, 233);
+$s1->drawLine(-165, 187);
+$s1->drawCurve(-91, 102, -49, 75);
+$s1->drawCurve(-253, 386, -404, 834);
+$s1->drawCurve(-13, 26, -101, 276);
+$s1->drawLine(-1, 5);
+$s1->drawCurve(-37, 98, -38, 70);
+$s1->drawCurve(-37, 66, -36, 39);
+$s1->drawLine(-1, -316);
+$s1->drawCurve(14, -791, -13, -211);
+$s1->drawCurve(-45, -735, -141, -536);
+$s1->drawCurve(-72, -266, -52, -121);
+$s1->drawCurve(-167, -318, -35, -85);
+$s1->drawCurve(-109, -256, 31, -82);
+$s1->drawCurve(28, -76, 133, -72);
+$s1->drawCurve(77, -42, 132, -57);
+$s1->drawCurve(412, -195, 748, -161);
+$s1->drawCurve(1708, -380, 1572, -20);
+$s1->drawCurve(567, -7, 312, 26);
+$s1->drawCurve(386, 33, 319, 96);
+$s1->drawLine(139, 46);
+$s1->setLeftFill();
+$s1->drawLine(17, 6);
+$s1->drawLine(-7, 38);
+$s1->movePenTo(8579, 5100);
+$s1->setLeftFill(0x33, 0x33, 0x33);
+$s1->setRightFill();
+$s1->drawLine(-10, 1);
+$s1->movePenTo(8614, 5100);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawLine(-19, 14);
+$s1->drawLine(-4, -14);
+$s1->movePenTo(8648, 5182);
+$s1->setLeftFill();
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawLine(-30, 53);
+$s1->drawCurve(-59, 95, 5, 18);
+$s1->drawCurve(15, 55, -11, 35);
+$s1->drawCurve(-17, 57, -122, 37);
+$s1->drawCurve(-141, 33, -36, 13);
+$s1->drawCurve(-315, 111, -665, 189);
+$s1->drawCurve(-916, 264, -1272, 173);
+$s1->drawLine(-1105, 136);
+$s1->drawLine(-1075, 127);
+$s1->drawLine(-32, 4);
+$s1->drawLine(0, -4);
+$s1->drawCurve(-2, -19, -25, -47);
+$s1->drawLine(-23, -39);
+$s1->setRightFill(0xf0, 0xf0, 0xf0);
+$s1->drawLine(-4, 1);
+$s1->drawLine(-3, 0);
+$s1->drawLine(0, -1);
+$s1->drawLine(1, -9);
+$s1->setLeftFill(0xff, 0xff, 0xff);
+$s1->drawLine(6, 9);
+$s1->setRightFill(0x33, 0x33, 0x33);
+$s1->drawLine(1100, -130);
+$s1->drawLine(1105, -136);
+$s1->drawCurve(1272, -174, 916, -263);
+$s1->drawCurve(673, -192, 307, -108);
+$s1->drawLine(177, -46);
+$s1->drawCurve(123, -38, 16, -56);
+$s1->drawCurve(11, -33, -15, -57);
+$i1 = $envelope->add($s1);
+$i1->scaleTo(0.5);
+$i1->moveTo(-2620, -1800);
+$envelope->nextFrame(); # end of frame 1
+
+
+
+$telefono3 = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(7575, 1918);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawCurve(534, 752, 0, 980);
+$s1->drawCurve(0, 1239, -855, 875);
+$s1->drawCurve(-855, 876, -1210, 0);
+$s1->drawCurve(-966, 0, -739, -558);
+$s1->drawCurve(-187, -141, -173, -177);
+$s1->drawCurve(-855, -875, 0, -1239);
+$s1->drawCurve(0, -1239, 855, -876);
+$s1->drawCurve(855, -875, 1210, 0);
+$s1->drawCurve(1210, 0, 855, 875);
+$s1->drawCurve(179, 183, 142, 200);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(8001, 3420);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawCurve(98, 665, -296, 644);
+$s1->drawCurve(-342, 737, -687, 446);
+$s1->drawCurve(-697, 454, -805, 0);
+$s1->drawCurve(-673, 0, -404, -219);
+$s1->drawCurve(-527, -286, 140, -586);
+$s1->drawCurve(530, 95, 272, -641);
+$s1->drawCurve(76, -198, -14, -463);
+$s1->drawCurve(-14, -433, 136, -269);
+$s1->drawCurve(129, -249, 220, -249);
+$s1->drawCurve(125, -143, 255, -259);
+$s1->drawCurve(443, -478, 73, -532);
+$s1->drawCurve(-966, 127, -641, 1138);
+$s1->drawCurve(-478, 839, -205, 1169);
+$s1->drawCurve(-32, 164, -83, 320);
+$s1->drawCurve(-67, 280, 0, 170);
+$s1->drawCurve(4, 478, 516, 235);
+$s1->drawCurve(1119, 518, 1052, -426);
+$s1->drawCurve(949, -385, 557, -982);
+$s1->drawCurve(551, -975, -132, -1040);
+$s1->drawCurve(-150, -1142, -948, -716);
+$s1->drawCurve(-558, -419, -628, -103);
+$s1->drawCurve(-1174, -184, -1011, 549);
+$s1->drawCurve(-1056, 576, -314, 1105);
+$s1->drawCurve(-188, 709, 73, 777);
+$s1->drawCurve(97, 1050, 645, -13);
+$s1->drawCurve(-505, -907, -42, -730);
+$s1->drawCurve(-38, -726, 359, -627);
+$s1->drawCurve(338, -587, 606, -375);
+$s1->drawCurve(603, -371, 701, -65);
+$s1->drawCurve(736, -68, 658, 297);
+$s1->drawCurve(677, 300, 428, 644);
+$s1->drawCurve(391, 590, 118, 770);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(6224, 1529);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawLine(-419, 1023);
+$s1->drawCurve(356, -52, 139, -341);
+$s1->drawCurve(140, -340, -216, -290);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(4920, 4347);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawLine(-558, 954);
+$s1->drawCurve(397, -27, 213, -300);
+$s1->drawCurve(226, -324, -278, -303);
+$i4 = $telefono3->add($s1);
+$i4->scaleTo(0.5);
+$i4->moveTo(-2620, -1800);
+$telefono3->nextFrame(); # end of frame 1
+
+
+### Shape 1 ###
+
+$telefono4 = new SWF::Sprite();
+$s1 = new SWF::Shape();
+$s1->movePenTo(8338, 3364);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawCurve(301, -19, 150, -103);
+$s1->drawCurve(138, -96, 48, -167);
+$s1->drawCurve(44, -155, -37, -181);
+$s1->drawCurve(-36, -176, -99, -146);
+$s1->drawCurve(-51, -75, -139, -135);
+$s1->drawCurve(-141, -134, -79, -50);
+$s1->drawCurve(-106, -67, -122, -53);
+$s1->drawCurve(-49, -21, -58, -15);
+$s1->drawLine(-5230, 0);
+$s1->drawCurve(-275, 97, -202, 205);
+$s1->drawCurve(-172, 171, -152, 382);
+$s1->drawLine(-45, 91);
+$s1->drawCurve(-27, 54, 0, 43);
+$s1->drawCurve(-3, 172, 66, 126);
+$s1->drawCurve(78, 149, 155, 31);
+$s1->drawCurve(190, 38, 174, 9);
+$s1->setRightFill(0x00, 0x33, 0x99, 0x00);
+$s1->drawLine(298, -10);
+$s1->drawCurve(414, -51, 126, -252);
+$s1->drawCurve(33, -66, 11, -101);
+$s1->drawLine(11, -180);
+$s1->drawCurve(15, -225, 114, -90);
+$s1->drawCurve(86, -70, 209, -15);
+$s1->drawLine(170, -9);
+$s1->drawLine(149, -15);
+$s1->drawLine(0, 587);
+$s1->drawLine(2285, 0);
+$s1->drawLine(0, -616);
+$s1->drawLine(352, 24);
+$s1->drawCurve(221, 21, 84, 114);
+$s1->drawCurve(66, 90, 43, 170);
+$s1->drawLine(67, 299);
+$s1->drawCurve(44, 168, 71, 89);
+$s1->drawCurve(91, 113, 161, 23);
+$s1->drawCurve(281, 39, 239, -10);
+$s1->drawLine(38, -2);
+$s1->setLeftFill();
+$s1->setLine(20, 0xcc, 0xcc, 0xcc, 0x00);
+$s1->drawLine(0, 1760);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawCurve(75, 104, 58, 98);
+$s1->drawCurve(96, 167, 40, 101);
+$s1->drawCurve(63, 159, -11, 130);
+$s1->drawCurve(-15, 199, -132, 16);
+$s1->drawLine(14, 28);
+$s1->drawLine(-314, 95);
+$s1->drawLine(-486, 19);
+$s1->drawLine(-4671, 0);
+$s1->drawLine(-514, -85);
+$s1->drawLine(-114, -74);
+$s1->drawCurve(-68, -45, -28, -53);
+$s1->drawCurve(-97, -173, 100, -266);
+$s1->drawCurve(59, -160, 159, -243);
+$s1->drawCurve(45, -68, 62, -74);
+$s1->setRightFill(0x00, 0x33, 0x99, 0x00);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc, 0x00);
+$s1->drawLine(0, -1660);
+$s1->movePenTo(8338, 5124);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawCurve(-149, -207, -220, -232);
+$s1->drawCurve(-388, -388, -184, -199);
+$s1->drawLine(-246, -288);
+$s1->drawCurve(-161, -182, -121, -58);
+$s1->drawLine(128, 179);
+$s1->drawCurve(73, 106, 35, 86);
+$s1->drawCurve(117, 301, -82, 325);
+$s1->drawCurve(-78, 311, -232, 236);
+$s1->drawLine(-165, 168);
+$s1->drawCurve(-113, 100, -83, 16);
+$s1->drawLine(-14, 43);
+$s1->drawCurve(-57, -5, -95, 42);
+$s1->drawLine(-148, 65);
+$s1->drawCurve(-239, 83, -276, 26);
+$s1->drawCurve(-304, 29, -309, -82);
+$s1->drawCurve(-308, -81, -253, -176);
+$s1->drawCurve(-263, -183, -157, -251);
+$s1->drawCurve(-168, -269, -21, -312);
+$s1->drawCurve(-16, -209, 190, -362);
+$s1->drawLine(77, -125);
+$s1->drawCurve(48, -84, -1, -48);
+$s1->drawLine(-1029, 1028);
+$s1->drawLine(-302, 293);
+$s1->drawCurve(-94, 94, -71, 85);
+$s1->movePenTo(6484, 5069);
+$s1->setLeftFill(0x00, 0x33, 0x99, 0x00);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(-15, 13);
+$s1->drawCurve(-400, 316, -564, 0);
+$s1->drawCurve(-438, 0, -339, -190);
+$s1->drawCurve(-98, -55, -90, -71);
+$s1->drawLine(-15, -13);
+$s1->drawCurve(-385, -312, 1, -437);
+$s1->drawCurve(-1, -447, 400, -316);
+$s1->drawCurve(400, -316, 565, 0);
+$s1->drawCurve(550, 0, 393, 301);
+$s1->drawLine(21, 15);
+$s1->drawCurve(400, 316, 0, 447);
+$s1->drawCurve(-1, 437, -384, 312);
+$s1->movePenTo(5501, 1760);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->setRightFill();
+$s1->drawLine(-4, 0);
+$s1->drawLine(0, 6);
+$s1->drawLine(4, -6);
+$i1 = $telefono4->add($s1);
+$i1->scaleTo(0.5);
+$i1->moveTo(-2720, -1890);
+$telefono4->nextFrame(); # end of frame 1
+$telefono4->remove($i1);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(8338, 5128);
+$s2->setLeftFill(0x00, 0x00, 0x00);
+$s2->setRightFill(0x00, 0x33, 0x99, 0x00);
+$s2->drawCurve(-151, -210, -223, -236);
+$s2->drawCurve(-388, -388, -184, -199);
+$s2->drawLine(-246, -288);
+$s2->drawCurve(-161, -182, -121, -58);
+$s2->drawLine(128, 179);
+$s2->drawCurve(73, 106, 35, 86);
+$s2->drawCurve(117, 301, -82, 325);
+$s2->drawCurve(-78, 311, -232, 236);
+$s2->drawLine(-165, 168);
+$s2->drawCurve(-113, 100, -83, 16);
+$s2->drawLine(-14, 43);
+$s2->drawCurve(-57, -5, -95, 42);
+$s2->drawLine(-148, 65);
+$s2->drawCurve(-239, 83, -276, 26);
+$s2->drawCurve(-304, 29, -309, -82);
+$s2->drawCurve(-308, -81, -253, -176);
+$s2->drawCurve(-263, -183, -157, -251);
+$s2->drawCurve(-168, -269, -21, -312);
+$s2->drawCurve(-16, -209, 190, -362);
+$s2->drawLine(77, -125);
+$s2->drawCurve(48, -84, -1, -48);
+$s2->drawLine(-1029, 1028);
+$s2->drawLine(-302, 293);
+$s2->drawCurve(-91, 90, -69, 83);
+$s2->setRightFill();
+$s2->drawCurve(-65, 77, -47, 71);
+$s2->drawCurve(-159, 243, -59, 160);
+$s2->drawCurve(-100, 266, 97, 173);
+$s2->drawCurve(28, 53, 68, 45);
+$s2->drawLine(114, 74);
+$s2->drawLine(514, 85);
+$s2->drawLine(4671, 0);
+$s2->drawLine(486, -19);
+$s2->drawLine(314, -95);
+$s2->drawLine(-14, -28);
+$s2->drawCurve(132, -16, 15, -199);
+$s2->drawCurve(11, -130, -63, -159);
+$s2->drawCurve(-40, -101, -96, -167);
+$s2->drawCurve(-56, -94, -72, -101);
+$s2->setLeftFill(0x00, 0x33, 0x99, 0x00);
+$s2->drawLine(0, -3048);
+$s2->drawLine(-2669, 0);
+$s2->setRightFill(0x00, 0x00, 0x00);
+$s2->drawLine(-162, 131);
+$s2->drawCurve(-130, 97, -144, -15);
+$s2->drawCurve(-113, -12, -149, -87);
+$s2->drawLine(-178, -114);
+$s2->setRightFill();
+$s2->drawLine(-688, 0);
+$s2->setRightFill(0x00, 0x00, 0x00);
+$s2->drawCurve(-154, 146, -75, 52);
+$s2->drawLine(436, 433);
+$s2->drawLine(-1609, 1617);
+$s2->drawLine(-44, -44);
+$s2->setRightFill();
+$s2->drawLine(0, 706);
+$s2->movePenTo(5669, 2080);
+$s2->setLeftFill(0x00, 0x00, 0x00);
+$s2->drawCurve(124, -108, 101, -109);
+$s2->drawLine(25, -28);
+$s2->drawCurve(199, -226, 32, -179);
+$s2->drawCurve(29, -165, -84, -152);
+$s2->drawCurve(-79, -140, -154, -101);
+$s2->drawCurve(-149, -99, -174, -32);
+$s2->drawLine(-282, -13);
+$s2->drawCurve(-194, 4, -91, 21);
+$s2->drawCurve(-122, 28, -124, 49);
+$s2->drawCurve(-49, 20, -52, 31);
+$s2->drawLine(-1193, 1199);
+$s2->setRightFill(0x00, 0x33, 0x99, 0x00);
+$s2->drawLine(-773, 776);
+$s2->setRightFill();
+$s2->drawLine(-1715, 1724);
+$s2->drawCurve(-125, 263, 3, 288);
+$s2->drawCurve(0, 241, 162, 377);
+$s2->drawLine(33, 96);
+$s2->drawCurve(20, 56, 30, 31);
+$s2->drawCurve(120, 123, 135, 43);
+$s2->drawCurve(161, 49, 131, -88);
+$s2->drawCurve(161, -108, 128, -116);
+$s2->drawCurve(115, -106, 88, -112);
+$s2->drawCurve(255, -328, -89, -268);
+$s2->drawCurve(-24, -69, -64, -79);
+$s2->drawLine(-119, -135);
+$s2->drawCurve(-149, -169, 16, -143);
+$s2->drawCurve(12, -110, 136, -159);
+$s2->drawLine(113, -126);
+$s2->drawLine(95, -116);
+$s2->drawLine(371, 369);
+$s2->movePenTo(4105, 2080);
+$s2->drawLine(36, -34);
+$s2->drawCurve(170, -142, 140, 21);
+$s2->drawCurve(110, 16, 151, 90);
+$s2->drawLine(81, 49);
+$s2->movePenTo(6464, 3554);
+$s2->setLeftFill(0x00, 0x33, 0x99, 0x00);
+$s2->setRightFill(0x00, 0x00, 0x00);
+$s2->drawCurve(400, 316, 0, 447);
+$s2->drawCurve(-1, 437, -384, 312);
+$s2->drawLine(-15, 13);
+$s2->drawCurve(-400, 316, -564, 0);
+$s2->drawCurve(-438, 0, -339, -190);
+$s2->drawCurve(-98, -55, -90, -71);
+$s2->drawLine(-15, -13);
+$s2->drawCurve(-385, -312, 1, -437);
+$s2->drawCurve(-1, -447, 400, -316);
+$s2->drawCurve(400, -316, 565, 0);
+$s2->drawCurve(550, 0, 393, 301);
+$s2->drawLine(21, 15);
+$s2->movePenTo(2659, 2856);
+$s2->setLeftFill();
+$s2->setRightFill(0x00, 0x33, 0x99, 0x00);
+$s2->drawLine(0, -776);
+$s2->drawLine(773, 0);
+$i1 = $telefono4->add($s2);
+$i1->scaleTo(0.5);
+$i1->moveTo(-2720, -1890);
+$telefono4->nextFrame(); # end of frame 2
+$telefono4->remove($i1);
+
+
+
+$conference1 = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(7708, 2179);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->drawCurve(-94, -8, -225, 66);
+$s1->drawCurve(-209, 62, -92, -23);
+$s1->drawCurve(-122, -31, -248, -183);
+$s1->drawCurve(-230, -168, -160, -18);
+$s1->drawCurve(0, -285, -17, -118);
+$s1->drawCurve(-34, -233, -116, -138);
+$s1->drawCurve(-43, -50, -111, -68);
+$s1->drawCurve(-110, -66, -39, -49);
+$s1->drawCurve(-30, -36, -17, -78);
+$s1->drawCurve(-18, -84, -22, -32);
+$s1->drawCurve(-65, -97, -133, -15);
+$s1->drawCurve(-127, -15, -95, 67);
+$s1->drawCurve(-65, 46, -27, 104);
+$s1->drawCurve(-32, 117, -33, 36);
+$s1->drawCurve(-47, 51, -73, 40);
+$s1->drawLine(-124, 62);
+$s1->drawCurve(-146, 77, -43, 144);
+$s1->drawCurve(-20, 66, 3, 224);
+$s1->drawCurve(2, 199, -42, 67);
+$s1->drawCurve(-25, 42, -64, 28);
+$s1->drawLine(-107, 40);
+$s1->drawCurve(-123, 57, -237, 157);
+$s1->drawCurve(-84, -177, -230, -160);
+$s1->drawCurve(-244, -171, -183, 21);
+$s1->drawCurve(-68, 7, -117, 64);
+$s1->drawCurve(-116, 64, -59, 5);
+$s1->drawCurve(-59, 4, -105, -25);
+$s1->drawCurve(-120, -29, -39, -3);
+$s1->drawCurve(-172, -12, -35, 232);
+$s1->drawCurve(-14, 83, 57, 86);
+$s1->drawCurve(80, 121, 10, 30);
+$s1->drawCurve(15, 49, -10, 100);
+$s1->drawCurve(-10, 110, 5, 41);
+$s1->drawCurve(23, 212, 177, 208);
+$s1->drawCurve(32, 37, 181, 138);
+$s1->drawCurve(148, 113, 29, 75);
+$s1->drawCurve(22, 54, -39, 125);
+$s1->drawLine(-56, 178);
+$s1->drawCurve(-35, 154, -5, 205);
+$s1->drawCurve(-3, 119, 3, 242);
+$s1->drawCurve(-314, 56, -182, 207);
+$s1->drawCurve(-200, 225, 76, 292);
+$s1->drawCurve(-84, 43, -60, 82);
+$s1->drawCurve(-59, 81, -12, 89);
+$s1->drawCurve(-30, 211, 225, 64);
+$s1->drawLine(139, -6);
+$s1->drawCurve(92, -17, 42, 19);
+$s1->drawCurve(61, 27, 65, 48);
+$s1->drawLine(105, 80);
+$s1->drawCurve(124, 86, 152, -8);
+$s1->drawCurve(78, -3, 205, -89);
+$s1->drawCurve(188, -83, 79, 12);
+$s1->drawCurve(59, 8, 93, 81);
+$s1->drawLine(139, 120);
+$s1->drawCurve(82, 60, 219, 94);
+$s1->drawCurve(206, 90, 86, 70);
+$s1->drawCurve(54, 47, 9, 169);
+$s1->drawCurve(11, 214, 9, 30);
+$s1->drawCurve(47, 153, 129, 76);
+$s1->drawLine(117, 63);
+$s1->drawCurve(73, 40, 51, 44);
+$s1->drawCurve(34, 30, 27, 51);
+$s1->drawLine(41, 84);
+$s1->drawCurve(50, 93, 115, 6);
+$s1->drawCurve(147, 10, 58, -77);
+$s1->drawCurve(56, -112, 69, -65);
+$s1->drawCurve(28, -29, 72, -20);
+$s1->drawLine(110, -37);
+$s1->drawCurve(164, -85, 96, -225);
+$s1->drawCurve(17, -41, 15, -81);
+$s1->drawLine(28, -142);
+$s1->drawCurve(37, -176, 83, -44);
+$s1->drawCurve(34, -19, 208, -99);
+$s1->drawCurve(148, -71, 90, -61);
+$s1->drawLine(112, -88);
+$s1->drawCurve(76, -58, 52, -3);
+$s1->drawCurve(41, -5, 54, 41);
+$s1->drawLine(85, 70);
+$s1->drawCurve(145, 112, 195, 58);
+$s1->drawCurve(237, 76, 199, -119);
+$s1->drawLine(90, -74);
+$s1->drawCurve(56, -50, 41, -10);
+$s1->drawLine(125, 10);
+$s1->drawCurve(78, 16, 50, -26);
+$s1->drawCurve(176, -86, -36, -142);
+$s1->drawCurve(-9, -35, -41, -94);
+$s1->drawCurve(-38, -86, -8, -52);
+$s1->drawCurve(-7, -47, 12, -110);
+$s1->drawCurve(11, -102, -16, -61);
+$s1->drawCurve(-108, -386, -592, -254);
+$s1->drawCurve(44, -191, -8, -349);
+$s1->drawLine(-12, -119);
+$s1->drawCurve(-6, -76, 22, -39);
+$s1->drawCurve(42, -77, 165, -101);
+$s1->drawCurve(167, -102, 49, -86);
+$s1->drawCurve(55, -93, -7, -182);
+$s1->drawCurve(-6, -190, 35, -72);
+$s1->drawCurve(21, -45, 45, -53);
+$s1->drawLine(71, -86);
+$s1->drawCurve(77, -102, -34, -114);
+$s1->drawCurve(-55, -175, -157, 10);
+$s1->drawLine(-141, 23);
+$s1->drawLine(-144, 12);
+$s1->drawCurve(-66, -6, -134, -99);
+$s1->drawCurve(-134, -98, -89, -7);
+$s1->movePenTo(7475, 2574);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawLine(76, -16);
+$s1->drawCurve(82, -14, 35, 92);
+$s1->drawLine(-180, 40);
+$s1->drawLine(320, 580);
+$s1->drawLine(200, -40);
+$s1->drawLine(-160, 140);
+$s1->drawLine(60, 300);
+$s1->drawLine(20, 20);
+$s1->drawCurve(80, -27, 98, -68);
+$s1->drawCurve(107, -77, 73, -89);
+$s1->drawCurve(190, -234, -152, -172);
+$s1->drawCurve(-24, -28, -86, 11);
+$s1->drawLine(-126, 4);
+$s1->drawCurve(-200, -78, 8, -176);
+$s1->drawCurve(7, -139, 125, -167);
+$s1->drawCurve(-164, -145, -234, -11);
+$s1->drawCurve(-219, -11, -203, 107);
+$s1->drawCurve(127, 165, 56, 25);
+$s1->drawCurve(37, 15, 47, -7);
+$s1->movePenTo(8069, 2800);
+$s1->drawCurve(62, 82, 101, -5);
+$s1->drawCurve(117, -7, 99, -134);
+$s1->drawCurve(-55, 15, -23, -20);
+$s1->drawCurve(-20, -20, -2, -55);
+$s1->drawLine(-160, 160);
+$s1->drawLine(-80, -120);
+$s1->drawLine(300, -120);
+$s1->drawLine(-40, 60);
+$s1->drawLine(100, 80);
+$s1->drawCurve(91, -115, -70, -84);
+$s1->drawCurve(-63, -76, -138, -5);
+$s1->drawLine(23, 60);
+$s1->drawLine(-15, 15);
+$s1->drawCurve(-15, 15, -24, -12);
+$s1->drawLine(-29, -38);
+$s1->drawCurve(-150, 45, -37, 105);
+$s1->drawCurve(-34, 91, 62, 83);
+$s1->movePenTo(6728, 2876);
+$s1->drawLine(-60, 200);
+$s1->drawLine(100, -200);
+$s1->drawLine(-40, 0);
+$s1->movePenTo(6768, 2597);
+$s1->drawCurve(-162, 217, -18, 202);
+$s1->drawLine(233, -397);
+$s1->drawLine(307, -283);
+$s1->drawCurve(-187, 26, -173, 235);
+$s1->movePenTo(7268, 3396);
+$s1->drawCurve(-87, -292, -133, -88);
+$s1->drawCurve(22, 110, 55, 103);
+$s1->drawCurve(65, 122, 78, 45);
+$s1->movePenTo(7268, 3716);
+$s1->drawLine(-260, -20);
+$s1->drawCurve(14, 75, 106, 7);
+$s1->drawCurve(104, 6, 36, -68);
+$s1->movePenTo(7248, 3596);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->setRightFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(0, 40);
+$s1->drawLine(-240, 0);
+$s1->drawLine(0, -40);
+$s1->drawLine(240, 0);
+$s1->movePenTo(7908, 3736);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawCurve(-377, 104, -523, -4);
+$s1->drawCurve(165, 80, 310, -16);
+$s1->drawCurve(340, -20, 85, -144);
+$s1->movePenTo(7808, 3316);
+$s1->drawLine(-820, 180);
+$s1->drawCurve(142, 59, 293, -57);
+$s1->drawCurve(303, -61, 82, -121);
+$s1->movePenTo(8267, 5159);
+$s1->drawCurve(-150, -97, -69, -32);
+$s1->drawCurve(-255, -119, -45, 265);
+$s1->drawLine(360, 200);
+$s1->drawLine(-20, -140);
+$s1->drawLine(440, 260);
+$s1->drawLine(-20, -280);
+$s1->drawLine(-40, 60);
+$s1->drawCurve(-59, -26, -142, -91);
+$s1->movePenTo(8488, 5176);
+$s1->drawCurve(-77, -155, -168, -129);
+$s1->drawCurve(-158, -121, -177, -55);
+$s1->drawCurve(-22, 132, 234, 153);
+$s1->drawCurve(178, 115, 190, 60);
+$s1->movePenTo(8228, 5636);
+$s1->drawLine(240, 120);
+$s1->drawLine(-20, -80);
+$s1->drawLine(60, -20);
+$s1->drawCurve(-39, -43, -73, -27);
+$s1->drawCurve(-72, -28, -68, 3);
+$s1->drawCurve(-170, 6, 38, 169);
+$s1->drawCurve(33, 130, 231, 90);
+$s1->drawCurve(-12, -38, 2, -20);
+$s1->drawLine(-30, -22);
+$s1->drawLine(100, -20);
+$s1->drawLine(-18, 71);
+$s1->drawLine(-2, 29);
+$s1->drawCurve(132, 10, 35, -91);
+$s1->drawCurve(32, -86, -59, -113);
+$s1->drawLine(-20, 20);
+$s1->drawLine(0, 40);
+$s1->drawLine(-20, 20);
+$s1->drawLine(-40, 0);
+$s1->drawLine(0, 100);
+$s1->drawLine(-240, -120);
+$s1->drawLine(-25, 17);
+$s1->drawLine(-35, 3);
+$s1->drawLine(36, -89);
+$s1->drawLine(4, -31);
+$s1->movePenTo(7648, 4836);
+$s1->drawCurve(-122, 198, -43, 128);
+$s1->drawCurve(-65, 189, 50, 165);
+$s1->drawLine(60, -320);
+$s1->drawLine(160, -360);
+$s1->drawLine(-40, 0);
+$s1->movePenTo(7528, 4796);
+$s1->drawLine(-80, 200);
+$s1->drawLine(120, -200);
+$s1->drawLine(-40, 0);
+$s1->movePenTo(7408, 4736);
+$s1->drawLine(-80, 220);
+$s1->drawLine(140, -220);
+$s1->drawLine(-60, 0);
+$s1->movePenTo(7055, 5518);
+$s1->drawCurve(-12, 225, 145, 113);
+$s1->drawLine(-97, -380);
+$s1->drawLine(37, -340);
+$s1->drawLine(-43, 186);
+$s1->drawCurve(-27, 115, -3, 81);
+$s1->movePenTo(7609, 5363);
+$s1->drawCurve(-49, 80, -2, 53);
+$s1->drawCurve(-9, 112, 142, 124);
+$s1->drawCurve(68, 59, 169, 105);
+$s1->drawLine(-40, 79);
+$s1->drawCurve(-241, -105, -179, -274);
+$s1->drawLine(-220, 240);
+$s1->drawCurve(187, 258, 260, 46);
+$s1->drawCurve(255, 45, 258, -170);
+$s1->drawCurve(-153, -185, -22, -52);
+$s1->drawCurve(-58, -138, 133, -124);
+$s1->drawLine(-420, -280);
+$s1->drawLine(-79, 127);
+$s1->movePenTo(6655, 3654);
+$s1->drawCurve(-130, -240, -117, -118);
+$s1->drawLine(400, 800);
+$s1->drawLine(320, -140);
+$s1->drawLine(-300, 100);
+$s1->drawCurve(-54, -181, -119, -221);
+$s1->movePenTo(5368, 776);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->setRightFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(20, 100);
+$s1->drawLine(40, 0);
+$s1->drawLine(20, -100);
+$s1->drawLine(-80, 0);
+$s1->movePenTo(5648, 876);
+$s1->drawLine(20, -100);
+$s1->drawLine(-100, 80);
+$s1->drawLine(80, 20);
+$s1->movePenTo(5488, 776);
+$s1->drawLine(0, 300);
+$s1->drawLine(100, -60);
+$s1->drawCurve(-55, -32, -6, -73);
+$s1->drawLine(1, -135);
+$s1->drawLine(-40, 0);
+$s1->movePenTo(5448, 652);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawCurve(-85, 35, -29, 106);
+$s1->drawCurve(-28, 97, 29, 108);
+$s1->drawCurve(29, 112, 72, 53);
+$s1->drawCurve(79, 61, 103, -42);
+$s1->drawCurve(79, -33, 29, -106);
+$s1->drawCurve(28, -98, -26, -108);
+$s1->drawCurve(-27, -112, -69, -54);
+$s1->drawCurve(-79, -61, -105, 42);
+$s1->movePenTo(5361, 1221);
+$s1->drawCurve(-97, -82, -56, -123);
+$s1->drawCurve(-261, 108, -73, 204);
+$s1->drawCurve(-47, 127, 1, 341);
+$s1->drawLine(280, -60);
+$s1->drawCurve(-16, -158, 6, -81);
+$s1->drawCurve(8, -143, 102, -38);
+$s1->drawLine(40, 400);
+$s1->drawLine(580, 0);
+$s1->drawLine(0, -400);
+$s1->drawLine(120, 20);
+$s1->drawLine(0, 420);
+$s1->drawLine(280, 60);
+$s1->drawCurve(0, -316, -55, -160);
+$s1->drawCurve(-85, -246, -240, -78);
+$s1->drawCurve(-30, 167, -84, 78);
+$s1->drawCurve(-75, 69, -105, -14);
+$s1->drawCurve(-100, -13, -93, -82);
+$s1->movePenTo(4178, 2602);
+$s1->drawCurve(109, -305, -159, -121);
+$s1->drawLine(-4, 340);
+$s1->drawLine(-196, 480);
+$s1->drawCurve(63, -55, 70, -106);
+$s1->drawCurve(74, -114, 43, -119);
+$s1->movePenTo(3847, 2376);
+$s1->drawLine(221, -160);
+$s1->drawCurve(-123, -258, -273, -120);
+$s1->drawCurve(-290, -126, -235, 144);
+$s1->drawLine(65, 107);
+$s1->drawCurve(42, 64, 6, 49);
+$s1->drawCurve(16, 190, -144, 58);
+$s1->drawCurve(-122, 50, -163, -58);
+$s1->drawLine(-20, 60);
+$s1->drawLine(-80, -20);
+$s1->drawCurve(-34, 265, 174, 256);
+$s1->drawCurve(161, 236, 259, 123);
+$s1->drawCurve(3, -18, 50, -119);
+$s1->drawCurve(38, -92, -18, -45);
+$s1->drawCurve(-19, -48, -49, -42);
+$s1->drawLine(-91, -67);
+$s1->drawCurve(-114, -82, 0, -107);
+$s1->drawLine(380, 220);
+$s1->drawLine(167, -214);
+$s1->drawCurve(100, -140, -14, -106);
+$s1->drawCurve(-5, -44, -114, -125);
+$s1->drawCurve(-105, -116, 14, -29);
+$s1->drawCurve(29, -49, 104, 69);
+$s1->drawCurve(170, 114, 14, 180);
+$s1->movePenTo(3928, 2736);
+$s1->drawLine(-101, 200);
+$s1->drawLine(141, -200);
+$s1->drawLine(-40, 0);
+$s1->movePenTo(3767, 2516);
+$s1->drawLine(-140, 320);
+$s1->drawCurve(68, -44, 47, -98);
+$s1->drawCurve(49, -104, -24, -74);
+$s1->movePenTo(3827, 2676);
+$s1->drawLine(-80, 220);
+$s1->drawLine(120, -200);
+$s1->drawLine(-40, -20);
+$s1->movePenTo(3307, 3296);
+$s1->drawCurve(47, 136, 292, 56);
+$s1->drawCurve(253, 47, 169, -39);
+$s1->drawLine(-321, -37);
+$s1->drawLine(-440, -163);
+$s1->movePenTo(3964, 3390);
+$s1->drawCurve(75, 6, 89, -20);
+$s1->drawLine(-281, -60);
+$s1->drawCurve(13, 63, 104, 11);
+$s1->movePenTo(3867, 3196);
+$s1->drawCurve(109, 116, 192, -56);
+$s1->drawLine(-301, -60);
+$s1->movePenTo(3467, 2916);
+$s1->drawCurve(77, 120, 252, 59);
+$s1->drawCurve(180, 40, 212, 1);
+$s1->drawLine(-361, -87);
+$s1->drawLine(-360, -133);
+$s1->movePenTo(5868, 2416);
+$s1->drawLine(-680, -20);
+$s1->drawLine(20, 360);
+$s1->drawLine(460, 0);
+$s1->drawLine(176, -30);
+$s1->drawLine(24, -310);
+$s1->movePenTo(6348, 3296);
+$s1->drawLine(-60, 240);
+$s1->drawCurve(100, -126, -40, -114);
+$s1->movePenTo(6328, 3022);
+$s1->drawLine(240, -146);
+$s1->drawLine(-320, 120);
+$s1->drawLine(80, 200);
+$s1->drawLine(0, -174);
+$s1->movePenTo(2802, 1907);
+$s1->setLeftFill(0xff, 0xff, 0xff);
+$s1->setRightFill();
+$s1->drawLine(-2, -1);
+$s1->drawLine(2, 0);
+$s1->drawLine(0, 1);
+$s1->movePenTo(2894, 1941);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawLine(-118, -51);
+$s1->drawLine(33, -6);
+$s1->drawLine(13, -1);
+$s1->drawLine(21, 4);
+$s1->drawLine(3, 1);
+$s1->drawLine(4, 1);
+$s1->drawLine(0, 1);
+$s1->drawLine(6, 3);
+$s1->drawLine(12, 11);
+$s1->drawLine(26, 37);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(-2, 1);
+$s1->drawLine(-1, 1);
+$s1->drawLine(-2, 2);
+$s1->drawLine(-6, 2);
+$s1->drawCurve(-22, 11, -24, -3);
+$s1->drawLine(-18, -4);
+$s1->drawLine(-15, -6);
+$s1->setRightFill();
+$s1->drawLine(-5, -3);
+$s1->drawLine(-2, -1);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(-5, -4);
+$s1->drawLine(-6, -4);
+$s1->drawLine(-24, -19);
+$s1->drawLine(82, 17);
+$s1->setRightFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(4, -4);
+$s1->drawLine(12, 5);
+$s1->drawLine(-1, 2);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(35, 7);
+$s1->movePenTo(2804, 1945);
+$s1->setLeftFill();
+$s1->drawLine(-5, -3);
+$s1->drawLine(-2, -1);
+$s1->movePenTo(2605, 1962);
+$s1->setLeftFill(0xff, 0xff, 0xff);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawCurve(9, 89, 104, 99);
+$s1->drawCurve(106, 98, 111, 22);
+$s1->drawCurve(127, 26, 58, -100);
+$s1->drawCurve(35, -60, -38, -86);
+$s1->drawCurve(-34, -76, -78, -69);
+$s1->drawCurve(-78, -68, -76, -22);
+$s1->drawCurve(-83, -24, -41, 45);
+$s1->drawCurve(-133, 24, 11, 102);
+$s1->movePenTo(2844, 1931);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(15, 3);
+$s1->movePenTo(2909, 1955);
+$s1->setRightFill(0xff, 0xff, 0xff);
+$s1->drawLine(9, 2);
+$s1->drawLine(-8, -3);
+$s1->drawLine(-1, 1);
+$s1->movePenTo(2703, 2064);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->drawCurve(15, 19, 49, 13);
+$s1->drawLine(-80, -100);
+$s1->drawCurve(0, 49, 16, 19);
+$s1->movePenTo(2707, 1976);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawLine(60, 120);
+$s1->drawCurve(23, -68, -83, -52);
+$s1->movePenTo(5046, 5838);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->setRightFill(0x06, 0x04, 0x07);
+$s1->drawCurve(-272, 156, -6, 381);
+$s1->drawLine(40, 0);
+$s1->drawCurve(25, -257, 81, -120);
+$s1->drawCurve(147, -234, 413, -25);
+$s1->drawCurve(132, -9, 213, 12);
+$s1->drawLine(309, 14);
+$s1->drawCurve(-87, -36, -141, -5);
+$s1->drawLine(-232, 1);
+$s1->drawCurve(-413, 0, -209, 122);
+$s1->movePenTo(5588, 5636);
+$s1->drawLine(500, 20);
+$s1->drawLine(20, -520);
+$s1->drawLine(-520, -20);
+$s1->drawLine(0, 520);
+$s1->movePenTo(5028, 5116);
+$s1->drawLine(-20, 640);
+$s1->drawLine(460, -120);
+$s1->drawLine(-20, -520);
+$s1->drawLine(-420, 0);
+$s1->movePenTo(5908, 5836);
+$s1->drawLine(220, 40);
+$s1->drawLine(0, -40);
+$s1->drawLine(-220, 0);
+$s1->movePenTo(3247, 4776);
+$s1->drawLine(0, 40);
+$s1->drawCurve(292, 7, 74, 215);
+$s1->drawCurve(67, 195, -133, 243);
+$s1->drawCurve(138, -82, 26, -122);
+$s1->drawCurve(24, -109, -67, -117);
+$s1->drawCurve(-63, -110, -116, -76);
+$s1->drawCurve(-119, -78, -123, -6);
+$s1->movePenTo(3807, 4796);
+$s1->drawLine(101, 300);
+$s1->drawCurve(22, -64, -33, -99);
+$s1->drawCurve(-34, -97, -56, -40);
+$s1->movePenTo(3852, 4712);
+$s1->drawCurve(134, 147, 57, 188);
+$s1->drawCurve(59, 198, -44, 191);
+$s1->drawCurve(-21, 92, -84, 94);
+$s1->drawLine(-146, 154);
+$s1->drawCurve(208, -57, 70, -181);
+$s1->drawCurve(61, -158, -51, -225);
+$s1->drawCurve(-46, -203, -118, -192);
+$s1->drawCurve(-116, -187, -128, -84);
+$s1->drawCurve(-122, -75, -158, -24);
+$s1->drawCurve(-200, -31, -40, 117);
+$s1->drawCurve(188, -46, 187, 69);
+$s1->drawCurve(175, 64, 135, 149);
+$s1->movePenTo(4548, 4996);
+$s1->drawLine(-300, -600);
+$s1->drawLine(-361, 160);
+$s1->drawLine(227, 440);
+$s1->drawLine(77, 166);
+$s1->drawLine(357, -166);
+$s1->movePenTo(3707, 4836);
+$s1->drawCurve(-19, 202, 139, 78);
+$s1->drawLine(-120, -280);
+$s1->movePenTo(6108, 6055);
+$s1->drawCurve(-414, -49, -216, 50);
+$s1->drawCurve(-356, 81, -14, 338);
+$s1->drawLine(57, -143);
+$s1->drawCurve(32, -85, 51, -49);
+$s1->drawCurve(126, -125, 284, -1);
+$s1->drawLine(450, 23);
+$s1->drawLine(0, -40);
+$s1->movePenTo(6328, 6136);
+$s1->drawCurve(-28, -147, -72, -73);
+$s1->drawLine(80, 459);
+$s1->drawCurve(48, -88, -28, -151);
+$s1->movePenTo(5828, 6675);
+$s1->drawLine(20, -140);
+$s1->drawLine(-680, -20);
+$s1->drawCurve(-1, 86, -22, 47);
+$s1->drawCurve(-20, 41, -25, -5);
+$s1->drawCurve(-25, -6, -10, -48);
+$s1->drawCurve(-12, -54, 15, -81);
+$s1->drawLine(-240, -60);
+$s1->drawCurve(-1, 271, 58, 140);
+$s1->drawCurve(81, 199, 222, 50);
+$s1->drawCurve(20, -114, 15, -53);
+$s1->drawCurve(25, -88, 63, -55);
+$s1->drawCurve(166, -153, 161, 134);
+$s1->drawCurve(66, 56, 42, 91);
+$s1->drawCurve(41, 90, 1, 92);
+$s1->drawCurve(244, -24, 110, -209);
+$s1->drawCurve(41, -79, 33, -125);
+$s1->drawLine(52, -223);
+$s1->drawCurve(-171, 27, -56, 27);
+$s1->drawCurve(-94, 43, 1, 143);
+$s1->drawLine(-120, 0);
+$s1->movePenTo(6128, 5975);
+$s1->drawLine(-220, -39);
+$s1->drawLine(0, 39);
+$s1->drawLine(220, 0);
+$s1->movePenTo(5330, 6929);
+$s1->drawCurve(-43, 89, 11, 116);
+$s1->drawCurve(9, 117, 59, 73);
+$s1->drawCurve(64, 81, 98, -14);
+$s1->drawCurve(97, -14, 48, -100);
+$s1->drawCurve(43, -91, -12, -118);
+$s1->drawCurve(-12, -119, -60, -72);
+$s1->drawCurve(-66, -81, -98, 19);
+$s1->drawCurve(-92, 15, -46, 99);
+$s1->movePenTo(5448, 7255);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->setRightFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(0, -80);
+$s1->drawLine(-80, 80);
+$s1->drawLine(80, 0);
+$s1->movePenTo(5548, 7255);
+$s1->drawLine(0, -320);
+$s1->drawLine(-120, 0);
+$s1->drawLine(60, 320);
+$s1->drawLine(60, 0);
+$s1->movePenTo(5588, 7255);
+$s1->drawLine(80, -100);
+$s1->drawCurve(-53, 10, -15, 20);
+$s1->drawCurve(-15, 19, 3, 51);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(6048, 1896);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(-601, -7);
+$s1->drawLine(-260, -133);
+$s1->drawCurve(129, 185, 264, 16);
+$s1->drawLine(468, -21);
+$s1->drawLine(0, -40);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(5531, 2332);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawCurve(-300, -2, -184, -144);
+$s1->drawCurve(-66, -49, -80, -129);
+$s1->drawCurve(-82, -131, -52, -41);
+$s1->drawCurve(26, 412, 472, 81);
+$s1->drawCurve(162, 28, 249, -6);
+$s1->drawLine(372, -15);
+$s1->drawLine(0, -40);
+$s1->drawLine(-517, 36);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(6268, 1856);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(-100, 320);
+$s1->drawCurve(153, -175, -53, -145);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(5828, 2176);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(0, 40);
+$s1->drawLine(220, -20);
+$s1->drawLine(-220, -20);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(7107, 2908);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawCurve(162, -165, 179, -47);
+$s1->drawCurve(-53, -49, -68, 20);
+$s1->drawCurve(-44, 13, -75, 56);
+$s1->drawCurve(-376, 251, 16, 229);
+$s1->drawLine(259, -308);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(7241, 3614);
+$s1->setRightFill(0x63, 0x62, 0x63);
+$s1->drawLine(7, 22);
+$s1->drawLine(-16, 0);
+$s1->drawCurve(-15, 14, -35, 4);
+$s1->drawCurve(-75, 9, -59, -27);
+$s1->drawLine(184, 0);
+$s1->drawCurve(8, -9, 1, -13);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(3147, 4535);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawCurve(-81, 15, -120, 58);
+$s1->drawCurve(-132, 64, -98, 82);
+$s1->drawCurve(-262, 217, 143, 180);
+$s1->drawCurve(34, 44, 64, 9);
+$s1->drawLine(120, 2);
+$s1->drawCurve(157, -1, 51, 133);
+$s1->drawCurve(41, 97, -91, 116);
+$s1->drawLine(-66, 89);
+$s1->drawCurve(-30, 51, 6, 47);
+$s1->drawCurve(12, 96, 172, 61);
+$s1->drawCurve(151, 54, 187, -49);
+$s1->drawCurve(81, -22, 241, -103);
+$s1->drawLine(-160, -240);
+$s1->drawLine(-200, 117);
+$s1->drawCurve(-126, 47, -34, -124);
+$s1->drawCurve(298, -29, -77, -246);
+$s1->drawCurve(-22, -71, -79, -153);
+$s1->drawCurve(-79, -154, -21, -67);
+$s1->drawLine(-360, 140);
+$s1->drawCurve(-5, -101, 114, -64);
+$s1->drawCurve(67, -38, 144, -37);
+$s1->drawLine(-40, -220);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(2787, 5288);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(-188, 11);
+$s1->drawCurve(-116, 13, -50, 53);
+$s1->drawCurve(-98, 100, 56, 120);
+$s1->drawCurve(56, 120, 140, -10);
+$s1->drawCurve(90, -8, 89, -49);
+$s1->drawCurve(100, -53, 37, -74);
+$s1->drawCurve(43, -81, -33, -73);
+$s1->drawCurve(-35, -76, -91, 7);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(2447, 5395);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->drawLine(40, 80);
+$s1->drawLine(60, -100);
+$s1->drawLine(-100, 20);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(5768, 6155);
+$s1->setLeftFill(0xfa, 0xfc, 0xfa);
+$s1->drawLine(100, 320);
+$s1->drawCurve(87, -58, -43, -124);
+$s1->drawCurve(-43, -122, -101, -16);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(2522, 5549);
+$s1->setLeftFill(0x06, 0x04, 0x07);
+$s1->drawLine(40, 80);
+$s1->drawLine(60, -100);
+$s1->drawLine(-100, 20);
+$i1 = $conference1->add($s1);
+$i1->scaleTo(0.5);
+$i1->moveTo(-2720, -1890);
+$conference1->nextFrame(); # end of frame 1
+
+
+$conference2 = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(6139, 1671);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawCurve(28, -75, 62, -60);
+$s1->drawCurve(112, -109, 158, 0);
+$s1->drawCurve(158, 0, 112, 109);
+$s1->drawCurve(62, 60, 28, 75);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(504, 0);
+$s1->drawCurve(33, 0, 23, 23);
+$s1->drawCurve(24, 24, 0, 33);
+$s1->drawLine(0, 3987);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 823);
+$s1->drawLine(0, 12);
+$s1->drawLine(-305, 0);
+$s1->drawLine(0, -123);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(-122, 0);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 123);
+$s1->drawLine(-928, 0);
+$s1->drawLine(0, -123);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(-122, 0);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 123);
+$s1->drawLine(-354, 0);
+$s1->drawLine(0, -12);
+$s1->drawLine(0, -111);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(-217, 0);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 111);
+$s1->drawLine(0, 12);
+$s1->drawLine(-305, 0);
+$s1->drawLine(0, -123);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(-122, 0);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 123);
+$s1->drawLine(-928, 0);
+$s1->drawLine(0, -123);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(-122, 0);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 123);
+$s1->drawLine(-354, 0);
+$s1->drawLine(0, -12);
+$s1->drawLine(0, -813);
+$s1->drawCurve(0, -166, 117, -117);
+$s1->drawLine(2, -2);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(0, -864);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawCurve(-62, 43, -57, 44);
+$s1->drawCurve(-9, -41, 0, -45);
+$s1->drawLine(0, -1238);
+$s1->drawCurve(0, -166, 117, -117);
+$s1->drawLine(11, -10);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawLine(0, -1318);
+$s1->drawCurve(0, -33, 23, -24);
+$s1->drawCurve(24, -23, 33, 0);
+$s1->drawLine(2376, 0);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->drawCurve(-22, 60, 0, 69);
+$s1->drawCurve(0, 155, 112, 109);
+$s1->drawCurve(112, 109, 158, 0);
+$s1->drawCurve(158, 0, 112, -109);
+$s1->drawCurve(112, -109, 0, -155);
+$s1->drawCurve(0, -69, -22, -60);
+$s1->movePenTo(7441, 2773);
+$s1->setLeftFill(0x99, 0x99, 0x99, 0x00);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawLine(0, 730);
+$s1->drawLine(-398, 25);
+$s1->drawLine(0, -506);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-17, -17, -25, 0);
+$s1->drawLine(-1, 0);
+$s1->drawCurve(-25, 0, -18, 17);
+$s1->drawCurve(-17, 18, 0, 25);
+$s1->drawLine(0, 517);
+$s1->drawLine(-429, 53);
+$s1->drawLine(-385, 64);
+$s1->drawLine(0, -634);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-17, -17, -25, 0);
+$s1->drawLine(-1, 0);
+$s1->drawCurve(-25, 0, -18, 17);
+$s1->drawCurve(-17, 18, 0, 25);
+$s1->drawLine(0, 658);
+$s1->drawCurve(-193, 38, -184, 47);
+$s1->drawLine(0, -992);
+$s1->drawCurve(0, -166, 117, -117);
+$s1->drawCurve(117, -117, 166, 0);
+$s1->drawLine(1031, 0);
+$s1->drawCurve(166, 0, 117, 117);
+$s1->drawCurve(117, 117, 0, 166);
+$s1->movePenTo(6796, 4533);
+$s1->drawCurve(112, 109, 0, 155);
+$s1->drawCurve(0, 155, -112, 109);
+$s1->drawCurve(-112, 109, -158, 0);
+$s1->drawCurve(-158, 0, -112, -109);
+$s1->drawCurve(-112, -109, 0, -155);
+$s1->drawCurve(0, -155, 112, -109);
+$s1->drawCurve(112, -109, 158, 0);
+$s1->drawCurve(158, 0, 112, 109);
+$s1->movePenTo(7138, 6450);
+$s1->drawLine(0, -532);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-18, -18, -25, 0);
+$s1->drawCurve(-25, 0, -18, 18);
+$s1->drawCurve(-18, 18, 0, 25);
+$s1->drawLine(0, 532);
+$s1->movePenTo(5612, 6450);
+$s1->drawLine(0, -702);
+$s1->drawCurve(0, -166, 117, -117);
+$s1->drawCurve(117, -117, 166, 0);
+$s1->drawLine(1031, 0);
+$s1->drawCurve(166, 0, 117, 117);
+$s1->drawCurve(113, 113, 4, 160);
+$s1->movePenTo(4511, 2774);
+$s1->drawCurve(-158, 0, -112, -109);
+$s1->drawCurve(-112, -109, 0, -155);
+$s1->drawCurve(0, -155, 112, -109);
+$s1->drawCurve(112, -109, 158, 0);
+$s1->drawCurve(158, 0, 112, 109);
+$s1->drawCurve(112, 109, 0, 155);
+$s1->drawCurve(0, 155, -112, 109);
+$s1->drawCurve(-112, 109, -158, 0);
+$s1->movePenTo(3683, 4599);
+$s1->setLeftFill(0x00, 0x00, 0x00);
+$s1->setRightFill(0x99, 0x99, 0x99, 0x00);
+$s1->drawCurve(62, -43, 66, -42);
+$s1->drawLine(142, -88);
+$s1->drawLine(0, -839);
+$s1->drawCurve(0, -25, 17, -18);
+$s1->drawCurve(18, -17, 25, 0);
+$s1->drawLine(1, 0);
+$s1->drawCurve(25, 0, 17, 17);
+$s1->drawCurve(18, 18, 0, 25);
+$s1->drawLine(0, 769);
+$s1->drawCurve(365, -204, 421, -156);
+$s1->drawLine(0, -409);
+$s1->drawCurve(0, -25, 17, -18);
+$s1->drawCurve(18, -17, 25, 0);
+$s1->drawLine(1, 0);
+$s1->drawCurve(25, 0, 17, 17);
+$s1->drawCurve(18, 18, 0, 25);
+$s1->drawLine(0, 365);
+$s1->drawCurve(197, -69, 208, -59);
+$s1->drawLine(0, -462);
+$s1->drawCurve(0, -166, -117, -117);
+$s1->drawCurve(-117, -117, -166, 0);
+$s1->drawLine(-1031, 0);
+$s1->drawCurve(-158, 0, -114, 107);
+$s1->movePenTo(3683, 5463);
+$s1->setLeftFill(0x99, 0x99, 0x99, 0x00);
+$s1->setRightFill(0x00, 0x00, 0x00);
+$s1->drawCurve(116, -115, 165, 0);
+$s1->drawLine(1031, 0);
+$s1->drawCurve(166, 0, 117, 117);
+$s1->drawCurve(117, 117, 0, 166);
+$s1->drawLine(0, 702);
+$s1->movePenTo(5090, 6450);
+$s1->drawLine(0, -532);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-18, -18, -25, 0);
+$s1->drawCurve(-25, 0, -18, 18);
+$s1->drawCurve(-18, 18, 0, 25);
+$s1->drawLine(0, 532);
+$s1->movePenTo(6088, 6450);
+$s1->drawLine(0, -532);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-18, -18, -25, 0);
+$s1->drawCurve(-25, 0, -18, 18);
+$s1->drawCurve(-18, 18, 0, 25);
+$s1->drawLine(0, 532);
+$s1->movePenTo(4784, 4530);
+$s1->drawCurve(112, 109, 0, 155);
+$s1->drawCurve(0, 155, -112, 109);
+$s1->drawCurve(-112, 109, -158, 0);
+$s1->drawCurve(-158, 0, -112, -109);
+$s1->drawCurve(-134, -130, 0, -133);
+$s1->drawCurve(0, -135, 134, -130);
+$s1->drawCurve(112, -109, 158, 0);
+$s1->drawCurve(158, 0, 112, 109);
+$s1->movePenTo(4040, 6450);
+$s1->drawLine(0, -532);
+$s1->drawCurve(0, -25, -18, -18);
+$s1->drawCurve(-18, -18, -25, 0);
+$s1->drawCurve(-25, 0, -18, 18);
+$s1->drawCurve(-18, 18, 0, 25);
+$s1->drawLine(0, 532);
+$i1 = $conference2->add($s1);
+$i1->scaleTo(0.5);
+$i1->moveTo(-2720, -1890);
+$conference2->nextFrame(); # end of frame 1
+
+
+
+# status log toolbar
+# $statusbar = new SWF::Sprite();
+### Shape 1 ###
+# $s1 = new SWF::Shape();
+# $s1->movePenTo(19920, 0);
+# $s1->setRightFill(0xcc, 0xcc, 0xcc);
+# $s1->drawLine(0, 600);
+# $s1->setLine(20, 0x00, 0x00, 0x00);
+# $s1->drawLine(-19920, 0);
+# $s1->setLine(20, 0xcc, 0xcc, 0xcc);
+# $s1->drawLine(0, -600);
+# $s1->setLine(20, 0x99, 0x99, 0x99);
+# $s1->drawLine(19920, 0);
+# $i1 = $statusbar->add($s1);
+# $i1->scaleTo(0.5);
+# $statusbar->nextFrame(); # end of frame 1
+
+
+
+$extrainfo = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(5400, 0);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(-5400, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(5400, 0);
+$s1->setLeftFill();
+$s1->setRightFill();
+$s1->movePenTo(5367, 91);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0xff, 0xff, 0xff);
+$s1->drawLine(0, 400);
+$s1->drawLine(-3900, 0);
+$s1->setLine(20, 0x66, 0x66, 0x66);
+$s1->drawLine(0, -400);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(3900, 0);
+$i2 = $extrainfo->add($s1);
+$i2->scaleTo(0.5);
+
+#$s3 = new SWF::TextField(SWFTEXTFIELD_USEFONT );
+#$s3->setBounds(3740, 398);
+#$s3->setFont($font_general);
+#$s3->setHeight(320);
+###$s3->setColor(0x00, 0x00, 0x00, 0xff);
+#$s3->align(SWFTEXTFIELD_ALIGN_LEFT);
+#$s3->setName('clidvalue');
+#$i3 = $extrainfo->add($s3);
+#$i3->scaleTo(0.5, 0.5);
+#$i3->moveTo(770, 65);
+#$i3->setName('clid_text');
+
+$extrainfo->nextFrame();
+
+
+
+$boton_ayuda = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(439, 222);
+$s1->setLeftFill(0xff, 0xa8, 0x37);
+$s1->setRightFill(0x79, 0x79, 0x79);
+$s1->drawCurve(-1, 24, -16, 23);
+$s1->drawLine(-34, 35);
+$s1->drawCurve(-32, 29, 2, 32);
+$s1->drawLine(0, 9);
+$s1->drawLine(-78, 0);
+$s1->drawLine(-2, -13);
+$s1->drawCurve(-2, -41, 37, -35);
+$s1->drawLine(24, -27);
+$s1->drawLine(10, -25);
+$s1->drawCurve(0, -28, -42, -1);
+$s1->drawCurve(-34, 0, -25, 15);
+$s1->drawLine(-20, -53);
+$s1->drawCurve(42, -21, 57, 1);
+$s1->drawCurve(55, 0, 31, 23);
+$s1->drawCurve(27, 20, 1, 33);
+$s1->movePenTo(418, 82);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->drawCurve(-46, -21, -49, -1);
+$s1->drawCurve(-51, -1, -46, 19);
+$s1->drawCurve(-44, 18, -35, 34);
+$s1->drawCurve(-35, 33, -20, 44);
+$s1->drawCurve(-21, 46, -2, 49);
+$s1->drawCurve(-3, 50, 19, 46);
+$s1->drawCurve(17, 45, 33, 36);
+$s1->drawCurve(33, 35, 44, 21);
+$s1->drawCurve(45, 22, 49, 3);
+$s1->drawCurve(50, 2, 47, -17);
+$s1->drawCurve(45, -16, 36, -33);
+$s1->drawCurve(36, -33, 22, -43);
+$s1->drawCurve(22, -45, 4, -49);
+$s1->drawLine(0, -15);
+$s1->drawLine(0, -2);
+$s1->drawCurve(0, -50, -19, -45);
+$s1->drawCurve(-19, -44, -34, -34);
+$s1->drawCurve(-34, -35, -44, -19);
+$s1->movePenTo(518, 404);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-21, 44, -38, 32);
+$s1->drawCurve(-37, 32, -50, 12);
+$s1->drawLine(-98, 3);
+$s1->drawCurve(-47, -10, -39, -29);
+$s1->drawCurve(-39, -29, -24, -43);
+$s1->drawCurve(-25, -43, -2, -51);
+$s1->drawCurve(-2, -50, 19, -47);
+$s1->drawCurve(28, -72, 72, -37);
+$s1->drawCurve(71, -38, 77, 16);
+$s1->drawCurve(76, 15, 50, 62);
+$s1->drawCurve(49, 61, 1, 78);
+$s1->drawLine(0, 1);
+$s1->drawCurve(-1, 49, -20, 44);
+$s1->movePenTo(278, 410);
+$s1->setLeftFill(0xff, 0xa8, 0x37);
+$s1->setRightFill(0x79, 0x79, 0x79);
+$s1->drawCurve(15, -12, 23, 0);
+$s1->drawCurve(24, 0, 15, 12);
+$s1->drawCurve(14, 12, 0, 20);
+$s1->drawCurve(0, 20, -14, 12);
+$s1->drawCurve(-15, 13, -23, 0);
+$s1->drawLine(-1, 0);
+$s1->drawCurve(-23, 0, -15, -13);
+$s1->drawCurve(-15, -13, 0, -19);
+$s1->drawCurve(0, -20, 15, -12);
+$s1->movePenTo(640, 600);
+$s1->setLeftFill();
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s1->drawLine(-640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(439, 221);
+$s2->setLeftFill(0x79, 0x79, 0x79);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawCurve(-1, 25, -16, 23);
+$s2->drawLine(-34, 35);
+$s2->drawCurve(-32, 28, 1, 32);
+$s2->drawLine(0, 9);
+$s2->drawLine(-78, 0);
+$s2->drawLine(-1, -13);
+$s2->drawCurve(-2, -40, 37, -36);
+$s2->drawLine(24, -26);
+$s2->drawLine(10, -25);
+$s2->drawCurve(0, -29, -42, 0);
+$s2->drawCurve(-34, 0, -25, 14);
+$s2->drawLine(-20, -53);
+$s2->drawCurve(42, -20, 57, 0);
+$s2->drawCurve(55, 0, 31, 23);
+$s2->drawCurve(27, 21, 1, 32);
+$s2->movePenTo(515, 157);
+$s2->setLeftFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(25, 40);
+$s2->drawLine(9, 17);
+$s2->drawLine(8, 23);
+$s2->drawLine(11, 72);
+$s2->drawLine(0, 2);
+$s2->drawLine(0, 15);
+$s2->drawLine(-16, 71);
+$s2->drawLine(-10, 23);
+$s2->drawCurve(-22, 43, -36, 33);
+$s2->drawCurve(-36, 33, -45, 16);
+$s2->drawCurve(-47, 17, -50, -2);
+$s2->drawCurve(-49, -3, -45, -22);
+$s2->drawCurve(-44, -21, -33, -35);
+$s2->drawLine(-29, -39);
+$s2->drawLine(-21, -42);
+$s2->drawLine(-1, -1);
+$s2->drawLine(-13, -46);
+$s2->setRightFill();
+$s2->drawLine(-3, -50);
+$s2->drawCurve(2, -49, 22, -45);
+$s2->drawCurve(20, -44, 35, -34);
+$s2->drawLine(18, -15);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawLine(61, -36);
+$s2->drawCurve(46, -19, 50, 1);
+$s2->drawLine(1, 0);
+$s2->drawLine(4, 0);
+$s2->drawLine(69, 13);
+$s2->setRightFill();
+$s2->drawLine(22, 8);
+$s2->drawCurve(44, 20, 34, 34);
+$s2->drawLine(19, 22);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->drawLine(-19, -21);
+$s2->drawCurve(-34, -35, -44, -19);
+$s2->drawLine(-22, -9);
+$s2->movePenTo(539, 311);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(-1, 49, -20, 44);
+$s2->drawCurve(-21, 44, -38, 32);
+$s2->drawCurve(-37, 32, -50, 12);
+$s2->drawLine(-98, 3);
+$s2->drawCurve(-47, -10, -39, -29);
+$s2->drawCurve(-39, -29, -24, -43);
+$s2->drawCurve(-25, -43, -2, -51);
+$s2->drawCurve(-2, -50, 19, -47);
+$s2->drawCurve(28, -72, 72, -37);
+$s2->drawCurve(71, -38, 77, 16);
+$s2->drawCurve(76, 15, 50, 62);
+$s2->drawCurve(49, 61, 1, 78);
+$s2->drawLine(0, 1);
+$s2->movePenTo(165, 114);
+$s2->setRightFill();
+$s2->drawCurve(-10, 7, -8, 9);
+$s2->drawCurve(-35, 33, -20, 44);
+$s2->drawCurve(-21, 46, -2, 49);
+$s2->drawLine(2, 49);
+$s2->movePenTo(278, 409);
+$s2->setLeftFill(0x79, 0x79, 0x79);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawCurve(15, -12, 23, 0);
+$s2->drawCurve(24, 0, 14, 12);
+$s2->drawCurve(15, 12, 0, 20);
+$s2->drawCurve(0, 19, -14, 13);
+$s2->drawCurve(-15, 12, -23, 1);
+$s2->drawLine(-1, 0);
+$s2->drawCurve(-24, -1, -14, -12);
+$s2->drawCurve(-15, -13, 0, -19);
+$s2->drawCurve(0, -20, 15, -12);
+$s2->movePenTo(640, 600);
+$s2->setLeftFill();
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s2->drawLine(-640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, -600);
+$s2->setLine(20, 0x99, 0x99, 0x99);
+$s2->drawLine(640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, 600);
+
+$i1 = $boton_ayuda->add($s1);
+$i1->scaleTo(0.5);
+$boton_ayuda->nextFrame(); # end of frame 1
+$boton_ayuda->remove($i1);
+$i1 = $boton_ayuda->add($s2);
+$i1->scaleTo(0.5);
+$boton_ayuda->nextFrame(); # end of frame 1
+
+
+$boton_debug = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(415, 159);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-10, 0, 0, 10);
+$s1->drawCurve(3, 58, -32, 23);
+$s1->drawLine(-23, 11);
+$s1->drawLine(-9, 1);
+$s1->drawLine(-4, 1);
+$s1->drawLine(-17, -2);
+$s1->drawLine(-21, 4);
+$s1->drawCurve(-3, -3, -4, 0);
+$s1->drawCurve(-14, -1, -16, -10);
+$s1->drawCurve(-34, -22, 3, -60);
+$s1->drawCurve(0, -10, -10, 0);
+$s1->drawCurve(-10, 0, 0, 10);
+$s1->drawCurve(-3, 66, 39, 30);
+$s1->drawLine(27, 15);
+$s1->drawLine(-50, 3);
+$s1->drawCurve(-26, -8, -21, -22);
+$s1->drawLine(-15, 1);
+$s1->drawCurve(-7, 7, 7, 7);
+$s1->drawCurve(26, 26, 33, 10);
+$s1->drawLine(33, 3);
+$s1->drawLine(-6, 18);
+$s1->drawLine(-2, 1);
+$s1->drawCurve(-34, 25, -29, -17);
+$s1->drawCurve(-8, -5, -5, 9);
+$s1->drawCurve(-6, 9, 9, 5);
+$s1->drawCurve(34, 20, 38, -21);
+$s1->drawCurve(1, 33, 21, 24);
+$s1->drawCurve(22, 25, 31, 0);
+$s1->drawCurve(30, 0, 22, -25);
+$s1->drawCurve(20, -23, 2, -31);
+$s1->drawLine(66, -2);
+$s1->drawCurve(9, -5, -5, -9);
+$s1->drawCurve(-6, -9, -8, 5);
+$s1->drawCurve(-26, 16, -31, -20);
+$s1->drawLine(-7, -23);
+$s1->drawLine(26, -3);
+$s1->drawCurve(33, -10, 26, -26);
+$s1->drawCurve(7, -7, -7, -7);
+$s1->drawLine(-14, -1);
+$s1->drawCurve(-22, 22, -25, 8);
+$s1->drawLine(-40, 1);
+$s1->drawLine(-7, -6);
+$s1->drawLine(22, -12);
+$s1->drawCurve(40, -29, -2, -68);
+$s1->drawCurve(-1, -10, -10, 0);
+$s1->movePenTo(416, 81);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->drawCurve(-46, -20, -49, -1);
+$s1->drawCurve(-50, -1, -46, 19);
+$s1->drawCurve(-45, 17, -34, 34);
+$s1->drawCurve(-36, 34, -20, 44);
+$s1->drawCurve(-21, 45, -2, 49);
+$s1->drawCurve(-2, 50, 18, 46);
+$s1->drawCurve(17, 45, 34, 36);
+$s1->drawCurve(33, 35, 44, 21);
+$s1->drawCurve(44, 21, 50, 3);
+$s1->drawCurve(49, 3, 47, -17);
+$s1->drawCurve(45, -16, 36, -33);
+$s1->drawCurve(36, -33, 22, -43);
+$s1->drawCurve(22, -44, 4, -49);
+$s1->drawLine(0, -16);
+$s1->drawLine(0, -1);
+$s1->drawCurve(-1, -50, -19, -45);
+$s1->drawCurve(-19, -45, -33, -34);
+$s1->drawCurve(-34, -34, -44, -20);
+$s1->movePenTo(537, 310);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-1, 49, -20, 44);
+$s1->drawCurve(-21, 44, -38, 32);
+$s1->drawCurve(-37, 32, -50, 12);
+$s1->drawCurve(-49, 12, -48, -10);
+$s1->drawCurve(-48, -9, -39, -29);
+$s1->drawCurve(-39, -29, -24, -43);
+$s1->drawCurve(-24, -43, -2, -51);
+$s1->drawCurve(-3, -50, 19, -46);
+$s1->drawCurve(29, -73, 72, -37);
+$s1->drawCurve(70, -37, 77, 15);
+$s1->drawCurve(76, 15, 50, 62);
+$s1->drawCurve(49, 61, 1, 78);
+$s1->drawLine(0, 1);
+$s1->movePenTo(277, 206);
+$s1->setLeftFill(0xff, 0xa8, 0x37);
+$s1->setRightFill(0x79, 0x79, 0x79);
+$s1->drawCurve(0, -19, 13, -12);
+$s1->drawCurve(13, -13, 18, 0);
+$s1->drawCurve(18, 0, 13, 13);
+$s1->drawCurve(13, 12, 0, 19);
+$s1->drawCurve(0, 18, -13, 13);
+$s1->drawCurve(-13, 12, -18, 1);
+$s1->drawCurve(-18, -1, -13, -12);
+$s1->drawCurve(-13, -13, 0, -18);
+$s1->movePenTo(640, 600);
+$s1->setLeftFill();
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s1->drawLine(-640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(366, 554);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->drawLine(35, -10);
+$s2->drawCurve(45, -16, 36, -33);
+$s2->drawCurve(36, -33, 22, -43);
+$s2->drawCurve(22, -44, 4, -49);
+$s2->drawLine(0, -16);
+$s2->drawLine(0, -1);
+$s2->drawCurve(-1, -50, -19, -45);
+$s2->drawCurve(-19, -45, -33, -34);
+$s2->drawCurve(-34, -34, -44, -20);
+$s2->drawCurve(-46, -20, -49, -1);
+$s2->drawLine(-39, 2);
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(-38, 9);
+$s2->drawLine(-18, 6);
+$s2->drawLine(-1, 1);
+$s2->drawLine(-42, 21);
+$s2->drawLine(-37, 30);
+$s2->drawCurve(-36, 34, -20, 44);
+$s2->drawCurve(-21, 45, -2, 49);
+$s2->drawCurve(-2, 50, 18, 46);
+$s2->drawCurve(17, 45, 34, 36);
+$s2->drawCurve(33, 35, 44, 21);
+$s2->drawLine(46, 17);
+$s2->drawLine(48, 7);
+$s2->drawLine(1, 0);
+$s2->drawLine(60, -4);
+$s2->setLeftFill();
+$s2->drawLine(37, -10);
+$s2->drawCurve(44, -17, 37, -32);
+$s2->drawCurve(36, -33, 22, -43);
+$s2->drawCurve(22, -44, 4, -49);
+$s2->drawLine(0, -16);
+$s2->drawLine(0, -1);
+$s2->drawCurve(0, -50, -19, -45);
+$s2->drawCurve(-19, -45, -34, -34);
+$s2->drawCurve(-34, -34, -44, -20);
+$s2->drawCurve(-46, -20, -49, -1);
+$s2->drawLine(-41, 2);
+$s2->movePenTo(407, 169);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(3, 58, -32, 23);
+$s2->drawLine(-23, 11);
+$s2->drawLine(-9, 1);
+$s2->drawLine(-4, 1);
+$s2->drawLine(-18, -2);
+$s2->drawLine(-21, 3);
+$s2->drawLine(-6, -2);
+$s2->drawLine(-30, -11);
+$s2->drawCurve(-34, -22, 3, -60);
+$s2->drawCurve(0, -10, -10, 0);
+$s2->drawCurve(-11, 0, 0, 10);
+$s2->drawCurve(-3, 66, 39, 30);
+$s2->drawLine(27, 15);
+$s2->drawLine(-50, 3);
+$s2->drawCurve(-26, -8, -21, -22);
+$s2->drawCurve(-7, -7, -7, 7);
+$s2->drawCurve(-8, 7, 8, 8);
+$s2->drawCurve(26, 26, 33, 10);
+$s2->drawLine(32, 3);
+$s2->drawLine(-6, 18);
+$s2->drawLine(-1, 1);
+$s2->drawCurve(-35, 25, -28, -17);
+$s2->drawCurve(-9, -5, -5, 9);
+$s2->drawCurve(-6, 8, 9, 6);
+$s2->drawCurve(34, 20, 39, -21);
+$s2->drawCurve(1, 33, 21, 24);
+$s2->drawCurve(21, 25, 31, 0);
+$s2->drawCurve(31, 0, 22, -25);
+$s2->drawCurve(19, -23, 3, -31);
+$s2->drawLine(66, -2);
+$s2->drawCurve(9, -6, -5, -8);
+$s2->drawCurve(-6, -9, -8, 5);
+$s2->drawCurve(-27, 16, -31, -20);
+$s2->drawLine(-7, -23);
+$s2->drawLine(27, -3);
+$s2->drawCurve(33, -10, 26, -26);
+$s2->drawCurve(7, -8, -7, -7);
+$s2->drawCurve(-8, -7, -6, 7);
+$s2->drawCurve(-22, 22, -26, 8);
+$s2->drawLine(-39, 1);
+$s2->drawLine(-6, -6);
+$s2->drawLine(21, -12);
+$s2->drawCurve(40, -29, -2, -68);
+$s2->drawCurve(-1, -10, -10, 0);
+$s2->drawCurve(-11, 0, 1, 10);
+$s2->movePenTo(537, 310);
+$s2->drawCurve(-1, 49, -20, 44);
+$s2->drawCurve(-21, 44, -38, 32);
+$s2->drawCurve(-37, 32, -50, 12);
+$s2->drawCurve(-49, 12, -48, -10);
+$s2->drawCurve(-48, -9, -39, -29);
+$s2->drawCurve(-39, -29, -24, -43);
+$s2->drawCurve(-24, -43, -2, -51);
+$s2->drawCurve(-3, -50, 19, -46);
+$s2->drawCurve(29, -73, 72, -37);
+$s2->drawCurve(70, -37, 77, 15);
+$s2->drawCurve(76, 15, 50, 62);
+$s2->drawCurve(49, 61, 1, 78);
+$s2->drawLine(0, 1);
+$s2->movePenTo(279, 206);
+$s2->setLeftFill(0x79, 0x79, 0x79);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawCurve(0, -19, 13, -12);
+$s2->drawCurve(12, -13, 19, 0);
+$s2->drawCurve(18, 0, 13, 13);
+$s2->drawCurve(12, 12, 1, 19);
+$s2->drawCurve(-1, 18, -12, 13);
+$s2->drawCurve(-13, 12, -18, 1);
+$s2->drawCurve(-19, -1, -12, -12);
+$s2->drawCurve(-13, -13, 0, -18);
+$s2->movePenTo(640, 0);
+$s2->setLeftFill();
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, 600);
+$s2->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s2->drawLine(-640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc); # raya izq
+$s2->drawLine(0, -600);
+$s2->setLine(20, 0x99, 0x99, 0x99); # raya sup
+$s2->drawLine(640, 0);
+
+$i1 = $boton_debug->add($s1);
+$i1->scaleTo(0.5);
+$boton_debug->nextFrame();
+$boton_debug->remove($i1);
+$i1 = $boton_debug->add($s2);
+$i1->scaleTo(0.5);
+$boton_debug->nextFrame();
+$boton_debug->remove($i1);
+$boton_debug->nextFrame();
+
+
+
+$boton_reload = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(424, 154);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawLine(-71, -37);
+$s1->drawCurve(-8, -4, -6, 4);
+$s1->drawCurve(-7, 4, -1, 9);
+$s1->drawLine(-1, 11);
+$s1->drawLine(-52, 5);
+$s1->drawCurve(-53, 12, -36, 39);
+$s1->drawCurve(-37, 39, -6, 56);
+$s1->drawCurve(-7, 53, 25, 49);
+$s1->drawCurve(23, 47, 49, 26);
+$s1->drawCurve(49, 25, 52, -6);
+$s1->drawCurve(56, -7, 41, -37);
+$s1->drawCurve(42, -37, 12, -55);
+$s1->drawCurve(5, -25, -2, -28);
+$s1->drawCurve(-2, -12, -6, -7);
+$s1->drawCurve(-8, -8, -10, 1);
+$s1->drawCurve(-11, -1, -8, 8);
+$s1->drawCurve(-9, 8, 1, 11);
+$s1->drawCurve(5, 45, -23, 37);
+$s1->drawCurve(-24, 37, -43, 14);
+$s1->drawLine(-76, -2);
+$s1->drawCurve(-38, -14, -22, -33);
+$s1->drawCurve(-22, -33, 2, -40);
+$s1->drawCurve(2, -41, 25, -30);
+$s1->drawCurve(26, -31, 39, -9);
+$s1->drawLine(37, -3);
+$s1->drawLine(-2, 16);
+$s1->drawCurve(0, 8, 8, 5);
+$s1->drawCurve(7, 4, 7, -4);
+$s1->drawLine(78, -43);
+$s1->drawLine(7, -9);
+$s1->drawLine(0, -3);
+$s1->drawLine(0, -5);
+$s1->drawLine(-7, -9);
+$s1->movePenTo(496, 135);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->drawCurve(-34, -34, -44, -20);
+$s1->drawCurve(-46, -20, -50, -1);
+$s1->drawCurve(-50, -1, -46, 19);
+$s1->drawCurve(-44, 17, -35, 34);
+$s1->drawCurve(-35, 34, -20, 44);
+$s1->drawCurve(-22, 45, -2, 49);
+$s1->drawCurve(-2, 50, 18, 46);
+$s1->drawCurve(18, 45, 33, 36);
+$s1->drawCurve(33, 35, 44, 21);
+$s1->drawCurve(45, 21, 49, 3);
+$s1->drawCurve(50, 3, 47, -17);
+$s1->drawCurve(44, -16, 37, -33);
+$s1->drawCurve(36, -33, 22, -43);
+$s1->drawCurve(22, -44, 4, -49);
+$s1->drawLine(0, -16);
+$s1->drawLine(0, -1);
+$s1->drawCurve(-1, -50, -19, -45);
+$s1->drawCurve(-19, -45, -33, -34);
+$s1->movePenTo(539, 310);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-1, 49, -20, 44);
+$s1->drawCurve(-22, 44, -37, 32);
+$s1->drawCurve(-38, 32, -49, 12);
+$s1->drawCurve(-49, 12, -49, -10);
+$s1->drawCurve(-47, -9, -40, -29);
+$s1->drawCurve(-39, -29, -23, -43);
+$s1->drawCurve(-25, -43, -2, -51);
+$s1->drawCurve(-3, -50, 19, -46);
+$s1->drawCurve(29, -73, 72, -37);
+$s1->drawCurve(71, -37, 76, 15);
+$s1->drawCurve(76, 15, 51, 62);
+$s1->drawCurve(49, 61, 1, 78);
+$s1->drawLine(0, 1);
+$s1->movePenTo(640, 0);
+$s1->setLeftFill();
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+$s1->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s1->drawLine(-640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(640, 0);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(424, 154);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawLine(-71, -37);
+$s2->drawCurve(-8, -4, -6, 4);
+$s2->drawCurve(-7, 4, -1, 9);
+$s2->drawLine(-1, 11);
+$s2->drawLine(-53, 4);
+$s2->drawCurve(-52, 13, -36, 39);
+$s2->drawCurve(-37, 39, -6, 56);
+$s2->drawCurve(-7, 53, 24, 49);
+$s2->drawCurve(23, 47, 50, 26);
+$s2->drawCurve(49, 25, 52, -6);
+$s2->drawCurve(56, -7, 41, -37);
+$s2->drawCurve(42, -37, 12, -55);
+$s2->drawCurve(5, -25, -2, -28);
+$s2->drawCurve(-2, -12, -6, -7);
+$s2->drawCurve(-8, -8, -11, 1);
+$s2->drawCurve(-10, -1, -8, 8);
+$s2->drawCurve(-9, 8, 1, 11);
+$s2->drawCurve(5, 45, -23, 37);
+$s2->drawCurve(-24, 37, -43, 14);
+$s2->drawLine(-76, -2);
+$s2->drawCurve(-38, -14, -22, -33);
+$s2->drawCurve(-22, -33, 2, -40);
+$s2->drawCurve(1, -41, 26, -30);
+$s2->drawCurve(25, -31, 40, -9);
+$s2->drawLine(37, -3);
+$s2->drawLine(-2, 16);
+$s2->drawCurve(0, 8, 8, 5);
+$s2->drawCurve(7, 4, 7, -4);
+$s2->drawLine(78, -43);
+$s2->drawLine(7, -9);
+$s2->drawLine(0, -3);
+$s2->drawLine(0, -5);
+$s2->drawLine(-7, -9);
+$s2->movePenTo(152, 495);
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(60, 39);
+$s2->drawCurve(44, 21, 50, 3);
+$s2->drawCurve(50, 3, 47, -17);
+$s2->drawCurve(44, -16, 37, -33);
+$s2->drawLine(46, -55);
+$s2->drawLine(12, -21);
+$s2->drawLine(10, -22);
+$s2->drawLine(16, -71);
+$s2->drawLine(0, -16);
+$s2->drawLine(0, -1);
+$s2->drawCurve(-1, -50, -19, -45);
+$s2->drawCurve(-19, -45, -33, -34);
+$s2->drawCurve(-34, -34, -44, -20);
+$s2->drawCurve(-46, -20, -50, -1);
+$s2->drawCurve(-50, -1, -46, 19);
+$s2->drawCurve(-44, 17, -35, 34);
+$s2->drawLine(-44, 56);
+$s2->setRightFill();
+$s2->drawLine(-11, 22);
+$s2->drawLine(-10, 23);
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(-14, 71);
+$s2->drawCurve(-2, 50, 18, 46);
+$s2->drawLine(35, 62);
+$s2->setRightFill();
+$s2->drawLine(16, 19);
+$s2->drawLine(17, 17);
+$s2->setLeftFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(-17, -17);
+$s2->drawLine(-16, -19);
+$s2->movePenTo(539, 310);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(-1, 49, -20, 44);
+$s2->drawCurve(-22, 44, -37, 32);
+$s2->drawCurve(-38, 32, -49, 12);
+$s2->drawCurve(-49, 12, -49, -10);
+$s2->drawCurve(-47, -9, -40, -29);
+$s2->drawCurve(-39, -29, -23, -43);
+$s2->drawCurve(-25, -43, -2, -51);
+$s2->drawCurve(-3, -50, 19, -46);
+$s2->drawCurve(29, -73, 72, -37);
+$s2->drawCurve(71, -37, 76, 15);
+$s2->drawCurve(76, 15, 51, 62);
+$s2->drawCurve(49, 61, 1, 78);
+$s2->drawLine(0, 1);
+$s2->movePenTo(103, 185);
+$s2->setLeftFill();
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(-12, 22);
+$s2->drawLine(-9, 23);
+$s2->movePenTo(640, 0);
+$s2->drawLine(0, 600);
+#$s2->setLine(20, 0x00, 0x00, 0x00);
+$s2->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s2->drawLine(-640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, -600);
+$s2->setLine(20, 0x99, 0x99, 0x99);
+$s2->drawLine(640, 0);
+$i1 = $boton_reload->add($s1);
+$i1->scaleTo(0.5);
+$boton_reload->nextFrame(); # end of frame 1
+$boton_reload->remove($i1);
+$i1 = $boton_reload->add($s2);
+$i1->scaleTo(0.5);
+$boton_reload->nextFrame(); # end of frame 2
+$boton_reload->remove($i1);
+
+
+$boton_security = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(493, 135);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->drawCurve(-34, -34, -44, -19);
+$s1->drawCurve(-45, -21, -50, -1);
+$s1->drawCurve(-49, -1, -46, 19);
+$s1->drawCurve(-45, 18, -35, 34);
+$s1->drawCurve(-35, 33, -20, 44);
+$s1->drawCurve(-21, 45, -2, 49);
+$s1->drawCurve(-2, 50, 18, 46);
+$s1->drawCurve(17, 44, 34, 36);
+$s1->drawCurve(33, 35, 43, 21);
+$s1->drawCurve(45, 22, 49, 3);
+$s1->drawCurve(49, 3, 47, -17);
+$s1->drawCurve(45, -17, 36, -32);
+$s1->drawCurve(36, -33, 22, -43);
+$s1->drawCurve(22, -45, 4, -48);
+$s1->drawLine(0, -16);
+$s1->drawLine(0, -1);
+$s1->drawCurve(-1, -50, -19, -45);
+$s1->drawCurve(-19, -45, -33, -34);
+$s1->movePenTo(536, 310);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-1, 48, -20, 45);
+$s1->drawCurve(-21, 43, -38, 33);
+$s1->drawCurve(-37, 31, -49, 13);
+$s1->drawCurve(-49, 11, -49, -9);
+$s1->drawCurve(-47, -10, -39, -29);
+$s1->drawCurve(-39, -29, -24, -42);
+$s1->drawCurve(-24, -43, -2, -51);
+$s1->drawCurve(-3, -50, 19, -46);
+$s1->drawCurve(28, -72, 72, -37);
+$s1->drawCurve(71, -37, 76, 15);
+$s1->drawCurve(76, 15, 50, 61);
+$s1->drawCurve(49, 61, 1, 78);
+$s1->drawLine(0, 1);
+$s1->movePenTo(446, 290);
+$s1->setLeftFill(0xff, 0xa8, 0x37);
+$s1->setRightFill(0x79, 0x79, 0x79);
+$s1->drawLine(0, 129);
+$s1->drawCurve(0, 17, -17, 13);
+$s1->drawCurve(-17, 13, -23, 0);
+$s1->drawLine(-143, 0);
+$s1->drawCurve(-23, 0, -17, -13);
+$s1->drawCurve(-16, -13, 0, -17);
+$s1->drawLine(0, -129);
+$s1->drawCurve(-1, -15, 12, -11);
+$s1->drawLine(1, -8);
+$s1->drawCurve(7, -50, 32, -35);
+$s1->drawCurve(35, -40, 49, 5);
+$s1->drawCurve(49, 5, 31, 42);
+$s1->drawCurve(25, 35, 4, 46);
+$s1->drawCurve(12, 11, 0, 15);
+$s1->movePenTo(382, 200);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(15, 22, 6, 26);
+$s1->drawLine(-14, -1);
+$s1->drawLine(-143, 0);
+$s1->drawLine(-14, 1);
+$s1->drawCurve(5, -26, 16, -21);
+$s1->drawCurve(25, -35, 40, -1);
+$s1->drawCurve(39, -1, 25, 36);
+$s1->movePenTo(323, 345);
+$s1->drawLine(14, 75);
+$s1->drawLine(-40, 0);
+$s1->drawLine(14, -75);
+$s1->drawCurve(-8, -2, -6, -6);
+$s1->drawCurve(-8, -8, 0, -12);
+$s1->drawCurve(0, -13, 8, -8);
+$s1->drawCurve(9, -9, 12, 1);
+$s1->drawCurve(12, -1, 8, 9);
+$s1->drawCurve(9, 8, 0, 13);
+$s1->drawCurve(0, 12, -9, 8);
+$s1->drawLine(-15, 8);
+$s1->movePenTo(640, 600);
+$s1->setLeftFill();
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+#$s1->setLine(20, 0x00, 0x00, 0x00);
+$s1->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s1->drawLine(-640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(495, 136);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawCurve(-34, -35, -44, -19);
+$s2->drawCurve(-46, -21, -49, -1);
+$s2->drawCurve(-50, -1, -46, 19);
+$s2->drawCurve(-45, 18, -35, 34);
+$s2->drawCurve(-35, 33, -20, 45);
+$s2->drawCurve(-21, 45, -2, 49);
+$s2->drawCurve(-2, 50, 18, 47);
+$s2->drawCurve(17, 44, 34, 36);
+$s2->drawCurve(33, 35, 44, 21);
+$s2->drawCurve(44, 22, 50, 3);
+$s2->drawCurve(49, 3, 47, -17);
+$s2->drawCurve(45, -17, 36, -33);
+$s2->drawCurve(36, -33, 22, -43);
+$s2->drawCurve(22, -44, 4, -49);
+$s2->drawLine(1, -16);
+$s2->drawLine(0, -1);
+$s2->drawCurve(-1, -50, -19, -45);
+$s2->drawCurve(-19, -45, -34, -34);
+$s2->movePenTo(539, 311);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(-1, 49, -21, 44);
+$s2->drawCurve(-21, 44, -38, 32);
+$s2->drawCurve(-37, 32, -50, 12);
+$s2->drawLine(-97, 3);
+$s2->drawCurve(-48, -10, -39, -29);
+$s2->drawCurve(-39, -29, -24, -43);
+$s2->drawCurve(-24, -43, -2, -51);
+$s2->drawCurve(-3, -50, 19, -47);
+$s2->drawCurve(29, -72, 72, -37);
+$s2->drawCurve(70, -38, 77, 16);
+$s2->drawCurve(76, 15, 50, 62);
+$s2->drawCurve(50, 61, 1, 78);
+$s2->drawLine(0, 1);
+$s2->movePenTo(448, 291);
+$s2->setLeftFill(0x79, 0x79, 0x79);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawLine(0, 129);
+$s2->drawCurve(0, 18, -17, 13);
+$s2->drawCurve(-17, 12, -23, 1);
+$s2->drawLine(-144, 0);
+$s2->drawCurve(-23, -1, -17, -12);
+$s2->drawCurve(-17, -13, 1, -18);
+$s2->drawLine(0, -129);
+$s2->drawCurve(-1, -15, 12, -12);
+$s2->drawLine(1, -8);
+$s2->drawCurve(7, -50, 32, -35);
+$s2->drawCurve(36, -40, 49, 6);
+$s2->drawCurve(49, 4, 31, 42);
+$s2->drawCurve(25, 35, 4, 46);
+$s2->drawCurve(12, 12, 0, 15);
+$s2->movePenTo(319, 165);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(39, -1, 26, 37);
+$s2->drawCurve(15, 21, 5, 26);
+$s2->drawLine(-13, -1);
+$s2->drawLine(-144, 0);
+$s2->drawLine(-13, 1);
+$s2->drawCurve(4, -26, 16, -21);
+$s2->drawCurve(26, -35, 39, -1);
+$s2->movePenTo(324, 346);
+$s2->drawLine(15, 76);
+$s2->drawLine(-41, 0);
+$s2->drawLine(14, -76);
+$s2->drawCurve(-8, -2, -5, -6);
+$s2->drawCurve(-9, -9, 0, -12);
+$s2->drawCurve(0, -12, 9, -8);
+$s2->drawCurve(8, -9, 12, 0);
+$s2->drawCurve(12, 0, 9, 9);
+$s2->drawLine(9, 20);
+$s2->drawCurve(-1, 12, -8, 9);
+$s2->drawLine(-16, 8);
+$s2->movePenTo(640, 0);
+$s2->setLeftFill();
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, 600);
+#$s2->setLine(20, 0x00, 0x00, 0x00);
+$s2->setLine(20, 0x99, 0x99, 0x99); # raya inferior
+$s2->drawLine(-640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, -600);
+$s2->setLine(20, 0x99, 0x99, 0x99);
+$s2->drawLine(640, 0);
+
+$i1 = $boton_security->add($s1);
+$i1->scaleTo(0.5);
+$boton_security->add(new SWF::Action("stop();"));
+$boton_security->nextFrame(); # end of frame 1
+$boton_security->remove($i1);
+$i1 = $boton_security->add($s2);
+$i1->scaleTo(0.5);
+$boton_security->add(new SWF::Action("stop();"));
+$boton_security->nextFrame(); # end of frame 1
+$boton_security->remove($i1);
+
+$boton_security_unlock = new SWF::Sprite();
+### Shape 1 ###
+$s1 = new SWF::Shape();
+$s1->movePenTo(493, 135);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->drawCurve(-34, -34, -44, -19);
+$s1->drawCurve(-45, -21, -50, -1);
+$s1->drawCurve(-49, -1, -46, 19);
+$s1->drawCurve(-45, 18, -35, 34);
+$s1->drawCurve(-35, 33, -20, 44);
+$s1->drawCurve(-21, 45, -2, 49);
+$s1->drawCurve(-2, 50, 18, 46);
+$s1->drawCurve(17, 44, 34, 36);
+$s1->drawCurve(33, 35, 43, 21);
+$s1->drawCurve(45, 22, 49, 3);
+$s1->drawCurve(49, 3, 47, -17);
+$s1->drawCurve(45, -17, 36, -32);
+$s1->drawCurve(36, -33, 22, -43);
+$s1->drawCurve(22, -45, 4, -48);
+$s1->drawLine(0, -16);
+$s1->drawLine(0, -1);
+$s1->drawCurve(-1, -50, -19, -45);
+$s1->drawCurve(-19, -45, -33, -34);
+$s1->movePenTo(536, 310);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(-1, 48, -20, 45);
+$s1->drawCurve(-21, 43, -38, 33);
+$s1->drawCurve(-37, 31, -49, 13);
+$s1->drawCurve(-49, 11, -49, -9);
+$s1->drawCurve(-47, -10, -39, -29);
+$s1->drawCurve(-39, -29, -24, -42);
+$s1->drawCurve(-24, -43, -2, -51);
+$s1->drawCurve(-3, -50, 19, -46);
+$s1->drawCurve(28, -72, 72, -37);
+$s1->drawCurve(71, -37, 76, 15);
+$s1->drawCurve(76, 15, 50, 61);
+$s1->drawCurve(49, 61, 1, 78);
+$s1->drawLine(0, 1);
+$s1->movePenTo(446, 290);
+$s1->setLeftFill(0xff, 0xa8, 0x37);
+$s1->setRightFill(0x79, 0x79, 0x79);
+$s1->drawLine(0, 129);
+$s1->drawCurve(0, 17, -17, 13);
+$s1->drawCurve(-17, 13, -23, 0);
+$s1->drawLine(-143, 0);
+$s1->drawCurve(-23, 0, -17, -13);
+$s1->drawCurve(-16, -13, 0, -17);
+$s1->drawLine(0, -129);
+$s1->drawCurve(-1, -15, 12, -11);
+$s1->drawLine(1, -8);
+$s1->drawCurve(7, -50, 32, -35);
+$s1->drawCurve(35, -40, 49, 5);
+$s1->drawCurve(49, 5, 31, 42);
+$s1->drawCurve(25, 35, 4, 46);
+$s1->drawCurve(12, 11, 0, 15);
+$s1->movePenTo(382, 200);
+$s1->setLeftFill(0x79, 0x79, 0x79);
+$s1->setRightFill(0xff, 0xa8, 0x37);
+$s1->drawCurve(15, 22, 6, 26);
+$s1->drawLine(-14, -1);
+$s1->drawLine(-143, 0);
+$s1->drawLine(-14, 1);
+$s1->drawCurve(5, -26, 16, -21);
+$s1->drawCurve(25, -35, 40, -1);
+$s1->drawCurve(39, -1, 25, 36);
+$s1->movePenTo(323, 345);
+$s1->drawLine(14, 75);
+$s1->drawLine(-40, 0);
+$s1->drawLine(14, -75);
+$s1->drawCurve(-8, -2, -6, -6);
+$s1->drawCurve(-8, -8, 0, -12);
+$s1->drawCurve(0, -13, 8, -8);
+$s1->drawCurve(9, -9, 12, 1);
+$s1->drawCurve(12, -1, 8, 9);
+$s1->drawCurve(9, 8, 0, 13);
+$s1->drawCurve(0, 12, -9, 8);
+$s1->drawLine(-15, 8);
+$s1->movePenTo(640, 600);
+$s1->setLeftFill();
+$s1->setRightFill(0xcc, 0xcc, 0xcc);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(-640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, -600);
+$s1->setLine(20, 0x99, 0x99, 0x99);
+$s1->drawLine(640, 0);
+$s1->setLine(20, 0xcc, 0xcc, 0xcc);
+$s1->drawLine(0, 600);
+# Agregado
+$s1b = new SWF::Shape();
+$s1b->movePenTo(430,135);
+$s1b->setLine(0,0xFF,0xa8,0x37);
+$s1b->setRightFill(0xFF,0xa8,0x37,0xFF);
+$s1b->drawLine(0,110);
+$s1b->drawLine(-110,0);
+$s1b->drawLine(0,-110);
+$s1b->drawLine(110,0);
+
+
+### Shape 2 ###
+$s2 = new SWF::Shape();
+$s2->movePenTo(495, 136);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawCurve(-34, -35, -44, -19);
+$s2->drawCurve(-46, -21, -49, -1);
+$s2->drawCurve(-50, -1, -46, 19);
+$s2->drawCurve(-45, 18, -35, 34);
+$s2->drawCurve(-35, 33, -20, 45);
+$s2->drawCurve(-21, 45, -2, 49);
+$s2->drawCurve(-2, 50, 18, 47);
+$s2->drawCurve(17, 44, 34, 36);
+$s2->drawCurve(33, 35, 44, 21);
+$s2->drawCurve(44, 22, 50, 3);
+$s2->drawCurve(49, 3, 47, -17);
+$s2->drawCurve(45, -17, 36, -33);
+$s2->drawCurve(36, -33, 22, -43);
+$s2->drawCurve(22, -44, 4, -49);
+$s2->drawLine(1, -16);
+$s2->drawLine(0, -1);
+$s2->drawCurve(-1, -50, -19, -45);
+$s2->drawCurve(-19, -45, -34, -34);
+$s2->movePenTo(539, 311);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(-1, 49, -21, 44);
+$s2->drawCurve(-21, 44, -38, 32);
+$s2->drawCurve(-37, 32, -50, 12);
+$s2->drawLine(-97, 3);
+$s2->drawCurve(-48, -10, -39, -29);
+$s2->drawCurve(-39, -29, -24, -43);
+$s2->drawCurve(-24, -43, -2, -51);
+$s2->drawCurve(-3, -50, 19, -47);
+$s2->drawCurve(29, -72, 72, -37);
+$s2->drawCurve(70, -38, 77, 16);
+$s2->drawCurve(76, 15, 50, 62);
+$s2->drawCurve(50, 61, 1, 78);
+$s2->drawLine(0, 1);
+$s2->movePenTo(448, 291);
+$s2->setLeftFill(0x79, 0x79, 0x79);
+$s2->setRightFill(0xff, 0xa8, 0x37);
+$s2->drawLine(0, 129);
+$s2->drawCurve(0, 18, -17, 13);
+$s2->drawCurve(-17, 12, -23, 1);
+$s2->drawLine(-144, 0);
+$s2->drawCurve(-23, -1, -17, -12);
+$s2->drawCurve(-17, -13, 1, -18);
+$s2->drawLine(0, -129);
+$s2->drawCurve(-1, -15, 12, -12);
+$s2->drawLine(1, -8);
+$s2->drawCurve(7, -50, 32, -35);
+$s2->drawCurve(36, -40, 49, 6);
+$s2->drawCurve(49, 4, 31, 42);
+$s2->drawCurve(25, 35, 4, 46);
+$s2->drawCurve(12, 12, 0, 15);
+$s2->movePenTo(319, 165);
+$s2->setLeftFill(0xff, 0xa8, 0x37);
+$s2->setRightFill(0x79, 0x79, 0x79);
+$s2->drawCurve(39, -1, 26, 37);
+$s2->drawCurve(15, 21, 5, 26);
+$s2->drawLine(-13, -1);
+$s2->drawLine(-144, 0);
+$s2->drawLine(-13, 1);
+$s2->drawCurve(4, -26, 16, -21);
+$s2->drawCurve(26, -35, 39, -1);
+$s2->movePenTo(324, 346);
+$s2->drawLine(15, 76);
+$s2->drawLine(-41, 0);
+$s2->drawLine(14, -76);
+$s2->drawCurve(-8, -2, -5, -6);
+$s2->drawCurve(-9, -9, 0, -12);
+$s2->drawCurve(0, -12, 9, -8);
+$s2->drawCurve(8, -9, 12, 0);
+$s2->drawCurve(12, 0, 9, 9);
+$s2->drawLine(9, 20);
+$s2->drawCurve(-1, 12, -8, 9);
+$s2->drawLine(-16, 8);
+$s2->movePenTo(640, 0);
+$s2->setLeftFill();
+$s2->setRightFill(0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, 600);
+$s2->setLine(20, 0x99, 0x99, 0x99);
+$s2->drawLine(-640, 0);
+$s2->setLine(20, 0xcc, 0xcc, 0xcc);
+$s2->drawLine(0, -600);
+$s2->setLine(20, 0x99, 0x99, 0x99);
+$s2->drawLine(640, 0);
+# Agregado
+$s2b = new SWF::Shape();
+$s2b->movePenTo(430,135);
+$s2b->setLine(0,0x79,0x79,0x79);
+$s2b->setRightFill(0x79,0x79,0x79,0xFF);
+$s2b->drawLine(0,110);
+$s2b->drawLine(-110,0);
+$s2b->drawLine(0,-110);
+$s2b->drawLine(110,0);
+
+$i1 = $boton_security_unlock->add($s1);
+$i1->scaleTo(0.5);
+$i1 = $boton_security_unlock->add($s1b);
+$i1->scaleTo(0.5);
+$boton_security_unlock->add(new SWF::Action("stop();"));
+$boton_security_unlock->nextFrame(); # end of frame 1
+$boton_security_unlock->remove($i1);
+$i1 = $boton_security_unlock->add($s2);
+$i1->scaleTo(0.5);
+$i1 = $boton_security_unlock->add($s2b);
+$i1->scaleTo(0.5);
+$boton_security_unlock->add(new SWF::Action("stop();"));
+$boton_security_unlock->nextFrame(); # end of frame 1
+$boton_security_unlock->remove($i1);
+
+# Exports all Movieclips for Actionscript
+$movie->addExport($ledcolor,"ledcolor");
+$movie->addExport($ledsombra,"ledsombra");
+$movie->addExport($ledbrillo,"ledbrillo");
+$movie->addExport($fle, "arrow");
+$movie->addExport($i_icon1, "telefono1");
+$movie->addExport($i_icon2, "telefono2");
+$movie->addExport($telefono3, "telefono3");
+$movie->addExport($telefono4, "telefono4");
+$movie->addExport($conference2, "telefono5");
+$movie->addExport($conference1, "telefono6");
+$movie->addExport($envelope, "sobre");
+# $movie->addExport($statusbar, "logtext");
+$movie->addExport($extrainfo, "infotext");
+$movie->addExport($boton_ayuda, "boton_ayuda");
+$movie->addExport($boton_debug, "boton_debug");
+$movie->addExport($boton_reload,"boton_reload");
+$movie->addExport($boton_security,"boton_security");
+$movie->addExport($boton_security_unlock,"boton_security_unlock");
+$movie->addExport($option,"option");
+$movie->writeExports();
+
+
+# Adds ActionScript
+$movie->add(new SWF::Action(<<"EndOfActionScript"));
+
+/*
+XMLSocket.prototype.onData = function(msg)
+{
+ trace("MSG: " + msg)
+ msgArea.htmlText += msg
+}
+*/
+
+function conecta() {
+ _global.sock = new XMLSocket;
+ _global.sock.onConnect = handleConnect;
+ _global.sock.onClose = handleDisconnect;
+ _global.sock.onXML = handleXML;
+ if(_global.port == undefined) {
+ _global.port = 4445;
+ }
+ if(_global.server == undefined) {
+ _global.sock.connect(null, _global.port);
+ _global.server_print = "default";
+ } else {
+ _global.sock.connect(_global.server, _global.port);
+ _global.server_print = _global.server;
+ }
+}
+
+function logea(texto) {
+ if(buttondebug._visible != true) {
+ return;
+ }
+ var fecha = new Date();
+ var hora = fecha.getHours();
+ var minutos = fecha.getMinutes();
+ var segundos = fecha.getSeconds();
+ if (hora<10) {
+ hora = "0"+hora;
+ }
+ if (minutos<10) {
+ minutos = "0"+minutos;
+ }
+ if (segundos<10) {
+ segundos = "0"+segundos;
+ }
+ var textologea = hora+":"+minutos+":"+segundos+" "+texto;
+ _global.loglines.push(textologea);
+ //if (_global.loglines.length>35) {
+ _global.loglines.shift();
+ //}
+ _level0.log.Field1.text = "";
+ var acount=-1;
+ while (++acount < _global.loglines.length) {
+// for (var acount=0; acount<_global.loglines.length; acount++) {
+ _level0.log.Field1.text = _level0.log.Field1.text+_global.loglines[acount]+"\n";
+ }
+ log.logcontent.scroll = log.logcontent.maxscroll;
+};
+
+
+function handleConnect(connectionStatus){
+
+ if (connectionStatus) {
+ for (var a in _root) {
+ if (typeof (_root[a]) == "movieclip") {
+ if (a.substring(0, 10) == "rectangulo") {
+ for (var b in _root[a]) {
+ if (_root[a][b]._name.substring(0, 7) == "casicol") {
+ var numero=ExtraeNumeroClip(_root[a][b]);
+ _root[a][b].changeledcolor(0,_global.colorlibre[numero],_global.color[1]);
+ }
+ }
+ }
+ }
+ }
+ logea("Connected to server "+server_print+" on port "+port);
+
+ _global.reconecta = 0;
+ if(_global.enable_crypto==1) {
+ envia_comando("contexto", 0, 0);
+ } else {
+ envia_comando("contexto", 1, 0);
+ }
+ if(restrict != undefined) {
+ envia_comando("restrict",restrict,0);
+ }
+ } else {
+ logea("Error connecting to "+server);
+ logea(" on port "+port);
+ for (var a in _root) {
+ if (typeof (_root[a]) == "movieclip") {
+ if (a.substring(0, 10) == "rectangulo") {
+ for (var b in _root[a]) {
+ if (_root[a][b]._name.substring(0, 7) == "casicol") {
+ var numero=ExtraeNumeroClip(_root[a][b]);
+ _root[a][b].changeledcolor(3,_global.colorlibre[numero],_global.color[1]);
+ }
+ }
+ }
+ }
+ }
+ _global.reconecta = 1;
+ }
+}
+
+function handleXML(doc){
+ var e = doc.firstChild;
+ if (e != null) {
+ if (e.nodeName == "response") {
+ var numeroboton = e.attributes.btn; // btn is the button number
+ var comando = e.attributes.cmd;
+ var textofinal = e.attributes.data;
+
+ if (_global.key != undefined) {
+ if(_global.enable_crypto == 1) {
+ comando = decrypt(comando, _global.key);
+ if (textofinal.length > 0) {
+ textofinal = decrypt(textofinal, _global.key);
+ }
+ }
+ }
+
+ logea(numeroboton+"|"+comando+"|"+textofinal.substring(0,20));
+
+ var botonparte = numeroboton.split("@");
+ var boton_numero = botonparte[0];
+ var boton_contexto = botonparte[1];
+ var timernumber = 0;
+ if (boton_contexto == undefined) {
+ boton_contexto = "";
+ }
+ if (_root.context == undefined) {
+ _root.context = "";
+ }
+ if (comando == "key") {
+ _global.key = textofinal;
+ return;
+ }
+ if (comando == "incorrect") {
+ _global.authorized = false;
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ SecurityCode_Unlocked();
+ return;
+ }
+ if (comando == "correct") {
+ _global.authorized = true;
+ SecurityCode_Locked();
+ return;
+ }
+ if (comando == "reload") {
+ logea("Recarga!");
+ _root.recarga();
+ // return;
+ }
+
+ if (comando == "showdetails") {
+ var myclip = eval('_level0.rectangulo'+boton_numero+'.flecha'+boton_numero);
+ _root.displaydetails(myclip);
+ }
+
+ if (comando == "restrict") {
+ _global.restrict = numeroboton;
+ _global.mybutton = numeroboton;
+ logea("Set restriction for button "+_global.restrict);
+ var myresa = eval('_root.resaltado'+_global.restrict);
+ myresa._visible = true;
+ return;
+ }
+ if (comando == "version") {
+ logea("Version "+textofinal);
+ logea("Top "+_root._y);
+ logea("Left "+_root._x);
+ if(textofinal != _global.swfversion)
+ {
+ _global.statusline=vr.version_mismatch;
+ } else {
+ _global.statusline="";
+ }
+ }
+
+ if (_root.context == boton_contexto) {
+ var botonazo = eval("rectangulo"+boton_numero+".casicol"+boton_numero);
+ var statusclid = eval("rectangulo"+boton_numero+".statusprint"+boton_numero);
+ var timerprint = eval("rectangulo"+boton_numero+".timer"+boton_numero);
+ var flechita = eval("rectangulo"+boton_numero+".flecha"+boton_numero);
+ var telefonito = eval("rectangulo"+boton_numero+".tele"+boton_numero);
+ var sobrecito = eval("rectangulo"+boton_numero+".sobrecito"+boton_numero);
+ if (_global.rectanguloprendido!=0) {
+ makeStatus(_global.rectanguloprendido);
+ }
+
+ if (comando == "setalpha") {
+ var myboton = eval('_root.rectangulo'+boton_numero);
+ myboton._alpha = textofinal;
+ }
+
+ if (comando == "flip") {
+ var myboton = eval('_root.rectangulo'+boton_numero);
+ myboton.flip(textofinal);
+ }
+
+ if (comando == "monitor") {
+ createCircle(_root["rectangulo"+boton_numero]["circle"+boton_numero],11,0,0,'0xff0000');
+ }
+ if (comando == "stopmonitor") {
+ createCircle(_root["rectangulo"+boton_numero]["circle"+boton_numero],11,0,0,'0x00ff00');
+ }
+
+ if (comando == "settext") {
+ _global.ipboton[boton_numero]=textofinal;
+ setclid(statusclid,textofinal);
+ }
+
+ if (comando == "setstatus") {
+ _global.texto_tip[boton_numero] = textofinal;
+ }
+
+ if (comando == "setlabel") {
+ set_button_label_text(boton_numero,textofinal);
+ //var botref = eval("rectangulo"+boton_numero+".textoprint");
+ //var botshref = eval("rectangulo"+boton_numero+".textosh");
+ //botref.text = textofinal;
+ //botshref.text = textofinal;
+ }
+
+ if (comando == "fopledcolor") {
+ if(textofinal!="")
+ {
+ var partes = textofinal.split("^");
+ var fcolor = partes[0];
+ var fstate = Number(partes[1]);
+
+ if(fcolor == "ledcolor_paused") {
+ fcolor = ledcolor_paused;
+ }
+ if(fcolor == "ledcolor_agent") {
+ fcolor = ledcolor_agent;
+ }
+ _global.color[fstate]=fcolor;
+ if(fstate!=1) {
+ _global.colorlibre[boton_numero]=fcolor;
+ }
+ _global.color[fstate] = fcolor;
+ botonazo.changeledcolor(0,_global.colorlibre[boton_numero],_global.color[1]);
+ }
+ }
+ if (comando == "foppopup") {
+ logea("fop popup");
+ if(textofinal!="")
+ {
+ var partes = textofinal.split("^");
+ var url = partes[0];
+ var target = partes[1];
+ var posi = partes[2];
+
+ if(posi == "" || posi == mybutton) {
+
+ popup_window(url,target);
+
+ /*
+ partes = url.split("?");
+ url = partes[0];
+ parametros = partes[1];
+
+ logea("url "+url);
+ logea("parametros "+parametros);
+ logea("target "+target);
+ logea("posi "+posi);
+
+ var cadauno = parametros.split("&");
+
+
+ if (url != "") {
+ if (target == undefined || target == "") {
+ target = "_self";
+ }
+ var c = new LoadVars();
+
+ for (var aget in cadauno) {
+ partes = cadauno[aget].split("=");
+ c[partes[0]]=partes[1];
+ logea("c."+partes[0]);
+ logea("es igual a "+partes[1]);
+ }
+ c.send(url, target, 'GET');
+ logea("Abro "+url+" en target "+target);
+ }
+ */
+ }
+ }
+ }
+
+ if (comando == "state") {
+
+ if(textofinal == "ringing") {
+ botonazo.changeledcolor(3,_global.colorlibre[boton_numero],_global.color[1]);
+ if (enable_animation == 1) {
+ telefonito.shake(_global.shakepixels);
+ }
+ }
+
+ if(textofinal == "free") {
+ createCircle(_root["rectangulo"+boton_numero]["circle"+boton_numero],11,0,0,'0x00ff00');
+ botonazo.changeledcolor(0,_global.colorlibre[boton_numero],_global.color[1]);
+ if (enable_animation == 1) {
+ telefonito.shake();
+ telefonito.gotoAndStop(1);
+ }
+ }
+
+ if(textofinal == "busy") {
+ _root["rectangulo"+boton_numero]._alpha = 100;
+ _root["resaltado"+boton_numero]._alpha = 100;
+ botonazo.changeledcolor(1,_global.colorlibre[boton_numero],_global.color[1]);
+ if (enable_animation == 1) {
+ telefonito.shake();
+ telefonito.gotoAndStop(2);
+ }
+ flechita._visible = true;
+ }
+ }
+
+ if (comando == "meetmemute") {
+ _root["rectangulo"+boton_numero]._alpha = 40;
+ logea("muted "+boton_numero);
+ _global.meetmemute[boton_numero]=0;
+ statusclid.text = "Conference "+_global.meetmeroom[boton_numero]+" muted";
+ }
+
+ if (comando == "meetmeunmute") {
+ _root["rectangulo"+boton_numero]._alpha = 100;
+ logea("Unmuted "+boton_numero);
+ _global.meetmemute[boton_numero] = 1;
+ statusclid.text = "Conference "+_global.meetmeroom[boton_numero];
+ }
+
+ if (comando.substring(0,11) == "changelabel") {
+ var changeled = comando.substring(11,12);
+ var botref = eval("rectangulo"+boton_numero+".textoprint");
+ var botshref = eval("rectangulo"+boton_numero+".textosh");
+ var cual = eval("rectangulo"+boton_numero);
+ var casillero = eval("rectangulo"+boton_numero+".casilla"+boton_numero);
+ if(textofinal == "original") {
+ labeltexto=_global.labels[boton_numero];
+ _global.colorlibre[boton_numero] = _global.color[0];
+ } else if (textofinal == "labeloriginal") {
+ labeltexto=_global.labels[boton_numero];
+ } else if (textofinal == ".") {
+ labeltexto=botref.text;
+ if(changeled == 1) {
+ _global.colorlibre[boton_numero] = _global.color[2];
+ }
+ } else {
+ labeltexto=textofinal;
+ if(changeled == 1) {
+ _global.colorlibre[boton_numero] = _global.color[2];
+ }
+ }
+ if(changeled == 1) {
+ if(_global.valorchangeledcolor[boton_numero] == "0") {
+ botonazo.changeledcolor(0,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ } else {
+ logea("esta ocupado "+boton_numero+" no cambio led '"+_global.valorchangeledcolor[boton_numero]+"'");
+ }
+
+ }
+ set_button_label_text(boton_numero,labeltexto);
+ //botref.text = labeltexto;
+ //botshref.text = labeltexto;
+ return;
+ }
+
+ if (comando == "voicemailcount") {
+ _global.texto_mail[boton_numero] = textofinal;
+ return;
+ }
+ if (comando.substr(0, 4) == "info") {
+ var texto = base64_decode(textofinal);
+ var queue = comando.substr(4);
+ if(queue != "" ) {
+ if(_global.queuemember[boton_numero]==undefined) {
+ _global.queuemember[boton_numero]="";
+ }
+ if(queue=="qstat") {
+ queuemember[boton_numero] = new Object();
+ queuemember[boton_numero]["qstat"]=texto;
+ } else if (queue=="qstat2") {
+ var lugar = queuemember[boton_numero]["qstat"].indexOf("Agents Logged");
+ var str1= queuemember[boton_numero]["qstat"].slice(0,lugar);
+ str1 = str1+texto;
+ queuemember[boton_numero]["qstat"]=str1;
+ } else {
+ var lineas = texto.split("\n");
+ for (val in lineas) {
+ campos = lineas[val].split("=");
+ if(Trim(campos[0])=="CallsTaken") {
+ var id1 = eval("queuemember."+boton_numero);
+ if(typeof(id1)!='object') {
+ queuemember[boton_numero] = new Object();
+ }
+ queuemember[boton_numero][queue] = vr.tab_queue_text + ": "+queue+"\n"+vr.calls_taken_text+": "+campos[1]+"\n\n";
+ }
+ }
+ }
+ } else {
+ _global.st_direction[boton_numero] = texto;
+ }
+ if(flechita._visible == false) {
+ flechita._visible = true;
+ flechita.gotoAndStop(3);
+ }
+ return;
+ }
+ if (comando == "meetmeuser") {
+ partes = textofinal.split(",");
+ _global.meetmemember[boton_numero] = partes[0];
+ _global.meetmeroom[boton_numero] = partes[1];
+ _global.meetmemute[boton_numero] = 1;
+ return;
+ }
+ if (comando == "desocupado" || comando == "corto") {
+ createCircle(_root["rectangulo"+boton_numero]["circle"+boton_numero],11,0,0,'0x00ff00');
+ _global.meetmemember[boton_numero] = 0;
+ _global.meetmeroom[boton_numero] = 0;
+ _root["rectangulo"+boton_numero]._alpha = 100;
+ botonazo.changeledcolor(0,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ if (enable_animation == 1) {
+ telefonito.shake();
+ telefonito.gotoAndStop(1);
+ }
+
+ _global.st_duration[boton_numero] = eval("rectangulo"+boton_numero+".timer"+boton_numero+".text");
+ _global.texto_tip[boton_numero] = "";
+ timerprint.text = "";
+
+ // logea(boton_numero+" pongo timer_type stop y valor 0");
+ timer_type[boton_numero] = "STOP";
+ inicio_timer[boton_numero] = 0;
+
+ //if (_global.ipboton[boton_numero] != undefined) {
+ // setclid(statusclid,_global.ipboton[boton_numero]);
+ //} else {
+ statusclid.text = "";
+ //}
+
+ flechita.gotoAndStop(3);
+ linkeado[boton_numero]="";
+
+ return;
+ }
+ if (comando == "timeout") {
+ var timeout = Number(textofinal);
+ inicio_timer[boton_numero] = Math.floor(getTimer());
+ mytimeout = Math.floor(timeout)*1000;
+ inicio_timer[boton_numero] += mytimeout;
+ timer_type[boton_numero] = "DOWN";
+ logea("TIMEOUT "+timer_type[boton_numero]);
+ }
+ if (comando == "linked") {
+ if (textofinal.indexof("@") == -1) {
+ sdo_boton = textofinal;
+ } else {
+ var boton2parte = textofinal.split("@");
+ sdo_boton = boton2parte[0];
+ }
+ linkeado[boton_numero]=sdo_boton;
+ return;
+ }
+ if (comando == "clidnum") {
+ var clidnum = base64_decode(textofinal);
+ _global.clidnumber[boton_numero]=clidnum;
+ }
+ if (comando == "clidname") {
+ //var clidname = base64_decode(textofinal);
+ _global.clidname[boton_numero]=textofinal;
+ //var clidname = base64_decode(textofinal);
+ }
+ if (comando == "setvar") {
+ if(_global.chanvars[boton_numero].length == undefined ) {
+ _global.chanvars[boton_numero] = new Array;
+ }
+ chanvars[boton_numero].push(textofinal);
+ }
+
+ if (comando == "ringing") {
+// if (timer_type[boton_numero]!="UP") {
+ inicio_timer[boton_numero]=getTimer();
+ botonazo.changeledcolor(3,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ if (enable_animation == 1) {
+ telefonito.shake(_global.shakepixels);
+ }
+ _global.texto_tip[boton_numero] = textofinal;
+
+ var clnumber = extract_text_inside_delimiters(textofinal,"[","]");
+ if(clnumber != "") {
+ setclid(statusclid,clnumber);
+ _global.st_originclid[boton_numero] = clnumber;
+ _global.st_destinationclid[boton_numero] = undefined;
+ }
+ flechita._visible = true;
+ flechita.gotoAndStop(1);
+
+ // CRM, redirige a url
+ if (boton_numero == mybutton) {
+ if (url != "") {
+ if (target == "") {
+ target = "_self";
+ }
+ var c = new LoadVars();
+ //c.clid = clidnumber;
+ c.clid = _global.clidnumber[boton_numero];
+ c.clidname = _global.clidname[boton_numero];
+
+ var a=-1;
+ while (++a < chanvars[boton_numero].length) {
+ var datossplit = chanvars[boton_numero][a].split("=");
+ var mivar = datossplit[0];
+ var mival = datossplit[1];
+ c[mivar]=mival;
+ logea("mivar "+mivar+" has val "+mival);
+ }
+ delete chanvars[boton_numero];
+ c.send(url, target, 'GET');
+ logea("Open url "+url+" in target "+target+" with clid "+c.clid);
+ }
+ } else {
+ logea("No popup mybutton "+mybutton+" <> boton_numero "+boton_numero);
+ }
+ return;
+// }
+ return;
+ }
+ if (comando == "voicemail") {
+ if (textofinal == "1") {
+ sobrecito._visible = true;
+ sobrecito._alpha = 100;
+// sobrecito.glow(1);
+ } else {
+ sobrecito._visible = true;
+ sobrecito._alpha = _global.nomailalpha;
+// sobrecito.glow(0);
+ }
+ return;
+ }
+
+ if (comando == "park") {
+ var mytext = extract_text_inside_delimiters(textofinal,"[","]");
+ setclid(statusclid,mytext);
+ var mytimeout = extract_text_inside_delimiters(textofinal,"(",")");
+ inicio_timer[boton_numero] = Math.floor(getTimer());
+ mytimeout = Math.floor(mytimeout)*1000;
+ inicio_timer[boton_numero] += mytimeout;
+ timer_type[boton_numero] = "DOWN";
+ _global.st_destinationclid[boton_numero] = mytext;
+ _global.st_originclid[boton_numero] = undefined;
+ botonazo.changeledcolor(3,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ return;
+ }
+
+ if (comando == "ip") {
+ _global.ipboton[boton_numero]=textofinal;
+ if(statusclid.text == "") {
+ setclid(statusclid,textofinal);
+ }
+ };
+
+ if (comando == "state") {
+ if(textofinal == "busy") {
+ botonazo.changeledcolor(1,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ return;
+ }
+ }
+
+ if (comando.substr(0, 7) == "ocupado") {
+ var flecha_frame = comando.substr(7, 1);
+ if (flecha_frame == 3) { // Parked channel
+ var mytext = extract_text_inside_delimiters(textofinal,"[","]");
+ setclid(statusclid,mytext);
+ _global.st_destinationclid[boton_numero] = mytext;
+ _global.st_originclid[boton_numero] = undefined;
+ botonazo.changeledcolor(3,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ return;
+ }
+
+ flecha_frame = Number(flecha_frame);
+ _root["rectangulo"+boton_numero]._alpha = 100;
+ _root["resaltado"+boton_numero]._alpha = 100;
+ botonazo.changeledcolor(1,_global.colorlibre[boton_numero],_global.color[1],boton_numero);
+ if (enable_animation == 1) {
+ telefonito.shake();
+ telefonito.gotoAndStop(2);
+ }
+ flechita._visible = true;
+ if (flechita._currentframe>=1) {
+ if (textofinal != undefined) {
+
+ var myclid = extract_text_inside_delimiters(textofinal,"[","]");
+ if(myclid != "") {
+ setclid(statusclid,myclid);
+ _global.st_destinationclid[boton_numero] = myclid;
+ _global.st_originclid[boton_numero] = undefined;
+ }
+
+ //var timernumber = extract_text_inside_delimiters(textofinal,"(",")");
+ //if (isNaN(timernumber)) { timernumber = "0"; }
+ //timernumber = Number(timernumber);
+
+ }
+ }
+ if (flecha_frame>0) {
+ flechita.gotoAndStop(flecha_frame);
+ _global.st_direction[boton_numero] = flecha_frame;
+ }
+
+ if (statusclid.text.substring(0, 6) == "Parked") {
+ setclid(statusclid,"");
+ }
+ if (textofinal != "") {
+ _global.texto_tip[boton_numero] = textofinal;
+ }
+
+ return;
+ }
+
+ if (comando == "settimer") {
+ var timerpartes = textofinal.split("@");
+ var segundos = Number(timerpartes[0]);
+ if (isNaN(segundos)) {
+ segundos=0;
+ }
+ var type = timerpartes[1];
+ if(type == undefined) {
+ type="UP";
+ }
+
+ if(timer_type[boton_numero] != type)
+ {
+ // logea(boton_numero+" cambio de tipo vino "+type+" y era "+timer_type[boton_numero]);
+ if(type=="DOWN")
+ {
+ inicio_timer[boton_numero] = getTimer()+(segundos*1000);
+ } else if (type == "UP") {
+ inicio_timer[boton_numero] = getTimer()-(segundos*1000);
+ } else if (type == "IDLE") {
+ inicio_timer[boton_numero] = getTimer()-(segundos*1000);
+ } else if (type == "STOP") {
+ inicio_timer[boton_numero] = 0;
+ logea("tipo stop, pongo inicio_timer en cero");
+ }
+ } else {
+ // logea(boton_numero+" timer tipo no cambio era igual "+type);
+ }
+ timer_type[boton_numero]=type;
+ }
+
+ if (comando == "noregistrado") {
+ _root["rectangulo"+boton_numero]._alpha = dimm_noregister;
+ _root["resaltado"+boton_numero]._alpha = dimm_noregister;
+ _global.texto_tip[boton_numero] = "";
+ return;
+ }
+
+ if (comando == "unreachable") {
+ _root["rectangulo"+boton_numero]._alpha = dimm_lagged;
+ _root["resaltado"+boton_numero]._alpha = dimm_lagged;
+ _global.texto_tip[boton_numero] = "";
+ return;
+ }
+
+ if (comando == "registrado") {
+ if( _global.meetmemember[boton_numero]==0 || _global.meetmemember[boton_numero] == undefined ) {
+ _root["rectangulo"+boton_numero]._alpha = 100;
+ _root["resaltado"+boton_numero]._alpha = 100;
+ } else {
+ logea("No alpha muted o unmuted "+boton_numero);
+ logea(_global.meetmemember[boton_numero]);
+ }
+ return;
+ }
+ }
+ // endif root.context
+ }
+ // endif == response
+ }
+ // endiff e != null
+}
+
+function setclid(statusclid,textofinal) {
+ statusclid.text = textofinal;
+ if(_global.clid_centered == 1) {
+ clidExtent = fmtClid.getTextExtent ( textofinal );
+ cordx = (_global.ancho_a_centrar - clidExtent.textFieldWidth) / 2;
+ if(cordx<0) { cordx = 0; }
+ statusclid._x = cordx;
+ }
+}
+
+function popup_window(url,target) {
+ logea("popup");
+ if (url != "") {
+ if (target == "") {
+ target = "_self";
+ }
+
+ partes = url.split("?");
+ url = partes[0];
+ parametros = partes[1];
+
+ var c = new LoadVars();
+
+ var cadauno = parametros.split("&");
+
+ for (var aget in cadauno) {
+ partes = cadauno[aget].split("=");
+ c[partes[0]]=partes[1];
+ }
+
+ c.send(url, target, 'GET');
+ logea("Open url "+url+" in target "+target);
+ }
+}
+
+function set_button_label_text(btn_number,text) {
+
+ var botref = eval("rectangulo"+btn_number+".textoprint");
+ var botshref = eval("rectangulo"+btn_number+".textosh");
+
+ var lTextExtent = fmtLabel.getTextExtent ( text );
+ var lWidth = lTextExtent.textFieldWidth + _global.label_extent_x;
+ var lHeight = lTextExtent.textFieldHeight + _global.label_extent_y;
+
+ botref._width = lWidth;
+ botref._height = lHeight;
+ botref.text = text;
+
+ botshref._width = lWidth;
+ botshref._height= lHeight;
+ botshref.text = text;
+}
+
+
+function extract_text_inside_delimiters(inputText,start_char,end_char) {
+ var outputText="";
+ var start_delimiter = inputText.lastIndexOf(start_char);
+ start_delimiter++;
+ if (start_delimiter>0) {
+ var end_delimiter = inputText.indexOf(end_char, start_delimiter);
+ outputText = inputText.substring(start_delimiter, end_delimiter);
+ outputText = only_allowed_chars(outputText);
+ outputText = Trim(outputText);
+ }
+ return outputText;
+};
+
+function handleDisconnect(){
+ logea("Lost connection to "+server+" on port "+port);
+ delete _global.key;
+ for (var b in timer_type) {
+ timer_type[b] = "STOP";
+ inicio_timer[b] = 0;
+ }
+ for (var a in _root) {
+ if (typeof (_root[a]) == "movieclip") {
+ if (a.substring(0, 10) == "rectangulo") {
+ for (b in _root[a]) {
+ if (_root[a][b]._name.substring(0, 7) == "casicol") {
+ var numero = _root[a][b]._name.substring(7,1);
+ _root[a][b].changeledcolor(3,_global.color[0],_global.color[1],numero);
+ }
+ }
+ }
+ }
+ _root.log.gotoAndPlay(1);
+ }
+ _global.reconecta = 1;
+}
+
+
+function createCircle(tMC, r, x, y, color) {
+
+ // constant used in calculation
+ var A = Math.tan(22.5 * Math.PI/180);
+ // variables for each of 8 segments
+ var endx;
+ var endy;
+ var cx;
+ var cy;
+
+ color_normalizado = parseInt(color,16);
+ with (tMC) {
+ lineStyle(1,color_normalizado,100);
+ beginFill(color_normalizado, 100);
+ moveTo(x+r, y);
+ for (var angle = 45; angle<=360; angle += 45) {
+ // endpoint
+ endx = r*Math.cos(angle*Math.PI/180);
+ endy = r*Math.sin(angle*Math.PI/180);
+ // control:
+ // (angle-90 is used to give the correct sign)
+ cx =endx + r* A *Math.cos((angle-90)*Math.PI/180);
+ cy =endy + r* A *Math.sin((angle-90)*Math.PI/180);
+ curveTo(cx+x, cy+y, endx+x, endy+y);
+ }
+ endFill();
+ }
+}
+
+function createSquare(tMC, tW, tH, lW, lC, fC, f2C, cRad) {
+ tW -= lW;
+ tH -= lW;
+ with (tMC) {
+ var zerox = 0;
+ var zeroy = (tH/2)*-1;
+ lineStyle(lW, parseInt(lC, 16), 50);
+ moveTo(cRad+lW+zerox, zeroy);
+ colors = [parseInt(fC, 16), parseInt(f2C, 16)];
+ alphas = [100, 100];
+ ratios = [0, 0xFF];
+ matrix = {a:200, b:0, c:0, d:0, e:200, f:0, g:200, h:200, i:1};
+ matrix = {matrixType:"box", x:1, y:1, w:tW, h:tH, r:(45/180)*Math.PI};
+ if(fC != "transparent") {
+ beginGradientFill("linear", colors, alphas, ratios, matrix);
+ }
+ //
+ lineTo(cRad+lW+zerox, zeroy);
+ curveTo(lW+zerox, zeroy, lW+zerox, cRad+zeroy);
+ lineTo(lW+zerox, tH-cRad+zeroy);
+ curveTo(lW+zerox, tH+zeroy, cRad+lW+zerox, tH+zeroy);
+ lineTo(tW-cRad+zerox, tH+zeroy);
+ //
+ curveTo(tW+zerox, tH+zeroy, tW+zerox, tH-cRad+zeroy);
+ lineTo(tW+zerox, cRad+zeroy);
+ curveTo(tW+zerox, zeroy, tW-cRad+zerox, zeroy);
+ lineTo(cRad+lW+zerox, zeroy);
+ endFill();
+ }
+};
+
+
+dibuja = function () {
+
+ _root.preload._visible=false;
+ contador = 1;
+ depth = -10000;
+ cantidad_botones = 1;
+
+ // Draw rectangles bellow buttons
+ var a=-1;
+ while (++a <= vr.total_rectangles) {
+ v = eval("vr.rect_"+a);
+ if (v != undefined) {
+ var datos = v.split(",");
+ var rect_x = Number(datos[0]);
+ var rect_y = Number(datos[1]);
+ var rect_width = Number(datos[2]);
+ var rect_height = Number(datos[3]);
+ var line_width = Number(datos[4]);
+ var line_color = datos[5];
+ var fade_color1 = datos[6];
+ var fade_color2 = datos[7];
+ var rnd_border = Number(datos[8]);
+ var alpha = Number(datos[9]);
+ offsetboton = (rect_height/2);
+ if(datos[10]=="bottom") {
+ rect_y += offsetboton;
+ cusl = createEmptyMovieClip("dibujo"+a, depth);
+ createSquare(cusl, rect_width, rect_height, line_width, line_color, fade_color1, fade_color2, rnd_border);
+ cusl._x = rect_x;
+ cusl._y = rect_y;
+ cusl._visible = true;
+ cusl._alpha = alpha;
+ cusl.useHandCursor = false;
+ depth++;
+ }
+ }
+ }
+
+
+ var a=0;
+ while (++a <= _root.cuantas_columnas) {
+ depth++;
+ var b=0;
+ while (++b <= _root.cuantas_filas) {
+ var coordenada_y = (b*(alto_boton+separacion))-alto_boton+30;
+ var coordenada_x = (a*(ancho_boton+separacion))-ancho_boton;
+ var coordenada_x = coordenada_x-separacion;
+ var offsetboton = (alto_boton/2);
+ var v = eval("vr.texto"+contador);
+
+ var lurl = eval("vr.url"+contador);
+ lurl = base64_decode(lurl);
+
+ var lalarm = eval("vr.alarm"+contador);
+ if(lalarm != null) {
+ lalarm = base64_decode(lalarm);
+
+ var partes = lalarm.split("^");
+ segundos_alarma = partes[0];
+ url_alarma = partes[1];
+ target_alarma = partes[2];
+
+ timeralarm[contador] = partes[0];
+ urlalarm[contador] = partes[1];
+ targetalarm[contador] = partes[2];
+
+
+ logea("alarma "+contador+" = "+lalarm);
+ }
+
+ if(lurl != null) {
+ logea("url "+lurl);
+ }
+ var ltarget = eval("vr.target"+contador);
+ if (v != undefined) {
+ // El boton esta definido en la configuracion, lo muestro
+
+ if(lurl != "0" && lurl != null) {
+ fmtLabel.url = lurl;
+ } else {
+ fmtLabel.url = undefined;
+ }
+ if(ltarget != "0") {
+ fmtLabel.target = ltarget;
+ } else {
+ fmtLabel.target = undefined;
+ }
+
+ // Guardo el label original en un array
+ _global.labels[contador] = v;
+ var ima = eval("vr.bg"+contador);
+
+ cuel = createEmptyMovieClip("resaltado"+contador, getNextHighestDepth());
+ if(_root["nodraw_"+contador] == undefined || ima != undefined) {
+ createSquare(cuel, ancho_boton+4, alto_boton+4, ancho_linea, color_linea, resaltado_color, resaltado_color, btn_round_border);
+ }
+ with(cuel) {
+ _x = coordenada_x-2;
+ _y = coordenada_y+offsetboton;
+ _visible = false;
+ useHandCursor = false;
+ }
+
+ if(ima != undefined) {
+ cauel = createEmptyMovieClip("resaltadobg"+contador, getNextHighestDepth());
+ with(cauel) {
+ _x = coordenada_x;
+ _y = coordenada_y;
+ _visible = true;
+ useHandCursor = false;
+ }
+ loadMovie(ima,cauel);
+ }
+
+ cual = createEmptyMovieClip("rectangulo"+contador, getNextHighestDepth());
+ with(cual) {
+ useHandCursor = false;
+ //menu = myMenu;
+ _visible = true;
+ _x = coordenada_x;
+ _y = coordenada_y+offsetboton;
+ }
+
+ led_margin_left = Number(vr.led_margin_left);
+ led_margin_top = Number(vr.led_margin_top);
+ if(_root["nodraw_"+contador] == undefined) {
+ createSquare(cual, ancho_boton, alto_boton, ancho_linea, color_linea, boton1_fade, boton2_fade, btn_round_border);
+ }
+
+
+ var lTextExtent = fmtClid.getTextExtent ( "XXXXXXXXXXXXXXXXXXXX" );
+ var textWidth = lTextExtent.textFieldWidth + 10;
+ var textHeight = lTextExtent.textFieldHeight + 2;
+ cual.createTextField("statusprint"+contador, depth, clid_margin_left, clid_margin_top-offsetboton, 1, 1);
+ depth++;
+ with (cual["statusprint"+contador]) {
+ selectable = false;
+ setNewTextFormat(fmtClid);
+ text = "000000000000000000000000000000000000";
+ border = false;
+ _width = vr.btn_width - clid_margin_left * 2;
+ _width = textWidth;
+ _height = textHeight + 5;
+ text = "";
+ if(use_embed_fonts==1) {
+ embedFonts = true;
+ }
+ }
+
+ cual.createTextField("timer"+contador, depth, timer_margin_left, timer_margin_top-offsetboton, 1, 1);
+ depth++;
+ cual["timer"+contador].selectable = false;
+ cual["timer"+contador].border = false;
+ cual["timer"+contador].setNewTextFormat(fmtTimer);
+ cual["timer"+contador].text = "00:00:00";
+ cual["timer"+contador]._width = cual["timer"+contador].textWidth+15;
+ cual["timer"+contador]._height = cual["timer"+contador].textHeight+15;
+ cual["timer"+contador].text = "";
+ cual["timer"+contador].tabIndex = contador;
+ if(use_embed_fonts==1) {
+ cual["timer"+contador].embedFonts = true;
+ }
+
+ var lTextExtent = fmtLabel.getTextExtent ( v );
+ var lWidth = lTextExtent.textFieldWidth + _global.label_extent_x;
+ var lHeight = lTextExtent.textFieldHeight + _global.label_extent_y;
+
+ cual.createTextField("textobg", depth, label_margin_left, label_margin_top-offsetboton, 1, 1);
+ with (cual["textobg"]) {
+ setNewTextFormat(fmtLabel);
+ _width = vr.btn_width - label_margin_left * 2;
+ _height = lHeight;
+ }
+ depth++;
+
+ if (label_shadow == 1) {
+ cual.createTextField("textosh", depth, label_margin_left+1, label_margin_top+1-offsetboton, 1, 1);
+ with (cual["textosh"]) {
+ //setNewTextFormat(fmtLabelsh);
+ _width = lWidth;
+ _height = lHeight;
+ selectable = false;
+ border = showborders;
+ multiline = true;
+ wordWrap = true;
+ if(use_embed_fonts==1) {
+ embedFonts = true;
+ htmlText = v;
+ html = true;
+ } else {
+ text = v;
+ }
+ }
+ cual["textosh"].setTextFormat(fmtLabelsh);
+ depth++;
+ }
+
+ cual.createTextField("textoprint", depth, label_margin_left, label_margin_top-offsetboton, 1, 1);
+ with (cual["textoprint"]) {
+ setNewTextFormat(fmtLabel);
+ _width = lWidth;
+ _height = lHeight;
+ border = showborders;
+ selectable = false;
+ multiline = true;
+ wordWrap = true;
+ if(use_embed_fonts==1) {
+ embedFonts = true;
+ htmlText = v;
+ html = true;
+ } else {
+ text = v;
+ }
+ }
+ cual["textoprint"].setTextFormat(fmtLabel);
+ depth++;
+
+ casilli = cual.attachMovie("ledsombra","casish"+contador, depth, {_x:led_margin_left, _y:led_margin_top-offsetboton+1});
+ casilli._xscale = led_scale;
+ casilli._yscale = led_scale;
+ depth++;
+ casilli = cual.attachMovie("ledcolor","casicol"+contador, depth, {_x:led_margin_left, _y:led_margin_top-offsetboton+1});
+ casilli._xscale = led_scale;
+ casilli._yscale = led_scale;
+ _global.colorlibre[contador]=_global.color[0];
+ casilli.changeledcolor(0,_global.color[0],_global.color[1],contador);
+ depth++;
+ casilli = cual.attachMovie("ledbrillo","casilla"+contador, depth, {_x:led_margin_left, _y:led_margin_top-offsetboton+1});
+ casilli._xscale = led_scale;
+ casilli._yscale = led_scale;
+
+ depth++;
+
+ circle = cual.createEmptyMovieClip("circle"+contador, depth);
+ createCircle(circle,11,0,0,'0x00ff00');
+ circle._xscale = arrow_scale;
+ circle._yscale = arrow_scale;
+ circle._x = arrow_margin_left;
+ circle._y = arrow_margin_top - offsetboton + 1;
+
+ depth++;
+
+ flechi = cual.attachMovie("arrow", "flecha"+contador, depth, {_x:arrow_margin_left, _y:arrow_margin_top-offsetboton+1});
+ depth++;
+// flechi._visible = false;
+ flechi.gotoAndStop(3);
+ flechi._xscale = arrow_scale;
+ flechi._yscale = arrow_scale;
+ flechi.onRelease = function() {
+ doubleClick(this);
+ };
+
+ flechi.onEnterFrame = function() {
+ if(this.hitTest(clip_arrastrado)) {
+ this._xscale = arrow_scale * 1.5;
+ this._yscale = arrow_scale * 1.5;
+ this.hitted = 1;
+ _global.flechahit = this;
+ } else {
+ if(this.hitted == 1) {
+ this.hitted = 0;
+ _global.flechahit = undefined;
+ }
+ }
+ if(this.hitted == 0) {
+ this._xscale = arrow_scale;
+ this._yscale = arrow_scale;
+ this.hitted = -1;
+ }
+ };
+
+
+
+
+// createCircle(cual,12*(arrow_scale/100),arrow_margin_left,arrow_margin_top-offsetboton+1,'0xff0000');
+// var tama = (arrow_scale * 6 / 100) * 2;
+// createCircle(_root["rectangulo"+contador]["flecha"+contador],tama,0,0,'0xff0000');
+
+
+
+ w = Number(eval("vr.icono"+contador));
+ if (w<0) {
+ w = 1;
+ }
+ top = Number(eval("vr.icon"+w+"_margin_top"));
+ left = Number(eval("vr.icon"+w+"_margin_left"));
+ escala = Number(eval("vr.icon"+w+"_scale"));
+ telef = cual.attachMovie("telefono"+w, "tele"+contador, depth, {_x:ancho_boton+left, _y:top-offsetboton});
+ telef.gotoAndStop(1);
+ depth++;
+ sobrec = cual.attachMovie("sobre", "sobrecito"+contador, depth, {_x:ancho_boton+mail_margin_left, _y:mail_margin_top-offsetboton});
+ depth++;
+ sobrec._xscale = mail_scale;
+ sobrec._yscale = mail_scale;
+ sobrec._visible = false;
+ sobrec._alpha = _global.nomailalpha;
+
+ sobrec.onRollOut = function() {
+ this._xscale = mail_scale;
+ this._yscale = mail_scale;
+ };
+
+ sobrec.onEnterFrame = function() {
+ if(this.hitTest(clip_arrastrado)) {
+ this._xscale = mail_scale * 1.5;
+ this._yscale = mail_scale * 1.5;
+ this.hitted = 1;
+ _global.sobrehit = this;
+ } else {
+ if(this.hitted == 1) {
+ this.hitted = 0;
+ _global.sobrehit = undefined;
+ }
+ }
+ if(this.hitted == 0) {
+ this._xscale = mail_scale;
+ this._yscale = mail_scale;
+ this.hitted = -1;
+ }
+ };
+
+ sobrec.onRollOver = function() {
+ // this._xscale = mail_scale * 1.5;
+ // this._yscale = mail_scale * 1.5;
+ var origen = ExtraeNumeroClip(this);
+ makeStatusMail(origen);
+ };
+ sobrec.onRelease = function() {
+ doubleClick(this);
+ };
+ telef.onPress = function() {
+ dragClip(this);
+ };
+ casilli.onRelease = function() {
+ doubleClick(this);
+ };
+ telef._xscale = escala;
+ telef._yscale = escala;
+
+ inicio_timer[cantidad_botones] = 0;
+ timer_type[contador] = "STOP";
+ cantidad_botones++;
+ ultimo = contador;
+ }
+ contador++;
+ }
+ }
+
+ // Draw rectangles over buttons
+ var a=0;
+ while (++a <= vr.total_rectangles) {
+ v = eval("vr.rect_"+a);
+ if (v != undefined) {
+ var datos = v.split(",");
+ var rect_x = Number(datos[0]);
+ var rect_y = Number(datos[1]);
+ var rect_width = Number(datos[2]);
+ var rect_height = Number(datos[3]);
+ var line_width = Number(datos[4]);
+ var line_color = datos[5];
+ var fade_color1 = datos[6];
+ var fade_color2 = datos[7];
+ var rnd_border = Number(datos[8]);
+ var alpha = Number(datos[9]);
+ offsetboton = (rect_height/2);
+ if(datos[10]=="top") {
+ rect_y += offsetboton;
+ cusl = createEmptyMovieClip("dibujo"+a, getNextHighestDepth());
+ createSquare(cusl, rect_width, rect_height, line_width, line_color, fade_color1, fade_color2, rnd_border);
+ cusl._x = rect_x;
+ cusl._y = rect_y;
+ cusl._visible = true;
+ cusl._alpha = alpha;
+ cusl.useHandCursor = false;
+ }
+ }
+ }
+
+ // Draw IMAGES
+
+ var a3=0;
+ while (++a3 <= vr.total_images) {
+ v3 = eval("vr.image_"+a3);
+
+ if (v3 != undefined) {
+ ima = eval("image"+a3);
+ var datos3 = v3.split(",");
+
+ var image_x = Number(datos3[0]);
+ var image_y = Number(datos3[1]);
+ var image_src = datos3[2];
+ var image_url = datos3[3];
+ var image_target = datos3[4];
+ logea("coord x "+image_x);
+ logea("coord y "+image_y);
+ logea("image src "+image_src);
+
+
+ barin = createEmptyMovieClip("image"+a3,getNextHighestDepth());
+ loadMovie(image_src, "image"+a3);
+ barin._x = image_x;
+ barin._y = image_y;
+
+ }
+
+ }
+
+
+
+
+ // Draw TEXT LEGENDS
+ var a=0;
+ while (++a <= vr.total_legends) {
+ v = eval("vr.legend_"+a);
+ if (v != undefined) {
+ var datos = v.split(",");
+ var legend_x = Number(datos[0]);
+ var legend_y = Number(datos[1]);
+ var legend_fontsize = Number(datos[3]);
+ var legend_fontfamily = datos[4];
+ var legend_fontcolor = parseInt(datos[5], 16);
+ var legend_embedfonts = Number(datos[6]);
+ var legend_no_base64 = Number(datos[7]);
+ var legend_url = datos[8];
+ var legend_target = datos[9];
+
+ if(legend_no_base64==0) {
+ var legend_text = base64_decode(datos[2]);
+ } else {
+ var legend_text = datos[2];
+ }
+
+ var fmtLege = new TextFormat();
+ fmtLege.size = legend_fontsize;
+ fmtLege.color = legend_fontcolor;
+
+ if(legend_embedfonts == 1) {
+ fmtLege.font = "$fuente_nombre";
+ } else {
+ fmtLege.font = legend_fontfamily;
+ }
+
+ if(legend_url != "no") {
+ fmtLege.url = legend_url;
+ fmtLege.underline = true;
+ logea("legend url "+fmtLege.url);
+ }
+
+ if(legend_target != "NONTARFOP") {
+ fmtLege.target = legend_target;
+ }
+
+ createTextField("lege"+a, getNextHighestDepth(), legend_x, legend_y, 10, 10);
+ _root["lege"+a].setNewTextFormat(fmtLege);
+ if(legend_embedfonts == 1) {
+ _root["lege"+a].embedFonts = true;
+ } else {
+ _root["lege"+a].embedFonts = false;
+ }
+ _root["lege"+a].htmlText = legend_text;
+ _root["lege"+a].html = true;
+ _root["lege"+a].border = false;
+ _root["lege"+a].selectable = false;
+ _root["lege"+a].multiline = true;
+ _root["lege"+a].wordWrap = true;
+
+ var lTextExtent = fmtLege.getTextExtent ( legend_text );
+ var lWidth = lTextExtent.textFieldWidth + 40;
+ var lHeight = lTextExtent.textFieldHeight + 40;
+
+ _root["lege"+a]._width = lWidth;
+ _root["lege"+a]._height = lHeight;
+ _root["lege"+a].setTextFormat(fmtLege);
+ }
+ }
+ ultimo++;
+ attachMovie("telefono1", "tele"+ultimo, getNextHighestDepth(), {_x:1, _y:1, _visible:false});
+ _global.masalto = ultimo;
+
+ _root.onMouseMove = function() {
+ if(_global.nohighlight == 1) {
+ return;
+ }
+ var columna = int((_xmouse+ancho_boton+separacion)/(ancho_boton+separacion));
+ var fila = Math.floor((_ymouse-30-separacion)/(alto_boton+separacion))+1;
+ var boton = 1;
+ if (columna<1) {
+ columna = 1;
+ boton = -1;
+ } else if (columna>cuantas_columnas) {
+ columna = cuantas_columnas;
+ boton = -1;
+ }
+ if (fila>cuantas_filas) {
+ fila = cuantas_filas;
+ boton = -1;
+ } else if (fila<1) {
+ fila = 1;
+ boton = -1;
+ }
+ if(boton!=-1) {
+ boton = ((columna*cuantas_filas)-cuantas_filas)+fila;
+ if (boton!=_global.rectanguloprendido) {
+ var a=0;
+ while (++a < _global.otrosprendidos.length) {
+ var prendeme = eval("resaltado"+_global.otrosprendidos[a]);
+ prendeme._visible = false;
+ }
+
+ //var myresa = eval("resaltado"+boton);
+ //var myapaga = eval("resaltado"+_global.rectanguloprendido);
+ if(_global.rectanguloprendido != _global.restrict) {
+ //myapaga._visible = false;
+ _root["resaltado"+_global.rectanguloprendido]._visible = false;
+ }
+ //myresa._visible = true;
+ _root["resaltado"+boton]._visible = true;
+ _global.rectanguloprendido = boton;
+ makeStatus(boton);
+
+ var botresa = linkeado[boton].split(",");
+ for (b in botresa) {
+ //var prendeme = eval("resaltado"+botresa[b]);
+ //prendeme._visible = true;
+ _root["resaltado"+botresa[b]]._visible = true;
+ _global.otrosprendidos.push(botresa[b]);
+ }
+ }
+ } else {
+ //var myapaga = eval("resaltado"+_global.rectanguloprendido);
+ //myapaga._visible = false;
+ _root["resaltado"+_global.rectanguloprendido]._visible = false;
+ for (b in _global.otrosprendidos) {
+ //var prendeme = eval("resaltado"+_global.otrosprendidos[b]);
+ if(_global.otrosprendidos[b]!=_global.restrcit) {
+ //prendeme._visible = false;
+ _root["resaltado"+_global.otrosprendidos[b]]._visible = false;
+ }
+ }
+ }
+ };
+ _root.detail.swapDepths(getNextHighestDepth());
+ _root.superdetails.swapDepths(getNextHighestDepth());
+ _root.log.swapDepths(getNextHighestDepth());
+ _root.codebox.swapDepths(getNextHighestDepth());
+
+ _root.selectbox1.swapDepths(getNextHighestDepth());
+ if(vr.totaltimes > 0) {
+ genera_selecttimeout();
+ _root.selectbox1._visible = true;
+ } else {
+ _root.selectbox1._visible = false;
+ }
+
+if(defined(_root.margintop))
+{
+ _root._y+=_root.margintop;
+}
+
+if(defined(_root.marginleft))
+{
+ _root._x+=_root.marginleft;
+}
+
+};
+
+
+Inicia_Variables = function () {
+ lastclick=0;
+ doubleclickduration=300;
+ _global.swfversion="0.30";
+ _global.frames = 0;
+ _global.step=2;
+ _global.statusline="";
+ _global.server = vr.server;
+ _global.port = vr.port;
+ _global.clid_centered = Number(vr.clid_centered);
+ _global.shakepixels = Number(vr.shake_pixels);
+ _global.nomailalpha = Number(vr.nomail_alpha);
+ if (Number(vr.show_borders)==1) {
+ _global.showborders = true;
+ } else {
+ _global.showborders = false;
+ }
+ _root.log._visible = false;
+ _root.log._alpha = 100;
+ _root.codebox._visible = false;
+ _root.codebox._alpha = 100;
+ _root.detail._visible = false;
+ _root.superdetails._visible = false;
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails._alpha = 90;
+ _global.logwindow = 1;
+ _global.margenbar = 2;
+ _global.chanvars = new Array();
+ _global.loglines = new Array();
+ _global.texto_tip = new Array();
+ _global.texto_mail = new Array();
+ _global.timeralarm = new Array();
+ _global.urlalarm = new Array();
+ _global.targetalarm = new Array();
+ _global.st_originclid = new Array();
+ _global.st_destinationclid = new Array();
+ _global.ipboton = new Array();
+ _global.st_direction = new Array();
+ _global.queuemember = new Object();
+ _global.superdetailstexttab1 = "";
+ _global.superdetailstexttab2 = "";
+ _global.st_duration = new Array();
+ _global.meetmemember = new Array();
+ _global.meetmeroom = new Array();
+ _global.meetmemute = new Array();
+ _global.linkeado = new Array();
+ _global.authorized = false;
+ _global.wait5seconds = 1;
+ _global.rectanguloprendido = 1;
+ _global.otrosprendidos = new Array();
+ _global.colorlibre = new Array();
+ _global.labels = new Array();
+ _global.clidnumber = new Array();
+ _global.clidname = new Array();
+ _global.enable_crypto = Number(vr.enable_crypto);
+
+ _global.label_extent_x = Number(vr.label_extent_x);
+ _global.label_extent_y = Number(vr.label_extent_y);
+ if (isNaN(_global.label_extent_x)) {
+ _global.label_extent_x = 10;
+ }
+ if (isNaN(_global.label_extent_y)) {
+ _global.label_extent_y = 5;
+ }
+
+ _global.enable_label_background = Number(vr.enable_label_background);
+ _global.restart = Number(vr.restart);
+ _global.nosecurity = vr.nosecurity;
+ _global.valorchangeledcolor = new Array();
+ if(_global.nosecurity == 1) {
+ _global.claveingresada="";
+ }
+ _global.claveingresada = LocalLoad("auth","clave");
+ _root.codebox.claveform.text = _global.claveingresada;
+ _global.timeout_value = 0;
+ if (isNaN(_global.enable_crypto)) {
+ _global.enable_crypto=0;
+ } else {
+ if(_global.enable_crypto != 0) {
+ _global.enable_crypto = 1;
+ }
+ }
+
+ _global.led_color = Number(vr.led_color);
+ if (_global.led_color>1 || _global.led_color<0) {
+ _global.led_color = 0;
+ }
+ // ancho_pantalla = System.capabilities.screenResolutionX;
+ // alto_pantalla = System.capabilities.screenResolutionY;
+ ancho_pantalla_real = $stage_width;
+ alto_pantalla_real = $stage_height;
+ ancho_boton = Number(_root.vr.btn_width);
+ alto_boton = Number(_root.vr.btn_height);
+
+ if (ancho_boton<=0) {
+ ancho_boton = 200;
+ }
+ if (alto_boton<=0) {
+ alto_boton = 80;
+ }
+ separacion = Number(_root.vr.btn_padding);
+ ancho_linea = Number(_root.vr.btn_line_width);
+ color_linea = _root.vr.btn_line_color;
+ boton1_fade = _root.vr.btn_fadecolor_1;
+ boton2_fade = _root.vr.btn_fadecolor_2;
+ ledcolor_busy = _root.vr.ledcolor_busy;
+ ledcolor_ready = _root.vr.ledcolor_ready;
+ ledcolor_agent = _root.vr.ledcolor_agent;
+ ledcolor_paused = _root.vr.ledcolor_paused;
+ _global.resaltado_color = _root.vr.btn_highlight_color;
+
+ if(ledcolor_busy==undefined) {
+ ledcolor_busy="0xC00000";
+ }
+ if(ledcolor_ready==undefined) {
+ ledcolor_ready="0x00A000";
+ }
+ if(ledcolor_agent==undefined) {
+ ledcolor_agent="0xC0A000";
+ }
+ if(_global.resaltado_color==undefined) {
+ _global.resaltado_color="FF0000";
+ }
+
+ // Fills 30 elements in loglines (for debug window)
+ for (i=0; i<30; i++) {
+ _global.loglines.push("");
+ }
+
+ _global.color = new Array();
+ _global.color[0] = ledcolor_ready;
+ _global.color[1] = ledcolor_busy;
+ _global.color[2] = ledcolor_agent;
+ btn_round_border = Number(_root.vr.btn_round_border);
+ label_margin_top = Number(_root.vr.label_margin_top);
+ label_margin_left = Number(_root.vr.label_margin_left);
+ clid_margin_top = Number(_root.vr.clid_margin_top);
+ clid_margin_left = Number(_root.vr.clid_margin_left);
+ timer_margin_top = Number(_root.vr.timer_margin_top);
+ timer_margin_left = Number(_root.vr.timer_margin_left);
+ if(_root.vr.dimm_noregister_by == undefined) {
+ dimm_noregister = 20;
+ } else {
+ dimm_noregister = Number(_root.vr.dimm_noregister_by);
+ }
+ if(_root.vr.dimm_lagged_by == undefined) {
+ dimm_lagged = 60;
+ } else {
+ dimm_lagged = Number(_root.vr.dimm_lagged_by);
+ }
+ if(_root.vr.label_font_color == undefined) {
+ _root.vr.label_font_color='000000';
+ }
+ if(_root.vr.label_shadow_color == undefined) {
+ _root.vr.label_shadow_color='dddddd';
+ }
+ label_font_color = parseInt(_root.vr.label_font_color, 16);
+ label_shadow_color = parseInt(_root.vr.label_shadow_color, 16);
+ clid_font_color = parseInt(_root.vr.clid_font_color, 16);
+ timer_font_color = parseInt(_root.vr.timer_font_color, 16);
+ label_font_size = Number(_root.vr.label_font_size);
+ arrow_margin_left = Number(vr.arrow_margin_left);
+ arrow_margin_top = Number(vr.arrow_margin_top);
+ led_scale = Number(_root.vr.led_scale);
+ arrow_scale = Number(_root.vr.arrow_scale);
+ // phone_scale = Number(phone_scale);
+ mail_margin_left = Number(_root.vr.mail_margin_left);
+ mail_margin_top = Number(_root.vr.mail_margin_top);
+ mail_scale = Number(_root.vr.mail_scale);
+ show_security_code = Number(_root.vr.show_security_code);
+ show_clid_info = Number(_root.vr.show_clid_info);
+ show_btn_help = Number(_root.vr.show_btn_help);
+ show_btn_debug = Number(_root.vr.show_btn_debug);
+ show_btn_reload = Number(_root.vr.show_btn_reload);
+ show_status = Number(_root.vr.show_status);
+ use_embed_fonts = Number(_root.vr.use_embed_fonts);
+ enable_animation = Number(_root.vr.enable_animation);
+ label_shadow = Number(_root.vr.label_shadow);
+ _level0.detail.duration_label = _root.vr.detail_duration;
+ _level0.detail.title = _root.vr.detail_title;
+ _level0.codebox.title = _root.vr.security_code_title;
+ _level0.superdetails.titlefs2 = _root.vr.tab_call_text;
+ _level0.superdetails.titlefs3 = _root.vr.tab_queue_text;
+ _level0.log.title = _root.vr.debug_window_title;
+ orden_barra = [["security", vr.show_security_code], ["clid", vr.show_clid_info], ["status", vr.show_status], ["help", vr.show_btn_help], ["debug", vr.show_btn_debug], ["reload", vr.show_btn_reload]];
+ orden_barra.sort(ordenaArray);
+ // cuantas_filas = math.floor((alto_pantalla_real-30)/(alto_boton+separacion));
+ cuantas_filas = (alto_pantalla_real-30)/(alto_boton+separacion);
+ cuantas_filas = Math.floor(_root.cuantas_filas);
+ // cuantas_columnas = math.floor((ancho_pantalla_real+separacion)/(ancho_boton+separacion));
+ cuantas_columnas = (ancho_pantalla_real+separacion)/(ancho_boton+separacion);
+ cuantas_columnas = Math.floor(Number(_root.cuantas_columnas));
+
+ max_en_pantalla = cuantas_columnas * cuantas_filas;
+
+ if(_root.vr.highestpos == undefined) {
+ _root.vr.highestpos = 2;
+ }
+ _global.highpos = Number(_root.vr.highestpos);
+ cuantas_columnas = Math.ceil(_global.highpos / cuantas_filas);
+ _global.max_scroll_left = 996 - ( cuantas_columnas * (ancho_boton+separacion)) + separacion;
+ if(_global.highpos <= max_en_pantalla) {
+ _global.scrolling = 0;
+ } else {
+ _global.scrolling = 1;
+ }
+
+
+ fmtLabel = new TextFormat();
+ fmtLabel.size = vr.label_font_size;
+ if(use_embed_fonts==1) {
+ fmtLabel.font = "$fuente_nombre";
+ } else {
+ fmtLabel.font = vr.label_font_family;
+ }
+ fmtLabel.color = label_font_color;
+
+ fmtLabelsh = new TextFormat();
+ fmtLabelsh.color = label_shadow_color;
+ fmtLabelsh.size = vr.label_font_size;
+ if(use_embed_fonts==1) {
+ fmtLabelsh.font = "$fuente_nombre";
+ } else {
+ fmtLabelsh.font = vr.label_font_family;
+ }
+ fmtLabelsh._alpha = 90;
+
+ fmtClid = new TextFormat();
+ fmtClid.size = vr.clid_font_size;
+ fmtClid.color = clid_font_color;
+ if(use_embed_fonts==1) {
+ fmtClid.font = "$fuente_nombre";
+ } else {
+ fmtClid.font = vr.clid_font_family;
+ }
+
+ fmtTimer = new TextFormat();
+ fmtTimer.size = vr.timer_font_size;
+ fmtTimer.color = timer_font_color;
+ if(use_embed_fonts==1) {
+ fmtTimer.font = "$fuente_nombre";
+ } else {
+ fmtTimer.font = vr.timer_font_family;
+ }
+
+ _global.ancho_a_centrar = vr.btn_width - clid_margin_left * 2;
+
+ timer_type = new Array();
+ inicio_timer = new Array();
+ /* Custom context menu is not working in MING
+ var myMenu;
+ myMenu = new ContextMenu();
+ myMenu.customItems.push(new ContextMenuItem("Toggle DND", setDND));
+ myMenu.hideBuiltInItems();
+ */
+
+
+ var i=0;
+ while (++i < orden_barra.length) {
+// for (i=0; i0) {
+ if (orden_barra[i][0] == "security") {
+ Barra_SecurityCode();
+ }
+ if (orden_barra[i][0] == "clid") {
+ Barra_InfoText();
+ }
+ if (orden_barra[i][0] == "help") {
+ Barra_BotonHelp();
+ }
+ if (orden_barra[i][0] == "debug") {
+ Barra_BotonDebug();
+ }
+ if (orden_barra[i][0] == "reload") {
+ Barra_BotonReload();
+ }
+ if (orden_barra[i][0] == "status") {
+ Barra_Status();
+ }
+ }
+ }
+
+
+
+_global.opcionesTimeout = new Array();
+_global.opcionesTimeoutSecs = new Array();
+var a=0;
+while (++a <= vr.totaltimes) {
+//for (a=1; a<=vr.totaltimes; a++) {
+ v = eval("vr.timeout_"+a);
+ if (v != undefined) {
+ var datos = v.split(",");
+ _global.opcionesTimeoutSecs.push(Number(datos[0]));
+ _global.opcionesTimeout.push(datos[1]);
+ }
+
+}
+
+datosnod = vr.nodraw.split(',');
+for (var elem in datosnod) {
+ _root["nodraw_"+datosnod[elem]] = 1;
+}
+};
+
+
+function ordenaArray(a, b) {
+ return a[1]>b[1];
+}
+
+
+function SecurityCode_Locked() {
+ if(show_security_code != 0) {
+ var x=_root.claveinput._x;
+ var mydepth = _level0.claveinput.getDepth();
+ // _level0.claveinput.unloadMovie();
+ mymc = attachMovie("boton_security", "claveinput", mydepth);
+ mymc.gotoAndStop(1);
+ mymc._x = x;
+ mymc._y = 1;
+ mymc.onPress = function() {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ };
+ mymc.onRollOver = function() {
+ _root.statusbar.status.text = "Open Security Code Input Box";
+ mymc.gotoAndStop(2);
+ };
+ mymc.onRollOut = function() {
+ _root.statusbar.status.text = _global.statusline;
+ mymc.gotoAndStop(1);
+ };
+ }
+}
+
+function SecurityCode_Unlocked() {
+ if(show_security_code != 0) {
+ var x=_root.claveinput._x;
+ var mydepth = _level0.claveinput.getDepth();
+ // _level0.claveinput.unloadMovie();
+ mymc = attachMovie("boton_security_unlock", "claveinput", mydepth);
+ mymc._x = x;
+ mymc._y = 1;
+ mymc.onPress = function() {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ };
+ mymc.onRollOver = function() {
+ _level0.statusbar.status.text = "Open Security Code input box";
+ mymc.gotoAndStop(2);
+ };
+ mymc.onRollOut = function() {
+ _level0.statusbar.status.text = _global.statusline;
+ mymc.gotoAndStop(1);
+ };
+ }
+}
+
+function Barra_SecurityCode() {
+ attachMovie("boton_security_unlock", "claveinput", getNextHighestDepth());
+ claveinput.gotoAndStop(1);
+ claveinput._x = _global.margenbar;
+ _global.margen_claveinput = _global.margenbar;
+ claveinput._y = 1;
+ claveinput._visible = true;
+ claveinput.onPress = function() {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ };
+ claveinput.onRollOver = function() {
+ _level0.statusbar.status.text = vr.btn_security_text;
+ claveinput.gotoAndStop(2);
+ };
+ claveinput.onRollOut = function() {
+ _level0.statusbar.status.text = _global.statusline;
+ claveinput.gotoAndStop(1);
+ };
+ _global.margenbar = _global.margenbar+claveinput._width;
+}
+
+function Barra_BotonReload() {
+ attachMovie("boton_reload", "buttonreload", getNextHighestDepth());
+ buttonreload.gotoAndStop(1);
+ _global.margen_buttonreload = _global.margenbar;
+ buttonreload._x = _global.margenbar;
+ buttonreload._y = 1;
+ buttonreload._visible = true;
+ buttonreload.label.text = vr.btn_reload_label;
+ buttonreload.onRelease = function() {
+ _root.recarga();
+ };
+ buttonreload.onRollOver = function() {
+ if(_global.restart == 1) {
+ _level0.statusbar.status.text = vr.btn_restart_text;
+ } else {
+ _level0.statusbar.status.text = vr.btn_reload_text;
+ }
+ buttonreload.gotoAndStop(2);
+ };
+ buttonreload.onRollOut = function() {
+ _level0.statusbar.status.text = _global.statusline;
+ buttonreload.gotoAndStop(1);
+ };
+ _global.margenbar = _global.margenbar+buttonreload._width;
+}
+
+
+function Barra_BotonDebug() {
+ attachMovie("boton_debug", "buttondebug", getNextHighestDepth());
+ buttondebug.gotoAndStop(1);
+ _global.margen_buttondebug = _global.margenbar;
+ buttondebug._x = _global.margenbar;
+ buttondebug._y = 1;
+ buttondebug._visible = true;
+ buttondebug.label.text = vr.btn_log_label;
+ buttondebug.onPress = function() {
+ MuestraLog();
+ };
+ buttondebug.onRollOver = function() {
+ _level0.statusbar.status.text = vr.btn_debug_text + " (" +_global.swfversion + ")";
+ buttondebug.gotoAndStop(2);
+ };
+ buttondebug.onRollOut = function() {
+ _level0.statusbar.status.text = _global.statusline;
+ buttondebug.gotoAndStop(1);
+ };
+ _global.margenbar = _global.margenbar+buttondebug._width;
+}
+
+function Barra_BotonHelp() {
+ attachMovie("boton_ayuda", "buttonhelp", getNextHighestDepth());
+ buttonhelp.gotoAndStop(1);
+ _global.margen_buttonhelp = _global.margenbar;
+ buttonhelp._x = _global.margenbar;
+ buttonhelp._y = 1;
+ buttonhelp._visible = true;
+ buttonhelp.label.text = vr.btn_help_label;
+ buttonhelp.onPress = function() {
+ buttonhelp.gotoAndStop(2);
+ url = "help_"+vr.lang+".html";
+ winName = "fophelp";
+ w = 400;
+ h = 300;
+ toolbar = 0;
+ location = 0;
+ directories = 0;
+ status = 0;
+ menubar = 0;
+ scrollbars = 1;
+ resizable = 0;
+ getURL("javascript:var myWin1;if (!myWin1 || myWin1.closed){myWin1=window.open('"+url+"', '"+winName+"', '"+"width="+w+", height="+h+", toolbar="+toolbar+", location="+location+", directories="+directories+", status="+status+", menubar="+menubar+", scrollbars="+scrollbars+", resizable="+resizable+", top='+((screen.height/2)-("+h/2+"))+', left='+((screen.width/2)-("+w/2+"))+'"+"')} else{myWin1.focus();};void(0);",'');
+ };
+ buttonhelp.onRollOver = function() {
+ _level0.statusbar.status.text = vr.btn_help_text;
+ buttonhelp.gotoAndStop(2);
+ };
+ buttonhelp.onRollOut = function() {
+ _level0.statusbar.status.text = _global.statusline;
+ buttonhelp.gotoAndStop(1);
+ };
+ _global.margenbar = _global.margenbar+buttonhelp._width;
+}
+
+
+function Barra_Status() {
+ ancho = 0;
+ var j=0;
+ while (++j < orden_barra.length) {
+// for (j=0; j0) {
+ if (orden_barra[j][0] == "security") {
+ ancho = ancho+32.5;
+ }
+ if (orden_barra[j][0] == "clid") {
+ ancho = ancho+272.5;
+ }
+ if (orden_barra[j][0] == "help") {
+ ancho = ancho+32.5;
+ }
+ if (orden_barra[j][0] == "debug") {
+ ancho = ancho+32.5;
+ }
+ if (orden_barra[j][0] == "reload") {
+ ancho = ancho+32.5;
+ }
+ }
+ }
+ ancho_status = ancho_pantalla_real-(ancho+2);
+
+ bar = createEmptyMovieClip("statusbar",30000);
+ _global.margen_statusbar = _global.margenbar;
+ bar._visible = true;
+ bar._border = true;
+ createSquare(_level0.statusbar, ancho_status, 30, 0, "0x999999", "0xcccccc", "0xcccccc", 0);
+ bar._x = _global.margenbar;
+ bar._y = 16;
+
+ fmtStatus = new TextFormat();
+ fmtStatus.size = 16;
+ if(use_embed_fonts==1) {
+ fmtStatus.font = "$fuente_nombre";
+ } else {
+ fmtStatus.font = vr.label_font_family;
+ }
+
+ statusTextExtent = fmtStatus.getTextExtent ( "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" );
+ statusWidth = statusTextExtent.textFieldWidth;
+ statusHeight = statusTextExtent.textFieldHeight;
+ bar.createTextField("status", getNextHighestDepth(), 3, 3, statusWidth, statusHeight);
+ bar.status.setNewTextFormat(fmtStatus);
+ bar.status.text = "Asterisk Flash Operator Panel";
+ bar.status.border = false;
+ bar.status._y = -10;
+ bar.status.selectable = false;
+ if(use_embed_fonts==1) {
+ bar.status.embedFonts = true;
+ }
+
+}
+
+function Barra_InfoText() {
+ fmtInfo = new TextFormat();
+ fmtInfo.size = 16;
+ if(use_embed_fonts==1) {
+ fmtInfo.font = "$fuente_nombre";
+ } else {
+ fmtInfo.font = vr.label_font_family;
+ }
+ attachMovie("infotext", "infotext1", getNextHighestDepth());
+ _global.margen_infotext1 = _global.margenbar;
+ infotext1._x = _global.margenbar;
+ infotext1._y = 1;
+ infotext1._visible = true;
+ infoTextExtent = fmtInfo.getTextExtent ( vr.clid_label );
+ infoWidth = infoTextExtent.textFieldWidth + 20;
+ infoHeight = infoTextExtent.textFieldHeight;
+ infotext1.createTextField("cclid", getNextHighestDepth(), 3, 3, infoWidth, infoHeight);
+ infotext1.cclid.setNewTextFormat(fmtInfo);
+ infotext1.cclid.text = vr.clid_label;
+ infotext1.cclid.border = false;
+ if(use_embed_fonts==1) {
+ infotext1.cclid.embedFonts = true;
+ }
+ inputtext = "XXXXXXXXXXXXXXXXXXX";
+ infoTextExtent = fmtInfo.getTextExtent ( inputtext );
+ infoWidth = infoTextExtent.textFieldWidth;
+ infoHeight = infoTextExtent.textFieldHeight;
+ infotext1.createTextField("clid_text", getNextHighestDepth()+1, 74, 3, 195, infoHeight);
+ infotext1.clid_text.setNewTextFormat(fmtInfo);
+ infotext1.clid_text.text = "";
+ infotext1.clid_text.border = false;
+ infotext1.clid_text.type = "input";
+ if(use_embed_fonts==1) {
+ infotext1.clid_text.embedFonts = true;
+ }
+
+ _global.margenbar = _global.margenbar+infotext1._width;
+}
+
+recarga = function () {
+ if(_global.restart == 1) {
+ // Send command to restart Asterisk
+ envia_comando("restart","1","1");
+ } else {
+ // Reloads FLASH client
+ delete _global.key;
+ var incontext = context;
+ var inbutton = mybutton;
+ var inrestrict = _global.restrict;
+ var indial = dial;
+ var innohighlight = nohighlight;
+ for (var a in _root) {
+ if (typeof (_root[a]) == "object") {
+ removeMovieClip(_root[a]);
+ }
+ if (typeof (_root[a]) == "movieclip") {
+ removeMovieClip(_root[a]);
+ }
+ }
+ _global.context = incontext;
+ _global.mybutton = inbutton;
+ _global.restrict = inrestrict;
+ _global.dial = indial;
+ _global.nohighlight = inhighlight;
+ stop();
+ gotoAndPlay(1);
+ }
+};
+
+
+Detiene_Peliculas = function () {
+ // Detiene todos las peliculas al inicio
+ selectbox1.gotoAndStop(1);
+ for (a in _root) {
+ if (typeof (a) == "movieclip") {
+ _root[a].stop();
+ if (a.substring(0, 10) == "rectangulo") {
+ for (b in _root[a]) {
+ if (typeof (_root[a][b]) == "movieclip") {
+ _root[a][b].stop();
+ }
+ if(b.substring(0,7) == "casicol") {
+ var numero = b.substring(7,8);
+ _root[a][b].changeledcolor(0,_global.colorlibre[numero],_global.color[1],numero);
+ }
+ }
+ }
+ }
+ }
+ _root._y = _root.margintop;
+ _root._x = _root.marginleft;
+};
+
+_root.onEnterFrame = function() {
+
+ if(_global.scrolling == 1) {
+ // _level0.statusbar.status.text = _xmouse+":"+_ymouse;
+ // Nico SCROLL
+ var limite_der = 986 + (_root._x * -1);
+ var limite_der_top = 986 + (_root._x * -1) + 10;
+ var limite_izq = 10 + (_root._x * -1);
+ var limite_izq_top = 10 + (_root._x * -1) - 10;
+ if(_xmouse > limite_der && _xmouse <= limite_der_top) {
+ _root._x -= _global.step;
+ claveinput._x += _global.step;
+ infotext1._x += _global.step;
+ _level0.statusbar._x += _global.step;
+ buttonhelp._x += _global.step;
+ buttondebug._x += _global.step;
+ buttonreload._x += _global.step;
+ optionselected._x += _global.step;
+ selectbox1._x += _global.step;
+ _root.fondo.mihijo._x += _global.step;
+ _root.option0._x += _global.step;
+ _root.option1._x += _global.step;
+ _root.option2._x += _global.step;
+ _root.option3._x += _global.step;
+ _root.option4._x += _global.step;
+ _root.codebox._x += _global.step;
+ _root.superdetails._x += _global.step;
+ _global.step+=2;
+ } else if (_xmouse < limite_izq && _xmouse>= limite_izq_top) {
+ _root._x += _global.step;
+ claveinput._x -= _global.step;
+ infotext1._x -= _global.step;
+ _level0.statusbar._x -= _global.step;
+ buttonhelp._x -= _global.step;
+ buttondebug._x -= _global.step;
+ buttonreload._x -= _global.step;
+ optionselected._x -= _global.step;
+ selectbox1._x -= _global.step;
+ _root.fondo.mihijo._x -= _global.step;
+ _root.option0._x -= _global.step;
+ _root.option1._x -= _global.step;
+ _root.option2._x -= _global.step;
+ _root.option3._x -= _global.step;
+ _root.option4._x -= _global.step;
+ _root.codebox._x -= _global.step;
+ _root.superdetails._x -= _global.step;
+ _global.step+=2;
+ } else {
+ _global.step=2;
+ }
+ if(_root._x>0) {
+ _root._x = 0;
+ buttondebug._x = _global.margen_buttondebug;
+ buttonreload._x = _global.margen_buttonreload;
+ buttonhelp._x = _global.margen_buttonhelp;
+ claveinput._x = _global.margen_claveinput;
+ infotext1._x = _global.margen_infotext1;
+ _level0.statusbar._x = _global.margen_statusbar;
+ optionselected._x = 800;
+ selectbox1._x = 800;
+ _root.option0._x = 800;
+ _root.option1._x = 800;
+ _root.option2._x = 800;
+ _root.option3._x = 800;
+ _root.option4._x = 800;
+
+ _root.codebox._x = 240;
+ _root.superdetails._x = 490;
+ _root.fondo.mihijo._x = 1;
+ } else if(_root._x < _global.max_scroll_left) {
+ _root._x = _global.max_scroll_left;
+ buttondebug._x = _global.margen_buttondebug + ( _global.max_scroll_left * -1);
+ buttonreload._x = _global.margen_buttonreload + ( _global.max_scroll_left * -1);
+ buttonhelp._x = _global.margen_buttonhelp + (_global.max_scroll_left * -1);
+ claveinput._x = _global.margen_claveinput + (_global.max_scroll_left * -1);
+ infotext1._x = _global.margen_infotext1 + (_global.max_scroll_left * -1);
+ _level0.statusbar._x = _global.margen_statusbar + (_global.max_scroll_left * -1);
+ optionselected._x = 800 + (_global.max_scroll_left * -1);
+ selectbox1._x = 800 + (_global.max_scroll_left * -1);
+ _root.option0._x = 800 + (_global.max_scroll_left * -1);
+ _root.option1._x = 800 + (_global.max_scroll_left * -1);
+ _root.option2._x = 800 + (_global.max_scroll_left * -1);
+ _root.option3._x = 800 + (_global.max_scroll_left * -1);
+ _root.option4._x = 800 + (_global.max_scroll_left * -1);
+// for (var a=0; a<5; a++) {
+// var v = eval("_root.option"+a);
+// v._x = 800 + (_global.max_scroll_left * -1);
+// }
+ _root.codebox._x = 240 + (_global.max_scroll_left * -1);
+ _root.superdetails._x = 490 + (_global.max_scroll_left * -1);
+ _root.fondo.mihijo._x = 1 + (_global.max_scroll_left * -1);
+ }
+ }
+
+ if (lastclick>0) {
+ if ((getTimer()-lastclick)>doubleclickduration) {
+ lastclick = 0;
+ logea ("single click "+lastclip);
+ var clip=lastclip;
+ var numeroclip = ExtraeNumeroClip(clip);
+
+ /* new_way op_actions
+ if (_global.authorized == true) {
+ envia_comando("singleclick",clip,"");
+ } else {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ return;
+ }
+ */
+ // Un solo click
+ if (clip._name.substring(0, 7) != "casilla") {
+ if (_global.authorized == true) {
+ if (_root.context.length>0) {
+ boton_numero_con_contexto = numeroclip+"@"+context;
+ } else {
+ boton_numero_con_contexto = numeroclip;
+ }
+ if (_global.meetmemember[numeroclip]>0) {
+ var statusclid = eval("rectangulo"+numeroclip+".statusprint"+numeroclip);
+ if (_global.meetmemute[numeroclip]>0) {
+ logea("envio meetmemute");
+ envia_comando("meetmemute"+boton_numero_con_contexto+"-", _global.meetmemember[numeroclip], _global.meetmeroom[numeroclip]);
+ statusclid.text = "Conference "+_global.meetmeroom[numeroclip]+" muted";
+ _global.meetmemute[numeroclip]=0;
+ } else {
+ logea("envio meetmeunmute");
+ envia_comando("meetmeunmute"+boton_numero_con_contexto+"-", _global.meetmemember[numeroclip], _global.meetmeroom[numeroclip]);
+ statusclid.text = "Conference "+_global.meetmeroom[numeroclip];
+ _global.meetmemute[numeroclip]=1;
+ }
+ } else {
+ logea("no es meetmemember, empiezo record");
+ envia_comando("startmonitor",numeroclip,numeroclip);
+ }
+ } else {
+ // Not authorized
+ envia_comando("bogus", 0, 0);
+ logea("no esta autorizado");
+ }
+ } else {
+ logea("single click en led no hace nada "+clip._name);
+ }
+ }
+ }
+};
+
+Timers = function () {
+
+
+ if (_global.reconecta == 1) {
+ delete setInterval;
+ delete _global.key;
+ if (_global.wait5seconds>9) {
+ _global.wait5seconds = 0;
+ recarga();
+ } else {
+ _global.wait5seconds += 1;
+ }
+ return;
+ }
+ var floor = Math.floor;
+ for (var a in timer_type) {
+ var v = eval("texto"+a);
+ if (v != "") {
+ if (timer_type[a] == "UP" || timer_type[a] == "IDLE") {
+ // calculate values
+ var elapsedTime = getTimer()-inicio_timer[a];
+
+ // ALARMA TIMER
+ var segundos = floor( elapsedTime / 1000);
+ if( segundos == timeralarm[a]) {
+ popup_window(urlalarm[a],targetalarm[a]);
+ logea(segundos);
+ }
+ // hours
+ var elapsedHours = floor(elapsedTime/3600000);
+ var remaining = elapsedTime-(elapsedHours*3600000);
+ // minutes
+ var elapsedM = floor(remaining/60000);
+ remaining = remaining-(elapsedM*60000);
+ // seconds
+ var elapsedS = floor(remaining/1000);
+
+ if (elapsedHours<0) {
+ elapsedHours = Math.abs(elapsedHours);
+ }
+ if (elapsedM<0) {
+ elapsedM = Math.abs(elapsedM);
+ }
+ if (elapsedS<0) {
+ elapsedS = Math.abs(elapsedS);
+ }
+
+ if (elapsedHours<10) {
+ var hours = "0"+elapsedHours.toString();
+ } else {
+ var hours = elapsedHours.toString();
+ }
+ if (elapsedM<10) {
+ var minutes = "0"+elapsedM.toString();
+ } else {
+ var minutes = elapsedM.toString();
+ }
+ if (elapsedS<10) {
+ var seconds = "0"+elapsedS.toString();
+ } else {
+ var seconds = elapsedS.toString();
+ }
+ var statusclid = eval("rectangulo"+a+".timer"+a);
+ statusclid.text = hours+":"+minutes+":"+seconds;
+ } else if (timer_type[a] == "DOWN") {
+ // calculate values
+ var elapsedTime = inicio_timer[a]-getTimer();
+ if(elapsedTime < 0) {
+ elapsedTime=0;
+ }
+ // hours
+ var elapsedHours = floor(elapsedTime/3600000);
+ var remaining = elapsedTime-(elapsedHours*3600000);
+ // minutes
+ var elapsedM = floor(remaining/60000);
+ remaining = remaining-(elapsedM*60000);
+ // seconds
+ var elapsedS = floor(remaining/1000);
+ // output to text box
+ // add a 0 on the front of the numbers if the number is less than 10
+ if (elapsedHours<10) {
+ var hours = "0"+elapsedHours.toString();
+ } else {
+ var hours = elapsedHours.toString();
+ }
+ if (elapsedM<10) {
+ var minutes = "0"+elapsedM.toString();
+ } else {
+ var minutes = elapsedM.toString();
+ }
+ if (elapsedS<10) {
+ var seconds = "0"+elapsedS.toString();
+ } else {
+ var seconds = elapsedS.toString();
+ }
+ var statusclid = eval("rectangulo"+a+".timer"+a);
+ statusclid.text = hours+":"+minutes+":"+seconds;
+ }
+ }
+ }
+};
+
+setInterval(Timers, 1000);
+
+function LocalSave(record,field,value) {
+ var so = Object(SharedObject.getLocal(record));
+ so.data[field] = value;
+ so.flush();
+};
+
+function LocalLoad(record,field) {
+ return Object(SharedObject.getLocal(record)).data[field];
+};
+
+
+MovieClip.prototype.changeledcolor = function(value,color1,color2,nroboton) {
+ this.start = 1;
+ this.color = 0;
+ var button_number = ExtraeNumeroClip(this);
+
+ _global.valorchangeledcolor[nroboton] = Number(value);
+ colorhex1 = color1;
+ colorhex2 = color2;
+ color1 = parseInt(color1, 16);
+ color2 = parseInt(color2, 16);
+ this.arraycolor = new Array();
+ this.arraycolor[0] = color1;
+ this.arraycolor[1] = color2;
+ var myColor = new Color(this);
+ if (value==3) {
+ this.onEnterFrame = function() {
+ this.start+=1;
+ myColor.setRGB(this.arraycolor[this.color]);
+ if(_global.enable_label_background == 1) {
+ _root["rectangulo"+button_number]["textobg"].background = 1;
+ _root["rectangulo"+button_number]["textobg"].backgroundColor = this.arraycolor[this.color];
+ }
+ if(this.start>10) {
+ this.color = this.color +1;
+ if(this.color > 1) {
+ this.color = 0;
+ }
+ this.start = 0;
+ }
+ };
+ } else if (value==0 || value==1) {
+ myColor.setRGB(this.arraycolor[value]);
+ if(_global.enable_label_background == 1) {
+ _root["rectangulo"+button_number]["textobg"].background = 1;
+ _root["rectangulo"+button_number]["textobg"].backgroundColor = this.arraycolor[value];
+ }
+ delete this.onEnterFrame ;
+ } else {
+ myColor.setRGB(_global.color[0]);
+ if(_global.enable_label_background == 1) {
+ _root["rectangulo"+button_number]["textobg"].background = 1;
+ _root["rectangulo"+button_number]["textobg"].backgroundColor = _global.color[0];
+ }
+ delete this.onEnterFrame ;
+ }
+};
+
+
+MovieClip.prototype.beginDrag = function(target, lock, l, t, r, b) {
+ if (typeof(target) == "string") {
+ target = eval(target);
+ } else if (!(target instanceof MovieClip)) {
+ b = r;
+ r = t;
+ t = l;
+ l = lock;
+ lock = target;
+ target = this;
+ }
+ if (target.dragMethod) {
+ target.endDrag();
+ }
+ target.dragMethod = {MM:target.onMouseMove};
+ ASSetPropFlags(target, "dragMethod", 1, 1);
+ target.addProperty("onMouseMove", arguments.callee.getMM, arguments.callee.setMM);
+ ASSetPropFlags(target, "onMouseMove", 3);
+ var constrain = (arguments.length>1);
+ var off_x = 0, off_y = 0;
+ if (!lock) {
+ off_x = target._parent._xmouse-target._x;
+ off_y = target._parent._ymouse-target._y;
+ }
+ target.dragMethod.drag = function() {
+ target._x = target._parent._xmouse-off_x;
+ target._y = target._parent._ymouse-off_y;
+ if (constrain) {
+ if (typeof(l) == "object") {
+ t = l.ymin;
+ r = l.xmax;
+ b = l.ymax;
+ l = l.xmin;
+ }
+ if (target._xr) {
+ target._x = r;
+ }
+ if (target._yb) {
+ target._y = b;
+ }
+ }
+ updateAfterEvent();
+ };
+};
+
+MovieClip.prototype.beginDrag.getMM = function() {
+ this.dragMethod.drag();
+ return this.dragMethod.MM;
+};
+
+MovieClip.prototype.beginDrag.setMM = function(f) {
+ this.dragMethod.MM = f;
+};
+
+MovieClip.prototype.endDrag = function(target) {
+ if (arguments.length) {
+ if (typeof(target) == "string") {
+ target = eval(target);
+ }
+ } else {
+ target = this;
+ }
+ ASSetPropFlags(target, "onMouseMove", 0, 3);
+ delete target.onMouseMove;
+ if (target.dragMethod.MM) {
+ target.onMouseMove = target.dragMethod.MM;
+ }
+ delete target.dragMethod;
+ target.startDrag();
+ // for _droptarget
+ target.stopDrag();
+};
+
+MovieClip.prototype.flip = function(value) {
+ this.TCG = 100;
+ if (value) {
+ this.onEnterFrame = function() {
+ this._yscale = this._xscale*Math.sin(this.TCG/180*Math.PI);
+ this.TCG += 10;
+ if (this._yscale == this._xscale*-1) {
+ this.stop();
+ delete this.onEnterFrame;
+ this._yscale = this._xscale;
+ }
+ };
+ } else {
+ delete this.onEnterFrame ;
+ this._yscale = this.originalScale;
+ }
+};
+
+MovieClip.prototype.shake = function(value) {
+ if (value) {
+ this.orgX = this._x;
+ this.orgY = this._y;
+ this.toggle = -1;
+ this.onEnterFrame = function() {
+ this.seconds = getTimer();
+ this.modulo = this.seconds%2000;
+ if (this.modulo<100) {
+ if (this.viejotoggle == this.toggle) {
+ this.toggle = this.toggle*-1;
+ } else {
+ this.viejotoggle = this.toggle;
+ }
+ }
+ if (this.toggle>0) {
+ this._x = this.orgX+Math.random()*(value*2)-value;
+ this._y = this.orgY+Math.random()*(value*2)-value;
+ this._rotation = this._rotation-Math.random()*3+Math.random()*3;
+ updateAfterEvent();
+ } else {
+ this._x = this.orgX;
+ this._y = this.orgY;
+ this._rotation = 0;
+ }
+ };
+ } else {
+ delete this.onEnterFrame;
+ this._x = this.orgX;
+ this._y = this.orgY;
+ this._rotation = 0;
+ }
+};
+
+function makeStatusMail(origen) {
+ if(_global.texto_mail[origen]!=undefined) {
+ _level0.statusbar.status.text = _global.texto_mail[origen];
+ }
+}
+function makeStatus(nroboton) {
+ if (_global.texto_tip[nroboton] == undefined) {
+ _global.texto_tip[nroboton] = _global.statusline;
+ }
+ _level0.statusbar.status.text = _global.texto_tip[nroboton];
+}
+
+function displaydetails(clip) {
+ var button_number = ExtraeNumeroClip(clip);
+ // _root["rectangulo"+pepe].flip(1);
+ // _root["resaltado"+pepe].flip(1);
+ if (clip._currentframe>=3) {
+ _root.detail._x = clip._parent._x;
+ // FIXME get actual screen width or canvas size and
+ // details windows widht to perform calculation of x asis.
+ if ((_root.detail._x+200)>960) {
+ _root.detail._x = 960-200;
+ }
+ _root.detail._y = clip._parent._y;
+ if ((_root.detail._y+100)>600) {
+ _root.detail._y = 600-100;
+ }
+
+ _root.detail._alpha = 90;
+ _root.detail._visible = true;
+ ind = clip._name.substring(6);
+ ind = ExtraeNumeroClip(clip);
+ if (st_originclid[ind] != undefined) {
+ _level0.detail.label = vr.detail_from;
+ _level0.detail.clid = st_originclid[ind];
+ } else if (st_destinationclid[ind] != undefined) {
+ _level0.detail.label = vr.detail_to;
+ _level0.detail.clid = st_destinationclid[ind];
+ } else {
+ _root.detail.label = "Status:";
+ _root.detail.clid = "none";
+ _root.detail._visible = false;
+ _root.superdetails.texto = _global.st_direction[ind];
+ _root.superdetails._visible = true;
+ _root.detail._visible = false;
+ }
+ if (st_duration[ind] != "") {
+ _root.detail.duration = st_duration[ind];
+ } else if (st_duration[ind] == "" && (st_originclid[ind] != "" || st_destinationclid[ind] != "")) {
+ _root.detail.duration = "not answered";
+ } else {
+ _root.detail.duration = "";
+ }
+
+ var id = eval("queuemember." + ind);
+ _global.superdetailstexttab2 = "";
+ for (var a in id) {
+ _global.superdetailstexttab2 += _global.queuemember[ind][a];
+ }
+ _global.superdetailstexttab1 = _global.st_direction[ind];
+ if (_global.superdetailstexttab1 == undefined)
+ {
+ _global.superdetailstexttab1 = vr.no_data_text;
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ }
+ } // end if currentframe>=3
+}
+
+function doubleClick(clip) {
+ // Funcion que detecta doble click y corta llamada
+
+ if (lastclick == 0) {
+
+ lastclick = getTimer();
+ lastclip = clip;
+
+ } else {
+
+ if(lastclip == clip) {
+
+ logea ("double click "+clip);
+ lastclick = 0;
+
+ if (_global.claveingresada == undefined) {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ return;
+ }
+
+ var numeroclip = ExtraeNumeroClip(clip);
+
+
+ if (defined(_global.restrict)) {
+ if (_global.restrict == numeroclip) {
+ logea("Authorized double click"+_global.restrict);
+ } else {
+ logea("Button Restriction in effect "+_global.restrict);
+ return;
+ }
+ }
+
+ /* op_actions new_way
+ if (_global.authorized == true) {
+ envia_comando("doubleclick",clip,"");
+ } else {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ return;
+ }
+ */
+
+ /* old_way */
+ if (clip._name.substring(0, 7) == "casilla") {
+ envia_comando("cortar",clip,"");
+ } else if (clip._name.substring(0,9)=="sobrecito") {
+ envia_comando("voicemail",clip,"0");
+ } else {
+ displaydetails(clip);
+ }
+ /* end */
+ }
+ }
+}
+
+function dragStop(clip, x, y) {
+ clip_arrastrado = undefined;
+ clip._parent.swapDepths("_level0.tele"+masalto);
+ // clip.stopDrag();
+ clip.endDrag();
+ clip._x = x;
+ clip._y = y;
+ var destino = "";
+ var origen = "";
+ var origencompleto = "";
+ //var origen = "" + eval(clip._name);
+ //origen = origen.substring(12);
+ origen = ExtraeNumeroClip(clip);
+
+
+ var columna = int((_xmouse+ancho_boton+separacion)/(ancho_boton+separacion));
+ var fila = int((_ymouse-30-separacion)/(alto_boton+separacion))+1;
+ if (columna<1) {
+ columna = 0;
+ }
+ if (columna>cuantas_columnas) {
+ columna = 0;
+ }
+ if (fila>cuantas_filas) {
+ fila = 0;
+ }
+ if (fila<1) {
+ fila = 0;
+ }
+ if(columna>0 && fila>0) {
+ destino = ((columna*cuantas_filas)-cuantas_filas)+fila;
+ }
+
+ logea("droptarget "+clip._droptarget+" clip "+clip);
+ logea("sobrehit "+_global.sobrehit);
+
+ /* USANDO DROPTARGET
+ for (s=1; s"9") {
+ } else {
+ destino = destino+""+c;
+ }
+ }
+ */
+
+
+ clip._x = x;
+ clip._y = y;
+ flechita_frame = _root["rectangulo"+origen]["flecha"+origen]._currentframe;
+
+ if(timer_type[origen]=="UP"||timer_type[origen]=="DOWN")
+ {
+ f_origen = 0;
+ } else {
+ f_origen = 1;
+ }
+
+ if(timer_type[destino]=="UP"||timer_type[destino]=="DOWN")
+ {
+ f_destino = 0;
+ } else {
+ f_destino = 1;
+ }
+// f_origen = timer_type[origen];
+// f_destino = timer_type[destino];
+ var extraclid = Trim(infotext1.clid_text.text);
+ if (extraclid == undefined) {
+ extraclid = "";
+ }
+ logea("f_origen "+f_origen+" f_destino "+f_destino);
+ logea("origen "+origen+" destino "+destino);
+ var done=0;
+ if (_global.sobrehit != undefined) {
+ var sobrecito = eval("rectangulo"+destino+".sobrecito"+destino);
+ if(sobrecito._visible == true) {
+ logea("como esta sobrecito: "+sobrecito._visible);
+ destino = ExtraeNumeroClip(_global.sobrehit);
+ logea("transfiero "+origen+" a destino voicemail "+destino);
+ logea("_global.sobrehit = "+_global.sobrehit);
+ envia_comando("tovoicemail", origen, destino);
+ done = 1;
+ }
+ }
+//NICOX
+ if (_global.flechahit != undefined) {
+ var sobrecito = eval("rectangulo"+destino+".flecha"+destino);
+ if(sobrecito._visible == true) {
+ logea("como esta sobrecito: "+flecha._visible);
+ destino = ExtraeNumeroClip(_global.flechahit);
+ logea("transfiero "+origen+" a destino voicemail "+destino);
+ logea("_global.flechahit = "+_global.flechahit);
+ envia_comando("tospy", origen, destino);
+ done = 1;
+ }
+ }
+
+ if (destino!="" && origen!=destino && done!=1) {
+ if (f_origen==1 && f_destino==0) {
+ // tranferencia 3 way a meetme
+ logea("Attempt to conference "+origen+" with "+destino);
+ envia_comando("conference", origen, destino);
+ } else if ((f_origen==0 || flechita_frame == 1 || f_origen==-1) && (f_destino==1 || f_destino == 0)) {
+ // transferencia normal
+ logea("Attempt to transfer "+origen+" to "+destino);
+ if (extraclid != "" && extraclid != "undefined") {
+ extraclid = only_allowed_chars(extraclid);
+ var comando = "ctransferir-"+extraclid+"-";
+ infotext1.clidvalue = "";
+ } else {
+ var comando = "transferir";
+ }
+ if(_global.timeout_value>0) {
+ comando= comando+"+"+_global.timeout_value+"+";
+ logea("transfiero con timeout "+_global.timeout_value);
+ }
+ logea("comando "+comando);
+ envia_comando(comando, origen, destino);
+ } else {
+ // originar llamado
+ logea("Attempt to origin call from "+origen+" to "+destino);
+ logea("f_origen "+f_origen+" f_destino "+f_destino);
+ logea("timeout "+_global.timeout_value);
+ logea("extraclid "+extraclid);
+ if (extraclid != "" && extraclid != "undefined") {
+ extraclid = only_allowed_chars(extraclid);
+ var comando = "coriginate-"+extraclid+"-";
+ infotext1.clid_text.text = "";
+ } else {
+ var comando = "originate";
+ }
+ if(_global.timeout_value > 0) {
+ comando= comando+"+"+_global.timeout_value+"+";
+ logea("origino con timeout "+_global.timeout_value);
+ }
+ envia_comando(comando, origen, destino);
+ }
+ } else {
+ logea("drag to itself or single click");
+ }
+}
+
+function only_allowed_chars(str) {
+ allowed = "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789)(,";
+ var temp = new String("");
+ for (a=0; a"9") {
+ } else {
+ destino = destino+""+c;
+ }
+ if (c == ".") {
+ destino = "";
+ }
+ }
+ return destino;
+}
+
+function dragClip(clip) {
+ clip_arrastrado = clip;
+ var numeroclip = ""+eval(clip._name);
+ numeroclip = numeroclip.substring(12);
+ startX = clip._x;
+ startY = clip._y;
+ clip._parent.swapDepths("_level0.tele"+masalto);
+ clip.beginDrag(true);
+ clip.onRelease = function() {
+ dragStop(clip, startX, startY);
+ };
+ clip.onReleaseOutside = function() {
+ dragStop(clip, startX, startY);
+ };
+}
+
+envia_comando = function (comando, origen, destino) {
+ if (comando != "bogus" && comando != "contexto" && comando != "restrict") {
+ if (_global.restrict!=0) {
+ if(comando == "cortar") {
+ origen_number = ExtraeNumeroClip(origen);
+ } else {
+ origen_number = origen;
+ }
+ logea("Origen "+origen_number);
+ logea("Destino "+destino);
+ logea("Restrict "+_global.restrict);
+ if(_global.restrict != undefined) {
+ if (_global.restrict == origen_number || _global.restrict == destino ) {
+ logea("Authorized envia_comando");
+ } else {
+ logea("Button restriction in effect envia_comando "+_global.restrict);
+ return;
+ }
+ } else {
+ // logea("global_restrict not defined?");
+ }
+ }
+ }
+ message = new XML();
+ message_data = message.createElement("msg");
+ if (_root.context.length>0) {
+ agrega_contexto = "@"+context;
+ }
+ if (agrega_contexto == undefined) {
+ agrega_contexto = "";
+ }
+ if (_level0.claveinput.secret == undefined) {
+ _level0.claveinput.secret = "";
+ }
+ if (_global.claveingresada == undefined && ( comando != "contexto" && comando != "bogus" && comando != "dial" && comando != "restrict")) {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ return;
+ }
+ // var clave=_level0.claveinput.secret+_global.key;
+ var clave = _global.claveingresada+_global.key;
+ var md5clave = "";
+ var md5clave = calcMD5(clave);
+ if (comando == "contexto" || comando == "restrict") {
+ md5clave = "";
+ }
+ message_data.attributes.data = origen+agrega_contexto+"|"+comando+destino+"|"+md5clave;
+ message.appendChild(message_data);
+ _global.sock.send(message);
+ var clave = "";
+};
+
+function LTrim(str) {
+ var whitespace = new String(" \t\n\r");
+ var s = new String(str);
+ if (whitespace.indexOf(s.charAt(0)) != -1) {
+ var j = 0, i = s.length;
+ while (j=0 && whitespace.indexOf(s.charAt(i)) != -1) {
+ i--;
+ }
+ s = s.substring(0, i+1);
+ }
+ return s;
+}
+
+function Trim(str) {
+ return RTrim(LTrim(str));
+}
+
+function setDND(obj, item) {
+ var nroboton = ExtraeNumeroClip(obj);
+ logea(item.caption+" for button "+nroboton);
+ envia_comando("dnd", nroboton, nroboton);
+}
+
+function genera_selecttimeout() {
+
+ _global.positionselect = 0;
+ test = attachMovie("option","optionselected", getNextHighestDepth(), {_x:800, _y:6});
+ test._visible = true;
+ test.legend = "No timeout";
+
+ test.onPress = function() {
+ _root.despliega_select();
+ };
+
+
+ for (a=0; a<5; a++) {
+ var b=a+1;
+ if (_global.opcionesTimeout[a] != undefined) {
+
+ testa = attachMovie("option","option"+a, getNextHighestDepth(), {_x:800, _y:(b*22)+6});
+ testa.legend = _global.opcionesTimeout[a];
+ testa._visible = false;
+
+
+ testa.onRollOver = function() {
+ this.legend = "* "+this.legend;
+ };
+
+ testa.onRollOut = function() {
+ this.legend = this.legend.substring(2, this.legend.length);
+ };
+
+ testa.onPress = function() {
+ this.legend = this.legend.substring(2, this.legend.length);
+ var posicion = ExtraeNumeroClip(this);
+ _global.timeout_value = _global.opcionesTimeoutSecs[posicion];
+ _root.logea("timeout "+_global.timeout_value);
+ _root.muestra_selecttimeout(0);
+ _root.selectbox1.gotoAndStop(1);
+ _root.optionselected._visible=true;
+ _root.optionselected.legend = this.legend;
+ };
+ }
+ }
+};
+
+function muestra_selecttimeout(value) {
+ for (a=0; a<5; a++) {
+ var v = eval("_root.option"+a);
+ if(value) {
+ v._visible = true;
+ } else {
+ v._visible = false;
+ }
+ }
+};
+
+function despliega_select() {
+ _root.optionselected._visible=false;
+ _root.selectbox1.gotoAndStop(2);
+ _root.muestra_selecttimeout(1);
+
+};
+
+function base64_decode(opString) {
+ if ( opString == undefined ) {
+ return;
+ }
+ var str = opString;
+ var base64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var bits, bit1, bit2, bit3, bit4, i = 0;
+ var decOut = "";
+ for (i=0; i> 16, (bits & 0xff00) >> 8, bits & 0xff);
+ }
+ if (str.charCodeAt(i-2) == 61) {
+ return decOut.substring(0, decOut.length-2);
+ } else if (str.charCodeAt(i-1) == 61) {
+ return decOut.substring(0, decOut.length-1);
+ } else {
+ return decOut.substring(0, decOut.length);
+ }
+};
+
+
+
+// MD5 ROUTINE
+/*
+ * Convert a 32-bit number to a hex string with ls-byte first
+ */
+var hex_chr = "0123456789abcdef";
+//
+// somehow the expression (bitAND(b, c) | bitAND((~b), d)) didn't return coorect results on Mac
+// for:
+// b&c = a8a20450, ((~b)&d) = 0101c88b, (bitAND(b, c) | bitAND((~b), d)) = a8a20450 <-- !!!
+// looks like the OR is not executed at all.
+//
+// let's try to trick the P-code compiler into working with us... Prayer beads are GO!
+//
+function bitOR(a, b) {
+ var lsb = (a & 0x1) | (b & 0x1);
+ var msb31 = (a >>> 1) | (b >>> 1);
+ return (msb31 << 1) | lsb;
+}
+//
+// will bitXOR be the only one working...?
+// Nope. XOR fails too if values with bit31 set are XORed.
+//
+// Note however that OR (and AND and XOR?!) works alright for the statement
+// (msb31 << 1) | lsb
+// even if the result of the left-shift operation has bit 31 set.
+// So there might be an extra condition here (Guessmode turned on):
+// Mac Flash fails (OR, AND and XOR) if either one of the input operands has bit31 set
+// *and* both operands have one or more bits both set to 1. In other words: when both
+// input bit-patterns 'overlap'.
+// Stuff to munch on for the MM guys, I guess...
+//
+function bitXOR(a, b) {
+ var lsb = (a & 0x1) ^ (b & 0x1);
+ var msb31 = (a >>> 1) ^ (b >>> 1);
+ return (msb31 << 1) | lsb;
+}
+//
+// bitwise AND for 32-bit integers. This uses 31 + 1-bit operations internally
+// to work around bug in some AS interpreters. (Mac Flash!)
+//
+function bitAND(a, b) {
+ var lsb = (a & 0x1) & (b & 0x1);
+ var msb31 = (a >>> 1) & (b >>> 1);
+ return (msb31 << 1) | lsb;
+ // return (a & b);
+}
+//
+// Add integers, wrapping at 2^32. This uses 16-bit operations internally
+// to work around bugs in some AS interpreters. (Mac Flash!)
+//
+function addme(x, y) {
+ var lsw = (x & 0xFFFF)+(y & 0xFFFF);
+ var msw = (x >> 16)+(y >> 16)+(lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+function rhex(num) {
+ str = "";
+ for (j=0; j<=3; j++) {
+ str += hex_chr.charAt((num >> (j*8+4)) & 0x0F)+hex_chr.charAt((num >> (j*8)) & 0x0F);
+ }
+ return str;
+}
+/*
+ * Convert a string to a sequence of 16-word blocks, stored as an array.
+ * Append padding bits and the length, as described in the MD5 standard.
+ */
+function str2blks_MD5(str) {
+ nblk = ((str.length+8) >> 6)+1;
+ // 1 + (len + 8)/64
+ blks = new Array(nblk*16);
+ for (i=0; i> 2] |= str.charCodeAt(i) << (((str.length*8+i)%4)*8);
+ }
+ blks[i >> 2] |= 0x80 << (((str.length*8+i)%4)*8);
+ var l = str.length*8;
+ blks[nblk*16-2] = (l & 0xFF);
+ blks[nblk*16-2] |= ((l >>> 8) & 0xFF) << 8;
+ blks[nblk*16-2] |= ((l >>> 16) & 0xFF) << 16;
+ blks[nblk*16-2] |= ((l >>> 24) & 0xFF) << 24;
+ return blks;
+}
+/*
+ * Bitwise rotate a 32-bit number to the left
+ */
+function rol(num, cnt) {
+ return (num << cnt) | (num >>> (32-cnt));
+}
+/*
+ * These functions implement the basic operation for each round of the
+ * algorithm.
+ */
+function cmn(q, a, b, x, s, t) {
+ return addme(rol((addme(addme(a, q), addme(x, t))), s), b);
+}
+
+function ff(a, b, c, d, x, s, t) {
+ return cmn(bitOR(bitAND(b, c), bitAND((~b), d)), a, b, x, s, t);
+}
+
+function gg(a, b, c, d, x, s, t) {
+ return cmn(bitOR(bitAND(b, d), bitAND(c, (~d))), a, b, x, s, t);
+}
+
+function hh(a, b, c, d, x, s, t) {
+ return cmn(bitXOR(bitXOR(b, c), d), a, b, x, s, t);
+}
+
+function ii(a, b, c, d, x, s, t) {
+ return cmn(bitXOR(c, bitOR(b, (~d))), a, b, x, s, t);
+}
+/*
+ * Take a string and return the hex representation of its MD5.
+ */
+function calcMD5(str) {
+ x = str2blks_MD5(str);
+ a = 1732584193;
+ b = -271733879;
+ c = -1732584194;
+ d = 271733878;
+ var step;
+ for (i=0; i=ls) {
+ break;
+ }
+ var pepe=s.charAt(is);
+ if (c2b[s.charAt(is)] == null) {
+ b[is] = 0xF7;
+ } else {
+ b[is] = c2b[s.charAt(is)];
+ }
+ is++;
+ }
+ return b;
+}
+function bytes2str(b) {
+ var ib = 0;
+ var lb = b.length;
+ var s = '';
+ while (1) {
+ if (ib>=lb) {
+ break;
+ }
+ if (b2c[0xFF & b[ib]]!=undefined) {
+ s += b2c[0xFF & b[ib]];
+ }
+ ib++;
+ }
+ return s;
+}
+function ascii2bytes(a) {
+ var ia = -1;
+ var la = a.length;
+ var ib = 0;
+ var b = new Array();
+ var carry;
+ while (1) {
+ // reads 4 chars and produces 3 bytes
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ b[ib] = a2b[a.charAt(ia)] << 2;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ carry = a2b[a.charAt(ia)];
+ b[ib] |= carry >>> 4;
+ ib++;
+ carry = 0xF & carry;
+ if (carry == 0 && ia == (la-1)) {
+ return b;
+ }
+ b[ib] = carry << 4;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ carry = a2b[a.charAt(ia)];
+ b[ib] |= carry >>> 2;
+ ib++;
+ carry = 3 & carry;
+ if (carry == 0 && ia == (la-1)) {
+ return b;
+ }
+ b[ib] = carry << 6;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ b[ib] |= a2b[a.charAt(ia)];
+ ib++;
+ }
+ return b;
+}
+function bytes2ascii(b) {
+ var ib = 0;
+ var lb = b.length;
+ var s = '';
+ var b1;
+ var b2;
+ var b3;
+ var carry;
+ while (1) {
+ // reads 3 bytes and produces 4 chars
+ if (ib>=lb) {
+ break;
+ }
+ b1 = 0xFF & b[ib];
+ s += b2a[63 & (b1 >>> 2)];
+ carry = 3 & b1;
+ ib++;
+ if (ib>=lb) {
+ s += b2a[carry << 4];
+ break;
+ }
+ b2 = 0xFF & b[ib];
+ s += b2a[(0xF0 & (carry << 4)) | (b2 >>> 4)];
+ carry = 0xF & b2;
+ ib++;
+ if (ib>=lb) {
+ s += b2a[carry << 2];
+ break;
+ }
+ b3 = 0xFF & b[ib];
+ s += b2a[(60 & (carry << 2)) | (b3 >>> 6)]+b2a[63 & b3];
+ ib++;
+ if (ib%36 == 0) {
+ s += "\n";
+ }
+ }
+ return s;
+}
+function bytes2blocks(bytes) {
+ var blocks = new Array();
+ var ibl = 0;
+ var iby = 0;
+ var nby = bytes.length;
+ while (1) {
+ blocks[ibl] = (0xFF & bytes[iby]) << 24;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= (0xFF & bytes[iby]) << 16;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= (0xFF & bytes[iby]) << 8;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= 0xFF & bytes[iby];
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ ibl++;
+ }
+ return blocks;
+}
+function blocks2bytes(blocks) {
+ var bytes = new Array();
+ var iby = 0;
+ var ibl = 0;
+ var nbl = blocks.length;
+ while (1) {
+ if (ibl>=nbl) {
+ break;
+ }
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 24);
+ iby++;
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 16);
+ iby++;
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 8);
+ iby++;
+ bytes[iby] = 0xFF & blocks[ibl];
+ iby++;
+ ibl++;
+ }
+ return bytes;
+}
+function digest_pad(bytearray) {
+ var newarray = new Array();
+ var ina = 0;
+ var iba = 0;
+ var nba = bytearray.length;
+ var npads = 15-(nba%16);
+ newarray[ina] = npads;
+ ina++;
+ while (iba0) {
+ newarray[ina] = 0;
+ ina++;
+ ip--;
+ }
+ return newarray;
+}
+function pad(bytearray) {
+ var newarray = new Array();
+ var ina = 0;
+ var iba = 0;
+ var nba = bytearray.length;
+ var npads = 7-(nba%8);
+ newarray[ina] = (0xF8 & rand_byte()) | (7 & npads);
+ ina++;
+ while (iba0) {
+ newarray[ina] = rand_byte();
+ ina++;
+ ip--;
+ }
+ return newarray;
+}
+function rand_byte() {
+ return Math.floor(256*Math.random());
+ if (!rand_byte_already_called) {
+ var now = new Date();
+ seed = now.milliseconds;
+ rand_byte_already_called = true;
+ }
+ seed = (1029*seed+221591)%1048576;
+ return Math.floor(seed/4096);
+}
+function unpad(bytearray) {
+ var iba = 0;
+ var newarray = new Array();
+ var ina = 0;
+ var npads = 0x7 & bytearray[iba];
+ iba++;
+ var nba = bytearray.length-npads;
+ while (iba=nbl) {
+ break;
+ }
+ v0[0] = blocks[ibl];
+ ibl++;
+ v0[1] = blocks[ibl];
+ ibl++;
+ v1[0] = blocks[ibl];
+ ibl++;
+ v1[1] = blocks[ibl];
+ ibl++;
+ c0 = tea_code(xor_blocks(v0, c0), key);
+ c1 = tea_code(xor_blocks(v1, c1), key);
+ swap = c0[0];
+ c0[0] = c0[1];
+ c0[1] = c1[0];
+ c1[0] = c1[1];
+ c1[1] = swap;
+ }
+ var concat = new Array();
+ concat[0] = c0[0];
+ concat[1] = c0[1];
+ concat[2] = c1[0];
+ concat[3] = c1[1];
+ return concat;
+}
+function encrypt(str, keystr) {
+ var key = new Array();
+ key = binarydigest(keystr);
+ var blocks = new Array();
+ blocks = bytes2blocks(pad(str2bytes(str)));
+ var ibl = 0;
+ var nbl = blocks.length;
+ // Initial Value for CBC mode = "abcdbcde". Retain for interoperability.
+ var c = new Array();
+ c[0] = 0x61626364;
+ c[1] = 0x62636465;
+ var v = new Array();
+ var cblocks = new Array();
+ var icb = 0;
+ while (1) {
+ if (ibl>=nbl) {
+ break;
+ }
+ v[0] = blocks[ibl];
+ ibl++;
+ v[1] = blocks[ibl];
+ ibl++;
+ c = tea_code(xor_blocks(v, c), key);
+ cblocks[icb] = c[0];
+ icb++;
+ cblocks[icb] = c[1];
+ icb++;
+ }
+ return binary2ascii(cblocks);
+}
+function decrypt(ascii, keystr) {
+ var key = new Array();
+ key = binarydigest(keystr);
+ var cblocks = new Array();
+ cblocks = ascii2binary(ascii);
+ var icbl = 0;
+ var ncbl = cblocks.length;
+ var lastc = new Array();
+ lastc[0] = 0x61626364;
+ lastc[1] = 0x62636465;
+ var v = new Array();
+ var c = new Array();
+ var blocks = new Array();
+ var ibl = 0;
+ while (1) {
+ if (icbl>=ncbl) {
+ break;
+ }
+ c[0] = cblocks[icbl];
+ icbl++;
+ c[1] = cblocks[icbl];
+ icbl++;
+ v = xor_blocks(lastc, tea_decode(c, key));
+ blocks[ibl] = v[0];
+ ibl++;
+ blocks[ibl] = v[1];
+ ibl++;
+ lastc[0] = c[0];
+ lastc[1] = c[1];
+ }
+ return bytes2str(unpad(blocks2bytes(blocks)));
+}
+function xor_blocks(blk1, blk2) {
+ var blk = new Array();
+ blk[0] = blk1[0] ^ blk2[0];
+ blk[1] = blk1[1] ^ blk2[1];
+ return blk;
+}
+function tea_code(v, k) {
+ var v0 = v[0];
+ var v1 = v[1];
+ var k0 = k[0];
+ var k1 = k[1];
+ var k2 = k[2];
+ var k3 = k[3];
+ var sum = 0;
+ var n = 32;
+ while (n-->0) {
+ sum -= 1640531527;
+ // TEA magic number 0x9e3779b9
+ sum = sum | 0;
+ v0 += ((v1 << 4)+k0) ^ (v1+sum) ^ ((v1 >>> 5)+k1);
+ v1 += ((v0 << 4)+k2) ^ (v0+sum) ^ ((v0 >>> 5)+k3);
+ }
+ var w = new Array();
+ w[0] = v0 | 0;
+ w[1] = v1 | 0;
+ return w;
+}
+function tea_decode(v, k) {
+ var v0 = v[0];
+ var v1 = v[1];
+ var k0 = k[0];
+ var k1 = k[1];
+ var k2 = k[2];
+ var k3 = k[3];
+ var sum = 0;
+ var n = 32;
+ sum = -957401312;
+ while (n-->0) {
+ v1 -= ((v0 << 4)+k2) ^ (v0+sum) ^ ((v0 >>> 5)+k3);
+ v0 -= ((v1 << 4)+k0) ^ (v1+sum) ^ ((v1 >>> 5)+k1);
+ sum += 1640531527;
+ sum = sum | 0;
+ }
+ var w = new Array();
+ w[0] = v0 | 0;
+ w[1] = v1 | 0;
+ return w;
+}
+
+Key.addListener(Key);
+
+Key.onKeyDown = function(){
+ var incremento = 1;
+ var tecla = Key.getCode();
+
+ if(tecla == 16) {
+ _global.shift = 1;
+ }
+
+ if(tecla == 40) // DOWN
+ {
+ // Select next button DOWN
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ dif1 = (_global.rectanguloprendido) % _root.cuantas_filas;
+ incremento = 1;
+ if(dif1 == 0) {
+ // It changed the column, increment it again
+ incremento = incremento - _root.cuantas_filas;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ if(tecla == 38) // UP
+ {
+ // Select next button UP
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ dif1 = (_global.rectanguloprendido-1) % _root.cuantas_filas;
+ incremento = -1;
+ if(dif1 == 0) {
+ // It changed the column, increment it again
+ incremento = incremento + _root.cuantas_filas;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ if(tecla == 37) // LEFT
+ {
+
+ if (_root.superdetails._visible == true) {
+ var tab = _root.superdetails.tab1._currentframe;
+ if(tab == 2) {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ }
+ } else {
+ // Select next button on the LEFT
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ incremento = _root.cuantas_filas;
+ diferencia = _global.rectanguloprendido % _root.cuantas_filas;
+ proximo = _global.rectanguloprendido - incremento;
+
+ if(proximo < 1) {
+ proximo = ((_root.cuantas_columnas - 1) * _root.cuantas_filas)+diferencia;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ }
+
+ if(tecla == 39) // RIGHT
+ {
+ if(_root.detail._visible == true) {
+ _root.superdetails._visible = true;
+ _root.detail._visible = false;
+ } else if (_root.superdetails._visible == true) {
+ var tab = _root.superdetails.tab1._currentframe;
+ if(tab == 2) {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ }
+ } else {
+ // Select next button on the RIGHT
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ total = _root.cuantas_filas * _root.cuantas_columnas;
+ incremento = _root.cuantas_filas;
+ diferencia = _global.rectanguloprendido % _root.cuantas_filas;
+ proximo = _global.rectanguloprendido + incremento;
+
+ if(proximo > total) {
+ proximo = 1+diferencia-1;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ }
+ if(tecla == 9) // TAB
+ {
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ total = _root.cuantas_filas * _root.cuantas_columnas;
+ if(_global.shift == 1) {
+ incremento = -1;
+ } else {
+ incremento = 1;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+
+ if(proximo > total) {
+ proximo = 1;
+ }
+ if(proximo < 1) {
+ proximo = total;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido == _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+
+ if(tecla == 27) // ESC
+ {
+ _root.codebox._visible = false;
+ _root.log._visible = false;
+ _root.detail._visible = false;
+ _root.superdetails._visible = false;
+ }
+
+ if(tecla == 18) // ALT
+ {
+ var myon = _global.rectanguloprendido;
+ if(myon>0) {
+ var myclip = eval('_level0.rectangulo'+myon+'.flecha'+myon);
+ _root.displaydetails(myclip);
+ }
+ }
+
+ if(tecla == 13) // ENTER
+ {
+ if(_root.codebox._visible == true) {
+ // The security code box is visible, sends code and hides it
+ _global.claveingresada = _root.codebox.claveform.text;
+ _root.codebox._visible = false;
+ _root.envia_comando('bogus', 0, 0);
+ } else {
+ // The security code is not visible, open detail windows of
+ // highlighted button
+ var myon = _global.rectanguloprendido;
+ if(myon>0) {
+ var myclip = eval('_level0.rectangulo'+myon+'.flecha'+myon);
+ _root.displaydetails(myclip);
+ }
+ }
+ }
+
+
+};
+
+Key.onKeyUp = function(){
+ var tecla = Key.getCode();
+ if(tecla == 16) {
+ _global.shift = 0;
+ }
+};
+
+
+
+
+// loadMovieNum("icono1.swf",1);
+
+Inicia_Variables();
+dibuja();
+Detiene_Peliculas();
+conecta();
+
+EndOfActionScript
+
+# Saves the movie
+$movie->nextFrame();
+$movie->save("operator_panel.swf",9);
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/README
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/README (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/README (revision 8165)
@@ -0,0 +1,8 @@
+I used MING from CVS as of 10/5/2004
+
+You can find instructions and a ming perl mini howto at:
+
+http://todbot.com/ming
+
+My thanks to Tod E. Kurt for his advice and help for
+porting the client to Ming.
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/comunicator.pl
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/comunicator.pl (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/ming-source/comunicator.pl (revision 8166)
@@ -0,0 +1,1620 @@
+#!/usr/bin/perl -w
+# Flash Operator Panel. http://www.asternic.org
+#
+# Copyright (c) 2004 Nicolas Gudino. All rights reserved.
+#
+# Nicolas Gudino
+#
+# This program is free software, distributed under the terms of
+# the GNU General Public License.
+#
+# THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``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 CONTRIBUTORS 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.
+
+use SWF qw(:ALL);
+use SWF::Constants qw(:Text :Button :DisplayItem :Fill);
+
+SWF::setScale(1);
+SWF::useSWFVersion(6);
+my $movie = new SWF::Movie();
+$movie->setDimension(100, 100);
+$movie->setBackground(0xFF, 0xFF, 0xFF);
+$movie->setRate(30);
+$movie->add(new SWF::Action(<<"EndOfActionScript"));
+
+var dummyVar=(getTimer()+random(100000));
+
+if(context != undefined) {
+ context = context.toUpperCase();
+ colaEvento(0,"debug","contexto leido "+context);
+ if(context == "DEFAULT") { context=""; }
+} else {
+ colaEvento(0,"debug","context undefined");
+ context="";
+}
+
+var archivo = "variables"+context+".txt?rand="+dummyVar;
+
+vr = new LoadVars ();
+
+vr.onLoad = function (success)
+{
+ if (success == true) {
+ colaEvento(0,"debug","Ok al leer "+archivo);
+ nextFrame();
+ } else {
+ colaEvento(0,"debug","Fallo al leer "+archivo);
+ stop();
+ }
+};
+
+vr.load(archivo);
+
+EndOfActionScript
+
+$movie->nextFrame();
+$movie->add(new SWF::Action(<<"EndOfActionScript"));
+
+function conecta() {
+ _global.sock = new XMLSocket;
+ _global.sock.onConnect = handleConnect;
+ _global.sock.onClose = handleDisconnect;
+ _global.sock.onXML = handleXML;
+ if(_global.port == undefined) {
+ _global.port = 4445;
+ }
+ if(_global.server == undefined) {
+ _global.sock.connect(null, _global.port);
+ _global.server_print = "default";
+ } else {
+ _global.sock.connect(_global.server, _global.port);
+ _global.server_print = _global.server;
+ }
+}
+
+function handleConnect(connectionStatus){
+
+ if (connectionStatus) {
+ colaEvento(0,"debug","Conectado! con contexto: "+context);
+ _global.reconecta = 0;
+ if(_global.enable_crypto==1) {
+ envia_comando("contexto", 0, 0);
+ } else {
+ envia_comando("contexto", 1, 0);
+ }
+ if(restrict != undefined) {
+ envia_comando("restrict",restrict,0);
+ }
+ } else {
+ colaEvento(0,"debug","No pude conectar!");
+ _global.reconecta = 1;
+ }
+}
+
+function handleXML(doc){
+ var e = doc.firstChild;
+ if (e != null) {
+ if (e.nodeName == "response") {
+ var numeroboton = e.attributes.btn; // btn is the button number
+ var comando = e.attributes.cmd;
+ var textofinal = e.attributes.data;
+
+ if (_global.key != undefined) {
+ if(_global.enable_crypto == 1) {
+ comando = decrypt(comando, _global.key);
+ if (textofinal.length > 0) {
+ textofinal = decrypt(textofinal, _global.key);
+ }
+ }
+ }
+
+
+ var botonparte = numeroboton.split("@");
+ var boton_numero = botonparte[0];
+ var boton_contexto = botonparte[1];
+ var timernumber = 0;
+
+
+ if (boton_contexto == undefined) {
+ boton_contexto = "";
+ }
+ if (_root.context == undefined) {
+ _root.context = "";
+ }
+
+
+ if (comando == "key") {
+ _global.key = textofinal;
+ return;
+ }
+
+ if (comando == "restrict") {
+ _global.restrict = numeroboton;
+ _global.mybutton = numeroboton;
+ }
+
+ if (comando == "version") {
+ if(textofinal != _global.swfversion)
+ {
+ _global.statusline=vr.version_mismatch;
+ } else {
+ _global.statusline="";
+ }
+ }
+
+ if (_root.context == boton_contexto) {
+ if(_global.restrict != undefined) {
+ if(_global.restrict == boton_numero) {
+ colaEvento(boton_numero,comando,textofinal);
+ }
+ } else {
+ colaEvento(boton_numero,comando,textofinal);
+ }
+ }
+ // endif root.context
+ }
+ // endif == response
+ }
+ // endiff e != null
+}
+
+function colaEvento(boton_numero,comando,textofinal) {
+
+ if(_global.VersionFlash == "MAC") {
+ // GetURL method for MAC
+ jsQueue.push("javascript: docommand('"+boton_numero+"','"+comando+"','"+textofinal+"')");
+ } else {
+ // FSCommand method for anything else
+ jsQueue.push("newevent;"+boton_numero+"|"+comando+"|"+textofinal);
+ }
+}
+
+
+function handleDisconnect(){
+ delete _global.key;
+ _global.reconecta = 1;
+ colaEvento(0,"debug","Attempt reconnection");
+}
+
+
+Inicia_Variables = function () {
+ _global.jsQueue = new Array();
+ var flashVersion = System.capabilities.version;
+ var datos = flashVersion.split(" ");
+ _global.VersionFlash = datos[0];
+ _global.server = vr.server;
+ _global.port = vr.port;
+ _global.enable_crypto = Number(vr.enable_crypto);
+ if (isNaN(_global.enable_crypto)) {
+ _global.enable_crypto=0;
+ } else {
+ if(_global.enable_crypto != 0) {
+ _global.enable_crypto = 1;
+ }
+ }
+};
+
+
+recarga = function () {
+ if(_global.restart == 1) {
+ // Send command to restart Asterisk
+ envia_comando("restart","1","1");
+ } else {
+ // Reloads FLASH client
+ delete _global.key;
+ var incontext = context;
+ var inbutton = mybutton;
+ var inrestrict = _global.restrict;
+ var indial = dial;
+ var innohighlight = nohighlight;
+ for (var a in _root) {
+ if (typeof (_root[a]) == "object") {
+ removeMovieClip(_root[a]);
+ }
+ if (typeof (_root[a]) == "movieclip") {
+ removeMovieClip(_root[a]);
+ }
+ }
+ _global.context = incontext;
+ _global.mybutton = inbutton;
+ _global.restrict = inrestrict;
+ _global.dial = indial;
+ _global.nohighlight = inhighlight;
+ stop();
+ gotoAndPlay(1);
+ }
+};
+
+
+_root.onEnterFrame = function() {
+
+ if(_global.jsQueue.length>0) {
+ if(_global.VersionFlash == "MAC") {
+ getURL(jsQueue.shift());
+ } else {
+ var partes = jsQueue.shift().split(";");
+ var comando=partes[0];
+ var params=partes[1];
+ getURL("FSCommand:"+comando,params);
+ }
+ }
+
+};
+
+Timers = function () {
+
+ if (_global.reconecta == 1) {
+ delete setInterval;
+ delete _global.key;
+ recarga();
+ return;
+ }
+};
+
+setInterval(Timers, 10000);
+
+function ExtraeNumeroClip(name) {
+ var destino = "";
+ name = name._name;
+ for (var s = 0; s"9") {
+ } else {
+ destino = destino+""+c;
+ }
+ if (c == ".") {
+ destino = "";
+ }
+ }
+ return destino;
+}
+
+envia_comando = function (comando, origen, destino) {
+ if (comando != "bogus" && comando != "contexto" && comando != "restrict") {
+ if (_global.restrict!=0) {
+ if(comando == "cortar") {
+ origen_number = ExtraeNumeroClip(origen);
+ } else {
+ origen_number = origen;
+ }
+ if(_global.restrict != undefined) {
+ if (_global.restrict == origen_number ) {
+ } else {
+ return;
+ }
+ }
+ }
+ }
+ message = new XML();
+ message_data = message.createElement("msg");
+ if (_root.context.length>0) {
+ agrega_contexto = "@"+context;
+ }
+ if (agrega_contexto == undefined) {
+ agrega_contexto = "";
+ }
+ if (_level0.claveinput.secret == undefined) {
+ _level0.claveinput.secret = "";
+ }
+ if (_global.claveingresada == undefined && ( comando != "contexto" && comando != "bogus" && comando != "dial" && comando != "restrict")) {
+ _root.codebox._visible = true;
+ Selection.setFocus(_root.codebox.claveform);
+ _root.codebox.swapDepths(_root.log);
+ return;
+ }
+ // var clave=_level0.claveinput.secret+_global.key;
+ var clave = _global.claveingresada+_global.key;
+ var md5clave = "";
+ var md5clave = calcMD5(clave);
+ if (comando == "contexto" || comando == "restrict") {
+ md5clave = "";
+ }
+ message_data.attributes.data = origen+agrega_contexto+"|"+comando+destino+"|"+md5clave;
+ message.appendChild(message_data);
+ _global.sock.send(message);
+ var clave = "";
+};
+
+function LTrim(str) {
+ var whitespace = new String(" \t\n\r");
+ var s = new String(str);
+ if (whitespace.indexOf(s.charAt(0)) != -1) {
+ var j = 0, i = s.length;
+ while (j=0 && whitespace.indexOf(s.charAt(i)) != -1) {
+ i--;
+ }
+ s = s.substring(0, i+1);
+ }
+ return s;
+}
+
+function Trim(str) {
+ return RTrim(LTrim(str));
+}
+
+function setDND(obj, item) {
+ var nroboton = ExtraeNumeroClip(obj);
+ envia_comando("dnd", nroboton, nroboton);
+}
+
+function genera_selecttimeout() {
+
+ _global.positionselect = 0;
+ test = attachMovie("option","optionselected", getNextHighestDepth(), {_x:800, _y:6});
+ test._visible = true;
+ test.legend = "No timeout";
+
+ test.onPress = function() {
+ _root.despliega_select();
+ };
+
+
+ for (a=0; a<5; a++) {
+ var b=a+1;
+ if (_global.opcionesTimeout[a] != undefined) {
+
+ testa = attachMovie("option","option"+a, getNextHighestDepth(), {_x:800, _y:(b*22)+6});
+ testa.legend = _global.opcionesTimeout[a];
+ testa._visible = false;
+
+
+ testa.onRollOver = function() {
+ this.legend = "* "+this.legend;
+ };
+
+ testa.onRollOut = function() {
+ this.legend = this.legend.substring(2, this.legend.length);
+ };
+
+ testa.onPress = function() {
+ this.legend = this.legend.substring(2, this.legend.length);
+ var posicion = ExtraeNumeroClip(this);
+ _global.timeout_value = _global.opcionesTimeoutSecs[posicion];
+ _root.muestra_selecttimeout(0);
+ _root.selectbox1.gotoAndStop(1);
+ _root.optionselected._visible=true;
+ _root.optionselected.legend = this.legend;
+ };
+ }
+ }
+};
+
+function muestra_selecttimeout(value) {
+ for (a=0; a<5; a++) {
+ var v = eval("_root.option"+a);
+ if(value) {
+ v._visible = true;
+ } else {
+ v._visible = false;
+ }
+ }
+};
+
+function despliega_select() {
+ _root.optionselected._visible=false;
+ _root.selectbox1.gotoAndStop(2);
+ _root.muestra_selecttimeout(1);
+
+};
+
+function base64_decode(opString) {
+ if ( opString == undefined ) {
+ return;
+ }
+ var str = opString;
+ var base64s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ var bits, bit1, bit2, bit3, bit4, i = 0;
+ var decOut = "";
+ for (i=0; i> 16, (bits & 0xff00) >> 8, bits & 0xff);
+ }
+ if (str.charCodeAt(i-2) == 61) {
+ return decOut.substring(0, decOut.length-2);
+ } else if (str.charCodeAt(i-1) == 61) {
+ return decOut.substring(0, decOut.length-1);
+ } else {
+ return decOut.substring(0, decOut.length);
+ }
+};
+
+
+
+// MD5 ROUTINE
+/*
+ * Convert a 32-bit number to a hex string with ls-byte first
+ */
+var hex_chr = "0123456789abcdef";
+//
+// somehow the expression (bitAND(b, c) | bitAND((~b), d)) didn't return coorect results on Mac
+// for:
+// b&c = a8a20450, ((~b)&d) = 0101c88b, (bitAND(b, c) | bitAND((~b), d)) = a8a20450 <-- !!!
+// looks like the OR is not executed at all.
+//
+// let's try to trick the P-code compiler into working with us... Prayer beads are GO!
+//
+function bitOR(a, b) {
+ var lsb = (a & 0x1) | (b & 0x1);
+ var msb31 = (a >>> 1) | (b >>> 1);
+ return (msb31 << 1) | lsb;
+}
+//
+// will bitXOR be the only one working...?
+// Nope. XOR fails too if values with bit31 set are XORed.
+//
+// Note however that OR (and AND and XOR?!) works alright for the statement
+// (msb31 << 1) | lsb
+// even if the result of the left-shift operation has bit 31 set.
+// So there might be an extra condition here (Guessmode turned on):
+// Mac Flash fails (OR, AND and XOR) if either one of the input operands has bit31 set
+// *and* both operands have one or more bits both set to 1. In other words: when both
+// input bit-patterns 'overlap'.
+// Stuff to munch on for the MM guys, I guess...
+//
+function bitXOR(a, b) {
+ var lsb = (a & 0x1) ^ (b & 0x1);
+ var msb31 = (a >>> 1) ^ (b >>> 1);
+ return (msb31 << 1) | lsb;
+}
+//
+// bitwise AND for 32-bit integers. This uses 31 + 1-bit operations internally
+// to work around bug in some AS interpreters. (Mac Flash!)
+//
+function bitAND(a, b) {
+ var lsb = (a & 0x1) & (b & 0x1);
+ var msb31 = (a >>> 1) & (b >>> 1);
+ return (msb31 << 1) | lsb;
+ // return (a & b);
+}
+//
+// Add integers, wrapping at 2^32. This uses 16-bit operations internally
+// to work around bugs in some AS interpreters. (Mac Flash!)
+//
+function addme(x, y) {
+ var lsw = (x & 0xFFFF)+(y & 0xFFFF);
+ var msw = (x >> 16)+(y >> 16)+(lsw >> 16);
+ return (msw << 16) | (lsw & 0xFFFF);
+}
+function rhex(num) {
+ str = "";
+ for (j=0; j<=3; j++) {
+ str += hex_chr.charAt((num >> (j*8+4)) & 0x0F)+hex_chr.charAt((num >> (j*8)) & 0x0F);
+ }
+ return str;
+}
+/*
+ * Convert a string to a sequence of 16-word blocks, stored as an array.
+ * Append padding bits and the length, as described in the MD5 standard.
+ */
+function str2blks_MD5(str) {
+ nblk = ((str.length+8) >> 6)+1;
+ // 1 + (len + 8)/64
+ blks = new Array(nblk*16);
+ for (i=0; i> 2] |= str.charCodeAt(i) << (((str.length*8+i)%4)*8);
+ }
+ blks[i >> 2] |= 0x80 << (((str.length*8+i)%4)*8);
+ var l = str.length*8;
+ blks[nblk*16-2] = (l & 0xFF);
+ blks[nblk*16-2] |= ((l >>> 8) & 0xFF) << 8;
+ blks[nblk*16-2] |= ((l >>> 16) & 0xFF) << 16;
+ blks[nblk*16-2] |= ((l >>> 24) & 0xFF) << 24;
+ return blks;
+}
+/*
+ * Bitwise rotate a 32-bit number to the left
+ */
+function rol(num, cnt) {
+ return (num << cnt) | (num >>> (32-cnt));
+}
+/*
+ * These functions implement the basic operation for each round of the
+ * algorithm.
+ */
+function cmn(q, a, b, x, s, t) {
+ return addme(rol((addme(addme(a, q), addme(x, t))), s), b);
+}
+
+function ff(a, b, c, d, x, s, t) {
+ return cmn(bitOR(bitAND(b, c), bitAND((~b), d)), a, b, x, s, t);
+}
+
+function gg(a, b, c, d, x, s, t) {
+ return cmn(bitOR(bitAND(b, d), bitAND(c, (~d))), a, b, x, s, t);
+}
+
+function hh(a, b, c, d, x, s, t) {
+ return cmn(bitXOR(bitXOR(b, c), d), a, b, x, s, t);
+}
+
+function ii(a, b, c, d, x, s, t) {
+ return cmn(bitXOR(c, bitOR(b, (~d))), a, b, x, s, t);
+}
+/*
+ * Take a string and return the hex representation of its MD5.
+ */
+function calcMD5(str) {
+ x = str2blks_MD5(str);
+ a = 1732584193;
+ b = -271733879;
+ c = -1732584194;
+ d = 271733878;
+ var step;
+ for (i=0; i=ls) {
+ break;
+ }
+ var pepe=s.charAt(is);
+ if (c2b[s.charAt(is)] == null) {
+ b[is] = 0xF7;
+ } else {
+ b[is] = c2b[s.charAt(is)];
+ }
+ is++;
+ }
+ return b;
+}
+function bytes2str(b) {
+ var ib = 0;
+ var lb = b.length;
+ var s = '';
+ while (1) {
+ if (ib>=lb) {
+ break;
+ }
+ if (b2c[0xFF & b[ib]]!=undefined) {
+ s += b2c[0xFF & b[ib]];
+ }
+ ib++;
+ }
+ return s;
+}
+function ascii2bytes(a) {
+ var ia = -1;
+ var la = a.length;
+ var ib = 0;
+ var b = new Array();
+ var carry;
+ while (1) {
+ // reads 4 chars and produces 3 bytes
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ b[ib] = a2b[a.charAt(ia)] << 2;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ carry = a2b[a.charAt(ia)];
+ b[ib] |= carry >>> 4;
+ ib++;
+ carry = 0xF & carry;
+ if (carry == 0 && ia == (la-1)) {
+ return b;
+ }
+ b[ib] = carry << 4;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ carry = a2b[a.charAt(ia)];
+ b[ib] |= carry >>> 2;
+ ib++;
+ carry = 3 & carry;
+ if (carry == 0 && ia == (la-1)) {
+ return b;
+ }
+ b[ib] = carry << 6;
+ while (1) {
+ ia++;
+ if (ia>=la) {
+ return b;
+ }
+ if (a2b[a.charAt(ia)] != null) {
+ break;
+ }
+ }
+ b[ib] |= a2b[a.charAt(ia)];
+ ib++;
+ }
+ return b;
+}
+function bytes2ascii(b) {
+ var ib = 0;
+ var lb = b.length;
+ var s = '';
+ var b1;
+ var b2;
+ var b3;
+ var carry;
+ while (1) {
+ // reads 3 bytes and produces 4 chars
+ if (ib>=lb) {
+ break;
+ }
+ b1 = 0xFF & b[ib];
+ s += b2a[63 & (b1 >>> 2)];
+ carry = 3 & b1;
+ ib++;
+ if (ib>=lb) {
+ s += b2a[carry << 4];
+ break;
+ }
+ b2 = 0xFF & b[ib];
+ s += b2a[(0xF0 & (carry << 4)) | (b2 >>> 4)];
+ carry = 0xF & b2;
+ ib++;
+ if (ib>=lb) {
+ s += b2a[carry << 2];
+ break;
+ }
+ b3 = 0xFF & b[ib];
+ s += b2a[(60 & (carry << 2)) | (b3 >>> 6)]+b2a[63 & b3];
+ ib++;
+ if (ib%36 == 0) {
+ s += "\n";
+ }
+ }
+ return s;
+}
+function bytes2blocks(bytes) {
+ var blocks = new Array();
+ var ibl = 0;
+ var iby = 0;
+ var nby = bytes.length;
+ while (1) {
+ blocks[ibl] = (0xFF & bytes[iby]) << 24;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= (0xFF & bytes[iby]) << 16;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= (0xFF & bytes[iby]) << 8;
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ blocks[ibl] |= 0xFF & bytes[iby];
+ iby++;
+ if (iby>=nby) {
+ break;
+ }
+ ibl++;
+ }
+ return blocks;
+}
+function blocks2bytes(blocks) {
+ var bytes = new Array();
+ var iby = 0;
+ var ibl = 0;
+ var nbl = blocks.length;
+ while (1) {
+ if (ibl>=nbl) {
+ break;
+ }
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 24);
+ iby++;
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 16);
+ iby++;
+ bytes[iby] = 0xFF & (blocks[ibl] >>> 8);
+ iby++;
+ bytes[iby] = 0xFF & blocks[ibl];
+ iby++;
+ ibl++;
+ }
+ return bytes;
+}
+function digest_pad(bytearray) {
+ var newarray = new Array();
+ var ina = 0;
+ var iba = 0;
+ var nba = bytearray.length;
+ var npads = 15-(nba%16);
+ newarray[ina] = npads;
+ ina++;
+ while (iba0) {
+ newarray[ina] = 0;
+ ina++;
+ ip--;
+ }
+ return newarray;
+}
+function pad(bytearray) {
+ var newarray = new Array();
+ var ina = 0;
+ var iba = 0;
+ var nba = bytearray.length;
+ var npads = 7-(nba%8);
+ newarray[ina] = (0xF8 & rand_byte()) | (7 & npads);
+ ina++;
+ while (iba0) {
+ newarray[ina] = rand_byte();
+ ina++;
+ ip--;
+ }
+ return newarray;
+}
+function rand_byte() {
+ return Math.floor(256*Math.random());
+ if (!rand_byte_already_called) {
+ var now = new Date();
+ seed = now.milliseconds;
+ rand_byte_already_called = true;
+ }
+ seed = (1029*seed+221591)%1048576;
+ return Math.floor(seed/4096);
+}
+function unpad(bytearray) {
+ var iba = 0;
+ var newarray = new Array();
+ var ina = 0;
+ var npads = 0x7 & bytearray[iba];
+ iba++;
+ var nba = bytearray.length-npads;
+ while (iba=nbl) {
+ break;
+ }
+ v0[0] = blocks[ibl];
+ ibl++;
+ v0[1] = blocks[ibl];
+ ibl++;
+ v1[0] = blocks[ibl];
+ ibl++;
+ v1[1] = blocks[ibl];
+ ibl++;
+ c0 = tea_code(xor_blocks(v0, c0), key);
+ c1 = tea_code(xor_blocks(v1, c1), key);
+ swap = c0[0];
+ c0[0] = c0[1];
+ c0[1] = c1[0];
+ c1[0] = c1[1];
+ c1[1] = swap;
+ }
+ var concat = new Array();
+ concat[0] = c0[0];
+ concat[1] = c0[1];
+ concat[2] = c1[0];
+ concat[3] = c1[1];
+ return concat;
+}
+function encrypt(str, keystr) {
+ var key = new Array();
+ key = binarydigest(keystr);
+ var blocks = new Array();
+ blocks = bytes2blocks(pad(str2bytes(str)));
+ var ibl = 0;
+ var nbl = blocks.length;
+ // Initial Value for CBC mode = "abcdbcde". Retain for interoperability.
+ var c = new Array();
+ c[0] = 0x61626364;
+ c[1] = 0x62636465;
+ var v = new Array();
+ var cblocks = new Array();
+ var icb = 0;
+ while (1) {
+ if (ibl>=nbl) {
+ break;
+ }
+ v[0] = blocks[ibl];
+ ibl++;
+ v[1] = blocks[ibl];
+ ibl++;
+ c = tea_code(xor_blocks(v, c), key);
+ cblocks[icb] = c[0];
+ icb++;
+ cblocks[icb] = c[1];
+ icb++;
+ }
+ return binary2ascii(cblocks);
+}
+function decrypt(ascii, keystr) {
+ var key = new Array();
+ key = binarydigest(keystr);
+ var cblocks = new Array();
+ cblocks = ascii2binary(ascii);
+ var icbl = 0;
+ var ncbl = cblocks.length;
+ var lastc = new Array();
+ lastc[0] = 0x61626364;
+ lastc[1] = 0x62636465;
+ var v = new Array();
+ var c = new Array();
+ var blocks = new Array();
+ var ibl = 0;
+ while (1) {
+ if (icbl>=ncbl) {
+ break;
+ }
+ c[0] = cblocks[icbl];
+ icbl++;
+ c[1] = cblocks[icbl];
+ icbl++;
+ v = xor_blocks(lastc, tea_decode(c, key));
+ blocks[ibl] = v[0];
+ ibl++;
+ blocks[ibl] = v[1];
+ ibl++;
+ lastc[0] = c[0];
+ lastc[1] = c[1];
+ }
+ return bytes2str(unpad(blocks2bytes(blocks)));
+}
+function xor_blocks(blk1, blk2) {
+ var blk = new Array();
+ blk[0] = blk1[0] ^ blk2[0];
+ blk[1] = blk1[1] ^ blk2[1];
+ return blk;
+}
+function tea_code(v, k) {
+ var v0 = v[0];
+ var v1 = v[1];
+ var k0 = k[0];
+ var k1 = k[1];
+ var k2 = k[2];
+ var k3 = k[3];
+ var sum = 0;
+ var n = 32;
+ while (n-->0) {
+ sum -= 1640531527;
+ // TEA magic number 0x9e3779b9
+ sum = sum | 0;
+ v0 += ((v1 << 4)+k0) ^ (v1+sum) ^ ((v1 >>> 5)+k1);
+ v1 += ((v0 << 4)+k2) ^ (v0+sum) ^ ((v0 >>> 5)+k3);
+ }
+ var w = new Array();
+ w[0] = v0 | 0;
+ w[1] = v1 | 0;
+ return w;
+}
+function tea_decode(v, k) {
+ var v0 = v[0];
+ var v1 = v[1];
+ var k0 = k[0];
+ var k1 = k[1];
+ var k2 = k[2];
+ var k3 = k[3];
+ var sum = 0;
+ var n = 32;
+ sum = -957401312;
+ while (n-->0) {
+ v1 -= ((v0 << 4)+k2) ^ (v0+sum) ^ ((v0 >>> 5)+k3);
+ v0 -= ((v1 << 4)+k0) ^ (v1+sum) ^ ((v1 >>> 5)+k1);
+ sum += 1640531527;
+ sum = sum | 0;
+ }
+ var w = new Array();
+ w[0] = v0 | 0;
+ w[1] = v1 | 0;
+ return w;
+}
+
+Key.addListener(Key);
+
+Key.onKeyDown = function(){
+ var incremento = 1;
+ var tecla = Key.getCode();
+
+ if(tecla == 16) {
+ _global.shift = 1;
+ }
+
+ if(tecla == 40) // DOWN
+ {
+ // Select next button DOWN
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ dif1 = (_global.rectanguloprendido) % _root.cuantas_filas;
+ incremento = 1;
+ if(dif1 == 0) {
+ // It changed the column, increment it again
+ incremento = incremento - _root.cuantas_filas;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ if(tecla == 38) // UP
+ {
+ // Select next button UP
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ dif1 = (_global.rectanguloprendido-1) % _root.cuantas_filas;
+ incremento = -1;
+ if(dif1 == 0) {
+ // It changed the column, increment it again
+ incremento = incremento + _root.cuantas_filas;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ if(tecla == 37) // LEFT
+ {
+
+ if (_root.superdetails._visible == true) {
+ var tab = _root.superdetails.tab1._currentframe;
+ if(tab == 2) {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ }
+ } else {
+ // Select next button on the LEFT
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ incremento = _root.cuantas_filas;
+ diferencia = _global.rectanguloprendido % _root.cuantas_filas;
+ proximo = _global.rectanguloprendido - incremento;
+
+ if(proximo < 1) {
+ proximo = ((_root.cuantas_columnas - 1) * _root.cuantas_filas)+diferencia;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ }
+
+ if(tecla == 39) // RIGHT
+ {
+ if(_root.detail._visible == true) {
+ _root.superdetails._visible = true;
+ _root.detail._visible = false;
+ } else if (_root.superdetails._visible == true) {
+ var tab = _root.superdetails.tab1._currentframe;
+ if(tab == 2) {
+ _root.superdetails.tab1.gotoAndStop(1);
+ _root.superdetails.tab2.gotoAndStop(2);
+ _root.superdetails.texto = _global.superdetailstexttab1;
+ } else {
+ _root.superdetails.tab1.gotoAndStop(2);
+ _root.superdetails.tab2.gotoAndStop(1);
+ _root.superdetails.texto = _global.superdetailstexttab2;
+ }
+ } else {
+ // Select next button on the RIGHT
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ total = _root.cuantas_filas * _root.cuantas_columnas;
+ incremento = _root.cuantas_filas;
+ diferencia = _global.rectanguloprendido % _root.cuantas_filas;
+ proximo = _global.rectanguloprendido + incremento;
+
+ if(proximo > total) {
+ proximo = 1+diferencia-1;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido != _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+ }
+ if(tecla == 9) // TAB
+ {
+ myapaga = eval('_root.resaltado'+_global.rectanguloprendido);
+ total = _root.cuantas_filas * _root.cuantas_columnas;
+ if(_global.shift == 1) {
+ incremento = -1;
+ } else {
+ incremento = 1;
+ }
+ proximo = _global.rectanguloprendido + incremento;
+
+ if(proximo > total) {
+ proximo = 1;
+ }
+ if(proximo < 1) {
+ proximo = total;
+ }
+ var myresa = eval('_root.resaltado'+proximo);
+ if(_global.rectanguloprendido == _global.restrict) {
+ myapaga._visible = false;
+ }
+ myresa._visible = true;
+ _global.rectanguloprendido = proximo;
+ _root.makeStatus(proximo);
+ }
+
+ if(tecla == 27) // ESC
+ {
+ _root.codebox._visible = false;
+ _root.log._visible = false;
+ _root.detail._visible = false;
+ _root.superdetails._visible = false;
+ }
+
+ if(tecla == 18) // ALT
+ {
+ var myon = _global.rectanguloprendido;
+ if(myon>0) {
+ var myclip = eval('_level0.rectangulo'+myon+'.flecha'+myon);
+ _root.displaydetails(myclip);
+ }
+ }
+
+ if(tecla == 13) // ENTER
+ {
+ if(_root.codebox._visible == true) {
+ // The security code box is visible, sends code and hides it
+ _global.claveingresada = _root.codebox.claveform.text;
+ _root.codebox._visible = false;
+ _root.envia_comando('bogus', 0, 0);
+ } else {
+ // The security code is not visible, open detail windows of
+ // highlighted button
+ var myon = _global.rectanguloprendido;
+ if(myon>0) {
+ var myclip = eval('_level0.rectangulo'+myon+'.flecha'+myon);
+ _root.displaydetails(myclip);
+ }
+ }
+ }
+
+
+};
+
+Key.onKeyUp = function(){
+ var tecla = Key.getCode();
+ if(tecla == 16) {
+ _global.shift = 0;
+ }
+};
+
+Inicia_Variables();
+conecta();
+
+EndOfActionScript
+
+# Saves the movie
+$movie->nextFrame();
+$movie->save("comunicator.swf",9);
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_astdb.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_astdb.cfg (revision 8360)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_astdb.cfg (revision 8360)
@@ -0,0 +1,38 @@
+; FOP will ask for the value of the asterisk database families
+; specified between brackets. If the value is non empty, it will
+; send the commands to the flash client. Note that the family
+; is case sensitive!
+
+[DND]
+settext=Do Not Disturb
+setalpha=35|100
+flip=1
+state=busy ; free, busy, ringing
+;fopledcolor=0x001020
+
+[CF]
+settext=CFWD to ${value}
+setalpha=35|100
+flip=1
+state=busy ; free, busy, ringing
+;fopledcolor=0x102030
+
+
+# How it works: when the panel is first started, it will check
+# for every family defined in op_astdb.cfg between brakets. The
+# key is the astdbkey parameter as defined in op_buttons.cfg
+#
+# If a value is found and non empty it will perform the actions
+# specified in op_astdb.cfg, those actions modify the button for
+# that channel in FOP, they are:
+#
+# settext = sets the text where the callerid is displayed
+# setlabel = sets the label for the button
+# setalpha = sets the alpha blending for the whole button (0-100)
+# flip = flips the button (1)
+# state = set the state of the led to: free, busy or ringing
+# fopledcolor = sets the led color using hex values like 0x2030a0
+#
+# If the value is not found or not set, it will use the second
+# value defined for that action
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/RECIPES
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/RECIPES (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/RECIPES (revision 8095)
@@ -0,0 +1,104 @@
+RECIPE 1
+--------
+Set DND (Do not disturb) from your dialplan and
+reflect the status on FOP:
+
+# Example on setting DND state from the dialplan
+# *78 Sets DND ON
+# *79 Sets DND OFF
+#
+# This example only sets the dnd db value and
+# signals FOP to display the status on the button
+# you might have to add a check in your stdexten
+# macro to honour the DND status
+
+in extensions.conf:
+
+exten => *78,1,Set(DB(dnd/${CUT(CHANNEL|-|1)})=Break)
+exten => *78,n,UserEvent(ASTDB|Channel: ${CHANNEL}^Family: dnd^Value: Break)
+exten => *78,n,Hangup
+
+exten => *79,1,Set(DB(dnd/${CUT(CHANNEL|-|1)})=)
+exten => *79,n,UserEvent(ASTDB|Channel: ${CHANNEL}^Family: dnd^Value: ^)
+exten => *79,n,Hangup
+
+in op_astdb.cfg:
+
+[dnd]
+settext=DND: ${value}|
+fopledcolor=0x001020^0|0x00A000^0
+
+in op_buttons.cfg
+
+[SIP/1234]
+..
+astdbkey=SIP/1234
+
+RECIPE 2
+--------
+How to monitor rxfax. This is just a barebones sample, you can
+customize it for your needs. You have to Goto to the fax context
+from your dialplan:
+
+in extensions.conf:
+
+exten => fax,1,Goto(rxfax,s,1)
+
+[rxfax]
+exten => s,1,Set(FAXFILE=/var/spool/fax/fax-${TIMESTAMP}.tif)
+exten => s,2,Set(LOCALSTATIONID=My Company)
+exten => s,3,UserEvent(Newexten|Channel: FAX/FAX-${UNIQUEID}^State: Up^Uniqueid: 1234)
+exten => s,4,rxfax(${FAXFILE})
+exten => s,5,Hangup()
+exten => t,1,Hangup()
+exten => h,1,UserEvent(Hangup|Channel: FAX/FAX-${UNIQUEID}^State: Down^Uniqueid: 1234)
+
+in op_buttons.cfg:
+[FAX/FAX]
+Position=1
+Label="Fax"
+
+
+
+RECIPE 3
+--------
+How to monitor voicemailmain (users entering the voicemail application)
+You have to define a regular extensions that performs a 'Goto' to the
+vmail context (similar to the fax case above)
+
+in extensions.conf:
+
+[vmail]
+exten => s,1,SetLanguage(es)
+exten => s,2,UserEvent(Newexten|Channel: VMAIL/VMAIL-${UNIQUEID}^State: Up^Uniqueid: 4321)
+exten => s,3,VoicemailMain(${CALLERIDNUM}@internos)
+exten => t,1,Hangup
+exten => h,1,NoOp(Hangup en voicemail)
+exten => h,2,UserEvent(Hangup|Channel: VMAIL/VMAIL-${UNIQUEID}^State: Down^Uniqueid: 4321)
+exten => h,3,Hangup
+
+in op_buttons.cfg:
+
+[VMAIL/VMAIL]
+Position=1
+Label="Voicemail"
+
+RECIPE 4
+--------
+Show day/night mode based on an asterisk db value:
+
+in extensions.conf:
+
+exten => 80,1,DBPut(daymode/DAYMODE=Day);
+exten => 80,2,UserEvent(ASTDB|Family: daymode^Channel: daymode^Value: Day)
+exten => 80,3,Hangup
+;
+exten => 81,1,DBPut(daymode/DAYMODE=Night);
+exten => 81,2,UserEvent(ASTDB|Family: daymode^Channel: daymode^Value: Night)
+exten => 81,3,Hangup
+
+in op_astdb.cfg:
+
+[daymode]
+setlabel=${value}
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index_amp.php
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index_amp.php (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index_amp.php (revision 10122)
@@ -0,0 +1,52 @@
+\"\']+)\s*$/",$line,$matches)) {
+ $conf[ $matches[1] ] = $matches[2];
+ }
+ }
+ return $conf;
+}
+
+$amp_conf = parse_amportal_conf("/etc/amportal.conf");
+
+if ($amp_conf["AMPWEBADDRESS"] == "") {
+ $amp_conf["AMPWEBADDRESS"] = $_SERVER["HTTP_HOST"];
+}
+
+if ($_SERVER["HTTP_HOST"] != $amp_conf["AMPWEBADDRESS"]) {
+ $proto = ((isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) ? "https" : "http");
+ header("Location: ".$proto."://".$amp_conf["AMPWEBADDRESS"].$_SERVER["REQUEST_URI"]);
+ exit;
+}
+
+?>
+
+
+
+Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_buttons.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_buttons.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_buttons.cfg (revision 8095)
@@ -0,0 +1,4 @@
+include => op_buttons_additional.cfg
+
+; use this for your customizations to FOP
+include => op_buttons_custom.cfg
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_style.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_style.cfg (revision 8343)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_style.cfg (revision 8343)
@@ -0,0 +1,125 @@
+[general]
+; Fade out buttons for state
+dimm_noregister_by=20
+dimm_lagged_by=60
+
+; Fade mwi when no mail is waiting
+nomail_alpha=3
+
+; If enabled, the phone will shake/ring
+enable_animation=1
+
+; Pixels to use on the ringing animtion
+shake_pixels=2
+
+; Show borders around text labels, useful for debugin style
+show_borders=0
+
+; If set, the label backdround will change to the led state color
+enable_label_background=0
+
+; set to 1 for encrypting server to client communications
+enable_crypto=1
+
+; use the font embeded in the flash movie instead of system fonts
+use_embed_fonts=1
+
+; colors for led states
+ledcolor_ready=0x00A000
+ledcolor_busy=0xA01020
+ledcolor_agent=0xD0d020
+ledcolor_paused=0x000000
+
+; Settings for the button (rectangle)
+btn_width=244
+btn_height=26
+btn_padding=2
+btn_line_width=2
+btn_line_color=F79418
+btn_fadecolor_1=ccccff
+btn_fadecolor_2=2973FF
+btn_round_border=8
+btn_highlight_color=F79418
+
+; Settings affecting the button label
+label_font_size=11
+label_font_family=Verdana ; only valid when use_embed_fonts is disabled
+label_font_color=000000
+label_shadow_color=dddddd
+label_margin_top=0
+label_margin_left=35
+label_shadow=1
+label_extent_x=40 ; If the label does not fit horizontally, increase this number
+label_extent_y=0
+
+
+; Settings affecting the button clid
+clid_font_color=00dd00
+clid_font_size=11
+clid_centered=1
+clid_font_family=Verdana
+clid_margin_top=11
+clid_margin_left=35
+
+; Settings for the timer
+timer_font_color=4000ff
+timer_font_size=11
+timer_font_family=Verdana
+timer_margin_top=11
+timer_margin_left=160
+
+; Settings for the oval led
+led_scale=60
+led_margin_top=10
+led_margin_left=20
+
+; Settings for the arrow
+arrow_scale=60
+arrow_margin_top=5
+arrow_margin_left=5
+
+; Settings for MWI Icon
+mail_margin_left=-40
+mail_margin_top=13
+mail_scale=4
+
+; Settings for icons
+icon1_margin_top=10
+icon1_margin_left=-15
+icon1_scale=6
+
+icon2_margin_top=10
+icon2_margin_left=-15
+icon2_scale=6
+
+icon3_margin_top=10
+icon3_margin_left=-15
+icon3_scale=6
+
+icon4_margin_top=10
+icon4_margin_left=-15
+icon4_scale=6
+
+icon5_margin_top=10
+icon5_margin_left=-15
+icon5_scale=6
+
+icon6_margin_top=10
+icon6_margin_left=-15
+icon6_scale=6
+
+; Settings for Status Bar at the top
+show_security_code=1
+show_clid_info=0
+show_btn_help=3
+show_btn_debug=0
+show_btn_reload=2
+show_status=4
+
+;[sip]
+; You can have different styles per panel context
+; You need to copy all the variables, they will not be
+; inherited. If you fail to include an option the flash
+; client migth hang. So, copy the complete [general]
+; section an change the header to the panel context name.
+; Then adjust the parameters to your liking.
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/README
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/README (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/README (revision 8095)
@@ -0,0 +1,196 @@
+Asterisk Flash Operator Panel
+Copyright (c) 2006 Nicolás Gudiño. All rights reserved.
+http://www.asternic.org
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+For complete and up to date documentation, please visit the web page
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+What is Flash Operator Panel?
+-----------------------------
+
+The Flash Operator panel is a 'switchboard' application for the Asterisk PBX
+system. It displays information about your Asterisk PBX activity in real
+time via a standard web browser with Flash plugin. The display and button
+layout is configurable, you can have more than a 100 buttons on the screen
+at once.
+
+You can see at a glance:
+
+ * What extensions are busy, ringing or available
+ * Who is talking and to whom (clid, context, priority)
+ * SIP registration status and reachability
+ * Meetme room status (number of users) in the room
+ * Queue status (number of users waiting)
+ * Parked extensions
+ * Call duration Timers
+ * Logged in Agents
+
+You can perform these actions:
+
+ * Hang-up a channel (double click the colored dot on the button)
+ * Transfer a call leg via drag&drop (drag the phone icon on a button to
+ another button)
+ * Originate calls via drag&drop
+ * Drag an available extension to an ongoing conversation and conference
+ the three together.
+ * Change the callerid text to something meaningfull when transferring or
+ originating a call
+ * Mute/Unmute meetme participants
+
+Requirements
+------------
+
+* You need PERL and basic knowledge on how to use Asterisk.
+
+* You have to add a user to asterisk's manager.conf and reload asterisk for
+ the changes to take effect.
+
+* For the conference buttons, message waiting indication and automatic three
+ way conferences, you need asterisk CVS-HEAD as of 5/25/2004
+
+* You need flash player versions 7 and up
+
+* You also need to define in your dialplan the conferences in a proper way
+ and in their own context, as explained in op_server.cfg comments.
+
+* If you plan to use the "Info" box to set the callerid text when
+ transferring or originating a call, you need to modify your dialplan. See
+ extensions.conf.sample
+
+* You also need to be wary, as English is not my first language.
+
+
+Install
+-------
+
+1) Untar de package on a suiteable place, for example /usr/local
+ (if you are reading this you probably already done that)
+
+2) Copy the files in the 'flash' or 'dhtml' subdirectory to a suitable place
+ on your web server. If your web root is /var/www/html, you can create a
+ subdirectory 'panel' and copy the files there. The base files required
+ for the flash client are index.html and operator_panel.swf, you can also
+ copy the help files for your language.
+
+ There are several ways (index files) to load the flash applet, try them
+ out. You can modify the file help-xx.html files to your liking.
+
+ The dhtml panel allows you to use javascript/dhtml to desing your own
+ layout. But the client is limited to monitoring (you cannot perform
+ actions yet)
+
+3) Edit op_server.cfg and change the appropriate parameters for your setup.
+
+ "flash_dir" parameter must be the exact location of the directory where
+ the html and swf files are placed (where you copied the files from step
+ 2 above)
+
+ The rest of the parameters are well commented in the cfg file, basically
+ you have to set the manager host, user and password. (Be sure to enable
+ the manager in /etc/asterisk/manager.conf)
+
+4) Edit op_buttons.cfg to suit your needs. The file is commented and its
+ self explanatory.
+
+5) Edit op_style.cfg to suit your needs. You can change the button size and
+ colors, icon placement and size, etc. DO NOT modify the variable names,
+ just the value after the equal sign and DO NOT use spaces. With proper
+ adjusting, you can have more than a 100 buttons on the screen.
+
+ You can change the toolbar layout by changing the number after the
+ variable show_???. Each one represents a possible element in the toolbar.
+ A value of 0 disables that element. A number represents the order in the
+ toolbar it will be displayed, number one being the leftmost part of the
+ toolbar. In the example configuration, all the toolbar elements are
+ displayed in correlative order. Eg: if you do not want to display a DEBUG
+ button, set the 'show_btn_debug' to 0. You can translate the text of the
+ toolbar in the corresponding variables.
+
+ --!! Please note !!---------------------------------------------------
+ If you want to transfer an available channel to an already connected
+ call, you have to configure your dialplan correctly and have the
+ context properly defined, if you don't do that you will experience
+ hanged channels and asterisk lockups. Thats because when you redirect
+ a call within the asterisk manager with an incorrect contexts,
+ asterisk does not handle the error gracefully.
+ --!!-----------------------------------------------------------------
+
+
+International Characters
+------------------------
+
+If you want to display foreign characters in button labels, you have to save
+the configuration file with UTF-8 encoding. To convert the file to UTF-8
+utilizing vi and the command line just perform:
+
+vi -c ":wq! ++enc=utf8" op_buttons.cfg
+
+
+Running
+-------
+
+The op_server.pl must run on the same computer as the web server, but not
+necesarily on the machine where asterisk is installed.
+
+When started, it writes the file 'variables.txt' to the http directory where
+the flash applet is installed with configuration data. It must have
+permissions to write to that directory.
+
+You can run it daemonized using -d as its command line argument. There are
+some example init scripts in the directory inits
+
+If you want to start the server when the machine starts, you can add a line
+similar to the following to your rc.local file (you have to replace the
+values between '*' with the ones for your system, if you do not want to run
+the op_server.pl as root, just su to that user:
+
+(cd */path/*; su *operator-user* -c */path/*op_server.pl & )
+
+Or better yet, use one of the init scripts provided.
+
+
+Security
+--------
+
+Its not meant to be secure. You should take provisions yourself, like
+limiting who can connect by means of .htaccess files, firewall rules, etc.
+There is basic encryption for messages sent from the server to the client,
+and the security code is sent with MD5. It will hide sensitive information
+from the casual observer, but its not strong enough to send credit card
+information.
+
+
+How to use it
+-------------
+
+Click the HELP button when running the Flash Operator Panel. Experiment.
+Drag icons, move your mouse around. Click and double click when the arrow
+turns into a hand.
+
+
+Support
+-------
+
+For support or submitting bug reports, features requests, etc, please
+subscribe to the mailing list by sending an empty email to
+operator_panel-subscribe@lists.house.com.ar
+
+Donations
+---------
+
+If you like the program, or have feature requests, you can contribute to the
+cause by donating via paypal. Click the donate button on the webpage. You can
+also contact me for custom works, or asterisk consultancy.
+
+Thanks!
+
+
+Credits
+-------
+
+MD5 Algorithm. Copyright:
+(C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved.
+
+TEA Encryption algorithm:
+Copyright (c) 2000, Peter J Billam c/o P J B Computing, www.pjb.com.au
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/crossdomain.xml
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/crossdomain.xml (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/crossdomain.xml (revision 8165)
@@ -0,0 +1,5 @@
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_es.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_es.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_es.html (revision 8165)
@@ -0,0 +1,28 @@
+
+
+Como realizar acciones:
+
+Transferir llamados: arrastre y suelte el telefono hacia la extension de destino
+
+
+ Cortar llamados: pinche dos veces sobre el óvalo rojo
+
+
+ Originar llamados: arrastre el Ãcono de una extensión libre hacia su destino
+
+
+ Irrumpir en un llamado: Puede agregar una tercer persona a una conversación en curso arrastrando el Ãcono del teléfono hacia cualquiera de los botones de la conversación en curso. Los tres serán puestos en una conferencia.
+
+
+ Enmudecer/desenmudecer participantes de una conferencia: pinche sobre la flecha pequeña de un botón
+
+
+ Obtener información sobre el último llamado: pinche dos veces sobre la flecha de un botón inactivo
+
+
+
+Puede mandar información adicional al realizar transferencias usando el campo textual del callerid. Para ello, escriba el texto que desee en el casillero y luego realice la transferencia.
+
+Puede determinar el tiempo máximo de un llamado configurando el
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_fr.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_fr.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_fr.html (revision 8165)
@@ -0,0 +1,20 @@
+
+
+ Vous pouvez réaliser les opérations suivantes:
+
+ Transférer les appels en déplacant l'icône vers la nouvelle destination
+
+ Racrocher en double-cliquant sur le bouton rouge
+
+ Initier des appels en déplacant l'icône vers la destination
+
+ Gérer les conférences: ajouter des participants en déplacant l'icône vers la salle de conférence
+
+ Mute/Unmute un participant d'une conférence en double cliquant sur la flèche
+
+ Lire les informations sur le dernier appel en double-cliquant sur la flèche
+
+
+Vous pouvez aussi entrer un texte dans la boîte Info avant de transférer ou d'initier un appel; ce texte constituera alors l'identifiant de l'appelant (Caller ID ) pour les appels ou transfert suivants.
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_se.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_se.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_se.html (revision 8165)
@@ -0,0 +1,26 @@
+
+
+Hur man använder Flash Operator Panel:
+
+ Flytta samtal: genom att dra telefonikonen till den anknytning du vill
+
+
+ Lägg på samtal: genom att dubbelklicka p&aing; den röda knappen
+
+
+Skapa samtal: genom att dra en tillgänglig anknytning till en tillgänglig mottagare
+
+
+Konferenssamtal: Du kan lägga till en tredje person till en existerande konversation genom att dra en tillgänglig anknytning till ett ben av det redan kopplade samtalet.
+
+
+Stäng av/på mikrofonen för MeetMe medlemmar: bara att dubbelklicka på pilen hos en MeetMe deltagare.
+
+
+Visa information om senaste samtalet: dubbelklicka på pilen på en tillgänglig knapp
+
+
+
+Du kan också skriva extra information i Infoboxen före samtalskoppling eller skapande av samtal. Om text skrivs in i Infoboxen kommer den att användas som CID (nummerpresentation) för samtalet, till exempel: "0877878787 Daniel Nylander"
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_it.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_it.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_it.html (revision 8165)
@@ -0,0 +1,26 @@
+
+
+Istruzioni:
+
+Trasferimento di una Chiamata: Trascinare l'icona del Telefono sulla destinazione desiderata.
+
+
+ Terminare Chiamata: Cliccare due volte sul pulsante Rosso.
+
+
+ Effettuare una Chiamata: Trascinare l'icona di una estensione disponibile su una Destinazione.
+
+
+ Conferenze: Tu puoi aggiungere persone ad una conferenza Attiva semplicemente trascinando l'icona di una Telefono dentro l'estensione della Conferenza.
+
+
+ Attivare o Sospendere l'audio per le Persone nel Meetme: Per fare questo devi cliccare due volte la Freccetta sul partecipante del meetme.
+
+
+ Informazioni sulle ultime chiamate: Clicca due volte la freccetta sull'estensione desiderata.
+
+
+
+PS: Prima di trasferire una chiamta puoi anche scrivere delle informazioni nel INFO-BOX, quello che hai digitato verra' trasmesso alla persona chiamata. Esempio: 555-1212 Bob Jones/IBM
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_no.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_no.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_no.html (revision 8165)
@@ -0,0 +1,27 @@
+
+
+Hvordan Flash Operator Panel brukes:
+
+ Overføre samtaler: ved å trekke og slippe samtalen på den linjen du ønsker over en linjen det skal overføres til
+
+
+ Legge på samtaler: ved å dobbeltklikke på den røde knappen
+
+
+ Starte samtaler: ved å trekke og slippe en ledig linje over den linjen du vil bruke
+
+
+ Konferansesamtale: en tredjeperson kan legges til en samtale ved å trekke og slippe hans/hennes linje over en eksisterende samtale
+
+
+ Slå av lyd/slå på lyd: dobbeltklikk på pilen til en deltager i en konferansesamtale
+
+
+ Se informasjon om siste samtale: dobbeltklikk på pilen for en ledig linje
+
+
+
+Det er også mulig å skrive ekstra informasjon i info-boksen før overføring eller oppstart av en samtale. Hvis det skrives inn tekst, vil denne bli brukt som anropsinformasjon for samtalen (feks "22 12 34 56 Ola Nordmann / Firmanavn")
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-crm.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-crm.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-crm.html (revision 8165)
@@ -0,0 +1,40 @@
+
+
+
+Asterisk Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-clicktodial.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-clicktodial.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-clicktodial.html (revision 8165)
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dial 1-800-555-5555
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_ru.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_ru.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_ru.html (revision 8165)
@@ -0,0 +1,14 @@
+ÐеÑеЎ вÑпПлМеМОеЌ какОÑ
+-лОбП ЎейÑÑвОй, ваЌ ÑлеЎÑÐµÑ Ð²Ð²ÐµÑÑО кПЎ безПпаÑМПÑÑО.
+
+ÐПÑле ÑÑПгП Ð²Ñ ÑЌПжеÑе:
+
+ ÐеÑевПЎОÑÑ Ð·Ð²ÐŸÐœÐºÐž: пеÑеÑаÑОв зМаÑПк ÑелеÑПМа Ма МÑжМПе ваЌ ÑелевПй МПЌеÑ
+ СбÑаÑÑваÑÑ Ð·Ð²ÐŸÐœÐºÐž: ЎвПйМÑÐŒ клОкПЌ Ма кÑаÑМÑÑ ÐºÐœÐŸÐ¿ÐºÑ
+ ÐМОÑООÑПваÑÑ Ð·Ð²ÐŸÐœÐºÐž: пеÑеÑаÑкОваМОеЌ ÑвПбПЎМПгП вМÑÑÑеММегП МПЌеÑа Ма ÑвПбПЎМÑй ÑелевПй МПЌеÑ
+ ÐПМÑеÑеМÑ-ÑвÑзÑ: ÐÑ ÐŒÐŸÐ¶ÐµÑе ЎПбавОÑÑ ÑÑеÑÑегП ÑПбеÑеЎМОка в ÑÑÑеÑÑвÑÑÑОй ÑÐ°Ð·Ð³ÐŸÐ²ÐŸÑ Ð¿ÑÑеЌ пеÑеÑаÑÐºÐžÐ²Ð°ÐœÐžÑ ÑвПбПЎМПгП вМÑÑÑеММегП МПЌеÑа в Ð·ÐŸÐœÑ ÐŽÐµÐ¹ÑÑвÑÑÑегП ÑазгПвПÑа.
+
+Также ÐÑ ÐŒÐŸÐ¶ÐµÑе впОÑаÑÑ ÐŽÐŸÐ±Ð°Ð²ÐŸÑМÑÑ ÐžÐœÑПÑЌаÑÐžÑ Ð² пПле ОМÑПÑЌаÑОО пеÑеЎ пеÑевПЎПЌ ОлО МаÑалПЌ МПвПгП звПМка.
+Ð ÑакПЌ ÑлÑÑае, ПМ пПказÑваеÑÑÑ ÐºÐ°Ðº ÑекÑÑ ÐÐÐа ÐŽÐ»Ñ Ð»ÑбПгП МПвПгП ОлО пеÑевеЎеММПгП звПМка МапÑОЌеÑ:
+"740-9982 ÐОкПлай Оз ЊеМÑÑПбаМка"
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_de.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_de.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_de.html (revision 8165)
@@ -0,0 +1,26 @@
+
+
+Ausführung von Aktionen:
+
+Anrufe transferieren: durch Ziehen des Telefon-Icons auf den gewünschten Ziel-Teilnehmer
+
+
+ Anrufe beenden: Doppelklick auf den roten Button
+
+
+ Anruf initiieren: durch Ziehen eines verfügbaren Teilnehmers auf den gewünschten Ziel-Teilnehmer
+
+
+ Konferenzanrufe: Sie können eine dritte Person zu einem bestehenden Telefonat hinzufügen, indem Sie einen verfügbaren Teilnehmer auf einen der bereits verbundenen Teilnehmer ziehen.
+
+
+ Stumm-/Lautschaltung von MeetMe-Mitgliedern: Doppelklick auf das Pfeil-Icon des Teilnehmers
+
+
+ Informationen zum letzten Anruf abrufen: Doppelklick auf das Pfeil-Icon des Teilnehmers
+
+
+
+Sie können auch Zusatzinformationen in die Infobox schreiben, bevor Sie Anrufe transferieren oder initiieren. Wenn in der Infobox Text eingegeben wurde, dann wird er als Caller-ID-Text für einen transferierten oder initiierten Anruf genutzt, z.B: "555-1212 Bob Jones/IBM"
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-fixed.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-fixed.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-fixed.html (revision 8165)
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+Asterisk Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-restrict.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-restrict.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index-restrict.html (revision 8165)
@@ -0,0 +1,37 @@
+
+
+
+Asterisk Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/mypage.php
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/mypage.php (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/mypage.php (revision 8166)
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+if(!isset($_GET['clid'])) {
+ echo "No caller ID provided ";
+} else {
+ echo "Caller id is: ".$_GET['clid']." ";
+}
+
+if(!isset($_GET['clidname'])) {
+ echo "No caller ID Name provided ";
+} else {
+ echo "Your clid name: ".base64_decode($_GET['clidname'])." ";
+}
+
+?>
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/index.html (revision 8165)
@@ -0,0 +1,27 @@
+
+
+
+Asterisk Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_en.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_en.html (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/flash/help_en.html (revision 8165)
@@ -0,0 +1,26 @@
+
+
+How to perform actions:
+
+ Transfer calls: by dragging the phone icon to the destination you want
+
+
+ Hangup calls: by double clikcing on the red button
+
+
+ Originate calls: by dragging an available extension to an available destination
+
+
+ Conference calls: You can add a third person to an existing conversation by dragging an available extension to a leg of an already connected call.
+
+
+ Mute/Unmute meetme members: just double click on the arrow of a meetme participant
+
+
+ Get information about last call: double click on the arrow of an available button
+
+
+
+You can also write additional information in the Info box before transferring or originating a call. If text is entered in the Info box, it will be used as the Caller ID text for any originated or transferred calls.e.g. "555-1212 Bob Jones/IBM"
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index.php
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index.php (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/index.php (revision 10122)
@@ -0,0 +1,51 @@
+\"\']+)\s*$/",$line,$matches)) {
+ $conf[ $matches[1] ] = $matches[2];
+ }
+ }
+ return $conf;
+}
+
+$amp_conf = parse_amportal_conf("/etc/amportal.conf");
+
+if ($amp_conf["AMPWEBADDRESS"] == "")
+ {$amp_conf["AMPWEBADDRESS"] = $_SERVER["HTTP_HOST"];}
+
+if ($_SERVER["HTTP_HOST"] != $amp_conf["AMPWEBADDRESS"]) {
+ $proto = ((isset($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) ? "https" : "http");
+ header("Location: ".$proto."://".$amp_conf["AMPWEBADDRESS"].$_SERVER["REQUEST_URI"]);
+ exit;
+}
+
+?>
+
+
+
+Flash Operator Panel
+
+
+
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_gl.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_gl.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_gl.cfg (revision 8095)
@@ -0,0 +1,36 @@
+; Language configuration file
+; Contributed by Roberto Salgado
+dialing=A marcar
+calling=A chamar a $1
+incoming=A recibir chamada de $1
+parked=Aparcado en $1
+registered=Rexistrado
+notregistered=Non rexistrado
+reachable =Alcanzable $1
+unreachable=Non alcanzable $1
+lagged=Demorado $1
+newold=Novos $1, Vellos $2
+waitingonqueue=$1 usuario$2 a espera
+memberonconference=$1 participante$2
+version_mismatch=Versión incorrecta entre Cliente e Servidor!
+; client side
+clid_label=CLID
+detail_title=Detalles último chamado
+detail_from=De:
+detail_to=A:
+detail_duration=Duración:
+security_code_title=Ingrese o código de seguridade
+btn_security_text=Abre fiestra de ingreso de código
+btn_restart_text=Reinicia Asterisk
+btn_reload_text=Recarga a configuración
+btn_debug_text=Abre/Pecha fiestra de Debug
+btn_help_text=Abre axuda
+tab_call_text=Chamada
+tab_queue_text=Cola
+calls_taken_text=Chamados atendidos
+no_data_text=Non hai datos
+debug_window_title=Fiestra de Debug
+idle=Inactivo
+paused=Pausa
+channels=$1 chamada$2 en curso
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_en.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_en.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_en.cfg (revision 8095)
@@ -0,0 +1,34 @@
+; Language configuration file
+dialing=Dialing
+calling=Calling $1
+incoming=Incoming call from $1
+parked=Parked on $1
+registered=Registered
+notregistered=Not registered
+reachable=Reachable $1
+unreachable=Not reachable $1
+lagged=Lagged $1
+newold=New $1, Old $2
+waitingonqueue=$1 user$2 waiting
+memberonconference=$1 participant$2
+version_mismatch=Client/Server version mismatch!
+; client side
+clid_label=Info
+detail_title=Last call details
+detail_from=From:
+detail_to=To:
+detail_duration=Duration:
+security_code_title=Please enter the security code
+btn_security_text=Open Security Code Input Box
+btn_restart_text=Restarts Asterisk
+btn_reload_text=Reloads configuration
+btn_debug_text=Open/Close Debug Window
+btn_help_text=Open Help Window
+tab_call_text=Call
+tab_queue_text=Queue
+calls_taken_text=Calls taken
+no_data_text=No data available
+debug_window_title=Debug Window
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.cfg (revision 10122)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.cfg (revision 10122)
@@ -0,0 +1,262 @@
+[general]
+; If you want to use freepbx/trixbox conf file, set this to 1
+use_amportal_conf=1;
+
+; host or ip address of asterisk
+manager_host=127.0.0.1
+manager_port=5038
+; user and secret for connecting to * manager
+manager_user=UNUSED
+manager_secret=UNUSED
+; The optional event_mask for filtering manager events.
+; Asterisk will send only the events you request
+; with this parameter. Possible values are:
+; on, off, system, call, log, verbose
+;event_mask=call
+;
+; You can specify many asterisk servers to
+; monitor. Just repeat the manager_host, manager_user
+; and manager_secret parameters in order. The first
+; one will be server number 1, and so on.
+;
+; manager_host=1.2.3.4
+; manager_user=john
+; manager_secret=doe
+
+; Enable MD5 auth to Asterisk manager
+auth_md5=1
+
+
+; you can use astmanproxy, if you enable it, all of the above
+; connections and settings will be overriden. You have to define
+; the host and port
+; astmanproxy_host = 127.0.0.1
+; astmanproxy_port = 1234
+
+; You will also have to define the servers that are monitored trough
+; astmanproxy, you have to enumerate them using the astmanproxy_server.
+; astmanproxy_server = 192.168.10.1
+; astmanproxy_server = 192.168.10.2
+; astmanproxy_server = 192.168.10.3
+;
+; ip address to listen for inbound connections, default all
+;listen_addr=127.0.0.1
+
+; port to listen for inbound flash connections, default 4445
+;listen_port=4445
+
+; hostname or ip address used to connect to the webserver where
+; the flash movie resides (just the hostname, without directories)
+; This value might be omited. In that case the flash movie will
+; try to connect to the same host as the web page.
+; web_hostname=www.myexample.com
+
+; location of the .swf file in your disk (must reside somewhere
+; inside your web root)
+flash_dir=UNUSED
+
+; secret code for performing hangups and transfers
+security_code=UNUSED
+
+; Frequency in second to poll for sip and iax status
+poll_interval=120
+
+; Poll for voicemail status (only necesary when you access the
+; voicemail directories outside asterisk itself - eg. web access)
+poll_voicemail=1
+
+; 1 Enable automatic hangup of zombies
+; 0 Disable
+kill_zombies=0
+
+
+parkexten=700
+parktimeout=30
+
+; Debug level to stdout (bitmap)
+; 1 Manager Events Received
+; 2 Manager Commands Sent
+; 4 Show Flash events Received
+; 8 Show events sent to Flash Clients
+; 16 Server 1st Debug Level
+; 32 Server 2nd Debug Level
+; 64 Server 3rd Debug Level
+;
+; Eg: to display manager events and
+; commands sent set it to 3 (1+2)
+;
+; Maximum debug level 255
+debug=0
+
+; Default language to use (op_lang_XX.cfg file)
+language=en
+
+; Context in your diaplan where you have the conferences for barge in
+; Example:
+;
+; meetme.conf
+; [rooms]
+; conf => 900
+; conf => 901
+; conf => 902
+;
+; extensions.conf
+; [conferences]
+; exten => 900,1,MeetMe(900)
+; exten => 901,1,MeetMe(901)
+; exten => 902,1,MeetMe(902)
+conference_context=conferences
+
+; Meetme room numbers to use for barge in. The room number must match
+; the extension number (see above).
+barge_rooms=900-902
+
+; When doing barge ins, you can make the 3rd party to start
+; the meetme muted, so the other parties wont notice they are
+; now being monitored
+barge_muted=1
+
+; Formatting of the callerid field
+; where 'x' is a number
+clid_format="(xxx)xxx-xxxx"
+
+; If you want not to show the callerid on the buttons, set this
+; to one
+clid_privacy=0
+
+; To display the ip address of sip or iax peer inside the button
+; set this to 1
+show_ip=0
+
+; It will hide queue position buttons and show only the active ones
+queue_hide=0
+
+; Will change the button label on AgentLogin
+rename_label_agentlogin=0
+
+; Will change the button label on Agentcallbacklogin
+rename_label_callbacklogin=0
+
+; Will rename the label for a wildcard button
+rename_label_wildcard=0
+
+; Will rename to the name specified in agents.conf
+; If disabled the renaming will be Agent/XXXX
+rename_to_agent_name=1
+
+; Will display IDLE time for agents, as well as
+; update the queue status after an agent hangs up
+; the call, so you don't need to reload to get
+; queue statistics
+agent_status=0
+
+; Will rename labels for queuemembers
+; If you use addqueuemember in your dialplan, you
+; can fake an AgengLogin event by sending it with
+; the UserEvent application. Eg:
+;
+; exten => 25,1,AddQueueMember(sales|SIP/${CALLERIDNUM}
+; exten => 25,2,UserEvent(Agentlogin|Agent: ${CALLERIDNUM});
+; exten => 25,3,Answer
+; exten => 25,4,Playback(added-to-sales-queue)
+; exten => 25,5,Hangup
+;
+; exten => 26,1,RemoveQueueMember(sales|SIP/${CALLERIDNUM})
+; exten => 26,2,UserEvent(RefreshQueue);
+; exten => 26,3,Answer
+; exten => 26,4,Playback(removed-from-sales-queue)
+; exten => 26,5,Hangup
+rename_queue_member=0
+
+; Will change the led color when the agent logs in
+; The color is configurable in op_style.cfg
+change_led_agent=1
+
+; If set to 1, you will transfer the linked channel instead
+; of the current channel when you drag the icon on a button
+reverse_transfer=0
+
+; If enabled, it will not ask forthe security code
+; when performing a click to dial
+clicktodial_insecure=1
+
+; Enable select box with absolutetimeout for the call after
+; a transfer is performed within the panel
+transfer_timeout= "0,No timeout|300,5 minutes|600,10 minutes|1200,20 minutes|2400,40 minutes|3000,50 minutes"
+
+; If set to 1, when hitting the reload button on the flash
+; client it will instead restart the 1st asterisk box
+; (For asterisk to restart you have to start it with
+; safe_asterisk, if you dont do that, asterisk will just
+; shut down)
+enable_restart = 0
+
+; If you set this parameter to your voicemailmain
+; extension@context, it will originate a call to
+; voicemailmain when double clicking on the MWI icon
+; for any button.
+voicemail_extension = *97@app-vmmain
+
+
+; Channel variables to be passed from origin channels to Ringing channels
+; Those variables will appear in the popup base64 encoded. A new event
+; will be generated to clients in the form:
+; "setvar" and data VARNAME=BASE64(value)
+passvars=FROM_DID
+
+
+; Attendant transfers. If this parameters are uncomented, then
+; barge in functionality will be replaced with attendant transfers
+;
+; You will need to specify special meetme extensions and another
+; special hold extension. Attendant trasnfer will use the barge_rooms
+; and conference_context specified above to handle the mixing via meetme
+; The meetme extensions should add a priority 10 like this one:
+;
+; [conferences]
+; exten => 901,1,Meetme(901|qMAx)
+; exten => 901,2,Hangup
+; exten => 901,10,Meetme(901|qMx)
+; exten => 901,11,Hangup
+;
+; exten => 8765,1,MusicOnHold
+;
+
+;attendant_hold_extension = 8765
+;attendant_hold_context = conferences
+
+; When attendant transfer fails to originate the call to the destination
+; you can specify a custom failure redirect with the parameter
+; attendant_failure_redirect_to. For example, you can redirect
+; the call to voicemail if the attendant fails. If this parameter is commented
+; the call will be bridged back to the transferrer. In this example, if you
+; try to transfer to extension 100 and it fails, the call will be transferred
+; to 6100 instead (where you can have the voicemail app, or anything else,
+; maybe a queue, etc).
+
+;attendant_failure_redirect_to = 6${EXTEN}@${CONTEXT}
+
+; It is possible to start monitoring a conversation
+; by single clicking on the arrow for a button
+; FOP will use a filename and format based on the
+; following two paramters:
+
+;monitor_filename = FOP-${CLIDNUM}-${LINK}-${UNIQUEID}
+;monitor_format = gsm
+
+
+; You can have panel contexts with their own
+; button layout and configuration. The following entry
+; will create a context called sip with a different
+; security code. In the online documentation you will
+; find how to use contexts
+;
+;[sip]
+;security_code=djdjdi43
+;web_hostname=www.virtualwebserver.com
+;flash_dir=/var/www/virtualwebserver/html/panel
+;barge_rooms=800-802
+;conference_context=otherconferences
+;transfer_timeout="0,No timeout|60,1 minute"
+;voicemail_extension=1000@nine
+;language=es
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_suse.sh
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_suse.sh (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_suse.sh (revision 8166)
@@ -0,0 +1,162 @@
+#!/bin/bash
+#
+# /etc/init.d/fop
+#
+# LSB compliant service control script; see http://www.linuxbase.org/spec/
+#
+# System startup script for daemon spamd
+#
+### BEGIN INIT INFO
+# Provides: fop
+# Required-Start:
+# Required-Stop:
+# Default-Start: 3 5
+# Default-Stop: 0 1 2 6
+# Description: Start Flash Operator Panel
+### END INIT INFO
+#
+# Note on Required-Start: It does specify the init script ordering,
+# not real dependencies. Depencies have to be handled by admin
+# resp. the configuration tools (s)he uses.
+
+# Source SuSE config (if still necessary, most info has been moved)
+test -r /etc/rc.config && . /etc/rc.config
+
+# Check for missing binaries (stale symlinks should not happen)
+FOP_BIN=/usr/local/fop/op_server.pl
+
+# Check for existence of needed config file and read it
+#
+# Later, we may want to make startup behaviour (user ID, firewalling, ...)
+# configurable, as there are security implications (read README.spamd).
+#FOP_CONFIG=/etc/sysconfig/fop
+#test -r $FOP_CONFIG || exit 6
+#. $FOP_CONFIG
+
+test -x $FOP_BIN || exit 5
+
+# Shell functions sourced from /etc/rc.status:
+# rc_check check and set local and overall rc status
+# rc_status check and set local and overall rc status
+# rc_status -v ditto but be verbose in local rc status
+# rc_status -v -r ditto and clear the local rc status
+# rc_failed set local and overall rc status to failed
+# rc_failed set local and overall rc status to
+# rc_reset clear local rc status (overall remains)
+# rc_exit exit appropriate to overall rc status
+# rc_active checks whether a service is activated by symlinks
+. /etc/rc.status
+
+
+FOP_ARGS="-d -p /var/run/fop.pid"
+
+# First reset status of this service
+rc_reset
+
+# Return values acc. to LSB for all commands but status:
+# 0 - success
+# 1 - generic or unspecified error
+# 2 - invalid or excess argument(s)
+# 3 - unimplemented feature (e.g. "reload")
+# 4 - insufficient privilege
+# 5 - program is not installed
+# 6 - program is not configured
+# 7 - program is not running
+#
+# Note that starting an already running service, stopping
+# or restarting a not-running service as well as the restart
+# with force-reload (in case signalling is not supported) are
+# considered a success.
+
+case "$1" in
+ start)
+ echo -n "Starting Flash Operator Panel server "
+ ## Start daemon with startproc(8). If this fails
+ ## the echo return value is set appropriate.
+
+ # NOTE: startproc returns 0, even if service is
+ # already running to match LSB spec.
+ startproc -p /var/run/fop.pid $FOP_BIN $FOP_ARGS
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+ stop)
+ echo -n "Shutting down op_server.pl "
+ ## Stop daemon with killproc(8) and if this fails
+ ## set echo the echo return value.
+
+ killproc -p /var/run/fop.pid -TERM $FOP_BIN
+
+ # Remember status and be verbose
+ rc_status -v
+ ;;
+ try-restart)
+ ## Stop the service and if this succeeds (i.e. the
+ ## service was running before), start it again.
+ ## Note: try-restart is not (yet) part of LSB (as of 0.7.5)
+ $0 status >/dev/null && $0 restart
+
+ # Remember status and be quiet
+ rc_status
+ ;;
+ restart)
+ ## Stop the service and regardless of whether it was
+ ## running or not, start it again.
+ $0 stop
+ $0 start
+
+ # Remember status and be quiet
+ rc_status
+ ;;
+ force-reload)
+ ## Signal the daemon to reload its config. Most daemons
+ ## do this on signal 1 (SIGHUP).
+ ## If it does not support it, restart.
+
+ echo -n "Reload service op_server.pl "
+ ## if it supports it:
+ killproc -HUP $FOP_BIN
+ touch /var/run/fop.pid
+ rc_status -v
+
+ ## Otherwise:
+ #$0 stop && $0 start
+ #rc_status
+ ;;
+ reload)
+ ## Like force-reload, but if daemon does not support
+ ## signalling, do nothing (!)
+
+ # If it supports signalling:
+ echo -n "Reload service op_server.pl "
+ killproc -HUP $FOP_BIN
+ touch /var/run/fop.pid
+ rc_status -v
+
+ ## Otherwise if it does not support reload:
+ #rc_failed 3
+ #rc_status -v
+ ;;
+ status)
+ echo -n "Checking for service fop "
+ ## Check status with checkproc(8), if process is running
+ ## checkproc will return with exit status 0.
+
+ # Return value is slightly different for the status command:
+ # 0 - service running
+ # 1 - service dead, but /var/run/ pid file exists
+ # 2 - service dead, but /var/lock/ lock file exists
+ # 3 - service not running
+
+ # NOTE: checkproc returns LSB compliant status values.
+ checkproc $FOP_BIN
+ rc_status -v
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|status|try-restart|restart|reload}"
+ exit 1
+ ;;
+esac
+rc_exit
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_debian.sh
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_debian.sh (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_debian.sh (revision 8166)
@@ -0,0 +1,78 @@
+#! /bin/sh
+#
+# skeleton example file to build /etc/init.d/ scripts.
+# This file should be used to construct scripts for /etc/init.d.
+#
+# Author: Miquel van Smoorenburg .
+# Ian Murdock .
+#
+# You may remove the "Author" lines above and replace them
+# with your own name if you copy and modify this script.
+#
+# Version: @(#)skeleton 1.9.4 21-Mar-2004 miquels@cistron.nl
+#
+
+set -e
+
+PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
+DAEMON=/usr/local/operator/bin/op_server.pl
+NAME=op_panel
+DESC="Flash Operator Panel"
+
+PIDFILE=/var/run/$NAME.pid
+SCRIPTNAME=/etc/init.d/$NAME
+
+OPTIONS="-d -p $PIDFILE"
+
+# Gracefully exit if the package has been removed.
+test -x $DAEMON || exit 0
+
+# Read config file if it is present.
+#if [ -r /etc/default/$NAME ]
+#then
+# . /etc/default/$NAME
+#fi
+
+case "$1" in
+ start)
+ echo -n "Starting $DESC: $NAME"
+ start-stop-daemon --start --pidfile $PIDFILE --startas $DAEMON -- $OPTIONS
+ echo "."
+ ;;
+ stop)
+ echo -n "Stopping $DESC: $NAME"
+ start-stop-daemon --stop --pidfile $PIDFILE
+ echo "."
+ ;;
+ reload)
+
+ # If the daemon can reload its config files on the fly
+ # for example by sending it SIGHUP, do it here.
+ #
+ # If the daemon responds to changes in its config file
+ # directly anyway, make this a do-nothing entry.
+ #
+ echo -n "Reloading $DESC configuration..."
+ start-stop-daemon --stop --pidfile $PIDFILE --signal HUP
+ echo "done."
+ ;;
+ restart|force-reload)
+ #
+ # If the "reload" option is implemented, move the "force-reload"
+ # option to the "reload" entry above. If not, "force-reload" is
+ # just the same as "restart".
+ #
+ echo -n "Restarting $DESC: $NAME"
+ start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE --startas $DAEMON
+ sleep 1
+ start-stop-daemon --start --quiet --pidfile $PIDFILE --startas $DAEMON -- $OPTIONS
+ echo "."
+ ;;
+ *)
+ # echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
+ echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2
+ exit 1
+ ;;
+esac
+
+exit 0
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_redhat.sh
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_redhat.sh (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/init/op_panel_redhat.sh (revision 8166)
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# chkconfig: 2345 99 15
+# description: Flash Operator Panel
+# processname: op_server.pl
+
+# source function library
+. /etc/rc.d/init.d/functions
+
+DAEMON=/usr/local/fop/op_server.pl
+OPTIONS="-d -c /etc/asterisk/fop"
+RETVAL=0
+
+case "$1" in
+ start)
+ echo -n "Starting Flash Operator Panel: "
+ daemon $DAEMON $OPTIONS
+ RETVAL=$?
+ echo
+ [ $RETVAL -eq 0 ] && touch /var/lock/subsys/op_server.pl
+ ;;
+ stop)
+ echo -n "Shutting dows Flash Operator Panel: "
+ killproc op_server.pl
+ RETVAL=$?
+
+ echo
+ [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/op_server.pl
+ ;;
+ restart)
+ $0 stop
+ $0 start
+ RETVAL=$?
+ ;;
+ reload)
+ echo -n "Reloading Flash Operator Panel configuration: "
+ killproc op_server.pl -HUP
+ RETVAL=$?
+ echo
+ ;;
+ status)
+ status op_server.pl
+ RETVAL=$?
+ ;;
+ *)
+ echo "Usage: op_panel {start|stop|status|restart|reload}"
+ exit 1
+esac
+
+exit $RETVAL
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/extensions.conf.sample
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/extensions.conf.sample (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/extensions.conf.sample (revision 8095)
@@ -0,0 +1,25 @@
+#
+# Example entry for setting a callerid text comming
+# from the flash operator panel
+# You have to modify line 1 and 3 to match the channel
+# name for that extension: temp=clid should remain untouched.
+#
+# If the variable does not exist in the database
+# (if was not set by the operator panel) the line
+# 1 jumps to priority n+101, to perform a normal
+# dial without setting the CallerIDName
+
+exten => 11,1,DBget(temp=clid/SIP/11)
+exten => 11,2,SetCIDName(${temp})
+exten => 11,3,DBdel(clid/SIP/11)
+exten => 11,4,Dial(SIP/11,30,TrH)
+exten => 11,5,Hangup
+
+; gets here if there was not 'info' provided
+exten => 11,102,Dial(SIP/11,30,TrH)
+
+; busy from the dial
+exten => 11,105,Busy
+exten => 11,203,Busy
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/safe_opserver
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/safe_opserver (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/safe_opserver (revision 8166)
@@ -0,0 +1,7 @@
+#!/usr/bin/env sh
+. /etc/amportal.conf
+
+while true; do
+$FOPWEBROOT/op_server.pl
+sleep 4
+done
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_es.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_es.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_es.cfg (revision 8095)
@@ -0,0 +1,35 @@
+; Language configuration file
+dialing=Marcando
+calling=Llamando a $1
+incoming=Recibiendo llamada de $1
+parked=Aparcado en $1
+registered=Registrado
+notregistered=No registrado
+reachable =Alcanzable $1
+unreachable=No alcanzable $1
+lagged=Demorado $1
+newold=Nuevos $1, Viejos $2
+waitingonqueue=$1 usuario$2 esperando
+memberonconference=$1 participante$2
+version_mismatch=Version incorrecta entre Cliente y Servidor!
+; client side
+clid_label=CLID
+detail_title=Detalles ultimo llamado
+detail_from=De:
+detail_to=A:
+detail_duration=Duracion:
+security_code_title=Ingrese el codigo de seguridad
+btn_security_text=Abre ventana de ingreso de codigo
+btn_restart_text=Reinicia Asterisk
+btn_reload_text=Recarga la configuracion
+btn_debug_text=Abre/Cierra ventana de Debug
+btn_help_text=Abre ayuda
+tab_call_text=Llamada
+tab_queue_text=Cola
+calls_taken_text=Llamados atendidos
+no_data_text=No hay datos
+debug_window_title=Ventana de Debug
+idle=Inactivo
+paused=Pausa
+channels=$1 llamada$2 en curso
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_fr.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_fr.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_fr.cfg (revision 8095)
@@ -0,0 +1,39 @@
+; Language configuration file
+;
+; Laurent Mele - lmele@infoclip.fr
+; 2005
+;
+dialing=Numérotation
+calling=Appel de $1
+incoming=Appel entrant du $1
+parked=Parqué au $1
+registered=Enregistré
+notregistered=Non enregistré
+reachable=Disponible. $1
+unreachable=Indisponible $1
+lagged=Lenteur $1
+newold=Nouveau $1, Ancien $2
+waitingonqueue=$1 utilisateur$2 en attente
+memberonconference=$1 participant$2
+version_mismatch=Incohérence de version Client/Serveur!
+; client side
+clid_label=Information
+detail_title=Détails du dernier appel
+detail_from=De:
+detail_to=Vers:
+detail_duration=Durée:
+security_code_title=Entrez le code de sécurité
+btn_security_text=Authentification de l'administrateur
+btn_restart_text=Redémarre Asterisk
+btn_reload_text=Recharge la configuration
+btn_debug_text=Ouvre/Ferme la fenêtre de déverminage
+btn_help_text=Ouvre la fenêtre d'aide
+tab_call_text=Appel
+tab_queue_text=File d'attente
+calls_taken_text=Appels pris
+no_data_text=Pas d'informations disponibles
+debug_window_title=Fenêtre de déverminage
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_se.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_se.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_se.cfg (revision 8095)
@@ -0,0 +1,36 @@
+; Swedish language configuration file
+; Courtesy Daniel Nylander
+dialing=Kopplar
+calling=Ringer $1
+incoming=Inkommande samtal från $1
+parked=Parkerad på $1
+registered=Registrerad
+notregistered=Inte registrerad
+reachable=TillgÀnglig $1
+unreachable=Inte tillgÀnglig $1
+lagged=Fördröjd $1
+newold=Nya $1, Gamla $2
+waitingonqueue=$1 anvÀndare$2 vÀntar
+memberonconference=$1 deltagare$2
+version_mismatch=Klient/Server ej samma version!
+; client side
+clid_label=Info
+detail_title=Detaljer om senaste samtal
+detail_from=Från:
+detail_to=Till:
+detail_duration=LÀngd:
+security_code_title=VÀnligen tryck in sÀkerhetskoden
+btn_security_text=Ãppna inmatning för sÀkerhetskod
+btn_restart_text=Startar om Asterisk
+btn_reload_text=LÀser om konfigurationen
+btn_debug_text=Ãppna/StÀng debugfönstret
+btn_help_text=Ãppna hjÀlpfönstret
+tab_call_text=Samtal
+tab_queue_text=Kö
+calls_taken_text=Samtal tagna
+no_data_text=Ingen data tillgÀnglig
+debug_window_title=Debugfönster
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/TODO
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/TODO (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/TODO (revision 8095)
@@ -0,0 +1,7 @@
+* Clean bugs
+* A way to set astdb values from the .swf
+* A way to perform any cli or manager action from the .swf
+* Change user authentication and restrictions methods
+* Get some sleep
+* Make a client in JAVA
+* Make a windows systray client
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/FAQ
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/FAQ (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/FAQ (revision 8095)
@@ -0,0 +1,65 @@
+Flash Operator Panel frequently asked questions:
+------------------------------------------------
+
+Q0: Do I have to run a webserver?
+
+A0: Yes, its a Flash applet, it works from a web browser. You can use apache
+ or any other webserver you like. It was tested with Windows, Linux, and
+ Mac browsers. Its truly multiplatform!
+
+
+Q1: Do I need to install additional Perl modules to run op_server.pl?
+
+A1: No, it works without extra modules.
+
+
+Q2: International characters are not displayed in button labels! Is it
+ possible to use foreign characters?
+
+A2: Yes, its possible. The flash movie will display international
+ characters if you encode the text with UTF-8. You can encode the files
+ from the command line using vi:
+
+ vi -c ":wq! ++enc=utf8" op_buttons.cfg
+
+ There is a downside to this. If you originate calls from the panel, the
+ caller id will be set with the utf8 label (ilegible characters in the
+ clid)
+
+Q3: I do not want to mess with the caller id text and the asterisk database.
+ Can I disable that feature?
+
+A3: Sure, just modify op_style.cfg and set the show_clid_info variable to 0
+ (zero).
+
+
+Q4: When I try to open the webpage, the browser hangs. Whats wrong?
+
+A4: The flash movie tries to read a file named 'variables.txt' that is
+ generated by op_server.pl in the same directory where the .swf file
+ lives. If this file is corrupted or incomplete, the flash movie might
+ loop forever. Make sure you have the file in place. If its not there,
+ you might have permissions problems or you forgot to run op_server.pl.
+
+
+Q5: I changed the style op_style.cfg, but when I reload the page I don't
+ see the changes. What's up?
+
+A5: The flash movie requests the file variables.txt when it starts. If your
+ browser caches that file, you won't see the changes you made unless you
+ clear your browser cache, or maybe just requesting the variables.txt
+ file and hitting reload a couple of times.
+
+Q6: I do not like editing a text file to change a visual layout!
+
+A6: Me neither, I dream of a visual layout configuration. But I do not have
+ the time to make it happen. Maybe in the future.
+
+Q7: Where is the .fla file?
+
+A7: The flash client is done with MING: you will find the perl source for
+ generating a working .swf client under ming-source.
+
+ If you want the ancient .fla for the first versions, I will trade them
+ for a new apple mac mini core duo or macbook pro.
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/operator.css
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/operator.css (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/operator.css (revision 8165)
@@ -0,0 +1,118 @@
+body {
+ font-family: verdana, helvetica, sans-serif;
+}
+
+.busy,.free,.agent,.notregistered,.ringing,.park {
+ width: 150px;
+ height: 55px;
+ font-size: 12px;
+ color: #000;
+ margin: 2px;
+ padding: 2px;
+}
+
+.busy{
+ float: left;
+ background: #ff3300;
+ overflow: hidden;
+}
+.agent{
+ float: left;
+ background: #dfdf33;
+ overflow: hidden;
+}
+.free{
+ float: left;
+ background: #ccffcc;
+ overflow: hidden;
+}
+.ringing{
+ float: left;
+ background: #009999;
+ overflow: hidden;
+ xbackground-image:url("../images/Cartoon_phone.gif");
+ xbackground-repeat:no-repeat;
+}
+.park{
+ float: left;
+ background: #ff3300;
+ overflow: hidden;
+}
+.notregistered{
+ float: left;
+ background: #ddd;
+ overflow: hidden;
+}
+
+.mcount {
+ border: 1px solid #000;
+ padding: 0.1em;
+ width: 10em;
+ top: -20px;
+ left: 20px;
+ background: #dfd;
+ position: relative;
+ display: none;
+}
+
+.clid {
+ font-size: 10px;
+}
+
+.phone1 {
+ background-image:url("../images/telephone.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.phone2 {
+ background-image:url("../images/phone.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.phone3 {
+ background-image:url("../images/telephone_go.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.phone4 {
+ background-image:url("../images/phone_sound.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.phone5 {
+ background-image:url("../images/status_online.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.phone6 {
+ background-image:url("../images/group.png");
+ background-repeat:no-repeat;
+ float: left;
+ width: 20px;
+}
+.mwi {
+ background-image:url("../images/email.png");
+ background-repeat:no-repeat;
+ visibility: hidden;
+ float: left;
+ width: 20px;
+}
+
+#dhtmltooltip{
+ position: absolute;
+ font-size: 10px;
+ width: 150px;
+ border: 2px solid black;
+ padding: 2px;
+ background-color: lightyellow;
+ visibility: hidden;
+ z-index: 100;
+ /*Remove below line to remove shadow. Below line should always appear last within this CSS*/
+ filter: progid:DXImageTransform.Microsoft.Shadow(color=gray,direction=135);
+}
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/default.css
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/default.css (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/css/default.css (revision 8165)
@@ -0,0 +1,111 @@
+.overlay_dialog img { border: none; }
+.overlay_dialog { background-image: url('../images/overlay.png'); }
+
+/* For PNG transparence in IE !! */
+* html .overlay_dialog {
+ background-color: transparent;
+ back\ground-color: transparent;
+ background-image: none;
+ filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src="../images/overlay.png", sizingMethod="scale");
+}
+
+.dialog_nw {
+ width: 9px;
+ height: 23px;
+ background: transparent url(../images/top_left.gif) no-repeat 0 0;
+}
+
+.dialog_n {
+ background: transparent url(../images/top_mid.gif) repeat-x 0 0;
+ height: 23px;
+ width: 100%;
+}
+
+.dialog_ne {
+ width: 9px;
+ height: 23px;
+ background: transparent url(../images/top_right.gif) no-repeat 0 0;
+}
+
+.dialog_e {
+ width: 2px;
+ height: 100%;
+ background: transparent url(../images/center_right.gif) repeat-y 0 0;
+}
+
+.dialog_w {
+ width: 2px;
+ height: 100%;
+ background: transparent url(../images/center_left.gif) repeat-y 0 0;
+}
+
+.dialog_sw {
+ width: 9px;
+ height: 19px;
+ background: transparent url(../images/bottom_left.gif) no-repeat 0 0;
+}
+
+.dialog_s {
+ background: transparent url(../images/bottom_mid.gif) repeat-x 0 0;
+ height: 19px;
+ width: 100%;
+}
+
+.dialog_se {
+ width: 9px;
+ height: 19px;
+ background: transparent url(../images/bottom_right.gif) no-repeat 0 0;
+}
+
+.dialog_sizer {
+ width: 9px;
+ height: 19px;
+ background: transparent url(../images/sizer.gif) no-repeat 0 0;
+ cursor:se-resize;
+}
+
+.dialog_close {
+ width: 14px;
+ height: 14px;
+ background: transparent url(../images/close.gif) no-repeat 0 0;
+ position:absolute;
+ top:5px;
+ left:8px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.dialog_title {
+ float:left;
+ height:14px;
+ font-size:12px;
+ text-align:center;
+ width:100%;
+}
+
+.dialog_content {
+ overflow:auto;
+ color: #DDD;
+ font-family: Tahoma, Arial, Sans Serif;
+ font-size: 10px;
+ background-color:#123;
+}
+
+.top_draggable, .bottom_draggable {
+ cursor:move;
+}
+/* DO NOT CHANGE THESE VALUES*/
+.dialog {
+ display: block;
+ font-family: Tahoma, Arial, Sans Serif;
+ position: absolute;
+}
+
+.dialog * {
+ margin: 0px;
+ padding:0px;
+}
+
+.dialog table { border-collapse: collapse; border-spacing: 0; width: 100%; }
+.dialog td, th { padding: 0; }
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/base64.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/base64.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/base64.js (revision 8165)
@@ -0,0 +1,154 @@
+var END_OF_INPUT = -1;
+
+var base64Chars = new Array(
+ 'A','B','C','D','E','F','G','H',
+ 'I','J','K','L','M','N','O','P',
+ 'Q','R','S','T','U','V','W','X',
+ 'Y','Z','a','b','c','d','e','f',
+ 'g','h','i','j','k','l','m','n',
+ 'o','p','q','r','s','t','u','v',
+ 'w','x','y','z','0','1','2','3',
+ '4','5','6','7','8','9','+','/'
+);
+
+var reverseBase64Chars = new Array();
+for (var i=0; i < base64Chars.length; i++){
+ reverseBase64Chars[base64Chars[i]] = i;
+}
+
+var base64Str;
+var base64Count;
+function setBase64Str(str){
+ base64Str = str;
+ base64Count = 0;
+}
+function readBase64(){
+ if (!base64Str) return END_OF_INPUT;
+ if (base64Count >= base64Str.length) return END_OF_INPUT;
+ var c = base64Str.charCodeAt(base64Count) & 0xff;
+ base64Count++;
+ return c;
+}
+function encodeBase64(str){
+ setBase64Str(str);
+ var result = '';
+ var inBuffer = new Array(3);
+ var lineCount = 0;
+ var done = false;
+ while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT){
+ inBuffer[1] = readBase64();
+ inBuffer[2] = readBase64();
+ result += (base64Chars[ inBuffer[0] >> 2 ]);
+ if (inBuffer[1] != END_OF_INPUT){
+ result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
+ if (inBuffer[2] != END_OF_INPUT){
+ result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
+ result += (base64Chars [inBuffer[2] & 0x3F]);
+ } else {
+ result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
+ result += ('=');
+ done = true;
+ }
+ } else {
+ result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
+ result += ('=');
+ result += ('=');
+ done = true;
+ }
+ lineCount += 4;
+ if (lineCount >= 76){
+ result += ('\n');
+ lineCount = 0;
+ }
+ }
+ return result;
+}
+function readReverseBase64(){
+ if (!base64Str) return END_OF_INPUT;
+ while (true){
+ if (base64Count >= base64Str.length) return END_OF_INPUT;
+ var nextCharacter = base64Str.charAt(base64Count);
+ base64Count++;
+ if (reverseBase64Chars[nextCharacter]){
+ return reverseBase64Chars[nextCharacter];
+ }
+ if (nextCharacter == 'A') return 0;
+ }
+ return END_OF_INPUT;
+}
+
+function ntos(n){
+ n=n.toString(16);
+ if (n.length == 1) n="0"+n;
+ n="%"+n;
+ return unescape(n);
+}
+
+function decodeBase64(str){
+ setBase64Str(str);
+ var result = "";
+ var inBuffer = new Array(4);
+ var done = false;
+ while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT
+ && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
+ inBuffer[2] = readReverseBase64();
+ inBuffer[3] = readReverseBase64();
+ result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
+ if (inBuffer[2] != END_OF_INPUT){
+ result += ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
+ if (inBuffer[3] != END_OF_INPUT){
+ result += ntos((((inBuffer[2] << 6) & 0xff) | inBuffer[3]));
+ } else {
+ done = true;
+ }
+ } else {
+ done = true;
+ }
+ }
+ return result;
+}
+
+var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
+function toHex(n){
+ var result = ''
+ var start = true;
+ for (var i=32; i>0;){
+ i-=4;
+ var digit = (n>>i) & 0xf;
+ if (!start || digit != 0){
+ start = false;
+ result += digitArray[digit];
+ }
+ }
+ return (result==''?'0':result);
+}
+
+function pad(str, len, pad){
+ var result = str;
+ for (var i=str.length; i
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://prototype.conio.net/
+ *
+/*--------------------------------------------------------------------------*/
+
+var Prototype = {
+ Version: '1.5.0_rc0',
+ ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)',
+
+ emptyFunction: function() {},
+ K: function(x) {return x}
+}
+
+var Class = {
+ create: function() {
+ return function() {
+ this.initialize.apply(this, arguments);
+ }
+ }
+}
+
+var Abstract = new Object();
+
+Object.extend = function(destination, source) {
+ for (var property in source) {
+ destination[property] = source[property];
+ }
+ return destination;
+}
+
+Object.inspect = function(object) {
+ try {
+ if (object == undefined) return 'undefined';
+ if (object == null) return 'null';
+ return object.inspect ? object.inspect() : object.toString();
+ } catch (e) {
+ if (e instanceof RangeError) return '...';
+ throw e;
+ }
+}
+
+Function.prototype.bind = function() {
+ var __method = this, args = $A(arguments), object = args.shift();
+ return function() {
+ return __method.apply(object, args.concat($A(arguments)));
+ }
+}
+
+Function.prototype.bindAsEventListener = function(object) {
+ var __method = this;
+ return function(event) {
+ return __method.call(object, event || window.event);
+ }
+}
+
+Object.extend(Number.prototype, {
+ toColorPart: function() {
+ var digits = this.toString(16);
+ if (this < 16) return '0' + digits;
+ return digits;
+ },
+
+ succ: function() {
+ return this + 1;
+ },
+
+ times: function(iterator) {
+ $R(0, this, true).each(iterator);
+ return this;
+ }
+});
+
+var Try = {
+ these: function() {
+ var returnValue;
+
+ for (var i = 0; i < arguments.length; i++) {
+ var lambda = arguments[i];
+ try {
+ returnValue = lambda();
+ break;
+ } catch (e) {}
+ }
+
+ return returnValue;
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create();
+PeriodicalExecuter.prototype = {
+ initialize: function(callback, frequency) {
+ this.callback = callback;
+ this.frequency = frequency;
+ this.currentlyExecuting = false;
+
+ this.registerCallback();
+ },
+
+ registerCallback: function() {
+ setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+ },
+
+ onTimerEvent: function() {
+ if (!this.currentlyExecuting) {
+ try {
+ this.currentlyExecuting = true;
+ this.callback();
+ } finally {
+ this.currentlyExecuting = false;
+ }
+ }
+ }
+}
+Object.extend(String.prototype, {
+ gsub: function(pattern, replacement) {
+ var result = '', source = this, match;
+ replacement = arguments.callee.prepareReplacement(replacement);
+
+ while (source.length > 0) {
+ if (match = source.match(pattern)) {
+ result += source.slice(0, match.index);
+ result += (replacement(match) || '').toString();
+ source = source.slice(match.index + match[0].length);
+ } else {
+ result += source, source = '';
+ }
+ }
+ return result;
+ },
+
+ sub: function(pattern, replacement, count) {
+ replacement = this.gsub.prepareReplacement(replacement);
+ count = count === undefined ? 1 : count;
+
+ return this.gsub(pattern, function(match) {
+ if (--count < 0) return match[0];
+ return replacement(match);
+ });
+ },
+
+ scan: function(pattern, iterator) {
+ this.gsub(pattern, iterator);
+ return this;
+ },
+
+ truncate: function(length, truncation) {
+ length = length || 30;
+ truncation = truncation === undefined ? '...' : truncation;
+ return this.length > length ?
+ this.slice(0, length - truncation.length) + truncation : this;
+ },
+
+ strip: function() {
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');
+ },
+
+ stripTags: function() {
+ return this.replace(/<\/?[^>]+>/gi, '');
+ },
+
+ stripScripts: function() {
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+ },
+
+ extractScripts: function() {
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+ var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+ return (this.match(matchAll) || []).map(function(scriptTag) {
+ return (scriptTag.match(matchOne) || ['', ''])[1];
+ });
+ },
+
+ evalScripts: function() {
+ return this.extractScripts().map(function(script) { return eval(script) });
+ },
+
+ escapeHTML: function() {
+ var div = document.createElement('div');
+ var text = document.createTextNode(this);
+ div.appendChild(text);
+ return div.innerHTML;
+ },
+
+ unescapeHTML: function() {
+ var div = document.createElement('div');
+ div.innerHTML = this.stripTags();
+ return div.childNodes[0] ? div.childNodes[0].nodeValue : '';
+ },
+
+ toQueryParams: function() {
+ var pairs = this.match(/^\??(.*)$/)[1].split('&');
+ return pairs.inject({}, function(params, pairString) {
+ var pair = pairString.split('=');
+ params[pair[0]] = pair[1];
+ return params;
+ });
+ },
+
+ toArray: function() {
+ return this.split('');
+ },
+
+ camelize: function() {
+ var oStringList = this.split('-');
+ if (oStringList.length == 1) return oStringList[0];
+
+ var camelizedString = this.indexOf('-') == 0
+ ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)
+ : oStringList[0];
+
+ for (var i = 1, len = oStringList.length; i < len; i++) {
+ var s = oStringList[i];
+ camelizedString += s.charAt(0).toUpperCase() + s.substring(1);
+ }
+
+ return camelizedString;
+ },
+
+ inspect: function() {
+ return "'" + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + "'";
+ }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+ if (typeof replacement == 'function') return replacement;
+ var template = new Template(replacement);
+ return function(match) { return template.evaluate(match) };
+}
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+var Template = Class.create();
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+Template.prototype = {
+ initialize: function(template, pattern) {
+ this.template = template.toString();
+ this.pattern = pattern || Template.Pattern;
+ },
+
+ evaluate: function(object) {
+ return this.template.gsub(this.pattern, function(match) {
+ var before = match[1];
+ if (before == '\\') return match[2];
+ return before + (object[match[3]] || '').toString();
+ });
+ }
+}
+
+var $break = new Object();
+var $continue = new Object();
+
+var Enumerable = {
+ each: function(iterator) {
+ var index = 0;
+ try {
+ this._each(function(value) {
+ try {
+ iterator(value, index++);
+ } catch (e) {
+ if (e != $continue) throw e;
+ }
+ });
+ } catch (e) {
+ if (e != $break) throw e;
+ }
+ },
+
+ all: function(iterator) {
+ var result = true;
+ this.each(function(value, index) {
+ result = result && !!(iterator || Prototype.K)(value, index);
+ if (!result) throw $break;
+ });
+ return result;
+ },
+
+ any: function(iterator) {
+ var result = true;
+ this.each(function(value, index) {
+ if (result = !!(iterator || Prototype.K)(value, index))
+ throw $break;
+ });
+ return result;
+ },
+
+ collect: function(iterator) {
+ var results = [];
+ this.each(function(value, index) {
+ results.push(iterator(value, index));
+ });
+ return results;
+ },
+
+ detect: function (iterator) {
+ var result;
+ this.each(function(value, index) {
+ if (iterator(value, index)) {
+ result = value;
+ throw $break;
+ }
+ });
+ return result;
+ },
+
+ findAll: function(iterator) {
+ var results = [];
+ this.each(function(value, index) {
+ if (iterator(value, index))
+ results.push(value);
+ });
+ return results;
+ },
+
+ grep: function(pattern, iterator) {
+ var results = [];
+ this.each(function(value, index) {
+ var stringValue = value.toString();
+ if (stringValue.match(pattern))
+ results.push((iterator || Prototype.K)(value, index));
+ })
+ return results;
+ },
+
+ include: function(object) {
+ var found = false;
+ this.each(function(value) {
+ if (value == object) {
+ found = true;
+ throw $break;
+ }
+ });
+ return found;
+ },
+
+ inject: function(memo, iterator) {
+ this.each(function(value, index) {
+ memo = iterator(memo, value, index);
+ });
+ return memo;
+ },
+
+ invoke: function(method) {
+ var args = $A(arguments).slice(1);
+ return this.collect(function(value) {
+ return value[method].apply(value, args);
+ });
+ },
+
+ max: function(iterator) {
+ var result;
+ this.each(function(value, index) {
+ value = (iterator || Prototype.K)(value, index);
+ if (result == undefined || value >= result)
+ result = value;
+ });
+ return result;
+ },
+
+ min: function(iterator) {
+ var result;
+ this.each(function(value, index) {
+ value = (iterator || Prototype.K)(value, index);
+ if (result == undefined || value < result)
+ result = value;
+ });
+ return result;
+ },
+
+ partition: function(iterator) {
+ var trues = [], falses = [];
+ this.each(function(value, index) {
+ ((iterator || Prototype.K)(value, index) ?
+ trues : falses).push(value);
+ });
+ return [trues, falses];
+ },
+
+ pluck: function(property) {
+ var results = [];
+ this.each(function(value, index) {
+ results.push(value[property]);
+ });
+ return results;
+ },
+
+ reject: function(iterator) {
+ var results = [];
+ this.each(function(value, index) {
+ if (!iterator(value, index))
+ results.push(value);
+ });
+ return results;
+ },
+
+ sortBy: function(iterator) {
+ return this.collect(function(value, index) {
+ return {value: value, criteria: iterator(value, index)};
+ }).sort(function(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }).pluck('value');
+ },
+
+ toArray: function() {
+ return this.collect(Prototype.K);
+ },
+
+ zip: function() {
+ var iterator = Prototype.K, args = $A(arguments);
+ if (typeof args.last() == 'function')
+ iterator = args.pop();
+
+ var collections = [this].concat(args).map($A);
+ return this.map(function(value, index) {
+ return iterator(collections.pluck(index));
+ });
+ },
+
+ inspect: function() {
+ return '#';
+ }
+}
+
+Object.extend(Enumerable, {
+ map: Enumerable.collect,
+ find: Enumerable.detect,
+ select: Enumerable.findAll,
+ member: Enumerable.include,
+ entries: Enumerable.toArray
+});
+var $A = Array.from = function(iterable) {
+ if (!iterable) return [];
+ if (iterable.toArray) {
+ return iterable.toArray();
+ } else {
+ var results = [];
+ for (var i = 0; i < iterable.length; i++)
+ results.push(iterable[i]);
+ return results;
+ }
+}
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse)
+ Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+ _each: function(iterator) {
+ for (var i = 0; i < this.length; i++)
+ iterator(this[i]);
+ },
+
+ clear: function() {
+ this.length = 0;
+ return this;
+ },
+
+ first: function() {
+ return this[0];
+ },
+
+ last: function() {
+ return this[this.length - 1];
+ },
+
+ compact: function() {
+ return this.select(function(value) {
+ return value != undefined || value != null;
+ });
+ },
+
+ flatten: function() {
+ return this.inject([], function(array, value) {
+ return array.concat(value && value.constructor == Array ?
+ value.flatten() : [value]);
+ });
+ },
+
+ without: function() {
+ var values = $A(arguments);
+ return this.select(function(value) {
+ return !values.include(value);
+ });
+ },
+
+ indexOf: function(object) {
+ for (var i = 0; i < this.length; i++)
+ if (this[i] == object) return i;
+ return -1;
+ },
+
+ reverse: function(inline) {
+ return (inline !== false ? this : this.toArray())._reverse();
+ },
+
+ inspect: function() {
+ return '[' + this.map(Object.inspect).join(', ') + ']';
+ }
+});
+var Hash = {
+ _each: function(iterator) {
+ for (var key in this) {
+ var value = this[key];
+ if (typeof value == 'function') continue;
+
+ var pair = [key, value];
+ pair.key = key;
+ pair.value = value;
+ iterator(pair);
+ }
+ },
+
+ keys: function() {
+ return this.pluck('key');
+ },
+
+ values: function() {
+ return this.pluck('value');
+ },
+
+ merge: function(hash) {
+ return $H(hash).inject($H(this), function(mergedHash, pair) {
+ mergedHash[pair.key] = pair.value;
+ return mergedHash;
+ });
+ },
+
+ toQueryString: function() {
+ return this.map(function(pair) {
+ return pair.map(encodeURIComponent).join('=');
+ }).join('&');
+ },
+
+ inspect: function() {
+ return '#';
+ }
+}
+
+function $H(object) {
+ var hash = Object.extend({}, object || {});
+ Object.extend(hash, Enumerable);
+ Object.extend(hash, Hash);
+ return hash;
+}
+ObjectRange = Class.create();
+Object.extend(ObjectRange.prototype, Enumerable);
+Object.extend(ObjectRange.prototype, {
+ initialize: function(start, end, exclusive) {
+ this.start = start;
+ this.end = end;
+ this.exclusive = exclusive;
+ },
+
+ _each: function(iterator) {
+ var value = this.start;
+ do {
+ iterator(value);
+ value = value.succ();
+ } while (this.include(value));
+ },
+
+ include: function(value) {
+ if (value < this.start)
+ return false;
+ if (this.exclusive)
+ return value < this.end;
+ return value <= this.end;
+ }
+});
+
+var $R = function(start, end, exclusive) {
+ return new ObjectRange(start, end, exclusive);
+}
+
+var Ajax = {
+ getTransport: function() {
+ return Try.these(
+ function() {return new XMLHttpRequest()},
+ function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+ ) || false;
+ },
+
+ activeRequestCount: 0
+}
+
+Ajax.Responders = {
+ responders: [],
+
+ _each: function(iterator) {
+ this.responders._each(iterator);
+ },
+
+ register: function(responderToAdd) {
+ if (!this.include(responderToAdd))
+ this.responders.push(responderToAdd);
+ },
+
+ unregister: function(responderToRemove) {
+ this.responders = this.responders.without(responderToRemove);
+ },
+
+ dispatch: function(callback, request, transport, json) {
+ this.each(function(responder) {
+ if (responder[callback] && typeof responder[callback] == 'function') {
+ try {
+ responder[callback].apply(responder, [request, transport, json]);
+ } catch (e) {}
+ }
+ });
+ }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+ onCreate: function() {
+ Ajax.activeRequestCount++;
+ },
+
+ onComplete: function() {
+ Ajax.activeRequestCount--;
+ }
+});
+
+Ajax.Base = function() {};
+Ajax.Base.prototype = {
+ setOptions: function(options) {
+ this.options = {
+ method: 'post',
+ asynchronous: true,
+ contentType: 'application/x-www-form-urlencoded',
+ parameters: ''
+ }
+ Object.extend(this.options, options || {});
+ },
+
+ responseIsSuccess: function() {
+ return this.transport.status == undefined
+ || this.transport.status == 0
+ || (this.transport.status >= 200 && this.transport.status < 300);
+ },
+
+ responseIsFailure: function() {
+ return !this.responseIsSuccess();
+ }
+}
+
+Ajax.Request = Class.create();
+Ajax.Request.Events =
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
+ initialize: function(url, options) {
+ this.transport = Ajax.getTransport();
+ this.setOptions(options);
+ this.request(url);
+ },
+
+ request: function(url) {
+ var parameters = this.options.parameters || '';
+ if (parameters.length > 0) parameters += '&_=';
+
+ try {
+ this.url = url;
+ if (this.options.method == 'get' && parameters.length > 0)
+ this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;
+
+ Ajax.Responders.dispatch('onCreate', this, this.transport);
+
+ this.transport.open(this.options.method, this.url,
+ this.options.asynchronous);
+
+ if (this.options.asynchronous) {
+ this.transport.onreadystatechange = this.onStateChange.bind(this);
+ setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
+ }
+
+ this.setRequestHeaders();
+
+ var body = this.options.postBody ? this.options.postBody : parameters;
+ this.transport.send(this.options.method == 'post' ? body : null);
+
+ } catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ setRequestHeaders: function() {
+ var requestHeaders =
+ ['X-Requested-With', 'XMLHttpRequest',
+ 'X-Prototype-Version', Prototype.Version,
+ 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];
+
+ if (this.options.method == 'post') {
+ requestHeaders.push('Content-type', this.options.contentType);
+
+ /* Force "Connection: close" for Mozilla browsers to work around
+ * a bug where XMLHttpReqeuest sends an incorrect Content-length
+ * header. See Mozilla Bugzilla #246651.
+ */
+ if (this.transport.overrideMimeType)
+ requestHeaders.push('Connection', 'close');
+ }
+
+ if (this.options.requestHeaders)
+ requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);
+
+ for (var i = 0; i < requestHeaders.length; i += 2)
+ this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
+ },
+
+ onStateChange: function() {
+ var readyState = this.transport.readyState;
+ if (readyState != 1)
+ this.respondToReadyState(this.transport.readyState);
+ },
+
+ header: function(name) {
+ try {
+ return this.transport.getResponseHeader(name);
+ } catch (e) {}
+ },
+
+ evalJSON: function() {
+ try {
+ return eval('(' + this.header('X-JSON') + ')');
+ } catch (e) {}
+ },
+
+ evalResponse: function() {
+ try {
+ return eval(this.transport.responseText);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ respondToReadyState: function(readyState) {
+ var event = Ajax.Request.Events[readyState];
+ var transport = this.transport, json = this.evalJSON();
+
+ if (event == 'Complete') {
+ try {
+ (this.options['on' + this.transport.status]
+ || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
+ || Prototype.emptyFunction)(transport, json);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ if ((this.header('Content-type') || '').match(/^text\/javascript/i))
+ this.evalResponse();
+ }
+
+ try {
+ (this.options['on' + event] || Prototype.emptyFunction)(transport, json);
+ Ajax.Responders.dispatch('on' + event, this, transport, json);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ /* Avoid memory leak in MSIE: clean up the oncomplete event handler */
+ if (event == 'Complete')
+ this.transport.onreadystatechange = Prototype.emptyFunction;
+ },
+
+ dispatchException: function(exception) {
+ (this.options.onException || Prototype.emptyFunction)(this, exception);
+ Ajax.Responders.dispatch('onException', this, exception);
+ }
+});
+
+Ajax.Updater = Class.create();
+
+Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
+ initialize: function(container, url, options) {
+ this.containers = {
+ success: container.success ? $(container.success) : $(container),
+ failure: container.failure ? $(container.failure) :
+ (container.success ? null : $(container))
+ }
+
+ this.transport = Ajax.getTransport();
+ this.setOptions(options);
+
+ var onComplete = this.options.onComplete || Prototype.emptyFunction;
+ this.options.onComplete = (function(transport, object) {
+ this.updateContent();
+ onComplete(transport, object);
+ }).bind(this);
+
+ this.request(url);
+ },
+
+ updateContent: function() {
+ var receiver = this.responseIsSuccess() ?
+ this.containers.success : this.containers.failure;
+ var response = this.transport.responseText;
+
+ if (!this.options.evalScripts)
+ response = response.stripScripts();
+
+ if (receiver) {
+ if (this.options.insertion) {
+ new this.options.insertion(receiver, response);
+ } else {
+ Element.update(receiver, response);
+ }
+ }
+
+ if (this.responseIsSuccess()) {
+ if (this.onComplete)
+ setTimeout(this.onComplete.bind(this), 10);
+ }
+ }
+});
+
+Ajax.PeriodicalUpdater = Class.create();
+Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
+ initialize: function(container, url, options) {
+ this.setOptions(options);
+ this.onComplete = this.options.onComplete;
+
+ this.frequency = (this.options.frequency || 2);
+ this.decay = (this.options.decay || 1);
+
+ this.updater = {};
+ this.container = container;
+ this.url = url;
+
+ this.start();
+ },
+
+ start: function() {
+ this.options.onComplete = this.updateComplete.bind(this);
+ this.onTimerEvent();
+ },
+
+ stop: function() {
+ this.updater.onComplete = undefined;
+ clearTimeout(this.timer);
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+ },
+
+ updateComplete: function(request) {
+ if (this.options.decay) {
+ this.decay = (request.responseText == this.lastText ?
+ this.decay * this.options.decay : 1);
+
+ this.lastText = request.responseText;
+ }
+ this.timer = setTimeout(this.onTimerEvent.bind(this),
+ this.decay * this.frequency * 1000);
+ },
+
+ onTimerEvent: function() {
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);
+ }
+});
+function $() {
+ var results = [], element;
+ for (var i = 0; i < arguments.length; i++) {
+ element = arguments[i];
+ if (typeof element == 'string')
+ element = document.getElementById(element);
+ results.push(Element.extend(element));
+ }
+ return results.length < 2 ? results[0] : results;
+}
+
+document.getElementsByClassName = function(className, parentElement) {
+ var children = ($(parentElement) || document.body).getElementsByTagName('*');
+ return $A(children).inject([], function(elements, child) {
+ if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
+ elements.push(Element.extend(child));
+ return elements;
+ });
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Element)
+ var Element = new Object();
+
+Element.extend = function(element) {
+ if (!element) return;
+ if (_nativeExtensions) return element;
+
+ if (!element._extended && element.tagName && element != window) {
+ var methods = Element.Methods, cache = Element.extend.cache;
+ for (property in methods) {
+ var value = methods[property];
+ if (typeof value == 'function')
+ element[property] = cache.findOrStore(value);
+ }
+ }
+
+ element._extended = true;
+ return element;
+}
+
+Element.extend.cache = {
+ findOrStore: function(value) {
+ return this[value] = this[value] || function() {
+ return value.apply(null, [this].concat($A(arguments)));
+ }
+ }
+}
+
+Element.Methods = {
+ visible: function(element) {
+ return $(element).style.display != 'none';
+ },
+
+ toggle: function() {
+ for (var i = 0; i < arguments.length; i++) {
+ var element = $(arguments[i]);
+ Element[Element.visible(element) ? 'hide' : 'show'](element);
+ }
+ },
+
+ hide: function() {
+ for (var i = 0; i < arguments.length; i++) {
+ var element = $(arguments[i]);
+ element.style.display = 'none';
+ }
+ },
+
+ show: function() {
+ for (var i = 0; i < arguments.length; i++) {
+ var element = $(arguments[i]);
+ element.style.display = '';
+ }
+ },
+
+ remove: function(element) {
+ element = $(element);
+ element.parentNode.removeChild(element);
+ },
+
+ update: function(element, html) {
+ $(element).innerHTML = html.stripScripts();
+ setTimeout(function() {html.evalScripts()}, 10);
+ },
+
+ replace: function(element, html) {
+ element = $(element);
+ if (element.outerHTML) {
+ element.outerHTML = html.stripScripts();
+ } else {
+ var range = element.ownerDocument.createRange();
+ range.selectNodeContents(element);
+ element.parentNode.replaceChild(
+ range.createContextualFragment(html.stripScripts()), element);
+ }
+ setTimeout(function() {html.evalScripts()}, 10);
+ },
+
+ getHeight: function(element) {
+ element = $(element);
+ return element.offsetHeight;
+ },
+
+ classNames: function(element) {
+ return new Element.ClassNames(element);
+ },
+
+ hasClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return Element.classNames(element).include(className);
+ },
+
+ addClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return Element.classNames(element).add(className);
+ },
+
+ removeClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return Element.classNames(element).remove(className);
+ },
+
+ // removes whitespace-only text node children
+ cleanWhitespace: function(element) {
+ element = $(element);
+ for (var i = 0; i < element.childNodes.length; i++) {
+ var node = element.childNodes[i];
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+ Element.remove(node);
+ }
+ },
+
+ empty: function(element) {
+ return $(element).innerHTML.match(/^\s*$/);
+ },
+
+ childOf: function(element, ancestor) {
+ element = $(element), ancestor = $(ancestor);
+ while (element = element.parentNode)
+ if (element == ancestor) return true;
+ return false;
+ },
+
+ scrollTo: function(element) {
+ element = $(element);
+ var x = element.x ? element.x : element.offsetLeft,
+ y = element.y ? element.y : element.offsetTop;
+ window.scrollTo(x, y);
+ },
+
+ getStyle: function(element, style) {
+ element = $(element);
+ var value = element.style[style.camelize()];
+ if (!value) {
+ if (document.defaultView && document.defaultView.getComputedStyle) {
+ var css = document.defaultView.getComputedStyle(element, null);
+ value = css ? css.getPropertyValue(style) : null;
+ } else if (element.currentStyle) {
+ value = element.currentStyle[style.camelize()];
+ }
+ }
+
+ if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
+ if (Element.getStyle(element, 'position') == 'static') value = 'auto';
+
+ return value == 'auto' ? null : value;
+ },
+
+ setStyle: function(element, style) {
+ element = $(element);
+ for (var name in style)
+ element.style[name.camelize()] = style[name];
+ },
+
+ getDimensions: function(element) {
+ element = $(element);
+ if (Element.getStyle(element, 'display') != 'none')
+ return {width: element.offsetWidth, height: element.offsetHeight};
+
+ // All *Width and *Height properties give 0 on elements with display none,
+ // so enable the element temporarily
+ var els = element.style;
+ var originalVisibility = els.visibility;
+ var originalPosition = els.position;
+ els.visibility = 'hidden';
+ els.position = 'absolute';
+ els.display = '';
+ var originalWidth = element.clientWidth;
+ var originalHeight = element.clientHeight;
+ els.display = 'none';
+ els.position = originalPosition;
+ els.visibility = originalVisibility;
+ return {width: originalWidth, height: originalHeight};
+ },
+
+ makePositioned: function(element) {
+ element = $(element);
+ var pos = Element.getStyle(element, 'position');
+ if (pos == 'static' || !pos) {
+ element._madePositioned = true;
+ element.style.position = 'relative';
+ // Opera returns the offset relative to the positioning context, when an
+ // element is position relative but top and left have not been defined
+ if (window.opera) {
+ element.style.top = 0;
+ element.style.left = 0;
+ }
+ }
+ },
+
+ undoPositioned: function(element) {
+ element = $(element);
+ if (element._madePositioned) {
+ element._madePositioned = undefined;
+ element.style.position =
+ element.style.top =
+ element.style.left =
+ element.style.bottom =
+ element.style.right = '';
+ }
+ },
+
+ makeClipping: function(element) {
+ element = $(element);
+ if (element._overflow) return;
+ element._overflow = element.style.overflow;
+ if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
+ element.style.overflow = 'hidden';
+ },
+
+ undoClipping: function(element) {
+ element = $(element);
+ if (element._overflow) return;
+ element.style.overflow = element._overflow;
+ element._overflow = undefined;
+ }
+}
+
+Object.extend(Element, Element.Methods);
+
+var _nativeExtensions = false;
+
+if(!HTMLElement && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+ var HTMLElement = {}
+ HTMLElement.prototype = document.createElement('div').__proto__;
+}
+
+Element.addMethods = function(methods) {
+ Object.extend(Element.Methods, methods || {});
+
+ if(typeof HTMLElement != 'undefined') {
+ var methods = Element.Methods, cache = Element.extend.cache;
+ for (property in methods) {
+ var value = methods[property];
+ if (typeof value == 'function')
+ HTMLElement.prototype[property] = cache.findOrStore(value);
+ }
+ _nativeExtensions = true;
+ }
+}
+
+Element.addMethods();
+
+var Toggle = new Object();
+Toggle.display = Element.toggle;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.Insertion = function(adjacency) {
+ this.adjacency = adjacency;
+}
+
+Abstract.Insertion.prototype = {
+ initialize: function(element, content) {
+ this.element = $(element);
+ this.content = content.stripScripts();
+
+ if (this.adjacency && this.element.insertAdjacentHTML) {
+ try {
+ this.element.insertAdjacentHTML(this.adjacency, this.content);
+ } catch (e) {
+ var tagName = this.element.tagName.toLowerCase();
+ if (tagName == 'tbody' || tagName == 'tr') {
+ this.insertContent(this.contentFromAnonymousTable());
+ } else {
+ throw e;
+ }
+ }
+ } else {
+ this.range = this.element.ownerDocument.createRange();
+ if (this.initializeRange) this.initializeRange();
+ this.insertContent([this.range.createContextualFragment(this.content)]);
+ }
+
+ setTimeout(function() {content.evalScripts()}, 10);
+ },
+
+ contentFromAnonymousTable: function() {
+ var div = document.createElement('div');
+ div.innerHTML = '';
+ return $A(div.childNodes[0].childNodes[0].childNodes);
+ }
+}
+
+var Insertion = new Object();
+
+Insertion.Before = Class.create();
+Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
+ initializeRange: function() {
+ this.range.setStartBefore(this.element);
+ },
+
+ insertContent: function(fragments) {
+ fragments.each((function(fragment) {
+ this.element.parentNode.insertBefore(fragment, this.element);
+ }).bind(this));
+ }
+});
+
+Insertion.Top = Class.create();
+Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
+ initializeRange: function() {
+ this.range.selectNodeContents(this.element);
+ this.range.collapse(true);
+ },
+
+ insertContent: function(fragments) {
+ fragments.reverse(false).each((function(fragment) {
+ this.element.insertBefore(fragment, this.element.firstChild);
+ }).bind(this));
+ }
+});
+
+Insertion.Bottom = Class.create();
+Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
+ initializeRange: function() {
+ this.range.selectNodeContents(this.element);
+ this.range.collapse(this.element);
+ },
+
+ insertContent: function(fragments) {
+ fragments.each((function(fragment) {
+ this.element.appendChild(fragment);
+ }).bind(this));
+ }
+});
+
+Insertion.After = Class.create();
+Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
+ initializeRange: function() {
+ this.range.setStartAfter(this.element);
+ },
+
+ insertContent: function(fragments) {
+ fragments.each((function(fragment) {
+ this.element.parentNode.insertBefore(fragment,
+ this.element.nextSibling);
+ }).bind(this));
+ }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+ initialize: function(element) {
+ this.element = $(element);
+ },
+
+ _each: function(iterator) {
+ this.element.className.split(/\s+/).select(function(name) {
+ return name.length > 0;
+ })._each(iterator);
+ },
+
+ set: function(className) {
+ this.element.className = className;
+ },
+
+ add: function(classNameToAdd) {
+ if (this.include(classNameToAdd)) return;
+ this.set(this.toArray().concat(classNameToAdd).join(' '));
+ },
+
+ remove: function(classNameToRemove) {
+ if (!this.include(classNameToRemove)) return;
+ this.set(this.select(function(className) {
+ return className != classNameToRemove;
+ }).join(' '));
+ },
+
+ toString: function() {
+ return this.toArray().join(' ');
+ }
+}
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+var Selector = Class.create();
+Selector.prototype = {
+ initialize: function(expression) {
+ this.params = {classNames: []};
+ this.expression = expression.toString().strip();
+ this.parseExpression();
+ this.compileMatcher();
+ },
+
+ parseExpression: function() {
+ function abort(message) { throw 'Parse error in selector: ' + message; }
+
+ if (this.expression == '') abort('empty expression');
+
+ var params = this.params, expr = this.expression, match, modifier, clause, rest;
+ while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
+ params.attributes = params.attributes || [];
+ params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
+ expr = match[1];
+ }
+
+ if (expr == '*') return this.params.wildcard = true;
+
+ while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
+ modifier = match[1], clause = match[2], rest = match[3];
+ switch (modifier) {
+ case '#': params.id = clause; break;
+ case '.': params.classNames.push(clause); break;
+ case '':
+ case undefined: params.tagName = clause.toUpperCase(); break;
+ default: abort(expr.inspect());
+ }
+ expr = rest;
+ }
+
+ if (expr.length > 0) abort(expr.inspect());
+ },
+
+ buildMatchExpression: function() {
+ var params = this.params, conditions = [], clause;
+
+ if (params.wildcard)
+ conditions.push('true');
+ if (clause = params.id)
+ conditions.push('element.id == ' + clause.inspect());
+ if (clause = params.tagName)
+ conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
+ if ((clause = params.classNames).length > 0)
+ for (var i = 0; i < clause.length; i++)
+ conditions.push('Element.hasClassName(element, ' + clause[i].inspect() + ')');
+ if (clause = params.attributes) {
+ clause.each(function(attribute) {
+ var value = 'element.getAttribute(' + attribute.name.inspect() + ')';
+ var splitValueBy = function(delimiter) {
+ return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
+ }
+
+ switch (attribute.operator) {
+ case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;
+ case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
+ case '|=': conditions.push(
+ splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
+ ); break;
+ case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
+ case '':
+ case undefined: conditions.push(value + ' != null'); break;
+ default: throw 'Unknown operator ' + attribute.operator + ' in selector';
+ }
+ });
+ }
+
+ return conditions.join(' && ');
+ },
+
+ compileMatcher: function() {
+ this.match = new Function('element', 'if (!element.tagName) return false; \
+ return ' + this.buildMatchExpression());
+ },
+
+ findElements: function(scope) {
+ var element;
+
+ if (element = $(this.params.id))
+ if (this.match(element))
+ if (!scope || Element.childOf(element, scope))
+ return [element];
+
+ scope = (scope || document).getElementsByTagName(this.params.tagName || '*');
+
+ var results = [];
+ for (var i = 0; i < scope.length; i++)
+ if (this.match(element = scope[i]))
+ results.push(Element.extend(element));
+
+ return results;
+ },
+
+ toString: function() {
+ return this.expression;
+ }
+}
+
+function $$() {
+ return $A(arguments).map(function(expression) {
+ return expression.strip().split(/\s+/).inject([null], function(results, expr) {
+ var selector = new Selector(expr);
+ return results.map(selector.findElements.bind(selector)).flatten();
+ });
+ }).flatten();
+}
+var Field = {
+ clear: function() {
+ for (var i = 0; i < arguments.length; i++)
+ $(arguments[i]).value = '';
+ },
+
+ focus: function(element) {
+ $(element).focus();
+ },
+
+ present: function() {
+ for (var i = 0; i < arguments.length; i++)
+ if ($(arguments[i]).value == '') return false;
+ return true;
+ },
+
+ select: function(element) {
+ $(element).select();
+ },
+
+ activate: function(element) {
+ element = $(element);
+ element.focus();
+ if (element.select)
+ element.select();
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Form = {
+ serialize: function(form) {
+ var elements = Form.getElements($(form));
+ var queryComponents = new Array();
+
+ for (var i = 0; i < elements.length; i++) {
+ var queryComponent = Form.Element.serialize(elements[i]);
+ if (queryComponent)
+ queryComponents.push(queryComponent);
+ }
+
+ return queryComponents.join('&');
+ },
+
+ getElements: function(form) {
+ form = $(form);
+ var elements = new Array();
+
+ for (var tagName in Form.Element.Serializers) {
+ var tagElements = form.getElementsByTagName(tagName);
+ for (var j = 0; j < tagElements.length; j++)
+ elements.push(tagElements[j]);
+ }
+ return elements;
+ },
+
+ getInputs: function(form, typeName, name) {
+ form = $(form);
+ var inputs = form.getElementsByTagName('input');
+
+ if (!typeName && !name)
+ return inputs;
+
+ var matchingInputs = new Array();
+ for (var i = 0; i < inputs.length; i++) {
+ var input = inputs[i];
+ if ((typeName && input.type != typeName) ||
+ (name && input.name != name))
+ continue;
+ matchingInputs.push(input);
+ }
+
+ return matchingInputs;
+ },
+
+ disable: function(form) {
+ var elements = Form.getElements(form);
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ element.blur();
+ element.disabled = 'true';
+ }
+ },
+
+ enable: function(form) {
+ var elements = Form.getElements(form);
+ for (var i = 0; i < elements.length; i++) {
+ var element = elements[i];
+ element.disabled = '';
+ }
+ },
+
+ findFirstElement: function(form) {
+ return Form.getElements(form).find(function(element) {
+ return element.type != 'hidden' && !element.disabled &&
+ ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+ });
+ },
+
+ focusFirstElement: function(form) {
+ Field.activate(Form.findFirstElement(form));
+ },
+
+ reset: function(form) {
+ $(form).reset();
+ }
+}
+
+Form.Element = {
+ serialize: function(element) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ var parameter = Form.Element.Serializers[method](element);
+
+ if (parameter) {
+ var key = encodeURIComponent(parameter[0]);
+ if (key.length == 0) return;
+
+ if (parameter[1].constructor != Array)
+ parameter[1] = [parameter[1]];
+
+ return parameter[1].map(function(value) {
+ return key + '=' + encodeURIComponent(value);
+ }).join('&');
+ }
+ },
+
+ getValue: function(element) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ var parameter = Form.Element.Serializers[method](element);
+
+ if (parameter)
+ return parameter[1];
+ }
+}
+
+Form.Element.Serializers = {
+ input: function(element) {
+ switch (element.type.toLowerCase()) {
+ case 'submit':
+ case 'hidden':
+ case 'password':
+ case 'text':
+ return Form.Element.Serializers.textarea(element);
+ case 'checkbox':
+ case 'radio':
+ return Form.Element.Serializers.inputSelector(element);
+ }
+ return false;
+ },
+
+ inputSelector: function(element) {
+ if (element.checked)
+ return [element.name, element.value];
+ },
+
+ textarea: function(element) {
+ return [element.name, element.value];
+ },
+
+ select: function(element) {
+ return Form.Element.Serializers[element.type == 'select-one' ?
+ 'selectOne' : 'selectMany'](element);
+ },
+
+ selectOne: function(element) {
+ var value = '', opt, index = element.selectedIndex;
+ if (index >= 0) {
+ opt = element.options[index];
+ value = opt.value || opt.text;
+ }
+ return [element.name, value];
+ },
+
+ selectMany: function(element) {
+ var value = [];
+ for (var i = 0; i < element.length; i++) {
+ var opt = element.options[i];
+ if (opt.selected)
+ value.push(opt.value || opt.text);
+ }
+ return [element.name, value];
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var $F = Form.Element.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = function() {}
+Abstract.TimedObserver.prototype = {
+ initialize: function(element, frequency, callback) {
+ this.frequency = frequency;
+ this.element = $(element);
+ this.callback = callback;
+
+ this.lastValue = this.getValue();
+ this.registerCallback();
+ },
+
+ registerCallback: function() {
+ setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+ },
+
+ onTimerEvent: function() {
+ var value = this.getValue();
+ if (this.lastValue != value) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ }
+}
+
+Form.Element.Observer = Class.create();
+Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.Observer = Class.create();
+Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = function() {}
+Abstract.EventObserver.prototype = {
+ initialize: function(element, callback) {
+ this.element = $(element);
+ this.callback = callback;
+
+ this.lastValue = this.getValue();
+ if (this.element.tagName.toLowerCase() == 'form')
+ this.registerFormCallbacks();
+ else
+ this.registerCallback(this.element);
+ },
+
+ onElementEvent: function() {
+ var value = this.getValue();
+ if (this.lastValue != value) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ },
+
+ registerFormCallbacks: function() {
+ var elements = Form.getElements(this.element);
+ for (var i = 0; i < elements.length; i++)
+ this.registerCallback(elements[i]);
+ },
+
+ registerCallback: function(element) {
+ if (element.type) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ Event.observe(element, 'click', this.onElementEvent.bind(this));
+ break;
+ case 'password':
+ case 'text':
+ case 'textarea':
+ case 'select-one':
+ case 'select-multiple':
+ Event.observe(element, 'change', this.onElementEvent.bind(this));
+ break;
+ }
+ }
+ }
+}
+
+Form.Element.EventObserver = Class.create();
+Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.EventObserver = Class.create();
+Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+if (!window.Event) {
+ var Event = new Object();
+}
+
+Object.extend(Event, {
+ KEY_BACKSPACE: 8,
+ KEY_TAB: 9,
+ KEY_RETURN: 13,
+ KEY_ESC: 27,
+ KEY_LEFT: 37,
+ KEY_UP: 38,
+ KEY_RIGHT: 39,
+ KEY_DOWN: 40,
+ KEY_DELETE: 46,
+
+ element: function(event) {
+ return event.target || event.srcElement;
+ },
+
+ isLeftClick: function(event) {
+ return (((event.which) && (event.which == 1)) ||
+ ((event.button) && (event.button == 1)));
+ },
+
+ pointerX: function(event) {
+ return event.pageX || (event.clientX +
+ (document.documentElement.scrollLeft || document.body.scrollLeft));
+ },
+
+ pointerY: function(event) {
+ return event.pageY || (event.clientY +
+ (document.documentElement.scrollTop || document.body.scrollTop));
+ },
+
+ stop: function(event) {
+ if (event.preventDefault) {
+ event.preventDefault();
+ event.stopPropagation();
+ } else {
+ event.returnValue = false;
+ event.cancelBubble = true;
+ }
+ },
+
+ // find the first node with the given tagName, starting from the
+ // node the event was triggered on; traverses the DOM upwards
+ findElement: function(event, tagName) {
+ var element = Event.element(event);
+ while (element.parentNode && (!element.tagName ||
+ (element.tagName.toUpperCase() != tagName.toUpperCase())))
+ element = element.parentNode;
+ return element;
+ },
+
+ observers: false,
+
+ _observeAndCache: function(element, name, observer, useCapture) {
+ if (!this.observers) this.observers = [];
+ if (element.addEventListener) {
+ this.observers.push([element, name, observer, useCapture]);
+ element.addEventListener(name, observer, useCapture);
+ } else if (element.attachEvent) {
+ this.observers.push([element, name, observer, useCapture]);
+ element.attachEvent('on' + name, observer);
+ }
+ },
+
+ unloadCache: function() {
+ if (!Event.observers) return;
+ for (var i = 0; i < Event.observers.length; i++) {
+ Event.stopObserving.apply(this, Event.observers[i]);
+ Event.observers[i][0] = null;
+ }
+ Event.observers = false;
+ },
+
+ observe: function(element, name, observer, useCapture) {
+ var element = $(element);
+ useCapture = useCapture || false;
+
+ if (name == 'keypress' &&
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+ || element.attachEvent))
+ name = 'keydown';
+
+ this._observeAndCache(element, name, observer, useCapture);
+ },
+
+ stopObserving: function(element, name, observer, useCapture) {
+ var element = $(element);
+ useCapture = useCapture || false;
+
+ if (name == 'keypress' &&
+ (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
+ || element.detachEvent))
+ name = 'keydown';
+
+ if (element.removeEventListener) {
+ element.removeEventListener(name, observer, useCapture);
+ } else if (element.detachEvent) {
+ element.detachEvent('on' + name, observer);
+ }
+ }
+});
+
+/* prevent memory leaks in IE */
+if (navigator.appVersion.match(/\bMSIE\b/))
+ Event.observe(window, 'unload', Event.unloadCache, false);
+var Position = {
+ // set to true if needed, warning: firefox performance problems
+ // NOT neeeded for page scrolling, only if draggable contained in
+ // scrollable elements
+ includeScrollOffsets: false,
+
+ // must be called before calling withinIncludingScrolloffset, every time the
+ // page is scrolled
+ prepare: function() {
+ this.deltaX = window.pageXOffset
+ || document.documentElement.scrollLeft
+ || document.body.scrollLeft
+ || 0;
+ this.deltaY = window.pageYOffset
+ || document.documentElement.scrollTop
+ || document.body.scrollTop
+ || 0;
+ },
+
+ realOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.scrollTop || 0;
+ valueL += element.scrollLeft || 0;
+ element = element.parentNode;
+ } while (element);
+ return [valueL, valueT];
+ },
+
+ cumulativeOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ } while (element);
+ return [valueL, valueT];
+ },
+
+ positionedOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ if (element) {
+ p = Element.getStyle(element, 'position');
+ if (p == 'relative' || p == 'absolute') break;
+ }
+ } while (element);
+ return [valueL, valueT];
+ },
+
+ offsetParent: function(element) {
+ if (element.offsetParent) return element.offsetParent;
+ if (element == document.body) return element;
+
+ while ((element = element.parentNode) && element != document.body)
+ if (Element.getStyle(element, 'position') != 'static')
+ return element;
+
+ return document.body;
+ },
+
+ // caches x/y coordinate pair to use with overlap
+ within: function(element, x, y) {
+ if (this.includeScrollOffsets)
+ return this.withinIncludingScrolloffsets(element, x, y);
+ this.xcomp = x;
+ this.ycomp = y;
+ this.offset = this.cumulativeOffset(element);
+
+ return (y >= this.offset[1] &&
+ y < this.offset[1] + element.offsetHeight &&
+ x >= this.offset[0] &&
+ x < this.offset[0] + element.offsetWidth);
+ },
+
+ withinIncludingScrolloffsets: function(element, x, y) {
+ var offsetcache = this.realOffset(element);
+
+ this.xcomp = x + offsetcache[0] - this.deltaX;
+ this.ycomp = y + offsetcache[1] - this.deltaY;
+ this.offset = this.cumulativeOffset(element);
+
+ return (this.ycomp >= this.offset[1] &&
+ this.ycomp < this.offset[1] + element.offsetHeight &&
+ this.xcomp >= this.offset[0] &&
+ this.xcomp < this.offset[0] + element.offsetWidth);
+ },
+
+ // within must be called directly before
+ overlap: function(mode, element) {
+ if (!mode) return 0;
+ if (mode == 'vertical')
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+ element.offsetHeight;
+ if (mode == 'horizontal')
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+ element.offsetWidth;
+ },
+
+ clone: function(source, target) {
+ source = $(source);
+ target = $(target);
+ target.style.position = 'absolute';
+ var offsets = this.cumulativeOffset(source);
+ target.style.top = offsets[1] + 'px';
+ target.style.left = offsets[0] + 'px';
+ target.style.width = source.offsetWidth + 'px';
+ target.style.height = source.offsetHeight + 'px';
+ },
+
+ page: function(forElement) {
+ var valueT = 0, valueL = 0;
+
+ var element = forElement;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+
+ // Safari fix
+ if (element.offsetParent==document.body)
+ if (Element.getStyle(element,'position')=='absolute') break;
+
+ } while (element = element.offsetParent);
+
+ element = forElement;
+ do {
+ valueT -= element.scrollTop || 0;
+ valueL -= element.scrollLeft || 0;
+ } while (element = element.parentNode);
+
+ return [valueL, valueT];
+ },
+
+ clone: function(source, target) {
+ var options = Object.extend({
+ setLeft: true,
+ setTop: true,
+ setWidth: true,
+ setHeight: true,
+ offsetTop: 0,
+ offsetLeft: 0
+ }, arguments[2] || {})
+
+ // find page position of source
+ source = $(source);
+ var p = Position.page(source);
+
+ // find coordinate system to use
+ target = $(target);
+ var delta = [0, 0];
+ var parent = null;
+ // delta [0,0] will do fine with position: fixed elements,
+ // position:absolute needs offsetParent deltas
+ if (Element.getStyle(target,'position') == 'absolute') {
+ parent = Position.offsetParent(target);
+ delta = Position.page(parent);
+ }
+
+ // correct by body offsets (fixes Safari)
+ if (parent == document.body) {
+ delta[0] -= document.body.offsetLeft;
+ delta[1] -= document.body.offsetTop;
+ }
+
+ // set position
+ if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
+ if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
+ if(options.setWidth) target.style.width = source.offsetWidth + 'px';
+ if(options.setHeight) target.style.height = source.offsetHeight + 'px';
+ },
+
+ absolutize: function(element) {
+ element = $(element);
+ if (element.style.position == 'absolute') return;
+ Position.prepare();
+
+ var offsets = Position.positionedOffset(element);
+ var top = offsets[1];
+ var left = offsets[0];
+ var width = element.clientWidth;
+ var height = element.clientHeight;
+
+ element._originalLeft = left - parseFloat(element.style.left || 0);
+ element._originalTop = top - parseFloat(element.style.top || 0);
+ element._originalWidth = element.style.width;
+ element._originalHeight = element.style.height;
+
+ element.style.position = 'absolute';
+ element.style.top = top + 'px';;
+ element.style.left = left + 'px';;
+ element.style.width = width + 'px';;
+ element.style.height = height + 'px';;
+ },
+
+ relativize: function(element) {
+ element = $(element);
+ if (element.style.position == 'relative') return;
+ Position.prepare();
+
+ element.style.position = 'relative';
+ var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
+ var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+ element.style.top = top + 'px';
+ element.style.left = left + 'px';
+ element.style.height = element._originalHeight;
+ element.style.width = element._originalWidth;
+ }
+}
+
+// Safari returns margins on body which is incorrect if the child is absolutely
+// positioned. For performance reasons, redefine Position.cumulativeOffset for
+// KHTML/WebKit only.
+if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
+ Position.cumulativeOffset = function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == document.body)
+ if (Element.getStyle(element, 'position') == 'absolute') break;
+
+ element = element.offsetParent;
+ } while (element);
+
+ return [valueL, valueT];
+ }
+}
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/builder.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/builder.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/builder.js (revision 8165)
@@ -0,0 +1,101 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// See scriptaculous.js for full license.
+
+var Builder = {
+ NODEMAP: {
+ AREA: 'map',
+ CAPTION: 'table',
+ COL: 'table',
+ COLGROUP: 'table',
+ LEGEND: 'fieldset',
+ OPTGROUP: 'select',
+ OPTION: 'select',
+ PARAM: 'object',
+ TBODY: 'table',
+ TD: 'table',
+ TFOOT: 'table',
+ TH: 'table',
+ THEAD: 'table',
+ TR: 'table'
+ },
+ // note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
+ // due to a Firefox bug
+ node: function(elementName) {
+ elementName = elementName.toUpperCase();
+
+ // try innerHTML approach
+ var parentTag = this.NODEMAP[elementName] || 'div';
+ var parentElement = document.createElement(parentTag);
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" + elementName + ">" + elementName + ">";
+ } catch(e) {}
+ var element = parentElement.firstChild || null;
+
+ // see if browser added wrapping tags
+ if(element && (element.tagName != elementName))
+ element = element.getElementsByTagName(elementName)[0];
+
+ // fallback to createElement approach
+ if(!element) element = document.createElement(elementName);
+
+ // abort if nothing could be created
+ if(!element) return;
+
+ // attributes (or text)
+ if(arguments[1])
+ if(this._isStringOrNumber(arguments[1]) ||
+ (arguments[1] instanceof Array)) {
+ this._children(element, arguments[1]);
+ } else {
+ var attrs = this._attributes(arguments[1]);
+ if(attrs.length) {
+ try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
+ parentElement.innerHTML = "<" +elementName + " " +
+ attrs + ">" + elementName + ">";
+ } catch(e) {}
+ element = parentElement.firstChild || null;
+ // workaround firefox 1.0.X bug
+ if(!element) {
+ element = document.createElement(elementName);
+ for(attr in arguments[1])
+ element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
+ }
+ if(element.tagName != elementName)
+ element = parentElement.getElementsByTagName(elementName)[0];
+ }
+ }
+
+ // text, or array of children
+ if(arguments[2])
+ this._children(element, arguments[2]);
+
+ return element;
+ },
+ _text: function(text) {
+ return document.createTextNode(text);
+ },
+ _attributes: function(attributes) {
+ var attrs = [];
+ for(attribute in attributes)
+ attrs.push((attribute=='className' ? 'class' : attribute) +
+ '="' + attributes[attribute].toString().escapeHTML() + '"');
+ return attrs.join(" ");
+ },
+ _children: function(element, children) {
+ if(typeof children=='object') { // array can hold nodes and text
+ children.flatten().each( function(e) {
+ if(typeof e=='object')
+ element.appendChild(e)
+ else
+ if(Builder._isStringOrNumber(e))
+ element.appendChild(Builder._text(e));
+ });
+ } else
+ if(Builder._isStringOrNumber(children))
+ element.appendChild(Builder._text(children));
+ },
+ _isStringOrNumber: function(param) {
+ return(typeof param=='string' || typeof param=='number');
+ }
+}
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/window.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/window.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/window.js (revision 8165)
@@ -0,0 +1,860 @@
+// Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// VERSION 0.70
+
+var Window = Class.create();
+Window.prototype = {
+ // Constructor
+ // Available parameters : className, title, minWidth, minHeight, maxWidth, maxHeight, width, height, top, left, resizable, zIndex, opacity,
+ // hideEffect, showEffect, showEffectOptions, hideEffectOptions, effectOptions, url, relativeTo, draggable, closable, parent
+ initialize: function(id, parameters) {
+ this.hasEffectLib = String.prototype.parseColor != null
+ this.minWidth = parameters.minWidth || 100;
+ this.minHeight = parameters.minHeight || 100;
+ this.maxWidth = parameters.maxWidth;
+ this.maxHeight = parameters.maxHeight;
+ this.showEffect = parameters.showEffect || (this.hasEffectLib ? Effect.Appear : Element.show)
+ this.hideEffect = parameters.hideEffect || (this.hasEffectLib ? Effect.Fade : Element.hide)
+
+ this.showEffectOptions = parameters.showEffectOptions || parameters.effectOptions;
+ this.hideEffectOptions = parameters.hideEffectOptions || parameters.effectOptions;
+ this.draggable = parameters.draggable != null ? parameters.draggable : true;
+
+ var resizable = parameters.resizable != null ? parameters.resizable : true;
+ var closable = parameters.closable != null ? parameters.closable : true;
+ var className = parameters.className != null ? parameters.className : "dialog";
+ this.className = className;
+
+ var parent = parameters.parent || document.getElementsByTagName("body").item(0);
+
+ this.element = this.createWindow(id, className, parent, resizable, closable, parameters.title, parameters.url);
+ this.isIFrame = parameters.url != null;
+
+ // Bind event listener
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+ this.eventKeyPress = this.keyPress.bindAsEventListener(this);
+
+ this.topbar = $(this.element.id + "_top");
+ this.bottombar = $(this.element.id + "_bottom");
+
+ if (this.draggable) {
+ Event.observe(this.topbar, "mousedown", this.eventMouseDown);
+ Event.observe(this.bottombar, "mousedown", this.eventMouseDown);
+ Element.addClassName(this.bottombar, "bottom_draggable")
+ Element.addClassName(this.topbar, "top_draggable")
+ }
+
+ var offset = [0,0];
+ if (resizable) {
+ this.sizer = $(this.element.id + "_sizer");
+ Event.observe(this.sizer, "mousedown", this.eventMouseDown);
+ }
+ var width = parseFloat(parameters.width) || 200;
+ var height = parseFloat(parameters.height) || 200;
+
+ if (parameters.left != null) {
+ Element.setStyle(this.element,{left: parseFloat(parameters.left) + offset[0] + 'px'});
+ this.useLeft = true;
+ }
+
+ if (parameters.right != null) {
+ Element.setStyle(this.element,{right: parseFloat(parameters.right) + 'px'});
+ this.useLeft = false;
+ }
+
+ if (parameters.top != null) {
+ Element.setStyle(this.element,{top: parseFloat(parameters.top) + 'px'});
+ this.useTop = true;
+ }
+
+ if (parameters.bottom != null) {
+ Element.setStyle(this.element,{bottom: parseFloat(parameters.bottom) + 'px'});
+ this.useTop = false;
+ }
+
+ this.setSize(width, height);
+
+ if (parameters.opacity)
+ this.setOpacity(parameters.opacity);
+ if (parameters.zIndex)
+ this.setZIndex(parameters.zIndex)
+
+ this.destroyOnClose = false;
+
+ this._getWindowBorderSize()
+ Windows.register(this);
+ },
+
+ _getWindowBorderSize: function() {
+ // Hack to get real window border size!!
+ var div = this._createHiddenDiv(this.className + "_n")
+ this.heightN = Element.getDimensions(div).height;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.className + "_s")
+ this.heightS = Element.getDimensions(div).height;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.className + "_e")
+ this.widthE = Element.getDimensions(div).width;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.className + "_w")
+ this.widthW = Element.getDimensions(div).width;
+ div.parentNode.removeChild(div)
+ },
+
+ _createHiddenDiv: function(className) {
+ var objBody = document.getElementsByTagName("body").item(0);
+ var win = document.createElement("div");
+ win.setAttribute('id', this.element.id+ "_tmp");
+ win.className = className;
+ win.style.display = 'none'
+ win.innerHTML = ''
+ objBody.insertBefore(win, objBody.firstChild)
+ return win
+ },
+
+ // Destructor
+ destroy: function() {
+ Windows.notify("onDestroy", this);
+ Event.stopObserving(this.topbar, "mousedown", this.eventMouseDown);
+ Event.stopObserving(this.bottombar, "mousedown", this.eventMouseDown);
+ if (this.sizer)
+ Event.stopObserving(this.sizer, "mousedown", this.eventMouseDown);
+
+ var objBody = document.getElementsByTagName("body").item(0);
+ objBody.removeChild(this.element);
+
+ Windows.unregister(this);
+ },
+
+ // Sets window deleagte, should have functions: "canClose(window)"
+ setDelegate: function(delegate) {
+ this.delegate = delegate
+ },
+
+ // Gets current window delegate
+ getDelegate: function() {
+ return this.delegate;
+ },
+
+ // Gets window content
+ getContent: function () {
+ return $(this.element.id + "_content");
+ },
+
+ // Sets the content with an element id
+ setContent: function(id, autoresize, autoposition) {
+ var d = null;
+ var p = null;
+
+ if (autoresize)
+ d = Element.getDimensions(id);
+ if (autoposition)
+ p = Position.cumulativeOffset($(id));
+
+ var content = this.getContent()
+ content.appendChild($(id));
+
+ if (autoresize)
+ this.setSize(d.width, d.height);
+ if (autoposition)
+ this.setLocation(p[1] - this.heightN, p[0] - this.widthW);
+ },
+
+ setCookie: function(name, expires, path, domain, secure) {
+ name = name || this.element.id;
+ this.cookie = [name, expires, path, domain, secure];
+
+ // Get cookie
+ var value = WindowUtilities.getCookie(name)
+ // If exists
+ if (value) {
+ var values = value.split(',')
+ var x = values[0].split(':')
+ var y = values[1].split(':')
+
+ this.setSize(parseFloat(values[2]), parseFloat(values[3]));
+
+ Element.setStyle(this.element, x[0] == "l" ? {left: x[1]} : {right: x[1]});
+ Element.setStyle(this.element, y[0] == "t" ? {top: y[1]} : {bottom: y[1]});
+ }
+ },
+
+ // Gets window ID
+ getId: function() {
+ return this.element.id;
+ },
+
+ // Detroys itself when closing
+ setDestroyOnClose: function() {
+ this.destroyOnClose = true;
+ },
+
+ // initDrag event
+ initDrag: function(event) {
+ // Get pointer X,Y
+ this.pointer = [Event.pointerX(event), Event.pointerY(event)];
+ this.doResize = false;
+
+ // Check if click on close button,
+ var closeButton = $(this.getId() + '_close');
+ if (closeButton && Position.within(closeButton, this.pointer[0], this.pointer[1])) {
+ return;
+ }
+ // Check if click on sizer
+ if (this.sizer && Position.within(this.sizer, this.pointer[0], this.pointer[1])) {
+ this.doResize = true;
+ this.widthOrg = this.width;
+ this.heightOrg = this.height;
+ this.bottomOrg = parseFloat(Element.getStyle(this.element, 'bottom'));
+ this.rightOrg = parseFloat(Element.getStyle(this.element, 'right'));
+ Windows.notify("onStartResize", this);
+ }
+ else
+ Windows.notify("onStartMove", this);
+
+ // Register global event to capture mouseUp and mouseMove
+ Event.observe(document, "mouseup", this.eventMouseUp);
+ Event.observe(document, "mousemove", this.eventMouseMove);
+
+ // Add an invisible div to keep catching mouse event over the iframe
+ if (this.isIFrame) {
+ var objBody = document.getElementsByTagName("body").item(0);
+ var div = document.createElement("div");
+ div.style.position = "absolute";
+ div.style.top = this.heightN + "px";
+ div.style.bottom = this.widthW + "px";
+ div.style.zIndex = Windows.maxZIndex;
+ div.style.width = this.width + "px";
+ div.style.height = this.height + "px";
+ this.element.appendChild(div);
+ this.tmpDiv = div;
+ }
+ this.toFront();
+ Event.stop(event);
+ },
+
+ // updateDrag event
+ updateDrag: function(event) {
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var dx = pointer[0] - this.pointer[0];
+ var dy = pointer[1] - this.pointer[1];
+
+ // Resize case, update width/height
+ if (this.doResize) {
+ var width = this.widthOrg
+ var height = this.heightOrg;
+ width += dx;
+ height += dy;
+
+ this.setSize(width, height);
+
+ dx = this.width - this.widthOrg
+ dy = this.height - this.heightOrg
+
+ // Check if it's a right position, update it to keep upper-left corner at the same position
+ if (! this.useLeft)
+ Element.setStyle(this.element,{right: (this.rightOrg -dx) + 'px'});
+ // Check if it's a bottom position, update it to keep upper-left corner at the same position
+ if (! this.useTop)
+ Element.setStyle(this.element,{bottom: (this.bottomOrg -dy) + 'px'});
+ }
+ // Move case, update top/left
+ else {
+ this.pointer = pointer;
+
+ if (this.useLeft) {
+ var left = Element.getStyle(this.element, 'left');
+ left = parseFloat(left) + dx;
+ Element.setStyle(this.element,{left: left + 'px'});
+ } else {
+ var right = Element.getStyle(this.element, 'right');
+ right = parseFloat(right) - dx;
+ Element.setStyle(this.element,{right: right + 'px'});
+ }
+
+ if (this.useTop) {
+ var top = Element.getStyle(this.element, 'top');
+ top = parseFloat(top) + dy;
+ Element.setStyle(this.element,{top: top + 'px'});
+ } else {
+ var bottom = Element.getStyle(this.element, 'bottom');
+ bottom = parseFloat(bottom) - dy;
+ Element.setStyle(this.element,{bottom: bottom + 'px'});
+ }
+ }
+ if (this.iefix)
+ this._fixIEOverlapping();
+ Event.stop(event);
+ },
+
+ // endDrag callback
+ endDrag: function(event) {
+ if (this.doResize)
+ Windows.notify("onEndResize", this);
+ else
+ Windows.notify("onEndMove", this);
+
+ // Release event observing
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+
+ // Remove temporary div
+ if (this.isIFrame) {
+ this.tmpDiv.parentNode.removeChild(this.tmpDiv);
+ this.tmpDiv = null;
+ }
+ // Store new location/size
+ if (this.cookie) {
+ var value = "";
+ if (this.useLeft)
+ value += "l:" + Element.getStyle(this.element.id, 'left')
+ else
+ value += "r:" + Element.getStyle(this.element.id, 'right')
+ if (this.useTop)
+ value += ",t:" + Element.getStyle(this.element.id, 'top')
+ else
+ value += ",b:" + Element.getStyle(this.element.id, 'bottom')
+ value += "," + this.width;
+ value += "," + this.height;
+ WindowUtilities.setCookie(value, this.cookie)
+ }
+ Event.stop(event);
+ },
+
+ keyPress: function(event) {
+ //Dialog.cancelCallback();
+ },
+
+ // Creates HTML window code
+ createWindow: function(id, className, parent, resizable, closable, title, url) {
+ win = document.createElement("div");
+ win.setAttribute('id', id);
+ win.className = "dialog";
+ if (!title)
+ title = " ";
+
+ var content;
+ if (url)
+ content= "";
+ else
+ content ="
";
+
+ win.innerHTML = "\
+
\
+ \
+ ";
+ Element.hide(win);
+ parent.insertBefore(win, parent.firstChild);
+
+ if (!closable)
+ Element.hide(id +"_close")
+
+ return win;
+ },
+
+ // Sets window location
+ setLocation: function(top, left) {
+ Element.setStyle(this.element,{top: top + 'px'});
+ Element.setStyle(this.element,{left: left + 'px'});
+ },
+
+ // Sets window size
+ setSize: function(width, height) {
+ // Check min and max size
+ if (width < this.minWidth)
+ width = this.minWidth;
+
+ if (height < this.minHeight)
+ height = this.minHeight;
+
+ if (this.maxHeight && height > this.maxHeight)
+ height = this.maxHeight;
+
+ if (this.maxWidth && width > this.maxWidth)
+ width = this.maxWidth;
+
+ this.width = width;
+ this.height = height;
+
+ Element.setStyle(this.element,{width: width + 'px'});
+ Element.setStyle(this.element,{height: height + 'px'});
+
+ // Update content height
+ var content = $(this.element.id + '_content')
+ Element.setStyle(content,{height: height + 'px'});
+ Element.setStyle(content,{width: width + 'px'});
+ },
+
+ // Brings window to front
+ toFront: function() {
+ windows = document.getElementsByClassName("dialog");
+ var maxIndex= 0;
+ for (var i = 0; i0) && (navigator.userAgent.indexOf('Opera')<0) && (Element.getStyle(this.element, 'position')=='absolute')) {
+ new Insertion.After(this.element.id, '');
+ this.iefix = $(this.element.id+'_iefix');
+ }
+ if(this.iefix)
+ setTimeout(this._fixIEOverlapping.bind(this), 50);
+ },
+
+ _fixIEOverlapping: function() {
+ Position.clone(this.element, this.iefix);
+ this.iefix.style.zIndex = this.element.style.zIndex - 1;
+ Element.show(this.iefix);
+ },
+
+ setOpacity: function(opacity) {
+ if (Element.setOpacity)
+ Element.setOpacity(this.element, opacity);
+ },
+
+ setZIndex: function(zindex) {
+ Element.setStyle(this.element,{zIndex: zindex});
+ Windows.updateZindex(zindex, this);
+ }
+};
+
+// Windows containers, register all page windows
+var Windows = {
+ windows: [],
+ observers: [],
+
+ maxZIndex: 0,
+
+ addObserver: function(observer) {
+ this.observers.push(observer);
+ },
+
+ removeObserver: function(observer) {
+ this.observers = this.observers.reject( function(o) { return o==observer });
+ },
+
+ notify: function(eventName, win) { // onStartResize(), onEndResize(), onStartMove(), onEndMove(), onClose(), onDestroy()
+ this.observers.each( function(o) {if(o[eventName]) o[eventName](eventName, win);});
+ },
+
+ // Gets window from its id
+ getWindow: function(id) {
+ return this.windows.detect(function(d) { return d.getId() ==id });
+ },
+
+ // Registers a new window (called by Windows constructor)
+ register: function(win) {
+ this.windows.push(win);
+ },
+
+ // Unregisters a window (called by Windows destructor)
+ unregister: function(win) {
+ this.windows = this.windows.reject(function(d) { return d==win });
+ },
+
+ // Closes a window with its id
+ close: function(id) {
+ win = this.getWindow(id);
+ // Asks delegate if exists
+ if (win.getDelegate() && ! win.getDelegate().canClose(win))
+ return;
+
+ if (win) {
+ this.notify("onClose", win);
+ win.hide();
+ if (win.destroyOnClose)
+ win.destroy();
+ }
+ },
+
+ unsetOverflow: function(except) {
+ this.windows.each(function(d) { d.oldOverflow = Element.getStyle(d.getContent(), "overflow") || "auto" ; Element.setStyle(d.getContent(), {overflow: "hidden"}) });
+ if (except && except.oldOverflow)
+ Element.setStyle(except.getContent(), {overflow: except.oldOverflow});
+ },
+
+ resetOverflow: function() {
+ this.windows.each(function(d) { if (d.oldOverflow) Element.setStyle(d.getContent(), {overflow: d.oldOverflow}) });
+ },
+
+ updateZindex: function(zindex, win) {
+ if (zindex > this.maxZIndex)
+ this.maxZIndex = zindex;
+ }
+};
+
+var Dialog = {
+ win: null,
+
+ confirm: function(message, parameters) {
+ var okLabel = parameters && parameters.okLabel ? parameters.okLabel : "Ok";
+ var cancelLabel = parameters && parameters.cancelLabel ? parameters.cancelLabel : "Cancel";
+ var windowParam = parameters ? parameters.windowParameters : {};
+ windowParam.className = windowParam.className || "alert";
+
+ var content = "\
+ " + message + "
\
+ \
+ \
+ \
+
\
+ ";
+ return this.openDialog(content, parameters)
+ },
+
+ alert: function(message, parameters) {
+ var okLabel = parameters && parameters.okLabel ? parameters.okLabel : "Ok";
+
+ var windowParam = parameters ? parameters.windowParameters : {};
+ windowParam.className = windowParam.className || "alert";
+
+ var content = "\
+ " + message + "
\
+ \
+ \
+
\
+ ";
+ return this.openDialog(content, parameters)
+ },
+
+ openDialog: function(content, parameters) {
+ // remove old dialog
+ if (this.win)
+ this.win.destroy();
+
+ var windowParam = parameters ? parameters.windowParameters : {};
+ windowParam.resizable = windowParam.resizable || false;
+ windowParam.effectOptions = {duration: 1};
+
+ this.win = new Window('modal_dialog', windowParam);
+ this.win.getContent().innerHTML = content;
+ this.win.showCenter(true);
+
+ this.win.cancelCallback = parameters.cancel;
+ this.win.okCallback = parameters.ok;
+
+ this.eventResize = this.recenter.bindAsEventListener(this);
+ Event.observe(window, "resize", this.eventResize);
+ Event.observe(window, "scroll", this.eventResize);
+
+ return this.win;
+ },
+
+ okCallback: function() {
+ this.win.hide();
+ Event.stopObserving(window, "resize", this.eventResize);
+ Event.stopObserving(window, "scroll", this.eventResize);
+
+ if (this.win.okCallback)
+ this.win.okCallback(this.win);
+ },
+
+ cancelCallback: function() {
+ this.win.hide();
+ Event.stopObserving(window, "resize", this.eventResize);
+ Event.stopObserving(window, "scroll", this.eventResize);
+
+ if (this.win.cancelCallback)
+ this.win.cancelCallback(win);
+ },
+
+ recenter: function(event) {
+ var arrayPageSize = WindowUtilities.getPageSize();
+
+ // set height of Overlay to take up whole page and show
+ $('overlay_modal').style.height = (arrayPageSize[1] + 'px');
+
+ this.win.center();
+ }
+}
+/*
+ Based on Lightbox JS: Fullsize Image Overlays
+ by Lokesh Dhakar - http://www.huddletogether.com
+
+ For more information on this script, visit:
+ http://huddletogether.com/projects/lightbox/
+
+ Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
+ (basically, do anything you want, just leave my name and link)
+*/
+
+var isIE = navigator.appVersion.match(/MSIE/) == "MSIE";
+
+//
+// getPageScroll()
+// Returns array with x,y page scroll values.
+// Core code from - quirksmode.org
+//
+var WindowUtilities = {
+ getPageScroll :function() {
+ var yScroll;
+
+ if (self.pageYOffset) {
+ yScroll = self.pageYOffset;
+ } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
+ yScroll = document.documentElement.scrollTop;
+ } else if (document.body) {// all other Explorers
+ yScroll = document.body.scrollTop;
+ }
+
+ arrayPageScroll = new Array('',yScroll)
+ return arrayPageScroll;
+ },
+
+ // getPageSize()
+ // Returns array with page width, height and window width, height
+ // Core code from - quirksmode.org
+ // Edit for Firefox by pHaez
+ getPageSize: function(){
+ var xScroll, yScroll;
+
+ if (window.innerHeight && window.scrollMaxY) {
+ xScroll = document.body.scrollWidth;
+ yScroll = window.innerHeight + window.scrollMaxY;
+ } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
+ xScroll = document.body.scrollWidth;
+ yScroll = document.body.scrollHeight;
+ } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+ xScroll = document.body.offsetWidth;
+ yScroll = document.body.offsetHeight;
+ }
+
+ var windowWidth, windowHeight;
+ if (self.innerHeight) { // all except Explorer
+ windowWidth = self.innerWidth;
+ windowHeight = self.innerHeight;
+ } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
+ windowWidth = document.documentElement.clientWidth;
+ windowHeight = document.documentElement.clientHeight;
+ } else if (document.body) { // other Explorers
+ windowWidth = document.body.clientWidth;
+ windowHeight = document.body.clientHeight;
+ }
+
+ // for small pages with total height less then height of the viewport
+ if(yScroll < windowHeight){
+ pageHeight = windowHeight;
+ } else {
+ pageHeight = yScroll;
+ }
+
+ // for small pages with total width less then width of the viewport
+ if(xScroll < windowWidth){
+ pageWidth = windowWidth;
+ } else {
+ pageWidth = xScroll;
+ }
+
+ arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
+ return arrayPageSize;
+ },
+
+ disableScreen: function(className) {
+ WindowUtilities.initLightbox(className);
+ var objBody = document.getElementsByTagName("body").item(0);
+
+ // prep objects
+ var objOverlay = $('overlay_modal');
+
+ var arrayPageSize = WindowUtilities.getPageSize();
+
+ // Hide select boxes as they will 'peek' through the image in IE
+ if (isIE) {
+ selects = document.getElementsByTagName("select");
+ for (var i = 0; i != selects.length; i++) {
+ selects[i].style.visibility = "hidden";
+ }
+ }
+
+ // set height of Overlay to take up whole page and show
+ objOverlay.style.height = (arrayPageSize[1] + 'px');
+ objOverlay.style.display = 'block';
+ },
+
+ enableScreen: function() {
+ var objOverlay = $('overlay_modal');
+ if (objOverlay) {
+ // hide lightbox and overlay
+ objOverlay.style.display = 'none';
+
+ // make select boxes visible
+ if (isIE) {
+ selects = document.getElementsByTagName("select");
+ for (var i = 0; i != selects.length; i++) {
+ selects[i].style.visibility = "visible";
+ }
+ }
+ objOverlay.parentNode.removeChild(objOverlay);
+ }
+ },
+
+ // initLightbox()
+ // Function runs on window load, going through link tags looking for rel="lightbox".
+ // These links receive onclick events that enable the lightbox display for their targets.
+ // The function also inserts html markup at the top of the page which will be used as a
+ // container for the overlay pattern and the inline image.
+ initLightbox: function(className) {
+ // Already done, just update zIndex
+ if ($('overlay_modal')) {
+ Element.setStyle('overlay_modal', {zIndex: Windows.maxZIndex + 10});
+ }
+ // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
+ else {
+ var objBody = document.getElementsByTagName("body").item(0);
+ var objOverlay = document.createElement("div");
+ objOverlay.setAttribute('id', 'overlay_modal');
+ objOverlay.className = "overlay_" + className
+ objOverlay.style.display = 'none';
+ objOverlay.style.position = 'absolute';
+ objOverlay.style.top = '0';
+ objOverlay.style.left = '0';
+ objOverlay.style.zIndex = Windows.maxZIndex + 10;
+ objOverlay.style.width = '100%';
+
+ objBody.insertBefore(objOverlay, objBody.firstChild);
+ }
+ },
+
+ setCookie: function(value, parameters) {
+ document.cookie= parameters[0] + "=" + escape(value) +
+ ((parameters[1]) ? "; expires=" + parameters[1].toGMTString() : "") +
+ ((parameters[2]) ? "; path=" + parameters[2] : "") +
+ ((parameters[3]) ? "; domain=" + parameters[3] : "") +
+ ((parameters[4]) ? "; secure" : "");
+ },
+
+ getCookie: function(name) {
+ var dc = document.cookie;
+ var prefix = name + "=";
+ var begin = dc.indexOf("; " + prefix);
+ if (begin == -1) {
+ begin = dc.indexOf(prefix);
+ if (begin != 0) return null;
+ } else {
+ begin += 2;
+ }
+ var end = document.cookie.indexOf(";", begin);
+ if (end == -1) {
+ end = dc.length;
+ }
+ return unescape(dc.substring(begin + prefix.length, end));
+ }
+}
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/wz_tooltip.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/wz_tooltip.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/wz_tooltip.js (revision 8165)
@@ -0,0 +1,1239 @@
+/* This notice must be untouched at all times.
+Copyright (c) 2002-2008 Walter Zorn. All rights reserved.
+
+wz_tooltip.js v. 5.01
+
+The latest version is available at
+http://www.walterzorn.com
+or http://www.devira.com
+or http://www.walterzorn.de
+
+Created 1.12.2002 by Walter Zorn (Web: http://www.walterzorn.com )
+Last modified: 26.3.2008
+
+Easy-to-use cross-browser tooltips.
+Just include the script at the beginning of the section, and invoke
+Tip('Tooltip text') from the desired HTML onmouseover eventhandlers,
+and UnTip(), usually from the onmouseout eventhandlers, to hide the tip.
+No container DIV required.
+By default, width and height of tooltips are automatically adapted to content.
+Is even capable of dynamically converting arbitrary HTML elements to tooltips
+by calling TagToTip('ID_of_HTML_element_to_be_converted') instead of Tip(),
+which means you can put important, search-engine-relevant stuff into tooltips.
+Appearance of tooltips can be individually configured
+via commands passed to Tip() or TagToTip().
+
+Tab Width: 4
+LICENSE: LGPL
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License (LGPL) 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.
+
+For more details on the GNU Lesser General Public License,
+see http://www.gnu.org/copyleft/lesser.html
+*/
+
+var config = new Object();
+
+
+//=================== GLOBAL TOOPTIP CONFIGURATION =========================//
+var tt_Debug = true // false or true - recommended: false once you release your page to the public
+var tt_Enabled = true // Allows to (temporarily) suppress tooltips, e.g. by providing the user with a button that sets this global variable to false
+var TagsToTip = true // false or true - if true, HTML elements to be converted to tooltips via TagToTip() are automatically hidden;
+ // if false, you should hide those HTML elements yourself
+
+// For each of the following config variables there exists a command, which is
+// just the variablename in uppercase, to be passed to Tip() or TagToTip() to
+// configure tooltips individually. Individual commands override global
+// configuration. Order of commands is arbitrary.
+// Example: onmouseover="Tip('Tooltip text', LEFT, true, BGCOLOR, '#FF9900', FADEIN, 400)"
+
+config. Above = false // false or true - tooltip above mousepointer
+config. BgColor = '#E2E7FF' // Background colour (HTML colour value, in quotes)
+config. BgImg = '' // Path to background image, none if empty string ''
+config. BorderColor = '#003099'
+config. BorderStyle = 'solid' // Any permitted CSS value, but I recommend 'solid', 'dotted' or 'dashed'
+config. BorderWidth = 1
+config. CenterMouse = false // false or true - center the tip horizontally below (or above) the mousepointer
+config. ClickClose = false // false or true - close tooltip if the user clicks somewhere
+config. ClickSticky = false // false or true - make tooltip sticky if user left-clicks on the hovered element while the tooltip is active
+config. CloseBtn = false // false or true - closebutton in titlebar
+config. CloseBtnColors = ['#990000', '#FFFFFF', '#DD3333', '#FFFFFF'] // [Background, text, hovered background, hovered text] - use empty strings '' to inherit title colours
+config. CloseBtnText = ' X ' // Close button text (may also be an image tag)
+config. CopyContent = true // When converting a HTML element to a tooltip, copy only the element's content, rather than converting the element by its own
+config. Delay = 400 // Time span in ms until tooltip shows up
+config. Duration = 0 // Time span in ms after which the tooltip disappears; 0 for infinite duration, < 0 for delay in ms _after_ the onmouseout until the tooltip disappears
+config. FadeIn = 0 // Fade-in duration in ms, e.g. 400; 0 for no animation
+config. FadeOut = 0
+config. FadeInterval = 30 // Duration of each fade step in ms (recommended: 30) - shorter is smoother but causes more CPU-load
+config. Fix = null // Fixated position - x- an y-oordinates in brackets, e.g. [210, 480], or null for no fixation
+config. FollowMouse = true // false or true - tooltip follows the mouse
+config. FontColor = '#000044'
+config. FontFace = 'Verdana,Geneva,sans-serif'
+config. FontSize = '8pt' // E.g. '9pt' or '12px' - unit is mandatory
+config. FontWeight = 'normal' // 'normal' or 'bold';
+config. Height = 0 // Tooltip height; 0 for automatic adaption to tooltip content, < 0 (e.g. -100) for a maximum for automatic adaption
+config. JumpHorz = false // false or true - jump horizontally to other side of mouse if tooltip would extend past clientarea boundary
+config. JumpVert = true // false or true - jump vertically "
+config. Left = false // false or true - tooltip on the left of the mouse
+config. OffsetX = 14 // Horizontal offset of left-top corner from mousepointer
+config. OffsetY = 8 // Vertical offset
+config. Opacity = 100 // Integer between 0 and 100 - opacity of tooltip in percent
+config. Padding = 3 // Spacing between border and content
+config. Shadow = false // false or true
+config. ShadowColor = '#C0C0C0'
+config. ShadowWidth = 5
+config. Sticky = false // false or true - fixate tip, ie. don't follow the mouse and don't hide on mouseout
+config. TextAlign = 'left' // 'left', 'right' or 'justify'
+config. Title = '' // Default title text applied to all tips (no default title: empty string '')
+config. TitleAlign = 'left' // 'left' or 'right' - text alignment inside the title bar
+config. TitleBgColor = '' // If empty string '', BorderColor will be used
+config. TitleFontColor = '#FFFFFF' // Color of title text - if '', BgColor (of tooltip body) will be used
+config. TitleFontFace = '' // If '' use FontFace (boldified)
+config. TitleFontSize = '' // If '' use FontSize
+config. Width = 0 // Tooltip width; 0 for automatic adaption to tooltip content; < -1 (e.g. -240) for a maximum width for that automatic adaption;
+ // -1: tooltip width confined to the width required for the titlebar
+//======= END OF TOOLTIP CONFIG, DO NOT CHANGE ANYTHING BELOW ==============//
+
+
+
+
+//===================== PUBLIC =============================================//
+function Tip()
+{
+ tt_Tip(arguments, null);
+}
+function TagToTip()
+{
+ var t2t = tt_GetElt(arguments[0]);
+ if(t2t)
+ tt_Tip(arguments, t2t);
+}
+function UnTip()
+{
+ tt_OpReHref();
+ if(tt_aV[DURATION] < 0)
+ tt_tDurt.Timer("tt_HideInit()", -tt_aV[DURATION], true);
+ else if(!(tt_aV[STICKY] && (tt_iState & 0x2)))
+ tt_HideInit();
+}
+
+//================== PUBLIC PLUGIN API =====================================//
+// Extension eventhandlers currently supported:
+// OnLoadConfig, OnCreateContentString, OnSubDivsCreated, OnShow, OnMoveBefore,
+// OnMoveAfter, OnHideInit, OnHide, OnKill
+
+var tt_aElt = new Array(10), // Container DIV, outer title & body DIVs, inner title & body TDs, closebutton SPAN, shadow DIVs, and IFRAME to cover windowed elements in IE
+tt_aV = new Array(), // Caches and enumerates config data for currently active tooltip
+tt_sContent, // Inner tooltip text or HTML
+tt_scrlX = 0, tt_scrlY = 0,
+tt_musX, tt_musY,
+tt_over,
+tt_x, tt_y, tt_w, tt_h; // Position, width and height of currently displayed tooltip
+
+function tt_Extension()
+{
+ tt_ExtCmdEnum();
+ tt_aExt[tt_aExt.length] = this;
+ return this;
+}
+function tt_SetTipPos(x, y)
+{
+ var css = tt_aElt[0].style;
+
+ tt_x = x;
+ tt_y = y;
+ css.left = x + "px";
+ css.top = y + "px";
+ if(tt_ie56)
+ {
+ var ifrm = tt_aElt[tt_aElt.length - 1];
+ if(ifrm)
+ {
+ ifrm.style.left = css.left;
+ ifrm.style.top = css.top;
+ }
+ }
+}
+function tt_HideInit()
+{
+ if(tt_iState)
+ {
+ tt_ExtCallFncs(0, "HideInit");
+ tt_iState &= ~0x4;
+ if(tt_flagOpa && tt_aV[FADEOUT])
+ {
+ tt_tFade.EndTimer();
+ if(tt_opa)
+ {
+ var n = Math.round(tt_aV[FADEOUT] / (tt_aV[FADEINTERVAL] * (tt_aV[OPACITY] / tt_opa)));
+ tt_Fade(tt_opa, tt_opa, 0, n);
+ return;
+ }
+ }
+ tt_tHide.Timer("tt_Hide();", 1, false);
+ }
+}
+function tt_Hide()
+{
+ if(tt_db && tt_iState)
+ {
+ tt_OpReHref();
+ if(tt_iState & 0x2)
+ {
+ tt_aElt[0].style.visibility = "hidden";
+ tt_ExtCallFncs(0, "Hide");
+ }
+ tt_tShow.EndTimer();
+ tt_tHide.EndTimer();
+ tt_tDurt.EndTimer();
+ tt_tFade.EndTimer();
+ if(!tt_op && !tt_ie)
+ {
+ tt_tWaitMov.EndTimer();
+ tt_bWait = false;
+ }
+ if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY])
+ tt_RemEvtFnc(document, "mouseup", tt_OnLClick);
+ tt_ExtCallFncs(0, "Kill");
+ // In case of a TagToTip tooltip, hide converted DOM node and
+ // re-insert it into document
+ if(tt_t2t && !tt_aV[COPYCONTENT])
+ {
+ tt_t2t.style.display = "none";
+ tt_MovDomNode(tt_t2t, tt_aElt[6], tt_t2tDad);
+ }
+ tt_iState = 0;
+ tt_over = null;
+ tt_ResetMainDiv();
+ if(tt_aElt[tt_aElt.length - 1])
+ tt_aElt[tt_aElt.length - 1].style.display = "none";
+ }
+}
+function tt_GetElt(id)
+{
+ return(document.getElementById ? document.getElementById(id)
+ : document.all ? document.all[id]
+ : null);
+}
+function tt_GetDivW(el)
+{
+ return(el ? (el.offsetWidth || el.style.pixelWidth || 0) : 0);
+}
+function tt_GetDivH(el)
+{
+ return(el ? (el.offsetHeight || el.style.pixelHeight || 0) : 0);
+}
+function tt_GetScrollX()
+{
+ return(window.pageXOffset || (tt_db ? (tt_db.scrollLeft || 0) : 0));
+}
+function tt_GetScrollY()
+{
+ return(window.pageYOffset || (tt_db ? (tt_db.scrollTop || 0) : 0));
+}
+function tt_GetClientW()
+{
+ return(document.body && (typeof(document.body.clientWidth) != tt_u) ? document.body.clientWidth
+ : (typeof(window.innerWidth) != tt_u) ? window.innerWidth
+ : tt_db ? (tt_db.clientWidth || 0)
+ : 0);
+}
+function tt_GetClientH()
+{
+ // Exactly this order seems to yield correct values in all major browsers
+ return(document.body && (typeof(document.body.clientHeight) != tt_u) ? document.body.clientHeight
+ : (typeof(window.innerHeight) != tt_u) ? window.innerHeight
+ : tt_db ? (tt_db.clientHeight || 0)
+ : 0);
+}
+function tt_GetEvtX(e)
+{
+ return (e ? ((typeof(e.pageX) != tt_u) ? e.pageX : (e.clientX + tt_scrlX)) : 0);
+}
+function tt_GetEvtY(e)
+{
+ return (e ? ((typeof(e.pageY) != tt_u) ? e.pageY : (e.clientY + tt_scrlY)) : 0);
+}
+function tt_AddEvtFnc(el, sEvt, PFnc)
+{
+ if(el)
+ {
+ if(el.addEventListener)
+ el.addEventListener(sEvt, PFnc, false);
+ else
+ el.attachEvent("on" + sEvt, PFnc);
+ }
+}
+function tt_RemEvtFnc(el, sEvt, PFnc)
+{
+ if(el)
+ {
+ if(el.removeEventListener)
+ el.removeEventListener(sEvt, PFnc, false);
+ else
+ el.detachEvent("on" + sEvt, PFnc);
+ }
+}
+
+//====================== PRIVATE ===========================================//
+var tt_aExt = new Array(), // Array of extension objects
+
+tt_db, tt_op, tt_ie, tt_ie56, tt_bBoxOld, // Browser flags
+tt_body,
+tt_ovr_, // HTML element the mouse is currently over
+tt_flagOpa, // Opacity support: 1=IE, 2=Khtml, 3=KHTML, 4=Moz, 5=W3C
+tt_maxPosX, tt_maxPosY,
+tt_iState = 0, // Tooltip active |= 1, shown |= 2, move with mouse |= 4
+tt_opa, // Currently applied opacity
+tt_bJmpVert, tt_bJmpHorz,// Tip temporarily on other side of mouse
+tt_t2t, tt_t2tDad, // Tag converted to tip, and its parent element in the document
+tt_elDeHref, // The tag from which we've removed the href attribute
+// Timer
+tt_tShow = new Number(0), tt_tHide = new Number(0), tt_tDurt = new Number(0),
+tt_tFade = new Number(0), tt_tWaitMov = new Number(0),
+tt_bWait = false,
+tt_u = "undefined";
+
+
+function tt_Init()
+{
+ tt_MkCmdEnum();
+ // Send old browsers instantly to hell
+ if(!tt_Browser() || !tt_MkMainDiv())
+ return;
+ tt_IsW3cBox();
+ tt_OpaSupport();
+ tt_AddEvtFnc(window, "scroll", tt_OnScrl);
+ // IE doesn't fire onscroll event when switching to fullscreen;
+ // fix suggested by Yoav Karpeles 14.2.2008
+ tt_AddEvtFnc(window, "resize", tt_OnScrl);
+ tt_AddEvtFnc(document, "mousemove", tt_Move);
+ // In Debug mode we search for TagToTip() calls in order to notify
+ // the user if they've forgotten to set the TagsToTip config flag
+ if(TagsToTip || tt_Debug)
+ tt_SetOnloadFnc();
+ // Ensure the tip be hidden when the page unloads
+ tt_AddEvtFnc(window, "unload", tt_Hide);
+}
+// Creates command names by translating config variable names to upper case
+function tt_MkCmdEnum()
+{
+ var n = 0;
+ for(var i in config)
+ eval("window." + i.toString().toUpperCase() + " = " + n++);
+ tt_aV.length = n;
+}
+function tt_Browser()
+{
+ var n, nv, n6, w3c;
+
+ n = navigator.userAgent.toLowerCase(),
+ nv = navigator.appVersion;
+ tt_op = (document.defaultView && typeof(eval("w" + "indow" + "." + "o" + "p" + "er" + "a")) != tt_u);
+ tt_ie = n.indexOf("msie") != -1 && document.all && !tt_op;
+ if(tt_ie)
+ {
+ var ieOld = (!document.compatMode || document.compatMode == "BackCompat");
+ tt_db = !ieOld ? document.documentElement : (document.body || null);
+ if(tt_db)
+ tt_ie56 = parseFloat(nv.substring(nv.indexOf("MSIE") + 5)) >= 5.5
+ && typeof document.body.style.maxHeight == tt_u;
+ }
+ else
+ {
+ tt_db = document.documentElement || document.body ||
+ (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
+ : null);
+ if(!tt_op)
+ {
+ n6 = document.defaultView && typeof document.defaultView.getComputedStyle != tt_u;
+ w3c = !n6 && document.getElementById;
+ }
+ }
+ tt_body = (document.getElementsByTagName ? document.getElementsByTagName("body")[0]
+ : (document.body || null));
+ if(tt_ie || n6 || tt_op || w3c)
+ {
+ if(tt_body && tt_db)
+ {
+ if(document.attachEvent || document.addEventListener)
+ return true;
+ }
+ else
+ tt_Err("wz_tooltip.js must be included INSIDE the body section,"
+ + " immediately after the opening tag.", false);
+ }
+ tt_db = null;
+ return false;
+}
+function tt_MkMainDiv()
+{
+ // Create the tooltip DIV
+ if(tt_body.insertAdjacentHTML)
+ tt_body.insertAdjacentHTML("afterBegin", tt_MkMainDivHtm());
+ else if(typeof tt_body.innerHTML != tt_u && document.createElement && tt_body.appendChild)
+ tt_body.appendChild(tt_MkMainDivDom());
+ if(window.tt_GetMainDivRefs /* FireFox Alzheimer */ && tt_GetMainDivRefs())
+ return true;
+ tt_db = null;
+ return false;
+}
+function tt_MkMainDivHtm()
+{
+ return('
' +
+ (tt_ie56 ? ('')
+ : ''));
+}
+function tt_MkMainDivDom()
+{
+ var el = document.createElement("div");
+ if(el)
+ el.id = "WzTtDiV";
+ return el;
+}
+function tt_GetMainDivRefs()
+{
+ tt_aElt[0] = tt_GetElt("WzTtDiV");
+ if(tt_ie56 && tt_aElt[0])
+ {
+ tt_aElt[tt_aElt.length - 1] = tt_GetElt("WzTtIfRm");
+ if(!tt_aElt[tt_aElt.length - 1])
+ tt_aElt[0] = null;
+ }
+ if(tt_aElt[0])
+ {
+ var css = tt_aElt[0].style;
+
+ css.visibility = "hidden";
+ css.position = "absolute";
+ css.overflow = "hidden";
+ return true;
+ }
+ return false;
+}
+function tt_ResetMainDiv()
+{
+ var w = (window.screen && screen.width) ? screen.width : 10000;
+
+ tt_SetTipPos(-w, 0);
+ tt_aElt[0].innerHTML = "";
+ tt_aElt[0].style.width = (w - 1) + "px";
+ tt_h = 0;
+}
+function tt_IsW3cBox()
+{
+ var css = tt_aElt[0].style;
+
+ css.padding = "10px";
+ css.width = "40px";
+ tt_bBoxOld = (tt_GetDivW(tt_aElt[0]) == 40);
+ css.padding = "0px";
+ tt_ResetMainDiv();
+}
+function tt_OpaSupport()
+{
+ var css = tt_body.style;
+
+ tt_flagOpa = (typeof(css.filter) != tt_u) ? 1
+ : (typeof(css.KhtmlOpacity) != tt_u) ? 2
+ : (typeof(css.KHTMLOpacity) != tt_u) ? 3
+ : (typeof(css.MozOpacity) != tt_u) ? 4
+ : (typeof(css.opacity) != tt_u) ? 5
+ : 0;
+}
+// Ported from http://dean.edwards.name/weblog/2006/06/again/
+// (Dean Edwards et al.)
+function tt_SetOnloadFnc()
+{
+ tt_AddEvtFnc(document, "DOMContentLoaded", tt_HideSrcTags);
+ tt_AddEvtFnc(window, "load", tt_HideSrcTags);
+ if(tt_body.attachEvent)
+ tt_body.attachEvent("onreadystatechange",
+ function() {
+ if(tt_body.readyState == "complete")
+ tt_HideSrcTags();
+ } );
+ if(/WebKit|KHTML/i.test(navigator.userAgent))
+ {
+ var t = setInterval(function() {
+ if(/loaded|complete/.test(document.readyState))
+ {
+ clearInterval(t);
+ tt_HideSrcTags();
+ }
+ }, 10);
+ }
+}
+function tt_HideSrcTags()
+{
+ if(!window.tt_HideSrcTags || window.tt_HideSrcTags.done)
+ return;
+ window.tt_HideSrcTags.done = true;
+ if(!tt_HideSrcTagsRecurs(tt_body))
+ tt_Err("There are HTML elements to be converted to tooltips.\nIf you"
+ + " want these HTML elements to be automatically hidden, you"
+ + " must edit wz_tooltip.js, and set TagsToTip in the global"
+ + " tooltip configuration to true.", true);
+}
+function tt_HideSrcTagsRecurs(dad)
+{
+ var ovr, asT2t;
+ // Walk the DOM tree for tags that have an onmouseover or onclick attribute
+ // containing a TagToTip('...') call.
+ // (.childNodes first since .children is bugous in Safari)
+ var a = dad.childNodes || dad.children || null;
+
+ for(var i = a ? a.length : 0; i;)
+ {--i;
+ if(!tt_HideSrcTagsRecurs(a[i]))
+ return false;
+ ovr = a[i].getAttribute ? (a[i].getAttribute("onmouseover") || a[i].getAttribute("onclick"))
+ : (typeof a[i].onmouseover == "function") ? (a[i].onmouseover || a[i].onclick)
+ : null;
+ if(ovr)
+ {
+ asT2t = ovr.toString().match(/TagToTip\s*\(\s*'[^'.]+'\s*[\),]/);
+ if(asT2t && asT2t.length)
+ {
+ if(!tt_HideSrcTag(asT2t[0]))
+ return false;
+ }
+ }
+ }
+ return true;
+}
+function tt_HideSrcTag(sT2t)
+{
+ var id, el;
+
+ // The ID passed to the found TagToTip() call identifies an HTML element
+ // to be converted to a tooltip, so hide that element
+ id = sT2t.replace(/.+'([^'.]+)'.+/, "$1");
+ el = tt_GetElt(id);
+ if(el)
+ {
+ if(tt_Debug && !TagsToTip)
+ return false;
+ else
+ el.style.display = "none";
+ }
+ else
+ tt_Err("Invalid ID\n'" + id + "'\npassed to TagToTip()."
+ + " There exists no HTML element with that ID.", true);
+ return true;
+}
+function tt_Tip(arg, t2t)
+{
+ if(!tt_db)
+ return;
+ if(tt_iState)
+ tt_Hide();
+ if(!tt_Enabled)
+ return;
+ tt_t2t = t2t;
+ if(!tt_ReadCmds(arg))
+ return;
+ tt_iState = 0x1 | 0x4;
+ tt_AdaptConfig1();
+ tt_MkTipContent(arg);
+ tt_MkTipSubDivs();
+ tt_FormatTip();
+ tt_bJmpVert = false;
+ tt_bJmpHorz = false;
+ tt_maxPosX = tt_GetClientW() + tt_scrlX - tt_w - 1;
+ tt_maxPosY = tt_GetClientH() + tt_scrlY - tt_h - 1;
+ tt_AdaptConfig2();
+ // Ensure the tip be shown and positioned before the first onmousemove
+ tt_OverInit();
+ tt_ShowInit();
+ tt_Move();
+}
+function tt_ReadCmds(a)
+{
+ var i;
+
+ // First load the global config values, to initialize also values
+ // for which no command is passed
+ i = 0;
+ for(var j in config)
+ tt_aV[i++] = config[j];
+ // Then replace each cached config value for which a command is
+ // passed (ensure the # of command args plus value args be even)
+ if(a.length & 1)
+ {
+ for(i = a.length - 1; i > 0; i -= 2)
+ tt_aV[a[i - 1]] = a[i];
+ return true;
+ }
+ tt_Err("Incorrect call of Tip() or TagToTip().\n"
+ + "Each command must be followed by a value.", true);
+ return false;
+}
+function tt_AdaptConfig1()
+{
+ tt_ExtCallFncs(0, "LoadConfig");
+ // Inherit unspecified title formattings from body
+ if(!tt_aV[TITLEBGCOLOR].length)
+ tt_aV[TITLEBGCOLOR] = tt_aV[BORDERCOLOR];
+ if(!tt_aV[TITLEFONTCOLOR].length)
+ tt_aV[TITLEFONTCOLOR] = tt_aV[BGCOLOR];
+ if(!tt_aV[TITLEFONTFACE].length)
+ tt_aV[TITLEFONTFACE] = tt_aV[FONTFACE];
+ if(!tt_aV[TITLEFONTSIZE].length)
+ tt_aV[TITLEFONTSIZE] = tt_aV[FONTSIZE];
+ if(tt_aV[CLOSEBTN])
+ {
+ // Use title colours for non-specified closebutton colours
+ if(!tt_aV[CLOSEBTNCOLORS])
+ tt_aV[CLOSEBTNCOLORS] = new Array("", "", "", "");
+ for(var i = 4; i;)
+ {--i;
+ if(!tt_aV[CLOSEBTNCOLORS][i].length)
+ tt_aV[CLOSEBTNCOLORS][i] = (i & 1) ? tt_aV[TITLEFONTCOLOR] : tt_aV[TITLEBGCOLOR];
+ }
+ // Enforce titlebar be shown
+ if(!tt_aV[TITLE].length)
+ tt_aV[TITLE] = " ";
+ }
+ // Circumvents broken display of images and fade-in flicker in Geckos < 1.8
+ if(tt_aV[OPACITY] == 100 && typeof tt_aElt[0].style.MozOpacity != tt_u && !Array.every)
+ tt_aV[OPACITY] = 99;
+ // Smartly shorten the delay for fade-in tooltips
+ if(tt_aV[FADEIN] && tt_flagOpa && tt_aV[DELAY] > 100)
+ tt_aV[DELAY] = Math.max(tt_aV[DELAY] - tt_aV[FADEIN], 100);
+}
+function tt_AdaptConfig2()
+{
+ if(tt_aV[CENTERMOUSE])
+ {
+ tt_aV[OFFSETX] -= ((tt_w - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0)) >> 1);
+ tt_aV[JUMPHORZ] = false;
+ }
+}
+// Expose content globally so extensions can modify it
+function tt_MkTipContent(a)
+{
+ if(tt_t2t)
+ {
+ if(tt_aV[COPYCONTENT])
+ tt_sContent = tt_t2t.innerHTML;
+ else
+ tt_sContent = "";
+ }
+ else
+ tt_sContent = a[0];
+ tt_ExtCallFncs(0, "CreateContentString");
+}
+function tt_MkTipSubDivs()
+{
+ var sCss = 'position:relative;margin:0px;padding:0px;border-width:0px;left:0px;top:0px;line-height:normal;width:auto;',
+ sTbTrTd = ' cellspacing="0" cellpadding="0" border="0" style="' + sCss + '">'
+ + ''
+ + tt_aV[TITLE]
+ + ''
+ + (tt_aV[CLOSEBTN] ?
+ (''
+ + ''
+ + tt_aV[CLOSEBTNTEXT]
+ + ' ')
+ : '')
+ + '
')
+ : '')
+ + ''
+ + (tt_aV[SHADOW]
+ ? ('
'
+ + '
')
+ : '')
+ );
+ tt_GetSubDivRefs();
+ // Convert DOM node to tip
+ if(tt_t2t && !tt_aV[COPYCONTENT])
+ {
+ // Store the tag's parent element so we can restore that DOM branch
+ // once the tooltip is hidden
+ tt_t2tDad = tt_t2t.parentNode || tt_t2t.parentElement || tt_t2t.offsetParent || null;
+ if(tt_t2tDad)
+ {
+ tt_MovDomNode(tt_t2t, tt_t2tDad, tt_aElt[6]);
+ tt_t2t.style.display = "block";
+ }
+ }
+ tt_ExtCallFncs(0, "SubDivsCreated");
+}
+function tt_GetSubDivRefs()
+{
+ var aId = new Array("WzTiTl", "WzTiTlTb", "WzTiTlI", "WzClOsE", "WzBoDy", "WzBoDyI", "WzTtShDwB", "WzTtShDwR");
+
+ for(var i = aId.length; i; --i)
+ tt_aElt[i] = tt_GetElt(aId[i - 1]);
+}
+function tt_FormatTip()
+{
+ var css, w, h, iOffY, iOffSh,
+ iAdd = (tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1;
+
+ //--------- Title DIV ----------
+ if(tt_aV[TITLE].length)
+ {
+ css = tt_aElt[1].style;
+ css.background = tt_aV[TITLEBGCOLOR];
+ css.paddingTop = (tt_aV[CLOSEBTN] ? 2 : 0) + "px";
+ css.paddingBottom = "1px";
+ css.paddingLeft = css.paddingRight = tt_aV[PADDING] + "px";
+ css = tt_aElt[3].style;
+ css.color = tt_aV[TITLEFONTCOLOR];
+ if (tt_aV[WIDTH] == -1)
+ css.whiteSpace = "nowrap";
+ css.fontFamily = tt_aV[TITLEFONTFACE];
+ css.fontSize = tt_aV[TITLEFONTSIZE];
+ css.fontWeight = "bold";
+ css.textAlign = tt_aV[TITLEALIGN];
+ // Close button DIV
+ if(tt_aElt[4])
+ {
+ css.paddingRight = (tt_aV[PADDING] << 1) + "px";
+ css = tt_aElt[4].style;
+ css.background = tt_aV[CLOSEBTNCOLORS][0];
+ css.color = tt_aV[CLOSEBTNCOLORS][1];
+ css.fontFamily = tt_aV[TITLEFONTFACE];
+ css.fontSize = tt_aV[TITLEFONTSIZE];
+ css.fontWeight = "bold";
+ }
+ if(tt_aV[WIDTH] > 0)
+ tt_w = tt_aV[WIDTH];
+ else
+ {
+ tt_w = tt_GetDivW(tt_aElt[3]) + tt_GetDivW(tt_aElt[4]);
+ // Some spacing between title DIV and closebutton
+ if(tt_aElt[4])
+ tt_w += tt_aV[PADDING];
+ // Restrict auto width to max width
+ if(tt_aV[WIDTH] < -1 && tt_w > -tt_aV[WIDTH])
+ tt_w = -tt_aV[WIDTH];
+ }
+ // Ensure the top border of the body DIV be covered by the title DIV
+ iOffY = -tt_aV[BORDERWIDTH];
+ }
+ else
+ {
+ tt_w = 0;
+ iOffY = 0;
+ }
+
+ //-------- Body DIV ------------
+ css = tt_aElt[5].style;
+ css.top = iOffY + "px";
+ if(tt_aV[BORDERWIDTH])
+ {
+ css.borderColor = tt_aV[BORDERCOLOR];
+ css.borderStyle = tt_aV[BORDERSTYLE];
+ css.borderWidth = tt_aV[BORDERWIDTH] + "px";
+ }
+ if(tt_aV[BGCOLOR].length)
+ css.background = tt_aV[BGCOLOR];
+ if(tt_aV[BGIMG].length)
+ css.backgroundImage = "url(" + tt_aV[BGIMG] + ")";
+ css.padding = tt_aV[PADDING] + "px";
+ css.textAlign = tt_aV[TEXTALIGN];
+ if(tt_aV[HEIGHT])
+ {
+ css.overflow = "auto";
+ if(tt_aV[HEIGHT] > 0)
+ css.height = (tt_aV[HEIGHT] + iAdd) + "px";
+ else
+ tt_h = iAdd - tt_aV[HEIGHT];
+ }
+ // TD inside body DIV
+ css = tt_aElt[6].style;
+ css.color = tt_aV[FONTCOLOR];
+ css.fontFamily = tt_aV[FONTFACE];
+ css.fontSize = tt_aV[FONTSIZE];
+ css.fontWeight = tt_aV[FONTWEIGHT];
+ css.background = "";
+ css.textAlign = tt_aV[TEXTALIGN];
+ if(tt_aV[WIDTH] > 0)
+ w = tt_aV[WIDTH];
+ // Width like title (if existent)
+ else if(tt_aV[WIDTH] == -1 && tt_w)
+ w = tt_w;
+ else
+ {
+ // Measure width of the body's inner TD, as some browsers would expand
+ // the container and outer body DIV to 100%
+ w = tt_GetDivW(tt_aElt[6]);
+ // Restrict auto width to max width
+ if(tt_aV[WIDTH] < -1 && w > -tt_aV[WIDTH])
+ w = -tt_aV[WIDTH];
+ }
+ if(w > tt_w)
+ tt_w = w;
+ tt_w += iAdd;
+
+ //--------- Shadow DIVs ------------
+ if(tt_aV[SHADOW])
+ {
+ tt_w += tt_aV[SHADOWWIDTH];
+ iOffSh = Math.floor((tt_aV[SHADOWWIDTH] * 4) / 3);
+ // Bottom shadow
+ css = tt_aElt[7].style;
+ css.top = iOffY + "px";
+ css.left = iOffSh + "px";
+ css.width = (tt_w - iOffSh - tt_aV[SHADOWWIDTH]) + "px";
+ css.height = tt_aV[SHADOWWIDTH] + "px";
+ css.background = tt_aV[SHADOWCOLOR];
+ // Right shadow
+ css = tt_aElt[8].style;
+ css.top = iOffSh + "px";
+ css.left = (tt_w - tt_aV[SHADOWWIDTH]) + "px";
+ css.width = tt_aV[SHADOWWIDTH] + "px";
+ css.background = tt_aV[SHADOWCOLOR];
+ }
+ else
+ iOffSh = 0;
+
+ //-------- Container DIV -------
+ tt_SetTipOpa(tt_aV[FADEIN] ? 0 : tt_aV[OPACITY]);
+ tt_FixSize(iOffY, iOffSh);
+}
+// Fixate the size so it can't dynamically change while the tooltip is moving.
+function tt_FixSize(iOffY, iOffSh)
+{
+ var wIn, wOut, h, add, i;
+
+ tt_aElt[0].style.width = tt_w + "px";
+ tt_aElt[0].style.pixelWidth = tt_w;
+ wOut = tt_w - ((tt_aV[SHADOW]) ? tt_aV[SHADOWWIDTH] : 0);
+ // Body
+ wIn = wOut;
+ if(!tt_bBoxOld)
+ wIn -= (tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1;
+ tt_aElt[5].style.width = wIn + "px";
+ // Title
+ if(tt_aElt[1])
+ {
+ wIn = wOut - (tt_aV[PADDING] << 1);
+ if(!tt_bBoxOld)
+ wOut = wIn;
+ tt_aElt[1].style.width = wOut + "px";
+ tt_aElt[2].style.width = wIn + "px";
+ }
+ // Max height specified
+ if(tt_h)
+ {
+ h = tt_GetDivH(tt_aElt[5]);
+ if(h > tt_h)
+ {
+ if(!tt_bBoxOld)
+ tt_h -= (tt_aV[PADDING] + tt_aV[BORDERWIDTH]) << 1;
+ tt_aElt[5].style.height = tt_h + "px";
+ }
+ }
+ tt_h = tt_GetDivH(tt_aElt[0]) + iOffY;
+ // Right shadow
+ if(tt_aElt[8])
+ tt_aElt[8].style.height = (tt_h - iOffSh) + "px";
+ i = tt_aElt.length - 1;
+ if(tt_aElt[i])
+ {
+ tt_aElt[i].style.width = tt_w + "px";
+ tt_aElt[i].style.height = tt_h + "px";
+ }
+}
+function tt_DeAlt(el)
+{
+ var aKid;
+
+ if(el)
+ {
+ if(el.alt)
+ el.alt = "";
+ if(el.title)
+ el.title = "";
+ aKid = el.childNodes || el.children || null;
+ if(aKid)
+ {
+ for(var i = aKid.length; i;)
+ tt_DeAlt(aKid[--i]);
+ }
+ }
+}
+// This hack removes the native tooltips over links in Opera
+function tt_OpDeHref(el)
+{
+ if(!tt_op)
+ return;
+ if(tt_elDeHref)
+ tt_OpReHref();
+ while(el)
+ {
+ if(el.hasAttribute("href"))
+ {
+ el.t_href = el.getAttribute("href");
+ el.t_stats = window.status;
+ el.removeAttribute("href");
+ el.style.cursor = "hand";
+ tt_AddEvtFnc(el, "mousedown", tt_OpReHref);
+ window.status = el.t_href;
+ tt_elDeHref = el;
+ break;
+ }
+ el = el.parentElement;
+ }
+}
+function tt_OpReHref()
+{
+ if(tt_elDeHref)
+ {
+ tt_elDeHref.setAttribute("href", tt_elDeHref.t_href);
+ tt_RemEvtFnc(tt_elDeHref, "mousedown", tt_OpReHref);
+ window.status = tt_elDeHref.t_stats;
+ tt_elDeHref = null;
+ }
+}
+function tt_OverInit()
+{
+ if(window.event)
+ tt_over = window.event.target || window.event.srcElement;
+ else
+ tt_over = tt_ovr_;
+ tt_DeAlt(tt_over);
+ tt_OpDeHref(tt_over);
+}
+function tt_ShowInit()
+{
+ tt_tShow.Timer("tt_Show()", tt_aV[DELAY], true);
+ if(tt_aV[CLICKCLOSE] || tt_aV[CLICKSTICKY])
+ tt_AddEvtFnc(document, "mouseup", tt_OnLClick);
+}
+function tt_Show()
+{
+ var css = tt_aElt[0].style;
+
+ // Override the z-index of the topmost wz_dragdrop.js D&D item
+ css.zIndex = Math.max((window.dd && dd.z) ? (dd.z + 2) : 0, 1010);
+ if(tt_aV[STICKY] || !tt_aV[FOLLOWMOUSE])
+ tt_iState &= ~0x4;
+ if(tt_aV[DURATION] > 0)
+ tt_tDurt.Timer("tt_HideInit()", tt_aV[DURATION], true);
+ tt_ExtCallFncs(0, "Show")
+ css.visibility = "visible";
+ tt_iState |= 0x2;
+ if(tt_aV[FADEIN])
+ tt_Fade(0, 0, tt_aV[OPACITY], Math.round(tt_aV[FADEIN] / tt_aV[FADEINTERVAL]));
+ tt_ShowIfrm();
+}
+function tt_ShowIfrm()
+{
+ if(tt_ie56)
+ {
+ var ifrm = tt_aElt[tt_aElt.length - 1];
+ if(ifrm)
+ {
+ var css = ifrm.style;
+ css.zIndex = tt_aElt[0].style.zIndex - 1;
+ css.display = "block";
+ }
+ }
+}
+function tt_Move(e)
+{
+ if(e)
+ tt_ovr_ = e.target || e.srcElement;
+ e = e || window.event;
+ if(e)
+ {
+ tt_musX = tt_GetEvtX(e);
+ tt_musY = tt_GetEvtY(e);
+ }
+ if(tt_iState & 0x04)
+ {
+ // Prevent jam of mousemove events
+ if(!tt_op && !tt_ie)
+ {
+ if(tt_bWait)
+ return;
+ tt_bWait = true;
+ tt_tWaitMov.Timer("tt_bWait = false;", 1, true);
+ }
+ if(tt_aV[FIX])
+ {
+ var iY = tt_aV[FIX][1];
+ // For a fixed tip to be positioned above the mouse, use the
+ // bottom edge as anchor
+ // (recommended by Christophe Rebeschini, 31.1.2008)
+ if(tt_aV[ABOVE])
+ iY -= tt_h;
+ tt_iState &= ~0x4;
+ tt_SetTipPos(tt_aV[FIX][0], tt_aV[FIX][1]);
+ }
+ else if(!tt_ExtCallFncs(e, "MoveBefore"))
+ tt_SetTipPos(tt_Pos(0), tt_Pos(1));
+ tt_ExtCallFncs([tt_musX, tt_musY], "MoveAfter")
+ }
+}
+function tt_Pos(iDim)
+{
+ var iX, bJmpMode, cmdAlt, cmdOff, cx, iMax, iScrl, iMus, bJmp;
+
+ // Map values according to dimension to calculate
+ if(iDim)
+ {
+ bJmpMode = tt_aV[JUMPVERT];
+ cmdAlt = ABOVE;
+ cmdOff = OFFSETY;
+ cx = tt_h;
+ iMax = tt_maxPosY;
+ iScrl = tt_scrlY;
+ iMus = tt_musY;
+ bJmp = tt_bJmpVert;
+ }
+ else
+ {
+ bJmpMode = tt_aV[JUMPHORZ];
+ cmdAlt = LEFT;
+ cmdOff = OFFSETX;
+ cx = tt_w;
+ iMax = tt_maxPosX;
+ iScrl = tt_scrlX;
+ iMus = tt_musX;
+ bJmp = tt_bJmpHorz;
+ }
+ if(bJmpMode)
+ {
+ if(tt_aV[cmdAlt] && (!bJmp || tt_CalcPosAlt(iDim) >= iScrl + 16))
+ iX = tt_PosAlt(iDim);
+ else if(!tt_aV[cmdAlt] && bJmp && tt_CalcPosDef(iDim) > iMax - 16)
+ iX = tt_PosAlt(iDim);
+ else
+ iX = tt_PosDef(iDim);
+ }
+ else
+ {
+ iX = iMus;
+ if(tt_aV[cmdAlt])
+ iX -= cx + tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
+ else
+ iX += tt_aV[cmdOff];
+ }
+ // Prevent tip from extending past clientarea boundary
+ if(iX > iMax)
+ iX = bJmpMode ? tt_PosAlt(iDim) : iMax;
+ // In case of insufficient space on both sides, ensure the left/upper part
+ // of the tip be visible
+ if(iX < iScrl)
+ iX = bJmpMode ? tt_PosDef(iDim) : iScrl;
+ return iX;
+}
+function tt_PosDef(iDim)
+{
+ if(iDim)
+ tt_bJmpVert = tt_aV[ABOVE];
+ else
+ tt_bJmpHorz = tt_aV[LEFT];
+ return tt_CalcPosDef(iDim);
+}
+function tt_PosAlt(iDim)
+{
+ if(iDim)
+ tt_bJmpVert = !tt_aV[ABOVE];
+ else
+ tt_bJmpHorz = !tt_aV[LEFT];
+ return tt_CalcPosAlt(iDim);
+}
+function tt_CalcPosDef(iDim)
+{
+ return iDim ? (tt_musY + tt_aV[OFFSETY]) : (tt_musX + tt_aV[OFFSETX]);
+}
+function tt_CalcPosAlt(iDim)
+{
+ var cmdOff = iDim ? OFFSETY : OFFSETX;
+ var dx = tt_aV[cmdOff] - (tt_aV[SHADOW] ? tt_aV[SHADOWWIDTH] : 0);
+ if(tt_aV[cmdOff] > 0 && dx <= 0)
+ dx = 1;
+ return((iDim ? (tt_musY - tt_h) : (tt_musX - tt_w)) - dx);
+}
+function tt_Fade(a, now, z, n)
+{
+ if(n)
+ {
+ now += Math.round((z - now) / n);
+ if((z > a) ? (now >= z) : (now <= z))
+ now = z;
+ else
+ tt_tFade.Timer("tt_Fade("
+ + a + "," + now + "," + z + "," + (n - 1)
+ + ")",
+ tt_aV[FADEINTERVAL],
+ true);
+ }
+ now ? tt_SetTipOpa(now) : tt_Hide();
+}
+function tt_SetTipOpa(opa)
+{
+ // To circumvent the opacity nesting flaws of IE, we set the opacity
+ // for each sub-DIV separately, rather than for the container DIV.
+ tt_SetOpa(tt_aElt[5], opa);
+ if(tt_aElt[1])
+ tt_SetOpa(tt_aElt[1], opa);
+ if(tt_aV[SHADOW])
+ {
+ opa = Math.round(opa * 0.8);
+ tt_SetOpa(tt_aElt[7], opa);
+ tt_SetOpa(tt_aElt[8], opa);
+ }
+}
+function tt_OnScrl()
+{
+ tt_scrlX = tt_GetScrollX();
+ tt_scrlY = tt_GetScrollY();
+}
+function tt_OnCloseBtnOver(iOver)
+{
+ var css = tt_aElt[4].style;
+
+ iOver <<= 1;
+ css.background = tt_aV[CLOSEBTNCOLORS][iOver];
+ css.color = tt_aV[CLOSEBTNCOLORS][iOver + 1];
+}
+function tt_OnLClick(e)
+{
+ // Ignore right-clicks
+ e = e || window.event;
+ if(!((e.button && e.button & 2) || (e.which && e.which == 3)))
+ {
+ if(tt_aV[CLICKSTICKY] && (tt_iState & 0x4))
+ {
+ tt_aV[STICKY] = true;
+ tt_iState &= ~0x4;
+ }
+ else if(tt_aV[CLICKCLOSE])
+ tt_HideInit();
+ }
+}
+function tt_Int(x)
+{
+ var y;
+
+ return(isNaN(y = parseInt(x)) ? 0 : y);
+}
+Number.prototype.Timer = function(s, iT, bUrge)
+{
+ if(!this.value || bUrge)
+ this.value = window.setTimeout(s, iT);
+}
+Number.prototype.EndTimer = function()
+{
+ if(this.value)
+ {
+ window.clearTimeout(this.value);
+ this.value = 0;
+ }
+}
+function tt_SetOpa(el, opa)
+{
+ var css = el.style;
+
+ tt_opa = opa;
+ if(tt_flagOpa == 1)
+ {
+ if(opa < 100)
+ {
+ // Hacks for bugs of IE:
+ // 1.) Once a CSS filter has been applied, fonts are no longer
+ // anti-aliased, so we store the previous 'non-filter' to be
+ // able to restore it
+ if(typeof(el.filtNo) == tt_u)
+ el.filtNo = css.filter;
+ // 2.) A DIV cannot be made visible in a single step if an
+ // opacity < 100 has been applied while the DIV was hidden
+ var bVis = css.visibility != "hidden";
+ // 3.) In IE6, applying an opacity < 100 has no effect if the
+ // element has no layout (position, size, zoom, ...)
+ css.zoom = "100%";
+ if(!bVis)
+ css.visibility = "visible";
+ css.filter = "alpha(opacity=" + opa + ")";
+ if(!bVis)
+ css.visibility = "hidden";
+ }
+ else if(typeof(el.filtNo) != tt_u)
+ // Restore 'non-filter'
+ css.filter = el.filtNo;
+ }
+ else
+ {
+ opa /= 100.0;
+ switch(tt_flagOpa)
+ {
+ case 2:
+ css.KhtmlOpacity = opa; break;
+ case 3:
+ css.KHTMLOpacity = opa; break;
+ case 4:
+ css.MozOpacity = opa; break;
+ case 5:
+ css.opacity = opa; break;
+ }
+ }
+}
+function tt_MovDomNode(el, dadFrom, dadTo)
+{
+ if(dadFrom)
+ dadFrom.removeChild(el);
+ if(dadTo)
+ dadTo.appendChild(el);
+}
+function tt_Err(sErr, bIfDebug)
+{
+ if(tt_Debug || !bIfDebug)
+ alert("Tooltip Script Error Message:\n\n" + sErr);
+}
+
+//============ EXTENSION (PLUGIN) MANAGER ===============//
+function tt_ExtCmdEnum()
+{
+ var s;
+
+ // Add new command(s) to the commands enum
+ for(var i in config)
+ {
+ s = "window." + i.toString().toUpperCase();
+ if(eval("typeof(" + s + ") == tt_u"))
+ {
+ eval(s + " = " + tt_aV.length);
+ tt_aV[tt_aV.length] = null;
+ }
+ }
+}
+function tt_ExtCallFncs(arg, sFnc)
+{
+ var b = false;
+ for(var i = tt_aExt.length; i;)
+ {--i;
+ var fnc = tt_aExt[i]["On" + sFnc];
+ // Call the method the extension has defined for this event
+ if(fnc && fnc(arg))
+ b = true;
+ }
+ return b;
+}
+
+tt_Init();
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/operator.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/operator.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/operator.js (revision 8165)
@@ -0,0 +1,224 @@
+Event.observe(window, 'load', init, false);
+
+function operator_DoFSCommand(command, args) {
+ if(command == "newevent") {
+ newevent(args);
+ }
+}
+
+// Hook for Internet Explorer
+if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 && navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
+ document.write(' \n');
+}
+
+function toObject (texto) {
+ var pairs = texto.split('&');
+ return pairs.inject({}, function(params, pairString) {
+ var pair = pairString.split('=');
+ params[pair[0]] = pair[1];
+ return params;
+ });
+}
+
+var handlerFunc = function(t) {
+ var query = t.responseText;
+ var queryObj = toObject(query);
+ for (var i in queryObj)
+ {
+ if(i.indexOf("texto")==0) {
+ var numero = i.substr(5);
+ var label = document.getElementById("label"+numero);
+ var boton = document.getElementById("boton"+numero);
+ var texto = queryObj[i];
+ label.innerHTML=texto;
+ boton.style.display='block';
+ }
+ if(i.indexOf("icono")==0) {
+ var numero = i.substr(5);
+ var iconphone = document.getElementById("phone"+numero);
+ var texto = queryObj[i];
+ iconphone.className="phone"+texto;
+ }
+ }
+}
+
+var errFunc = function(t) {
+ alert('Error ' + t.status + ' -- ' + t.statusText);
+}
+
+function UpdateTimer() {
+
+ if(timerID) {
+ clearTimeout(timerID);
+ }
+
+ for(var i in tiempos ){
+ var tick = document.getElementById("tick"+i);
+ var tDate = new Date();
+ var elapsedTime = tDate.getTime() - tiempos[i];
+
+ // hours
+ var hours = parseInt(elapsedTime/3600000);
+ var remaining = elapsedTime-(hours*3600000);
+ // minutes
+ var minutes = parseInt(remaining/60000);
+ remaining = remaining-(minutes*60000);
+ // seconds
+ var seconds = parseInt(remaining/1000);
+
+ if (hours < 0) { hours = Math.abs(hours) }
+ if (minutes < 0){ minutes = Math.abs(minutes) }
+ if (seconds < 0){ seconds = Math.abs(seconds) }
+ if (hours <10) { hours = "0"+hours; }
+ if (minutes<10) { minutes = "0"+minutes; }
+ if (seconds<10) { seconds = "0"+seconds; }
+
+ var texto = "" + hours + ":" + minutes + ":" + seconds;
+ tick.innerHTML=texto;
+ }
+
+ timerID = setTimeout("UpdateTimer()", 1000);
+}
+
+function debug(texto)
+{
+ loglines.push(texto);
+ if (loglines.length>35) {
+ loglines.shift();
+ }
+ var textofinal = "";
+ for(a=0;a<35;a++) {
+ textofinal = textofinal + loglines[a] + " ";
+
+ }
+ win.getContent().innerHTML=textofinal;
+}
+
+function newevent(params) {
+ var partes = params.split("|");
+ docommand(partes[0],partes[1],partes[2]);
+}
+
+function replace(string,text,by) {
+// Replaces text with by in string
+ var strLength = string.length, txtLength = text.length;
+ if ((strLength == 0) || (txtLength == 0)) return string;
+
+ var i = string.indexOf(text);
+ if ((!i) && (text != string.substring(0,txtLength))) return string;
+ if (i == -1) return string;
+
+ var newstr = string.substring(0,i) + by;
+
+ if (i+txtLength < strLength)
+ newstr += replace(string.substring(i+txtLength,strLength),text,by);
+
+ return newstr;
+}
+
+
+function docommand(nro,comando,texto) {
+
+ var boton = document.getElementById("boton"+nro);
+ var clid = document.getElementById("clid"+nro);
+ var mwi = document.getElementById("mwi"+nro);
+ var mcount= document.getElementById("mcount"+nro);
+
+ debug(nro+","+comando+"="+texto);
+
+ if(comando=="state") {
+ if(texto=="busy") {
+ boton.className="busy";
+ }
+ if(texto=="free") {
+ if(tipofree[nro] == undefined) {
+ tipofree[nro]="free";
+ boton.className="free";
+ } else {
+ boton.className=tipofree[nro];
+ }
+ }
+ }
+
+ if(comando=="park") {
+ boton.className="park";
+ clid.innerHTML=texto;
+ }
+
+ if(comando == "settext") {
+ clid.innerHTML=texto;
+ }
+
+ if(comando.match(/^info/)) {
+ var cola = comando.substring(4);
+ var textodecode = decodeBase64(texto);
+ var i = textodecode.indexOf("\n");
+ textodecode = replace(textodecode,'\n',' ');
+ $('phonetip'+nro).innerHTML=textodecode;
+ }
+
+ if(comando == "settimer") {
+
+ var tick = document.getElementById("tick"+nro);
+ var partes = texto.split("@");
+ var seconds = partes[0];
+ var type = partes[1];
+
+ var sDate = new Date();
+ if(type=="UP" || type =="IDLE") {
+ tiempos[nro] = sDate.getTime() - parseInt(seconds) * 1000;
+ }
+ if(type=="STOP") {
+ delete tiempos[nro];
+ tick.innerHTML=" ";
+ }
+ }
+
+ if(comando.indexOf("ocupado")>=0) {
+ boton.className="busy";
+ clid.innerHTML=texto;
+ }
+ if(comando == "corto") {
+ if(tipofree[nro] == undefined) {
+ tipofree[nro]="free";
+ boton.className="free";
+ } else {
+ boton.className=tipofree[nro];
+ }
+ clid.innerHTML=" ";
+ }
+ if(comando=="ringing") {
+ boton.className="ringing";
+ clid.innerHTML=texto;
+ new Effect.Pulsate(boton);
+ }
+ if(comando=="noregistrado") {
+ boton.className="notregistered";
+ clid.innerHTML="";
+ }
+ if(comando.indexOf("changelabel1")>=0) {
+ if(texto=="original") {
+ tipofree[nro]='free';
+ } else {
+ tipofree[nro]='agent';
+ }
+ boton.className=tipofree[nro];
+ }
+ if(comando == "voicemail") {
+ if(texto=="1") {
+ mwi.style.visibility='visible';
+ } else {
+ mwi.style.visibility='hidden';
+ }
+ }
+ if(comando == "voicemailcount") {
+ $('mwitip'+nro).innerHTML=texto;
+ }
+
+}
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/effects.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/effects.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/effects.js (revision 8165)
@@ -0,0 +1,958 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+// Justin Palmer (http://encytemedia.com/)
+// Mark Pilgrim (http://diveintomark.org/)
+// Martin Bialasinki
+//
+// See scriptaculous.js for full license.
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+ var color = '#';
+ if(this.slice(0,4) == 'rgb(') {
+ var cols = this.slice(4,this.length-1).split(',');
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
+ } else {
+ if(this.slice(0,1) == '#') {
+ if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+ if(this.length==7) color = this.toLowerCase();
+ }
+ }
+ return(color.length==7 ? color : (arguments[0] || this));
+}
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+ }).flatten().join('');
+}
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
+ }).flatten().join('');
+}
+
+Element.setContentZoom = function(element, percent) {
+ element = $(element);
+ Element.setStyle(element, {fontSize: (percent/100) + 'em'});
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+}
+
+Element.getOpacity = function(element){
+ var opacity;
+ if (opacity = Element.getStyle(element, 'opacity'))
+ return parseFloat(opacity);
+ if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
+ if(opacity[1]) return parseFloat(opacity[1]) / 100;
+ return 1.0;
+}
+
+Element.setOpacity = function(element, value){
+ element= $(element);
+ if (value == 1){
+ Element.setStyle(element, { opacity:
+ (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
+ 0.999999 : null });
+ if(/MSIE/.test(navigator.userAgent))
+ Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
+ } else {
+ if(value < 0.00001) value = 0;
+ Element.setStyle(element, {opacity: value});
+ if(/MSIE/.test(navigator.userAgent))
+ Element.setStyle(element,
+ { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
+ 'alpha(opacity='+value*100+')' });
+ }
+}
+
+Element.getInlineOpacity = function(element){
+ return $(element).style.opacity || '';
+}
+
+Element.childrenWithClassName = function(element, className, findFirst) {
+ var classNameRegExp = new RegExp("(^|\\s)" + className + "(\\s|$)");
+ var results = $A($(element).getElementsByTagName('*'))[findFirst ? 'detect' : 'select']( function(c) {
+ return (c.className && c.className.match(classNameRegExp));
+ });
+ if(!results) results = [];
+ return results;
+}
+
+Element.forceRerendering = function(element) {
+ try {
+ element = $(element);
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Array.prototype.call = function() {
+ var args = arguments;
+ this.each(function(f){ f.apply(this, args) });
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+ tagifyText: function(element) {
+ var tagifyStyle = 'position:relative';
+ if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1';
+ element = $(element);
+ $A(element.childNodes).each( function(child) {
+ if(child.nodeType==3) {
+ child.nodeValue.toArray().each( function(character) {
+ element.insertBefore(
+ Builder.node('span',{style: tagifyStyle},
+ character == ' ' ? String.fromCharCode(160) : character),
+ child);
+ });
+ Element.remove(child);
+ }
+ });
+ },
+ multiple: function(element, effect) {
+ var elements;
+ if(((typeof element == 'object') ||
+ (typeof element == 'function')) &&
+ (element.length))
+ elements = element;
+ else
+ elements = $(element).childNodes;
+
+ var options = Object.extend({
+ speed: 0.1,
+ delay: 0.0
+ }, arguments[2] || {});
+ var masterDelay = options.delay;
+
+ $A(elements).each( function(element, index) {
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+ });
+ },
+ PAIRS: {
+ 'slide': ['SlideDown','SlideUp'],
+ 'blind': ['BlindDown','BlindUp'],
+ 'appear': ['Appear','Fade']
+ },
+ toggle: function(element, effect) {
+ element = $(element);
+ effect = (effect || 'appear').toLowerCase();
+ var options = Object.extend({
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+ }, arguments[2] || {});
+ Effect[element.visible() ?
+ Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+ }
+};
+
+var Effect2 = Effect; // deprecated
+
+/* ------------- transitions ------------- */
+
+Effect.Transitions = {}
+
+Effect.Transitions.linear = function(pos) {
+ return pos;
+}
+Effect.Transitions.sinoidal = function(pos) {
+ return (-Math.cos(pos*Math.PI)/2) + 0.5;
+}
+Effect.Transitions.reverse = function(pos) {
+ return 1-pos;
+}
+Effect.Transitions.flicker = function(pos) {
+ return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+}
+Effect.Transitions.wobble = function(pos) {
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+}
+Effect.Transitions.pulse = function(pos) {
+ return (Math.floor(pos*10) % 2 == 0 ?
+ (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
+}
+Effect.Transitions.none = function(pos) {
+ return 0;
+}
+Effect.Transitions.full = function(pos) {
+ return 1;
+}
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create();
+Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
+ initialize: function() {
+ this.effects = [];
+ this.interval = null;
+ },
+ _each: function(iterator) {
+ this.effects._each(iterator);
+ },
+ add: function(effect) {
+ var timestamp = new Date().getTime();
+
+ var position = (typeof effect.options.queue == 'string') ?
+ effect.options.queue : effect.options.queue.position;
+
+ switch(position) {
+ case 'front':
+ // move unstarted effects after this effect
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+ e.startOn += effect.finishOn;
+ e.finishOn += effect.finishOn;
+ });
+ break;
+ case 'end':
+ // start effect after last queued effect has finished
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
+ break;
+ }
+
+ effect.startOn += timestamp;
+ effect.finishOn += timestamp;
+
+ if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+ this.effects.push(effect);
+
+ if(!this.interval)
+ this.interval = setInterval(this.loop.bind(this), 40);
+ },
+ remove: function(effect) {
+ this.effects = this.effects.reject(function(e) { return e==effect });
+ if(this.effects.length == 0) {
+ clearInterval(this.interval);
+ this.interval = null;
+ }
+ },
+ loop: function() {
+ var timePos = new Date().getTime();
+ this.effects.invoke('loop', timePos);
+ }
+});
+
+Effect.Queues = {
+ instances: $H(),
+ get: function(queueName) {
+ if(typeof queueName != 'string') return queueName;
+
+ if(!this.instances[queueName])
+ this.instances[queueName] = new Effect.ScopedQueue();
+
+ return this.instances[queueName];
+ }
+}
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.DefaultOptions = {
+ transition: Effect.Transitions.sinoidal,
+ duration: 1.0, // seconds
+ fps: 25.0, // max. 25fps due to Effect.Queue implementation
+ sync: false, // true for combining
+ from: 0.0,
+ to: 1.0,
+ delay: 0.0,
+ queue: 'parallel'
+}
+
+Effect.Base = function() {};
+Effect.Base.prototype = {
+ position: null,
+ start: function(options) {
+ this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
+ this.currentFrame = 0;
+ this.state = 'idle';
+ this.startOn = this.options.delay*1000;
+ this.finishOn = this.startOn + (this.options.duration*1000);
+ this.event('beforeStart');
+ if(!this.options.sync)
+ Effect.Queues.get(typeof this.options.queue == 'string' ?
+ 'global' : this.options.queue.scope).add(this);
+ },
+ loop: function(timePos) {
+ if(timePos >= this.startOn) {
+ if(timePos >= this.finishOn) {
+ this.render(1.0);
+ this.cancel();
+ this.event('beforeFinish');
+ if(this.finish) this.finish();
+ this.event('afterFinish');
+ return;
+ }
+ var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
+ var frame = Math.round(pos * this.options.fps * this.options.duration);
+ if(frame > this.currentFrame) {
+ this.render(pos);
+ this.currentFrame = frame;
+ }
+ }
+ },
+ render: function(pos) {
+ if(this.state == 'idle') {
+ this.state = 'running';
+ this.event('beforeSetup');
+ if(this.setup) this.setup();
+ this.event('afterSetup');
+ }
+ if(this.state == 'running') {
+ if(this.options.transition) pos = this.options.transition(pos);
+ pos *= (this.options.to-this.options.from);
+ pos += this.options.from;
+ this.position = pos;
+ this.event('beforeUpdate');
+ if(this.update) this.update(pos);
+ this.event('afterUpdate');
+ }
+ },
+ cancel: function() {
+ if(!this.options.sync)
+ Effect.Queues.get(typeof this.options.queue == 'string' ?
+ 'global' : this.options.queue.scope).remove(this);
+ this.state = 'finished';
+ },
+ event: function(eventName) {
+ if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+ if(this.options[eventName]) this.options[eventName](this);
+ },
+ inspect: function() {
+ return '#';
+ }
+}
+
+Effect.Parallel = Class.create();
+Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
+ initialize: function(effects) {
+ this.effects = effects || [];
+ this.start(arguments[1]);
+ },
+ update: function(position) {
+ this.effects.invoke('render', position);
+ },
+ finish: function(position) {
+ this.effects.each( function(effect) {
+ effect.render(1.0);
+ effect.cancel();
+ effect.event('beforeFinish');
+ if(effect.finish) effect.finish(position);
+ effect.event('afterFinish');
+ });
+ }
+});
+
+Effect.Opacity = Class.create();
+Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
+ initialize: function(element) {
+ this.element = $(element);
+ // make this work on IE on elements without 'layout'
+ if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
+ this.element.setStyle({zoom: 1});
+ var options = Object.extend({
+ from: this.element.getOpacity() || 0.0,
+ to: 1.0
+ }, arguments[1] || {});
+ this.start(options);
+ },
+ update: function(position) {
+ this.element.setOpacity(position);
+ }
+});
+
+Effect.Move = Class.create();
+Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
+ initialize: function(element) {
+ this.element = $(element);
+ var options = Object.extend({
+ x: 0,
+ y: 0,
+ mode: 'relative'
+ }, arguments[1] || {});
+ this.start(options);
+ },
+ setup: function() {
+ // Bug in Opera: Opera returns the "real" position of a static element or
+ // relative element that does not have top/left explicitly set.
+ // ==> Always set top and left for position relative elements in your stylesheets
+ // (to 0 if you do not need them)
+ this.element.makePositioned();
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
+ if(this.options.mode == 'absolute') {
+ // absolute movement, so we need to calc deltaX and deltaY
+ this.options.x = this.options.x - this.originalLeft;
+ this.options.y = this.options.y - this.originalTop;
+ }
+ },
+ update: function(position) {
+ this.element.setStyle({
+ left: this.options.x * position + this.originalLeft + 'px',
+ top: this.options.y * position + this.originalTop + 'px'
+ });
+ }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+ return new Effect.Move(element,
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
+};
+
+Effect.Scale = Class.create();
+Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
+ initialize: function(element, percent) {
+ this.element = $(element)
+ var options = Object.extend({
+ scaleX: true,
+ scaleY: true,
+ scaleContent: true,
+ scaleFromCenter: false,
+ scaleMode: 'box', // 'box' or 'contents' or {} with provided values
+ scaleFrom: 100.0,
+ scaleTo: percent
+ }, arguments[2] || {});
+ this.start(options);
+ },
+ setup: function() {
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+ this.elementPositioning = this.element.getStyle('position');
+
+ this.originalStyle = {};
+ ['top','left','width','height','fontSize'].each( function(k) {
+ this.originalStyle[k] = this.element.style[k];
+ }.bind(this));
+
+ this.originalTop = this.element.offsetTop;
+ this.originalLeft = this.element.offsetLeft;
+
+ var fontSize = this.element.getStyle('font-size') || '100%';
+ ['em','px','%'].each( function(fontSizeType) {
+ if(fontSize.indexOf(fontSizeType)>0) {
+ this.fontSize = parseFloat(fontSize);
+ this.fontSizeType = fontSizeType;
+ }
+ }.bind(this));
+
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+ this.dims = null;
+ if(this.options.scaleMode=='box')
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+ if(/^content/.test(this.options.scaleMode))
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+ if(!this.dims)
+ this.dims = [this.options.scaleMode.originalHeight,
+ this.options.scaleMode.originalWidth];
+ },
+ update: function(position) {
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+ if(this.options.scaleContent && this.fontSize)
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+ },
+ finish: function(position) {
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+ },
+ setDimensions: function(height, width) {
+ var d = {};
+ if(this.options.scaleX) d.width = width + 'px';
+ if(this.options.scaleY) d.height = height + 'px';
+ if(this.options.scaleFromCenter) {
+ var topd = (height - this.dims[0])/2;
+ var leftd = (width - this.dims[1])/2;
+ if(this.elementPositioning == 'absolute') {
+ if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
+ if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+ } else {
+ if(this.options.scaleY) d.top = -topd + 'px';
+ if(this.options.scaleX) d.left = -leftd + 'px';
+ }
+ }
+ this.element.setStyle(d);
+ }
+});
+
+Effect.Highlight = Class.create();
+Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
+ initialize: function(element) {
+ this.element = $(element);
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
+ this.start(options);
+ },
+ setup: function() {
+ // Prevent executing on elements not in the layout flow
+ if(this.element.getStyle('display')=='none') { this.cancel(); return; }
+ // Disable background image during the effect
+ this.oldStyle = {
+ backgroundImage: this.element.getStyle('background-image') };
+ this.element.setStyle({backgroundImage: 'none'});
+ if(!this.options.endcolor)
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+ if(!this.options.restorecolor)
+ this.options.restorecolor = this.element.getStyle('background-color');
+ // init color calculations
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+ },
+ update: function(position) {
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+ return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
+ },
+ finish: function() {
+ this.element.setStyle(Object.extend(this.oldStyle, {
+ backgroundColor: this.options.restorecolor
+ }));
+ }
+});
+
+Effect.ScrollTo = Class.create();
+Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
+ initialize: function(element) {
+ this.element = $(element);
+ this.start(arguments[1] || {});
+ },
+ setup: function() {
+ Position.prepare();
+ var offsets = Position.cumulativeOffset(this.element);
+ if(this.options.offset) offsets[1] += this.options.offset;
+ var max = window.innerHeight ?
+ window.height - window.innerHeight :
+ document.body.scrollHeight -
+ (document.documentElement.clientHeight ?
+ document.documentElement.clientHeight : document.body.clientHeight);
+ this.scrollStart = Position.deltaY;
+ this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
+ },
+ update: function(position) {
+ Position.prepare();
+ window.scrollTo(Position.deltaX,
+ this.scrollStart + (position*this.delta));
+ }
+});
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ var options = Object.extend({
+ from: element.getOpacity() || 1.0,
+ to: 0.0,
+ afterFinishInternal: function(effect) {
+ if(effect.options.to!=0) return;
+ effect.element.hide();
+ effect.element.setStyle({opacity: oldOpacity});
+ }}, arguments[1] || {});
+ return new Effect.Opacity(element,options);
+}
+
+Effect.Appear = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+ to: 1.0,
+ // force Safari to render floated elements properly
+ afterFinishInternal: function(effect) {
+ effect.element.forceRerendering();
+ },
+ beforeSetup: function(effect) {
+ effect.element.setOpacity(effect.options.from);
+ effect.element.show();
+ }}, arguments[1] || {});
+ return new Effect.Opacity(element,options);
+}
+
+Effect.Puff = function(element) {
+ element = $(element);
+ var oldStyle = { opacity: element.getInlineOpacity(), position: element.getStyle('position') };
+ return new Effect.Parallel(
+ [ new Effect.Scale(element, 200,
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+ Object.extend({ duration: 1.0,
+ beforeSetupInternal: function(effect) {
+ effect.effects[0].element.setStyle({position: 'absolute'}); },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide();
+ effect.effects[0].element.setStyle(oldStyle); }
+ }, arguments[1] || {})
+ );
+}
+
+Effect.BlindUp = function(element) {
+ element = $(element);
+ element.makeClipping();
+ return new Effect.Scale(element, 0,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ restoreAfterFinish: true,
+ afterFinishInternal: function(effect) {
+ effect.element.hide();
+ effect.element.undoClipping();
+ }
+ }, arguments[1] || {})
+ );
+}
+
+Effect.BlindDown = function(element) {
+ element = $(element);
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ scaleFrom: 0,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makeClipping();
+ effect.element.setStyle({height: '0px'});
+ effect.element.show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping();
+ }
+ }, arguments[1] || {})
+ );
+}
+
+Effect.SwitchOff = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ return new Effect.Appear(element, {
+ duration: 0.4,
+ from: 0,
+ transition: Effect.Transitions.flicker,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(effect.element, 1, {
+ duration: 0.3, scaleFromCenter: true,
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide();
+ effect.element.undoClipping();
+ effect.element.undoPositioned();
+ effect.element.setStyle({opacity: oldOpacity});
+ }
+ })
+ }
+ });
+}
+
+Effect.DropOut = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left'),
+ opacity: element.getInlineOpacity() };
+ return new Effect.Parallel(
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+ Object.extend(
+ { duration: 0.5,
+ beforeSetup: function(effect) {
+ effect.effects[0].element.makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide();
+ effect.effects[0].element.undoPositioned();
+ effect.effects[0].element.setStyle(oldStyle);
+ }
+ }, arguments[1] || {}));
+}
+
+Effect.Shake = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left') };
+ return new Effect.Move(element,
+ { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
+ effect.element.undoPositioned();
+ effect.element.setStyle(oldStyle);
+ }}) }}) }}) }}) }}) }});
+}
+
+Effect.SlideDown = function(element) {
+ element = $(element);
+ element.cleanWhitespace();
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: window.opera ? 0 : 1,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.firstChild.makePositioned();
+ if(window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping();
+ effect.element.setStyle({height: '0px'});
+ effect.element.show(); },
+ afterUpdateInternal: function(effect) {
+ effect.element.firstChild.setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping();
+ // IE will crash if child is undoPositioned first
+ if(/MSIE/.test(navigator.userAgent)){
+ effect.element.undoPositioned();
+ effect.element.firstChild.undoPositioned();
+ }else{
+ effect.element.firstChild.undoPositioned();
+ effect.element.undoPositioned();
+ }
+ effect.element.firstChild.setStyle({bottom: oldInnerBottom}); }
+ }, arguments[1] || {})
+ );
+}
+
+Effect.SlideUp = function(element) {
+ element = $(element);
+ element.cleanWhitespace();
+ var oldInnerBottom = $(element.firstChild).getStyle('bottom');
+ return new Effect.Scale(element, window.opera ? 0 : 1,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ scaleMode: 'box',
+ scaleFrom: 100,
+ restoreAfterFinish: true,
+ beforeStartInternal: function(effect) {
+ effect.element.makePositioned();
+ effect.element.firstChild.makePositioned();
+ if(window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping();
+ effect.element.show(); },
+ afterUpdateInternal: function(effect) {
+ effect.element.firstChild.setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' }); },
+ afterFinishInternal: function(effect) {
+ effect.element.hide();
+ effect.element.undoClipping();
+ effect.element.firstChild.undoPositioned();
+ effect.element.undoPositioned();
+ effect.element.setStyle({bottom: oldInnerBottom}); }
+ }, arguments[1] || {})
+ );
+}
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+ return new Effect.Scale(element, window.opera ? 1 : 0,
+ { restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makeClipping(effect.element); },
+ afterFinishInternal: function(effect) {
+ effect.element.hide(effect.element);
+ effect.element.undoClipping(effect.element); }
+ });
+}
+
+Effect.Grow = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.full
+ }, arguments[1] || {});
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var initialMoveX, initialMoveY;
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ initialMoveX = initialMoveY = moveX = moveY = 0;
+ break;
+ case 'top-right':
+ initialMoveX = dims.width;
+ initialMoveY = moveY = 0;
+ moveX = -dims.width;
+ break;
+ case 'bottom-left':
+ initialMoveX = moveX = 0;
+ initialMoveY = dims.height;
+ moveY = -dims.height;
+ break;
+ case 'bottom-right':
+ initialMoveX = dims.width;
+ initialMoveY = dims.height;
+ moveX = -dims.width;
+ moveY = -dims.height;
+ break;
+ case 'center':
+ initialMoveX = dims.width / 2;
+ initialMoveY = dims.height / 2;
+ moveX = -dims.width / 2;
+ moveY = -dims.height / 2;
+ break;
+ }
+
+ return new Effect.Move(element, {
+ x: initialMoveX,
+ y: initialMoveY,
+ duration: 0.01,
+ beforeSetup: function(effect) {
+ effect.element.hide();
+ effect.element.makeClipping();
+ effect.element.makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ new Effect.Parallel(
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+ new Effect.Scale(effect.element, 100, {
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+ ], Object.extend({
+ beforeSetup: function(effect) {
+ effect.effects[0].element.setStyle({height: '0px'});
+ effect.effects[0].element.show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.undoClipping();
+ effect.effects[0].element.undoPositioned();
+ effect.effects[0].element.setStyle(oldStyle);
+ }
+ }, options)
+ )
+ }
+ });
+}
+
+Effect.Shrink = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.none
+ }, arguments[1] || {});
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ moveX = moveY = 0;
+ break;
+ case 'top-right':
+ moveX = dims.width;
+ moveY = 0;
+ break;
+ case 'bottom-left':
+ moveX = 0;
+ moveY = dims.height;
+ break;
+ case 'bottom-right':
+ moveX = dims.width;
+ moveY = dims.height;
+ break;
+ case 'center':
+ moveX = dims.width / 2;
+ moveY = dims.height / 2;
+ break;
+ }
+
+ return new Effect.Parallel(
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+ ], Object.extend({
+ beforeStartInternal: function(effect) {
+ effect.effects[0].element.makePositioned();
+ effect.effects[0].element.makeClipping(); },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide();
+ effect.effects[0].element.undoClipping();
+ effect.effects[0].element.undoPositioned();
+ effect.effects[0].element.setStyle(oldStyle); }
+ }, options)
+ );
+}
+
+Effect.Pulsate = function(element) {
+ element = $(element);
+ var options = arguments[1] || {};
+ var oldOpacity = element.getInlineOpacity();
+ var transition = options.transition || Effect.Transitions.sinoidal;
+ var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
+ reverser.bind(transition);
+ return new Effect.Opacity(element,
+ Object.extend(Object.extend({ duration: 3.0, from: 0,
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+ }, options), {transition: reverser}));
+}
+
+Effect.Fold = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height };
+ Element.makeClipping(element);
+ return new Effect.Scale(element, 5, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(element, 1, {
+ scaleContent: false,
+ scaleY: false,
+ afterFinishInternal: function(effect) {
+ effect.element.hide();
+ effect.element.undoClipping();
+ effect.element.setStyle(oldStyle);
+ } });
+ }}, arguments[1] || {}));
+};
+
+['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
+ 'collectTextNodes','collectTextNodesIgnoreClass','childrenWithClassName'].each(
+ function(f) { Element.Methods[f] = Element[f]; }
+);
+
+Element.Methods.visualEffect = function(element, effect, options) {
+ s = effect.gsub(/_/, '-').camelize();
+ effect_class = s.charAt(0).toUpperCase() + s.substring(1);
+ new Effect[effect_class](element, options);
+ return $(element);
+};
+
+Element.addMethods();
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/scriptaculous.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/scriptaculous.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/scriptaculous.js (revision 8165)
@@ -0,0 +1,47 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var Scriptaculous = {
+ Version: '1.6.1',
+ require: function(libraryName) {
+ // inserting via DOM fails in Safari 2.0, so brute force approach
+ document.write('');
+ },
+ load: function() {
+ if((typeof Prototype=='undefined') ||
+ (typeof Element == 'undefined') ||
+ (typeof Element.Methods=='undefined') ||
+ parseFloat(Prototype.Version.split(".")[0] + "." +
+ Prototype.Version.split(".")[1]) < 1.5)
+ throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
+
+ $A(document.getElementsByTagName("script")).findAll( function(s) {
+ return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
+ }).each( function(s) {
+ var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
+ var includes = s.src.match(/\?.*load=([a-z,]*)/);
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
+ function(include) { Scriptaculous.require(path+include+'.js') });
+ });
+ }
+}
+
+Scriptaculous.load();
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/dragdrop.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/dragdrop.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/dragdrop.js (revision 8165)
@@ -0,0 +1,915 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
+//
+// See scriptaculous.js for full license.
+
+/*--------------------------------------------------------------------------*/
+
+var Droppables = {
+ drops: [],
+
+ remove: function(element) {
+ this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+ },
+
+ add: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ greedy: true,
+ hoverclass: null,
+ tree: false
+ }, arguments[1] || {});
+
+ // cache containers
+ if(options.containment) {
+ options._containers = [];
+ var containment = options.containment;
+ if((typeof containment == 'object') &&
+ (containment.constructor == Array)) {
+ containment.each( function(c) { options._containers.push($(c)) });
+ } else {
+ options._containers.push($(containment));
+ }
+ }
+
+ if(options.accept) options.accept = [options.accept].flatten();
+
+ Element.makePositioned(element); // fix IE
+ options.element = element;
+
+ this.drops.push(options);
+ },
+
+ findDeepestChild: function(drops) {
+ deepest = drops[0];
+
+ for (i = 1; i < drops.length; ++i)
+ if (Element.isParent(drops[i].element, deepest.element))
+ deepest = drops[i];
+
+ return deepest;
+ },
+
+ isContained: function(element, drop) {
+ var containmentNode;
+ if(drop.tree) {
+ containmentNode = element.treeNode;
+ } else {
+ containmentNode = element.parentNode;
+ }
+ return drop._containers.detect(function(c) { return containmentNode == c });
+ },
+
+ isAffected: function(point, element, drop) {
+ return (
+ (drop.element!=element) &&
+ ((!drop._containers) ||
+ this.isContained(element, drop)) &&
+ ((!drop.accept) ||
+ (Element.classNames(element).detect(
+ function(v) { return drop.accept.include(v) } ) )) &&
+ Position.within(drop.element, point[0], point[1]) );
+ },
+
+ deactivate: function(drop) {
+ if(drop.hoverclass)
+ Element.removeClassName(drop.element, drop.hoverclass);
+ this.last_active = null;
+ },
+
+ activate: function(drop) {
+ if(drop.hoverclass)
+ Element.addClassName(drop.element, drop.hoverclass);
+ this.last_active = drop;
+ },
+
+ show: function(point, element) {
+ if(!this.drops.length) return;
+ var affected = [];
+
+ if(this.last_active) this.deactivate(this.last_active);
+ this.drops.each( function(drop) {
+ if(Droppables.isAffected(point, element, drop))
+ affected.push(drop);
+ });
+
+ if(affected.length>0) {
+ drop = Droppables.findDeepestChild(affected);
+ Position.within(drop.element, point[0], point[1]);
+ if(drop.onHover)
+ drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+
+ Droppables.activate(drop);
+ }
+ },
+
+ fire: function(event, element) {
+ if(!this.last_active) return;
+ Position.prepare();
+
+ if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+ if (this.last_active.onDrop)
+ this.last_active.onDrop(element, this.last_active.element, event);
+ },
+
+ reset: function() {
+ if(this.last_active)
+ this.deactivate(this.last_active);
+ }
+}
+
+var Draggables = {
+ drags: [],
+ observers: [],
+
+ register: function(draggable) {
+ if(this.drags.length == 0) {
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
+ this.eventKeypress = this.keyPress.bindAsEventListener(this);
+
+ Event.observe(document, "mouseup", this.eventMouseUp);
+ Event.observe(document, "mousemove", this.eventMouseMove);
+ Event.observe(document, "keypress", this.eventKeypress);
+ }
+ this.drags.push(draggable);
+ },
+
+ unregister: function(draggable) {
+ this.drags = this.drags.reject(function(d) { return d==draggable });
+ if(this.drags.length == 0) {
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ Event.stopObserving(document, "keypress", this.eventKeypress);
+ }
+ },
+
+ activate: function(draggable) {
+ window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
+ this.activeDraggable = draggable;
+ },
+
+ deactivate: function() {
+ this.activeDraggable = null;
+ },
+
+ updateDrag: function(event) {
+ if(!this.activeDraggable) return;
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ // Mozilla-based browsers fire successive mousemove events with
+ // the same coordinates, prevent needless redrawing (moz bug?)
+ if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
+ this._lastPointer = pointer;
+ this.activeDraggable.updateDrag(event, pointer);
+ },
+
+ endDrag: function(event) {
+ if(!this.activeDraggable) return;
+ this._lastPointer = null;
+ this.activeDraggable.endDrag(event);
+ this.activeDraggable = null;
+ },
+
+ keyPress: function(event) {
+ if(this.activeDraggable)
+ this.activeDraggable.keyPress(event);
+ },
+
+ addObserver: function(observer) {
+ this.observers.push(observer);
+ this._cacheObserverCallbacks();
+ },
+
+ removeObserver: function(element) { // element instead of observer fixes mem leaks
+ this.observers = this.observers.reject( function(o) { return o.element==element });
+ this._cacheObserverCallbacks();
+ },
+
+ notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
+ if(this[eventName+'Count'] > 0)
+ this.observers.each( function(o) {
+ if(o[eventName]) o[eventName](eventName, draggable, event);
+ });
+ },
+
+ _cacheObserverCallbacks: function() {
+ ['onStart','onEnd','onDrag'].each( function(eventName) {
+ Draggables[eventName+'Count'] = Draggables.observers.select(
+ function(o) { return o[eventName]; }
+ ).length;
+ });
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var Draggable = Class.create();
+Draggable.prototype = {
+ initialize: function(element) {
+ var options = Object.extend({
+ handle: false,
+ starteffect: function(element) {
+ element._opacity = Element.getOpacity(element);
+ new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
+ },
+ reverteffect: function(element, top_offset, left_offset) {
+ var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
+ element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur});
+ },
+ endeffect: function(element) {
+ var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0
+ new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity});
+ },
+ zindex: 1000,
+ revert: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] }
+ }, arguments[1] || {});
+
+ this.element = $(element);
+
+ if(options.handle && (typeof options.handle == 'string')) {
+ var h = Element.childrenWithClassName(this.element, options.handle, true);
+ if(h.length>0) this.handle = h[0];
+ }
+ if(!this.handle) this.handle = $(options.handle);
+ if(!this.handle) this.handle = this.element;
+
+ if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML)
+ options.scroll = $(options.scroll);
+
+ Element.makePositioned(this.element); // fix IE
+
+ this.delta = this.currentDelta();
+ this.options = options;
+ this.dragging = false;
+
+ this.eventMouseDown = this.initDrag.bindAsEventListener(this);
+ Event.observe(this.handle, "mousedown", this.eventMouseDown);
+
+ Draggables.register(this);
+ },
+
+ destroy: function() {
+ Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
+ Draggables.unregister(this);
+ },
+
+ currentDelta: function() {
+ return([
+ parseInt(Element.getStyle(this.element,'left') || '0'),
+ parseInt(Element.getStyle(this.element,'top') || '0')]);
+ },
+
+ initDrag: function(event) {
+ if(Event.isLeftClick(event)) {
+ // abort on form elements, fixes a Firefox issue
+ var src = Event.element(event);
+ if(src.tagName && (
+ src.tagName=='INPUT' ||
+ src.tagName=='SELECT' ||
+ src.tagName=='OPTION' ||
+ src.tagName=='BUTTON' ||
+ src.tagName=='TEXTAREA')) return;
+
+ if(this.element._revert) {
+ this.element._revert.cancel();
+ this.element._revert = null;
+ }
+
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var pos = Position.cumulativeOffset(this.element);
+ this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
+
+ Draggables.activate(this);
+ Event.stop(event);
+ }
+ },
+
+ startDrag: function(event) {
+ this.dragging = true;
+
+ if(this.options.zindex) {
+ this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
+ this.element.style.zIndex = this.options.zindex;
+ }
+
+ if(this.options.ghosting) {
+ this._clone = this.element.cloneNode(true);
+ Position.absolutize(this.element);
+ this.element.parentNode.insertBefore(this._clone, this.element);
+ }
+
+ if(this.options.scroll) {
+ if (this.options.scroll == window) {
+ var where = this._getWindowScroll(this.options.scroll);
+ this.originalScrollLeft = where.left;
+ this.originalScrollTop = where.top;
+ } else {
+ this.originalScrollLeft = this.options.scroll.scrollLeft;
+ this.originalScrollTop = this.options.scroll.scrollTop;
+ }
+ }
+
+ Draggables.notify('onStart', this, event);
+ if(this.options.starteffect) this.options.starteffect(this.element);
+ },
+
+ updateDrag: function(event, pointer) {
+ if(!this.dragging) this.startDrag(event);
+ Position.prepare();
+ Droppables.show(pointer, this.element);
+ Draggables.notify('onDrag', this, event);
+ this.draw(pointer);
+ if(this.options.change) this.options.change(this);
+
+ if(this.options.scroll) {
+ this.stopScrolling();
+
+ var p;
+ if (this.options.scroll == window) {
+ with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
+ } else {
+ p = Position.page(this.options.scroll);
+ p[0] += this.options.scroll.scrollLeft;
+ p[1] += this.options.scroll.scrollTop;
+ p.push(p[0]+this.options.scroll.offsetWidth);
+ p.push(p[1]+this.options.scroll.offsetHeight);
+ }
+ var speed = [0,0];
+ if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
+ if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
+ if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
+ if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
+ this.startScrolling(speed);
+ }
+
+ // fix AppleWebKit rendering
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+
+ Event.stop(event);
+ },
+
+ finishDrag: function(event, success) {
+ this.dragging = false;
+
+ if(this.options.ghosting) {
+ Position.relativize(this.element);
+ Element.remove(this._clone);
+ this._clone = null;
+ }
+
+ if(success) Droppables.fire(event, this.element);
+ Draggables.notify('onEnd', this, event);
+
+ var revert = this.options.revert;
+ if(revert && typeof revert == 'function') revert = revert(this.element);
+
+ var d = this.currentDelta();
+ if(revert && this.options.reverteffect) {
+ this.options.reverteffect(this.element,
+ d[1]-this.delta[1], d[0]-this.delta[0]);
+ } else {
+ this.delta = d;
+ }
+
+ if(this.options.zindex)
+ this.element.style.zIndex = this.originalZ;
+
+ if(this.options.endeffect)
+ this.options.endeffect(this.element);
+
+ Draggables.deactivate(this);
+ Droppables.reset();
+ },
+
+ keyPress: function(event) {
+ if(event.keyCode!=Event.KEY_ESC) return;
+ this.finishDrag(event, false);
+ Event.stop(event);
+ },
+
+ endDrag: function(event) {
+ if(!this.dragging) return;
+ this.stopScrolling();
+ this.finishDrag(event, true);
+ Event.stop(event);
+ },
+
+ draw: function(point) {
+ var pos = Position.cumulativeOffset(this.element);
+ var d = this.currentDelta();
+ pos[0] -= d[0]; pos[1] -= d[1];
+
+ if(this.options.scroll && (this.options.scroll != window)) {
+ pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
+ pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
+ }
+
+ var p = [0,1].map(function(i){
+ return (point[i]-pos[i]-this.offset[i])
+ }.bind(this));
+
+ if(this.options.snap) {
+ if(typeof this.options.snap == 'function') {
+ p = this.options.snap(p[0],p[1],this);
+ } else {
+ if(this.options.snap instanceof Array) {
+ p = p.map( function(v, i) {
+ return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
+ } else {
+ p = p.map( function(v) {
+ return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
+ }
+ }}
+
+ var style = this.element.style;
+ if((!this.options.constraint) || (this.options.constraint=='horizontal'))
+ style.left = p[0] + "px";
+ if((!this.options.constraint) || (this.options.constraint=='vertical'))
+ style.top = p[1] + "px";
+ if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
+ },
+
+ stopScrolling: function() {
+ if(this.scrollInterval) {
+ clearInterval(this.scrollInterval);
+ this.scrollInterval = null;
+ Draggables._lastScrollPointer = null;
+ }
+ },
+
+ startScrolling: function(speed) {
+ this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
+ this.lastScrolled = new Date();
+ this.scrollInterval = setInterval(this.scroll.bind(this), 10);
+ },
+
+ scroll: function() {
+ var current = new Date();
+ var delta = current - this.lastScrolled;
+ this.lastScrolled = current;
+ if(this.options.scroll == window) {
+ with (this._getWindowScroll(this.options.scroll)) {
+ if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
+ var d = delta / 1000;
+ this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
+ }
+ }
+ } else {
+ this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
+ this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
+ }
+
+ Position.prepare();
+ Droppables.show(Draggables._lastPointer, this.element);
+ Draggables.notify('onDrag', this);
+ Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
+ Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
+ Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
+ if (Draggables._lastScrollPointer[0] < 0)
+ Draggables._lastScrollPointer[0] = 0;
+ if (Draggables._lastScrollPointer[1] < 0)
+ Draggables._lastScrollPointer[1] = 0;
+ this.draw(Draggables._lastScrollPointer);
+
+ if(this.options.change) this.options.change(this);
+ },
+
+ _getWindowScroll: function(w) {
+ var T, L, W, H;
+ with (w.document) {
+ if (w.document.documentElement && documentElement.scrollTop) {
+ T = documentElement.scrollTop;
+ L = documentElement.scrollLeft;
+ } else if (w.document.body) {
+ T = body.scrollTop;
+ L = body.scrollLeft;
+ }
+ if (w.innerWidth) {
+ W = w.innerWidth;
+ H = w.innerHeight;
+ } else if (w.document.documentElement && documentElement.clientWidth) {
+ W = documentElement.clientWidth;
+ H = documentElement.clientHeight;
+ } else {
+ W = body.offsetWidth;
+ H = body.offsetHeight
+ }
+ }
+ return { top: T, left: L, width: W, height: H };
+ }
+}
+
+/*--------------------------------------------------------------------------*/
+
+var SortableObserver = Class.create();
+SortableObserver.prototype = {
+ initialize: function(element, observer) {
+ this.element = $(element);
+ this.observer = observer;
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onStart: function() {
+ this.lastValue = Sortable.serialize(this.element);
+ },
+
+ onEnd: function() {
+ Sortable.unmark();
+ if(this.lastValue != Sortable.serialize(this.element))
+ this.observer(this.element)
+ }
+}
+
+var Sortable = {
+ sortables: {},
+
+ _findRootElement: function(element) {
+ while (element.tagName != "BODY") {
+ if(element.id && Sortable.sortables[element.id]) return element;
+ element = element.parentNode;
+ }
+ },
+
+ options: function(element) {
+ element = Sortable._findRootElement($(element));
+ if(!element) return;
+ return Sortable.sortables[element.id];
+ },
+
+ destroy: function(element){
+ var s = Sortable.options(element);
+
+ if(s) {
+ Draggables.removeObserver(s.element);
+ s.droppables.each(function(d){ Droppables.remove(d) });
+ s.draggables.invoke('destroy');
+
+ delete Sortable.sortables[s.element.id];
+ }
+ },
+
+ create: function(element) {
+ element = $(element);
+ var options = Object.extend({
+ element: element,
+ tag: 'li', // assumes li children, override with tag: 'tagname'
+ dropOnEmpty: false,
+ tree: false,
+ treeTag: 'ul',
+ overlap: 'vertical', // one of 'vertical', 'horizontal'
+ constraint: 'vertical', // one of 'vertical', 'horizontal', false
+ containment: element, // also takes array of elements (or id's); or false
+ handle: false, // or a CSS class
+ only: false,
+ hoverclass: null,
+ ghosting: false,
+ scroll: false,
+ scrollSensitivity: 20,
+ scrollSpeed: 15,
+ format: /^[^_]*_(.*)$/,
+ onChange: Prototype.emptyFunction,
+ onUpdate: Prototype.emptyFunction
+ }, arguments[1] || {});
+
+ // clear any old sortable with same element
+ this.destroy(element);
+
+ // build options for the draggables
+ var options_for_draggable = {
+ revert: true,
+ scroll: options.scroll,
+ scrollSpeed: options.scrollSpeed,
+ scrollSensitivity: options.scrollSensitivity,
+ ghosting: options.ghosting,
+ constraint: options.constraint,
+ handle: options.handle };
+
+ if(options.starteffect)
+ options_for_draggable.starteffect = options.starteffect;
+
+ if(options.reverteffect)
+ options_for_draggable.reverteffect = options.reverteffect;
+ else
+ if(options.ghosting) options_for_draggable.reverteffect = function(element) {
+ element.style.top = 0;
+ element.style.left = 0;
+ };
+
+ if(options.endeffect)
+ options_for_draggable.endeffect = options.endeffect;
+
+ if(options.zindex)
+ options_for_draggable.zindex = options.zindex;
+
+ // build options for the droppables
+ var options_for_droppable = {
+ overlap: options.overlap,
+ containment: options.containment,
+ tree: options.tree,
+ hoverclass: options.hoverclass,
+ onHover: Sortable.onHover
+ //greedy: !options.dropOnEmpty
+ }
+
+ var options_for_tree = {
+ onHover: Sortable.onEmptyHover,
+ overlap: options.overlap,
+ containment: options.containment,
+ hoverclass: options.hoverclass
+ }
+
+ // fix for gecko engine
+ Element.cleanWhitespace(element);
+
+ options.draggables = [];
+ options.droppables = [];
+
+ // drop on empty handling
+ if(options.dropOnEmpty || options.tree) {
+ Droppables.add(element, options_for_tree);
+ options.droppables.push(element);
+ }
+
+ (this.findElements(element, options) || []).each( function(e) {
+ // handles are per-draggable
+ var handle = options.handle ?
+ Element.childrenWithClassName(e, options.handle)[0] : e;
+ options.draggables.push(
+ new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
+ Droppables.add(e, options_for_droppable);
+ if(options.tree) e.treeNode = element;
+ options.droppables.push(e);
+ });
+
+ if(options.tree) {
+ (Sortable.findTreeElements(element, options) || []).each( function(e) {
+ Droppables.add(e, options_for_tree);
+ e.treeNode = element;
+ options.droppables.push(e);
+ });
+ }
+
+ // keep reference
+ this.sortables[element.id] = options;
+
+ // for onupdate
+ Draggables.addObserver(new SortableObserver(element, options.onUpdate));
+
+ },
+
+ // return all suitable-for-sortable elements in a guaranteed order
+ findElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.tag);
+ },
+
+ findTreeElements: function(element, options) {
+ return Element.findChildren(
+ element, options.only, options.tree ? true : false, options.treeTag);
+ },
+
+ onHover: function(element, dropon, overlap) {
+ if(Element.isParent(dropon, element)) return;
+
+ if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
+ return;
+ } else if(overlap>0.5) {
+ Sortable.mark(dropon, 'before');
+ if(dropon.previousSibling != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, dropon);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ } else {
+ Sortable.mark(dropon, 'after');
+ var nextElement = dropon.nextSibling || null;
+ if(nextElement != element) {
+ var oldParentNode = element.parentNode;
+ element.style.visibility = "hidden"; // fix gecko rendering
+ dropon.parentNode.insertBefore(element, nextElement);
+ if(dropon.parentNode!=oldParentNode)
+ Sortable.options(oldParentNode).onChange(element);
+ Sortable.options(dropon.parentNode).onChange(element);
+ }
+ }
+ },
+
+ onEmptyHover: function(element, dropon, overlap) {
+ var oldParentNode = element.parentNode;
+ var droponOptions = Sortable.options(dropon);
+
+ if(!Element.isParent(dropon, element)) {
+ var index;
+
+ var children = Sortable.findElements(dropon, {tag: droponOptions.tag});
+ var child = null;
+
+ if(children) {
+ var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
+
+ for (index = 0; index < children.length; index += 1) {
+ if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
+ offset -= Element.offsetSize (children[index], droponOptions.overlap);
+ } else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
+ child = index + 1 < children.length ? children[index + 1] : null;
+ break;
+ } else {
+ child = children[index];
+ break;
+ }
+ }
+ }
+
+ dropon.insertBefore(element, child);
+
+ Sortable.options(oldParentNode).onChange(element);
+ droponOptions.onChange(element);
+ }
+ },
+
+ unmark: function() {
+ if(Sortable._marker) Element.hide(Sortable._marker);
+ },
+
+ mark: function(dropon, position) {
+ // mark on ghosting only
+ var sortable = Sortable.options(dropon.parentNode);
+ if(sortable && !sortable.ghosting) return;
+
+ if(!Sortable._marker) {
+ Sortable._marker = $('dropmarker') || document.createElement('DIV');
+ Element.hide(Sortable._marker);
+ Element.addClassName(Sortable._marker, 'dropmarker');
+ Sortable._marker.style.position = 'absolute';
+ document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
+ }
+ var offsets = Position.cumulativeOffset(dropon);
+ Sortable._marker.style.left = offsets[0] + 'px';
+ Sortable._marker.style.top = offsets[1] + 'px';
+
+ if(position=='after')
+ if(sortable.overlap == 'horizontal')
+ Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px';
+ else
+ Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px';
+
+ Element.show(Sortable._marker);
+ },
+
+ _tree: function(element, options, parent) {
+ var children = Sortable.findElements(element, options) || [];
+
+ for (var i = 0; i < children.length; ++i) {
+ var match = children[i].id.match(options.format);
+
+ if (!match) continue;
+
+ var child = {
+ id: encodeURIComponent(match ? match[1] : null),
+ element: element,
+ parent: parent,
+ children: new Array,
+ position: parent.children.length,
+ container: Sortable._findChildrenElement(children[i], options.treeTag.toUpperCase())
+ }
+
+ /* Get the element containing the children and recurse over it */
+ if (child.container)
+ this._tree(child.container, options, child)
+
+ parent.children.push (child);
+ }
+
+ return parent;
+ },
+
+ /* Finds the first element of the given tag type within a parent element.
+ Used for finding the first LI[ST] within a L[IST]I[TEM].*/
+ _findChildrenElement: function (element, containerTag) {
+ if (element && element.hasChildNodes)
+ for (var i = 0; i < element.childNodes.length; ++i)
+ if (element.childNodes[i].tagName == containerTag)
+ return element.childNodes[i];
+
+ return null;
+ },
+
+ tree: function(element) {
+ element = $(element);
+ var sortableOptions = this.options(element);
+ var options = Object.extend({
+ tag: sortableOptions.tag,
+ treeTag: sortableOptions.treeTag,
+ only: sortableOptions.only,
+ name: element.id,
+ format: sortableOptions.format
+ }, arguments[1] || {});
+
+ var root = {
+ id: null,
+ parent: null,
+ children: new Array,
+ container: element,
+ position: 0
+ }
+
+ return Sortable._tree (element, options, root);
+ },
+
+ /* Construct a [i] index for a particular node */
+ _constructIndex: function(node) {
+ var index = '';
+ do {
+ if (node.id) index = '[' + node.position + ']' + index;
+ } while ((node = node.parent) != null);
+ return index;
+ },
+
+ sequence: function(element) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[1] || {});
+
+ return $(this.findElements(element, options) || []).map( function(item) {
+ return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
+ });
+ },
+
+ setSequence: function(element, new_sequence) {
+ element = $(element);
+ var options = Object.extend(this.options(element), arguments[2] || {});
+
+ var nodeMap = {};
+ this.findElements(element, options).each( function(n) {
+ if (n.id.match(options.format))
+ nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
+ n.parentNode.removeChild(n);
+ });
+
+ new_sequence.each(function(ident) {
+ var n = nodeMap[ident];
+ if (n) {
+ n[1].appendChild(n[0]);
+ delete nodeMap[ident];
+ }
+ });
+ },
+
+ serialize: function(element) {
+ element = $(element);
+ var options = Object.extend(Sortable.options(element), arguments[1] || {});
+ var name = encodeURIComponent(
+ (arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
+
+ if (options.tree) {
+ return Sortable.tree(element, arguments[1]).children.map( function (item) {
+ return [name + Sortable._constructIndex(item) + "=" +
+ encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
+ }).flatten().join('&');
+ } else {
+ return Sortable.sequence(element, arguments[1]).map( function(item) {
+ return name + "[]=" + encodeURIComponent(item);
+ }).join('&');
+ }
+ }
+}
+
+/* Returns true if child is contained within element */
+Element.isParent = function(child, element) {
+ if (!child.parentNode || child == element) return false;
+
+ if (child.parentNode == element) return true;
+
+ return Element.isParent(child.parentNode, element);
+}
+
+Element.findChildren = function(element, only, recursive, tagName) {
+ if(!element.hasChildNodes()) return null;
+ tagName = tagName.toUpperCase();
+ if(only) only = [only].flatten();
+ var elements = [];
+ $A(element.childNodes).each( function(e) {
+ if(e.tagName && e.tagName.toUpperCase()==tagName &&
+ (!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
+ elements.push(e);
+ if(recursive) {
+ var grandchildren = Element.findChildren(e, only, recursive, tagName);
+ if(grandchildren) elements.push(grandchildren);
+ }
+ });
+
+ return (elements.length>0 ? elements.flatten() : []);
+}
+
+Element.offsetSize = function (element, type) {
+ if (type == 'vertical' || type == 'height')
+ return element.offsetHeight;
+ else
+ return element.offsetWidth;
+}
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/slider.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/slider.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/slider.js (revision 8165)
@@ -0,0 +1,283 @@
+// Copyright (c) 2005 Marty Haught, Thomas Fuchs
+//
+// See http://script.aculo.us for more info
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+if(!Control) var Control = {};
+Control.Slider = Class.create();
+
+// options:
+// axis: 'vertical', or 'horizontal' (default)
+//
+// callbacks:
+// onChange(value)
+// onSlide(value)
+Control.Slider.prototype = {
+ initialize: function(handle, track, options) {
+ var slider = this;
+
+ if(handle instanceof Array) {
+ this.handles = handle.collect( function(e) { return $(e) });
+ } else {
+ this.handles = [$(handle)];
+ }
+
+ this.track = $(track);
+ this.options = options || {};
+
+ this.axis = this.options.axis || 'horizontal';
+ this.increment = this.options.increment || 1;
+ this.step = parseInt(this.options.step || '1');
+ this.range = this.options.range || $R(0,1);
+
+ this.value = 0; // assure backwards compat
+ this.values = this.handles.map( function() { return 0 });
+ this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
+ this.options.startSpan = $(this.options.startSpan || null);
+ this.options.endSpan = $(this.options.endSpan || null);
+
+ this.restricted = this.options.restricted || false;
+
+ this.maximum = this.options.maximum || this.range.end;
+ this.minimum = this.options.minimum || this.range.start;
+
+ // Will be used to align the handle onto the track, if necessary
+ this.alignX = parseInt(this.options.alignX || '0');
+ this.alignY = parseInt(this.options.alignY || '0');
+
+ this.trackLength = this.maximumOffset() - this.minimumOffset();
+ this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
+
+ this.active = false;
+ this.dragging = false;
+ this.disabled = false;
+
+ if(this.options.disabled) this.setDisabled();
+
+ // Allowed values array
+ this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
+ if(this.allowedValues) {
+ this.minimum = this.allowedValues.min();
+ this.maximum = this.allowedValues.max();
+ }
+
+ this.eventMouseDown = this.startDrag.bindAsEventListener(this);
+ this.eventMouseUp = this.endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this.update.bindAsEventListener(this);
+
+ // Initialize handles in reverse (make sure first handle is active)
+ this.handles.each( function(h,i) {
+ i = slider.handles.length-1-i;
+ slider.setValue(parseFloat(
+ (slider.options.sliderValue instanceof Array ?
+ slider.options.sliderValue[i] : slider.options.sliderValue) ||
+ slider.range.start), i);
+ Element.makePositioned(h); // fix IE
+ Event.observe(h, "mousedown", slider.eventMouseDown);
+ });
+
+ Event.observe(this.track, "mousedown", this.eventMouseDown);
+ Event.observe(document, "mouseup", this.eventMouseUp);
+ Event.observe(document, "mousemove", this.eventMouseMove);
+
+ this.initialized = true;
+ },
+ dispose: function() {
+ var slider = this;
+ Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
+ Event.stopObserving(document, "mouseup", this.eventMouseUp);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove);
+ this.handles.each( function(h) {
+ Event.stopObserving(h, "mousedown", slider.eventMouseDown);
+ });
+ },
+ setDisabled: function(){
+ this.disabled = true;
+ },
+ setEnabled: function(){
+ this.disabled = false;
+ },
+ getNearestValue: function(value){
+ if(this.allowedValues){
+ if(value >= this.allowedValues.max()) return(this.allowedValues.max());
+ if(value <= this.allowedValues.min()) return(this.allowedValues.min());
+
+ var offset = Math.abs(this.allowedValues[0] - value);
+ var newValue = this.allowedValues[0];
+ this.allowedValues.each( function(v) {
+ var currentOffset = Math.abs(v - value);
+ if(currentOffset <= offset){
+ newValue = v;
+ offset = currentOffset;
+ }
+ });
+ return newValue;
+ }
+ if(value > this.range.end) return this.range.end;
+ if(value < this.range.start) return this.range.start;
+ return value;
+ },
+ setValue: function(sliderValue, handleIdx){
+ if(!this.active) {
+ this.activeHandle = this.handles[handleIdx];
+ this.activeHandleIdx = handleIdx;
+ this.updateStyles();
+ }
+ handleIdx = handleIdx || this.activeHandleIdx || 0;
+ if(this.initialized && this.restricted) {
+ if((handleIdx>0) && (sliderValuethis.values[handleIdx+1]))
+ sliderValue = this.values[handleIdx+1];
+ }
+ sliderValue = this.getNearestValue(sliderValue);
+ this.values[handleIdx] = sliderValue;
+ this.value = this.values[0]; // assure backwards compat
+
+ this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
+ this.translateToPx(sliderValue);
+
+ this.drawSpans();
+ if(!this.dragging || !this.event) this.updateFinished();
+ },
+ setValueBy: function(delta, handleIdx) {
+ this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
+ handleIdx || this.activeHandleIdx || 0);
+ },
+ translateToPx: function(value) {
+ return Math.round(
+ ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
+ (value - this.range.start)) + "px";
+ },
+ translateToValue: function(offset) {
+ return ((offset/(this.trackLength-this.handleLength) *
+ (this.range.end-this.range.start)) + this.range.start);
+ },
+ getRange: function(range) {
+ var v = this.values.sortBy(Prototype.K);
+ range = range || 0;
+ return $R(v[range],v[range+1]);
+ },
+ minimumOffset: function(){
+ return(this.isVertical() ? this.alignY : this.alignX);
+ },
+ maximumOffset: function(){
+ return(this.isVertical() ?
+ this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
+ },
+ isVertical: function(){
+ return (this.axis == 'vertical');
+ },
+ drawSpans: function() {
+ var slider = this;
+ if(this.spans)
+ $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
+ if(this.options.startSpan)
+ this.setSpan(this.options.startSpan,
+ $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
+ if(this.options.endSpan)
+ this.setSpan(this.options.endSpan,
+ $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
+ },
+ setSpan: function(span, range) {
+ if(this.isVertical()) {
+ span.style.top = this.translateToPx(range.start);
+ span.style.height = this.translateToPx(range.end - range.start + this.range.start);
+ } else {
+ span.style.left = this.translateToPx(range.start);
+ span.style.width = this.translateToPx(range.end - range.start + this.range.start);
+ }
+ },
+ updateStyles: function() {
+ this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
+ Element.addClassName(this.activeHandle, 'selected');
+ },
+ startDrag: function(event) {
+ if(Event.isLeftClick(event)) {
+ if(!this.disabled){
+ this.active = true;
+
+ var handle = Event.element(event);
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ if(handle==this.track) {
+ var offsets = Position.cumulativeOffset(this.track);
+ this.event = event;
+ this.setValue(this.translateToValue(
+ (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
+ ));
+ var offsets = Position.cumulativeOffset(this.activeHandle);
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ } else {
+ // find the handle (prevents issues with Safari)
+ while((this.handles.indexOf(handle) == -1) && handle.parentNode)
+ handle = handle.parentNode;
+
+ this.activeHandle = handle;
+ this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
+ this.updateStyles();
+
+ var offsets = Position.cumulativeOffset(this.activeHandle);
+ this.offsetX = (pointer[0] - offsets[0]);
+ this.offsetY = (pointer[1] - offsets[1]);
+ }
+ }
+ Event.stop(event);
+ }
+ },
+ update: function(event) {
+ if(this.active) {
+ if(!this.dragging) this.dragging = true;
+ this.draw(event);
+ // fix AppleWebKit rendering
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
+ Event.stop(event);
+ }
+ },
+ draw: function(event) {
+ var pointer = [Event.pointerX(event), Event.pointerY(event)];
+ var offsets = Position.cumulativeOffset(this.track);
+ pointer[0] -= this.offsetX + offsets[0];
+ pointer[1] -= this.offsetY + offsets[1];
+ this.event = event;
+ this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
+ if(this.initialized && this.options.onSlide)
+ this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
+ },
+ endDrag: function(event) {
+ if(this.active && this.dragging) {
+ this.finishDrag(event, true);
+ Event.stop(event);
+ }
+ this.active = false;
+ this.dragging = false;
+ },
+ finishDrag: function(event, success) {
+ this.active = false;
+ this.dragging = false;
+ this.updateFinished();
+ },
+ updateFinished: function() {
+ if(this.initialized && this.options.onChange)
+ this.options.onChange(this.values.length>1 ? this.values : this.value, this);
+ this.event = null;
+ }
+}
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/controls.js
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/controls.js (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/js/controls.js (revision 8165)
@@ -0,0 +1,815 @@
+// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
+// (c) 2005 Jon Tirsen (http://www.tirsen.com)
+// Contributors:
+// Richard Livsey
+// Rahul Bhargava
+// Rob Wills
+//
+// See scriptaculous.js for full license.
+
+// Autocompleter.Base handles all the autocompletion functionality
+// that's independent of the data source for autocompletion. This
+// includes drawing the autocompletion menu, observing keyboard
+// and mouse events, and similar.
+//
+// Specific autocompleters need to provide, at the very least,
+// a getUpdatedChoices function that will be invoked every time
+// the text inside the monitored textbox changes. This method
+// should get the text for which to provide autocompletion by
+// invoking this.getToken(), NOT by directly accessing
+// this.element.value. This is to allow incremental tokenized
+// autocompletion. Specific auto-completion logic (AJAX, etc)
+// belongs in getUpdatedChoices.
+//
+// Tokenized incremental autocompletion is enabled automatically
+// when an autocompleter is instantiated with the 'tokens' option
+// in the options parameter, e.g.:
+// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
+// will incrementally autocomplete with a comma as the token.
+// Additionally, ',' in the above example can be replaced with
+// a token array, e.g. { tokens: [',', '\n'] } which
+// enables autocompletion on multiple tokens. This is most
+// useful when one of the tokens is \n (a newline), as it
+// allows smart autocompletion after linebreaks.
+
+var Autocompleter = {}
+Autocompleter.Base = function() {};
+Autocompleter.Base.prototype = {
+ baseInitialize: function(element, update, options) {
+ this.element = $(element);
+ this.update = $(update);
+ this.hasFocus = false;
+ this.changed = false;
+ this.active = false;
+ this.index = 0;
+ this.entryCount = 0;
+
+ if (this.setOptions)
+ this.setOptions(options);
+ else
+ this.options = options || {};
+
+ this.options.paramName = this.options.paramName || this.element.name;
+ this.options.tokens = this.options.tokens || [];
+ this.options.frequency = this.options.frequency || 0.4;
+ this.options.minChars = this.options.minChars || 1;
+ this.options.onShow = this.options.onShow ||
+ function(element, update){
+ if(!update.style.position || update.style.position=='absolute') {
+ update.style.position = 'absolute';
+ Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight});
+ }
+ Effect.Appear(update,{duration:0.15});
+ };
+ this.options.onHide = this.options.onHide ||
+ function(element, update){ new Effect.Fade(update,{duration:0.15}) };
+
+ if (typeof(this.options.tokens) == 'string')
+ this.options.tokens = new Array(this.options.tokens);
+
+ this.observer = null;
+
+ this.element.setAttribute('autocomplete','off');
+
+ Element.hide(this.update);
+
+ Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
+ Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
+ },
+
+ show: function() {
+ if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
+ if(!this.iefix &&
+ (navigator.appVersion.indexOf('MSIE')>0) &&
+ (navigator.userAgent.indexOf('Opera')<0) &&
+ (Element.getStyle(this.update, 'position')=='absolute')) {
+ new Insertion.After(this.update,
+ '');
+ this.iefix = $(this.update.id+'_iefix');
+ }
+ if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
+ },
+
+ fixIEOverlapping: function() {
+ Position.clone(this.update, this.iefix);
+ this.iefix.style.zIndex = 1;
+ this.update.style.zIndex = 2;
+ Element.show(this.iefix);
+ },
+
+ hide: function() {
+ this.stopIndicator();
+ if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
+ if(this.iefix) Element.hide(this.iefix);
+ },
+
+ startIndicator: function() {
+ if(this.options.indicator) Element.show(this.options.indicator);
+ },
+
+ stopIndicator: function() {
+ if(this.options.indicator) Element.hide(this.options.indicator);
+ },
+
+ onKeyPress: function(event) {
+ if(this.active)
+ switch(event.keyCode) {
+ case Event.KEY_TAB:
+ case Event.KEY_RETURN:
+ this.selectEntry();
+ Event.stop(event);
+ case Event.KEY_ESC:
+ this.hide();
+ this.active = false;
+ Event.stop(event);
+ return;
+ case Event.KEY_LEFT:
+ case Event.KEY_RIGHT:
+ return;
+ case Event.KEY_UP:
+ this.markPrevious();
+ this.render();
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+ return;
+ case Event.KEY_DOWN:
+ this.markNext();
+ this.render();
+ if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
+ return;
+ }
+ else
+ if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
+ (navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
+
+ this.changed = true;
+ this.hasFocus = true;
+
+ if(this.observer) clearTimeout(this.observer);
+ this.observer =
+ setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
+ },
+
+ activate: function() {
+ this.changed = false;
+ this.hasFocus = true;
+ this.getUpdatedChoices();
+ },
+
+ onHover: function(event) {
+ var element = Event.findElement(event, 'LI');
+ if(this.index != element.autocompleteIndex)
+ {
+ this.index = element.autocompleteIndex;
+ this.render();
+ }
+ Event.stop(event);
+ },
+
+ onClick: function(event) {
+ var element = Event.findElement(event, 'LI');
+ this.index = element.autocompleteIndex;
+ this.selectEntry();
+ this.hide();
+ },
+
+ onBlur: function(event) {
+ // needed to make click events working
+ setTimeout(this.hide.bind(this), 250);
+ this.hasFocus = false;
+ this.active = false;
+ },
+
+ render: function() {
+ if(this.entryCount > 0) {
+ for (var i = 0; i < this.entryCount; i++)
+ this.index==i ?
+ Element.addClassName(this.getEntry(i),"selected") :
+ Element.removeClassName(this.getEntry(i),"selected");
+
+ if(this.hasFocus) {
+ this.show();
+ this.active = true;
+ }
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ },
+
+ markPrevious: function() {
+ if(this.index > 0) this.index--
+ else this.index = this.entryCount-1;
+ },
+
+ markNext: function() {
+ if(this.index < this.entryCount-1) this.index++
+ else this.index = 0;
+ },
+
+ getEntry: function(index) {
+ return this.update.firstChild.childNodes[index];
+ },
+
+ getCurrentEntry: function() {
+ return this.getEntry(this.index);
+ },
+
+ selectEntry: function() {
+ this.active = false;
+ this.updateElement(this.getCurrentEntry());
+ },
+
+ updateElement: function(selectedElement) {
+ if (this.options.updateElement) {
+ this.options.updateElement(selectedElement);
+ return;
+ }
+ var value = '';
+ if (this.options.select) {
+ var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
+ if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
+ } else
+ value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
+
+ var lastTokenPos = this.findLastToken();
+ if (lastTokenPos != -1) {
+ var newValue = this.element.value.substr(0, lastTokenPos + 1);
+ var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
+ if (whitespace)
+ newValue += whitespace[0];
+ this.element.value = newValue + value;
+ } else {
+ this.element.value = value;
+ }
+ this.element.focus();
+
+ if (this.options.afterUpdateElement)
+ this.options.afterUpdateElement(this.element, selectedElement);
+ },
+
+ updateChoices: function(choices) {
+ if(!this.changed && this.hasFocus) {
+ this.update.innerHTML = choices;
+ Element.cleanWhitespace(this.update);
+ Element.cleanWhitespace(this.update.firstChild);
+
+ if(this.update.firstChild && this.update.firstChild.childNodes) {
+ this.entryCount =
+ this.update.firstChild.childNodes.length;
+ for (var i = 0; i < this.entryCount; i++) {
+ var entry = this.getEntry(i);
+ entry.autocompleteIndex = i;
+ this.addObservers(entry);
+ }
+ } else {
+ this.entryCount = 0;
+ }
+
+ this.stopIndicator();
+
+ this.index = 0;
+ this.render();
+ }
+ },
+
+ addObservers: function(element) {
+ Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
+ Event.observe(element, "click", this.onClick.bindAsEventListener(this));
+ },
+
+ onObserverEvent: function() {
+ this.changed = false;
+ if(this.getToken().length>=this.options.minChars) {
+ this.startIndicator();
+ this.getUpdatedChoices();
+ } else {
+ this.active = false;
+ this.hide();
+ }
+ },
+
+ getToken: function() {
+ var tokenPos = this.findLastToken();
+ if (tokenPos != -1)
+ var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
+ else
+ var ret = this.element.value;
+
+ return /\n/.test(ret) ? '' : ret;
+ },
+
+ findLastToken: function() {
+ var lastTokenPos = -1;
+
+ for (var i=0; i lastTokenPos)
+ lastTokenPos = thisTokenPos;
+ }
+ return lastTokenPos;
+ }
+}
+
+Ajax.Autocompleter = Class.create();
+Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
+ initialize: function(element, update, url, options) {
+ this.baseInitialize(element, update, options);
+ this.options.asynchronous = true;
+ this.options.onComplete = this.onComplete.bind(this);
+ this.options.defaultParams = this.options.parameters || null;
+ this.url = url;
+ },
+
+ getUpdatedChoices: function() {
+ entry = encodeURIComponent(this.options.paramName) + '=' +
+ encodeURIComponent(this.getToken());
+
+ this.options.parameters = this.options.callback ?
+ this.options.callback(this.element, entry) : entry;
+
+ if(this.options.defaultParams)
+ this.options.parameters += '&' + this.options.defaultParams;
+
+ new Ajax.Request(this.url, this.options);
+ },
+
+ onComplete: function(request) {
+ this.updateChoices(request.responseText);
+ }
+
+});
+
+// The local array autocompleter. Used when you'd prefer to
+// inject an array of autocompletion options into the page, rather
+// than sending out Ajax queries, which can be quite slow sometimes.
+//
+// The constructor takes four parameters. The first two are, as usual,
+// the id of the monitored textbox, and id of the autocompletion menu.
+// The third is the array you want to autocomplete from, and the fourth
+// is the options block.
+//
+// Extra local autocompletion options:
+// - choices - How many autocompletion choices to offer
+//
+// - partialSearch - If false, the autocompleter will match entered
+// text only at the beginning of strings in the
+// autocomplete array. Defaults to true, which will
+// match text at the beginning of any *word* in the
+// strings in the autocomplete array. If you want to
+// search anywhere in the string, additionally set
+// the option fullSearch to true (default: off).
+//
+// - fullSsearch - Search anywhere in autocomplete array strings.
+//
+// - partialChars - How many characters to enter before triggering
+// a partial match (unlike minChars, which defines
+// how many characters are required to do any match
+// at all). Defaults to 2.
+//
+// - ignoreCase - Whether to ignore case when autocompleting.
+// Defaults to true.
+//
+// It's possible to pass in a custom function as the 'selector'
+// option, if you prefer to write your own autocompletion logic.
+// In that case, the other options above will not apply unless
+// you support them.
+
+Autocompleter.Local = Class.create();
+Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
+ initialize: function(element, update, array, options) {
+ this.baseInitialize(element, update, options);
+ this.options.array = array;
+ },
+
+ getUpdatedChoices: function() {
+ this.updateChoices(this.options.selector(this));
+ },
+
+ setOptions: function(options) {
+ this.options = Object.extend({
+ choices: 10,
+ partialSearch: true,
+ partialChars: 2,
+ ignoreCase: true,
+ fullSearch: false,
+ selector: function(instance) {
+ var ret = []; // Beginning matches
+ var partial = []; // Inside matches
+ var entry = instance.getToken();
+ var count = 0;
+
+ for (var i = 0; i < instance.options.array.length &&
+ ret.length < instance.options.choices ; i++) {
+
+ var elem = instance.options.array[i];
+ var foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase()) :
+ elem.indexOf(entry);
+
+ while (foundPos != -1) {
+ if (foundPos == 0 && elem.length != entry.length) {
+ ret.push("" + elem.substr(0, entry.length) + " " +
+ elem.substr(entry.length) + " ");
+ break;
+ } else if (entry.length >= instance.options.partialChars &&
+ instance.options.partialSearch && foundPos != -1) {
+ if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
+ partial.push("" + elem.substr(0, foundPos) + "" +
+ elem.substr(foundPos, entry.length) + " " + elem.substr(
+ foundPos + entry.length) + " ");
+ break;
+ }
+ }
+
+ foundPos = instance.options.ignoreCase ?
+ elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
+ elem.indexOf(entry, foundPos + 1);
+
+ }
+ }
+ if (partial.length)
+ ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
+ return "";
+ }
+ }, options || {});
+ }
+});
+
+// AJAX in-place editor
+//
+// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
+
+// Use this if you notice weird scrolling problems on some browsers,
+// the DOM might be a bit confused when this gets called so do this
+// waits 1 ms (with setTimeout) until it does the activation
+Field.scrollFreeActivate = function(field) {
+ setTimeout(function() {
+ Field.activate(field);
+ }, 1);
+}
+
+Ajax.InPlaceEditor = Class.create();
+Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
+Ajax.InPlaceEditor.prototype = {
+ initialize: function(element, url, options) {
+ this.url = url;
+ this.element = $(element);
+
+ this.options = Object.extend({
+ okButton: true,
+ okText: "ok",
+ cancelLink: true,
+ cancelText: "cancel",
+ savingText: "Saving...",
+ clickToEditText: "Click to edit",
+ okText: "ok",
+ rows: 1,
+ onComplete: function(transport, element) {
+ new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
+ },
+ onFailure: function(transport) {
+ alert("Error communicating with the server: " + transport.responseText.stripTags());
+ },
+ callback: function(form) {
+ return Form.serialize(form);
+ },
+ handleLineBreaks: true,
+ loadingText: 'Loading...',
+ savingClassName: 'inplaceeditor-saving',
+ loadingClassName: 'inplaceeditor-loading',
+ formClassName: 'inplaceeditor-form',
+ highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
+ highlightendcolor: "#FFFFFF",
+ externalControl: null,
+ submitOnBlur: false,
+ ajaxOptions: {},
+ evalScripts: false
+ }, options || {});
+
+ if(!this.options.formId && this.element.id) {
+ this.options.formId = this.element.id + "-inplaceeditor";
+ if ($(this.options.formId)) {
+ // there's already a form with that name, don't specify an id
+ this.options.formId = null;
+ }
+ }
+
+ if (this.options.externalControl) {
+ this.options.externalControl = $(this.options.externalControl);
+ }
+
+ this.originalBackground = Element.getStyle(this.element, 'background-color');
+ if (!this.originalBackground) {
+ this.originalBackground = "transparent";
+ }
+
+ this.element.title = this.options.clickToEditText;
+
+ this.onclickListener = this.enterEditMode.bindAsEventListener(this);
+ this.mouseoverListener = this.enterHover.bindAsEventListener(this);
+ this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
+ Event.observe(this.element, 'click', this.onclickListener);
+ Event.observe(this.element, 'mouseover', this.mouseoverListener);
+ Event.observe(this.element, 'mouseout', this.mouseoutListener);
+ if (this.options.externalControl) {
+ Event.observe(this.options.externalControl, 'click', this.onclickListener);
+ Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
+ Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
+ }
+ },
+ enterEditMode: function(evt) {
+ if (this.saving) return;
+ if (this.editing) return;
+ this.editing = true;
+ this.onEnterEditMode();
+ if (this.options.externalControl) {
+ Element.hide(this.options.externalControl);
+ }
+ Element.hide(this.element);
+ this.createForm();
+ this.element.parentNode.insertBefore(this.form, this.element);
+ Field.scrollFreeActivate(this.editField);
+ // stop the event to avoid a page refresh in Safari
+ if (evt) {
+ Event.stop(evt);
+ }
+ return false;
+ },
+ createForm: function() {
+ this.form = document.createElement("form");
+ this.form.id = this.options.formId;
+ Element.addClassName(this.form, this.options.formClassName)
+ this.form.onsubmit = this.onSubmit.bind(this);
+
+ this.createEditField();
+
+ if (this.options.textarea) {
+ var br = document.createElement("br");
+ this.form.appendChild(br);
+ }
+
+ if (this.options.okButton) {
+ okButton = document.createElement("input");
+ okButton.type = "submit";
+ okButton.value = this.options.okText;
+ okButton.className = 'editor_ok_button';
+ this.form.appendChild(okButton);
+ }
+
+ if (this.options.cancelLink) {
+ cancelLink = document.createElement("a");
+ cancelLink.href = "#";
+ cancelLink.appendChild(document.createTextNode(this.options.cancelText));
+ cancelLink.onclick = this.onclickCancel.bind(this);
+ cancelLink.className = 'editor_cancel';
+ this.form.appendChild(cancelLink);
+ }
+ },
+ hasHTMLLineBreaks: function(string) {
+ if (!this.options.handleLineBreaks) return false;
+ return string.match(/ /i);
+ },
+ convertHTMLLineBreaks: function(string) {
+ return string.replace(/ /gi, "\n").replace(/ /gi, "\n").replace(/<\/p>/gi, "\n").replace(//gi, "");
+ },
+ createEditField: function() {
+ var text;
+ if(this.options.loadTextURL) {
+ text = this.options.loadingText;
+ } else {
+ text = this.getText();
+ }
+
+ var obj = this;
+
+ if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
+ this.options.textarea = false;
+ var textField = document.createElement("input");
+ textField.obj = this;
+ textField.type = "text";
+ textField.name = "value";
+ textField.value = text;
+ textField.style.backgroundColor = this.options.highlightcolor;
+ textField.className = 'editor_field';
+ var size = this.options.size || this.options.cols || 0;
+ if (size != 0) textField.size = size;
+ if (this.options.submitOnBlur)
+ textField.onblur = this.onSubmit.bind(this);
+ this.editField = textField;
+ } else {
+ this.options.textarea = true;
+ var textArea = document.createElement("textarea");
+ textArea.obj = this;
+ textArea.name = "value";
+ textArea.value = this.convertHTMLLineBreaks(text);
+ textArea.rows = this.options.rows;
+ textArea.cols = this.options.cols || 40;
+ textArea.className = 'editor_field';
+ if (this.options.submitOnBlur)
+ textArea.onblur = this.onSubmit.bind(this);
+ this.editField = textArea;
+ }
+
+ if(this.options.loadTextURL) {
+ this.loadExternalText();
+ }
+ this.form.appendChild(this.editField);
+ },
+ getText: function() {
+ return this.element.innerHTML;
+ },
+ loadExternalText: function() {
+ Element.addClassName(this.form, this.options.loadingClassName);
+ this.editField.disabled = true;
+ new Ajax.Request(
+ this.options.loadTextURL,
+ Object.extend({
+ asynchronous: true,
+ onComplete: this.onLoadedExternalText.bind(this)
+ }, this.options.ajaxOptions)
+ );
+ },
+ onLoadedExternalText: function(transport) {
+ Element.removeClassName(this.form, this.options.loadingClassName);
+ this.editField.disabled = false;
+ this.editField.value = transport.responseText.stripTags();
+ },
+ onclickCancel: function() {
+ this.onComplete();
+ this.leaveEditMode();
+ return false;
+ },
+ onFailure: function(transport) {
+ this.options.onFailure(transport);
+ if (this.oldInnerHTML) {
+ this.element.innerHTML = this.oldInnerHTML;
+ this.oldInnerHTML = null;
+ }
+ return false;
+ },
+ onSubmit: function() {
+ // onLoading resets these so we need to save them away for the Ajax call
+ var form = this.form;
+ var value = this.editField.value;
+
+ // do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
+ // which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
+ // to be displayed indefinitely
+ this.onLoading();
+
+ if (this.options.evalScripts) {
+ new Ajax.Request(
+ this.url, Object.extend({
+ parameters: this.options.callback(form, value),
+ onComplete: this.onComplete.bind(this),
+ onFailure: this.onFailure.bind(this),
+ asynchronous:true,
+ evalScripts:true
+ }, this.options.ajaxOptions));
+ } else {
+ new Ajax.Updater(
+ { success: this.element,
+ // don't update on failure (this could be an option)
+ failure: null },
+ this.url, Object.extend({
+ parameters: this.options.callback(form, value),
+ onComplete: this.onComplete.bind(this),
+ onFailure: this.onFailure.bind(this)
+ }, this.options.ajaxOptions));
+ }
+ // stop the event to avoid a page refresh in Safari
+ if (arguments.length > 1) {
+ Event.stop(arguments[0]);
+ }
+ return false;
+ },
+ onLoading: function() {
+ this.saving = true;
+ this.removeForm();
+ this.leaveHover();
+ this.showSaving();
+ },
+ showSaving: function() {
+ this.oldInnerHTML = this.element.innerHTML;
+ this.element.innerHTML = this.options.savingText;
+ Element.addClassName(this.element, this.options.savingClassName);
+ this.element.style.backgroundColor = this.originalBackground;
+ Element.show(this.element);
+ },
+ removeForm: function() {
+ if(this.form) {
+ if (this.form.parentNode) Element.remove(this.form);
+ this.form = null;
+ }
+ },
+ enterHover: function() {
+ if (this.saving) return;
+ this.element.style.backgroundColor = this.options.highlightcolor;
+ if (this.effect) {
+ this.effect.cancel();
+ }
+ Element.addClassName(this.element, this.options.hoverClassName)
+ },
+ leaveHover: function() {
+ if (this.options.backgroundColor) {
+ this.element.style.backgroundColor = this.oldBackground;
+ }
+ Element.removeClassName(this.element, this.options.hoverClassName)
+ if (this.saving) return;
+ this.effect = new Effect.Highlight(this.element, {
+ startcolor: this.options.highlightcolor,
+ endcolor: this.options.highlightendcolor,
+ restorecolor: this.originalBackground
+ });
+ },
+ leaveEditMode: function() {
+ Element.removeClassName(this.element, this.options.savingClassName);
+ this.removeForm();
+ this.leaveHover();
+ this.element.style.backgroundColor = this.originalBackground;
+ Element.show(this.element);
+ if (this.options.externalControl) {
+ Element.show(this.options.externalControl);
+ }
+ this.editing = false;
+ this.saving = false;
+ this.oldInnerHTML = null;
+ this.onLeaveEditMode();
+ },
+ onComplete: function(transport) {
+ this.leaveEditMode();
+ this.options.onComplete.bind(this)(transport, this.element);
+ },
+ onEnterEditMode: function() {},
+ onLeaveEditMode: function() {},
+ dispose: function() {
+ if (this.oldInnerHTML) {
+ this.element.innerHTML = this.oldInnerHTML;
+ }
+ this.leaveEditMode();
+ Event.stopObserving(this.element, 'click', this.onclickListener);
+ Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
+ Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
+ if (this.options.externalControl) {
+ Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
+ Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
+ Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
+ }
+ }
+};
+
+Ajax.InPlaceCollectionEditor = Class.create();
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
+Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
+ createEditField: function() {
+ if (!this.cached_selectTag) {
+ var selectTag = document.createElement("select");
+ var collection = this.options.collection || [];
+ var optionTag;
+ collection.each(function(e,i) {
+ optionTag = document.createElement("option");
+ optionTag.value = (e instanceof Array) ? e[0] : e;
+ if(this.options.value==optionTag.value) optionTag.selected = true;
+ optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
+ selectTag.appendChild(optionTag);
+ }.bind(this));
+ this.cached_selectTag = selectTag;
+ }
+
+ this.editField = this.cached_selectTag;
+ if(this.options.loadTextURL) this.loadExternalText();
+ this.form.appendChild(this.editField);
+ this.options.callback = function(form, value) {
+ return "value=" + encodeURIComponent(value);
+ }
+ }
+});
+
+// Delayed observer, like Form.Element.Observer,
+// but waits for delay after last key input
+// Ideal for live-search fields
+
+Form.Element.DelayedObserver = Class.create();
+Form.Element.DelayedObserver.prototype = {
+ initialize: function(element, delay, callback) {
+ this.delay = delay || 0.5;
+ this.element = $(element);
+ this.callback = callback;
+ this.timer = null;
+ this.lastValue = $F(this.element);
+ Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
+ },
+ delayedListener: function(event) {
+ if(this.lastValue == $F(this.element)) return;
+ if(this.timer) clearTimeout(this.timer);
+ this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
+ this.lastValue = $F(this.element);
+ },
+ onTimerEvent: function() {
+ this.timer = null;
+ this.callback(this.element, $F(this.element));
+ }
+};
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/index.php
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/index.php (revision 8166)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/index.php (revision 8166)
@@ -0,0 +1,94 @@
+
+header("Content-type: text/html; charset=utf-8");
+
+if(isset($_GET['context'])) {
+ $contexto=$_GET['context'];
+ $contexto=strtoupper($contexto);
+ $archivo = "variables$contexto.txt";
+} else {
+ $archivo="variables.txt";
+}
+
+$pepe = file_get_contents($archivo);
+$partes = split("&",$pepe);
+foreach ($partes as $elemento) {
+ $otri = split("=",$elemento);
+ if(substr($otri[0],0,5)=="texto") {
+ $numero = substr($otri[0],5);
+ if($numero > $buttoncount) {$buttoncount = $numero;}
+ }
+}
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+for($a=1;$a<=$buttoncount;$a++)
+{
+$mouseov=" onmouseover='javascript:$(\"mcount$a\").style.display=\"block\";' onmouseout='javascript:$(\"mcount$a\").style.display=\"none\";' ";
+$mouseov1 = " onMouseover=\"TagToTip('mwitip$a')\"; onMouseout=\"UnTip()\" ";
+$mouseov2 = " onMouseover=\"TagToTip('phonetip$a')\"; onMouseout=\"UnTip()\" ";
+echo "\n";
+echo "
\n";
+echo "
\n";
+echo "
";
+echo "
";
+echo "
";
+echo "
";
+echo "
";
+echo "
\n";
+}
+?>
+
+
+
+
+
+
+
+
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/variables.php
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/variables.php (revision 8165)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/dhtml/variables.php (revision 8165)
@@ -0,0 +1,29 @@
+
+header("Content-type: text/html; charset=utf-8");
+
+if(isset($_GET['context'])) {
+ $contexto=$_GET['context'];
+ $contexto=strtoupper($contexto);
+ $archivo = "variables$contexto.txt";
+} else {
+ $archivo="variables.txt";
+}
+
+$pepe = file_get_contents($archivo);
+$partes = split("&",$pepe);
+foreach ($partes as $elemento) {
+ $otri = split("=",$elemento);
+ if(substr($otri[0],0,5)=="texto") {
+ $numero = substr($otri[0],5);
+ if($numero > $maxnumero) {$maxnumero = $numero;}
+ $printresponse.="$otri[0]=$otri[1]&";
+ }
+ if(substr($otri[0],0,4)=="icon") {
+ $printresponse.="$otri[0]=$otri[1]&";
+ }
+}
+$printresponse.="maxnumero=$maxnumero";
+
+echo $printresponse;
+?>
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/CHANGES
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/CHANGES (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/CHANGES (revision 8095)
@@ -0,0 +1,1213 @@
+Version .29
+
+2008-05-29 13:26 +0000 [r77] root :
+
+ * trunk/op_server.pl, trunk/ming-source/operator_panel.pl: Fix -
+ prefix in extension when using wildcard server
+
+2008-05-14 11:39 +0000 [r76] root :
+
+ * trunk/op_server.pl: Remove some debug print lines
+
+2008-05-07 18:52 +0000 [r75] root :
+
+ * trunk/op_server.pl: Add new event for dhtml client
+
+2008-05-06 14:19 +0000 [r74] root :
+
+ * trunk/op_buttons.cfg: Fix regexp sample in op_buttons.cfg
+
+2008-04-10 19:44 +0000 [r73] root :
+
+ * trunk/op_server.pl: Serve policy file from server to make new
+ flash clients happy. Also formatting fixes using perltidy and
+ line lenght of 140
+
+Version .28
+
+2008-03-30 [r70]
+
+ * Remove dhtmltooltip and replace with wz_tooltip
+
+2008-02-19 [r69]
+
+ * Add sample crossdomain.xml file needed by some flash players
+
+2008-01-28 [r68]
+
+ * New langague added 'gallego'
+
+2007-12-04 [r67]
+
+ * Fix reverse transfer for park
+
+2007-11-29 [r66]
+
+ * Add extra event for meetmejoin because sometimes there are no
+ newexten events when redirecting to meetme in attendant transfers
+
+2007-11-29 [r65]
+
+ * Add support for channel in voicemailext, so you can use it to
+ launch a macro via local when double clicking on the mailbox icon
+
+2007-11-29 [r64]
+
+ * Add parkexten and parktimeout to op_server.cfg and support for
+ Park command via manager together with updates for Asterisk 1.4
+ compatibility.
+
+2007-11-29 [r63]
+
+ * Make it work with asterisk 1.4 originateresponse change (for
+ attendant transfers)
+
+2007-11-23 [r62]
+
+ * add SpyExt command and drop action to arrow
+
+2007-11-07 [r61]
+
+ * Honour label_extent when renaming label
+
+2007-08-13 [r60]
+
+ * Fix 'waiting on queue' for normal buttons and some formatting
+ fixes
+
+2007-08-06 [r59]
+
+ * Fix clidtext for queue summary buttons
+
+2007-08-06 [r58]
+
+ * Add support for QUEUE_PRIO for queue join events
+
+2007-08-06 [r57]
+
+ * Fix for groupcount and timers
+
+2007-08-06 [r56]
+
+ * Fix timer issue
+
+2007-08-02 [r55]
+
+ * Remove delay in syswrite because it makes asterisk 1.2.7 unhappy
+
+2007-08-02 [r54]
+
+ * Example new buttons config for groupcount
+
+2007-08-02 [r53]
+
+ * Ooops! Format clid fixed
+
+2007-08-02 [r52]
+
+ * Ooops! Set version to 0.30
+
+2007-08-02 [r51]
+
+ * no_label_counter in op_buttons.cfg (prevents counting on multiple
+ position labels). Fixes on groupcount. Added count to
+ op_buttons.cfg to set number of sessions for group_count buttons
+
+2007-07-17 [r50]
+
+ * Fix restrict for panel_context
+
+2007-07-17 [r49]
+
+ * Fix flash client for multiple passvars values
+
+2007-06-29 [r48]
+
+ * Added optional amportal.conf parsing
+
+2007-06-28 [r47]
+
+ * Added date variables replacement for monitor_filename (%Y %m %d
+ %h %i %s)
+
+2007-06-21 [r46]
+
+ * Add Monitoring to FOP actions by single clicking on the arrow
+
+2007-06-15 [r45]
+
+ * Add 1ms delay to syswrite, it makes some asterisk versions
+ happier
+
+2007-05-30 [r44]
+
+ * Add include support to op_server.cfg
+
+2007-05-14 [r43]
+
+ * Add passvars parameter to op_server.cfg to pass extra values to
+ popups
+
+2007-05-14 [r42]
+
+ * Support for patched valetparking
+
+2007-04-30 [r41]
+
+ * Fix for regexp buttons when coupled with Local channels
+
+2007-04-27 [r40]
+
+ * Remove AsyncGoto from channel name so parking with zap works
+ better.
+
+2007-04-27 [r39]
+
+ * More split optimizations
+
+2007-04-27 [r37-38]
+
+ * Proper debug instead of print
+
+ * Slight change to redhat init script in preparation of .spec
+
+2007-04-26 [r36]
+
+ * Russian language files. Thanks Eugene Malikov.
+
+2007-04-26 [r35]
+
+ * recompute_queues optimizations and some perl tidyup
+
+2007-04-26 [r34]
+
+ * More regexp optimizations and debugs
+
+2007-04-26 [r33]
+
+ * Remove unused vars and optimize erase_instances_for_trunk_buttons
+
+2007-04-26 [r32]
+
+ * Remove more unused vars
+
+2007-04-26 [r31]
+
+ * Remove unused var and optimize some regexps
+
+2007-04-24 [r30]
+
+ * Fix split contexto order. Replace nada with undef. Fix
+ recompute_queues states
+
+2007-04-23 [r29]
+
+ * Improve and optimize perl splits. Use warnings pragma instead of
+ -w.
+
+2007-04-19 [r28]
+
+ * Change nonblocking perl perl code (LINworks GmbH)
+
+2007-04-19 [r27]
+
+ * Improve perl code (LINworks GmbH)
+
+2007-04-19 [r26]
+
+ * Improve perl code (LINworks GmbH)
+
+2007-04-13 [r25]
+
+ * Fixed persistent clid-label for recompute queues
+
+2007-03-23 [r23-24]
+
+ * Fix on flash client for unregistration events
+
+ * Registration caching to not flood flash clients with repited
+ registered events. Changed debug level for digest_event_block and
+ try to make some sense out of it
+
+2007-03-23 [r22]
+
+ * Starting with digest_event_block clean ups
+
+2007-03-23 [r21]
+
+ * Fix voicemail count (ticket #1)
+
+2007-03-20 [r20]
+
+ * Fix Did/Trunk free routine and remove debug lines
+
+2007-03-20 [r19]
+
+ * Fix trunk matching for CLID and DID buttons
+
+2007-03-20 [r18]
+
+ * Add (experimental) DID buttons for matching FreePBX FROM_DID
+ lines
+
+2007-03-20 [r17]
+
+ * Trunkify CLID buttons
+
+2007-03-19 [r12]
+
+ * Make clid on busy buttons show up when 1st load instead of
+ permanent text
+
+2007-03-16 [r11]
+
+ * Add onData prototype (commented) into the flash client... will
+ experiment to see if it is faster than standard flash XML
+ processing
+
+2007-03-16 [r10]
+
+ * refactoring of digest_event_block, first pass...
+
+2007-03-16 [r9]
+
+ * If/elseif refactoring plus fixing newexten duplication in
+ procesabloque
+
+2007-03-16 [r8]
+
+ * Refactoring if-elseif, setting clid on newexten prio 1 for
+ showing dialed number. Changing settext to setclid
+
+2007-03-15 [r7]
+
+ * Set svn version to op_server.pl
+
+2007-03-15 [r6] nicolas:
+
+ * Update docs
+
+2007-03-14 [r5]
+
+ * Update documentation. Make settext to be persistent overriding
+ callerid values sent by regular states. Do not default to state
+ up for events without state
+
+2007-03-14 [r4]
+
+ * Reorganize svn, remove compiled flash movies from repository
+
+2007-03-14 [r3]
+
+ * fix autosip crash after asterisk restart
+
+
+Version .27
+
+Mon Feb 26 20:33:03 ART 2007 nicolas@house.com.ar
+ * sample config update with alarm
+
+Mon Feb 26 20:31:40 ART 2007 nicolas@house.com.ar
+ * new .swf
+
+Mon Feb 26 20:31:05 ART 2007 nicolas@house.com.ar
+ * timer alarms for buttons
+
+Mon Feb 26 19:23:48 ART 2007 nicolas@house.com.ar
+ * queuestatus fixes
+
+Mon Feb 26 19:19:36 ART 2007 nicolas@house.com.ar
+ * multiserver mionitoring, no security code fixes, userevent updates for 1.4, doc updates
+
+Tue Jan 23 19:09:50 ART 2007 nicolas@house.com.ar
+ * some callerid modifications
+
+Tue Jan 23 17:35:10 ART 2007 nicolas@house.com.ar
+ * reload when asterisk reload
+
+Fri Jan 19 16:22:12 ART 2007 nicolas@house.com.ar
+ * callerid name in clidformat and some documentation updates
+
+Fri Dec 22 20:57:39 ART 2006 nicolas@house.com.ar
+ * Exception for mISDN sessions
+
+Thu Dec 21 20:18:28 ART 2006 nicolas@house.com.ar
+ * updated CHANGES
+
+Thu Dec 21 20:16:08 ART 2006 nicolas@house.com.ar
+ * restructure some if blocks, formatting fixes
+
+Thu Dec 21 20:14:51 ART 2006 nicolas@house.com.ar
+ * fix big memory leak
+
+Thu Dec 21 20:08:27 ART 2006 nicolas@house.com.ar
+ * updated swf back to new version
+
+Mon Dec 11 12:23:31 ART 2006 nicolas@house.com.ar
+ * link fix
+
+Mon Nov 20 11:40:40 ART 2006 nicolas@house.com.ar
+ * defaults to free after fopledcolor
+
+Fri Nov 17 21:02:38 ART 2006 nicolas@house.com.ar
+ * update docs and binary swf
+
+Fri Nov 17 21:00:38 ART 2006 nicolas@house.com.ar
+ * fix event order to give precedence to astdb fopledcolors
+
+Fri Nov 17 21:00:04 ART 2006 nicolas@house.com.ar
+ * update docs on astdbkey and groupcount features
+
+Fri Nov 17 20:58:56 ART 2006 nicolas@house.com.ar
+ * update ming source for flash client adding images and textexten
+
+Fri Nov 17 20:57:07 ART 2006 nicolas@house.com.ar
+ * add park support to dhtml panel (thanks Jeremy)
+
+Thu Nov 16 14:46:07 ART 2006 nicolas@house.com.ar
+ * add CHANGES file that was somewhat forgotten
+
+Thu Nov 16 14:43:18 ART 2006 nicolas@house.com.ar
+ * Improve Autosip buttons
+
+Tue Nov 14 14:18:57 ART 2006 nicolas@house.com.ar
+ * fix groupcount outbound label
+
+Mon Nov 13 20:57:26 ART 2006 nicolas@house.com.ar
+ * groupcount example button
+
+Mon Nov 13 20:47:37 ART 2006 nicolas@house.com.ar
+ * add norwegian lang
+
+Mon Nov 13 20:46:29 ART 2006 nicolas@house.com.ar
+ * doc formatting fix
+
+Mon Nov 13 20:46:05 ART 2006 nicolas@house.com.ar
+ * assorted fixes
+
+Mon Nov 13 20:45:37 ART 2006 nicolas@house.com.ar
+ * groupcount button feature
+
+Mon Nov 13 20:44:52 ART 2006 nicolas@house.com.ar
+ * add image primitive
+
+Mon Nov 13 20:43:03 ART 2006 nicolas@house.com.ar
+ * lang updates
+
+Mon Nov 13 20:41:47 ART 2006 nicolas@house.com.ar
+ * docs update
+
+Fri Oct 20 15:46:47 ART 2006 nicolas@house.com.ar
+ * add images
+
+Wed Oct 11 18:29:05 ART 2006 nicolas@house.com.ar
+ * config doc and style update
+
+Wed Oct 11 18:22:26 ART 2006 nicolas@house.com.ar
+ * config and lang updates
+
+Wed Oct 11 18:19:17 ART 2006 nicolas@house.com.ar
+ * Agent fixes
+
+Mon Oct 9 17:37:19 ART 2006 nicolas@house.com.ar
+ * Fix ASTDB
+
+Mon Oct 9 17:36:54 ART 2006 nicolas@house.com.ar
+ * new swf
+
+Thu Sep 14 19:00:16 ART 2006 nicolas@house.com.ar
+ * clidname
+
+Mon Aug 28 16:55:23 ART 2006 nicolas@house.com.ar
+ * comment config
+
+Sat Sep 9 13:13:42 ART 2006 nicolas@house.com.ar
+ * Fix reverse transfer for trunk buttons
+
+Sat Sep 9 13:13:29 ART 2006 nicolas@house.com.ar
+ * typo in dhtml panel
+
+Sat Sep 9 13:12:55 ART 2006 nicolas@house.com.ar
+ * doc update
+
+Mon Aug 28 16:45:20 ART 2006 nicolas@house.com.ar
+ * Assorted patches, show borders, paused, attendant transfers
+
+Thu Jun 1 10:12:09 ART 2006 nicolas@house.com.ar
+ * auto_sip buttons entry in doc and config
+
+Thu Jun 1 10:08:18 ART 2006 nicolas@house.com.ar
+ * fix warning when computing queue positions
+
+Thu Jun 1 10:07:27 ART 2006 nicolas@house.com.ar
+ * add queue_object hash to keep track of agent status per queue (talking, ready, unavailable)
+
+Thu Jun 1 10:06:02 ART 2006 nicolas@house.com.ar
+ * first pass at auto_sip buttons
+
+Thu Jun 1 10:04:31 ART 2006 nicolas@house.com.ar
+ * fix crash on meetme transfers to voicemail
+
+Thu Jun 1 09:59:22 ART 2006 nicolas@house.com.ar
+ * rename hash to better name and remove some comments for queue-agents
+
+Thu Jun 1 09:57:16 ART 2006 nicolas@house.com.ar
+ * flash client optimization on debug window
+
+Fri May 19 17:41:26 ART 2006 nicolas@house.com.ar
+ * tovoicemail fix and label renaming fix
+
+Fri May 19 17:39:43 ART 2006 nicolas@house.com.ar
+ * queue position fix
+
+
+Version .26
+
+Tue May 9 19:24:08 ART 2006 nicolas@house.com.ar
+ * New dhtml client
+
+Tue May 9 15:05:22 ART 2006 nicolas@house.com.ar
+ * assorted client fixes, removed scriptable actions for now,
+ add side scrolling when you have buttons that do not fit
+ on the screen.
+
+Tue May 9 15:03:27 ART 2006 nicolas@house.com.ar
+ * remove scriptable actions and assorted bug fixes
+
+Sat Apr 29 15:41:14 ART 2006 nicolas@house.com.ar
+ * ming client updates
+
+Sat Apr 29 15:40:06 ART 2006 nicolas@house.com.ar
+ * formatting fixes. Add includes to op_style.cfg
+
+Sat Apr 29 13:04:58 ART 2006 nicolas@house.com.ar
+ * set clid format on link event
+
+Sat Apr 29 13:04:43 ART 2006 nicolas@house.com.ar
+ * fix auto counters when using regexp butons
+
+Sat Apr 29 13:03:25 ART 2006 nicolas@house.com.ar
+ * scriptable actions, tovoicemail actions, formatting fixes
+
+Sat Apr 29 12:58:54 ART 2006 nicolas@house.com.ar
+ * includes style, simplify read configs, formatting fixes, removed comments
+
+Sat Apr 29 12:57:22 ART 2006 nicolas@house.com.ar
+ * log fake events
+
+Sat Apr 29 12:52:48 ART 2006 nicolas@house.com.ar
+ * transfer to voicemail
+
+Sat Apr 29 11:40:50 ART 2006 nicolas@house.com.ar
+ * agent status updates, paused and some formatting fixes
+
+Sat Apr 29 11:13:04 ART 2006 nicolas@house.com.ar
+ * clid privacy per button
+
+Sat Apr 29 11:02:16 ART 2006 nicolas@house.com.ar
+ * background jpg for buttons
+
+Thu Mar 23 14:47:57 ART 2006 nicolas@house.com.ar
+ * remove duplicated code
+
+Thu Mar 23 14:47:18 ART 2006 nicolas@house.com.ar
+ * suse init fixes
+
+Thu Mar 23 14:46:39 ART 2006 nicolas@house.com.ar
+ * configurable dimm/alpha
+
+Thu Mar 16 16:14:36 ART 2006 nicolas@house.com.ar
+ tagged 0.26
+
+Version .25
+
+Mon Mar 13 17:01:23 ART 2006 nicolas@house.com.ar
+ * documentation updates
+
+Mon Mar 13 16:56:00 ART 2006 nicolas@house.com.ar
+ * queueagent optimizations
+
+Fri Mar 10 17:33:25 ART 2006 nicolas@house.com.ar
+ * clean internal state when connecting to server
+
+Fri Mar 10 17:07:09 ART 2006 nicolas@house.com.ar
+ * add_server_to_fake_events
+ We need to add the server header to fake events!
+
+Fri Mar 10 17:06:44 ART 2006 nicolas@house.com.ar
+ * formatting_fixes
+
+Fri Mar 10 17:05:03 ART 2006 nicolas@house.com.ar
+ * update docs
+
+Mon Feb 27 19:40:37 ART 2006 nicolas@house.com.ar
+ * updated docs
+
+Mon Feb 27 19:27:28 ART 2006 nicolas@house.com.ar
+ * do not send settimer for nonexistant queues
+
+Mon Feb 27 19:25:36 ART 2006 nicolas@house.com.ar
+ * Clear counter when there are no calls in queue
+
+Mon Feb 27 17:27:41 ART 2006 nicolas@house.com.ar
+ * restrict to channel name same as mybutton
+
+Tue Feb 21 17:26:13 ART 2006 nicolas@house.com.ar
+ * fix meetme sccp
+
+Tue Feb 21 16:09:02 ART 2006 nicolas@house.com.ar
+ * Catalan language
+
+Mon Feb 20 16:10:40 ART 2006 nicolas@house.com.ar
+ * suse_init
+
+Mon Feb 20 15:55:22 ART 2006 nicolas@house.com.ar
+ * link_buttons
+ Add url and target to the button definition so you can hyperlink
+ to anything you want from any button.
+ Also added the enable_label_background that sets the background
+ color on the labels to the led colors depeding on state.
+
+Thu Feb 2 17:51:42 ART 2006 nicolas@house.com.ar
+ * listen_addr
+ Add listen_addr parameter to select the ip address the server will bind to
+
+Tue Jan 31 20:49:13 ART 2006 nicolas@house.com.ar
+ * NewSwf
+
+Tue Jan 31 20:47:11 ART 2006 nicolas@house.com.ar
+ * fontfix
+ Fix several font issues on the flash client
+
+Tue Jan 31 20:41:04 ART 2006 nicolas@house.com.ar
+ * Remove channel from queue hash on rename.. fix for queue buttons
+
+Tue Jan 31 20:32:40 ART 2006 nicolas@house.com.ar
+ * Ignore & from trunk sessions, fix TRUNK problem.
+
+Tue Dec 27 00:33:17 ART 2005 nicolas@house.com.ar
+ * Fixed trunk sticky problem
+
+ - Fixed choppig the last character from op_server.cfg
+ when there was no end of line
+
+ - Fixed text on buttons when using crypto and the text
+ was empty
+
+ - Changed the mute/unmute to gray out a button when muted
+
+ - Fixed agentlogoff for channels with a hypen in the name
+
+ - New states for sccp, thanks to Laurent Mele
+
+ - New parameter to pass to operator_panel.swf: nohighligh. If set
+ to 1, button highlighting when mouse over will be disabled.
+
+ - New LEGEND attributes: URL, TARGET, NO_BASE64. Url for making an
+ hyperlink out of the legend to that url, TARGET to use that html
+ target when clicking the hyperlink, and NO_BASE64 to not convert
+ the legend to base64 (it is not useful at all)
+
+ - Drag&Drop channels into queues. Just drag an unused button into a
+ queue button and it will be added to that queue. If dragged again,
+ it will remove it from that queue.
+
+ - astmanproxy support
+
+ - Added Meetme participants buttons (they show each participant)
+
+ - Added Queue position buttons (they show each position on a queue,
+ with the corresponding timer and callerid)
+
+ - Added queue_hide option in op_server.cfg. If set, queue position
+ buttons won't be displayed if they are unused (so you only see
+ the actual number of people waiting on the queue)
+
+ - Fixed bugs for queue positions when reloading
+
+ - Fixed timers when reloading
+
+.24
+ Sep 12 2005:
+
+ - Small bugfix, the security code is now working for everybody
+
+ - Added swedish translation
+
+ - Improved efficiency of regexp button matching
+
+.23
+ Sep 9 2005:
+
+ - FOP now tries to keep track of the number of agents logged into
+ each queue, and displays that info in the queue detailed status box.
+
+ - Added Mask filter for manager events. The new parameter
+ is "event_mask" and should be written just below each server
+ definition. View op_server.cfg for a sample.
+
+ - Added Queue Position status. Just change your queue buttons to use
+ more than one position. Then, instead of having a summary button for
+ your queue you will have each button position occupied by the person
+ waiting in that same position on your queue. You can drag them as any
+ other button to transfer.
+
+ - Internationalization support. 'language' configuration directive
+ in op_server.cfg and op_lang_XX.cfg files and help_XX.html
+
+ - Support for command line parameters, start the server with --help
+ to see the list of supported options
+
+ - The web_hostname and port settings in op_server.cfg are now optional
+ If omited it will connect to the same host where the .swf resides and
+ port 4445
+
+ - Added restriction for mybutton to FOP_Popup userevent, just add the
+ (optional) Button parameter with the button position (that must be
+ set in the client's mybutton parameter)
+
+ UserEvent(FOP_Popup|URL: page.php?e=${EXTEN}^Target: top^Button: 1)
+
+ - Added font and shadow color parameters for button labels, text
+ legends, clid and timer. In op_style.cfg you have 4 optional new
+ parameters:
+
+ label_font_color = 000000
+ label_shadow_color = FFFFFF
+ clid_font_color = 000000
+ timer_font_color = 4000FF
+
+ You have to put the hex color code for each one. To change the color of
+ a legend use the parameter:
+
+ font_color = FF0000
+
+ - Improved debian init script. Thanks to Tzafir Cohen.
+
+ - It uses a lot less CPU than previous versions on heavy asterisk boxes
+
+ - Improved support for parking when using native sip transfers
+
+ - Minor bugfixes
+
+.22
+ Jun 9 2005:
+
+ - Minor bugfixes
+
+.21
+ May 29 2005:
+
+ - You can use 'transparent' as a fade_color for a button in
+ op_style.cfg. That button will only display its borders, with
+ no background color. You can use the background.jpg in creative
+ ways now.
+
+ - The restrict input parameter can be set to a channel name
+ instead of just the button possition. The restricted button
+ will be hightlithed.
+
+ - Added margintop and marginleft to the input parameters taken by
+ operator_panel.swf, to set the global margins for the swf object.
+ You can experiment by loading the .swf file directly like:
+ operator_panel.swf?margintop=20&marginleft=40
+
+ - Added voicemail_extension parameter to op_server.cfg. If set,
+ FOP will originate a call to that extension when double clicking
+ on the MWI icon.
+
+ - Added version checking between client & server
+
+ - You can disable the icon for a button by using icon=0
+
+ - Added support for Zap DND state. You have to define the 'dnd'
+ family in op_astdb.cfg
+
+ - Added astdb checks. See op_astdb.cfg and extensions.conf.sample
+ for details. You can check for day/time mode or anything that its
+ stored on asterisk db.
+
+ - Changed the PARKXXX buttons to PARK/XXX for consistency. The old
+ syntax will still work fine.
+
+ - Added monitoring for callerid instead of channel name. Use
+ [CLID/XXXXXX] as the button name in op_buttons.cfg. Its experimental
+ Commands like originates and others might not work. This kind
+ of button will work with CVS-HEAD and without using the dial 'o'
+ flag.
+
+ - Added persistent security code. It remembers your last input so
+ you don't have to complete it the next time you open FOP.
+
+ - Added Panel_Context=* to op_buttons.cfg files, with it, that entry
+ will be added to every panel context defined.
+
+ - Fixed callerid on CVS-HEAD, now it works without using
+ the dial 'o' flag
+
+ - Added agent status. It displays Idle status an its
+ timers, and refresh queue statistics after each agent
+ call. Set agent_status to 1 in op_server.cfg
+
+ - Added the option to change the led color from asterisk's
+ dialplan:
+
+ exten => 1,1,UserEvent(FOP_ledcolor|Color: 0x0000FF^State: 0)
+
+ The color can be any hex value. The State is:
+
+ 0 for available status (channel not in use)
+ 1 for busy status (channel in use)
+ 2 for agent status (channel not in use and logged in agent)
+
+ - Added the option to fire screen pops from asterisk's
+ dialplan:
+
+ exten => 1,1,UserEvent(FOP_Popup|URL: page.php?e=${EXTEN}^Target: top)
+
+ - Removed some DOWN status events that were redundant
+
+ - Added callerid name in screen popups, look at the
+ mypage.php sample in the html directory
+
+ - Initial Status is fetched from op_server.pl memory
+ instead of querying asterisk every time. Saves lots
+ of asterisk resources and speeds things up
+
+ - Fixed infobox bug when a button has multiple matches
+
+ - Background image. Just place a background.jpg file
+ in the same directory as the .swf file and it will
+ be displayed as the background. The canvas size is
+ 996x600
+
+ - REGEXP buttons. Wildcard buttons are discarded in
+ favor of the more powerful REGEXP buttons. If you
+ use wildcard buttons, replace them with a REGEXP
+ (Ex: if you have [SIP/*] change it to [_SIP/.*])
+
+ - The security code is now optional (leave it blank
+ in op_server.cfg for no security code when performing
+ actions)
+
+ - Added absolute timeout for transferred calls
+
+ - Added the option to restart asterisk instead of reload
+ the panel when hitting the reload button (enable_restart
+ in op_server.cfg)
+
+ - Reworked some button matching routines, now it should
+ support Modem[i4l], oh323/* and mISDN
+
+.20
+ Feb 22 2005:
+
+ - Added support for monitoring multiple asterisk servers
+
+ - Added wildcard buttons (IAX2/*)
+
+ - Added Park Slot buttons (PARK701)
+
+ - Barge Muted (barge_muted in op_server.cfg)
+ Will start the 3rd leg muted when barging in
+
+ - CallerID Privacy (clid_privacy in op_server.cfg)
+ Will hide the callerid number in the buttons
+
+ - Show IP address of peers (show_ip in op_server.cfg)
+ Will show the ip address of peers in their buttons
+
+ - Text legends (LEGEND primitive in op_buttons.cfg)
+
+ - Highlight of linked buttons
+
+ - Added Mailbox parameter to the button definition
+
+ - You can specify a channel name in the dial parameter
+ when using click-to-dial features, thus making it easier
+ to implement
+
+.19
+ Nov 04 2004:
+
+ - Improved call details, now there is a queue/agent information
+ window and last call details window.
+
+ - Bugfixes and visual layout tweaks. You can set the highlight color, etc.
+
+ - You can define a distinct style per panel context. See op_style.cfg
+
+ - You can include files in op_buttons.cfg with the keyword 'include =>'
+
+ - The swf client is compressed and much smaller.
+
+ - When op_server.pl recconects, it close flash clients connections to
+ force a reconnect and update on their status.
+
+.18
+ Oct 29 2004:
+
+ - Ming client is now the default, the new features work with
+ that client only.
+
+ - Led color configurable via op_style.cfg
+
+ - More label renaming options
+ (rename to agent name, rename queuememebers, etc)
+
+ - Option to change led color for logged in agents
+
+ - New click to dial feature, accesible via javascript
+ (examples in the html subdir)
+
+ - Ability to draw rectangles (see op_buttons.cfg for examples)
+
+ - Added polling for IAX presence
+
+.17
+ Oct 21 2004:
+
+ - Mostly a bug fix release. Fixed the reload button in the ming client.
+
+ - Added polling of agents status on connect
+
+ - Initial take on showing detail info on each agent
+
+.16
+ Oct 20 2004:
+
+ - Bug fixes: parked channel feature works again, ringing state too.
+
+ - Encryption is now optional, you can enable or disable it by changing
+ enable_crypto in op_style.cfg (while is this parameter in op_style
+ you may ask? well, the client has the ability to request encryption or
+ not, op_style.cfg sets not only visual parameters, but any client
+ parameter. I might change the configuration file name to op_client.cfg
+ in the future. Without encryption the client uses less CPU.
+
+ - Include the option for polling voicemail status together with sip
+ peers (poll_voicemail in op_server.cfg)
+
+ - New feature: ability to rename button labels when agents log in (
+ rename_label_agentlogin and rename_label_callbacklogin inside
+ op_server.cfg)
+
+ - New Ming client included. Ming is a library for generating .swf files
+ with wrappers in several languages. I used the perl wrapper to produce
+ a complete client. The source is included in the ming-source directory
+ The precompiled .swf file is in the html directory together with the
+ native flash client. Further development might be done exclusively in
+ Ming.
+
+ - The Ming client treats fonts a little diferent. If you enable
+ use_embed_fonts in op_style.cfg, then all the font_family values will
+ be overriden by the only embedded font in the .swf. The
+ embedded font looks uniform compared to system (or browser) fonts. You
+ *can* use any font_family available in your platform: just disable the
+ use of embed fonts and select the family for each legend in a button..
+ but you might end up with chopped text depending of the type of font
+ you use.
+
+
+.15
+ Oct 1st 2004:
+
+ - New configuration file format, there is an utility to convert
+ your old configuration to the new format. See UPGRADE, and don't
+ forget to backup first. Be sure to run the utility only with
+ old configuration files, use it once and then remove it just in
+ case.
+
+ - Fixed MessageWaiting when channel was in another context
+
+ - MD5 Authentication to Asterisk Manager (md5_auth in op_server.cfg)
+
+ - Improved context handling in general. Now you can have a security
+ code for each context, as well as meetme rooms to use for bargein.
+
+ - There is no more auto_conf_exten for finding an empty meetme for
+ barge-ins. You now have to specify the rooms available for that
+ feature with the parameter barge_rooms in op_server.cfg
+
+ - Timers are now polled from Asterisk on initial connect. (If you open
+ the panel when a conversation was going, you will see the real duration
+ of the call)
+
+ - TEA Encryption for messages sent from server to client. MD5 used for
+ hashing the password.
+
+ - Many cosmetical changes to the flash movie, as well as optimizations
+ and rewrites. There are new icons, animations, etc.
+
+ - More information available when a call is disconnected, including
+ queue status information (completed calls, average holdtime, etc)
+ To get the info double click on the arrow when a call is finished.
+
+ - Added ability to mute/unmute meetme participants by clicking on the
+ arrow.
+
+ - Supports for register/unregister/unreachable/lagged realtime events
+ for SIP and IAX peers
+
+ - You can restrict the drag and drop commands to one button only, see
+ index-restrict.html in the html subdirectory
+
+.14
+ Jul 28th 2004:
+
+ - You can run the op_server.pl dettached from the console by starting it
+ with the parameter '-d'. There are sample init scripts in the init
+ directory for redhat and debian.
+
+ - You can now drag a parked channel and transfer it to an available
+ extension just like any other transfer.
+
+ - Changed to work well with Asterisk RC1 (IAX2 channel names have changed
+ from "IAX2[ext@context]" to IAX2/ext@context. Your IAX2 channels in
+ op_buttons.cfg must be renamed if you use RC1. If you do not user RC1,
+ it might work as before, but I have not tested it.
+
+ - The flash side has a lot of improvements and changes. The fonts _sans
+ and _serif are now embedded, so they will look consistent in different
+ client computers (the tradeoff is a bigger swf file). When a channel is
+ offline, the label text will also be grayed out. When dragging an icon,
+ there is now visual feedback for the destination button. Added transparent
+ mask to the icons to make drag easier. If the client looses connection to
+ the op_server.pl, it will try to reconnect by itself (it does not work
+ on linux, its a flash bug).
+
+ - Also in the flash side, there are new elements. A little arrow showing
+ the direction of the call. And if you double click that little arrow
+ after a call is made, you can see the last call status. The new parameters
+ for op_style.cfg are described in UPGRADE
+
+ - There is a new parameter in op_server.cfg: clid_format
+ You can choose the format for the caller id to be presented in the client
+ The letter 'x' will be replaced with a number, any other text will be
+ preserved.
+
+.13
+ Jul 12th 2004:
+
+ - Fixed an annoying bug that prevented the initial status to be displayed
+ (the context for wich the panel request events was sent after the
+ status events, so they were ignored by the flash client)
+
+ - Fixed another annoying bug, the clid text was of an incorrect height,
+ and the drag and drop was erratic because of this
+
+ - Improved the parking display on the channels. Now you have a flashing
+ led and a text in the button itself
+
+ - Added a timer with the duration of a call to each button
+
+ - Still more bugs to clean on the trunk feature, please report feedback
+ on the mailing list..
+
+.12
+ Jul 5th 2004:
+
+ - Added a caller id display on the button itself
+
+ - The status of meetme and queues is queried on initial connect
+
+ - The event handling was rewriten. Now the flash client receives the
+ events for its own context (in previous versions, the events were
+ broadcasted to all clients)
+
+ - Cleaned the debug output a bit.
+
+ - You can send a USR1 signal to the server and look at some state
+ variables.
+
+
+.11
+ Jun 29th 2004:
+
+ - Added 'trunk' buttons. You can define many buttons for just one user.
+ It is not well tested, as I do not have the means to test it. It might
+ introduce bugs!
+
+ - Added CRM software integration. You can monitor a button, and when it
+ rings, a web page is requested in the url and target you specify, with
+ the clid sent as a GET variable.
+
+ - The debug option in op_server.cfg has changed. See the UPGRADE file or
+ the online documentation, or the comments on op_server.cfg
+
+.10
+ Jun 22th 2004:
+
+ - Added Contexts for the panel. You can have one server and several
+ different panels.
+
+ - Added 'Parked calls' as a status for a defined channel/button
+
+ - Fixed important bugs (MWI with contexts not working, transfers not
+ working in particular situations)
+
+ - Totally new webpage, for up to date documentation, go there
+
+ - You can send a HUP signal to op_server.pl and it will rewrite the
+ configuration files for the flash applet.
+
+ - New RELOAD button in flash, it will reread the server configuration
+ and refresh the display.
+
+.09
+ Jun 8th 2004:
+
+ - Added Message Waiting count. When passing the mouse over the envelope
+ icon the status shows the New and Old messages in that mailbox
+
+ - The server sets the CallerID when originating a call.
+
+ - Changed the debug parameter in op_server.cfg to a bitmap for greater
+ control off debug output.
+
+ - Changed the way it handles extension numbers (column number 4) in
+ op_buttons.cfg. Now you can specify the context where the extension
+ resides by using the syntax:
+
+ extension@context
+
+ If the extension is not reachable from the default context, you must
+ specify its context there.
+
+ - Changed the way it handles IAX2 channels. To specify an IAX channel you
+ have to specify its name only, without '@context', eg:
+
+ IAX2[john]
+
+
+.08
+ Jun 2nd 2004:
+
+ - Added "Extra Info" Input box
+
+ You can write any text you want in that box. When transferring or
+ originating a call, that text will be used as the callerid text for
+ that call. This way you can pass usefull information to the person
+ you are transferring the call. In order for this feature to work you
+ need to modify your dialplan ("extensions.conf"). There is an example
+ extensions.conf provided.
+
+ - Configurable layout of the toolbar
+
+ The bar at the top of the flash applet is now configurable. There are
+ new parameters in op_style.cfg to adjust the layout:
+
+ clid_label=Extra Info:
+ security_label=Security Code:
+ btn_help_label=Help
+ btn_log_label=Debug
+ show_security_code=1
+ show_clid_info=2
+ show_status=3
+ show_btn_help=4
+ show_btn_debug=5
+
+ The numbers in the show_xxx varialbes indicates the position in the
+ toolbar. If you do not want to display an element, set it to 0.
+
+ - Added HELP button and text to the flash movie
+
+ You can add a help.txt file in the same directory as the flash movie
+ on your webserver. This file will be displayed inside the help window
+ of the flash movie. You can use basic html tags. You *must* start the
+ file with the words "text="
+
+.07
+ May 19th 2004:
+
+ - Added conference buttons
+
+ The channel column (first one) in op_buttons.cfg must be named with
+ the number of the meetme conference. Eg: you have a meetme conference
+ number 901, the name of the channel must be '901'. Look at the example
+ config.
+
+ - Added tranfer of an empty channel to an already connected call and
+ automatically conference the three parties together
+
+ You have two new parameters in op_server.cfg:
+
+ auto_conference_extension
+ conference_context
+
+ Set them up and look at op_server.cfg for an example configuration for
+ asterisk in extensions.conf and meetme.conf
+
+ - Added origination of calls
+
+ You can drag an available button to another available button. This
+ will originate a call from the first channel to the extension defined
+ in the desintation button.
+
+ - More readable output log for op_server.pl
+
+.06
+ May 12th 2004
+
+ - Added voicemail notification:
+
+ There is a new parameter in op_buttons.cfg. The last column has the
+ voicemail context of the extension. You can leave it blank and it will
+ not check/show the voicemail status for that button (if its a queue
+ button or an extension without voicemail on).
+
+ You also have three new parameters in op_style.cfg:
+
+ mail_margin_left
+ mail_margin_top
+ mail_scale
+
+ to set the placement and size of the voicemail icon in the button.
+
+.05
+ Apr 17th 2004
+
+ - Fixed a typo that prevented the applet from working.
+
+.04
+ Apr 16th 2004
+
+ - Changed configuration files
+
+ The configuration files are different: in version .03 the
+ op_server.cfg had the button configuration and layout. In version
+ .04 that information is stored in op_buttons.cfg. There are 2 new
+ parameters in op_buttons.cfg, extension and icon.
+
+ op_server.cfg is now used for the parameters of the op_server
+ itself, like port to listent to, security code, debug level. You
+ don't have to modify op_server.pl anymore. All configuration is done
+ in the cfg files.
+
+ There is a new configuration file: op_style.cfg with the style and
+ size of the buttons.
+
+ - Added Queues buttons
+
+ You can display call queues on a button. Just put the name
+ of the queue as the channel name.
+
+ - Reconnection to Asterisk Manager port
+
+ The op_server now tries to reconnect to Asterisk Manager
+ port in case of disconnection. So if you restart Asterisk
+ you don't need to restart the op_server.pl, it will reconnect
+ by itself.
+
+ - Totally redone flash movie: operator_panel3.swf
+
+ The flash applet in version .04 is totally rewriten. IÏt
+ has no bitmaps. All graphics are vector based, so you can
+ change the style and sizes without loosing detail. There
+ is no timer or status on each button in order to save space.
+ You can see the status of a channel by passing the mouse
+ over the red oval.
+
+ The new op_server.pl is compatible with the flash applet
+ of previous versions (operator_panel.swf), with fixed 24
+ buttons display, timers, and scrolling info on each channel.
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_it.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_it.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_it.cfg (revision 8095)
@@ -0,0 +1,35 @@
+; Archivio di localizzazione nazionale
+dialing=Componendo
+calling=Chiamando $1
+incoming=Chiamata in arrivo da $1
+parked=Parcheggiata su $1
+registered=Registrato
+notregistered=Non registrato
+reachable=Raggiungibile $1
+unreachable=Non raggiungibile $1
+lagged=Trattenuto $1
+newold=Attuale $1, Precedente $2
+waitingonqueue=$1 utente$2 in attesa
+memberonconference=$1 partecipanti$2
+version_mismatch=Versione disallineata tra Client e Server!
+; client side
+clid_label=Info
+detail_title=Dettagli ultima chiamata
+detail_from=Da:
+detail_to=A:
+detail_duration=Durata:
+security_code_title=Introdurre il codice di sicurezza
+btn_security_text=Attiva richiesta Codice di sicurezza
+btn_restart_text=Riavvia Asterisk
+btn_reload_text=Ricarica la configurazione
+btn_debug_text=Apre/Chiude la finestra di debug
+btn_help_text=Attiva l'aiuto online
+tab_call_text=Chiama
+tab_queue_text=Coda
+calls_taken_text=Chiamate trattenute
+no_data_text=Non ci sono dati disponibili
+debug_window_title=Finestra di debug
+paused=Paused
+idle=Idle
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_no.cfg
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_no.cfg (revision 8095)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_lang_no.cfg (revision 8095)
@@ -0,0 +1,35 @@
+; Language configuration file
+dialing=Ringer
+calling=Ringer $1
+incoming=Samtale fra $1
+parked=Parkert hos $1
+registered=Registrert
+notregistered=Ikke registrert
+reachable=Tilgjengelig $1
+unreachable=Tilgjengelig $1
+lagged=Forsinket $1
+newold=Ny $1, gammel $2
+waitingonqueue=$1 samtaler venter
+memberonconference=$1 deltager(e)
+version_mismatch=Klient/server versjonsfeil!
+; client side
+clid_label=Info
+detail_title=Detaljer for siste samtale
+detail_from=Fra:
+detail_to=Til:
+detail_duration=Lengde:
+security_code_title=Vennligst oppgi sikkerhetskode
+btn_security_text=Vis boks for sikkerhetskode
+btn_restart_text=Omstarter Asterisk
+btn_reload_text=Omlaster konfigurasjon
+btn_debug_text=Vis/lukk debug-vindu
+btn_help_text=Vis hjelpe-vindu
+tab_call_text=Ring
+tab_queue_text=Kø
+calls_taken_text=Samtaler mottatt
+no_data_text=Ingen info tilgjengelig
+debug_window_title=Debug-vindu
+idle=Ledig
+paused=Pause
+channels=$1 channel$2 in use
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/help_en.html
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/help_en.html (revision 10151)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/help_en.html (revision 10151)
@@ -0,0 +1,26 @@
+
+
+How to perform actions:
+
+ Transfer calls: by dragging the phone icon to the destination you want
+
+
+ Hangup calls: by double clikcing on the red button
+
+
+ Originate calls: by dragging an available extension to an available destination
+
+
+ Conference calls: You can add a third person to an existing conversation by dragging an available extension to a leg of an already connected call.
+
+
+ Mute/Unmute meetme members: just double click on the arrow of a meetme participant
+
+
+ Get information about last call: double click on the arrow of an available button
+
+
+
+You can also write additional information in the Info box before transferring or originating a call. If text is entered in the Info box, it will be used as the Caller ID text for any originated or transferred calls.e.g. "555-1212 Bob Jones/IBM"
+
+
Index: freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.pl
===================================================================
--- freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.pl (revision 10150)
+++ freepbx/tags/2.9.0beta1/amp_conf/htdocs_panel/op_server.pl (revision 10150)
@@ -0,0 +1,10880 @@
+#!/usr/bin/perl
+
+# Flash Operator Panel. http://www.asternic.org
+#
+# Copyright (c) 2004 Nicolás Gudiño. All rights reserved.
+#
+# Nicolás Gudiño
+#
+# This program is free software, distributed under the terms of
+# the GNU General Public License.
+#
+# THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``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 CONTRIBUTORS 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.
+
+use strict;
+use warnings;
+use integer;
+
+use constant DEBUG => 1;
+use constant BYTES_TO_READ => 256;
+
+use IO::Socket;
+use IO::Select;
+use Getopt::Long;
+use Pod::Usage;
+use Fcntl;
+use POSIX qw(setsid EWOULDBLOCK);
+
+my $FOP_VERSION = "0.30";
+my %datos = ();
+my %chanvar = ();
+my %monitoring = ();
+my %passvar = ();
+my %sesbot = ();
+my %linkbot = ();
+my %cache_hit = ();
+my %estadoboton = ();
+my %preestadoboton = ();
+
+my %boton_paused = ();
+my %boton_agentready = ();
+my %boton_agentpaused = ();
+my %boton_agentbusy = ();
+my %boton_agentlogedof = ();
+my %botonled = ();
+my %botonalpha = ();
+my %botonledcolor = ();
+my %botonregistrado = ();
+my %boton_ip = ();
+my %botonlabel = ();
+my %botonlabelonly = ();
+my %botonsetlabel = ();
+my %botontimer = ();
+my %botontimertype = ();
+my %botonpark = ();
+my %botonmeetme = ();
+my %botonclid = ();
+my %botonpermanenttext = ();
+my %botonqueue = ();
+my %botonqueue_count = ();
+my %botonqueuemember = ();
+my %botonvoicemail = ();
+my %botonvoicemailcount = ();
+my %botonlinked = ();
+my %parked = ();
+my %meetme_pos = ();
+my %laststatus = ();
+my %autenticado = ();
+my %auto_conference = ();
+my %attendant_transfer = ();
+my %attendant_pending = ();
+my %pending_uniqueid_attendant = ();
+my %mute_other = ();
+my %autosip = ();
+my %cnt_auto_pos = ();
+my $cnt_autosip = 0;
+my %autosip_detail = ();
+my %buttons = ();
+my %buttons_queue = ();
+my %buttons_queue_reverse = ();
+my %buttons_preserve_case = ();
+my %buttons_astdbkey = ();
+my %button_server = ();
+my %buttons_reverse = ();
+my %textos = ();
+my %iconos = ();
+my %urls = ();
+my %alarms = ();
+my %targets = ();
+my %remote_callerid = ();
+my %remote_callerid_name = ();
+my %extension_transfer = ();
+my %extension_transfer_reverse = ();
+my %max_queue_waiting_time_for = ();
+my %flash_contexto = ();
+my %saved_clidnum = ();
+my %saved_clidname = ();
+my %keys_socket = ();
+my %manager_socket = ();
+my %start_muted = ();
+my %timeouts = ();
+my %no_rectangle = ();
+my %background = ();
+my %astdbcommands = ();
+my %client_queue = ();
+my %manager_queue = ();
+my %client_queue_nocrypt = ();
+my %ip_addy = ();
+my %held_channel = ();
+my %agents_available_on_queue = ();
+my $queue_object = {};
+my %is_agent = ();
+my %agents_on_queue = ();
+my %max_lastcall = ();
+my $config = {};
+my $cola = {};
+my $language = {};
+my $global_verbose = 1;
+my $help = 0;
+my $version = 0;
+my $counter_servers = -1;
+my %bloque_completo;
+my %buferbloque;
+my $bloque_final;
+my $todo;
+my $reload_pending = 0;
+my $regexp_buttons = 0;
+my $auto_buttons = 0;
+my @auto_config = ();
+my $queueagent_buttons = 0;
+my $defaultlanguage;
+my @bloque;
+my @respuestas;
+my @all_flash_files;
+my @masrespuestas;
+my @fake_bloque;
+my @flash_clients;
+my @status_active;
+my @panel_contexts;
+my %mailbox;
+my %tovoicemail;
+my %tospy;
+my %instancias;
+my %agent_to_channel;
+my %agent_label;
+my %togle_action;
+my %togle_response;
+my %channel_to_agent;
+my %reverse_agents;
+my %agents_name;
+my @p;
+my $m;
+my $O;
+my @S;
+my @key;
+my @manager_host = ();
+my @manager_port = ();
+my @manager_user = ();
+my @manager_secret = ();
+my @event_mask = ();
+my @astmanproxy_servers = ();
+my @manager_conectado = ();
+my %manager_desconectado;
+my %mask_hash;
+my $web_hostname;
+my $listen_port;
+my $park_exten;
+my $parktimeout;
+my $listen_addr;
+my $security_code;
+my $flash_dir;
+my $astmanproxy_server = "";
+my $restrict_channel = "";
+my $poll_interval;
+my $poll_voicemail;
+my $kill_zombies;
+my $ren_agentlogin;
+my $ren_cbacklogin;
+my $ren_agentname;
+my $agent_status;
+my $ren_queuemember;
+my $ren_wildcard;
+my $clid_privacy;
+my %clid_private;
+my %group_count;
+my $show_ip;
+my $queue_hide;
+my $enable_restart;
+my $passvars = "";
+my $change_led;
+my $cdial_nosecure;
+my $barge_muted;
+my $debuglevel = -1;
+my $debuglevel_cache = "";
+my $cont_debug_cache = 0;
+my $flash_file;
+my %barge_rooms;
+my %barge_context;
+my $first_room;
+my $last_room;
+my $clid_format;
+my $directorio = "";
+my $auth_md5 = 1;
+my $astmanproxy_host = "";
+my $astmanproxy_port = "5038";
+my $md5challenge;
+my $reverse_transfer;
+my %shapes;
+my %legends;
+my %images;
+my %no_encryption = ();
+my %total_shapes;
+my %total_legends;
+my %total_images;
+my @serverinclude = ();
+my @btninclude = ();
+my @styleinclude = ();
+my $command = "";
+my $daemonized = 0;
+my $pidfile = "/var/run/op_panel.pid";
+my $logdir = "";
+my $confdir = "";
+my $tab = "";
+
+my $PADDING = join(
+ '',
+ map( chr,
+ (
+ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+ ) )
+);
+my %a2b = (
+ A => 000,
+ B => 001,
+ C => 002,
+ D => 003,
+ E => 004,
+ F => 005,
+ G => 006,
+ H => 007,
+ I => 010,
+ J => 011,
+ K => 012,
+ L => 013,
+ M => 014,
+ N => 015,
+ O => 016,
+ P => 017,
+ Q => 020,
+ R => 021,
+ S => 022,
+ T => 023,
+ U => 024,
+ V => 025,
+ W => 026,
+ X => 027,
+ Y => 030,
+ Z => 031,
+ a => 032,
+ b => 033,
+ c => 034,
+ d => 035,
+ e => 036,
+ f => 037,
+ g => 040,
+ h => 041,
+ i => 042,
+ j => 043,
+ k => 044,
+ l => 045,
+ m => 046,
+ n => 047,
+ o => 050,
+ p => 051,
+ q => 052,
+ r => 053,
+ s => 054,
+ t => 055,
+ u => 056,
+ v => 057,
+ w => 060,
+ x => 061,
+ y => 062,
+ z => 063,
+ '0' => 064,
+ '1' => 065,
+ '2' => 066,
+ '3' => 067,
+ '4' => 070,
+ '5' => 071,
+ '6' => 072,
+ '7' => 073,
+ '8' => 074,
+ '9' => 075,
+ '+' => 076,
+ '_' => 077,
+);
+my %b2a = reverse %a2b;
+my $rand_byte_already_called = 0;
+
+$SIG{PIPE} = 'IGNORE';
+$SIG{ALRM} = 'alarma_al_minuto';
+$SIG{INT} = 'close_all';
+$SIG{HUP} = 'generate_configs_onhup';
+$SIG{USR1} = 'dump_internal_hashes_to_stdout';
+
+GetOptions(
+ 'p|pidfile=s' => \$pidfile,
+ 'l|logdir=s' => \$logdir,
+ 'c|confdir=s' => \$confdir,
+ 'd|daemon' => \$daemonized,
+ 'V|version' => \$version,
+ 'x|debuglevel=i' => \$debuglevel,
+ 'help|?' => \$help
+);
+
+pod2usage(1) if $help;
+
+if ( $version == 1 ) {
+ print "op_server.pl version $FOP_VERSION\n";
+ exit 0;
+}
+
+if ( $confdir eq "" ) {
+
+ # if there is no config directory supplied at the command line
+ # use the same directory where op_server.pl lives
+ $directorio = $0;
+ $directorio =~ s/(.*)\/(.*)/$1/g;
+}
+else {
+ $directorio = $confdir;
+}
+
+if ( $logdir ne "" ) {
+ open( STDOUT, ">>$logdir/output.log" )
+ or die "Can't open output log $logdir/error.log";
+ open( STDERR, ">>$logdir/error.log" )
+ or die "Can't open output log $logdir/error.log";
+}
+
+if ( $daemonized == 1 ) {
+ defined( my $pid = fork ) or die "Can't Fork: $!";
+ exit if $pid;
+ setsid or die "Can't start a new session: $!";
+ open MYPIDFILE, ">$pidfile"
+ or die "Failed to open PID file $pidfile for writing.";
+ print MYPIDFILE $$;
+ close MYPIDFILE;
+
+ close(STDIN);
+ if ( $logdir eq "" ) {
+ close STDOUT;
+ close STDERR;
+ }
+}
+
+sub read_language_config() {
+ $/ = "\n";
+
+ # tries to read and parse every language file needed
+ foreach my $ctx (@panel_contexts) {
+ if ( !defined( $config->{$ctx}{language} ) ) {
+ $config->{"$ctx"}{language} = $defaultlanguage;
+ }
+
+ my $lang = $config->{$ctx}{language};
+ $lang =~ tr/A-Z/a-z/;
+ $lang =~ s/\W//g;
+ $config->{$ctx}{language} = $lang;
+
+ open( CONFIG, "<$directorio/op_lang_$lang.cfg" )
+ or die("Could not open $directorio/op_lang_$lang.cfg. Aborting...");
+
+ while () {
+ chop;
+ $_ =~ s/^\s+//g;
+ $_ =~ s/([^;]*)[;](.*)/$1/g;
+ $_ =~ s/\s+$//g;
+ next unless $_ ne "";
+ my ( $variable_name, $value ) = split( /=/, $_ );
+ $variable_name =~ tr/A-Z/a-z/;
+ $variable_name =~ s/\s+//g;
+ $value =~ s/^\s+//g;
+ $value =~ s/\s+$//g;
+ $value =~ s/\"//g;
+ $language->{$ctx}{$variable_name} = $value;
+ }
+ close(CONFIG);
+ }
+ $/ = "\0";
+}
+
+sub parse_amportal_config {
+ my $filename = shift;
+ my %ampconf;
+
+ open( AMPCONF, $filename ) || die "Cannot open $filename";
+
+ while () {
+ if ( $_ =~ /^\s*([a-zA-Z0-9]+)\s*=\s*(.*)\s*([;#].*)?/ ) {
+ $ampconf{$1} = $2;
+ }
+ }
+
+ close(AMPCONF);
+ return %ampconf;
+}
+
+sub read_server_config() {
+ my $context = "";
+ my @distinct_files;
+ $counter_servers = -1;
+
+ $/ = "\n";
+
+ @distinct_files = unique(@serverinclude);
+
+ foreach my $archivo (@distinct_files) {
+
+ open( CONFIG, "<$directorio/$archivo" )
+ or die("Could not open op_server.cfg. Aborting...");
+
+ while () {
+ chomp;
+ $_ =~ s/^\s+//g;
+ $_ =~ s/([^;]*)[;](.*)/$1/g;
+ $_ =~ s/\s+$//g;
+
+ if ( /^#/ || /^;/ || /^$/ ) {
+ next;
+ } # Ignores comments and empty lines
+
+ if (/^\Q[\E/) {
+ s/\[(.*)\]/$1/g;
+ tr/a-z/A-Z/;
+ $context = $_;
+ }
+ else {
+ if ( $context ne "" ) {
+ my ( $variable_name, $value ) = split( /=/, $_ );
+ $variable_name =~ tr/A-Z/a-z/;
+ $variable_name =~ s/\s+//g;
+ $value =~ s/^\s+//g;
+ $value =~ s/\s+$//g;
+ $value =~ s/\"//g;
+ $config->{$context}{$variable_name} = $value;
+
+ if ( $variable_name eq "manager_host" ) {
+ $counter_servers++;
+ $manager_host[$counter_servers] = $value;
+ }
+
+ if ( $variable_name eq "manager_user" ) {
+ $manager_user[$counter_servers] = $value;
+ }
+
+ if ( $variable_name eq "manager_secret" ) {
+ $manager_secret[$counter_servers] = $value;
+ }
+
+ if ( $variable_name eq "manager_port" ) {
+ $manager_port[$counter_servers] = $value;
+ }
+
+ if ( $variable_name eq "event_mask" ) {
+ $event_mask[$counter_servers] = $value;
+ }
+
+ if ( $variable_name eq "astmanproxy_server" ) {
+ push @astmanproxy_servers, $value;
+ }
+
+ }
+ }
+ }
+ close(CONFIG);
+ }
+
+ if ( defined( $config->{GENERAL}{use_amportal_conf} ) ) {
+ if ( $config->{GENERAL}{use_amportal_conf} == 1 ) {
+ my $freepbx_config = "/etc/amportal.conf";
+ my %ampconf;
+
+ if ( -e $freepbx_config ) {
+ %ampconf = parse_amportal_config($freepbx_config);
+ $config->{"GENERAL"}{"web_hostname"} = $ampconf{"AMPWEBADDRESS"};
+ $config->{"GENERAL"}{"security_code"} = $ampconf{"FOPPASSWORD"};
+ $config->{"GENERAL"}{"flash_dir"} = $ampconf{"FOPWEBROOT"};
+ $manager_user[0] = $ampconf{"AMPMGRUSER"};
+ $manager_secret[0] = $ampconf{"AMPMGRPASS"};
+ }
+ }
+ }
+
+ $web_hostname = $config->{GENERAL}{web_hostname};
+ $listen_port = $config->{GENERAL}{listen_port};
+ $listen_addr = $config->{GENERAL}{listen_addr};
+ $security_code = $config->{GENERAL}{security_code};
+ $flash_dir = $config->{GENERAL}{flash_dir};
+ $poll_interval = $config->{GENERAL}{poll_interval};
+ $poll_voicemail = $config->{GENERAL}{poll_voicemail};
+ $kill_zombies = $config->{GENERAL}{kill_zombies};
+ $reverse_transfer = $config->{GENERAL}{reverse_transfer};
+ $auth_md5 = $config->{GENERAL}{auth_md5};
+ $astmanproxy_host = $config->{GENERAL}{astmanproxy_host};
+ $astmanproxy_port = $config->{GENERAL}{astmanproxy_port};
+ $ren_agentlogin = $config->{GENERAL}{rename_label_agentlogin};
+ $ren_cbacklogin = $config->{GENERAL}{rename_label_callbacklogin};
+ $ren_wildcard = $config->{GENERAL}{rename_label_wildcard};
+ $ren_agentname = $config->{GENERAL}{rename_to_agent_name};
+ $agent_status = $config->{GENERAL}{agent_status};
+ $ren_queuemember = $config->{GENERAL}{rename_queue_member};
+ $change_led = $config->{GENERAL}{change_led_agent};
+ $cdial_nosecure = $config->{GENERAL}{clicktodial_insecure};
+ $barge_muted = $config->{GENERAL}{barge_muted};
+ $clid_privacy = $config->{GENERAL}{clid_privacy};
+ $show_ip = $config->{GENERAL}{show_ip};
+ $queue_hide = $config->{GENERAL}{queue_hide};
+ $enable_restart = $config->{GENERAL}{enable_restart};
+ $defaultlanguage = $config->{GENERAL}{language};
+ $passvars = $config->{GENERAL}{passvars};
+ $park_exten = $config->{GENERAL}{parkexten};
+ $parktimeout = $config->{GENERAL}{parktimeout};
+
+ if ( $debuglevel == -1 ) {
+ $debuglevel = $config->{GENERAL}{debug};
+ }
+
+ my @todos_los_rooms;
+ foreach my $val ($config) {
+ while ( my ( $aa, $bb ) = each( %{$val} ) ) {
+ while ( my ( $cc, $dd ) = each( %{$bb} ) ) {
+ if ( $cc eq "barge_rooms" ) {
+ ( $first_room, $last_room ) = split( /-/, $dd );
+ if ( !defined($last_room) ) {
+ $last_room = $first_room;
+ }
+ my @arrayroom = $first_room .. $last_room;
+ foreach (@arrayroom) {
+ $barge_context{"$_"} = $aa;
+ }
+ push( @todos_los_rooms, @arrayroom );
+ }
+ }
+ }
+ }
+ %barge_rooms = map { $todos_los_rooms[$_], 0 } 0 .. $#todos_los_rooms;
+
+ $clid_format = $config->{GENERAL}{clid_format};
+ if ( !defined($flash_dir) ) { $flash_dir = '/var/www/html' }
+ $flash_file = $flash_dir . "/variables.txt";
+ push @all_flash_files, $flash_file;
+
+ if ( !defined $web_hostname ) {
+ $web_hostname = "";
+ }
+ if ( !defined $listen_port ) {
+ $listen_port = 4445;
+ }
+ if ( !defined $listen_addr ) {
+ $listen_addr = "0.0.0.0";
+ }
+ if ( !defined $astmanproxy_host ) {
+ $astmanproxy_host = "";
+ }
+ else {
+ @manager_host = ();
+ @manager_user = ();
+ @manager_secret = ();
+ push @manager_host, $astmanproxy_host;
+ push @manager_user, "astmanproxy";
+ push @manager_secret, "astmanproxy";
+ }
+
+ if ( defined $astmanproxy_port ) {
+ @manager_port = ();
+ push @manager_port, $astmanproxy_port;
+ }
+
+ if ( !defined $security_code ) {
+ die("Missing security_code in op_server.cfg!");
+ }
+
+ if ( !defined $flash_dir ) { die("Missing flash_dir in op_server.cfg!"); }
+
+ if ( !defined $poll_interval ) {
+ die("Missing poll_interval in op_server.cfg!");
+ }
+
+ if ( !defined $ren_agentlogin ) {
+ $ren_agentlogin = 0;
+ }
+
+ if ( !defined $defaultlanguage ) {
+ $defaultlanguage = "en";
+ $config->{DEFAULT}{language} = "en";
+ }
+
+ if ( !defined $config->{GENERAL}{monitor_filename} ) {
+ $config->{GENERAL}{monitor_filename} = "\${UNIQUEID}";
+ }
+
+ if ( !defined $config->{GENERAL}{monitor_format} ) {
+ $config->{GENERAL}{monitor_format} = "wav";
+ }
+
+ if ( !defined $clid_privacy ) {
+ $clid_privacy = 0;
+ }
+
+ if ( !defined $show_ip ) {
+ $show_ip = 0;
+ }
+
+ if ( !defined $queue_hide ) {
+ $queue_hide = 0;
+ }
+
+ if ( !defined $ren_wildcard || $ren_wildcard eq "" ) {
+ $ren_wildcard = 1;
+ }
+
+ if ( !defined $reverse_transfer || $reverse_transfer eq "" ) {
+ $reverse_transfer = 0;
+ }
+
+ if ( !defined $barge_muted || $barge_muted eq "" ) {
+ $barge_muted = 0;
+ }
+
+ if ( !defined $enable_restart || $enable_restart eq "" ) {
+ $enable_restart = 0;
+ }
+
+ if ( !defined $cdial_nosecure || $cdial_nosecure eq "" ) {
+ $cdial_nosecure = 0;
+ }
+
+ if ( !defined $agent_status || $agent_status eq "" ) {
+ $agent_status = 0;
+ }
+
+ if ( !defined $ren_agentname || $ren_agentname eq "" ) {
+ $ren_agentname = 0;
+ }
+
+ if ( !defined $ren_cbacklogin || $ren_cbacklogin eq "" ) {
+ $ren_cbacklogin = 0;
+ }
+
+ if ( !defined $ren_queuemember || $ren_queuemember eq "" ) {
+ $ren_queuemember = 0;
+ }
+
+ if ( !defined $change_led || $change_led eq "" ) {
+ $change_led = 0;
+ }
+
+ if ( !defined $kill_zombies || $kill_zombies eq "" ) {
+ $kill_zombies = 0;
+ }
+
+ if ( !defined $poll_voicemail || $poll_voicemail eq "" ) {
+ $poll_voicemail = 0;
+ }
+
+ if ( !defined $clid_format ) {
+ $clid_format = "(xxx) xxx-xxxx";
+ }
+
+ if ( !defined $passvars ) {
+ $passvars = "";
+ }
+
+ if ( !defined $park_exten ) {
+ $park_exten = "700";
+ }
+
+ if ( !defined $parktimeout ) {
+ $parktimeout = 45000;
+ }
+ else {
+ $parktimeout = $parktimeout * 1000;
+ }
+
+ if ( !defined $debuglevel ) {
+ $debuglevel = 0;
+ }
+ else {
+ if ( $daemonized == 1 && $logdir eq "" ) {
+ $debuglevel = 0;
+ }
+ }
+ $/ = "\0";
+}
+
+sub collect_includes {
+ my $filename = shift;
+ my $tipo = shift;
+ my $archivo = $directorio . "/" . $filename;
+
+ if ( !-r $archivo ) {
+ log_debug( "** $archivo not readable... skipping", 16 ) if DEBUG;
+ return;
+ }
+
+ if ( $tipo eq "buttons" ) {
+ if ( !grep { $filename eq $_ } @btninclude ) {
+ push( @btninclude, $filename );
+ }
+ else {
+ log_debug( "** $filename already included", 16 ) if DEBUG;
+ return;
+ }
+ }
+ if ( $tipo eq "style" ) {
+ if ( !grep { $filename eq $_ } @styleinclude ) {
+ push( @styleinclude, $filename );
+ }
+ else {
+ log_debug( "** $filename already included", 16 ) if DEBUG;
+ return;
+ }
+ }
+ if ( $tipo eq "server" ) {
+ if ( !grep { $filename eq $_ } @serverinclude ) {
+ push( @serverinclude, $filename );
+ }
+ else {
+ log_debug( "** $filename already included", 16 ) if DEBUG;
+ return;
+ }
+ }
+
+ open( CONFIG, "< $archivo" )
+ or die("Could not open $filename. Aborting...\n\n");
+
+ my @lineas = ;
+ my $cuantos = @lineas;
+ foreach my $linea (@lineas) {
+ $linea =~ s/^\s+//g;
+ $linea =~ s/([^;]*)[;](.*)/$1/g;
+ $linea =~ s/\s+$//g;
+ if ( $linea =~ /^include/ ) {
+
+ # store include lines in an array so we can
+ # process them later excluding duplicates
+ $linea =~ s/^include//g;
+ $linea =~ s/^\s+//g;
+ $linea =~ s/^=>//g;
+ $linea =~ s/^\s+//g;
+ $linea =~ s/\s+$//g;
+ collect_includes( $linea, $tipo );
+ }
+ }
+ close CONFIG;
+}
+
+sub read_astdb_config() {
+ $/ = "\n";
+ if ( -e "$directorio/op_astdb.cfg" ) {
+ open( ASTDB, "<$directorio/op_astdb.cfg" )
+ or die("Could not open op_astdb.cfg. Aborting...");
+ my $contador = 0;
+ my $key = "";
+ while () {
+ chomp;
+ $_ =~ s/^\s+//g;
+ $_ =~ s/([^;]*)[;](.*)/$1/g;
+ $_ =~ s/\s+$//g;
+
+ if ( /^#/ || /^;/ || /^$/ ) {
+ next;
+ } # Ignores comments and empty lines
+
+ if (/^\Q[\E/) {
+ s/\[(.*)\]/$1/g;
+ $key = $_;
+ }
+ else {
+ push @{ $astdbcommands{$key} }, $_;
+ }
+ }
+ }
+ close(ASTDB);
+
+ $/ = "\0";
+}
+
+sub read_buttons_config() {
+ my @btn_cfg = ();
+ my $contador = -1;
+ my @distinct_files;
+ my $no_counter = 0;
+ my @contextos = ();
+ my %lastposition = ();
+
+ $/ = "\n";
+
+ @distinct_files = unique(@btninclude);
+
+ foreach my $archivo (@distinct_files) {
+ open( CONFIG, "< $directorio/$archivo" )
+ or die("Could not open $directorio/$archivo. Aborting...");
+
+ # Read op_buttons.cfg loading it into a hash for easier processing
+
+ while () {
+ chomp;
+ $_ =~ s/^\s+//g;
+ $_ =~ s/([^;]*)[;](.*)/$1/g;
+ $_ =~ s/\s+$//g;
+ if ( /^#/ || /^;/ || /^$/ ) {
+ next;
+ } # Ignores comments and empty lines
+
+ if (/^\Q[\E/) {
+ $contador++;
+ s/\[(.*)\]/$1/g;
+ my $channel = $_;
+ $btn_cfg[$contador]{'channel_preserve_case'} = $channel;
+ $btn_cfg[$contador]{'channel'} = $channel;
+
+ }
+ else {
+ next unless ( $contador >= 0 );
+ my ( $key, $val ) = split( /=/, $_, 2 );
+ if ( !defined($val) ) { $val = ""; }
+ $key =~ tr/A-Z/a-z/;
+ $key =~ s/^\s+//g;
+ $key =~ s/(.*)\s+/$1/g;
+ if ( $key ne "label"
+ && $key ne "font_family"
+ && $key ne "text"
+ && $key ne "mailbox"
+ && $key ne "voicemail_context" )
+ {
+ $val =~ s/^\s+//g;
+ $val =~ s/(.*)\s+/$1/g;
+ }
+ $btn_cfg[$contador]{$key} = $val;
+ if ( $key eq "panel_context" ) {
+ push @contextos, $val;
+ }
+ }
+ }
+
+ close(CONFIG);
+ }
+
+ # Read now the auto_sip button config files
+ foreach my $papi ( sort keys %autosip ) {
+ if ( !defined( $autosip{$papi}{channel} ) ) { next; }
+
+ $contador++;
+ log_debug( "-----", 16 ) if DEBUG;
+ $btn_cfg[$contador]{'channel_preserve_case'} = $autosip{$papi}{channel};
+ $btn_cfg[$contador]{'channel'} = $autosip{$papi}{channel};
+ if ( defined( $cnt_auto_pos{ $autosip{$papi}{autonumber} } ) ) {
+ $cnt_auto_pos{ $autosip{$papi}{autonumber} }++;
+ }
+ else {
+ $cnt_auto_pos{ $autosip{$papi}{autonumber} } = 0;
+ }
+
+ my $pos = $autosip{$papi}{starting_position} + $cnt_auto_pos{ $autosip{$papi}{autonumber} };
+ $btn_cfg[$contador]{'position'} = $pos;
+ $btn_cfg[$contador]{'channel'} = $autosip{$papi}{channel};
+ my $logblock = "\n[" . $autosip{$papi}{channel} . "]\n";
+ log_debug( $autosip{$papi}{channel} . " at position $pos", 16 ) if DEBUG;
+
+ while ( my ( $key, $val ) = each( %{ $autosip{$papi} } ) ) {
+ if ( $val eq "" ) {
+ log_debug( "** Empty value for autosip for key $key, button $papi", 1 ) if DEBUG;
+ next;
+ }
+ $btn_cfg[$contador]{$key} = $val;
+ $logblock .= "$key=$val\n";
+ if ( $key eq "panel_context" ) {
+ push @contextos, $val;
+ }
+ }
+ log_debug( "$logblock", 1 ) if DEBUG;
+ }
+
+ my @uniq2 = unique(@contextos);
+ @contextos = @uniq2;
+ @uniq2 = grep { !/\*/ } @contextos;
+ @contextos = @uniq2;
+ push @contextos, "DEFAULT";
+ push @contextos, "GENERAL";
+
+ # Convert every element to uppercase
+ @panel_contexts = map { uc } @contextos;
+
+ # Pass to replicate panel_context=* configuration
+ my @copy_cfg = ();
+ @copy_cfg = @btn_cfg;
+ foreach (@copy_cfg) {
+ my %tmphash = %$_;
+ if ( defined( $tmphash{panel_context} ) ) {
+ if ( $tmphash{panel_context} eq "*" ) {
+ foreach my $contextoahora (@contextos) {
+ $contador++;
+ while ( my ( $key, $val ) = each(%tmphash) ) {
+ if ( $key eq "panel_context" ) {
+ $val = $contextoahora;
+ }
+ $btn_cfg[$contador]{$key} = $val;
+ }
+ }
+ }
+ }
+ }
+
+ # We finished reading the file, now we populate our
+ # structures with the relevant data
+ my %rectangles_counter;
+ my %legends_counter;
+ my %images_counter;
+
+ my $cont_auto = 0;
+ CONFIG:
+ foreach (@btn_cfg) {
+ my @positions = ();
+ my %tmphash = %$_;
+
+ if ( defined( $tmphash{panel_context} ) ) {
+ if ( $tmphash{panel_context} eq "*" ) {
+
+ # We skip the * panel_context because we already
+ # expand them to every context possible before
+ next CONFIG;
+ }
+ }
+ if ( $tmphash{channel} =~ /^AUTO/i ) {
+ $auto_buttons = 1;
+ while ( my ( $key, $val ) = each(%tmphash) ) {
+ $auto_config[$cont_auto]{$key} = $val;
+ }
+ $cont_auto++;
+ next CONFIG;
+ }
+
+ if ( $tmphash{channel} =~ /^_/ ) {
+ $regexp_buttons = 1;
+ }
+ elsif ( $tmphash{channel} =~ /^QUEUEAGENT\//i ) {
+ $queueagent_buttons = 1;
+ }
+ elsif ( $tmphash{channel} =~ /^image$/i ) {
+
+ # Image config primitive
+
+ if ( defined( $tmphash{panel_context} ) ) {
+ $tmphash{panel_context} =~ tr/a-z/A-Z/;
+ $tmphash{panel_context} =~ s/^DEFAULT$//xms;
+ }
+ else {
+ $tmphash{panel_context} = "";
+ }
+ my $conttemp = $tmphash{panel_context};
+ if ( $conttemp eq "" ) { $conttemp = "GENERAL"; }
+
+ if ( !defined( $tmphash{src} ) ) {
+ next CONFIG;
+ }
+ if ( !defined( $tmphash{url} ) ) {
+ $tmphash{url} = "no";
+ }
+ if ( !defined( $tmphash{target} ) ) {
+ $tmphash{target} = "NONTARFOP";
+ }
+ $images_counter{$conttemp}++;
+ if ( $images_counter{$conttemp} > 1 ) {
+ $images{$conttemp} .= "&";
+ }
+ $total_images{$conttemp}++;
+ $images{$conttemp} .= "image_$images_counter{$conttemp}=" . $tmphash{x} . ",";
+ $images{$conttemp} .= $tmphash{y} . ",";
+ $images{$conttemp} .= $tmphash{src} . ",";
+ $images{$conttemp} .= $tmphash{url} . ",";
+ $images{$conttemp} .= $tmphash{target};
+ next CONFIG;
+
+ }
+ elsif ( $tmphash{channel} =~ /^legend$/i ) {
+
+ # Legend config primitive
+
+ if ( defined( $tmphash{panel_context} ) ) {
+ $tmphash{panel_context} =~ tr/a-z/A-Z/;
+ $tmphash{panel_context} =~ s/^DEFAULT$//xms;
+ }
+ else {
+ $tmphash{panel_context} = "";
+ }
+ my $conttemp = $tmphash{panel_context};
+ if ( $conttemp eq "" ) { $conttemp = "GENERAL"; }
+
+ if ( !defined( $tmphash{text} ) ) {
+ $tmphash{text} = "LEGEND";
+ }
+ if ( !defined( $tmphash{x} ) ) {
+ $tmphash{x} = 1;
+ }
+ if ( !defined( $tmphash{y} ) ) {
+ $tmphash{y} = 1;
+ }
+ if ( !defined( $tmphash{font_size} ) ) {
+ $tmphash{font_size} = 16;
+ }
+ if ( !defined( $tmphash{font_color} ) ) {
+ $tmphash{font_color} = "000000";
+ }
+ if ( !defined( $tmphash{use_embed_fonts} ) ) {
+ $tmphash{use_embed_fonts} = 1;
+ }
+ if ( !defined( $tmphash{font_family} ) ) {
+ $tmphash{font_family} = "Arial";
+ }
+ if ( !defined( $tmphash{no_base64} ) ) {
+ $tmphash{no_base64} = 0;
+ }
+ if ( $tmphash{no_base64} == 0 ) {
+ $tmphash{text} = encode_base64( $tmphash{text} );
+ }
+ if ( !defined( $tmphash{url} ) ) {
+ $tmphash{url} = "no";
+ }
+ if ( !defined( $tmphash{target} ) ) {
+ $tmphash{target} = "NONTARFOP";
+ }
+ $legends_counter{$conttemp}++;
+ if ( $legends_counter{$conttemp} > 1 ) {
+ $legends{$conttemp} .= "&";
+ }
+ $total_legends{$conttemp}++;
+ $legends{$conttemp} .= "legend_$legends_counter{$conttemp}=" . $tmphash{x} . ",";
+ $legends{$conttemp} .= $tmphash{y} . ",";
+ $legends{$conttemp} .= $tmphash{text} . ",";
+ $legends{$conttemp} .= $tmphash{font_size} . ",";
+ $legends{$conttemp} .= $tmphash{font_family} . ",";
+ $legends{$conttemp} .= $tmphash{font_color} . ",";
+ $legends{$conttemp} .= $tmphash{use_embed_fonts} . ",";
+ $legends{$conttemp} .= $tmphash{no_base64} . ",";
+ $legends{$conttemp} .= $tmphash{url} . ",";
+ $legends{$conttemp} .= $tmphash{target};
+ next CONFIG;
+ }
+ elsif ( $tmphash{channel} =~ /^RECTANGLE$/i ) {
+
+ # Rectangle config primitive
+ if ( defined( $tmphash{panel_context} ) ) {
+ $tmphash{panel_context} =~ tr/a-z/A-Z/;
+ $tmphash{panel_context} =~ s/^DEFAULT$//;
+ }
+ else {
+ $tmphash{panel_context} = "";
+ }
+ my $conttemp = $tmphash{panel_context};
+ if ( $conttemp eq "" ) { $conttemp = "GENERAL"; }
+
+ if ( !defined( $tmphash{x} ) ) {
+ $tmphash{x} = 1;
+ }
+ if ( !defined( $tmphash{y} ) ) {
+ $tmphash{y} = 1;
+ }
+ if ( !defined( $tmphash{width} ) ) {
+ $tmphash{width} = 1;
+ }
+ if ( !defined( $tmphash{height} ) ) {
+ $tmphash{height} = 1;
+ }
+ if ( !defined( $tmphash{line_width} ) ) {
+ $tmphash{line_width} = 1;
+ }
+ if ( !defined( $tmphash{line_color} ) ) {
+ $tmphash{line_color} = "0x000000";
+ }
+ if ( !defined( $tmphash{fade_color1} ) ) {
+ $tmphash{fade_color1} = "0xd0d0d0";
+ }
+ if ( !defined( $tmphash{fade_color2} ) ) {
+ $tmphash{fade_color2} = "0xd0d000";
+ }
+ if ( !defined( $tmphash{rnd_border} ) ) {
+ $tmphash{rnd_border} = 3;
+ }
+ if ( !defined( $tmphash{alpha} ) ) {
+ $tmphash{alpha} = 100;
+ }
+ if ( !defined( $tmphash{layer} ) ) {
+ $tmphash{layer} = "bottom";
+ }
+
+ $rectangles_counter{$conttemp}++;
+ if ( $rectangles_counter{$conttemp} > 1 ) {
+ $shapes{$conttemp} .= "&";
+ }
+ $total_shapes{$conttemp}++;
+ $shapes{$conttemp} .= "rect_$rectangles_counter{$conttemp}=" . $tmphash{x} . ",";
+ $shapes{$conttemp} .= $tmphash{y} . ",";
+ $shapes{$conttemp} .= $tmphash{width} . ",";
+ $shapes{$conttemp} .= $tmphash{height} . ",";
+ $shapes{$conttemp} .= $tmphash{line_width} . ",";
+ $shapes{$conttemp} .= $tmphash{line_color} . ",";
+ $shapes{$conttemp} .= $tmphash{fade_color1} . ",";
+ $shapes{$conttemp} .= $tmphash{fade_color2} . ",";
+ $shapes{$conttemp} .= $tmphash{rnd_border} . ",";
+ $shapes{$conttemp} .= $tmphash{alpha} . ",";
+ $shapes{$conttemp} .= $tmphash{layer};
+ next CONFIG;
+ }
+
+ if ( !defined( $tmphash{position} ) ) {
+ log_debug( "** Ignored button $tmphash{'channel'}, position?", 16 ) if DEBUG;
+ next CONFIG;
+ }
+
+ if ( !defined( $tmphash{alarm} ) ) {
+ $tmphash{alarm} = "0";
+
+ }
+ if ( !defined( $tmphash{url} ) ) {
+ $tmphash{url} = "0";
+ }
+
+ if ( !defined( $tmphash{target} ) ) {
+ $tmphash{target} = "0";
+ }
+
+ if ( !defined( $tmphash{server} ) ) {
+ $tmphash{server} = 0;
+ }
+ else {
+ if ( $tmphash{server} eq "*" ) { $tmphash{server} = 0; }
+ $tmphash{server} = $tmphash{server} - 1;
+ }
+
+ if ( !defined( $tmphash{label} ) ) {
+ $tmphash{label} = $tmphash{channel};
+ }
+
+ if ( !defined( $tmphash{icon} ) ) {
+ $tmphash{icon} = "0";
+ }
+
+ # Local channels are case sensitive
+ my $canal_key = "";
+
+ if ( $tmphash{channel} =~ m/^local/i ) {
+ $canal_key = $tmphash{channel};
+ }
+ else {
+ $canal_key = uc( $tmphash{channel} );
+ }
+
+ my $canal_key_case = $tmphash{channel_preserve_case};
+
+ if ( $canal_key =~ m/^PARK\d/ ) {
+
+ # Change the PARKXXX tu PARK/XXX
+ $canal_key =~ s/PARK(.*)/PARK\/$1/g;
+ $canal_key_case =~ s/PARK(.*)/PARK\/$1/gi;
+ }
+
+ if ( defined( $tmphash{panel_context} ) ) {
+ $tmphash{panel_context} =~ tr/a-z/A-Z/;
+ $tmphash{panel_context} =~ s/^DEFAULT$//;
+ }
+ else {
+ $tmphash{panel_context} = "";
+ }
+
+ if ( $tmphash{panel_context} ne "" ) {
+
+ # We want to add the context in case we have the same button
+ # repeated in several panel_contexts. If we do not add it, then
+ # only the last panel context will prevail.
+ $canal_key .= "&" . $tmphash{panel_context};
+ $canal_key_case .= "&" . $tmphash{panel_context};
+ }
+
+ if ( ( $tmphash{position} !~ /,/ )
+ && ( $tmphash{position} !~ /-/ )
+ && ( $canal_key =~ /^_/ ) )
+ {
+
+ # If it's a regexp button with just one position
+ # we fake the same position number to populate
+ # the array and make the button work anyways.
+ my $pos = $tmphash{position};
+ $pos =~ s/(\d+),(\d+)/$1/g;
+ my $countpos = 2;
+ $tmphash{position} = "";
+ if ( defined( $tmphash{count} ) ) {
+ $countpos = $tmphash{count};
+ }
+ my $a = 0;
+ for ( $a = 0 ; $a < $countpos ; $a++ ) {
+ $tmphash{position} .= "$pos,";
+ }
+ $tmphash{position} = substr( $tmphash{position}, 0, -1 );
+ $no_counter = 1;
+ }
+ else {
+ $no_counter = 0;
+ }
+
+ if ( $tmphash{position} =~ /[,-]/ ) {
+
+ my $canalidx = $tmphash{server} . "^" . $tmphash{channel};
+
+ if ( defined( $tmphash{panel_context} )
+ && $tmphash{panel_context} ne "" )
+ {
+ $canalidx .= "&" . $tmphash{panel_context};
+ }
+ $instancias{ uc($canalidx) }{""} = 0;
+
+ my @ranges = split( /,/, $tmphash{position} );
+ foreach my $valu (@ranges) {
+ if ( $valu !~ m/-/ ) {
+ if ( $valu eq "n" ) {
+ my $lastpos = $lastposition{ $tmphash{panel_context} };
+ if ( is_number($lastpos) ) {
+ $lastpos++;
+ $lastposition{ $tmphash{panel_context} } = $lastpos;
+ $valu = $lastpos;
+ push @positions, $valu;
+ last;
+ }
+ }
+ push @positions, $valu;
+ }
+ else {
+ my @range2 = split( /-/, $valu );
+ my $menor = $range2[0] < $range2[1] ? $range2[0] : $range2[1];
+ my $mayor = $range2[0] > $range2[1] ? $range2[0] : $range2[1];
+ my @newrange = $menor .. $mayor;
+ foreach my $valevale (@newrange) {
+ push @positions, $valevale;
+ }
+ }
+ }
+
+ my $count = 0;
+ foreach my $pos (@positions) {
+ $count++;
+ my $indice_contexto = $pos;
+ my $chan_trunk = $tmphash{channel} . "=" . $count;
+ my $chan_trunk_case = $tmphash{channel_preserve_case} . "=" . $count;
+ if ( $tmphash{panel_context} ne "" ) {
+ $chan_trunk .= "&" . $tmphash{panel_context};
+ $chan_trunk_case .= "&" . $tmphash{panel_context};
+ $indice_contexto .= "@" . $tmphash{panel_context};
+ $pos .= "@" . $tmphash{panel_context};
+ }
+ if ( $chan_trunk =~ m/^QUEUE/i ) {
+ $buttons_queue{ uc("$tmphash{server}^$chan_trunk") } = $pos;
+ }
+ $buttons_preserve_case{"$tmphash{server}^$chan_trunk_case"} = $pos;
+ if ( defined( $tmphash{astdbkey} ) ) {
+ $buttons_astdbkey{"$tmphash{server}^$chan_trunk_case"} = $tmphash{astdbkey};
+ }
+ $buttons{ uc("$tmphash{server}^$chan_trunk") } = $pos;
+ $textos{$indice_contexto} = $tmphash{label};
+ if ( !defined( $tmphash{no_label_counter} ) ) { $tmphash{no_label_counter} = 0; }
+ if ( $no_counter == 0 && $tmphash{no_label_counter} == 0 ) {
+ $textos{$indice_contexto} .= " " . $count;
+ }
+ $iconos{$indice_contexto} = $tmphash{icon};
+ $urls{$indice_contexto} = $tmphash{url};
+ $alarms{$indice_contexto} = $tmphash{alarm};
+ $targets{$indice_contexto} = $tmphash{target};
+ $button_server{$pos} = $tmphash{server};
+
+ # Saves last position for the button@context
+ $lastposition{ $tmphash{panel_context} } = $pos;
+ log_debug( qq[** $tmphash{server}^$chan_trunk in position $pos], 16 ) if DEBUG;
+ }
+ }
+ else {
+ my $lastpos = 0;
+ $lastpos = $lastposition{ $tmphash{panel_context} }
+ if defined( $lastposition{ $tmphash{panel_context} } );
+ if ( $tmphash{position} eq "n" ) {
+ if ( is_number($lastpos) ) {
+ $lastpos++;
+ $lastposition{ $tmphash{panel_context} } = $lastpos;
+ }
+ }
+ else {
+ $lastpos = $tmphash{position};
+ $lastposition{ $tmphash{panel_context} } = $lastpos;
+ }
+
+ log_debug( qq[** $tmphash{channel} in next position $lastpos], 16 ) if DEBUG;
+
+ if ( $tmphash{panel_context} ne "" ) {
+
+ if ( $canal_key =~ m/^QUEUE/i ) {
+ $buttons_queue{ uc("$tmphash{server}^$canal_key") } = $lastpos . "\@" . $tmphash{panel_context};
+ }
+ $buttons{"$tmphash{server}^$canal_key"} = $lastpos . "\@" . $tmphash{panel_context};
+ $buttons_preserve_case{"$tmphash{server}^$canal_key_case"} = $lastpos . "\@" . $tmphash{panel_context};
+ if ( defined( $tmphash{astdbkey} ) ) {
+ $buttons_astdbkey{"$tmphash{server}^$canal_key_case"} = $tmphash{astdbkey};
+ }
+
+ $textos{"$lastpos\@$tmphash{panel_context}"} = $tmphash{label};
+ $iconos{"$lastpos\@$tmphash{panel_context}"} = $tmphash{icon};
+ $urls{"$lastpos\@$tmphash{panel_context}"} = $tmphash{url};
+ $alarms{"$lastpos\@$tmphash{panel_context}"} = $tmphash{alarm};
+ $targets{"$lastpos\@$tmphash{panel_context}"} = $tmphash{target};
+ $button_server{ $buttons{"$tmphash{server}^$canal_key"} } = $tmphash{server};
+ }
+ else {
+ if ( $canal_key =~ /^_/ ) {
+ $canal_key .= "=1";
+ }
+
+ if ( $canal_key =~ m/^QUEUE/i ) {
+ $buttons_queue{ uc("$tmphash{server}^$canal_key") } = $lastpos;
+ }
+ $buttons{"$tmphash{server}^$canal_key"} = $lastpos;
+ $buttons_preserve_case{"$tmphash{server}^$canal_key_case"} = $lastpos;
+ if ( defined( $tmphash{astdbkey} ) ) {
+ $buttons_astdbkey{"$tmphash{server}^$canal_key_case"} = $tmphash{astdbkey};
+ }
+ $textos{$lastpos} = $tmphash{label};
+ $iconos{$lastpos} = $tmphash{icon};
+ $urls{$lastpos} = $tmphash{url};
+ $alarms{$lastpos} = $tmphash{alarm};
+ $targets{$lastpos} = $tmphash{target};
+ $button_server{ $buttons{"$tmphash{server}^$canal_key"} } = $tmphash{server};
+ }
+ }
+
+ @positions = unique(@positions);
+
+ if ( defined( $tmphash{groupcount} ) ) {
+ my $count = @positions;
+ if ( $count == 0 ) {
+ push @positions, $lastposition{ $tmphash{panel_context} };
+ }
+ if ( $tmphash{groupcount} eq "true" || $tmphash{groupcount} eq "1" ) {
+ my $agre_context = "";
+ if ( $tmphash{panel_context} ne "" ) {
+ $agre_context = "\@" . $tmphash{panel_context};
+ }
+ foreach my $pos (@positions) {
+ $group_count{"$pos$agre_context"} = 1;
+ }
+ }
+ }
+
+ if ( defined( $tmphash{privacy} ) ) {
+ my $count = @positions;
+ if ( $count == 0 ) {
+ push @positions, $lastposition{ $tmphash{panel_context} };
+ }
+ if ( $tmphash{privacy} eq "true" || $tmphash{privacy} eq "1" ) {
+ my $agre_context = "";
+ if ( $tmphash{panel_context} ne "" ) {
+ $agre_context = "\@" . $tmphash{panel_context};
+ }
+ foreach my $pos (@positions) {
+ $clid_private{"$pos$agre_context"} = 1;
+ }
+ }
+ }
+
+ if ( defined( $tmphash{no_rectangle} ) ) {
+ my $count = @positions;
+ if ( $count == 0 ) {
+ push @positions, $lastposition{ $tmphash{panel_context} };
+ }
+
+ if ( $tmphash{no_rectangle} eq "true" || $tmphash{no_rectangle} eq "1" ) {
+ my $pcont = $tmphash{panel_context};
+ if ( $pcont eq "" ) { $pcont = "GENERAL"; }
+ foreach my $pos (@positions) {
+ $pos =~ s/\@$pcont//g;
+ $no_rectangle{$pcont}{$pos} = 1;
+ }
+ }
+ }
+
+ if ( defined( $tmphash{background} ) ) {
+ my $count = @positions;
+ if ( $count == 0 ) {
+ push @positions, $lastposition{ $tmphash{panel_context} };
+ }
+
+ my $pcont = $tmphash{panel_context};
+ if ( $pcont eq "" ) { $pcont = "GENERAL"; }
+ foreach my $pos (@positions) {
+ $pos =~ s/\@$pcont//g;
+ $background{$pcont} .= "&bg$pos=$tmphash{background}";
+ }
+ }
+
+ if ( defined( $tmphash{extension} ) ) {
+ if ( defined( $tmphash{context} ) ) {
+
+ $extension_transfer{"$tmphash{server}^$canal_key"} = $tmphash{server} . "^" . $tmphash{extension} . "@" . $tmphash{context};
+
+ }
+ else {
+ $extension_transfer{"$tmphash{server}^$canal_key"} = $tmphash{server} . "^" . $tmphash{extension};
+ }
+ if ( defined( $tmphash{voicemail_context} ) ) {
+ $mailbox{"$tmphash{server}^$canal_key"} = $tmphash{extension} . "@" . $tmphash{voicemail_context};
+ }
+ }
+ if ( defined( $tmphash{mailbox} ) ) {
+ $mailbox{"$tmphash{server}^$canal_key"} = $tmphash{mailbox};
+ }
+ if ( defined( $tmphash{voicemailext} ) ) {
+ my $indicevm = $lastposition{ $tmphash{panel_context} };
+ if ( $tmphash{panel_context} ne "" ) {
+ $indicevm .= "\@$tmphash{panel_context}";
+ }
+ $tovoicemail{$indicevm} = $tmphash{voicemailext};
+ }
+ if ( defined( $tmphash{spyext} ) ) {
+ my $indicespy = $lastposition{ $tmphash{panel_context} };
+ if ( $tmphash{panel_context} ne "" ) {
+ $indicespy .= "\@$tmphash{panel_context}";
+ }
+ $tospy{$indicespy} = $tmphash{spyext};
+ }
+
+ $/ = "\0";
+ }
+ %extension_transfer_reverse = reverse %extension_transfer;
+ %buttons_reverse = reverse %buttons;
+ %buttons_queue_reverse = reverse %buttons_queue;
+}
+
+sub genera_config {
+
+ # This sub generates the file variables.txt that is read by the
+ # swf movie on load, with info about buttons, layout, etc.
+
+ my @textsclients = (
+ 'detail_title', 'detail_from', 'detail_to', 'security_code_title',
+ 'btn_security_text', 'btn_restart_text', 'btn_reload_text', 'btn_debug_text',
+ 'btn_help_text', 'tab_call_text', 'tab_queue_text', 'calls_taken_text',
+ 'no_data_text', 'debug_window_title', 'detail_duration', 'clid_label',
+ 'version_mismatch'
+ );
+
+ $/ = "\n";
+ my %style_variables;
+ my @contextos = ();
+ my @unique_contexts = ();
+ my $contextoactual = "";
+ my $highest_position = 0;
+ my @style_include = ();
+
+ foreach my $archi (@styleinclude) {
+ open( STYLE, "<$directorio/$archi" )
+ or die("Could not open $archi for reading");
+ while (