Commit 68ed721e authored by Vincent Bechu's avatar Vincent Bechu

erp5_officejs_jquery_app: add web table editor

parent 703979e4
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Manifest" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>contributor/person_module/1</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_web_table.appcache</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table.appcache</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Manifest</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string encoding="cdata"><![CDATA[
CACHE MANIFEST\n
# generated on Fri, 09 Jun 2016 11:45:33 +0000\n
# XXX + fonts\n
# images/ajax-loader.gif\n
CACHE:\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.eot?v=4.2.0\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.eot?#iefix&v=4.2.0\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.woff?v=4.2.0\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.ttf?v=4.2.0\n
https://netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular\n
jio_mappingstorage.js\n
gadget_officejs_liberator.js\n
gadget_officejs_liberator.html\n
URI.js\n
dygraph.js\n
gadget_erp5.css\n
gadget_global.js\n
gadget_jio.html\n
gadget_jio.js\n
gadget_translate.html\n
gadget_translate.js\n
handlebars.js\n
jiodev.js\n
jquery.js\n
jquerymobile.css\n
jquerymobile.js\n
renderjs.js\n
rsvp.js\n
gadget_officejs_header.html\n
gadget_officejs_jio.html\n
gadget_officejs_page_add_document.html\n
gadget_officejs_page_jio_configurator.html\n
gadget_officejs_page_jio_dav_configurator.html\n
gadget_officejs_page_jio_erp5_configurator.html\n
gadget_officejs_page_jio_dropbox_configurator.html\n
gadget_officejs_page_login.html\n
gadget_officejs_page_logout.html\n
gadget_officejs_page_share_webrtc_jio.html\n
gadget_officejs_page_sync.html\n
gadget_officejs_page_document_list.html\n
gadget_officejs_application_panel.html\n
gadget_translation.html\n
gadget_officejs_webrtc_jio.html\n
gadget_officejs_widget_listbox.html\n
gadget_erp5_editor_panel.html\n
gadget_erp5_editor_panel.js\n
gadget_officejs_header.js\n
gadget_officejs_jio.js\n
gadget_officejs_page_add_document.js\n
gadget_officejs_page_jio_configurator.js\n
gadget_officejs_page_jio_dav_configurator.js\n
gadget_officejs_page_jio_erp5_configurator.js\n
gadget_officejs_page_jio_dropbox_configurator.js\n
gadget_officejs_page_login.js\n
gadget_officejs_page_logout.js\n
gadget_officejs_page_share_webrtc_jio.js\n
gadget_officejs_page_sync.js\n
gadget_officejs_page_document_list.js\n
gadget_officejs_router.js\n
gadget_officejs_application_panel.js\n
gadget_translation.js\n
gadget_translation_data.js\n
gadget_officejs_webrtc_jio.js\n
gadget_officejs_widget_listbox.js\n
erp5_launcher.js\n
erp5_launcher.html\n
gadget_officejs_web_table_router.html\n
gadget_officejs_jio_web_table_view.html\n
gadget_officejs_jio_web_table_view.js\n
web_table_landing_page.html\n
NETWORK:\n
*
]]></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web TableGadget OfficeJS AppCache</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760724.5</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Manifest" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>contributor/person_module/1</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_web_table_editor.appcache</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_editor_appcache</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Manifest</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>text_content</string> </key>
<value> <string>CACHE MANIFEST\n
# generated on Fri, 09 Jun 2016 11:45:33 +0000\n
# XXX + fonts\n
# images/ajax-loader.gif\n
CACHE:\n
renderjs.js\n
rsvp.js\n
jquery.js\n
/\n
gadget_officejs_web_table_editor.js\n
gadget_officejs_liberator.js\n
gadget_officejs_liberator.html\n
jquery-sheets/wickedgrid.css\n
jquery-sheets/menu.html\n
jquery-sheets/font-awesome.css\n
jquery-sheets/js/thaw.js\n
jquery-sheets/js/raphael.js\n
jquery-sheets/js/copy3_of_undomanager.js\n
jquery-sheets/js/jquery-ui.js\n
jquery-sheets/js/globalize.js\n
jquery-sheets/js/jquery.nearest.js\n
jquery-sheets/js/megatable.js\n
jquery-sheets/js/wickedgrid.js\n
jquery-sheets/js/graphael/g.bar.js\n
jquery-sheets/js/graphael/g.line.js\n
jquery-sheets/js/graphael/g.raphael.js\n
jquery-sheets/js/graphael/g.pie.js\n
jquery-sheets/js/graphael/g.dot.js\n
jquery-sheets/js/ZeroClipboard.js\n
jquery-sheets/js/jquery.elastic.source.js\n
jquery-sheets/js/infiniscroll.js\n
jquery-sheets/js/undomanager.js\n
jquery-sheets/js/MouseWheel.js\n
jquery-sheets/bootstrap-theme.css\n
jquery-sheets/images/underline1.svg\n
jquery-sheets/images/strikethrough.svg\n
jquery-sheets/images/right183.svg\n
jquery-sheets/images/left181.svg\n
jquery-sheets/images/centered5.svg\n
jquery-sheets/images/italic3.svg\n
jquery-sheets/images/bold13.svg\n
jquery-sheets/bootstrap.css\n
NETWORK:\n
*</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Editor Gadget OfficeJS AppCache</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760724.6</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.29602.29356.10683</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760184.09</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Web Table Gadget</title>
<script src="rsvp.js" type="text/javascript"></script>
<script src="renderjs.js" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="jquery-sheets/wickedgrid.css">
<link rel="stylesheet" type="text/css" href="jquery-sheets/bootstrap.css">
<link rel="stylesheet" type="text/css" href="jquery-sheets/bootstrap-theme.css">
<!-- This gadget provides jquery sheets with all Plugins activated by default -->
<script src="gadget_officejs_web_table_editor.js" type="text/javascript"></script>
<!--dependencies-->
<script src="jquery.js"></script>
<script src="jquery-sheets/js/globalize.js"></script>
<script src="jquery-sheets/js/MouseWheel.js"></script>
<script src="jquery-sheets/js/megatable.js"></script>
<script src="jquery-sheets/js/infiniscroll.js"></script>
<script src="jquery-sheets/js/thaw.js"></script>
<!-- <script src="jquery-sheets/js/old_wickedgrid.js"></script>-->
<script src="jquery-sheets/js/wickedgrid.js"></script>
<!--optional-->
<!--Nearest-->
<script src="jquery-sheets/js/jquery.nearest.js"></script>
<!--/Nearest-->
<!--jQuery UI-->
<script src="jquery-sheets/js/jquery-ui.js"></script>
<!--/jQuery UI-->
<!--Raphaeljs - for charts-->
<script src="jquery-sheets/js/raphael.js"></script>
<script src="jquery-sheets/js/graphael/g.raphael.js"></script>
<script src="jquery-sheets/js/graphael/g.bar.js"></script>
<script src="jquery-sheets/js/graphael/g.dot.js"></script>
<script src="jquery-sheets/js/graphael/g.line.js"></script>
<script src="jquery-sheets/js/graphael/g.pie.js"></script>
<!--/Raphaeljs-->
<!--ColorPicker-->
<!--** <link rel="stylesheet" type="text/css" href="bower_components/really-simple-color-picker/css/colorPicker.css" />
<script src="bower_components/really-simple-color-picker/js/jquery.colorPicker.min.js"></script>
<!--/ColorPicker-->
<!--Elastic-->
<script src="jquery-sheets/js/jquery.elastic.source.js"></script>
<!--/Elastic-->
<!--Advanced_Math-->
<!--** <script src="src/WickedGrid/Plugin/advanced.js"></script>
<!--/Advanced_Math-->
<!--Finance-->
<!--** <script src="src/WickedGrid/Plugin/finance.js"></script>
<!--/Finance-->
<!--Undo-->
<script src="jquery-sheets/js/undomanager.js"></script>
<!--/Undo-->
<!--Zero Clipboard-->
<script src="jquery-sheets/js/ZeroClipboard.js"></script>
<!--/Zero Clipboard-->
</head>
<body>
<div id="jquery_sheet_gadget" class="jQuerySheet" style="min-height: 590px; max-height:600px">
<div id="sheetParent">
</div>
</div>
</body>
</html>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Page" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_web_table_editor.html</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_editor_html</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Page</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Gadget</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487949373.46</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.29602.29356.10683</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760046.42</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
/*global window, rJS*/
/*jslint maxlen:80*/
(function (rJS, RSVP) {
"use strict";
var wickedGrid = function (el, settings) {
settings = settings || {};
for (var p in WickedGrid.defaults) {
if (WickedGrid.defaults.hasOwnProperty(p)) {
settings[p] = settings.hasOwnProperty(p) ? settings[p] : WickedGrid.defaults[p];
}
}
var element = el,
$element = $(el),
instance = $element.getWickedGrid();
settings.useStack = (window.thaw === undefined ? false : settings.useStack);
settings.useMultiThreads = (window.operative === undefined ?
false : settings.useMultiThreads);
//destroy already existing spreadsheet
if (instance) {
var tables = $element.children().detach();
instance.kill();
$element.html(tables);
WickedGrid.events.forEach($element.unbind);
}
settings.element = element;
settings.$element = $element;
WickedGrid.events.forEach(function(event) {
$element.bind(event, settings[event]);
});
$element.children().each(function(i) {
// override frozenAt settings with table's data-frozenatrow
// and data-frozenatcol
var frozenAtRow = el.getAttribute('data-frozenatrow') * 1,
frozenAtCol = el.getAttribute('data-frozenatcol') * 1;
if (!settings.frozenAt[i]) {
settings.frozenAt[i] = {row:0, col:0};
}
if (frozenAtRow) {
settings.frozenAt[wickedGrid.i].row = frozenAtRow;
}
if (frozenAtCol) {
settings.frozenAt[wickedGrid.i].col = frozenAtCol;
}
});
var wickedGrid = new WickedGrid(settings);
return wickedGrid;
};
function tablify (rows, cols) {
var table = document.createElement('table'),
tr,
td,
rowIndex=0,
colIndex=0,
tbody = table.appendChild(document.createElement('tbody'));
while (rowIndex < rows ) {
tr = document.createElement('tr');
tbody.appendChild(tr);
while (colIndex < cols) {
td = document.createElement('td');
tr.appendChild(td);
colIndex++;
}
colIndex = 0;
rowIndex++;
}
return table;
}
function parseHtml (gadget, html, selector) {
var parent = document.createElement('div');
if (html === '') {
html = tablify(10,6);
parent.innerHTML = html.outerHTML;
} else {
parent.innerHTML = html;
}
if (selector) {
gadget.props.element.querySelector(selector).innerHTML = parent.outerHTML;
return parent.children;
}
return parent.children;
}
function initiate (gadget, sheetGet) {
var url = 'jquery-sheets/menu.html';
$.when($.get(url))
.always(function(nav_menu) {
if (!nav_menu.status) {
//clearTimeout(noResponseTimer);
localStorage[url] = nav_menu;
}
else {
if (!!localStorage[url]) {
nav_menu = localStorage[url];
}
}
var jS = $('#jquery_sheet_gadget')
.html(parseHtml(gadget, sheetGet, 'div#sheetParent'));
var wg = wickedGrid(jS[0], {
theme: WickedGrid.bootstrapTheme,
title: '',
height: '600px',
headerMenu: function(wg) {
var menu = $(nav_menu);
wg.saveSheet = function () {
return gadget.submitContent();
}
menu.find('a').each(function() {
this.wickedGrid = wg;
});
if (menu.is('ul')) {
menu
.find("ul").hide()
.addClass(wg.theme.menuUl);
menu.find("li")
.addClass(wg.theme.menuLi)
.hover(function () {
$(this).find('ul:first')
.hide()
.show();
}, function () {
$(this).find('ul:first')
.hide();
});
}
return menu;
}
});
gadget.props.wickedGrid = wg;
});
$('td').click(function() {
window.focus();
});
return;
}
rJS(window)
.ready(function (g) {
g.props = {};
})
.ready(function (g) {
return g.getElement()
.push(function (element) {
var textarea = element.querySelector('textarea');
g.props.element = element;
});
})
.declareAcquiredMethod("submitContent", "triggerSubmit")
.declareAcquiredMethod("maximize", "triggerMaximize")
.declareMethod('render', function (options) {
var gadget = this;
this.props.key = options.key || "text_content";
return new RSVP.Queue()
.push(function(nav_menu) {
initiate(gadget, options.value || '');
return {};
});
})
.declareMethod('getContent', function () {
var result = {},
value,
tables = this.props.wickedGrid.loader.toTables();
for (var table in tables) {
if (tables[table].textContent) {
value = result[this.props.key] || '';
result[this.props.key] = value + tables[table].outerHTML;
}
}
return result;
});
}(rJS, RSVP));
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_web_table_editor.js</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_editor_js</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Web Table Gadget JS</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760704.27</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="favicon.ico">
<title>Web Table Editor</title>
<link href="//netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet" type="text/css" />
<link rel="stylesheet" href="jquerymobile.css">
<link rel="stylesheet" href="gadget_erp5.css">
<script data-renderjs-configuration="application_title" type="text/x-renderjs-configuration">Web Table Editor</script>
<script data-renderjs-configuration="panel_gadget" type="text/x-renderjs-configuration">gadget_officejs_application_panel.html</script>
<script data-renderjs-configuration="action_view" type="text/x-renderjs-configuration">object_view</script>
<script data-renderjs-configuration="default_view_reference" type="text/x-renderjs-configuration">view</script>
<script data-renderjs-configuration="hateoas_url" type="text/x-renderjs-configuration">hateoas/</script>
<script data-renderjs-configuration="frontpage_gadget" type="text/x-renderjs-configuration">worklist</script>
<script src="jquery.js"></script>
<script src="jquerymobile.js"></script>
<script src="rsvp.js"></script>
<script src="renderjs.js"></script>
<script src="gadget_global.js" ></script>
<script src="erp5_launcher.js"></script>
</head>
<body>
<div data-role="page">
<div data-gadget-url="gadget_jio.html"
data-gadget-scope="setting_gadget"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_officejs_web_table_router.html"
data-gadget-scope="router"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_translation.html"
data-gadget-scope="translation_gadget"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_officejs_header.html"
data-gadget-scope="header"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_officejs_jio.html"
data-gadget-scope="jio_gadget"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_erp5_editor_panel.html"
data-gadget-scope="editor_panel"
data-gadget-sandbox="public"></div>
<div data-gadget-url="gadget_officejs_application_panel.html"
data-gadget-scope="panel"
data-gadget-sandbox="public"></div>
<div role="main" class="ui-content gadget-content"></div>
</div>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Page" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>web_table_landing_page.html</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_landing_page_html</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Page</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Landing Page</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760657.01</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.29602.29356.10683</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760236.22</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, user-scalable=no" />
<title>OfficeJS Router Gadget</title>
<!-- renderjs -->
<script src="rsvp.js" type="text/javascript"></script>
<script src="renderjs.js" type="text/javascript"></script>
<!-- custom script -->
<script src="gadget_officejs_router.js" type="text/javascript"></script>
</head>
<body>
<script data-renderjs-configuration="portal_type" type="text/x-renderjs-configuration">Web Table</script>
<script data-renderjs-configuration="parent_relative_url" type="text/x-renderjs-configuration">web_page_module</script>
<script data-renderjs-configuration="document_title" type="text/x-renderjs-configuration">Jquery Sheet Document</script>
<script data-renderjs-configuration="document_title_plural" type="text/x-renderjs-configuration">Jquery Sheet Documents</script>
<script data-renderjs-configuration="erp5_attachment_synchro" type="text/x-renderjs-configuration">/{+id}?format=</script>
<script data-renderjs-configuration="global_setting_gadget_url" type="text/x-renderjs-configuration">../officejs_setting_gadget/</script>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Page" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_web_table_router.html</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_router.html</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Page</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Router</string> </value>
</item>
<item>
<key> <string>url_string</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760657.0</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>OfficeJS Jio Web Page View</title>
<script src="rsvp.js"></script>
<script src="renderjs.js"></script>
<script src="handlebars.js"></script>
<script class="view-web-page-template" type="text/x-handlebars-template">
<form class="view-web-page-form">
<div class="center">
<div class="ui-field-contain">
<label data-i18n="Title:">Title:</label>
<div class="ui-input-text ui-body-inherit ui-corner-all ui-shadow-inset">
<input type="text" name="title" value="{{title}}">
</div>
</div>
<button type="submit" data-i18n="Save" style="display:none;">Save</button>
<div class="ui-field-contain">
<label data-i18n="Reference:">Reference:</label>
<input type="text" name="reference" value="{{reference}}">
</div>
<div class="ui-field-contain">
<label data-i18n="Version:">Version:</label>
<input type="text" name="version" value="{{version}}"></label>
</div>
<div class="ui-field-contain">
<label data-i18n="Language:">Language:</label>
<input type="text" name="language" value="{{language}}">
</div>
<div class="ui-field-contain">
<label data-i18n="Description:">Description:</label>
<textarea name="description">{{description}}</textarea>
</div>
<div class='document-content'></div>
</div>
</div>
</form>
</script>
<script src="gadget_officejs_jio_web_table_view.js"></script>
</head>
<body>
</body>
</html>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Page" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/html</string> </value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_jio_web_table_view.html</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_view_html</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Page</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Jio Jquery Spreadsheets View</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760657.03</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
/*globals window, rJS, Handlebars, RSVP, loopEventListener, console*/
/*jslint indent: 2, nomen: true, maxlen: 80*/
(function (window, RSVP, rJS, Handlebars, loopEventListener) {
"use strict";
function saveContent(gadget, submit_event) {
var i,
doc = gadget.options.doc,
now = new Date();
doc.parent_relative_url = "web_page_module";
doc.portal_type = "Web Table";
doc.modification_date = now.toISOString();
for (i = 0; i < submit_event.target.length; i += 1) {
// XXX Should check input type instead
if (submit_event.target[i].name) {
doc[submit_event.target[i].name] = submit_event.target[i].value;
}
}
return new RSVP.Queue()
.push(function () {
return gadget.getDeclaredGadget("my_text_content");
})
.push(function (text_content_gadget) {
return text_content_gadget.getContent();
})
.push(function (data) {
doc.text_content = data.text_content;
return gadget.put(gadget.options.jio_key, doc);
});
}
function maximize(gadget) {
var iframe = gadget.props.element.querySelector('iframe'),
iframe_class_string = iframe.getAttribute('class') || "",
class_name = "ui-content-maximize",
class_index = iframe_class_string.indexOf(class_name);
if (class_index === -1) {
iframe_class_string += ' ' + class_name;
iframe.setAttribute('style', '');
iframe.setAttribute('class', iframe_class_string);
return;
}
iframe_class_string = iframe_class_string.substring(0, class_index)
+ iframe_class_string.substring(class_index + class_name.length);
iframe.setAttribute('style', 'width:100%; border: 0 none; height: 600px');
iframe.setAttribute('class', iframe_class_string);
return;
}
var gadget_klass = rJS(window),
source = gadget_klass.__template_element
.querySelector(".view-web-page-template")
.innerHTML,
template = Handlebars.compile(source);
gadget_klass
.ready(function (g) {
g.props = {};
g.options = null;
return g.getElement()
.push(function (element) {
g.props.element = element;
g.props.deferred = RSVP.defer();
});
})
.declareAcquiredMethod("updateHeader", "updateHeader")
.declareAcquiredMethod("get", "jio_get")
.declareAcquiredMethod("translateHtml", "translateHtml")
.declareAcquiredMethod("put", "jio_put")
.declareAcquiredMethod('allDocs', 'jio_allDocs')
.declareAcquiredMethod("redirect", "redirect")
.allowPublicAcquisition('triggerMaximize', function () {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
})
.fail(function (e) {
console.log(e);
});
})
.allowPublicAcquisition('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod('triggerSubmit', function (option) {
if (option[0] === "maximize" || option === "maximize") {
var gadget = this;
return RSVP.Queue()
.push(function () {
return maximize(gadget);
});
}
return this.props.element.querySelector('button').click();
})
.declareMethod("render", function (options) {
var gadget = this;
gadget.options = options;
gadget.options.doc.title = gadget.options.doc.title || "";
return new RSVP.Queue()
.push(function () {
return gadget.translateHtml(template(options.doc));
})
.push(function (html) {
gadget.props.element.innerHTML = html;
return gadget.updateHeader({
title: options.doc.title + " | Web Table",
save_action: true,
maximize_action: true,
maximized: gadget.options.doc.title !== ""
});
})
.push(function () {
return gadget.props.deferred.resolve();
});
})
/////////////////////////////////////////
// Render text content gadget
/////////////////////////////////////////
.declareService(function () {
var gadget = this,
text_gadget = null;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return gadget.declareGadget(
"../../officejs_web_table_editor_gadget/development/",
{
scope: "my_text_content",
sandbox: "iframe",
element: gadget.props.element.querySelector(".document-content")
}
);
})
.push(function (text_content_gadget) {
var iframe = gadget.props.element.querySelector('iframe');
iframe.setAttribute(
'style',
'width:100%; border: 0 none; height: 600px'
);
text_gadget = text_content_gadget;
return text_content_gadget.render({
"key": 'text_content',
"value": gadget.options.doc.text_content
});
})
.push(function () {
return text_gadget.getElement();
}, function (error) {
var display_error_element;
if (error.message.indexOf("Timeout while loading:") === 0
|| error.indexOf("Timed out after ") === 0) {
display_error_element =
gadget.props.element.querySelector(
"form div.center"
);
display_error_element.innerHTML =
'<br/><p style="color: red"></p><br/><br/>' +
display_error_element.innerHTML;
display_error_element.querySelector('p').textContent =
"TIMEOUT: The editor gadget is taking too long to load but is" +
" currently being cached, please wait for the page to load" +
" (check your browser loading icon) and then refresh.";
} else {
throw error;
}
})
.push(function () {
if (gadget.options.doc.title !== "") {
return gadget.triggerSubmit("maximize");
}
});
})
/////////////////////////////////////////
// Form submit
/////////////////////////////////////////
.declareService(function () {
var gadget = this;
return new RSVP.Queue()
.push(function () {
return gadget.props.deferred.promise;
})
.push(function () {
return loopEventListener(
gadget.props.element.querySelector('form'),
'submit',
true,
function (event) {
return saveContent(gadget, event);
}
);
});
});
}(window, RSVP, rJS, Handlebars, loopEventListener));
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Script" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Change_local_roles_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Manager</string>
<string>Owner</string>
</tuple>
</value>
</item>
<item>
<key> <string>content_md5</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>default_reference</string> </key>
<value> <string>gadget_officejs_jio_web_table_view.js</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>gadget_web_table_view_js</string> </value>
</item>
<item>
<key> <string>language</string> </key>
<value> <string>en</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Script</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>OfficeJS Jio Jquery SpreadSheets View JS</string> </value>
</item>
<item>
<key> <string>version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>document_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760704.29</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Site" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Site/officejs_web_table_editor</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>frontpage_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_frontpage_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_application_title</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_hateoas_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_view_action_category</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_default_view_action_reference</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_panel_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_router_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_jio_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_translation_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_manifest_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_header_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_content_security_policy</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_x_frame_options</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_latest_document_version</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_latest_version</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_cache_file</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_landing_page</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_sub_gadget_installer</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
<item>
<key> <string>available_language</string> </key>
<value>
<tuple>
<string>en</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>caching_policy/must-revalidate</string>
<string>aggregate/web_page_module/gadget_officejs_bootloader.html</string>
</tuple>
</value>
</item>
<item>
<key> <string>configuration_application_title</string> </key>
<value> <string>Illustration Editor</string> </value>
</item>
<item>
<key> <string>configuration_cache_file</string> </key>
<value> <string>gadget_officejs_web_table.appcache</string> </value>
</item>
<item>
<key> <string>configuration_content_security_policy</string> </key>
<value> <string>default-src \'self\' data: https: \'unsafe-inline\'</string> </value>
</item>
<item>
<key> <string>configuration_default_view_action_reference</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_frontpage_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_hateoas_url</string> </key>
<value> <string>hateoas/</string> </value>
</item>
<item>
<key> <string>configuration_header_gadget_url</string> </key>
<value> <string>gadget_officejs_header.html</string> </value>
</item>
<item>
<key> <string>configuration_jio_gadget_url</string> </key>
<value> <string>gadget_officejs_jio.html</string> </value>
</item>
<item>
<key> <string>configuration_landing_page</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_latest_document_version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>configuration_latest_version</string> </key>
<value> <string>development</string> </value>
</item>
<item>
<key> <string>configuration_manifest_url</string> </key>
<value> <string>gadget_officejs.appcache</string> </value>
</item>
<item>
<key> <string>configuration_panel_gadget_url</string> </key>
<value> <string>gadget_officejs_application_panel.html</string> </value>
</item>
<item>
<key> <string>configuration_router_gadget_url</string> </key>
<value> <string>gadget_officejs_svg_editor_router.html</string> </value>
</item>
<item>
<key> <string>configuration_sub_gadget_installer</string> </key>
<value> <string>../officejs_web_table_editor_gadget/</string> </value>
</item>
<item>
<key> <string>configuration_translation_gadget_url</string> </key>
<value> <string>gadget_translation.html</string> </value>
</item>
<item>
<key> <string>configuration_view_action_category</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_x_frame_options</string> </key>
<value> <string>SAMEORIGIN</string> </value>
</item>
<item>
<key> <string>container_layout</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>content_layout</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>custom_render_method_id</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>frontpage_gadget_url</string> </key>
<value> <string>gadget_woelfel_pt_frontpage.html</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>officejs_web_table_editor</string> </value>
</item>
<item>
<key> <string>layout_configuration_form_id</string> </key>
<value> <string>WebSection_viewOfficeJSApplicationPreference</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Site</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>skin_selection_name</string> </key>
<value> <string>RJSVersioning</string> </value>
</item>
<item>
<key> <string>static_language_selection</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Office JS Web Table Editor</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSiteTraversalHook" module="Products.ERP5.Document.WebSite"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="8" aka="AAAAAAAAAAg=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>category_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAo=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="9" aka="AAAAAAAAAAk=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1486715645.82</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="10" aka="AAAAAAAAAAo=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.29602.29356.10683</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760263.83</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Section" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/development</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>__translation_dict</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_router_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_application_title</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_jio_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_content_security_policy</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_panel_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_translation_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_header_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_hateoas_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_manifest_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_x_frame_options</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>caching_policy/must-revalidate</string>
<string>aggregate/web_page_module/rjs_gadget_erp5_html</string>
</tuple>
</value>
</item>
<item>
<key> <string>configuration_application_title</string> </key>
<value> <string>Office Web Table Editor</string> </value>
</item>
<item>
<key> <string>configuration_content_security_policy</string> </key>
<value> <string>default-src \'none\'; img-src \'self\' data:; media-src \'self\' blob:; connect-src \'self\' https://localhost:5000 mail.tiolive.com data: *.host.vifib.net *.node.vifib.com *.erp5.net; script-src \'self\' \'unsafe-eval\'; font-src netdna.bootstrapcdn.com; style-src \'self\' netdna.bootstrapcdn.com \'unsafe-inline\' data:; frame-src \'self\' data: *.app.officejs.com</string> </value>
</item>
<item>
<key> <string>configuration_hateoas_url</string> </key>
<value> <string>hateoas/</string> </value>
</item>
<item>
<key> <string>configuration_header_gadget_url</string> </key>
<value> <string>gadget_officejs_header.html</string> </value>
</item>
<item>
<key> <string>configuration_jio_gadget_url</string> </key>
<value> <string>gadget_officejs_jio.html</string> </value>
</item>
<item>
<key> <string>configuration_manifest_url</string> </key>
<value> <string>gadget_officejs_web_table_editor.appcache</string> </value>
</item>
<item>
<key> <string>configuration_panel_gadget_url</string> </key>
<value> <string>gadget_officejs_application_panel.html</string> </value>
</item>
<item>
<key> <string>configuration_router_gadget_url</string> </key>
<value> <string>gadget_officejs_web_table_router.html</string> </value>
</item>
<item>
<key> <string>configuration_translation_gadget_url</string> </key>
<value> <string>gadget_translation.html</string> </value>
</item>
<item>
<key> <string>configuration_x_frame_options</string> </key>
<value> <string>SAMEORIGIN</string> </value>
</item>
<item>
<key> <string>container_layout</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>content_layout</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>custom_render_method_id</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>empty_criterion_valid</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>development</string> </value>
</item>
<item>
<key> <string>layout_configuration_form_id</string> </key>
<value> <string>WebSection_viewRenderJSPreference</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Section</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>skin_selection_name</string> </key>
<value> <string>RJS</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Editor Development</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>category_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487769800.24</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.32135.29137.19387</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760449.46</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Site" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Site/officejs_web_table_editor_gadget</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>_count</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>frontpage_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_frontpage_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_application_title</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_hateoas_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_view_action_category</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_default_view_action_reference</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_panel_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_router_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_jio_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_translation_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_manifest_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_header_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_content_security_policy</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_latest_document_version</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_latest_version</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_cache_file</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_x_frame_options</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_redirect_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_landing_page</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_mt_index</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>_tree</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
<item>
<key> <string>available_language</string> </key>
<value>
<tuple>
<string>en</string>
</tuple>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>caching_policy/no-cache</string>
<string>aggregate/web_page_module/gadget_officejs_bootloader.html</string>
</tuple>
</value>
</item>
<item>
<key> <string>configuration_application_title</string> </key>
<value> <string>Bookmark Manager</string> </value>
</item>
<item>
<key> <string>configuration_cache_file</string> </key>
<value> <string>gadget_officejs_web_table_editor.appcache</string> </value>
</item>
<item>
<key> <string>configuration_content_security_policy</string> </key>
<value> <string>default-src \'self\' data: https: \'unsafe-inline\'</string> </value>
</item>
<item>
<key> <string>configuration_default_view_action_reference</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_frontpage_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_hateoas_url</string> </key>
<value> <string>hateoas/</string> </value>
</item>
<item>
<key> <string>configuration_header_gadget_url</string> </key>
<value> <string>gadget_officejs_header.html</string> </value>
</item>
<item>
<key> <string>configuration_jio_gadget_url</string> </key>
<value> <string>gadget_officejs_jio.html</string> </value>
</item>
<item>
<key> <string>configuration_landing_page</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_latest_document_version</string> </key>
<value> <string>001</string> </value>
</item>
<item>
<key> <string>configuration_latest_version</string> </key>
<value> <string>development</string> </value>
</item>
<item>
<key> <string>configuration_manifest_url</string> </key>
<value> <string>gadget_officejs_bookmark_manager.appcache</string> </value>
</item>
<item>
<key> <string>configuration_panel_gadget_url</string> </key>
<value> <string>gadget_officejs_bookmark_manager_panel.html</string> </value>
</item>
<item>
<key> <string>configuration_redirect_url</string> </key>
<value> <string>development</string> </value>
</item>
<item>
<key> <string>configuration_router_gadget_url</string> </key>
<value> <string>gadget_officejs_bookmark_manager_router.html</string> </value>
</item>
<item>
<key> <string>configuration_translation_gadget_url</string> </key>
<value> <string>gadget_translation.html</string> </value>
</item>
<item>
<key> <string>configuration_view_action_category</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_x_frame_options</string> </key>
<value> <string>ALLOW-FROM-ALL</string> </value>
</item>
<item>
<key> <string>container_layout</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>content_layout</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>custom_render_method_id</string> </key>
<value> <string>WebSection_renderOfficeJSApplicationPage</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>frontpage_gadget_url</string> </key>
<value> <string>gadget_woelfel_pt_frontpage.html</string> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>officejs_web_table_editor_gadget</string> </value>
</item>
<item>
<key> <string>layout_configuration_form_id</string> </key>
<value> <string>WebSection_viewOfficeJSApplicationPreference</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Site</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>skin_selection_name</string> </key>
<value> <string>RJSVersioning</string> </value>
</item>
<item>
<key> <string>static_language_selection</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Office JS Web Table Editor Gadget</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAg=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSiteTraversalHook" module="Products.ERP5.Document.WebSite"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="Length" module="BTrees.Length"/>
</pickle>
<pickle> <int>0</int> </pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="OOBTree" module="BTrees.OOBTree"/>
</pickle>
<pickle>
<none/>
</pickle>
</record>
<record id="8" aka="AAAAAAAAAAg=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>category_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAk=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAo=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="9" aka="AAAAAAAAAAk=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1486715671.69</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="10" aka="AAAAAAAAAAo=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.29602.29356.10683</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487760005.94</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Web Section" module="erp5.portal_type"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_Access_contents_information_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Add_portal_folders_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Copy_or_Move_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Delete_objects_Permission</string> </key>
<value>
<tuple>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_Modify_portal_content_Permission</string> </key>
<value>
<tuple>
<string>Assignee</string>
<string>Assignor</string>
<string>Manager</string>
</tuple>
</value>
</item>
<item>
<key> <string>_View_Permission</string> </key>
<value>
<tuple>
<string>Anonymous</string>
<string>Assignee</string>
<string>Assignor</string>
<string>Associate</string>
<string>Auditor</string>
<string>Authenticated</string>
<string>Author</string>
<string>Manager</string>
<string>Member</string>
<string>Owner</string>
<string>Reviewer</string>
</tuple>
</value>
</item>
<item>
<key> <string>__before_publishing_traverse__</string> </key>
<value>
<object>
<klass>
<global name="MultiHook" module="ZPublisher.BeforeTraverse"/>
</klass>
<tuple/>
<state>
<dictionary>
<item>
<key> <string>_defined_in_class</string> </key>
<value> <int>1</int> </value>
</item>
<item>
<key> <string>_hookname</string> </key>
<value> <string>__before_publishing_traverse__</string> </value>
</item>
<item>
<key> <string>_list</string> </key>
<value>
<list>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</list>
</value>
</item>
<item>
<key> <string>_prior</string> </key>
<value>
<none/>
</value>
</item>
</dictionary>
</state>
</object>
</value>
</item>
<item>
<key> <string>__before_traverse__</string> </key>
<value>
<dictionary>
<item>
<key>
<tuple>
<int>99</int>
<string>ERP5 Web Section/development</string>
</tuple>
</key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
<item>
<key> <string>__translation_dict</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>_identity_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAM=</string> </persistent>
</value>
</item>
<item>
<key> <string>_local_properties</string> </key>
<value>
<tuple>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_router_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_jio_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_panel_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_translation_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_header_gadget_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_hateoas_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_x_frame_options</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_manifest_url</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
<dictionary>
<item>
<key> <string>id</string> </key>
<value> <string>configuration_content_security_policy</string> </value>
</item>
<item>
<key> <string>type</string> </key>
<value> <string>string</string> </value>
</item>
</dictionary>
</tuple>
</value>
</item>
<item>
<key> <string>_range_criterion</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAQ=</string> </persistent>
</value>
</item>
<item>
<key> <string>categories</string> </key>
<value>
<tuple>
<string>caching_policy/must-revalidate</string>
<string>aggregate/web_page_module/gadget_web_table_editor_html</string>
</tuple>
</value>
</item>
<item>
<key> <string>configuration_content_security_policy</string> </key>
<value> <string>default-src \'self\'; img-src \'self\' data:; media-src \'self\' blob:; connect-src \'self\' https://content.dropboxapi.com https://api.dropboxapi.com https://localhost:5000 mail.tiolive.com data: *.host.vifib.net *.node.vifib.com *.erp5.net; script-src \'self\' \'unsafe-eval\' \'unsafe-inline\'; font-src \'self\' netdna.bootstrapcdn.com; style-src \'self\' netdna.bootstrapcdn.com \'unsafe-inline\' data:; frame-src \'self\' data:</string> </value>
</item>
<item>
<key> <string>configuration_hateoas_url</string> </key>
<value> <string>hateoas</string> </value>
</item>
<item>
<key> <string>configuration_header_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_jio_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_manifest_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_panel_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_router_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_translation_gadget_url</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>configuration_x_frame_options</string> </key>
<value> <string>ALLOW-FROM-ALL</string> </value>
</item>
<item>
<key> <string>container_layout</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>content_layout</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>custom_render_method_id</string> </key>
<value> <string>WebSection_renderDefaultPageAsGadget</string> </value>
</item>
<item>
<key> <string>description</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>empty_criterion_valid</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>development</string> </value>
</item>
<item>
<key> <string>layout_configuration_form_id</string> </key>
<value> <string>WebSection_viewRenderJSPreference</string> </value>
</item>
<item>
<key> <string>portal_type</string> </key>
<value> <string>Web Section</string> </value>
</item>
<item>
<key> <string>short_title</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>skin_selection_name</string> </key>
<value> <string>RJSVersioning</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string>Web Table Editor Gadget Development</string> </value>
</item>
<item>
<key> <string>visible</string> </key>
<value> <int>0</int> </value>
</item>
<item>
<key> <string>workflow_history</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAU=</string> </persistent>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="2" aka="AAAAAAAAAAI=">
<pickle>
<global name="WebSectionTraversalHook" module="Products.ERP5.Document.WebSection"/>
</pickle>
<pickle>
<dictionary/>
</pickle>
</record>
<record id="3" aka="AAAAAAAAAAM=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="4" aka="AAAAAAAAAAQ=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary/>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="5" aka="AAAAAAAAAAU=">
<pickle>
<global name="PersistentMapping" module="Persistence.mapping"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>data</string> </key>
<value>
<dictionary>
<item>
<key> <string>category_publication_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAY=</string> </persistent>
</value>
</item>
<item>
<key> <string>edit_workflow</string> </key>
<value>
<persistent> <string encoding="base64">AAAAAAAAAAc=</string> </persistent>
</value>
</item>
</dictionary>
</value>
</item>
</dictionary>
</pickle>
</record>
<record id="6" aka="AAAAAAAAAAY=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>publish</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>zope</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1486723357.94</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
<item>
<key> <string>validation_state</string> </key>
<value> <string>published</string> </value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
<record id="7" aka="AAAAAAAAAAc=">
<pickle>
<global name="WorkflowHistoryList" module="Products.ERP5Type.patches.WorkflowTool"/>
</pickle>
<pickle>
<tuple>
<none/>
<list>
<dictionary>
<item>
<key> <string>action</string> </key>
<value> <string>edit</string> </value>
</item>
<item>
<key> <string>actor</string> </key>
<value> <string>vincent</string> </value>
</item>
<item>
<key> <string>comment</string> </key>
<value>
<none/>
</value>
</item>
<item>
<key> <string>error_message</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>serial</string> </key>
<value> <string>957.32130.3812.57326</string> </value>
</item>
<item>
<key> <string>state</string> </key>
<value> <string>current</string> </value>
</item>
<item>
<key> <string>time</string> </key>
<value>
<object>
<klass>
<global name="DateTime" module="DateTime.DateTime"/>
</klass>
<tuple>
<none/>
</tuple>
<state>
<tuple>
<float>1487761248.38</float>
<string>UTC</string>
</tuple>
</state>
</object>
</value>
</item>
</dictionary>
</list>
</tuple>
</pickle>
</record>
</ZopeData>
<registered_skin_selection>
<skin_folder_selection>
<skin_folder>erp5_officejs_image_editor</skin_folder>
<skin_folder>erp5_officejs_jquery_app</skin_folder>
<skin_selection>RJSVersioning</skin_selection>
</skin_folder_selection>
</registered_skin_selection>
\ No newline at end of file
......@@ -20,7 +20,7 @@
</item>
<item>
<key> <string>id</string> </key>
<value> <string>erp5_officejs_image_editor</string> </value>
<value> <string>erp5_officejs_jquery_app</string> </value>
</item>
<item>
<key> <string>title</string> </key>
......
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>jquery-sheets</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* Bootstrap v3.2.0 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn:active,
.btn.active {
background-image: none;
}
.btn-default {
text-shadow: 0 1px 0 #fff;
background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #dbdbdb;
border-color: #ccc;
}
.btn-default:hover,
.btn-default:focus {
background-color: #e0e0e0;
background-position: 0 -15px;
}
.btn-default:active,
.btn-default.active {
background-color: #e0e0e0;
border-color: #dbdbdb;
}
.btn-default:disabled,
.btn-default[disabled] {
background-color: #e0e0e0;
background-image: none;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#2d6ca2));
background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #2b669a;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #2d6ca2;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #2d6ca2;
border-color: #2b669a;
}
.btn-primary:disabled,
.btn-primary[disabled] {
background-color: #2d6ca2;
background-image: none;
}
.btn-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #3e8f3e;
}
.btn-success:hover,
.btn-success:focus {
background-color: #419641;
background-position: 0 -15px;
}
.btn-success:active,
.btn-success.active {
background-color: #419641;
border-color: #3e8f3e;
}
.btn-success:disabled,
.btn-success[disabled] {
background-color: #419641;
background-image: none;
}
.btn-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #28a4c9;
}
.btn-info:hover,
.btn-info:focus {
background-color: #2aabd2;
background-position: 0 -15px;
}
.btn-info:active,
.btn-info.active {
background-color: #2aabd2;
border-color: #28a4c9;
}
.btn-info:disabled,
.btn-info[disabled] {
background-color: #2aabd2;
background-image: none;
}
.btn-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #e38d13;
}
.btn-warning:hover,
.btn-warning:focus {
background-color: #eb9316;
background-position: 0 -15px;
}
.btn-warning:active,
.btn-warning.active {
background-color: #eb9316;
border-color: #e38d13;
}
.btn-warning:disabled,
.btn-warning[disabled] {
background-color: #eb9316;
background-image: none;
}
.btn-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-color: #b92c28;
}
.btn-danger:hover,
.btn-danger:focus {
background-color: #c12e2a;
background-position: 0 -15px;
}
.btn-danger:active,
.btn-danger.active {
background-color: #c12e2a;
border-color: #b92c28;
}
.btn-danger:disabled,
.btn-danger[disabled] {
background-color: #c12e2a;
background-image: none;
}
.thumbnail,
.img-thumbnail {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
background-color: #e8e8e8;
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
background-color: #357ebd;
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
background-repeat: repeat-x;
}
.navbar-default {
background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
}
.navbar-default .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f3f3f3));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
}
.navbar-brand,
.navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
}
.navbar-inverse {
background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
background-repeat: repeat-x;
}
.navbar-inverse .navbar-nav > .active > a {
background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#222), to(#282828));
background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);
background-repeat: repeat-x;
-webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
}
.navbar-inverse .navbar-brand,
.navbar-inverse .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
}
.navbar-static-top,
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
.alert {
text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
}
.alert-success {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
background-repeat: repeat-x;
border-color: #b2dba1;
}
.alert-info {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
background-repeat: repeat-x;
border-color: #9acfea;
}
.alert-warning {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
background-repeat: repeat-x;
border-color: #f5e79e;
}
.alert-danger {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
background-repeat: repeat-x;
border-color: #dca7a7;
}
.progress {
background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar {
background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3071a9));
background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-success {
background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-info {
background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-warning {
background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-danger {
background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
background-repeat: repeat-x;
}
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.list-group {
border-radius: 4px;
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
text-shadow: 0 -1px 0 #3071a9;
background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#3278b3));
background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
background-repeat: repeat-x;
border-color: #3278b3;
}
.panel {
-webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
}
.panel-default > .panel-heading {
background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
background-repeat: repeat-x;
}
.panel-primary > .panel-heading {
background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#428bca), to(#357ebd));
background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
background-repeat: repeat-x;
}
.panel-success > .panel-heading {
background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
background-repeat: repeat-x;
}
.panel-info > .panel-heading {
background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
background-repeat: repeat-x;
}
.panel-warning > .panel-heading {
background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
background-repeat: repeat-x;
}
.panel-danger > .panel-heading {
background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
background-repeat: repeat-x;
}
.well {
background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
background-repeat: repeat-x;
border-color: #dcdcdc;
-webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
}
/*# sourceMappingURL=bootstrap-theme.css.map */
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>bootstrap-theme.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>bootstrap.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* Font Awesome 4.5.0 by @davegandy - http://fontawesome.io - @fontawesome
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/
/* FONT PATH
* -------------------------- */
@font-face {
font-family: 'FontAwesome';
src: url('../fonts/fontawesome-webfont.eot?v=4.5.0');
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.5.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff2?v=4.5.0') format('woff2'), url('../fonts/fontawesome-webfont.woff?v=4.5.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.5.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.5.0#fontawesomeregular') format('svg');
font-weight: normal;
font-style: normal;
}
.fa {
display: inline-block;
font: normal normal normal 14px/1 FontAwesome;
font-size: inherit;
text-rendering: auto;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
/* makes the font 33% larger relative to the icon container */
.fa-lg {
font-size: 1.33333333em;
line-height: 0.75em;
vertical-align: -15%;
}
.fa-2x {
font-size: 2em;
}
.fa-3x {
font-size: 3em;
}
.fa-4x {
font-size: 4em;
}
.fa-5x {
font-size: 5em;
}
.fa-fw {
width: 1.28571429em;
text-align: center;
}
.fa-ul {
padding-left: 0;
margin-left: 2.14285714em;
list-style-type: none;
}
.fa-ul > li {
position: relative;
}
.fa-li {
position: absolute;
left: -2.14285714em;
width: 2.14285714em;
top: 0.14285714em;
text-align: center;
}
.fa-li.fa-lg {
left: -1.85714286em;
}
.fa-border {
padding: .2em .25em .15em;
border: solid 0.08em #eeeeee;
border-radius: .1em;
}
.fa-pull-left {
float: left;
}
.fa-pull-right {
float: right;
}
.fa.fa-pull-left {
margin-right: .3em;
}
.fa.fa-pull-right {
margin-left: .3em;
}
/* Deprecated as of 4.4.0 */
.pull-right {
float: right;
}
.pull-left {
float: left;
}
.fa.pull-left {
margin-right: .3em;
}
.fa.pull-right {
margin-left: .3em;
}
.fa-spin {
-webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear;
}
.fa-pulse {
-webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8);
}
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
.fa-rotate-90 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
-webkit-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
.fa-rotate-180 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
-webkit-transform: rotate(180deg);
-ms-transform: rotate(180deg);
transform: rotate(180deg);
}
.fa-rotate-270 {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
-webkit-transform: rotate(270deg);
-ms-transform: rotate(270deg);
transform: rotate(270deg);
}
.fa-flip-horizontal {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
-webkit-transform: scale(-1, 1);
-ms-transform: scale(-1, 1);
transform: scale(-1, 1);
}
.fa-flip-vertical {
filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
-webkit-transform: scale(1, -1);
-ms-transform: scale(1, -1);
transform: scale(1, -1);
}
:root .fa-rotate-90,
:root .fa-rotate-180,
:root .fa-rotate-270,
:root .fa-flip-horizontal,
:root .fa-flip-vertical {
filter: none;
}
.fa-stack {
position: relative;
display: inline-block;
width: 2em;
height: 2em;
line-height: 2em;
vertical-align: middle;
}
.fa-stack-1x,
.fa-stack-2x {
position: absolute;
left: 0;
width: 100%;
text-align: center;
}
.fa-stack-1x {
line-height: inherit;
}
.fa-stack-2x {
font-size: 2em;
}
.fa-inverse {
color: #ffffff;
}
/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
readers do not read off random characters that represent icons */
.fa-glass:before {
content: "\f000";
}
.fa-music:before {
content: "\f001";
}
.fa-search:before {
content: "\f002";
}
.fa-envelope-o:before {
content: "\f003";
}
.fa-heart:before {
content: "\f004";
}
.fa-star:before {
content: "\f005";
}
.fa-star-o:before {
content: "\f006";
}
.fa-user:before {
content: "\f007";
}
.fa-film:before {
content: "\f008";
}
.fa-th-large:before {
content: "\f009";
}
.fa-th:before {
content: "\f00a";
}
.fa-th-list:before {
content: "\f00b";
}
.fa-check:before {
content: "\f00c";
}
.fa-remove:before,
.fa-close:before,
.fa-times:before {
content: "\f00d";
}
.fa-search-plus:before {
content: "\f00e";
}
.fa-search-minus:before {
content: "\f010";
}
.fa-power-off:before {
content: "\f011";
}
.fa-signal:before {
content: "\f012";
}
.fa-gear:before,
.fa-cog:before {
content: "\f013";
}
.fa-trash-o:before {
content: "\f014";
}
.fa-home:before {
content: "\f015";
}
.fa-file-o:before {
content: "\f016";
}
.fa-clock-o:before {
content: "\f017";
}
.fa-road:before {
content: "\f018";
}
.fa-download:before {
content: "\f019";
}
.fa-arrow-circle-o-down:before {
content: "\f01a";
}
.fa-arrow-circle-o-up:before {
content: "\f01b";
}
.fa-inbox:before {
content: "\f01c";
}
.fa-play-circle-o:before {
content: "\f01d";
}
.fa-rotate-right:before,
.fa-repeat:before {
content: "\f01e";
}
.fa-refresh:before {
content: "\f021";
}
.fa-list-alt:before {
content: "\f022";
}
.fa-lock:before {
content: "\f023";
}
.fa-flag:before {
content: "\f024";
}
.fa-headphones:before {
content: "\f025";
}
.fa-volume-off:before {
content: "\f026";
}
.fa-volume-down:before {
content: "\f027";
}
.fa-volume-up:before {
content: "\f028";
}
.fa-qrcode:before {
content: "\f029";
}
.fa-barcode:before {
content: "\f02a";
}
.fa-tag:before {
content: "\f02b";
}
.fa-tags:before {
content: "\f02c";
}
.fa-book:before {
content: "\f02d";
}
.fa-bookmark:before {
content: "\f02e";
}
.fa-print:before {
content: "\f02f";
}
.fa-camera:before {
content: "\f030";
}
.fa-font:before {
content: "\f031";
}
.fa-bold:before {
content: "\f032";
}
.fa-italic:before {
content: "\f033";
}
.fa-text-height:before {
content: "\f034";
}
.fa-text-width:before {
content: "\f035";
}
.fa-align-left:before {
content: "\f036";
}
.fa-align-center:before {
content: "\f037";
}
.fa-align-right:before {
content: "\f038";
}
.fa-align-justify:before {
content: "\f039";
}
.fa-list:before {
content: "\f03a";
}
.fa-dedent:before,
.fa-outdent:before {
content: "\f03b";
}
.fa-indent:before {
content: "\f03c";
}
.fa-video-camera:before {
content: "\f03d";
}
.fa-photo:before,
.fa-image:before,
.fa-picture-o:before {
content: "\f03e";
}
.fa-pencil:before {
content: "\f040";
}
.fa-map-marker:before {
content: "\f041";
}
.fa-adjust:before {
content: "\f042";
}
.fa-tint:before {
content: "\f043";
}
.fa-edit:before,
.fa-pencil-square-o:before {
content: "\f044";
}
.fa-share-square-o:before {
content: "\f045";
}
.fa-check-square-o:before {
content: "\f046";
}
.fa-arrows:before {
content: "\f047";
}
.fa-step-backward:before {
content: "\f048";
}
.fa-fast-backward:before {
content: "\f049";
}
.fa-backward:before {
content: "\f04a";
}
.fa-play:before {
content: "\f04b";
}
.fa-pause:before {
content: "\f04c";
}
.fa-stop:before {
content: "\f04d";
}
.fa-forward:before {
content: "\f04e";
}
.fa-fast-forward:before {
content: "\f050";
}
.fa-step-forward:before {
content: "\f051";
}
.fa-eject:before {
content: "\f052";
}
.fa-chevron-left:before {
content: "\f053";
}
.fa-chevron-right:before {
content: "\f054";
}
.fa-plus-circle:before {
content: "\f055";
}
.fa-minus-circle:before {
content: "\f056";
}
.fa-times-circle:before {
content: "\f057";
}
.fa-check-circle:before {
content: "\f058";
}
.fa-question-circle:before {
content: "\f059";
}
.fa-info-circle:before {
content: "\f05a";
}
.fa-crosshairs:before {
content: "\f05b";
}
.fa-times-circle-o:before {
content: "\f05c";
}
.fa-check-circle-o:before {
content: "\f05d";
}
.fa-ban:before {
content: "\f05e";
}
.fa-arrow-left:before {
content: "\f060";
}
.fa-arrow-right:before {
content: "\f061";
}
.fa-arrow-up:before {
content: "\f062";
}
.fa-arrow-down:before {
content: "\f063";
}
.fa-mail-forward:before,
.fa-share:before {
content: "\f064";
}
.fa-expand:before {
content: "\f065";
}
.fa-compress:before {
content: "\f066";
}
.fa-plus:before {
content: "\f067";
}
.fa-minus:before {
content: "\f068";
}
.fa-asterisk:before {
content: "\f069";
}
.fa-exclamation-circle:before {
content: "\f06a";
}
.fa-gift:before {
content: "\f06b";
}
.fa-leaf:before {
content: "\f06c";
}
.fa-fire:before {
content: "\f06d";
}
.fa-eye:before {
content: "\f06e";
}
.fa-eye-slash:before {
content: "\f070";
}
.fa-warning:before,
.fa-exclamation-triangle:before {
content: "\f071";
}
.fa-plane:before {
content: "\f072";
}
.fa-calendar:before {
content: "\f073";
}
.fa-random:before {
content: "\f074";
}
.fa-comment:before {
content: "\f075";
}
.fa-magnet:before {
content: "\f076";
}
.fa-chevron-up:before {
content: "\f077";
}
.fa-chevron-down:before {
content: "\f078";
}
.fa-retweet:before {
content: "\f079";
}
.fa-shopping-cart:before {
content: "\f07a";
}
.fa-folder:before {
content: "\f07b";
}
.fa-folder-open:before {
content: "\f07c";
}
.fa-arrows-v:before {
content: "\f07d";
}
.fa-arrows-h:before {
content: "\f07e";
}
.fa-bar-chart-o:before,
.fa-bar-chart:before {
content: "\f080";
}
.fa-twitter-square:before {
content: "\f081";
}
.fa-facebook-square:before {
content: "\f082";
}
.fa-camera-retro:before {
content: "\f083";
}
.fa-key:before {
content: "\f084";
}
.fa-gears:before,
.fa-cogs:before {
content: "\f085";
}
.fa-comments:before {
content: "\f086";
}
.fa-thumbs-o-up:before {
content: "\f087";
}
.fa-thumbs-o-down:before {
content: "\f088";
}
.fa-star-half:before {
content: "\f089";
}
.fa-heart-o:before {
content: "\f08a";
}
.fa-sign-out:before {
content: "\f08b";
}
.fa-linkedin-square:before {
content: "\f08c";
}
.fa-thumb-tack:before {
content: "\f08d";
}
.fa-external-link:before {
content: "\f08e";
}
.fa-sign-in:before {
content: "\f090";
}
.fa-trophy:before {
content: "\f091";
}
.fa-github-square:before {
content: "\f092";
}
.fa-upload:before {
content: "\f093";
}
.fa-lemon-o:before {
content: "\f094";
}
.fa-phone:before {
content: "\f095";
}
.fa-square-o:before {
content: "\f096";
}
.fa-bookmark-o:before {
content: "\f097";
}
.fa-phone-square:before {
content: "\f098";
}
.fa-twitter:before {
content: "\f099";
}
.fa-facebook-f:before,
.fa-facebook:before {
content: "\f09a";
}
.fa-github:before {
content: "\f09b";
}
.fa-unlock:before {
content: "\f09c";
}
.fa-credit-card:before {
content: "\f09d";
}
.fa-feed:before,
.fa-rss:before {
content: "\f09e";
}
.fa-hdd-o:before {
content: "\f0a0";
}
.fa-bullhorn:before {
content: "\f0a1";
}
.fa-bell:before {
content: "\f0f3";
}
.fa-certificate:before {
content: "\f0a3";
}
.fa-hand-o-right:before {
content: "\f0a4";
}
.fa-hand-o-left:before {
content: "\f0a5";
}
.fa-hand-o-up:before {
content: "\f0a6";
}
.fa-hand-o-down:before {
content: "\f0a7";
}
.fa-arrow-circle-left:before {
content: "\f0a8";
}
.fa-arrow-circle-right:before {
content: "\f0a9";
}
.fa-arrow-circle-up:before {
content: "\f0aa";
}
.fa-arrow-circle-down:before {
content: "\f0ab";
}
.fa-globe:before {
content: "\f0ac";
}
.fa-wrench:before {
content: "\f0ad";
}
.fa-tasks:before {
content: "\f0ae";
}
.fa-filter:before {
content: "\f0b0";
}
.fa-briefcase:before {
content: "\f0b1";
}
.fa-arrows-alt:before {
content: "\f0b2";
}
.fa-group:before,
.fa-users:before {
content: "\f0c0";
}
.fa-chain:before,
.fa-link:before {
content: "\f0c1";
}
.fa-cloud:before {
content: "\f0c2";
}
.fa-flask:before {
content: "\f0c3";
}
.fa-cut:before,
.fa-scissors:before {
content: "\f0c4";
}
.fa-copy:before,
.fa-files-o:before {
content: "\f0c5";
}
.fa-paperclip:before {
content: "\f0c6";
}
.fa-save:before,
.fa-floppy-o:before {
content: "\f0c7";
}
.fa-square:before {
content: "\f0c8";
}
.fa-navicon:before,
.fa-reorder:before,
.fa-bars:before {
content: "\f0c9";
}
.fa-list-ul:before {
content: "\f0ca";
}
.fa-list-ol:before {
content: "\f0cb";
}
.fa-strikethrough:before {
content: "\f0cc";
}
.fa-underline:before {
content: "\f0cd";
}
.fa-table:before {
content: "\f0ce";
}
.fa-magic:before {
content: "\f0d0";
}
.fa-truck:before {
content: "\f0d1";
}
.fa-pinterest:before {
content: "\f0d2";
}
.fa-pinterest-square:before {
content: "\f0d3";
}
.fa-google-plus-square:before {
content: "\f0d4";
}
.fa-google-plus:before {
content: "\f0d5";
}
.fa-money:before {
content: "\f0d6";
}
.fa-caret-down:before {
content: "\f0d7";
}
.fa-caret-up:before {
content: "\f0d8";
}
.fa-caret-left:before {
content: "\f0d9";
}
.fa-caret-right:before {
content: "\f0da";
}
.fa-columns:before {
content: "\f0db";
}
.fa-unsorted:before,
.fa-sort:before {
content: "\f0dc";
}
.fa-sort-down:before,
.fa-sort-desc:before {
content: "\f0dd";
}
.fa-sort-up:before,
.fa-sort-asc:before {
content: "\f0de";
}
.fa-envelope:before {
content: "\f0e0";
}
.fa-linkedin:before {
content: "\f0e1";
}
.fa-rotate-left:before,
.fa-undo:before {
content: "\f0e2";
}
.fa-legal:before,
.fa-gavel:before {
content: "\f0e3";
}
.fa-dashboard:before,
.fa-tachometer:before {
content: "\f0e4";
}
.fa-comment-o:before {
content: "\f0e5";
}
.fa-comments-o:before {
content: "\f0e6";
}
.fa-flash:before,
.fa-bolt:before {
content: "\f0e7";
}
.fa-sitemap:before {
content: "\f0e8";
}
.fa-umbrella:before {
content: "\f0e9";
}
.fa-paste:before,
.fa-clipboard:before {
content: "\f0ea";
}
.fa-lightbulb-o:before {
content: "\f0eb";
}
.fa-exchange:before {
content: "\f0ec";
}
.fa-cloud-download:before {
content: "\f0ed";
}
.fa-cloud-upload:before {
content: "\f0ee";
}
.fa-user-md:before {
content: "\f0f0";
}
.fa-stethoscope:before {
content: "\f0f1";
}
.fa-suitcase:before {
content: "\f0f2";
}
.fa-bell-o:before {
content: "\f0a2";
}
.fa-coffee:before {
content: "\f0f4";
}
.fa-cutlery:before {
content: "\f0f5";
}
.fa-file-text-o:before {
content: "\f0f6";
}
.fa-building-o:before {
content: "\f0f7";
}
.fa-hospital-o:before {
content: "\f0f8";
}
.fa-ambulance:before {
content: "\f0f9";
}
.fa-medkit:before {
content: "\f0fa";
}
.fa-fighter-jet:before {
content: "\f0fb";
}
.fa-beer:before {
content: "\f0fc";
}
.fa-h-square:before {
content: "\f0fd";
}
.fa-plus-square:before {
content: "\f0fe";
}
.fa-angle-double-left:before {
content: "\f100";
}
.fa-angle-double-right:before {
content: "\f101";
}
.fa-angle-double-up:before {
content: "\f102";
}
.fa-angle-double-down:before {
content: "\f103";
}
.fa-angle-left:before {
content: "\f104";
}
.fa-angle-right:before {
content: "\f105";
}
.fa-angle-up:before {
content: "\f106";
}
.fa-angle-down:before {
content: "\f107";
}
.fa-desktop:before {
content: "\f108";
}
.fa-laptop:before {
content: "\f109";
}
.fa-tablet:before {
content: "\f10a";
}
.fa-mobile-phone:before,
.fa-mobile:before {
content: "\f10b";
}
.fa-circle-o:before {
content: "\f10c";
}
.fa-quote-left:before {
content: "\f10d";
}
.fa-quote-right:before {
content: "\f10e";
}
.fa-spinner:before {
content: "\f110";
}
.fa-circle:before {
content: "\f111";
}
.fa-mail-reply:before,
.fa-reply:before {
content: "\f112";
}
.fa-github-alt:before {
content: "\f113";
}
.fa-folder-o:before {
content: "\f114";
}
.fa-folder-open-o:before {
content: "\f115";
}
.fa-smile-o:before {
content: "\f118";
}
.fa-frown-o:before {
content: "\f119";
}
.fa-meh-o:before {
content: "\f11a";
}
.fa-gamepad:before {
content: "\f11b";
}
.fa-keyboard-o:before {
content: "\f11c";
}
.fa-flag-o:before {
content: "\f11d";
}
.fa-flag-checkered:before {
content: "\f11e";
}
.fa-terminal:before {
content: "\f120";
}
.fa-code:before {
content: "\f121";
}
.fa-mail-reply-all:before,
.fa-reply-all:before {
content: "\f122";
}
.fa-star-half-empty:before,
.fa-star-half-full:before,
.fa-star-half-o:before {
content: "\f123";
}
.fa-location-arrow:before {
content: "\f124";
}
.fa-crop:before {
content: "\f125";
}
.fa-code-fork:before {
content: "\f126";
}
.fa-unlink:before,
.fa-chain-broken:before {
content: "\f127";
}
.fa-question:before {
content: "\f128";
}
.fa-info:before {
content: "\f129";
}
.fa-exclamation:before {
content: "\f12a";
}
.fa-superscript:before {
content: "\f12b";
}
.fa-subscript:before {
content: "\f12c";
}
.fa-eraser:before {
content: "\f12d";
}
.fa-puzzle-piece:before {
content: "\f12e";
}
.fa-microphone:before {
content: "\f130";
}
.fa-microphone-slash:before {
content: "\f131";
}
.fa-shield:before {
content: "\f132";
}
.fa-calendar-o:before {
content: "\f133";
}
.fa-fire-extinguisher:before {
content: "\f134";
}
.fa-rocket:before {
content: "\f135";
}
.fa-maxcdn:before {
content: "\f136";
}
.fa-chevron-circle-left:before {
content: "\f137";
}
.fa-chevron-circle-right:before {
content: "\f138";
}
.fa-chevron-circle-up:before {
content: "\f139";
}
.fa-chevron-circle-down:before {
content: "\f13a";
}
.fa-html5:before {
content: "\f13b";
}
.fa-css3:before {
content: "\f13c";
}
.fa-anchor:before {
content: "\f13d";
}
.fa-unlock-alt:before {
content: "\f13e";
}
.fa-bullseye:before {
content: "\f140";
}
.fa-ellipsis-h:before {
content: "\f141";
}
.fa-ellipsis-v:before {
content: "\f142";
}
.fa-rss-square:before {
content: "\f143";
}
.fa-play-circle:before {
content: "\f144";
}
.fa-ticket:before {
content: "\f145";
}
.fa-minus-square:before {
content: "\f146";
}
.fa-minus-square-o:before {
content: "\f147";
}
.fa-level-up:before {
content: "\f148";
}
.fa-level-down:before {
content: "\f149";
}
.fa-check-square:before {
content: "\f14a";
}
.fa-pencil-square:before {
content: "\f14b";
}
.fa-external-link-square:before {
content: "\f14c";
}
.fa-share-square:before {
content: "\f14d";
}
.fa-compass:before {
content: "\f14e";
}
.fa-toggle-down:before,
.fa-caret-square-o-down:before {
content: "\f150";
}
.fa-toggle-up:before,
.fa-caret-square-o-up:before {
content: "\f151";
}
.fa-toggle-right:before,
.fa-caret-square-o-right:before {
content: "\f152";
}
.fa-euro:before,
.fa-eur:before {
content: "\f153";
}
.fa-gbp:before {
content: "\f154";
}
.fa-dollar:before,
.fa-usd:before {
content: "\f155";
}
.fa-rupee:before,
.fa-inr:before {
content: "\f156";
}
.fa-cny:before,
.fa-rmb:before,
.fa-yen:before,
.fa-jpy:before {
content: "\f157";
}
.fa-ruble:before,
.fa-rouble:before,
.fa-rub:before {
content: "\f158";
}
.fa-won:before,
.fa-krw:before {
content: "\f159";
}
.fa-bitcoin:before,
.fa-btc:before {
content: "\f15a";
}
.fa-file:before {
content: "\f15b";
}
.fa-file-text:before {
content: "\f15c";
}
.fa-sort-alpha-asc:before {
content: "\f15d";
}
.fa-sort-alpha-desc:before {
content: "\f15e";
}
.fa-sort-amount-asc:before {
content: "\f160";
}
.fa-sort-amount-desc:before {
content: "\f161";
}
.fa-sort-numeric-asc:before {
content: "\f162";
}
.fa-sort-numeric-desc:before {
content: "\f163";
}
.fa-thumbs-up:before {
content: "\f164";
}
.fa-thumbs-down:before {
content: "\f165";
}
.fa-youtube-square:before {
content: "\f166";
}
.fa-youtube:before {
content: "\f167";
}
.fa-xing:before {
content: "\f168";
}
.fa-xing-square:before {
content: "\f169";
}
.fa-youtube-play:before {
content: "\f16a";
}
.fa-dropbox:before {
content: "\f16b";
}
.fa-stack-overflow:before {
content: "\f16c";
}
.fa-instagram:before {
content: "\f16d";
}
.fa-flickr:before {
content: "\f16e";
}
.fa-adn:before {
content: "\f170";
}
.fa-bitbucket:before {
content: "\f171";
}
.fa-bitbucket-square:before {
content: "\f172";
}
.fa-tumblr:before {
content: "\f173";
}
.fa-tumblr-square:before {
content: "\f174";
}
.fa-long-arrow-down:before {
content: "\f175";
}
.fa-long-arrow-up:before {
content: "\f176";
}
.fa-long-arrow-left:before {
content: "\f177";
}
.fa-long-arrow-right:before {
content: "\f178";
}
.fa-apple:before {
content: "\f179";
}
.fa-windows:before {
content: "\f17a";
}
.fa-android:before {
content: "\f17b";
}
.fa-linux:before {
content: "\f17c";
}
.fa-dribbble:before {
content: "\f17d";
}
.fa-skype:before {
content: "\f17e";
}
.fa-foursquare:before {
content: "\f180";
}
.fa-trello:before {
content: "\f181";
}
.fa-female:before {
content: "\f182";
}
.fa-male:before {
content: "\f183";
}
.fa-gittip:before,
.fa-gratipay:before {
content: "\f184";
}
.fa-sun-o:before {
content: "\f185";
}
.fa-moon-o:before {
content: "\f186";
}
.fa-archive:before {
content: "\f187";
}
.fa-bug:before {
content: "\f188";
}
.fa-vk:before {
content: "\f189";
}
.fa-weibo:before {
content: "\f18a";
}
.fa-renren:before {
content: "\f18b";
}
.fa-pagelines:before {
content: "\f18c";
}
.fa-stack-exchange:before {
content: "\f18d";
}
.fa-arrow-circle-o-right:before {
content: "\f18e";
}
.fa-arrow-circle-o-left:before {
content: "\f190";
}
.fa-toggle-left:before,
.fa-caret-square-o-left:before {
content: "\f191";
}
.fa-dot-circle-o:before {
content: "\f192";
}
.fa-wheelchair:before {
content: "\f193";
}
.fa-vimeo-square:before {
content: "\f194";
}
.fa-turkish-lira:before,
.fa-try:before {
content: "\f195";
}
.fa-plus-square-o:before {
content: "\f196";
}
.fa-space-shuttle:before {
content: "\f197";
}
.fa-slack:before {
content: "\f198";
}
.fa-envelope-square:before {
content: "\f199";
}
.fa-wordpress:before {
content: "\f19a";
}
.fa-openid:before {
content: "\f19b";
}
.fa-institution:before,
.fa-bank:before,
.fa-university:before {
content: "\f19c";
}
.fa-mortar-board:before,
.fa-graduation-cap:before {
content: "\f19d";
}
.fa-yahoo:before {
content: "\f19e";
}
.fa-google:before {
content: "\f1a0";
}
.fa-reddit:before {
content: "\f1a1";
}
.fa-reddit-square:before {
content: "\f1a2";
}
.fa-stumbleupon-circle:before {
content: "\f1a3";
}
.fa-stumbleupon:before {
content: "\f1a4";
}
.fa-delicious:before {
content: "\f1a5";
}
.fa-digg:before {
content: "\f1a6";
}
.fa-pied-piper:before {
content: "\f1a7";
}
.fa-pied-piper-alt:before {
content: "\f1a8";
}
.fa-drupal:before {
content: "\f1a9";
}
.fa-joomla:before {
content: "\f1aa";
}
.fa-language:before {
content: "\f1ab";
}
.fa-fax:before {
content: "\f1ac";
}
.fa-building:before {
content: "\f1ad";
}
.fa-child:before {
content: "\f1ae";
}
.fa-paw:before {
content: "\f1b0";
}
.fa-spoon:before {
content: "\f1b1";
}
.fa-cube:before {
content: "\f1b2";
}
.fa-cubes:before {
content: "\f1b3";
}
.fa-behance:before {
content: "\f1b4";
}
.fa-behance-square:before {
content: "\f1b5";
}
.fa-steam:before {
content: "\f1b6";
}
.fa-steam-square:before {
content: "\f1b7";
}
.fa-recycle:before {
content: "\f1b8";
}
.fa-automobile:before,
.fa-car:before {
content: "\f1b9";
}
.fa-cab:before,
.fa-taxi:before {
content: "\f1ba";
}
.fa-tree:before {
content: "\f1bb";
}
.fa-spotify:before {
content: "\f1bc";
}
.fa-deviantart:before {
content: "\f1bd";
}
.fa-soundcloud:before {
content: "\f1be";
}
.fa-database:before {
content: "\f1c0";
}
.fa-file-pdf-o:before {
content: "\f1c1";
}
.fa-file-word-o:before {
content: "\f1c2";
}
.fa-file-excel-o:before {
content: "\f1c3";
}
.fa-file-powerpoint-o:before {
content: "\f1c4";
}
.fa-file-photo-o:before,
.fa-file-picture-o:before,
.fa-file-image-o:before {
content: "\f1c5";
}
.fa-file-zip-o:before,
.fa-file-archive-o:before {
content: "\f1c6";
}
.fa-file-sound-o:before,
.fa-file-audio-o:before {
content: "\f1c7";
}
.fa-file-movie-o:before,
.fa-file-video-o:before {
content: "\f1c8";
}
.fa-file-code-o:before {
content: "\f1c9";
}
.fa-vine:before {
content: "\f1ca";
}
.fa-codepen:before {
content: "\f1cb";
}
.fa-jsfiddle:before {
content: "\f1cc";
}
.fa-life-bouy:before,
.fa-life-buoy:before,
.fa-life-saver:before,
.fa-support:before,
.fa-life-ring:before {
content: "\f1cd";
}
.fa-circle-o-notch:before {
content: "\f1ce";
}
.fa-ra:before,
.fa-rebel:before {
content: "\f1d0";
}
.fa-ge:before,
.fa-empire:before {
content: "\f1d1";
}
.fa-git-square:before {
content: "\f1d2";
}
.fa-git:before {
content: "\f1d3";
}
.fa-y-combinator-square:before,
.fa-yc-square:before,
.fa-hacker-news:before {
content: "\f1d4";
}
.fa-tencent-weibo:before {
content: "\f1d5";
}
.fa-qq:before {
content: "\f1d6";
}
.fa-wechat:before,
.fa-weixin:before {
content: "\f1d7";
}
.fa-send:before,
.fa-paper-plane:before {
content: "\f1d8";
}
.fa-send-o:before,
.fa-paper-plane-o:before {
content: "\f1d9";
}
.fa-history:before {
content: "\f1da";
}
.fa-circle-thin:before {
content: "\f1db";
}
.fa-header:before {
content: "\f1dc";
}
.fa-paragraph:before {
content: "\f1dd";
}
.fa-sliders:before {
content: "\f1de";
}
.fa-share-alt:before {
content: "\f1e0";
}
.fa-share-alt-square:before {
content: "\f1e1";
}
.fa-bomb:before {
content: "\f1e2";
}
.fa-soccer-ball-o:before,
.fa-futbol-o:before {
content: "\f1e3";
}
.fa-tty:before {
content: "\f1e4";
}
.fa-binoculars:before {
content: "\f1e5";
}
.fa-plug:before {
content: "\f1e6";
}
.fa-slideshare:before {
content: "\f1e7";
}
.fa-twitch:before {
content: "\f1e8";
}
.fa-yelp:before {
content: "\f1e9";
}
.fa-newspaper-o:before {
content: "\f1ea";
}
.fa-wifi:before {
content: "\f1eb";
}
.fa-calculator:before {
content: "\f1ec";
}
.fa-paypal:before {
content: "\f1ed";
}
.fa-google-wallet:before {
content: "\f1ee";
}
.fa-cc-visa:before {
content: "\f1f0";
}
.fa-cc-mastercard:before {
content: "\f1f1";
}
.fa-cc-discover:before {
content: "\f1f2";
}
.fa-cc-amex:before {
content: "\f1f3";
}
.fa-cc-paypal:before {
content: "\f1f4";
}
.fa-cc-stripe:before {
content: "\f1f5";
}
.fa-bell-slash:before {
content: "\f1f6";
}
.fa-bell-slash-o:before {
content: "\f1f7";
}
.fa-trash:before {
content: "\f1f8";
}
.fa-copyright:before {
content: "\f1f9";
}
.fa-at:before {
content: "\f1fa";
}
.fa-eyedropper:before {
content: "\f1fb";
}
.fa-paint-brush:before {
content: "\f1fc";
}
.fa-birthday-cake:before {
content: "\f1fd";
}
.fa-area-chart:before {
content: "\f1fe";
}
.fa-pie-chart:before {
content: "\f200";
}
.fa-line-chart:before {
content: "\f201";
}
.fa-lastfm:before {
content: "\f202";
}
.fa-lastfm-square:before {
content: "\f203";
}
.fa-toggle-off:before {
content: "\f204";
}
.fa-toggle-on:before {
content: "\f205";
}
.fa-bicycle:before {
content: "\f206";
}
.fa-bus:before {
content: "\f207";
}
.fa-ioxhost:before {
content: "\f208";
}
.fa-angellist:before {
content: "\f209";
}
.fa-cc:before {
content: "\f20a";
}
.fa-shekel:before,
.fa-sheqel:before,
.fa-ils:before {
content: "\f20b";
}
.fa-meanpath:before {
content: "\f20c";
}
.fa-buysellads:before {
content: "\f20d";
}
.fa-connectdevelop:before {
content: "\f20e";
}
.fa-dashcube:before {
content: "\f210";
}
.fa-forumbee:before {
content: "\f211";
}
.fa-leanpub:before {
content: "\f212";
}
.fa-sellsy:before {
content: "\f213";
}
.fa-shirtsinbulk:before {
content: "\f214";
}
.fa-simplybuilt:before {
content: "\f215";
}
.fa-skyatlas:before {
content: "\f216";
}
.fa-cart-plus:before {
content: "\f217";
}
.fa-cart-arrow-down:before {
content: "\f218";
}
.fa-diamond:before {
content: "\f219";
}
.fa-ship:before {
content: "\f21a";
}
.fa-user-secret:before {
content: "\f21b";
}
.fa-motorcycle:before {
content: "\f21c";
}
.fa-street-view:before {
content: "\f21d";
}
.fa-heartbeat:before {
content: "\f21e";
}
.fa-venus:before {
content: "\f221";
}
.fa-mars:before {
content: "\f222";
}
.fa-mercury:before {
content: "\f223";
}
.fa-intersex:before,
.fa-transgender:before {
content: "\f224";
}
.fa-transgender-alt:before {
content: "\f225";
}
.fa-venus-double:before {
content: "\f226";
}
.fa-mars-double:before {
content: "\f227";
}
.fa-venus-mars:before {
content: "\f228";
}
.fa-mars-stroke:before {
content: "\f229";
}
.fa-mars-stroke-v:before {
content: "\f22a";
}
.fa-mars-stroke-h:before {
content: "\f22b";
}
.fa-neuter:before {
content: "\f22c";
}
.fa-genderless:before {
content: "\f22d";
}
.fa-facebook-official:before {
content: "\f230";
}
.fa-pinterest-p:before {
content: "\f231";
}
.fa-whatsapp:before {
content: "\f232";
}
.fa-server:before {
content: "\f233";
}
.fa-user-plus:before {
content: "\f234";
}
.fa-user-times:before {
content: "\f235";
}
.fa-hotel:before,
.fa-bed:before {
content: "\f236";
}
.fa-viacoin:before {
content: "\f237";
}
.fa-train:before {
content: "\f238";
}
.fa-subway:before {
content: "\f239";
}
.fa-medium:before {
content: "\f23a";
}
.fa-yc:before,
.fa-y-combinator:before {
content: "\f23b";
}
.fa-optin-monster:before {
content: "\f23c";
}
.fa-opencart:before {
content: "\f23d";
}
.fa-expeditedssl:before {
content: "\f23e";
}
.fa-battery-4:before,
.fa-battery-full:before {
content: "\f240";
}
.fa-battery-3:before,
.fa-battery-three-quarters:before {
content: "\f241";
}
.fa-battery-2:before,
.fa-battery-half:before {
content: "\f242";
}
.fa-battery-1:before,
.fa-battery-quarter:before {
content: "\f243";
}
.fa-battery-0:before,
.fa-battery-empty:before {
content: "\f244";
}
.fa-mouse-pointer:before {
content: "\f245";
}
.fa-i-cursor:before {
content: "\f246";
}
.fa-object-group:before {
content: "\f247";
}
.fa-object-ungroup:before {
content: "\f248";
}
.fa-sticky-note:before {
content: "\f249";
}
.fa-sticky-note-o:before {
content: "\f24a";
}
.fa-cc-jcb:before {
content: "\f24b";
}
.fa-cc-diners-club:before {
content: "\f24c";
}
.fa-clone:before {
content: "\f24d";
}
.fa-balance-scale:before {
content: "\f24e";
}
.fa-hourglass-o:before {
content: "\f250";
}
.fa-hourglass-1:before,
.fa-hourglass-start:before {
content: "\f251";
}
.fa-hourglass-2:before,
.fa-hourglass-half:before {
content: "\f252";
}
.fa-hourglass-3:before,
.fa-hourglass-end:before {
content: "\f253";
}
.fa-hourglass:before {
content: "\f254";
}
.fa-hand-grab-o:before,
.fa-hand-rock-o:before {
content: "\f255";
}
.fa-hand-stop-o:before,
.fa-hand-paper-o:before {
content: "\f256";
}
.fa-hand-scissors-o:before {
content: "\f257";
}
.fa-hand-lizard-o:before {
content: "\f258";
}
.fa-hand-spock-o:before {
content: "\f259";
}
.fa-hand-pointer-o:before {
content: "\f25a";
}
.fa-hand-peace-o:before {
content: "\f25b";
}
.fa-trademark:before {
content: "\f25c";
}
.fa-registered:before {
content: "\f25d";
}
.fa-creative-commons:before {
content: "\f25e";
}
.fa-gg:before {
content: "\f260";
}
.fa-gg-circle:before {
content: "\f261";
}
.fa-tripadvisor:before {
content: "\f262";
}
.fa-odnoklassniki:before {
content: "\f263";
}
.fa-odnoklassniki-square:before {
content: "\f264";
}
.fa-get-pocket:before {
content: "\f265";
}
.fa-wikipedia-w:before {
content: "\f266";
}
.fa-safari:before {
content: "\f267";
}
.fa-chrome:before {
content: "\f268";
}
.fa-firefox:before {
content: "\f269";
}
.fa-opera:before {
content: "\f26a";
}
.fa-internet-explorer:before {
content: "\f26b";
}
.fa-tv:before,
.fa-television:before {
content: "\f26c";
}
.fa-contao:before {
content: "\f26d";
}
.fa-500px:before {
content: "\f26e";
}
.fa-amazon:before {
content: "\f270";
}
.fa-calendar-plus-o:before {
content: "\f271";
}
.fa-calendar-minus-o:before {
content: "\f272";
}
.fa-calendar-times-o:before {
content: "\f273";
}
.fa-calendar-check-o:before {
content: "\f274";
}
.fa-industry:before {
content: "\f275";
}
.fa-map-pin:before {
content: "\f276";
}
.fa-map-signs:before {
content: "\f277";
}
.fa-map-o:before {
content: "\f278";
}
.fa-map:before {
content: "\f279";
}
.fa-commenting:before {
content: "\f27a";
}
.fa-commenting-o:before {
content: "\f27b";
}
.fa-houzz:before {
content: "\f27c";
}
.fa-vimeo:before {
content: "\f27d";
}
.fa-black-tie:before {
content: "\f27e";
}
.fa-fonticons:before {
content: "\f280";
}
.fa-reddit-alien:before {
content: "\f281";
}
.fa-edge:before {
content: "\f282";
}
.fa-credit-card-alt:before {
content: "\f283";
}
.fa-codiepie:before {
content: "\f284";
}
.fa-modx:before {
content: "\f285";
}
.fa-fort-awesome:before {
content: "\f286";
}
.fa-usb:before {
content: "\f287";
}
.fa-product-hunt:before {
content: "\f288";
}
.fa-mixcloud:before {
content: "\f289";
}
.fa-scribd:before {
content: "\f28a";
}
.fa-pause-circle:before {
content: "\f28b";
}
.fa-pause-circle-o:before {
content: "\f28c";
}
.fa-stop-circle:before {
content: "\f28d";
}
.fa-stop-circle-o:before {
content: "\f28e";
}
.fa-shopping-bag:before {
content: "\f290";
}
.fa-shopping-basket:before {
content: "\f291";
}
.fa-hashtag:before {
content: "\f292";
}
.fa-bluetooth:before {
content: "\f293";
}
.fa-bluetooth-b:before {
content: "\f294";
}
.fa-percent:before {
content: "\f295";
}
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>font-awesome.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>images</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path d="M353.94,242.326C372.689,220.055,384,191.322,384,160c0-70.58-57.421-128-128-128h-64h-64H96v448h32h64h96
c70.579,0,128-57.421,128-128C416,305.521,391.101,264.752,353.94,242.326z M192,96h50.75c27.984,0,50.75,28.71,50.75,64
s-22.766,64-50.75,64H192V96z M271.5,416H192V288h79.5c29.225,0,53,28.71,53,64S300.725,416,271.5,416z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>bold13.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<path d="M926.1,94.1H75.3c-38.7,0-70,31.3-70,70s31.3,70,70,70h850.9c38.7,0,70-31.3,70-70S964.8,94.1,926.1,94.1z"/>
<path d="M926.1,575.4H75.3c-38.7,0-70,31.3-70,70s31.3,70,70,70h850.9c38.7,0,70-31.3,70-70S964.8,575.4,926.1,575.4z"/>
<path d="M809.4,474.7c38.7,0,70-31.3,70-70s-31.3-70-70-70H192.1c-38.7,0-70,31.3-70,70s31.3,70,70,70H809.4z"/>
<path d="M687.8,956c38.7,0,70-31.3,70-70s-31.3-70-70-70H313.6c-38.7,0-70,31.3-70,70s31.3,70,70,70H687.8z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>centered5.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
<g>
<path d="M73.414,0.631H50.675L39.263,35.192h7.46c2.792,0,5.269,1.353,6.829,3.431l0.384-1.452l7.19-21.336l2.339-0.013
l7.534,22.814H53.563c1.065,1.426,1.704,3.187,1.704,5.099v9.924h18.918l3.341,12.704h17.515L73.414,0.631z"/>
<path d="M52.178,85.862c-0.887-2.972-1.488-12.397-1.488-19.766c0-0.903-0.235-1.75-0.644-2.486
c0.41-0.914,0.642-1.923,0.642-2.986V47.129c0-4.04-3.286-7.326-7.326-7.326h-6.926c-0.063-0.833-0.107-1.664-0.133-2.474
c-0.029-0.729-0.039-1.406-0.042-2.073c-0.009-0.703,0.002-1.277,0.033-1.776c0.059-1.079,0.188-2.124,0.378-3.057
c0.205-1,0.431-1.649,0.518-1.883c0.015-0.041,0.03-0.08,0.044-0.121c0.056-0.161,0.105-0.281,0.136-0.351
c2.836-5.413,0.768-12.133-4.634-15.013c-1.597-0.85-3.393-1.3-5.195-1.307c-1.803,0.007-3.599,0.457-5.195,1.307
c-5.402,2.88-7.47,9.6-4.634,15.013c0.031,0.069,0.081,0.189,0.136,0.351c0.014,0.041,0.029,0.08,0.044,0.121
c0.087,0.233,0.313,0.883,0.518,1.883c0.19,0.933,0.32,1.978,0.378,3.057c0.031,0.499,0.042,1.073,0.033,1.776
c-0.004,0.667-0.013,1.344-0.042,2.073c-0.026,0.81-0.07,1.641-0.133,2.474H11.72c-4.04,0-7.326,3.286-7.326,7.326v13.495
c0,1.063,0.232,2.072,0.642,2.986c-0.409,0.736-0.644,1.583-0.644,2.486c0,7.368-0.601,16.794-1.488,19.766
c-1.821,1.499-2.168,3.619-1.828,5.191c0.936,4.315,5.459,4.315,6.945,4.315c3.454,0,9.681-0.606,9.944-0.632
c0.402-0.04,0.791-0.126,1.159-0.251c0.394,0.098,0.804,0.151,1.221,0.152l7.196,0.035l7.196-0.035
c0.417-0.001,0.827-0.055,1.221-0.152c0.368,0.125,0.757,0.211,1.159,0.251c0.263,0.025,6.491,0.632,9.944,0.632
c1.486,0,6.01,0,6.945-4.315C54.346,89.481,54,87.361,52.178,85.862z M37.706,89.829l-2.748-11.988l-1.375,11.871l-13.3-0.006
l-2.906-6.99l0,7.113c0,0-13.952,1.368-10.943,0c3.009-1.367,3.009-23.527,3.009-23.527h18.098h18.098c0,0,0,22.16,3.009,23.527
C51.658,91.197,37.706,89.829,37.706,89.829z"/>
</g>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>color6.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="128px" height="128px" viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<path d="M11.4,55c0,3.9,3.1,7,7,7c1,0,1.9-0.2,2.7-0.6v57.3c0,3.3,2.7,6,6,6h73.7c3.3,0,6-2.7,6-6V61.4c0.9,0.4,1.8,0.6,2.8,0.6
c3.9,0,7-3.1,7-7c0-29.2-23.6-53-52.7-53S11.4,25.8,11.4,55z M97.7,72.6c-1.4,2-3.3,3.7-4.4,5.9c-1.1,2.2-1,4.6-0.9,7
c0.1,1.6,0.2,3.2-0.2,4.8c-0.4,1.5-1.5,3-3,3.5C87,94.4,84.6,93,83.5,91s-1.1-4.3-0.9-6.6c0.3-3.1,2-14-4.5-11.8
c-3.1,1.1-5.9,0.7-8.6-1.1c-2.1-1.4-4.5-3-7-2.3c-2.6,0.8-3.8,3.8-4.3,6.4c-0.5,2.9-1,5.5-0.4,8.4c0.3,1.8,0.8,3.5,0.7,5.3
c-0.1,1.8-0.9,3.6-2.4,4.6c-1.6,1-3.7,0.8-5.3-0.2c-1.6-1-2.6-2.7-3.1-4.4C46.5,84.9,50,73,43.2,71.5c-2-0.4-3.5,0.6-4.4,2.3
c-0.6,1-1.1,2.1-2.2,2.5c-3.4,1.2-8-2.2-8-7.1c0-2.3-0.1-4.5-0.1-6.8v-4c0-1.7,1.4-3.2,3.2-3.2h64.7c1.8,0,3.2,1.4,3.2,3.2v4
c0,0.1,0,0.1,0,0.2C99.5,62.5,99.9,69.5,97.7,72.6z M64,16c19.1,0,35,14.1,38.1,32.5c-0.4-0.1-0.9-0.1-1.3-0.1H27.1
c-0.4,0-0.8,0-1.2,0.1C29,30.1,44.9,16,64,16z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>fill1.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path d="M448,32v32h-64L224,448h64v32H64v-32h64L288,64h-64V32H448z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>italic3.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<path d="M922,94.1H77c-38.7,0-70,31.3-70,70s31.3,70,70,70h845c38.7,0,70-31.3,70-70S960.7,94.1,922,94.1z"/>
<path d="M992,645.4c0-38.7-31.3-70-70-70H77c-38.7,0-70,31.3-70,70s31.3,70,70,70h845C960.7,715.4,992,684,992,645.4z"/>
<path d="M77,474.7h695.4c38.7,0,70-31.3,70-70s-31.3-70-70-70H77c-38.7,0-70,31.3-70,70S38.3,474.7,77,474.7z"/>
<path d="M599.3,886c0-38.7-31.3-70-70-70H77c-38.7,0-70,31.3-70,70s31.3,70,70,70h452.3C568,956,599.3,924.7,599.3,886z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>left181.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_12" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="100px" height="100px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
<path d="M47.733,23.751H20.052v63.952h27.682V23.751z M44.87,84.84H22.915V26.614H44.87V84.84z M82.572,23.751H54.891v37.464h27.682
V23.751z M79.709,58.352H57.754V26.614h21.955V58.352z M13.132,17.308v-5.011h73.736v5.011H13.132z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>object11.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
<path d="M66.176,47.975l2.061,2.062L53.204,65.061l-2.061-2.062L66.176,47.975z M84.629,1.333v93.334H11.371V1.333H84.629z
M71.029,48.945L49.932,27.852c-0.529-0.53-1.404-0.516-1.951,0.032L36.346,39.519c-0.035-0.015-0.103-0.044-0.23-0.099
c-0.086-0.038-0.194-0.087-0.32-0.142c-0.128-0.055-0.331-0.123-0.531-0.187c-0.21-0.071-0.436-0.134-0.678-0.194
c-0.24-0.067-0.509-0.129-0.804-0.172c-0.586-0.097-1.277-0.17-2.062-0.116c-0.781,0.055-1.663,0.217-2.563,0.594
c-0.892,0.383-1.795,0.98-2.534,1.792l-0.139,0.151l-0.068,0.077l-0.035,0.039l-0.071,0.092l-0.086,0.112l-0.047,0.063L26.1,41.643
c-0.224,0.334-0.341,0.549-0.475,0.82c-0.256,0.517-0.437,1.029-0.575,1.527c-0.27,0.998-0.397,1.949-0.446,2.871
c-0.044,0.919-0.027,1.81,0.025,2.668c0.055,0.859,0.129,1.689,0.245,2.479c0.228,1.583,0.586,3.01,0.974,4.205
c0.389,1.194,0.804,2.157,1.125,2.823c0.165,0.331,0.299,0.591,0.401,0.767c0.105,0.18,0.16,0.278,0.16,0.278
c0.271,0.466,0.769,0.797,1.346,0.831c0.917,0.053,1.703-0.648,1.756-1.564l0.013-0.213c0,0,0.005-0.087-0.003-0.273
c-0.001-0.188-0.017-0.459-0.036-0.807c-0.045-0.691-0.128-1.673-0.255-2.83c-0.127-1.158-0.306-2.492-0.485-3.895
c-0.188-1.396-0.337-2.885-0.292-4.259c0.02-0.681,0.07-1.336,0.19-1.87c0.059-0.268,0.131-0.501,0.207-0.684
c0.03-0.081,0.098-0.202,0.083-0.19l-0.001-0.008l0.036-0.054l0.08-0.117l0.01-0.015c0.014-0.021,0.025-0.034,0.005-0.008
l-0.005,0.008c-0.018,0.025-0.043,0.058-0.038,0.05l0.011-0.016l0.023-0.031l0.044-0.064c0.231-0.345,0.535-0.614,0.885-0.827
c0.344-0.222,0.743-0.385,1.155-0.485c0.337-0.088,0.677-0.137,1.004-0.161l-2.505,2.506c-0.548,0.548-0.563,1.422-0.033,1.95
L51.825,68.15c0.528,0.529,1.403,0.516,1.95-0.032l17.222-17.222C71.544,50.348,71.561,49.475,71.029,48.945z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>paint57.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="16px" height="16px" viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
<path d="M8.5,1C4.358,1,1,4.358,1,8.5C1,12.643,4.358,16,8.5,16c4.143,0,7.5-3.357,7.5-7.5C16,4.358,12.643,1,8.5,1z M12.5,9H9v3.5
C9,12.775,8.775,13,8.5,13C8.224,13,8,12.775,8,12.5V9H4.5C4.224,9,4,8.775,4,8.5C4,8.224,4.224,8,4.5,8H8V4.5
C8,4.224,8.224,4,8.5,4C8.775,4,9,4.224,9,4.5V8h3.5C12.775,8,13,8.224,13,8.5C13,8.775,12.775,9,12.5,9z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>plus7.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<g>
<path d="M128,32h256v64h32V32c0-17.656-14.313-32-32-32H128c-17.656,0-32,14.344-32,32v64h32V32z"/>
<path d="M480,128H32c-17.656,0-32,14.344-32,32v160c0,17.688,14.344,32,32,32h64v128c0,17.688,14.344,32,32,32h256
c17.688,0,32-14.313,32-32V352h64c17.688,0,32-14.313,32-32V160C512,142.344,497.688,128,480,128z M384,480H128V256h256V480z
M448,224c-17.688,0-32-14.313-32-32c0-17.656,14.313-32,32-32s32,14.344,32,32C480,209.688,465.688,224,448,224z"/>
<rect x="160" y="288" width="128" height="32"/>
<rect x="160" y="352" width="192" height="32"/>
<rect x="160" y="416" width="192" height="32"/>
</g>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>printer70.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
<path d="M78.5,234.1h845c38.7,0,70-31.3,70-70s-31.3-70-70-70h-845c-38.7,0-70,31.3-70,70S39.8,234.1,78.5,234.1z"/>
<path d="M923.5,575.4h-845c-38.7,0-70,31.3-70,70s31.3,70,70,70h845c38.7,0,70-31.3,70-70S962.2,575.4,923.5,575.4z"/>
<path d="M923.5,334.7H228.1c-38.7,0-70,31.3-70,70s31.3,70,70,70h695.4c38.7,0,70-31.3,70-70S962.2,334.7,923.5,334.7z"/>
<path d="M923.5,816H471.2c-38.7,0-70,31.3-70,70s31.3,70,70,70h452.3c38.7,0,70-31.3,70-70S962.2,816,923.5,816z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>right183.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path d="M512,256v32H394.747C408.499,307.255,416,329.346,416,352c0,35.439-18.33,69.513-50.29,93.482
C336.031,467.741,297.068,480,256,480c-41.069,0-80.031-12.259-109.71-34.518C114.33,421.513,96,387.439,96,352h64
c0,34.691,43.963,64,96,64s96-29.309,96-64s-43.963-64-96-64H0v-32h149.759c-1.169-0.827-2.328-1.662-3.469-2.518
C114.33,229.512,96,195.439,96,160s18.33-69.512,50.29-93.482C175.969,44.259,214.931,32,256,32
c41.068,0,80.031,12.259,109.71,34.518C397.67,90.488,416,124.561,416,160h-64c0-34.691-43.963-64-96-64s-96,29.309-96,64
s43.963,64,96,64c39.489,0,77.027,11.339,106.241,32H512z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>strikethrough.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="96px" height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
<g>
<polygon points="84.443,37.557 84.443,1.034 51.905,1.034 51.905,94.966 84.443,94.966 84.443,59.331 65.973,75.725 65.973,21.162
"/>
<polygon points="69.969,66.834 90.691,48.443 69.969,30.052 "/>
<polygon points="11.557,1.034 11.557,37.557 23.378,27.065 30.026,21.162 30.026,75.725 11.557,59.331 11.557,94.966
44.095,94.966 44.095,1.034 "/>
<polygon points="26.031,30.052 5.309,48.443 26.031,66.834 "/>
</g>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>two258.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="96px"
height="96px" viewBox="0 0 96 96" enable-background="new 0 0 96 96" xml:space="preserve">
<g id="Layer_1">
<g>
<path d="M78.117,38.363V4.659H51.074v86.682h27.043V58.456l17.045,15.129V23.233L78.117,38.363z M91.474,65.381L72.352,48.409
l19.122-16.972V65.381z"/>
<path d="M17.883,4.659v33.704L0.838,23.233v50.352l6.136-5.446l10.909-9.683v32.885h27.043V4.659H17.883z M4.526,65.381V31.438
l19.122,16.972L4.526,65.381z"/>
</g>
</g>
<g id="Layer_2">
</g>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>two266.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="512px" height="512px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path d="M352,32h64v208c0,79.529-71.634,144-160,144c-88.365,0-160-64.471-160-144V32h64v208c0,20.083,9.119,39.352,25.677,54.253
C204.125,310.855,229.1,320,256,320c26.9,0,51.875-9.145,70.323-25.747C342.881,279.352,352,260.083,352,240V32z M96,416h320v64H96
V416z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>underline1.svg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="64px" height="64px" viewBox="0 0 64 64" enable-background="new 0 0 64 64" xml:space="preserve">
<path d="M62.188,54.356L47.225,38.898c-1.073-1.109-2.414-1.553-2.995-0.986c-0.583,0.563-1.925,0.12-2.998-0.989l-0.214-0.222
c6.697-8.808,6.047-21.419-1.995-29.461c-8.777-8.777-23.008-8.777-31.784,0c-8.777,8.777-8.777,23.006,0,31.783
c8.179,8.18,21.088,8.728,29.914,1.663l0.094,0.098c1.071,1.109,1.47,2.464,0.885,3.028c-0.582,0.564-0.186,1.92,0.888,3.027
l14.955,15.464c1.073,1.106,2.841,1.139,3.951,0.065l4.197-4.061C63.229,57.236,63.259,55.469,62.188,54.356z M34.084,34.084
c-6.04,6.041-15.869,6.041-21.908,0.002c-6.04-6.04-6.039-15.87,0-21.909c6.039-6.04,15.868-6.039,21.906,0.001
C40.123,18.217,40.123,28.045,34.084,34.084z"/>
</svg>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>zoom19.swg</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>image/svg+xml</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/**
* MouseWheel.js
* Zero dependency ridiculous fast mousewheel handler
* either direct or captured into another element. No lib requirements.
* Compatible with: IE8, FireFox, Chrome, Safari,Opera, iOS, Android
*
* MouseWheel rewrites itself the first time it is triggered in order to perform faster for the environment it is being used in
* @param {HTMLElement} element
* @param {HTMLElement} [scrollElement] default element
* @param {Number} [verticalPixels] default 20
* @param {Number} [horizontalPixels] default 10
* @constructor
*/
var MouseWheel = (function(window) {
function Constructor (element, scrollElement, verticalPixels, horizontalPixels) {
this.element = element;
this.scrollElement = element.scrollElement = scrollElement || element;
this.verticalPixels = verticalPixels || 20;
this.horizontalPixels = horizontalPixels || 10;
//initial binding, which will await the first trigger of mousewheel, then rewrite itself.
this.bindMouseWheel(element, this.initialHandler);
element.mW = this;
}
Constructor.prototype = {
initialHandler: function (e) {
e = e || window.event;
var mousewheel,
mW = this.mW,
horizontalPixels = mW.horizontalPixels,
verticalPixels = mW.verticalPixels;
if (e.type === "mousewheel") {
//chrome sometimes
if (e.wheelDeltaX !== undefined) {
this.mWType = 1;
mousewheel = function(e) {
e = e || window.event;
var deltaY = e.wheelDeltaY,
deltaX = e.wheelDeltaX,
scrollElement = this.scrollElement;
if (deltaY !== 0) {
scrollElement.scrollTop += deltaY < 0 ? horizontalPixels : -horizontalPixels;
}
else if (deltaX !== 0) {
scrollElement.scrollLeft += deltaX < 0 ? verticalPixels : -verticalPixels;
}
return false;
};
} else {
//IE
this.mWType = 2;
mousewheel = function(e) {
e = e || window.event;
var delta = e.wheelDelta,
scrollElement = this.scrollElement;
if (delta !== 0) {
scrollElement.scrollTop += delta < 0 ? horizontalPixels : -horizontalPixels;
}
return false;
};
}
} else {
//firefox & chrome
this.mWType = 3;
mousewheel = function(e) {
e.preventDefault();
var detail,
top = 0,
left = 0,
scrollElement = this.scrollElement;
if (e.deltaX !== 0) {
scrollElement.scrollLeft += e.deltaX > 0 ? horizontalPixels : -horizontalPixels;
}
else if (e.deltaY !== 0) {
scrollElement.scrollTop += e.deltaY > 0 ? verticalPixels : -verticalPixels;
}
else if (detail = this.detail = e.detail) {
(9 < detail ? detail = 3 : -9 > detail && (detail = -3));
switch (detail) {
case 1:
case -1:
left = detail * horizontalPixels;
scrollElement.scrollLeft += left;
break;
case 3:
case -3:
top = (detail / 3) * verticalPixels;
scrollElement.scrollTop += top;
break;
}
}
return false;
};
}
Constructor.prototype.bindMouseWheel(this, mousewheel);
return false;
},
bindMouseWheel: function(el, fn) {
el.onwheel = el.onmousewheel = el.onDOMMouseScroll = el.onMozMousePixelScroll = fn;
}
};
return Constructor;
})(window);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>MouseWheel.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* ZeroClipboard
* The ZeroClipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie and a JavaScript interface.
* Copyright (c) 2014 Jon Rohan, James M. Greene
* Licensed MIT
* http://zeroclipboard.org/
* v2.1.6
*/
(function(window, undefined) {
"use strict";
/**
* Store references to critically important global functions that may be
* overridden on certain web pages.
*/
var _window = window, _document = _window.document, _navigator = _window.navigator, _setTimeout = _window.setTimeout, _encodeURIComponent = _window.encodeURIComponent, _ActiveXObject = _window.ActiveXObject, _Error = _window.Error, _parseInt = _window.Number.parseInt || _window.parseInt, _parseFloat = _window.Number.parseFloat || _window.parseFloat, _isNaN = _window.Number.isNaN || _window.isNaN, _round = _window.Math.round, _now = _window.Date.now, _keys = _window.Object.keys, _defineProperty = _window.Object.defineProperty, _hasOwn = _window.Object.prototype.hasOwnProperty, _slice = _window.Array.prototype.slice, _unwrap = function() {
var unwrapper = function(el) {
return el;
};
if (typeof _window.wrap === "function" && typeof _window.unwrap === "function") {
try {
var div = _document.createElement("div");
var unwrappedDiv = _window.unwrap(div);
if (div.nodeType === 1 && unwrappedDiv && unwrappedDiv.nodeType === 1) {
unwrapper = _window.unwrap;
}
} catch (e) {}
}
return unwrapper;
}();
/**
* Convert an `arguments` object into an Array.
*
* @returns The arguments as an Array
* @private
*/
var _args = function(argumentsObj) {
return _slice.call(argumentsObj, 0);
};
/**
* Shallow-copy the owned, enumerable properties of one object over to another, similar to jQuery's `$.extend`.
*
* @returns The target object, augmented
* @private
*/
var _extend = function() {
var i, len, arg, prop, src, copy, args = _args(arguments), target = args[0] || {};
for (i = 1, len = args.length; i < len; i++) {
if ((arg = args[i]) != null) {
for (prop in arg) {
if (_hasOwn.call(arg, prop)) {
src = target[prop];
copy = arg[prop];
if (target !== copy && copy !== undefined) {
target[prop] = copy;
}
}
}
}
}
return target;
};
/**
* Return a deep copy of the source object or array.
*
* @returns Object or Array
* @private
*/
var _deepCopy = function(source) {
var copy, i, len, prop;
if (typeof source !== "object" || source == null) {
copy = source;
} else if (typeof source.length === "number") {
copy = [];
for (i = 0, len = source.length; i < len; i++) {
if (_hasOwn.call(source, i)) {
copy[i] = _deepCopy(source[i]);
}
}
} else {
copy = {};
for (prop in source) {
if (_hasOwn.call(source, prop)) {
copy[prop] = _deepCopy(source[prop]);
}
}
}
return copy;
};
/**
* Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to keep.
* The inverse of `_omit`, mostly. The big difference is that these properties do NOT need to be enumerable to
* be kept.
*
* @returns A new filtered object.
* @private
*/
var _pick = function(obj, keys) {
var newObj = {};
for (var i = 0, len = keys.length; i < len; i++) {
if (keys[i] in obj) {
newObj[keys[i]] = obj[keys[i]];
}
}
return newObj;
};
/**
* Makes a shallow copy of `obj` (like `_extend`) but filters its properties based on a list of `keys` to omit.
* The inverse of `_pick`.
*
* @returns A new filtered object.
* @private
*/
var _omit = function(obj, keys) {
var newObj = {};
for (var prop in obj) {
if (keys.indexOf(prop) === -1) {
newObj[prop] = obj[prop];
}
}
return newObj;
};
/**
* Remove all owned, enumerable properties from an object.
*
* @returns The original object without its owned, enumerable properties.
* @private
*/
var _deleteOwnProperties = function(obj) {
if (obj) {
for (var prop in obj) {
if (_hasOwn.call(obj, prop)) {
delete obj[prop];
}
}
}
return obj;
};
/**
* Determine if an element is contained within another element.
*
* @returns Boolean
* @private
*/
var _containedBy = function(el, ancestorEl) {
if (el && el.nodeType === 1 && el.ownerDocument && ancestorEl && (ancestorEl.nodeType === 1 && ancestorEl.ownerDocument && ancestorEl.ownerDocument === el.ownerDocument || ancestorEl.nodeType === 9 && !ancestorEl.ownerDocument && ancestorEl === el.ownerDocument)) {
do {
if (el === ancestorEl) {
return true;
}
el = el.parentNode;
} while (el);
}
return false;
};
/**
* Get the URL path's parent directory.
*
* @returns String or `undefined`
* @private
*/
var _getDirPathOfUrl = function(url) {
var dir;
if (typeof url === "string" && url) {
dir = url.split("#")[0].split("?")[0];
dir = url.slice(0, url.lastIndexOf("/") + 1);
}
return dir;
};
/**
* Get the current script's URL by throwing an `Error` and analyzing it.
*
* @returns String or `undefined`
* @private
*/
var _getCurrentScriptUrlFromErrorStack = function(stack) {
var url, matches;
if (typeof stack === "string" && stack) {
matches = stack.match(/^(?:|[^:@]*@|.+\)@(?=http[s]?|file)|.+?\s+(?: at |@)(?:[^:\(]+ )*[\(]?)((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/);
if (matches && matches[1]) {
url = matches[1];
} else {
matches = stack.match(/\)@((?:http[s]?|file):\/\/[\/]?.+?\/[^:\)]*?)(?::\d+)(?::\d+)?/);
if (matches && matches[1]) {
url = matches[1];
}
}
}
return url;
};
/**
* Get the current script's URL by throwing an `Error` and analyzing it.
*
* @returns String or `undefined`
* @private
*/
var _getCurrentScriptUrlFromError = function() {
var url, err;
try {
throw new _Error();
} catch (e) {
err = e;
}
if (err) {
url = err.sourceURL || err.fileName || _getCurrentScriptUrlFromErrorStack(err.stack);
}
return url;
};
/**
* Get the current script's URL.
*
* @returns String or `undefined`
* @private
*/
var _getCurrentScriptUrl = function() {
var jsPath, scripts, i;
if (_document.currentScript && (jsPath = _document.currentScript.src)) {
return jsPath;
}
scripts = _document.getElementsByTagName("script");
if (scripts.length === 1) {
return scripts[0].src || undefined;
}
if ("readyState" in scripts[0]) {
for (i = scripts.length; i--; ) {
if (scripts[i].readyState === "interactive" && (jsPath = scripts[i].src)) {
return jsPath;
}
}
}
if (_document.readyState === "loading" && (jsPath = scripts[scripts.length - 1].src)) {
return jsPath;
}
if (jsPath = _getCurrentScriptUrlFromError()) {
return jsPath;
}
return undefined;
};
/**
* Get the unanimous parent directory of ALL script tags.
* If any script tags are either (a) inline or (b) from differing parent
* directories, this method must return `undefined`.
*
* @returns String or `undefined`
* @private
*/
var _getUnanimousScriptParentDir = function() {
var i, jsDir, jsPath, scripts = _document.getElementsByTagName("script");
for (i = scripts.length; i--; ) {
if (!(jsPath = scripts[i].src)) {
jsDir = null;
break;
}
jsPath = _getDirPathOfUrl(jsPath);
if (jsDir == null) {
jsDir = jsPath;
} else if (jsDir !== jsPath) {
jsDir = null;
break;
}
}
return jsDir || undefined;
};
/**
* Get the presumed location of the "ZeroClipboard.swf" file, based on the location
* of the executing JavaScript file (e.g. "ZeroClipboard.js", etc.).
*
* @returns String
* @private
*/
var _getDefaultSwfPath = function() {
var jsDir = _getDirPathOfUrl(_getCurrentScriptUrl()) || _getUnanimousScriptParentDir() || "";
return jsDir + "ZeroClipboard.swf";
};
/**
* Keep track of the state of the Flash object.
* @private
*/
var _flashState = {
bridge: null,
version: "0.0.0",
pluginType: "unknown",
disabled: null,
outdated: null,
unavailable: null,
deactivated: null,
overdue: null,
ready: null
};
/**
* The minimum Flash Player version required to use ZeroClipboard completely.
* @readonly
* @private
*/
var _minimumFlashVersion = "11.0.0";
/**
* Keep track of all event listener registrations.
* @private
*/
var _handlers = {};
/**
* Keep track of the currently activated element.
* @private
*/
var _currentElement;
/**
* Keep track of the element that was activated when a `copy` process started.
* @private
*/
var _copyTarget;
/**
* Keep track of data for the pending clipboard transaction.
* @private
*/
var _clipData = {};
/**
* Keep track of data formats for the pending clipboard transaction.
* @private
*/
var _clipDataFormatMap = null;
/**
* The `message` store for events
* @private
*/
var _eventMessages = {
ready: "Flash communication is established",
error: {
"flash-disabled": "Flash is disabled or not installed",
"flash-outdated": "Flash is too outdated to support ZeroClipboard",
"flash-unavailable": "Flash is unable to communicate bidirectionally with JavaScript",
"flash-deactivated": "Flash is too outdated for your browser and/or is configured as click-to-activate",
"flash-overdue": "Flash communication was established but NOT within the acceptable time limit"
}
};
/**
* ZeroClipboard configuration defaults for the Core module.
* @private
*/
var _globalConfig = {
swfPath: _getDefaultSwfPath(),
trustedDomains: window.location.host ? [ window.location.host ] : [],
cacheBust: true,
forceEnhancedClipboard: false,
flashLoadTimeout: 3e4,
autoActivate: true,
bubbleEvents: true,
containerId: "global-zeroclipboard-html-bridge",
containerClass: "global-zeroclipboard-container",
swfObjectId: "global-zeroclipboard-flash-bridge",
hoverClass: "zeroclipboard-is-hover",
activeClass: "zeroclipboard-is-active",
forceHandCursor: false,
title: null,
zIndex: 999999999
};
/**
* The underlying implementation of `ZeroClipboard.config`.
* @private
*/
var _config = function(options) {
if (typeof options === "object" && options !== null) {
for (var prop in options) {
if (_hasOwn.call(options, prop)) {
if (/^(?:forceHandCursor|title|zIndex|bubbleEvents)$/.test(prop)) {
_globalConfig[prop] = options[prop];
} else if (_flashState.bridge == null) {
if (prop === "containerId" || prop === "swfObjectId") {
if (_isValidHtml4Id(options[prop])) {
_globalConfig[prop] = options[prop];
} else {
throw new Error("The specified `" + prop + "` value is not valid as an HTML4 Element ID");
}
} else {
_globalConfig[prop] = options[prop];
}
}
}
}
}
if (typeof options === "string" && options) {
if (_hasOwn.call(_globalConfig, options)) {
return _globalConfig[options];
}
return;
}
return _deepCopy(_globalConfig);
};
/**
* The underlying implementation of `ZeroClipboard.state`.
* @private
*/
var _state = function() {
return {
browser: _pick(_navigator, [ "userAgent", "platform", "appName" ]),
flash: _omit(_flashState, [ "bridge" ]),
zeroclipboard: {
version: ZeroClipboard.version,
config: ZeroClipboard.config()
}
};
};
/**
* The underlying implementation of `ZeroClipboard.isFlashUnusable`.
* @private
*/
var _isFlashUnusable = function() {
return !!(_flashState.disabled || _flashState.outdated || _flashState.unavailable || _flashState.deactivated);
};
/**
* The underlying implementation of `ZeroClipboard.on`.
* @private
*/
var _on = function(eventType, listener) {
var i, len, events, added = {};
if (typeof eventType === "string" && eventType) {
events = eventType.toLowerCase().split(/\s+/);
} else if (typeof eventType === "object" && eventType && typeof listener === "undefined") {
for (i in eventType) {
if (_hasOwn.call(eventType, i) && typeof i === "string" && i && typeof eventType[i] === "function") {
ZeroClipboard.on(i, eventType[i]);
}
}
}
if (events && events.length) {
for (i = 0, len = events.length; i < len; i++) {
eventType = events[i].replace(/^on/, "");
added[eventType] = true;
if (!_handlers[eventType]) {
_handlers[eventType] = [];
}
_handlers[eventType].push(listener);
}
if (added.ready && _flashState.ready) {
ZeroClipboard.emit({
type: "ready"
});
}
if (added.error) {
var errorTypes = [ "disabled", "outdated", "unavailable", "deactivated", "overdue" ];
for (i = 0, len = errorTypes.length; i < len; i++) {
if (_flashState[errorTypes[i]] === true) {
ZeroClipboard.emit({
type: "error",
name: "flash-" + errorTypes[i]
});
break;
}
}
}
}
return ZeroClipboard;
};
/**
* The underlying implementation of `ZeroClipboard.off`.
* @private
*/
var _off = function(eventType, listener) {
var i, len, foundIndex, events, perEventHandlers;
if (arguments.length === 0) {
events = _keys(_handlers);
} else if (typeof eventType === "string" && eventType) {
events = eventType.split(/\s+/);
} else if (typeof eventType === "object" && eventType && typeof listener === "undefined") {
for (i in eventType) {
if (_hasOwn.call(eventType, i) && typeof i === "string" && i && typeof eventType[i] === "function") {
ZeroClipboard.off(i, eventType[i]);
}
}
}
if (events && events.length) {
for (i = 0, len = events.length; i < len; i++) {
eventType = events[i].toLowerCase().replace(/^on/, "");
perEventHandlers = _handlers[eventType];
if (perEventHandlers && perEventHandlers.length) {
if (listener) {
foundIndex = perEventHandlers.indexOf(listener);
while (foundIndex !== -1) {
perEventHandlers.splice(foundIndex, 1);
foundIndex = perEventHandlers.indexOf(listener, foundIndex);
}
} else {
perEventHandlers.length = 0;
}
}
}
}
return ZeroClipboard;
};
/**
* The underlying implementation of `ZeroClipboard.handlers`.
* @private
*/
var _listeners = function(eventType) {
var copy;
if (typeof eventType === "string" && eventType) {
copy = _deepCopy(_handlers[eventType]) || null;
} else {
copy = _deepCopy(_handlers);
}
return copy;
};
/**
* The underlying implementation of `ZeroClipboard.emit`.
* @private
*/
var _emit = function(event) {
var eventCopy, returnVal, tmp;
event = _createEvent(event);
if (!event) {
return;
}
if (_preprocessEvent(event)) {
return;
}
if (event.type === "ready" && _flashState.overdue === true) {
return ZeroClipboard.emit({
type: "error",
name: "flash-overdue"
});
}
eventCopy = _extend({}, event);
_dispatchCallbacks.call(this, eventCopy);
if (event.type === "copy") {
tmp = _mapClipDataToFlash(_clipData);
returnVal = tmp.data;
_clipDataFormatMap = tmp.formatMap;
}
return returnVal;
};
/**
* The underlying implementation of `ZeroClipboard.create`.
* @private
*/
var _create = function() {
if (typeof _flashState.ready !== "boolean") {
_flashState.ready = false;
}
if (!ZeroClipboard.isFlashUnusable() && _flashState.bridge === null) {
var maxWait = _globalConfig.flashLoadTimeout;
if (typeof maxWait === "number" && maxWait >= 0) {
_setTimeout(function() {
if (typeof _flashState.deactivated !== "boolean") {
_flashState.deactivated = true;
}
if (_flashState.deactivated === true) {
ZeroClipboard.emit({
type: "error",
name: "flash-deactivated"
});
}
}, maxWait);
}
_flashState.overdue = false;
_embedSwf();
}
};
/**
* The underlying implementation of `ZeroClipboard.destroy`.
* @private
*/
var _destroy = function() {
ZeroClipboard.clearData();
ZeroClipboard.blur();
ZeroClipboard.emit("destroy");
_unembedSwf();
ZeroClipboard.off();
};
/**
* The underlying implementation of `ZeroClipboard.setData`.
* @private
*/
var _setData = function(format, data) {
var dataObj;
if (typeof format === "object" && format && typeof data === "undefined") {
dataObj = format;
ZeroClipboard.clearData();
} else if (typeof format === "string" && format) {
dataObj = {};
dataObj[format] = data;
} else {
return;
}
for (var dataFormat in dataObj) {
if (typeof dataFormat === "string" && dataFormat && _hasOwn.call(dataObj, dataFormat) && typeof dataObj[dataFormat] === "string" && dataObj[dataFormat]) {
_clipData[dataFormat] = dataObj[dataFormat];
}
}
};
/**
* The underlying implementation of `ZeroClipboard.clearData`.
* @private
*/
var _clearData = function(format) {
if (typeof format === "undefined") {
_deleteOwnProperties(_clipData);
_clipDataFormatMap = null;
} else if (typeof format === "string" && _hasOwn.call(_clipData, format)) {
delete _clipData[format];
}
};
/**
* The underlying implementation of `ZeroClipboard.getData`.
* @private
*/
var _getData = function(format) {
if (typeof format === "undefined") {
return _deepCopy(_clipData);
} else if (typeof format === "string" && _hasOwn.call(_clipData, format)) {
return _clipData[format];
}
};
/**
* The underlying implementation of `ZeroClipboard.focus`/`ZeroClipboard.activate`.
* @private
*/
var _focus = function(element) {
if (!(element && element.nodeType === 1)) {
return;
}
if (_currentElement) {
_removeClass(_currentElement, _globalConfig.activeClass);
if (_currentElement !== element) {
_removeClass(_currentElement, _globalConfig.hoverClass);
}
}
_currentElement = element;
_addClass(element, _globalConfig.hoverClass);
var newTitle = element.getAttribute("title") || _globalConfig.title;
if (typeof newTitle === "string" && newTitle) {
var htmlBridge = _getHtmlBridge(_flashState.bridge);
if (htmlBridge) {
htmlBridge.setAttribute("title", newTitle);
}
}
var useHandCursor = _globalConfig.forceHandCursor === true || _getStyle(element, "cursor") === "pointer";
_setHandCursor(useHandCursor);
_reposition();
};
/**
* The underlying implementation of `ZeroClipboard.blur`/`ZeroClipboard.deactivate`.
* @private
*/
var _blur = function() {
var htmlBridge = _getHtmlBridge(_flashState.bridge);
if (htmlBridge) {
htmlBridge.removeAttribute("title");
htmlBridge.style.left = "0px";
htmlBridge.style.top = "-9999px";
htmlBridge.style.width = "1px";
htmlBridge.style.top = "1px";
}
if (_currentElement) {
_removeClass(_currentElement, _globalConfig.hoverClass);
_removeClass(_currentElement, _globalConfig.activeClass);
_currentElement = null;
}
};
/**
* The underlying implementation of `ZeroClipboard.activeElement`.
* @private
*/
var _activeElement = function() {
return _currentElement || null;
};
/**
* Check if a value is a valid HTML4 `ID` or `Name` token.
* @private
*/
var _isValidHtml4Id = function(id) {
return typeof id === "string" && id && /^[A-Za-z][A-Za-z0-9_:\-\.]*$/.test(id);
};
/**
* Create or update an `event` object, based on the `eventType`.
* @private
*/
var _createEvent = function(event) {
var eventType;
if (typeof event === "string" && event) {
eventType = event;
event = {};
} else if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
eventType = event.type;
}
if (!eventType) {
return;
}
if (!event.target && /^(copy|aftercopy|_click)$/.test(eventType.toLowerCase())) {
event.target = _copyTarget;
}
_extend(event, {
type: eventType.toLowerCase(),
target: event.target || _currentElement || null,
relatedTarget: event.relatedTarget || null,
currentTarget: _flashState && _flashState.bridge || null,
timeStamp: event.timeStamp || _now() || null
});
var msg = _eventMessages[event.type];
if (event.type === "error" && event.name && msg) {
msg = msg[event.name];
}
if (msg) {
event.message = msg;
}
if (event.type === "ready") {
_extend(event, {
target: null,
version: _flashState.version
});
}
if (event.type === "error") {
if (/^flash-(disabled|outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
_extend(event, {
target: null,
minimumVersion: _minimumFlashVersion
});
}
if (/^flash-(outdated|unavailable|deactivated|overdue)$/.test(event.name)) {
_extend(event, {
version: _flashState.version
});
}
}
if (event.type === "copy") {
event.clipboardData = {
setData: ZeroClipboard.setData,
clearData: ZeroClipboard.clearData
};
}
if (event.type === "aftercopy") {
event = _mapClipResultsFromFlash(event, _clipDataFormatMap);
}
if (event.target && !event.relatedTarget) {
event.relatedTarget = _getRelatedTarget(event.target);
}
event = _addMouseData(event);
return event;
};
/**
* Get a relatedTarget from the target's `data-clipboard-target` attribute
* @private
*/
var _getRelatedTarget = function(targetEl) {
var relatedTargetId = targetEl && targetEl.getAttribute && targetEl.getAttribute("data-clipboard-target");
return relatedTargetId ? _document.getElementById(relatedTargetId) : null;
};
/**
* Add element and position data to `MouseEvent` instances
* @private
*/
var _addMouseData = function(event) {
if (event && /^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {
var srcElement = event.target;
var fromElement = event.type === "_mouseover" && event.relatedTarget ? event.relatedTarget : undefined;
var toElement = event.type === "_mouseout" && event.relatedTarget ? event.relatedTarget : undefined;
var pos = _getDOMObjectPosition(srcElement);
var screenLeft = _window.screenLeft || _window.screenX || 0;
var screenTop = _window.screenTop || _window.screenY || 0;
var scrollLeft = _document.body.scrollLeft + _document.documentElement.scrollLeft;
var scrollTop = _document.body.scrollTop + _document.documentElement.scrollTop;
var pageX = pos.left + (typeof event._stageX === "number" ? event._stageX : 0);
var pageY = pos.top + (typeof event._stageY === "number" ? event._stageY : 0);
var clientX = pageX - scrollLeft;
var clientY = pageY - scrollTop;
var screenX = screenLeft + clientX;
var screenY = screenTop + clientY;
var moveX = typeof event.movementX === "number" ? event.movementX : 0;
var moveY = typeof event.movementY === "number" ? event.movementY : 0;
delete event._stageX;
delete event._stageY;
_extend(event, {
srcElement: srcElement,
fromElement: fromElement,
toElement: toElement,
screenX: screenX,
screenY: screenY,
pageX: pageX,
pageY: pageY,
clientX: clientX,
clientY: clientY,
x: clientX,
y: clientY,
movementX: moveX,
movementY: moveY,
offsetX: 0,
offsetY: 0,
layerX: 0,
layerY: 0
});
}
return event;
};
/**
* Determine if an event's registered handlers should be execute synchronously or asynchronously.
*
* @returns {boolean}
* @private
*/
var _shouldPerformAsync = function(event) {
var eventType = event && typeof event.type === "string" && event.type || "";
return !/^(?:(?:before)?copy|destroy)$/.test(eventType);
};
/**
* Control if a callback should be executed asynchronously or not.
*
* @returns `undefined`
* @private
*/
var _dispatchCallback = function(func, context, args, async) {
if (async) {
_setTimeout(function() {
func.apply(context, args);
}, 0);
} else {
func.apply(context, args);
}
};
/**
* Handle the actual dispatching of events to client instances.
*
* @returns `undefined`
* @private
*/
var _dispatchCallbacks = function(event) {
if (!(typeof event === "object" && event && event.type)) {
return;
}
var async = _shouldPerformAsync(event);
var wildcardTypeHandlers = _handlers["*"] || [];
var specificTypeHandlers = _handlers[event.type] || [];
var handlers = wildcardTypeHandlers.concat(specificTypeHandlers);
if (handlers && handlers.length) {
var i, len, func, context, eventCopy, originalContext = this;
for (i = 0, len = handlers.length; i < len; i++) {
func = handlers[i];
context = originalContext;
if (typeof func === "string" && typeof _window[func] === "function") {
func = _window[func];
}
if (typeof func === "object" && func && typeof func.handleEvent === "function") {
context = func;
func = func.handleEvent;
}
if (typeof func === "function") {
eventCopy = _extend({}, event);
_dispatchCallback(func, context, [ eventCopy ], async);
}
}
}
return this;
};
/**
* Preprocess any special behaviors, reactions, or state changes after receiving this event.
* Executes only once per event emitted, NOT once per client.
* @private
*/
var _preprocessEvent = function(event) {
var element = event.target || _currentElement || null;
var sourceIsSwf = event._source === "swf";
delete event._source;
var flashErrorNames = [ "flash-disabled", "flash-outdated", "flash-unavailable", "flash-deactivated", "flash-overdue" ];
switch (event.type) {
case "error":
if (flashErrorNames.indexOf(event.name) !== -1) {
_extend(_flashState, {
disabled: event.name === "flash-disabled",
outdated: event.name === "flash-outdated",
unavailable: event.name === "flash-unavailable",
deactivated: event.name === "flash-deactivated",
overdue: event.name === "flash-overdue",
ready: false
});
}
break;
case "ready":
var wasDeactivated = _flashState.deactivated === true;
_extend(_flashState, {
disabled: false,
outdated: false,
unavailable: false,
deactivated: false,
overdue: wasDeactivated,
ready: !wasDeactivated
});
break;
case "beforecopy":
_copyTarget = element;
break;
case "copy":
var textContent, htmlContent, targetEl = event.relatedTarget;
if (!(_clipData["text/html"] || _clipData["text/plain"]) && targetEl && (htmlContent = targetEl.value || targetEl.outerHTML || targetEl.innerHTML) && (textContent = targetEl.value || targetEl.textContent || targetEl.innerText)) {
event.clipboardData.clearData();
event.clipboardData.setData("text/plain", textContent);
if (htmlContent !== textContent) {
event.clipboardData.setData("text/html", htmlContent);
}
} else if (!_clipData["text/plain"] && event.target && (textContent = event.target.getAttribute("data-clipboard-text"))) {
event.clipboardData.clearData();
event.clipboardData.setData("text/plain", textContent);
}
break;
case "aftercopy":
ZeroClipboard.clearData();
if (element && element !== _safeActiveElement() && element.focus) {
element.focus();
}
break;
case "_mouseover":
ZeroClipboard.focus(element);
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {
_fireMouseEvent(_extend({}, event, {
type: "mouseenter",
bubbles: false,
cancelable: false
}));
}
_fireMouseEvent(_extend({}, event, {
type: "mouseover"
}));
}
break;
case "_mouseout":
ZeroClipboard.blur();
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
if (element && element !== event.relatedTarget && !_containedBy(event.relatedTarget, element)) {
_fireMouseEvent(_extend({}, event, {
type: "mouseleave",
bubbles: false,
cancelable: false
}));
}
_fireMouseEvent(_extend({}, event, {
type: "mouseout"
}));
}
break;
case "_mousedown":
_addClass(element, _globalConfig.activeClass);
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
_fireMouseEvent(_extend({}, event, {
type: event.type.slice(1)
}));
}
break;
case "_mouseup":
_removeClass(element, _globalConfig.activeClass);
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
_fireMouseEvent(_extend({}, event, {
type: event.type.slice(1)
}));
}
break;
case "_click":
_copyTarget = null;
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
_fireMouseEvent(_extend({}, event, {
type: event.type.slice(1)
}));
}
break;
case "_mousemove":
if (_globalConfig.bubbleEvents === true && sourceIsSwf) {
_fireMouseEvent(_extend({}, event, {
type: event.type.slice(1)
}));
}
break;
}
if (/^_(?:click|mouse(?:over|out|down|up|move))$/.test(event.type)) {
return true;
}
};
/**
* Dispatch a synthetic MouseEvent.
*
* @returns `undefined`
* @private
*/
var _fireMouseEvent = function(event) {
if (!(event && typeof event.type === "string" && event)) {
return;
}
var e, target = event.target || null, doc = target && target.ownerDocument || _document, defaults = {
view: doc.defaultView || _window,
canBubble: true,
cancelable: true,
detail: event.type === "click" ? 1 : 0,
button: typeof event.which === "number" ? event.which - 1 : typeof event.button === "number" ? event.button : doc.createEvent ? 0 : 1
}, args = _extend(defaults, event);
if (!target) {
return;
}
if (doc.createEvent && target.dispatchEvent) {
args = [ args.type, args.canBubble, args.cancelable, args.view, args.detail, args.screenX, args.screenY, args.clientX, args.clientY, args.ctrlKey, args.altKey, args.shiftKey, args.metaKey, args.button, args.relatedTarget ];
e = doc.createEvent("MouseEvents");
if (e.initMouseEvent) {
e.initMouseEvent.apply(e, args);
e._source = "js";
target.dispatchEvent(e);
}
}
};
/**
* Create the HTML bridge element to embed the Flash object into.
* @private
*/
var _createHtmlBridge = function() {
var container = _document.createElement("div");
container.id = _globalConfig.containerId;
container.className = _globalConfig.containerClass;
container.style.position = "absolute";
container.style.left = "0px";
container.style.top = "-9999px";
container.style.width = "1px";
container.style.height = "1px";
container.style.zIndex = "" + _getSafeZIndex(_globalConfig.zIndex);
return container;
};
/**
* Get the HTML element container that wraps the Flash bridge object/element.
* @private
*/
var _getHtmlBridge = function(flashBridge) {
var htmlBridge = flashBridge && flashBridge.parentNode;
while (htmlBridge && htmlBridge.nodeName === "OBJECT" && htmlBridge.parentNode) {
htmlBridge = htmlBridge.parentNode;
}
return htmlBridge || null;
};
/**
* Create the SWF object.
*
* @returns The SWF object reference.
* @private
*/
var _embedSwf = function() {
var len, flashBridge = _flashState.bridge, container = _getHtmlBridge(flashBridge);
if (!flashBridge) {
var allowScriptAccess = _determineScriptAccess(_window.location.host, _globalConfig);
var allowNetworking = allowScriptAccess === "never" ? "none" : "all";
var flashvars = _vars(_globalConfig);
var swfUrl = _globalConfig.swfPath + _cacheBust(_globalConfig.swfPath, _globalConfig);
container = _createHtmlBridge();
var divToBeReplaced = _document.createElement("div");
container.appendChild(divToBeReplaced);
_document.body.appendChild(container);
var tmpDiv = _document.createElement("div");
var oldIE = _flashState.pluginType === "activex";
tmpDiv.innerHTML = '<object id="' + _globalConfig.swfObjectId + '" name="' + _globalConfig.swfObjectId + '" ' + 'width="100%" height="100%" ' + (oldIE ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' : 'type="application/x-shockwave-flash" data="' + swfUrl + '"') + ">" + (oldIE ? '<param name="movie" value="' + swfUrl + '"/>' : "") + '<param name="allowScriptAccess" value="' + allowScriptAccess + '"/>' + '<param name="allowNetworking" value="' + allowNetworking + '"/>' + '<param name="menu" value="false"/>' + '<param name="wmode" value="transparent"/>' + '<param name="flashvars" value="' + flashvars + '"/>' + "</object>";
flashBridge = tmpDiv.firstChild;
tmpDiv = null;
_unwrap(flashBridge).ZeroClipboard = ZeroClipboard;
container.replaceChild(flashBridge, divToBeReplaced);
}
if (!flashBridge) {
flashBridge = _document[_globalConfig.swfObjectId];
if (flashBridge && (len = flashBridge.length)) {
flashBridge = flashBridge[len - 1];
}
if (!flashBridge && container) {
flashBridge = container.firstChild;
}
}
_flashState.bridge = flashBridge || null;
return flashBridge;
};
/**
* Destroy the SWF object.
* @private
*/
var _unembedSwf = function() {
var flashBridge = _flashState.bridge;
if (flashBridge) {
var htmlBridge = _getHtmlBridge(flashBridge);
if (htmlBridge) {
if (_flashState.pluginType === "activex" && "readyState" in flashBridge) {
flashBridge.style.display = "none";
(function removeSwfFromIE() {
if (flashBridge.readyState === 4) {
for (var prop in flashBridge) {
if (typeof flashBridge[prop] === "function") {
flashBridge[prop] = null;
}
}
if (flashBridge.parentNode) {
flashBridge.parentNode.removeChild(flashBridge);
}
if (htmlBridge.parentNode) {
htmlBridge.parentNode.removeChild(htmlBridge);
}
} else {
_setTimeout(removeSwfFromIE, 10);
}
})();
} else {
if (flashBridge.parentNode) {
flashBridge.parentNode.removeChild(flashBridge);
}
if (htmlBridge.parentNode) {
htmlBridge.parentNode.removeChild(htmlBridge);
}
}
}
_flashState.ready = null;
_flashState.bridge = null;
_flashState.deactivated = null;
}
};
/**
* Map the data format names of the "clipData" to Flash-friendly names.
*
* @returns A new transformed object.
* @private
*/
var _mapClipDataToFlash = function(clipData) {
var newClipData = {}, formatMap = {};
if (!(typeof clipData === "object" && clipData)) {
return;
}
for (var dataFormat in clipData) {
if (dataFormat && _hasOwn.call(clipData, dataFormat) && typeof clipData[dataFormat] === "string" && clipData[dataFormat]) {
switch (dataFormat.toLowerCase()) {
case "text/plain":
case "text":
case "air:text":
case "flash:text":
newClipData.text = clipData[dataFormat];
formatMap.text = dataFormat;
break;
case "text/html":
case "html":
case "air:html":
case "flash:html":
newClipData.html = clipData[dataFormat];
formatMap.html = dataFormat;
break;
case "application/rtf":
case "text/rtf":
case "rtf":
case "richtext":
case "air:rtf":
case "flash:rtf":
newClipData.rtf = clipData[dataFormat];
formatMap.rtf = dataFormat;
break;
default:
break;
}
}
}
return {
data: newClipData,
formatMap: formatMap
};
};
/**
* Map the data format names from Flash-friendly names back to their original "clipData" names (via a format mapping).
*
* @returns A new transformed object.
* @private
*/
var _mapClipResultsFromFlash = function(clipResults, formatMap) {
if (!(typeof clipResults === "object" && clipResults && typeof formatMap === "object" && formatMap)) {
return clipResults;
}
var newResults = {};
for (var prop in clipResults) {
if (_hasOwn.call(clipResults, prop)) {
if (prop !== "success" && prop !== "data") {
newResults[prop] = clipResults[prop];
continue;
}
newResults[prop] = {};
var tmpHash = clipResults[prop];
for (var dataFormat in tmpHash) {
if (dataFormat && _hasOwn.call(tmpHash, dataFormat) && _hasOwn.call(formatMap, dataFormat)) {
newResults[prop][formatMap[dataFormat]] = tmpHash[dataFormat];
}
}
}
}
return newResults;
};
/**
* Will look at a path, and will create a "?noCache={time}" or "&noCache={time}"
* query param string to return. Does NOT append that string to the original path.
* This is useful because ExternalInterface often breaks when a Flash SWF is cached.
*
* @returns The `noCache` query param with necessary "?"/"&" prefix.
* @private
*/
var _cacheBust = function(path, options) {
var cacheBust = options == null || options && options.cacheBust === true;
if (cacheBust) {
return (path.indexOf("?") === -1 ? "?" : "&") + "noCache=" + _now();
} else {
return "";
}
};
/**
* Creates a query string for the FlashVars param.
* Does NOT include the cache-busting query param.
*
* @returns FlashVars query string
* @private
*/
var _vars = function(options) {
var i, len, domain, domains, str = "", trustedOriginsExpanded = [];
if (options.trustedDomains) {
if (typeof options.trustedDomains === "string") {
domains = [ options.trustedDomains ];
} else if (typeof options.trustedDomains === "object" && "length" in options.trustedDomains) {
domains = options.trustedDomains;
}
}
if (domains && domains.length) {
for (i = 0, len = domains.length; i < len; i++) {
if (_hasOwn.call(domains, i) && domains[i] && typeof domains[i] === "string") {
domain = _extractDomain(domains[i]);
if (!domain) {
continue;
}
if (domain === "*") {
trustedOriginsExpanded.length = 0;
trustedOriginsExpanded.push(domain);
break;
}
trustedOriginsExpanded.push.apply(trustedOriginsExpanded, [ domain, "//" + domain, _window.location.protocol + "//" + domain ]);
}
}
}
if (trustedOriginsExpanded.length) {
str += "trustedOrigins=" + _encodeURIComponent(trustedOriginsExpanded.join(","));
}
if (options.forceEnhancedClipboard === true) {
str += (str ? "&" : "") + "forceEnhancedClipboard=true";
}
if (typeof options.swfObjectId === "string" && options.swfObjectId) {
str += (str ? "&" : "") + "swfObjectId=" + _encodeURIComponent(options.swfObjectId);
}
return str;
};
/**
* Extract the domain (e.g. "github.com") from an origin (e.g. "https://github.com") or
* URL (e.g. "https://github.com/zeroclipboard/zeroclipboard/").
*
* @returns the domain
* @private
*/
var _extractDomain = function(originOrUrl) {
if (originOrUrl == null || originOrUrl === "") {
return null;
}
originOrUrl = originOrUrl.replace(/^\s+|\s+$/g, "");
if (originOrUrl === "") {
return null;
}
var protocolIndex = originOrUrl.indexOf("//");
originOrUrl = protocolIndex === -1 ? originOrUrl : originOrUrl.slice(protocolIndex + 2);
var pathIndex = originOrUrl.indexOf("/");
originOrUrl = pathIndex === -1 ? originOrUrl : protocolIndex === -1 || pathIndex === 0 ? null : originOrUrl.slice(0, pathIndex);
if (originOrUrl && originOrUrl.slice(-4).toLowerCase() === ".swf") {
return null;
}
return originOrUrl || null;
};
/**
* Set `allowScriptAccess` based on `trustedDomains` and `window.location.host` vs. `swfPath`.
*
* @returns The appropriate script access level.
* @private
*/
var _determineScriptAccess = function() {
var _extractAllDomains = function(origins) {
var i, len, tmp, resultsArray = [];
if (typeof origins === "string") {
origins = [ origins ];
}
if (!(typeof origins === "object" && origins && typeof origins.length === "number")) {
return resultsArray;
}
for (i = 0, len = origins.length; i < len; i++) {
if (_hasOwn.call(origins, i) && (tmp = _extractDomain(origins[i]))) {
if (tmp === "*") {
resultsArray.length = 0;
resultsArray.push("*");
break;
}
if (resultsArray.indexOf(tmp) === -1) {
resultsArray.push(tmp);
}
}
}
return resultsArray;
};
return function(currentDomain, configOptions) {
var swfDomain = _extractDomain(configOptions.swfPath);
if (swfDomain === null) {
swfDomain = currentDomain;
}
var trustedDomains = _extractAllDomains(configOptions.trustedDomains);
var len = trustedDomains.length;
if (len > 0) {
if (len === 1 && trustedDomains[0] === "*") {
return "always";
}
if (trustedDomains.indexOf(currentDomain) !== -1) {
if (len === 1 && currentDomain === swfDomain) {
return "sameDomain";
}
return "always";
}
}
return "never";
};
}();
/**
* Get the currently active/focused DOM element.
*
* @returns the currently active/focused element, or `null`
* @private
*/
var _safeActiveElement = function() {
try {
return _document.activeElement;
} catch (err) {
return null;
}
};
/**
* Add a class to an element, if it doesn't already have it.
*
* @returns The element, with its new class added.
* @private
*/
var _addClass = function(element, value) {
if (!element || element.nodeType !== 1) {
return element;
}
if (element.classList) {
if (!element.classList.contains(value)) {
element.classList.add(value);
}
return element;
}
if (value && typeof value === "string") {
var classNames = (value || "").split(/\s+/);
if (element.nodeType === 1) {
if (!element.className) {
element.className = value;
} else {
var className = " " + element.className + " ", setClass = element.className;
for (var c = 0, cl = classNames.length; c < cl; c++) {
if (className.indexOf(" " + classNames[c] + " ") < 0) {
setClass += " " + classNames[c];
}
}
element.className = setClass.replace(/^\s+|\s+$/g, "");
}
}
}
return element;
};
/**
* Remove a class from an element, if it has it.
*
* @returns The element, with its class removed.
* @private
*/
var _removeClass = function(element, value) {
if (!element || element.nodeType !== 1) {
return element;
}
if (element.classList) {
if (element.classList.contains(value)) {
element.classList.remove(value);
}
return element;
}
if (typeof value === "string" && value) {
var classNames = value.split(/\s+/);
if (element.nodeType === 1 && element.className) {
var className = (" " + element.className + " ").replace(/[\n\t]/g, " ");
for (var c = 0, cl = classNames.length; c < cl; c++) {
className = className.replace(" " + classNames[c] + " ", " ");
}
element.className = className.replace(/^\s+|\s+$/g, "");
}
}
return element;
};
/**
* Attempt to interpret the element's CSS styling. If `prop` is `"cursor"`,
* then we assume that it should be a hand ("pointer") cursor if the element
* is an anchor element ("a" tag).
*
* @returns The computed style property.
* @private
*/
var _getStyle = function(el, prop) {
var value = _window.getComputedStyle(el, null).getPropertyValue(prop);
if (prop === "cursor") {
if (!value || value === "auto") {
if (el.nodeName === "A") {
return "pointer";
}
}
}
return value;
};
/**
* Get the zoom factor of the browser. Always returns `1.0`, except at
* non-default zoom levels in IE<8 and some older versions of WebKit.
*
* @returns Floating unit percentage of the zoom factor (e.g. 150% = `1.5`).
* @private
*/
var _getZoomFactor = function() {
var rect, physicalWidth, logicalWidth, zoomFactor = 1;
if (typeof _document.body.getBoundingClientRect === "function") {
rect = _document.body.getBoundingClientRect();
physicalWidth = rect.right - rect.left;
logicalWidth = _document.body.offsetWidth;
zoomFactor = _round(physicalWidth / logicalWidth * 100) / 100;
}
return zoomFactor;
};
/**
* Get the DOM positioning info of an element.
*
* @returns Object containing the element's position, width, and height.
* @private
*/
var _getDOMObjectPosition = function(obj) {
var info = {
left: 0,
top: 0,
width: 0,
height: 0
};
if (obj.getBoundingClientRect) {
var rect = obj.getBoundingClientRect();
var pageXOffset, pageYOffset, zoomFactor;
if ("pageXOffset" in _window && "pageYOffset" in _window) {
pageXOffset = _window.pageXOffset;
pageYOffset = _window.pageYOffset;
} else {
zoomFactor = _getZoomFactor();
pageXOffset = _round(_document.documentElement.scrollLeft / zoomFactor);
pageYOffset = _round(_document.documentElement.scrollTop / zoomFactor);
}
var leftBorderWidth = _document.documentElement.clientLeft || 0;
var topBorderWidth = _document.documentElement.clientTop || 0;
info.left = rect.left + pageXOffset - leftBorderWidth;
info.top = rect.top + pageYOffset - topBorderWidth;
info.width = "width" in rect ? rect.width : rect.right - rect.left;
info.height = "height" in rect ? rect.height : rect.bottom - rect.top;
}
return info;
};
/**
* Reposition the Flash object to cover the currently activated element.
*
* @returns `undefined`
* @private
*/
var _reposition = function() {
var htmlBridge;
if (_currentElement && (htmlBridge = _getHtmlBridge(_flashState.bridge))) {
var pos = _getDOMObjectPosition(_currentElement);
_extend(htmlBridge.style, {
width: pos.width + "px",
height: pos.height + "px",
top: pos.top + "px",
left: pos.left + "px",
zIndex: "" + _getSafeZIndex(_globalConfig.zIndex)
});
}
};
/**
* Sends a signal to the Flash object to display the hand cursor if `true`.
*
* @returns `undefined`
* @private
*/
var _setHandCursor = function(enabled) {
if (_flashState.ready === true) {
if (_flashState.bridge && typeof _flashState.bridge.setHandCursor === "function") {
_flashState.bridge.setHandCursor(enabled);
} else {
_flashState.ready = false;
}
}
};
/**
* Get a safe value for `zIndex`
*
* @returns an integer, or "auto"
* @private
*/
var _getSafeZIndex = function(val) {
if (/^(?:auto|inherit)$/.test(val)) {
return val;
}
var zIndex;
if (typeof val === "number" && !_isNaN(val)) {
zIndex = val;
} else if (typeof val === "string") {
zIndex = _getSafeZIndex(_parseInt(val, 10));
}
return typeof zIndex === "number" ? zIndex : "auto";
};
/**
* Detect the Flash Player status, version, and plugin type.
*
* @see {@link https://code.google.com/p/doctype-mirror/wiki/ArticleDetectFlash#The_code}
* @see {@link http://stackoverflow.com/questions/12866060/detecting-pepper-ppapi-flash-with-javascript}
*
* @returns `undefined`
* @private
*/
var _detectFlashSupport = function(ActiveXObject) {
var plugin, ax, mimeType, hasFlash = false, isActiveX = false, isPPAPI = false, flashVersion = "";
/**
* Derived from Apple's suggested sniffer.
* @param {String} desc e.g. "Shockwave Flash 7.0 r61"
* @returns {String} "7.0.61"
* @private
*/
function parseFlashVersion(desc) {
var matches = desc.match(/[\d]+/g);
matches.length = 3;
return matches.join(".");
}
function isPepperFlash(flashPlayerFileName) {
return !!flashPlayerFileName && (flashPlayerFileName = flashPlayerFileName.toLowerCase()) && (/^(pepflashplayer\.dll|libpepflashplayer\.so|pepperflashplayer\.plugin)$/.test(flashPlayerFileName) || flashPlayerFileName.slice(-13) === "chrome.plugin");
}
function inspectPlugin(plugin) {
if (plugin) {
hasFlash = true;
if (plugin.version) {
flashVersion = parseFlashVersion(plugin.version);
}
if (!flashVersion && plugin.description) {
flashVersion = parseFlashVersion(plugin.description);
}
if (plugin.filename) {
isPPAPI = isPepperFlash(plugin.filename);
}
}
}
if (_navigator.plugins && _navigator.plugins.length) {
plugin = _navigator.plugins["Shockwave Flash"];
inspectPlugin(plugin);
if (_navigator.plugins["Shockwave Flash 2.0"]) {
hasFlash = true;
flashVersion = "2.0.0.11";
}
} else if (_navigator.mimeTypes && _navigator.mimeTypes.length) {
mimeType = _navigator.mimeTypes["application/x-shockwave-flash"];
plugin = mimeType && mimeType.enabledPlugin;
inspectPlugin(plugin);
} else if (typeof ActiveXObject !== "undefined") {
isActiveX = true;
try {
ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
hasFlash = true;
flashVersion = parseFlashVersion(ax.GetVariable("$version"));
} catch (e1) {
try {
ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
hasFlash = true;
flashVersion = "6.0.21";
} catch (e2) {
try {
ax = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
hasFlash = true;
flashVersion = parseFlashVersion(ax.GetVariable("$version"));
} catch (e3) {
isActiveX = false;
}
}
}
}
_flashState.disabled = hasFlash !== true;
_flashState.outdated = flashVersion && _parseFloat(flashVersion) < _parseFloat(_minimumFlashVersion);
_flashState.version = flashVersion || "0.0.0";
_flashState.pluginType = isPPAPI ? "pepper" : isActiveX ? "activex" : hasFlash ? "netscape" : "unknown";
};
/**
* Invoke the Flash detection algorithms immediately upon inclusion so we're not waiting later.
*/
_detectFlashSupport(_ActiveXObject);
/**
* A shell constructor for `ZeroClipboard` client instances.
*
* @constructor
*/
var ZeroClipboard = function() {
if (!(this instanceof ZeroClipboard)) {
return new ZeroClipboard();
}
if (typeof ZeroClipboard._createClient === "function") {
ZeroClipboard._createClient.apply(this, _args(arguments));
}
};
/**
* The ZeroClipboard library's version number.
*
* @static
* @readonly
* @property {string}
*/
_defineProperty(ZeroClipboard, "version", {
value: "2.1.6",
writable: false,
configurable: true,
enumerable: true
});
/**
* Update or get a copy of the ZeroClipboard global configuration.
* Returns a copy of the current/updated configuration.
*
* @returns Object
* @static
*/
ZeroClipboard.config = function() {
return _config.apply(this, _args(arguments));
};
/**
* Diagnostic method that describes the state of the browser, Flash Player, and ZeroClipboard.
*
* @returns Object
* @static
*/
ZeroClipboard.state = function() {
return _state.apply(this, _args(arguments));
};
/**
* Check if Flash is unusable for any reason: disabled, outdated, deactivated, etc.
*
* @returns Boolean
* @static
*/
ZeroClipboard.isFlashUnusable = function() {
return _isFlashUnusable.apply(this, _args(arguments));
};
/**
* Register an event listener.
*
* @returns `ZeroClipboard`
* @static
*/
ZeroClipboard.on = function() {
return _on.apply(this, _args(arguments));
};
/**
* Unregister an event listener.
* If no `listener` function/object is provided, it will unregister all listeners for the provided `eventType`.
* If no `eventType` is provided, it will unregister all listeners for every event type.
*
* @returns `ZeroClipboard`
* @static
*/
ZeroClipboard.off = function() {
return _off.apply(this, _args(arguments));
};
/**
* Retrieve event listeners for an `eventType`.
* If no `eventType` is provided, it will retrieve all listeners for every event type.
*
* @returns array of listeners for the `eventType`; if no `eventType`, then a map/hash object of listeners for all event types; or `null`
*/
ZeroClipboard.handlers = function() {
return _listeners.apply(this, _args(arguments));
};
/**
* Event emission receiver from the Flash object, forwarding to any registered JavaScript event listeners.
*
* @returns For the "copy" event, returns the Flash-friendly "clipData" object; otherwise `undefined`.
* @static
*/
ZeroClipboard.emit = function() {
return _emit.apply(this, _args(arguments));
};
/**
* Create and embed the Flash object.
*
* @returns The Flash object
* @static
*/
ZeroClipboard.create = function() {
return _create.apply(this, _args(arguments));
};
/**
* Self-destruct and clean up everything, including the embedded Flash object.
*
* @returns `undefined`
* @static
*/
ZeroClipboard.destroy = function() {
return _destroy.apply(this, _args(arguments));
};
/**
* Set the pending data for clipboard injection.
*
* @returns `undefined`
* @static
*/
ZeroClipboard.setData = function() {
return _setData.apply(this, _args(arguments));
};
/**
* Clear the pending data for clipboard injection.
* If no `format` is provided, all pending data formats will be cleared.
*
* @returns `undefined`
* @static
*/
ZeroClipboard.clearData = function() {
return _clearData.apply(this, _args(arguments));
};
/**
* Get a copy of the pending data for clipboard injection.
* If no `format` is provided, a copy of ALL pending data formats will be returned.
*
* @returns `String` or `Object`
* @static
*/
ZeroClipboard.getData = function() {
return _getData.apply(this, _args(arguments));
};
/**
* Sets the current HTML object that the Flash object should overlay. This will put the global
* Flash object on top of the current element; depending on the setup, this may also set the
* pending clipboard text data as well as the Flash object's wrapping element's title attribute
* based on the underlying HTML element and ZeroClipboard configuration.
*
* @returns `undefined`
* @static
*/
ZeroClipboard.focus = ZeroClipboard.activate = function() {
return _focus.apply(this, _args(arguments));
};
/**
* Un-overlays the Flash object. This will put the global Flash object off-screen; depending on
* the setup, this may also unset the Flash object's wrapping element's title attribute based on
* the underlying HTML element and ZeroClipboard configuration.
*
* @returns `undefined`
* @static
*/
ZeroClipboard.blur = ZeroClipboard.deactivate = function() {
return _blur.apply(this, _args(arguments));
};
/**
* Returns the currently focused/"activated" HTML element that the Flash object is wrapping.
*
* @returns `HTMLElement` or `null`
* @static
*/
ZeroClipboard.activeElement = function() {
return _activeElement.apply(this, _args(arguments));
};
/**
* Keep track of the ZeroClipboard client instance counter.
*/
var _clientIdCounter = 0;
/**
* Keep track of the state of the client instances.
*
* Entry structure:
* _clientMeta[client.id] = {
* instance: client,
* elements: [],
* handlers: {}
* };
*/
var _clientMeta = {};
/**
* Keep track of the ZeroClipboard clipped elements counter.
*/
var _elementIdCounter = 0;
/**
* Keep track of the state of the clipped element relationships to clients.
*
* Entry structure:
* _elementMeta[element.zcClippingId] = [client1.id, client2.id];
*/
var _elementMeta = {};
/**
* Keep track of the state of the mouse event handlers for clipped elements.
*
* Entry structure:
* _mouseHandlers[element.zcClippingId] = {
* mouseover: function(event) {},
* mouseout: function(event) {},
* mouseenter: function(event) {},
* mouseleave: function(event) {},
* mousemove: function(event) {}
* };
*/
var _mouseHandlers = {};
/**
* Extending the ZeroClipboard configuration defaults for the Client module.
*/
_extend(_globalConfig, {
autoActivate: true
});
/**
* The real constructor for `ZeroClipboard` client instances.
* @private
*/
var _clientConstructor = function(elements) {
var client = this;
client.id = "" + _clientIdCounter++;
_clientMeta[client.id] = {
instance: client,
elements: [],
handlers: {}
};
if (elements) {
client.clip(elements);
}
ZeroClipboard.on("*", function(event) {
return client.emit(event);
});
ZeroClipboard.on("destroy", function() {
client.destroy();
});
ZeroClipboard.create();
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.on`.
* @private
*/
var _clientOn = function(eventType, listener) {
var i, len, events, added = {}, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
if (typeof eventType === "string" && eventType) {
events = eventType.toLowerCase().split(/\s+/);
} else if (typeof eventType === "object" && eventType && typeof listener === "undefined") {
for (i in eventType) {
if (_hasOwn.call(eventType, i) && typeof i === "string" && i && typeof eventType[i] === "function") {
this.on(i, eventType[i]);
}
}
}
if (events && events.length) {
for (i = 0, len = events.length; i < len; i++) {
eventType = events[i].replace(/^on/, "");
added[eventType] = true;
if (!handlers[eventType]) {
handlers[eventType] = [];
}
handlers[eventType].push(listener);
}
if (added.ready && _flashState.ready) {
this.emit({
type: "ready",
client: this
});
}
if (added.error) {
var errorTypes = [ "disabled", "outdated", "unavailable", "deactivated", "overdue" ];
for (i = 0, len = errorTypes.length; i < len; i++) {
if (_flashState[errorTypes[i]]) {
this.emit({
type: "error",
name: "flash-" + errorTypes[i],
client: this
});
break;
}
}
}
}
return this;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.off`.
* @private
*/
var _clientOff = function(eventType, listener) {
var i, len, foundIndex, events, perEventHandlers, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
if (arguments.length === 0) {
events = _keys(handlers);
} else if (typeof eventType === "string" && eventType) {
events = eventType.split(/\s+/);
} else if (typeof eventType === "object" && eventType && typeof listener === "undefined") {
for (i in eventType) {
if (_hasOwn.call(eventType, i) && typeof i === "string" && i && typeof eventType[i] === "function") {
this.off(i, eventType[i]);
}
}
}
if (events && events.length) {
for (i = 0, len = events.length; i < len; i++) {
eventType = events[i].toLowerCase().replace(/^on/, "");
perEventHandlers = handlers[eventType];
if (perEventHandlers && perEventHandlers.length) {
if (listener) {
foundIndex = perEventHandlers.indexOf(listener);
while (foundIndex !== -1) {
perEventHandlers.splice(foundIndex, 1);
foundIndex = perEventHandlers.indexOf(listener, foundIndex);
}
} else {
perEventHandlers.length = 0;
}
}
}
}
return this;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.handlers`.
* @private
*/
var _clientListeners = function(eventType) {
var copy = null, handlers = _clientMeta[this.id] && _clientMeta[this.id].handlers;
if (handlers) {
if (typeof eventType === "string" && eventType) {
copy = handlers[eventType] ? handlers[eventType].slice(0) : [];
} else {
copy = _deepCopy(handlers);
}
}
return copy;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.emit`.
* @private
*/
var _clientEmit = function(event) {
if (_clientShouldEmit.call(this, event)) {
if (typeof event === "object" && event && typeof event.type === "string" && event.type) {
event = _extend({}, event);
}
var eventCopy = _extend({}, _createEvent(event), {
client: this
});
_clientDispatchCallbacks.call(this, eventCopy);
}
return this;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.clip`.
* @private
*/
var _clientClip = function(elements) {
elements = _prepClip(elements);
for (var i = 0; i < elements.length; i++) {
if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {
if (!elements[i].zcClippingId) {
elements[i].zcClippingId = "zcClippingId_" + _elementIdCounter++;
_elementMeta[elements[i].zcClippingId] = [ this.id ];
if (_globalConfig.autoActivate === true) {
_addMouseHandlers(elements[i]);
}
} else if (_elementMeta[elements[i].zcClippingId].indexOf(this.id) === -1) {
_elementMeta[elements[i].zcClippingId].push(this.id);
}
var clippedElements = _clientMeta[this.id] && _clientMeta[this.id].elements;
if (clippedElements.indexOf(elements[i]) === -1) {
clippedElements.push(elements[i]);
}
}
}
return this;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.unclip`.
* @private
*/
var _clientUnclip = function(elements) {
var meta = _clientMeta[this.id];
if (!meta) {
return this;
}
var clippedElements = meta.elements;
var arrayIndex;
if (typeof elements === "undefined") {
elements = clippedElements.slice(0);
} else {
elements = _prepClip(elements);
}
for (var i = elements.length; i--; ) {
if (_hasOwn.call(elements, i) && elements[i] && elements[i].nodeType === 1) {
arrayIndex = 0;
while ((arrayIndex = clippedElements.indexOf(elements[i], arrayIndex)) !== -1) {
clippedElements.splice(arrayIndex, 1);
}
var clientIds = _elementMeta[elements[i].zcClippingId];
if (clientIds) {
arrayIndex = 0;
while ((arrayIndex = clientIds.indexOf(this.id, arrayIndex)) !== -1) {
clientIds.splice(arrayIndex, 1);
}
if (clientIds.length === 0) {
if (_globalConfig.autoActivate === true) {
_removeMouseHandlers(elements[i]);
}
delete elements[i].zcClippingId;
}
}
}
}
return this;
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.elements`.
* @private
*/
var _clientElements = function() {
var meta = _clientMeta[this.id];
return meta && meta.elements ? meta.elements.slice(0) : [];
};
/**
* The underlying implementation of `ZeroClipboard.Client.prototype.destroy`.
* @private
*/
var _clientDestroy = function() {
this.unclip();
this.off();
delete _clientMeta[this.id];
};
/**
* Inspect an Event to see if the Client (`this`) should honor it for emission.
* @private
*/
var _clientShouldEmit = function(event) {
if (!(event && event.type)) {
return false;
}
if (event.client && event.client !== this) {
return false;
}
var clippedEls = _clientMeta[this.id] && _clientMeta[this.id].elements;
var hasClippedEls = !!clippedEls && clippedEls.length > 0;
var goodTarget = !event.target || hasClippedEls && clippedEls.indexOf(event.target) !== -1;
var goodRelTarget = event.relatedTarget && hasClippedEls && clippedEls.indexOf(event.relatedTarget) !== -1;
var goodClient = event.client && event.client === this;
if (!(goodTarget || goodRelTarget || goodClient)) {
return false;
}
return true;
};
/**
* Handle the actual dispatching of events to a client instance.
*
* @returns `this`
* @private
*/
var _clientDispatchCallbacks = function(event) {
if (!(typeof event === "object" && event && event.type)) {
return;
}
var async = _shouldPerformAsync(event);
var wildcardTypeHandlers = _clientMeta[this.id] && _clientMeta[this.id].handlers["*"] || [];
var specificTypeHandlers = _clientMeta[this.id] && _clientMeta[this.id].handlers[event.type] || [];
var handlers = wildcardTypeHandlers.concat(specificTypeHandlers);
if (handlers && handlers.length) {
var i, len, func, context, eventCopy, originalContext = this;
for (i = 0, len = handlers.length; i < len; i++) {
func = handlers[i];
context = originalContext;
if (typeof func === "string" && typeof _window[func] === "function") {
func = _window[func];
}
if (typeof func === "object" && func && typeof func.handleEvent === "function") {
context = func;
func = func.handleEvent;
}
if (typeof func === "function") {
eventCopy = _extend({}, event);
_dispatchCallback(func, context, [ eventCopy ], async);
}
}
}
return this;
};
/**
* Prepares the elements for clipping/unclipping.
*
* @returns An Array of elements.
* @private
*/
var _prepClip = function(elements) {
if (typeof elements === "string") {
elements = [];
}
return typeof elements.length !== "number" ? [ elements ] : elements;
};
/**
* Add a `mouseover` handler function for a clipped element.
*
* @returns `undefined`
* @private
*/
var _addMouseHandlers = function(element) {
if (!(element && element.nodeType === 1)) {
return;
}
var _suppressMouseEvents = function(event) {
if (!(event || (event = _window.event))) {
return;
}
if (event._source !== "js") {
event.stopImmediatePropagation();
event.preventDefault();
}
delete event._source;
};
var _elementMouseOver = function(event) {
if (!(event || (event = _window.event))) {
return;
}
_suppressMouseEvents(event);
ZeroClipboard.focus(element);
};
element.addEventListener("mouseover", _elementMouseOver, false);
element.addEventListener("mouseout", _suppressMouseEvents, false);
element.addEventListener("mouseenter", _suppressMouseEvents, false);
element.addEventListener("mouseleave", _suppressMouseEvents, false);
element.addEventListener("mousemove", _suppressMouseEvents, false);
_mouseHandlers[element.zcClippingId] = {
mouseover: _elementMouseOver,
mouseout: _suppressMouseEvents,
mouseenter: _suppressMouseEvents,
mouseleave: _suppressMouseEvents,
mousemove: _suppressMouseEvents
};
};
/**
* Remove a `mouseover` handler function for a clipped element.
*
* @returns `undefined`
* @private
*/
var _removeMouseHandlers = function(element) {
if (!(element && element.nodeType === 1)) {
return;
}
var mouseHandlers = _mouseHandlers[element.zcClippingId];
if (!(typeof mouseHandlers === "object" && mouseHandlers)) {
return;
}
var key, val, mouseEvents = [ "move", "leave", "enter", "out", "over" ];
for (var i = 0, len = mouseEvents.length; i < len; i++) {
key = "mouse" + mouseEvents[i];
val = mouseHandlers[key];
if (typeof val === "function") {
element.removeEventListener(key, val, false);
}
}
delete _mouseHandlers[element.zcClippingId];
};
/**
* Creates a new ZeroClipboard client instance.
* Optionally, auto-`clip` an element or collection of elements.
*
* @constructor
*/
ZeroClipboard._createClient = function() {
_clientConstructor.apply(this, _args(arguments));
};
/**
* Register an event listener to the client.
*
* @returns `this`
*/
ZeroClipboard.prototype.on = function() {
return _clientOn.apply(this, _args(arguments));
};
/**
* Unregister an event handler from the client.
* If no `listener` function/object is provided, it will unregister all handlers for the provided `eventType`.
* If no `eventType` is provided, it will unregister all handlers for every event type.
*
* @returns `this`
*/
ZeroClipboard.prototype.off = function() {
return _clientOff.apply(this, _args(arguments));
};
/**
* Retrieve event listeners for an `eventType` from the client.
* If no `eventType` is provided, it will retrieve all listeners for every event type.
*
* @returns array of listeners for the `eventType`; if no `eventType`, then a map/hash object of listeners for all event types; or `null`
*/
ZeroClipboard.prototype.handlers = function() {
return _clientListeners.apply(this, _args(arguments));
};
/**
* Event emission receiver from the Flash object for this client's registered JavaScript event listeners.
*
* @returns For the "copy" event, returns the Flash-friendly "clipData" object; otherwise `undefined`.
*/
ZeroClipboard.prototype.emit = function() {
return _clientEmit.apply(this, _args(arguments));
};
/**
* Register clipboard actions for new element(s) to the client.
*
* @returns `this`
*/
ZeroClipboard.prototype.clip = function() {
return _clientClip.apply(this, _args(arguments));
};
/**
* Unregister the clipboard actions of previously registered element(s) on the page.
* If no elements are provided, ALL registered elements will be unregistered.
*
* @returns `this`
*/
ZeroClipboard.prototype.unclip = function() {
return _clientUnclip.apply(this, _args(arguments));
};
/**
* Get all of the elements to which this client is clipped.
*
* @returns array of clipped elements
*/
ZeroClipboard.prototype.elements = function() {
return _clientElements.apply(this, _args(arguments));
};
/**
* Self-destruct and clean up everything for a single client.
* This will NOT destroy the embedded Flash object.
*
* @returns `undefined`
*/
ZeroClipboard.prototype.destroy = function() {
return _clientDestroy.apply(this, _args(arguments));
};
/**
* Stores the pending plain text to inject into the clipboard.
*
* @returns `this`
*/
ZeroClipboard.prototype.setText = function(text) {
ZeroClipboard.setData("text/plain", text);
return this;
};
/**
* Stores the pending HTML text to inject into the clipboard.
*
* @returns `this`
*/
ZeroClipboard.prototype.setHtml = function(html) {
ZeroClipboard.setData("text/html", html);
return this;
};
/**
* Stores the pending rich text (RTF) to inject into the clipboard.
*
* @returns `this`
*/
ZeroClipboard.prototype.setRichText = function(richText) {
ZeroClipboard.setData("application/rtf", richText);
return this;
};
/**
* Stores the pending data to inject into the clipboard.
*
* @returns `this`
*/
ZeroClipboard.prototype.setData = function() {
ZeroClipboard.setData.apply(this, _args(arguments));
return this;
};
/**
* Clears the pending data to inject into the clipboard.
* If no `format` is provided, all pending data formats will be cleared.
*
* @returns `this`
*/
ZeroClipboard.prototype.clearData = function() {
ZeroClipboard.clearData.apply(this, _args(arguments));
return this;
};
/**
* Gets a copy of the pending data to inject into the clipboard.
* If no `format` is provided, a copy of ALL pending data formats will be returned.
*
* @returns `String` or `Object`
*/
ZeroClipboard.prototype.getData = function() {
return ZeroClipboard.getData.apply(this, _args(arguments));
};
if (typeof define === "function" && define.amd) {
define(function() {
return ZeroClipboard;
});
} else if (typeof module === "object" && module && typeof module.exports === "object" && module.exports) {
module.exports = ZeroClipboard;
} else {
window.ZeroClipboard = ZeroClipboard;
}
})(function() {
return this || window;
}());
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>ZeroClipboard.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*
Simple Javascript undo and redo.
https://github.com/ArthurClemens/Javascript-Undo-Manager
*/
;(function() {
'use strict';
function removeFromTo(array, from, to) {
array.splice(from,
!to ||
1 + to - from + (!(to < 0 ^ from >= 0) && (to < 0 || -1) * array.length));
return array.length;
}
var UndoManager = function() {
var commands = [],
index = -1,
limit = 0,
isExecuting = false,
callback,
// functions
execute;
execute = function(command, action) {
if (!command || typeof command[action] !== "function") {
return this;
}
isExecuting = true;
command[action]();
isExecuting = false;
return this;
};
return {
/*
Add a command to the queue.
*/
add: function (command) {
if (isExecuting) {
return this;
}
// if we are here after having called undo,
// invalidate items higher on the stack
commands.splice(index + 1, commands.length - index);
commands.push(command);
// if limit is set, remove items from the start
if (limit && commands.length > limit) {
removeFromTo(commands, 0, -(limit+1));
}
// set the current index to the end
index = commands.length - 1;
if (callback) {
callback();
}
return this;
},
/*
Pass a function to be called on undo and redo actions.
*/
setCallback: function (callbackFunc) {
callback = callbackFunc;
},
/*
Perform undo: call the undo function at the current index and decrease the index by 1.
*/
undo: function () {
var command = commands[index];
if (!command) {
return this;
}
execute(command, "undo");
index -= 1;
if (callback) {
callback();
}
return this;
},
/*
Perform redo: call the redo function at the next index and increase the index by 1.
*/
redo: function () {
var command = commands[index + 1];
if (!command) {
return this;
}
execute(command, "redo");
index += 1;
if (callback) {
callback();
}
return this;
},
/*
Clears the memory, losing all stored states. Reset the index.
*/
clear: function () {
var prev_size = commands.length;
commands = [];
index = -1;
if (callback && (prev_size > 0)) {
callback();
}
},
hasUndo: function () {
return index !== -1;
},
hasRedo: function () {
return index < (commands.length - 1);
},
getCommands: function () {
return commands;
},
getIndex: function() {
return index;
},
setLimit: function (l) {
limit = l;
}
};
};
if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
// AMD. Register as an anonymous module.
define(function() {
return UndoManager;
});
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = UndoManager;
} else {
window.UndoManager = UndoManager;
}
}());
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>copy3_of_undomanager.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
(function(root,factory){if(typeof define==="function"&&define.amd){define(["cldr","cldr/event"],factory)}else if(typeof exports==="object"){module.exports=factory(require("cldrjs"))}else{root.Globalize=factory(root.Cldr)}})(this,function(Cldr){var toString=function(variable){return typeof variable==="string"?variable:typeof variable==="number"?""+variable:JSON.stringify(variable)};var formatMessage=function(message,data){message=message.replace(/{[0-9a-zA-Z-_. ]+}/g,function(name){name=name.replace(/^{([^}]*)}$/,"$1");return toString(data[name])});return message};var objectExtend=function(){var destination=arguments[0],sources=[].slice.call(arguments,1);sources.forEach(function(source){var prop;for(prop in source){destination[prop]=source[prop]}});return destination};var createError=function(code,message,attributes){var error;message=code+(message?": "+formatMessage(message,attributes):"");error=new Error(message);error.code=code;objectExtend(error,attributes);return error};var stringHash=function(str){return[].reduce.call(str,function(hash,i){var chr=i.charCodeAt(0);hash=(hash<<5)-hash+chr;return hash|0},0)};var runtimeKey=function(fnName,locale,args,argsStr){var hash;argsStr=argsStr||JSON.stringify(args);hash=stringHash(fnName+locale+argsStr);return hash>0?"a"+hash:"b"+Math.abs(hash)};var functionName=function(fn){if(fn.name!==undefined){return fn.name}var matches=/^function\s+([\w\$]+)\s*\(/.exec(fn.toString());if(matches&&matches.length>0){return matches[1]}};var runtimeBind=function(args,cldr,fn,runtimeArgs){var argsStr=JSON.stringify(args),fnName=functionName(fn),locale=cldr.locale;if(!fnName){return fn}fn.runtimeKey=runtimeKey(fnName,locale,null,argsStr);fn.generatorString=function(){return'Globalize("'+locale+'").'+fnName+"("+argsStr.slice(1,-1)+")"};fn.runtimeArgs=runtimeArgs;return fn};var validate=function(code,message,check,attributes){if(!check){throw createError(code,message,attributes)}};var alwaysArray=function(stringOrArray){return Array.isArray(stringOrArray)?stringOrArray:stringOrArray?[stringOrArray]:[]};var validateCldr=function(path,value,options){var skipBoolean;options=options||{};skipBoolean=alwaysArray(options.skip).some(function(pathRe){return pathRe.test(path)});validate("E_MISSING_CLDR","Missing required CLDR content `{path}`.",value||skipBoolean,{path:path})};var validateDefaultLocale=function(value){validate("E_DEFAULT_LOCALE_NOT_DEFINED","Default locale has not been defined.",value!==undefined,{})};var validateParameterPresence=function(value,name){validate("E_MISSING_PARAMETER","Missing required parameter `{name}`.",value!==undefined,{name:name})};var validateParameterRange=function(value,name,minimum,maximum){validate("E_PAR_OUT_OF_RANGE","Parameter `{name}` has value `{value}` out of range [{minimum}, {maximum}].",value===undefined||value>=minimum&&value<=maximum,{maximum:maximum,minimum:minimum,name:name,value:value})};var validateParameterType=function(value,name,check,expected){validate("E_INVALID_PAR_TYPE","Invalid `{name}` parameter ({value}). {expected} expected.",check,{expected:expected,name:name,value:value})};var validateParameterTypeLocale=function(value,name){validateParameterType(value,name,value===undefined||typeof value==="string"||value instanceof Cldr,"String or Cldr instance")};var isPlainObject=function(obj){return obj!==null&&""+obj==="[object Object]"};var validateParameterTypePlainObject=function(value,name){validateParameterType(value,name,value===undefined||isPlainObject(value),"Plain Object")};var alwaysCldr=function(localeOrCldr){return localeOrCldr instanceof Cldr?localeOrCldr:new Cldr(localeOrCldr)};var regexpEscape=function(string){return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g,"\\$1")};var stringPad=function(str,count,right){var length;if(typeof str!=="string"){str=String(str)}for(length=str.length;length<count;length+=1){str=right?str+"0":"0"+str}return str};function validateLikelySubtags(cldr){cldr.once("get",validateCldr);cldr.get("supplemental/likelySubtags")}function Globalize(locale){if(!(this instanceof Globalize)){return new Globalize(locale)}validateParameterPresence(locale,"locale");validateParameterTypeLocale(locale,"locale");this.cldr=alwaysCldr(locale);validateLikelySubtags(this.cldr)}Globalize.load=function(){Cldr.load.apply(Cldr,arguments)};Globalize.locale=function(locale){validateParameterTypeLocale(locale,"locale");if(arguments.length){this.cldr=alwaysCldr(locale);validateLikelySubtags(this.cldr)}return this.cldr};Globalize._alwaysArray=alwaysArray;Globalize._createError=createError;Globalize._formatMessage=formatMessage;Globalize._isPlainObject=isPlainObject;Globalize._objectExtend=objectExtend;Globalize._regexpEscape=regexpEscape;Globalize._runtimeBind=runtimeBind;Globalize._stringPad=stringPad;Globalize._validate=validate;Globalize._validateCldr=validateCldr;Globalize._validateDefaultLocale=validateDefaultLocale;Globalize._validateParameterPresence=validateParameterPresence;Globalize._validateParameterRange=validateParameterRange;Globalize._validateParameterTypePlainObject=validateParameterTypePlainObject;Globalize._validateParameterType=validateParameterType;return Globalize});
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>globalize.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>graphael</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
(function () {
var mmin = Math.min,
mmax = Math.max;
function finger(x, y, width, height, dir, ending, isPath, paper) {
var path,
ends = { round: 'round', sharp: 'sharp', soft: 'soft', square: 'square' };
// dir 0 for horizontal and 1 for vertical
if ((dir && !height) || (!dir && !width)) {
return isPath ? "" : paper.path();
}
ending = ends[ending] || "square";
height = Math.round(height);
width = Math.round(width);
x = Math.round(x);
y = Math.round(y);
switch (ending) {
case "round":
if (!dir) {
var r = ~~(height / 2);
if (width < r) {
r = width;
path = [
"M", x + .5, y + .5 - ~~(height / 2),
"l", 0, 0,
"a", r, ~~(height / 2), 0, 0, 1, 0, height,
"l", 0, 0,
"z"
];
} else {
path = [
"M", x + .5, y + .5 - r,
"l", width - r, 0,
"a", r, r, 0, 1, 1, 0, height,
"l", r - width, 0,
"z"
];
}
} else {
r = ~~(width / 2);
if (height < r) {
r = height;
path = [
"M", x - ~~(width / 2), y,
"l", 0, 0,
"a", ~~(width / 2), r, 0, 0, 1, width, 0,
"l", 0, 0,
"z"
];
} else {
path = [
"M", x - r, y,
"l", 0, r - height,
"a", r, r, 0, 1, 1, width, 0,
"l", 0, height - r,
"z"
];
}
}
break;
case "sharp":
if (!dir) {
var half = ~~(height / 2);
path = [
"M", x, y + half,
"l", 0, -height, mmax(width - half, 0), 0, mmin(half, width), half, -mmin(half, width), half + (half * 2 < height),
"z"
];
} else {
half = ~~(width / 2);
path = [
"M", x + half, y,
"l", -width, 0, 0, -mmax(height - half, 0), half, -mmin(half, height), half, mmin(half, height), half,
"z"
];
}
break;
case "square":
if (!dir) {
path = [
"M", x, y + ~~(height / 2),
"l", 0, -height, width, 0, 0, height,
"z"
];
} else {
path = [
"M", x + ~~(width / 2), y,
"l", 1 - width, 0, 0, -height, width - 1, 0,
"z"
];
}
break;
case "soft":
if (!dir) {
r = mmin(width, Math.round(height / 5));
path = [
"M", x + .5, y + .5 - ~~(height / 2),
"l", width - r, 0,
"a", r, r, 0, 0, 1, r, r,
"l", 0, height - r * 2,
"a", r, r, 0, 0, 1, -r, r,
"l", r - width, 0,
"z"
];
} else {
r = mmin(Math.round(width / 5), height);
path = [
"M", x - ~~(width / 2), y,
"l", 0, r - height,
"a", r, r, 0, 0, 1, r, -r,
"l", width - 2 * r, 0,
"a", r, r, 0, 0, 1, r, r,
"l", 0, height - r,
"z"
];
}
}
if (isPath) {
return path.join(",");
} else {
return paper.path(path);
}
}
/*\
* Paper.vbarchart
[ method ]
**
* Creates a vertical bar chart
**
> Parameters
**
- x (number) x coordinate of the chart
- y (number) y coordinate of the chart
- width (number) width of the chart (respected by all elements in the set)
- height (number) height of the chart (respected by all elements in the set)
- values (array) values
- opts (object) options for the chart
o {
o type (string) type of endings of the bar. Default: 'square'. Other options are: 'round', 'sharp', 'soft'.
o gutter (number)(string) default '20%' (WHAT DOES IT DO?)
o vgutter (number)
o colors (array) colors be used repeatedly to plot the bars. If multicolumn bar is used each sequence of bars with use a different color.
o stacked (boolean) whether or not to tread values as in a stacked bar chart
o to
o stretch (boolean)
o }
**
= (object) path element of the popup
> Usage
| r.vbarchart(0, 0, 620, 260, [76, 70, 67, 71, 69], {})
\*/
function VBarchart(paper, x, y, width, height, values, opts) {
opts = opts || {};
var chartinst = this,
type = opts.type || "square",
gutter = parseFloat(opts.gutter || "20%"),
chart = paper.set(),
bars = paper.set(),
covers = paper.set(),
covers2 = paper.set(),
total = Math.max.apply(Math, values),
stacktotal = [],
multi = 0,
colors = opts.colors || chartinst.colors,
len = values.length;
if (Raphael.is(values[0], "array")) {
total = [];
multi = len;
len = 0;
for (var i = values.length; i--;) {
bars.push(paper.set());
total.push(Math.max.apply(Math, values[i]));
len = Math.max(len, values[i].length);
}
if (opts.stacked) {
for (var i = len; i--;) {
var tot = 0;
for (var j = values.length; j--;) {
tot +=+ values[j][i] || 0;
}
stacktotal.push(tot);
}
}
for (var i = values.length; i--;) {
if (values[i].length < len) {
for (var j = len; j--;) {
values[i].push(0);
}
}
}
total = Math.max.apply(Math, opts.stacked ? stacktotal : total);
}
total = (opts.to) || total;
var barwidth = width / (len * (100 + gutter) + gutter) * 100,
barhgutter = barwidth * gutter / 100,
barvgutter = opts.vgutter == null ? 20 : opts.vgutter,
stack = [],
X = x + barhgutter,
Y = (height - 2 * barvgutter) / total;
if (!opts.stretch) {
barhgutter = Math.round(barhgutter);
barwidth = Math.floor(barwidth);
}
!opts.stacked && (barwidth /= multi || 1);
for (var i = 0; i < len; i++) {
stack = [];
for (var j = 0; j < (multi || 1); j++) {
var h = Math.round((multi ? values[j][i] : values[i]) * Y),
top = y + height - barvgutter - h,
bar = finger(Math.round(X + barwidth / 2), top + h, barwidth, h, true, type, null, paper).attr({ stroke: "none", fill: colors[multi ? j : i] });
if (multi) {
bars[j].push(bar);
} else {
bars.push(bar);
}
bar.y = top;
bar.x = Math.round(X + barwidth / 2);
bar.w = barwidth;
bar.h = h;
bar.value = multi ? values[j][i] : values[i];
if (!opts.stacked) {
X += barwidth;
} else {
stack.push(bar);
}
}
if (opts.stacked) {
var cvr;
covers2.push(cvr = paper.rect(stack[0].x - stack[0].w / 2, y, barwidth, height).attr(chartinst.shim));
cvr.bars = paper.set();
var size = 0;
for (var s = stack.length; s--;) {
stack[s].toFront();
}
for (var s = 0, ss = stack.length; s < ss; s++) {
var bar = stack[s],
cover,
h = (size + bar.value) * Y,
path = finger(bar.x, y + height - barvgutter - !!size * .5, barwidth, h, true, type, 1, paper);
cvr.bars.push(bar);
size && bar.attr({path: path});
bar.h = h;
bar.y = y + height - barvgutter - !!size * .5 - h;
covers.push(cover = paper.rect(bar.x - bar.w / 2, bar.y, barwidth, bar.value * Y).attr(chartinst.shim));
cover.bar = bar;
cover.value = bar.value;
size += bar.value;
}
X += barwidth;
}
X += barhgutter;
}
covers2.toFront();
X = x + barhgutter;
if (!opts.stacked) {
for (var i = 0; i < len; i++) {
for (var j = 0; j < (multi || 1); j++) {
var cover;
covers.push(cover = paper.rect(Math.round(X), y + barvgutter, barwidth, height - barvgutter).attr(chartinst.shim));
cover.bar = multi ? bars[j][i] : bars[i];
cover.value = cover.bar.value;
X += barwidth;
}
X += barhgutter;
}
}
chart.label = function (labels, isBottom) {
labels = labels || [];
this.labels = paper.set();
var L, l = -Infinity;
if (opts.stacked) {
for (var i = 0; i < len; i++) {
var tot = 0;
for (var j = 0; j < (multi || 1); j++) {
tot += multi ? values[j][i] : values[i];
if (j == multi - 1) {
var label = paper.labelise(labels[i], tot, total);
L = paper.text(bars[i * (multi || 1) + j].x, y + height - barvgutter / 2, label).attr(txtattr).insertBefore(covers[i * (multi || 1) + j]);
var bb = L.getBBox();
if (bb.x - 7 < l) {
L.remove();
} else {
this.labels.push(L);
l = bb.x + bb.width;
}
}
}
}
} else {
for (var i = 0; i < len; i++) {
for (var j = 0; j < (multi || 1); j++) {
var label = paper.labelise(multi ? labels[j] && labels[j][i] : labels[i], multi ? values[j][i] : values[i], total);
L = paper.text(bars[i * (multi || 1) + j].x, isBottom ? y + height - barvgutter / 2 : bars[i * (multi || 1) + j].y - 10, label).attr(txtattr).insertBefore(covers[i * (multi || 1) + j]);
var bb = L.getBBox();
if (bb.x - 7 < l) {
L.remove();
} else {
this.labels.push(L);
l = bb.x + bb.width;
}
}
}
}
return this;
};
chart.hover = function (fin, fout) {
covers2.hide();
covers.show();
covers.mouseover(fin).mouseout(fout);
return this;
};
chart.hoverColumn = function (fin, fout) {
covers.hide();
covers2.show();
fout = fout || function () {};
covers2.mouseover(fin).mouseout(fout);
return this;
};
chart.click = function (f) {
covers2.hide();
covers.show();
covers.click(f);
return this;
};
chart.each = function (f) {
if (!Raphael.is(f, "function")) {
return this;
}
for (var i = covers.length; i--;) {
f.call(covers[i]);
}
return this;
};
chart.eachColumn = function (f) {
if (!Raphael.is(f, "function")) {
return this;
}
for (var i = covers2.length; i--;) {
f.call(covers2[i]);
}
return this;
};
chart.clickColumn = function (f) {
covers.hide();
covers2.show();
covers2.click(f);
return this;
};
chart.push(bars, covers, covers2);
chart.bars = bars;
chart.covers = covers;
return chart;
};
//inheritance
var F = function() {};
F.prototype = Raphael.g;
HBarchart.prototype = VBarchart.prototype = new F; //prototype reused by hbarchart
Raphael.fn.barchart = function(x, y, width, height, values, opts) {
return new VBarchart(this, x, y, width, height, values, opts);
};
/*\
* Paper.barchart
[ method ]
**
* Creates a horizontal bar chart
**
> Parameters
**
- x (number) x coordinate of the chart
- y (number) y coordinate of the chart
- width (number) width of the chart (respected by all elements in the set)
- height (number) height of the chart (respected by all elements in the set)
- values (array) values
- opts (object) options for the chart
o {
o type (string) type of endings of the bar. Default: 'square'. Other options are: 'round', 'sharp', 'soft'.
o gutter (number)(string) default '20%' (WHAT DOES IT DO?)
o vgutter (number)
o colors (array) colors be used repeatedly to plot the bars. If multicolumn bar is used each sequence of bars with use a different color.
o stacked (boolean) whether or not to tread values as in a stacked bar chart
o to
o stretch (boolean)
o }
**
= (object) path element of the popup
> Usage
| r.barchart(0, 0, 620, 260, [76, 70, 67, 71, 69], {})
\*/
function HBarchart(paper, x, y, width, height, values, opts) {
opts = opts || {};
var chartinst = this,
type = opts.type || "square",
gutter = parseFloat(opts.gutter || "20%"),
chart = paper.set(),
bars = paper.set(),
covers = paper.set(),
covers2 = paper.set(),
total = Math.max.apply(Math, values),
stacktotal = [],
multi = 0,
colors = opts.colors || chartinst.colors,
len = values.length;
if (Raphael.is(values[0], "array")) {
total = [];
multi = len;
len = 0;
for (var i = values.length; i--;) {
bars.push(paper.set());
total.push(Math.max.apply(Math, values[i]));
len = Math.max(len, values[i].length);
}
if (opts.stacked) {
for (var i = len; i--;) {
var tot = 0;
for (var j = values.length; j--;) {
tot +=+ values[j][i] || 0;
}
stacktotal.push(tot);
}
}
for (var i = values.length; i--;) {
if (values[i].length < len) {
for (var j = len; j--;) {
values[i].push(0);
}
}
}
total = Math.max.apply(Math, opts.stacked ? stacktotal : total);
}
total = (opts.to) || total;
var barheight = Math.floor(height / (len * (100 + gutter) + gutter) * 100),
bargutter = Math.floor(barheight * gutter / 100),
stack = [],
Y = y + bargutter,
X = (width - 1) / total;
!opts.stacked && (barheight /= multi || 1);
for (var i = 0; i < len; i++) {
stack = [];
for (var j = 0; j < (multi || 1); j++) {
var val = multi ? values[j][i] : values[i],
bar = finger(x, Y + barheight / 2, Math.round(val * X), barheight - 1, false, type, null, paper).attr({stroke: "none", fill: colors[multi ? j : i]});
if (multi) {
bars[j].push(bar);
} else {
bars.push(bar);
}
bar.x = x + Math.round(val * X);
bar.y = Y + barheight / 2;
bar.w = Math.round(val * X);
bar.h = barheight;
bar.value = +val;
if (!opts.stacked) {
Y += barheight;
} else {
stack.push(bar);
}
}
if (opts.stacked) {
var cvr = paper.rect(x, stack[0].y - stack[0].h / 2, width, barheight).attr(chartinst.shim);
covers2.push(cvr);
cvr.bars = paper.set();
var size = 0;
for (var s = stack.length; s--;) {
stack[s].toFront();
}
for (var s = 0, ss = stack.length; s < ss; s++) {
var bar = stack[s],
cover,
val = Math.round((size + bar.value) * X),
path = finger(x, bar.y, val, barheight - 1, false, type, 1, paper);
cvr.bars.push(bar);
size && bar.attr({ path: path });
bar.w = val;
bar.x = x + val;
covers.push(cover = paper.rect(x + size * X, bar.y - bar.h / 2, bar.value * X, barheight).attr(chartinst.shim));
cover.bar = bar;
size += bar.value;
}
Y += barheight;
}
Y += bargutter;
}
covers2.toFront();
Y = y + bargutter;
if (!opts.stacked) {
for (var i = 0; i < len; i++) {
for (var j = 0; j < (multi || 1); j++) {
var cover = paper.rect(x, Y, width, barheight).attr(chartinst.shim);
covers.push(cover);
cover.bar = multi ? bars[j][i] : bars[i];
cover.value = cover.bar.value;
Y += barheight;
}
Y += bargutter;
}
}
chart.label = function (labels, isRight) {
labels = labels || [];
this.labels = paper.set();
for (var i = 0; i < len; i++) {
for (var j = 0; j < multi; j++) {
var label = paper.labelise(multi ? labels[j] && labels[j][i] : labels[i], multi ? values[j][i] : values[i], total),
X = isRight ? bars[i * (multi || 1) + j].x - barheight / 2 + 3 : x + 5,
A = isRight ? "end" : "start",
L;
this.labels.push(L = paper.text(X, bars[i * (multi || 1) + j].y, label).attr(txtattr).attr({ "text-anchor": A }).insertBefore(covers[0]));
if (L.getBBox().x < x + 5) {
L.attr({x: x + 5, "text-anchor": "start"});
} else {
bars[i * (multi || 1) + j].label = L;
}
}
}
return this;
};
chart.hover = function (fin, fout) {
covers2.hide();
covers.show();
fout = fout || function () {};
covers.mouseover(fin).mouseout(fout);
return this;
};
chart.hoverColumn = function (fin, fout) {
covers.hide();
covers2.show();
fout = fout || function () {};
covers2.mouseover(fin).mouseout(fout);
return this;
};
chart.each = function (f) {
if (!Raphael.is(f, "function")) {
return this;
}
for (var i = covers.length; i--;) {
f.call(covers[i]);
}
return this;
};
chart.eachColumn = function (f) {
if (!Raphael.is(f, "function")) {
return this;
}
for (var i = covers2.length; i--;) {
f.call(covers2[i]);
}
return this;
};
chart.click = function (f) {
covers2.hide();
covers.show();
covers.click(f);
return this;
};
chart.clickColumn = function (f) {
covers.hide();
covers2.show();
covers2.click(f);
return this;
};
chart.push(bars, covers, covers2);
chart.bars = bars;
chart.covers = covers;
return chart;
};
Raphael.fn.hbarchart = function(x, y, width, height, values, opts) {
return new HBarchart(this, x, y, width, height, values, opts);
};
})();
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>g.bar.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
(function () {
var colorValue = function (value, total, s, b) {
return 'hsb(' + [Math.min((1 - value / total) * .4, 1), s || .75, b || .75] + ')';
};
function Dotchart(paper, x, y, width, height, valuesx, valuesy, size, opts) {
function drawAxis(ax) {
+ax[0] && (ax[0] = chartinst.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, opts.axisxlabels || null, opts.axisxtype || "t", null, paper));
+ax[1] && (ax[1] = chartinst.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, opts.axisylabels || null, opts.axisytype || "t", null, paper));
+ax[2] && (ax[2] = chartinst.axis(x + gutter, y + height - gutter + maxR, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, opts.axisxlabels || null, opts.axisxtype || "t", null, paper));
+ax[3] && (ax[3] = chartinst.axis(x + gutter - maxR, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, opts.axisylabels || null, opts.axisytype || "t", null, paper));
}
//providing defaults
opts = opts || {};
var chartinst = this;
var xdim = chartinst.snapEnds(Math.min.apply(Math, valuesx), Math.max.apply(Math, valuesx), valuesx.length - 1),
minx = xdim.from,
maxx = xdim.to,
gutter = opts.gutter || 10,
ydim = chartinst.snapEnds(Math.min.apply(Math, valuesy), Math.max.apply(Math, valuesy), valuesy.length - 1),
miny = ydim.from,
maxy = ydim.to,
len = Math.max(valuesx.length, valuesy.length, size.length),
symbol = paper[opts.symbol] || "circle",
res = paper.set(),
series = paper.set(),
max = opts.max || 100,
top = Math.max.apply(Math, size),
R = [],
k = Math.sqrt(top / Math.PI) * 2 / max;
for (var i = 0; i < len; i++) {
R[i] = Math.min(Math.sqrt(size[i] / Math.PI) * 2 / k, max);
}
gutter = Math.max.apply(Math, R.concat(gutter));
/*\
* dotchart.axis
[ object ]
**
* Set containing Elements of the chart axis. Only exists if `'axis'` definition string was passed to @Paper.dotchart
**
\*/
var axis = paper.set(),
maxR = Math.max.apply(Math, R);
if (opts.axis) {
var ax = (opts.axis + "").split(/[,\s]+/);
drawAxis.call(chartinst, ax);
var g = [], b = [];
for (var i = 0, ii = ax.length; i < ii; i++) {
var bb = ax[i].all ? ax[i].all.getBBox()[["height", "width"][i % 2]] : 0;
g[i] = bb + gutter;
b[i] = bb;
}
gutter = Math.max.apply(Math, g.concat(gutter));
for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) {
ax[i].remove();
ax[i] = 1;
}
drawAxis.call(chartinst, ax);
for (var i = 0, ii = ax.length; i < ii; i++) if (ax[i].all) {
axis.push(ax[i].all);
}
res.axis = axis;
}
var kx = (width - gutter * 2) / ((maxx - minx) || 1),
ky = (height - gutter * 2) / ((maxy - miny) || 1);
for (var i = 0, ii = valuesy.length; i < ii; i++) {
var sym = paper.raphael.is(symbol, "array") ? symbol[i] : symbol,
X = x + gutter + (valuesx[i] - minx) * kx,
Y = y + height - gutter - (valuesy[i] - miny) * ky;
sym && R[i] && series.push(paper[sym](X, Y, R[i]).attr({ fill: opts.heat ? colorValue(R[i], maxR) : chartinst.colors[0], "fill-opacity": opts.opacity ? R[i] / max : 1, stroke: "none" }));
}
var covers = paper.set();
for (var i = 0, ii = valuesy.length; i < ii; i++) {
var X = x + gutter + (valuesx[i] - minx) * kx,
Y = y + height - gutter - (valuesy[i] - miny) * ky;
covers.push(paper.circle(X, Y, maxR).attr(chartinst.shim));
opts.href && opts.href[i] && covers[i].attr({href: opts.href[i]});
covers[i].r = +R[i].toFixed(3);
covers[i].x = +X.toFixed(3);
covers[i].y = +Y.toFixed(3);
covers[i].X = valuesx[i];
covers[i].Y = valuesy[i];
covers[i].value = size[i] || 0;
covers[i].dot = series[i];
}
/*\
* dotchart.covers
[ object ]
**
* Set of Elements positioned above the symbols and mirroring them in size and shape. Covers are used as a surface for events capturing. Each cover has a property `'dot'` being a reference to the actual data-representing symbol.
**
**
\*/
res.covers = covers;
/*\
* dotchart.series
[ object ]
**
* Set of Elements containing the actual data-representing symbols.
**
**
\*/
res.series = series;
res.push(series, axis, covers);
/*\
* dotchart.hover
[ method ]
> Parameters
- mouseover handler (function) handler for the event
- mouseout handler (function) handler for the event
* Conveniece method to set up hover-in and hover-out event handlers
= (object) @dotchart object
**
\*/
res.hover = function (fin, fout) {
covers.mouseover(fin).mouseout(fout);
return this;
};
/*\
* dotchart.click
[ method ]
> Parameters
- click handler (function) handler for the event
* Conveniece method to set up click event handler
= (object) @dotchart object
**
\*/
res.click = function (f) {
covers.click(f);
return this;
};
/*\
* dotchart.each
[ method ]
> Parameters
- callback (function) called for every item in @dotchart.covers.
- this (object) callback is executed in a context of a cover element object
* Conveniece method iterating on every symbol in the chart
= (object) @dotchart object
**
\*/
res.each = function (f) {
if (!paper.raphael.is(f, "function")) {
return this;
}
for (var i = covers.length; i--;) {
f.call(covers[i]);
}
return this;
};
/*\
* dotchart.href
[ method ]
> Parameters
- map (array) Array of objects `{x: 1, y: 20, value: 15, href: "http://www.raphaeljs.com"}`
* Iterates on all @dotchart.covers elements. If x, y and value on the object are the same as on the cover it sets up a link on a symbol using the passef `href`.
= (object) @dotchart object
**
\*/
res.href = function (map) {
var cover;
for (var i = covers.length; i--;) {
cover = covers[i];
if (cover.X == map.x && cover.Y == map.y && cover.value == map.value) {
cover.attr({href: map.href});
}
}
};
return res;
};
//inheritance
var F = function() {};
F.prototype = Raphael.g
Dotchart.prototype = new F;
/*
* dotchart method on paper
*/
/*\
* Paper.dotchart
[ method ]
**
* Plots a dot chart
**
> Parameters
- x (number) x coordinate of the chart
- y (number) y coordinate of the chart
- width (number) width of the chart (respected by all elements in the set)
- height (number) height of the chart (respected by all elements in the set)
- valuesx (array) values used to plot x asis
- valuesy (array) values used to plot y asis
- size (array) values used as data
- opts (object) options for the chart
> Possible options
o {
o max (number) maximum diameter of a dot [default: 100]
o symbol (string) symbol used for rendering on the chart. The only possible option is `'circle'` [default]
o gutter (number) distance between symbols on the chart [default: 10]
o heat (boolean) whether or not to enable coloring higher value symbols with warmer hue [default: false]
o opacity (number) opacity of the symbols [default: 1]
o href (array) array of URLs to set up click-throughs on the symbols
o axis (string) Which axes should be renedered. String of four values evaluated in order `'top right bottom left'` e.g. `'0 0 1 1'`.
o axisxstep (number) the number of steps to plot on the axis X
o axisystep (number) the number of steps to plot on the axis Y
o axisxlabels (array) labels to be rendered instead of numeric values on axis X
o axisylabels (array) labels to be rendered instead of numeric values on axis Y
o axisxtype (string) Possible values: `'t'` [default], `'|'`, `' '`, `'-'`, `'+'`
o axisytype (string) Possible values: `'t'` [default], `'|'`, `' '`, `'-'`, `'+'`
o }
**
= (object) @dotchart object
> Usage
| //life, expectancy, country and spending per capita (fictional data)
| r.dotchart(0, 0, 620, 260, [76, 70, 67, 71, 69], [0, 1, 2, 3, 4], [100, 120, 140, 160, 500], {max: 10, axisylabels: ['Mexico', 'Argentina', 'Cuba', 'Canada', 'United States of America'], heat: true, axis: '0 0 1 1'})
\*/
Raphael.fn.dotchart = function(x, y, width, height, valuesx, valuesy, size, opts) {
return new Dotchart(this, x, y, width, height, valuesx, valuesy, size, opts);
}
})();
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>g.dot.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
(function () {
function shrink(values, dim) {
var k = values.length / dim,
j = 0,
l = k,
sum = 0,
res = [];
while (j < values.length) {
l--;
if (l < 0) {
sum += values[j] * (1 + l);
res.push(sum / k);
sum = values[j++] * -l;
l += k;
} else {
sum += values[j++] * 1;
}
}
return res;
}
function getAnchors(p1x, p1y, p2x, p2y, p3x, p3y) {
var l1 = (p2x - p1x) / 2,
l2 = (p3x - p2x) / 2,
a = Math.atan((p2x - p1x) / Math.abs(p2y - p1y)),
b = Math.atan((p3x - p2x) / Math.abs(p2y - p3y));
a = p1y < p2y ? Math.PI - a : a;
b = p3y < p2y ? Math.PI - b : b;
var alpha = Math.PI / 2 - ((a + b) % (Math.PI * 2)) / 2,
dx1 = l1 * Math.sin(alpha + a),
dy1 = l1 * Math.cos(alpha + a),
dx2 = l2 * Math.sin(alpha + b),
dy2 = l2 * Math.cos(alpha + b);
return {
x1: p2x - dx1,
y1: p2y + dy1,
x2: p2x + dx2,
y2: p2y + dy2
};
}
function Linechart(paper, x, y, width, height, valuesx, valuesy, opts) {
var chartinst = this;
opts = opts || {};
if (!paper.raphael.is(valuesx[0], "array")) {
valuesx = [valuesx];
}
if (!paper.raphael.is(valuesy[0], "array")) {
valuesy = [valuesy];
}
var gutter = opts.gutter || 10,
len = Math.max(valuesx[0].length, valuesy[0].length),
symbol = opts.symbol || "",
colors = opts.colors || chartinst.colors,
columns = null,
dots = null,
chart = paper.set(),
path = [];
for (var i = 0, ii = valuesy.length; i < ii; i++) {
len = Math.max(len, valuesy[i].length);
}
/*\
* linechart.shades
[ object ]
**
* Set containing Elements corresponding to shades plotted in the chart (if `opts.shade` was `true`).
**
**
\*/
var shades = paper.set();
for (i = 0, ii = valuesy.length; i < ii; i++) {
if (opts.shade) {
shades.push(paper.path().attr({ stroke: "none", fill: colors[i], opacity: opts.nostroke ? 1 : .3 }));
}
if (valuesy[i].length > width - 2 * gutter) {
valuesy[i] = shrink(valuesy[i], width - 2 * gutter);
len = width - 2 * gutter;
}
if (valuesx[i] && valuesx[i].length > width - 2 * gutter) {
valuesx[i] = shrink(valuesx[i], width - 2 * gutter);
}
}
var allx = Array.prototype.concat.apply([], valuesx),
ally = Array.prototype.concat.apply([], valuesy),
xdim = chartinst.snapEnds(Math.min.apply(Math, allx), Math.max.apply(Math, allx), valuesx[0].length - 1),
minx = xdim.from,
maxx = xdim.to,
ydim = chartinst.snapEnds(Math.min.apply(Math, ally), Math.max.apply(Math, ally), valuesy[0].length - 1),
miny = ydim.from,
maxy = ydim.to,
kx = (width - gutter * 2) / ((maxx - minx) || 1),
ky = (height - gutter * 2) / ((maxy - miny) || 1);
/*\
* linechart.axis
[ object ]
**
* Set containing Elements of the chart axis. The set is populated if `'axis'` definition string was passed to @Paper.linechart
**
**
\*/
var axis = paper.set();
if (opts.axis) {
var ax = (opts.axis + "").split(/[,\s]+/);
+ax[0] && axis.push(chartinst.axis(x + gutter, y + gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 2, paper));
+ax[1] && axis.push(chartinst.axis(x + width - gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 3, paper));
+ax[2] && axis.push(chartinst.axis(x + gutter, y + height - gutter, width - 2 * gutter, minx, maxx, opts.axisxstep || Math.floor((width - 2 * gutter) / 20), 0, paper));
+ax[3] && axis.push(chartinst.axis(x + gutter, y + height - gutter, height - 2 * gutter, miny, maxy, opts.axisystep || Math.floor((height - 2 * gutter) / 20), 1, paper));
}
/*\
* linechart.lines
[ object ]
**
* Set containing Elements corresponding to lines plotted in the chart.
**
**
\*/
var lines = paper.set(),
/*\
* linechart.symbols
[ object ]
**
* Set containing Elements corresponding to symbols plotted in the chart.
**
**
\*/
symbols = paper.set(),
line;
for (i = 0, ii = valuesy.length; i < ii; i++) {
if (!opts.nostroke) {
lines.push(line = paper.path().attr({
stroke: colors[i],
"stroke-width": opts.width || 2,
"stroke-linejoin": "round",
"stroke-linecap": "round",
"stroke-dasharray": opts.dash || ""
}));
}
var sym = Raphael.is(symbol, "array") ? symbol[i] : symbol,
symset = paper.set();
path = [];
for (var j = 0, jj = valuesy[i].length; j < jj; j++) {
var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx,
Y = y + height - gutter - (valuesy[i][j] - miny) * ky;
(Raphael.is(sym, "array") ? sym[j] : sym) && symset.push(paper[Raphael.is(sym, "array") ? sym[j] : sym](X, Y, (opts.width || 2) * 3).attr({ fill: colors[i], stroke: "none" }));
if (opts.smooth) {
if (j && j != jj - 1) {
var X0 = x + gutter + ((valuesx[i] || valuesx[0])[j - 1] - minx) * kx,
Y0 = y + height - gutter - (valuesy[i][j - 1] - miny) * ky,
X2 = x + gutter + ((valuesx[i] || valuesx[0])[j + 1] - minx) * kx,
Y2 = y + height - gutter - (valuesy[i][j + 1] - miny) * ky,
a = getAnchors(X0, Y0, X, Y, X2, Y2);
path = path.concat([a.x1, a.y1, X, Y, a.x2, a.y2]);
}
if (!j) {
path = ["M", X, Y, "C", X, Y];
}
} else {
path = path.concat([j ? "L" : "M", X, Y]);
}
}
if (opts.smooth) {
path = path.concat([X, Y, X, Y]);
}
symbols.push(symset);
if (opts.shade) {
shades[i].attr({ path: path.concat(["L", X, y + height - gutter, "L", x + gutter + ((valuesx[i] || valuesx[0])[0] - minx) * kx, y + height - gutter, "z"]).join(",") });
}
!opts.nostroke && line.attr({ path: path.join(",") });
}
function createColumns(f) {
// unite Xs together
var Xs = [];
for (var i = 0, ii = valuesx.length; i < ii; i++) {
Xs = Xs.concat(valuesx[i]);
}
Xs.sort(function(a,b) { return a - b; });
// remove duplicates
var Xs2 = [],
xs = [];
for (i = 0, ii = Xs.length; i < ii; i++) {
Xs[i] != Xs[i - 1] && Xs2.push(Xs[i]) && xs.push(x + gutter + (Xs[i] - minx) * kx);
}
Xs = Xs2;
ii = Xs.length;
var cvrs = f || paper.set();
for (i = 0; i < ii; i++) {
var X = xs[i] - (xs[i] - (xs[i - 1] || x)) / 2,
w = ((xs[i + 1] || x + width) - xs[i]) / 2 + (xs[i] - (xs[i - 1] || x)) / 2,
C;
f ? (C = {}) : cvrs.push(C = paper.rect(X - 1, y, Math.max(w + 1, 1), height).attr({ stroke: "none", fill: "#000", opacity: 0 }));
C.values = [];
C.symbols = paper.set();
C.y = [];
C.x = xs[i];
C.axis = Xs[i];
for (var j = 0, jj = valuesy.length; j < jj; j++) {
Xs2 = valuesx[j] || valuesx[0];
for (var k = 0, kk = Xs2.length; k < kk; k++) {
if (Xs2[k] == Xs[i]) {
C.values.push(valuesy[j][k]);
C.y.push(y + height - gutter - (valuesy[j][k] - miny) * ky);
C.symbols.push(chart.symbols[j][k]);
}
}
}
f && f.call(C);
}
!f && (columns = cvrs);
}
function createDots(f) {
var cvrs = f || paper.set(),
C;
for (var i = 0, ii = valuesy.length; i < ii; i++) {
for (var j = 0, jj = valuesy[i].length; j < jj; j++) {
var X = x + gutter + ((valuesx[i] || valuesx[0])[j] - minx) * kx,
nearX = x + gutter + ((valuesx[i] || valuesx[0])[j ? j - 1 : 1] - minx) * kx,
Y = y + height - gutter - (valuesy[i][j] - miny) * ky;
f ? (C = {}) : cvrs.push(C = paper.circle(X, Y, Math.abs(nearX - X) / 2).attr({ stroke: "#000", fill: "#000", opacity: 1 }));
C.x = X;
C.y = Y;
C.value = valuesy[i][j];
C.line = chart.lines[i];
C.shade = chart.shades[i];
C.symbol = chart.symbols[i][j];
C.symbols = chart.symbols[i];
C.axis = (valuesx[i] || valuesx[0])[j];
f && f.call(C);
}
}
!f && (dots = cvrs);
}
chart.push(lines, shades, symbols, axis, columns, dots);
chart.lines = lines;
chart.shades = shades;
chart.symbols = symbols;
chart.axis = axis;
/*\
* linechart.hoverColumn
[ method ]
> Parameters
- mouseover handler (function) handler for the event
- mouseout handler (function) handler for the event
- this (object) callback is executed in a context of a cover element
* Conveniece method to set up hover-in and hover-out event handlers on the entire area of the chart.
* The handlers are passed a event object containing
o {
o x (number) x coordinate on all lines in the chart
o y (array) y coordinates of all lines corresponding to the x
o }
= (object) @linechart object
**
\*/
chart.hoverColumn = function (fin, fout) {
!columns && createColumns();
columns.mouseover(fin).mouseout(fout);
return this;
};
/*\
* linechart.clickColumn
[ method ]
> Parameters
- click handler (function) handler for the event
- this (object) callback is executed in a context of a cover element
* Conveniece method to set up click event handler on the antire area of the chart.
* The handler is passed a event object containing
o {
o x (number) x coordinate on all lines in the chart
o y (array) y coordinates of all lines corresponding to the x
o }
= (object) @linechart object
**
\*/
chart.clickColumn = function (f) {
!columns && createColumns();
columns.click(f);
return this;
};
/*\
* linechart.hrefColumn
[ method ]
> Parameters
- cols (object) object containing values as keys and URLs as values, e.g. {1: 'http://www.raphaeljs.com', 2: 'http://g.raphaeljs.com'}
* Creates click-throughs on the whole area of the chart corresponding to x values
= (object) @linechart object
**
\*/
chart.hrefColumn = function (cols) {
var hrefs = paper.raphael.is(arguments[0], "array") ? arguments[0] : arguments;
if (!(arguments.length - 1) && typeof cols == "object") {
for (var x in cols) {
for (var i = 0, ii = columns.length; i < ii; i++) if (columns[i].axis == x) {
columns[i].attr("href", cols[x]);
}
}
}
!columns && createColumns();
for (i = 0, ii = hrefs.length; i < ii; i++) {
columns[i] && columns[i].attr("href", hrefs[i]);
}
return this;
};
/*\
* linechart.hover
[ method ]
> Parameters
- mouseover handler (function) handler for the event
- mouseout handler (function) handler for the event
* Conveniece method to set up hover-in and hover-out event handlers working on the lines of the chart.
* Use @linechart.hoverColumn to work with the entire chart area.
= (object) @linechart object
**
\*/
chart.hover = function (fin, fout) {
!dots && createDots();
dots.mouseover(fin).mouseout(fout);
return this;
};
/*\
* linechart.click
[ method ]
> Parameters
- click handler (function) handler for the event
- this (object) callback is executed in a context of a cover element
* Conveniece method to set up click event handler on the lines of the chart
* Use @linechart.clickColumn to work with the entire chart area.
= (object) @linechart object
**
\*/
chart.click = function (f) {
!dots && createDots();
dots.click(f);
return this;
};
/*\
* linechart.each
[ method ]
> Parameters
- callback (function) function executed for every data point
- this (object) context of the callback function.
o {
o x (number) x coordinate of the data point
o y (number) y coordinate of the data point
o value (number) value represented by the data point
o }
* Iterates over each unique data point plotted on every line on the chart.
= (object) @linechart object
**
\*/
chart.each = function (f) {
createDots(f);
return this;
};
/*\
* linechart.eachColumn
[ method ]
> Parameters
- callback (function) function executed for every column
- this (object) context of the callback function.
o {
o x (number) x coordinate of the data point
o y (array) y coordinates of data points existing for the given x
o values (array) values represented by the data points existing for the given x
o }
* Iterates over each column area (area plotted above the chart).
= (object) @linechart object
**
\*/
chart.eachColumn = function (f) {
createColumns(f);
return this;
};
return chart;
};
//inheritance
var F = function() {};
F.prototype = Raphael.g;
Linechart.prototype = new F;
/*
* linechart method on paper
*/
/*\
* Paper.linechart
[ method ]
**
* Creates a line chart
**
> Parameters
**
- x (number) x coordinate of the chart
- y (number) y coordinate of the chart
- width (number) width of the chart (including the axis)
- height (number) height of the chart (including the axis)
- valuesx (array) values to plot on axis x
- valuesy (array) values to plot on axis y
- opts (object) options for the chart
o {
o gutter (number) distance between symbols on the chart
o symbol (string) (array) symbol to be plotted as nodes of the chart, if array are passed symbols are printed iteratively. Currently `'circle'` and `''` (no symbol) are the only supported options.
o width (number) controls the size of the plotted symbol. Also controls the thickness of the line using a formula stroke-width=width/2. This option is likely to change in the future versions of g.raphael.
o colors (array) colors to plot data series. Raphael default colors are used if not passed
o shade (boolean) whether or not to plot a shade of the chart [default: false]. Currently only a shade between the line and x axis is supported.
o nostroke (boolean) whether or not to plot lines [default: false]. Only practical when shade is enabled.
o dash (string) changes display of the line from continues to dashed or dotted (Possible values are the same as stroke-dasharray attribute, see @Element.attr).
o smooth (boolean) changes display of the line from point-to-point straight lines to curves (type C, see @Paper.path).
o axis (string) Which axes should be renedered. String of four values evaluated in order `'top right bottom left'` e.g. `'0 0 1 1'`.
o axisxstep (number) distance between values on axis X
o axisystep (number) distance between values on axis Y
o }
**
= (object) path element of the popup
> Usage
| r.linechart(0, 0, 99, 99, [1,2,3,4,5], [[1,2,3,4,5], [1,3,9,16,25], [100,50,25,12,6]], {smooth: true, colors: ['#F00', '#0F0', '#FF0'], symbol: 'circle'});
\*/
Raphael.fn.linechart = function(x, y, width, height, valuesx, valuesy, opts) {
return new Linechart(this, x, y, width, height, valuesx, valuesy, opts);
}
})();
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>g.line.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
/*
* piechart method on paper
*/
/*\
* Paper.piechart
[ method ]
**
* Creates a pie chart
**
> Parameters
**
- cx (number) x coordinate of the chart
- cy (number) y coordinate of the chart
- r (integer) radius of the chart
- values (array) values used to plot
- opts (object) options for the chart
o {
o minPercent (number) minimal percent threshold which will have a slice rendered. Sliced corresponding to data points below this threshold will be collapsed into 1 additional slice. [default `1`]
o maxSlices (number) a threshold for how many slices should be rendered before collapsing all remaining slices into 1 additional slice (to focus on most important data points). [default `100`]
o stroke (string) color of the circle stroke in HTML color format [default `"#FFF"`]
o strokewidth (integer) width of the chart stroke [default `1`]
o init (boolean) whether or not to show animation when the chart is ready [default `false`]
o colors (array) colors be used to plot the chart
o href (array) urls to to set up clicks on chart slices
o legend (array) array containing strings that will be used in a legend. Other label options work if legend is defined.
o legendcolor (string) color of text in legend [default `"#000"`]
o legendothers (string) text that will be used in legend to describe options that are collapsed into 1 slice, because they are too small to render [default `"Others"`]
o legendmark (string) symbol used as a bullet point in legend that has the same colour as the chart slice [default `"circle"`]
o legendpos (string) position of the legend on the chart [default `"east"`]. Other options are `"north"`, `"south"`, `"west"`
o }
**
= (object) path element of the popup
> Usage
| r.piechart(cx, cy, r, values, opts)
\*/
(function () {
function Piechart(paper, cx, cy, r, values, opts) {
opts = opts || {};
var chartinst = this,
sectors = [],
covers = paper.set(),
chart = paper.set(),
series = paper.set(),
order = [],
len = values.length,
angle = 0,
total = 0,
others = 0,
cut = opts.maxSlices || 100,
minPercent = parseFloat(opts.minPercent) || 1,
defcut = Boolean( minPercent );
function sector(cx, cy, r, startAngle, endAngle, fill) {
var rad = Math.PI / 180,
x1 = cx + r * Math.cos(-startAngle * rad),
x2 = cx + r * Math.cos(-endAngle * rad),
xm = cx + r / 2 * Math.cos(-(startAngle + (endAngle - startAngle) / 2) * rad),
y1 = cy + r * Math.sin(-startAngle * rad),
y2 = cy + r * Math.sin(-endAngle * rad),
ym = cy + r / 2 * Math.sin(-(startAngle + (endAngle - startAngle) / 2) * rad),
res = [
"M", cx, cy,
"L", x1, y1,
"A", r, r, 0, +(Math.abs(endAngle - startAngle) > 180), 1, x2, y2,
"z"
];
res.middle = { x: xm, y: ym };
return res;
}
chart.covers = covers;
if (len == 1) {
series.push(paper.circle(cx, cy, r).attr({ fill: opts.colors && opts.colors[0] || chartinst.colors[0], stroke: opts.stroke || "#fff", "stroke-width": opts.strokewidth == null ? 1 : opts.strokewidth }));
covers.push(paper.circle(cx, cy, r).attr(chartinst.shim));
total = values[0];
values[0] = { value: values[0], order: 0, valueOf: function () { return this.value; } };
opts.href && opts.href[0] && covers[0].attr({ href: opts.href[0] });
series[0].middle = {x: cx, y: cy};
series[0].mangle = 180;
} else {
for (var i = 0; i < len; i++) {
total += values[i];
values[i] = { value: values[i], order: i, valueOf: function () { return this.value; } };
}
//values are sorted numerically
values.sort(function (a, b) {
return b.value - a.value;
});
for (i = 0; i < len; i++) {
if (defcut && values[i] * 100 / total < minPercent) {
cut = i;
defcut = false;
}
if (i > cut) {
defcut = false;
values[cut].value += values[i];
values[cut].others = true;
others = values[cut].value;
}
}
len = Math.min(cut + 1, values.length);
others && values.splice(len) && (values[cut].others = true);
for (i = 0; i < len; i++) {
var mangle = angle - 360 * values[i] / total / 2;
if (!i) {
angle = 90 - mangle;
mangle = angle - 360 * values[i] / total / 2;
}
if (opts.init) {
var ipath = sector(cx, cy, 1, angle, angle - 360 * values[i] / total).join(",");
}
var path = sector(cx, cy, r, angle, angle -= 360 * values[i] / total);
var j = (opts.matchColors && opts.matchColors == true) ? values[i].order : i;
var p = paper.path(opts.init ? ipath : path).attr({ fill: opts.colors && opts.colors[j] || chartinst.colors[j] || "#666", stroke: opts.stroke || "#fff", "stroke-width": (opts.strokewidth == null ? 1 : opts.strokewidth), "stroke-linejoin": "round" });
p.value = values[i];
p.middle = path.middle;
p.mangle = mangle;
sectors.push(p);
series.push(p);
opts.init && p.animate({ path: path.join(",") }, (+opts.init - 1) || 1000, ">");
}
for (i = 0; i < len; i++) {
p = paper.path(sectors[i].attr("path")).attr(chartinst.shim);
opts.href && opts.href[i] && p.attr({ href: opts.href[i] });
p.attr = function () {};
covers.push(p);
series.push(p);
}
}
chart.hover = function (fin, fout) {
fout = fout || function () {};
var that = this;
for (var i = 0; i < len; i++) {
(function (sector, cover, j) {
var o = {
sector: sector,
cover: cover,
cx: cx,
cy: cy,
mx: sector.middle.x,
my: sector.middle.y,
mangle: sector.mangle,
r: r,
value: values[j],
total: total,
label: that.labels && that.labels[j]
};
cover.mouseover(function () {
fin.call(o);
}).mouseout(function () {
fout.call(o);
});
})(series[i], covers[i], i);
}
return this;
};
// x: where label could be put
// y: where label could be put
// value: value to show
// total: total number to count %
chart.each = function (f) {
var that = this;
for (var i = 0; i < len; i++) {
(function (sector, cover, j) {
var o = {
sector: sector,
cover: cover,
cx: cx,
cy: cy,
x: sector.middle.x,
y: sector.middle.y,
mangle: sector.mangle,
r: r,
value: values[j],
total: total,
label: that.labels && that.labels[j]
};
f.call(o);
})(series[i], covers[i], i);
}
return this;
};
chart.click = function (f) {
var that = this;
for (var i = 0; i < len; i++) {
(function (sector, cover, j) {
var o = {
sector: sector,
cover: cover,
cx: cx,
cy: cy,
mx: sector.middle.x,
my: sector.middle.y,
mangle: sector.mangle,
r: r,
value: values[j],
total: total,
label: that.labels && that.labels[j]
};
cover.click(function () { f.call(o); });
})(series[i], covers[i], i);
}
return this;
};
chart.inject = function (element) {
element.insertBefore(covers[0]);
};
var legend = function (labels, otherslabel, mark, dir) {
var x = cx + r + r / 5,
y = cy,
h = y + 10;
labels = labels || [];
dir = (dir && dir.toLowerCase && dir.toLowerCase()) || "east";
mark = paper[mark && mark.toLowerCase()] || "circle";
chart.labels = paper.set();
for (var i = 0; i < len; i++) {
var clr = series[i].attr("fill"),
j = values[i].order,
txt;
values[i].others && (labels[j] = otherslabel || "Others");
labels[j] = chartinst.labelise(labels[j], values[i], total);
chart.labels.push(paper.set());
chart.labels[i].push(paper[mark](x + 5, h, 5).attr({ fill: clr, stroke: "none" }));
chart.labels[i].push(txt = paper.text(x + 20, h, labels[j] || values[j]).attr(chartinst.txtattr).attr({ fill: opts.legendcolor || "#000", "text-anchor": "start"}));
covers[i].label = chart.labels[i];
h += txt.getBBox().height * 1.2;
}
var bb = chart.labels.getBBox(),
tr = {
east: [0, -bb.height / 2],
west: [-bb.width - 2 * r - 20, -bb.height / 2],
north: [-r - bb.width / 2, -r - bb.height - 10],
south: [-r - bb.width / 2, r + 10]
}[dir];
chart.labels.translate.apply(chart.labels, tr);
chart.push(chart.labels);
};
if (opts.legend) {
legend(opts.legend, opts.legendothers, opts.legendmark, opts.legendpos);
}
chart.push(series, covers);
chart.series = series;
chart.covers = covers;
return chart;
};
//inheritance
var F = function() {};
F.prototype = Raphael.g;
Piechart.prototype = new F;
//public
Raphael.fn.piechart = function(cx, cy, r, values, opts) {
return new Piechart(this, cx, cy, r, values, opts);
}
})();
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>g.pie.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* g.Raphael 0.51 - Charting library, based on Raphaël
*
* Copyright (c) 2009-2012 Dmitry Baranovskiy (http://g.raphaeljs.com)
* Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) license.
*/
/*
* Tooltips on Element prototype
*/
/*\
* Element.popup
[ method ]
**
* Puts the context Element in a 'popup' tooltip. Can also be used on sets.
**
> Parameters
**
- dir (string) location of Element relative to the tail: `'down'`, `'left'`, `'up'` [default], or `'right'`.
- size (number) amount of bevel/padding around the Element, as well as half the width and height of the tail [default: `5`]
- x (number) x coordinate of the popup's tail [default: Element's `x` or `cx`]
- y (number) y coordinate of the popup's tail [default: Element's `y` or `cy`]
**
= (object) path element of the popup
\*/
Raphael.el.popup = function (dir, size, x, y) {
var paper = this.paper || this[0].paper,
bb, xy, center, cw, ch;
if (!paper) return;
switch (this.type) {
case 'text':
case 'circle':
case 'ellipse': center = true; break;
default: center = false;
}
dir = dir == null ? 'up' : dir;
size = size || 5;
bb = this.getBBox();
x = typeof x == 'number' ? x : (center ? bb.x + bb.width / 2 : bb.x);
y = typeof y == 'number' ? y : (center ? bb.y + bb.height / 2 : bb.y);
cw = Math.max(bb.width / 2 - size, 0);
ch = Math.max(bb.height / 2 - size, 0);
this.translate(x - bb.x - (center ? bb.width / 2 : 0), y - bb.y - (center ? bb.height / 2 : 0));
bb = this.getBBox();
var paths = {
up: [
'M', x, y,
'l', -size, -size, -cw, 0,
'a', size, size, 0, 0, 1, -size, -size,
'l', 0, -bb.height,
'a', size, size, 0, 0, 1, size, -size,
'l', size * 2 + cw * 2, 0,
'a', size, size, 0, 0, 1, size, size,
'l', 0, bb.height,
'a', size, size, 0, 0, 1, -size, size,
'l', -cw, 0,
'z'
].join(','),
down: [
'M', x, y,
'l', size, size, cw, 0,
'a', size, size, 0, 0, 1, size, size,
'l', 0, bb.height,
'a', size, size, 0, 0, 1, -size, size,
'l', -(size * 2 + cw * 2), 0,
'a', size, size, 0, 0, 1, -size, -size,
'l', 0, -bb.height,
'a', size, size, 0, 0, 1, size, -size,
'l', cw, 0,
'z'
].join(','),
left: [
'M', x, y,
'l', -size, size, 0, ch,
'a', size, size, 0, 0, 1, -size, size,
'l', -bb.width, 0,
'a', size, size, 0, 0, 1, -size, -size,
'l', 0, -(size * 2 + ch * 2),
'a', size, size, 0, 0, 1, size, -size,
'l', bb.width, 0,
'a', size, size, 0, 0, 1, size, size,
'l', 0, ch,
'z'
].join(','),
right: [
'M', x, y,
'l', size, -size, 0, -ch,
'a', size, size, 0, 0, 1, size, -size,
'l', bb.width, 0,
'a', size, size, 0, 0, 1, size, size,
'l', 0, size * 2 + ch * 2,
'a', size, size, 0, 0, 1, -size, size,
'l', -bb.width, 0,
'a', size, size, 0, 0, 1, -size, -size,
'l', 0, -ch,
'z'
].join(',')
};
xy = {
up: { x: -!center * (bb.width / 2), y: -size * 2 - (center ? bb.height / 2 : bb.height) },
down: { x: -!center * (bb.width / 2), y: size * 2 + (center ? bb.height / 2 : bb.height) },
left: { x: -size * 2 - (center ? bb.width / 2 : bb.width), y: -!center * (bb.height / 2) },
right: { x: size * 2 + (center ? bb.width / 2 : bb.width), y: -!center * (bb.height / 2) }
}[dir];
this.translate(xy.x, xy.y);
return paper.path(paths[dir]).attr({ fill: "#000", stroke: "none" }).insertBefore(this.node ? this : this[0]);
};
/*\
* Element.tag
[ method ]
**
* Puts the context Element in a 'tag' tooltip. Can also be used on sets.
**
> Parameters
**
- angle (number) angle of orientation in degrees [default: `0`]
- r (number) radius of the loop [default: `5`]
- x (number) x coordinate of the center of the tag loop [default: Element's `x` or `cx`]
- y (number) y coordinate of the center of the tag loop [default: Element's `x` or `cx`]
**
= (object) path element of the tag
\*/
Raphael.el.tag = function (angle, r, x, y) {
var d = 3,
paper = this.paper || this[0].paper;
if (!paper) return;
var p = paper.path().attr({ fill: '#000', stroke: '#000' }),
bb = this.getBBox(),
dx, R, center, tmp;
switch (this.type) {
case 'text':
case 'circle':
case 'ellipse': center = true; break;
default: center = false;
}
angle = angle || 0;
x = typeof x == 'number' ? x : (center ? bb.x + bb.width / 2 : bb.x);
y = typeof y == 'number' ? y : (center ? bb.y + bb.height / 2 : bb.y);
r = r == null ? 5 : r;
R = .5522 * r;
if (bb.height >= r * 2) {
p.attr({
path: [
"M", x, y + r,
"a", r, r, 0, 1, 1, 0, -r * 2, r, r, 0, 1, 1, 0, r * 2,
"m", 0, -r * 2 -d,
"a", r + d, r + d, 0, 1, 0, 0, (r + d) * 2,
"L", x + r + d, y + bb.height / 2 + d,
"l", bb.width + 2 * d, 0, 0, -bb.height - 2 * d, -bb.width - 2 * d, 0,
"L", x, y - r - d
].join(",")
});
} else {
dx = Math.sqrt(Math.pow(r + d, 2) - Math.pow(bb.height / 2 + d, 2));
p.attr({
path: [
"M", x, y + r,
"c", -R, 0, -r, R - r, -r, -r, 0, -R, r - R, -r, r, -r, R, 0, r, r - R, r, r, 0, R, R - r, r, -r, r,
"M", x + dx, y - bb.height / 2 - d,
"a", r + d, r + d, 0, 1, 0, 0, bb.height + 2 * d,
"l", r + d - dx + bb.width + 2 * d, 0, 0, -bb.height - 2 * d,
"L", x + dx, y - bb.height / 2 - d
].join(",")
});
}
angle = 360 - angle;
p.rotate(angle, x, y);
if (this.attrs) {
//elements
this.attr(this.attrs.x ? 'x' : 'cx', x + r + d + (!center ? this.type == 'text' ? bb.width : 0 : bb.width / 2)).attr('y', center ? y : y - bb.height / 2);
this.rotate(angle, x, y);
angle > 90 && angle < 270 && this.attr(this.attrs.x ? 'x' : 'cx', x - r - d - (!center ? bb.width : bb.width / 2)).rotate(180, x, y);
} else {
//sets
if (angle > 90 && angle < 270) {
this.translate(x - bb.x - bb.width - r - d, y - bb.y - bb.height / 2);
this.rotate(angle - 180, bb.x + bb.width + r + d, bb.y + bb.height / 2);
} else {
this.translate(x - bb.x + r + d, y - bb.y - bb.height / 2);
this.rotate(angle, bb.x - r - d, bb.y + bb.height / 2);
}
}
return p.insertBefore(this.node ? this : this[0]);
};
/*\
* Element.drop
[ method ]
**
* Puts the context Element in a 'drop' tooltip. Can also be used on sets.
**
> Parameters
**
- angle (number) angle of orientation in degrees [default: `0`]
- x (number) x coordinate of the drop's point [default: Element's `x` or `cx`]
- y (number) y coordinate of the drop's point [default: Element's `x` or `cx`]
**
= (object) path element of the drop
\*/
Raphael.el.drop = function (angle, x, y) {
var bb = this.getBBox(),
paper = this.paper || this[0].paper,
center, size, p, dx, dy;
if (!paper) return;
switch (this.type) {
case 'text':
case 'circle':
case 'ellipse': center = true; break;
default: center = false;
}
angle = angle || 0;
x = typeof x == 'number' ? x : (center ? bb.x + bb.width / 2 : bb.x);
y = typeof y == 'number' ? y : (center ? bb.y + bb.height / 2 : bb.y);
size = Math.max(bb.width, bb.height) + Math.min(bb.width, bb.height);
p = paper.path([
"M", x, y,
"l", size, 0,
"A", size * .4, size * .4, 0, 1, 0, x + size * .7, y - size * .7,
"z"
]).attr({fill: "#000", stroke: "none"}).rotate(22.5 - angle, x, y);
angle = (angle + 90) * Math.PI / 180;
dx = (x + size * Math.sin(angle)) - (center ? 0 : bb.width / 2);
dy = (y + size * Math.cos(angle)) - (center ? 0 : bb.height / 2);
this.attrs ?
this.attr(this.attrs.x ? 'x' : 'cx', dx).attr(this.attrs.y ? 'y' : 'cy', dy) :
this.translate(dx - bb.x, dy - bb.y);
return p.insertBefore(this.node ? this : this[0]);
};
/*\
* Element.flag
[ method ]
**
* Puts the context Element in a 'flag' tooltip. Can also be used on sets.
**
> Parameters
**
- angle (number) angle of orientation in degrees [default: `0`]
- x (number) x coordinate of the flag's point [default: Element's `x` or `cx`]
- y (number) y coordinate of the flag's point [default: Element's `x` or `cx`]
**
= (object) path element of the flag
\*/
Raphael.el.flag = function (angle, x, y) {
var d = 3,
paper = this.paper || this[0].paper;
if (!paper) return;
var p = paper.path().attr({ fill: '#000', stroke: '#000' }),
bb = this.getBBox(),
h = bb.height / 2,
center;
switch (this.type) {
case 'text':
case 'circle':
case 'ellipse': center = true; break;
default: center = false;
}
angle = angle || 0;
x = typeof x == 'number' ? x : (center ? bb.x + bb.width / 2 : bb.x);
y = typeof y == 'number' ? y : (center ? bb.y + bb.height / 2: bb.y);
p.attr({
path: [
"M", x, y,
"l", h + d, -h - d, bb.width + 2 * d, 0, 0, bb.height + 2 * d, -bb.width - 2 * d, 0,
"z"
].join(",")
});
angle = 360 - angle;
p.rotate(angle, x, y);
if (this.attrs) {
//elements
this.attr(this.attrs.x ? 'x' : 'cx', x + h + d + (!center ? this.type == 'text' ? bb.width : 0 : bb.width / 2)).attr('y', center ? y : y - bb.height / 2);
this.rotate(angle, x, y);
angle > 90 && angle < 270 && this.attr(this.attrs.x ? 'x' : 'cx', x - h - d - (!center ? bb.width : bb.width / 2)).rotate(180, x, y);
} else {
//sets
if (angle > 90 && angle < 270) {
this.translate(x - bb.x - bb.width - h - d, y - bb.y - bb.height / 2);
this.rotate(angle - 180, bb.x + bb.width + h + d, bb.y + bb.height / 2);
} else {
this.translate(x - bb.x + h + d, y - bb.y - bb.height / 2);
this.rotate(angle, bb.x - h - d, bb.y + bb.height / 2);
}
}
return p.insertBefore(this.node ? this : this[0]);
};
/*\
* Element.label
[ method ]
**
* Puts the context Element in a 'label' tooltip. Can also be used on sets.
**
= (object) path element of the label.
\*/
Raphael.el.label = function () {
var bb = this.getBBox(),
paper = this.paper || this[0].paper,
r = Math.min(20, bb.width + 10, bb.height + 10) / 2;
if (!paper) return;
return paper.rect(bb.x - r / 2, bb.y - r / 2, bb.width + r, bb.height + r, r).attr({ stroke: 'none', fill: '#000' }).insertBefore(this.node ? this : this[0]);
};
/*\
* Element.blob
[ method ]
**
* Puts the context Element in a 'blob' tooltip. Can also be used on sets.
**
> Parameters
**
- angle (number) angle of orientation in degrees [default: `0`]
- x (number) x coordinate of the blob's tail [default: Element's `x` or `cx`]
- y (number) y coordinate of the blob's tail [default: Element's `x` or `cx`]
**
= (object) path element of the blob
\*/
Raphael.el.blob = function (angle, x, y) {
var bb = this.getBBox(),
rad = Math.PI / 180,
paper = this.paper || this[0].paper,
p, center, size;
if (!paper) return;
switch (this.type) {
case 'text':
case 'circle':
case 'ellipse': center = true; break;
default: center = false;
}
p = paper.path().attr({ fill: "#000", stroke: "none" });
angle = (+angle + 1 ? angle : 45) + 90;
size = Math.min(bb.height, bb.width);
x = typeof x == 'number' ? x : (center ? bb.x + bb.width / 2 : bb.x);
y = typeof y == 'number' ? y : (center ? bb.y + bb.height / 2 : bb.y);
var w = Math.max(bb.width + size, size * 25 / 12),
h = Math.max(bb.height + size, size * 25 / 12),
x2 = x + size * Math.sin((angle - 22.5) * rad),
y2 = y + size * Math.cos((angle - 22.5) * rad),
x1 = x + size * Math.sin((angle + 22.5) * rad),
y1 = y + size * Math.cos((angle + 22.5) * rad),
dx = (x1 - x2) / 2,
dy = (y1 - y2) / 2,
rx = w / 2,
ry = h / 2,
k = -Math.sqrt(Math.abs(rx * rx * ry * ry - rx * rx * dy * dy - ry * ry * dx * dx) / (rx * rx * dy * dy + ry * ry * dx * dx)),
cx = k * rx * dy / ry + (x1 + x2) / 2,
cy = k * -ry * dx / rx + (y1 + y2) / 2;
p.attr({
x: cx,
y: cy,
path: [
"M", x, y,
"L", x1, y1,
"A", rx, ry, 0, 1, 1, x2, y2,
"z"
].join(",")
});
this.translate(cx - bb.x - bb.width / 2, cy - bb.y - bb.height / 2);
return p.insertBefore(this.node ? this : this[0]);
};
/*
* Tooltips on Paper prototype
*/
/*\
* Paper.label
[ method ]
**
* Puts the given `text` into a 'label' tooltip. The text is given a default style according to @g.txtattr. See @Element.label
**
> Parameters
**
- x (number) x coordinate of the center of the label
- y (number) y coordinate of the center of the label
- text (string) text to place inside the label
**
= (object) set containing the label path and the text element
> Usage
| paper.label(50, 50, "$9.99");
\*/
Raphael.fn.label = function (x, y, text) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.label(), text);
};
/*\
* Paper.popup
[ method ]
**
* Puts the given `text` into a 'popup' tooltip. The text is given a default style according to @g.txtattr. See @Element.popup
*
* Note: The `dir` parameter has changed from g.Raphael 0.4.1 to 0.5. The options `0`, `1`, `2`, and `3` has been changed to `'down'`, `'left'`, `'up'`, and `'right'` respectively.
**
> Parameters
**
- x (number) x coordinate of the popup's tail
- y (number) y coordinate of the popup's tail
- text (string) text to place inside the popup
- dir (string) location of the text relative to the tail: `'down'`, `'left'`, `'up'` [default], or `'right'`.
- size (number) amount of padding around the Element [default: `5`]
**
= (object) set containing the popup path and the text element
> Usage
| paper.popup(50, 50, "$9.99", 'down');
\*/
Raphael.fn.popup = function (x, y, text, dir, size) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.popup(dir, size), text);
};
/*\
* Paper.tag
[ method ]
**
* Puts the given text into a 'tag' tooltip. The text is given a default style according to @g.txtattr. See @Element.tag
**
> Parameters
**
- x (number) x coordinate of the center of the tag loop
- y (number) y coordinate of the center of the tag loop
- text (string) text to place inside the tag
- angle (number) angle of orientation in degrees [default: `0`]
- r (number) radius of the loop [default: `5`]
**
= (object) set containing the tag path and the text element
> Usage
| paper.tag(50, 50, "$9.99", 60);
\*/
Raphael.fn.tag = function (x, y, text, angle, r) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.tag(angle, r), text);
};
/*\
* Paper.flag
[ method ]
**
* Puts the given `text` into a 'flag' tooltip. The text is given a default style according to @g.txtattr. See @Element.flag
**
> Parameters
**
- x (number) x coordinate of the flag's point
- y (number) y coordinate of the flag's point
- text (string) text to place inside the flag
- angle (number) angle of orientation in degrees [default: `0`]
**
= (object) set containing the flag path and the text element
> Usage
| paper.flag(50, 50, "$9.99", 60);
\*/
Raphael.fn.flag = function (x, y, text, angle) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.flag(angle), text);
};
/*\
* Paper.drop
[ method ]
**
* Puts the given text into a 'drop' tooltip. The text is given a default style according to @g.txtattr. See @Element.drop
**
> Parameters
**
- x (number) x coordinate of the drop's point
- y (number) y coordinate of the drop's point
- text (string) text to place inside the drop
- angle (number) angle of orientation in degrees [default: `0`]
**
= (object) set containing the drop path and the text element
> Usage
| paper.drop(50, 50, "$9.99", 60);
\*/
Raphael.fn.drop = function (x, y, text, angle) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.drop(angle), text);
};
/*\
* Paper.blob
[ method ]
**
* Puts the given text into a 'blob' tooltip. The text is given a default style according to @g.txtattr. See @Element.blob
**
> Parameters
**
- x (number) x coordinate of the blob's tail
- y (number) y coordinate of the blob's tail
- text (string) text to place inside the blob
- angle (number) angle of orientation in degrees [default: `0`]
**
= (object) set containing the blob path and the text element
> Usage
| paper.blob(50, 50, "$9.99", 60);
\*/
Raphael.fn.blob = function (x, y, text, angle) {
var set = this.set();
text = this.text(x, y, text).attr(Raphael.g.txtattr);
return set.push(text.blob(angle), text);
};
/**
* Brightness functions on the Element prototype
*/
/*\
* Element.lighter
[ method ]
**
* Makes the context element lighter by increasing the brightness and reducing the saturation by a given factor. Can be called on Sets.
**
> Parameters
**
- times (number) adjustment factor [default: `2`]
**
= (object) Element
> Usage
| paper.circle(50, 50, 20).attr({
| fill: "#ff0000",
| stroke: "#fff",
| "stroke-width": 2
| }).lighter(6);
\*/
Raphael.el.lighter = function (times) {
times = times || 2;
var fs = [this.attrs.fill, this.attrs.stroke];
this.fs = this.fs || [fs[0], fs[1]];
fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex);
fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex);
fs[0].b = Math.min(fs[0].b * times, 1);
fs[0].s = fs[0].s / times;
fs[1].b = Math.min(fs[1].b * times, 1);
fs[1].s = fs[1].s / times;
this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"});
return this;
};
/*\
* Element.darker
[ method ]
**
* Makes the context element darker by decreasing the brightness and increasing the saturation by a given factor. Can be called on Sets.
**
> Parameters
**
- times (number) adjustment factor [default: `2`]
**
= (object) Element
> Usage
| paper.circle(50, 50, 20).attr({
| fill: "#ff0000",
| stroke: "#fff",
| "stroke-width": 2
| }).darker(6);
\*/
Raphael.el.darker = function (times) {
times = times || 2;
var fs = [this.attrs.fill, this.attrs.stroke];
this.fs = this.fs || [fs[0], fs[1]];
fs[0] = Raphael.rgb2hsb(Raphael.getRGB(fs[0]).hex);
fs[1] = Raphael.rgb2hsb(Raphael.getRGB(fs[1]).hex);
fs[0].s = Math.min(fs[0].s * times, 1);
fs[0].b = fs[0].b / times;
fs[1].s = Math.min(fs[1].s * times, 1);
fs[1].b = fs[1].b / times;
this.attr({fill: "hsb(" + [fs[0].h, fs[0].s, fs[0].b] + ")", stroke: "hsb(" + [fs[1].h, fs[1].s, fs[1].b] + ")"});
return this;
};
/*\
* Element.resetBrightness
[ method ]
**
* Resets brightness and saturation levels to their original values. See @Element.lighter and @Element.darker. Can be called on Sets.
**
= (object) Element
> Usage
| paper.circle(50, 50, 20).attr({
| fill: "#ff0000",
| stroke: "#fff",
| "stroke-width": 2
| }).lighter(6).resetBrightness();
\*/
Raphael.el.resetBrightness = function () {
if (this.fs) {
this.attr({ fill: this.fs[0], stroke: this.fs[1] });
delete this.fs;
}
return this;
};
//alias to set prototype
(function () {
var brightness = ['lighter', 'darker', 'resetBrightness'],
tooltips = ['popup', 'tag', 'flag', 'label', 'drop', 'blob'];
for (var f in tooltips) (function (name) {
Raphael.st[name] = function () {
return Raphael.el[name].apply(this, arguments);
};
})(tooltips[f]);
for (var f in brightness) (function (name) {
Raphael.st[name] = function () {
for (var i = 0; i < this.length; i++) {
this[i][name].apply(this[i], arguments);
}
return this;
};
})(brightness[f]);
})();
//chart prototype for storing common functions
Raphael.g = {
/*\
* g.shim
[ object ]
**
* An attribute object that charts will set on all generated shims (shims being the invisible objects that mouse events are bound to)
**
> Default value
| { stroke: 'none', fill: '#000', 'fill-opacity': 0 }
\*/
shim: { stroke: 'none', fill: '#000', 'fill-opacity': 0 },
/*\
* g.txtattr
[ object ]
**
* An attribute object that charts and tooltips will set on any generated text
**
> Default value
| { font: '12px Arial, sans-serif', fill: '#fff' }
\*/
txtattr: { font: '12px Arial, sans-serif', fill: '#fff' },
/*\
* g.colors
[ array ]
**
* An array of color values that charts will iterate through when drawing chart data values.
**
\*/
colors: (function () {
var hues = [.6, .2, .05, .1333, .75, 0],
colors = [];
for (var i = 0; i < 10; i++) {
if (i < hues.length) {
colors.push('hsb(' + hues[i] + ',.75, .75)');
} else {
colors.push('hsb(' + hues[i - hues.length] + ', 1, .5)');
}
}
return colors;
})(),
snapEnds: function(from, to, steps) {
var f = from,
t = to;
if (f == t) {
return {from: f, to: t, power: 0};
}
function round(a) {
return Math.abs(a - .5) < .25 ? ~~(a) + .5 : Math.round(a);
}
var d = (t - f) / steps,
r = ~~(d),
R = r,
i = 0;
if (r) {
while (R) {
i--;
R = ~~(d * Math.pow(10, i)) / Math.pow(10, i);
}
i ++;
} else {
if(d == 0 || !isFinite(d)) {
i = 1;
} else {
while (!r) {
i = i || 1;
r = ~~(d * Math.pow(10, i)) / Math.pow(10, i);
i++;
}
}
i && i--;
}
t = round(to * Math.pow(10, i)) / Math.pow(10, i);
if (t < to) {
t = round((to + .5) * Math.pow(10, i)) / Math.pow(10, i);
}
f = round((from - (i > 0 ? 0 : .5)) * Math.pow(10, i)) / Math.pow(10, i);
return { from: f, to: t, power: i };
},
axis: function (x, y, length, from, to, steps, orientation, labels, type, dashsize, paper) {
dashsize = dashsize == null ? 2 : dashsize;
type = type || "t";
steps = steps || 10;
paper = arguments[arguments.length-1] //paper is always last argument
var path = type == "|" || type == " " ? ["M", x + .5, y, "l", 0, .001] : orientation == 1 || orientation == 3 ? ["M", x + .5, y, "l", 0, -length] : ["M", x, y + .5, "l", length, 0],
ends = this.snapEnds(from, to, steps),
f = ends.from,
t = ends.to,
i = ends.power,
j = 0,
txtattr = { font: "11px 'Fontin Sans', Fontin-Sans, sans-serif" },
text = paper.set(),
d;
d = (t - f) / steps;
var label = f,
rnd = i > 0 ? i : 0;
dx = length / steps;
if (+orientation == 1 || +orientation == 3) {
var Y = y,
addon = (orientation - 1 ? 1 : -1) * (dashsize + 3 + !!(orientation - 1));
while (Y >= y - length) {
type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), Y + .5, "l", dashsize * 2 + 1, 0]));
text.push(paper.text(x + addon, Y, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(txtattr).attr({ "text-anchor": orientation - 1 ? "start" : "end" }));
label += d;
Y -= dx;
}
if (Math.round(Y + dx - (y - length))) {
type != "-" && type != " " && (path = path.concat(["M", x - (type == "+" || type == "|" ? dashsize : !(orientation - 1) * dashsize * 2), y - length + .5, "l", dashsize * 2 + 1, 0]));
text.push(paper.text(x + addon, y - length, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(txtattr).attr({ "text-anchor": orientation - 1 ? "start" : "end" }));
}
} else {
label = f;
rnd = (i > 0) * i;
addon = (orientation ? -1 : 1) * (dashsize + 9 + !orientation);
var X = x,
dx = length / steps,
txt = 0,
prev = 0;
while (X <= x + length) {
type != "-" && type != " " && (path = path.concat(["M", X + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1]));
text.push(txt = paper.text(X, y + addon, (labels && labels[j++]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(txtattr));
var bb = txt.getBBox();
if (prev >= bb.x - 5) {
text.pop(text.length - 1).remove();
} else {
prev = bb.x + bb.width;
}
label += d;
X += dx;
}
if (Math.round(X - dx - x - length)) {
type != "-" && type != " " && (path = path.concat(["M", x + length + .5, y - (type == "+" ? dashsize : !!orientation * dashsize * 2), "l", 0, dashsize * 2 + 1]));
text.push(paper.text(x + length, y + addon, (labels && labels[j]) || (Math.round(label) == label ? label : +label.toFixed(rnd))).attr(txtattr));
}
}
var res = paper.path(path);
res.text = text;
res.all = paper.set([res, text]);
res.remove = function () {
this.text.remove();
this.constructor.prototype.remove.call(this);
};
return res;
},
labelise: function(label, val, total) {
if (label) {
return (label + "").replace(/(##+(?:\.#+)?)|(%%+(?:\.%+)?)/g, function (all, value, percent) {
if (value) {
return (+val).toFixed(value.replace(/^#+\.?/g, "").length);
}
if (percent) {
return (val * 100 / total).toFixed(percent.replace(/^%+\.?/g, "").length) + "%";
}
});
} else {
return (+val).toFixed(0);
}
}
}
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>g.raphael.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
var Infiniscroll = (function(document) {
"use strict";
function Infiniscroll(el, settings) {
this.parent = el.parentNode;
this.el = el;
var defaults = Infiniscroll.defaultSettings,
_out = this._out = document.createElement('div'),
_in = this._in = document.createElement('div'),
_outStyle = _out.style,
_inStyle = _in.style,
scroll,
i;
settings = settings || {};
for (i in defaults) if (i && defaults.hasOwnProperty(i)) if (!settings.hasOwnProperty(i)) {
settings[i] = defaults[i];
}
this.settings = settings;
scroll = settings.scroll;
_outStyle.position = 'absolute';
//setup style of inner element
if (settings.vertical) {
_inStyle.height = '1000%';
_outStyle.overflowY = 'scroll';
} else {
_inStyle.height = '1000%';
_outStyle.overflowY = 'hidden';
}
if (settings.horizontal) {
_inStyle.width = '1000%';
_outStyle.overflowX = 'scroll';
}
_inStyle['-webkit-transition'] = '.5s';
_inStyle.transition = '.5s';
//height and width
if (settings.horizontal && settings.vertical) {
_out.onscroll = function () {
var x = (_out.scrollLeft / settings.horizontalScrollDensity) >> 1,
y = (_out.scrollTop / settings.verticalScrollDensity) >> 1,
totalHeight = _out.scrollTop + _out.offsetHeight,
totalWidth = _out.scrollLeft + _out.offsetWidth;
if (totalHeight >= (_in.offsetHeight - (_out.offsetHeight / 2))) {
_inStyle.height = (_in.offsetHeight + (_out.offsetHeight * 2)) + 'px';
}
if (totalWidth >= (_in.offsetWidth - (_out.offsetWidth / 2))) {
_inStyle.width = (_in.offsetWidth + (_out.offsetWidth * 2)) + 'px';
}
scroll(x, y);
};
}
//height only
else if (settings.vertical) {
_out.onscroll = function () {
var y = (_out.scrollTop / settings.verticalScrollDensity) >> 1,
totalHeight = _out.scrollTop + _out.offsetHeight;
if (totalHeight >= (_in.offsetHeight - (_out.offsetHeight / 2))) {
_inStyle.height = (_in.offsetHeight + (_out.offsetHeight * 2)) + 'px';
}
scroll(y);
};
}
//width only
else if (settings.horizontal) {
_out.onscroll = function () {
var x = (_out.scrollLeft / settings.horizontalScrollDensity) >> 1,
totalWidth = _out.scrollLeft + _out.offsetWidth;
if (totalWidth >= (_in.offsetWidth - (_out.offsetWidth / 2))) {
_inStyle.width = (_in.offsetWidth + (_out.offsetWidth * 2)) + 'px';
}
scroll(x);
};
}
_out.appendChild(_in);
el.parentNode.insertBefore(_out, el);
this.refresh();
scroll(0, 0);
}
Infiniscroll.prototype = {
/**
* Get scrollBar size
* @returns {Object} {height: int, width: int}
*/
getScrollBarSize: function () {
var inner = document.createElement('p'),
innerStyle = inner.style,
outer = document.createElement('div'),
outerStyle = outer.style;
//setup inner
innerStyle.width = '100%';
innerStyle.height = '100%';
//setup outer
outerStyle.position = 'absolute';
outerStyle.width = '100px';
outerStyle.height = '100px';
outerStyle.visibility = 'hidden';
outerStyle.overflow = 'hidden';
outer.appendChild(inner);
document.body.appendChild(outer);
var w1 = inner.offsetWidth,
h1 = inner.offsetHeight;
outerStyle.overflow = 'scroll';
var w2 = inner.offsetWidth,
h2 = inner.offsetHeight;
if (w1 == w2 && outer.offsetWidth) {
w2 = outer.offsetWidth;
}
if (h1 == h2 && outer.offsetHeight) {
h2 = outer.offsetHeight;
}
document.body.removeChild(outer);
var w = w1 - w2, h = h1 - h2;
return {
width: w || 15,
height: h || 15
};
},
refresh: function() {
var el = this.el,
elStyle = getComputedStyle(el),
top = el.offsetTop,
left = el.offsetLeft,
out = this._out,
style = out.style,
scrollSize = this.getScrollBarSize();
if (left !== 0) {
style.left = left + 'px';
}
if (top !== 0) {
style.top = top + 'px';
}
style.width = (el.offsetWidth + (this.settings.vertical ? scrollSize.width : 0) + 'px');
style.height = (el.offsetHeight + (this.settings.horizontal ? scrollSize.height : 0) + 'px');
style.margin = elStyle.margin;
style.padding = elStyle.padding;
style.borderWidth = elStyle.borderWidth;
style.borderRadius = elStyle.borderRadius;
return this;
},
applyLT: function() {
var _out = this._out;
_out.scrollLeft = this._scrollLeft;
_out.scrollTop = this._scrollTop;
this._scrollLeft = null;
this._scrollTop = null;
return this;
},
saveLT: function() {
var _out = this._out;
this._scrollLeft = this._scrollLeft || _out.scrollLeft;
this._scrollTop = this._scrollTop || _out.scrollTop;
return this;
}
};
Infiniscroll.defaultSettings = {
horizontal: true,
vertical: true,
scroll: function() {},
horizontalScrollDensity: 5,
verticalScrollDensity: 5
};
return Infiniscroll;
})(document);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>infiniscroll.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery-ui.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/**
* @name Elastic
* @descripton Elastic is jQuery plugin that grow and shrink your textareas automatically
* @version 1.6.10
* @requires jQuery 1.2.6+
*
* @author Jan Jarfalk
* @author-email jan.jarfalk@unwrongest.com
* @author-website http://www.unwrongest.com
*
* @licence MIT License - http://www.opensource.org/licenses/mit-license.php
*/
(function(jQuery){
jQuery.fn.extend({
elastic: function() {
// We will create a div clone of the textarea
// by copying these attributes from the textarea to the div.
var mimics = [
'paddingTop',
'paddingRight',
'paddingBottom',
'paddingLeft',
'fontSize',
'lineHeight',
'fontFamily',
'width',
'fontWeight',
'border-top-width',
'border-right-width',
'border-bottom-width',
'border-left-width',
'borderTopStyle',
'borderTopColor',
'borderRightStyle',
'borderRightColor',
'borderBottomStyle',
'borderBottomColor',
'borderLeftStyle',
'borderLeftColor'
];
return this.each( function() {
// Elastic only works on textareas
if ( this.type !== 'textarea' ) {
return false;
}
var $textarea = jQuery(this),
$twin = jQuery('<div />').css({'position': 'absolute','display':'none','word-wrap':'break-word'}),
lineHeight = parseInt($textarea.css('line-height'),10) || parseInt($textarea.css('font-size'),'10'),
minheight = parseInt($textarea.css('height'),10) || lineHeight*3,
maxheight = parseInt($textarea.css('max-height'),10) || Number.MAX_VALUE,
goalheight = 0;
// Opera returns max-height of -1 if not set
if (maxheight < 0) { maxheight = Number.MAX_VALUE; }
// Append the twin to the DOM
// We are going to meassure the height of this, not the textarea.
$twin.appendTo($textarea.parent());
// Copy the essential styles (mimics) from the textarea to the twin
var i = mimics.length;
while(i--){
$twin.css(mimics[i].toString(),$textarea.css(mimics[i].toString()));
}
// Updates the width of the twin. (solution for textareas with widths in percent)
function setTwinWidth(){
curatedWidth = Math.floor(parseInt($textarea.width(),10));
if($twin.width() !== curatedWidth){
$twin.css({'width': curatedWidth + 'px'});
// Update height of textarea
update(true);
}
}
// Sets a given height and overflow state on the textarea
function setHeightAndOverflow(height, overflow){
var curratedHeight = Math.floor(parseInt(height,10));
if($textarea.height() !== curratedHeight){
$textarea.css({'height': curratedHeight + 'px','overflow':overflow});
// Fire the custom event resize
$textarea.trigger('resize');
}
}
// This function will update the height of the textarea if necessary
function update(forced) {
// Get curated content from the textarea.
var textareaContent = $textarea.val().replace(/&/g,'&amp;').replace(/ {2}/g, '&nbsp;').replace(/<|>/g, '&gt;').replace(/\n/g, '<br />');
// Compare curated content with curated twin.
var twinContent = $twin.html().replace(/<br>/ig,'<br />');
if(forced || textareaContent+'&nbsp;' !== twinContent){
// Add an extra white space so new rows are added when you are at the end of a row.
$twin.html(textareaContent+'&nbsp;');
// Change textarea height if twin plus the height of one line differs more than 3 pixel from textarea height
if(Math.abs($twin.height() + lineHeight - $textarea.height()) > 3){
var goalheight = $twin.height()+lineHeight;
if(goalheight >= maxheight) {
setHeightAndOverflow(maxheight,'auto');
} else if(goalheight <= minheight) {
setHeightAndOverflow(minheight,'hidden');
} else {
setHeightAndOverflow(goalheight,'hidden');
}
}
}
}
// Hide scrollbars
$textarea.css({'overflow':'hidden'});
// Update textarea size on keyup, change, cut and paste
$textarea.bind('keyup change cut paste', function(){
update();
});
// Update width of twin if browser or textarea is resized (solution for textareas with widths in percent)
$(window).bind('resize', setTwinWidth);
$textarea.bind('resize', setTwinWidth);
$textarea.bind('update', update);
// Compact textarea on blur
$textarea.bind('blur',function(){
if($twin.height() < maxheight){
if($twin.height() > minheight) {
$textarea.height($twin.height());
} else {
$textarea.height(minheight);
}
}
});
// And this line is to catch the browser paste event
$textarea.bind('input paste',function(e){ setTimeout( update, 250); });
// Run update once when elastic is initialized
update();
});
}
});
})(jQuery);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery.elastic.source.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*!
* jQuery Nearest plugin v1.3.0
*
* Finds elements closest to a single point based on screen location and pixel dimensions
* http://gilmoreorless.github.io/jquery-nearest/
* Open source under the MIT licence: http://gilmoreorless.mit-license.org/2011/
*
* Requires jQuery 1.4 or above
* Also supports Ben Alman's "each2" plugin for faster looping (if available)
*/
/**
* Method signatures:
*
* $.nearest({x, y}, selector) - find $(selector) closest to point
* $(elem).nearest(selector) - find $(selector) closest to elem
* $(elemSet).nearest({x, y}) - filter $(elemSet) and return closest to point
*
* Also:
* $.furthest()
* $(elem).furthest()
*
* $.touching()
* $(elem).touching()
*/
;(function ($, undefined) {
/**
* Internal method that does the grunt work
*
* @param mixed selector Any valid jQuery selector providing elements to filter
* @param hash options Key/value list of options for matching elements
* @param mixed thisObj (optional) Any valid jQuery selector that represents self
* for the "includeSelf" option
* @return array List of matching elements, can be zero length
*/
var rPerc = /^([\d.]+)%$/;
function nearest(selector, options, thisObj) {
// Normalise selector and dimensions
selector || (selector = 'div'); // I STRONGLY recommend passing in a selector
var $container = $(options.container),
containerOffset = $container.offset() || {left: 0, top: 0},
containerWH = [
$container.width() || 0,
$container.height() || 0
],
containerProps = {
// prop: [min, max]
x: [containerOffset.left, containerOffset.left + containerWH[0]],
y: [containerOffset.top, containerOffset.top + containerWH[1]],
w: [0, containerWH[0]],
h: [0, containerWH[1]]
},
prop, dims, match;
for (prop in containerProps) if (containerProps.hasOwnProperty(prop)) {
match = rPerc.exec(options[prop]);
if (match) {
dims = containerProps[prop];
options[prop] = (dims[1] - dims[0]) * match[1] / 100 + dims[0];
}
}
// Deprecated options - remove in 2.0
if (options.sameX === false && options.checkHoriz === false) {
options.sameX = !options.checkHoriz;
}
if (options.sameY === false && options.checkVert === false) {
options.sameY = !options.checkVert;
}
// Get elements and work out x/y points
var $all = $container.find(selector),
cache = [],
furthest = !!options.furthest,
checkX = !options.sameX,
checkY = !options.sameY,
onlyX = !!options.onlyX,
onlyY = !!options.onlyY,
compDist = furthest ? 0 : Infinity,
point1x = parseFloat(options.x) || 0,
point1y = parseFloat(options.y) || 0,
point2x = parseFloat(point1x + options.w) || point1x,
point2y = parseFloat(point1y + options.h) || point1y,
tolerance = parseFloat(options.tolerance) || 0,
hasEach2 = !!$.fn.each2,
// Shortcuts to help with compression
min = Math.min,
max = Math.max;
// Normalise the remaining options
if (!options.includeSelf && thisObj) {
$all = $all.not(thisObj);
}
if (tolerance < 0) {
tolerance = 0;
}
// Loop through all elements and check their positions
$all[hasEach2 ? 'each2' : 'each'](function (i, elem) {
var $this = hasEach2 ? elem : $(this),
off = $this.offset(),
x = off.left,
y = off.top,
w = $this.outerWidth(),
h = $this.outerHeight(),
x2 = x + w,
y2 = y + h,
maxX1 = max(x, point1x),
minX2 = min(x2, point2x),
maxY1 = max(y, point1y),
minY2 = min(y2, point2y),
intersectX = minX2 >= maxX1,
intersectY = minY2 >= maxY1,
distX, distY, distT, isValid;
if (
// .nearest() / .furthest()
(checkX && checkY) ||
// .touching()
(!checkX && !checkY && intersectX && intersectY) ||
// .nearest({sameY: true})
(checkX && intersectY) ||
// .nearest({sameX: true})
(checkY && intersectX) ||
// .nearest({onlyX: true})
(checkX && onlyX) ||
// .nearest({onlyY: true})
(checkY && onlyY)
) {
distX = intersectX ? 0 : maxX1 - minX2;
distY = intersectY ? 0 : maxY1 - minY2;
if (onlyX || onlyY) {
distT = onlyX ? distX : distY;
} else {
distT = intersectX || intersectY ?
max(distX, distY) :
Math.sqrt(distX * distX + distY * distY);
}
isValid = furthest ?
distT >= compDist - tolerance :
distT <= compDist + tolerance;
if (isValid) {
compDist = furthest ?
max(compDist, distT) :
min(compDist, distT);
cache.push({
node: this,
dist: distT
});
}
}
});
// Make sure all cached items are within tolerance range
var len = cache.length,
filtered = [],
compMin, compMax,
i, item;
if (len) {
if (furthest) {
compMin = compDist - tolerance;
compMax = compDist;
} else {
compMin = compDist;
compMax = compDist + tolerance;
}
for (i = 0; i < len; i++) {
item = cache[i];
if (item.dist >= compMin && item.dist <= compMax) {
filtered.push(item.node);
}
}
}
return filtered;
}
$.each(['nearest', 'furthest', 'touching'], function (i, name) {
// Internal default options
// Not exposed publicly because they're method-dependent and easily overwritten anyway
var defaults = {
x: 0, // X position of top left corner of point/region
y: 0, // Y position of top left corner of point/region
w: 0, // Width of region
h: 0, // Height of region
tolerance: 1, // Distance tolerance in pixels, mainly to handle fractional pixel rounding bugs
container: document, // Container of objects for calculating %-based dimensions
furthest: name == 'furthest', // Find max distance (true) or min distance (false)
includeSelf: false, // Include 'this' in search results (t/f) - only applies to $(elem).func(selector) syntax
sameX: name === 'touching', // Only match for the same X axis values (t/f)
sameY: name === 'touching', // Only match for the same Y axis values (t/f)
onlyX: false, // Only check X axis variations (t/f)
onlyY: false // Only check Y axis variations (t/f)
};
/**
* $.nearest() / $.furthest() / $.touching()
*
* Utility functions for finding elements near a specific point or region on screen
*
* @param hash point Co-ordinates for the point or region to measure from
* "x" and "y" keys are required, "w" and "h" keys are optional
* @param mixed selector Any valid jQuery selector that provides elements to filter
* @param hash options (optional) Extra filtering options
* Not technically needed as the options could go on the point object,
* but it's good to have a consistent API
* @return jQuery object containing matching elements in selector
*/
$[name] = function (point, selector, options) {
if (!point || point.x === undefined || point.y === undefined) {
return $([]);
}
var opts = $.extend({}, defaults, point, options || {});
return $(nearest(selector, opts));
};
/**
* SIGNATURE 1:
* $(elem).nearest(selector) / $(elem).furthest(selector) / $(elem).touching(selector)
*
* Finds all elements in selector that are nearest to/furthest from elem
*
* @param mixed selector Any valid jQuery selector that provides elements to filter
* @param hash options (optional) Extra filtering options
* @return jQuery object containing matching elements in selector
*
* SIGNATURE 2:
* $(elemSet).nearest(point) / $(elemSet).furthest(point) / $(elemSet).touching(point)
*
* Filters elemSet to return only the elements nearest to/furthest from point
* Effectively a wrapper for $.nearest(point, elemSet) but with the benefits of method chaining
*
* @param hash point Co-ordinates for the point or region to measure from
* @return jQuery object containing matching elements in elemSet
*/
$.fn[name] = function (selector, options) {
if (!this.length) {
return this.pushStack([]);
}
var opts;
if (selector && $.isPlainObject(selector)) {
opts = $.extend({}, defaults, selector, options || {});
return this.pushStack(nearest(this, opts));
}
var offset = this.offset(),
dimensions = {
x: offset.left,
y: offset.top,
w: this.outerWidth(),
h: this.outerHeight()
};
opts = $.extend({}, defaults, dimensions, options || {});
return this.pushStack(nearest(selector, opts, this));
};
});
})(jQuery);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>jquery.nearest.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/**
* MegaTable
* Load infinite sized tables in the browser with a fixed number of elements
* @constructor
*/
var MegaTable = (function(document) {
"use strict";
var charSize = function() {
var characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',
el = document.createElement('span'),
size;
el.innerHTML = characters;
document.body.appendChild(el);
size = {
width: el.offsetWidth / characters.length,
height: el.offsetHeight
};
el.parentNode.removeChild(el);
return size;
};
/**
*
* @param {Object} settings inherits values from MegaTable.defaultSettings
* @constructor
*/
function MegaTable(settings) {
var table = this.table = document.createElement('table'),
colGroup = this.colGroup = document.createElement('colGroup'),
tBody = this.tBody = document.createElement('tBody'),
defaults = MegaTable.defaultSettings,
i;
this.charSize = charSize();
for(i in defaults) if (defaults.hasOwnProperty(i)) {
if (settings[i] === undefined) settings[i] = defaults[i];
}
this.rowIndex = 0;
this.columnIndex = 0;
this.trInsertionIndex = 0;
this.thInsertionIndex = 0;
this.rows = settings.rows;
this.columns = settings.columns;
this.updateCorner = settings.updateCorner;
this.updateCell = settings.updateCell;
this.updateRowHeader = settings.updateRowHeader;
this.updateColumnHeader = settings.updateColumnHeader;
table.appendChild(colGroup);
table.appendChild(tBody);
if (settings.strict) {
table.style.tableLayout = 'fixed';
table.style.width = '0px';
}
table.className = 'mega-table';
this
._createMegaTableDOM()
._updateCorner();
if (settings.element !== null) {
settings.element.appendChild(table);
}
this.rowHeaders = 1;
this.columnHeaders = 1;
this.initiated = true;
}
MegaTable.prototype = {
/**
*
* @param {Number} trIndex
* @returns {MegaTable}
*/
setRowStartIndex: function(trIndex) {
if (trIndex < 0) {
trIndex = 0;
} else if (trIndex > this.rows) {
trIndex = this.rows;
}
this.trInsertionIndex = trIndex;
return this;
},
/**
*
* @param {Number} columnIndex
* @returns {MegaTable}
*/
setColumnStartIndex: function(columnIndex) {
if (columnIndex < 0) {
columnIndex = 0;
} else if (columnIndex > this.columns) {
columnIndex = this.columns;
}
this.thInsertionIndex = columnIndex;
return this;
},
/**
*
* @param {Number} rowIndex
* @param {Number} columnIndex
* @returns {MegaTable}
*/
update: function (rowIndex, columnIndex) {
return this
.updateRows(rowIndex)
.updateColumns(columnIndex);
},
/**
* @param {Number} rowIndex
* @returns {MegaTable}
*/
updateRows: function (rowIndex) {
var up = 0,
down = 0,
detachedRow;
if (this.rowIndex > rowIndex) {
up = this.rowIndex - rowIndex;
if (up > this.rows) {
up -= this.rows;
this.rowIndex = rowIndex + up;
}
} else if (this.rowIndex < rowIndex) {
down = rowIndex - this.rowIndex;
if (down > this.rows) {
down -= this.rows;
this.rowIndex = rowIndex - down;
}
}
if (up > 0) {
while (up > 0) {
this.rowIndex--;
detachedRow = this._moveBottomRowHeaderToTop();
this._moveBottomRowToTop(detachedRow);
up--;
}
this._updateCorner();
}
else if (down > 0) {
while (down > 0) {
this.rowIndex++;
detachedRow = this._moveTopRowHeaderToBottom();
this._moveTopRowToBottom(detachedRow);
down--;
}
this._updateCorner();
}
return this;
},
/**
*
* @param {Number} columnIndex
* @returns {MegaTable}
*/
updateColumns: function (columnIndex) {
var left = 0,
right = 0;
if (this.columnIndex > columnIndex) {
left = this.columnIndex - columnIndex;
if (left > this.columns) {
left -= this.columns;
this.columnIndex = columnIndex + left;
}
} else if (this.columnIndex < columnIndex) {
right = columnIndex - this.columnIndex;
if (right > this.columns) {
right -= this.columns;
this.columnIndex = columnIndex - right;
}
}
if (left > 0) {
this.table.style.visibility = 'hidden';
while (left > 0) {
this.columnIndex--;
this
._moveRightColumnHeaderToLeft()
._moveRightColumnToLeft();
left--;
}
this.table.style.visibility = '';
}
else if (right > 0) {
this.table.style.visibility = 'hidden';
while (right > 0) {
this.columnIndex++;
this
._moveLeftColumnHeaderToRight()
._moveLeftColumnToRight();
right--;
}
this.table.style.visibility = '';
}
return this;
},
/**
*
* @param {Number} trIndex
* @returns {MegaTable}
*/
newRow: function(trIndex) {
var row = this._moveBottomRowHeaderToIndex(trIndex);
return this
._moveBottomRowToIndex(row, trIndex)
._updateRowHeadersFollowing(trIndex)
._updateRowCellsFollowing(trIndex);
},
/**
*
* @param {Number} thIndex
* @returns {MegaTable}
*/
newColumn: function(thIndex) {
return this
._moveRightColumnHeaderToIndex(thIndex)
._moveRightColumnToIndex(thIndex)
._updateColumnHeadersFollowing(thIndex)
._updateColumnCellsFollowing(thIndex);
},
/**
*
* @param {Number} rowIndex
* @returns {MegaTable}
*/
removeRow: function(rowIndex) {
var row = this._moveIndexRowHeaderToBottom(rowIndex);
return this
._moveIndexRowToBottom(row)
._updateRowHeadersFollowing(this.rows)
._updateRowCellsFollowing(this.rows);
},
/**
*
* @param {Number} thIndex
* @returns {*|MegaTable}
*/
removeColumn: function(thIndex) {
this._updateColumnHeadersFollowing(thIndex);
this._updateColumnCellsFollowing(thIndex);
return this;
},
/**
*
* @param {Number} [trIndex]
* @returns {MegaTable}
*/
forceRedrawRows: function(trIndex) {
trIndex = trIndex || 0;
this.table.style.visibility = 'hidden';
this
._updateRowHeadersFollowing(trIndex)
._updateRowCellsFollowing(trIndex);
this.table.style.visibility = '';
return this;
},
/**
*
* @param {Number} [thIndex]
* @returns {MegaTable}
*/
forceRedrawColumns: function (thIndex) {
thIndex = thIndex || 0;
this.table.style.visibility = 'hidden';
this
._updateColumnHeadersFollowing(thIndex)
._updateColumnCellsFollowing(thIndex);
this.table.style.visibility = '';
return this;
},
/**
*
* @param {Number} i
* @returns {HTMLElement}
*/
col: function(i) {
return this.colGroup.children[i];
},
//below used in instantiation
/**
* @param {HTMLTableRowElement} tr
* @returns {MegaTable}
* @private
*/
_createCornerDOM: function (tr) {
var th = this.cornerTh = document.createElement('th'),
col = this.cornerCol = document.createElement('col');
col.style.width = '14px';
tr.appendChild(th);
this.updateCorner(th, col);
this.colGroup.appendChild(col);
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_createColumnHeaderDOM: function () {
var tr = document.createElement('tr'),
colGroup = this.colGroup,
columnIndex = 0,
th,
col;
this._createCornerDOM(tr);
this.tBody.appendChild(tr);
for (; columnIndex < this.columns; columnIndex++) {
th = document.createElement('th');
tr.appendChild(th);
col = document.createElement('col');
colGroup.appendChild(col);
this.updateColumnHeader(this.columnIndex + columnIndex, th, col);
}
return this;
},
/**
*
* @param {HTMLTableElement} tr
* @param {Number} i
* @returns {MegaTable}
* @private
*/
_createRowHeaderDOM: function (tr, i) {
var th = document.createElement('th');
tr.appendChild(th);
this.updateRowHeader(i, th);
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_createMegaTableDOM: function () {
var tBody = this.tBody,
rowIndex = this.rowIndex,
rowIndex = 0,
columnIndex = 0,
tr,
td;
this._createColumnHeaderDOM();
for (; rowIndex < this.rows; rowIndex++) {
columnIndex = 0;
tr = document.createElement('tr');
this._createRowHeaderDOM(tr, this.rowIndex + rowIndex);
tBody.appendChild(tr);
for (; columnIndex < this.columns; columnIndex++) {
td = document.createElement('td');
tr.appendChild(td);
this.updateCell(this.rowIndex + rowIndex, columnIndex, td);
}
}
return this;
},
//used in updating
/**
*
* @returns {MegaTable}
* @private
*/
_updateCorner: function() {
var tBody = this.tBody,
col = this.cornerCol,
targetRow = tBody.lastChild,
th = targetRow.firstChild,
newWidth,
minWidth = 20,
text;
if (th.innerText !== null && th.innerText !== undefined) {
text = th.innerText;
} else if (th.textContent !== null && th.textContent !== undefined) {
text = th.textContent;
}
newWidth = this.charSize.width * text.length;
//set a minimum width, because css doesn't respect this on col in FF
newWidth = (newWidth > minWidth ? newWidth : minWidth);
if (newWidth !== col._width || col._width === undefined) {
col._width = newWidth;
col.style.width = newWidth + 'px';
}
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_moveRightColumnHeaderToLeft: function() {
var parent = this.tBody.children[0],
colGroup = this.colGroup,
col = colGroup.lastChild,
header = parent.lastChild;
parent.removeChild(header);
colGroup.removeChild(col);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
if (col.hasAttribute('style')) col.removeAttribute('style');
if (col.hasAttribute('class')) col.className = '';
this.updateColumnHeader(this.columnIndex, header, col, MegaTable.left);
//insert after corner
parent.insertBefore(header, parent.children[this.thInsertionIndex + this.rowHeaders]);
colGroup.insertBefore(col, colGroup.children[this.thInsertionIndex + this.rowHeaders]);
return this;
},
/**
*
* @param thIndex
* @returns {MegaTable}
* @private
*/
_moveRightColumnHeaderToIndex: function(thIndex) {
var parent = this.tBody.children[0],
colGroup = this.colGroup,
col = colGroup.lastChild,
header = parent.lastChild;
if (thIndex < this.thInsertionIndex) {
thIndex = this.thInsertionIndex;
} else if (thIndex > this.columns) {
thIndex = this.columns;
}
parent.removeChild(header);
colGroup.removeChild(col);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
if (col.hasAttribute('style')) col.removeAttribute('style');
if (col.hasAttribute('class')) col.className = '';
this.updateColumnHeader(this.columnIndex + thIndex, header, col);
//insert before corner
parent.insertBefore(header, parent.children[thIndex + this.rowHeaders]);
colGroup.insertBefore(col, colGroup.children[thIndex + this.rowHeaders]);
return this;
},
/**
*
* @param thIndex
* @returns {MegaTable}
* @private
*/
_moveIndexColumnHeaderToRight: function(thIndex) {
if (thIndex > this.columns) {
thIndex = this.columns;
}
var parent = this.tBody.children[0],
colGroup = this.colGroup,
col = colGroup.children[thIndex + this.rowHeaders],
header = parent.children[thIndex + this.rowHeaders];
parent.removeChild(header);
colGroup.removeChild(col);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
if (col.hasAttribute('style')) col.removeAttribute('style');
if (col.hasAttribute('class')) col.className = '';
this.updateColumnHeader(this.columnIndex + this.columns, header, col);
//insert before corner
parent.appendChild(header);
colGroup.appendChild(col);
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_moveLeftColumnHeaderToRight: function() {
var parent = this.tBody.children[0],
colGroup = this.colGroup,
col = colGroup.children[this.thInsertionIndex + this.rowHeaders],
header = parent.children[this.thInsertionIndex + this.rowHeaders];
parent.removeChild(header);
colGroup.removeChild(col);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
if (col.hasAttribute('style')) col.removeAttribute('style');
if (col.hasAttribute('class')) col.className = '';
this.updateColumnHeader(this.columnIndex + parent.children.length - 1, header, col, MegaTable.right);
//insert at end
parent.appendChild(header);
colGroup.appendChild(col);
return this;
},
/**
*
* @returns {HTMLTableRowElement|Node}
* @private
*/
_moveBottomRowHeaderToTop: function() {
var parent = this.tBody,
header = parent.lastChild.children[0];
//we intentionally leave the node detached here because the body manages it
parent.removeChild(header.parentNode);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
this.updateRowHeader(this.rowIndex, header, MegaTable.up);
return header.parentNode;
},
/**
*
* @param {Number} trIndex
* @returns {Node}
* @private
*/
_moveBottomRowHeaderToIndex: function(trIndex) {
var parent = this.tBody,
row = parent.lastChild,
header = row.children[0];
if (trIndex < this.trInsertionIndex) {
trIndex = this.trInsertionIndex;
} else if (trIndex > this.rows) {
trIndex = this.rows;
}
//we intentionally leave the node detached here because the body manages it
parent.removeChild(row);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
this.updateRowHeader(this.rowIndex + trIndex, header);
return row;
},
/**
*
* @param {Number} rowIndex
* @returns {Node|HTMLTableRowElement}
* @private
*/
_moveIndexRowHeaderToBottom: function(rowIndex) {
if (rowIndex > this.rows) {
rowIndex = this.rows;
}
var parent = this.tBody,
row = parent.children[rowIndex],
header = row.children[0];
//we intentionally leave the node detached here because the body manages it
parent.removeChild(row);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
this.updateRowHeader(this.rowIndex + this.rows, header);
return row;
},
/**
*
* @returns {HTMLTableRowElement|Node}
* @private
*/
_moveTopRowHeaderToBottom: function() {
var parent = this.tBody,
header = parent.children[this.trInsertionIndex + this.columnHeaders].children[0];
//we intentionally leave the node detached here because the body manages it
parent.removeChild(header.parentNode);
while(header.lastChild !== null) {
header.removeChild(header.lastChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
this.updateRowHeader(this.rowIndex + parent.children.length - 1, header, MegaTable.down);
return header.parentNode;
},
/**
*
* @param {HTMLTableElement} row
* @returns {MegaTable}
* @private
*/
_moveBottomRowToTop: function (row) {
var children = row.children,
element,
columnIndex = this.thInsertionIndex;
for (; columnIndex < this.columns; columnIndex++) {
element = children[columnIndex + this.columnHeaders];
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex, this.columnIndex + columnIndex, element, MegaTable.up);
}
this.tBody.insertBefore(row, this.tBody.children[this.trInsertionIndex + this.columnHeaders]);
return this;
},
/**
*
* @param {Node|HTMLTableRowElement} tr
* @param {Number} trIndex
* @returns {MegaTable}
* @private
*/
_moveBottomRowToIndex: function (tr, trIndex) {
var children = tr.children,
element,
columnIndex = this.thInsertionIndex;
if (trIndex < this.trInsertionIndex) {
trIndex = this.trInsertionIndex;
} else if (trIndex > this.rows) {
trIndex = this.rows;
}
for (; columnIndex < this.columns; columnIndex++) {
element = children[columnIndex + this.columnHeaders];
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + trIndex, this.columnIndex + columnIndex, element);
}
this.tBody.insertBefore(tr, this.tBody.children[trIndex + this.columnHeaders]);
return this;
},
/**
*
* @param {HTMLTableRowElement} row
* @returns {MegaTable}
* @private
*/
_moveIndexRowToBottom: function (row) {
var children = row.children,
element,
columnIndex = this.thInsertionIndex;
for (; columnIndex < this.columns; columnIndex++) {
element = children[columnIndex + this.columnHeaders];
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + this.rows, this.columnIndex + columnIndex, element);
}
this.tBody.appendChild(row);
return this;
},
/**
*
* @param {HTMLTableRowElement} row
* @returns {MegaTable}
* @private
*/
_moveTopRowToBottom: function (row) {
var children = row.children,
element,
columnIndex = this.thInsertionIndex;
for (; columnIndex < this.columns; columnIndex++) {
element = children[columnIndex + this.columnHeaders];
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + this.tBody.children.length - 1, this.columnIndex + columnIndex, element, MegaTable.down);
}
this.tBody.insertBefore(row, null);
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_moveRightColumnToLeft: function () {
var rows = this.tBody.children,
row,
element,
rowIndex = this.trInsertionIndex;
for (; rowIndex < this.rows; rowIndex++) {
row = rows[rowIndex + this.rowHeaders];
element = row.lastChild;
row.removeChild(element);
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + rowIndex, this.columnIndex, element, MegaTable.left);
row.insertBefore(element, row.children[this.trInsertionIndex + this.rowHeaders]);
}
return this;
},
/**
*
* @param {Number} thIndex
* @returns {MegaTable}
* @private
*/
_moveRightColumnToIndex: function (thIndex) {
var rows = this.tBody.children,
row,
element,
rowIndex = this.trInsertionIndex;
if (thIndex < this.thInsertionIndex) {
thIndex = this.thInsertionIndex;
}
for (; rowIndex < this.rows; rowIndex++) {
row = rows[rowIndex + this.rowHeaders];
element = row.lastChild;
row.removeChild(element);
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + rowIndex, this.columnIndex + thIndex, element);
row.insertBefore(element, row.children[thIndex + this.rowHeaders]);
}
return this;
},
/**
*
* @param {Number} thIndex
* @returns {MegaTable}
* @private
*/
_moveIndexColumnToRight: function (thIndex) {
if (thIndex < this.columns) {
thIndex = this.columns;
}
var rows = this.tBody.children,
row,
element,
rowIndex = this.trInsertionIndex;
for (; rowIndex < this.rows; rowIndex++) {
row = rows[rowIndex + this.rowHeaders];
element = row.children[thIndex];
row.removeChild(element);
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + rowIndex, this.columnIndex + this.columns, element);
row.insertBefore(element, row.children[thIndex + this.rowHeaders]);
}
return this;
},
/**
*
* @returns {MegaTable}
* @private
*/
_moveLeftColumnToRight: function () {
var rows = this.tBody.children,
row,
columnIndexEnd = this.columns,
element,
rowIndex = this.trInsertionIndex;
for (; rowIndex < this.rows; rowIndex++) {
row = rows[rowIndex + this.rowHeaders];
element = row.children[this.thInsertionIndex + this.rowHeaders];
row.removeChild(element);
while(element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + rowIndex, columnIndexEnd, element, MegaTable.right);
row.appendChild(element);
}
return this;
},
/**
*
* @param {Number} trIndex
* @returns {MegaTable}
* @private
*/
_updateRowHeadersFollowing: function(trIndex) {
var rows = this.tBody.children,
header;
for(;trIndex < this.rows;trIndex++) {
header = rows[trIndex + this.columnHeaders].children[0];
while(header.firstChild !== null) {
header.removeChild(header.firstChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
this.updateRowHeader(this.rowIndex + trIndex, header);
}
return this;
},
/**
*
* @param {Number} thIndex
* @returns {MegaTable}
* @private
*/
_updateColumnHeadersFollowing: function(thIndex) {
var headers = this.tBody.children[0].children,
colGroup = this.colGroup,
cols = colGroup.children,
header,
col;
for(;thIndex < this.columns;thIndex++) {
header = headers[thIndex + this.rowHeaders];
col = cols[thIndex + this.rowHeaders];
while(header.firstChild !== null) {
header.removeChild(header.firstChild);
}
if (header.hasAttribute('style')) header.removeAttribute('style');
if (header.hasAttribute('class')) header.className = '';
if (col.hasAttribute('style')) col.removeAttribute('style');
if (col.hasAttribute('class')) col.className = '';
this.updateColumnHeader(this.columnIndex + thIndex, header, col);
}
return this;
},
/**
*
* @param {Number} trIndex
* @returns {MegaTable}
* @private
*/
_updateRowCellsFollowing: function(trIndex) {
var rows = this.tBody.children,
columnIndex,
element,
row;
if (trIndex < this.trInsertionIndex) {
trIndex = this.trInsertionIndex;
} else if (trIndex > this.rows) {
trIndex = this.rows;
}
for (;trIndex < this.rows; trIndex++) {
row = rows[trIndex + this.columnHeaders];
columnIndex = this.thInsertionIndex;
for (; columnIndex < this.columns; columnIndex++) {
element = row.children[columnIndex + this.columnHeaders];
while (element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + trIndex, this.columnIndex + columnIndex, element);
}
}
return this;
},
/**
*
* @param {Number} thIndex
* @returns {MegaTable}
* @private
*/
_updateColumnCellsFollowing: function(thIndex) {
var rows = this.tBody.children,
rowIndex,
element,
row;
if (thIndex < this.thInsertionIndex) {
thIndex = this.thInsertionIndex;
} else if (thIndex > this.columns) {
thIndex = this.columns;
}
for (; thIndex < this.columns; thIndex++) {
rowIndex = this.trInsertionIndex;
for (;rowIndex < this.rows; rowIndex++) {
row = rows[rowIndex + this.rowHeaders];
element = row.children[thIndex + this.rowHeaders];
while (element.firstChild !== null) {
element.removeChild(element.firstChild);
}
if (element.hasAttribute('style')) element.removeAttribute('style');
if (element.hasAttribute('colSpan')) element.removeAttribute('colSpan');
if (element.hasAttribute('rowSpan')) element.removeAttribute('rowSpan');
if (element.hasAttribute('class')) element.className = '';
this.updateCell(this.rowIndex + rowIndex, this.columnIndex + thIndex, element);
}
}
return this;
}
};
/**
*
* @type {Object}
*/
MegaTable.defaultSettings = {
/**
* element you want mega table in
* @type {Element}
*/
element: null,
/**
* number of rows you'd like your table to have
* @type {Number}
*/
rows: 10,
/**
* number of columns you'd like your table to have
* @type {Number}
*/
columns: 10,
/**
* turns on strict mode so that size comes strictly from col elements
* @type {Boolean}
*/
strict: false,
updateCorner: function(th, col) {},
/**
* callback for when a table data element needs updated
* @type {Function}
* @param {Number} row
* @param {Number} column
* @param {HTMLTableCellElement} td
* @param {Number} direction
*/
updateCell: function(row, column, td, direction) {},
/**
* callback for when a table row header element needs updated
* @type {Function}
* @param {Number} i
* @param {HTMLTableCellElement} th
* @param {Number} direction
*/
updateRowHeader: function(i, th, direction) {},
/**
* callback for when a table column header element needs updated
* @type {Function}
* @param {Number} i
* @param {HTMLTableCellElement} th
* @param {HTMLTableColElement} col
* @param {Number} direction
*/
updateColumnHeader: function(i, th, col, direction) {},
useRowHeaders: true,
useColumnHeaders: true
};
MegaTable.left = 0;
MegaTable.right = 1;
MegaTable.up = 2;
MegaTable.down = 3;
return MegaTable;
})(document);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>megatable.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>old_wickedgrid.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>raphael.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
var Infiniscroll = (function(document) {
"use strict";
function Infiniscroll(el, settings) {
this.parent = el.parentNode;
this.el = el;
var defaults = Infiniscroll.defaultSettings,
_out = this._out = document.createElement('div'),
_in = this._in = document.createElement('div'),
_outStyle = _out.style,
_inStyle = _in.style,
scroll,
i;
settings = settings || {};
for (i in defaults) if (i && defaults.hasOwnProperty(i)) if (!settings.hasOwnProperty(i)) {
settings[i] = defaults[i];
}
this.settings = settings;
scroll = settings.scroll;
_outStyle.position = 'absolute';
//setup style of inner element
if (settings.vertical) {
_inStyle.height = '1000%';
_outStyle.overflowY = 'scroll';
} else {
_inStyle.height = '1000%';
_outStyle.overflowY = 'hidden';
}
if (settings.horizontal) {
_inStyle.width = '1000%';
_outStyle.overflowX = 'scroll';
}
_inStyle['-webkit-transition'] = '.5s';
_inStyle.transition = '.5s';
//height and width
if (settings.horizontal && settings.vertical) {
_out.onscroll = function () {
var x = (_out.scrollLeft / settings.horizontalScrollDensity) >> 1,
y = (_out.scrollTop / settings.verticalScrollDensity) >> 1,
totalHeight = _out.scrollTop + _out.offsetHeight,
totalWidth = _out.scrollLeft + _out.offsetWidth;
if (totalHeight >= (_in.offsetHeight - (_out.offsetHeight / 2))) {
_inStyle.height = (_in.offsetHeight + (_out.offsetHeight * 2)) + 'px';
}
if (totalWidth >= (_in.offsetWidth - (_out.offsetWidth / 2))) {
_inStyle.width = (_in.offsetWidth + (_out.offsetWidth * 2)) + 'px';
}
scroll(x, y);
};
}
//height only
else if (settings.vertical) {
_out.onscroll = function () {
var y = (_out.scrollTop / settings.verticalScrollDensity) >> 1,
totalHeight = _out.scrollTop + _out.offsetHeight;
if (totalHeight >= (_in.offsetHeight - (_out.offsetHeight / 2))) {
_inStyle.height = (_in.offsetHeight + (_out.offsetHeight * 2)) + 'px';
}
scroll(y);
};
}
//width only
else if (settings.horizontal) {
_out.onscroll = function () {
var x = (_out.scrollLeft / settings.horizontalScrollDensity) >> 1,
totalWidth = _out.scrollLeft + _out.offsetWidth;
if (totalWidth >= (_in.offsetWidth - (_out.offsetWidth / 2))) {
_inStyle.width = (_in.offsetWidth + (_out.offsetWidth * 2)) + 'px';
}
scroll(x);
};
}
_out.appendChild(_in);
el.parentNode.insertBefore(_out, el);
this.refresh();
scroll(0, 0);
}
Infiniscroll.prototype = {
/**
* Get scrollBar size
* @returns {Object} {height: int, width: int}
*/
getScrollBarSize: function () {
var inner = document.createElement('p'),
innerStyle = inner.style,
outer = document.createElement('div'),
outerStyle = outer.style;
//setup inner
innerStyle.width = '100%';
innerStyle.height = '100%';
//setup outer
outerStyle.position = 'absolute';
outerStyle.width = '100px';
outerStyle.height = '100px';
outerStyle.visibility = 'hidden';
outerStyle.overflow = 'hidden';
outer.appendChild(inner);
document.body.appendChild(outer);
var w1 = inner.offsetWidth,
h1 = inner.offsetHeight;
outerStyle.overflow = 'scroll';
var w2 = inner.offsetWidth,
h2 = inner.offsetHeight;
if (w1 == w2 && outer.offsetWidth) {
w2 = outer.offsetWidth;
}
if (h1 == h2 && outer.offsetHeight) {
h2 = outer.offsetHeight;
}
document.body.removeChild(outer);
var w = w1 - w2, h = h1 - h2;
return {
width: w || 15,
height: h || 15
};
},
refresh: function() {
var el = this.el,
elStyle = getComputedStyle(el),
top = el.offsetTop,
left = el.offsetLeft,
out = this._out,
style = out.style,
scrollSize = this.getScrollBarSize();
if (left !== 0) {
style.left = left + 'px';
}
if (top !== 0) {
style.top = top + 'px';
}
style.width = (el.offsetWidth + (this.settings.vertical ? scrollSize.width : 0) + 'px');
style.height = (el.offsetHeight + (this.settings.horizontal ? scrollSize.height : 0) + 'px');
style.margin = elStyle.margin;
style.padding = elStyle.padding;
style.borderWidth = elStyle.borderWidth;
style.borderRadius = elStyle.borderRadius;
return this;
},
applyLT: function() {
var _out = this._out;
_out.scrollLeft = this._scrollLeft;
_out.scrollTop = this._scrollTop;
this._scrollLeft = null;
this._scrollTop = null;
return this;
},
saveLT: function() {
var _out = this._out;
this._scrollLeft = this._scrollLeft || _out.scrollLeft;
this._scrollTop = this._scrollTop || _out.scrollTop;
return this;
}
};
Infiniscroll.defaultSettings = {
horizontal: true,
vertical: true,
scroll: function() {},
horizontalScrollDensity: 5,
verticalScrollDensity: 5
};
return Infiniscroll;
})(document);
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>thaw.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/*
Simple Javascript undo and redo.
https://github.com/ArthurClemens/Javascript-Undo-Manager
*/
;(function() {
'use strict';
function removeFromTo(array, from, to) {
array.splice(from,
!to ||
1 + to - from + (!(to < 0 ^ from >= 0) && (to < 0 || -1) * array.length));
return array.length;
}
var UndoManager = function() {
var commands = [],
index = -1,
limit = 0,
isExecuting = false,
callback,
// functions
execute;
execute = function(command, action) {
if (!command || typeof command[action] !== "function") {
return this;
}
isExecuting = true;
command[action]();
isExecuting = false;
return this;
};
return {
/*
Add a command to the queue.
*/
add: function (command) {
if (isExecuting) {
return this;
}
// if we are here after having called undo,
// invalidate items higher on the stack
commands.splice(index + 1, commands.length - index);
commands.push(command);
// if limit is set, remove items from the start
if (limit && commands.length > limit) {
removeFromTo(commands, 0, -(limit+1));
}
// set the current index to the end
index = commands.length - 1;
if (callback) {
callback();
}
return this;
},
/*
Pass a function to be called on undo and redo actions.
*/
setCallback: function (callbackFunc) {
callback = callbackFunc;
},
/*
Perform undo: call the undo function at the current index and decrease the index by 1.
*/
undo: function () {
var command = commands[index];
if (!command) {
return this;
}
execute(command, "undo");
index -= 1;
if (callback) {
callback();
}
return this;
},
/*
Perform redo: call the redo function at the next index and increase the index by 1.
*/
redo: function () {
var command = commands[index + 1];
if (!command) {
return this;
}
execute(command, "redo");
index += 1;
if (callback) {
callback();
}
return this;
},
/*
Clears the memory, losing all stored states. Reset the index.
*/
clear: function () {
var prev_size = commands.length;
commands = [];
index = -1;
if (callback && (prev_size > 0)) {
callback();
}
},
hasUndo: function () {
return index !== -1;
},
hasRedo: function () {
return index < (commands.length - 1);
},
getCommands: function () {
return commands;
},
getIndex: function() {
return index;
},
setLimit: function (l) {
limit = l;
}
};
};
if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
// AMD. Register as an anonymous module.
define(function() {
return UndoManager;
});
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = UndoManager;
} else {
window.UndoManager = UndoManager;
}
}());
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>undomanager.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>wickedgrid.js</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>application/javascript</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<ul>
<li>
<a href="#">File</a>
<ul>
<li><a onclick="wickedGrid.saveSheet(); return false;" title="Save the spreadsheet.">Save</a></li>
</ul>
</li>
<li>
<a href="#">Edit</a>
<ul>
<li><a onclick="wickedGridw.undo.undoManager.undo(); return false;">Undo</a></li>
<li><a onclick="wickedGrid.undo.undoManager.redo(); return false;">Redo</a></li>
<li><a onclick="wickedGrid.cellFind(); return false;">Find</a></li>
</ul>
</li>
<li>
<a menu="menuEditRow_menuInstance">Row</a>
<ul>
<li><a onclick="wickedGrid.addRow(true); return false;" title="Adds an additional row to bottom of the spreadsheet.">Add Row</a></li>
<li><a onclick="wickedGrid.addRowMulti(undefined, undefined, true); return false;" title="Adds an additional rows to bottom of the spreadsheet.">Add Multi-Rows</a></li>
<!--<li><a onclick="wickedGrid.deleteRow(); return false;" title="Deletes the current rows that are associated with highlighted cells.">Delete Row(s)</a></li>-->
<li><a onclick="wickedGrid.addRow(false, wickedGrid.cellLast.rowIndex); return false;" title="Inserts an additional row after currently selected row.">Insert Row Before</a></li>
<li><a onclick="wickedGrid.addRow(true, wickedGrid.cellLast.rowIndex); return false;" title="Inserts an additional row after currently selected row.">Insert Row After</a></li>
</ul>
</li>
<li>
<a menu="menuEditColumn_menuInstance">Column</a>
<ul>
<li><a onclick="wickedGrid.addColumn(true); return false;" title="Adds an additional column to the right of the spreadsheet.">Add Column</a></li>
<li><a onclick="wickedGrid.addColumnMulti(undefined, undefined, true); return false;" title="Adds an additional columns to the right of the spreadsheet.">Add Multi-Columns</a></li>
<!--<li><a onclick="wickedGrid.deleteColumn(); return false;" title="Deletes the current columns that are associated with highlighted cells.">Delete Column(s)</a></li>-->
<li><a onclick="wickedGrid.addColumn(false, wickedGrid.cellLast.columnIndex); return false;" title="Inserts an additional column after currently selected column.">Insert Column Before</a></li>
<li><a onclick="wickedGrid.addColumn(true, wickedGrid.cellLast.columnIndex); return false;" title="Inserts an additional column after currently selected column.">Insert Column After</a></li>
</ul>
</li>
<li>
<a>Sheet</a>
<ul>
<li><a onclick="wickedGrid.addSheet(); return false;" title="Add new spreadsheet.">Add Spreadsheet</a></li>
<li><a onclick="wickedGrid.deleteSheet(); return false;" title="Delete the current spreadsheet.">Delete Spreadsheet</a></li>
<!--<li><a onclick="wickedGrid.calc(); return false;" title="Re-Calculates the current sheet">Refresh Calculations</a></li>
<li><a onclick="wickedGrid.sheetTab(); return false;" title="Change the title of the sheet.">Title</a></li>
<li><a onclick="wickedGrid.toggleState(); return false;">Toggle Edit & ReadOnly</a></li>-->
</ul>
</li>
<li>
<a>Function Reference</a>
<ul>
<li>
<a href="#">Math & Standard</a>
<ul>
<li><a title="Returns the absolute value of a number">ABS()</a></li>
<li><a title="Returns a rounded number">AVG(), AVERAGE()</a></li>
<li><a title="Returns a number rounded up based on a multiple of significance">CEILING()</a></li>
<li><a title="Counts the number of cells that contain a value">COUNT()</a></li>
<li><a title="Counts full days from a specific date - format(YYYY,MM,DD)">DAYSFROM()</a></li>
<li><a title="Converts a number to text, using a currency format - options(number, decimals, symbol)">DOLLAR()</a></li>
<li><a title="Returns a logical value of FALSE">FALSE()</a></li>
<li><a title="Returns a text representation of a number rounded to a specified number of decimal places - options(number, decimals, useCommas)">FIXED()</a></li>
<li><a title="Returns a number rounded down based on a multiple of significance">FLOOR()</a></li>
<li><a title="Creates and executes a javascript function. example: FN(alert('Hello World')), this will execute when sheet compiles.">FN()</a></li>
<li><a title="Returns the integer portion of a number">INT()</a></li>
<li><a title="Returns the largest value from the numbers provided">MAX()</a></li>
<li><a title="Returns the smallest value from the numbers provided">MIN()</a></li>
<li><a title="Converts a value to a number">N()</a></li>
<li><a title="Gets full date of today">NOW()</a></li>
<li><a title="Returns the mathematical constant called pi, which is 3.14159265358979">PI()</a></li>
<li><a title="Returns the result of a number raised to a given power">POWER(x, y)</a></li>
<li><a title="Returns a random number that is greater than or equal to 0 and less than 1">RAND(), RND()</a></li>
<li><a title="Returns a number rounded to a specified number of digits">ROUND()</a></li>
<li><a title="Returns all of the values in each of the specified cells and added together">SUM()</a></li>
<li><a title="Gets full date of today">TODAY()</a></li>
<li><a title="Returns a logical value of TRUE">TRUE()</a></li>
<li><a title="Converts a text value that represents a number to a number">VALUE()</a></li>
</ul>
</li>
<li>
<a href="#">Chart</a>
<ul>
<li><a href="#" title="Simple verticle style bar chart.">BARCHART()</a></li>
<li><a href="#" title="Simple horizontal style bar chart.">HBARCHART()</a></li>
<li><a href="#" title="Simple line style bar chart.">LINECHART()</a></li>
<li><a href="#" title="Simple pie style bar chart.">PIECHART()</a></li>
</ul>
</li>
<li>
<a href="#">Inputs</a>
<ul>
<li><a href="#">DROPDOWN()</a></li>
<li><a href="#">RADIO()</a></li>
<li><a href="#">CHECKBOX()</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<ul class="nav navbar-nav" style="float:left; display: block; z-index:-10; left: 9px; width: 100%;">
<a href="#" onclick="wickedGrid.cellStyleToggle('style-bold'); return false;" title="Bold">
<img alt="Bold" src="jquery-sheets/images/bold13.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-italics'); return false;" title="Italic">
<img alt="Italic" src="jquery-sheets/images/italic3.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-underline', 'style-line-through'); return false;" title="Underline">
<img alt="Underline" src="jquery-sheets/images/underline1.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-line-through', 'style-underline'); return false;" title="Strike Through">
<img alt="Strike Through" src="jquery-sheets/images/strikethrough.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-left', 'style-center style-right'); return false;" title="Align Left">
<img alt="Align Left" src="jquery-sheets/images/left181.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-center', 'style-left style-right'); return false;" title="Align Center">
<img alt="Align Center" src="jquery-sheets/images/centered5.svg"/></a>
<a href="#" onclick="wickedGrid.cellStyleToggle('style-right', 'style-left style-center'); return false;" title="Align Right">
<img alt="Align Right" src="jquery-sheets/images/right183.svg"/></a>
</ul>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DTMLDocument" module="OFS.DTMLDocument"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>menu.html</string> </value>
</item>
<item>
<key> <string>_vars</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>globals</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<div style="padding-left: 1em; height: 45px;">
<!--div class="btn-group ">
<div class="btn-group">
<button data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa">File <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#" onclick="wickedGrid.newSheet(); return false;" title="new spreadsheet">New</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa">Edit <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a onclick="wickedGrid.undo(); return false;">Undo</a></li>
<li><a onclick="wickedGrid.redo(); return false;">Redo</a></li>
<li><a class="wg-cut">Cut</a></li>
<li><a class="wg-copy">Copy</a></li>
<li><a class="wg-paste">Paste</a></li>
<li><a onclick="wickedGrid.merge(); return false;">Merge</a></li>
<li><a onclick="wickedGrid.unmerge(); return false;">Un-Merge</a></li>
<li><a onclick="wickedGrid.find(); return false;">Find</a></li>
<li>
<a href="#">Cell</a>
<ul>
<li><a onclick="wickedGrid.setCellRef(); return false;">Set Reference</a></li>
</ul>
</li>
<li>
<a>Row</a>
<ul>
<li><a onclick="wickedGrid.addRow(); return false;" title="Adds an additional row to bottom of the spreadsheet.">Add Row</a></li>
<li><a onclick="wickedGrid.addRowMulti(); return false;" title="Adds an additional rows to bottom of the spreadsheet.">Add Multi-Rows</a></li>
<li><a onclick="wickedGrid.deleteRow(); return false;" title="Deletes the current rows that are associated with highlighted cells.">Delete Row(s)</a></li>
<li><a onclick="wickedGrid.addRow(wickedGrid.cellLast.row, true); return false;" title="Inserts an additional row after currently selected row.">Insert Row Before</a></li>
<li><a onclick="wickedGrid.addRow(wickedGrid.cellLast.row); return false;" title="Inserts an additional row after currently selected row.">Insert Row After</a></li>
<li><a onclick="wickedGrid.rowShowAll();" title="Show all the hidden rows.">Show All</a></li>
<li><a onclick="wickedGrid.toggleHideRow();" title="Hides or shows the currently selected row.">Toggle Hide Row</a></li>
</ul>
</li>
<li>
<a>Column</a>
<ul>
<li><a onclick="wickedGrid.addColumn(); return false;" title="Adds an additional column to the right of the spreadsheet.">Add Column</a></li>
<li><a onclick="wickedGrid.addColumnMulti(); return false;" title="Adds an additional columns to the right of the spreadsheet.">Add Multi-Columns</a></li>
<li><a onclick="wickedGrid.deleteColumn(); return false;" title="Deletes the current columns that are associated with highlighted cells.">Delete Column(s)</a></li>
<li><a onclick="wickedGrid.addColumn(wickedGrid.cellLast.col, true); return false;" title="Inserts an additional column after currently selected column.">Insert Column Before</a></li>
<li><a onclick="wickedGrid.addColumn(wickedGrid.cellLast.col); return false;" title="Inserts an additional column after currently selected column.">Insert Column After</a></li>
<li><a onclick="wickedGrid.fillUpOrDown(); return false;" title="Fill down current cell value.">Fill Down</a></li>
<li><a onclick="wickedGrid.fillUpOrDown(true); return false;" title="Fill up current cell value.">Fill Up</a></li>
<li><a onclick="wickedGrid.columnShowAll();" title="Show all the hidden columns.">Show All</a></li>
<li><a onclick="wickedGrid.toggleHideColumn();" title="Hides or shows the currently selected column.">Toggle Hide Column</a></li>
</ul>
</li>
<li>
<a>Sheet</a>
<ul>
<li><a onclick="wickedGrid.addSheet(); return false;" title="Add new spreadsheet.">Add Spreadsheet</a></li>
<li><a onclick="wickedGrid.deleteSheet(); return false;" title="Delete the current spreadsheet.">Delete Spreadsheet</a></li>
<li><a onclick="wickedGrid.calc(); return false;" title="Re-Calculates the current sheet">Refresh Calculations</a></li>
<li><a onclick="wickedGrid.sheetTab(); return false;" title="Change the title of the sheet.">Title</a></li>
<li><a onclick="wickedGrid.toggleState(); return false;">Toggle Edit & ReadOnly</a></li>
</ul>
</li>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val()); return false;">Get Cell Range</a></li>
<li>
<a href="#">Wrap Cell Range</a>
<ul>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val(), 'SUM'); return false;" title="Wrap with SUM">SUM()</a></li>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val(), 'CEILING'); return false;" title="Wrap with CEILING">CEILING()</a></li>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val(), 'COUNT'); return false;" title="Wrap with COUNT">COUNT()</a></li>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val(), 'MAX'); return false;" title="Wrap with MAX">MAX()</a></li>
<li><a onclick="wickedGrid.getTdRange(null, wickedGrid.formula().val(), 'MIN'); return false;" title="Wrap with MIN">MIN()</a></li>
</ul>
</li>
</ul>
</div>
<div class="btn-group">
<button type="button" data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa">View <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#" onclick="wickedGrid.newSheet(); return false;" title="Creates a new spreadsheet.">New</a></li>
</ul>
</div>
<div class="btn-group">
<button type="button" data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa">Format <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a href="#" onclick="wickedGrid.newSheet(); return false;" title="Creates a new spreadsheet.">New</a></li>
</ul>
</div>
</div>
<br-->
<div class="btn-group">
<button class="btn navbar-btn btn-default fa fa-print"></button>
<button class="btn navbar-btn btn-default fa fa-backward"></button>
<button class="btn navbar-btn btn-default fa fa-forward"></button>
</div>
<div class="btn-group">
<button class="btn navbar-btn btn-default fa fa-dollar"></button>
<button class="btn navbar-btn btn-default fa fa-percent"></button>
<div class="btn-group">
<button type="button" data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa"><small>123</small> <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a onclick="wickedGrid.undo(); return false;">Undo</a></li>
</ul>
</div>
</div>
<div class="btn-group">
<div class="btn-group">
<button type="button" data-toggle="dropdown" class="btn navbar-btn btn-default dropdown-toggle fa"><small>Arial</small> <span class="caret"></span></button>
<ul class="dropdown-menu">
<li><a onclick="wickedGrid.undo(); return false;">Arial</a></li>
</ul>
</div>
</div>
<div class="btn-group">
<button class="btn btn-default fa fa-bold" onclick="wickedGrid.cellStyleToggle('styleBold'); return false;" title="Bold"></button>
<button class="btn btn-default fa fa-italic" onclick="wickedGrid.cellStyleToggle('styleItalics'); return false;" title="Italic"></button>
<button class="btn btn-default fa fa-strikethrough"></button>
<button class="btn btn-default fa fa-underline" onclick="wickedGrid.cellStyleToggle('style-underline', 'style-strike'); return false;"></button>
<button class="btn btn-default fa fa-tint" title="font color"></button>
</div>
<div class="btn-group">
<button class="btn btn-default fa fa-paint-brush" title="background color"></button>
<button class="btn btn-default fa" title="merge cells"><span class="fa fa-compress fa-rotate-45"></span></button>
<button class="btn btn-default fa" title="un-merge cells"><span class="fa fa-expand fa-rotate-45"></span></button>
</div>
<div class="btn-group float-right">
<button class="btn navbar-btn btn-default fa fa-arrows-alt" title="toggle full screen" onclick="wickedGrid.toggleFullscreen()"></button>
</div>
</div>
\ No newline at end of file
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="DTMLDocument" module="OFS.DTMLDocument"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>menu_text.html</string> </value>
</item>
<item>
<key> <string>_vars</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>globals</string> </key>
<value>
<dictionary/>
</value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
/* Controls styling */
.wg-element .wg-loc {
border-width: 0 ! important;
background: none ! important;
width: 35px;
text-align: right;
padding: 0;
}
.wg-element .wg-formula {
width: 100%;
height: 22px;
font-weight: normal;
padding: 0;
outline: none;
resize: none;
}
.wg-element .wg-formula-element {
border: none ! important;
padding: 0;
}
.wg-element .wg-header, .wg-header table {
padding: 0 ! important;
border: none ! important;
width: 100%;
margin: 0;
border-radius: inherit;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.wg-header-menu {
width: 100%;
}
.wg-element .wg-header img {
border: none;
}
/* Menu */
.wg-element .wg-bar-helper {
height: 0;
border: none ! important;
width: 0;
}
.wg-element .wg-column-helper {
width: inherit ! important;
height: 0 ! important;
float: right;
margin-right: 30px;
}
.wg-element .wg-column-helper .wg-column-button {
position: absolute;
height: 16px ! important;
width: 18px ! important;
background-color: inherit ! important;
}
.wg-element .wg-column-helper .wg-menu {
right: 5px;
top: 18px;
text-align: left;
}
.wg-element .wg-menu-fixed {
position: relative ! important;
}
.wg-menu {
padding: 3px;
background-image: none ! important;
border-width: 1px;
position: absolute;
min-width: 200px;
font-size: smaller;
font-weight: normal ! important;
}
.wg-menu div {
border-width: 0 ! important;
cursor: pointer;
}
.wg-menu hr {
margin: 0;
}
#global-zeroclipboard-html-bridge {
opacity:0.01;
filter:alpha(opacity=1);
}
.wg-element .wg-ui {
width: inherit ! important;
border-color: inherit ! important;
}
.wg-element .wg-tab-container {
overflow-x: hidden;
height: 21px;
display: inline-block;
position: absolute;
margin-left: 19px;
}
.wg-element .wg-tab-container-scrollable {
overflow-x: auto;
}
.wg-element .wg-tab-container span {
border-width: 0 1px 0 1px;
padding: 2px 5px 2px 5px ! important;
cursor: pointer;
white-space: nowrap;
border-radius: 0;
height: 22px;
}
.wg-element .wg-sheet-adder {
border-width: 0 1px 0 0;
display: block;
position: absolute;
text-align: center;
width: 18px;
height: 20px;
border-bottom-left-radius: inherit;
}
.wg-element .wg-tab {
cursor: pointer;
}
.wg-element .wg-tab-container *, .div * {
font-size: 1em;
}
.wg-element .wg-scroll {
position: absolute;
overflow: scroll;
height: inherit;
width: inherit;
}
.wg-element .wg-scroll > div {
min-height: 1000%;
min-width: 500%;
height: 1000%;
width: 500%;
-webkit-transition: 0.2s; /* For Safari 3.1 to 6.0 */
transition: 0.2s;
}
/* Sheet styling */
.wg-element table.wg-table {
left: 0;
top: 0;
table-layout: fixed;
empty-cells: show;
background-image: none ! important;
border-color: inherit ! important;
border-width: 1px 1px 0 0 ! important;
cursor: cell;
width: 0 ! important;
}
.wg-element .wg-table tbody {
background-color: transparent;
color: inherit ! important;
border-color: inherit ! important;
}
.wg-element .wg-table colgroup {
border-color: inherit ! important;
}
.wg-element .wg-table col {
background-image: none ! important;
border-color: inherit ! important;
}
.wg-element .wg-table tr {
border-color: inherit ! important;
color: inherit ! important;
background-image: none ! important;
}
.wg-element .wg-table td, .wg-element .wg-table th {
height: inherit;
border-width: 0 0 1px 1px;
border-color: inherit;
padding: 0 ! important;
border-style: solid ! important;
margin: 0 ! important;
font-size: 1em;
background-image: none ! important;
-moz-border-radius: 0 0 1px 1px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
-ms-text-overflow: ellipsis;
}
.wg-element .wg-table td.wg-merged {
position: absolute;
visibility: hidden;
}
.wg-element .wg-table th.wg-corner {
border-width: 0 0 1px 0;
}
.wg-element .wg-table th.wg-row {
border-width: 0 0 1px 0;
}
.wg-element .wg-table tbody tr:first-child {
height: 22px;
}
.wg-element .wg-table th.wg-column {
border-width: 0 0 1px 1px;
text-align: center;
position: relative;
}
.wg-element .wg-table th.wg-column.wg-column-focus {
overflow: visible;
}
.wg-element .wg-cell-highighted {
background-image: none ! important;
}
.wg-element .wg-error {
text-align: left;
overflow: hidden;
padding: 0;
margin: 0;
}
/* Containers styleing*/
.wg-element th {
cursor: pointer;
}
.wg-element .wg-edit-pane {
position: relative;
overflow: hidden;
background-image: none ! important;
border-width: 0 ! important;
padding: 0;
margin: 0;
border-radius: 0 !important;
}
.wg-element .wg-enclosure {
border-width: 0 ! important;
}
/* column resizing functionality & overrides */
.wg-element .wg-bar-controller {
border: none ! important;
position: absolute ! important;
}
.wg-element .wg-column .wg-bar-controller {
height: 0 !important;
max-height: 0 !important;
position: relative;
}
.wg-element .wg-column .wg-bar-controller .ui-resizable-handle {
width: 10px;
top: -1px !important;
right: -6px;
border-top-width: 0;
border-bottom-width: 0;
cursor: ew-resize ! important;
position: absolute;
background-color: transparent !important;
}
/* row resizing functionality & overrides */
.wg-element .wg-row {
border-left-width: 0 ! important;
position: relative;
}
.wg-element .wg-row .wg-bar-controller {
height: 0 !important;
position: static !important;
}
.wg-element .wg-row .wg-bar-controller .wg-bar-controller-child {
display: block;
position: absolute;
background-color: transparent !important;
}
.wg-element .wg-row .wg-bar-controller .wg-bar-controller-child .ui-resizable-handle {
position: absolute;
bottom: 0;
height: 10px;
border: none ! important;
padding-left:1px;
cursor: ns-resize !important;
}
.wg-element .wg-bar-controller .ui-resizable-handle {
border-width: 0;
}
.wg-element .wg-bar-controller .ui-resizable-handle:hover {
background: inherit;
}
.wg-element .wg-bar-controller-child {
background: inherit;
left: 0;
}
.wg-element .wg-bar-controller-child .ui-resizable-handle {
border-left-width: 1px;
border-right-width: 1px;
}
.wg-element .wg-column-freeze-handle {
top: 1px;
cursor: move ! important;
width: 10px;
position: absolute;
background-image: none ! important;
}
.wg-element .wg-row-freeze-handle {
left: 0;
cursor: move ! important;
height: 10px;
position: absolute;
background-image: none ! important;
}
.wg-element .wg-row {
text-align: center;
vertical-align: middle ! important;
cursor: pointer ! important;
overflow: visible ! important;
}
textarea.wg-in-place-edit {
position: absolute;
background-image: none ! important;
padding: 0;
}
.colorPickers * {
display: inline-block;
background-color: transparent ! important;
background-image: none ! important;
}
.wg-full-screen {
top: 0;
left: 0;
position: fixed;
top: expression(eval(document.body.scrollTop) + "px");
left: expression(eval(document.body.scrollLeft) + "px");
}
.wg-full-screen > .ui-resizable-handle {
display: none;
}
.wg-element .wg-auto-filler {
position: absolute;
height: 8px;
width: 8px;
top: 0;
left: 0;
cursor: crosshair ! important;
display: none;
}
.wg-element .wg-title {
width: auto;
text-align: left;
border: none ! important;
margin: 0 !important;
padding: 10px;
}
body > .wg-chart {
opacity: 0.01;
position: absolute;
top: -9000px;
left: -9000px;
}
.wg-element .wg-chart {
width: inherit;
height: inherit;
}
.wg-element .wg-chart svg {
position: relative ! important;
}
.wg-element .wg-dropdown {
cursor: pointer;
width: 100%;
}
.wg-element .wg-checkbox, .wg-checkbox * {
cursor: pointer;
}
.wg-element .wg-radio, .wg-radio * {
cursor: pointer;
}
.wg-element .wg-dropdown {
background-color: transparent;
border: none;
height: inherit;
width: inherit;
margin-right: -30px;
-webkit-appearance: none;
-moz-appearance: window;
padding-right: 30px;
}
.wg-hide {
display: none ! important;
}
.body-no-scroll {
overflow: hidden ! important;
}
/* Cell styler classes */
.style-bold { font-weight: bold; }
.style-italics { font-style: italic; }
.style-underline { text-decoration: underline; }
.style-line-through { text-decoration: line-through;}
.style-left { text-align: left; }
.style-right { text-align: right; }
.style-center { text-align: center; }
.style-top { vertical-align: top; }
.style-middle { vertical-align: middle; }
.style-bottom { vertical-align: bottom; }
.style-upper { text-transform: uppercase; }
.style-capital { text-transform: capitalize; }
.style-lower { text-transform: lowercase; }
.style-hidden { display: none; }
.style-wrap {
white-space: pre-wrap ! important; /* css-3 */
white-space: -moz-pre-wrap ! important; /* Mozilla, since 1999 */
white-space: -pre-wrap ! important; /* Opera 4-6 */
white-space: -o-pre-wrap ! important; /* Opera 7 */
word-wrap: break-word;
-ms-text-overflow: clip;
}
.wg-menu a,
.wg-menu .colorPickers div
{
padding: 0 5px;
width: auto !important;
}
.wg-menu img,
.wg-menu .colorPickers div img
{
width: 15px;
}
.wg-menu a {
padding-top:4px ! important;
padding-bottom:4px ! important;
}
.wg-menu {
padding: 3px;
background-image: none ! important;
border: none ! important;
position: absolute;
z-index: 1001;
}
.wg-menu *
{
border-color: inherit ! important;
border-width: 1px;
text-decoration: none ! important;
width: auto;
}
.wg-menu ul,.wg-menu div
{
cursor: pointer;
padding: 3 ! important;
margin: 0 ! important;
border: none ! important;
z-index: 1001;
position:relative;
margin:0;
padding:0;
list-style:none;
list-style-position:outside;
}
.wg-menu a
{
padding:0px 5px;
right: 5px;
}
.wg-menu li
{
float:left;
position:relative;
border: none;
background-image: none;
border-width: 1px;
width: inherit;
background: rgb(239, 238, 238);
left: 6px;
}
.wg-menu li:hover,.wg-menu div:hover .wg-td-menu div:hover {
background-image: inherit;
}
.wg-menu ul ul {
position:absolute;
display:none;
width:12em;
top:1.5em;
}
.wg-menu li ul a{
width:12em;
height:auto;
float:left;
}
.wg-menu ul ul{
top:auto;
}
.wg-menu li ul ul {
left:12em;
margin:0px 0 0 10px;
}
.wg-menu li:hover ul ul, .wg-menu li:hover ul ul ul, .wg-menu li:hover ul ul ul ul{
display:none;
}
.wg-menu li:hover ul, .wg-menu li li:hover ul, .wg-menu li li li:hover ul, .wg-menu li li li li:hover ul{
display:block;
}
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="File" module="OFS.Image"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>__name__</string> </key>
<value> <string>wickedgrid.css</string> </value>
</item>
<item>
<key> <string>content_type</string> </key>
<value> <string>text/css</string> </value>
</item>
<item>
<key> <string>precondition</string> </key>
<value> <string></string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
<?xml version="1.0"?>
<ZopeData>
<record id="1" aka="AAAAAAAAAAE=">
<pickle>
<global name="Folder" module="OFS.Folder"/>
</pickle>
<pickle>
<dictionary>
<item>
<key> <string>_objects</string> </key>
<value>
<tuple/>
</value>
</item>
<item>
<key> <string>id</string> </key>
<value> <string>js</string> </value>
</item>
<item>
<key> <string>title</string> </key>
<value> <string></string> </value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
web_page_module/gadget_image_editor_*
web_page_module/gadget_web_table*
web_site_module/officejs_image_editor
web_site_module/officejs_image_editor/**
web_site_module/officejs_image_editor_gadget
web_site_module/officejs_image_editor_gadget/**
\ No newline at end of file
web_site_module/officejs_image_editor_gadget/**
web_site_module/officejs_web_table_editor
web_site_module/officejs_web_table_editor/**
web_site_module/officejs_web_table_editor_gadget
web_site_module/officejs_web_table_editor_gadget/**
\ No newline at end of file
web_page_module/gadget_image_editor_*
web_page_module/gadget_web_table*
web_site_module/officejs_image_editor
web_site_module/officejs_image_editor/**
web_site_module/officejs_image_editor_gadget
web_site_module/officejs_image_editor_gadget/**
\ No newline at end of file
web_site_module/officejs_image_editor_gadget/**
web_site_module/officejs_web_table_editor
web_site_module/officejs_web_table_editor/**
web_site_module/officejs_web_table_editor_gadget
web_site_module/officejs_web_table_editor_gadget/**
\ No newline at end of file
web_page_module/gadget_image_editor_*
web_page_module/gadget_web_table*
web_site_module/officejs_image_editor
web_site_module/officejs_image_editor/**
web_site_module/officejs_image_editor_gadget
web_site_module/officejs_image_editor_gadget/**
\ No newline at end of file
web_site_module/officejs_image_editor_gadget/**
web_site_module/officejs_web_table_editor
web_site_module/officejs_web_table_editor/**
web_site_module/officejs_web_table_editor_gadget
web_site_module/officejs_web_table_editor_gadget/**
\ No newline at end of file
erp5_officejs_image_editor | RJSVersioning
\ No newline at end of file
erp5_officejs_jquery_app | RJSVersioning
\ No newline at end of file
erp5_officejs_image_editor
\ No newline at end of file
erp5_officejs_jquery_app
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment