Index: /freepbx/branches/2.7/buildtools/README.directory =================================================================== --- /freepbx/branches/2.7/buildtools/README.directory (revision 7528) +++ /freepbx/branches/2.7/buildtools/README.directory (revision 7528) @@ -0,0 +1,42 @@ +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.sh, jsmin.rb: + +These two scripts are used to package the libfreebx.javascripts.js by taking +all the javascript libraries that are used under the common directory and +running them through jsmin.rb, a simple Ruby script that does a reasonable +job of compressing the scripts. + + +/-------------------------------------------------------------------------------------------- +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/branches/2.7/buildtools/pack_javascripts.sh =================================================================== --- /freepbx/branches/2.7/buildtools/pack_javascripts.sh (revision 7906) +++ /freepbx/branches/2.7/buildtools/pack_javascripts.sh (revision 7906) @@ -0,0 +1,5 @@ +#!/bin/sh + +DIR="../amp_conf/htdocs/admin/common" + +cat $DIR/script.legacy.js $DIR/jquery-1.3.2.js $DIR/jquery.cookie.js $DIR/jquery.tabs-2.7.4.js $DIR/jquery.dimensions.js $DIR/interface.dim.js | ./jsmin.rb > $DIR/libfreepbx.javascripts.js Index: /freepbx/branches/2.7/buildtools/generate-release.sh =================================================================== --- /freepbx/branches/2.7/buildtools/generate-release.sh (revision 8561) +++ /freepbx/branches/2.7/buildtools/generate-release.sh (revision 8561) @@ -0,0 +1,97 @@ +#!/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://svn.freepbx.org/modules/branches/2.7" +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.sh +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 mohmp3 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://svn.freepbx.org/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://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of framework with $ver" $framework_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of dashboard with $ver" $dashboard_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of customappsreg with $ver" $customappsreg_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of voicemail with $ver" $voicemail_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of recordings with $ver" $recordings_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of music with $ver" $music_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of featurecodeadmin with $ver" $featurecodeadmin_url http://svn.freepbx.org/freepbx/tags/${ver}/amp_conf/htdocs/admin/modules/ +svn cp -m "Automatic packaging of infoservices with $ver" $infoservices_url http://svn.freepbx.org/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://svn.freepbx.org/freepbx/tags/$ver /usr/src/freepbx-release/freepbx-$ver + +cd /usr/src/freepbx-release +tar zcvf freepbx-$ver.tar.gz freepbx-$ver +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/branches/2.7/buildtools/jsmin.rb =================================================================== --- /freepbx/branches/2.7/buildtools/jsmin.rb (revision 4993) +++ /freepbx/branches/2.7/buildtools/jsmin.rb (revision 4993) @@ -0,0 +1,201 @@ +#!/usr/bin/ruby +# jsmin.rb 2007-07-20 +# Author: Uladzislau Latynski +# This work is a translation from C to Ruby of jsmin.c published by +# Douglas Crockford. Permission is hereby granted to use the Ruby +# version under the same conditions as the jsmin.c on which it is +# based. +# +# /* jsmin.c +# 2003-04-21 +# +# 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. + +EOF = -1 +$theA = "" +$theB = "" + +# isAlphanum -- return true if the character is a letter, digit, underscore, +# dollar sign, or non-ASCII character +def isAlphanum(c) + return false if !c || c == EOF + return ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9') || + (c >= 'A' && c <= 'Z') || c == '_' || c == '$' || + c == '\\' || c[0] > 126) +end + +# get -- return the next character from stdin. Watch out for lookahead. If +# the character is a control character, translate it to a space or linefeed. +def get() + c = $stdin.getc + return EOF if(!c) + c = c.chr + return c if (c >= " " || c == "\n" || c.unpack("c") == EOF) + return "\n" if (c == "\r") + return " " +end + +# Get the next character without getting it. +def peek() + lookaheadChar = $stdin.getc + $stdin.ungetc(lookaheadChar) + return lookaheadChar.chr +end + +# mynext -- get the next character, excluding comments. +# peek() is used to see if a '/' is followed by a '/' or '*'. +def mynext() + c = get + if (c == "/") + if(peek == "/") + while(true) + c = get + if (c <= "\n") + return c + end + end + end + if(peek == "*") + get + while(true) + case get + when "*" + if (peek == "/") + get + return " " + end + when EOF + raise "Unterminated comment" + end + end + end + end + return c +end + + +# 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 =. +def action(a) + if(a==1) + $stdout.write $theA + end + if(a==1 || a==2) + $theA = $theB + if ($theA == "\'" || $theA == "\"") + while (true) + $stdout.write $theA + $theA = get + break if ($theA == $theB) + raise "Unterminated string literal" if ($theA <= "\n") + if ($theA == "\\") + $stdout.write $theA + $theA = get + end + end + end + end + if(a==1 || a==2 || a==3) + $theB = mynext + if ($theB == "/" && ($theA == "(" || $theA == "," || $theA == "=" || + $theA == ":" || $theA == "[" || $theA == "!" || + $theA == "&" || $theA == "|" || $theA == "?" || + $theA == "{" || $theA == "}" || $theA == ";" || + $theA == "\n")) + $stdout.write $theA + $stdout.write $theB + while (true) + $theA = get + if ($theA == "/") + break + elsif ($theA == "\\") + $stdout.write $theA + $theA = get + elsif ($theA <= "\n") + raise "Unterminated RegExp Literal" + end + $stdout.write $theA + end + $theB = mynext + end + end +end + +# jsmin -- Copy the input to the output, deleting the characters which are +# insignificant to JavaScript. Comments will be removed. Tabs will be +# replaced with spaces. Carriage returns will be replaced with linefeeds. +# Most spaces and linefeeds will be removed. +def jsmin + $theA = "\n" + action(3) + while ($theA != EOF) + case $theA + when " " + if (isAlphanum($theB)) + action(1) + else + action(2) + end + when "\n" + case ($theB) + when "{","[","(","+","-" + action(1) + when " " + action(3) + else + if (isAlphanum($theB)) + action(1) + else + action(2) + end + end + else + case ($theB) + when " " + if (isAlphanum($theA)) + action(1) + else + action(3) + end + when "\n" + case ($theA) + when "}","]",")","+","-","\"","\\", "'", '"' + action(1) + else + if (isAlphanum($theA)) + action(1) + else + action(3) + end + end + else + action(1) + end + end + end +end + +jsmin Index: /freepbx/branches/2.7/buildtools/md5-amp_conf.sh =================================================================== --- /freepbx/branches/2.7/buildtools/md5-amp_conf.sh (revision 5124) +++ /freepbx/branches/2.7/buildtools/md5-amp_conf.sh (revision 5124) @@ -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 mohmp3 sbin sounds -type f | xargs md5sum | grep -v .svn > ../upgrades/$1.md5 + + ;; + *) + +echo "usage: md5-amp_conf "; + + ;; +esac Index: /freepbx/branches/2.7/LICENSE =================================================================== --- /freepbx/branches/2.7/LICENSE (revision 3392) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/cdr_mysql.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/cdr_mysql.conf (revision 8443) +++ /freepbx/branches/2.7/amp_conf/astetc/cdr_mysql.conf (revision 8443) @@ -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/branches/2.7/amp_conf/astetc/modem.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/modem.conf (revision 8) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/vm_general.inc =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/vm_general.inc (revision 8702) +++ /freepbx/branches/2.7/amp_conf/astetc/vm_general.inc (revision 8702) @@ -0,0 +1,36 @@ +; 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 Index: /freepbx/branches/2.7/amp_conf/astetc/enum.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/enum.conf (revision 190) +++ /freepbx/branches/2.7/amp_conf/astetc/enum.conf (revision 190) @@ -0,0 +1,4 @@ +[general] +search => e164.arpa +search => e164.org + Index: /freepbx/branches/2.7/amp_conf/astetc/indications.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/indications.conf (revision 2834) +++ /freepbx/branches/2.7/amp_conf/astetc/indications.conf (revision 2834) @@ -0,0 +1,708 @@ +; indications.conf +; Configuration file for location specific tone indications +; used by the pbx_indications module. +; +; NOTE: +; When adding countries to this file, please keep them in alphabetical +; order according to the 2-character country codes! +; +; The [general] category is for certain global variables. +; All other categories are interpreted as location specific indications +; +; +[general] +country=us ; default location + + +; [example] +; description = string +; The full name of your country, in English. +; alias = iso[,iso]* +; List of other countries 2-letter iso codes, which have the same +; tone indications. +; ringcadence = num[,num]* +; List of durations the physical bell rings. +; dial = tonelist +; Set of tones to be played when one picks up the hook. +; busy = tonelist +; Set of tones played when the receiving end is busy. +; congestion = tonelist +; Set of tones played when there is some congestion (on the network?) +; callwaiting = tonelist +; Set of tones played when there is a call waiting in the background. +; dialrecall = tonelist +; Not well defined; many phone systems play a recall dial tone after hook +; flash. +; record = tonelist +; Set of tones played when call recording is in progress. +; info = tonelist +; Set of tones played with special information messages (e.g., "number is +; out of service") +; 'name' = tonelist +; Every other variable will be available as a shortcut for the "PlayList" command +; but will not be used automatically by Asterisk. +; +; +; The tonelist itself is defined by a comma-separated sequence of elements. +; Each element consist of a frequency (f) with an optional duration (in ms) +; attached to it (f/duration). The frequency component may be a mixture of two +; frequencies (f1+f2) or a frequency modulated by another frequency (f1*f2). +; The implicit modulation depth is fixed at 90%, though. +; If the list element starts with a !, that element is NOT repeated, +; therefore, only if all elements start with !, the tonelist is time-limited, +; all others will repeat indefinitely. +; +; concisely: +; element = [!]freq[+|*freq2][/duration] +; tonelist = element[,element]* +; +; Please note that SPACES ARE NOT ALLOWED in tone lists! +; + +[at] +description = Austria +ringcadence = 1000,5000 +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +dial = 420 +busy = 420/400,0/400 +ring = 420/1000,0/5000 +congestion = 420/200,0/200 +callwaiting = 420/40,0/1960 +dialrecall = 420 +; RECORDTONE - not specified +record = 1400/80,0/14920 +info = 950/330,1450/330,1850/330,0/1000 +stutter = 380+420 + +[au] +description = Australia +; Reference http://www.acif.org.au/__data/page/3303/S002_2001.pdf +; Normal Ring +ringcadence = 400,200,400,2000 +; Distinctive Ring 1 - Forwarded Calls +; 400,400,200,200,400,1400 +; Distinctive Ring 2 - Selective Ring 2 + Operator + Recall +; 400,400,200,2000 +; Distinctive Ring 3 - Multiple Subscriber Number 1 +; 200,200,400,2200 +; Distinctive Ring 4 - Selective Ring 1 + Centrex +; 400,2600 +; Distinctive Ring 5 - Selective Ring 3 +; 400,400,200,400,200,1400 +; Distinctive Ring 6 - Multiple Subscriber Number 2 +; 200,400,200,200,400,1600 +; Distinctive Ring 7 - Multiple Subscriber Number 3 + Data Privacy +; 200,400,200,400,200,1600 +; Tones +dial = 413+438 +busy = 425/375,0/375 +ring = 413+438/400,0/200,413+438/400,0/2000 +; XXX Congestion: Should reduce by 10 db every other cadence XXX +congestion = 425/375,0/375,420/375,0/375 +callwaiting = 425/200,0/200,425/200,0/4400 +dialrecall = 413+438 +; Record tone used for Call Intrusion/Recording or Conference +record = !425/1000,!0/15000,425/360,0/15000 +info = 425/2500,0/500 +; Other Australian Tones +; The STD "pips" indicate the call is not an untimed local call +std = !525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100,!0/100,!525/100 +; Facility confirmation tone (eg. Call Forward Activated) +facility = 425 +; Message Waiting "stutter" dialtone +stutter = 413+438/100,0/40 +; Ringtone for calls to Telstra mobiles +ringmobile = 400+450/400,0/200,400+450/400,0/2000 + +[bg] +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +description = Bulgaria +ringdance = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/150,0/150,425/150,0/4000 +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +record = 1400/425,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425/1500,0/100 + +[br] +description = Brazil +ringcadence = 1000,4000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/4000 +congestion = 425/250,0/250,425/750,0/250 +callwaiting = 425/50,0/1000 +; Dialrecall not used in Brazil standard (using UK standard) +dialrecall = 350+440 +; Record tone is not used in Brazil, use busy tone +record = 425/250,0/250 +; Info not used in Brazil standard (using UK standard) +info = 950/330,1400/330,1800/330 +stutter = 350+440 + +[be] +description = Belgium +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,3000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/3000 +congestion = 425/167,0/167 +callwaiting = 1400/175,0/175,1400/175,0/3500 +; DIALRECALL - not specified +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440" +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = 900/330,1400/330,1800/330,0/1000 +stutter = 425/1000,0/250 + +[ch] +description = Switzerland +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/200,0/200,425/200,0/4000 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425+340/1100,0/1100 + +[cl] +description = Chile +; According to specs from Telefonica CTC Chile +ringcadence = 1000,3000 +dial = 400 +busy = 400/500,0/500 +ring = 400/1000,0/3000 +congestion = 400/200,0/200 +callwaiting = 400/250,0/8750 +dialrecall = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 +record = 1400/500,0/15000 +info = 950/333,1400/333,1800/333,0/1000 +stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 + +[cn] +description = China +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 450 +busy = 450/350,0/350 +ring = 450/1000,0/4000 +congestion = 450/700,0/700 +callwaiting = 450/400,0/4000 +dialrecall = 450 +record = 950/400,0/10000 +info = 450/100,0/100,450/100,0/100,450/100,0/100,450/400,0/400 +; STUTTER - not specified +stutter = 450+425 + +[cz] +description = Czech Republic +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425/330,0/330,425/660,0/660 +busy = 425/330,0/330 +ring = 425/1000,0/4000 +congestion = 425/165,0/165 +callwaiting = 425/330,0/9000 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425/330,0/330,425/660,0/660 +; RECORDTONE - not specified +record = 1400/500,0/14000 +info = 950/330,0/30,1400/330,0/30,1800/330,0/1000 +; STUTTER - not specified +stutter = 425/450,0/50 + +[de] +description = Germany +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/480,0/480 +ring = 425/1000,0/4000 +congestion = 425/240,0/240 +callwaiting = !425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,!0/5000,!425/200,!0/200,!425/200,0 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425+400 + +[dk] +description = Denmark +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = !425/200,!0/600,!425/200,!0/3000,!425/200,!0/200,!425/200,0 +; DIALRECALL - not specified +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; RECORDTONE - not specified +record = 1400/80,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +; STUTTER - not specified +stutter = 425/450,0/50 + +[ee] +description = Estonia +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +; CALLWAIT not in accordance to ITU +callwaiting = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +; DIALRECALL - not specified +dialrecall = 425/650,0/25 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; INFO not in accordance to ITU +info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +; STUTTER not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[es] +description = Spain +ringcadence = 1500,3000 +dial = 425 +busy = 425/200,0/200 +ring = 425/1500,0/3000 +congestion = 425/200,0/200,425/200,0/200,425/200,0/600 +callwaiting = 425/175,0/175,425/175,0/3500 +dialrecall = !425/200,!0/200,!425/200,!0/200,!425/200,!0/200,425 +record = 1400/500,0/15000 +info = 950/330,0/1000 +dialout = 500 + + +[fi] +description = Finland +ringcadence = 1000,4000 +dial = 425 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/8000 +dialrecall = 425/650,0/25 +record = 1400/500,0/15000 +info = 950/650,0/325,950/325,0/30,1400/1300,0/2600 +stutter = 425/650,0/25 + +[fr] +description = France +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1500,3500 +; Dialtone can also be 440+330 +dial = 440 +busy = 440/500,0/500 +ring = 440/1500,0/3500 +; CONGESTION - not specified +congestion = 440/250,0/250 +callwait = 440/300,0/10000 +; DIALRECALL - not specified +dialrecall = !350+440/100,!0/100,!350+440/100,!0/100,!350+440/100,!0/100,350+440 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330 +stutter = !440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,!440/100,!0/100,440 + +[gr] +description = Greece +ringcadence = 1000,4000 +dial = 425/200,0/300,425/700,0/800 +busy = 425/300,0/300 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/8000 +dialrecall = 425/650,0/25 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 425/650,0/25 + +[hu] +description = Hungary +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1250,3750 +dial = 425 +busy = 425/300,0/300 +ring = 425/1250,0/3750 +congestion = 425/300,0/300 +callwaiting = 425/40,0/1960 +dialrecall = 425+450 +; RECORDTONE - not specified +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 350+375+400 + +[il] +description = Israel +ringcadence = 1000,3000 +dial = 414 +busy = 414/500,0/500 +ring = 414/1000,0/3000 +congestion = 414/250,0/250 +callwaiting = 414/100,0/100,414/100,0/100,414/600,0/3000 +dialrecall = !414/100,!0/100,!414/100,!0/100,!414/100,!0/100,414 +record = 1400/500,0/15000 +info = 1000/330,1400/330,1800/330,0/1000 +stutter = !414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,!414/160,!0/160,414 + + +[in] +description = India +ringcadence = 400,200,400,2000 +dial = 400*25 +busy = 400/750,0/750 +ring = 400*25/400,0/200,400*25/400,0/2000 +congestion = 400/250,0/250 +callwaiting = 400/200,0/100,400/200,0/7500 +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/1000 +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 + +[it] +description = Italy +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +dial = 425/200,0/200,425/600,0/1000 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/400,0/100,425/250,0/100,425/150,0/14000 +dialrecall = 470/400,425/400 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 470/400,425/400 + +[lt] +description = Lithuania +ringcadence = 1000,4000 +dial = 425 +busy = 425/350,0/350 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/150,0/150,425/150,0/4000 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +; STUTTER - not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[jp] +description = Japan +ringcadence = 1000,2000 +dial = 400 +busy = 400/500,0/500 +ring = 400+15/1000,0/2000 +congestion = 400/500,0/500 +callwaiting = 400+16/500,0/8000 +dialrecall = !400/200,!0/200,!400/200,!0/200,!400/200,!0/200,400 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,!400/100,!0/100,400 + +[mx] +description = Mexico +ringcadence = 2000,4000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/200,0/600,425/200,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,0/30,1400/330,0/30,1800/330,0/1000 +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 + +[my] +description = Malaysia +ringcadence = 2000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/400,0/200 +congestion = 425/500,0/500 + +[nl] +description = Netherlands +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +ringcadence = 1000,4000 +; Most of these 425's can also be 450's +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 425/500,0/9500 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = 425/500,0/50 + +[no] +description = Norway +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/200,0/200 +callwaiting = 425/200,0/600,425/200,0/10000 +dialrecall = 470/400,425/400 +record = 1400/400,0/15000 +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,0 +stutter = 470/400,425/400 + +[nz] +description = New Zealand +;NOTE - the ITU has different tonesets for NZ, but according to some residents there, +; this is, indeed, the correct way to do it. +ringcadence = 400,200,400,2000 +dial = 400 +busy = 400/250,0/250 +ring = 400+450/400,0/200,400+450/400,0/2000 +congestion = 400/375,0/375 +callwaiting = !400/200,!0/3000,!400/200,!0/3000,!400/200,!0/3000,!400/200 +dialrecall = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 +record = 1400/425,0/15000 +info = 400/750,0/100,400/750,0/100,400/750,0/100,400/750,0/400 +stutter = !400/100!0/100,!400/100,!0/100,!400/100,!0/100,!400/100!0/100,!400/100,!0/100,!400/100,!0/100,400 +unobtainable = 400/75,0/100,400/75,0/100,400/75,0/100,400/75,0/400 + +[pl] +description = Poland +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/500,0/500 +callwaiting = 425/150,0/150,425/150,0/4000 +; DIALRECALL - not specified +dialrecall = 425/500,0/50 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; 950/1400/1800 3x0.33 on 1.0 off repeated 3 times +info = !950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000,!950/330,!1400/330,!1800/330,!0/1000 +; STUTTER - not specified +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[pt] +description = Portugal +ringcadence = 1000,5000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/5000 +congestion = 425/200,0/200 +callwaiting = 440/300,0/10000 +dialrecall = 425/1000,0/200 +record = 1400/500,0/15000 +info = 950/330,1400/330,1800/330,0/1000 +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 + +[ru] +description = Russia / ex Soviet Union +ringcadence = 800,3200 +dial = 425 +busy = 425/350,0/350 +ring = 425/800,0/3200 +congestion = 425/350,0/350 +callwaiting = 425/200,0/5000 +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 + +[se] +description = Sweden +ringcadence = 1000,5000 +dial = 425 +busy = 425/250,0/250 +ring = 425/1000,0/5000 +congestion = 425/250,0/750 +callwaiting = 425/200,0/500,425/200,0/9100 +dialrecall = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +record = 1400/500,0/15000 +info = !950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,!0/2024,!950/332,!0/24,!1400/332,!0/24,!1800/332,0 +stutter = !425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,!425/100,!0/100,425 +; stutter = 425/320,0/20 ; Real swedish standard, not used for now + +[sg] +description = Singapore +; Singapore +; Reference: http://www.ida.gov.sg/idaweb/doc/download/I397/ida_ts_pstn1_i4r2.pdf +; Frequency specs are: 425 Hz +/- 20Hz; 24 Hz +/- 2Hz; modulation depth 100%; SIT +/- 50Hz +ringcadence = 400,200,400,2000 +dial = 425 +ring = 425*24/400,0/200,425*24/400,0/2000 ; modulation should be 100%, not 90% +busy = 425/750,0/750 +congestion = 425/250,0/250 +callwaiting = 425*24/300,0/200,425*24/300,0/3200 +stutter = !425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,!425/200,!0/200,!425/600,!0/200,425 +info = 950/330,1400/330,1800/330,0/1000 ; not currently in use acc. to reference +dialrecall = 425*24/500,0/500,425/500,0/2500 ; unspecified in IDA reference, use repeating Holding Tone A,B +record = 1400/500,0/15000 ; unspecified in IDA reference, use 0.5s tone every 15s +; additionally defined in reference +nutone = 425/2500,0/500 +intrusion = 425/250,0/2000 +warning = 425/624,0/4376 ; end of period tone, warning +acceptance = 425/125,0/125 +holdinga = !425*24/500,!0/500 ; followed by holdingb +holdingb = !425/500,!0/2500 + +[th] +description = Thailand +ringcadence = 1000,4000 +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +dial = 400*50 +busy = 400/500,0/500 +ring = 420/1000,0/5000 +congestion = 400/300,0/300 +callwaiting = 1000/400,10000/400,1000/400 +; DIALRECALL - not specified - use special dial tone instead. +dialrecall = 400*50/400,0/100,400*50/400,0/100 +; RECORDTONE - not specified +record = 1400/500,0/15000 +; INFO - specified as an announcement - use special information tones instead +info = 950/330,1400/330,1800/330 +; STUTTER - not specified +stutter = !400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,!400/200,!0/200,!400/600,!0/200,400 + +[uk] +description = United Kingdom +ringcadence = 400,200,400,2000 +; These are the official tones taken from BT SIN350. The actual tones +; used by BT include some volume differences so sound slightly different +; from Asterisk-generated ones. +dial = 350+440 +; Special dial is the intermittent dial tone heard when, for example, +; you have a divert active on the line +specialdial = 350+440/750,440/750 +; Busy is also called "Engaged" +busy = 400/375,0/375 +; "Congestion" is the Beep-bip engaged tone +congestion = 400/400,0/350,400/225,0/525 +; "Special Congestion" is not used by BT very often if at all +specialcongestion = 400/200,1004/300 +unobtainable = 400 +ring = 400+450/400,0/200,400+450/400,0/2000 +callwaiting = 400/100,0/4000 +; BT seem to use "Special Call Waiting" rather than just "Call Waiting" tones +specialcallwaiting = 400/250,0/250,400/250,0/250,400/250,0/5000 +; "Pips" used by BT on payphones. (Sounds wrong, but this is what BT claim it +; is and I've not used a payphone for years) +creditexpired = 400/125,0/125 +; These two are used to confirm/reject service requests on exchanges that +; don't do voice announcements. +confirm = 1400 +switching = 400/200,0/400,400/2000,0/400 +; This is the three rising tones Doo-dah-dee "Special Information Tone", +; usually followed by the BT woman saying an appropriate message. +info = 950/330,0/15,1400/330,0/15,1800/330,0/1000 +; Not listed in SIN350 +record = 1400/500,0/60000 +stutter = 350+440/750,440/750 + +[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 + +[us-old] +description = United States Circa 1950/ North America +ringcadence = 2000,4000 +dial = 600*120 +busy = 500*100/500,0/500 +ring = 420*40/2000,0/4000 +congestion = 500*100/250,0/250 +callwaiting = 440/300,0/10000 +dialrecall = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 +record = 1400/500,0/15000 +info = !950/330,!1400/330,!1800/330,0 +stutter = !600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,!600*120/100,!0/100,600*120 + +[tw] +description = Taiwan +; http://nemesis.lonestar.org/reference/telecom/signaling/dialtone.html +; http://nemesis.lonestar.org/reference/telecom/signaling/busy.html +; http://www.iproducts.com.tw/ee/kylink/06ky-1000a.htm +; http://www.pbx-manufacturer.com/ky120dx.htm +; http://www.nettwerked.net/tones.txt +; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/taiw_sup/taiw2.htm +; +; busy tone 480+620Hz 0.5 sec. on ,0.5 sec. off +; reorder tone 480+620Hz 0.25 sec. on,0.25 sec. off +; ringing tone 440+480Hz 1 sec. on ,2 sec. off +; +ringcadence = 1000,4000 +dial = 350+440 +busy = 480+620/500,0/500 +ring = 440+480/1000,0/2000 +congestion = 480+620/250,0/250 +callwaiting = 350+440/250,0/250,350+440/250,0/3250 +dialrecall = 300/1500,0/500 +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 + +[ve] +; Tone definition source for ve found on +; Reference: http://www.itu.int/ITU-T/inr/forms/files/tones-0203.pdf +description = Venezuela / South America +ringcadence = 1000,4000 +dial = 425 +busy = 425/500,0/500 +ring = 425/1000,0/4000 +congestion = 425/250,0/250 +callwaiting = 400+450/300,0/6000 +dialrecall = 425 +record = 1400/500,0/15000 +info = !950/330,!1440/330,!1800/330,0/1000 + + +[za] +description = South Africa +; http://www.cisco.com/univercd/cc/td/doc/product/tel_pswt/vco_prod/safr_sup/saf02.htm +; (definitions for other countries can also be found there) +; Note, though, that South Africa uses two switch types in their network -- +; Alcatel switches -- mainly in the Western Cape, and Siemens elsewhere. +; The former use 383+417 in dial, ringback etc. The latter use 400*33 +; I've provided both, uncomment the ones you prefer +ringcadence = 400,200,400,2000 +; dial/ring/callwaiting for the Siemens switches: +dial = 400*33 +ring = 400*33/400,0/200,400*33/400,0/2000 +callwaiting = 400*33/250,0/250,400*33/250,0/250,400*33/250,0/250,400*33/250,0/250 +; dial/ring/callwaiting for the Alcatel switches: +; dial = 383+417 +; ring = 383+417/400,0/200,383+417/400,0/2000 +; callwaiting = 383+417/250,0/250,383+417/250,0/250,383+417/250,0/250,383+417/250,0/250 +congestion = 400/250,0/250 +busy = 400/500,0/500 +dialrecall = 350+440 +; XXX Not sure about the RECORDTONE +record = 1400/500,0/10000 +info = 950/330,1400/330,1800/330,0/330 +stutter = !400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,!400*33/100,!0/100,400*33 + Index: /freepbx/branches/2.7/amp_conf/astetc/rtp.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/rtp.conf (revision 7529) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/queues.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/queues.conf (revision 4993) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/freepbx_module_admin.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/freepbx_module_admin.conf (revision 6125) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/modules.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/modules.conf (revision 8599) +++ /freepbx/branches/2.7/amp_conf/astetc/modules.conf (revision 8599) @@ -0,0 +1,72 @@ +; +; 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 +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/branches/2.7/amp_conf/astetc/phpagi.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/phpagi.conf (revision 8) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/extensions_custom.conf.sample =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/extensions_custom.conf.sample (revision 8599) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/phone.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/phone.conf (revision 8) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/manager.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/manager.conf (revision 8458) +++ /freepbx/branches/2.7/amp_conf/astetc/manager.conf (revision 8458) @@ -0,0 +1,25 @@ +; +; 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 + +[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/branches/2.7/amp_conf/astetc/chan_dahdi.conf.template =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/chan_dahdi.conf.template (revision 6600) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/meetme.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/meetme.conf (revision 8) +++ /freepbx/branches/2.7/amp_conf/astetc/meetme.conf (revision 8) @@ -0,0 +1,2 @@ +[rooms] +#include meetme_additional.conf Index: /freepbx/branches/2.7/amp_conf/astetc/privacy.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/privacy.conf (revision 8) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/vm_email.inc =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/vm_email.inc (revision 8599) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/logger.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/logger.conf (revision 7529) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/voicemail.conf.template =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/voicemail.conf.template (revision 8) +++ /freepbx/branches/2.7/amp_conf/astetc/voicemail.conf.template (revision 8) @@ -0,0 +1,5 @@ +[general] +#include vm_general.inc +#include vm_email.inc +[default] + Index: /freepbx/branches/2.7/amp_conf/astetc/musiconhold.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/musiconhold.conf (revision 2448) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/astetc/freepbx_featurecodes.conf =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/freepbx_featurecodes.conf (revision 5991) +++ /freepbx/branches/2.7/amp_conf/astetc/freepbx_featurecodes.conf (revision 5991) @@ -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/branches/2.7/amp_conf/astetc/zapata.conf.template =================================================================== --- /freepbx/branches/2.7/amp_conf/astetc/zapata.conf.template (revision 390) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_ca.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_ca.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_ru.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_ru.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_de.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_de.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/UPGRADE =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/UPGRADE (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/ming-source/operator_panel.pl =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/ming-source/operator_panel.pl (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/ming-source/README =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/ming-source/README (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/ming-source/comunicator.pl =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/ming-source/comunicator.pl (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_astdb.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_astdb.cfg (revision 8360) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/RECIPES =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/RECIPES (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/index_amp.php =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/index_amp.php (revision 8095) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/index_amp.php (revision 8095) @@ -0,0 +1,52 @@ + + + + +Flash Operator Panel + + + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/op_buttons.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_buttons.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_style.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_style.cfg (revision 8343) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/README =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/README (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/crossdomain.xml =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/crossdomain.xml (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/crossdomain.xml (revision 8165) @@ -0,0 +1,5 @@ + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_es.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_es.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/help_fr.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_fr.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/help_se.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_se.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/help_it.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_it.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/help_no.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_no.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/index-crm.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-crm.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-crm.html (revision 8165) @@ -0,0 +1,40 @@ + + + +Asterisk Flash Operator Panel + + + + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-clicktodial.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-clicktodial.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-clicktodial.html (revision 8165) @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + +
+ + + + + + + + +Dial 1-800-555-5555 + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_ru.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_ru.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_ru.html (revision 8165) @@ -0,0 +1,14 @@ +

ПереЎ выпПлМеМОеЌ ÐºÐ°ÐºÐžÑ +-лОбП ЎействОй, ваЌ слеЎует ввестО кПЎ безПпасМПстО.
+
+ППсле этПгП вы сЌПжете: +

    +
  • ПеревПЎОть звПМкО: перетащОв зМачПк телефПМа Ма МужМПе ваЌ целевПй МПЌер
  • +
  • Сбрасывать звПМкО: ЎвПйМыЌ клОкПЌ Ма красМую кМПпку
  • +
  • ИМОцООрПвать звПМкО: перетаскОваМОеЌ свПбПЎМПгП вМутреММегП МПЌера Ма свПбПЎМый целевПй МПЌер
  • +
  • КПМфереМц-связь: Вы ЌПжете ЎПбавОть третьегП сПбесеЎМОка в существующОй разгПвПр путеЌ перетаскОваМОя свПбПЎМПгП вМутреММегП МПЌера в зПМу ЎействующегП разгПвПра.
  • +
+Также Вы ЌПжете впОсать ЎПбавПчМую ОМфПрЌацОю в пПле ОМфПрЌацОО переЎ перевПЎПЌ ОлО МачалПЌ МПвПгП звПМка. +В такПЌ случае, ПМ пПказывается как текст АОНа Ўля любПгП МПвПгП ОлО перевеЎеММПгП звПМка МапрОЌер: +"740-9982 НОкПлай Оз ЊеМтрПбаМка" +

Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_de.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_de.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/flash/index-fixed.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-fixed.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-fixed.html (revision 8165) @@ -0,0 +1,20 @@ + + + + + + + + +Asterisk Flash Operator Panel + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-restrict.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-restrict.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index-restrict.html (revision 8165) @@ -0,0 +1,37 @@ + + + +Asterisk Flash Operator Panel + + + + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/mypage.php =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/mypage.php (revision 8166) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/mypage.php (revision 8166) @@ -0,0 +1,21 @@ + + + + + +"; +} 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/branches/2.7/amp_conf/htdocs_panel/flash/index.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index.html (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/index.html (revision 8165) @@ -0,0 +1,27 @@ + + + +Asterisk Flash Operator Panel + + + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_en.html =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/flash/help_en.html (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/index.php =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/index.php (revision 8095) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/index.php (revision 8095) @@ -0,0 +1,51 @@ + + + + +Flash Operator Panel + + + + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_gl.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_gl.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_en.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_en.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_server.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_server.cfg (revision 8095) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/op_server.cfg (revision 8095) @@ -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/branches/2.7/amp_conf/htdocs_panel/init/op_panel_suse.sh =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/init/op_panel_suse.sh (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/init/op_panel_debian.sh =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/init/op_panel_debian.sh (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/init/op_panel_redhat.sh =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/init/op_panel_redhat.sh (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/extensions.conf.sample =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/extensions.conf.sample (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/safe_opserver =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/safe_opserver (revision 8166) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_es.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_es.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_fr.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_fr.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_se.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_se.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/TODO =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/TODO (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/FAQ =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/FAQ (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/dhtml/css/operator.css =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/css/operator.css (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/dhtml/css/default.css =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/css/default.css (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/base64.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/base64.js (revision 8165) +++ /freepbx/branches/2.7/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 = '' + this.content + '
'; + 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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/builder.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/builder.js (revision 8165) +++ /freepbx/branches/2.7/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 + ">"; + } 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 + ">"; + } 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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/window.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/window.js (revision 8165) +++ /freepbx/branches/2.7/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 = "\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
\ + \ + \ + \ + \ + \ + \ +
"+ title +"
\ +
\ + \ + \ + \ + \ + \ + \ +
"+ content +"
\ +
\ + \ + \ + \ + \ + \ + \ +
"+ (resizable ? "
" : "
") +"
\ +
\ + "; + 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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/wz_tooltip.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/wz_tooltip.js (revision 8165) +++ /freepbx/branches/2.7/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_sContent + + '
' + + (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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/operator.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/operator.js (revision 8165) +++ /freepbx/branches/2.7/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(''); + }, + 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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/dragdrop.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/dragdrop.js (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/slider.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/slider.js (revision 8165) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/dhtml/js/controls.js =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/js/controls.js (revision 8165) +++ /freepbx/branches/2.7/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 "
      " + ret.join('') + "
    "; + } + }, 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/branches/2.7/amp_conf/htdocs_panel/dhtml/index.php =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/index.php (revision 8166) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/index.php (revision 8166) @@ -0,0 +1,94 @@ + $buttoncount) {$buttoncount = $numero;} + } +} +?> + + + + + + + + + + + + + + + + + + + + + + + + + + +\n"; +echo " 
    \n"; +echo " 
    \n"; +echo "

     
    "; +echo "
     
    "; +echo ""; +echo ""; +echo "
     
    "; +echo "\n"; +} +?> +

    +
    +
    + +
    +
    + +
    + + + + + + + + + + Index: /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/variables.php =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/variables.php (revision 8165) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/dhtml/variables.php (revision 8165) @@ -0,0 +1,29 @@ + $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/branches/2.7/amp_conf/htdocs_panel/CHANGES =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/CHANGES (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_it.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_it.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_lang_no.cfg =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_lang_no.cfg (revision 8095) +++ /freepbx/branches/2.7/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/branches/2.7/amp_conf/htdocs_panel/op_server.pl =================================================================== --- /freepbx/branches/2.7/amp_conf/htdocs_panel/op_server.pl (revision 8166) +++ /freepbx/branches/2.7/amp_conf/htdocs_panel/op_server.pl (revision 8166) @@ -0,0 +1,10874 @@ +#!/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 (