FINAL suepr merge step : added all modules to this super repos
339
sites/all/modules/contrib/files/imce/imce/LICENSE.txt
Normal file
@@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
181
sites/all/modules/contrib/files/imce/imce/README.txt
Normal file
@@ -0,0 +1,181 @@
|
||||
|
||||
IMCE
|
||||
http://drupal.org/project/imce
|
||||
====================================
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
IMCE is an image/file uploader and browser that supports personal directories and quota.
|
||||
IMCE can easily be integrated into any WYSIWYG editor or any web application that needs a file browser.
|
||||
See INTEGRATION METHODS for more information.
|
||||
|
||||
FEATURES
|
||||
-----------
|
||||
- Basic file operations: upload, delete
|
||||
- Image(jpg, png, gif) operations: resize, create thumbnails, preview
|
||||
- Support for private file system
|
||||
- Configurable limits for user roles: file size per upload, directory quota, file extensions, and image dimensions
|
||||
- Personal or shared folders for users
|
||||
- Permissions per directory
|
||||
- Ftp-like directory navigation
|
||||
- File sorting by name, size, dimensions, date
|
||||
- Tabbed interface for file operations
|
||||
- Keyboard shortcuts(up, down, insert(or enter), delete, home, end, ctrl+A, R(esize), T(humbnails), U(pload)).
|
||||
- Built-in support for inline image/file insertion into textareas
|
||||
- Multiple file selection(using ctrl or shift)
|
||||
- Ajax file operations
|
||||
- Themable layout using tpl files
|
||||
|
||||
INSTALLATION
|
||||
-----------
|
||||
1) Copy imce directory to your modules directory
|
||||
2) Enable the module at module administration page
|
||||
3) Create configuration profiles and assign them to user roles at /admin/config/media/imce
|
||||
4) Test it at /imce.
|
||||
5) See imce-content.tpl.php for some configuration options such as inline previewing.
|
||||
6) See INTEGRATION METHODS to make IMCE collaborate with your application if it's not already integrated.
|
||||
Notes:
|
||||
- When you configure IMCE for inline image/file insertion into textareas there should appear an IMCE link under each textarea you specified.
|
||||
- If you are uploading files containing unicode characters, it is strongly recommended to use the transliteration module that sanitizes filenames by converting characters from unicode to us-ascii. http://drupal.org/project/transliteration
|
||||
- If you are using CCK, you may want to check the File field sources module at http://drupal.org/project/filefield_sources
|
||||
|
||||
|
||||
FREQUENTLY FACED ISSUES
|
||||
-----------
|
||||
- Inaccessible/invalid directory or subdirectory:
|
||||
In some server configurations, manually(ftp or directly) created directories may not be writable by PHP(by IMCE). In this case, you have to set the chmod permissions of the directory to 0777 in order to make it writable by anyone.
|
||||
You should also make sure that in each configuration profile all of the defined directories are located under drupal's file system path which is usually "files".
|
||||
And also if "safe mode restriction" is active in your server, don't expect IMCE to run flawlessly.
|
||||
|
||||
- Disappearing images after node submission:
|
||||
Having nothing to do with IMCE, it appeared many times in issue queues. This is an input filtering issue that can be resolved by adding <img> tag into the default input format. Using Full HTML is another solution. See admin/config/content/formats.
|
||||
|
||||
- Upload does not work in Opera
|
||||
Jquery form plugin before version 2.09 has problems with Opera 9.2+. Replace Drupal's misc/jquery.form.js with the one at http://jquery.malsup.com/form/#download
|
||||
|
||||
- IMCE may have problem working with Google Analytics and Secure pages modules. Just make sure to add *imce* path to the exceptions list of these modules.
|
||||
|
||||
|
||||
INTEGRATION METHODS
|
||||
-----------
|
||||
|
||||
Here are the applications that already integrated IMCE.
|
||||
|
||||
WYSIWYG:
|
||||
Install http://drupal.org/project/imce_wysiwyg bridge module and enable IMCE as a plug-in in WYSIWYG settings
|
||||
|
||||
BUEditor:
|
||||
IMCE is integrated in image and link dialogs.
|
||||
|
||||
(F)CKeditor(without WYSIWYG):
|
||||
(F)ckeditor profile->File browser settings->IMCE integration
|
||||
|
||||
If your application is not one of the above, please keep reading in order to learn how to integrate IMCE.
|
||||
|
||||
Let's create a CASE and embody the IMCE integration on it:
|
||||
- An application named myApp
|
||||
- Has an url field for file url:
|
||||
<input type="text" name="urlField" id="urlField">
|
||||
- Has a browse button with click event(inline or set by jQuery): (This can be a text link or anything that is clickable)
|
||||
<input type="button" value="Browse" onclick="openFileBrowser()">
|
||||
|
||||
Now let's go through the integration methods and define the openFileBrowser function that opens IMCE and makes it fill our url field on file selection.
|
||||
|
||||
|
||||
INTEGRATION BY URL
|
||||
-----------
|
||||
When IMCE is opened using an url that contains &app=applicationName|fileProperty1@FieldId1|fileProperty2@FieldId2|...
|
||||
the specified fields are filled with the specified properties of the selected file.
|
||||
|
||||
Avaliable file properties are: url, name, size(formatted), width, height, date(formatted), bytes(integer size in bytes), time(integer date timestamp), id(file id for newly uploaded files, 0 or integer), relpath(rawurlencoded path relative to file directory path.)
|
||||
|
||||
In our CASE, we should open IMCE using this URL: /imce?app=myApp|url@urlField which contains our application name and our url field id
|
||||
|
||||
function openFileBrowser() {
|
||||
window.open('/imce?app=myApp|url@urlField', '', 'width=760,height=560,resizable=1');
|
||||
}
|
||||
|
||||
That's all we need. Leave the rest to IMCE.
|
||||
It will automatically create an operation tab named "Send to myApp" that sends the file url to our url field.
|
||||
Clicking the files in preview do the same thing as well.
|
||||
|
||||
- What if we had another field for another file property e.g, Size: <input type="text" id="file-size"> ?
|
||||
- We should have opened imce using this URL: /imce?app=myApp|url@urlField|size@file-size
|
||||
|
||||
|
||||
- USING imceload:
|
||||
You can point a predefined function to be executed when IMCE loads.
|
||||
When the URL is like "app=myApp|imceload@myOnloadFunc", IMCE looks for "myOnloadFunc" in the parent window and executes it with the window parameter referring to IMCE window.
|
||||
function myOnloadFunc (win) {//any method of imce is available through win.imce
|
||||
win.imce.setSendTo('Give it to myApplication baby', myFileHandler);//you should also define myFileHandler
|
||||
}
|
||||
|
||||
- USING sendto:
|
||||
You can point a predefined function to which the selected files are sent.
|
||||
When the URL is like "app=myApp|sendto@myFileHandler", IMCE calls "myFileHandler" function of the parent window with file and window parameters.
|
||||
function myFileHandler (file, win) {
|
||||
$('#urlFieldId').val(file.url);//insert file url into the url field
|
||||
win.close();//close IMCE
|
||||
}
|
||||
Usually sendto method is easier to implement, on the other hand imceload method is more flexible as you manually add your sento operator and also can do any modification before IMCE shows up.
|
||||
|
||||
|
||||
ADVANCED INTEGRATION
|
||||
-----------
|
||||
In case:
|
||||
- Your application wants to go beyond the simple "give me that file property" interaction with IMCE.
|
||||
- Your application wants IMCE to send multiple files to it.(e.g., a gallery application)
|
||||
- Your application wants to gain total control over IMCE.
|
||||
Then you should consider applying advanced integration.
|
||||
|
||||
The initial step of advanced integration is the same as imceload-integration above.
|
||||
|
||||
We open IMCE and set its onload function:
|
||||
|
||||
window.open('/imce?app=myApp|imceload@initiateMyApp', '', 'width=760,height=560,resizable=1'); //initiateMyApp(win) will run when imce loads
|
||||
|
||||
Now we define our initiator function in which we do the necessary manipulations to IMCE interface:
|
||||
|
||||
initiateMyApp = function (win) {
|
||||
var imce = win.imce;
|
||||
...use imce methods to add/remove/change things...
|
||||
}
|
||||
|
||||
- Allright, but what do we add/romeve/change in IMCE ?
|
||||
- Depends on our goal. Here are some properties and methods that can help us to achieve it:
|
||||
|
||||
Hooks
|
||||
imce.hooks.load: an array of functions that run after imce loads. they are called with the window parameter.
|
||||
imce.hooks.list: an array of functions that run while processing the file list. each row of the file list is sent to these functions.
|
||||
imce.hooks.navigate: an array of functions that run after a directory is loaded. parameters sent are data(from ajax or cache), old_directory, cached(boolean that states the data is from the cache or not).
|
||||
imce.hooks.cache: an array of functions that run just before a new directory is loaded. parameters are cached_data and new_directory.
|
||||
|
||||
Directory related properties
|
||||
imce.tree: stores the directory list where imce.tree['.'] is the root element.
|
||||
|
||||
Directory related methods
|
||||
imce.dirAdd(directory_name, parent_element, clickable): adds directory_name under parent_element. ex: imce.dirAdd('foo', imce.dir['.'], true)
|
||||
imce.dirSubdirs(directory_name, subdirectories): adds each subdirectory in subdirectories array under directory_name. ex: imce.dirSubdirs('foo', ['bar', 'baz'])
|
||||
|
||||
File related properties
|
||||
imce.findex: indexed array of files(table rows that contain file properties.)
|
||||
imce.fids: object containing file_id(file name)-file(row) pairs.
|
||||
imce.selected: object containing currently selected file_id(file name)-file(row) pairs.
|
||||
|
||||
File related methods
|
||||
imce.fileAdd(file): adds the file object to the list. file object has the properties; name, size(bytes), width, height, date(timestamp), fsize(formatted), fdate(formatted)
|
||||
imce.fileRemove(fiile_id): removes the file having the file_id from the list.
|
||||
imce.fileGet(file_id). returns the file object having the file_id. file object contains name, url, size, bytes, width, height, date, time, id(file id for newly uploaded files, 0 or integer), relpath(rawurlencoded path relative to file directory path.)
|
||||
|
||||
File operations
|
||||
imce.opAdd(op): adds an operation tab to the interface. op contains name, title, content(optional), func(optional onclick function)
|
||||
imce.opEnable(name), imce.opDisable(name): enable/disable operation tabs.
|
||||
|
||||
Miscellaneous
|
||||
imce.setMessage(msg, type): logs a message of the type(status, warning, error)
|
||||
|
||||
NOTES:
|
||||
- All URL strings in the examples start with "/" considering the base path is "/".
|
||||
In case your drupal is running on a sub directory e.g, http://localhost/drupal, these URLs should start with "/drupal/".
|
||||
There is a safer solution that does not require manual URL fixing: If the Drupal javascript object is avaliable in your page you can use Drupal.settings.basePath at the beginning of URLs (Drupal.settings.basePath+'?q=imce....'). Note that, this won't work with multilingual paths with language prefixes.
|
||||
- file and directory ids(names) used in imce.js are url encoded forms of original names. They are decoded using imce.decode and displayed in the lists.
|
BIN
sites/all/modules/contrib/files/imce/imce/css/close.png
Normal file
After Width: | Height: | Size: 322 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/collapsed.png
Normal file
After Width: | Height: | Size: 104 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/delete.png
Normal file
After Width: | Height: | Size: 320 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/error.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/expanded.png
Normal file
After Width: | Height: | Size: 101 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/folder-open.png
Normal file
After Width: | Height: | Size: 948 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/folder-root.png
Normal file
After Width: | Height: | Size: 338 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/folder.png
Normal file
After Width: | Height: | Size: 228 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/header.png
Normal file
After Width: | Height: | Size: 147 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/help.png
Normal file
After Width: | Height: | Size: 525 B |
460
sites/all/modules/contrib/files/imce/imce/css/imce-content.css
Normal file
@@ -0,0 +1,460 @@
|
||||
|
||||
/*Body*/
|
||||
body.imce {
|
||||
padding: 2px;
|
||||
background: none;
|
||||
text-align: left;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/*Main container*/
|
||||
/*reset all tags.*/
|
||||
#imce-content, #imce-content * {
|
||||
font: 11px/16px Verdana, sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
color: #444;
|
||||
background: none;
|
||||
border: none;
|
||||
float: none;
|
||||
list-style: none;
|
||||
}
|
||||
#imce-content {
|
||||
position: relative;
|
||||
background-color: #fff;
|
||||
}
|
||||
#imce-content a {
|
||||
text-decoration: none;
|
||||
}
|
||||
#imce-content label {
|
||||
font-weight: bold;
|
||||
}
|
||||
#imce-content label.option {
|
||||
font-weight: normal;
|
||||
}
|
||||
#imce-content input.form-text, #imce-content input[type=text], #imce-content input.form-file, #imce-content input[type=file], #imce-content select, #imce-content textarea {
|
||||
border: 1px inset #aaa;
|
||||
padding: 2px;
|
||||
background-color: #fff;
|
||||
margin: 1px;
|
||||
width: auto;
|
||||
}
|
||||
#imce-content input.form-submit, #imce-content input[type=submit], #imce-content button {
|
||||
border: 2px groove #fff;
|
||||
padding: 2px 6px 2px 20px;
|
||||
margin: 2px 0;
|
||||
background: #e8e8d8 url(submit.png) no-repeat 2px 50%;
|
||||
-moz-border-radius: 0;
|
||||
-webkit-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
#imce-content [disabled], #imce-content .disabled {
|
||||
color: #999;
|
||||
cursor: default;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
#imce-content input.loading {
|
||||
background-image: url(loading.gif) !important;
|
||||
}
|
||||
#imce-content .form-item {
|
||||
margin: 4px 0;
|
||||
}
|
||||
#imce-content .form-item .description {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
#imce-content strong, #imce-content h4 {
|
||||
font-weight: bold;
|
||||
}
|
||||
#imce-content em {
|
||||
font-style: italic;
|
||||
}
|
||||
#imce-content ul.tips {
|
||||
margin: 2px 8px;
|
||||
}
|
||||
#imce-content ul.tips li {
|
||||
list-style: circle inside;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
/*Main sections under imce-content*/
|
||||
#ops-wrapper {
|
||||
margin-bottom: 2px;
|
||||
background: #d0d7e7 url(ops.png) repeat-x;
|
||||
border: 1px solid #a5b9cd;
|
||||
}
|
||||
#browse-wrapper {
|
||||
overflow: hidden;
|
||||
height: 260px;
|
||||
clear: both;
|
||||
}
|
||||
#browse-resizer {}
|
||||
#preview-wrapper {
|
||||
height: 180px;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
/*columns of browse-wrapper*/
|
||||
#navigation-wrapper {
|
||||
width: 25%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
float: left;
|
||||
position: relative;
|
||||
}
|
||||
#navigation-resizer {
|
||||
height: 100%;
|
||||
float: left;
|
||||
}
|
||||
#sub-browse-wrapper {
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
/*rows of sub-browse wrapper*/
|
||||
#file-header-wrapper {
|
||||
height: 25px;
|
||||
background: url(header.png) repeat-x 0 0;
|
||||
position: relative;
|
||||
}
|
||||
#file-list-wrapper {
|
||||
padding-bottom: 20px;/*#dir-stat height*/
|
||||
outline: none;
|
||||
}
|
||||
#dir-stat {
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
bottom: 0;
|
||||
padding: 2px 5px;
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
|
||||
#dir-stat, #dir-stat * {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
/*Navigation header*/
|
||||
#navigation-header {
|
||||
background: url(header.png) repeat-x 0 0;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
width: 100%;
|
||||
height: 25px;
|
||||
}
|
||||
#navigation-header span {
|
||||
display: inline-block;
|
||||
padding: 4px 4px 5px 20px;
|
||||
font-weight: bold;
|
||||
background: url(tree.png) no-repeat 0 50%;
|
||||
}
|
||||
|
||||
/*Navigation tree (ul)*/
|
||||
#navigation-tree {
|
||||
margin-top: 25px;/*navigation-header height*/
|
||||
}
|
||||
#navigation-tree ul {
|
||||
margin-left: 15px;
|
||||
}
|
||||
#navigation-tree li {
|
||||
padding: 2px;
|
||||
background: transparent url(collapsed.png) no-repeat 3px 6px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#navigation-tree li.expanded {
|
||||
background-image: url(expanded.png);
|
||||
}
|
||||
#navigation-tree li.leaf {
|
||||
background-image: url(leaf.png);
|
||||
}
|
||||
#navigation-tree li.loading {
|
||||
background-image: url(loading.gif);
|
||||
background-position: 0 2px;
|
||||
}
|
||||
#navigation-tree li span.expander {
|
||||
display: inline-block;
|
||||
width: 12px;
|
||||
cursor: pointer;
|
||||
margin-right: 1px;
|
||||
}
|
||||
#navigation-tree li a {
|
||||
display: inline-block;
|
||||
}
|
||||
#navigation-tree li a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
#navigation-tree li a.folder {
|
||||
margin-left: 2px;
|
||||
padding-left: 18px;
|
||||
background: transparent url(folder.png) no-repeat 0 50%;
|
||||
}
|
||||
#navigation-tree li a.active {
|
||||
font-weight: bold;
|
||||
background-image: url(folder-open.png);
|
||||
background-color: #ecf0f4;
|
||||
}
|
||||
#navigation-tree li.root > a.folder {
|
||||
background-image: url(folder-root.png);
|
||||
}
|
||||
|
||||
/*File list and header. (Accessible by #file-list and #file-header. Both have the classname "files")*/
|
||||
#file-header, #file-list {
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
}
|
||||
#file-header td {
|
||||
padding: 4px;
|
||||
font-weight: bold;
|
||||
cursor: default;
|
||||
}
|
||||
#file-header td.asc {
|
||||
color: #f60;
|
||||
}
|
||||
#file-header td.asc:after {
|
||||
content: "\2193";
|
||||
font-weight: normal;
|
||||
}
|
||||
#file-header td.desc {
|
||||
color: #09f;
|
||||
}
|
||||
#file-header td.desc:after {
|
||||
content: "\2191";
|
||||
font-weight: normal;
|
||||
}
|
||||
#file-list td {
|
||||
overflow: hidden;
|
||||
border-top: 1px solid #ccf;
|
||||
border-bottom: 1px solid #ccf;
|
||||
padding: 4px;
|
||||
cursor: default;
|
||||
}
|
||||
#file-list td.name, #file-header td.name {
|
||||
min-width: 12em;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#file-list td.size, #file-header td.size {
|
||||
width: 6.5em;
|
||||
text-align: right;
|
||||
}
|
||||
#file-list td.width, #file-header td.width {
|
||||
width: 5em;
|
||||
text-align: right;
|
||||
}
|
||||
#file-list td.height, #file-header td.height {
|
||||
width: 5em;
|
||||
}
|
||||
#file-list td.date, #file-header td.date {
|
||||
width: 12em;
|
||||
text-align: center;
|
||||
}
|
||||
#file-list tr:hover td {
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
#file-list tr.selected td {
|
||||
background-color: #07f;
|
||||
color: #fff;
|
||||
}
|
||||
#file-list tr.selected span {
|
||||
color: #fff;
|
||||
}
|
||||
#file-list td.name img {
|
||||
vertical-align: middle;
|
||||
margin-right: 3px;
|
||||
}
|
||||
|
||||
|
||||
/*File operations*/
|
||||
#op-items {
|
||||
min-height: 26px;
|
||||
}
|
||||
#op-contents {
|
||||
position: absolute;
|
||||
z-index: 2;
|
||||
}
|
||||
#op-contents .op-content {
|
||||
display: none;
|
||||
padding: 16px;
|
||||
border: 2px solid #344454;
|
||||
background-color: #f5f5f5;
|
||||
position: relative;
|
||||
}
|
||||
#op-close-link {
|
||||
display: none;
|
||||
position: absolute;
|
||||
z-index: 3;
|
||||
top: 2px;
|
||||
right: 2px;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: url(close.png) no-repeat 50% 50%;
|
||||
}
|
||||
#ops-list {
|
||||
}
|
||||
#ops-list li {
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
#ops-list a {
|
||||
display: block;
|
||||
padding: 5px 8px 5px 20px;
|
||||
text-decoration: none;
|
||||
background: url(op.png) no-repeat 2px 50%;
|
||||
}
|
||||
#ops-list a:hover {
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
#ops-list li.active a {
|
||||
background-color: #f9f8f7;
|
||||
}
|
||||
#ops-list a span {
|
||||
display: inline-block;
|
||||
color: #0e1f43;
|
||||
padding-left: 1px;
|
||||
}
|
||||
#ops-list li.loading a {
|
||||
background-image: url(loading.gif);
|
||||
}
|
||||
|
||||
/*Custom op styles*/
|
||||
#op-item-upload a, #imce-content #edit-upload {
|
||||
background-image: url(upload.png);
|
||||
}
|
||||
#op-item-thumb a, #imce-content #edit-thumb {
|
||||
background-image: url(thumb.png);
|
||||
}
|
||||
#op-item-resize a, #imce-content #edit-resize {
|
||||
background-image: url(resize.png);
|
||||
}
|
||||
#op-item-delete a {
|
||||
background-image: url(delete.png);
|
||||
}
|
||||
#op-item-sendto a {
|
||||
background-image: url(sendto.png);
|
||||
}
|
||||
#op-item-help a {
|
||||
background-image: url(help.png);
|
||||
}
|
||||
#op-item-changeview a {
|
||||
background-image: url(view-box.png);
|
||||
}
|
||||
.box-view #op-item-changeview a {
|
||||
background-image: url(view-list.png);
|
||||
}
|
||||
#op-item-help a, #op-item-changeview a {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
width: 1px;
|
||||
padding: 5px 0 5px 25px;
|
||||
background-position: 5px 50%;
|
||||
}
|
||||
#op-item-help, #op-item-changeview {
|
||||
float: right !important;
|
||||
}
|
||||
|
||||
/*resizers*/
|
||||
#imce-content .y-resizer {
|
||||
height: 5px;
|
||||
cursor: n-resize;
|
||||
background: #f4f5f6 url(y-resizer.png) no-repeat 50% 50%;
|
||||
border-top: 1px solid #e0e3e5;
|
||||
border-bottom: 1px solid #e0e3e5;
|
||||
}
|
||||
#imce-content .x-resizer {
|
||||
width: 5px;
|
||||
cursor: e-resize;
|
||||
background: #f4f5f6 url(x-resizer.png) no-repeat 50% 50%;
|
||||
border-left: 1px solid #e0e3e5;
|
||||
border-right: 1px solid #e0e3e5;
|
||||
}
|
||||
|
||||
/*Message box*/
|
||||
#message-box {
|
||||
display: none;
|
||||
position: absolute;
|
||||
width: 60%;
|
||||
left: 20%;
|
||||
top: 32%;
|
||||
z-index: 10;
|
||||
padding: 5px;
|
||||
background-color: #fff;
|
||||
border: 2px solid #000;
|
||||
}
|
||||
#message-box * {
|
||||
font-size: 1.1em;
|
||||
font-weight: bold;
|
||||
color: #000;
|
||||
}
|
||||
#imce-content div.message {
|
||||
background: url(status.png) no-repeat 0 0;
|
||||
padding-left: 20px;
|
||||
margin: 2px 0;
|
||||
}
|
||||
#imce-content div.error {
|
||||
background: url(error.png) no-repeat 0 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
#imce-content div.warning {
|
||||
background: url(warning.png) no-repeat 0 0;
|
||||
padding-left: 20px;
|
||||
}
|
||||
#log-messages {
|
||||
height: 60px;
|
||||
overflow: auto;
|
||||
border: 1px solid #000;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
#log-messages * {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
#file-preview {
|
||||
text-align: center;
|
||||
}
|
||||
.imce-hide, .js #forms-wrapper, #help-box {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/*IE*/
|
||||
.ie #imce-content input, .ie #imce-content select {
|
||||
vertical-align: middle;
|
||||
line-height: 1.2em;
|
||||
}
|
||||
.ie-7 #navigation-tree li {
|
||||
list-style-image: none;
|
||||
}
|
||||
.ie-7 #imce-content input.form-submit, .ie-7 #imce-content input[type=submit], .ie-7 #imce-content button {
|
||||
border-style: outset;
|
||||
}
|
||||
.ie-7 #ops-list a span {
|
||||
cursor: pointer;
|
||||
}
|
||||
.ie-7 #file-list-wrapper {
|
||||
display: inline-block; /* Gives hasLayout */
|
||||
}
|
||||
|
||||
/* File list in box view */
|
||||
.box-view #file-list tr {
|
||||
display: block;
|
||||
float: left;
|
||||
border: 1px solid #ccf;
|
||||
margin: 10px;
|
||||
}
|
||||
.box-view #file-list td {
|
||||
border: 0;
|
||||
}
|
||||
.box-view #file-list td.name {
|
||||
min-width: 0;
|
||||
padding: 5px;
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.box-view #file-list td.name img {
|
||||
margin: 0;
|
||||
}
|
||||
.box-view #file-list td.name span {
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.box-view #file-list td.size, .box-view #file-list td.date, .box-view #file-list td.width, .box-view #file-list td.height {
|
||||
display: none;
|
||||
}
|
BIN
sites/all/modules/contrib/files/imce/imce/css/leaf.png
Normal file
After Width: | Height: | Size: 100 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/loading.gif
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
sites/all/modules/contrib/files/imce/imce/css/op.png
Normal file
After Width: | Height: | Size: 261 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/ops.png
Normal file
After Width: | Height: | Size: 164 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/resize.png
Normal file
After Width: | Height: | Size: 331 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/sendto.png
Normal file
After Width: | Height: | Size: 488 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/status.png
Normal file
After Width: | Height: | Size: 440 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/submit.png
Normal file
After Width: | Height: | Size: 261 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/thumb.png
Normal file
After Width: | Height: | Size: 1004 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/tree.png
Normal file
After Width: | Height: | Size: 349 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/upload.png
Normal file
After Width: | Height: | Size: 502 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/view-box.png
Normal file
After Width: | Height: | Size: 509 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/view-list.png
Normal file
After Width: | Height: | Size: 493 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/warning.png
Normal file
After Width: | Height: | Size: 444 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/x-resizer.png
Normal file
After Width: | Height: | Size: 102 B |
BIN
sites/all/modules/contrib/files/imce/imce/css/y-resizer.png
Normal file
After Width: | Height: | Size: 107 B |
12
sites/all/modules/contrib/files/imce/imce/imce.info
Normal file
@@ -0,0 +1,12 @@
|
||||
name = "IMCE"
|
||||
description = "An image/file uploader and browser supporting personal directories and user quota."
|
||||
core = "7.x"
|
||||
package = "Media"
|
||||
configure = "admin/config/media/imce"
|
||||
|
||||
; Information added by drupal.org packaging script on 2013-01-29
|
||||
version = "7.x-1.7"
|
||||
core = "7.x"
|
||||
project = "imce"
|
||||
datestamp = "1359476607"
|
||||
|
104
sites/all/modules/contrib/files/imce/imce/imce.install
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Installs, updates, and uninstalls IMCE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_install().
|
||||
*/
|
||||
function imce_install() {
|
||||
module_load_include('inc', 'imce', 'inc/imce.core.profiles');
|
||||
imce_install_profiles();
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_uninstall().
|
||||
*/
|
||||
function imce_uninstall() {
|
||||
db_delete('file_usage')->condition('module', 'imce')->execute();
|
||||
variable_del('imce_profiles');
|
||||
variable_del('imce_roles_profiles');
|
||||
variable_del('imce_settings_textarea');
|
||||
variable_del('imce_settings_absurls');
|
||||
variable_del('imce_settings_replace');
|
||||
variable_del('imce_settings_thumb_method');
|
||||
variable_del('imce_settings_disable_private');
|
||||
variable_del('imce_custom_content');
|
||||
variable_del('imce_custom_process');
|
||||
variable_del('imce_custom_init');
|
||||
variable_del('imce_custom_scan');
|
||||
variable_del('imce_custom_response');
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates from 6.x to 7.x.
|
||||
*/
|
||||
function imce_update_7000() {
|
||||
// Update role-profile assignments
|
||||
$roles_profiles = variable_get('imce_roles_profiles', array());
|
||||
if (!empty($roles_profiles)) {
|
||||
$scheme = variable_get('file_default_scheme', 'public');
|
||||
foreach ($roles_profiles as $rid => &$role) {
|
||||
$role[$scheme . '_pid'] = $role['pid'];
|
||||
unset($role['pid']);
|
||||
}
|
||||
variable_set('imce_roles_profiles', $roles_profiles);
|
||||
}
|
||||
// Update textarea ids
|
||||
$ids = str_replace(' ', '', variable_get('imce_settings_textarea', ''));
|
||||
if ($ids != '') {
|
||||
$ids = explode(',', $ids);
|
||||
foreach ($ids as &$id) {
|
||||
$id .= '*';
|
||||
}
|
||||
variable_set('imce_settings_textarea', implode(', ', $ids));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Migrates imce files from {files} to {file_managed}.
|
||||
* Removes {imce_files} in favor of {file_usage}.
|
||||
*/
|
||||
function imce_update_7001(&$sandbox) {
|
||||
if (!db_table_exists('imce_files') || !db_table_exists('files')) {
|
||||
return;
|
||||
}
|
||||
// Initiate progress
|
||||
if (!isset($sandbox['progress'])) {
|
||||
$sandbox['progress'] = 0;
|
||||
$sandbox['last_fid_processed'] = 0;
|
||||
$sandbox['max'] = db_query("SELECT COUNT(*) FROM {imce_files} i INNER JOIN {files} f ON i.fid = f.fid")->fetchField();
|
||||
}
|
||||
// Prepare variables
|
||||
$limit = 250;
|
||||
$basedir = variable_get('file_directory_path', conf_path() . '/files') . '/';
|
||||
$baselen = strlen($basedir);
|
||||
$scheme = file_default_scheme() . '://';
|
||||
$result = db_query_range('SELECT f.* FROM {imce_files} i INNER JOIN {files} f ON i.fid = f.fid WHERE i.fid > :fid ORDER BY i.fid', 0, $limit, array(':fid' => $sandbox['last_fid_processed']))->fetchAll();
|
||||
// Migrate imce files from {files} to {file_managed}
|
||||
foreach ($result as $file) {
|
||||
$relpath = substr($file->filepath, 0, $baselen) == $basedir ? substr($file->filepath, $baselen) : $file->filepath;
|
||||
$file->uri = file_stream_wrapper_uri_normalize($scheme . $relpath);
|
||||
unset($file->filepath);
|
||||
if (!db_query("SELECT 1 FROM {file_managed} WHERE fid = :fid", array(':fid' => $file->fid))->fetchField()) {
|
||||
// Check duplicate uri
|
||||
if ($fid = db_query("SELECT fid FROM {file_managed} WHERE uri = :uri", array(':uri' => $file->uri))->fetchField()) {
|
||||
$file->fid = $fid;
|
||||
}
|
||||
else {
|
||||
drupal_write_record('file_managed', $file);
|
||||
}
|
||||
}
|
||||
file_usage_add($file, 'imce', 'file', $file->fid);
|
||||
$sandbox['progress']++;
|
||||
$sandbox['last_fid_processed'] = $file->fid;
|
||||
}
|
||||
// Drop {imce_files} if the progress is complete.
|
||||
$sandbox['#finished'] = empty($sandbox['max']) ? 1 : $sandbox['progress'] / $sandbox['max'];
|
||||
if ($sandbox['#finished'] >= 1) {
|
||||
db_drop_table('imce_files');
|
||||
return t('Migrated IMCE files.');
|
||||
}
|
||||
}
|
201
sites/all/modules/contrib/files/imce/imce/imce.module
Normal file
@@ -0,0 +1,201 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Implements the necessary hooks for the file browser to work properly.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_menu().
|
||||
*/
|
||||
function imce_menu() {
|
||||
$items = array();
|
||||
$access = array('administer imce');
|
||||
$items['imce'] = array(
|
||||
'title' => 'File browser',
|
||||
'page callback' => 'imce',
|
||||
'access callback' => 'imce_access',
|
||||
'access arguments' => array(FALSE, 1),
|
||||
'file' => 'inc/imce.page.inc',
|
||||
'type' => MENU_CALLBACK,
|
||||
);
|
||||
$items['user/%user/imce'] = array(
|
||||
'title' => 'File browser',
|
||||
'page callback' => 'imce_user_page',
|
||||
'page arguments' => array(1),
|
||||
'access callback' => 'imce_user_page_access',
|
||||
'access arguments' => array(1),
|
||||
'file' => 'inc/imce.page.inc',
|
||||
'type' => MENU_LOCAL_TASK,
|
||||
'weight' => 10,
|
||||
);
|
||||
$items['admin/config/media/imce'] = array(
|
||||
'title' => 'IMCE',
|
||||
'description' => 'Control how your image/file browser works.',
|
||||
'page callback' => 'imce_admin',
|
||||
'access arguments' => $access,
|
||||
'file' => 'inc/imce.admin.inc',
|
||||
);
|
||||
$items['admin/config/media/imce/profile'] = array(
|
||||
'title' => 'Add new profile',
|
||||
'page callback' => 'imce_profile_operations',
|
||||
'access arguments' => $access,
|
||||
'type' => MENU_VISIBLE_IN_BREADCRUMB,
|
||||
'file' => 'inc/imce.admin.inc',
|
||||
);
|
||||
return $items;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_permission().
|
||||
*/
|
||||
function imce_permission() {
|
||||
return array(
|
||||
'administer imce' => array(
|
||||
'title' => t('Administer IMCE'),
|
||||
'restrict access' => TRUE,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_theme().
|
||||
*/
|
||||
function imce_theme() {
|
||||
$path = drupal_get_path('module', 'imce') . '/tpl';
|
||||
$theme['imce_admin'] = array('function' => 'imce_admin_theme', 'render element' => 'form');
|
||||
$theme['imce_directories'] = array('function' => 'imce_directories_theme', 'render element' => 'form');
|
||||
$theme['imce_thumbnails'] = array('function' => 'imce_thumbnails_theme', 'render element' => 'form');
|
||||
$theme['imce_root_text'] = array(
|
||||
'variables' => array('imce_ref' => NULL),
|
||||
);
|
||||
$theme['imce_user_page'] = array(
|
||||
'variables' => array('account' => NULL),
|
||||
);
|
||||
$theme['imce_file_list'] = array(
|
||||
'template' => 'imce-file-list',
|
||||
'variables' => array('imce_ref' => NULL),
|
||||
'path' => $path,
|
||||
);
|
||||
$theme['imce_content'] = array(
|
||||
'template' => 'imce-content',
|
||||
'variables' => array('tree' => NULL, 'forms' => NULL, 'imce_ref' => NULL),
|
||||
'path' => $path,
|
||||
);
|
||||
$theme['imce_page'] = array(
|
||||
'template' => 'imce-page',
|
||||
'variables' => array('content' => NULL),
|
||||
'path' => $path,
|
||||
);
|
||||
return $theme;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_file_download().
|
||||
* Support private downloads if not disabled.
|
||||
*/
|
||||
function imce_file_download($uri) {
|
||||
$serve = file_uri_scheme($uri) == 'private' && !variable_get('imce_settings_disable_private', 1) && file_exists($uri) && strpos(basename($uri), '.');
|
||||
if ($serve) {
|
||||
return array(
|
||||
'Content-type' => file_get_mimetype($uri),
|
||||
'Content-Length' => filesize($uri),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_element_info().
|
||||
*/
|
||||
function imce_element_info() {
|
||||
return array('textarea' => array('#process' => array('imce_textarea')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Inline image/link insertion to textareas.
|
||||
*/
|
||||
function imce_textarea($element) {
|
||||
static $regexp;
|
||||
if (!isset($regexp)) {
|
||||
$regexp = FALSE;
|
||||
if (imce_access() && $regexp = str_replace(' ', '', variable_get('imce_settings_textarea', ''))) {
|
||||
$regexp = '@^(' . str_replace(',', '|', implode('.*', array_map('preg_quote', explode('*', $regexp)))) . ')$@';
|
||||
}
|
||||
}
|
||||
if ($regexp && preg_match($regexp, $element['#id'])) {
|
||||
drupal_add_js(drupal_get_path('module', 'imce') . '/js/imce_set_inline.js');
|
||||
$element['#description'] = (isset($element['#description']) ? $element['#description'] : '') . '<div class="imce-inline-wrapper" style="display:none">' . t('Insert !image or !link.', array('!image' => l(t('image'), 'imce', array('attributes' => array('name' => $element['#id'] . '-IMCE-image', 'class' => array('imce-inline-image')))), '!link' => l(t('link'), 'imce', array('attributes' => array('name' => $element['#id'] . '-IMCE-link', 'class' => array('imce-inline-link')))))) . '</div>';
|
||||
}
|
||||
return $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the configuration profile assigned to a user for a specific file scheme.
|
||||
*/
|
||||
function imce_user_profile($user, $scheme = NULL) {
|
||||
static $ups = array();
|
||||
|
||||
// Set scheme
|
||||
if (empty($scheme)) {
|
||||
$scheme = variable_get('file_default_scheme', 'public');
|
||||
}
|
||||
|
||||
// Return from cache.
|
||||
if (isset($ups[$scheme][$user->uid])) {
|
||||
return $ups[$scheme][$user->uid];
|
||||
}
|
||||
$ups[$scheme][$user->uid] = FALSE;
|
||||
|
||||
// Check scheme
|
||||
$swrappers = file_get_stream_wrappers();
|
||||
if (!isset($swrappers[$scheme])) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
$scinfo = array('scheme' => $scheme);
|
||||
|
||||
// Handle user#1 separately
|
||||
if ($user->uid == 1) {
|
||||
return $ups[$scheme][$user->uid] = isset($profiles[1]) ? $profiles[1] + $scinfo : FALSE;
|
||||
}
|
||||
|
||||
// Handle regular users.
|
||||
$roles_profiles = variable_get('imce_roles_profiles', array());
|
||||
$sckey = $scheme . '_pid';
|
||||
foreach ($roles_profiles as $rid => $conf) {
|
||||
if (isset($user->roles[$rid]) && isset($conf[$sckey]) && isset($profiles[$conf[$sckey]])) {
|
||||
return $ups[$scheme][$user->uid] = $profiles[$conf[$sckey]] + $scinfo;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the user is assigned an imce profile.
|
||||
* A more detailed assignment check is performed before imce loads.
|
||||
*/
|
||||
function imce_access($user = FALSE, $scheme = NULL) {
|
||||
if ($user === FALSE) {
|
||||
global $user;
|
||||
}
|
||||
return imce_user_profile($user, $scheme) ? TRUE : FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks access to user/{$account->uid}/imce for the $user.
|
||||
*/
|
||||
function imce_user_page_access($account, $user = FALSE) {
|
||||
if ($user === FALSE) {
|
||||
global $user;
|
||||
}
|
||||
return ($user->uid == 1 || $account->uid == $user->uid) && ($profile = imce_user_profile($account)) && $profile['usertab'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the directory name is regular.
|
||||
*/
|
||||
function imce_reg_dir($dirname) {
|
||||
return $dirname == '.' || is_int($dirname) || (is_string($dirname) && $dirname != '' && !preg_match('@(^\s)|(^/)|(^\./)|(\s$)|(/$)|(/\.$)|(\.\.)|(//)|(\\\\)|(/\./)@', $dirname));
|
||||
}
|
691
sites/all/modules/contrib/files/imce/imce/inc/imce.admin.inc
Normal file
@@ -0,0 +1,691 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Serves administration pages of IMCE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Admin main page.
|
||||
*/
|
||||
function imce_admin() {
|
||||
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
|
||||
$header = array(t('Profile name'), array('data' => t('Operations'), 'colspan' => 2));
|
||||
$rows = array();
|
||||
|
||||
foreach ($profiles as $pid => $profile) {
|
||||
$rows[] = array($profile['name'],
|
||||
l(t('Edit'), 'admin/config/media/imce/profile/edit/' . $pid),
|
||||
$pid == 1 ? '' : l(t('Delete'), 'admin/config/media/imce/profile/delete/' . $pid),
|
||||
);
|
||||
}
|
||||
|
||||
$rows[] = array('', array('data' => l(t('Add new profile'), 'admin/config/media/imce/profile'), 'colspan' => 2));
|
||||
|
||||
$output['title'] = array(
|
||||
'#markup' => '<h2 class="title">' . t('Configuration profiles') . '</h2>',
|
||||
);
|
||||
$output['table'] = array(
|
||||
'#theme' => 'table',
|
||||
'#header' => $header,
|
||||
'#rows' => $rows,
|
||||
'#attributes' => array('id' => 'imce-profiles-list'),
|
||||
);
|
||||
$output['form'] = drupal_get_form('imce_admin_form');
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Admin form.
|
||||
*/
|
||||
function imce_admin_form($form, &$form_state) {
|
||||
//roles profiles
|
||||
$form['roles'] = array('#tree' => TRUE);
|
||||
$roles = imce_sorted_roles();
|
||||
$form['#weighted'] = count($roles) > 3;
|
||||
|
||||
foreach ($roles as $rid => $role) {
|
||||
$core = $rid == DRUPAL_ANONYMOUS_RID || $rid == DRUPAL_AUTHENTICATED_RID;
|
||||
$form['roles'][$rid] = imce_role_form($role, $form['#weighted'], $core);
|
||||
}
|
||||
|
||||
//common settings
|
||||
$form['common'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Common settings'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['common']['textarea'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Enable inline image/file insertion into plain textareas'),
|
||||
'#default_value' => variable_get('imce_settings_textarea', ''),
|
||||
'#maxlength' => NULL,
|
||||
'#description' => t('If you don\'t use any WYSIWYG editor, this feature will allow you to add your images or files as <strong>html code into any plain textarea</strong>. Enter <strong>comma separated textarea IDs</strong> under which you want to enable a link to IMCE. The * character is a wildcard. Hint: ID of Body fields in most node types starts with edit-body*.'),
|
||||
);
|
||||
$form['common']['absurls'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Absolute URLs'),
|
||||
'#default_value' => variable_get('imce_settings_absurls', 0),
|
||||
'#description' => t('Check if you want IMCE to return absolute file URLs.'),
|
||||
);
|
||||
$form['common']['replace'] = array(
|
||||
'#type' => 'radios',
|
||||
'#title' => t('Default behaviour for existing files during file uploads'),
|
||||
'#default_value' => variable_get('imce_settings_replace', FILE_EXISTS_RENAME),
|
||||
'#options' => array(
|
||||
FILE_EXISTS_RENAME => t('Keep the existing file renaming the new one'),
|
||||
FILE_EXISTS_ERROR => t('Keep the existing file rejecting the new one'),
|
||||
FILE_EXISTS_REPLACE => t('Replace the existing file with the new one')
|
||||
),
|
||||
);
|
||||
$form['common']['thumb_method'] = array(
|
||||
'#type' => 'radios',
|
||||
'#title' => t('Default method for creating thumbnails'),
|
||||
'#default_value' => variable_get('imce_settings_thumb_method', 'scale_and_crop'),
|
||||
'#options' => array(
|
||||
'scale' => t('Scale the image with respect to the thumbnail dimensions.'),
|
||||
'scale_and_crop' => t('First scale then crop the image to fit the thumbnail dimensions.')
|
||||
),
|
||||
);
|
||||
$form['common']['disable_private'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Disable serving of private files'),
|
||||
'#default_value' => variable_get('imce_settings_disable_private', 1),
|
||||
'#description' => t('IMCE serves all files under private files directory without applying any access restrictions. This allows anonymous access to any file(/system/files/filename) unless there is a module restricting access to the files. Here you can disable this feature.'),
|
||||
);
|
||||
|
||||
$form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
|
||||
$form['#theme'] = 'imce_admin';
|
||||
$form['#submit'][] = 'imce_admin_submit';
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Admin form themed.
|
||||
*/
|
||||
function imce_admin_theme($variables) {
|
||||
$form = $variables['form'];
|
||||
$profile1 = imce_user1_profile();
|
||||
$header = array(t('User role'));
|
||||
$rows = array(array(t('Site maintenance account')));
|
||||
$keys = array('name');
|
||||
//add each stream wrapper as a column
|
||||
$swrappers = file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE);
|
||||
foreach ($swrappers as $scheme => $info) {
|
||||
$header[] = l($info['name'], 'imce/' . $scheme);
|
||||
$rows[0][] = $profile1['name'];
|
||||
$keys[] = $scheme . '_pid';
|
||||
}
|
||||
|
||||
//in case we need profile weights.
|
||||
$weight_info = '';
|
||||
if ($form['#weighted']) {
|
||||
$header[] = t('Weight');
|
||||
$rows[0][] = t('n/a');
|
||||
$keys[] = 'weight';
|
||||
$weight_info = t('For users who have <strong>multiple roles</strong>, the <strong>weight</strong> property will determine the assigned profile. Lighter roles that are placed upper will take the precedence. So, an administrator role should be placed over other roles by having a smaller weight, ie. -10.');
|
||||
}
|
||||
|
||||
foreach (element_children($form['roles']) as $rid) {
|
||||
$cells = array();
|
||||
foreach ($keys as $key) {
|
||||
$cells[] = drupal_render($form['roles'][$rid][$key]);
|
||||
}
|
||||
$rows[] = $cells;
|
||||
}
|
||||
|
||||
$output = '<h2 class="title">' . t('Role-profile assignments') . '</h2>';
|
||||
$output .= theme('table', array('header' => $header, 'rows' => $rows));
|
||||
$output .= '<div class="form-item"><div class="description">' . t('Assign profiles to user roles for available file systems. Your default file system is %name.', array('%name' => $swrappers[variable_get('file_default_scheme', 'public')]['name'])) . ' ' . $weight_info . '</div></div>';
|
||||
$output .= drupal_render($form['common']);
|
||||
$output .= drupal_render_children($form);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit admin form.
|
||||
*/
|
||||
function imce_admin_submit($form, &$form_state) {
|
||||
$roles = $form_state['values']['roles'];
|
||||
if (count($roles) > 3) {
|
||||
uasort($roles, 'imce_rolesort');
|
||||
}
|
||||
variable_set('imce_roles_profiles', $roles);
|
||||
variable_set('imce_settings_textarea', $form_state['values']['textarea']);
|
||||
variable_set('imce_settings_absurls', $form_state['values']['absurls']);
|
||||
variable_set('imce_settings_replace', $form_state['values']['replace']);
|
||||
variable_set('imce_settings_thumb_method', $form_state['values']['thumb_method']);
|
||||
variable_set('imce_settings_disable_private', $form_state['values']['disable_private']);
|
||||
drupal_set_message(t('Changes have been saved.'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add-Edit-Delete profiles.
|
||||
*/
|
||||
function imce_profile_operations($op = 'add', $pid = 0) {
|
||||
//delete
|
||||
if ($op == 'delete') {
|
||||
drupal_set_title(t('Delete configuration profile'));
|
||||
return drupal_get_form('imce_profile_delete_form', $pid);
|
||||
}
|
||||
//add-edit
|
||||
if ($pid != 1 || $GLOBALS['user']->uid == 1) {
|
||||
return drupal_get_form('imce_profile_form', $pid);
|
||||
}
|
||||
drupal_access_denied();
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile form.
|
||||
*/
|
||||
function imce_profile_form($form, &$form_state, $pid = 0) {
|
||||
|
||||
if ($pid && $profile = imce_load_profile($pid)) {
|
||||
drupal_set_title($profile['name']);
|
||||
}
|
||||
else {
|
||||
$pid = 0;
|
||||
$profile = imce_sample_profile();
|
||||
$profile['name'] = '';
|
||||
}
|
||||
|
||||
//import profile
|
||||
if (isset($_GET['import']) && $imported = imce_load_profile($_GET['import'])) {
|
||||
if (empty($form_state['post'])) {
|
||||
drupal_set_message(t('Settings were imported from the profile %name', array('%name' => $imported['name'])));
|
||||
}
|
||||
$imported['name'] = $profile['name']; //preserve the original name.
|
||||
$profile = $imported;
|
||||
}
|
||||
|
||||
$form_state['profile'] = $profile;//store the original profile just in case.
|
||||
|
||||
$form = array('#tree' => TRUE);
|
||||
$form['name'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Profile name'),
|
||||
'#default_value' => $profile['name'],
|
||||
'#description' => t('Give a name to this profile.'),
|
||||
'#required' => TRUE,
|
||||
);
|
||||
$form['import'] = array(
|
||||
'#markup' => imce_profile_import_html($pid),
|
||||
);
|
||||
$form['usertab'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Display file browser tab in user profile pages.'),
|
||||
'#default_value' => $profile['usertab'],
|
||||
);
|
||||
$form['filesize'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Maximum file size per upload'),
|
||||
'#default_value' => $profile['filesize'],
|
||||
'#description' => t('Set to 0 to use the maximum value avaliable.') . ' ' . t('Your PHP settings limit the maximum file size per upload to %size.', array('%size' => format_size(file_upload_max_size()))),
|
||||
'#field_suffix' => t('MB'),
|
||||
);
|
||||
$form['quota'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Directory quota'),
|
||||
'#default_value' => $profile['quota'],
|
||||
'#description' => t('Define the upload quota per directory.') . ' ' . t('Set to 0 to use the maximum value avaliable.'),
|
||||
'#field_suffix' => t('MB'),
|
||||
);
|
||||
$form['tuquota'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Total user quota'),
|
||||
'#default_value' => $profile['tuquota'],
|
||||
'#description' => t('This quota measures the size of all user uploaded files in the database and does not include FTP files. You can either use both quotations together or safely ignore this by setting the value to 0.'),
|
||||
'#field_suffix' => t('MB'),
|
||||
);
|
||||
$form['extensions'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Permitted file extensions'),
|
||||
'#default_value' => $profile['extensions'],
|
||||
'#maxlength' => 255,
|
||||
'#description' => t('Specify the allowed file extensions for uploaded files. Separate extensions with a space and do not include the leading dot.') . ' ' . t('Set to * to remove the restriction.'),
|
||||
);
|
||||
$form['dimensions'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Maximum image dimensions'),
|
||||
'#default_value' => $profile['dimensions'],
|
||||
'#description' => t('The maximum allowed image size (e.g. 640x480). Set to 0 for no restriction. If an <a href="!image-toolkit-link">image toolkit</a> is installed, files exceeding this value will be scaled down to fit.', array('!image-toolkit-link' => url('admin/config/media/image-toolkit'))),
|
||||
'#field_suffix' => '<kbd>' . t('WIDTHxHEIGHT') . '</kbd>',
|
||||
);
|
||||
$form['filenum'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Maximum number of files per operation'),
|
||||
'#default_value' => $profile['filenum'],
|
||||
'#description' => t('You can allow users to select multiple files for operations such as delete, resize, etc. Entire batch file operation is executed in a single drupal load, which may be good. However there will be an increase in script execution time, cpu load and memory consumption possibly exceeding the limits of your server, which is really bad. For unlimited number of file handling, set this to 0.'),
|
||||
);
|
||||
|
||||
//Directories
|
||||
$form['directories']['#theme'] = 'imce_directories';
|
||||
$form['directories']['#weight'] = 1;
|
||||
for ($i = 0; $i < count($profile['directories']); $i++) {
|
||||
$form['directories'][$i] = imce_directory_form($profile['directories'][$i]);
|
||||
}
|
||||
$form['directories'][$i] = imce_directory_form();
|
||||
$form['directories'][$i+1] = imce_directory_form();
|
||||
|
||||
//Thumbnails
|
||||
$form['thumbnails']['#theme'] = 'imce_thumbnails';
|
||||
$form['thumbnails']['#weight'] = 2;
|
||||
for ($i = 0; $i < count($profile['thumbnails']); $i++) {
|
||||
$form['thumbnails'][$i] = imce_thumbnail_form($profile['thumbnails'][$i]);
|
||||
}
|
||||
$form['thumbnails'][$i] = imce_thumbnail_form();
|
||||
$form['thumbnails'][$i+1] = imce_thumbnail_form();
|
||||
|
||||
$form = array('profile' => $form);
|
||||
$form['pid'] = array('#type' => 'hidden', '#value' => $pid);
|
||||
$form['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
|
||||
$form['#validate'][] = 'imce_profile_validate';
|
||||
$form['#submit'][] = 'imce_profile_submit';
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile form validate.
|
||||
*/
|
||||
function imce_profile_validate($form, &$form_state) {
|
||||
$profile = &$form_state['values']['profile'];
|
||||
$dim_re = '/^\d+x\d+$/';
|
||||
$dim_error = t('Dimensions must be specified in <kbd>WIDTHxHEIGHT</kbd> format.');
|
||||
// Check max image dimensions
|
||||
if ($profile['dimensions'] && !preg_match($dim_re, $profile['dimensions'])) {
|
||||
return form_set_error('profile][dimensions', $dim_error);
|
||||
}
|
||||
// Check thumbnails dimensions
|
||||
foreach ($profile['thumbnails'] as $i => $thumb) {
|
||||
if (trim($thumb['name']) != '' && !preg_match($dim_re, $thumb['dimensions'])) {
|
||||
return form_set_error("profile][thumbnails][$i][dimensions", $dim_error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile form submit.
|
||||
*/
|
||||
function imce_profile_submit($form, &$form_state) {
|
||||
$profile = $form_state['values']['profile'];
|
||||
$pid = $form_state['values']['pid'];
|
||||
$message = $pid > 0 ? t('The changes have been saved.') : t('Profile has been added.');
|
||||
|
||||
//unset empty fields of directories and thumbnails.
|
||||
imce_clean_profile_fields($profile);
|
||||
|
||||
//save profile.
|
||||
$pid = imce_update_profiles($pid, $profile);
|
||||
|
||||
drupal_set_message($message);
|
||||
$form_state['redirect'] = 'admin/config/media/imce/profile/edit/' . $pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* directory settings form
|
||||
*/
|
||||
function imce_directory_form($directory = array()) {
|
||||
if (empty($directory)) {
|
||||
$directory = array('name' => '', 'subnav' => 0, 'browse' => 0, 'upload' => 0, 'thumb' => 0, 'delete' => 0, 'resize' => 0);
|
||||
}
|
||||
$form['name'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => $directory['name'],
|
||||
'#size' => 24,
|
||||
'#maxlength' => NULL,
|
||||
);
|
||||
$form['subnav'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Including subdirectories'),
|
||||
'#default_value' => $directory['subnav'],
|
||||
);
|
||||
$form['browse'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Browse'),
|
||||
'#default_value' => $directory['browse'],
|
||||
);
|
||||
$form['upload'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Upload'),
|
||||
'#default_value' => $directory['upload'],
|
||||
);
|
||||
$form['thumb'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Thumbnails'),
|
||||
'#default_value' => $directory['thumb'],
|
||||
);
|
||||
$form['delete'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Delete'),
|
||||
'#default_value' => $directory['delete'],
|
||||
);
|
||||
$form['resize'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Resize'),
|
||||
'#default_value' => $directory['resize'],
|
||||
);
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Directorys form themed.
|
||||
*/
|
||||
function imce_directories_theme($variables) {
|
||||
$form = $variables['form'];
|
||||
$rows = array();
|
||||
$root = t('root');
|
||||
|
||||
foreach (element_children($form) as $key) {
|
||||
//directory path
|
||||
$row = array('<div class="container-inline"><' . $root . '>' . '/' . drupal_render($form[$key]['name']) . '</div>' . drupal_render($form[$key]['subnav']));
|
||||
unset($form[$key]['name'], $form[$key]['subnav']);
|
||||
|
||||
//permissions
|
||||
$header = array();
|
||||
foreach (element_children($form[$key]) as $perm) {
|
||||
$header[] = $form[$key][$perm]['#title'];
|
||||
unset($form[$key][$perm]['#title']);
|
||||
$row[] = drupal_render($form[$key][$perm]);
|
||||
}
|
||||
|
||||
$rows[] = $row;
|
||||
}
|
||||
|
||||
array_unshift($header, t('Directory path'));
|
||||
|
||||
$output = '<h3 class="title">' . t('Directories') . '</h3>';
|
||||
$output .= theme('table', array('header' => $header, 'rows' => $rows));
|
||||
$output .= '<div class="form-item"><div class="description">' . t('Define directories that users of this profile can access.
|
||||
<ul>
|
||||
<li>Use alphanumeric characters as directory paths.</li>
|
||||
<li>To specify file system root, just enter <strong>.</strong>(dot) character.</li>
|
||||
<li>Use <strong>%uid</strong> as a placeholder for user ID. Ex: <em>users/user%uid</em> creates directories such as <em>users/user1</em>, <em>users/user42</em>, etc.</li>
|
||||
<li>To remove a directory from the list, leave the directory path blank.</li>
|
||||
<li>If you want more flexibility in directory paths you can execute php to return a directory path.<br />
|
||||
For php execution your directory path must start with <strong>php:</strong> and the rest must be a valid php code that is expected to return the actual directory path. <br />Ex: <strong>php: return \'users/\'.$user->name;</strong> defines <strong>users/USER-NAME</strong> as the directory path.<br />
|
||||
A multi-level directory example <strong>php: return date(\'Y\', $user->created).\'/\'.date(\'m\', $user->created).\'/\'.$user->uid;</strong> defines <strong>MEMBERSHIP-YEAR/MONTH/USER-ID</strong> as the directory path, resulting in self-categorized user directories based on membership date.<br />
|
||||
Note that you should use the $user variable instead of $GLOBALS[\'user\'] since they are not always the same object.</li>
|
||||
</ul>
|
||||
<p>Note that thumbnails permission does not affect thumbnail creation on upload. See thumbnails decription below.</p>
|
||||
<p>If you need more fields, just fill all and save, and you will get two more on the next page.</p>') . '</div></div>';
|
||||
$output .= drupal_render_children($form);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* thumbnail settings form
|
||||
*/
|
||||
function imce_thumbnail_form($thumb = array()) {
|
||||
if (empty($thumb)) {
|
||||
$thumb = array('name' => '', 'dimensions' => '', 'prefix' => '', 'suffix' => '');
|
||||
}
|
||||
$form['name'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => $thumb['name'],
|
||||
'#size' => 20,
|
||||
);
|
||||
$form['dimensions'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => $thumb['dimensions'],
|
||||
'#size' => 20,
|
||||
);
|
||||
$form['prefix'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => $thumb['prefix'],
|
||||
'#size' => 20,
|
||||
);
|
||||
$form['suffix'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#default_value' => $thumb['suffix'],
|
||||
'#size' => 20,
|
||||
);
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Thumbnails form themed.
|
||||
*/
|
||||
function imce_thumbnails_theme($variables) {
|
||||
$form = $variables['form'];
|
||||
$header = array(t('Name'), t('Dimensions'), t('Prefix'), t('Suffix'));
|
||||
$rows = array();
|
||||
|
||||
foreach (element_children($form) as $key) {
|
||||
$rows[] = array(
|
||||
drupal_render($form[$key]['name']),
|
||||
drupal_render($form[$key]['dimensions']),
|
||||
drupal_render($form[$key]['prefix']),
|
||||
drupal_render($form[$key]['suffix']),
|
||||
);
|
||||
}
|
||||
|
||||
$output = '<h3 class="title">' . t('Thumbnails') . '</h3>';
|
||||
$output .= theme('table', array('header' => $header, 'rows' => $rows));
|
||||
$output .= '<div class="form-item"><div class="description">' . t('You may create a list of thumbnail options that users can choose from.
|
||||
<ul>
|
||||
<li>Use alphanumeric characters as thumbnail names.</li>
|
||||
<li>Specify dimensions as <strong>WidthxHeight</strong>.</li>
|
||||
<li>Prefix and suffix are strings that are added to original file name to create the thumbnail name.</li>
|
||||
<li>An example thumbnail: Name = <strong>Small</strong>, Dimensions = <strong>80x80</strong>, Prefix = <strong>small_</strong></li>
|
||||
</ul>
|
||||
<p>Note that users will always be able to create these thumbnails on file upload no matter what the thumbnail permission is.</p>
|
||||
<p>If you need more fields, just fill all and save, and you will get two more on the next page.</p>') . '</div></div>';
|
||||
$output .= drupal_render_children($form);
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Role-profile form
|
||||
*/
|
||||
function imce_role_form($role, $weight = TRUE, $core = TRUE) {
|
||||
$form['name'] = array(
|
||||
'#markup' => $role['name'],
|
||||
);
|
||||
if ($weight) {
|
||||
$form['weight'] = $core ? array(
|
||||
'#type' => 'textfield',
|
||||
'#value' => $role['weight'],
|
||||
'#attributes' => array('readonly' => 'readonly', 'style' => 'border: none; width: 2em; background-color: transparent;'),
|
||||
) : array(
|
||||
'#type' => 'weight',
|
||||
'#default_value' => $role['weight'],
|
||||
);
|
||||
}
|
||||
foreach (array_keys(file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE)) as $scheme) {
|
||||
$form[$scheme . '_pid'] = array(
|
||||
'#type' => 'select',
|
||||
'#options' => imce_profile_options(),
|
||||
'#default_value' => $role[$scheme . '_pid'],
|
||||
'#empty_value' => 0,
|
||||
);
|
||||
}
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile delete form
|
||||
*/
|
||||
function imce_profile_delete_form($form, &$form_state, $pid) {
|
||||
if ($pid > 1 && $profile = imce_load_profile($pid)) {
|
||||
$form['#submit'][] = 'imce_profile_delete_submit';
|
||||
$form['pid'] = array('#type' => 'hidden', '#value' => $pid);
|
||||
return confirm_form($form,
|
||||
t('Are you sure you want to delete the profile %name?',
|
||||
array('%name' => $profile['name'])),
|
||||
'admin/config/media/imce',
|
||||
'',
|
||||
t('Delete'),
|
||||
t('Cancel')
|
||||
);
|
||||
}
|
||||
drupal_goto('admin/config/media/imce');
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile delete form submit
|
||||
*/
|
||||
function imce_profile_delete_submit($form, &$form_state) {
|
||||
imce_update_profiles($form_state['values']['pid'], NULL);
|
||||
drupal_set_message(t('Profile has been deleted.'));
|
||||
$form_state['redirect'] = 'admin/config/media/imce';
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile options.
|
||||
*/
|
||||
function imce_profile_options() {
|
||||
$options = array();
|
||||
foreach (variable_get('imce_profiles', array()) as $pid => $profile) {
|
||||
$options[$pid] = $profile['name'];
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile import links.
|
||||
*/
|
||||
function imce_profile_import_html($pid = 0) {
|
||||
$output = '';
|
||||
$links = array();
|
||||
|
||||
foreach (variable_get('imce_profiles', array()) as $id => $profile) {
|
||||
if ($pid != $id) {
|
||||
$links[] = l($profile['name'], $_GET['q'], array('query' => array('import' => $id)));
|
||||
}
|
||||
}
|
||||
|
||||
if (!empty($links)) {
|
||||
$output = '<p><strong>' . t('Import settings from other profiles') . '</strong>: ';
|
||||
$output .= implode(', ', $links) . '</p>';
|
||||
}
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update role-profile assignments.
|
||||
*/
|
||||
function imce_update_roles($pid) {
|
||||
$roles = variable_get('imce_roles_profiles', array());
|
||||
foreach ($roles as $rid => $role) {
|
||||
foreach ($role as $key => $value) {
|
||||
if (substr($key, -4) == '_pid') {
|
||||
if ($value == $pid) {
|
||||
$roles[$rid][$key] = 0;
|
||||
}
|
||||
elseif ($value > $pid) {
|
||||
$roles[$rid][$key]--;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
variable_set('imce_roles_profiles', $roles);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add, update or delete a profile.
|
||||
*/
|
||||
function imce_update_profiles($pid, $profile = NULL) {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
|
||||
//add or update
|
||||
if (isset($profile)) {
|
||||
$pid = isset($profiles[$pid]) ? $pid : count($profiles)+1;
|
||||
$profiles[$pid] = $profile;
|
||||
}
|
||||
|
||||
//delete
|
||||
elseif (isset($profiles[$pid]) && $pid > 1) {
|
||||
unset($profiles[$pid]);
|
||||
for ($i = $pid+1; isset($profiles[$i]); $i++) {
|
||||
$profiles[$i-1] = $profiles[$i];
|
||||
unset($profiles[$i]);
|
||||
}
|
||||
imce_update_roles($pid);
|
||||
}
|
||||
|
||||
variable_set('imce_profiles', $profiles);
|
||||
return $pid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset empty fields in thumbnails and directory paths.
|
||||
*/
|
||||
function imce_clean_profile_fields(&$profile) {
|
||||
$clean = array();
|
||||
foreach ($profile['thumbnails'] as $thumb) {
|
||||
if (trim($thumb['name']) != '') {
|
||||
$clean[] = $thumb;
|
||||
}
|
||||
}
|
||||
$profile['thumbnails'] = $clean;
|
||||
|
||||
$clean = array();
|
||||
$names = array();
|
||||
foreach ($profile['directories'] as $dir) {
|
||||
$dir['name'] = trim($dir['name'], '/ ');
|
||||
if ($dir['name'] == '') {
|
||||
continue;
|
||||
}
|
||||
if (isset($names[$dir['name']])) {
|
||||
drupal_set_message(t('Duplicate directory paths are not allowed.'), 'error');
|
||||
continue;
|
||||
}
|
||||
if (!imce_reg_dir($dir['name'])) {
|
||||
drupal_set_message(t('%dirname is not accepted as a proper directory name.', array('%dirname' => $dir['name'])), 'error');
|
||||
continue;
|
||||
}
|
||||
$clean[] = $dir;
|
||||
$names[$dir['name']] = 1;
|
||||
}
|
||||
$profile['directories'] = $clean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Profile load.
|
||||
*/
|
||||
function imce_load_profile($pid) {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
return isset($profiles[$pid]) ? $profiles[$pid] : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sort roles according to their weights.
|
||||
*/
|
||||
function imce_sorted_roles() {
|
||||
static $sorted;
|
||||
if (!isset($sorted)) {
|
||||
$sorted = array();
|
||||
$roles = user_roles();
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
$roles_profiles = variable_get('imce_roles_profiles', array());
|
||||
$roles_profiles[DRUPAL_ANONYMOUS_RID]['weight'] = 12;
|
||||
$roles_profiles[DRUPAL_AUTHENTICATED_RID]['weight'] = 11;
|
||||
$schemes = array_keys(file_get_stream_wrappers(STREAM_WRAPPERS_VISIBLE));
|
||||
foreach ($roles as $rid => $name) {
|
||||
$sorted[$rid] = array(
|
||||
'name' => $name,
|
||||
'weight' => isset($roles_profiles[$rid]['weight']) ? $roles_profiles[$rid]['weight'] : 0
|
||||
);
|
||||
foreach ($schemes as $scheme) {
|
||||
$key = $scheme . '_pid';
|
||||
$sorted[$rid][$key] = isset($roles_profiles[$rid][$key]) && isset($profiles[$roles_profiles[$rid][$key]]) ? $roles_profiles[$rid][$key] : 0;
|
||||
}
|
||||
}
|
||||
uasort($sorted, 'imce_rolesort');
|
||||
}
|
||||
return $sorted;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sorting function for roles.
|
||||
*/
|
||||
function imce_rolesort($r1, $r2) {
|
||||
return $r1['weight']-$r2['weight'];
|
||||
}
|
||||
|
||||
//Include core profile functions.
|
||||
include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce') . '/inc/imce.core.profiles.inc';
|
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Creates the default configuration profiles.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Create core profiles.
|
||||
*/
|
||||
function imce_install_profiles() {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
|
||||
//already installed
|
||||
if (isset($profiles[1]) && !empty($profiles[1])) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
$profiles[1] = imce_user1_profile();
|
||||
$profiles[2] = imce_sample_profile();
|
||||
variable_set('imce_profiles', $profiles);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a profile based on arguments.
|
||||
*/
|
||||
function imce_construct_profile($n, $u, $f, $q, $tq, $e, $d, $fn, $ds, $ts) {
|
||||
$profile = array('name' => $n, 'usertab' => $u, 'filesize' => $f, 'quota' => $q, 'tuquota' => $tq, 'extensions' => $e, 'dimensions' => $d, 'filenum' => $fn, 'directories' => array(), 'thumbnails' => array());
|
||||
foreach ($ds as $d) {
|
||||
$profile['directories'][] = array('name' => $d[0], 'subnav' => $d[1], 'browse' => $d[2], 'upload' => $d[3], 'thumb' => $d[4], 'delete' => $d[5], 'resize' => $d[6]);
|
||||
}
|
||||
foreach ($ts as $t) {
|
||||
$profile['thumbnails'][] = array('name' => $t[0], 'dimensions' => $t[1], 'prefix' => $t[2], 'suffix' => $t[3]);
|
||||
}
|
||||
return $profile;
|
||||
}
|
||||
|
||||
/**
|
||||
* User1's profile.
|
||||
*/
|
||||
function imce_user1_profile() {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
if (isset($profiles[1])) {
|
||||
return $profiles[1];
|
||||
}
|
||||
return imce_construct_profile('User-1', 1, 0, 0, 0, '*', '1200x1200', 0, array(array('.', 1, 1, 1, 1, 1, 1)), array(array('Small', '90x90', 'small_', ''), array('Medium', '120x120', 'medium_', ''), array('Large', '180x180', 'large_', '')));
|
||||
}
|
||||
|
||||
/**
|
||||
* Default profile.
|
||||
*/
|
||||
function imce_sample_profile() {
|
||||
return imce_construct_profile('Sample profile', 1, 1, 2, 0, 'gif png jpg jpeg', '800x600', 1, array(array('u%uid', 0, 1, 1, 1, 0, 0)), array(array('Thumb', '90x90', 'thumb_', '')));
|
||||
}
|
67
sites/all/modules/contrib/files/imce/imce/inc/imce.js.inc
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Handles ajax file operations.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Ajax operation: navigate
|
||||
*/
|
||||
function imce_js_navigate(&$imce) {
|
||||
return array(
|
||||
'files' => theme('imce_file_list', array('imce_ref' => array('imce' => &$imce))),
|
||||
'dirsize' => format_size($imce['dirsize']),
|
||||
'subdirectories' => array_map('rawurlencode', $imce['subdirectories']),
|
||||
'perm' => $imce['perm']
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: upload
|
||||
*/
|
||||
function imce_js_upload(&$imce) {
|
||||
if ($imce['perm']['upload']) {
|
||||
$_POST['op'] = t('Upload');
|
||||
drupal_get_form('imce_upload_form', array('imce' => &$imce));
|
||||
return array('added' => isset($imce['added']) ? $imce['added'] : NULL, 'dirsize' => format_size($imce['dirsize']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: thumbnails
|
||||
*/
|
||||
function imce_js_thumb(&$imce) {
|
||||
if ($imce['perm']['thumb']) {
|
||||
$_POST['op'] = t('Create thumbnails');
|
||||
return imce_process_fileop($imce);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: delete
|
||||
*/
|
||||
function imce_js_delete(&$imce) {
|
||||
if ($imce['perm']['delete']) {
|
||||
$_POST['op'] = t('Delete');
|
||||
return imce_process_fileop($imce);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: resize
|
||||
*/
|
||||
function imce_js_resize(&$imce) {
|
||||
if ($imce['perm']['resize']) {
|
||||
$_POST['op'] = t('Resize');
|
||||
return imce_process_fileop($imce);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Process file operations form
|
||||
*/
|
||||
function imce_process_fileop(&$imce) {
|
||||
drupal_get_form('imce_fileop_form', array('imce' => &$imce));
|
||||
return array('added' => isset($imce['added']) ? $imce['added'] : NULL, 'removed' => isset($imce['removed']) ? $imce['removed'] : NULL, 'dirsize' => format_size($imce['dirsize']));
|
||||
}
|
1117
sites/all/modules/contrib/files/imce/imce/inc/imce.page.inc
Normal file
807
sites/all/modules/contrib/files/imce/imce/js/imce.js
Normal file
@@ -0,0 +1,807 @@
|
||||
|
||||
(function($) {
|
||||
//Global container.
|
||||
window.imce = {tree: {}, findex: [], fids: {}, selected: {}, selcount: 0, ops: {}, cache: {}, urlId: {},
|
||||
vars: {previewImages: 1, cache: 1},
|
||||
hooks: {load: [], list: [], navigate: [], cache: []},
|
||||
|
||||
//initiate imce.
|
||||
initiate: function() {
|
||||
imce.conf = Drupal.settings.imce || {};
|
||||
if (imce.conf.error != false) return;
|
||||
imce.FLW = imce.el('file-list-wrapper'), imce.SBW = imce.el('sub-browse-wrapper');
|
||||
imce.NW = imce.el('navigation-wrapper'), imce.BW = imce.el('browse-wrapper');
|
||||
imce.PW = imce.el('preview-wrapper'), imce.FW = imce.el('forms-wrapper');
|
||||
imce.updateUI();
|
||||
imce.prepareMsgs();//process initial status messages
|
||||
imce.initiateTree();//build directory tree
|
||||
imce.hooks.list.unshift(imce.processRow);//set the default list-hook.
|
||||
imce.initiateList();//process file list
|
||||
imce.initiateOps();//prepare operation tabs
|
||||
imce.refreshOps();
|
||||
imce.invoke('load', window);//run functions set by external applications.
|
||||
},
|
||||
|
||||
//process navigation tree
|
||||
initiateTree: function() {
|
||||
$('#navigation-tree li').each(function(i) {
|
||||
var a = this.firstChild, txt = a.firstChild;
|
||||
txt && (txt.data = imce.decode(txt.data));
|
||||
var branch = imce.tree[a.title] = {'a': a, li: this, ul: this.lastChild.tagName == 'UL' ? this.lastChild : null};
|
||||
if (a.href) imce.dirClickable(branch);
|
||||
imce.dirCollapsible(branch);
|
||||
});
|
||||
},
|
||||
|
||||
//Add a dir to the tree under parent
|
||||
dirAdd: function(dir, parent, clickable) {
|
||||
if (imce.tree[dir]) return clickable ? imce.dirClickable(imce.tree[dir]) : imce.tree[dir];
|
||||
var parent = parent || imce.tree['.'];
|
||||
parent.ul = parent.ul ? parent.ul : parent.li.appendChild(imce.newEl('ul'));
|
||||
var branch = imce.dirCreate(dir, imce.decode(dir.substr(dir.lastIndexOf('/')+1)), clickable);
|
||||
parent.ul.appendChild(branch.li);
|
||||
return branch;
|
||||
},
|
||||
|
||||
//create list item for navigation tree
|
||||
dirCreate: function(dir, text, clickable) {
|
||||
if (imce.tree[dir]) return imce.tree[dir];
|
||||
var branch = imce.tree[dir] = {li: imce.newEl('li'), a: imce.newEl('a')};
|
||||
$(branch.a).addClass('folder').text(text).attr('title', dir).appendTo(branch.li);
|
||||
imce.dirCollapsible(branch);
|
||||
return clickable ? imce.dirClickable(branch) : branch;
|
||||
},
|
||||
|
||||
//change currently active directory
|
||||
dirActivate: function(dir) {
|
||||
if (dir != imce.conf.dir) {
|
||||
if (imce.tree[imce.conf.dir]){
|
||||
$(imce.tree[imce.conf.dir].a).removeClass('active');
|
||||
}
|
||||
$(imce.tree[dir].a).addClass('active');
|
||||
imce.conf.dir = dir;
|
||||
}
|
||||
return imce.tree[imce.conf.dir];
|
||||
},
|
||||
|
||||
//make a dir accessible
|
||||
dirClickable: function(branch) {
|
||||
if (branch.clkbl) return branch;
|
||||
$(branch.a).attr('href', '#').removeClass('disabled').click(function() {imce.navigate(this.title); return false;});
|
||||
branch.clkbl = true;
|
||||
return branch;
|
||||
},
|
||||
|
||||
//sub-directories expand-collapse ability
|
||||
dirCollapsible: function (branch) {
|
||||
if (branch.clpsbl) return branch;
|
||||
$(imce.newEl('span')).addClass('expander').html(' ').click(function() {
|
||||
if (branch.ul) {
|
||||
$(branch.ul).toggle();
|
||||
$(branch.li).toggleClass('expanded');
|
||||
$.browser.msie && $('#navigation-header').css('top', imce.NW.scrollTop);
|
||||
}
|
||||
else if (branch.clkbl){
|
||||
$(branch.a).click();
|
||||
}
|
||||
}).prependTo(branch.li);
|
||||
branch.clpsbl = true;
|
||||
return branch;
|
||||
},
|
||||
|
||||
//update navigation tree after getting subdirectories.
|
||||
dirSubdirs: function(dir, subdirs) {
|
||||
var branch = imce.tree[dir];
|
||||
if (subdirs && subdirs.length) {
|
||||
var prefix = dir == '.' ? '' : dir +'/';
|
||||
for (var i in subdirs) {//add subdirectories
|
||||
imce.dirAdd(prefix + subdirs[i], branch, true);
|
||||
}
|
||||
$(branch.li).removeClass('leaf').addClass('expanded');
|
||||
$(branch.ul).show();
|
||||
}
|
||||
else if (!branch.ul){//no subdirs->leaf
|
||||
$(branch.li).removeClass('expanded').addClass('leaf');
|
||||
}
|
||||
},
|
||||
|
||||
//process file list
|
||||
initiateList: function(cached) {
|
||||
var L = imce.hooks.list, dir = imce.conf.dir, token = {'%dir': dir == '.' ? $(imce.tree['.'].a).text() : imce.decode(dir)}
|
||||
imce.findex = [], imce.fids = {}, imce.selected = {}, imce.selcount = 0, imce.vars.lastfid = null;
|
||||
imce.tbody = imce.el('file-list').tBodies[0];
|
||||
if (imce.tbody.rows.length) {
|
||||
for (var row, i = 0; row = imce.tbody.rows[i]; i++) {
|
||||
var fid = row.id;
|
||||
imce.findex[i] = imce.fids[fid] = row;
|
||||
if (cached) {
|
||||
if (imce.hasC(row, 'selected')) {
|
||||
imce.selected[imce.vars.lastfid = fid] = row;
|
||||
imce.selcount++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var func, j = 0; func = L[j]; j++) func(row);//invoke list-hook
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!imce.conf.perm.browse) {
|
||||
imce.setMessage(Drupal.t('File browsing is disabled in directory %dir.', token), 'error');
|
||||
}
|
||||
},
|
||||
|
||||
//add a file to the list. (having properties name,size,formatted size,width,height,date,formatted date)
|
||||
fileAdd: function(file) {
|
||||
var row, fid = file.name, i = imce.findex.length, attr = ['name', 'size', 'width', 'height', 'date'];
|
||||
if (!(row = imce.fids[fid])) {
|
||||
row = imce.findex[i] = imce.fids[fid] = imce.tbody.insertRow(i);
|
||||
for (var i in attr) row.insertCell(i).className = attr[i];
|
||||
}
|
||||
row.cells[0].innerHTML = row.id = fid;
|
||||
row.cells[1].innerHTML = file.fsize; row.cells[1].id = file.size;
|
||||
row.cells[2].innerHTML = file.width;
|
||||
row.cells[3].innerHTML = file.height;
|
||||
row.cells[4].innerHTML = file.fdate; row.cells[4].id = file.date;
|
||||
imce.invoke('list', row);
|
||||
if (imce.vars.prvfid == fid) imce.setPreview(fid);
|
||||
if (file.id) imce.urlId[imce.getURL(fid)] = file.id;
|
||||
},
|
||||
|
||||
//remove a file from the list
|
||||
fileRemove: function(fid) {
|
||||
if (!(row = imce.fids[fid])) return;
|
||||
imce.fileDeSelect(fid);
|
||||
imce.findex.splice(row.rowIndex, 1);
|
||||
$(row).remove();
|
||||
delete imce.fids[fid];
|
||||
if (imce.vars.prvfid == fid) imce.setPreview();
|
||||
},
|
||||
|
||||
//return a file object containing all properties.
|
||||
fileGet: function (fid) {
|
||||
var row = imce.fids[fid];
|
||||
var url = imce.getURL(fid);
|
||||
return row ? {
|
||||
name: imce.decode(fid),
|
||||
url: url,
|
||||
size: row.cells[1].innerHTML,
|
||||
bytes: row.cells[1].id * 1,
|
||||
width: row.cells[2].innerHTML * 1,
|
||||
height: row.cells[3].innerHTML * 1,
|
||||
date: row.cells[4].innerHTML,
|
||||
time: row.cells[4].id * 1,
|
||||
id: imce.urlId[url] || 0, //file id for newly uploaded files
|
||||
relpath: (imce.conf.dir == '.' ? '' : imce.conf.dir +'/') + fid //rawurlencoded path relative to file directory path.
|
||||
} : null;
|
||||
},
|
||||
|
||||
//simulate row click. selection-highlighting
|
||||
fileClick: function(row, ctrl, shft) {
|
||||
if (!row) return;
|
||||
var fid = typeof(row) == 'string' ? row : row.id;
|
||||
if (ctrl || fid == imce.vars.prvfid) {
|
||||
imce.fileToggleSelect(fid);
|
||||
}
|
||||
else if (shft) {
|
||||
var last = imce.lastFid();
|
||||
var start = last ? imce.fids[last].rowIndex : -1;
|
||||
var end = imce.fids[fid].rowIndex;
|
||||
var step = start > end ? -1 : 1;
|
||||
while (start != end) {
|
||||
start += step;
|
||||
imce.fileSelect(imce.findex[start].id);
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (var fname in imce.selected) {
|
||||
imce.fileDeSelect(fname);
|
||||
}
|
||||
imce.fileSelect(fid);
|
||||
}
|
||||
//set preview
|
||||
imce.setPreview(imce.selcount == 1 ? imce.lastFid() : null);
|
||||
},
|
||||
|
||||
//file select/deselect functions
|
||||
fileSelect: function (fid) {
|
||||
if (imce.selected[fid] || !imce.fids[fid]) return;
|
||||
imce.selected[fid] = imce.fids[imce.vars.lastfid=fid];
|
||||
$(imce.selected[fid]).addClass('selected');
|
||||
imce.selcount++;
|
||||
},
|
||||
fileDeSelect: function (fid) {
|
||||
if (!imce.selected[fid] || !imce.fids[fid]) return;
|
||||
if (imce.vars.lastfid == fid) imce.vars.lastfid = null;
|
||||
$(imce.selected[fid]).removeClass('selected');
|
||||
delete imce.selected[fid];
|
||||
imce.selcount--;
|
||||
},
|
||||
fileToggleSelect: function (fid) {
|
||||
imce['file'+ (imce.selected[fid] ? 'De' : '') +'Select'](fid);
|
||||
},
|
||||
|
||||
//process file operation form and create operation tabs.
|
||||
initiateOps: function() {
|
||||
imce.setHtmlOps();
|
||||
imce.setUploadOp();//upload
|
||||
imce.setFileOps();//thumb, delete, resize
|
||||
},
|
||||
|
||||
//process existing html ops.
|
||||
setHtmlOps: function () {
|
||||
$(imce.el('ops-list')).children('li').each(function() {
|
||||
if (!this.firstChild) return $(this).remove();
|
||||
var name = this.id.substr(8);
|
||||
var Op = imce.ops[name] = {div: imce.el('op-content-'+ name), li: imce.el('op-item-'+ name)};
|
||||
Op.a = Op.li.firstChild;
|
||||
Op.title = Op.a.innerHTML;
|
||||
$(Op.a).click(function() {imce.opClick(name); return false;});
|
||||
});
|
||||
},
|
||||
|
||||
//convert upload form to an op.
|
||||
setUploadOp: function () {
|
||||
var form = imce.el('imce-upload-form');
|
||||
if (!form) return;
|
||||
$(form).ajaxForm(imce.uploadSettings()).find('fieldset').each(function() {//clean up fieldsets
|
||||
this.removeChild(this.firstChild);
|
||||
$(this).after(this.childNodes);
|
||||
}).remove();
|
||||
imce.opAdd({name: 'upload', title: Drupal.t('Upload'), content: form});//add op
|
||||
},
|
||||
|
||||
//convert fileop form submit buttons to ops.
|
||||
setFileOps: function () {
|
||||
var form = imce.el('imce-fileop-form');
|
||||
if (!form) return;
|
||||
$(form.elements.filenames).parent().remove();
|
||||
$(form).find('fieldset').each(function() {//remove fieldsets
|
||||
var $sbmt = $('input:submit', this);
|
||||
if (!$sbmt.size()) return;
|
||||
var Op = {name: $sbmt.attr('id').substr(5)};
|
||||
var func = function() {imce.fopSubmit(Op.name); return false;};
|
||||
$sbmt.click(func);
|
||||
Op.title = $(this).children('legend').remove().text() || $sbmt.val();
|
||||
Op.name == 'delete' ? (Op.func = func) : (Op.content = this.childNodes);
|
||||
imce.opAdd(Op);
|
||||
}).remove();
|
||||
imce.vars.opform = $(form).serialize();//serialize remaining parts.
|
||||
},
|
||||
|
||||
//refresh ops states. enable/disable
|
||||
refreshOps: function() {
|
||||
for (var p in imce.conf.perm) {
|
||||
if (imce.conf.perm[p]) imce.opEnable(p);
|
||||
else imce.opDisable(p);
|
||||
}
|
||||
},
|
||||
|
||||
//add a new file operation
|
||||
opAdd: function (op) {
|
||||
var oplist = imce.el('ops-list'), opcons = imce.el('op-contents');
|
||||
var name = op.name || ('op-'+ $(oplist).children('li').size());
|
||||
var title = op.title || 'Untitled';
|
||||
var Op = imce.ops[name] = {title: title};
|
||||
if (op.content) {
|
||||
Op.div = imce.newEl('div');
|
||||
$(Op.div).attr({id: 'op-content-'+ name, 'class': 'op-content'}).appendTo(opcons).append(op.content);
|
||||
}
|
||||
Op.a = imce.newEl('a');
|
||||
Op.li = imce.newEl('li');
|
||||
$(Op.a).attr({href: '#', name: name, title: title}).html('<span>' + title +'</span>').click(imce.opClickEvent);
|
||||
$(Op.li).attr('id', 'op-item-'+ name).append(Op.a).appendTo(oplist);
|
||||
Op.func = op.func || imce.opVoid;
|
||||
return Op;
|
||||
},
|
||||
|
||||
//click event for file operations
|
||||
opClickEvent: function(e) {
|
||||
imce.opClick(this.name);
|
||||
return false;
|
||||
},
|
||||
|
||||
//void operation function
|
||||
opVoid: function() {},
|
||||
|
||||
//perform op click
|
||||
opClick: function(name) {
|
||||
var Op = imce.ops[name], oldop = imce.vars.op;
|
||||
if (!Op || Op.disabled) {
|
||||
return imce.setMessage(Drupal.t('You can not perform this operation.'), 'error');
|
||||
}
|
||||
if (Op.div) {
|
||||
if (oldop) {
|
||||
var toggle = oldop == name;
|
||||
imce.opShrink(oldop, toggle ? 'fadeOut' : 'hide');
|
||||
if (toggle) return false;
|
||||
}
|
||||
var left = Op.li.offsetLeft;
|
||||
var $opcon = $('#op-contents').css({left: 0});
|
||||
$(Op.div).fadeIn('normal', function() {
|
||||
setTimeout(function() {
|
||||
if (imce.vars.op) {
|
||||
var $inputs = $('input', imce.ops[imce.vars.op].div);
|
||||
$inputs.eq(0).focus();
|
||||
//form inputs become invisible in IE. Solution is as stupid as the behavior.
|
||||
$('html').is('.ie') && $inputs.addClass('dummyie').removeClass('dummyie');
|
||||
}
|
||||
});
|
||||
});
|
||||
var diff = left + $opcon.width() - $('#imce-content').width();
|
||||
$opcon.css({left: diff > 0 ? left - diff - 1 : left});
|
||||
$(Op.li).addClass('active');
|
||||
$(imce.opCloseLink).fadeIn(300);
|
||||
imce.vars.op = name;
|
||||
}
|
||||
Op.func(true);
|
||||
return true;
|
||||
},
|
||||
|
||||
//enable a file operation
|
||||
opEnable: function(name) {
|
||||
var Op = imce.ops[name];
|
||||
if (Op && Op.disabled) {
|
||||
Op.disabled = false;
|
||||
$(Op.li).show();
|
||||
}
|
||||
},
|
||||
|
||||
//disable a file operation
|
||||
opDisable: function(name) {
|
||||
var Op = imce.ops[name];
|
||||
if (Op && !Op.disabled) {
|
||||
Op.div && imce.opShrink(name);
|
||||
$(Op.li).hide();
|
||||
Op.disabled = true;
|
||||
}
|
||||
},
|
||||
|
||||
//hide contents of a file operation
|
||||
opShrink: function(name, effect) {
|
||||
if (imce.vars.op != name) return;
|
||||
var Op = imce.ops[name];
|
||||
$(Op.div).stop(true, true)[effect || 'hide']();
|
||||
$(Op.li).removeClass('active');
|
||||
$(imce.opCloseLink).hide();
|
||||
Op.func(false);
|
||||
imce.vars.op = null;
|
||||
},
|
||||
|
||||
//navigate to dir
|
||||
navigate: function(dir) {
|
||||
if (imce.vars.navbusy || (dir == imce.conf.dir && !confirm(Drupal.t('Do you want to refresh the current directory?')))) return;
|
||||
var cache = imce.vars.cache && dir != imce.conf.dir;
|
||||
var set = imce.navSet(dir, cache);
|
||||
if (cache && imce.cache[dir]) {//load from the cache
|
||||
set.success({data: imce.cache[dir]});
|
||||
set.complete();
|
||||
}
|
||||
else $.ajax(set);//live load
|
||||
},
|
||||
//ajax navigation settings
|
||||
navSet: function (dir, cache) {
|
||||
$(imce.tree[dir].li).addClass('loading');
|
||||
imce.vars.navbusy = dir;
|
||||
return {url: imce.ajaxURL('navigate', dir),
|
||||
type: 'GET',
|
||||
dataType: 'json',
|
||||
success: function(response) {
|
||||
if (response.data && !response.data.error) {
|
||||
if (cache) imce.navCache(imce.conf.dir, dir);//cache the current dir
|
||||
imce.navUpdate(response.data, dir);
|
||||
}
|
||||
imce.processResponse(response);
|
||||
},
|
||||
complete: function () {
|
||||
$(imce.tree[dir].li).removeClass('loading');
|
||||
imce.vars.navbusy = null;
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
//update directory using the given data
|
||||
navUpdate: function(data, dir) {
|
||||
var cached = data == imce.cache[dir], olddir = imce.conf.dir;
|
||||
if (cached) data.files.id = 'file-list';
|
||||
$(imce.FLW).html(data.files);
|
||||
imce.dirActivate(dir);
|
||||
imce.dirSubdirs(dir, data.subdirectories);
|
||||
$.extend(imce.conf.perm, data.perm);
|
||||
imce.refreshOps();
|
||||
imce.initiateList(cached);
|
||||
imce.setPreview(imce.selcount == 1 ? imce.lastFid() : null);
|
||||
imce.SBW.scrollTop = 0;
|
||||
imce.invoke('navigate', data, olddir, cached);
|
||||
},
|
||||
|
||||
//set cache
|
||||
navCache: function (dir, newdir) {
|
||||
var C = imce.cache[dir] = {'dir': dir, files: imce.el('file-list'), dirsize: imce.el('dir-size').innerHTML, perm: $.extend({}, imce.conf.perm)};
|
||||
C.files.id = 'cached-list-'+ dir;
|
||||
imce.FW.appendChild(C.files);
|
||||
imce.invoke('cache', C, newdir);
|
||||
},
|
||||
|
||||
//validate upload form
|
||||
uploadValidate: function (data, form, options) {
|
||||
var path = $('#edit-imce').val();
|
||||
if (!path) return false;
|
||||
if (imce.conf.extensions != '*') {
|
||||
var ext = path.substr(path.lastIndexOf('.') + 1);
|
||||
if ((' '+ imce.conf.extensions +' ').indexOf(' '+ ext.toLowerCase() +' ') == -1) {
|
||||
return imce.setMessage(Drupal.t('Only files with the following extensions are allowed: %files-allowed.', {'%files-allowed': imce.conf.extensions}), 'error');
|
||||
}
|
||||
}
|
||||
var sep = path.indexOf('/') == -1 ? '\\' : '/';
|
||||
options.url = imce.ajaxURL('upload');//make url contain current dir.
|
||||
imce.fopLoading('upload', true);
|
||||
return true;
|
||||
},
|
||||
|
||||
//settings for upload
|
||||
uploadSettings: function () {
|
||||
return {beforeSubmit: imce.uploadValidate, success: function (response) {imce.processResponse($.parseJSON(response));}, complete: function () {imce.fopLoading('upload', false);}, resetForm: true};
|
||||
},
|
||||
|
||||
//validate default ops(delete, thumb, resize)
|
||||
fopValidate: function(fop) {
|
||||
if (!imce.validateSelCount(1, imce.conf.filenum)) return false;
|
||||
switch (fop) {
|
||||
case 'delete':
|
||||
return confirm(Drupal.t('Delete selected files?'));
|
||||
case 'thumb':
|
||||
if (!$('input:checked', imce.ops['thumb'].div).size()) {
|
||||
return imce.setMessage(Drupal.t('Please select a thumbnail.'), 'error');
|
||||
}
|
||||
return imce.validateImage();
|
||||
case 'resize':
|
||||
var w = imce.el('edit-width').value, h = imce.el('edit-height').value;
|
||||
var maxDim = imce.conf.dimensions.split('x');
|
||||
var maxW = maxDim[0]*1, maxH = maxW ? maxDim[1]*1 : 0;
|
||||
if (!(/^[1-9][0-9]*$/).test(w) || !(/^[1-9][0-9]*$/).test(h) || (maxW && (maxW < w*1 || maxH < h*1))) {
|
||||
return imce.setMessage(Drupal.t('Please specify dimensions within the allowed range that is from 1x1 to @dimensions.', {'@dimensions': maxW ? imce.conf.dimensions : Drupal.t('unlimited')}), 'error');
|
||||
}
|
||||
return imce.validateImage();
|
||||
}
|
||||
|
||||
var func = fop +'OpValidate';
|
||||
if (imce[func]) return imce[func](fop);
|
||||
return true;
|
||||
},
|
||||
|
||||
//submit wrapper for default ops
|
||||
fopSubmit: function(fop) {
|
||||
switch (fop) {
|
||||
case 'thumb': case 'delete': case 'resize': return imce.commonSubmit(fop);
|
||||
}
|
||||
var func = fop +'OpSubmit';
|
||||
if (imce[func]) return imce[func](fop);
|
||||
},
|
||||
|
||||
//common submit function shared by default ops
|
||||
commonSubmit: function(fop) {
|
||||
if (!imce.fopValidate(fop)) return false;
|
||||
imce.fopLoading(fop, true);
|
||||
$.ajax(imce.fopSettings(fop));
|
||||
},
|
||||
|
||||
//settings for default file operations
|
||||
fopSettings: function (fop) {
|
||||
return {url: imce.ajaxURL(fop), type: 'POST', dataType: 'json', success: imce.processResponse, complete: function (response) {imce.fopLoading(fop, false);}, data: imce.vars.opform +'&filenames='+ imce.serialNames() +'&jsop='+ fop + (imce.ops[fop].div ? '&'+ $('input, select, textarea', imce.ops[fop].div).serialize() : '')};
|
||||
},
|
||||
|
||||
//toggle loading state
|
||||
fopLoading: function(fop, state) {
|
||||
var el = imce.el('edit-'+ fop), func = state ? 'addClass' : 'removeClass';
|
||||
if (el) {
|
||||
$(el)[func]('loading').attr('disabled', state);
|
||||
}
|
||||
else {
|
||||
$(imce.ops[fop].li)[func]('loading');
|
||||
imce.ops[fop].disabled = state;
|
||||
}
|
||||
},
|
||||
|
||||
//preview a file.
|
||||
setPreview: function (fid) {
|
||||
var row, html = '';
|
||||
imce.vars.prvfid = fid;
|
||||
if (fid && (row = imce.fids[fid])) {
|
||||
var width = row.cells[2].innerHTML * 1;
|
||||
html = imce.vars.previewImages && width ? imce.imgHtml(fid, width, row.cells[3].innerHTML) : imce.decodePlain(fid);
|
||||
html = '<a href="#" onclick="imce.send(\''+ fid +'\'); return false;" title="'+ (imce.vars.prvtitle||'') +'">'+ html +'</a>';
|
||||
}
|
||||
imce.el('file-preview').innerHTML = html;
|
||||
},
|
||||
|
||||
//default file send function. sends the file to the new window.
|
||||
send: function (fid) {
|
||||
fid && window.open(imce.getURL(fid));
|
||||
},
|
||||
|
||||
//add an operation for an external application to which the files are send.
|
||||
setSendTo: function (title, func) {
|
||||
imce.send = function (fid) { fid && func(imce.fileGet(fid), window);};
|
||||
var opFunc = function () {
|
||||
if (imce.selcount != 1) return imce.setMessage(Drupal.t('Please select a file.'), 'error');
|
||||
imce.send(imce.vars.prvfid);
|
||||
};
|
||||
imce.vars.prvtitle = title;
|
||||
return imce.opAdd({name: 'sendto', title: title, func: opFunc});
|
||||
},
|
||||
|
||||
//move initial page messages into log
|
||||
prepareMsgs: function () {
|
||||
var msgs;
|
||||
if (msgs = imce.el('imce-messages')) {
|
||||
$('>div', msgs).each(function (){
|
||||
var type = this.className.split(' ')[1];
|
||||
var li = $('>ul li', this);
|
||||
if (li.size()) li.each(function () {imce.setMessage(this.innerHTML, type);});
|
||||
else imce.setMessage(this.innerHTML, type);
|
||||
});
|
||||
$(msgs).remove();
|
||||
}
|
||||
},
|
||||
|
||||
//insert log message
|
||||
setMessage: function (msg, type) {
|
||||
var $box = $(imce.msgBox);
|
||||
var logs = imce.el('log-messages') || $(imce.newEl('div')).appendTo('#help-box-content').before('<h4>'+ Drupal.t('Log messages') +':</h4>').attr('id', 'log-messages')[0];
|
||||
var msg = '<div class="message '+ (type || 'status') +'">'+ msg +'</div>';
|
||||
$box.queue(function() {
|
||||
$box.css({opacity: 0, display: 'block'}).html(msg);
|
||||
$box.dequeue();
|
||||
});
|
||||
var q = $box.queue().length, t = imce.vars.msgT || 1000;
|
||||
q = q < 2 ? 1 : q < 3 ? 0.8 : q < 4 ? 0.7 : 0.4;//adjust speed with respect to queue length
|
||||
$box.fadeTo(600 * q, 1).fadeTo(t * q, 1).fadeOut(400 * q);
|
||||
$(logs).append(msg);
|
||||
return false;
|
||||
},
|
||||
|
||||
//invoke hooks
|
||||
invoke: function (hook) {
|
||||
var i, args, func, funcs;
|
||||
if ((funcs = imce.hooks[hook]) && funcs.length) {
|
||||
(args = $.makeArray(arguments)).shift();
|
||||
for (i = 0; func = funcs[i]; i++) func.apply(this, args);
|
||||
}
|
||||
},
|
||||
|
||||
//process response
|
||||
processResponse: function (response) {
|
||||
if (response.data) imce.resData(response.data);
|
||||
if (response.messages) imce.resMsgs(response.messages);
|
||||
},
|
||||
|
||||
//process response data
|
||||
resData: function (data) {
|
||||
var i, added, removed;
|
||||
if (added = data.added) {
|
||||
var cnt = imce.findex.length;
|
||||
for (i in added) {//add new files or update existing
|
||||
imce.fileAdd(added[i]);
|
||||
}
|
||||
if (added.length == 1) {//if it is a single file operation
|
||||
imce.highlight(added[0].name);//highlight
|
||||
}
|
||||
if (imce.findex.length != cnt) {//if new files added, scroll to bottom.
|
||||
$(imce.SBW).animate({scrollTop: imce.SBW.scrollHeight}).focus();
|
||||
}
|
||||
}
|
||||
if (removed = data.removed) for (i in removed) {
|
||||
imce.fileRemove(removed[i]);
|
||||
}
|
||||
imce.conf.dirsize = data.dirsize;
|
||||
imce.updateStat();
|
||||
},
|
||||
|
||||
//set response messages
|
||||
resMsgs: function (msgs) {
|
||||
for (var type in msgs) for (var i in msgs[type]) {
|
||||
imce.setMessage(msgs[type][i], type);
|
||||
}
|
||||
},
|
||||
|
||||
//return img markup
|
||||
imgHtml: function (fid, width, height) {
|
||||
return '<img src="'+ imce.getURL(fid) +'" width="'+ width +'" height="'+ height +'" alt="'+ imce.decodePlain(fid) +'">';
|
||||
},
|
||||
|
||||
//check if the file is an image
|
||||
isImage: function (fid) {
|
||||
return imce.fids[fid].cells[2].innerHTML * 1;
|
||||
},
|
||||
|
||||
//find the first non-image in the selection
|
||||
getNonImage: function (selected) {
|
||||
for (var fid in selected) {
|
||||
if (!imce.isImage(fid)) return fid;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
||||
//validate current selection for images
|
||||
validateImage: function () {
|
||||
var nonImg = imce.getNonImage(imce.selected);
|
||||
return nonImg ? imce.setMessage(Drupal.t('%filename is not an image.', {'%filename': imce.decode(nonImg)}), 'error') : true;
|
||||
},
|
||||
|
||||
//validate number of selected files
|
||||
validateSelCount: function (Min, Max) {
|
||||
if (Min && imce.selcount < Min) {
|
||||
return imce.setMessage(Min == 1 ? Drupal.t('Please select a file.') : Drupal.t('You must select at least %num files.', {'%num': Min}), 'error');
|
||||
}
|
||||
if (Max && Max < imce.selcount) {
|
||||
return imce.setMessage(Drupal.t('You are not allowed to operate on more than %num files.', {'%num': Max}), 'error');
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
//update file count and dir size
|
||||
updateStat: function () {
|
||||
imce.el('file-count').innerHTML = imce.findex.length;
|
||||
imce.el('dir-size').innerHTML = imce.conf.dirsize;
|
||||
},
|
||||
|
||||
//serialize selected files. return fids with a colon between them
|
||||
serialNames: function () {
|
||||
var str = '';
|
||||
for (var fid in imce.selected) {
|
||||
str += ':'+ fid;
|
||||
}
|
||||
return str.substr(1);
|
||||
},
|
||||
|
||||
//get file url. re-encode & and # for mod rewrite
|
||||
getURL: function (fid) {
|
||||
var path = (imce.conf.dir == '.' ? '' : imce.conf.dir +'/') + fid;
|
||||
return imce.conf.furl + (imce.conf.modfix ? path.replace(/%(23|26)/g, '%25$1') : path);
|
||||
},
|
||||
|
||||
//el. by id
|
||||
el: function (id) {
|
||||
return document.getElementById(id);
|
||||
},
|
||||
|
||||
//find the latest selected fid
|
||||
lastFid: function () {
|
||||
if (imce.vars.lastfid) return imce.vars.lastfid;
|
||||
for (var fid in imce.selected);
|
||||
return fid;
|
||||
},
|
||||
|
||||
//create ajax url
|
||||
ajaxURL: function (op, dir) {
|
||||
return imce.conf.url + (imce.conf.clean ? '?' :'&') +'jsop='+ op +'&dir='+ (dir||imce.conf.dir);
|
||||
},
|
||||
|
||||
//fast class check
|
||||
hasC: function (el, name) {
|
||||
return el.className && (' '+ el.className +' ').indexOf(' '+ name +' ') != -1;
|
||||
},
|
||||
|
||||
//highlight a single file
|
||||
highlight: function (fid) {
|
||||
if (imce.vars.prvfid) imce.fileClick(imce.vars.prvfid);
|
||||
imce.fileClick(fid);
|
||||
},
|
||||
|
||||
//process a row
|
||||
processRow: function (row) {
|
||||
row.cells[0].innerHTML = '<span>' + imce.decodePlain(row.id) + '</span>';
|
||||
row.onmousedown = function(e) {
|
||||
var e = e||window.event;
|
||||
imce.fileClick(this, e.ctrlKey, e.shiftKey);
|
||||
return !(e.ctrlKey || e.shiftKey);
|
||||
};
|
||||
row.ondblclick = function(e) {
|
||||
imce.send(this.id);
|
||||
return false;
|
||||
};
|
||||
},
|
||||
|
||||
//decode urls. uses unescape. can be overridden to use decodeURIComponent
|
||||
decode: function (str) {
|
||||
return unescape(str);
|
||||
},
|
||||
|
||||
//decode and convert to plain text
|
||||
decodePlain: function (str) {
|
||||
return Drupal.checkPlain(imce.decode(str));
|
||||
},
|
||||
|
||||
//global ajax error function
|
||||
ajaxError: function (e, response, settings, thrown) {
|
||||
imce.setMessage(Drupal.ajaxError(response, settings.url).replace(/\n/g, '<br />'), 'error');
|
||||
},
|
||||
|
||||
//convert button elements to standard input buttons
|
||||
convertButtons: function(form) {
|
||||
$('button:submit', form).each(function(){
|
||||
$(this).replaceWith('<input type="submit" value="'+ $(this).text() +'" name="'+ this.name +'" class="form-submit" id="'+ this.id +'" />');
|
||||
});
|
||||
},
|
||||
|
||||
//create element
|
||||
newEl: function(name) {
|
||||
return document.createElement(name);
|
||||
},
|
||||
|
||||
//scroll syncronization for section headers
|
||||
syncScroll: function(scrlEl, fixEl, bottom) {
|
||||
var $fixEl = $(fixEl);
|
||||
var prop = bottom ? 'bottom' : 'top';
|
||||
var factor = bottom ? -1 : 1;
|
||||
var syncScrl = function(el) {
|
||||
$fixEl.css(prop, factor * el.scrollTop);
|
||||
}
|
||||
$(scrlEl).scroll(function() {
|
||||
var el = this;
|
||||
syncScrl(el);
|
||||
setTimeout(function() {
|
||||
syncScrl(el);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
//get UI ready. provide backward compatibility.
|
||||
updateUI: function() {
|
||||
//file urls.
|
||||
var furl = imce.conf.furl, isabs = furl.indexOf('://') > -1;
|
||||
var absurls = imce.conf.absurls = imce.vars.absurls || imce.conf.absurls;
|
||||
var host = location.host;
|
||||
var baseurl = location.protocol + '//' + host;
|
||||
if (furl.charAt(furl.length - 1) != '/') {
|
||||
furl = imce.conf.furl = furl + '/';
|
||||
}
|
||||
imce.conf.modfix = imce.conf.clean && furl.indexOf(host + '/system/') > -1;
|
||||
if (absurls && !isabs) {
|
||||
imce.conf.furl = baseurl + furl;
|
||||
}
|
||||
else if (!absurls && isabs && furl.indexOf(baseurl) == 0) {
|
||||
imce.conf.furl = furl.substr(baseurl.length);
|
||||
}
|
||||
//convert button elements to input elements.
|
||||
imce.convertButtons(imce.FW);
|
||||
//ops-list
|
||||
$('#ops-list').removeClass('tabs secondary').addClass('clear-block clearfix');
|
||||
imce.opCloseLink = $(imce.newEl('a')).attr({id: 'op-close-link', href: '#', title: Drupal.t('Close')}).click(function() {
|
||||
imce.vars.op && imce.opClick(imce.vars.op);
|
||||
return false;
|
||||
}).appendTo('#op-contents')[0];
|
||||
//navigation-header
|
||||
if (!$('#navigation-header').size()) {
|
||||
$(imce.NW).children('.navigation-text').attr('id', 'navigation-header').wrapInner('<span></span>');
|
||||
}
|
||||
//log
|
||||
$('#log-prv-wrapper').before($('#log-prv-wrapper > #preview-wrapper')).remove();
|
||||
$('#log-clearer').remove();
|
||||
//content resizer
|
||||
$('#content-resizer').remove();
|
||||
//message-box
|
||||
imce.msgBox = imce.el('message-box') || $(imce.newEl('div')).attr('id', 'message-box').prependTo('#imce-content')[0];
|
||||
//create help tab
|
||||
var $hbox = $('#help-box');
|
||||
$hbox.is('a') && $hbox.replaceWith($(imce.newEl('div')).attr('id', 'help-box').append($hbox.children()));
|
||||
imce.hooks.load.push(function() {
|
||||
imce.opAdd({name: 'help', title: $('#help-box-title').remove().text(), content: $('#help-box').show()});
|
||||
});
|
||||
//add ie classes
|
||||
$.browser.msie && $('html').addClass('ie') && parseFloat($.browser.version) < 8 && $('html').addClass('ie-7');
|
||||
// enable box view for file list
|
||||
imce.vars.boxW && imce.boxView();
|
||||
//scrolling file list
|
||||
imce.syncScroll(imce.SBW, '#file-header-wrapper');
|
||||
imce.syncScroll(imce.SBW, '#dir-stat', true);
|
||||
//scrolling directory tree
|
||||
imce.syncScroll(imce.NW, '#navigation-header');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
//initiate
|
||||
$(document).ready(imce.initiate).ajaxError(imce.ajaxError);
|
||||
|
||||
})(jQuery);
|
284
sites/all/modules/contrib/files/imce/imce/js/imce_extras.js
Normal file
@@ -0,0 +1,284 @@
|
||||
//This pack implemets: keyboard shortcuts, file sorting, resize bars, and inline thumbnail preview.
|
||||
|
||||
(function($) {
|
||||
|
||||
// add scale calculator for resizing.
|
||||
imce.hooks.load.push(function () {
|
||||
$('#edit-width, #edit-height').focus(function () {
|
||||
var fid, r, w, isW, val;
|
||||
if (fid = imce.vars.prvfid) {
|
||||
isW = this.id == 'edit-width', val = imce.el(isW ? 'edit-height' : 'edit-width').value*1;
|
||||
if (val && (w = imce.isImage(fid)) && (r = imce.fids[fid].cells[3].innerHTML*1 / w))
|
||||
this.value = Math.round(isW ? val/r : val*r);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Shortcuts
|
||||
var F = null;
|
||||
imce.initiateShortcuts = function () {
|
||||
$(imce.NW).attr('tabindex', '0').keydown(function (e) {
|
||||
if (F = imce.dirKeys['k'+ e.keyCode]) return F(e);
|
||||
});
|
||||
$(imce.FLW).attr('tabindex', '0').keydown(function (e) {
|
||||
if (F = imce.fileKeys['k'+ e.keyCode]) return F(e);
|
||||
}).focus();
|
||||
};
|
||||
|
||||
//shortcut key-function pairs for directories
|
||||
imce.dirKeys = {
|
||||
k35: function (e) {//end-home. select first or last dir
|
||||
var L = imce.tree['.'].li;
|
||||
if (e.keyCode == 35) while (imce.hasC(L, 'expanded')) L = L.lastChild.lastChild;
|
||||
$(L.childNodes[1]).click().focus();
|
||||
},
|
||||
k37: function (e) {//left-right. collapse-expand directories.(right may also move focus on files)
|
||||
var L, B = imce.tree[imce.conf.dir], right = e.keyCode == 39;
|
||||
if (B.ul && (right ^ imce.hasC(L = B.li, 'expanded')) ) $(L.firstChild).click();
|
||||
else if (right) $(imce.FLW).focus();
|
||||
},
|
||||
k38: function (e) {//up. select the previous directory
|
||||
var B = imce.tree[imce.conf.dir];
|
||||
if (L = B.li.previousSibling) {
|
||||
while (imce.hasC(L, 'expanded')) L = L.lastChild.lastChild;
|
||||
$(L.childNodes[1]).click().focus();
|
||||
}
|
||||
else if ((L = B.li.parentNode.parentNode) && L.tagName == 'LI') $(L.childNodes[1]).click().focus();
|
||||
},
|
||||
k40: function (e) {//down. select the next directory
|
||||
var B = imce.tree[imce.conf.dir], L = B.li, U = B.ul;
|
||||
if (U && imce.hasC(L, 'expanded')) $(U.firstChild.childNodes[1]).click().focus();
|
||||
else do {if (L.nextSibling) return $(L.nextSibling.childNodes[1]).click().focus();
|
||||
}while ((L = L.parentNode.parentNode).tagName == 'LI');
|
||||
}
|
||||
};
|
||||
//add equal keys
|
||||
imce.dirKeys.k36 = imce.dirKeys.k35;
|
||||
imce.dirKeys.k39 = imce.dirKeys.k37;
|
||||
|
||||
//shortcut key-function pairs for files
|
||||
imce.fileKeys = {
|
||||
k38: function (e) {//up-down. select previous-next row
|
||||
var fid = imce.lastFid(), i = fid ? imce.fids[fid].rowIndex+e.keyCode-39 : 0;
|
||||
imce.fileClick(imce.findex[i], e.ctrlKey, e.shiftKey);
|
||||
},
|
||||
k35: function (e) {//end-home. select first or last row
|
||||
imce.fileClick(imce.findex[e.keyCode == 35 ? imce.findex.length-1 : 0], e.ctrlKey, e.shiftKey);
|
||||
},
|
||||
k13: function (e) {//enter-insert. send file to external app.
|
||||
imce.send(imce.vars.prvfid);
|
||||
return false;
|
||||
},
|
||||
k37: function (e) {//left. focus on directories
|
||||
$(imce.tree[imce.conf.dir].a).focus();
|
||||
},
|
||||
k65: function (e) {//ctrl+A to select all
|
||||
if (e.ctrlKey && imce.findex.length) {
|
||||
var fid = imce.findex[0].id;
|
||||
imce.selected[fid] ? (imce.vars.lastfid = fid) : imce.fileClick(fid);//select first row
|
||||
imce.fileClick(imce.findex[imce.findex.length-1], false, true);//shift+click last row
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
//add equal keys
|
||||
imce.fileKeys.k40 = imce.fileKeys.k38;
|
||||
imce.fileKeys.k36 = imce.fileKeys.k35;
|
||||
imce.fileKeys.k45 = imce.fileKeys.k13;
|
||||
//add default operation keys. delete, R(esize), T(humbnails), U(pload)
|
||||
$.each({k46: 'delete', k82: 'resize', k84: 'thumb', k85: 'upload'}, function (k, op) {
|
||||
imce.fileKeys[k] = function (e) {
|
||||
if (imce.ops[op] && !imce.ops[op].disabled) imce.opClick(op);
|
||||
};
|
||||
});
|
||||
|
||||
//prepare column sorting
|
||||
imce.initiateSorting = function() {
|
||||
//add cache hook. cache the old directory's sort settings before the new one replaces it.
|
||||
imce.hooks.cache.push(function (cache, newdir) {
|
||||
cache.cid = imce.vars.cid, cache.dsc = imce.vars.dsc;
|
||||
});
|
||||
//add navigation hook. refresh sorting after the new directory content is loaded.
|
||||
imce.hooks.navigate.push(function (data, olddir, cached) {
|
||||
cached ? imce.updateSortState(data.cid, data.dsc) : imce.firstSort();
|
||||
});
|
||||
imce.vars.cid = imce.cookie('imcecid') * 1;
|
||||
imce.vars.dsc = imce.cookie('imcedsc') * 1;
|
||||
imce.cols = imce.el('file-header').rows[0].cells;
|
||||
$(imce.cols).click(function () {imce.columnSort(this.cellIndex, imce.hasC(this, 'asc'));});
|
||||
imce.firstSort();
|
||||
};
|
||||
|
||||
//sort the list for the first time
|
||||
imce.firstSort = function() {
|
||||
imce.columnSort(imce.vars.cid, imce.vars.dsc);
|
||||
};
|
||||
|
||||
//sort file list according to column index.
|
||||
imce.columnSort = function(cid, dsc) {
|
||||
if (imce.findex.length < 2) return;
|
||||
var func = 'sort'+ (cid == 0 ? 'Str' : 'Num') + (dsc ? 'Dsc' : 'Asc');
|
||||
var prop = cid == 2 || cid == 3 ? 'innerHTML' : 'id';
|
||||
//sort rows
|
||||
imce.findex.sort(cid ? function(r1, r2) {return imce[func](r1.cells[cid][prop], r2.cells[cid][prop])} : function(r1, r2) {return imce[func](r1.id, r2.id)});
|
||||
//insert sorted rows
|
||||
for (var row, i=0; row = imce.findex[i]; i++) {
|
||||
imce.tbody.appendChild(row);
|
||||
}
|
||||
imce.updateSortState(cid, dsc);
|
||||
};
|
||||
|
||||
//update column states
|
||||
imce.updateSortState = function(cid, dsc) {
|
||||
$(imce.cols[imce.vars.cid]).removeClass(imce.vars.dsc ? 'desc' : 'asc');
|
||||
$(imce.cols[cid]).addClass(dsc ? 'desc' : 'asc');
|
||||
imce.vars.cid != cid && imce.cookie('imcecid', imce.vars.cid = cid);
|
||||
imce.vars.dsc != dsc && imce.cookie('imcedsc', (imce.vars.dsc = dsc) ? 1 : 0);
|
||||
};
|
||||
|
||||
//sorters
|
||||
imce.sortStrAsc = function(a, b) {return a.toLowerCase() < b.toLowerCase() ? -1 : 1;};
|
||||
imce.sortStrDsc = function(a, b) {return imce.sortStrAsc(b, a);};
|
||||
imce.sortNumAsc = function(a, b) {return a-b;};
|
||||
imce.sortNumDsc = function(a, b) {return b-a};
|
||||
|
||||
//set resizers for resizable areas and recall previous dimensions
|
||||
imce.initiateResizeBars = function () {
|
||||
imce.setResizer('#navigation-resizer', 'X', imce.NW, null, 1, function(p1, p2, m) {
|
||||
p1 != p2 && imce.cookie('imcenww', p2);
|
||||
});
|
||||
imce.setResizer('#browse-resizer', 'Y', imce.BW, imce.PW, 50, function(p1, p2, m) {
|
||||
p1 != p2 && imce.cookie('imcebwh', p2);
|
||||
});
|
||||
imce.recallDimensions();
|
||||
};
|
||||
|
||||
//set a resize bar
|
||||
imce.setResizer = function (resizer, axis, area1, area2, Min, callback) {
|
||||
var opt = axis == 'X' ? {pos: 'pageX', func: 'width'} : {pos: 'pageY', func: 'height'};
|
||||
var Min = Min || 0;
|
||||
var $area1 = $(area1), $area2 = area2 ? $(area2) : null, $doc = $(document);
|
||||
$(resizer).mousedown(function(e) {
|
||||
var pos = e[opt.pos];
|
||||
var end = start = $area1[opt.func]();
|
||||
var Max = $area2 ? start + $area2[opt.func]() : 1200;
|
||||
var drag = function(e) {
|
||||
end = Math.min(Max - Min, Math.max(start + e[opt.pos] - pos, Min));
|
||||
$area1[opt.func](end);
|
||||
$area2 && $area2[opt.func](Max - end);
|
||||
return false;
|
||||
};
|
||||
var undrag = function(e) {
|
||||
$doc.unbind('mousemove', drag).unbind('mouseup', undrag);
|
||||
callback && callback(start, end, Max);
|
||||
};
|
||||
$doc.mousemove(drag).mouseup(undrag);
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
//get&set area dimensions of the last session from the cookie
|
||||
imce.recallDimensions = function() {
|
||||
var $body = $(document.body);
|
||||
if (!$body.is('.imce')) return;
|
||||
//row heights
|
||||
imce.recallHeights(imce.cookie('imcebwh') * 1);
|
||||
$(window).resize(function(){imce.recallHeights()});
|
||||
//navigation wrapper
|
||||
var nwOldWidth = imce.cookie('imcenww') * 1;
|
||||
nwOldWidth && $(imce.NW).width(Math.min(nwOldWidth, $body.width() - 10));
|
||||
};
|
||||
|
||||
//set row heights with respect to window height
|
||||
imce.recallHeights = function(bwFixedHeight) {
|
||||
//window & body dimensions
|
||||
var winHeight = $.browser.opera ? window.innerHeight : $(window).height();
|
||||
var bodyHeight = $(document.body).outerHeight(true);
|
||||
var diff = winHeight - bodyHeight;
|
||||
var bwHeight = $(imce.BW).height(), pwHeight = $(imce.PW).height();
|
||||
if (bwFixedHeight) {
|
||||
//row heights
|
||||
diff -= bwFixedHeight - bwHeight;
|
||||
bwHeight = bwFixedHeight;
|
||||
pwHeight += diff;
|
||||
}
|
||||
else {
|
||||
diff = parseInt(diff/2);
|
||||
bwHeight += diff;
|
||||
pwHeight += diff;
|
||||
}
|
||||
$(imce.BW).height(bwHeight);
|
||||
$(imce.PW).height(pwHeight);
|
||||
};
|
||||
|
||||
//cookie get & set
|
||||
imce.cookie = function (name, value) {
|
||||
if (typeof(value) == 'undefined') {//get
|
||||
return unescape((document.cookie.match(new RegExp('(^|;) *'+ name +'=([^;]*)(;|$)')) || ['', '', ''])[2]);
|
||||
}
|
||||
document.cookie = name +'='+ escape(value) +'; expires='+ (new Date(new Date() * 1 + 15 * 86400000)).toGMTString() +'; path=' + Drupal.settings.basePath + 'imce';//set
|
||||
};
|
||||
|
||||
//view thumbnails(smaller than tMaxW x tMaxH) inside the rows.
|
||||
//Large images can also be previewed by setting imce.vars.prvstyle to a valid image style(imagecache preset)
|
||||
imce.thumbRow = function (row) {
|
||||
var w = row.cells[2].innerHTML * 1;
|
||||
if (!w) return;
|
||||
var h = row.cells[3].innerHTML * 1;
|
||||
if (imce.vars.tMaxW < w || imce.vars.tMaxH < h) {
|
||||
if (!imce.vars.prvstyle || imce.conf.dir.indexOf('styles') == 0) return;
|
||||
var img = new Image();
|
||||
img.src = imce.imagestyleURL(imce.getURL(row.id), imce.vars.prvstyle);
|
||||
img.className = 'imagestyle-' + imce.vars.prvstyle;
|
||||
}
|
||||
else {
|
||||
var prvH = h, prvW = w;
|
||||
if (imce.vars.prvW < w || imce.vars.prvH < h) {
|
||||
if (h < w) {
|
||||
prvW = imce.vars.prvW;
|
||||
prvH = prvW*h/w;
|
||||
}
|
||||
else {
|
||||
prvH = imce.vars.prvH;
|
||||
prvW = prvH*w/h;
|
||||
}
|
||||
}
|
||||
var img = new Image(prvW, prvH);
|
||||
img.src = imce.getURL(row.id);
|
||||
}
|
||||
var cell = row.cells[0];
|
||||
cell.insertBefore(img, cell.firstChild);
|
||||
};
|
||||
|
||||
//convert a file URL returned by imce.getURL() to an image style(imagecache preset) URL
|
||||
imce.imagestyleURL = function (url, stylename) {
|
||||
var len = imce.conf.furl.length - 1;
|
||||
return url.substr(0, len) + '/styles/' + stylename + '/' + imce.conf.scheme + url.substr(len);
|
||||
};
|
||||
|
||||
// replace table view with box view for file list
|
||||
imce.boxView = function () {
|
||||
var w = imce.vars.boxW, h = imce.vars.boxH;
|
||||
if (!w || !h || $.browser.msie && parseFloat($.browser.version) < 8) return;
|
||||
var $body = $(document.body);
|
||||
var toggle = function() {
|
||||
$body.toggleClass('box-view');
|
||||
// refresh dom. required by all except FF.
|
||||
!$.browser.mozilla && $('#file-list').appendTo(imce.FW).appendTo(imce.FLW);
|
||||
};
|
||||
$body.append('<style type="text/css">.box-view #file-list td.name {width: ' + w + 'px;height: ' + h + 'px;} .box-view #file-list td.name span {width: ' + w + 'px;word-wrap: normal;text-overflow: ellipsis;}</style>');
|
||||
imce.hooks.load.push(function() {
|
||||
toggle();
|
||||
imce.SBW.scrollTop = 0;
|
||||
imce.opAdd({name: 'changeview', title: Drupal.t('Change view'), func: toggle});
|
||||
});
|
||||
imce.hooks.list.push(imce.boxViewRow);
|
||||
};
|
||||
|
||||
// process a row for box view. include all data in box title.
|
||||
imce.boxViewRow = function (row) {
|
||||
var s = ' | ', w = row.cells[2].innerHTML * 1, dim = w ? s + w + 'x' + row.cells[3].innerHTML * 1 : '';
|
||||
row.cells[0].title = imce.decode(row.id) + s + row.cells[1].innerHTML + (dim) + s + row.cells[4].innerHTML;
|
||||
};
|
||||
|
||||
})(jQuery);
|
97
sites/all/modules/contrib/files/imce/imce/js/imce_set_app.js
Normal file
@@ -0,0 +1,97 @@
|
||||
/*
|
||||
* IMCE Integration by URL
|
||||
* Ex-1: http://example.com/imce?app=XEditor|url@urlFieldId|width@widthFieldId|height@heightFieldId
|
||||
* Creates "Insert file" operation tab, which fills the specified fields with url, width, height properties
|
||||
* of the selected file in the parent window
|
||||
* Ex-2: http://example.com/imce?app=XEditor|sendto@functionName
|
||||
* "Insert file" operation calls parent window's functionName(file, imceWindow)
|
||||
* Ex-3: http://example.com/imce?app=XEditor|imceload@functionName
|
||||
* Parent window's functionName(imceWindow) is called as soon as IMCE UI is ready. Send to operation
|
||||
* needs to be set manually. See imce.setSendTo() method in imce.js
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var appFields = {}, appWindow = (top.appiFrm||window).opener || parent;
|
||||
|
||||
// Execute when imce loads.
|
||||
imce.hooks.load.push(function(win) {
|
||||
var index = location.href.lastIndexOf('app=');
|
||||
if (index == -1) return;
|
||||
var data = decodeURIComponent(location.href.substr(index + 4)).split('|');
|
||||
var arr, prop, str, func, appName = data.shift();
|
||||
// Extract fields
|
||||
for (var i = 0, len = data.length; i < len; i++) {
|
||||
str = data[i];
|
||||
if (!str.length) continue;
|
||||
if (str.indexOf('&') != -1) str = str.split('&')[0];
|
||||
arr = str.split('@');
|
||||
if (arr.length > 1) {
|
||||
prop = arr.shift();
|
||||
appFields[prop] = arr.join('@');
|
||||
}
|
||||
}
|
||||
// Run custom onload function if available
|
||||
if (appFields.imceload && (func = isFunc(appFields.imceload))) {
|
||||
func(win);
|
||||
delete appFields.imceload;
|
||||
}
|
||||
// Set custom sendto function. appFinish is the default.
|
||||
var sendtoFunc = appFields.url ? appFinish : false;
|
||||
//check sendto@funcName syntax in URL
|
||||
if (appFields.sendto && (func = isFunc(appFields.sendto))) {
|
||||
sendtoFunc = func;
|
||||
delete appFields.sendto;
|
||||
}
|
||||
// Check old method windowname+ImceFinish.
|
||||
else if (win.name && (func = isFunc(win.name +'ImceFinish'))) {
|
||||
sendtoFunc = func;
|
||||
}
|
||||
// Highlight file
|
||||
if (appFields.url) {
|
||||
// Support multiple url fields url@field1,field2..
|
||||
if (appFields.url.indexOf(',') > -1) {
|
||||
var arr = appFields.url.split(',');
|
||||
for (var i in arr) {
|
||||
if ($('#'+ arr[i], appWindow.document).size()) {
|
||||
appFields.url = arr[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var filename = $('#'+ appFields.url, appWindow.document).val() || '';
|
||||
imce.highlight(filename.substr(filename.lastIndexOf('/')+1));
|
||||
}
|
||||
// Set send to
|
||||
sendtoFunc && imce.setSendTo(Drupal.t('Insert file'), sendtoFunc);
|
||||
});
|
||||
|
||||
// Default sendTo function
|
||||
var appFinish = function(file, win) {
|
||||
var $doc = $(appWindow.document);
|
||||
for (var i in appFields) {
|
||||
$doc.find('#'+ appFields[i]).val(file[i]);
|
||||
}
|
||||
if (appFields.url) {
|
||||
try{
|
||||
$doc.find('#'+ appFields.url).blur().change().focus();
|
||||
}catch(e){
|
||||
try{
|
||||
$doc.find('#'+ appFields.url).trigger('onblur').trigger('onchange').trigger('onfocus');//inline events for IE
|
||||
}catch(e){}
|
||||
}
|
||||
}
|
||||
appWindow.focus();
|
||||
win.close();
|
||||
};
|
||||
|
||||
// Checks if a string is a function name in the given scope.
|
||||
// Returns function reference. Supports x.y.z notation.
|
||||
var isFunc = function(str, scope) {
|
||||
var obj = scope || appWindow;
|
||||
var parts = str.split('.'), len = parts.length;
|
||||
for (var i = 0; i < len && (obj = obj[parts[i]]); i++);
|
||||
return obj && i == len && (typeof obj == 'function' || typeof obj != 'string' && !obj.nodeName && obj.constructor != Array && /^[\s[]?function/.test(obj.toString())) ? obj : false;
|
||||
}
|
||||
|
||||
})(jQuery);
|
@@ -0,0 +1,58 @@
|
||||
(function($) {
|
||||
|
||||
var ii = window.imceInline = {};
|
||||
|
||||
// Drupal behavior
|
||||
Drupal.behaviors.imceInline = {attach: function(context, settings) {
|
||||
$('div.imce-inline-wrapper', context).not('.processed').addClass('processed').show().find('a').click(function() {
|
||||
var i = this.name.indexOf('-IMCE-');
|
||||
ii.activeTextarea = $('#'+ this.name.substr(0, i)).get(0);
|
||||
ii.activeType = this.name.substr(i+6);
|
||||
|
||||
if (typeof ii.pop == 'undefined' || ii.pop.closed) {
|
||||
ii.pop = window.open(this.href + (this.href.indexOf('?') < 0 ? '?' : '&') +'app=nomatter|imceload@imceInline.load', '', 'width='+ 760 +',height='+ 560 +',resizable=1');
|
||||
}
|
||||
|
||||
ii.pop.focus();
|
||||
return false;
|
||||
});
|
||||
}};
|
||||
|
||||
//function to be executed when imce loads.
|
||||
ii.load = function(win) {
|
||||
win.imce.setSendTo(Drupal.t('Insert file'), ii.insert);
|
||||
$(window).unload(function() {
|
||||
if (ii.pop && !ii.pop.closed) ii.pop.close();
|
||||
});
|
||||
};
|
||||
|
||||
//insert html at cursor position
|
||||
ii.insertAtCursor = function (field, txt, type) {
|
||||
field.focus();
|
||||
if ('undefined' != typeof(field.selectionStart)) {
|
||||
if (type == 'link' && (field.selectionEnd-field.selectionStart)) {
|
||||
txt = txt.split('">')[0] +'">'+ field.value.substring(field.selectionStart, field.selectionEnd) +'</a>';
|
||||
}
|
||||
field.value = field.value.substring(0, field.selectionStart) + txt + field.value.substring(field.selectionEnd, field.value.length);
|
||||
}
|
||||
else if (document.selection) {
|
||||
if (type == 'link' && document.selection.createRange().text.length) {
|
||||
txt = txt.split('">')[0] +'">'+ document.selection.createRange().text +'</a>';
|
||||
}
|
||||
document.selection.createRange().text = txt;
|
||||
}
|
||||
else {
|
||||
field.value += txt;
|
||||
}
|
||||
};
|
||||
|
||||
//sendTo function
|
||||
ii.insert = function (file, win) {
|
||||
var type = ii.activeType == 'link' ? 'link' : (file.width ? 'image' : 'link');
|
||||
var html = type == 'image' ? ('<img src="'+ file.url +'" width="'+ file.width +'" height="'+ file.height +'" alt="'+ file.name +'" />') : ('<a href="'+ file.url +'">'+ file.name +' ('+ file.size +')</a>');
|
||||
ii.activeType = null;
|
||||
win.blur();
|
||||
ii.insertAtCursor(ii.activeTextarea, html, type);
|
||||
};
|
||||
|
||||
})(jQuery);
|
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
$imce =& $imce_ref['imce'];//keep this line.
|
||||
?>
|
||||
|
||||
<script type="text/javascript">
|
||||
<!--//--><![CDATA[//><!--
|
||||
imce.hooks.load.push(imce.initiateShortcuts); //shortcuts for directories and files
|
||||
imce.hooks.load.push(imce.initiateSorting); //file sorting
|
||||
imce.hooks.load.push(imce.initiateResizeBars); //area resizing
|
||||
|
||||
//inline preview
|
||||
imce.hooks.list.push(imce.thumbRow);
|
||||
imce.vars.tMaxW = 120; //maximum width of an image to be previewed inline
|
||||
imce.vars.tMaxH = 120; //maximum height of an image to be previewed inline
|
||||
imce.vars.prvW = 40; //maximum width of the thumbnail used in inline preview.
|
||||
imce.vars.prvH = 40; //maximum height of the thumbnail used in inline preview.
|
||||
//imce.vars.prvstyle = 'stylename'; //preview larger images inline using an image style(imagecache preset).
|
||||
|
||||
//enable box view for file list. set box dimensions = preview dimensions + 30 or more
|
||||
//imce.vars.boxW = 100; //width of a file info box
|
||||
//imce.vars.boxH = 100; //height of a file info box
|
||||
|
||||
//imce.vars.previewImages = 0; //disable click previewing of images.
|
||||
//imce.vars.cache = 0; //disable directory caching. File lists will always refresh.
|
||||
//imce.vars.absurls = 1; //make IMCE return absolute file URLs to external applications.
|
||||
//--><!]]>
|
||||
</script>
|
||||
|
||||
<div id="imce-content">
|
||||
|
||||
<div id="message-box"></div>
|
||||
|
||||
<div id="help-box"><!-- Update help content if you disable any of the extra features above. -->
|
||||
<div id="help-box-title"><span><?php print t('Help'); ?>!</span></div>
|
||||
<div id="help-box-content">
|
||||
<h4><?php print t('Tips'); ?>:</h4>
|
||||
<ul class="tips">
|
||||
<li><?php print t('Select a file by clicking the corresponding row in the file list.'); ?></li>
|
||||
<li><?php print t('Ctrl+click to add files to the selection or to remove files from the selection.'); ?></li>
|
||||
<li><?php print t('Shift+click to create a range selection. Click to start the range and shift+click to end it.'); ?></li>
|
||||
<li><?php print t('In order to send a file to an external application, double click on the file row.'); ?></li>
|
||||
<li><?php print t('Sort the files by clicking a column header of the file list.'); ?></li>
|
||||
<li><?php print t('Resize the work-spaces by dragging the horizontal or vertical resize-bars.'); ?></li>
|
||||
<li><?php print t('Keyboard shortcuts for file list: up, down, left, home, end, ctrl+A.'); ?></li>
|
||||
<li><?php print t('Keyboard shortcuts for selected files: enter/insert, delete, R(esize), T(humbnails), U(pload).'); ?></li>
|
||||
<li><?php print t('Keyboard shortcuts for directory list: up, down, left, right, home, end.'); ?></li>
|
||||
</ul>
|
||||
<h4><?php print t('Limitations'); ?>:</h4>
|
||||
<ul class="tips">
|
||||
<li><?php print t('Maximum file size per upload') .': '. ($imce['filesize'] ? format_size($imce['filesize']) : t('unlimited')); ?></li>
|
||||
<li><?php print t('Permitted file extensions') .': '. ($imce['extensions'] != '*' ? $imce['extensions'] : t('all')); ?></li>
|
||||
<li><?php print t('Maximum image resolution') .': '. ($imce['dimensions'] ? $imce['dimensions'] : t('unlimited')); ?></li>
|
||||
<li><?php print t('Maximum number of files per operation') .': '. ($imce['filenum'] ? $imce['filenum'] : t('unlimited')); ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="ops-wrapper">
|
||||
<div id="op-items"><ul id="ops-list"><li></li></ul></div>
|
||||
<div id="op-contents"></div>
|
||||
</div>
|
||||
|
||||
<div id="resizable-content">
|
||||
|
||||
<div id="browse-wrapper">
|
||||
|
||||
<div id="navigation-wrapper">
|
||||
<div class="navigation-text" id="navigation-header"><span><?php print t('Navigation'); ?></span></div>
|
||||
<ul id="navigation-tree"><li class="expanded root"><?php print $tree; ?></li></ul>
|
||||
</div>
|
||||
|
||||
<div id="navigation-resizer" class="x-resizer"></div>
|
||||
|
||||
<div id="sub-browse-wrapper">
|
||||
|
||||
<div id="file-header-wrapper">
|
||||
<table id="file-header" class="files"><tbody><tr>
|
||||
<td class="name"><?php print t('File name'); ?></td>
|
||||
<td class="size"><?php print t('Size'); ?></td>
|
||||
<td class="width"><?php print t('Width'); ?></td>
|
||||
<td class="height"><?php print t('Height'); ?></td>
|
||||
<td class="date"><?php print t('Date'); ?></td>
|
||||
</tr></tbody></table>
|
||||
</div>
|
||||
|
||||
<div id="file-list-wrapper">
|
||||
<?php print theme('imce_file_list', array('imce_ref' => $imce_ref)); /* see imce-file-list-tpl.php */?>
|
||||
</div>
|
||||
|
||||
<div id="dir-stat"><?php print t('!num files using !dirsize of !quota', array(
|
||||
'!num' => '<span id="file-count">'. count($imce['files']) .'</span>',
|
||||
'!dirsize' => '<span id="dir-size">'. format_size($imce['dirsize']) .'</span>',
|
||||
'!quota' => '<span id="dir-quota">'. ($imce['quota'] ? format_size($imce['quota']) : ($imce['tuquota'] ? format_size($imce['tuquota']) : t('unlimited quota'))) .'</span>'
|
||||
)); ?>
|
||||
</div>
|
||||
|
||||
</div><!-- sub-browse-wrapper -->
|
||||
</div><!-- browse-wrapper -->
|
||||
|
||||
<div id="browse-resizer" class="y-resizer"></div>
|
||||
|
||||
<div id="preview-wrapper"><div id="file-preview"></div></div>
|
||||
|
||||
</div><!-- resizable-content -->
|
||||
|
||||
<div id="forms-wrapper"><?php print $forms; ?></div>
|
||||
|
||||
</div><!-- imce-content -->
|
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
$imce =& $imce_ref['imce'];//keep this line.
|
||||
|
||||
/*
|
||||
* Although the file list table here is avaliable for theming,
|
||||
* it is not recommended to change the table structure, because
|
||||
* it is read and manipulated by javascript assuming this is the deafult structure.
|
||||
* You can always change the data created by format functions
|
||||
* such as format_size or format_date, or you can do css theming which is the best practice here.
|
||||
*/
|
||||
?>
|
||||
|
||||
<table id="file-list" class="files"><tbody><?php
|
||||
if ($imce['perm']['browse'] && !empty($imce['files'])) {
|
||||
foreach ($imce['files'] as $name => $file) {?>
|
||||
<tr id="<?php print $raw = rawurlencode($file['name']); ?>">
|
||||
<td class="name"><?php print $raw; ?></td>
|
||||
<td class="size" id="<?php print $file['size']; ?>"><?php print format_size($file['size']); ?></td>
|
||||
<td class="width"><?php print $file['width']; ?></td>
|
||||
<td class="height"><?php print $file['height']; ?></td>
|
||||
<td class="date" id="<?php print $file['date']; ?>"><?php print format_date($file['date'], 'short'); ?></td>
|
||||
</tr><?php
|
||||
}
|
||||
}?>
|
||||
</tbody></table>
|
@@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php print $GLOBALS['language']->language; ?>" xml:lang="<?php print $GLOBALS['language']->language; ?>" class="imce">
|
||||
|
||||
<head>
|
||||
<title><?php print t('File Browser'); ?></title>
|
||||
<?php if (isset($_GET['app'])): drupal_add_js(drupal_get_path('module', 'imce') .'/js/imce_set_app.js'); endif;?>
|
||||
<?php print drupal_get_html_head(); ?>
|
||||
<?php print drupal_get_css(); ?>
|
||||
<?php print drupal_get_js('header'); ?>
|
||||
<style media="all" type="text/css">/*Quick-override*/</style>
|
||||
</head>
|
||||
|
||||
<body class="imce">
|
||||
<div id="imce-messages"><?php print theme('status_messages'); ?></div>
|
||||
<?php print $content; ?>
|
||||
<?php print drupal_get_js('footer'); ?>
|
||||
</body>
|
||||
|
||||
</html>
|
339
sites/all/modules/contrib/files/imce/imce_mkdir/LICENSE.txt
Normal file
@@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
41
sites/all/modules/contrib/files/imce/imce_mkdir/README.txt
Normal file
@@ -0,0 +1,41 @@
|
||||
|
||||
IMCE Mkdir
|
||||
http://drupal.org/project/imce_mkdir
|
||||
====================================
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Adds directory creation functionality to IMCE through its UI.
|
||||
|
||||
|
||||
INSTALLING
|
||||
----------
|
||||
1. To install the module copy the 'imce_mkdir' folder to your sites/all/modules directory.
|
||||
|
||||
2. Go to module administration page. Enable the module.
|
||||
Read more about installing modules at http://drupal.org/node/70151
|
||||
|
||||
|
||||
CONFIGURING AND USING
|
||||
---------------------
|
||||
1. Go to /admin/config/media/imce Assuming you have already created a IMCE profile. Under section 'Configuration profiles' click on approprate 'Edit' link.
|
||||
|
||||
2. On the next page find section 'Directories'. Set appropriate permission using the check boxes 'Add subdirectories' and 'Remove subdirectories'.
|
||||
|
||||
3. Click on 'Save configuration' button.
|
||||
|
||||
4. To test use IMCE. A new 'Manage directories' tab button will be display. Follow instructions on screen.
|
||||
|
||||
|
||||
REPORTING ISSUE. REQUESTING SUPPORT. REQUESTING NEW FEATURE. CONTRIBUTE.
|
||||
------------------------------------------------------------------------
|
||||
1. Go to the module issue queue at http://drupal.org/project/issues/imce_mkdir?status=All&categories=All
|
||||
2. Click on CREATE A NEW ISSUE link.
|
||||
3. Fill the form.
|
||||
4. To get a status report on your request go to http://drupal.org/project/issues/user
|
||||
|
||||
|
||||
UPGRADING
|
||||
---------
|
||||
Read more at http://drupal.org/node/250790
|
BIN
sites/all/modules/contrib/files/imce/imce_mkdir/diradd.png
Normal file
After Width: | Height: | Size: 742 B |
BIN
sites/all/modules/contrib/files/imce/imce_mkdir/dirmanage.png
Normal file
After Width: | Height: | Size: 767 B |
BIN
sites/all/modules/contrib/files/imce/imce_mkdir/dirremove.png
Normal file
After Width: | Height: | Size: 718 B |
BIN
sites/all/modules/contrib/files/imce/imce_mkdir/down.png
Normal file
After Width: | Height: | Size: 113 B |
@@ -0,0 +1,47 @@
|
||||
#op-item-mngdir a {
|
||||
background-image: url(dirmanage.png);
|
||||
}
|
||||
#imce-content #edit-mkdir {
|
||||
background-image: url(diradd.png);
|
||||
}
|
||||
#imce-content #edit-rmdir {
|
||||
background-image: url(dirremove.png);
|
||||
}
|
||||
/* Subdirectory selector */
|
||||
#subdir-selector {
|
||||
position: absolute;
|
||||
max-height: 280px;
|
||||
min-width: 108px;
|
||||
overflow: auto;
|
||||
z-index: 3;
|
||||
border: 1px solid #ccc;
|
||||
}
|
||||
#subdir-selector a {
|
||||
color: #444;
|
||||
background-color: #eee;
|
||||
padding: 0.2em 0.4em;
|
||||
font-size: 0.9em;
|
||||
text-decoration: none;
|
||||
border-top: 1px dashed #ddd;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#subdir-selector a:first-child {
|
||||
border-top: none;
|
||||
}
|
||||
#subdir-selector a:focus {
|
||||
background-color: #f5f5f5;
|
||||
outline: none;
|
||||
}
|
||||
#subdir-selector a:hover {
|
||||
background-color: #fff;
|
||||
}
|
||||
#subdir-selector-button {
|
||||
background: url(down.png) no-repeat 50% 100%;
|
||||
display: inline-block;
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
cursor: pointer;
|
||||
}
|
170
sites/all/modules/contrib/files/imce/imce_mkdir/imce_mkdir.inc
Normal file
@@ -0,0 +1,170 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implements hook_form_formID_alter().
|
||||
*/
|
||||
function _imce_mkdir_form_imce_profile_form_alter(&$form, &$form_state) {
|
||||
foreach (element_children($form['profile']['directories']) as $key) {
|
||||
$form['profile']['directories'][$key]['mkdir'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Add subdirectories'),
|
||||
'#default_value' => isset($form_state['profile']['directories'][$key]['mkdir']) ? $form_state['profile']['directories'][$key]['mkdir'] : 0,
|
||||
);
|
||||
$form['profile']['directories'][$key]['rmdir'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Remove subdirectories'),
|
||||
'#default_value' => isset($form_state['profile']['directories'][$key]['rmdir']) ? $form_state['profile']['directories'][$key]['rmdir'] : 0,
|
||||
);
|
||||
}
|
||||
$form['profile']['mkdirnum'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Maximum number of subdirectories'),
|
||||
'#default_value' => isset($form_state['profile']['mkdirnum']) ? $form_state['profile']['mkdirnum'] : 2,
|
||||
'#description' => t('This setting is applicable only if you allow subdirectory creation under any of the predefined directories. Define here the maximum number of subdirectories a directory can have. Setting this to 0 removes the limit and also allows infinite subdirectory depth.'),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mkdir form.
|
||||
*/
|
||||
function _imce_mkdir_form($form, &$form_state, &$imce) {
|
||||
$mkdir['html1']['#markup'] = '<div class="container-inline">';
|
||||
$mkdir['dirname'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Subdirectory name'),
|
||||
'#size' => 12,
|
||||
'#maxlength' => 255,
|
||||
);
|
||||
if (imce_perm_exists($imce, 'mkdir')) {
|
||||
$mkdir['mkdir'] = array(
|
||||
'#type' => 'submit',
|
||||
'#value' => t('Add'),
|
||||
'#submit' => $imce['perm']['mkdir'] ? array('imce_mkdir_submit') : NULL,
|
||||
);
|
||||
}
|
||||
if (imce_perm_exists($imce, 'rmdir')) {
|
||||
$mkdir['rmdir'] = array(
|
||||
'#type' => 'submit',
|
||||
'#value' => t('Remove'),
|
||||
'#submit' => $imce['perm']['rmdir'] ? array('imce_mkdir_rmdir_submit') : NULL,
|
||||
);
|
||||
}
|
||||
$mkdir['html2']['#markup'] = '</div>';
|
||||
$form['fset_mkdir'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Directory'),
|
||||
) + $mkdir;
|
||||
$form['#action'] = $imce['url'];
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Submits mkdir form.
|
||||
*/
|
||||
function imce_mkdir_submit($form, &$form_state) {
|
||||
$form_state['redirect'] = FALSE;
|
||||
$imce = &$form_state['build_info']['args'][0]['imce'];
|
||||
imce_mkdir_batch($imce, array(rawurldecode($form_state['values']['dirname'])));
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch adds directories.
|
||||
*/
|
||||
function imce_mkdir_batch(&$imce, $dirnames = array()) {
|
||||
if (!isset($imce['diradded'])) {
|
||||
$imce['diradded'] = array();
|
||||
}
|
||||
$parent = imce_dir_uri($imce);
|
||||
|
||||
foreach ($dirnames as $dirname) {
|
||||
if (!preg_match('/^[A-Za-z0-9_\-]+$/', $dirname)) {
|
||||
drupal_set_message(t('%dirname is not a valid directory name. It should contain only alphanumeric characters, hyphen and underscore.', array('%dirname' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
$dirpath = $parent . $dirname;
|
||||
|
||||
if (file_exists($dirpath)) {
|
||||
drupal_set_message(t('Subdirectory %dir already exists.', array('%dir' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!file_prepare_directory($dirpath, FILE_CREATE_DIRECTORY)) {
|
||||
drupal_set_message(t('Subdirectory %dir could not be created.', array('%dir' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
drupal_set_message(t('Subdirectory %dir has been added.', array('%dir' => $dirname)));
|
||||
$imce['diradded'][] = $imce['subdirectories'][] = $dirname;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Submits rmdir form.
|
||||
*/
|
||||
function imce_mkdir_rmdir_submit($form, &$form_state) {
|
||||
$form_state['redirect'] = FALSE;
|
||||
$imce = &$form_state['build_info']['args'][0]['imce'];
|
||||
imce_mkdir_rmdir_batch($imce, array(rawurldecode($form_state['values']['dirname'])));
|
||||
}
|
||||
|
||||
/**
|
||||
* Batch removes directories.
|
||||
*/
|
||||
function imce_mkdir_rmdir_batch(&$imce, $dirnames = array()) {
|
||||
if (!isset($imce['dirremoved'])) {
|
||||
$imce['dirremoved'] = array();
|
||||
}
|
||||
$parent = imce_dir_uri($imce);
|
||||
$prefix = ($imce['dir'] == '.' ? '' : $imce['dir'] . '/');
|
||||
|
||||
foreach ($dirnames as $dirname) {
|
||||
$index = array_search($dirname, $imce['subdirectories']);
|
||||
|
||||
if ($index === FALSE) {
|
||||
drupal_set_message(t('Subdirectory %dir does not exist.', array('%dir' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($imce['directories'][$prefix . $dirname])) {
|
||||
drupal_set_message(t('Subdirectory %dir is a predefined directory and can not be removed.', array('%dir' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
$dirpath = $parent . $dirname;
|
||||
if (!imce_mkdir_rmdir_recursive($dirpath)) {
|
||||
drupal_set_message(t('Subdirectory %dir could not be removed.', array('%dir' => $dirname)), 'error');
|
||||
continue;
|
||||
}
|
||||
|
||||
drupal_set_message(t('Subdirectory %dir has been removed.', array('%dir' => $dirname)));
|
||||
$imce['dirremoved'] = array_merge($imce['dirremoved'], array_splice($imce['subdirectories'], $index, 1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive directory deletion
|
||||
*/
|
||||
function imce_mkdir_rmdir_recursive($path) {
|
||||
static $dirlen;
|
||||
if (!isset($dirlen)) {
|
||||
$dirlen = strlen(file_uri_scheme($path)) + 3;
|
||||
}
|
||||
if (is_dir($path) && !is_link($path)) {
|
||||
if ($handle = @opendir($path)) {
|
||||
while (($file = readdir($handle)) !== FALSE) {
|
||||
if ($file == '.' || $file == '..') {
|
||||
continue;
|
||||
}
|
||||
$filepath = $path . '/' . $file;
|
||||
if (!imce_mkdir_rmdir_recursive($filepath)) {
|
||||
drupal_set_message(t('%path could not be removed.', array('%path' => substr($filepath, $dirlen))), 'error');
|
||||
break;
|
||||
}
|
||||
}
|
||||
closedir($handle);
|
||||
}
|
||||
return @rmdir($path);
|
||||
}
|
||||
return imce_delete_filepath($path);
|
||||
}
|
@@ -0,0 +1,13 @@
|
||||
name = "IMCE Mkdir"
|
||||
description = "Allows users manage directories in IMCE"
|
||||
core = "7.x"
|
||||
package = "Media"
|
||||
dependencies[] = "imce"
|
||||
|
||||
|
||||
; Information added by drupal.org packaging script on 2011-10-20
|
||||
version = "7.x-1.0"
|
||||
core = "7.x"
|
||||
project = "imce_mkdir"
|
||||
datestamp = "1319103332"
|
||||
|
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Installs, uninstalls IMCE Mkdir.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_install()
|
||||
*/
|
||||
function imce_mkdir_install() {
|
||||
// Update profiles. Add mkdir settings.
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
foreach ($profiles as $i => $profile) {
|
||||
foreach ($profile['directories'] as $j => $directory) {
|
||||
$profiles[$i]['directories'][$j]['mkdir'] = $i == 1 ? 1 : 0;
|
||||
$profiles[$i]['directories'][$j]['rmdir'] = $i == 1 ? 1 : 0;
|
||||
}
|
||||
$profiles[$i]['mkdirnum'] = $i == 1 ? 0 : 2;
|
||||
}
|
||||
variable_set('imce_profiles', $profiles);
|
||||
|
||||
// Register custom content function
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
$funcs['imce_mkdir_content'] = 1;
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
|
||||
// Register custom profile process
|
||||
$funcs = variable_get('imce_custom_process', array());
|
||||
$funcs['imce_mkdir_process_profile'] = 1;
|
||||
variable_set('imce_custom_process', $funcs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_uninstall().
|
||||
*/
|
||||
function imce_mkdir_uninstall() {
|
||||
// Update profiles. Delete mkdir settings.
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
foreach ($profiles as $i => $profile) {
|
||||
foreach ($profile['directories'] as $j => $directory) {
|
||||
unset($profiles[$i]['directories'][$j]['mkdir'], $profiles[$i]['directories'][$j]['rmdir']);
|
||||
}
|
||||
unset($profiles[$i]['mkdirnum']);
|
||||
}
|
||||
variable_set('imce_profiles', $profiles);
|
||||
|
||||
// Unregister custom content function
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
unset($funcs['imce_mkdir_content']);
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
|
||||
// Unregister custom profile process
|
||||
$funcs = variable_get('imce_custom_process', array());
|
||||
unset($funcs['imce_mkdir_process_profile']);
|
||||
variable_set('imce_custom_process', $funcs);
|
||||
}
|
165
sites/all/modules/contrib/files/imce/imce_mkdir/imce_mkdir.js
Normal file
@@ -0,0 +1,165 @@
|
||||
|
||||
(function($) {
|
||||
//add hook:load. process mkdir form
|
||||
imce.hooks.load.push(function () {
|
||||
if (!(imce.mkdirForm = imce.el('imce-mkdir-form'))) return;
|
||||
var form = $(imce.mkdirForm);
|
||||
//clean up fieldsets
|
||||
form.find('fieldset').each(function() {
|
||||
this.removeChild(this.firstChild);
|
||||
$(this).after(this.childNodes);
|
||||
}).remove();
|
||||
imce.mkdirOps = {};
|
||||
form.find('input:submit').each(function(i) {
|
||||
var dop = this.id.substr(5);
|
||||
$(imce.mkdirOps[dop] = this).click(function() {imce.dopSubmit(dop); return false;});
|
||||
});
|
||||
imce.opAdd({name: 'mngdir', title: Drupal.t('Directory'), content: form});
|
||||
imce.mkdirRefreshOps();
|
||||
//add hook:navigate. set dirops visibility
|
||||
imce.hooks.navigate.push(function (data, olddir, cached) {
|
||||
imce.mkdirRefreshOps();
|
||||
});
|
||||
// add subdir selector
|
||||
imce.mkdirSubSelector();
|
||||
});
|
||||
|
||||
//change dirops states.
|
||||
imce.mkdirRefreshOps = function () {
|
||||
var perm, func = 'opDisable';
|
||||
for (var op in imce.mkdirOps) {
|
||||
if (perm = imce.conf.perm[op]) func = 'opEnable';
|
||||
$(imce.mkdirOps[op])[perm ? 'show' : 'hide']();
|
||||
}
|
||||
imce[func]('mngdir');
|
||||
};
|
||||
|
||||
//successful mkdir
|
||||
imce.mkdirSuccess = function (response) {
|
||||
if (response.data) {
|
||||
if (response.data.diradded) imce.dirSubdirs(imce.conf.dir, response.data.diradded);
|
||||
if (response.data.dirremoved) imce.rmdirSubdirs(imce.conf.dir, response.data.dirremoved);
|
||||
imce.mkdirSSBuild && imce.mkdirSSBuild();
|
||||
}
|
||||
if (response.messages) imce.resMsgs(response.messages);
|
||||
};
|
||||
|
||||
//validate default dops(mkdir, rmdir)
|
||||
imce.dopValidate = function(dop) {
|
||||
var dirname = imce.el('edit-dirname').value, dir = imce.conf.dir, branch = imce.tree[dir], newdir = (dir == '.' ? '' : dir +'/') + dirname;
|
||||
switch (dop) {
|
||||
case 'mkdir':
|
||||
if (imce.conf.mkdirnum && branch.ul && branch.ul.childNodes.length >= imce.conf.mkdirnum) {
|
||||
return imce.setMessage(Drupal.t('You are not alllowed to create more than %num directories.', {'%num': imce.conf.mkdirnum}), 'error');
|
||||
}
|
||||
if (dirname.search(/^[A-Za-z0-9_\-]+$/) == -1) {
|
||||
return imce.setMessage(Drupal.t('%dirname is not a valid directory name. It should contain only alphanumeric characters, hyphen and underscore.', {'%dirname': dirname}), 'error');
|
||||
}
|
||||
if (imce.tree[newdir]) {
|
||||
return imce.setMessage(Drupal.t('Subdirectory %dir already exists.', {'%dir': dirname}), 'error');
|
||||
}
|
||||
return true;
|
||||
case 'rmdir':
|
||||
if (!imce.tree[newdir]) {
|
||||
return imce.setMessage(Drupal.t('Subdirectory %dir does not exist.', {'%dir': dirname}), 'error');
|
||||
}
|
||||
return confirm(Drupal.t('Are you sure want to delete this subdirectory with all directories and files in it?'));
|
||||
}
|
||||
|
||||
var func = dop +'DopValidate';
|
||||
if (imce[func]) return imce[func](dop);
|
||||
return true;
|
||||
};
|
||||
|
||||
//submit directory operations
|
||||
imce.dopSubmit = function(dop) {
|
||||
if (!imce.dopValidate(dop)) return false;
|
||||
var func = dop +'DopSubmit';
|
||||
if (imce[func]) return imce[func](dop);
|
||||
imce.fopLoading(dop, true);
|
||||
$.ajax(imce.dopSettings(dop));
|
||||
};
|
||||
|
||||
//ajax settings for directory operations
|
||||
imce.dopSettings = function (dop) {
|
||||
return {url: imce.ajaxURL(dop), type: 'POST', dataType: 'json', success: imce.mkdirSuccess, complete: function (response) {imce.fopLoading(dop, false); imce.mkdirForm.reset();}, data: $(imce.mkdirForm).serialize()};
|
||||
};
|
||||
|
||||
//remove subdirectories
|
||||
imce.rmdirSubdirs = function(dir, subdirs) {
|
||||
var branch = imce.tree[dir];
|
||||
if (branch.ul && subdirs && subdirs.length) {
|
||||
var prefix = dir == '.' ? '' : dir +'/';
|
||||
for (var i in subdirs) {
|
||||
var subdir = prefix + subdirs[i];
|
||||
if (imce.tree[subdir]) {
|
||||
$(imce.tree[subdir].li).remove();
|
||||
delete imce.tree[subdir];
|
||||
if (imce.cache[subdir]) {
|
||||
$(imce.cache[subdir].files).remove();
|
||||
delete imce.cache[subdir];
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!$('li', branch.ul).size()) {
|
||||
$(branch.ul).remove();
|
||||
$(branch.li).removeClass('expanded').addClass('leaf');
|
||||
delete branch.ul;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// visual sub directory selector
|
||||
imce.mkdirSubSelector = function () {
|
||||
var ie7 = $('html').is('.ie-7');
|
||||
var $inp = $(imce.el('edit-dirname'));
|
||||
// create selector
|
||||
var $subsel = $(imce.newEl('div')).attr({id: 'subdir-selector'}).css('display', 'none').appendTo(document.body);
|
||||
// create selector button
|
||||
var $button = $(imce.newEl('a')).attr({id: 'subdir-selector-button', href: '#'}).click(function() {
|
||||
var offset = $inp.offset();
|
||||
offset.top += $inp.outerHeight();
|
||||
$subsel.css(offset).slideDown('normal', itemfocus);
|
||||
$(document).mouseup(hide);
|
||||
ie7 && $subsel.css('width', 'auto') && $subsel.width($subsel[0].offsetWidth);
|
||||
return false;
|
||||
}).insertAfter($inp[0]);
|
||||
// focus on first subdir item
|
||||
var itemfocus = function(){$subsel.children().eq(0).focus()};
|
||||
// hide selector
|
||||
var hide = function(e){
|
||||
if (e.target != $subsel[0]) {
|
||||
$subsel.hide();
|
||||
$(document).unbind('mouseup', hide);
|
||||
}
|
||||
};
|
||||
// adjust newdir input
|
||||
var newdir = imce.el('edit-newdirname');
|
||||
newdir && $(newdir).css('marginRight', parseFloat($(newdir).css('marginRight')) + parseFloat($button.css('width')));
|
||||
// subdir click
|
||||
var subclick = function() {
|
||||
$inp.val(this.title.substr(this.title.lastIndexOf('/') + 1)).focus();
|
||||
$subsel.hide();
|
||||
return false;
|
||||
};
|
||||
// subdir process
|
||||
var subproc = function(i, a) {
|
||||
$(imce.newEl('a')).attr({href: '#', title: a.title}).html(a.innerHTML).click(subclick).appendTo($subsel[0]);
|
||||
};
|
||||
// navigation hook
|
||||
var navhook = imce.mkdirSSBuild = function() {
|
||||
var branch = imce.tree[imce.conf.dir];
|
||||
$subsel.empty();
|
||||
if (branch.ul && branch.ul.firstChild) {
|
||||
$(branch.ul).children('li').children('a').each(subproc);
|
||||
$button.css('visibility', 'visible');
|
||||
}
|
||||
else {
|
||||
$button.css('visibility', 'hidden');
|
||||
}
|
||||
};
|
||||
imce.hooks.navigate.push(navhook);
|
||||
navhook();
|
||||
};
|
||||
|
||||
})(jQuery);
|
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implements hook_form_formID_alter().
|
||||
*/
|
||||
function imce_mkdir_form_imce_profile_form_alter(&$form, &$form_state) {
|
||||
include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce_mkdir') . '/imce_mkdir.inc';
|
||||
return _imce_mkdir_form_imce_profile_form_alter($form, $form_state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom profile process. Redefines mkdir permission based on some other parameters.
|
||||
*/
|
||||
function imce_mkdir_process_profile(&$imce) {
|
||||
if (!$imce['error']) {
|
||||
$imce['mkdirnum'] = (int) $imce['mkdirnum'];
|
||||
$imce['perm']['mkdir'] = $imce['perm']['mkdir'] && (!$imce['mkdirnum'] || ($imce['direct'] && $imce['mkdirnum'] > count($imce['subdirectories'])));
|
||||
$imce['perm']['rmdir'] = $imce['perm']['rmdir'] && (!$imce['mkdirnum'] || $imce['direct']);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Custom content. Returns directory creation form
|
||||
*/
|
||||
function imce_mkdir_content(&$imce) {
|
||||
if (!$imce['error'] && (imce_perm_exists($imce, 'mkdir') || imce_perm_exists($imce, 'rmdir'))) {
|
||||
$path = drupal_get_path('module', 'imce_mkdir');
|
||||
drupal_add_js($path . '/imce_mkdir.js');
|
||||
drupal_add_css($path . '/imce_mkdir.css');
|
||||
$form = drupal_get_form('imce_mkdir_form', array('imce' => &$imce));
|
||||
return drupal_render($form);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mkdir form.
|
||||
*/
|
||||
function imce_mkdir_form($form, &$form_state, $ref) {
|
||||
$imce =& $ref['imce'];
|
||||
include_once DRUPAL_ROOT . '/' . drupal_get_path('module', 'imce_mkdir') . '/imce_mkdir.inc';
|
||||
return _imce_mkdir_form($form, $form_state, $imce);
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: mkdir
|
||||
*/
|
||||
function imce_js_mkdir(&$imce) {
|
||||
if ($imce['perm']['mkdir']) {
|
||||
$_POST['op'] = t('Add');
|
||||
drupal_get_form('imce_mkdir_form', array('imce' => &$imce));
|
||||
return array('diradded' => array_map('rawurlencode', $imce['diradded']));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: rmdir
|
||||
*/
|
||||
function imce_js_rmdir(&$imce) {
|
||||
if ($imce['perm']['rmdir']) {
|
||||
$_POST['op'] = t('Remove');
|
||||
drupal_get_form('imce_mkdir_form', array('imce' => &$imce));
|
||||
return array('dirremoved' => array_map('rawurlencode', $imce['dirremoved']));
|
||||
}
|
||||
}
|
274
sites/all/modules/contrib/files/imce/imce_rename/LICENSE.txt
Normal file
@@ -0,0 +1,274 @@
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc. 675 Mass Ave,
|
||||
Cambridge, MA 02139, 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 Library 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
|
@@ -0,0 +1,8 @@
|
||||
/* $Id: imce_rename.css,v 1.1 2010/10/19 08:57:42 aaron1234nz Exp $ */
|
||||
|
||||
#op-item-rename a, #imce-content #edit-rename {
|
||||
background-image: url(rename.png);
|
||||
/*For IMCE 1.x*/
|
||||
background-repeat: no-repeat;
|
||||
padding-left: 20px;
|
||||
}
|
@@ -0,0 +1,16 @@
|
||||
; $Id: imce_rename.info,v 1.1.4.1 2011/01/06 08:49:19 aaron1234nz Exp $
|
||||
name = "IMCE Rename"
|
||||
description = "Adds file and directory renaming functionality to IMCE"
|
||||
core = "7.x"
|
||||
package = "Media"
|
||||
dependencies[] = "imce"
|
||||
|
||||
files[] = "imce_rename.install"
|
||||
files[] = "imce_rename.module"
|
||||
|
||||
; Information added by drupal.org packaging script on 2011-01-06
|
||||
version = "7.x-1.2"
|
||||
core = "7.x"
|
||||
project = "imce_rename"
|
||||
datestamp = "1294306320"
|
||||
|
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
// $Id: imce_rename.install,v 1.2 2010/10/06 10:24:30 aaron1234nz Exp $
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Install file for imce_rename
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implementation of hook_install()
|
||||
*/
|
||||
function imce_rename_install() {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
//set crop permissions. make profile#1 have access by default.
|
||||
foreach ($profiles as $i => $profile) {
|
||||
foreach ($profile['directories'] as $j => $directory) {
|
||||
$profiles[$i]['directories'][$j]['rename'] = $i == 1 ? 1 : 0;
|
||||
}
|
||||
}
|
||||
variable_set('imce_profiles', $profiles);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_uninstall().
|
||||
*/
|
||||
function imce_rename_uninstall() {
|
||||
$profiles = variable_get('imce_profiles', array());
|
||||
//delete crop permissions.
|
||||
foreach ($profiles as $i => $profile) {
|
||||
foreach ($profile['directories'] as $j => $directory) {
|
||||
unset($profiles[$i]['directories'][$j]['rename']);
|
||||
}
|
||||
}
|
||||
variable_set('imce_profiles', $profiles);
|
||||
}
|
@@ -0,0 +1,43 @@
|
||||
//implementation of imce.hookOpSubmit
|
||||
imce.renameOpSubmit = function(dop) {
|
||||
if (imce.fopValidate('rename')) {
|
||||
imce.fopLoading('rename', true);
|
||||
jQuery.ajax(jQuery.extend(imce.fopSettings('rename'), {success: imce.renameResponse}));
|
||||
}
|
||||
};
|
||||
|
||||
//add hook.load
|
||||
imce.hooks.load.push(function() {
|
||||
//set click function for rename tab to toggle crop UI
|
||||
imce.ops['rename'].func = imce.renamePrepare;
|
||||
});
|
||||
|
||||
//populate the text box with the current file or dir name
|
||||
imce.renamePrepare = function(response) {
|
||||
var i = 0;
|
||||
for (var fid in imce.selected) {
|
||||
jQuery('#edit-new-name').val(unescape(imce.selected[fid].id));
|
||||
i++;
|
||||
}
|
||||
if (i == 0) {
|
||||
jQuery('#edit-new-name').val(unescape(imce.conf.dir));
|
||||
}
|
||||
if (i > 1) {
|
||||
imce.setMessage(Drupal.t('Only one file can be renamed at a time.'), 'error');
|
||||
setTimeout(function() {jQuery('#op-close-link').click();}, 5);
|
||||
}
|
||||
|
||||
//hack to make renaming of directories possible
|
||||
if (imce.selcount == 0) {
|
||||
imce.selcount = 1;
|
||||
imce.selected['__IS_DIR__'] = '__IS_DIR__';
|
||||
}
|
||||
};
|
||||
|
||||
//custom response. keep track of overwritten files.
|
||||
imce.renameResponse = function(response) {
|
||||
imce.processResponse(response);
|
||||
imce.vars.cache = false;
|
||||
imce.navigate('.'); //should be folder parent and only trigger when a dir is renamed.
|
||||
jQuery('#op-close-link').click(); //there is probably a better way to close the dialog than this.
|
||||
};
|
@@ -0,0 +1,147 @@
|
||||
<?php
|
||||
// $Id: imce_rename.module,v 1.5.2.1 2011/01/06 08:49:19 aaron1234nz Exp $
|
||||
|
||||
/**
|
||||
* Implementation of hook_form_FORMID_alter().
|
||||
*/
|
||||
function imce_rename_form_imce_fileop_form_alter(&$form, &$form_state, $form_id) {
|
||||
$imce = &$form_state['build_info']['args'][0]['imce'];
|
||||
if (imce_perm_exists($imce, 'rename')) {
|
||||
$form['fset_rename'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Rename'),
|
||||
) + imce_rename_form($imce);
|
||||
array_unshift($form['#validate'], 'imce_rename_prevalidate'); // Needed to override some validation when renaming folders
|
||||
drupal_add_js(drupal_get_path('module', 'imce_rename') .'/imce_rename.js');
|
||||
drupal_add_css(drupal_get_path('module', 'imce_rename') .'/imce_rename.css');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hook_form_FORMID_alter().
|
||||
*/
|
||||
function imce_rename_form_imce_profile_form_alter(&$form, &$form_state, $form_id) {
|
||||
foreach (element_children($form['profile']['directories']) as $key) {
|
||||
$form['profile']['directories'][$key]['rename'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Rename'),
|
||||
'#default_value' => isset($form_state['profile']['directories'][$key]['rename']) ? $form_state['profile']['directories'][$key]['rename'] : 0,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename form.
|
||||
*/
|
||||
function imce_rename_form(&$imce) {
|
||||
$form['new_name'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('New name'),
|
||||
'#size' => 40,
|
||||
'#prefix' => '<div class="container-inline">',
|
||||
);
|
||||
|
||||
$form['rename'] = array(
|
||||
'#type' => 'submit',
|
||||
'#value' => t('Rename'),
|
||||
'#submit' => $imce['perm']['rename'] ? array('imce_rename_submit') : NULL,//permission for submission
|
||||
'#suffix' => '</div>',
|
||||
);
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prevalidate function for altering the behavior of the imce_fileop_form_validate function
|
||||
* when renaming folders (ie no file selected)
|
||||
*/
|
||||
function imce_rename_prevalidate(&$form, &$form_state) {
|
||||
if ($form_state['values']['filenames'] == '__IS_DIR__') {
|
||||
$form_state['build_info']['args'][0]['imce']['files']['__IS_DIR__'] = '__IS_DIR__'; //add a fake file so that validation will pass
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Submit rename form.
|
||||
*/
|
||||
function imce_rename_submit($form, &$form_state) {
|
||||
$form_state['redirect'] = FALSE;
|
||||
$imce =& $form_state['build_info']['args'][0]['imce'];
|
||||
imce_process_files($form_state['values']['filenames'], $imce, 'imce_rename_callback', array($form_state['values']['new_name']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename a a file or a directory
|
||||
*/
|
||||
function imce_rename_callback($old_name, &$imce, $new_name) {
|
||||
if ($old_name == '__IS_DIR__') {
|
||||
$old_uri = imce_dir_uri($imce);
|
||||
$new_uri = $imce['scheme'] . '://' . $new_name .'/';
|
||||
imce_rename_dir($imce, $old_uri, $new_uri);
|
||||
}
|
||||
else {
|
||||
$extension = substr($old_name, -4);
|
||||
if (strtolower(substr($new_name, -4)) != strtolower($extension)) {
|
||||
$new_name .= $extension;
|
||||
}
|
||||
|
||||
$old_uri = imce_dir_uri($imce) . $old_name;
|
||||
$new_uri = imce_dir_uri($imce) . $new_name;
|
||||
|
||||
imce_rename_file($imce, $old_uri, $new_uri);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename a file
|
||||
*/
|
||||
function imce_rename_file(&$imce, $old_uri, $new_uri) {
|
||||
$result = db_query("SELECT f.* FROM {file_managed} f WHERE f.uri = :uri", array(':uri' => $old_uri));
|
||||
$file = $result->fetchObject();
|
||||
|
||||
$move = file_move($file, $new_uri, FILE_EXISTS_ERROR);
|
||||
|
||||
$file->uri = $new_uri;
|
||||
$file->filename = basename($file->uri);
|
||||
$img = imce_image_info($file->uri);
|
||||
$file->width = $img['width'];
|
||||
$file->height = $img['height'];
|
||||
|
||||
if ($move) {
|
||||
drupal_set_message(t('Rename successful! Renamed "@old_file" to "@new_file"', array('@old_file' => utf8_encode(basename($old_uri)), '@new_file' => utf8_encode(basename($new_uri)))));
|
||||
return $file;
|
||||
}
|
||||
else {
|
||||
drupal_set_message(t('Failed to rename file "@old_file" to "@new_file" because "@new_file" already exists', array('@old_file' => utf8_encode(basename($old_uri)), '@new_file' => utf8_encode(basename($new_uri)))));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Rename a directory
|
||||
*/
|
||||
function imce_rename_dir(&$imce, $old_uri, $new_uri) {
|
||||
$rename = @rename(drupal_realpath($old_uri), drupal_realpath($new_uri));
|
||||
if ($rename) {
|
||||
$result = db_query("SELECT f.* FROM {file_managed} f WHERE f.uri LIKE :old", array(':old' => $old_uri .'%'));
|
||||
foreach ($result as $file) {
|
||||
$file->uri = str_replace($old_uri, $new_uri, $file->uri);
|
||||
drupal_write_record('file_managed', $file, array('fid'));
|
||||
}
|
||||
|
||||
drupal_set_message(t('Rename successful! Renamed "@old_dir" to "@new_dir"', array('@old_dir' => utf8_encode($old_uri), '@new_dir' => utf8_encode($new_uri))));
|
||||
}
|
||||
else {
|
||||
drupal_set_message(t('Failed to rename directory "@old_dir" to "@new_dir"', array('@old_dir' => utf8_encode($old_uri), '@new_dir' => utf8_encode($new_uri))));
|
||||
}
|
||||
|
||||
return $file;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ajax operation: rename
|
||||
*/
|
||||
function imce_js_rename(&$imce) {
|
||||
if ($imce['perm']['rename']) {
|
||||
$_POST['op'] = t('Rename');
|
||||
return imce_process_fileop($imce);
|
||||
}
|
||||
}
|
BIN
sites/all/modules/contrib/files/imce/imce_rename/rename.png
Normal file
After Width: | Height: | Size: 397 B |
339
sites/all/modules/contrib/files/imce/imce_tools/LICENSE.txt
Normal file
@@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
@@ -0,0 +1,14 @@
|
||||
IMCE Directory Manager provides a function, imce_dir_man_path, that can
|
||||
be used with the directory specifications in IMCE profiles along with a
|
||||
management interface to control what the function returns on a user by
|
||||
user basis. It is useful when users need to be confined to directories
|
||||
on a user by user basis but the directory restrictions are not easily
|
||||
derived from user data.
|
||||
|
||||
To use, create an IMCE profile and specify
|
||||
'php: return imce_dir_man_path();' as the directory path the profile is
|
||||
allowed to edit. On page admin/settings/imce_dir_man configure which
|
||||
directories each user should be restricted to.
|
||||
|
||||
Access to configure directories users should be restricted to requires
|
||||
the "administer site configuration" permission.
|
@@ -0,0 +1,13 @@
|
||||
name = "IMCE Directory Manager"
|
||||
description = "Allows for per user management of directory restrictions in IMCE"
|
||||
package = "Media"
|
||||
core = 7.x
|
||||
configure = admin/config/media/imce_dir_man
|
||||
dependencies[] = imce
|
||||
|
||||
; Information added by drupal.org packaging script on 2012-10-30
|
||||
version = "7.x-1.1"
|
||||
core = "7.x"
|
||||
project = "imce_tools"
|
||||
datestamp = "1351598216"
|
||||
|
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Implements hook_schema()
|
||||
*/
|
||||
function imce_dir_man_schema() {
|
||||
$schema['imce_dir_man'] = array(
|
||||
'fields' => array(
|
||||
'uid' => array('type' => 'int', 'not null' => TRUE, 'description' => "User's {users}.uid."),
|
||||
'dir' => array('type' => 'varchar', 'not null' => TRUE, 'length' => '255', 'description' => 'Directory path restriction relative to site root'),
|
||||
),
|
||||
'primary key' => array('uid', 'dir'),
|
||||
);
|
||||
return $schema;
|
||||
}
|
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
/**
|
||||
* @file
|
||||
* imce_dir_man.module provides functions for managing configuration
|
||||
* determining what the imce_dir_man_path() function. This function can
|
||||
* be used as php code in the directory setting of an IMCE profile to
|
||||
* allow for per user configuration of directory restrictions
|
||||
*/
|
||||
|
||||
/**
|
||||
* hook menu
|
||||
*/
|
||||
function imce_dir_man_menu() {
|
||||
$menu['admin/config/media/imce_dir_man'] = array(
|
||||
'title' => 'IMCE User Directory Access Manager',
|
||||
'description' => 'Administer directory restrictions for IMCE',
|
||||
'page callback' => 'drupal_get_form',
|
||||
'page arguments' => array('imce_dir_man_form'),
|
||||
'access arguments' => array('administer site configuration'),
|
||||
);
|
||||
return $menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* generates admin form for managing user directory restrictions
|
||||
*/
|
||||
function imce_dir_man_form() {
|
||||
$query = db_select('imce_dir_man', 'i');
|
||||
$query->join('users', 'u', 'u.uid = i.uid');
|
||||
$res = $query->fields('i', array('uid', 'dir'))
|
||||
->fields('u', array('name'))
|
||||
->orderBy('name')
|
||||
->execute();
|
||||
|
||||
$weight = 1;
|
||||
foreach ($res as $row) {
|
||||
$form[$row->uid] = array(
|
||||
'#title' => t('User @name', array('@name' => $row->name)),
|
||||
'#type' => 'fieldset',
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
'#tree' => TRUE,
|
||||
'#weight' => $weight++,
|
||||
);
|
||||
$form[$row->uid]['del'] = array(
|
||||
'#title' => t('Remove restrictions'),
|
||||
'#description' => t('Deletes restrictions set for this user'),
|
||||
'#type' => 'checkbox',
|
||||
'#weight' => 10,
|
||||
);
|
||||
$form[$row->uid]['dir'] = array(
|
||||
'#title' => t('Directory'),
|
||||
'#description' => t('Directory to restrict user to relative to site file upload root, comma separate to specify multiple directories, a/b/c restricts a user to !root/a/b/c', array('!root' => variable_get('file_public_path', conf_path() . '/files'))),
|
||||
'#type' => 'textfield',
|
||||
'#size' => '100',
|
||||
'#maxsize' => '255',
|
||||
'#default_value' => $row->dir,
|
||||
'#weight' => 20,
|
||||
);
|
||||
}
|
||||
|
||||
$form['new_user'] = array(
|
||||
'#title' => t('Add restriction for new user'),
|
||||
'#type' => 'fieldset',
|
||||
'#tree' => TRUE,
|
||||
'#weight' => $weight++,
|
||||
);
|
||||
$form['new_user']['name'] = array(
|
||||
'#title' => t('User'),
|
||||
'#type' => 'textfield',
|
||||
'#size' => '100',
|
||||
'#maxsize' => '255',
|
||||
'#weight' => 10,
|
||||
);
|
||||
$form['new_user']['dir'] = array(
|
||||
'#title' => t('Directory'),
|
||||
'#type' => 'textfield',
|
||||
'#description' => t('Directory to restrict user to relative to site file upload root, comma separate to specify multiple directories, a/b/c restricts a user to sites/default/files/a/b/c'),
|
||||
'#size' => '100',
|
||||
'#maxsize' => '255',
|
||||
'#weight' => 20,
|
||||
);
|
||||
|
||||
$form['submit'] = array(
|
||||
'#type' => 'submit',
|
||||
'#value' => 'Save',
|
||||
'#weight' => $weight,
|
||||
);
|
||||
$form['#submit'] = array('imce_dir_man_form_submit');
|
||||
$form['#validate'] = array('imce_dir_man_form_validate');
|
||||
|
||||
return $form;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate restriction form (imce_dir_man_form) settings
|
||||
*/
|
||||
function imce_dir_man_form_validate($form, &$form_state) {
|
||||
foreach ($form_state['values'] as $uid => $data) {
|
||||
$data['dir'] = trim($data['dir'], ',');
|
||||
if ($data['dir'] == '' && (isset($data['del']) && $data['del'] != 1) && $data['name'] != '') {
|
||||
form_set_error($uid . '][dir', t('Invalid directory restriction (blank or contains only commas)'));
|
||||
}
|
||||
else if ($uid == 'new_user' && $data['name'] != '') {
|
||||
$uid = db_select('users', 'u')
|
||||
->fields('u', array('uid'))
|
||||
->condition('name', $data['name'])
|
||||
->execute()
|
||||
->fetchCol();
|
||||
if (!$uid) {
|
||||
form_set_error($uid . '][name', t('Invalid user'));
|
||||
}
|
||||
else {
|
||||
$uid = db_select('imce_dir_man', 'i')
|
||||
->fields('i', array('uid'))
|
||||
->condition('uid', $uid[0])
|
||||
->execute()
|
||||
->fetchCol();
|
||||
if ($uid) {
|
||||
form_set_error($uid . '][name', t('User @name already has restriction configured, please update their entry to make modifications', array('@name' => $data['name'])));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save configured restriction settings adding new settings,
|
||||
* updating or deleting existing settings
|
||||
*/
|
||||
function imce_dir_man_form_submit($form, &$form_state) {
|
||||
$rec = new stdclass();
|
||||
|
||||
foreach ($form_state['values'] as $uid => $data) {
|
||||
$rec->dir = trim($data['dir'], ',');
|
||||
$rec->uid = $uid;
|
||||
|
||||
if ($uid == 'new_user' && $data['name'] != '' && $data['dir'] != '') {
|
||||
$uid = db_select('users', 'u')
|
||||
->fields('u', array('uid'))
|
||||
->condition('name', $data['name'])
|
||||
->execute()
|
||||
->fetchCol();
|
||||
|
||||
if ($uid) {
|
||||
$rec->uid = $uid[0];
|
||||
drupal_write_record('imce_dir_man', $rec);
|
||||
}
|
||||
}
|
||||
else if (isset($data['del']) && $data['del']) {
|
||||
db_delete('imce_dir_man')->condition('uid', $uid)->execute();
|
||||
}
|
||||
else {
|
||||
drupal_write_record('imce_dir_man', $rec, array('uid'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* returns an array representing a user's currently accessible file directories
|
||||
* used by the imce uploader
|
||||
* If a user has not been restricted in the configuration, . (all directories)
|
||||
* is returned
|
||||
*/
|
||||
function imce_dir_man_path() {
|
||||
global $user;
|
||||
$dir = db_select('imce_dir_man', 'i')
|
||||
->fields('i', array('dir'))
|
||||
->condition('uid', $user->uid)
|
||||
->execute()
|
||||
->fetchCol();
|
||||
|
||||
if (!$dir || !$dir[0]) {
|
||||
$dir[0] = '.';
|
||||
}
|
||||
return preg_split('/,/', $dir[0]);
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
IMCE File Path provides a status bar like path within the IMCE file
|
||||
manager. To use enable the module and the status bar area will
|
||||
appear, no configuration is necessary.
|
@@ -0,0 +1,7 @@
|
||||
#imce-file-path {
|
||||
background-color: #c5d5ff;
|
||||
border-bottom: 1px solid #666;
|
||||
font-size: .9em;
|
||||
font-weight: bold;
|
||||
padding: .5em .5em;
|
||||
}
|
@@ -0,0 +1,12 @@
|
||||
name = IMCE File Path
|
||||
description = Provides a status bar like interface for displaying the file path of the currently selected file
|
||||
core = 7.x
|
||||
package = Media
|
||||
dependencies[] = imce
|
||||
|
||||
; Information added by drupal.org packaging script on 2012-10-30
|
||||
version = "7.x-1.1"
|
||||
core = "7.x"
|
||||
project = "imce_tools"
|
||||
datestamp = "1351598216"
|
||||
|
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* hook_enable - let imce know we have custom content
|
||||
*/
|
||||
function imce_file_path_enable() {
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
$funcs['imce_file_path_content'] = 1;
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
}
|
||||
|
||||
/**
|
||||
* hook_disable - remove our custom content registration with imce
|
||||
*/
|
||||
function imce_file_path_disable() {
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
unset($funcs['imce_file_path_content']);
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
}
|
@@ -0,0 +1,18 @@
|
||||
/* add a status bar div to the preview window, override imce setPreview to set status bar value and then call previous handler */
|
||||
imce.hooks.load.push(function() {
|
||||
jQuery('#preview-wrapper').prepend('<div id="imce-file-path"><span></span></div>');
|
||||
var prevHandler = imce.setPreview;
|
||||
imce.setPreview = function(fid) {
|
||||
if (fid) {
|
||||
jQuery("#imce-file-path span").html(Drupal.t('File URL path: ') + imce.getURL(fid));
|
||||
}
|
||||
else {
|
||||
jQuery("#imce-file-path span").html('');
|
||||
}
|
||||
prevHandler(fid);
|
||||
};
|
||||
});
|
||||
|
||||
imce.hooks.navigate.push(function($) {
|
||||
jQuery("#imce-file-path span").html('');
|
||||
});
|
@@ -0,0 +1,9 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* registered callback for imce
|
||||
*/
|
||||
function imce_file_path_content(&$imce) {
|
||||
drupal_add_css(drupal_get_path('module', 'imce_file_path') . '/imce_file_path.css');
|
||||
drupal_add_js(drupal_get_path('module', 'imce_file_path') . '/imce_file_path.js');
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
IMCE Search provides a search tab for the IMCE file manager which
|
||||
allows users to search for files listed in the files table. To use
|
||||
enable the module, no configuration is necessary.
|
@@ -0,0 +1,13 @@
|
||||
#imce-search-results div {
|
||||
font-weight: bold;
|
||||
margin: 1em;
|
||||
}
|
||||
|
||||
#imce-search-results div a {
|
||||
color: #69c;
|
||||
}
|
||||
|
||||
#imce-search-results div.loading {
|
||||
background: url('loading.gif') no-repeat top left;
|
||||
padding-left: 20px;
|
||||
}
|
@@ -0,0 +1,12 @@
|
||||
name = IMCE Search
|
||||
description = Provides an autocomplete search box for finding files through the IMCE browser
|
||||
core = 7.x
|
||||
package = Media
|
||||
dependencies[] = imce
|
||||
|
||||
; Information added by drupal.org packaging script on 2012-10-30
|
||||
version = "7.x-1.1"
|
||||
core = "7.x"
|
||||
project = "imce_tools"
|
||||
datestamp = "1351598216"
|
||||
|
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* hook_enable - let imce know we have custom content
|
||||
*/
|
||||
function imce_search_enable() {
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
$funcs['imce_search_content'] = 1;
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
}
|
||||
|
||||
/**
|
||||
* hook_disable - remove our custom content registration with imce
|
||||
*/
|
||||
function imce_search_disable() {
|
||||
$funcs = variable_get('imce_custom_content', array());
|
||||
unset($funcs['imce_search_content']);
|
||||
variable_set('imce_custom_content', $funcs);
|
||||
}
|
@@ -0,0 +1,55 @@
|
||||
imce.hooks.load.push(function() {
|
||||
imce.opAdd({
|
||||
name : 'search',
|
||||
title : 'Search',
|
||||
content : jQuery('#imce-search-form')
|
||||
});
|
||||
jQuery('#imce-search-form').submit(function() {
|
||||
jQuery('#imce-search-results div').html('Searching ' + ((imce.conf.dir == '.') ? 'all ' : imce.conf.dir + ' and sub') +'directories for ' + jQuery('#edit-imce-search-term').val());
|
||||
jQuery('#imce-search-results div').addClass('loading');
|
||||
var case_insensitive = 0;
|
||||
jQuery('#edit-imce-search-case:checked').each(function() { case_insensitive = 1; });
|
||||
jQuery.ajax({
|
||||
url: Drupal.settings.basePath + 'imce_search_callback/' + case_insensitive + '/' + encodeURI(imce.conf.dir + '/' + jQuery('#edit-imce-search-term').val()),
|
||||
type: 'GET',
|
||||
success: function(serverdata, status, xmlhttp) {
|
||||
data = eval('(' + serverdata + ')');
|
||||
var filelist = jQuery.map(data.files, function(fullpath, index) {
|
||||
var li = document.createElement('li');
|
||||
/*jQuery(li).click(function () {
|
||||
file = fullpath.substr(fullpath.lastIndexOf('/') + 1);
|
||||
dir = fullpath.substr(0, fullpath.lastIndexOf('/'));
|
||||
imce.dirActivate(dir);
|
||||
imce.highlight(file);
|
||||
});*/
|
||||
if (index > 10) {
|
||||
jQuery(li).addClass('toggle');
|
||||
}
|
||||
jQuery(li).html(fullpath);
|
||||
return li;
|
||||
});
|
||||
jQuery('#imce-search-results ul').hide();
|
||||
jQuery('#imce-search-results ul').empty().append(filelist);
|
||||
jQuery('#imce-search-results ul li[class="toggle"]').hide();
|
||||
jQuery('#imce-search-results ul').show();
|
||||
jQuery('#imce-search-results div').html(data.search + '. ' + data.files.length + ' results found. ');
|
||||
if (data.files.length > 10) {
|
||||
var toggle = document.createElement('a');
|
||||
jQuery(toggle).append('Show all');
|
||||
jQuery(toggle).toggle(function () {
|
||||
jQuery(this).html('Short list');
|
||||
jQuery('#imce-search-results ul li[class*="toggle"]').show();
|
||||
},
|
||||
function () {
|
||||
jQuery(this).html('Show all');
|
||||
jQuery('#imce-search-results ul li[class*="toggle"]').hide();
|
||||
}
|
||||
);
|
||||
jQuery('#imce-search-results div').append(toggle);
|
||||
}
|
||||
jQuery('#imce-search-results div').removeClass('loading');
|
||||
}
|
||||
});
|
||||
return false;
|
||||
});
|
||||
});
|
@@ -0,0 +1,83 @@
|
||||
<?php //$Id$
|
||||
|
||||
/**
|
||||
* hook_menu implementation, defines imce_swfupload path for handling file
|
||||
* uploads
|
||||
*/
|
||||
function imce_search_menu() {
|
||||
$menu['imce_search_callback'] = array(
|
||||
'title' => 'IMCE Search Callback',
|
||||
'type' => MENU_CALLBACK,
|
||||
'page callback' => 'imce_search_callback',
|
||||
'access callback' => 'imce_access',
|
||||
);
|
||||
return $menu;
|
||||
}
|
||||
|
||||
function imce_search_callback() {
|
||||
$path_parts = explode('/', $_GET['q']);
|
||||
array_shift($path_parts); // get rid of callback dir
|
||||
$case_insensitive = array_shift($path_parts);
|
||||
$file_string = array_pop($path_parts);
|
||||
$dir_base = join('/', $path_parts);
|
||||
$query_args = array();
|
||||
if ($file_string) {
|
||||
$query = db_select('file_managed', 'f', array('target' => 'slave'));
|
||||
$query->fields('f', array('uri'));
|
||||
if ($case_insensitive) {
|
||||
$query->where('LOWER(f.filename) LIKE (:fname)', array(':fname' => '%' . drupal_strtolower($file_string) . '%'));
|
||||
}
|
||||
else {
|
||||
$query->condition('f.filename', '%' . $file_string . '%', 'LIKE');
|
||||
}
|
||||
if ($dir_base) {
|
||||
$query->condition('uri', '%//%' . $dir_base . '%' , 'LIKE');
|
||||
}
|
||||
$suggestions['search'] = 'Searched ' . ($dir_base ? check_plain($dir_base) . ' and sub' : ' all ') . 'directories for ' . check_plain($file_string);
|
||||
$suggestions['files'] = array();
|
||||
$res = $query->execute();
|
||||
foreach ($res as $row) {
|
||||
$suggestions['files'][] = file_uri_target($row->uri);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$suggestions['search'] = 'Invalid search criteria, please specify a search';
|
||||
$suggestions['files'] = array();
|
||||
}
|
||||
echo drupal_json_encode($suggestions);
|
||||
exit;
|
||||
}
|
||||
|
||||
function imce_search_form($form, &$form_state) {
|
||||
$form['imce-search-term'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Search'),
|
||||
'#description' => t('Search for files in current directory and subdirectories'),
|
||||
'#size' => 25,
|
||||
);
|
||||
$form['imce-search-case'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Case insensitive'),
|
||||
'#description' => t('This option may have no effect depending on your database configuration'),
|
||||
'#default_value' => 0,
|
||||
);
|
||||
$form['imce-search-button'] = array(
|
||||
'#type' => 'button',
|
||||
'#value' => t('Search'),
|
||||
);
|
||||
$form['imce-search-results'] = array(
|
||||
'#markup' => '<div id="imce-search-results"><div></div><ul></ul></div>',
|
||||
);
|
||||
return ($form);
|
||||
}
|
||||
|
||||
/**
|
||||
* provide form content to imce, registered function for callback
|
||||
*/
|
||||
function imce_search_content(&$imce) {
|
||||
drupal_add_css(drupal_get_path('module', 'imce_search') . '/imce_search.css');
|
||||
drupal_add_js(drupal_get_path('module', 'imce_search') . '/imce_search.js');
|
||||
$form = drupal_get_form('imce_search_form');
|
||||
return drupal_render($form);
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,25 @@
|
||||
|
||||
IMCE Wysiwyg 7.x-1.x, xxxx-xx-xx
|
||||
--------------------------------
|
||||
|
||||
|
||||
IMCE Wysiwyg 7.x-1.0, 2011-10-05
|
||||
--------------------------------
|
||||
#670818 by Onopoc: Fixed port to Drupal 7.
|
||||
#670818 by sun: Ported to Drupal 7.
|
||||
|
||||
|
||||
IMCE Wysiwyg 6.x-1.x, xxxx-xx-xx
|
||||
--------------------------------
|
||||
#533168 by suhock, that0n3guy, Niels Hackius: Added support for CKeditor.
|
||||
#508180 by joachim: Added mention to README of needing Image plugin enabled.
|
||||
|
||||
|
||||
IMCE Wysiwyg 6.x-1.0, 2009-03-04
|
||||
--------------------------------
|
||||
#380944 by sun: Fixed url encoding for FCKeditor and proper invocation of
|
||||
imce_access().
|
||||
#380944 by sun: Added documentation; code clean-up.
|
||||
#287025 by sun: Added Wysiwyg API integration code for IMCE.
|
||||
|
||||
|
339
sites/all/modules/contrib/files/imce/imce_wysiwyg/LICENSE.txt
Normal file
@@ -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.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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.
|
||||
|
||||
<signature of Ty Coon>, 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.
|
56
sites/all/modules/contrib/files/imce/imce_wysiwyg/README.txt
Normal file
@@ -0,0 +1,56 @@
|
||||
|
||||
-- SUMMARY --
|
||||
|
||||
This module is acts as a bridge between the IMCE module and the Wysiwyg API
|
||||
module.
|
||||
|
||||
For a full description of the module, visit the project page:
|
||||
http://drupal.org/project/imce_wysiwyg
|
||||
|
||||
To submit bug reports and feature suggestions, or to track changes:
|
||||
http://drupal.org/project/issues/imce_wysiwyg
|
||||
|
||||
|
||||
-- REQUIREMENTS --
|
||||
|
||||
* IMCE
|
||||
|
||||
* Wysiwyg API
|
||||
|
||||
|
||||
-- INSTALLATION --
|
||||
|
||||
* Install as usual, see http://drupal.org/node/70151 for further information.
|
||||
|
||||
|
||||
-- CONFIGURATION --
|
||||
|
||||
* Enable the Image button (as IMCE is accessed from the Image plugin).
|
||||
|
||||
* Enable the IMCE plugin in the plugins/buttons configuration of the wysiwyg
|
||||
profiles of your choice.
|
||||
|
||||
|
||||
-- USAGE --
|
||||
|
||||
* Please consult the documentation of IMCE for further information. This is
|
||||
just an integration module.
|
||||
|
||||
|
||||
-- TROUBLESHOOTING --
|
||||
|
||||
* No known issues yet.
|
||||
|
||||
|
||||
-- FAQ --
|
||||
|
||||
* No known issues yet.
|
||||
|
||||
|
||||
-- CONTACT --
|
||||
|
||||
Current maintainers:
|
||||
* Aaron Hawkins - http://drupal.org/user/128806
|
||||
* Daniel F. Kudwien (sun) - http://drupal.org/user/54136
|
||||
|
||||
|
@@ -0,0 +1,13 @@
|
||||
name = IMCE Wysiwyg API bridge
|
||||
description = Makes IMCE available as plugin for client-side editors integrated via Wysiwyg API.
|
||||
package = User interface
|
||||
core = 7.x
|
||||
dependencies[] = imce
|
||||
dependencies[] = wysiwyg
|
||||
|
||||
; Information added by drupal.org packaging script on 2011-10-05
|
||||
version = "7.x-1.0"
|
||||
core = "7.x"
|
||||
project = "imce_wysiwyg"
|
||||
datestamp = "1317851503"
|
||||
|
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Makes IMCE available as plugin for client-side editors integrated via
|
||||
* Wysiwyg API.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_wysiwyg_plugin().
|
||||
*/
|
||||
function imce_wysiwyg_plugin($editor, $version) {
|
||||
static $integrated = array();
|
||||
|
||||
if (!module_invoke('imce', 'access')) {
|
||||
return;
|
||||
}
|
||||
// Load our invocation scripts.
|
||||
if (empty($integrated)) {
|
||||
$imcepath = drupal_get_path('module', 'imce');
|
||||
$path = drupal_get_path('module', 'imce_wysiwyg');
|
||||
drupal_add_js($imcepath . '/js/imce.js');
|
||||
drupal_add_js($imcepath . '/js/imce_set_app.js');
|
||||
drupal_add_js($path . '/js/imce_wysiwyg.js');
|
||||
}
|
||||
|
||||
switch ($editor) {
|
||||
case 'tinymce':
|
||||
if (!isset($integrated[$editor])) {
|
||||
$integrated[$editor] = TRUE;
|
||||
// @todo If some other editor also needs the URL to be passed via
|
||||
// Drupal.settings.imce, then we need another sub-key '$editor'.
|
||||
$settings = array(
|
||||
'imce' => array('url' => url('imce', array('query' => array('app' => $editor . '|url@')))),
|
||||
);
|
||||
drupal_add_js($settings, 'setting');
|
||||
}
|
||||
return array(
|
||||
'imce' => array(
|
||||
'extensions' => array('imce' => t('IMCE')),
|
||||
'url' => 'http://drupal.org/project/imce',
|
||||
'options' => array(
|
||||
'file_browser_callback' => 'imceImageBrowser',
|
||||
'inline_styles' => TRUE,
|
||||
),
|
||||
'load' => FALSE,
|
||||
),
|
||||
);
|
||||
|
||||
case 'ckeditor':
|
||||
$integrated[$editor] = TRUE;
|
||||
return array(
|
||||
'imce' => array(
|
||||
'extensions' => array('imce' => t('IMCE')),
|
||||
'url' => 'http://drupal.org/project/imce',
|
||||
'options' => array(
|
||||
'filebrowserBrowseUrl' => url('imce', array('query' => array('app' => $editor . '|sendto@imceCkeditSendTo|params@'))),
|
||||
),
|
||||
'load' => FALSE,
|
||||
),
|
||||
);
|
||||
|
||||
case 'fckeditor':
|
||||
$integrated[$editor] = TRUE;
|
||||
return array(
|
||||
'imce' => array(
|
||||
'extensions' => array('imce' => t('IMCE')),
|
||||
'url' => 'http://drupal.org/project/imce',
|
||||
'options' => array(
|
||||
'LinkBrowser' => TRUE,
|
||||
'LinkBrowserURL' => url('imce', array('query' => array('app' => $editor . '|url@txtUrl'))),
|
||||
'ImageBrowser' => TRUE,
|
||||
'ImageBrowserURL' => url('imce', array('query' => array('app' => $editor . '|url@txtUrl|width@txtWidth|height@txtHeight'))),
|
||||
'FlashBrowser' => TRUE,
|
||||
'FlashBrowserURL' => url('imce', array('query' => array('app' => $editor . '|url@txtUrl'))),
|
||||
),
|
||||
'load' => FALSE,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,24 @@
|
||||
|
||||
/**
|
||||
* Wysiwyg API integration helper function.
|
||||
*/
|
||||
function imceImageBrowser(field_name, url, type, win) {
|
||||
// TinyMCE.
|
||||
if (win !== 'undefined') {
|
||||
win.open(Drupal.settings.imce.url + encodeURIComponent(field_name), '', 'width=760,height=560,resizable=1');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* CKeditor integration.
|
||||
*/
|
||||
var imceCkeditSendTo = function (file, win) {
|
||||
var parts = /\?(?:.*&)?CKEditorFuncNum=(\d+)(?:&|$)/.exec(win.location.href);
|
||||
if (parts && parts.length > 1) {
|
||||
CKEDITOR.tools.callFunction(parts[1], file.url);
|
||||
win.close();
|
||||
}
|
||||
else {
|
||||
throw 'CKEditorFuncNum parameter not found or invalid: ' + win.location.href;
|
||||
}
|
||||
};
|