hq_1980@hotmail.com пре 7 година
родитељ
комит
afe32eb27a
100 измењених фајлова са 4190 додато и 0 уклоњено
  1. 5 0
      o2web/.gitignore
  2. 661 0
      o2web/COPYING
  3. 179 0
      o2web/README.md
  4. 362 0
      o2web/gulpfile.js
  5. 26 0
      o2web/karma.conf.js
  6. 44 0
      o2web/package.json
  7. BIN
      o2web/source/favicon.ico
  8. 10 0
      o2web/source/index.html
  9. 28 0
      o2web/source/o2_core/compatible.js
  10. 454 0
      o2web/source/o2_core/o2.js
  11. 133 0
      o2web/source/o2_core/o2/ie_adapter.js
  12. 366 0
      o2web/source/o2_core/o2/lp/zh-cn.js
  13. 340 0
      o2web/source/o2_core/o2/o2.core.js
  14. 628 0
      o2web/source/o2_core/o2/o2.more.js
  15. 112 0
      o2web/source/o2_core/o2/widget/$Arraylist/default/css.wcss
  16. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add.png
  17. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add2.png
  18. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add3.png
  19. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/delete.png
  20. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/delete3.png
  21. BIN
      o2web/source/o2_core/o2/widget/$Arraylist/default/icon/error.png
  22. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/bg.png
  23. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/buttonbg.png
  24. 397 0
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/css.wcss
  25. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/createFolder.png
  26. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/createFolder_gray.png
  27. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/delete.png
  28. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/delete_gray.png
  29. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/download.png
  30. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/downloadAll.png
  31. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/downloadAll_gray.png
  32. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/download_gray.png
  33. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/icon.png
  34. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/icon_gray.png
  35. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/list.png
  36. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/list_gray.png
  37. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/max.png
  38. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/max_gray.png
  39. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/min.png
  40. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/min_gray.png
  41. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/preview.png
  42. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/preview_gray.png
  43. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename.png
  44. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_1.png
  45. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_1_gray.png
  46. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_gray.png
  47. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/replace.png
  48. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/replace_gray.png
  49. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/send.png
  50. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/send_gray.png
  51. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/seq.png
  52. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/seq_gray.png
  53. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/share.png
  54. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/share_gray.png
  55. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/upload.png
  56. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/upload_gray.png
  57. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/overbg.png
  58. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/cms/selectedbg.png
  59. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/bg.png
  60. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/buttonbg.png
  61. 445 0
      o2web/source/o2_core/o2/widget/$AttachmentController/default/css.wcss
  62. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/closeOffice.png
  63. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/closeOffice_gray.png
  64. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/createFolder.png
  65. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/createFolder_gray.png
  66. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/delete.png
  67. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/delete_gray.png
  68. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/download.png
  69. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/downloadAll.png
  70. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/downloadAll_gray.png
  71. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/download_gray.png
  72. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/icon.png
  73. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/icon_gray.png
  74. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/list.png
  75. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/list_gray.png
  76. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/max.png
  77. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/max_gray.png
  78. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/min.png
  79. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/min_gray.png
  80. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/office.png
  81. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/office_gray.png
  82. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/preview.png
  83. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/preview_gray.png
  84. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/property.png
  85. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/property_gray.png
  86. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename.png
  87. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_1.png
  88. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_1_gray.png
  89. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_gray.png
  90. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/replace.png
  91. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/replace_gray.png
  92. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/send.png
  93. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/send_gray.png
  94. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/seq.png
  95. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/seq_gray.png
  96. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/share.png
  97. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/share_gray.png
  98. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/upload.png
  99. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/upload_gray.png
  100. BIN
      o2web/source/o2_core/o2/widget/$AttachmentController/default/overbg.png

+ 5 - 0
o2web/.gitignore

@@ -0,0 +1,5 @@
+/.idea/
+/dest/
+/node_modules/
+npm-debug.log
+/.svn/

+ 661 - 0
o2web/COPYING

@@ -0,0 +1,661 @@
+                    GNU AFFERO GENERAL PUBLIC LICENSE
+                       Version 3, 19 November 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU Affero General Public License is a free, copyleft license for
+software and other kinds of works, specifically designed to ensure
+cooperation with the community in the case of network server software.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+our General Public Licenses are intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.
+
+  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
+them 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.
+
+  Developers that use our General Public Licenses protect your rights
+with two steps: (1) assert copyright on the software, and (2) offer
+you this License which gives you legal permission to copy, distribute
+and/or modify the software.
+
+  A secondary benefit of defending all users' freedom is that
+improvements made in alternate versions of the program, if they
+receive widespread use, become available for other developers to
+incorporate.  Many developers of free software are heartened and
+encouraged by the resulting cooperation.  However, in the case of
+software used on network servers, this result may fail to come about.
+The GNU General Public License permits making a modified version and
+letting the public access it on a server without ever releasing its
+source code to the public.
+
+  The GNU Affero General Public License is designed specifically to
+ensure that, in such cases, the modified source code becomes available
+to the community.  It requires the operator of a network server to
+provide the source code of the modified version running there to the
+users of that server.  Therefore, public use of a modified version, on
+a publicly accessible server, gives the public access to the source
+code of the modified version.
+
+  An older license, called the Affero General Public License and
+published by Affero, was designed to accomplish similar goals.  This is
+a different license, not a version of the Affero GPL, but Affero has
+released a new version of the Affero GPL which permits relicensing under
+this license.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU Affero General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey 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;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If 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 convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Remote Network Interaction; Use with the GNU General Public License.
+
+  Notwithstanding any other provision of this License, if you modify the
+Program, your modified version must prominently offer all users
+interacting with it remotely through a computer network (if your version
+supports such interaction) an opportunity to receive the Corresponding
+Source of your version by providing access to the Corresponding Source
+from a network server at no charge, through some standard or customary
+means of facilitating copying of software.  This Corresponding Source
+shall include the Corresponding Source for any work covered by version 3
+of the GNU General Public License that is incorporated pursuant to the
+following paragraph.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the work with which it is combined will remain governed by version
+3 of the GNU General Public License.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU Affero 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 that a certain numbered version of the GNU Affero General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU Affero General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU Affero General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  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.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+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.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     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
+state 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 Affero General Public License as published by
+    the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+
+    You should have received a copy of the GNU Affero General Public License
+    along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If your software can interact with users remotely through a computer
+network, you should also make sure that it provides a way for users to
+get its source.  For example, if your program is a web application, its
+interface could display a "Source" link that leads users to an archive
+of the code.  There are many ways you could offer source, and different
+solutions will be better for different programs; see section 13 for the
+specific requirements.
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU AGPL, see
+<https://www.gnu.org/licenses/>.

+ 179 - 0
o2web/README.md

@@ -0,0 +1,179 @@
+# O2OA Web
+
+[![Build Status](https://travis-ci.com/huqi1980/o2oa_client_web.svg?branch=master)](https://travis-ci.org/huqi1980/o2oa_client_web)
+[![codecov](https://codecov.io/gh/huqi1980/o2oa_client_web/branch/master/graph/badge.svg)](https://codecov.io/gh/huqi1980/o2oa_client_web)
+[![AGPL](https://img.shields.io/badge/license-AGPL-blue.svg)](https://github.com/huqi1980/o2oa_client_web)
+[![code-size](https://img.shields.io/github/languages/code-size/badges/shields.svg)](https://github.com/huqi1980/o2oa_client_web)
+[![last-commit](https://img.shields.io/github/last-commit/google/skia.svg)](https://github.com/huqi1980/o2oa_client_web)
+---
+O2OA
+==========
+## 简介
+O2OA 是一套现代企业级的办公平台。有以下特点\:
+
+1. 核心代码开源
+
+2. 全功能免费
+
+3. 私有化部署,下载软件后可以安装在自己的服务器上
+
+4. 随时随地办公,平台支持兼容HTML5的浏览器,并且开发了源生的IOS/Android应用
+
+5. 高可扩展性,用户通过简单的学习后,可以自定义配置门户、流程应用、内容管理应用
+
+更多的产品介绍、使用说明、下载、在线体验、API及讨论请移步至[http://o2oa.io/](http://www.o2oa.io/)
+
+![o2oa](http://muliba.u.qiniudn.com/post/20180801-225850@2x.png)
+
+
+## 官方网站\:
+项目主页 : https://www.oschina.net/p/o2oa
+下载地址 : http://www.o2oa.io
+
+## 最新版本\:
+## v4 build 11.02更新内容\:
+新增功能\:
+
+1、[内容管理]增加设计元素可以拷贝粘贴的功能。
+
+2、[内容管理]增加组合框、子表单等设计元素组件。
+
+3、[企业社区]增加导航浏览模式。
+
+4、[服务管理]增加设计元素可以拷贝粘贴的功能。
+
+更新优化\:
+
+1、可以在配置中选择是否对office,pdf,text,image进行切词索引。
+
+2、优化调整切词索引中对词性的判断。
+
+3、优化钉钉,企业微信,政务钉钉中由于反复获取accessToken导致的页面响应缓慢的问题。
+
+BUG修复\:
+
+1、[内容管理]视图的分类标题无法保存的问题。
+
+2、[内容管理]修复附件无法替换的问题。
+
+3、修正office格式引起的:NoSuchMethodException: org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTPictureBaseImpl"。
+
+
+## v4 build 11.01更新内容\:
+新增功能\:
+
+1、企业微信,钉钉,政务钉钉组织同步,待办消息推送,通知消息群发,移动设备页面集成。
+
+2、新增SqlServer支持,目前可以支持一下数据库:Oracle,DB2,MySQL,Postgresql,Informix,H2(内嵌),DM(达梦国产数据库),MS-SQLServer。
+
+3、OAuth2客户端功能优化,支持浙江CA,微信,QQ等其他OAuth认证服务。
+
+4、增加消息群发功能。
+
+5、ISO,AndroidApp端增加语音处理功能。
+
+6、ISO,AndroidApp端增加AI自动处理功能。
+
+7、启用新域名o2oa.net。
+
+8、增加登录页面定制功能,现在可以通过门户定制登录页面了。
+
+更新优化\:
+
+1、支持金山WPS。
+
+2、统计中数据量导致的新能下降。
+
+3、群组(Group)支持组织成员,可以统一翻译成人员。
+
+4、增加个人的主身份设置,当不指名身份时可以自动取到主身份。
+
+5、用户可以自行绑定微信,通过微信扫码登录。
+
+6、[信息管理]对信息文档查询效率源码级优化。
+
+BUG修复\:
+
+1、会议管理字段超长导致的错误。
+
+2、无标题流程消息提醒显示空字符串。
+
+3、脚本编辑器在同时打开多个窗口情况无法正常保存。
+
+4、修改组织同步触发机制,现在可以通过cron表达式定制运行时间。
+
+5、[信息管理]修复数据字典无法复制的问题以及分类显示的错误。
+
+6、Office控件代码修正。
+
+
+## v4 build 09.21更新内容\:
+新增功能\:
+
+1、增加手写签批功能,支持在线手写签批,录音。
+
+2、增加全文搜索功能。支持pdf,.doc,.docx,.ppt,.pptx,.xls,.xlsx内容的全文检索。
+
+3、OAuth客户端功能,支持微信等其他OAuth认证服务。
+
+4、[汇报管理]添加手工漏发检测功能。
+
+更新优化\:
+
+1、更新统计展现功能,支持饼图,柱状图,折线图,支持行列转换。
+
+2、统计功能,可以源于不同试图的列进行合并统计。
+
+3、优化日程管理提醒不及时的问题
+
+BUG修复\:
+
+1、流程重置处理人错误。
+
+2、[信息管理]修复数据型文档类型保存不正确的问题。
+
+3、[脑图]修复某些情况下脑图无法创建的问题。
+
+
+
+## v4 build 09.04更新内容\:
+新增功能\:
+
+1、电子签章支持。
+
+2、流程引擎增加定时节点。
+
+3、政务钉钉支持,可以同步政务钉钉的人员,组织。
+
+4、增加行政区划组件。
+
+5、[社区应用]添加调整主贴版块的服务。
+
+更新优化\:
+
+1、视图统计代码优化,提升统计查询效率。
+
+2、优化待办已办查询,TaskCompleted 增加 latest。
+
+3、流程引擎底层优化,修改PorcessPlatform实现的aeiObjects。
+
+BUG修复\:
+
+1、应用导入导出错误。
+
+2、[信息管理]修复CMS_Review自动同步更新的问题
+
+3、[信息管理]修复序列保存时为空的问题
+
+4、修正移动端APP信息管理会把数据类的信息读取出来的问题
+
+## 授权协议
+
+o2oa软件遵守双重协议,一个是AGPL授权协议,一个是商用授权协议。
+
+1、o2oa是开源软件,您可以修改源码及免费使用;这时需遵守AGPL协议。
+
+2、当使用者使用o2oa软件提供收费服务,或者对o2oa进行分发、销售时需进行商业授权。具体请查看:[http://www.o2oa.io/product.html](http://www.o2oa.io/product.html)。
+
+3、使用者下载本软件即表示愿遵守此项协议。
+

+ 362 - 0
o2web/gulpfile.js

@@ -0,0 +1,362 @@
+var gulp = require('gulp'),
+//var deleted = require('gulp-deleted');
+    del = require('del'),
+    uglify = require('gulp-uglify'),
+    rename = require('gulp-rename'),
+    changed = require('gulp-changed'),
+    gulpif = require('gulp-if'),
+    minimist = require('minimist'),
+    ftp = require('gulp-ftp'),
+    sftp = require('gulp-sftp'),
+    JSFtp = require('jsftp'),
+    gutil = require('gulp-util'),
+    fs = require("fs");
+
+var apps = [
+    {"folder": "o2_lib",                                    "tasks": ["move", "clean"]},
+    {"folder": "o2_core",                                   "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_desktop",                                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Common",                        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Template",                      "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_AppCenter",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_AppMarket",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Attendance",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_BAM",                           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Calendar",                      "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Chat",                          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_Column",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_ColumnManager",             "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_DictionaryDesigner",        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_Document",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_FormDesigner",              "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_Index",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_Module",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_QueryViewDesigner",         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_ScriptDesigner",            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_ViewDesigner",              "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_cms_Xform",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Collect",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Console",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ControlPanel",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_CRM",                           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Deployment",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_DesignCenter",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Empty",                         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Execution",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ExeManager",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_FaceSet",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_File",                          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Forum",                         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ForumCategory",                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ForumDocument",                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ForumPerson",                   "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ForumSearch",                   "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ForumSection",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_HotArticle",                    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_IM",                            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_LogViewer",                     "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Meeting",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Message",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Minder",                        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_MinderEditor",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Note",                          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_OKR",                           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_OnlineMeeting",                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_OnlineMeetingRoom",             "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Org",                           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_PageDesigner",           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_Portal",                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_PortalExplorer",         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_PortalManager",          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_ScriptDesigner",         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_portal_WidgetDesigner",         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_Application",           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_ApplicationExplorer",   "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_DictionaryDesigner",    "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_FormDesigner",          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_ProcessDesigner",       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_ProcessManager",        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_ScriptDesigner",        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_StatDesigner",          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_TaskCenter",            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_ViewDesigner",          "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_Work",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_process_Xform",                 "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Profile",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_query_Query",                   "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_query_QueryExplorer",           "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_query_QueryManager",            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_query_StatDesigner",            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_query_ViewDesigner",            "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Report",                        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ReportDocument",                "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ReportMinder",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_ScriptEditor",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Search",                        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_SelecterTest",                  "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Selector",                      "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_service_AgentDesigner",         "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_service_InvokeDesigner",        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_service_ServiceManager",        "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Setting",                       "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Strategy",                      "tasks": ["move", "min", "clean", "watch"]},
+    {"folder": "x_component_Weixin",                        "tasks": ["move", "min", "clean", "watch"]},
+];
+
+var uploadOptions = {
+    'location': 'E:/o2server/servers/webServer/',
+    'host': 'dev.o2oa.net',
+    'user': 'xadmin',
+    'pass': 'xadmin',
+    "remotePath": "/"
+}
+var options = minimist(process.argv.slice(2), {//upload: local ftp or sftp
+    string: ["upload", "location", "host", "user", "pass", "port", "remotePath"]
+});
+options.upload = options.upload || "";
+options.location = options.location || uploadOptions.location;
+options.host = options.host || uploadOptions.host;
+options.user = options.user || uploadOptions.user;
+options.pass = options.pass || uploadOptions.pass;
+options.port = options.port || 0;
+options.remotePath = options.remotePath || uploadOptions.remotePath;
+
+
+var minTasks = [];      //压缩修改过的js文件,更名为 *.min.js,并移动到编译目录(dest)
+var moveTasks = [];     //将修改过的文件移动到编译目录(dest)
+var watchTasks = [];    //监控任务
+var cleanTasks = [];
+
+function getMinTask(path){
+    return function(){
+        var src = 'source/'+path+'/**/*.js';
+        var dest = 'dest/'+path+'/';
+        return gulp.src(src)
+            .pipe(changed(dest))
+            .pipe(uglify())
+            .pipe(rename({ extname: '.min.js' }))
+            .pipe(gulpif((options.upload=='local'&&options.location!=''), gulp.dest(options.location+path+'/')))
+            .pipe(gulpif((options.upload=='ftp'&&options.host!=''), ftp({
+                host: options.host,
+                user: options.user || 'anonymous',
+                pass: options.pass || '@anonymous',
+                port: options.port || 21,
+                remotePath: (options.remotePath || '/')+path
+            })))
+            .pipe(gulpif((options.upload=='sftp'&&options.host!=''), ftp({
+                host: options.host,
+                user: options.user || 'anonymous',
+                pass: options.pass || null,
+                port: options.port || 22,
+                remotePath: (options.remotePath || '/')+path
+            })))
+            .pipe(gulp.dest(dest))
+            .pipe(gutil.noop());
+    }
+}
+function getMoveTask(path){
+    return function(){
+        var src = 'source/'+path+'/**/*';
+        var dest = 'dest/'+path+'/';
+        return gulp.src(src)
+            .pipe(changed(dest))
+            .pipe(gulpif((options.upload=='local'&&options.location!=''), gulp.dest(options.location+path+'/')))
+            .pipe(gulpif((options.upload=='ftp'&&options.host!=''), ftp({
+                host: options.host,
+                user: options.user || 'anonymous',
+                pass: options.pass || '@anonymous',
+                port: options.port || 21,
+                remotePath: (options.remotePath || '/')+path
+            })))
+            .pipe(gulpif((options.upload=='sftp'&&options.host!=''), ftp({
+                host: options.host,
+                user: options.user || 'anonymous',
+                pass: options.pass || null,
+                port: options.port || 22,
+                remotePath: (options.remotePath || '/')+path
+            })))
+            .pipe(gulp.dest(dest))
+            .pipe(gutil.noop());
+    }
+}
+
+function getCleanTask(path){
+    return function(cb){
+        var dest = 'dest/'+path+'/';
+        del(dest, cb);
+    }
+}
+
+function cleanRemoteFtp(f, cb){
+    var file = options.remotePath+f;
+
+    var ftp = new JSFtp({
+        host: options.host,
+        user: options.user || 'anonymous',
+        pass: options.pass || null,
+        port: options.port || 21,
+    });
+
+    ftp.raw('dele '+file, function(err) {
+        if (err){ cb(); return; }
+        if (file.substring(file.length-3).toLowerCase()==".js"){
+            file = file.replace('.js', ".min.js");
+            ftp.raw('dele '+file, function(err) {
+                if (err){ cb(); return; }
+
+                if (file.indexOf("/")!=-1){
+                    var p = file.substring(0, file.lastIndexOf("/"));
+                    ftp.raw('rmd '+p, function(err) {
+                        if (err){ cb(); return; }
+
+                        ftp.raw.quit();
+                        cb();
+                    });
+                }
+
+            });
+        }else{
+            if (file.indexOf("/")!=-1){
+                var pPath = file.substring(0, file.lastIndexOf("/"));
+                ftp.raw('rmd '+pPath, function(err) {
+                    if (err){ cb(); return; }
+                    ftp.raw.quit();
+                    cb();
+                });
+            }
+        }
+    });
+}
+function cleanRemoteLocal(f, cb){
+    var file = options.location+f;
+    del(file, {force: true, dryRun: true}, function(){
+        if (file.substring(file.length-3).toLowerCase()==".js"){
+            var minfile = file.replace('.js', ".min.js");
+            del(minfile, {force: true, dryRun: true}, function(){
+                var p = file.substring(0, file.lastIndexOf("/"));
+                fs.rmdir(p,function(err){
+                    if(err){}
+                    cb();
+                })
+            });
+        }else{
+            var p = file.substring(0, file.lastIndexOf("/"));
+            fs.rmdir(p,function(err){
+                if(err){}
+                cb();
+            })
+        }
+    });
+}
+
+function getCleanRemoteTask(path){
+    return function(cb){
+        if (options.upload){
+            var file = path.replace(/\\/g, "/");
+            file = file.substring(file.indexOf("source/")+7);
+
+            if (options.upload=='local'&&options.location!='') cleanRemoteLocal(file, cb);
+            if (options.upload=='ftp'&&options.host!='') cleanRemoteFtp(file, cb);
+        }else{
+            if (cb) cb();
+        }
+    }
+}
+function getWatchTask(path, min){
+    return function(cb){
+        var moveTask = "move:"+path;
+        var minTask = "min:"+path;
+        var cleanTask = "clean:"+path;
+        if (min) gulp.watch('source/'+path+'/**/*.js', {"events": ['add','change']}, gulp.parallel(minTask));
+        gulp.watch('source/'+path+'/**/*', {"events": ['addDir', 'add','change']},  gulp.parallel(moveTask));
+
+        // gulp.watch('source/'+path+'/**/*', {"events": ['unlinkDir']},  function(file){
+        //     console.log("into unlinkDir watch ......."+file);
+        // });
+
+
+        watcher = gulp.watch('source/'+path+'/**/*', {delay:500});
+        watcher.on('unlink', function(file, stats){
+            console.log("into unlink watch ......."+file);
+            gulp.task("cleanRemote", getCleanRemoteTask(file))
+            gulp.series(gulp.parallel(cleanTask, "cleanRemote"), gulp.parallel(minTask, moveTask))();
+        });
+        // watcher.on('unlinkDir', function(file, stats){
+        //     console.log("into unlinkDir watch ......."+file);
+        //     // gulp.task("cleanRemoteDir", getCleanRemoteTask(file))
+        //     // gulp.series(gulp.parallel(cleanTask, "cleanRemoteDir"), gulp.parallel(minTask, moveTask))();
+        // });
+    }
+}
+
+apps.map(function(app){
+    var taskName = "";
+    if (app.tasks.indexOf("min")!==-1){
+        taskName = "min:"+app.folder;
+        minTasks.push(taskName);
+        gulp.task(taskName, getMinTask(app.folder));
+    }
+    if (app.tasks.indexOf("move")!==-1){
+        taskName = "move:"+app.folder;
+        moveTasks.push(taskName);
+        gulp.task(taskName, getMoveTask(app.folder));
+    }
+    if (app.tasks.indexOf("clean")!==-1){
+        taskName = "clean:"+app.folder;
+        cleanTasks.push(taskName);
+        gulp.task(taskName, getCleanTask(app.folder));
+    }
+    if (app.tasks.indexOf("watch")!==-1){
+        taskName = "watch:"+app.folder;
+        watchTasks.push(taskName);
+        gulp.task(taskName, getWatchTask(app.folder, (app.tasks.indexOf("min")!==-1)));
+    }
+})
+
+gulp.task("default", gulp.parallel(minTasks, moveTasks));
+gulp.task("clean", gulp.series(cleanTasks));
+gulp.task("sync", gulp.series(
+    gulp.series(cleanTasks),
+    gulp.parallel(minTasks, moveTasks)
+));
+gulp.task("watch", gulp.parallel(watchTasks));
+
+// gulp.task("watch", function(){
+//     watcher = gulp.watch('source/x_desktop/**/*');
+//     var log = console.log.bind(console);
+//     watcher
+//         .on('add', function(path) { log('File', path, 'has been added'); })
+//         .on('addDir', function(path) { log('Directory', path, 'has been added'); })
+//         .on('change', function(path) { log('File', path, 'has been changed'); })
+//         .on('unlink', function(path) { log('File', path, 'has been removed'); })
+//         .on('unlinkDir', function(path) { log('Directory', path, 'has been removed'); })
+//         .on('error', function(error) { log('Error happened', error); })
+//         .on('ready', function() { log('Initial scan complete. Ready for changes.'); })
+//         //.on('raw', function(event, path, details) { log('Raw event info:', event, path, details); })
+// });
+
+gulp.task("upload", function(cb){
+    var dest = 'dest/**/*';
+    console.log(options.upload);
+    console.log(options.user);
+    console.log(options.pass);
+    console.log(options.host);
+    console.log(options.remotePath);
+    gulp.src(dest)
+        .pipe(gulpif((options.upload=='local'&&options.location!=''), gulp.dest(options.location+'/')))
+        .pipe(gulpif((options.upload=='ftp'&&options.host!=''), ftp({
+            host: options.host,
+            user: options.user || 'anonymous',
+            pass: options.pass || '@anonymous',
+            port: options.port || 21,
+            remotePath: (options.remotePath || '/')
+        })))
+        .pipe(gulpif((options.upload=='sftp'&&options.host!=''), ftp({
+            host: options.host,
+            user: options.user || 'anonymous',
+            pass: options.pass || null,
+            port: options.port || 22,
+            remotePath: (options.remotePath || '/')
+        })));
+    cb();
+});

+ 26 - 0
o2web/karma.conf.js

@@ -0,0 +1,26 @@
+// Karma configuration
+// Generated on Thu Dec 20 2018 15:16:19 GMT+0800 (中国标准时间)
+
+module.exports = function(config) {
+    config.set({
+        basePath: '',
+        frameworks: ['jasmine'],
+        files: [
+            'source/*',
+            'test/**/*.js'
+        ],
+        exclude: [
+        ],
+
+        preprocessors: {
+        },
+        reporters: ['progress'],
+        port: 9876,
+        colors: true,
+        logLevel: config.LOG_INFO,
+        autoWatch: false,
+        browsers: ['PhantomJS'],
+        singleRun: false,
+        concurrency: Infinity
+    })
+};

+ 44 - 0
o2web/package.json

@@ -0,0 +1,44 @@
+{
+  "name": "o2oa_web",
+  "version": "1.1.7",
+  "description": "a javascript library",
+  "main": "o2.js",
+  "scripts": {
+    "test": "gulp",
+    "report-coverage": "codecov"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/huqi1980/o2oa_client_web.git"
+  },
+  "keywords": [
+    "oa",
+    "office",
+    "workflow",
+    "process",
+    "cms",
+    "bpm",
+    "portal"
+  ],
+  "author": "Tommy-O2OA",
+  "license": "AGPL-3.0",
+  "bugs": {
+    "url": "https://github.com/huqi1980/o2oa_client_web/issues"
+  },
+  "homepage": "https://github.com/huqi1980/o2oa_client_web#readme",
+  "devDependencies": {
+    "gulp": "^4.0.0",
+    "gulp-changed": "^3.2.0",
+    "gulp-deleted": "0.0.2",
+    "gulp-ftp": "^1.1.0",
+    "gulp-if": "^2.0.2",
+    "gulp-rename": "^1.4.0",
+    "gulp-sftp": "^0.1.5",
+    "gulp-uglify": "^3.0.1",
+    "karma": "^3.1.4",
+    "karma-jasmine": "^2.0.1",
+    "karma-phantomjs-launcher": "^1.0.4",
+    "merge-stream": "^1.0.1",
+    "minimist": "^1.2.0"
+  }
+}

BIN
o2web/source/favicon.ico


+ 10 - 0
o2web/source/index.html

@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<meta charset="UTF-8"/>
+	<meta property="qc:admins" content="1556771456600414672564530" />
+	<meta http-equiv="refresh" content="0;url=/x_desktop/index.html"/>
+</head>
+<body style="margin:0;font-size: 1.0em;font-family:Microsoft Yahei">
+</body>
+</html>

+ 28 - 0
o2web/source/o2_core/compatible.js

@@ -0,0 +1,28 @@
+o2.addReady(function(){
+    COMMON = {
+        "setContentPath": function(path){
+            COMMON.contentPath = path;
+        },
+        "JSON": o2.json,
+        "Browser": Browser,
+        "Class": o2.Class,
+        "XML": o2.xml,
+        "AjaxModule": {
+            "load": function(urls, callback, async, reload){
+                o2.load(urls, callback, reload, document);
+            },
+            "loadDom":  function(urls, callback, async, reload){
+                o2.load(urls, callback, reload, document);
+            },
+            "loadCss":  function(urls, callback, async, reload, sourceDoc){
+                o2.loadCss(urls, document.body, callback, reload, sourceDoc);
+            }
+        },
+        "Request": Request,
+        "typeOf": o2.typeOf
+    };
+    MWF = o2;
+    MWF.getJSON = o2.JSON.get;
+    MWF.getJSONP = o2.JSON.getJsonp;
+    MWF.defaultPath = o2.session.path;
+});

+ 454 - 0
o2web/source/o2_core/o2.js

@@ -0,0 +1,454 @@
+/** ***** BEGIN LICENSE BLOCK *****
+ * |------------------------------------------------------------------------------|
+ * | O2OA 活力办公 创意无限    o2.js                                                 |
+ * |------------------------------------------------------------------------------|
+ * | Distributed under the AGPL license:                                          |
+ * |------------------------------------------------------------------------------|
+ * | Copyright © 2018, o2oa.net, o2server.io O2 Team                              |
+ * | All rights reserved.                                                         |
+ * |------------------------------------------------------------------------------|
+ *
+ *  This file is part of O2OA.
+ *
+ *  O2OA is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  O2OA 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Foobar.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ * ***** END LICENSE BLOCK ******/
+
+
+/* load o2 Core
+ * |------------------------------------------------------------------------------|
+ * |addReady:     o2.addReady(fn),                                                |
+ * |------------------------------------------------------------------------------|
+ * |load:         o2.load(urls, callback, reload)                                 |
+ * |loadCss:      o2.loadCss(urls, dom, callback, reload, doc)                    |
+ * |------------------------------------------------------------------------------|
+ * |typeOf:       o2.typeOf(o)                                                    |
+ * |------------------------------------------------------------------------------|
+ * |uuid:         o2.uuid()                                                       |
+ * |------------------------------------------------------------------------------|
+ */
+(function(){
+    var _href = window.location.href;
+    var _debug = (_href.indexOf("debugger")!==-1);
+    var _par = _href.substr(_href.lastIndexOf("?")+1, _href.length);
+    var _lp = "zh-cn";
+    if (_par){
+        var _parList = _par.split("&");
+        for (var i=0; i<_parList.length; i++){
+            var _v = _parList[i];
+            var _kv = _v.split("=");
+            if (_kv[0].toLowerCase()==="lg") _lp = _kv[1];
+        }
+    }
+    this.o2 = {
+        "version": {
+            "v": '2.0.0',
+            "build": "2018.11.22",
+            "info": "O2OA 活力办公 创意无限. Copyright © 2018, o2oa.net O2 Team All rights reserved."
+        },
+        "session": {
+            "isDebugger": _debug,
+            "path": "/o2_core/o2"
+        },
+        "language": _lp,
+        "splitStr": /(,\s*){1}|(;\s*){1}/g
+    };
+    
+    var _attempt = function(){
+        for (var i = 0, l = arguments.length; i < l; i++){
+            try {
+                arguments[i]();
+                return arguments[i];
+            } catch (e){}
+        }
+        return null;
+    };
+    var _typeOf = function(item){
+        if (item == null) return 'null';
+        if (item.$family != null) return item.$family();
+        if (item.constructor == window.Array) return "array";
+
+        if (item.nodeName){
+            if (item.nodeType == 1) return 'element';
+            if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
+        } else if (typeof item.length == 'number'){
+            if (item.callee) return 'arguments';
+        }
+        return typeof item;
+    };
+    this.o2.typeOf = _typeOf;
+
+    var _addListener = function(dom, type, fn){
+        if (type == 'unload'){
+            var old = fn, self = this;
+            fn = function(){
+                _removeListener(dom, 'unload', fn);
+                old();
+            };
+        }
+        if (dom.addEventListener) dom.addEventListener(type, fn, !!arguments[2]);
+        else dom.attachEvent('on' + type, fn);
+    };
+    var _removeListener = function(dom, type, fn){
+        if (dom.removeEventListener) dom.removeEventListener(type, fn, !!arguments[2]);
+        else dom.detachEvent('on' + type, fn);
+    };
+
+    //http request class
+    var _request = (function(){
+        var XMLHTTP = function(){ return new XMLHttpRequest(); };
+        var MSXML2 = function(){ return new ActiveXObject('MSXML2.XMLHTTP'); };
+        var MSXML = function(){ return new ActiveXObject('Microsoft.XMLHTTP'); };
+        return _attempt(XMLHTTP, MSXML2, MSXML);
+    })();
+
+    var _returnBase = function(number, base) {
+        return (number).toString(base).toUpperCase();
+    };
+    var _getIntegerBits = function(val, start, end){
+        var base16 = _returnBase(val, 16);
+        var quadArray = new Array();
+        var quadString = '';
+        var i = 0;
+        for (i = 0; i < base16.length; i++) {
+            quadArray.push(base16.substring(i, i + 1));
+        }
+        for (i = Math.floor(start / 4); i <= Math.floor(end / 4); i++) {
+            if (!quadArray[i] || quadArray[i] == '')
+                quadString += '0';
+            else
+                quadString += quadArray[i];
+        }
+        return quadString;
+    };
+    var _rand = function(max) {
+        return Math.floor(Math.random() * (max + 1));
+    };
+    var _uuid = function(){
+        var dg = new Date(1582, 10, 15, 0, 0, 0, 0);
+        var dc = new Date();
+        var t = dc.getTime() - dg.getTime();
+        var tl = _getIntegerBits(t, 0, 31);
+        var tm = _getIntegerBits(t, 32, 47);
+        var thv = _getIntegerBits(t, 48, 59) + '1';
+        var csar = _getIntegerBits(_rand(4095), 0, 7);
+        var csl = _getIntegerBits(_rand(4095), 0, 7);
+
+        var n = _getIntegerBits(_rand(8191), 0, 7)
+            + _getIntegerBits(_rand(8191), 8, 15)
+            + _getIntegerBits(_rand(8191), 0, 7)
+            + _getIntegerBits(_rand(8191), 8, 15)
+            + _getIntegerBits(_rand(8191), 0, 15);
+        return tl + tm + thv + csar + csl + n;
+    };
+    this.o2.uuid = _uuid;
+
+
+    var _runCallback = function(callback, key, par){
+        if (typeOf(callback).toLowerCase() === 'function'){
+            if (key.toLowerCase()==="success") callback.apply(callback, par);
+        }else{
+            if (typeOf(callback).toLowerCase()==='object'){
+                var name = ("on-"+key).camelCase();
+                if (callback[name]) callback[name].apply(callback, par);
+            }
+        }
+    };
+    this.o2.runCallback = _runCallback;
+
+    //use framework url
+    var _frameworks = {
+        "o2.core": ["/o2_core/o2/o2.core.js"],
+        "o2.more": ["/o2_core/o2/o2.more.js"],
+        "ie_adapter": ["/o2_lib/o2/ie_adapter.js"],
+        "jquery": ["/o2_lib/jquery/jquery.min.js"],
+        "mootools": ["/o2_lib/mootools/mootools-1.6.0.js"],
+        "ckeditor": ["/o2_lib/htmleditor/ckeditor/ckeditor.js"],
+        "raphael": ["/o2_lib/raphael/raphael.js"],
+        "d3": ["/o2_lib/d3/d3.min.js"],
+        "ace": ["/o2_lib/ace/src-noconflict/ace.js","/o2_lib/ace/src-noconflict/ext-language_tools.js"],
+        "JSBeautifier": ["/o2_lib/JSBeautifier/beautify.js"],
+        "JSBeautifier_css": ["/o2_lib/JSBeautifier/beautify-css.js"],
+        "JSBeautifier_html": ["/o2_lib/JSBeautifier/beautify-html.js"]
+    };
+    var _loaded = {};
+    var _loadedCss = {};
+
+    var _loadSingle = function(url, callback, reload){
+        var addr_uri = _frameworks[url] || url;
+        if (!_debug) if (addr_uri.indexOf("o2_lib")===-1) addr_uri = addr_uri.replace(/\.js/, ".min.js");
+        addr_uri = (addr_uri.indexOf("?")!==-1) ? addr_uri+"&v="+this.o2.version.v : addr_uri+"?v="+this.o2.version.v;
+
+        var key = encodeURIComponent(url);
+
+        if (!reload) if (_loaded[key]){ if (callback)callback(); return; }
+
+        var head = (document.head || document.getElementsByTagName("head")[0] || document.documentElement);
+        var s = document.createElement('script');
+        s.src = addr_uri;
+        head.appendChild(s);
+
+        var _checkScriptLoaded = function(_, isAbort){
+            if (isAbort || !s.readyState || s.readyState === "loaded" || s.readyState === "complete") {
+                _loaded[key] = true;
+                _removeListener(s, 'DOMContentLoaded', _checkScriptLoaded);
+                _removeListener(s, 'readystatechange', _checkScriptLoaded);
+                if (!isAbort) if (callback)callback();
+            }
+        };
+
+        if ('onreadystatechange' in s) _addListener(s, 'readystatechange', _checkScriptLoaded);
+        _addListener(s, 'load', _checkScriptLoaded);
+    };
+    var _load = function(urls, callback, reload, doc){
+        var urltype = _typeOf(urls);
+        var modules;
+        if (urltype==="array"){
+            modules = [];
+            for (var i=0; i<urls.length; i++){
+                var url = urls[i];
+                var module = _frameworks[url] || url;
+                if (_typeOf(module)==="array"){
+                    modules.concat(module)
+                }else{
+                    modules.push(url)
+                }
+            }
+        }else{
+            modules = _frameworks[urls] || urls;
+        }
+
+        var type = _typeOf(modules);
+        if (type==="array"){
+            var thisLoaded = [];
+            for (var i=0; i<modules.length; i++){
+                _loadSingle(modules[i], function(){
+                    thisLoaded.push(modules[i]);
+                    if (thisLoaded.length===modules.length){
+                        if (callback) callback();
+                    }
+                }, reload, doc);
+            }
+        }
+        if (type==="string"){
+            _loadSingle(modules, callback, reload);
+        }
+    };
+    this.o2.load = _load;
+
+    var _loadSingleCss = function(url, callback, uuid, reload, sourceDoc){
+        var key = encodeURIComponent(url);
+        if (!reload) if (_loadedCss[key]){ if (callback)callback(_loadedCss[key]); return; }
+
+        var cssurl = _frameworks[url] || url;
+
+        var xhr = new _request();
+        xhr.open("GET", cssurl, true);
+
+        var success = function(xhr){
+            var cssText = xhr.responseText;
+            try{
+                if (cssText){
+                    if (uuid){
+                        var rex = new RegExp("(.+)(?=\\{)", "g");
+                        var match;
+                        while ((match = rex.exec(cssText)) !== null) {
+                            var prefix = "." + uuid + " ";
+                            var rule = prefix + match[0];
+                            cssText = cssText.substring(0, match.index) + rule + cssText.substring(rex.lastIndex, cssText.length)
+                            rex.lastIndex = rex.lastIndex + prefix.length;
+                        }
+                    }
+
+                    var doc = sourceDoc || document;
+                    var style = doc.createElement("style");
+                    style.setAttribute("type", "text/css");
+                    var head = (document.head || document.getElementsByTagName("head")[0] || document.documentElement);
+                    head.appendChild(style);
+                    if(style.styleSheet){
+                        var setFunc = function(){
+                            style.styleSheet.cssText = cssText;
+                        };
+                        if(style.styleSheet.disabled){
+                            setTimeout(setFunc, 10);
+                        }else{
+                            setFunc();
+                        }
+                    }else{
+                        var cssTextNode = doc.createTextNode(cssText);
+                        style.appendChild(cssTextNode);
+                    }
+                    style.sheet.cssRules[0].cssText = "#layout_xxx {\n" +
+                        "    width: 500px;\n" +
+                        "    height: 300px;\n" +
+                        "    background: #FFCCBA;\n" +
+                        "}"
+                }
+                _loadedCss[key] = style;
+                if (callback) callback(style);
+            }catch (e){
+                if (callback) callback();
+                return;
+            }
+        };
+        var failure = function(xhr){
+            if (callback) callback();
+        };
+        var onreadystatechange= function(){
+            if (xhr.readyState != 4) return;
+
+            var status = xhr.status;
+            status = (status == 1223) ? 204 : status;
+            //var response = {text: xhr.responseText || '', xml: xhr.responseXML};
+            if ((status >= 200 && status < 300))
+                success(xhr);
+            else if ((status >= 300 && status < 400))
+                failure(xhr);
+            else
+                failure(xhr);
+        };
+        _addListener(xhr, "readystatechange", onreadystatechange);
+        //xhr.onreadystatechange = onreadystatechange;
+        xhr.send();
+    };
+
+    var _parseDomString = function(dom, fn, sourceDoc){
+        var doc = sourceDoc || document;
+        var list = doc.querySelectorAll(dom);
+        if (list.length) for (var i=0; i<list.length; i++) _parseDomElement(list[i], fn);
+    };
+    var _parseDomElement = function(dom, fn){
+        if (fn) fn(dom);
+    };
+    var _parseDom = function(dom, fn, sourceDoc){
+        var domType = _typeOf(dom);
+        if (domType==="string") _parseDomString(dom, fn, sourceDoc);
+        if (domType==="element") _parseDomElement(dom, fn);
+        if (domType==="array") for (var i=0; i<dom.length; i++) _parseDom(dom[i], fn, sourceDoc);
+    };
+    var _loadCss = function(urls, dom, callback, reload, sourceDoc){
+        var uuid = "";
+        if (dom){
+            uuid = "css"+_uuid();
+            _parseDom(dom, function(node){ node.className += ((node.className) ? " "+uuid : uuid)}, sourceDoc);
+        }
+        modules = _frameworks[urls] || urls;
+        var type = _typeOf(modules);
+        if (type==="array"){
+            var thisLoaded = [];
+            var styleList = [];
+            for (var i=0; i<modules.length; i++){
+                _loadSingleCss(modules[i], function(style){
+                    thisLoaded.push(modules[i]);
+                    if (style) styleList.push(styleList);
+                    if (thisLoaded.length===modules.length){
+                        if (callback) callback(styleList);
+                    }
+                }, uuid, reload, sourceDoc);
+            }
+        }
+        if (type==="string"){
+            _loadSingleCss(modules, callback, uuid, reload, sourceDoc);
+        }
+    };
+    this.o2.loadCss = _loadCss;
+
+    var _dom = {
+        ready: false,
+        loaded: false,
+        checks: [],
+        shouldPoll: false,
+        timer: null,
+        testElement: document.createElement('div'),
+        readys: [],
+
+        domready: function(){
+            clearTimeout(_dom.timer);
+            if (_dom.ready) return;
+            _dom.loaded = _dom.ready = true;
+            _removeListener(document, 'DOMContentLoaded', _dom.checkReady);
+            _removeListener(document, 'readystatechange', _dom.check);
+            _dom.onReady();
+        },
+        check: function(){
+            for (var i = _dom.checks.length; i--;) if (_dom.checks[i]() && window.MooTools && o2.core && o2.more){
+                _dom.domready();
+                return true;
+            }
+            return false;
+        },
+        poll: function(){
+            clearTimeout(_dom.timer);
+            if (!_dom.check()) _dom.timer = setTimeout(_dom.poll, 10);
+        },
+
+        /*<ltIE8>*/
+        // doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
+        // testElement.doScroll() throws when the DOM is not ready, only in the top window
+        doScrollWorks: function(){
+            try {
+                _dom.testElement.doScroll();
+                return true;
+            } catch (e){}
+            return false;
+        },
+        /*</ltIE8>*/
+
+        onReady: function(){
+            for (var i=0; i<_dom.readys.length; i++){
+                this.readys[i].apply(window);
+            }
+        },
+        addReady: function(fn){
+            if (_dom.loaded){
+                if (fn) fn.apply(window);
+            }else{
+                if (fn) _dom.readys.push(fn);
+            }
+            return _dom;
+        },
+        checkReady: function(){
+            _dom.checks.push(function(){return true});
+            _dom.check();
+        }
+    };
+    var _loadO2 = function(){
+        this.o2.load("o2.core", _dom.check);
+        this.o2.load("o2.more", _dom.check);
+    };
+
+    _addListener(document, 'DOMContentLoaded', _dom.checkReady);
+
+    /*<ltIE8>*/
+    // If doScroll works already, it can't be used to determine domready
+    //   e.g. in an iframe
+    if (_dom.testElement.doScroll && !_dom.doScrollWorks()){
+        _dom.checks.push(_dom.doScrollWorks);
+        _dom.shouldPoll = true;
+    }
+    /*</ltIE8>*/
+
+    if (document.readyState) _dom.checks.push(function(){
+        var state = document.readyState;
+        return (state == 'loaded' || state == 'complete');
+    });
+
+    if ('onreadystatechange' in document) _addListener(document, 'readystatechange', _dom.check);
+    else _dom.shouldPoll = true;
+
+    if (_dom.shouldPoll) _dom.poll();
+
+    if (!window.MooTools) this.o2.load("mootools", function(){ _loadO2(); _dom.check(); });
+    this.o2.addReady = function(fn){ _dom.addReady.call(_dom, fn); };
+})();

+ 133 - 0
o2web/source/o2_core/o2/ie_adapter.js

@@ -0,0 +1,133 @@
+(function(){
+    if (Browser.iecomp){
+        if (!document.body.addEvent){
+            document.body.addEvent = function(type, fn){
+                if (window.attachEvent && !window.addEventListener){
+                    collected[Slick.uidOf(this)] = this;
+                }
+                if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
+                else this.attachEvent('on' + type, fn);
+                return this;
+            };
+        }
+
+        var setStyleFun = Element.prototype.setStyle || null;
+        Element.implement({
+            "get": function(prop){
+                var property = Element.Properties[prop];
+                var p = (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
+                if (!p){
+                    property = Element.Properties[prop.toString().toLowerCase()];
+                    p = (property && property.get) ? property.get.apply(this) : this.getProperty(prop.toString().toLowerCase());
+                }
+                return p;
+            }.overloadGetter(),
+            "setStyle": function(property, value){
+                if (setStyleFun){
+                    try{
+                        setStyleFun.apply(this, [property, value]);
+                    }catch(e){}
+                }
+                return this;
+            },
+            // "addEventListener": function(e, listener, capture){
+            //     this.addEvent(e, listener, capture);
+            // }
+        });
+        // var insertRow = HTMLTableElement.prototype.insertRow;
+        // var insertCell = HTMLTableRowElement.prototype.insertCell;
+        // HTMLTableElement.prototype.insertRow = function(n){ return $(insertRow.call(this,n))};
+        // HTMLTableRowElement.prototype.insertCell = function(n){ return $(insertCell.call(this,n))};
+
+        // if (!HTMLGenericElement.prototype.addEventListener){
+        //     HTMLGenericElement.prototype.addEventListener = function(e, listener, capture){
+        //         this.attachEvent("on"+e, listener);
+        //         //$(this).addEvent(e, listener, capture)
+        //     }
+        // }
+
+        if (!Object.create){
+            Object.create = function(o){
+                return Object.clone(o);
+            }
+        }
+        if (!document.createElementNS){
+            document.createElementNS = function(uri, tag){
+                var o = document.createElement(tag);
+                o.setAttribute("xmlns", uri);
+                return o;
+            }
+        }
+        if (!Array.isArray){
+            Array.isArray = function(o){
+                return (typeOf(o)==="array");
+            }
+        }
+
+
+        FormData = new Class({
+            initialize: function(){
+                this.items = [];
+                this.type = "o2_formdata";
+            },
+            append: function(key, d){
+                var o = {
+                    "name": key,
+                    "value": d
+                };
+                this.items.push(o);
+            }
+        });
+        FormData.expiredIE = true;
+
+        if (!Object.defineProperties){
+            Object.defineProperties = MWF.defineProperties;
+        }
+
+        if (!Object.defineProperty || (Browser.name=="ie" && Browser.version==8)){
+            Object.defineProperty = MWF.defineProperty;
+        }
+        MWF.defineProperties(HTMLInputElement.prototype, {"files": {
+            "get": function(){
+                MWF.require("MWF.widget.contentType", null, false);
+                var v = this.value;
+                var tmpv = v.replace(/\\/g, "/");
+                var i = tmpv.lastIndexOf("/");
+                var name = (i===-1) ? v : v.substr(i+1, tmpv.length-i);
+                var el = this;
+                var data = {
+                    "path": v,
+                    "name": name,
+                    "size": 0,
+                    "type": MWFContentType.get(v),
+                    "el": el
+                };
+                return {
+                    "length": (v) ? 1 : 0,
+                    "data": data,
+                    "item": function(){ return this.data; }
+                };
+            }
+        }});
+
+        WebSocket = window.WebSocket || function(){};
+        WebSocket.prototype = {
+            'readyState': 0,
+            'close': function(){}
+        };
+        HTMLCanvasElement = window.HTMLCanvasElement||function(){};
+
+    }
+
+})();
+//debugger;
+
+// (function(){
+//
+// })();
+//
+//
+//
+// if (Browser.iecomp){
+//
+// }

+ 366 - 0
o2web/source/o2_core/o2/lp/zh-cn.js

@@ -0,0 +1,366 @@
+o2.LP = window.LP || {
+    "name": "名称",
+    "description": "描述"
+};
+
+o2.LP.process={
+    "unnamed": "未命名",
+    "unknow": "未知",
+    "processConfig": "流程配置",
+    "formConfig": "表单配置",
+
+    "createCategory": "创建分类",
+    "searchCategory": "搜索分类",
+    "noCategoryNotice": "现在还没有流程分类,您可以点击此处创建一个流程分类",
+    "noProcessNoticeNode": "此分类现在还没有流程,您可以点击此处创建一个流程",
+
+    "activity": "活动",
+    "route": "路由",
+    "property": "属性",
+    "showJson": "查看JSON",
+    "unrealized": "此功能未实现",
+    "tools": "工具",
+    "repetitions": "重复的属性名称",
+    "repetitionsValue": "重复的内容项",
+    "repetitionsEvent": "重复的事件名称",
+    "repetitionsId": "重复的元素标识符",
+    "notNullId": "元素标识符不能为空",
+    "editCategory": "编辑分类",
+    "createProcess": "新建流程",
+    "deleteCategory": "删除分类",
+    "deleteProcess": "删除流程",
+    "editProcess": "编辑流程",
+    "createForm": "新建表单",
+    "deleteForm": "删除表单",
+    "editForm": "编辑表单",
+
+    "menu": {
+        "newRoute": "新建路由",
+        "newActivity": "新建活动",
+        "newActivityType": {
+            "manual": "人工活动",
+            "condition": "条件活动",
+            "auto": "自动活动",
+            "split": "拆分活动",
+            "merge": "合并活动",
+            "embed": "子流程活动",
+            "invoke": "调用活动",
+            "begin": "开始活动",
+            "end": "结束活动"
+        },
+
+        "copyActivity": "复制活动",
+
+        "deleteActivity": "删除活动",
+        "deleteRoute": "删除路由",
+
+        "saveProcess": "保存流程",
+        "saveProcessNew": "保存为新版本",
+        "checkProcess": "检查流程",
+        "exportProcess": "导出流程",
+        "printProcess": "打印流程",
+
+        "showGrid": "显示网格",
+        "hideGrid": "隐藏网格"
+    },
+    "notice": {
+        "save_success": "流程保存成功!",
+        "deleteForm_success": "表单已删除!",
+        "deleteProcess_success": "流程已删除!",
+        "one_begin": "每个流程只能有一个开始活动!",
+        "deleteRoute": "您确定要删除选中的路由吗?",
+        "deleteRouteTitle": "删除路由确认",
+        "deleteActivityTitle": "删除活动确认",
+        "deleteActivity": "删除活动将同时删除关联此活动的所有路由,您确定要删除选中的活动吗?",
+        "deleteDecisionTitle": "删除决策确认",
+        "deleteDecision": "您确定要删除选中的决策吗?",
+        "deleteScriptTitle": "删除脚本确认",
+        "deleteScript": "您确定要删除当前脚本吗?",
+        "deleteElementTitle": "删除表单元素确认",
+        "deleteElement": "是否确定删除当前元素,及其子元素吗?",
+        "deleteEventTitle": "删除事件确认",
+        "deleteEvent": "是否确定删除当前事件吗?",
+
+        "deleteActionTitle": "删除操作确认",
+        "deleteAction": "是否确定删除当前操作吗?",
+
+        "deleteRowTitle": "删除表格行确认",
+        "deleteRow": "删除当前行将删除该行所有单元格中的内容,是否确定删除当前选中的行?",
+        "deleteColTitle": "删除表格列确认",
+        "deleteCol": "删除当前行将删除该列所有单元格中的内容,是否确定删除当前选中的列?",
+
+        "deleteProcessTitle": "删除流程确认",
+        "deleteProcess": "是否确定要删除当前流程?",
+
+        "deleteFormTitle": "删除表单确认",
+        "deleteForm": "是否确定要删除当前表单?",
+
+        "deleteTreeNodeTitle": "删除节点确认",
+        "deleteTreeNode": "是否确定要删除当前节点?",
+
+        "inputScriptName": "请输入脚本名称!",
+        "inputCategoryName": "请输入分类名称!"
+    },
+    "button":{
+        "ok": "确定",
+        "cancel": "取消"
+    },
+    "formAction": {
+        "insertRow": "插入行",
+        "insertCol": "插入列",
+        "deleteRow": "删除行",
+        "deleteCol": "删除列",
+        "mergerCell": "合并单元格",
+        "splitCell": "拆分单元格",
+        "move": "移动",
+        "copy": "复制",
+        "delete": "删除",
+        "add": "添加",
+        "script": "脚本"
+    }
+};
+o2.LP.desktop = {
+    "menuAction": "菜单",
+    "configAction": "配置您的工作台",
+    "userMenu": "用户选项",
+    "userChat": "用户设置",
+    "styleAction": "切换主题",
+    "showDesktop": "显示桌面",
+    "showMessage": "消息",
+    "logout": "注销",
+    "userConfig": "个人设置",
+    "application": "组件",
+    "widget": "小工具",
+    "process": "应用",
+    "nosign": "未编辑个性签名",
+    "searchUser": "搜索:用户名",
+    "say": "说",
+    "clearMessage": "清除消息",
+
+    "messsage": {
+        "appliction": "应用",
+        "process": "流程",
+        "taskMessage": "待办提醒",
+        "receiveTask": "您收到一条待办,标题为:",
+        "activity": "活动",
+
+        "readMessage": "待阅提醒",
+        "receiveRead": "您收到一条待阅,标题为:",
+
+        "reviewMessage": "阅读提醒",
+        "receiveReview": "您收到一条阅读提醒,标题为:",
+
+        "fileEditorMessage": "收到文件",
+        "receiveFileEditor": "发送给您一个文件:",
+
+        "fileShareMessage": "共享文件",
+        "receiveFileShare": "共享给您一个文件:",
+
+        "meetingInviteMessage": "会议邀请",
+        "meetingInvite": "<font style='color: #ea621f'>{person}</font> 邀请您 于<font style='color: #ea621f'>{date}</font>参加会议:“{subject}”,地点:<font style='color: #ea621f'>{addr}</font>",
+        "meetingCancelMessage": "会议取消",
+        "meetingCancel": "<font style='color: #ea621f'>{person}</font> 取消了原定于<font style='color: #ea621f'>{date}</font>在<font style='color: #ea621f'>{addr}</font>举行的会议: “{subject}”",
+        "meetingAcceptMessage": "会议邀请已被接受",
+        "meetingAccept": "<font style='color: #ea621f'>{person}</font> 已接受您的会议邀请,将于<font style='color: #ea621f'>{date}</font>到<font style='color: #ea621f'>{addr}</font>参加会议: “{subject}”",
+        "meetingRejectMessage": "会议邀请已被拒绝",
+        "meetingReject": "<font style='color: #ea621f'>{person}</font> 已拒绝您的会议邀请。会议时间:<font style='color: #ea621f'>{date}</font>;会议标题: “{subject}”",
+
+        "attendanceAppealInviteMessage" : "有考勤申述需要您审批",
+        "attendanceAppealInvite": "{subject}",
+        "attendanceAppealAcceptMessage" : "考勤申述通过",
+        "attendanceAppealAccept": "{subject}",
+        "attendanceAppealRejectMessage" : "考勤申述未通过",
+        "attendanceAppealReject": "{subject}"
+
+    },
+    "styleMenu": {
+        "default": "默认",
+        "color": "色彩",
+        "black": "酷黑",
+        "lotus": "荷花",
+        "crane": "仙鹤",
+        "peony": "牡丹",
+        "car": "老爷车",
+        "dock": "码头",
+        "panda": "熊猫",
+        "star": "星空"
+    },
+    "notice": {
+        "unload": "如果关闭或刷新当前页面,未保存的内容会丢失,请确定您的操作",
+        "changePassword": "您的密码已过期,请及时修改密码",
+        "errorConnectCenter1": "无法连接到应用中心服务器,请确保下列地址其中之一可以访问:",
+        "errorConnectCenter2": "如果以上地址都无法访问,请检查您的网络,或联系管理员!"
+    },
+    "login": {
+        "title": "用户登录",
+        "loginButton": "登 录",
+
+        "mobileDownload": "手机扫描二维码安装",
+
+        "inputUsernamePassword": "请输入用户名和密码...",
+        "loginWait": "登录中, 请稍候...",
+        "loginError": "用户名或密码输入有误, 请重新输入...",
+
+        "camera_logining": "正在为您登录,请正对摄像头 ...",
+        "camera_logining_1": "请保持微笑 ...",
+        "camera_logining_2": "请抬头 ...",
+        "camera_logining_3": "验证成功 ...",
+
+        "camera_logining2": "请移动不同角度,或变换表情 ...",
+        "camera_loginSuccess": "{name}您好,正在为您登录 ...",
+        "camera_loginError": "无法验证您的身份,请通过其他方式登录 ...",
+        "camera_loginError2": "登录失败,请通过其他方式登录 ...",
+        "camera_loginError_camera": "无法打开摄像头,可能已经在使用中 ..."
+    },
+
+    "action": {
+        "uploadTitle": "正在上传",
+        "uploadComplete": "上传完成",
+        "sendReady": "正在编码数据,准备传输 . . .",
+        "sendStart": "开始传输",
+        "sendError": "文件传输出现错误",
+        "sendAbort": "文件传输已被取消",
+        "speed": "速度",
+        "time": "耗时",
+        "hour": "时",
+        "minute": "分",
+        "second": "秒",
+
+        "cancelUploadTitle": "取消上传确认",
+        "cancelUpload": "您确定要取消上传文件“{name}”吗?"
+    },
+    "person": {
+        "personEmployee": "人员工号",
+        "personMobile": "手机",
+        "personMail": "邮件",
+        "personDuty": "职务",
+        "personQQ": "QQ号码",
+        "personWeixin": "微信",
+        "duty": "职务"
+    },
+    "collect": {
+        "collectNotConnected": "连接O2云失败",
+        "collectNotConnectedText": "无法连接到O2云,请检查服务器网络!"
+    }
+};
+o2.LP.widget = {
+    "upload": "上传",
+    "uploadTitle": "上传文件",
+    "uploadInfor": "请选择要上传的文件",
+    "delete": "删除",
+    "replace": "替换",
+    "select" : "选择",
+
+    "download": "下载",
+    "share": "分享",
+    "send": "发送",
+    "downloadAll": "全部下载",
+    "createFolder": "创建文件夹",
+    "rename": "重命名",
+    "property": "属性",
+
+    "list": "列表",
+    "sequence": "序列",
+    "icon": "图标",
+    "preview": "预览",
+
+
+    "min": "简洁模式",
+    "max": "完整模式",
+
+    "size": "大小",
+    "uploader": "上传人",
+    "uploadTime": "时间",
+    "modifyTime": "修改",
+    "uploadActivity": "活动",
+    "attCount": "文件",
+    "folderCount": "文件夹",
+
+    "pictureSize" : "图片显示宽{width}像素,高{height}像素",
+    "pictureRatio" : "图片宽高比为{ratio}",
+
+    "ok": "确定",
+    "cancel": "取消",
+    "refresh": "刷新",
+
+    "months": ["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
+    "days_abbr": ["日","一","二","三","四","五","六"],
+
+    "unknow": "未知",
+    "uploadImg": "上传图片",
+    "clearImg": "清除图片",
+    "clearImg_confirmTitle": "清除图片确认",
+    "clearImg_confirm": "您确定要清除图片吗?",
+    "office": "在文档控件中打开",
+    "closeOffice": "关闭附件",
+
+    "record": "录音",
+    "stop": "停止",
+    "play": "播放",
+    "save": "保存"
+};
+
+o2.LP.widget.SimpleEditor = {
+    "insertEmotion" : "插入表情",
+    "insertImage" : "插入图像",
+    "Emotions" : "regular_smile|微笑,teeth_smile|大笑,angry_smile|生气,confused_smile|迷惑,cry_smile|大哭,embaressed_smile|尴尬,omg_smile|吃惊,sad_smile|难过,shades_smile|装酷,tounge_smile|吐舌,wink_smile|眨眼,angel_smile|天使,devil_smile|魔鬼,heart|红心,broken_heart|心碎,thumbs_up|顶,thumbs_down|踩,cake|蛋糕,lightbulb|灯泡,envelope|信封"
+};
+o2.LP.authentication = {
+    "LoginFormTitle" : "欢迎登录",
+    "SignUpFormTitle" : "欢迎注册",
+    "ResetPasswordFormTitle" : "找回密码",
+    "userName" : "用户名",
+    "password" : "密码",
+    "verificationCode" : "验证码",
+    "loginAction" : "登录",
+    "autoLogin" : "下次自动登陆",
+    "signUp" : "注册",
+    "forgetPassword" : "忘记密码?",
+    "inputYourUserName" : "请输入用户名",
+    "inputYourPassword" : "请输入密码",
+    "inputYourMail" : "请输入您的邮箱地址",
+    "inputYourMobile" : "请输入您的手机号码",
+    "inputPicVerificationCode" : "请输入右侧的验证码",
+    "inputComfirmPassword" : "请确认您的密码",
+    "inputVerificationCode" : "请输入手机验证码",
+    "confirmPassword" : "确认密码",
+    "sendVerification" : "发送验证码",
+    "resendVerification" : "重新发送",
+    "passwordIsSimple" : "请使用数字字母混合且至少7位",
+    "mobileIsRegisted" : "手机号码已经被注册",
+    "hasAccount" : "已有账号?",
+    "gotoLogin" : "去登录",
+    "weak" : "弱",
+    "middle" : "中",
+    "high" : "强",
+    "userExist" : "用户已经存在",
+    "userNotExist" : "用户不存在",
+    "passwordNotEqual" : "密码与上面不一致,请重新输入",
+    "changeVerification" : "换一张",
+    "genderType" : "性别",
+    "genderTypeText" : ",男,女",
+    "genderTypeValue" : ",m,f",
+    "selectGenderType" : "请选择性别",
+    "registeSuccess" : "注册成功",
+    "codeLogin" : "短信验证登录",
+    "passwordLogin" : "密码登录",
+    "bindLogin" : "二维码登录",
+    "bingLoginTitle" : "手机扫码,安全登录",
+    "o2downloadLink" : "http://www.pgyer.com/ZhiHe_android",
+    "loginSuccess" : "登录成功!",
+    "userCheck" : "用户认证",
+    "shotMessageCheck" : "短信验证",
+    "setMewPassword" : "设置新密码",
+    "completed" : "完成",
+    "nextStep" : "下一步",
+    "mobile" : "手机",
+    "setNewPassword" : "设置新密码",
+    "confirmNewPassword" : "确认新密码",
+    "passwordIsWeak" : "密码太弱,请使用数字和字母,且长度大于7",
+    "resetPasswordSuccess" : "重置密码成功!",
+    "resetPasswordFail" : "重置密码失败!",
+    "resetPasswordSuccessWord" : "请牢记您新设置的密码。",
+    "resetPasswordFailWord" : "请核对您的用户名和短信验证码。",
+    "backtoModify" : "返回修改",
+    "pageNotFound" : "404错误,未找到服务或服务器已断开"
+};

+ 340 - 0
o2web/source/o2_core/o2/o2.core.js

@@ -0,0 +1,340 @@
+/** ***** BEGIN LICENSE BLOCK *****
+ * |------------------------------------------------------------------------------|
+ * | O2OA 活力办公 创意无限    o2.core.js                                            |
+ * |------------------------------------------------------------------------------|
+ * | Distributed under the AGPL license:                                          |
+ * |------------------------------------------------------------------------------|
+ * | Copyright © 2018, o2oa.net, o2server.io O2 Team                              |
+ * | All rights reserved.                                                         |
+ * |------------------------------------------------------------------------------|
+ *
+ *  This file is part of O2OA.
+ *
+ *  O2OA is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  O2OA 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Foobar.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ * ***** END LICENSE BLOCK ******/
+
+
+
+(function (){
+    var _Class = {
+        create: function(options) {
+            var newClass = function() {
+                this.initialize.apply(this, arguments);
+            };
+            _copyPrototype(newClass, options);
+            return newClass;
+        }
+    };
+    var _copyPrototype = function (currentNS, props){
+        if (!props){return currentNS;}
+        if (!currentNS){return currentNS;}
+        if ((typeof currentNS).toLowerCase()==="object"){
+            for (var prop in props){
+                currentNS[prop] = props[prop];
+            }
+        }
+        if ((typeof currentNS).toLowerCase()==="function"){
+            for (var prop in props){
+                currentNS.prototype[prop] = props[prop];
+            }
+        }
+        return currentNS;
+    };
+
+    var _loaded = {};
+
+    var _requireJs = function(url, callback, async, compression){
+        var key = encodeURIComponent(url);
+        if (_loaded[key]){o2.runCallback(callback, "success"); return "";}
+
+        var jsPath = (compression || !this.o2.session.isDebugger) ? url.replace(/\.js/, ".min.js") : url;
+        jsPath = (jsPath.indexOf("?")!==-1) ? jsPath+"&v="+this.o2.version.v : jsPath+"?v="+this.o2.version.v;
+
+        var xhr = new Request({
+            url: jsPath, async: async, method: "get",
+            onSuccess: function(){
+                //try{
+                    _loaded[key] = true;
+                o2.runCallback(callback, "success");
+                //}catch (e){
+                //    o2.runCallback(callback, "failure", [e]);
+                //}
+            },
+            onFailure: function(r){
+                o2.runCallback(callback, "failure", [r]);
+            }
+        });
+        xhr.send();
+    };
+    var _requireSingle = function(module, callback, async, compression){
+        module = module.replace("MWF", "o2");
+        var levels = module.split(".");
+        if (levels[levels.length-1]==="*") levels[levels.length-1] = "package";
+        levels.shift();
+
+        var jsPath = this.o2.session.path;
+        jsPath +="/"+levels.join("/")+".js";
+
+        var loadAsync = (async!==false);
+
+        _requireJs(jsPath, callback, loadAsync, compression);
+    };
+    var _require = function(module, callback, async, compression){
+        var type = typeOf(module);
+        if (type==="array"){
+            var thisLoaded = [];
+            var thisErrorLoaded = [];
+            for (var i=0; i<module.length; i++){
+                _requireSingle(modules[i], {
+                    "onSuccess": function(){
+                        thisLoaded.push(modules[i]);
+                        if ((thisLoaded.length+thisErrorLoaded.length)===modules.length){
+                            if (thisErrorLoaded.length){
+                                o2.runCallback(callback, "failure", [thisLoaded, thisErrorLoaded]);
+                            }else{
+                                o2.runCallback(callback, "success", [thisLoaded, thisErrorLoaded]);
+                            }
+                        }
+                    },
+                    "onFailure": function(){
+                        thisErrorLoaded.push(modules[i]);
+                        o2.runCallback(callback, "failure", [thisLoaded, thisErrorLoaded]);
+                    }
+                }, async, compression);
+            }
+        }
+        if (type==="string"){
+            _requireSingle(module, callback, async, compression);
+        }
+    };
+    var _requireApp = function(module, clazz, callback, async){
+        var levels = module.split(".");
+        //levels.shift();
+        var root = "x_component_"+levels.join("_");
+        var clazzName = clazz || "Main";
+        var path = "/"+root+"/"+clazzName.replace(/\./g, "/")+".js";
+        var loadAsync = (async!==false);
+        _requireJs(path, callback, loadAsync);
+    };
+
+    var _json = JSON;
+    _json.get = function(url, callback, async, nocache){
+        var loadAsync = (async !== false);
+        var noJsonCache = (nocache === true);
+
+        url = (url.indexOf("?")!==-1) ? url+"&v="+o2.version.v : url+"?v="+o2.version.v;
+
+        var json = null;
+        var res = new Request.JSON({
+            url: url,
+            secure: false,
+            method: "get",
+            noCache: noJsonCache,
+            async: loadAsync,
+            withCredentials: true,
+            onSuccess: function(responseJSON, responseText){
+                json = responseJSON;
+                if (typeOf(callback).toLowerCase() === 'function'){
+                    callback(responseJSON, responseText);
+                }else{
+                    o2.runCallback(callback, "success", [responseJSON, responseText]);
+                }
+            }.bind(this),
+            onFailure: function(xhr){
+                o2.runCallback(callback, "requestFailure", [xhr]);
+            }.bind(this),
+            onError: function(text, error){
+                o2.runCallback(callback, "error", [text, error]);
+            }.bind(this)
+        });
+        res.send();
+        return json;
+    };
+    _json.getJsonp = function(url, callback, async, callbackKey){
+        var loadAsync = (async !== false);
+
+        var callbackKeyWord = callbackKey || "callback";
+
+        url = (url.indexOf("?")!==-1) ? url+"&v="+o2.version.v : url+"?v="+o2.version.v;
+        var res = new Request.JSONP({
+            url: url,
+            secure: false,
+            method: "get",
+            noCache: true,
+            async: loadAsync,
+            callbackKey: callbackKeyWord,
+            onSuccess: function(responseJSON, responseText){
+                o2.runCallback(callback, "success",[responseJSON, responseText]);
+            }.bind(this),
+            onFailure: function(xhr){
+                o2.runCallback(callback, "requestFailure",[xhr]);
+            }.bind(this),
+            onError: function(text, error){
+                o2.runCallback(callback, "error",[text, error]);
+            }.bind(this)
+        });
+        res.send();
+    };
+
+
+    var _loadLP = function(name){
+        var jsPath = o2.session.path;
+        jsPath = jsPath+"/lp/"+name+".js";
+        var r = new Request({
+            url: jsPath,
+            async: false,
+            method: "get",
+            onSuccess: function(responseText){
+                try{
+                    Browser.exec(responseText);
+                }catch (e){}
+            },
+            onFailure: function(xhr){
+                throw "loadLP Error: "+xhr.responseText;
+            }
+        });
+        r.send();
+    };
+
+    _restful = function(method, address, data, callback, async, withCredentials){
+        var loadAsync = (async !== false);
+        var credentials = (withCredentials !== false);
+        address = (address.indexOf("?")!==-1) ? address+"&v="+o2.version.v : address+"?v="+o2.version.v;
+
+        var res = new Request.JSON({
+            url: address,
+            secure: false,
+            method: method,
+            emulation: false,
+            noCache: true,
+            async: loadAsync,
+            withCredentials: credentials,
+            onSuccess: function(responseJSON, responseText){
+                var xToken = this.getHeader("x-token");
+                if (xToken){
+                    if (layout){
+                        if (!layout.session) layout.session = {};
+                        layout.session.token = xToken;
+                    }
+                }
+                o2.runCallback(callback, "success", [responseJSON])
+            },
+            onFailure: function(xhr){
+                o2.runCallback(callback, "requestFailure", [xhr]);
+            }.bind(this),
+            onError: function(text, error){
+                o2.runCallback(callback, "error", [text, error]);
+            }.bind(this)
+        });
+
+        res.setHeader("Content-Type", "application/json; charset=utf-8");
+        if (window.layout) {
+            if (layout["debugger"]){
+                res.setHeader("x-debugger", "true");
+            }
+            if (layout.session){
+                if (layout.session.token) {
+                    res.setHeader("x-token", layout.session.token);
+                    res.setHeader("authorization", layout.session.token);
+                }
+            }
+        }
+        //Content-Type	application/x-www-form-urlencoded; charset=utf-8
+        res.send(data);
+        return res;
+    };
+
+    var _release = function(o){
+        var type = typeOf(o);
+        switch (type){
+            case "object":
+                for (var k in o){
+                    o[k] = null;
+                }
+                break;
+            case "array":
+                for (var i=0; i< o.length; i++){
+                    if (o[i]) o[i] = null;
+                }
+                break;
+        }
+    };
+
+    var _defineProperties = Object.defineProperties || function (obj, properties) {
+        function convertToDescriptor(desc) {
+            function hasProperty(obj, prop) {
+                return Object.prototype.hasOwnProperty.call(obj, prop);
+            }
+            function isCallable(v) {
+                // NB: modify as necessary if other values than functions are callable.
+                return typeof v === "function";
+            }
+            if (typeof desc !== "object" || desc === null)
+                throw new TypeError("bad desc");
+            var d = {};
+            if (hasProperty(desc, "enumerable"))
+                d.enumerable = !!desc.enumerable;
+            if (hasProperty(desc, "configurable"))
+                d.configurable = !!desc.configurable;
+            if (hasProperty(desc, "value"))
+                d.value = desc.value;
+            if (hasProperty(desc, "writable"))
+                d.writable = !!desc.writable;
+            if (hasProperty(desc, "get")) {
+                var g = desc.get;
+                if (!isCallable(g) && typeof g !== "undefined")
+                    throw new TypeError("bad get");
+                d.get = g;
+            }
+            if (hasProperty(desc, "set")) {
+                var s = desc.set;
+                if (!isCallable(s) && typeof s !== "undefined")
+                    throw new TypeError("bad set");
+                d.set = s;
+            }
+            if (("get" in d || "set" in d) && ("value" in d || "writable" in d))
+                throw new TypeError("identity-confused descriptor");
+            return d;
+        }
+        if (typeof obj !== "object" || obj === null)
+            throw new TypeError("bad obj");
+        properties = Object(properties);
+        var keys = Object.keys(properties);
+        var descs = [];
+        for (var i = 0; i < keys.length; i++)
+            descs.push([keys[i], convertToDescriptor(properties[keys[i]])]);
+        for (var i = 0; i < descs.length; i++){
+            if (Object.defineProperty && (Browser.name=="ie" && Browser.version!=8)){
+                Object.defineProperty(obj, descs[i][0], descs[i][1]);
+            }else{
+                if (descs[i][1].value) obj[descs[i][0]] = descs[i][1].value;
+                if (descs[i][1].get) obj["get"+descs[i][0].capitalize()] = descs[i][1].get;
+                if (descs[i][1].set) obj["set"+descs[i][0].capitalize()] = descs[i][1].set;
+            }
+        }
+        return obj;
+    };
+
+    this.o2.Class = _Class;
+    this.o2.require = _require;
+    this.o2.requireApp = _requireApp;
+    this.o2.JSON = _json;
+    this.o2.loadLP = _loadLP;
+    this.o2.restful = _restful;
+    this.o2.release = _release;
+    this.o2.defineProperties = _defineProperties;
+
+})();
+o2.core = true;

+ 628 - 0
o2web/source/o2_core/o2/o2.more.js

@@ -0,0 +1,628 @@
+/** ***** BEGIN LICENSE BLOCK *****
+ * |------------------------------------------------------------------------------|
+ * | O2OA 活力办公 创意无限    o2.core.js                                            |
+ * |------------------------------------------------------------------------------|
+ * | Distributed under the AGPL license:                                          |
+ * |------------------------------------------------------------------------------|
+ * | Copyright © 2018, o2oa.net, o2server.io O2 Team                              |
+ * | All rights reserved.                                                         |
+ * |------------------------------------------------------------------------------|
+ *
+ *  This file is part of O2OA.
+ *
+ *  O2OA is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU Affero General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ *
+ *  O2OA 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 Affero General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with Foobar.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ * ***** END LICENSE BLOCK ******/
+
+(function (){
+    o2.getCenterPosition = function(el, width, height){
+        var elPositon = $(el).getPosition();
+        var elSize = $(el).getSize();
+        var node = $("layout");
+        var size = (node) ? $(node).getSize() : $(document.body).getSize();
+
+        var top = (elPositon.y+elSize.y)/2 - (height/2);
+        var left = (elPositon.x+elSize.x)/2-(width/2);
+        if ((left+width)>size.x){
+            left = size.x-width-10;
+        }
+        if ((top+height)>size.y){
+            top = size.y-height-10;
+        }
+
+        return {"x": left, "y": top};
+    };
+    o2.getMarkSize = function(node){
+        var size;
+        if (!node){
+            size = $(document.body).getSize();
+            var winSize = $(window).getSize();
+
+            var height = size.y;
+            var width = size.x;
+
+            if (height<winSize.y) height = winSize.y;
+            if (width<winSize.x) width = winSize.x;
+
+            return {x: size.x, y: height};
+        }else{
+            size = $(node).getSize();
+            return {x: size.x, y: size.y};
+        }
+    };
+    o2.json = function(jsonString, fun){
+        var obj = JSON.decode(jsonString);
+        var p = fun.split(".");
+        var tmp = obj;
+        p.each(function(item){
+            if (item.indexOf("[")!==-1){
+                var x = item.split("[");
+                var i = parseInt(x[1].substr(0, x[1].indexOf("]")));
+                tmp = tmp[x[0]][i];
+            }else{
+                tmp = tmp[item];
+            }
+        });
+        return tmp;
+    };
+    o2.getHTMLTemplate = function(url, callback, async){
+        var loadAsync = (async !== false);
+        var res = new Request.HTML({
+            url: url,
+            async: loadAsync,
+            method: "get",
+            onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript){
+                o2.runCallback(callback, "success", [responseTree, responseElements, responseHTML, responseJavaScript]);
+            }.bind(this),
+            onFailure: function(xhr){
+                o2.runCallback(callback, "requestFailure", [xhr]);
+            }
+        });
+        res.send();
+    };
+
+    o2.getRequestText = function(url, callback, async){
+        var loadAsync = (async !== false);
+
+        url = (url.indexOf("?")!==-1) ? url+"&v="+o2.version.v : url+"?v="+o2.version.v;
+        var res = new Request({
+            url: url,
+            async: loadAsync,
+            method: "get",
+            onSuccess: function(responseText, responseXML){
+                o2.runCallback(callback, "success",[responseText, responseXML]);
+            }.bind(this),
+            onFailure: function(xhr){
+                o2.runCallback(callback, "requestFailure",[xhr]);
+            }
+        });
+        res.send();
+    };
+
+    o2.encodeJsonString = function(str){
+        var tmp = [str];
+        var dataStr = (JSON.encode(tmp));
+        return dataStr.substr(2, dataStr.length-4);
+    };
+    o2.decodeJsonString = function(str){
+        var tmp = "[\""+str+"\"]";
+        var dataObj = (JSON.decode(tmp));
+        return dataObj[0];
+    };
+
+    o2.getTextSize = function(text, styles){
+        var tmpSpan = new Element("span", {
+            "text": text,
+            "styles": styles
+        }).inject($(document.body));
+        var size = tmpSpan.getSize();
+        tmpSpan.destroy();
+        return size;
+    };
+    o2.getCenter = function(size, target, offset){
+        if (!target) target = document.body;
+        var targetSize = target.getSize();
+        var targetPosition = target.getPosition(offset);
+        var targetScroll = target.getScroll();
+
+        var x = targetSize.x/2;
+        var y = targetSize.y/2;
+
+        x = x-(size.x/2);
+        y = y-(size.y/2);
+        x = x+targetPosition.x;
+        y = y+targetPosition.y;
+        x = x+targetScroll.x;
+        y = y+targetScroll.y;
+
+        return {"x": x, "y": y};
+    };
+    o2.getEPointer = function(e){
+        var x = 0;
+        var y = 0;
+        if (typeOf(e)=="element"){
+            var position = e.getPosition(this.content);
+            x = position.x;
+            y = position.y;
+        }else{
+            if (Browser.name=="firefox"){
+                x = parseFloat(e.event.clientX || e.event.x);
+                y = parseFloat(e.event.clientY || e.event.y);
+            }else{
+                x = parseFloat(e.event.x);
+                y = parseFloat(e.event.y);
+            }
+
+            if (e.target){
+                var position = e.target.getPosition(this.content);
+                x = position.x;
+                y = position.y;
+            }
+            //    }
+        }
+        return {"x": x, "y": y};
+    };
+    o2.getParent = function(node, tag){
+        var pNode = node.parentElement;
+        while(pNode && pNode.tagName.toString().toLowerCase() !== tag.toString().toLowerCase()){
+            pNode = pNode.parentElement;
+        }
+        return pNode;
+    };
+    o2.getOffset = function(evt){
+        if (Browser.name==="firefox"){
+            return {
+                "offsetX": evt.layerX,
+                "offsetY": evt.layerY
+            };
+        }else{
+            return {
+                "offsetX": evt.offsetX,
+                "offsetY": evt.offsetY
+            }
+        }
+    };
+
+    String.implement({
+        "getAllIndexOf": function(str){
+            var idxs= [];
+            var idx = this.indexOf(str);
+            while (idx !== -1){
+                idxs.push(idx);
+                idx = this.indexOf(str, idx+1);
+            }
+            return idxs;
+        }
+    });
+    Array.implement({
+        "trim": function(){
+            var arr = [];
+            this.each(function(v){
+                if (v) arr.push(v);
+            });
+            return v;
+        },
+        "isIntersect": function(arr){
+            return this.some(function(item){ return (arr.indexOf(item)!==-1); })
+        }
+    });
+    Element.implement({
+        "isIntoView": function() {
+            var pNode = this.getParent();
+            while (pNode && ((pNode.getScrollSize().y-(pNode.getComputedSize().height+1)<=0) || pNode.getStyle("overflow")==="visible")) pNode = pNode.getParent();
+
+            if (!pNode) pNode = document.body;
+            var size = pNode.getSize();
+            var srcoll = pNode.getScroll();
+            var p = (pNode == window) ? {"x":0, "y": 0} : this.getPosition(pNode);
+            var nodeSize = this.getSize();
+            return (p.x-srcoll.x>=0 && p.y-srcoll.y>=0) && (p.x+nodeSize.x<size.x+srcoll.x && p.y+nodeSize.y<size.y+srcoll.y)
+        },
+        "appendHTML": function(html, where){
+            if (this.insertAdjacentHTML){
+                var whereText = "beforeEnd";
+                if (where==="before") whereText = "beforeBegin";
+                if (where==="after") whereText = "afterEnd";
+                if (where==="bottom") whereText = "beforeEnd";
+                if (where==="top") whereText = "afterBegin";
+                this.insertAdjacentHTML(whereText, html);
+            }else {
+                if (where==="bottom") this.innerHTML = this.innerHTML+html;
+                if (where==="top") this.innerHTML = html+this.innerHTML;
+            }
+        },
+        "positionTo": function(x,y){
+            var left = x.toFloat();
+            var top = y.toFloat();
+            var offsetNode = this.getOffsetParent();
+            if (offsetNode){
+                var offsetPosition = offsetNode.getPosition();
+                left = left-offsetPosition.x;
+                top = top-offsetPosition.y;
+            }
+            this.setStyles({"top": top, "left": left});
+            return this;
+        },
+        "getBorder": function(){
+            var positions = ["top", "left", "right", "bottom"];
+            var styles = ["color", "style", "width"];
+
+            var obj = {};
+            positions.each(function (position){
+                styles.each(function(style){
+                    var key = "border-"+position+"-"+style;
+                    obj[key] = this.getStyle(key);
+                }.bind(this));
+            }.bind(this));
+
+            return obj;
+        },
+        "isOutside": function(e){
+            var elementCoords = this.getCoordinates();
+            var targetCoords  = this.getCoordinates();
+            if(((e.page.x < elementCoords.left || e.page.x > (elementCoords.left + elementCoords.width)) ||
+                    (e.page.y < elementCoords.top || e.page.y > (elementCoords.top + elementCoords.height))) &&
+                ((e.page.x < targetCoords.left || e.page.x > (targetCoords.left + targetCoords.width)) ||
+                    (e.page.y < targetCoords.top || e.page.y > (targetCoords.top + targetCoords.height))) ) return true;
+
+            return false;
+        },
+        "getAbsolutePosition":function(){
+            var styleLeft = 0;
+            var styleTop = 0;
+            var node = this;
+
+            styleLeft = node.offsetLeft;
+            styleTop = node.offsetTop;
+
+            node = node.parentElement;
+
+            while (node && node.tagName.toString().toLowerCase()!=="body"){
+                styleLeft += node.offsetLeft;
+                styleTop += node.offsetTop;
+                node = node.offsetParent;
+            }
+            return {x: styleLeft, y: styleTop};
+        },
+        "tweenScroll": function(to, time){
+            if (!this.tweenScrollQueue){
+                this.tweenScrollQueue = [];
+            }
+            if (this.tweenScrollQueue.length){
+                this.tweenScrollQueue.push(to);
+            }else{
+                this.tweenScrollQueue.push(to);
+                this.doTweenScrollQueue(time);
+            }
+        },
+        "doTweenScrollQueue": function(time){
+            if (this.tweenScrollQueue.length){
+                var i = this.tweenScrollQueue.length;
+                var to = this.tweenScrollQueue[this.tweenScrollQueue.length-1];
+
+                var scroll = this.getScroll();
+                var dy = to - scroll.y;
+                var step = dy/time;
+                var count = 0;
+                var move = 0;
+
+                var id = window.setInterval(function(){
+
+                    this.scrollTo(0, scroll.y+count*step);
+                    count++;
+                    if (count>time){
+                        window.clearInterval(id);
+                        for (var x=1; x<=i; x++) this.tweenScrollQueue.shift();
+                        if (this.tweenScrollQueue.length) this.doTweenScrollQueue(time);
+                    }
+                }.bind(this), 1);
+            }
+        },
+        "isPointIn": function(px, py, offX, offY, el){
+            if (!offX) offX = 0;
+            if (!offY) offY = 0;
+            var position = this.getPosition(el);
+            var size = this.getSize();
+            return (position.x-offX<=px && position.x+size.x+offX>=px && position.y-offY<=py && position.y+size.y+offY>=py);
+        },
+        "isInPointInRect": function(sx, sy, ex, ey){
+            var position = this.getPosition();
+            var size = this.getSize();
+
+            var p1 = {"x": position.x, "y": position.y};
+            var p2 = {"x": position.x+size.x, "y": position.y};
+            var p3 = {"x": position.x+size.x, "y": position.y+size.y};
+            var p4 = {"x": position.x, "y": position.y+size.y};
+
+            var sp = {"x": Math.min(sx, ex), "y": Math.min(sy, ey)};
+            var ep = {"x": Math.max(sx, ex), "y": Math.max(sy, ey)};
+
+            if (p1.x>=sp.x && p1.y>=sp.y && p1.x<=ep.x && p1.y<=ep.y) return true;
+            if (p2.x>=sp.x && p2.y>=sp.y && p2.x<=ep.x && p2.y<=ep.y) return true;
+            if (p3.x>=sp.x && p3.y>=sp.y && p3.x<=ep.x && p3.y<=ep.y) return true;
+            if (p4.x>=sp.x && p4.y>=sp.y && p4.x<=ep.x && p4.y<=ep.y) return true;
+            if (p3.x>=sp.x && p3.y>=sp.y && p1.x<=sp.x && p1.y<=sp.y) return true;
+            if (p3.x>=ep.x && p3.y>=ep.y && p1.x<=ep.x && p1.y<=ep.y) return true;
+            if (p1.x<=sp.x && p2.x>=sp.x && p1.y>=sp.y && p4.y<=ep.y) return true;
+            if (p1.y<=sp.y && p4.y>=sp.y && p1.x>=sp.x && p2.x<=ep.x) return true;
+
+            return false;
+        },
+        "isOverlap": function(node){
+            var p = node.getPosition();
+            var s = node.getSize();
+            return this.isInPointInRect(p.x, p.y, p.x+s.x, p.y+s.y);
+        },
+
+        "getUsefulSize": function(){
+            var size = this.getSize();
+            var borderLeft = this.getStyle("border-left").toInt();
+            var borderBottom = this.getStyle("border-bottom").toInt();
+            var borderTop = this.getStyle("border-top").toInt();
+            var borderRight = this.getStyle("border-right").toInt();
+
+            var paddingLeft = this.getStyle("padding-left").toInt();
+            var paddingBottom = this.getStyle("padding-bottom").toInt();
+            var paddingTop = this.getStyle("padding-top").toInt();
+            var paddingRight = this.getStyle("padding-right").toInt();
+
+            var x = size.x-paddingLeft-paddingRight;
+            var y = size.y-paddingTop-paddingBottom;
+
+            return {"x": x, "y": y};
+        },
+        "clearStyles": function(isChild){
+            this.removeProperty("style");
+            if (isChild){
+                var subNode = this.getFirst();
+                while (subNode){
+                    subNode.clearStyles(isChild);
+                    subNode = subNode.getNext();
+                }
+            }
+        },
+        "maskIf": function(styles, click){
+            var style = {
+                "background-color": "#666666",
+                "opacity": 0.4,
+                "z-index":100
+            };
+            if (styles){
+                style = Object.merge(style, styles);
+            }
+            var position = this.getPosition(this.getOffsetParent());
+            this.mask({
+                "destroyOnHide": true,
+                "style": style,
+                "useIframeShim": true,
+                "iframeShimOptions": {"browsers": true},
+                "onShow": function(){
+                    this.shim.shim.setStyles({
+                        "opacity": 0,
+                        "top": ""+position.y+"px",
+                        "left": ""+position.x+"px"
+                    });
+                },
+                "onClick": click
+            });
+        },
+        scrollToNode: function(el, where){
+            var scrollSize = this.getScrollSize();
+            if (!scrollSize.y) return true;
+            var wh = (where) ? where.toString().toLowerCase() : "bottom";
+            var node = $(el);
+            var size = el.getComputedSize();
+            var p = el.getPosition(this);
+            var thisSize = this.getComputedSize();
+            var scroll = this.getScroll();
+            if (wh==="top"){
+                var n = (p.y-thisSize.computedTop);
+                if (n<0) this.scrollTo(scroll.x, scroll.y+n);
+                n = (size.totalHeight+p.y-thisSize.computedTop)-thisSize.height;
+                if (n>0) this.scrollTo(scroll.x, scroll.y+n);
+
+            }else{
+                var n = (size.totalHeight+p.y-thisSize.computedTop)-thisSize.height;
+                if (n>0) this.scrollTo(scroll.x, scroll.y+n);
+                n = p.y-thisSize.computedTop;
+                if (n<0) this.scrollTo(scroll.x, scroll.y+n);
+            }
+        },
+        "getInnerStyles": function(){
+            var styles = {};
+            style = this.get("style");
+            if (style){
+                var styleArr = style.split(/\s*\;\s*/g);
+                styleArr.each(function(s){
+                    if (s){
+                        var sarr = s.split(/\s*\:\s*/g);
+                        styles[sarr[0]] = (sarr.length>1) ? sarr[1]: ""
+                    }
+                }.bind(this));
+            }
+            return styles;
+        },
+        "getInnerProperties": function(){
+            var properties = {};
+            if (this.attributes.length){
+                for (var i=0; i<this.attributes.length; i++){
+                    properties[this.attributes[i].nodeName] = this.attributes[i].nodeValue;
+                }
+            }
+            return properties;
+        }
+    });
+    Object.copy = function(from, to){
+        Object.each(from, function(value, key){
+            switch (typeOf(value)){
+                case "object":
+                    if (!to[key]) to[key]={};
+                    Object.copy(value, to[key]);
+                    break;
+                default:
+                    to[key] = value;
+            }
+        });
+    };
+
+    JSON.format = JSON.encode;
+
+    Slick.definePseudo('src', function(value){
+        return Element.get(this,"src").indexOf(value) !== -1;
+    });
+    Slick.definePseudo('srcarr', function(value){
+        var vList = value.split(",");
+        var src = Element.get(this,"src");
+        var flag = false;
+        for (var i=0; i<vList.length; i++){
+            if (src.indexOf(vList[i])!==-1){
+                flag = true;
+                break;
+            }
+        }
+        return flag;
+    });
+    Slick.definePseudo('ahref', function(value){
+        var href = Element.get(this,"href");
+        if (!href) href = "";
+        href = href.toString().toLowerCase();
+        return (href.indexOf(value)!==-1);
+    });
+
+    Slick.definePseudo('rowspanBefore', function(line){
+        var tr = MWF.getParent(this, "tr");
+        var rowspan = this.get("rowspan").toInt() || 1;
+        var currentRowIndex = tr.rowIndex.toInt();
+
+        return rowspan>1 && currentRowIndex<line.toInt() && currentRowIndex+rowspan-1>=line;
+    });
+    Slick.definePseudo('rowspan', function(){
+        var rowspan = this.get("rowspan").toInt() || 1;
+        return rowspan>1;
+    });
+
+    Slick.definePseudo('colspanBefore', function(col){
+        var tr = MWF.getParent(this, "tr");
+        var colspan = this.get("colspan").toInt() || 1;
+        var currentColIndex = this.cellIndex.toInt();
+
+        return colspan>1 && currentColIndex<col.toInt() && currentColIndex+colspan-1>=col.toInt();
+    });
+
+    Slick.definePseudo('colspan', function(){
+        var colspan = this.get("colspan").toInt() || 1;
+        return colspan>1;
+    });
+
+    o2.common = o2.common || {};
+
+    o2.common.getResponseTextPost = function(path, body, contentType){
+        var returnText = "";
+        var options = {
+            url: path,
+            async: false,
+            data: body,
+            method: "post",
+            onSuccess: function(esponseTree, responseElements, responseHTML, responseJavaScript){
+                returnText = responseHTML;
+            }
+        };
+        var r = new Request.HTML(options);
+        r.send();
+        return returnText;
+    };
+    o2.common.getResponseText = function(path){
+        var returnText = "";
+        var options = {
+            url: path,
+            async: false,
+            method: "get",
+            onSuccess: function(esponseTree, responseElements, responseHTML, responseJavaScript){
+                returnText = responseHTML;
+            }
+        };
+        var r = new Request.HTML(options);
+        r.send();
+        return returnText;
+    };
+    o2.common.toDate = function(str){
+        var tmpArr = str.split(" ");
+        if (!tmpArr[1]) tmpArr.push("0:0:0");
+        var dateArr = tmpArr[0].split("-");
+        var timeArr = tmpArr[1].split(":");
+        return new Date(dateArr[0],parseInt(dateArr[1])-1,dateArr[2],timeArr[0],timeArr[1],timeArr[2]);
+    };
+
+    o2.common.toDate = function(str){
+        var tmpArr = str.split(" ");
+        if (!tmpArr[1]) tmpArr.push("0:0:0");
+        var dateArr = tmpArr[0].split("-");
+        var timeArr = tmpArr[1].split(":");
+        return new Date(dateArr[0],parseInt(dateArr[1])-1,dateArr[2],timeArr[0],timeArr[1],timeArr[2]);
+    };
+
+    o2.grayscale = function(src, width, height, callback){
+        try {
+            var canvas = document.createElement('canvas');
+            var ctx = canvas.getContext('2d');
+            var imgObj = new Image();
+            imgObj.src = src;
+            canvas.width = width || imgObj.width;
+            canvas.height = height || imgObj.height;
+            ctx.drawImage(imgObj, 0, 0);
+
+            var imgPixels = ctx.getImageData(0, 0, canvas.width, canvas.height);
+            for(var y = 0; y < imgPixels.height; y++){
+                for(var x = 0; x < imgPixels.width; x++){
+                    var i = (y * 4) * imgPixels.width + x * 4;
+                    var avg = (imgPixels.data[i] + imgPixels.data[i + 1] + imgPixels.data[i + 2]) / 3;
+                    imgPixels.data[i] = avg;
+                    imgPixels.data[i + 1] = avg;
+                    imgPixels.data[i + 2] = avg;
+                }
+            }
+            ctx.putImageData(imgPixels, 0, 0, 0, 0, imgPixels.width, imgPixels.height);
+            var src1 = canvas.toDataURL();
+            //var blob = canvas.toBlob();
+            canvas.destroy();
+            return {"status": "success", "src": src1};
+        }catch(e){
+            return {"status": "error", "src": src}
+        }
+    };
+    o2.eventPosition = function(e){
+        var x = 0;
+        var y = 0;
+        if (Browser.name=="firefox"){
+            x = parseFloat(e.event.clientX || e.event.x);
+            y = parseFloat(e.event.clientY || e.event.y);
+        }else{
+            x = parseFloat(e.event.x);
+            y = parseFloat(e.event.y);
+        }
+        return {"x": x, "y": y};
+    };
+
+    if (Browser.name==="ie" && Browser.version<9){
+        Browser.ieuns = true;
+    }else if(Browser.name==="ie" && Browser.version<10){
+        Browser.iecomp = true;
+    }
+    if (Browser.iecomp){
+        o2.load("ie_adapter", null, false);
+        layout["debugger"] = true;
+    }
+
+})();
+o2.more = true;

+ 112 - 0
o2web/source/o2_core/o2/widget/$Arraylist/default/css.wcss

@@ -0,0 +1,112 @@
+{
+	"container": {
+		"border-top": "1px solid #999",
+		"border-bottom": "1px solid #999",
+		"overflow": "auto"
+	},
+	
+	"titleNode": {
+		"height": "20px",
+		"line-height": "20px",
+		"background": "#EEE"
+	},
+	
+	"titleActionNode": {
+		"float": "right",
+		"width": "20px",
+		"height": "20px",
+		"background": "url("+o2.session.path+"/widget/$ScriptArea/default/icon/add2.png) center center no-repeat",
+		"cursor": "pointer"
+	},
+	
+	"titleTextNode": {
+		"line-height": "20px",
+		"font-size": "12px",
+		"padding-left": "5px"
+	},
+	"contentNode": {
+		"overflow": "hidden",
+		"font-size": "12px",
+		"cursor": "default",
+		"padding": "3px 3px"
+	},
+	"contentStartNode": {
+		"height": "18px",
+		"line-height": "18px",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default",
+		"background": "transparent"
+	},
+	"contentStartNodeOver": {
+		"height": "18px",
+		"line-height": "18px",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default",
+		"background": "#E9E9E9"
+	},
+	
+	"contentItemsNode": {
+		"margin-left": "2px",
+		"overflow": "hidden",
+		"min-height": "12px"
+	},
+	"contentEndNode": {
+		"height": "18px",
+		"line-height": "18px",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default",
+		"background": "transparent"
+	},
+	"contentEndNodeOver": {
+		"height": "18px",
+		"line-height": "18px",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default",
+		"background": "#E9E9E9"
+	},
+	"contentItemNode": {
+		"height": "22px",
+		"line-height": "22px",
+		"background": "transparent"
+	},
+	"contentItemNodeOver": {
+		"height": "22px",
+		"line-height": "22px",
+		"background": "#E9E9E9"
+	},
+	"contentItemIconNode": {
+		"width": "16px",
+		"height": "22px",
+		"float": "left"
+	},
+	"contentItemKeyNode": {
+		"color": "#C80000",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default"
+	},
+	"contentItemValueNode": {
+		"color": "#395cdf",
+		"margin-left": "3px",
+		"font-family": "Verdana, Geneva, sans-serif",
+		"cursor": "default"
+	},
+	"contentItemColonNode": {
+		"margin-left": "2px"
+	},
+	
+	"editInputDiv": {
+		"border": "1px solid #999",
+		"height": "16px",
+		"line-height": "16px",
+		"overflow": "hidden",
+		"display": "inline",
+		"box-shadow": "0px 2px 5px #999"
+	},
+	
+	"editInput": {
+		"border": "0px",
+		"font-size": "12px",
+		"font-family": "Verdana, Geneva, sans-serif"
+	}
+	
+}

BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add.png


BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add2.png


BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/add3.png


BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/delete.png


BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/delete3.png


BIN
o2web/source/o2_core/o2/widget/$Arraylist/default/icon/error.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/bg.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/buttonbg.png


+ 397 - 0
o2web/source/o2_core/o2/widget/$AttachmentController/cms/css.wcss

@@ -0,0 +1,397 @@
+{
+	"container": {
+		"border": "1px solid #b6b6b6",
+	//	"height": "180px",
+	    "min-height": "180px",
+	    "background": "#FFF",
+	    "margin-top": "10px",
+		"overflow": "hidden"
+	},
+	"container_min": {
+	    "border": "0px solid #b6b6b6",
+	    "min-height": "30px",
+        "overflow": "hidden",
+        "background": "transparent",
+        "height": "auto"
+	},
+	"minActionAreaNode": {
+	    "float": "right",
+	    "height": "26px",
+	    "margin": "2px",
+	    "border": "1px solid #979797",
+        "border-radius": "3px",
+        "background-color" : "#fff"
+       // "background-image": "url("+o2.session.path+"/widget/$AttachmentController/cms/buttonbg.png)"
+	},
+	"minContentNode": {
+        "margin-right":"108px",
+        "min-height": "30px"
+	},
+	"titleNode": {
+      "color" : "#3587d7",
+	    "height": "30px",
+        "background-color": "#DDD",
+        "border-top": "1px solid #FFF",
+        "border-bottom": "1px solid #b6b6b6",
+        "line-height": "30px",
+        "font-size": "14px",
+        "font-weight": "bold",
+        "padding-left": "10px",
+        "text-align": "left"
+	},
+	"topNode": {
+	    "height": "40px",
+	    //"background-image": "url("+o2.session.path+"/widget/$AttachmentController/cms/bg.png)",
+        "background-color" : "#eee",
+	    "border-top": "1px solid #FFF",
+	    "border-bottom": "1px solid #b6b6b6"
+	},
+	"actionsBoxNode": {
+        "overflow": "hidden",
+        "border-bottom": "1px solid #eaebea",
+        "float": "left",
+        "margin-left": "10px",
+        "margin-top": "5px",
+        "border-radius": "3px",
+        "background-color" : "#fff"
+        //"background-image": "url("+o2.session.path+"/widget/$AttachmentController/cms/buttonbg.png)"
+	},
+	"actionsGroupNode": {
+	    "height": "26px",
+	    "border": "1px solid #979797",
+	    "border-radius": "3px",
+        "background-color" : "#fff"
+	    //"background-image": "url("+o2.session.path+"/widget/$AttachmentController/cms/buttonbg.png)"
+	},
+	"actionNode": {
+	    "float": "left",
+        "width": "26px",
+        "height": "26px",
+        "cursor": "default"
+	},
+	"actionIconNode": {
+	    "width": "26px",
+	    "height": "26px",
+	    "background-repeat": "no-repeat",
+	    "background-position": "center center"
+	},
+	"separateNode": {
+	    "width":"1px",
+	    "height": "16px",
+        "margin-top": "5px",
+        "margin-left": "5px",
+        "margin-right": "5px",
+        "border-left": "1px solid #bcbcbc",
+        "background-color": "#f1f1f1",
+        "float": "left"
+	},
+	"contentScrollNode": {
+        "background-color": "#FFF",
+        "overflow": "hidden",
+        "min-height": "130px",
+   //     "height": "130px"
+	},
+	"contentNode": {
+        "background-color": "#FFF",
+        "overflow": "hidden",
+        "margin-right": "6px"
+	},
+	"bottomNode": {
+	    "height": "7px",
+	    "border-top": "1px solid #b6b6b6",
+	    "background-color": "#e8e8e8"
+	},
+	"resizeNode": {
+	    "height": "7px",
+	    "cursor": "row-resize"
+	},
+	"attachmentNode_icon": {
+	    "width": "90px",
+	    "height": "100px",
+	    "padding": "5px",
+	    "float": "left",
+	    "margin": "10px 10px 10px 10px",
+	    "border-radius": "3px",
+	    "border": "2px solid #FFF",
+	    "background-color": "#FFF",
+	    "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+	},
+	"attachmentNode_icon_over": {
+        "border": "2px solid #cdcfd1",
+      "background-color" : "#e1edf7"
+        //"background-color": "#eaf0f5"
+    },
+    "attachmentNode_icon_selected": {
+        "border": "2px solid #d7e1e8",
+      "background-color" : "#92bce0"
+        //"background-color": "#d7e1e8"
+    },
+	"attachmentIconNode": {
+	    "width": "90px",
+        "height": "66px",
+        "text-align": "center"
+	},
+	"attachmentIconImgAreaNode": {
+	    "width": "64px",
+        "height": "64px",
+        "margin": "auto"
+	},
+	"attachmentIconImgNode": {
+	    "width": "64px",
+        "height": "64px"
+	},
+	"attachmentTextNode": {
+	    "height": "34px",
+	    "line-height": "17px",
+	    "font-size": "12px",
+	    "overflow": "hidden",
+	    "word-break": "break-all",
+	    "text-overflow": "ellipsis",
+	    "text-align": "center"
+	},
+
+	attachmentNode_sequence: {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background-color": "#FFF",
+        "margin": "0px 10px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "attachmentNode_sequence_over": {
+        "border": "0px solid #cdcfd1",
+        "background-color": "#eaf0f5"
+    },
+    "attachmentNode_sequence_selected": {
+        "border": "0px solid #d7e1e8",
+        "background-color": "#d7e1e8"
+    },
+    "attachmentNode_sequence_selected": {
+        "border": "0px solid #d7e1e8",
+        "background-color": "#d7e1e8"
+    },
+    "attachmentSeqNode_sequence": {
+        "width": "30px",
+        "height": "30px",
+        "line-height": "30px",
+        "color": "#666666",
+        "float": "left",
+        "text-align": "center"
+    },
+    "attachmentTextNode_sequence": {
+        "height": "30px",
+        "line-height": "30px",
+        "margin-left": "70px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    },
+
+	attachmentNode_list: {
+	    "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background-color": "#FFF",
+        "margin": "0px 10px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+	},
+	"attachmentNode_list_over": {
+        "border": "0px solid #cdcfd1",
+      "background-color" : "#e1edf7"
+        //"background-color": "#eaf0f5"
+    },
+    "attachmentNode_list_selected": {
+        "border": "0px solid #d7e1e8",
+      "background-color" : "#92bce0"
+        //"background-color": "#d7e1e8"
+    },
+    "attachmentIconNode_list": {
+        "width": "40px",
+        "height": "30px",
+        "float": "left"
+    },
+    "attachmentIconImgAreaNode_list": {
+        "width": "24px",
+        "height": "24px",
+        "margin": "3px 8px"
+    },
+    "attachmentIconImgNode_list": {
+        "width": "24px",
+        "height": "24px"
+    },
+    "attachmentTextNode_list": {
+        "height": "30px",
+        "line-height": "30px",
+        "margin-left": "40px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    },
+	"attachmentTextTitleNode_list": {
+	    "height": "30px",
+	    "float": "left",
+	    "width": "30%"
+	},
+	"attachmentTextSizeNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "15%"
+	},
+	"attachmentTextUploaderNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "15%"
+	},
+	"attachmentTextTimeNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "20%"
+	},
+    "attachmentTextActivityNode_list": {
+        "height": "30px",
+         "float": "left",
+         "width": "20%"
+    },
+
+    "attachmentNode_preview": {
+        "width": "180px",
+        "height": "160px",
+        "padding": "5px",
+        "float": "left",
+        "margin": "10px 10px 10px 10px",
+        "border-radius": "3px",
+        "border": "2px solid #FFF",
+        "background-color": "#FFF",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "attachmentNode_preview_over": {
+        "border": "2px solid #cdcfd1",
+        "background-color" : "#e1edf7"
+        //"background-color": "#eaf0f5"
+    },
+    "attachmentNode_preview_selected": {
+        "border": "2px solid #d7e1e8",
+      "background-color" : "#92bce0"
+        //"background-color": "#d7e1e8"
+    },
+    "attachmentPreviewIconNode": {
+        "width": "180px",
+        "height": "126px",
+        "text-align": "center"
+    },
+    "attachmentPreviewIconImgAreaNode": {
+        "width": "72px",
+        "height": "72px",
+        "margin": "auto"
+    },
+    "attachmentPreviewIconImgNode": {
+        "width": "72px",
+        "height": "72px",
+        "margin-top": "22px"
+    },
+    "attachmentPreviewAudioNode": {
+        "width": "180px",
+        "height": "30px",
+        "position": "relative",
+        "top": "-64px",
+        "opacity": "0.7"
+    },
+    "attachmentPreviewVideoNode": {
+        "width": "180px",
+        "height": "126px"
+    },
+    "attachmentPreviewTextNode": {
+        "height": "34px",
+        "line-height": "17px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "center"
+    },
+
+
+    "minAttachmentNode_sequence": {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 5px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "minAttachmentNode_sequence_over": {
+        "border": "0px solid #cdcfd1",
+        "background-color": "#eaf0f5"
+    },
+    "minAttachmentNode_sequence_selected": {
+        "border": "0px solid #d7e1e8",
+        "background-color": "#d7e1e8"
+    },
+    "minAttachmentNode_list": {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "left",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 5px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "minAttachmentNode_list_over": {
+        "border": "0px solid #cdcfd1",
+        //"background-color": "#eaf0f5"
+        "background-color" : "#e1edf7"
+    },
+    "minAttachmentNode_list_selected": {
+        "border": "0px solid #d7e1e8",
+      "background-color" : "#92bce0"
+        //"background-color": "#d7e1e8"
+    },
+    "minAttachmentIconNode_list": {
+        "width": "30px",
+        "height": "30px",
+        "float": "left"
+    },
+    "minAttachmentIconImgAreaNode_list": {
+        "width": "24px",
+        "height": "24px",
+        "margin": "3px 3px"
+    },
+    "minAttachmentIconImgNode_list": {
+        "width": "24px",
+        "height": "24px"
+    },
+    "minAttachmentTextNode_list": {
+        "height": "30px",
+        "cursor": "default",
+        "line-height": "30px",
+        "margin-left": "0px",
+        "margin-right": "6px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    }
+
+}

BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/createFolder.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/createFolder_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/delete.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/delete_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/download.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/downloadAll.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/downloadAll_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/download_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/icon.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/icon_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/list.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/list_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/max.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/max_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/min.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/min_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/preview.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/preview_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_1.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_1_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/rename_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/replace.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/replace_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/send.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/send_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/seq.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/seq_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/share.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/share_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/upload.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/icon/upload_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/overbg.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/cms/selectedbg.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/bg.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/buttonbg.png


+ 445 - 0
o2web/source/o2_core/o2/widget/$AttachmentController/default/css.wcss

@@ -0,0 +1,445 @@
+{
+	"container": {
+		"border": "1px solid #b6b6b6",
+	//	"height": "180px",
+	    "min-height": "180px",
+	    "background": "#FFF",
+	    "margin-top": "10px",
+		"overflow": "hidden"
+	},
+	"container_min": {
+	    "border": "0px solid #b6b6b6",
+	    "min-height": "30px",
+        "overflow": "hidden",
+        "background": "transparent",
+        "height": "auto"
+	},
+	"minActionAreaNode": {
+	    "float": "right",
+	    "height": "26px",
+	    "margin": "2px",
+	    "border": "1px solid #979797",
+        "border-radius": "3px",
+        "background-image": "url("+o2.session.path+"/widget/$AttachmentController/default/buttonbg.png)"
+	},
+	"minContentNode": {
+        "margin-right":"150px",
+        "min-height": "30px",
+        "overflow": "hidden"
+	},
+	"titleNode": {
+	    "height": "30px",
+        "background-color": "#DDD",
+        "border-top": "1px solid #FFF",
+        "border-bottom": "1px solid #b6b6b6",
+        "line-height": "30px",
+        "font-size": "14px",
+        "font-weight": "bold",
+        "padding-left": "10px",
+        "text-align": "left"
+	},
+	"topNode": {
+	    "height": "40px",
+	    "background-image": "url("+o2.session.path+"/widget/$AttachmentController/default/bg.png)",
+	    "border-top": "1px solid #FFF",
+	    "border-bottom": "1px solid #b6b6b6"
+	},
+	"actionsBoxNode": {
+        "overflow": "hidden",
+        "border-bottom": "1px solid #eaebea",
+        "float": "left",
+        "margin-left": "10px",
+        "margin-top": "5px",
+        "border-radius": "3px",
+        "background-image": "url("+o2.session.path+"/widget/$AttachmentController/default/buttonbg.png)"
+	},
+	"actionsGroupNode": {
+	    "height": "26px",
+	    "border": "1px solid #979797",
+	    "border-radius": "3px",
+	    "background-image": "url("+o2.session.path+"/widget/$AttachmentController/default/buttonbg.png)"
+	},
+	"actionNode": {
+	    "float": "left",
+        "width": "26px",
+        "height": "26px",
+        "cursor": "default"
+	},
+	"actionIconNode": {
+	    "width": "26px",
+	    "height": "26px",
+	    "background-repeat": "no-repeat",
+	    "background-position": "center center"
+	},
+	"separateNode": {
+	    "width":"1px",
+	    "height": "16px",
+        "margin-top": "5px",
+        "margin-left": "5px",
+        "margin-right": "5px",
+        "border-left": "1px solid #bcbcbc",
+        "background-color": "#f1f1f1",
+        "float": "left"
+	},
+	"contentScrollNode": {
+        "background-color": "#FFF",
+        "overflow": "hidden",
+        "min-height": "130px"
+	},
+	"contentNode": {
+        "background-color": "#FFF",
+        "overflow": "hidden",
+        "margin-right": "6px"
+	},
+	"bottomNode": {
+	    "height": "7px",
+	    "border-top": "1px solid #b6b6b6",
+	    "background-color": "#e8e8e8"
+	},
+	"resizeNode": {
+	    "height": "7px",
+	    "cursor": "row-resize"
+	},
+	"attachmentNode_icon": {
+	    "width": "90px",
+	    "height": "100px",
+	    "padding": "5px",
+	    "float": "left",
+	    "margin": "10px 0px 10px 10px",
+	    "border-radius": "3px",
+	    //"border": "2px solid #FFF",
+	    "background": "transparent",
+	    "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+	},
+	"attachmentNode_icon_over": {
+        //"border": "2px solid #cdcfd1",
+        "background": "#eaf0f5"
+    },
+    "attachmentNode_icon_selected": {
+        //"border": "2px solid #d7e1e8",
+        "background": "#d7e1e8"
+    },
+	"attachmentIconNode": {
+	    "width": "90px",
+        "height": "66px",
+        "text-align": "center"
+	},
+	"attachmentIconImgAreaNode": {
+	    "width": "64px",
+        "height": "64px",
+        "margin": "auto"
+	},
+	"attachmentIconImgNode": {
+	    "width": "64px",
+        "height": "64px"
+	},
+	"attachmentTextNode": {
+	    "height": "34px",
+	    "line-height": "17px",
+	    "font-size": "12px",
+	    "overflow": "hidden",
+	    "word-break": "break-all",
+	    "text-overflow": "ellipsis",
+	    "text-align": "center"
+	},
+    attachmentNode_sequence: {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 10px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "attachmentNode_sequence_over": {
+        "border": "0px solid #cdcfd1",
+        "background": "#eaf0f5"
+    },
+    "attachmentNode_sequence_selected": {
+        "border": "0px solid #d7e1e8",
+        "background": "#d7e1e8"
+    },
+    "attachmentSeqNode_sequence": {
+        "width": "30px",
+        "height": "30px",
+        "line-height": "30px",
+        "color": "#666666",
+        "float": "left",
+        "text-align": "center"
+    },
+    "attachmentTextNode_sequence": {
+        "height": "30px",
+        "line-height": "30px",
+        "margin-left": "70px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    },
+
+	attachmentNode_list: {
+	    "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 10px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+	},
+	"attachmentNode_list_over": {
+        "border": "0px solid #cdcfd1",
+        "background": "#eaf0f5"
+    },
+    "attachmentNode_list_selected": {
+        "border": "0px solid #d7e1e8",
+        "background": "#d7e1e8"
+    },
+
+
+
+    "attachmentIconNode_list": {
+        "width": "40px",
+        "height": "30px",
+        "float": "left"
+    },
+    "attachmentIconImgAreaNode_list": {
+        "width": "24px",
+        "height": "24px",
+        "margin": "3px 8px"
+    },
+    "attachmentIconImgNode_list": {
+        "width": "24px",
+        "height": "24px"
+    },
+    "attachmentTextNode_list": {
+        "height": "30px",
+        "line-height": "30px",
+        "margin-left": "40px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    },
+	"attachmentTextTitleNode_list": {
+	    "height": "30px",
+	    "float": "left",
+	    "width": "30%"
+	},
+	"attachmentTextSizeNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "15%"
+	},
+	"attachmentTextUploaderNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "15%"
+	},
+	"attachmentTextTimeNode_list": {
+	    "height": "30px",
+        "float": "left",
+        "width": "20%"
+	},
+    "attachmentTextActivityNode_list": {
+        "height": "30px",
+         "float": "left",
+         "width": "20%"
+    },
+
+    "attachmentNode_preview": {
+        "width": "180px",
+        "height": "160px",
+        "padding": "5px",
+        "float": "left",
+        "margin": "10px 5px 10px 5px",
+        "border-radius": "3px",
+        //"border": "2px solid #FFF",
+        "background": "transparent",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "attachmentNode_preview_over": {
+        //"border": "2px solid #cdcfd1",
+        "background": "#eaf0f5"
+    },
+    "attachmentNode_preview_selected": {
+        //"border": "2px solid #d7e1e8",
+        "background": "#d7e1e8"
+    },
+    "attachmentPreviewIconNode": {
+        "width": "180px",
+        "height": "126px",
+        "text-align": "center"
+    },
+    "attachmentPreviewIconImgAreaNode": {
+        "width": "72px",
+        "height": "72px",
+        "margin": "auto"
+    },
+    "attachmentPreviewIconImgNode": {
+        "width": "72px",
+        "height": "72px",
+        "margin-top": "22px"
+    },
+    "attachmentPreviewAudioNode": {
+        "width": "180px",
+        "height": "30px",
+        "position": "relative",
+        "top": "-64px",
+        "opacity": "0.7"
+    },
+    "attachmentPreviewVideoNode": {
+        "width": "180px",
+        "height": "126px"
+    },
+    "attachmentPreviewTextNode": {
+        "height": "34px",
+        "line-height": "17px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "center"
+    },
+
+
+    "minAttachmentNode_sequence": {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "none",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 5px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "minAttachmentNode_sequence_over": {
+        "border": "0px solid #cdcfd1",
+        "background-color": "#eaf0f5"
+    },
+    "minAttachmentNode_sequence_selected": {
+        "border": "0px solid #d7e1e8",
+        "background-color": "#d7e1e8"
+    },
+    "minAttachmentNode_list": {
+        "width": "auto",
+        "height": "30px",
+        "padding": "0px",
+        "float": "left",
+        "border-radius": "0px",
+        "border": "0px solid #FFF",
+        "background": "transparent",
+        "margin": "0px 5px",
+        "-webkit-user-select": "text",
+        "-moz-user-select": "text"
+    },
+    "minAttachmentNode_list_over": {
+        "border": "0px solid #cdcfd1",
+        "background-color": "#eaf0f5"
+    },
+    "minAttachmentNode_list_selected": {
+        "border": "0px solid #d7e1e8",
+        "background-color": "#d7e1e8"
+    },
+    "minAttachmentIconNode_list": {
+        "width": "30px",
+        "height": "30px",
+        "float": "left"
+    },
+    "minAttachmentIconImgAreaNode_list": {
+        "width": "24px",
+        "height": "24px",
+        "margin": "3px 3px"
+    },
+    "minAttachmentIconImgNode_list": {
+        "width": "24px",
+        "height": "24px"
+    },
+    "minAttachmentTextNode_list": {
+        "height": "30px",
+        "cursor": "default",
+        "line-height": "30px",
+        "margin-left": "0px",
+        "margin-right": "6px",
+        "font-size": "12px",
+        "overflow": "hidden",
+        "word-break": "break-all",
+        "text-overflow": "ellipsis",
+        "text-align": "left"
+    },
+    "inputUploadAreaNode": {
+        "width": "450px",
+        "height": "160px",
+        "border-radius": "5px",
+        "box-shadow": "0px 0px 10px #FFF",
+        "position": "absolute",
+        "border": "2px solid #999",
+        "border-top": "4px solid #5290e5",
+        "background-color": "#FFF",
+        "z-index": 100
+    },
+    "inputUploadAreaTitleNode": {
+        "height": "30px",
+        "line-height": "30px",
+        "text-align": "center",
+        "font-weight": "bold",
+        "font-family": "微软雅黑",
+        "font-size": "14px"
+    },
+    "inputUploadAreaInforNode": {
+        "height": "24px",
+        "line-height": "24px",
+        "text-align": "center",
+        "color": "#666",
+        "font-family": "微软雅黑",
+        "font-size": "12px",
+        "text-align": "left",
+        "margin": "10px 20px 0px 20px"
+    },
+    "inputUploadAreaInputAreaNode": {
+        "margin": "0px 20px 20px 20px",
+        "height": "24px"
+    },
+    "inputUploadAreaInputNode": {
+        "width": "407px",
+        "height": "23px",
+        "border": "1px solid #666",
+    },
+    "inputUploadActionNode": {
+		"margin": "0px 20px",
+		"border-top": "1px solid #999",
+	},
+	"inputUploadOkButton": {
+        "height": "24px",
+        "width": "80px",
+        "color": "#FFF",
+        "background-color": "#42699e",
+        "border": "1px solid #1e3d67",
+        "border-radius": "3px",
+        "float": "right",
+        "margin-top": "10px",
+        "margin-left": "10px"
+    },
+    "inputUploadCancelButton": {
+        "height": "24px",
+        "width": "80px",
+        "color": "#666",
+        "background-color": "#DFDFDF",
+        "border": "1px solid #666",
+        "border-radius": "3px",
+        "float": "right",
+        "margin-top": "10px",
+        "margin-left": "10px"
+    }
+}

BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/closeOffice.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/closeOffice_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/createFolder.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/createFolder_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/delete.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/delete_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/download.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/downloadAll.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/downloadAll_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/download_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/icon.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/icon_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/list.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/list_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/max.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/max_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/min.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/min_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/office.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/office_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/preview.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/preview_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/property.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/property_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_1.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_1_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/rename_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/replace.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/replace_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/send.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/send_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/seq.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/seq_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/share.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/share_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/upload.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/icon/upload_gray.png


BIN
o2web/source/o2_core/o2/widget/$AttachmentController/default/overbg.png


Неке датотеке нису приказане због велике количине промена