diff --git a/sdkjs-plugins/content/propact/3rd-Party.txt b/sdkjs-plugins/content/propact/3rd-Party.txt
new file mode 100755
index 000000000..aa030cb0e
--- /dev/null
+++ b/sdkjs-plugins/content/propact/3rd-Party.txt
@@ -0,0 +1,7 @@
+This plugin uses code from the following 3rd party projects.
+
+
+1. jQuery - Query is a fast and concise JavaScript Library that simplifies HTML document traversing, event handling, animating, and Ajax interactions for rapid web development. (http://jquery.com/)
+
+License: MIT License
+License File: jQuery.license
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/LICENSE b/sdkjs-plugins/content/propact/LICENSE
new file mode 100755
index 000000000..a4f9de337
--- /dev/null
+++ b/sdkjs-plugins/content/propact/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 ONLYOFFICE
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/sdkjs-plugins/content/propact/README.md b/sdkjs-plugins/content/propact/README.md
new file mode 100755
index 000000000..3736940b3
--- /dev/null
+++ b/sdkjs-plugins/content/propact/README.md
@@ -0,0 +1,17 @@
+## Overview
+
+This plugin shows how to get content controls (automatically or manually), navigation content controls, select and paste text.
+
+It is called "Example work with content controls navigation" in the interface and isn't installed by default in cloud, [self-hosted](https://github.com/ONLYOFFICE/DocumentServer) and [desktop version](https://github.com/ONLYOFFICE/DesktopEditors) of ONLYOFFICE editors.
+
+## How to use
+
+1. Open the Plugins tab and press "Example work with content controls navigation". You need to add some content controls into document (you can do it before or after the plugin was started).
+2. In the first field you can see all content controls (it is updated automatically). To move to a specific content control, click on it in the list. (It was selected automatically).
+3. Press the "Past "Test paste for document"" for paste text into document (where the cursor localed).
+4. In the second field you can see selected content.
+5. The third field is the same as the first, but it is updated manually (press the "Get All Content Controls" button).
+6. You can click on some content control in document and fhe first and third fields show you the selected content controls.
+7. If you nee select text in content constol - select some content control and press the "Select Current Content Control" button.
+
+If you need more information about how to use or write your own plugin, please see this https://api.onlyoffice.com/plugin/basic
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/config.json b/sdkjs-plugins/content/propact/config.json
new file mode 100755
index 000000000..e0688e220
--- /dev/null
+++ b/sdkjs-plugins/content/propact/config.json
@@ -0,0 +1,52 @@
+{
+ "name" : "ProPact",
+ "guid" : "asc.{C36NCMB5-08F0-4A68-B829-5F1F7D488588}",
+ "autostart": true,
+ "isAutoStart": true,
+ "autoStart": true,
+ "variations" : [
+ {
+ "description" : "ProPact's agile workflow drives efficiency, accountability and trust into legal and commercial document negotiation.",
+ "url" : "index.html",
+ "icons": [ "resources/light/icon.png", "resources/light/icon@2x.png" ],
+ "icons2": [
+ {
+ "style" : "light",
+ "100%": {
+ "normal": "resources/light/icon.png"
+ },
+ "200%": {
+ "normal": "resources/light/icon@2x.png"
+ }
+ },
+ {
+ "style" : "dark",
+ "100%": {
+ "normal": "resources/dark/icon.png"
+ },
+ "200%": {
+ "normal": "resources/dark/icon@2x.png"
+ }
+ }
+ ],
+ "isViewer" : false,
+ "EditorsSupport" : ["word"],
+
+ "isVisual" : true,
+ "isModal" : false,
+ "isInsideMode" : true,
+
+ "initDataType" : "text",
+ "initData" : "",
+ "size" : [485, 712],
+
+ "isUpdateOleOnResize" : false,
+
+ "buttons" : [],
+
+ "initOnSelectionChanged" : true,
+
+ "events" : ["onTargetPositionChanged"]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/fonts/FontAwesome.otf b/sdkjs-plugins/content/propact/fonts/FontAwesome.otf
new file mode 100755
index 000000000..401ec0f36
Binary files /dev/null and b/sdkjs-plugins/content/propact/fonts/FontAwesome.otf differ
diff --git a/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.eot b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.eot
new file mode 100755
index 000000000..e9f60ca95
Binary files /dev/null and b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.eot differ
diff --git a/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.svg b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.svg
new file mode 100755
index 000000000..855c845e5
--- /dev/null
+++ b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
+
+Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016
+ By ,,,
+Copyright Dave Gandy 2016. All rights reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.ttf b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.ttf
new file mode 100755
index 000000000..35acda2fa
Binary files /dev/null and b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.ttf differ
diff --git a/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff
new file mode 100755
index 000000000..400014a4b
Binary files /dev/null and b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff differ
diff --git a/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff2 b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff2
new file mode 100755
index 000000000..4d13fc604
Binary files /dev/null and b/sdkjs-plugins/content/propact/fonts/fontawesome-webfont.woff2 differ
diff --git a/sdkjs-plugins/content/propact/images/Polygon_icon.svg b/sdkjs-plugins/content/propact/images/Polygon_icon.svg
new file mode 100755
index 000000000..5050a03af
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/Polygon_icon.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/ajax-loader.gif b/sdkjs-plugins/content/propact/images/ajax-loader.gif
new file mode 100755
index 000000000..e2cdecfd5
Binary files /dev/null and b/sdkjs-plugins/content/propact/images/ajax-loader.gif differ
diff --git a/sdkjs-plugins/content/propact/images/attach-icon.svg b/sdkjs-plugins/content/propact/images/attach-icon.svg
new file mode 100644
index 000000000..800940c9b
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/attach-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/calender-add.svg b/sdkjs-plugins/content/propact/images/calender-add.svg
new file mode 100644
index 000000000..d4f6581b4
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/calender-add.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/chat-header-icon1.svg b/sdkjs-plugins/content/propact/images/chat-header-icon1.svg
new file mode 100755
index 000000000..bed6c51b6
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/chat-header-icon1.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/chat-header-icon2-old.svg b/sdkjs-plugins/content/propact/images/chat-header-icon2-old.svg
new file mode 100755
index 000000000..db76f2316
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/chat-header-icon2-old.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/chat-header-icon2.svg b/sdkjs-plugins/content/propact/images/chat-header-icon2.svg
new file mode 100644
index 000000000..a485eb2fb
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/chat-header-icon2.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/chat-header-icon3.svg b/sdkjs-plugins/content/propact/images/chat-header-icon3.svg
new file mode 100755
index 000000000..048a9aba4
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/chat-header-icon3.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/chat-header-icon4.svg b/sdkjs-plugins/content/propact/images/chat-header-icon4.svg
new file mode 100755
index 000000000..2ee2b0ce3
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/chat-header-icon4.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/check-circle.svg b/sdkjs-plugins/content/propact/images/check-circle.svg
new file mode 100755
index 000000000..78778ad18
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/check-circle.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/close.svg b/sdkjs-plugins/content/propact/images/close.svg
new file mode 100755
index 000000000..5f005b420
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/close.svg
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/file-right.svg b/sdkjs-plugins/content/propact/images/file-right.svg
new file mode 100644
index 000000000..7545fcbd1
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/file-right.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/icon-info.png b/sdkjs-plugins/content/propact/images/icon-info.png
new file mode 100644
index 000000000..002370639
Binary files /dev/null and b/sdkjs-plugins/content/propact/images/icon-info.png differ
diff --git a/sdkjs-plugins/content/propact/images/icon-info.svg b/sdkjs-plugins/content/propact/images/icon-info.svg
new file mode 100644
index 000000000..81de4ee2c
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/icon-info.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/icon-search.svg b/sdkjs-plugins/content/propact/images/icon-search.svg
new file mode 100755
index 000000000..76f060854
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/icon-search.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new-old.svg b/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new-old.svg
new file mode 100644
index 000000000..41ef39fc5
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new-old.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new.svg b/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new.svg
new file mode 100644
index 000000000..958a77d88
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/invite-user-btn-icon-new.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/invite-user-btn-icon.svg b/sdkjs-plugins/content/propact/images/invite-user-btn-icon.svg
new file mode 100755
index 000000000..bcd4d4247
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/invite-user-btn-icon.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/invite-user-icon.svg b/sdkjs-plugins/content/propact/images/invite-user-icon.svg
new file mode 100755
index 000000000..a14765f50
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/invite-user-icon.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/no-profile-image.jpg b/sdkjs-plugins/content/propact/images/no-profile-image.jpg
new file mode 100755
index 000000000..8d26be2d1
Binary files /dev/null and b/sdkjs-plugins/content/propact/images/no-profile-image.jpg differ
diff --git a/sdkjs-plugins/content/propact/images/org-placeholder.png b/sdkjs-plugins/content/propact/images/org-placeholder.png
new file mode 100755
index 000000000..7c07df8c3
Binary files /dev/null and b/sdkjs-plugins/content/propact/images/org-placeholder.png differ
diff --git a/sdkjs-plugins/content/propact/images/pdf-file-icon.svg b/sdkjs-plugins/content/propact/images/pdf-file-icon.svg
new file mode 100644
index 000000000..d2216592f
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/pdf-file-icon.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/pdf-link-icon.svg b/sdkjs-plugins/content/propact/images/pdf-link-icon.svg
new file mode 100644
index 000000000..a476c43e4
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/pdf-link-icon.svg
@@ -0,0 +1,3 @@
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/pending-icon.svg b/sdkjs-plugins/content/propact/images/pending-icon.svg
new file mode 100755
index 000000000..699870310
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/pending-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/plus.svg b/sdkjs-plugins/content/propact/images/plus.svg
new file mode 100755
index 000000000..c75f3c2f2
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/plus.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/position_confirmation.svg b/sdkjs-plugins/content/propact/images/position_confirmation.svg
new file mode 100755
index 000000000..77a38d38a
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/position_confirmation.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/profile-image.png b/sdkjs-plugins/content/propact/images/profile-image.png
new file mode 100755
index 000000000..07821228b
Binary files /dev/null and b/sdkjs-plugins/content/propact/images/profile-image.png differ
diff --git a/sdkjs-plugins/content/propact/images/schedule-meeting-icon.svg b/sdkjs-plugins/content/propact/images/schedule-meeting-icon.svg
new file mode 100755
index 000000000..3c4975b57
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/schedule-meeting-icon.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/schedule_meeting-icon.svg b/sdkjs-plugins/content/propact/images/schedule_meeting-icon.svg
new file mode 100755
index 000000000..119e186be
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/schedule_meeting-icon.svg
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/select_Icon.svg b/sdkjs-plugins/content/propact/images/select_Icon.svg
new file mode 100755
index 000000000..1b7286364
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/select_Icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/images/send-icon.svg b/sdkjs-plugins/content/propact/images/send-icon.svg
new file mode 100755
index 000000000..f81aaaa91
--- /dev/null
+++ b/sdkjs-plugins/content/propact/images/send-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/index.html b/sdkjs-plugins/content/propact/index.html
new file mode 100755
index 000000000..7c758c5e3
--- /dev/null
+++ b/sdkjs-plugins/content/propact/index.html
@@ -0,0 +1,1138 @@
+
+
+
+
+
+
+ ProPact
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/sdkjs-plugins/content/propact/plugin.json b/sdkjs-plugins/content/propact/plugin.json
new file mode 100644
index 000000000..3e40805d4
--- /dev/null
+++ b/sdkjs-plugins/content/propact/plugin.json
@@ -0,0 +1,46 @@
+{
+ "name": "ProPact",
+ "guid": "asc.{C36NCMB5-08F0-4A68-B829-5F1F7D488588}",
+ "variations": [
+ {
+ "description": "ProPact's agile workflow drives efficiency, accountability and trust into legal and commercial document negotiation.",
+ "url": "index.html",
+ "icons": [
+ "resources/light/icon.png",
+ "resources/light/icon@2x.png"
+ ],
+ "icons2": [
+ {
+ "style": "light",
+ "100%": {
+ "normal": "resources/light/icon.png"
+ },
+ "200%": {
+ "normal": "resources/light/icon@2x.png"
+ }
+ },
+ {
+ "style": "dark",
+ "100%": {
+ "normal": "resources/dark/icon.png"
+ },
+ "200%": {
+ "normal": "resources/dark/icon@2x.png"
+ }
+ }
+ ],
+ "isViewer": false,
+ "EditorsSupport": ["word"],
+ "isVisual": true,
+ "isModal": false,
+ "isInsideMode": true,
+ "initDataType": "text",
+ "initData": "",
+ "size": [485, 712],
+ "isUpdateOleOnResize": false,
+ "buttons": [],
+ "initOnSelectionChanged": true,
+ "events": ["onTargetPositionChanged"]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/resources/dark/icon.png b/sdkjs-plugins/content/propact/resources/dark/icon.png
new file mode 100755
index 000000000..34adc0c1e
Binary files /dev/null and b/sdkjs-plugins/content/propact/resources/dark/icon.png differ
diff --git a/sdkjs-plugins/content/propact/resources/dark/icon@2x.png b/sdkjs-plugins/content/propact/resources/dark/icon@2x.png
new file mode 100755
index 000000000..cc044674b
Binary files /dev/null and b/sdkjs-plugins/content/propact/resources/dark/icon@2x.png differ
diff --git a/sdkjs-plugins/content/propact/resources/light/icon.png b/sdkjs-plugins/content/propact/resources/light/icon.png
new file mode 100755
index 000000000..34adc0c1e
Binary files /dev/null and b/sdkjs-plugins/content/propact/resources/light/icon.png differ
diff --git a/sdkjs-plugins/content/propact/resources/light/icon@2x.png b/sdkjs-plugins/content/propact/resources/light/icon@2x.png
new file mode 100755
index 000000000..cc044674b
Binary files /dev/null and b/sdkjs-plugins/content/propact/resources/light/icon@2x.png differ
diff --git a/sdkjs-plugins/content/propact/scripts/jquery.atwho.min.js b/sdkjs-plugins/content/propact/scripts/jquery.atwho.min.js
new file mode 100644
index 000000000..857bb9312
--- /dev/null
+++ b/sdkjs-plugins/content/propact/scripts/jquery.atwho.min.js
@@ -0,0 +1 @@
+!function(t,e){"function"==typeof define&&define.amd?define(["jquery"],function(t){return e(t)}):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(this,function(t){var e,i;i={ESC:27,TAB:9,ENTER:13,CTRL:17,A:65,P:80,N:78,LEFT:37,UP:38,RIGHT:39,DOWN:40,BACKSPACE:8,SPACE:32},e={beforeSave:function(t){return r.arrayToDefaultHash(t)},matcher:function(t,e,i,n){var r,o,s,a,h;return t=t.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),i&&(t="(?:^|\\s)"+t),r=decodeURI("%C3%80"),o=decodeURI("%C3%BF"),h=n?" ":"",a=new RegExp(t+"([A-Za-z"+r+"-"+o+"0-9_"+h+"'.+-]*)$|"+t+"([^\\x00-\\xff]*)$","gi"),s=a.exec(e),s?s[2]||s[1]:null},filter:function(t,e,i){var n,r,o,s;for(n=[],r=0,s=e.length;s>r;r++)o=e[r],~new String(o[i]).toLowerCase().indexOf(t.toLowerCase())&&n.push(o);return n},remoteFilter:null,sorter:function(t,e,i){var n,r,o,s;if(!t)return e;for(n=[],r=0,s=e.length;s>r;r++)o=e[r],o.atwho_order=new String(o[i]).toLowerCase().indexOf(t.toLowerCase()),o.atwho_order>-1&&n.push(o);return n.sort(function(t,e){return t.atwho_order-e.atwho_order})},tplEval:function(t,e){var i,n,r;r=t;try{return"string"!=typeof t&&(r=t(e)),r.replace(/\$\{([^\}]*)\}/g,function(t,i,n){return e[i]})}catch(n){return i=n,""}},highlighter:function(t,e){var i;return e?(i=new RegExp(">\\s*([^<]*?)("+e.replace("+","\\+")+")([^<]*)\\s*<","ig"),t.replace(i,function(t,e,i,n){return"> "+e+""+i+" "+n+" <"})):t},beforeInsert:function(t,e,i){return t},beforeReposition:function(t){return t},afterMatchFailed:function(t,e){}};var n;n=function(){function e(e){this.currentFlag=null,this.controllers={},this.aliasMaps={},this.$inputor=t(e),this.setupRootElement(),this.listen()}return e.prototype.createContainer=function(e){var i;return null!=(i=this.$el)&&i.remove(),t(e.body).append(this.$el=t("
"))},e.prototype.setupRootElement=function(e,i){var n,r;if(null==i&&(i=!1),e)this.window=e.contentWindow,this.document=e.contentDocument||this.window.document,this.iframe=e;else{this.document=this.$inputor[0].ownerDocument,this.window=this.document.defaultView||this.document.parentWindow;try{this.iframe=this.window.frameElement}catch(r){if(n=r,this.iframe=null,t.fn.atwho.debug)throw new Error("iframe auto-discovery is failed.\nPlease use `setIframe` to set the target iframe manually.\n"+n)}}return this.createContainer((this.iframeAsRoot=i)?this.document:document)},e.prototype.controller=function(t){var e,i,n,r;if(this.aliasMaps[t])i=this.controllers[this.aliasMaps[t]];else{r=this.controllers;for(n in r)if(e=r[n],n===t){i=e;break}}return i?i:this.controllers[this.currentFlag]},e.prototype.setContextFor=function(t){return this.currentFlag=t,this},e.prototype.reg=function(t,e){var i,n;return n=(i=this.controllers)[t]||(i[t]=this.$inputor.is("[contentEditable]")?new l(this,t):new s(this,t)),e.alias&&(this.aliasMaps[e.alias]=t),n.init(e),this},e.prototype.listen=function(){return this.$inputor.on("compositionstart",function(t){return function(e){var i;return null!=(i=t.controller())&&i.view.hide(),t.isComposing=!0,null}}(this)).on("compositionend",function(t){return function(e){return t.isComposing=!1,setTimeout(function(e){return t.dispatch(e)}),null}}(this)).on("keyup.atwhoInner",function(t){return function(e){return t.onKeyup(e)}}(this)).on("keydown.atwhoInner",function(t){return function(e){return t.onKeydown(e)}}(this)).on("blur.atwhoInner",function(t){return function(e){var i;return(i=t.controller())?(i.expectedQueryCBId=null,i.view.hide(e,i.getOpt("displayTimeout"))):void 0}}(this)).on("click.atwhoInner",function(t){return function(e){return t.dispatch(e)}}(this)).on("scroll.atwhoInner",function(t){return function(){var e;return e=t.$inputor.scrollTop(),function(i){var n,r;return n=i.target.scrollTop,e!==n&&null!=(r=t.controller())&&r.view.hide(i),e=n,!0}}}(this)())},e.prototype.shutdown=function(){var t,e,i;i=this.controllers;for(t in i)e=i[t],e.destroy(),delete this.controllers[t];return this.$inputor.off(".atwhoInner"),this.$el.remove()},e.prototype.dispatch=function(t){var e,i,n,r;if(void 0!==t){n=this.controllers,r=[];for(e in n)i=n[e],r.push(i.lookUp(t));return r}},e.prototype.onKeyup=function(e){var n;switch(e.keyCode){case i.ESC:e.preventDefault(),null!=(n=this.controller())&&n.view.hide();break;case i.DOWN:case i.UP:case i.CTRL:case i.ENTER:t.noop();break;case i.P:case i.N:e.ctrlKey||this.dispatch(e);break;default:this.dispatch(e)}},e.prototype.onKeydown=function(e){var n,r;if(r=null!=(n=this.controller())?n.view:void 0,r&&r.visible())switch(e.keyCode){case i.ESC:e.preventDefault(),r.hide(e);break;case i.UP:e.preventDefault(),r.prev();break;case i.DOWN:e.preventDefault(),r.next();break;case i.P:if(!e.ctrlKey)return;e.preventDefault(),r.prev();break;case i.N:if(!e.ctrlKey)return;e.preventDefault(),r.next();break;case i.TAB:case i.ENTER:case i.SPACE:if(!r.visible())return;if(!this.controller().getOpt("spaceSelectsMatch")&&e.keyCode===i.SPACE)return;if(!this.controller().getOpt("tabSelectsMatch")&&e.keyCode===i.TAB)return;r.highlighted()?(e.preventDefault(),r.choose(e)):r.hide(e);break;default:t.noop()}},e}();var r,o=[].slice;r=function(){function i(e,i){this.app=e,this.at=i,this.$inputor=this.app.$inputor,this.id=this.$inputor[0].id||this.uid(),this.expectedQueryCBId=null,this.setting=null,this.query=null,this.pos=0,this.range=null,0===(this.$el=t("#atwho-ground-"+this.id,this.app.$el)).length&&this.app.$el.append(this.$el=t("
")),this.model=new u(this),this.view=new c(this)}return i.prototype.uid=function(){return(Math.random().toString(16)+"000000000").substr(2,8)+(new Date).getTime()},i.prototype.init=function(e){return this.setting=t.extend({},this.setting||t.fn.atwho["default"],e),this.view.init(),this.model.reload(this.setting.data)},i.prototype.destroy=function(){return this.trigger("beforeDestroy"),this.model.destroy(),this.view.destroy(),this.$el.remove()},i.prototype.callDefault=function(){var i,n,r,s;s=arguments[0],i=2<=arguments.length?o.call(arguments,1):[];try{return e[s].apply(this,i)}catch(r){return n=r,t.error(n+" Or maybe At.js doesn't have function "+s)}},i.prototype.trigger=function(t,e){var i,n;return null==e&&(e=[]),e.push(this),i=this.getOpt("alias"),n=i?t+"-"+i+".atwho":t+".atwho",this.$inputor.trigger(n,e)},i.prototype.callbacks=function(t){return this.getOpt("callbacks")[t]||e[t]},i.prototype.getOpt=function(t,e){var i,n;try{return this.setting[t]}catch(n){return i=n,null}},i.prototype.insertContentFor=function(e){var i,n;return n=this.getOpt("insertTpl"),i=t.extend({},e.data("item-data"),{"atwho-at":this.at}),this.callbacks("tplEval").call(this,n,i,"onInsert")},i.prototype.renderView=function(t){var e;return e=this.getOpt("searchKey"),t=this.callbacks("sorter").call(this,this.query.text,t.slice(0,1001),e),this.view.render(t.slice(0,this.getOpt("limit")))},i.arrayToDefaultHash=function(e){var i,n,r,o;if(!t.isArray(e))return e;for(o=[],i=0,r=e.length;r>i;i++)n=e[i],t.isPlainObject(n)?o.push(n):o.push({name:n});return o},i.prototype.lookUp=function(t){var e,i;if((!t||"click"!==t.type||this.getOpt("lookUpOnClick"))&&(!this.getOpt("suspendOnComposing")||!this.app.isComposing))return(e=this.catchQuery(t))?(this.app.setContextFor(this.at),(i=this.getOpt("delay"))?this._delayLookUp(e,i):this._lookUp(e),e):(this.expectedQueryCBId=null,e)},i.prototype._delayLookUp=function(t,e){var i,n;return i=Date.now?Date.now():(new Date).getTime(),this.previousCallTime||(this.previousCallTime=i),n=e-(i-this.previousCallTime),n>0&&e>n?(this.previousCallTime=i,this._stopDelayedCall(),this.delayedCallTimeout=setTimeout(function(e){return function(){return e.previousCallTime=0,e.delayedCallTimeout=null,e._lookUp(t)}}(this),e)):(this._stopDelayedCall(),this.previousCallTime!==i&&(this.previousCallTime=0),this._lookUp(t))},i.prototype._stopDelayedCall=function(){return this.delayedCallTimeout?(clearTimeout(this.delayedCallTimeout),this.delayedCallTimeout=null):void 0},i.prototype._generateQueryCBId=function(){return{}},i.prototype._lookUp=function(e){var i;return i=function(t,e){return t===this.expectedQueryCBId?e&&e.length>0?this.renderView(this.constructor.arrayToDefaultHash(e)):this.view.hide():void 0},this.expectedQueryCBId=this._generateQueryCBId(),this.model.query(e.text,t.proxy(i,this,this.expectedQueryCBId))},i}();var s,a=function(t,e){function i(){this.constructor=t}for(var n in e)h.call(e,n)&&(t[n]=e[n]);return i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype,t},h={}.hasOwnProperty;s=function(e){function i(){return i.__super__.constructor.apply(this,arguments)}return a(i,e),i.prototype.catchQuery=function(){var t,e,i,n,r,o,s;return e=this.$inputor.val(),t=this.$inputor.caret("pos",{iframe:this.app.iframe}),s=e.slice(0,t),r=this.callbacks("matcher").call(this,this.at,s,this.getOpt("startWithSpace"),this.getOpt("acceptSpaceBar")),n="string"==typeof r,n&&r.length0?t.getRangeAt(0):void 0},n.prototype._setRange=function(e,i,n){return null==n&&(n=this._getRange()),n&&i?(i=t(i)[0],"after"===e?(n.setEndAfter(i),n.setStartAfter(i)):(n.setEndBefore(i),n.setStartBefore(i)),n.collapse(!1),this._clearRange(n)):void 0},n.prototype._clearRange=function(t){var e;return null==t&&(t=this._getRange()),e=this.app.window.getSelection(),null==this.ctrl_a_pressed?(e.removeAllRanges(),e.addRange(t)):void 0},n.prototype._movingEvent=function(t){var e;return"click"===t.type||(e=t.which)===i.RIGHT||e===i.LEFT||e===i.UP||e===i.DOWN},n.prototype._unwrap=function(e){var i;return e=t(e).unwrap().get(0),(i=e.nextSibling)&&i.nodeValue&&(e.nodeValue+=i.nodeValue,t(i).remove()),e},n.prototype.catchQuery=function(e){var n,r,o,s,a,h,l,u,c,p,f,d;if((d=this._getRange())&&d.collapsed){if(e.which===i.ENTER)return(r=t(d.startContainer).closest(".atwho-query")).contents().unwrap(),r.is(":empty")&&r.remove(),(r=t(".atwho-query",this.app.document)).text(r.text()).contents().last().unwrap(),void this._clearRange();if(/firefox/i.test(navigator.userAgent)){if(t(d.startContainer).is(this.$inputor))return void this._clearRange();e.which===i.BACKSPACE&&d.startContainer.nodeType===document.ELEMENT_NODE&&(c=d.startOffset-1)>=0?(o=d.cloneRange(),o.setStart(d.startContainer,c),t(o.cloneContents()).contents().last().is(".atwho-inserted")&&(a=t(d.startContainer).contents().get(c),this._setRange("after",t(a).contents().last()))):e.which===i.LEFT&&d.startContainer.nodeType===document.TEXT_NODE&&(n=t(d.startContainer.previousSibling),n.is(".atwho-inserted")&&0===d.startOffset&&this._setRange("after",n.contents().last()))}if(t(d.startContainer).closest(".atwho-inserted").addClass("atwho-query").siblings().removeClass("atwho-query"),(r=t(".atwho-query",this.app.document)).length>0&&r.is(":empty")&&0===r.text().length&&r.remove(),this._movingEvent(e)||r.removeClass("atwho-inserted"),r.length>0)switch(e.which){case i.LEFT:return this._setRange("before",r.get(0),d),void r.removeClass("atwho-query");case i.RIGHT:return this._setRange("after",r.get(0).nextSibling,d),void r.removeClass("atwho-query")}if(r.length>0&&(f=r.attr("data-atwho-at-query"))&&(r.empty().html(f).attr("data-atwho-at-query",null),this._setRange("after",r.get(0),d)),o=d.cloneRange(),o.setStart(d.startContainer,0),u=this.callbacks("matcher").call(this,this.at,o.toString(),this.getOpt("startWithSpace"),this.getOpt("acceptSpaceBar")),h="string"==typeof u,0===r.length&&h&&(s=d.startOffset-this.at.length-u.length)>=0&&(d.setStart(d.startContainer,s),r=t(" ",this.app.document).attr(this.getOpt("editableAtwhoQueryAttrs")).addClass("atwho-query"),d.surroundContents(r.get(0)),l=r.contents().last().get(0),l&&(/firefox/i.test(navigator.userAgent)?(d.setStart(l,l.length),d.setEnd(l,l.length),this._clearRange(d)):this._setRange("after",l,d))),!(h&&u.length=0&&(this._movingEvent(e)&&r.hasClass("atwho-inserted")?r.removeClass("atwho-query"):!1!==this.callbacks("afterMatchFailed").call(this,this.at,r)&&this._setRange("after",this._unwrap(r.text(r.text()).contents().first()))),null)}},n.prototype.rect=function(){var e,i,n;return n=this.query.el.offset(),n&&this.query.el[0].getClientRects().length?(this.app.iframe&&!this.app.iframeAsRoot&&(i=(e=t(this.app.iframe)).offset(),n.left+=i.left-this.$inputor.scrollLeft(),n.top+=i.top-this.$inputor.scrollTop()),n.bottom=n.top+this.query.el.height(),n):void 0},n.prototype.insert=function(t,e){var i,n,r,o,s;return this.$inputor.is(":focus")||this.$inputor.focus(),n=this.getOpt("functionOverrides"),n.insert?n.insert.call(this,t,e):(o=""===(o=this.getOpt("suffix"))?o:o||"Â ",i=e.data("item-data"),this.query.el.removeClass("atwho-query").addClass("atwho-inserted").html(t).attr("data-atwho-at-query",""+i["atwho-at"]+this.query.text).attr("contenteditable","false"),(r=this._getRange())&&(this.query.el.length&&r.setEndAfter(this.query.el[0]),r.collapse(!1),r.insertNode(s=this.app.document.createTextNode(""+o)),this._setRange("after",s,r)),this.$inputor.is(":focus")||this.$inputor.focus(),this.$inputor.change())},n}(r);var u;u=function(){function e(t){this.context=t,this.at=this.context.at,this.storage=this.context.$inputor}return e.prototype.destroy=function(){return this.storage.data(this.at,null)},e.prototype.saved=function(){return this.fetch()>0},e.prototype.query=function(t,e){var i,n,r;return n=this.fetch(),r=this.context.getOpt("searchKey"),n=this.context.callbacks("filter").call(this.context,t,n,r)||[],i=this.context.callbacks("remoteFilter"),n.length>0||!i&&0===n.length?e(n):i.call(this.context,t,e)},e.prototype.fetch=function(){return this.storage.data(this.at)||[]},e.prototype.save=function(t){return this.storage.data(this.at,this.context.callbacks("beforeSave").call(this.context,t||[]))},e.prototype.load=function(t){return!this.saved()&&t?this._load(t):void 0},e.prototype.reload=function(t){return this._load(t)},e.prototype._load=function(e){return"string"==typeof e?t.ajax(e,{dataType:"json"}).done(function(t){return function(e){return t.save(e)}}(this)):this.save(e)},e}();var c;c=function(){function e(e){this.context=e,this.$el=t(""),this.$elUl=this.$el.children(),this.timeoutID=null,this.context.$el.append(this.$el),this.bindEvent()}return e.prototype.init=function(){var t,e;return e=this.context.getOpt("alias")||this.context.at.charCodeAt(0),t=this.context.getOpt("headerTpl"),t&&1===this.$el.children().length&&this.$el.prepend(t),this.$el.attr({id:"at-view-"+e})},e.prototype.destroy=function(){return this.$el.remove()},e.prototype.bindEvent=function(){var e,i,n;return e=this.$el.find("ul"),i=0,n=0,e.on("mousemove.atwho-view","li",function(r){return function(r){var o;if((i!==r.clientX||n!==r.clientY)&&(i=r.clientX,n=r.clientY,o=t(r.currentTarget),!o.hasClass("cur")))return e.find(".cur").removeClass("cur"),o.addClass("cur")}}(this)).on("click.atwho-view","li",function(i){return function(n){return e.find(".cur").removeClass("cur"),t(n.currentTarget).addClass("cur"),i.choose(n),n.preventDefault()}}(this))},e.prototype.visible=function(){return t.expr.filters.visible(this.$el[0])},e.prototype.highlighted=function(){return this.$el.find(".cur").length>0},e.prototype.choose=function(t){var e,i;return(e=this.$el.find(".cur")).length&&(i=this.context.insertContentFor(e),this.context._stopDelayedCall(),this.context.insert(this.context.callbacks("beforeInsert").call(this.context,i,e,t),e),this.context.trigger("inserted",[e,t]),this.hide(t)),this.context.getOpt("hideWithoutSuffix")?this.stopShowing=!0:void 0},e.prototype.reposition=function(e){var i,n,r,o;return i=this.context.app.iframeAsRoot?this.context.app.window:window,e.bottom+this.$el.height()-t(i).scrollTop()>t(i).height()&&(e.bottom=e.top-this.$el.height()),e.left>(r=t(i).width()-this.$el.width()-5)&&(e.left=r),n={left:e.left,top:e.bottom},null!=(o=this.context.callbacks("beforeReposition"))&&o.call(this.context,n),this.$el.offset(n),this.context.trigger("reposition",[n])},e.prototype.next=function(){var t,e,i,n;return t=this.$el.find(".cur").removeClass("cur"),e=t.next(),e.length||(e=this.$el.find("li:first")),e.addClass("cur"),i=e[0],n=i.offsetTop+i.offsetHeight+(i.nextSibling?i.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,n-this.$el.height()))},e.prototype.prev=function(){var t,e,i,n;return t=this.$el.find(".cur").removeClass("cur"),i=t.prev(),i.length||(i=this.$el.find("li:last")),i.addClass("cur"),n=i[0],e=n.offsetTop+n.offsetHeight+(n.nextSibling?n.nextSibling.offsetHeight:0),this.scrollTop(Math.max(0,e-this.$el.height()))},e.prototype.scrollTop=function(t){var e;return e=this.context.getOpt("scrollDuration"),e?this.$elUl.animate({scrollTop:t},e):this.$elUl.scrollTop(t)},e.prototype.show=function(){var t;return this.stopShowing?void(this.stopShowing=!1):(this.visible()||(this.$el.show(),this.$el.scrollTop(0),this.context.trigger("shown")),(t=this.context.rect())?this.reposition(t):void 0)},e.prototype.hide=function(t,e){var i;if(this.visible())return isNaN(e)?(this.$el.hide(),this.context.trigger("hidden",[t])):(i=function(t){return function(){return t.hide()}}(this),clearTimeout(this.timeoutID),this.timeoutID=setTimeout(i,e))},e.prototype.render=function(e){var i,n,r,o,s,a,h;if(!(t.isArray(e)&&e.length>0))return void this.hide();for(this.$el.find("ul").empty(),n=this.$el.find("ul"),h=this.context.getOpt("displayTpl"),r=0,s=e.length;s>r;r++)o=e[r],o=t.extend({},o,{"atwho-at":this.context.at}),a=this.context.callbacks("tplEval").call(this.context,h,o,"onDisplay"),i=t(this.context.callbacks("highlighter").call(this.context,a,this.context.query.text)),i.data("item-data",o),n.append(i);return this.show(),this.context.getOpt("highlightFirst")?n.find("li:first").addClass("cur"):void 0},e}();var p;p={load:function(t,e){var i;return(i=this.controller(t))?i.model.load(e):void 0},isSelecting:function(){var t;return!!(null!=(t=this.controller())?t.view.visible():void 0)},hide:function(){var t;return null!=(t=this.controller())?t.view.hide():void 0},reposition:function(){var t;return(t=this.controller())?t.view.reposition(t.rect()):void 0},setIframe:function(t,e){return this.setupRootElement(t,e),null},run:function(){return this.dispatch()},destroy:function(){return this.shutdown(),this.$inputor.data("atwho",null)}},t.fn.atwho=function(e){var i,r;return i=arguments,r=null,this.filter('textarea, input, [contenteditable=""], [contenteditable=true]').each(function(){var o,s;return(s=(o=t(this)).data("atwho"))||o.data("atwho",s=new n(this)),"object"!=typeof e&&e?p[e]&&s?r=p[e].apply(s,Array.prototype.slice.call(i,1)):t.error("Method "+e+" does not exist on jQuery.atwho"):s.reg(e.at,e)}),null!=r?r:this},t.fn.atwho["default"]={at:void 0,alias:void 0,data:null,displayTpl:"${name} ",insertTpl:"${atwho-at}${name}",headerTpl:null,callbacks:e,functionOverrides:{},searchKey:"name",suffix:void 0,hideWithoutSuffix:!1,startWithSpace:!0,acceptSpaceBar:!1,highlightFirst:!0,limit:5,maxLen:20,minLen:0,displayTimeout:300,delay:null,spaceSelectsMatch:!1,tabSelectsMatch:!0,editableAtwhoQueryAttrs:{},scrollDuration:150,suspendOnComposing:!0,lookUpOnClick:!0},t.fn.atwho.debug=!1});
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/scripts/jquery.caret.min.js b/sdkjs-plugins/content/propact/scripts/jquery.caret.min.js
new file mode 100644
index 000000000..a25584e2a
--- /dev/null
+++ b/sdkjs-plugins/content/propact/scripts/jquery.caret.min.js
@@ -0,0 +1,2 @@
+/*! jquery.caret 2016-02-27 */
+!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(c){return a.returnExportsGlobal=b(c)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){"use strict";var b,c,d,e,f,g,h,i,j,k,l;k="caret",b=function(){function b(a){this.$inputor=a,this.domInputor=this.$inputor[0]}return b.prototype.setPos=function(a){var b,c,d,e;return(e=j.getSelection())&&(d=0,c=!1,(b=function(a,f){var g,i,j,k,l,m;for(l=f.childNodes,m=[],j=0,k=l.length;k>j&&(g=l[j],!c);j++)if(3===g.nodeType){if(d+g.length>=a){c=!0,i=h.createRange(),i.setStart(g,a-d),e.removeAllRanges(),e.addRange(i);break}m.push(d+=g.length)}else m.push(b(a,g));return m})(a,this.domInputor)),this.domInputor},b.prototype.getIEPosition=function(){return this.getPosition()},b.prototype.getPosition=function(){var a,b;return b=this.getOffset(),a=this.$inputor.offset(),b.left-=a.left,b.top-=a.top,b},b.prototype.getOldIEPos=function(){var a,b;return b=h.selection.createRange(),a=h.body.createTextRange(),a.moveToElementText(this.domInputor),a.setEndPoint("EndToEnd",b),a.text.length},b.prototype.getPos=function(){var a,b,c;return(c=this.range())?(a=c.cloneRange(),a.selectNodeContents(this.domInputor),a.setEnd(c.endContainer,c.endOffset),b=a.toString().length,a.detach(),b):h.selection?this.getOldIEPos():void 0},b.prototype.getOldIEOffset=function(){var a,b;return a=h.selection.createRange().duplicate(),a.moveStart("character",-1),b=a.getBoundingClientRect(),{height:b.bottom-b.top,left:b.left,top:b.top}},b.prototype.getOffset=function(){var b,c,d,e,f;return j.getSelection&&(d=this.range())?(d.endOffset-1>0&&d.endContainer!==this.domInputor&&(b=d.cloneRange(),b.setStart(d.endContainer,d.endOffset-1),b.setEnd(d.endContainer,d.endOffset),e=b.getBoundingClientRect(),c={height:e.height,left:e.left+e.width,top:e.top},b.detach()),c&&0!==(null!=c?c.height:void 0)||(b=d.cloneRange(),f=a(h.createTextNode("|")),b.insertNode(f[0]),b.selectNode(f[0]),e=b.getBoundingClientRect(),c={height:e.height,left:e.left,top:e.top},f.remove(),b.detach())):h.selection&&(c=this.getOldIEOffset()),c&&(c.top+=a(j).scrollTop(),c.left+=a(j).scrollLeft()),c},b.prototype.range=function(){var a;if(j.getSelection)return a=j.getSelection(),a.rangeCount>0?a.getRangeAt(0):null},b}(),c=function(){function b(a){this.$inputor=a,this.domInputor=this.$inputor[0]}return b.prototype.getIEPos=function(){var a,b,c,d,e,f,g;return b=this.domInputor,f=h.selection.createRange(),e=0,f&&f.parentElement()===b&&(d=b.value.replace(/\r\n/g,"\n"),c=d.length,g=b.createTextRange(),g.moveToBookmark(f.getBookmark()),a=b.createTextRange(),a.collapse(!1),e=g.compareEndPoints("StartToEnd",a)>-1?c:-g.moveStart("character",-c)),e},b.prototype.getPos=function(){return h.selection?this.getIEPos():this.domInputor.selectionStart},b.prototype.setPos=function(a){var b,c;return b=this.domInputor,h.selection?(c=b.createTextRange(),c.move("character",a),c.select()):b.setSelectionRange&&b.setSelectionRange(a,a),b},b.prototype.getIEOffset=function(a){var b,c,d,e;return c=this.domInputor.createTextRange(),a||(a=this.getPos()),c.move("character",a),d=c.boundingLeft,e=c.boundingTop,b=c.boundingHeight,{left:d,top:e,height:b}},b.prototype.getOffset=function(b){var c,d,e;return c=this.$inputor,h.selection?(d=this.getIEOffset(b),d.top+=a(j).scrollTop()+c.scrollTop(),d.left+=a(j).scrollLeft()+c.scrollLeft(),d):(d=c.offset(),e=this.getPosition(b),d={left:d.left+e.left-c.scrollLeft(),top:d.top+e.top-c.scrollTop(),height:e.height})},b.prototype.getPosition=function(a){var b,c,e,f,g,h,i;return b=this.$inputor,f=function(a){return a=a.replace(/<|>|`|"|&/g,"?").replace(/\r\n|\r|\n/g," "),/firefox/i.test(navigator.userAgent)&&(a=a.replace(/\s/g," ")),a},void 0===a&&(a=this.getPos()),i=b.val().slice(0,a),e=b.val().slice(a),g=""+f(i)+" ",g+="| ",g+=""+f(e)+" ",h=new d(b),c=h.create(g).rect()},b.prototype.getIEPosition=function(a){var b,c,d,e,f;return d=this.getIEOffset(a),c=this.$inputor.offset(),e=d.left-c.left,f=d.top-c.top,b=d.height,{left:e,top:f,height:b}},b}(),d=function(){function b(a){this.$inputor=a}return b.prototype.css_attr=["borderBottomWidth","borderLeftWidth","borderRightWidth","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopWidth","boxSizing","fontFamily","fontSize","fontWeight","height","letterSpacing","lineHeight","marginBottom","marginLeft","marginRight","marginTop","outlineWidth","overflow","overflowX","overflowY","paddingBottom","paddingLeft","paddingRight","paddingTop","textAlign","textOverflow","textTransform","whiteSpace","wordBreak","wordWrap"],b.prototype.mirrorCss=function(){var b,c=this;return b={position:"absolute",left:-9999,top:0,zIndex:-2e4},"TEXTAREA"===this.$inputor.prop("tagName")&&this.css_attr.push("width"),a.each(this.css_attr,function(a,d){return b[d]=c.$inputor.css(d)}),b},b.prototype.create=function(b){return this.$mirror=a("
"),this.$mirror.css(this.mirrorCss()),this.$mirror.html(b),this.$inputor.after(this.$mirror),this},b.prototype.rect=function(){var a,b,c;return a=this.$mirror.find("#caret"),b=a.position(),c={left:b.left,top:b.top,height:a.height()},this.$mirror.remove(),c},b}(),e={contentEditable:function(a){return!(!a[0].contentEditable||"true"!==a[0].contentEditable)}},g={pos:function(a){return a||0===a?this.setPos(a):this.getPos()},position:function(a){return h.selection?this.getIEPosition(a):this.getPosition(a)},offset:function(a){var b;return b=this.getOffset(a)}},h=null,j=null,i=null,l=function(a){var b;return(b=null!=a?a.iframe:void 0)?(i=b,j=b.contentWindow,h=b.contentDocument||j.document):(i=void 0,j=window,h=document)},f=function(a){var b;h=a[0].ownerDocument,j=h.defaultView||h.parentWindow;try{return i=j.frameElement}catch(c){b=c}},a.fn.caret=function(d,f,h){var i;return g[d]?(a.isPlainObject(f)?(l(f),f=void 0):l(h),i=e.contentEditable(this)?new b(this):new c(this),g[d].apply(i,[f])):a.error("Method "+d+" does not exist on jQuery.caret")},a.fn.caret.EditableCaret=b,a.fn.caret.InputCaret=c,a.fn.caret.Utils=e,a.fn.caret.apis=g});
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/scripts/plugin.js b/sdkjs-plugins/content/propact/scripts/plugin.js
new file mode 100755
index 000000000..f38a6d041
--- /dev/null
+++ b/sdkjs-plugins/content/propact/scripts/plugin.js
@@ -0,0 +1,7012 @@
+/**
+ *
+ * (c) Copyright Ascensio System SIA 2020
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+(function (window, undefined) {
+
+ /**
+ * @constant
+ * @description Define the variables for HTML show/hide & enabled/disabled
+ */
+ var displayNoneClass = "d-none";
+ var disabledClass = "disabled";
+ var displayedInvitecpPending = "displayed-invitecp-pending";
+ var displayedInviteCP = "displayed-invitecp";
+
+ /**
+ * @constant
+ * @description Define the Path
+ */
+ var baseUrl = 'https://api.propact.com.au';
+ var apiBaseUrl = baseUrl + '/api/v1/app';
+ var IMAGE_USER_PATH_LINK = 'https://propact.s3.amazonaws.com/';
+
+ /**
+ * @constant
+ * @description Defined the variables related to contract
+ */
+ var authToken = '';
+ var contractID = '';
+ var contractMode = '';
+ var splitArray;
+ var documentCallbackUrl = '';
+
+ /**
+ * @constant
+ * @description Define the variables for plugin setting
+ */
+ var flagInit = false;
+ var flagDisableWhenPluginLoading = false;
+ var flagSocketInit = false;
+ var flagRedirectFirst = false;
+ var flagClickLabel = false;
+ var flagRedirectClauseCreate = false;
+ var flagSocketFunctionInit = false;
+
+ /**
+ * @constant
+ * @description Defined the variables related to clause lists
+ */
+ var openContractResponseData = {};
+ var contractInformation = {};
+ var loggedInUserDetails;
+ var loggedInCompanyDetails;
+ var counterPartyDetail;
+ var counterPartyCompanyDetail;
+ var tagLists = [];
+ var selectedThreadID = '';
+ var selectedClauseID = '';
+ var clauseChatWindows = '';
+ var selectedInviteTeams = [];
+ var selectedInviteUsers = [];
+ var searchText = '';
+ var searchTimeout;
+ var clauseNextPage = 1;
+ var clauseHasNextPage = true;
+ var clauseLists = [];
+ var sectionID = '';
+ var chatWindows = '';
+ var selectedContractSectionDetails = '';
+ var tagUserInMessage = [];
+ var contractCreatorDetails;
+ var contractCounterPartyDetails;
+ var chatHistoryNextPage = 1;
+ var chatHistoryHasNextPage = true;
+ var sameSideUserList = [];
+ var counterpartyUserList = [];
+ var tyingUserSSArray = [];
+ var tyingUserCPArray = [];
+ var organisationListInterval;
+ var typingTimeout;
+ var attachFileSameSide = [];
+ var attachFileCounterparty = [];
+ var contractClauseGroups = [];
+ var inviteUserListIDs = [];
+ var inviteTeamListIDs = [];
+ let contractArchieveStatus = false
+ let normalMessageSent = false
+ let positionMessageSent = false
+ let draftingMessageSent = false
+ let contractSectionCompleted = false
+ let showDraftingMessage = false
+ /**
+ * @constant
+ * @description Define the variables for socket functionality
+ */
+ var socket = '';
+
+
+ /**
+ * @constant
+ * @type {{loader: HTMLElement, error: HTMLElement, libLoader: HTMLElement}}
+ * @description Defined all the HTML element
+ */
+ var elements = {
+ loader: document.getElementById("loader"),
+
+ btnCreateClause: document.getElementById("btnCreateClause"),
+ btnMarkupMode: document.getElementById("btnMarkupMode"),
+ btnInviteCounterparty: document.getElementById("btnInviteCounterparty"),
+ btnInviteCounterpartyCancel: document.getElementById("btnInviteCounterpartyCancel"),
+ btnResendInvitation: document.getElementById("btnResendInvitation"),
+ btnCancelInvitation: document.getElementById("btnCancelInvitation"),
+ btnScrollDown: document.getElementById("btnScrollDown"),
+ btnContractCreateClose: document.getElementById("btnContractCreateClose"),
+ btnContractCreateCancel: document.getElementById("btnContractCreateCancel"),
+ btnCloseConversionHistory: document.getElementById("btnCloseConversionHistory"),
+ btnGoToCounterpartyChat: document.getElementById("btnGoToCounterpartyChat"),
+ btnGoToCounterparty: document.getElementById("btnGoToCounterparty"),
+ btnGoToSameSideChat: document.getElementById("btnGoToSameSideChat"),
+ btnGoToSameSide: document.getElementById("btnGoToSameSide"),
+ btnSendSameSide: document.getElementById("btnSendSameSide"),
+ btnSendCounterParty: document.getElementById("btnSendCounterParty"),
+ btnGoToConversionHistory: document.getElementById("btnGoToConversionHistory"),
+ btnGoToConversionChatHistory: document.getElementById("btnGoToConversionChatHistory"),
+ btnCloseSameSideChat: document.getElementById("btnCloseSameSideChat"),
+ btnCloseCounterpartyChat: document.getElementById("btnCloseCounterpartyChat"),
+ btnSendPositionConfirmationSameSide: document.getElementById("btnSendPositionConfirmationSameSide"),
+ btnSendPositionConfirmationSameSideB: document.getElementById("btnSendPositionConfirmationSameSideB"),
+ btnSendPositionConfirmationCounterparty: document.getElementById("btnSendPositionConfirmationCounterparty"),
+ btnSendPositionConfirmationCounterpartyB: document.getElementById("btnSendPositionConfirmationCounterpartyB"),
+ btnOpenInviteUserTeam: document.getElementById("btnOpenInviteUserTeam"),
+ btnScheduleMeetingSameSide: document.getElementById("btnScheduleMeetingSameSide"),
+ btnScheduleMeetingSameSideB: document.getElementById("btnScheduleMeetingSameSideB"),
+ btnWithdrawnClauseSameSide: document.getElementById("btnWithdrawnClauseSameSide"),
+ btnAttachFileSameSide: document.getElementById("btnAttachFileSameSide"),
+ btnAttachFileCounterparty: document.getElementById("btnAttachFileCounterparty"),
+ btnInviteUsers: document.getElementById("btnInviteUsers"),
+ btnInviteTeams: document.getElementById("btnInviteTeams"),
+ btnScheduleMeetingCounterparty: document.getElementById("btnScheduleMeetingCounterparty"),
+ btnScheduleMeetingCounterpartyB: document.getElementById("btnScheduleMeetingCounterpartyB"),
+ btnMeetingView: document.getElementById("btnMeetingView"),
+ btnMeetingEnterOutcomes: document.getElementById("btnMeetingEnterOutcomes"),
+ btnMeetingViewOutcomes: document.getElementById("btnMeetingViewOutcomes"),
+ btnAddClauseToGroup: document.getElementById("btnAddClauseToGroup"),
+ btnRemoveFromGroup: document.getElementById("btnRemoveFromGroup"),
+
+ paragraphInvitationActions: document.getElementById("paragraphInvitationActions"),
+ paragraphTeamsNotFoundMessage: document.getElementById("paragraphTeamsNotFoundMessage"),
+ paragraphUsersNotFoundMessage: document.getElementById("paragraphUsersNotFoundMessage"),
+
+ formInviteCounterparty: document.getElementById("formInviteCounterparty"),
+ formClause: document.getElementById("formClause"),
+ formSendPositionConfirmation: document.getElementById("formSendPositionConfirmation"),
+ formReconfirmPosition: document.getElementById("formReconfirmPosition"),
+ formRejectPosition: document.getElementById("formRejectPosition"),
+ formAssignDraftRequest: document.getElementById("formAssignDraftRequest"),
+ formSendDraftConfirmation: document.getElementById("formSendDraftConfirmation"),
+ formRejectDraftRequest: document.getElementById("formRejectDraftRequest"),
+ formRejectDraft: document.getElementById("formRejectDraft"),
+ formMeetingOutcomes: document.getElementById("formMeetingOutcomes"),
+ formClauseToGroup: document.getElementById("formClauseToGroup"),
+ formReassignDraftRequest: document.getElementById("formReassignDraftRequest"),
+
+ sectionContractLists: document.getElementById("sectionContractLists"),
+ sectionInviteCounterparty: document.getElementById("sectionInviteCounterparty"),
+ sectionCreateClause: document.getElementById("sectionCreateClause"),
+ sectionConversionHistory: document.getElementById("sectionConversionHistory"),
+ sectionSameSideChat: document.getElementById("sectionSameSideChat"),
+ sectionCounterpartyChat: document.getElementById("sectionCounterpartyChat"),
+
+ divInviteCounterparty: document.getElementById("divInviteCounterparty"),
+ divContractListItems: document.getElementById("divContractListItems"),
+ divGroupClauseListItems: document.getElementById("divGroupClauseListItems"),
+ divInviteCounterpartyInvited: document.getElementById("divInviteCounterpartyInvited"),
+ divInviteUsersBox: document.getElementById("divInviteUsersBox"),
+ divInvitedUsers: document.getElementById("divInvitedUsers"),
+ divInvitedTeams: document.getElementById("divInvitedTeams"),
+ divInviteUserTabs: document.getElementById("divInviteUserTabs"),
+ divSameSideTextbox: document.getElementById("divSameSideTextbox"),
+ divCounterpartyTextbox: document.getElementById("divCounterpartyTextbox"),
+ divChatHistoryBody: document.getElementById("divChatHistoryBody"),
+ divChatSameSideBody: document.getElementById("divChatSameSideBody"),
+ divChatCounterPartyBody: document.getElementById("divChatCounterPartyBody"),
+ divChatContractSameSideFooter: document.getElementById("divChatContractSameSideFooter"),
+ divChatContractCounterpartyFooter: document.getElementById("divChatContractCounterpartyFooter"),
+ divContractCounterpartySection: document.getElementById("divContractCounterpartySection"),
+ divDraftingBox: document.getElementById("divDraftingBox"),
+ divMeetingViewOutcomes: document.getElementById("divMeetingViewOutcomes"),
+ divMeetingEnterOutcomes: document.getElementById("divMeetingEnterOutcomes"),
+ divClauseGroup: document.getElementById("divClauseGroup"),
+ divClauseGroupHead: document.getElementById("divClauseGroupHead"),
+ divGroupName: document.getElementById("divGroupName"),
+ divExistingGroup: document.getElementById("divExistingGroup"),
+ divContractClauseSections: document.getElementById("divContractClauseSections"),
+ divReassignDraftingBox: document.getElementById("divReassignDraftingBox"),
+
+ approvePositionMessageId: document.getElementById("approvePositionMessageId"),
+ assignDraftingRequestUserId: document.getElementById("assignDraftingRequestUserId"),
+ assignDraftingRequestInput: document.getElementById("assignDraftingRequestInput"),
+ assignDraftingRequestBox: document.getElementById("assignDraftingRequestBox"),
+ assignDraftRequestBox: document.getElementById("assignDraftRequestBox"),
+ reassignDraftRequestBox: document.getElementById("reassignDraftRequestBox"),
+ accordionAssignDraftRequest: document.getElementById("accordionAssignDraftRequest"),
+ accordionReassignDraftRequest: document.getElementById("accordionReassignDraftRequest"),
+ accordionPositionConfirmation: document.getElementById("accordionPositionConfirmation"),
+ sendAssignDraftRequest: document.getElementById("sendAssignDraftRequest"),
+ sendReassignDraftRequest: document.getElementById("sendReassignDraftRequest"),
+ sendReconfirmPosition: document.getElementById("sendReconfirmPosition"),
+ sendToTeamForDraft: document.getElementById("sendToTeamForDraft"),
+ sendToTeamForDraftA: document.getElementById("sendToTeamForDraftA"),
+ sendToCounterpartyForDraft: document.getElementById("sendToCounterpartyForDraft"),
+ sendToCounterpartyForDraftA: document.getElementById("sendToCounterpartyForDraftA"),
+ assignDraftRequestMessageId: document.getElementById("assignDraftRequestMessageId"),
+ assignDraftRequestUserId: document.getElementById("assignDraftRequestUserId"),
+ reassignDraftRequestMessageId: document.getElementById("reassignDraftRequestMessageId"),
+ reassignDraftRequestUserId: document.getElementById("reassignDraftRequestUserId"),
+ inputPositionReason: document.getElementById("inputPositionReason"),
+ radioCreateGroup: document.getElementById("radioCreateGroup"),
+ radioExistingGroup: document.getElementById("radioExistingGroup"),
+ selectExistingClauseGroup: document.getElementById("selectExistingClauseGroup"),
+ approvePositionMessageId: document.getElementById("approvePositionMessageId"),
+
+ txtOrganizationName: document.getElementById("txtOrganizationName"),
+ txtCounterpartyName: document.getElementById("txtCounterpartyName"),
+ txtCounterpartyEmail: document.getElementById("txtCounterpartyEmail"),
+ txtMeetingViewOutcomes: document.getElementById("txtMeetingViewOutcomes"),
+
+ inputInviteUsersTeams: document.getElementById("inputInviteUsersTeams"),
+ inputClauseGroup: document.getElementById("inputClauseGroup"),
+ chkboxInviteAllTeams: document.getElementById("chkboxInviteAllTeams"),
+ chkboxInviteAllUsers: document.getElementById("chkboxInviteAllUsers"),
+ inputSearchbox: document.getElementById("inputSearchbox"),
+ inputSendPositionConfirmation: document.getElementById("inputSendPositionConfirmation"),
+ inputRejectPositionReason: document.getElementById("inputRejectPositionReason"),
+ inputRejectDraftReason: document.getElementById("inputRejectDraftReason"),
+ inputAssignDraftRequest: document.getElementById("inputAssignDraftRequest"),
+ inputSendDraftConfirmation: document.getElementById("inputSendDraftConfirmation"),
+ rejectDraftMessageId: document.getElementById("rejectDraftMessageId"),
+ inputReassignDraftRequest: document.getElementById("inputReassignDraftRequest"),
+
+ accordionBodyTeams: document.getElementById("accordionBodyTeams"),
+ accordionBodyUsers: document.getElementById("accordionBodyUsers"),
+ conversionHistory: document.getElementById("conversionHistory"),
+ conversionSameSide: document.getElementById("conversionSameSide"),
+ conversionCounterparty: document.getElementById("conversionCounterparty"),
+ userProfileName: document.getElementById("userProfileName"),
+ imgInviteUserTeam: document.getElementById("imgInviteUserTeam"),
+ counterpartyUserProfileName: document.getElementById("counterpartyUserProfileName"),
+
+ snackbar: document.getElementById("snackbar"),
+
+ inviteUserPopup: document.getElementById("inviteUserPopup"),
+ inviteTeamPopup: document.getElementById("inviteTeamPopup"),
+ sendPositionConfirmationPopup: document.getElementById("sendPositionConfirmationPopup"),
+ confirmPositionPopup: document.getElementById("confirmPositionPopup"),
+ rejectPositionPopup: document.getElementById("rejectPositionPopup"),
+ assignDraftRequestPopup: document.getElementById("assignDraftRequestPopup"),
+ sendDraftConfirmationPopup: document.getElementById("sendDraftConfirmationPopup"),
+ rejectDarftRequestPopup: document.getElementById("rejectDarftRequestPopup"),
+ rejectDarftPopup: document.getElementById("rejectDarftPopup"),
+ meetingPopup: document.getElementById("meetingPopup"),
+ addClauseToGroupPopup: document.getElementById("addClauseToGroupPopup"),
+ reassignDraftRequestPopup: document.getElementById("reassignDraftRequestPopup"),
+
+ messageInputCounterParty: document.getElementById("messageInputCounterParty"),
+ messageInputSameSide: document.getElementById("messageInputSameSide"),
+ chatFooterInnerSameSide: document.getElementById("chatFooterInnerSameSide"),
+
+ allUserInvitedMessage: document.getElementById("allUserInvitedMessage"),
+ noUserInviteListMessage: document.getElementById("noUserInviteListMessage"),
+ partiallyInvitedUserListMessage: document.getElementById("partiallyInvitedUserListMessage"),
+ sendInviteUsers: document.getElementById("sendInviteUsers"),
+ inviteUserTable: document.getElementById("inviteUserTable"),
+ allTeamInvitedMessage: document.getElementById("allTeamInvitedMessage"),
+ noTeamInviteListMessage: document.getElementById("noTeamInviteListMessage"),
+ partiallyInvitedTeamListMessage: document.getElementById("partiallyInvitedTeamListMessage"),
+ sendInviteTeams: document.getElementById("sendInviteTeams"),
+ inviteTeamTable: document.getElementById("inviteTeamTable"),
+ rejectPositionMessageId: document.getElementById("rejectPositionMessageId"),
+
+ typingSpan: document.getElementById("typingSpan"),
+ typingSpanCP: document.getElementById("typingSpanCP"),
+
+ meetingTitle: document.getElementById("meetingTitle"),
+ meetingLocation: document.getElementById("meetingLocation"),
+ meetingAgenda: document.getElementById("meetingAgenda"),
+ meetingScheduleTime: document.getElementById("meetingScheduleTime"),
+ MeetingTimings: document.getElementById("MeetingTimings"),
+ participantCounts: document.getElementById("participantCounts"),
+ meetingParticipantList: document.getElementById("meetingParticipantList"),
+ inputOrganisationName: document.getElementById("inputOrganisationName"),
+ attachFileSameSide: document.getElementById("attachFileSameSide"),
+ attachFileCounterparty: document.getElementById("attachFileCounterparty"),
+ attchedFilenameSameSide: document.getElementById("attchedFilenameSameSide"),
+ attchedFilenameCounterparty: document.getElementById("attchedFilenameCounterparty"),
+ errorFileUploadSameSide: document.getElementById("errorFileUploadSameSide"),
+ errorFileUploadCounterparty: document.getElementById("errorFileUploadCounterparty"),
+ clauseSectionTitleSameSide: document.getElementById("clauseSectionTitleSameSide"),
+ clauseSectionTitleCounterParty: document.getElementById("clauseSectionTitleCounterParty"),
+ clauseSectionTitleCHistory: document.getElementById("clauseSectionTitleCHistory"),
+ // sameSideTeamList: document.getElementById("sameSideTeamList"),
+ sameSideUserList: document.getElementById("sameSideUserList"),
+ counterPartyTeamList: document.getElementById("counterPartyTeamList"),
+ counterPartyUserList: document.getElementById("counterPartyUserList"),
+
+ initialMessageMySide: document.getElementById("initialMessageMySide"),
+ positionMessageMySide: document.getElementById("positionMessageMySide"),
+ draftingMessageMySide: document.getElementById("draftingMessageMySide"),
+ initialMessage: document.getElementById("initialMessage"),
+ positionMessage: document.getElementById("positionMessage"),
+ draftingMessage: document.getElementById("draftingMessage"),
+ }
+
+ /**================================== Plugin Init Start ===============================*/
+ window.Asc.plugin.init = function (text) {
+
+ //event "init" for plugin
+ window.Asc.plugin.executeMethod("ShowButton", ["back", false]);
+ window.Asc.plugin.executeMethod("GetAllContentControls");
+
+ if (window.Asc.plugin.info && typeof window.Asc.plugin.info.documentCallbackUrl == 'string') {
+ documentCallbackUrl = window.Asc.plugin.info.documentCallbackUrl;
+ }
+
+ /**====================== Get & Set variables ======================*/
+ contractID = getContractID(documentCallbackUrl);
+ contractMode = getContractMode(documentCallbackUrl);
+ splitArray = documentCallbackUrl.split('/');
+ authToken = splitArray[11];
+ if (splitArray.length >= 13 && splitArray[12] != '0') {
+ sectionID = splitArray[12];
+ }
+ if (splitArray.length >= 14 && splitArray[13] != '0') {
+ chatWindows = splitArray[13];
+ }
+ /**====================== Get & Set variables ======================*/
+
+ if (!flagSocketInit) {
+ socket = io.connect(baseUrl,
+ {auth: {authToken}}
+ );
+ flagSocketInit = true;
+ }
+
+ /**
+ * @desc If text is not selected or contract is in markup mode than disable the create clause button
+ */
+ if (contractMode == 'markup') {
+ switchClass(elements.btnCreateClause, displayNoneClass, true);
+ elements.btnMarkupMode.innerHTML = 'Master Document';
+ } else {
+ if (contractInformation) {
+ switchClass(elements.btnCreateClause, displayNoneClass, (contractInformation && contractInformation.contractCurrentStatus != "Under Negotiation"));
+ } else {
+ switchClass(elements.btnCreateClause, displayNoneClass, false);
+ }
+ elements.btnMarkupMode.innerHTML = 'Our Working Draft';
+ switchClass(elements.btnCreateClause, disabledClass, true);
+ }
+
+
+ // $('#clauseText').val(text);
+ if (text) {
+ switchClass(elements.btnCreateClause, disabledClass, false);
+ } else {
+ if (!document.getElementById('btnCreateClause').classList.contains(disabledClass)) {
+ switchClass(elements.btnCreateClause, disabledClass, true);
+ }
+ }
+ if (!flagDisableWhenPluginLoading) {
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "readOnly";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ flagDisableWhenPluginLoading = true;
+ }
+
+ if (contractArchieveStatus == true) {
+ switchClass(elements.btnCreateClause, displayNoneClass, true);
+ }
+
+
+ /**
+ * @desc Get the open contract and user details
+ */
+ if (contractID && authToken && !flagInit) {
+ getContractDetails(socket);
+ }
+
+ };
+
+ window.Asc.plugin.onMethodReturn = function (returnValue) {
+ //event return for completed methods
+ var _plugin = window.Asc.plugin;
+ if (_plugin.info.methodName == "GetAllContentControls") {
+ for (var i = 0; i < returnValue.length; i++) {
+ var tagExists = tagLists.findIndex((ele) => +ele.Id == +returnValue[i].Id);
+ if (tagExists < 0) {
+ tagLists.push(returnValue[i]);
+ }
+ }
+ } else if (_plugin.info.methodName == "GetCurrentContentControl") {
+ if (tagLists && tagLists.length > 0 && returnValue) {
+ var selectedTag = tagLists.findIndex((ele) => ele.InternalId == returnValue);
+ if (selectedTag > -1 && tagLists[selectedTag].Id && document.getElementById(tagLists[selectedTag].Id)) {
+ selectedCommentThereadID = tagLists[selectedTag].Tag;
+
+ $('.div-selected').removeClass('div-selected');
+ $('#divContractListItems #' + tagLists[selectedTag].Id).addClass('div-selected');
+ }
+ }
+ }
+ };
+
+ window.Asc.plugin.event_onTargetPositionChanged = function () {
+ if (!flagClickLabel) {
+ window.Asc.plugin.executeMethod("GetCurrentContentControl");
+ }
+ flagClickLabel = false;
+ };
+ /**================================== Plugin Init End =================================*/
+
+
+ /**====================== Get & Set variables ======================*/
+ contractID = getURLParameter('contractID');
+ contractMode = getContractMode('contractMode');
+ splitArray = documentCallbackUrl.split('/');
+ authToken = getURLParameter('authToken');
+ if (splitArray.length >= 13 && splitArray[12] != '0') {
+ sectionID = splitArray[12];
+ }
+ if (splitArray.length >= 14 && splitArray[13] != '0') {
+ chatWindows = splitArray[13];
+ }
+ /**====================== Get & Set variables ======================*/
+
+ if (!flagSocketInit) {
+ socket = io.connect(baseUrl,
+ {auth: {authToken}}
+ );
+ flagSocketInit = true;
+ }
+
+ /**
+ * @desc Get the open contract and user details
+ */
+ if (contractID && authToken && !flagInit) {
+ getContractDetails(socket);
+ }
+ /**====================== Section: Invite Counterparty ======================*/
+ $("#formInviteCounterparty").validate({
+ submitHandler: function (form) {
+ switchClass(elements.loader, displayNoneClass, false);
+ inviteCounterparties();
+ }
+ });
+
+ elements.btnInviteCounterpartyCancel.onclick = function () {
+ $("#formInviteCounterparty").validate().resetForm();
+ elements.formInviteCounterparty.reset();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionInviteCounterparty, displayNoneClass, true);
+ }
+ /**====================== Section: Invite Counterparty ======================*/
+
+ /**====================== Section: Contract Lists ======================*/
+ elements.btnCreateClause.onclick = function () {
+ if (!elements.divInviteUsersBox.classList.contains(displayNoneClass)) {
+ switchClass(elements.divInviteUsersBox, displayNoneClass, true);
+ }
+ if (contractClauseGroups && contractClauseGroups.length > 0) {
+ switchClass(elements.divClauseGroup, displayNoneClass, false);
+ while (elements.inputClauseGroup.options.length > 0) {
+ elements.inputClauseGroup.remove(0);
+ }
+
+ // Add new options
+ const newOption = document.createElement('option');
+ newOption.value = '';
+ newOption.textContent = "Select Group";
+ elements.inputClauseGroup.appendChild(newOption);
+ for (let i = 0; i < contractClauseGroups.length; i++) {
+ const newOption = document.createElement('option');
+ newOption.value = contractClauseGroups[i]._id;
+ newOption.textContent = contractClauseGroups[i].groupName;
+ elements.inputClauseGroup.appendChild(newOption);
+ }
+ } else {
+ switchClass(elements.divClauseGroup, displayNoneClass, true);
+ }
+ // if (text) {
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionCreateClause, displayNoneClass, false);
+ // }
+ };
+
+ elements.btnMarkupMode.onclick = function () {
+ var data = {
+ chatRoomName: loggedInUserDetails._id + "_" + contractID,
+ contractMode: contractMode == 'markup' ? 'edit' : 'markup'
+ };
+ socket.emit('switchContractMode', data);
+ };
+
+ elements.btnInviteCounterparty.onclick = function () {
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionInviteCounterparty, displayNoneClass, false);
+ };
+
+ elements.btnResendInvitation.onclick = function () {
+ switchClass(elements.loader, displayNoneClass, false);
+ resendInvitation();
+ };
+
+ elements.btnCancelInvitation.onclick = function () {
+ switchClass(elements.loader, displayNoneClass, false);
+ cancelInvitation();
+ };
+
+ elements.btnMeetingViewOutcomes.onclick = function (event) {
+ switchClass(elements.divMeetingViewOutcomes, displayNoneClass, !$('#divMeetingViewOutcomes').hasClass(displayNoneClass));
+ event.stopPropagation();
+ }
+
+ elements.btnMeetingEnterOutcomes.onclick = function (event) {
+ switchClass(elements.divMeetingEnterOutcomes, displayNoneClass, !$('#divMeetingEnterOutcomes').hasClass(displayNoneClass));
+ event.stopPropagation();
+ }
+
+ elements.inputSearchbox.onkeyup = function (event) {
+ clearTimeout(searchTimeout); // Clear any existing timeout
+ searchTimeout = setTimeout(async function () {
+ if (searchText != event.target.value.trim()) {
+ elements.divContractListItems.innerHTML = '';
+ searchText = event.target.value.trim();
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ } else {
+ searchText = '';
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ }
+ }, 500);
+ };
+
+ elements.divContractClauseSections.onscroll = async function (e) {
+ if (elements.divContractClauseSections.scrollTop + elements.divContractClauseSections.offsetHeight >= (elements.divContractClauseSections.scrollHeight - 1)) {
+ if (clauseHasNextPage) {
+ await getClauses();
+ } else {
+ switchClass(elements.btnScrollDown, displayNoneClass, true);
+ }
+ } else {
+ if (elements.divContractClauseSections.scrollHeight >= elements.divContractClauseSections.scrollTop + elements.divContractClauseSections.offsetHeight && clauseLists && clauseLists.length > 2) {
+ switchClass(elements.btnScrollDown, displayNoneClass, false);
+ } else {
+ switchClass(elements.btnScrollDown, displayNoneClass, true);
+ }
+ }
+ };
+
+ elements.btnScrollDown.onclick = function () {
+ $('#divContractClauseSections').animate({scrollTop: elements.divContractClauseSections.scrollHeight}, 'slow');
+ return false;
+ };
+
+ $(document).on('click', '.contract-item', async function (event) {
+ if (!$(event.target).closest('.contract-checkbox').length) {
+ flagClickLabel = true;
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var elementID = $(this).attr('id');
+ var tagExists = tagLists.findIndex((ele) => +ele.Id == +elementID);
+ // TODO: Remove or condition
+ if (tagExists > -1 || 1) {
+ selectedThreadID = $(this).data('commentid');
+ selectedClauseID = $(this).data('id');
+ clauseChatWindows = $(this).data('chatwindow');
+ await getContractSectionDetails();
+ if (!flagRedirectClauseCreate) {
+ await getContractDetails(socket, redirection = false);
+ }
+
+ var conversionHistorySocketRoom = getChatRoom('Conversion History');
+ socket.emit('joinContractSectionChatRoom', conversionHistorySocketRoom);
+
+ var counterpartySocketRoom = getChatRoom('Counterparty');
+ socket.emit('joinContractSectionChatRoom', counterpartySocketRoom);
+
+ var sameSideSocketRoom = getChatRoom('Our Team');
+ socket.emit('joinContractSectionChatRoom', sameSideSocketRoom);
+
+ var draftConfirmSSElement = document.getElementById("draftConfirmSS");
+ if (draftConfirmSSElement) {
+ draftConfirmSSElement.parentNode.removeChild(draftConfirmSSElement);
+ }
+ var draftConfirmCPElement = document.getElementById("draftConfirmCP");
+ if (draftConfirmCPElement) {
+ draftConfirmCPElement.parentNode.removeChild(draftConfirmCPElement);
+ }
+
+ if (!flagRedirectClauseCreate) {
+ await redirectToMessageScreen();
+ } else {
+ if (!(chatWindows == 'SS' || chatWindows == 'CP')) {
+ withType = 'Our Team';
+ messageConfirmationFor = 'Same Side';
+ elements.conversionSameSide.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ await getContractSectionMessageList('our');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputSameSide.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, false);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ }
+ }
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, true);
+ elements.btnOpenInviteUserTeam.closest("li").classList.remove('active');
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ window.Asc.plugin.executeMethod("SelectContentControl", [tagLists[tagExists].InternalId]);
+ }
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, false);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, false);
+ switchClass(elements.btnSendPositionConfirmationSameSide.closest("li"), displayNoneClass, false);
+ switchClass(elements.btnSendPositionConfirmationSameSideB, displayNoneClass, false);
+ document.getElementById('btnSendPositionConfirmationCounterparty').closest("li").classList.remove(displayNoneClass);
+ document.getElementById('btnSendPositionConfirmationCounterpartyB').classList.remove(displayNoneClass);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', false);
+ if (!openContractResponseData.canCommunicateWithCounterparty) {
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, true);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ }
+ if (openContractResponseData.canSendPositionConfirmation == false) {
+ switchClass(elements.btnSendPositionConfirmationSameSide.closest("li"), displayNoneClass, true);
+ switchClass(elements.btnSendPositionConfirmationSameSideB, displayNoneClass, true);
+ document.getElementById('btnSendPositionConfirmationCounterparty').closest("li").classList.add(displayNoneClass);
+ document.getElementById('btnSendPositionConfirmationCounterpartyB').classList.add(displayNoneClass);
+ }
+ if (contractInformation.counterPartyInviteStatus != 'Accepted') {
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, true);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ }
+ if (!(openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Position Confirmer")) {
+ switchClass(elements.btnWithdrawnClauseSameSide, displayNoneClass, true);
+ } else {
+ switchClass(elements.btnWithdrawnClauseSameSide, displayNoneClass, false);
+ }
+ await unreadMessageForThread();
+ flagRedirectClauseCreate = false;
+ /*var getClauseDetails = clauseLists.find((ele) => ele._id == selectedThreadID);
+ if (getClauseDetails && getClauseDetails._id) {
+ // await getSelectedContractSectionDetails();
+ if (getClauseDetails.assignedUser && getClauseDetails.assignedUser.length > 0) {
+ var iHtml = '';
+ getClauseDetails.assignedUser.forEach((ele) => {
+ var userDetails = inviteUserListIDs.find((el) => el._id == ele._id);
+ if (userDetails) {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + userDetails.itemName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + userDetails.role + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ }
+ });
+ iHtml += ' ';
+ document.getElementById('userTabContent').innerHTML = iHtml;
+ } else {
+ var html = '' +
+ 'No user invited
' +
+ ' ';
+ document.getElementById('userTabContent').innerHTML = html;
+ }
+ if (getClauseDetails.assignedTeam && getClauseDetails.assignedTeam.length > 0) {
+ var iHtml = '';
+ getClauseDetails.assignedTeam.forEach((ele) => {
+ var teamDetails = inviteTeamListIDs.find((el) => el._id == ele._id);
+ if (teamDetails && teamDetails.itemName) {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + teamDetails.itemName + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ }
+ });
+ iHtml += ' ';
+ document.getElementById('teamTabContent').innerHTML = iHtml;
+ } else {
+ var html = '' +
+ 'No team invited
' +
+ ' ';
+ document.getElementById('teamTabContent').innerHTML = html;
+ }
+ }*/
+ }
+ }
+ });
+
+ $('.contract-item .contract-checkbox input').on('click', function (event) {
+ event.stopPropagation();
+ });
+
+ $(document).on('click', '.contract-checkbox', function () {
+ var anyChecked = $('.chkbox-clause:checked');
+ switchClass(elements.divClauseGroupHead, displayNoneClass, !(anyChecked.length > 0));
+ switchClass(elements.btnAddClauseToGroup, displayNoneClass, !(anyChecked.length > 0));
+ switchClass(elements.divContractClauseSections, 'action-button-open', (anyChecked.length > 0));
+ });
+
+ $(document).on('click', '.remove-from-group', async function (event) {
+ var clauseID = $(this).parents('.contract-item').data('id');
+ var clauseGroupID = $(this).parents('.contract-item').data('groupid');
+ clauseRemoveFromGroup(clauseID, clauseGroupID, socket);
+ });
+
+ elements.btnAddClauseToGroup.onclick = function () {
+ switchClass(elements.addClauseToGroupPopup, displayNoneClass, false);
+ elements.radioCreateGroup.checked = true;
+ switchClass(elements.divGroupName, displayNoneClass, false);
+ switchClass(elements.divExistingGroup, displayNoneClass, true);
+ if (contractClauseGroups && contractClauseGroups.length > 0) {
+ while (elements.selectExistingClauseGroup.options.length > 0) {
+ elements.selectExistingClauseGroup.remove(0);
+ }
+
+ // Add new options
+ const newOption = document.createElement('option');
+ newOption.value = '';
+ newOption.textContent = "Select Group";
+ elements.selectExistingClauseGroup.appendChild(newOption);
+ for (let i = 0; i < contractClauseGroups.length; i++) {
+ const newOption = document.createElement('option');
+ newOption.value = contractClauseGroups[i]._id;
+ newOption.textContent = contractClauseGroups[i].groupName;
+ elements.selectExistingClauseGroup.appendChild(newOption);
+ }
+ }
+ };
+
+ const groupRadioButtons = document.querySelectorAll('input[name="isNewGroup"]');
+
+ groupRadioButtons.forEach(radioButton => {
+ radioButton.addEventListener('change', function (event) {
+ if (event.target.checked) {
+ const selectedValue = event.target.value;
+ if (selectedValue == 'Yes') {
+ switchClass(elements.divGroupName, displayNoneClass, false);
+ switchClass(elements.divExistingGroup, displayNoneClass, true);
+ } else {
+ switchClass(elements.divGroupName, displayNoneClass, true);
+ switchClass(elements.divExistingGroup, displayNoneClass, false);
+ }
+ }
+ });
+ });
+ /**====================== Section: Contract Lists ======================*/
+
+
+ /**====================== Section: Create Clause ======================*/
+ elements.btnContractCreateClose.onclick = function () {
+ redirectToClauseList();
+ };
+
+ elements.btnContractCreateCancel.onclick = function () {
+ redirectToClauseList();
+ };
+
+ elements.inputInviteUsersTeams.onclick = function () {
+ if (!elements.divInviteUsersBox.classList.contains(displayNoneClass)) {
+ switchClass(elements.divInviteUsersBox, displayNoneClass, true);
+ } else {
+ switchClass(elements.divInviteUsersBox, displayNoneClass, false);
+ }
+ };
+
+ elements.chkboxInviteAllTeams.onclick = function (event) {
+ $('.team-chkbox').prop('checked', this.checked);
+ updateInviteCheckbox();
+ event.stopPropagation();
+ };
+
+ elements.chkboxInviteAllUsers.onclick = function (event) {
+ $('.user-chkbox').prop('checked', this.checked);
+ updateInviteCheckbox();
+ event.stopPropagation();
+ };
+
+ $(document).on('click', '.team-chkbox', function () {
+ var allChecked = $('.team-chkbox:checked').length === $('.team-chkbox').length;
+ $('#chkboxInviteAllTeams').prop('checked', allChecked);
+ updateInviteCheckbox();
+ });
+
+ $(document).on('click', '.user-chkbox', function () {
+ var allChecked = $('.user-chkbox:checked').length === $('.user-chkbox').length;
+ $('#chkboxInviteAllUsers').prop('checked', allChecked);
+ updateInviteCheckbox();
+ });
+
+ $("#formClause").validate({
+ ignore: "",
+ rules: {
+ clauseText: {
+ required: true
+ }
+ },
+ messages: {
+ clauseText: {
+ required: "Please select the text from the document"
+ }
+ },
+ errorClass: "error", // CSS class for error messages
+ errorPlacement: function (error, element) {
+ error.insertAfter(element); // Place error messages after the element
+ },
+ submitHandler: function (form) {
+ createClauseSection(socket);
+ }
+ });
+ /**====================== Section: Create Clause ======================*/
+
+ /**====================== Section: Conversation History ======================*/
+ elements.btnCloseConversionHistory.onclick = async function (event) {
+ if (sectionID) {
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ closeBottomPopup();
+ } else {
+ location.reload(true);
+ }
+ };
+
+ elements.btnGoToCounterpartyChat.onclick = async function (event) {
+ withType = 'Counterparty';
+ messageConfirmationFor = 'Opposite Side';
+ elements.conversionCounterparty.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionDetails();
+ await getContractSectionMessageList('Counterparty');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputCounterParty.value = "";
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, false);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ };
+
+ elements.btnGoToSameSideChat.onclick = async function (event) {
+ withType = 'Our Team';
+ messageConfirmationFor = 'Same Side';
+ elements.conversionSameSide.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionDetails();
+ await getContractSectionMessageList('our');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputSameSide.value = "";
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, false);
+ }
+
+ elements.divChatHistoryBody.onscroll = (e) => {
+ if (elements.divChatHistoryBody?.scrollTop == 0 && chatHistoryNextPage && chatHistoryNextPage != 1) {
+ getClauseConversionHistory();
+ }
+ };
+
+ $(document).on('click', '.scheduled-meeting', function () {
+ getContractMeetingDetails($(this).data('id'));
+ elements.btnMeetingView.setAttribute('data-id', $(this).data('id'));
+ elements.btnMeetingEnterOutcomes.setAttribute('data-id', $(this).data('id'));
+ });
+
+ $(document).on('click', '.btn-meeting-view', function () {
+ var meetingData = {
+ meetingId: $(this).data('id'),
+ chatRoomName: loggedInUserDetails._id + "_" + contractID
+ };
+ socket.emit('scheduledMeetingView', meetingData)
+ });
+
+ $(document).on('click', '.btn-meeting-close', function () {
+ closeBottomPopup();
+ });
+ /**====================== Section: Conversation History ======================*/
+
+ /**====================== Section: Sameside chat ======================*/
+ elements.messageInputSameSide.onkeydown = async function (event) {
+ var data = {
+ chatRoomName: getChatRoom(withType),
+ userName: loggedInUserDetails.firstName,
+ with: withType
+ }
+ socket.emit('userTypingContractSection', data);
+ };
+
+ elements.btnAttachFileSameSide.onclick = async function (event) {
+ elements.attachFileSameSide.click();
+ }
+
+ elements.attachFileSameSide.onchange = async function (event) {
+ attachFileSameSide = [];
+ const fileInput = event.target;
+ attachFileSameSide = event.target.files; // Get the selected files
+ const maxFiles = 10;
+ const maxSize = 100 * 1024 * 1024; // 100 MB in bytes
+ elements.errorFileUploadSameSide.innerHTML = "";
+ switchClass(elements.messageInputSameSide.parentElement, 'error-validation', false);
+ // Check the number of selected files
+ if (attachFileSameSide.length > maxFiles) {
+ let iHtml = '' + `You can only upload up to ${maxFiles} files.` + ' ';
+ elements.errorFileUploadSameSide.innerHTML = iHtml;
+ fileInput.value = ''; // Clear the input
+ switchClass(elements.messageInputSameSide.parentElement, 'error-validation', true);
+ attachFileSameSide = [];
+ return;
+ }
+
+ let totalSize = 0;
+ for (const file of attachFileSameSide) {
+ totalSize += file.size;
+ }
+
+ // Check the total size of the selected files
+ if (totalSize > maxSize) {
+ let iHtml = '' + `The total size of files must not exceed 100 MB.` + ' ';
+ elements.errorFileUploadSameSide.innerHTML = iHtml;
+ fileInput.value = ''; // Clear the input
+ attachFileSameSide = [];
+ switchClass(elements.messageInputSameSide.parentElement, 'error-validation', true);
+ return;
+ }
+
+ if (attachFileSameSide && attachFileSameSide.length > 0) {
+ // elements.attchedFilenameSameSide.innerHTML = "Files Upload Progress: 0/" + (attachFileSameSide.length);
+ const formdata = new FormData();
+ formdata.append("contractId", contractID);
+ formdata.append("contractSectionId", selectedClauseID);
+ formdata.append("chatWindow", withType);
+ formdata.append("with", withType);
+ for (let i = 0; i < attachFileSameSide.length; i++) {
+ const file = attachFileSameSide[i];
+ const fileName = file.name;
+ formdata.append("attachments[]", file, fileName);
+ }
+ var otherDetails = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "notifyUsers": [],
+ "with": withType,
+ "messageType": 'Attachment',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ await addContractSectionAttachment(formdata, otherDetails, socket);
+ attachFileSameSide = [];
+ }
+ };
+
+ elements.btnOpenInviteUserTeam.onclick = async function (event) {
+ if (elements.btnOpenInviteUserTeam.closest("li").classList.contains('active')) {
+ elements.btnOpenInviteUserTeam.closest("li").classList.remove('active');
+ } else {
+ getContractSectionDetails();
+ elements.btnOpenInviteUserTeam.closest("li").classList.add('active');
+ }
+ };
+
+ elements.btnGoToConversionHistory.onclick = async function (event) {
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ closeBottomPopup();
+ };
+
+ elements.btnSendSameSide.onclick = async function (event) {
+ chat_message = elements.messageInputSameSide.innerHTML.trim();
+ notifyUsers = tagUserInMessage;
+ elements.messageInputSameSide.innerHTML = "";
+ tagUserInMessage = [];
+ if (chat_message) {
+ var addNewContractMessageDetail = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": chat_message,
+ "notifyUsers": notifyUsers,
+ "with": withType,
+ "messageType": 'Normal',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ await addContractSectionMessage(addNewContractMessageDetail, socket);
+ }
+ // if (attachFileSameSide && attachFileSameSide.length > 0) {
+ // const formdata = new FormData();
+ // formdata.append("contractId", contractID);
+ // formdata.append("contractSectionId", selectedClauseID);
+ // formdata.append("chatWindow", withType);
+ // formdata.append("with", withType);
+ // for (let i = 0; i < attachFileSameSide.length; i++) {
+ // const file = attachFileSameSide[i];
+ // const fileName = file.name;
+ // formdata.append("attachments[]", file, fileName);
+ // }
+ // var otherDetails = {
+ // "contractId": contractID,
+ // "contractSectionId": selectedClauseID,
+ // "notifyUsers": notifyUsers,
+ // "with": withType,
+ // "messageType": 'Attachment',
+ // "companyId": loggedInCompanyDetails._id,
+ // "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ // "threadID": selectedThreadID,
+ // "status": 'send',
+ // "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ // "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ // "actionperformedbyUserRole": openContractResponseData.userRole,
+ // "messageConfirmationFor": messageConfirmationFor,
+ // "chatRoomName": getChatRoom(withType),
+ // "messageNumber": 0,
+ // "chatWindow": withType
+ // };
+ // await addContractSectionAttachment(formdata, otherDetails, socket);
+ // attachFileSameSide = [];
+ // }
+ };
+
+ elements.btnSendPositionConfirmationSameSide.onclick = async function (event) {
+ var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (contractInformation && contractInformation.userWhoHasEditAccess == loggedInUserDetails._id && contractInformation.canSendPositionConfirmation && selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.isSectionInDraftMode) {
+ switchClass(elements.sendDraftConfirmationPopup, displayNoneClass, false);
+ } else if (openContractResponseData.canSendPositionConfirmation) {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ };
+
+ elements.btnSendPositionConfirmationSameSideB.onclick = async function (event) {
+ var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (contractInformation && contractInformation.userWhoHasEditAccess == loggedInUserDetails._id && contractInformation.canSendPositionConfirmation && selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.isSectionInDraftMode) {
+ switchClass(elements.sendDraftConfirmationPopup, displayNoneClass, false);
+ } else if (openContractResponseData.canSendPositionConfirmation) {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ };
+
+ elements.btnWithdrawnClauseSameSide.onclick = async function (event) {
+ var varWithdrawnContractSection = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "with": withType,
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": '',
+ "confirmationType": 'withdrawn',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageId": $(this).data('id'),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ withdrawnContractSection(varWithdrawnContractSection, socket);
+ };
+
+ elements.btnCloseSameSideChat.onclick = async function (event) {
+ if (sectionID) {
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ closeBottomPopup();
+ } else {
+ location.reload(true);
+ }
+ };
+
+ elements.btnInviteUsers.onclick = async function (event) {
+ var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (getClauseDetails) {
+ var isAllInvited = [];
+ if (openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty' || openContractResponseData.userRole == 'Contract Creator') {
+ inviteUserListIDs.forEach((el) => {
+ if (!(selectedContractSectionDetails.contractAssignedUsers.findIndex((ele) => ele.userId._id == el.itemId) > -1)) {
+ isAllInvited.push(false);
+ } else {
+ isAllInvited.push(true);
+ }
+ });
+ } else {
+ inviteUserListIDs.forEach((el) => {
+ // if (!getClauseDetails.assignedUser.includes(el.itemId)) {
+ if (!(selectedContractSectionDetails.contractAssignedUsers.findIndex((ele) => ele.userId._id == el.itemId) > -1)) {
+ isAllInvited.push(false);
+ } else {
+ isAllInvited.push(true);
+ }
+ });
+ }
+ if (inviteUserListIDs && inviteUserListIDs.length == 0) {
+ switchClass(elements.allUserInvitedMessage, displayNoneClass, true);
+ switchClass(elements.noUserInviteListMessage, displayNoneClass, false);
+ switchClass(elements.partiallyInvitedUserListMessage, displayNoneClass, true);
+ switchClass(elements.sendInviteUsers, displayNoneClass, true);
+ switchClass(elements.inviteUserTable, displayNoneClass, true);
+ } else if (!isAllInvited.includes(false)) {
+ switchClass(elements.allUserInvitedMessage, displayNoneClass, false);
+ switchClass(elements.noUserInviteListMessage, displayNoneClass, true);
+ switchClass(elements.partiallyInvitedUserListMessage, displayNoneClass, true);
+ switchClass(elements.sendInviteUsers, displayNoneClass, true);
+ switchClass(elements.inviteUserTable, displayNoneClass, true);
+ } else {
+ switchClass(elements.allUserInvitedMessage, displayNoneClass, true);
+ switchClass(elements.noUserInviteListMessage, displayNoneClass, true);
+ switchClass(elements.partiallyInvitedUserListMessage, displayNoneClass, false);
+ switchClass(elements.sendInviteUsers, displayNoneClass, false);
+ switchClass(elements.inviteUserTable, displayNoneClass, false);
+ inviteUserSelect = [];
+ inviteTeamSelect = [];
+ // Render the User Table
+ var iHtml = 'Select User \n';
+ iHtml += '\n' +
+ '\t\t\t\t
\n' +
+ '
';
+ elements.inviteUserTable.innerHTML = '';
+ elements.inviteUserTable.innerHTML = iHtml;
+ }
+ switchClass(elements.inviteUserPopup, displayNoneClass, false);
+ switchClass(elements.inviteTeamPopup, displayNoneClass, true);
+ }
+ };
+
+ elements.btnInviteTeams.onclick = async function (event) {
+ var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (getClauseDetails) {
+ var isAllInvited = [];
+
+ if (openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty' || openContractResponseData.userRole == 'Contract Creator') {
+ inviteTeamListIDs.forEach((el) => {
+ if (!(selectedContractSectionDetails.contractAssignedTeams.findIndex((ele) => ele._id == el.itemId) > -1)) {
+ isAllInvited.push(false);
+ } else {
+ isAllInvited.push(true);
+ }
+ });
+ } else {
+ inviteTeamListIDs.forEach((el) => {
+ // if (!getClauseDetails.assignedUser.includes(el.itemId)) {
+ if (!(selectedContractSectionDetails.contractAssignedTeams.findIndex((ele) => ele._id == el.itemId) > -1)) {
+ isAllInvited.push(false);
+ } else {
+ isAllInvited.push(true);
+ }
+ });
+ }
+
+ if (inviteTeamListIDs && inviteTeamListIDs.length == 0) {
+ switchClass(elements.allTeamInvitedMessage, displayNoneClass, true);
+ switchClass(elements.noTeamInviteListMessage, displayNoneClass, false);
+ switchClass(elements.partiallyInvitedTeamListMessage, displayNoneClass, true);
+ switchClass(elements.sendInviteTeams, displayNoneClass, true);
+ switchClass(elements.inviteTeamTable, displayNoneClass, true);
+ } else if (!isAllInvited.includes(false)) {
+ switchClass(elements.allTeamInvitedMessage, displayNoneClass, false);
+ switchClass(elements.noTeamInviteListMessage, displayNoneClass, true);
+ switchClass(elements.partiallyInvitedTeamListMessage, displayNoneClass, true);
+ switchClass(elements.sendInviteTeams, displayNoneClass, true);
+ switchClass(elements.inviteTeamTable, displayNoneClass, true);
+ } else {
+ switchClass(elements.allTeamInvitedMessage, displayNoneClass, true);
+ switchClass(elements.noTeamInviteListMessage, displayNoneClass, true);
+ switchClass(elements.partiallyInvitedTeamListMessage, displayNoneClass, false);
+ switchClass(elements.sendInviteTeams, displayNoneClass, false);
+ switchClass(elements.inviteTeamTable, displayNoneClass, false);
+ inviteUserSelect = [];
+ inviteTeamSelect = [];
+ // Render the Team Table
+ var iHtml = 'Select Team \n';
+ iHtml += '\n' +
+ '\t\t\t\t
\n' +
+ '
';
+
+ elements.inviteTeamTable.innerHTML = '';
+ elements.inviteTeamTable.innerHTML = iHtml;
+ }
+
+ switchClass(elements.inviteUserPopup, displayNoneClass, true);
+ switchClass(elements.inviteTeamPopup, displayNoneClass, false);
+ }
+ };
+
+ elements.sendInviteUsers.onclick = async function (event) {
+ inviteUsersInContractSection(socket, 'users');
+ };
+
+ elements.sendInviteTeams.onclick = async function (event) {
+ inviteUsersInContractSection(socket, 'teams');
+ };
+
+ elements.btnGoToCounterparty.onclick = async function (event) {
+ withType = 'Counterparty';
+ messageConfirmationFor = 'Opposite Side';
+ elements.conversionCounterparty.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionDetails();
+ await getContractSectionMessageList('Counterparty');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputCounterParty.value = "";
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, false);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ };
+
+ elements.divChatSameSideBody.onscroll = (e) => {
+ if (elements.divChatSameSideBody?.scrollTop == 0 && chatHasNextPage && chatNextPage != 1) {
+ getContractSectionMessageList('our');
+ }
+ };
+
+ elements.inputAssignDraftRequest.onclick = async function (event) {
+ if (elements.assignDraftRequestBox.classList.contains(displayNoneClass)) {
+ elements.accordionAssignDraftRequest.innerHTML = '';
+ getContractTeamAndUserList('assignDraftRequest');
+ switchClass(elements.assignDraftRequestBox, displayNoneClass, false);
+ } else {
+ switchClass(elements.assignDraftRequestBox, displayNoneClass, true);
+ }
+
+ };
+
+ elements.inputReassignDraftRequest.onclick = async function (event) {
+ if (elements.reassignDraftRequestBox.classList.contains(displayNoneClass)) {
+ elements.accordionReassignDraftRequest.innerHTML = '';
+ getContractTeamAndUserList('reassignDraftRequest');
+ switchClass(elements.reassignDraftRequestBox, displayNoneClass, false);
+ } else {
+ switchClass(elements.reassignDraftRequestBox, displayNoneClass, true);
+ }
+ };
+
+ elements.btnScheduleMeetingSameSide.onclick = async function (event) {
+ var meetingData = {
+ contractId: contractID,
+ contractSectionId: selectedClauseID,
+ contractSectionThreadId: selectedThreadID,
+ chatRoomName: loggedInUserDetails._id + "_" + contractID
+ };
+ socket.emit('meetingSchedule', meetingData)
+ };
+
+ elements.btnScheduleMeetingSameSideB.onclick = async function (event) {
+ var meetingData = {
+ contractId: contractID,
+ contractSectionId: selectedClauseID,
+ contractSectionThreadId: selectedThreadID,
+ chatRoomName: loggedInUserDetails._id + "_" + contractID
+ };
+ socket.emit('meetingSchedule', meetingData)
+ };
+
+ document.addEventListener('click', function (e) {
+ if (!elements.divInviteUserTabs.contains(e.target) && e.target !== elements.imgInviteUserTeam) {
+ if (elements.btnOpenInviteUserTeam.closest('li')) {
+ switchClass(elements.btnOpenInviteUserTeam.closest('li'), 'active', false);
+ }
+ }
+ });
+
+ $(document).on('click', '#inviteAllUsersFromPopup', function () {
+ $('.invite-user-chkbox').prop('checked', this.checked);
+ updateInvitePopupCheckbox();
+ });
+
+ $(document).on('click', '.invite-user-chkbox', function () {
+ var allChecked = $('.invite-user-chkbox:checked').length === $('.invite-user-chkbox').length;
+ $('#inviteAllUsersFromPopup').prop('checked', allChecked);
+ updateInvitePopupCheckbox();
+ });
+
+ $(document).on('click', '#inviteAllTeamsFromPopup', function () {
+ $('.invite-team-chkbox').prop('checked', this.checked);
+ updateInvitePopupCheckbox();
+ });
+
+ $(document).on('click', '.invite-team-chkbox', function () {
+ var allChecked = $('.invite-team-chkbox:checked').length === $('.invite-team-chkbox').length;
+ $('#inviteAllTeamsFromPopup').prop('checked', allChecked);
+ updateInvitePopupCheckbox();
+ });
+
+ $(document).on('click', '.btn-close-bottom-popup', function () {
+ closeBottomPopup();
+ });
+
+ $(document).on('click', '.assign-user', function () {
+ let actionType = $(this).data('action');
+ if (actionType == "reassign-user") {
+ let messageID = $(this).data('id');
+ elements.formReassignDraftRequest.reset();
+ switchClass(elements.divReassignDraftingBox, displayNoneClass, true);
+ elements.reassignDraftRequestUserId.value = "";
+ elements.inputReassignDraftRequest.placeholder = "Select user";
+ elements.reassignDraftRequestMessageId.value = messageID;
+ switchClass(elements.reassignDraftRequestPopup, displayNoneClass, false);
+ } else {
+ elements.assignDraftRequestMessageId.value = $(this).data('id');
+ switchClass(elements.assignDraftRequestPopup, displayNoneClass, false);
+ }
+ });
+
+ $(document).on('click', '.draft-request-user', function () {
+ var userID = $(this).data('id');
+ var userName = $(this).data('name');
+ updateAssignDraftRequest(userID, userName);
+ elements.sendAssignDraftRequest.disabled = false;
+ $('#btncollapseUsersA').toggleClass('active');
+ var target = $('#btncollapseUsersA').attr('data-bs-target');
+ $(target).collapse('toggle');
+ switchClass(elements.assignDraftRequestBox, displayNoneClass, true)
+ });
+
+ $(document).on('click', '.redraft-request-user', function () {
+ var userID = $(this).data('id');
+ var userName = $(this).data('name');
+ updateReassignDraftRequest(userID, userName);
+ elements.sendReassignDraftRequest.disabled = false;
+ $('#btncollapseUsersC').toggleClass('active');
+ var target = $('#btncollapseUsersC').attr('data-bs-target');
+ $(target).collapse('toggle');
+ switchClass(elements.reassignDraftRequestBox, displayNoneClass, true)
+ });
+
+ setInterval(function () {
+ var hasDNoneClass = $('#assignDraftingRequestBox').hasClass('d-none');
+ if (!hasDNoneClass) {
+ $('#assignDraftingRequestInput-error').addClass('d-none');
+ } else {
+ $('#assignDraftingRequestInput-error').removeClass('d-none');
+ }
+ }, 250);
+
+ $("#formAssignDraftRequest").validate({
+ submitHandler: function (form) {
+ var assignDraftRequest = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "status": "approved",
+ "confirmationType": "assign_draft",
+ "messageType": "Notification",
+ "with": withType,
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail._id,
+ "threadID": selectedThreadID,
+ "messageConfirmationFor": messageConfirmationFor,
+ "messageId": elements.assignDraftRequestMessageId.value,
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "chatRoomName": getChatRoom(withType),
+ "sendTo": elements.assignDraftRequestUserId.value,
+ "sendToName": elements.inputAssignDraftRequest.placeholder,
+ "chatWindow": withType
+ };
+ updateContractSectionConfirmationStatus(assignDraftRequest, socket);
+ $('.assign-user[data-id="' + assignDraftRequest.messageId + '"]').parent().addClass(displayNoneClass);
+ elements.inputAssignDraftRequest.placeholder = "Select user";
+ }
+ });
+
+ /**
+ * @description This function is set the AtWho user lists
+ */
+ function setSameSideUserTagLists() {
+ $('#messageInputSameSide').atwho({
+ at: "@",
+ data: sameSideUserList,
+ displayTpl: "${name} ",
+ insertTpl: '@${name} ',
+ callbacks: {
+ beforeInsert: function (value, $li) {
+ var match = value.match(/data-id="([0-9a-f]+)"/);
+ var match2 = value.match(/data-companyid="([0-9a-f]+)"/);
+ if (match && match2) {
+ var dataIdValue = match[1];
+ var dataCompanyIdValue = match2[1];
+ tagUserInMessage.push({"userId": dataIdValue, "companyId": dataCompanyIdValue});
+ }
+ return value;
+ }
+ }
+ });
+ }
+
+ /**
+ * @description This function will prepare the object for invite users and teams
+ */
+ function updateInvitePopupCheckbox() {
+ $('.invite-user-chkbox').each(function () {
+ var isChecked = $(this).prop("checked");
+ var dataID = $(this).parent().data('id');
+ var jsonData = inviteUserListIDs.find((ele) => ele.itemId == dataID);
+ if (isChecked) {
+ if (inviteUserSelect.findIndex((ele) => ele.itemId == jsonData.itemId) < 0) {
+ inviteUserSelect.push(jsonData);
+ }
+ } else {
+ if (inviteUserSelect.findIndex((ele) => ele.itemId == jsonData.itemId) > -1) {
+ inviteUserSelect = $.grep(inviteUserSelect, function (value) {
+ return value.itemId != dataID;
+ });
+ }
+ }
+ });
+
+ $('.invite-team-chkbox').each(function () {
+ var isChecked = $(this).prop("checked");
+ var dataID = $(this).parent().data('id');
+ var jsonData = inviteTeamListIDs.find((ele) => ele.itemId == dataID);
+ if (isChecked) {
+ if (inviteTeamSelect.findIndex((ele) => ele.itemId == jsonData.itemId) < 0) {
+ inviteTeamSelect.push(jsonData);
+ }
+ } else {
+ if (inviteTeamSelect.findIndex((ele) => ele.itemId == jsonData.itemId) > -1) {
+ inviteTeamSelect = $.grep(inviteTeamSelect, function (value) {
+ return value.itemId != dataID;
+ });
+ }
+ }
+ });
+ updateUserInvitePopupButton();
+ }
+
+ /**
+ * @description Update the invite button enable/disable
+ */
+ function updateUserInvitePopupButton() {
+ var buttonUser = elements.sendInviteUsers;
+ if (inviteUserSelect && inviteUserSelect.length > 0) {
+ buttonUser.disabled = false;
+ } else {
+ buttonUser.disabled = true;
+ }
+
+ var buttonTeam = elements.sendInviteTeams;
+ if (inviteTeamSelect && inviteTeamSelect.length > 0) {
+ buttonTeam.disabled = false;
+ } else {
+ buttonTeam.disabled = true;
+ }
+ };
+
+ /**
+ * @description This function is used for set the name and store the id on hidden input
+ * @param userID
+ * @param userName
+ */
+ function updateAssignDraftRequest(userID, userName) {
+ elements.assignDraftRequestUserId.value = userID;
+ elements.inputAssignDraftRequest.value = userName;
+ elements.inputAssignDraftRequest.placeholder = userName;
+ }
+
+ /**
+ * @description This function is used for set the name and store the id on hiddent input
+ * @param userID
+ * @param userName
+ */
+ function updateReassignDraftRequest(userID, userName) {
+ elements.reassignDraftRequestUserId.value = userID;
+ elements.inputReassignDraftRequest.value = userName;
+ elements.inputReassignDraftRequest.placeholder = userName;
+ }
+
+ /**====================== Section: Sameside chat ======================*/
+
+
+ /**====================== Section: Counterparty chat ======================*/
+ elements.messageInputCounterParty.onkeydown = async function (event) {
+ var data = {
+ chatRoomName: getChatRoom(withType),
+ userName: loggedInUserDetails.firstName,
+ with: withType
+ };
+ socket.emit('userTypingContractSection', data);
+ };
+
+
+ elements.btnAttachFileCounterparty.onclick = async function (event) {
+ elements.attachFileCounterparty.click();
+ }
+
+ elements.attachFileCounterparty.onchange = async function (event) {
+ attachFileCounterparty = [];
+ const fileInput = event.target;
+ attachFileCounterparty = event.target.files; // Get the selected files
+
+ const maxFiles = 10;
+ const maxSize = 100 * 1024 * 1024; // 100 MB in bytes
+ elements.errorFileUploadCounterparty.innerHTML = "";
+ switchClass(elements.messageInputCounterParty.parentElement, 'error-validation', false);
+ // Check the number of selected files
+ if (attachFileCounterparty.length > maxFiles) {
+ let iHtml = '' + `You can only upload up to ${maxFiles} files.` + ' ';
+ elements.errorFileUploadCounterparty.innerHTML = iHtml;
+ fileInput.value = ''; // Clear the input
+ switchClass(elements.messageInputCounterParty.parentElement, 'error-validation', true);
+ attachFileSameSide = [];
+ return;
+ }
+
+ let totalSize = 0;
+ for (const file of attachFileCounterparty) {
+ totalSize += file.size;
+ }
+
+ // Check the total size of the selected files
+ if (totalSize > maxSize) {
+ let iHtml = '' + `The total size of files must not exceed 100 MB.` + ' ';
+ elements.errorFileUploadCounterparty.innerHTML = iHtml;
+ fileInput.value = ''; // Clear the input
+ attachFileSameSide = [];
+ switchClass(elements.messageInputCounterParty.parentElement, 'error-validation', true);
+ return;
+ }
+
+ if (attachFileCounterparty && attachFileCounterparty.length > 0) {
+ const formdata = new FormData();
+ formdata.append("contractId", contractID);
+ formdata.append("contractSectionId", selectedClauseID);
+ formdata.append("chatWindow", withType);
+ formdata.append("with", withType);
+ for (let i = 0; i < attachFileCounterparty.length; i++) {
+ const file = attachFileCounterparty[i];
+ const fileName = file.name;
+ formdata.append("attachments[]", file, fileName);
+ }
+ var otherDetails = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "notifyUsers": [],
+ "with": withType,
+ "messageType": 'Attachment',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ }
+ await addContractSectionAttachment(formdata, otherDetails, socket);
+ attachFileCounterparty = [];
+ }
+ };
+
+ elements.btnGoToConversionChatHistory.onclick = async function (event) {
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ closeBottomPopup();
+ };
+
+ elements.btnSendCounterParty.onclick = async function (event) {
+ chat_message = elements.messageInputCounterParty.innerHTML.trim();
+ notifyUsers = tagUserInMessage;
+ elements.messageInputCounterParty.innerHTML = "";
+ tagUserInMessage = [];
+ if (chat_message) {
+ var addNewContractMessageDetail = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": chat_message,
+ "notifyUsers": notifyUsers,
+ "with": withType,
+ "messageType": 'Normal',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ await addContractSectionMessage(addNewContractMessageDetail, socket);
+ }
+ /*if (attachFileCounterparty && attachFileCounterparty.length > 0) {
+ const formdata = new FormData();
+ formdata.append("contractId", contractID);
+ formdata.append("contractSectionId", selectedClauseID);
+ formdata.append("chatWindow", withType);
+ formdata.append("with", withType);
+ for (let i = 0; i < attachFileCounterparty.length; i++) {
+ const file = attachFileCounterparty[i];
+ const fileName = file.name;
+ formdata.append("attachments[]", file, fileName);
+ }
+ var otherDetails = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "notifyUsers": notifyUsers,
+ "with": withType,
+ "messageType": 'Attachment',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ }
+ await addContractSectionAttachment(formdata, otherDetails, socket);
+ attachFileCounterparty = [];
+ }*/
+ };
+
+ elements.btnGoToSameSide.onclick = async function (event) {
+ withType = 'Our Team';
+ messageConfirmationFor = 'Same Side';
+ elements.conversionSameSide.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionDetails();
+ await getContractSectionMessageList('our');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputSameSide.value = "";
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, false);
+ };
+
+ elements.btnCloseCounterpartyChat.onclick = async function (event) {
+ if (sectionID) {
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ closeBottomPopup();
+ } else {
+ location.reload(true);
+ }
+ };
+
+ elements.btnSendPositionConfirmationCounterparty.onclick = async function (event) {
+ getContractDetails(socket, redirection = false);
+ // var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (openContractResponseData && openContractResponseData.canSendPositionConfirmation && selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.isSectionInDraftMode) {
+ if (contractInformation.userWhoHasEditAccess == loggedInUserDetails._id || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Admin") {
+ switchClass(elements.sendDraftConfirmationPopup, displayNoneClass, false);
+ } else {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ } else if (openContractResponseData.canSendPositionConfirmation) {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ };
+
+ elements.btnSendPositionConfirmationCounterpartyB.onclick = async function (event) {
+ getContractDetails(socket, redirection = false);
+ // var getClauseDetails = clauseLists.find((ele) => ele._id == selectedClauseID);
+ if (openContractResponseData && openContractResponseData.canSendPositionConfirmation && selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.isSectionInDraftMode) {
+ if (contractInformation.userWhoHasEditAccess == loggedInUserDetails._id || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Admin") {
+ switchClass(elements.sendDraftConfirmationPopup, displayNoneClass, false);
+ } else {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ } else if (openContractResponseData.canSendPositionConfirmation) {
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, false);
+ }
+ };
+
+ elements.divChatCounterPartyBody.onscroll = (e) => {
+ if (elements.divChatCounterPartyBody?.scrollTop == 0 && chatHasNextPage && chatNextPage != 1) {
+ getContractSectionMessageList('Counterparty');
+ }
+ };
+
+ /*elements.sendToTeamForDraft.onclick = async function (event) {
+ if (this.checked) {
+ switchClass(elements.divDraftingBox, displayNoneClass, false);
+ } else {
+ switchClass(elements.divDraftingBox, displayNoneClass, true);
+ elements.assignDraftingRequestUserId.value = "";
+ elements.approvePositionMessageId.value = $(this).data('id');
+ elements.assignDraftingRequestInput.placeholder = "Select user";
+ }
+ };
+
+ elements.sendToCounterpartyForDraft.onclick = async function (event) {
+ if (this.checked) {
+ switchClass(elements.divDraftingBox, displayNoneClass, true);
+ elements.assignDraftingRequestUserId.value = "";
+ elements.approvePositionMessageId.value = $(this).data('id');
+ elements.assignDraftingRequestInput.placeholder = "Select user";
+ } else {
+ switchClass(elements.divDraftingBox, displayNoneClass, false);
+ }
+ };*/
+
+ const radioButtons = document.querySelectorAll('input[name="myRadioButton"]');
+
+ radioButtons.forEach(radioButton => {
+ radioButton.addEventListener('change', function (event) {
+ if (event.target.checked) {
+ const selectedValue = event.target.value;
+ compareValues(selectedValue);
+ }
+ });
+ });
+
+ function compareValues(selectedValue) {
+ let message = '';
+ switch (selectedValue) {
+ case 'sameside':
+ switchClass(elements.divDraftingBox, displayNoneClass, false);
+ break;
+ default:
+ switchClass(elements.divDraftingBox, displayNoneClass, true);
+ let message = $('#inputPositionReason').val();
+ let messageID = $('#approvePositionMessageId').val();
+ elements.formReconfirmPosition.reset();
+ elements.assignDraftingRequestUserId.value = "";
+ elements.assignDraftingRequestInput.placeholder = "Select user";
+ elements.sendToCounterpartyForDraft.checked = true;
+ if (message) {
+ elements.inputPositionReason.value = message;
+ }
+ if (messageID) {
+ elements.approvePositionMessageId = messageID;
+ }
+ break;
+ }
+ }
+
+
+ const reAssignRadioButtons = document.querySelectorAll('input[name="reassignRadioButton"]');
+
+ reAssignRadioButtons.forEach(radioButton => {
+ radioButton.addEventListener('change', function (event) {
+ if (event.target.checked) {
+ const selectedValue = event.target.value;
+ elements.sendReassignDraftRequest.disabled = false;
+ if (selectedValue == 'sameside') {
+ elements.sendReassignDraftRequest.disabled = true;
+ switchClass(elements.divReassignDraftingBox, displayNoneClass, false);
+ } else {
+ switchClass(elements.divReassignDraftingBox, displayNoneClass, true);
+ let messageID = $('#reassignDraftRequestMessageId').val();
+ elements.formReassignDraftRequest.reset();
+ elements.reassignDraftRequestUserId.value = "";
+ elements.inputReassignDraftRequest.placeholder = "Select user";
+ elements.sendToCounterpartyForDraftA.checked = true;
+ if (messageID) {
+ elements.reassignDraftRequestMessageId = messageID;
+ }
+ }
+ }
+ });
+ });
+
+
+ elements.assignDraftingRequestInput.onclick = async function (event) {
+ if (elements.assignDraftingRequestBox.classList.contains(displayNoneClass)) {
+ elements.accordionPositionConfirmation.innerHTML = '';
+ getContractTeamAndUserList('positionConfirmation');
+ switchClass(elements.assignDraftingRequestBox, displayNoneClass, false);
+ } else {
+ switchClass(elements.assignDraftingRequestBox, displayNoneClass, true);
+ }
+ };
+
+ elements.btnScheduleMeetingCounterparty.onclick = async function (event) {
+ var meetingData = {
+ contractId: contractID,
+ contractSectionId: selectedClauseID,
+ contractSectionThreadId: selectedThreadID,
+ chatRoomName: loggedInUserDetails._id + "_" + contractID
+ };
+ socket.emit('meetingSchedule', meetingData)
+ };
+
+ elements.btnScheduleMeetingCounterpartyB.onclick = async function (event) {
+ var meetingData = {
+ contractId: contractID,
+ contractSectionId: selectedClauseID,
+ contractSectionThreadId: selectedThreadID,
+ chatRoomName: loggedInUserDetails._id + "_" + contractID
+ };
+ socket.emit('meetingSchedule', meetingData)
+ };
+
+ $(document).on('click', '.reconfirm-approve', function () {
+ elements.formReconfirmPosition.reset();
+ switchClass(elements.divDraftingBox, displayNoneClass, true);
+ elements.assignDraftingRequestUserId.value = "";
+ elements.approvePositionMessageId.value = $(this).data('id');
+ elements.assignDraftingRequestInput.placeholder = "Select user";
+ switchClass(elements.confirmPositionPopup, displayNoneClass, false);
+ });
+
+ $(document).on('click', '.assign-draft-request-user', function () {
+ var userID = $(this).data('id');
+ var userName = $(this).data('name');
+ updateAssignDraftRequestDropdown(userID, userName);
+ elements.sendAssignDraftRequest.disabled = false;
+ $('#btncollapseUsersB').toggleClass('active');
+ var target = $('#btncollapseUsersB').attr('data-bs-target');
+ $(target).collapse('toggle');
+ switchClass(elements.assignDraftingRequestBox, displayNoneClass, true);
+ });
+
+ $(document).on('click', '.reconfirm-reject', function () {
+ elements.rejectPositionMessageId.value = $(this).data('id');
+ switchClass(elements.rejectPositionPopup, displayNoneClass, false);
+ });
+
+ $(document).on('click', '.approve-possition', function () {
+ var approveConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "with": withType,
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'approved',
+ "confirmationType": "position",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageId": $(this).data('id'),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ updateContractSectionConfirmationStatus(approveConfirmation, socket);
+ $(this).parent().addClass('d-none');
+ });
+
+ $(document).on('click', '.btn-box-re-open', function () {
+ var reopenDetail = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "confirmationType": "Reopen",
+ "messageType": 'Notification',
+ "with": withType,
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "chatWindow": withType
+ };
+ reOpenContractSection(reopenDetail, socket);
+ switchClass(elements.divChatSameSideBody, 'contract-completed', false);
+ switchClass(elements.divChatCounterPartyBody, 'contract-completed', false);
+ switchClass(elements.divSameSideTextbox, displayNoneClass, false);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, false);
+
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var draftConfirmCPElement = document.getElementById("draftConfirmCP");
+ if (draftConfirmCPElement) {
+ draftConfirmCPElement.parentNode.removeChild(draftConfirmCPElement);
+ }
+ var draftConfirmSSElement = document.getElementById("draftConfirmSS");
+ if (draftConfirmSSElement) {
+ draftConfirmSSElement.parentNode.removeChild(draftConfirmSSElement);
+ }
+ });
+
+ $(document).on('click', '.draft-approve', function () {
+ var approveDraftConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "with": withType,
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'approved',
+ "confirmationType": "draft",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageId": $(this).data('id'),
+ "chatWindow": withType
+ };
+ updateContractSectionConfirmationStatus(approveDraftConfirmation, socket);
+ $(this).parent().addClass('d-none');
+ });
+
+ $(document).on('click', '.draft-reject', function () {
+ elements.rejectDraftMessageId.value = $(this).data('id');
+ switchClass(elements.rejectDarftPopup, displayNoneClass, false);
+ });
+
+ $("#formReconfirmPosition").validate({
+ rules: {
+ inputPositionReason: {
+ required: true
+ },
+ assignDraftingRequestInput: {
+ required: function (element) {
+ return elements.sendToTeamForDraft.checked
+ }
+ }
+ },
+ submitHandler: function (form) {
+ var approveConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": $('#inputPositionReason').val(),
+ "with": "Counterparty",
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'approved',
+ "confirmationType": "request_draft",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "actionperformedbyUserType": loggedInCompanyDetails._id == contractInformation.counterPartyCompanyId ? 'Counterparty' : 'Customer',
+ "messageConfirmationFor": 'Opposite Side',
+ "chatRoomName": getChatRoom('Counterparty'),
+ "messageId": $('#approvePositionMessageId').val(),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ if (elements.assignDraftingRequestUserId.value && elements.sendToTeamForDraft.checked) {
+ approveConfirmation.with = 'Our Team';
+ approveConfirmation.messageConfirmationFor = 'Same Side';
+ approveConfirmation.sendTo = elements.assignDraftingRequestUserId.value;
+ approveConfirmation.sendToName = elements.assignDraftingRequestInput.placeholder;
+ approveConfirmation.chatRoomName = 'user_' + counterPartyCompanyDetail._id + selectedThreadID
+ }
+ updateContractSectionConfirmationStatus(approveConfirmation, socket);
+ $('.reconfirm-approve[data-id="' + approveConfirmation.messageId + '"]').parent().addClass(displayNoneClass);
+ }
+ });
+
+ $("#formSendPositionConfirmation").validate({
+ submitHandler: function (form, event) {
+ chat_message = elements.inputSendPositionConfirmation.value;
+ elements.inputSendPositionConfirmation.value = "";
+ if (chat_message) {
+ var sendPositionConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": chat_message,
+ "with": withType,
+ "messageType": 'Position Confirmation',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "messageStatus": 'None',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "actionperformedbyUserId": loggedInUserDetails._id,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ addContractSectionMessage(sendPositionConfirmation, socket);
+ }
+ }
+ });
+
+ $("#formRejectPosition").validate({
+ submitHandler: function (form) {
+ var rejectConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": elements.inputRejectPositionReason.value,
+ "with": withType,
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'rejected',
+ "confirmationType": "position",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageId": elements.rejectPositionMessageId.value,
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ updateContractSectionConfirmationStatus(rejectConfirmation, socket);
+ $('.reconfirm-reject[data-id="' + rejectConfirmation.messageId + '"]').parent().addClass(displayNoneClass);
+ }
+ });
+
+ $("#formSendDraftConfirmation").validate({
+ submitHandler: function (form) {
+ chat_message = elements.inputSendDraftConfirmation.value;
+ elements.inputSendDraftConfirmation.value = "";
+ if (chat_message) {
+ var sendDraftConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": chat_message,
+ "with": withType,
+ "messageType": 'Draft Confirmation',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'send',
+ "messageStatus": 'None',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "actionperformedbyUserId": loggedInUserDetails._id,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ addContractSectionMessage(sendDraftConfirmation, socket);
+ }
+ }
+ });
+
+ $("#formRejectDraft").validate({
+ submitHandler: function (form) {
+ var rejectConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": elements.inputRejectDraftReason.value,
+ "with": withType,
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'rejected',
+ "confirmationType": "draft",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "chatRoomName": getChatRoom(withType),
+ "messageId": elements.rejectDraftMessageId.value,
+ "messageNumber": 0,
+ "chatWindow": withType
+ };
+ updateContractSectionConfirmationStatus(rejectConfirmation, socket);
+ $('.draft-reject[data-id="' + rejectConfirmation.messageId + '"]').parent().addClass(displayNoneClass);
+ }
+ });
+
+ $("#formMeetingOutcomes").validate({
+ submitHandler: function (form) {
+ submitMeetingOutcomes();
+ }
+ });
+
+ $("#formClauseToGroup").validate({
+ rules: {
+ groupname: {
+ required: function (element) {
+ return elements.radioCreateGroup.checked
+ }
+ },
+ groupid: {
+ required: function (element) {
+ return elements.radioExistingGroup.checked
+ }
+ }
+ },
+ submitHandler: function (form) {
+ var selectedClause = [];
+ $('.chkbox-clause').each(function () {
+ var isChecked = $(this).prop("checked");
+ if (isChecked) {
+ selectedClause.push($(this).parents('.contract-item').data('id'));
+ }
+ });
+ if (selectedClause && selectedClause.length > 0) {
+ if (elements.radioCreateGroup.checked) {
+ var formData = {
+ "contractId": contractID,
+ "groupName": form.elements['groupname'].value,
+ "clauseIds": selectedClause
+ };
+ addContractClauseGroup(formData, socket);
+ } else if (elements.radioExistingGroup.checked) {
+ var formData = {
+ "clauseGroupId": form.elements['groupid'].value,
+ "clauseIds": selectedClause
+ };
+ addContractSectionInExistingGroup(formData, socket);
+ }
+ }
+ }
+ });
+ $("#formReassignDraftRequest").validate({
+ submitHandler: function (form) {
+ var approveConfirmation = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": $('#inputPositionReason').val(),
+ "with": "Counterparty",
+ "messageType": 'Notification',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'approved',
+ "confirmationType": "request_draft",
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "actionperformedbyUserType": loggedInCompanyDetails._id == contractInformation.counterPartyCompanyId ? 'Counterparty' : 'Customer',
+ "messageConfirmationFor": 'Opposite Side',
+ "chatRoomName": getChatRoom('Counterparty'),
+ "messageId": $('#reassignDraftRequestMessageId').val(),
+ "messageNumber": 0,
+ "chatWindow": withType,
+ "flag": "reassign"
+ };
+ if (elements.reassignDraftRequestUserId.value && elements.sendToTeamForDraftA.checked) {
+ approveConfirmation.with = 'Our Team';
+ approveConfirmation.messageConfirmationFor = 'Same Side';
+ approveConfirmation.sendTo = elements.reassignDraftRequestUserId.value;
+ approveConfirmation.sendToName = elements.inputReassignDraftRequest.placeholder;
+ approveConfirmation.chatRoomName = 'user_' + loggedInCompanyDetails._id + '_' + selectedThreadID
+ }
+ updateContractSectionConfirmationStatus(approveConfirmation, socket);
+ $('.reconfirm-approve[data-id="' + approveConfirmation.messageId + '"]').parent().addClass(displayNoneClass);
+ }
+ });
+
+ /**
+ * @description
+ */
+ function setCounterPartyUserTagLists() {
+ $('#messageInputCounterParty').atwho({
+ at: "@",
+ data: counterpartyUserList,
+ displayTpl: "${name} ",
+ insertTpl: '@${name} ',
+ callbacks: {
+ beforeInsert: function (value, $li) {
+ var match = value.match(/data-id="([0-9a-f]+)"/);
+ var match2 = value.match(/data-companyid="([0-9a-f]+)"/);
+ if (match && match2) {
+ var dataIdValue = match[1];
+ var dataCompanyIdValue = match2[1];
+ tagUserInMessage.push({"userId": dataIdValue, "companyId": dataCompanyIdValue});
+ }
+ return value;
+ }
+ }
+ });
+ }
+
+ /**
+ * @description
+ * @param userID
+ * @param userName
+ */
+ function updateAssignDraftRequestDropdown(userID, userName) {
+ elements.assignDraftingRequestUserId.value = userID;
+ elements.assignDraftingRequestInput.value = userName;
+ elements.assignDraftingRequestInput.placeholder = userName;
+ }
+
+ $(document).on('click', '.attachment', async function () {
+ var data = {
+ fileKey: $(this).data('link'),
+ fileName: $(this).data('filename') + '.' + $(this).data('extension').toLowerCase(),
+ };
+ try {
+ var requestURL = apiBaseUrl + '/contract/download-file-from-url';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: JSON.stringify(data)
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ window.location.href = response["data"];
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ });
+
+ /**====================== Section: Counterparty chat ======================*/
+
+
+ /**================== Other Function Start ========================*/
+ /**
+ * @description This function will be used for the get contract id from callback url
+ * @param url
+ * @returns {*|string}
+ */
+ function getContractID(url) {
+ var urlArr = url.split('/');
+ return urlArr[8];
+ }
+
+ /**
+ * @description This function will be used for the get contract mode from callback url
+ * @param url
+ * @returns {*|string}
+ */
+ function getContractMode(url) {
+ var urlArr = url.split('/');
+ return urlArr[10];
+ }
+
+ /**
+ * @description This function is used for geeting the params from URL and it is used for development
+ * @param name
+ * @returns {string | null}
+ */
+ function getURLParameter(name) {
+ return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [null, ''])[1].replace(/\+/g, '%20')) || null;
+ }
+
+ /**
+ * @description This function will return the chat room name
+ * @param withType
+ * @returns {string}
+ */
+ function getChatRoom(withType) {
+ switch (withType) {
+ case 'Our Team':
+ return 'user_' + loggedInCompanyDetails._id + '_' + selectedThreadID;
+ break;
+ case 'Counterparty':
+ return "counterparty_" + selectedThreadID
+ break;
+ case 'Conversion History':
+ return 'conversionHistory_' + selectedThreadID
+ break;
+ default:
+ return 'conversionHistory_' + selectedThreadID
+ break;
+ }
+ }
+
+ /**
+ * @description Switch classes
+ * @param el
+ * @param className
+ * @param add
+ */
+ function switchClass(el, className, add) {
+ if (el) {
+ if (add) {
+ el.classList.add(className);
+ } else {
+ el.classList.remove(className);
+ }
+ }
+ }
+
+ /**
+ * @description This function is used for formatting date
+ * @param inputDate
+ * @returns {string}
+ */
+ function formatDate(inputDate) {
+ var months = [
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ ];
+
+ var date = new Date(inputDate);
+ var day = date.getDate();
+ var month = months[date.getMonth()];
+ var hours = date.getHours();
+ var minutes = date.getMinutes();
+ var period = hours >= 12 ? "PM" : "AM";
+ var formattedHours = hours % 12 || 12;
+
+ var daySuffix;
+ if (day === 1 || day === 21 || day === 31) {
+ daySuffix = "st";
+ } else if (day === 2 || day === 22) {
+ daySuffix = "nd";
+ } else if (day === 3 || day === 23) {
+ daySuffix = "rd";
+ } else {
+ daySuffix = "th";
+ }
+
+ var formattedDate = `${day}${daySuffix} ${month} ${formattedHours}:${minutes.toString().padStart(2, '0')} ${period}`;
+ return formattedDate;
+ }
+
+ /**
+ * @param inputDate
+ * @returns {string}
+ */
+ function formatDateForMeeting(inputDate) {
+ var months = [
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+ ];
+ var daysOfWeek = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
+ var date = new Date(inputDate);
+ var day = daysOfWeek[date.getDay()];
+ var dateT = date.getDate();
+ var month = months[date.getMonth()];
+ var formattedDate = `${day}, ${dateT} ${month}`;
+ return formattedDate;
+ }
+
+ /**
+ * @description This function is used for the close all the bottom popups
+ */
+ function closeBottomPopup() {
+ elements.formSendPositionConfirmation.reset();
+ elements.formRejectPosition.reset();
+ elements.formAssignDraftRequest.reset();
+ elements.formSendDraftConfirmation.reset();
+ elements.formRejectDraftRequest.reset();
+ elements.formRejectDraft.reset();
+ elements.formMeetingOutcomes.reset();
+ elements.formClauseToGroup.reset();
+ elements.formReassignDraftRequest.reset();
+ switchClass(elements.inviteUserPopup, displayNoneClass, true);
+ switchClass(elements.inviteTeamPopup, displayNoneClass, true);
+ switchClass(elements.sendPositionConfirmationPopup, displayNoneClass, true);
+ switchClass(elements.confirmPositionPopup, displayNoneClass, true);
+ switchClass(elements.rejectPositionPopup, displayNoneClass, true);
+ switchClass(elements.assignDraftRequestPopup, displayNoneClass, true);
+ switchClass(elements.sendDraftConfirmationPopup, displayNoneClass, true);
+ switchClass(elements.rejectDarftRequestPopup, displayNoneClass, true);
+ switchClass(elements.rejectDarftPopup, displayNoneClass, true);
+ switchClass(elements.meetingPopup, displayNoneClass, true);
+ switchClass(elements.addClauseToGroupPopup, displayNoneClass, true);
+ switchClass(elements.divMeetingViewOutcomes, displayNoneClass, true);
+ switchClass(elements.divMeetingEnterOutcomes, displayNoneClass, true);
+ switchClass(elements.reassignDraftRequestPopup, displayNoneClass, true);
+ }
+
+ /**
+ * @description This function will be used for redirect to clause list page from create clause
+ */
+ function redirectToClauseList() {
+ $("#formClause").validate().resetForm();
+ elements.formClause.reset();
+ if ($('#inviteteams').prop('checked')) {
+ $('#inviteteams').click();
+ }
+ if ($('#inviteusers').prop('checked')) {
+ $('#inviteusers').click();
+ }
+ var placeholderText = 'Select users and teams';
+ elements.inputInviteUsersTeams.placeholder = placeholderText;
+ $('#inputInviteUsersTeams').click();
+ $('#collapseTeams, #collapseUsers').collapse('hide');
+ switchClass(elements.sectionCreateClause, displayNoneClass, true);
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ }
+
+ /**
+ * Update invite team checkbox
+ */
+ function updateInviteCheckbox() {
+ $('.team-chkbox').each(function () {
+ var isChecked = $(this).prop("checked");
+ var dataID = $(this).parent().data('id');
+ var jsonData = inviteTeamListIDs.find((ele) => ele.itemId == dataID);
+ if (isChecked) {
+ if (selectedInviteTeams.findIndex((ele) => ele.itemId == jsonData.itemId) < 0) {
+ selectedInviteTeams.push(jsonData);
+ }
+ } else {
+ if (selectedInviteTeams.findIndex((ele) => ele.itemId == jsonData.itemId) > -1) {
+ selectedInviteTeams = $.grep(selectedInviteTeams, function (value) {
+ return value.itemId != dataID;
+ });
+ }
+ }
+ });
+ $('.user-chkbox').each(function () {
+ var isChecked = $(this).prop("checked");
+ var dataID = $(this).parent().data('id');
+ var jsonData = inviteUserListIDs.find((ele) => ele.itemId == dataID);
+ if (isChecked) {
+ if (selectedInviteUsers.findIndex((ele) => ele.itemId == jsonData.itemId) < 0) {
+ selectedInviteUsers.push(jsonData);
+ }
+ } else {
+ if (selectedInviteUsers.findIndex((ele) => ele.itemId == jsonData.itemId) > -1) {
+ selectedInviteUsers = $.grep(selectedInviteUsers, function (value) {
+ return value.itemId != dataID;
+ });
+ }
+ }
+ });
+ updateInvitePlacehoder();
+ }
+
+ /**
+ * @description Update the placeholder of Invite user input
+ */
+ function updateInvitePlacehoder() {
+ var placeholderText = 'Select users and teams';
+ var placeholderTextArray = [];
+ if (selectedInviteUsers && selectedInviteUsers.length > 0) {
+ placeholderTextArray.push(selectedInviteUsers.length + (selectedInviteUsers.length == 1 ? ' User' : ' Users'));
+ }
+ if (selectedInviteTeams && selectedInviteTeams.length > 0) {
+ placeholderTextArray.push(selectedInviteTeams.length + (selectedInviteTeams.length == 1 ? ' Team' : ' Teams'));
+ }
+ if (placeholderTextArray.length > 0) {
+ placeholderText = placeholderTextArray.join(' and ') + ' Selected';
+ }
+ elements.inputInviteUsersTeams.placeholder = placeholderText;
+ }
+
+ /**================== Other Function End =========================*/
+
+ /**================== Socket Function Start =========================*/
+ /**
+ * @description This function is used for setup socket on event
+ */
+ function setupSocket() {
+ if (!flagSocketFunctionInit) {
+
+ var chatRoomName = loggedInUserDetails._id + "_" + contractID;
+ socket.emit('joinChatRoom', chatRoomName);
+
+ var chatRoomNameA = 'room_' + contractID;
+ socket.emit('joinChatRoom', chatRoomNameA);
+
+ var documentChatRoomName = contractID;
+ socket.emit('joinChatRoom', documentChatRoomName);
+
+ socket.on('counterpartyInvited', data => {
+ if (data) {
+ getContractDetails(socket, redirection = true);
+ }
+ });
+
+ socket.on('forwardNewClauseCreated', async function (data) {
+ if (data) {
+ tagLists.push(JSON.parse(data));
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ }
+ });
+
+ socket.on('forwardInviteClause', async function (data) {
+ if (data) {
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ }
+ });
+
+ socket.on('forwardConversionHistoryMessage', data => {
+ if (elements.sectionContractLists.classList.contains(displayNoneClass)) {
+ unreadMessageForThread()
+ }
+ renderSocketHistoryMessage(data, 'CH');
+ });
+
+ socket.on('forwardContractSectionMessage', data => {
+ if (elements.sectionContractLists.classList.contains(displayNoneClass)) {
+ unreadMessageForThread()
+ }
+ renderSocketMessage(data, 'SS');
+
+ });
+
+ socket.on('forwardCounterContractSectionMessage', data => {
+ if (elements.sectionContractLists.classList.contains(displayNoneClass)) {
+ unreadMessageForThread()
+ }
+ renderSocketMessage(data, 'CP');
+ });
+
+ /** Socket On: user typing for same side */
+ socket.on('userTypingNotificationContractSection', data => {
+ if (data) {
+ if (tyingUserSSArray.findIndex(x => x == data) == -1) {
+ tyingUserSSArray.push(data);
+ }
+ var text = '';
+ if (tyingUserSSArray.length == 1) {
+ text = tyingUserSSArray[0] + " is typing...";
+ }
+ if (tyingUserSSArray.length == 2) {
+ text = tyingUserSSArray[0] + " and " + tyingUserSSArray[1] + " is typing...";
+ }
+ if (tyingUserSSArray.length > 2) {
+ var otherUserCount = tyingUserSSArray.length - 2
+ text = tyingUserSSArray[0] + ", " + tyingUserSSArray[1] + " and " + otherUserCount + " others are typing...";
+ }
+
+ clearTimeout(typingTimeout);
+ document.getElementById('typingSpan').textContent = text;
+ }
+ typingTimeout = setTimeout(() => {
+ document.getElementById('typingSpan').textContent = '';
+ tyingUserSSArray = [];
+ }, 2000);
+ });
+
+ /** Socket On: user typing for counterparty side */
+ socket.on('userTypingNotificationCounterContractSection', data => {
+ if (data) {
+ if (tyingUserCPArray.findIndex(x => x == data) == -1) {
+ tyingUserCPArray.push(data);
+ }
+ var text = '';
+ if (tyingUserCPArray.length == 1) {
+ text = tyingUserCPArray[0] + " is typing...";
+ }
+ if (tyingUserCPArray.length == 2) {
+ text = tyingUserCPArray[0] + " and " + tyingUserCPArray[1] + " is typing...";
+ }
+ if (tyingUserCPArray.length > 2) {
+ var otherUserCount = tyingUserCPArray.length - 2
+ text = tyingUserCPArray[0] + ", " + tyingUserCPArray[1] + " and " + otherUserCount + " others are typing...";
+ }
+
+ clearTimeout(typingTimeout);
+ document.getElementById('typingSpanCP').textContent = text;
+ }
+ typingTimeout = setTimeout(() => {
+ document.getElementById('typingSpanCP').textContent = '';
+ tyingUserCPArray = [];
+ }, 2000);
+ });
+
+ socket.on('forwardRefreshClauseList', async function (data) {
+ if (data) {
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ window.Asc.plugin.executeMethod("GetAllContentControls");
+ }
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ await getClauses();
+ await getGroupClauses();
+ await getClauseGroups();
+ }
+ });
+
+ flagSocketFunctionInit = true;
+ }
+ }
+
+ function renderSocketMessage(data, chatWindow) {
+ var renderHTML = '';
+ switch (data.messageType) {
+ case "Invite":
+ var message = "";
+ if (data.invitedUserName) {
+ message += data.invitedUserName.trim() + " invited by " + data.actionperformedbyUser.trim() + " in this section";
+ } else {
+ message += data.invitedTeamName.trim() + " invited by " + data.actionperformedbyUser.trim() + " in this section";
+ }
+ renderHTML += '\n' +
+ ' \n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ ' \n' + message + ' \n' +
+ '\n'
+ break;
+ case "Position Confirmation":
+ normalMessageSent = true
+ positionMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.messageStatus == 'None' || data.messageStatus == 'Updated' ? 'Sent a position confirmation request' : (data.messageStatus == 'Approve' ? 'Position confirmation approved' : 'Position confirmation rejected')) + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (chatWindow == 'CP') {
+ if (data.from != loggedInUserDetails._id && data.companyId != loggedInCompanyDetails._id && data.messageStatus == 'None' && openContractResponseData.canConfirmPosition) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
\n';
+ }
+ } else {
+ if (data.from != loggedInUserDetails._id && data.messageStatus == 'None' && openContractResponseData.canConfirmPosition) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
\n';
+ }
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Draft Confirmation":
+ normalMessageSent = true
+ draftingMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Sent drafting for approval \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
';
+ if (data.companyId != loggedInCompanyDetails._id && openContractResponseData.canConfirmPosition) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
';
+ }
+ renderHTML += '
\n' +
+ '
';
+ break;
+ case "Notification":
+ var requestRowMessage = '';
+ if (data.confirmationType == 'position') {
+ $('.reconfirm-approve[data-id="' + data.messageId + '"]').parent().addClass(displayNoneClass);
+ requestRowMessage = (data.status == "approved" ? 'Position approved by ' : 'Position rejected by ') + data.actionperformedbyUser
+ } else if (data.confirmationType == 'request_draft' && data.sendTo && data.flag != 'reassign') {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned a team member to draft the changes to this section.';
+ $('.reconfirm-approve[data-id="' + data.messageId + '"]').parent().addClass(displayNoneClass);
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ } else if (data.confirmationType == 'request_draft' && data.sendTo && data.flag == 'reassign') {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + data.sendToName + ' to draft the changes to this section.';
+ $('.reconfirm-approve[data-id="' + data.messageId + '"]').parent().addClass(displayNoneClass);
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ } else if (data.confirmationType == "draft") {
+ if (data.status == 'approved') {
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ requestRowMessage = 'Drafting approved by ' + data.actionperformedbyUser;
+ } else {
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ requestRowMessage = 'Drafting rejected by ' + data.actionperformedbyUser + '. This will need to be redrafted and sent for approval. To reassign drafting go to my side.';
+ }
+ $('.draft-reject[data-id="' + data.messageId + '"]').parent().addClass(displayNoneClass);
+ } else if (data.confirmationType == "assign_draft") {
+ getContractSectionDetails();
+ getContractDetails(socket, false);
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + data.sendToName + ' to draft the changes to this section.';
+ } else if (data.confirmationType == "withdrawn") {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Contract section withdrawn by ' + data.actionperformedbyUser + '
\n' +
+ '
\n' +
+ '
\n';
+ switchClass(elements.divSameSideTextbox, displayNoneClass, true);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, true);
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ if (chatWindow !== 'SS') {
+ let htmlA = '';
+ htmlA += '\n' +
+ '
This section has withdrawn by ' + data.actionperformedbyUser + '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Position Confirmer") {
+ if (contractArchieveStatus != true) {
+ htmlA += '
Re-Open
\n';
+ }
+ }
+ htmlA += '
';
+ var newElementA = document.createElement("div");
+ newElementA.innerHTML = htmlA;
+ elements.divChatContractCounterpartyFooter.appendChild(newElementA);
+ } else {
+ let htmlB = '';
+ htmlB += '\n' +
+ '
This section has withdrawn by ' + data.actionperformedbyUser + '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Position Confirmer") {
+ if (contractArchieveStatus != true) {
+ htmlB += '
Re-Open
\n';
+ }
+ }
+ htmlB += '
';
+ var newElementB = document.createElement("div");
+ newElementB.innerHTML = htmlB;
+ elements.divChatContractSameSideFooter.appendChild(newElementB);
+ }
+ } else if (data.confirmationType == "Reopen") {
+ requestRowMessage = 'Contract section Re-Opened by ' + data.actionperformedbyUser;
+ document.getElementById('divChatCounterPartyBody').classList.remove('contract-completed');
+ document.getElementById('divChatSameSideBody').classList.remove('contract-completed');
+ document.getElementById('divSameSideTextbox').classList.remove(displayNoneClass);
+ document.getElementById('divCounterpartyTextbox').classList.remove(displayNoneClass);
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var draftConfirmCPElement = document.getElementById("draftConfirmCP");
+ if (draftConfirmCPElement) {
+ draftConfirmCPElement.parentNode.removeChild(draftConfirmCPElement);
+ }
+ var draftConfirmSSElement = document.getElementById("draftConfirmSS");
+ if (draftConfirmSSElement) {
+ draftConfirmSSElement.parentNode.removeChild(draftConfirmSSElement);
+ }
+ getContractDetails(socket, false);
+ }
+ if (data.status == "rejected") {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.confirmationType == 'position' ? 'Position confirmation rejected' : 'Drafting rejected') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ } else if (data.confirmationType == 'request_draft' && !data.sendTo) {
+ if (data.flag === 'reassign' && chatWindow == "SS") {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty") {
+ renderHTML += '
\n' +
+ ' Assign user to draft changes \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
';
+ } else {
+ getContractSectionDetails();
+ $('.reconfirm-approve[data-id="' + data.messageId + '"]').parent().addClass(displayNoneClass);
+ getContractDetails(socket, false);
+ if (chatWindow == 'SS') {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator") {
+ renderHTML += '
\n' +
+ ' Assign user to draft changes \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
';
+ } else {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ renderHTML += '
\n' +
+ '
';
+ if (data.flagDraftAssigned) {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (data.assignedUserDetails ? data.assignedUserDetails.firstName + " " + data.assignedUserDetails.lastName : "") + ' to draft the changes to this section.';
+ } else {
+ if (loggedInCompanyDetails._id == contractInformation.companyId) {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (loggedInCompanyDetails._id == data.companyId ? loggedInCompanyDetails.companyName : counterPartyCompanyDetail.companyName) + ' to draft the changes to this section.';
+ } else {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (loggedInCompanyDetails._id == data.companyId ? loggedInCompanyDetails.companyName : counterPartyCompanyDetail.companyName) + ' to draft the changes to this section.';
+ }
+ if (loggedInCompanyDetails._id != data.companyId || chatWindow == 'CP') {
+ requestRowMessage += " Go to my side to assign a user to draft changes."
+ }
+ }
+ }
+ }
+ }
+ if (requestRowMessage) {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + requestRowMessage + ' \n' +
+ '
\n' +
+ '
';
+ }
+ break;
+ case "Meeting":
+ normalMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.meetingTitle + ' \n' +
+ '
Scheduled Meeting
\n' +
+ '
' + formatDateForMeeting(data.meetingDate) + ' · ' + data.meetingStartTime + ' - ' + data.meetingEndTime + ' \n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ break;
+ case "Attachment":
+ normalMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + ' (' + (data && data.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.attachmentName ? data.attachmentName.trim().replaceAll(/\n/g, ' ') : '') + ' \n' +
+ '
' + (data.attachmentSize ? data.attachmentSize.trim().replaceAll(/\n/g, ' ') : '') + (data.attachmentExtention ? ' | ' + data.attachmentExtention.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ default:
+ normalMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ }
+
+ if (normalMessageSent) {
+ switchClass(elements.initialMessageMySide, displayNoneClass, true);
+ switchClass(elements.initialMessage, displayNoneClass, true);
+ switchClass(elements.positionMessageMySide, displayNoneClass, false);
+ switchClass(elements.positionMessage, displayNoneClass, false);
+ }
+
+ if (positionMessageSent) {
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ }
+
+ if (draftingMessageSent) {
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ }
+
+ if (chatWindow == 'SS') {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollPositionFromBottom = elements.divChatSameSideBody.scrollHeight - (elements.divChatSameSideBody.scrollTop + elements.divChatSameSideBody.clientHeight)
+ if (scrollPositionFromBottom <= 600) {
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollPositionFromBottom = elements.divChatCounterPartyBody.scrollHeight - (elements.divChatCounterPartyBody.scrollTop + elements.divChatCounterPartyBody.clientHeight)
+ if (scrollPositionFromBottom <= 600) {
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ }
+ }
+ }
+
+ function renderSocketHistoryMessage(data, chatWindow) {
+ if (loggedInCompanyDetails._id != contractInformation.companyId) {
+ var conversionTypeArr = ['OTCP'];
+ if (openContractResponseData && openContractResponseData.canCommunicateWithCounterparty) {
+ conversionTypeArr.push('OTM');
+ }
+ if (!conversionTypeArr.includes(data.conversationType)) {
+ return false;
+ }
+ } else {
+ var conversionTypeArr = ['OTCC'];
+ if (openContractResponseData && openContractResponseData.canCommunicateWithCounterparty) {
+ conversionTypeArr.push('OTM');
+ }
+ if (!conversionTypeArr.includes(data.conversationType)) {
+ return false;
+ }
+ }
+
+ var renderHTML = '';
+ switch (data.messageType) {
+ case "Invite":
+ var message = "";
+ if (data.invitedUserName) {
+ message += data.invitedUserName.trim() + " invited by " + data.actionperformedbyUser.trim() + " in this section";
+ } else {
+ message += data.invitedTeamName.trim() + " invited by " + data.actionperformedbyUser.trim() + " in this section";
+ }
+ renderHTML += '\n' +
+ ' \n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ ' \n' + message + ' \n' +
+ '\n'
+ break;
+ case "Position Confirmation":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.messageStatus == 'None' || data.messageStatus == 'Updated' ? 'Sent a position confirmation request' : (data.messageStatus == 'Approve' ? 'Position confirmation approved' : 'Position confirmation rejected')) + (data.chatWindow !== 'Counterparty' ? ' - Sameside' : ' - Counterparty') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Draft Confirmation":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Sent drafting for approval ' + (data.chatWindow !== 'Counterparty' ? ' - Sameside' : ' - Counterparty') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ break;
+ case "Notification":
+ var requestRowMessage = '';
+ if (data.confirmationType == 'position') {
+ requestRowMessage = (data.status == "approved" ? 'Position approved by ' : 'Position rejected by ') + data.actionperformedbyUser
+ } else if (data.confirmationType == 'request_draft' && data.sendTo) {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned a team member to draft the changes to this section.';
+ } else if (data.confirmationType == "draft") {
+ if (data.status == 'approved') {
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ requestRowMessage = 'Drafting approved by ' + data.actionperformedbyUser;
+ } else {
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ requestRowMessage = 'Drafting rejected by ' + data.actionperformedbyUser + '. This will need to be redrafted and sent for approval. To reassign drafting go to my side.';
+ }
+ } else if (data.confirmationType == "assign_draft") {
+ getContractDetails(socket, false);
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + data.sendToName + ' to draft the changes to this section.';
+ } else if (data.confirmationType == "withdrawn") {
+ requestRowMessage = 'Contract section withdrawn by ' + data.actionperformedbyUser;
+ } else if (data.confirmationType == "Reopen") {
+ requestRowMessage = 'Contract section Re-Opened by ' + data.actionperformedbyUser;
+ document.getElementById('divChatCounterPartyBody').classList.remove('contract-completed');
+ document.getElementById('divChatSameSideBody').classList.remove('contract-completed');
+ document.getElementById('divSameSideTextbox').classList.remove(displayNoneClass);
+ document.getElementById('divCounterpartyTextbox').classList.remove(displayNoneClass);
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.remove(displayNoneClass);
+ });
+ var draftConfirmCPElement = document.getElementById("draftConfirmCP");
+ if (draftConfirmCPElement) {
+ draftConfirmCPElement.parentNode.removeChild(draftConfirmCPElement);
+ }
+ var draftConfirmSSElement = document.getElementById("draftConfirmSS");
+ if (draftConfirmSSElement) {
+ draftConfirmSSElement.parentNode.removeChild(draftConfirmSSElement);
+ }
+ getContractDetails(socket, false);
+ }
+ if (data.status == "rejected") {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.confirmationType == 'position' ? 'Position confirmation rejected' : 'Drafting rejected') + (data.chatWindow !== 'Counterparty' ? ' - Sameside' : ' - Counterparty') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ } else if (data.confirmationType == 'request_draft' && !data.sendTo) {
+ if (data.chatWindow !== 'Counterparty') {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved' + (data.chatWindow !== 'Counterparty' ? ' - Sameside' : ' - Counterparty') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator") {
+ renderHTML += '
\n' +
+ ' Assign user to draft changes \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
';
+ } else {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved' + (data.chatWindow !== 'Counterparty' ? ' - Sameside' : ' - Counterparty') + ' \n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ renderHTML += '
\n' +
+ '
';
+ if (data.flagDraftAssigned) {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (data.assignedUserDetails ? data.assignedUserDetails.firstName + " " + data.assignedUserDetails.lastName : "") + ' to draft the changes to this section.';
+ } else {
+ if (loggedInCompanyDetails._id == contractInformation.companyId) {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (loggedInCompanyDetails._id == data.companyId ? counterPartyCompanyDetail.companyName : loggedInCompanyDetails.companyName) + ' to draft the changes to this section.';
+ } else {
+ requestRowMessage = data.actionperformedbyUser + ' has assigned ' + (loggedInCompanyDetails._id == data.companyId ? counterPartyCompanyDetail.companyName : loggedInCompanyDetails.companyName) + ' to draft the changes to this section.';
+ }
+
+ if (loggedInCompanyDetails._id != data.companyId) {
+ requestRowMessage += " Go to my side to assign a user to draft changes."
+ }
+ }
+ }
+ }
+ if (requestRowMessage) {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + requestRowMessage + ' \n' +
+ '
\n' +
+ '
';
+ }
+ break;
+ case "Meeting":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.meetingTitle + ' \n' +
+ '
Scheduled Meeting
\n' +
+ '
' + formatDateForMeeting(data.meetingDate) + ' · ' + data.meetingStartTime + ' - ' + data.meetingEndTime + ' \n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ break;
+ case "Attachment":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + ' (' + (data && data.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.attachmentName ? data.attachmentName.trim().replaceAll(/\n/g, ' ') : '') + ' \n' +
+ '
' + (data.attachmentSize ? data.attachmentSize.trim().replaceAll(/\n/g, ' ') : '') + (data.attachmentExtention ? ' | ' + data.attachmentExtention.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ default:
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + data.actionperformedbyUser + ' ' + (data && data.actionperformedbyUserRole ? '(' + data.actionperformedbyUserRole + ')' : '') + ' ' + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (data.message ? data.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ }
+
+ var newHistoryElement = document.createElement("div");
+ newHistoryElement.innerHTML = renderHTML;
+ elements.conversionHistory.appendChild(newHistoryElement);
+ var scrollPositionFromBottom = elements.divChatHistoryBody.scrollHeight - (elements.divChatHistoryBody.scrollTop + elements.divChatHistoryBody.clientHeight)
+ if (scrollPositionFromBottom <= 600) {
+ var scrollToOptions = {
+ top: elements.divChatHistoryBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatHistoryBody.scrollTo(scrollToOptions);
+ }
+ }
+
+ /**================== Socket Function End =========================*/
+
+ /**================== API Start =========================*/
+ /**
+ * @description This function will used for get the contract details and did the initial view settings of the plugin after getting the response
+ * @param socket
+ * @param redirection
+ */
+ async function getContractDetails(socket, redirection = true) {
+ try {
+ flagInit = true;
+ let requestURL = apiBaseUrl + '/contract/get-open-contract-detail/' + contractID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(res => {
+ var response = res;
+ if (response && response.status == true && response.code == 200 && response.data) {
+ var responseData = res.data;
+ openContractResponseData = responseData;
+ contractInformation = responseData.openContractDetails;
+ loggedInUserDetails = responseData.loggedInUserDetails;
+ loggedInCompanyDetails = responseData.loggedInCompanyDetails;
+ contractArchieveStatus = contractInformation.isContractArchived;
+ if (contractInformation.isContractArchived == true) {
+ switchClass(elements.btnCreateClause, disabledClass, true);
+ switchClass(elements.btnAddClauseToGroup, disabledClass, true);
+ } else {
+ if (contractMode != 'markup') {
+ switchClass(elements.btnCreateClause, displayNoneClass, (contractInformation && contractInformation.contractCurrentStatus != "Under Negotiation"));
+ }
+ }
+
+ var clauseToolTip = document.getElementById('btnCreateClause');
+
+ var tooltipContent = new bootstrap.Tooltip(clauseToolTip, {
+ title: 'Start by selecting content in the document',
+ html: false,
+ placement: 'bottom',
+ // customClass: 'custom-tooltip-class' // Add your custom class here
+ });
+
+ // Show the tooltip on mouseover
+ clauseToolTip.addEventListener('mouseover', function () {
+ tooltipContent.show();
+ });
+
+ // Hide the tooltip on mouseleave
+ clauseToolTip.addEventListener('mouseleave', function () {
+ tooltipContent.hide();
+ });
+
+ if (contractInformation.counterPartyInviteStatus !== 'Pending') {
+ counterPartyDetail = responseData.oppositeUser;
+ } else {
+ clearInterval(organisationListInterval);
+ getOrganisationLists();
+ organisationListInterval = setInterval(function () {
+ getOrganisationLists();
+ }, 5000)
+ }
+ if (contractInformation.counterPartyInviteStatus == 'Accepted') {
+ counterPartyCompanyDetail = responseData.oppositeCompanyDetails;
+ if (contractMode !== 'markup') {
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "readOnly";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ }
+ }
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ showDraftingMessage = false;
+ if (contractInformation.userWhoHasEditAccess && contractInformation.userWhoHasEditAccess == loggedInUserDetails._id && responseData.contractCurrentState == 'Edit') {
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ switchClass(elements.draftingMessageMySide, displayNoneClass, false);
+ switchClass(elements.draftingMessage, displayNoneClass, false);
+ showDraftingMessage = true
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "none";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ }
+ flagInit = true;
+ document.title = "ProPact | " + loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName + " " + responseData.userRole;
+ if (loggedInUserDetails) {
+ // TODO: Set logged in user images in details screen
+ // set logged-in user profile picture
+ $('.loggedin-user-profile').each(function () {
+ $(this).attr('src', (loggedInUserDetails.imageKey ? loggedInUserDetails.imageKey : 'images/no-profile-image.jpg'));
+ });
+ // set logged-in user name
+ $('.loggedin-user-name').text(loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName);
+ // set logged-in user role
+ $('.loggedin-user-role').text(responseData.userRole == 'Counterparty' ? '-' : responseData.userRole);
+ // elements.userProfileName.innerHTML += ' ';
+ // document.getElementById('userProfileNameA').innerHTML = loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName + ' ';
+ }
+
+ if (contractMode != 'markup') {
+ getContractTeamAndUserList();
+ }
+ getClauseGroups();
+ getGroupClauses();
+ setupSocket();
+ if (redirection) {
+ switchClass(elements.btnMarkupMode, displayNoneClass, true);
+ switchClass(elements.btnMarkupMode.parentElement, 'justify-content-end', true);
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ if (contractInformation.counterPartyInviteStatus !== 'Accepted') {
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ }
+ }
+ if (contractInformation.counterPartyInviteStatus == 'Accepted') {
+ switchClass(elements.divInviteCounterparty, displayNoneClass, true);
+ if (redirection == true) {
+ switchClass(elements.divInviteCounterpartyInvited, displayNoneClass, true);
+ switchClass(elements.divInviteCounterparty, displayNoneClass, true);
+ switchClass(elements.paragraphInvitationActions, displayNoneClass, true);
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.divContractCounterpartySection, disabledClass, false);
+ switchClass(elements.divContractListItems, 'displayed-invitecp-pending', false);
+ switchClass(elements.divContractListItems, 'displayed-invitecp', false);
+ }
+ // set logged-in user profile picture
+ $('.counterparty-user-profile').each(function () {
+ $(this).attr('src', (counterPartyDetail.imageKey ? counterPartyDetail.imageKey : 'images/no-profile-image.jpg'));
+ });
+ $('.counterparty-user-profile-name').text(counterPartyDetail.firstName + " " + counterPartyDetail.lastName);
+ $('.counterparty-user-profile-role').text(responseData.oppositeUserRole);
+ // elements.counterpartyUserProfileName.innerHTML += ' ';
+ elements.txtOrganizationName.textContent = counterPartyCompanyDetail.companyName;
+ switchClass(elements.btnMarkupMode, displayNoneClass, false);
+ switchClass(elements.btnMarkupMode.parentElement, 'justify-content-end', false);
+ if (redirection) {
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ }
+ } else if (contractInformation.counterPartyInviteStatus == 'Invited') {
+ if (!(responseData.userRole == 'Admin' || responseData.userRole == 'Contract Creator' || responseData.userRole == 'Counterparty')) {
+ switchClass(elements.paragraphInvitationActions, displayNoneClass, true);
+ }
+ switchClass(elements.divInviteCounterparty, displayNoneClass, true);
+ switchClass(elements.divInviteCounterpartyInvited, displayNoneClass, false);
+ switchClass(elements.divContractListItems, displayedInviteCP, true);
+ switchClass(elements.divContractListItems, displayedInvitecpPending, false);
+ elements.txtOrganizationName.textContent = contractInformation.invitedOrgName;
+ elements.txtCounterpartyName.textContent = counterPartyDetail.firstName + " " + counterPartyDetail.lastName + " - Counterparty";
+ elements.txtCounterpartyEmail.textContent = counterPartyDetail.email;
+ // TODO: Get list of clause logic pending and button show/hide pending - Remove Later
+ /*if (redirection) {
+ switchClass(elements.btnMarkupMode, displayNoneClass, true);
+ switchClass(elements.btnMarkupMode.parentElement, 'justify-content-end', true);
+ /!*switchClass(elements.sectionContractLists, displayNoneClass, false);
+ // if (documentMode != 'markup') {
+ // getContractTeamAndUserList();
+ // }
+ // clauseNextPage = 1;
+ // clauseHasNextPage = true;
+ // clauseLists = [];
+ // getClauses();
+ }*/
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, true);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ } else if (contractInformation.counterPartyInviteStatus == 'Pending') {
+ switchClass(elements.divInviteCounterparty, displayNoneClass, false);
+ switchClass(elements.divContractListItems, displayedInviteCP, true);
+ switchClass(elements.divContractListItems, displayedInvitecpPending, false);
+ if (!(responseData.userRole == 'Admin' || responseData.userRole == 'Contract Creator' || responseData.userRole == 'Counterparty')) {
+ switchClass(elements.btnInviteCounterparty, disabledClass, true);
+ }
+ // TODO: Counterparty button show/hide and other logic's needed here - Remove later
+ /*document.getElementById('btnGoToCounterpartyChat').classList.add(displayNoneClass);
+ document.getElementById('btnGoToCounterparty').classList.add(displayNoneClass);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ if (documentMode != 'markup') {
+ getContractTeamAndUserList();
+ }
+ if (redirection) {
+ switchClass(elements.btnMarkupMode, displayNoneClass, true);
+ switchClass(elements.btnMarkupMode.parentElement, 'justify-content-end', true);
+ /!*switchClass(elements.sectionContractLists, displayNoneClass, false);
+ if (documentMode != 'markup') {
+ getContractTeamAndUserList();
+ }
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();*!/
+ }*/
+ }
+ if (contractInformation.isContractArchived == true) {
+ switchClass(elements.btnMarkupMode, displayNoneClass, true);
+ switchClass(elements.btnAddClauseToGroup, displayNoneClass, true);
+ switchClass(elements.btnMarkupMode.parentElement, 'justify-content-end', true);
+
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+
+ var actionCounterparty = document.querySelectorAll('.action-sameside');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "readOnly";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ }
+
+ var contractBtnText = document.getElementById('btnMarkupMode');
+ var getBtnText = document.getElementById("btnMarkupMode").innerHTML;
+
+ let messageContent = new bootstrap.Tooltip(contractBtnText, {
+ title: 'Use Our Working Draft to test drafting or have your team review it without the Counterparty being aware. See FAQ.',
+ html: false,
+ placement: 'bottom',
+ // customClass: 'custom-tooltip-class' // Add your custom class here
+ });
+ if (getBtnText == 'Master Document') {
+ messageContent = new bootstrap.Tooltip(contractBtnText, {
+ title: 'The Master Document is visible to Counterparty Users and is where the majority of your negotiation occurs. See FAQ',
+ html: false,
+ placement: 'bottom',
+ // customClass: 'custom-tooltip-class' // Add your custom class here
+ });
+
+ // Show the tooltip on mouseover
+
+ }
+ contractBtnText.addEventListener('mouseover', function () {
+ messageContent.show();
+ });
+
+ // Hide the tooltip on mouseleave
+ contractBtnText.addEventListener('mouseleave', function () {
+ messageContent.hide();
+ });
+ } else {
+ }
+ })
+ .catch(function (err) {
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for send the invitation to join the contract as counterparty
+ */
+ async function inviteCounterparties() {
+ var form = elements.formInviteCounterparty;
+ const urlencoded = new URLSearchParams();
+ urlencoded.append("contractId", contractID);
+ urlencoded.append("firstName", form.elements['firstName'].value);
+ urlencoded.append("lastName", form.elements['lastName'].value);
+ urlencoded.append("email", form.elements['email'].value);
+ urlencoded.append("organisationName", form.elements['organisationName'].value);
+ if (form.elements['organisationName'].getAttribute('data-id')) {
+ urlencoded.append("organisation_id", form.elements['organisationName'].getAttribute('data-id'));
+ }
+
+ let requestURL = apiBaseUrl + '/contract/invite-contract-counterparty';
+ var headers = {
+ "Content-Type": "application/x-www-form-urlencoded"
+ };
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: urlencoded
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ if (responseData && responseData.status == true && responseData.code == 201) {
+ elements.formInviteCounterparty.reset();
+ switchClass(elements.divInviteCounterpartyInvited, displayNoneClass, false);
+ switchClass(elements.sectionInviteCounterparty, displayNoneClass, true);
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.divContractListItems, displayedInvitecpPending, true);
+ switchClass(elements.divContractListItems, displayedInviteCP, false);
+ getContractDetails(null, false);
+ } else if (responseData && responseData.status == false && responseData.message) {
+ $('#inviteEmailAddress').parent().append('' + responseData.message + ' ');
+ }
+ // TODO: Socket configuration required
+ /*var data = {
+ chatRoomName: loggedInUserDetails.userWebId + "_" + documentID,
+ documentMode: documentMode
+ }
+ socket.emit('switch_document_mode', data);*/
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ }
+
+ /**
+ * @description This function will be used for resend the invitation to join this contract as counterparty
+ */
+ async function resendInvitation() {
+ try {
+ let requestURL = apiBaseUrl + '/contract/resend-couterparty-invite/' + contractID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ elements.snackbar.textContent = responseData.message;
+ elements.snackbar.className = "show";
+ setTimeout(function () {
+ elements.snackbar.classList.remove('show');
+ }, 3000)
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for cancelled the sent invitation
+ */
+ async function cancelInvitation() {
+ try {
+ let requestURL = apiBaseUrl + '/contract/cancel-couterparty-invite/' + contractID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ elements.snackbar.textContent = responseData.message;
+ elements.snackbar.className = "show";
+ setTimeout(function () {
+ elements.snackbar.classList.remove('show');
+ }, 3000);
+ clearInterval(organisationListInterval);
+ getOrganisationLists();
+ organisationListInterval = setInterval(function () {
+ getOrganisationLists();
+ }, 5000)
+ switchClass(elements.divInviteCounterpartyInvited, displayNoneClass, true)
+ switchClass(elements.divInviteCounterparty, displayNoneClass, false)
+ switchClass(elements.divContractListItems, displayedInvitecpPending, false)
+ switchClass(elements.divContractListItems, displayedInviteCP, true);
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for get team and user list of this contract
+ * @param popup
+ */
+ async function getContractTeamAndUserList(popup = 'inviteuser') {
+ try {
+ var requestURL = apiBaseUrl + '/meeting/get-contract-team-and-user-list/' + contractID;
+ var headers = {
+ 'Content-Type': 'application/json',
+ 'Authorization': 'Bearer ' + authToken
+ };
+ var requestOptions = {
+ method: 'GET',
+ headers: headers,
+ };
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ if (popup == 'inviteuser') {
+ var contractCreatorUserFilter = responseData.filter((ele) => ele.type == "user" && ele.role == "Contract Creator");
+ if (contractCreatorUserFilter && contractCreatorUserFilter.length > 0) {
+ contractCreatorDetails = contractCreatorUserFilter[0];
+ }
+ var contractCounterpartyFilter = responseData.filter((ele) => ele.type == "user" && ele.role == "Counterparty");
+ if (contractCounterpartyFilter && contractCounterpartyFilter.length > 0) {
+ contractCounterPartyDetails = contractCounterpartyFilter[0];
+ }
+ var teamLists = responseData.filter((ele) => {
+ return ele.type == "team";
+ });
+ var userLists = responseData.filter((ele) => {
+ return ele.type == "user" && (ele.role !== "Contract Creator" && ele.role !== "Admin" && ele.role !== "Counterparty");
+ });
+ if (teamLists.length > 0) {
+ inviteTeamListIDs = teamLists;
+ if (elements.paragraphTeamsNotFoundMessage) {
+ switchClass(elements.paragraphTeamsNotFoundMessage, displayNoneClass, true);
+ }
+ if (elements.chkboxInviteAllTeams) {
+ switchClass(elements.chkboxInviteAllTeams, displayNoneClass, false);
+ }
+ var html = '';
+ html += '\n';
+ html += '
\n';
+ teamLists.forEach((ele) => {
+ html += '\n' +
+ '\n' +
+ ' \n';
+ });
+ html += ' \n';
+ html += '
';
+ elements.accordionBodyTeams.innerHTML = html;
+ }
+ if (userLists.length > 0) {
+ inviteUserListIDs = userLists;
+ if (elements.paragraphUsersNotFoundMessage) {
+ switchClass(elements.paragraphUsersNotFoundMessage, displayNoneClass, true);
+ }
+ if (elements.chkboxInviteAllUsers) {
+ switchClass(elements.chkboxInviteAllUsers, displayNoneClass, false);
+ }
+ var html = '';
+ html += '';
+ html += '
';
+ // ' + ele.userImage + '
+ // assets/images/no-profile-image.jpg
+ userLists.forEach((ele) => {
+ html += '';
+ html += '';
+ html += ' ';
+ });
+ html += ' ';
+ html += '
';
+ elements.accordionBodyUsers.innerHTML = html;
+ }
+ } else if (popup == 'positionConfirmation') {
+ var userLists = responseData.filter((ele) => {
+ return ele.type == "user" && ele.canDraftContract;
+ });
+ if (userLists.length > 0) {
+ inviteUserListIDs = userLists;
+ var usersNoteFoundMessage = document.getElementById('usersNoteFoundMessageB');
+ if (usersNoteFoundMessage) {
+ usersNoteFoundMessage.classList.add(displayNoneClass);
+ }
+ var html = '';
+ html += '';
+ html += '
';
+ // ' + ele.userImage + '
+ // assets/images/no-profile-image.jpg
+ userLists.forEach((ele) => {
+ html += '';
+ html += '\n' +
+ '\t
\n' +
+ '\t\t\n' +
+ '\t\t\t
\n' +
+ '\t\t\t\t \n' +
+ '\t\t\t \n' +
+ '\t\t\t
\n' +
+ '\t\t\t\t
' + ele.itemName + ' \n' +
+ '\t\t\t\t
' + ele.role + '
\n' +
+ '\t\t\t
\n' +
+ '\t\t
\n' +
+ '\t \n' +
+ '
';
+ html += ' ';
+ });
+ html += ' ';
+ html += '
';
+ elements.accordionPositionConfirmation.innerHTML = html;
+ }
+ } else if (popup == 'assignDraftRequest' || popup == 'reassignDraftRequest') {
+ var userLists = responseData.filter((ele) => {
+ return ele.type == "user" && ele.canDraftContract && (ele.role == "Contract Creator" || ele.role == "Admin" || ele.role == "Counterparty" || ele.role == "Position Confirmer");
+ });
+ if (userLists.length > 0) {
+ inviteUserListIDs = userLists;
+ var usersNoteFoundMessage = document.getElementById('usersNoteFoundMessageA');
+ if (usersNoteFoundMessage) {
+ usersNoteFoundMessage.classList.add(displayNoneClass);
+ }
+ var renderHTML = '';
+ renderHTML += '';
+ renderHTML += '
';
+ // ' + ele.userImage + '
+ // assets/images/no-profile-image.jpg
+ userLists.forEach((ele) => {
+ renderHTML += '';
+ renderHTML += '';
+ renderHTML += ' ';
+ });
+ renderHTML += ' ';
+ renderHTML += '
';
+ if (popup == 'assignDraftRequest') {
+ elements.accordionAssignDraftRequest.innerHTML = renderHTML;
+ } else if (popup == 'reassignDraftRequest') {
+ elements.accordionReassignDraftRequest.innerHTML = renderHTML;
+ }
+ }
+ }
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for create clause section on contract
+ * @param socket
+ */
+ async function createClauseSection(socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var randomNumber = Math.floor(Math.random() * (1000000 - 1 + 1)) + 1;
+ var commentID = Date.now() + '-' + randomNumber;
+ var form = elements.formClause;
+ var postData = {
+ contractId: contractID,
+ contractSection: form.elements['contractSection'].value,
+ contractSectionDescription: form.elements['contractDescription'].value,
+ assignedTeamAndUserDetails: [...selectedInviteTeams, ...selectedInviteUsers],
+ commentId: commentID,
+
+ };
+ if (form.elements['clauseGroup'].value) {
+ postData.clauseGroupId = form.elements['clauseGroup'].value;
+ }
+ var data = JSON.stringify(postData);
+ var requestURL = apiBaseUrl + '/contract-section/create-contract-section';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ if (responseData && responseData.status == true && responseData.code == 201) {
+ // Handle the response data
+ // redirectToClauseList();
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "none";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ var nContentControlType = 1;
+ var color = {
+ R: 104,
+ G: 215,
+ B: 248,
+ };
+ var nContentControlProperties = {
+ "Id": randomNumber,
+ "Tag": commentID,
+ "Lock": 2,
+ "Color": color,
+ "InternalId": randomNumber.toString()
+ };
+ tagLists.push(nContentControlProperties);
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ window.Asc.plugin.executeMethod("AddContentControl", [nContentControlType, nContentControlProperties]);
+ window.Asc.plugin.executeMethod("GetAllContentControls");
+ }
+
+ if (contractInformation && contractInformation.userWhoHasEditAccess && contractInformation.userWhoHasEditAccess == loggedInUserDetails._id && openContractResponseData.contractCurrentState == 'Edit') {
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "none";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ } else {
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "readOnly";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ }
+ // TODO: Pending clause lists
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses(commentID);
+ var data = {
+ chatRoomName: contractID,
+ tagData: JSON.stringify(nContentControlProperties)
+ };
+ socket.emit('newClauseCreated', data);
+ // location.reload(true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ switchClass(elements.sectionCreateClause, displayNoneClass, true);
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.loader, displayNoneClass, true);
+ } else {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for the get all clause section on open contract
+ * @param commentThreadID
+ */
+ async function getClauses(commentThreadID = null) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var requestURL = apiBaseUrl + '/contract-section/get-contract-sections/' + contractID;
+ requestURL += '?';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var queryParam = [];
+ // Search text
+ if (searchText) {
+ queryParam.push('filter[search_text]=' + searchText);
+ }
+ queryParam.push('contractSectionStatus=all');
+ // Set sortby created time
+ queryParam.push('sort[createdAt]=-1');
+ // Set pageSize
+ queryParam.push('page=' + clauseNextPage);
+ // Set recordLimit
+ queryParam.push('limit=' + 10);
+ // Set queryparams
+ requestURL += queryParam.join('&');
+
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ if (clauseNextPage == 1) {
+ elements.divContractListItems.innerHTML = '';
+ }
+ if (responseData.data.length > 0) {
+ var result = responseData.data;
+ var html = '';
+ result.forEach((ele) => {
+ clauseLists.push(ele);
+ var commentID = ele.commentId;
+ // TODO: API Logic Pending for "unreadMessageSide"
+ html += '';
+ });
+ if (clauseLists && clauseLists.length > 2) {
+ switchClass(elements.btnScrollDown, displayNoneClass, false);
+ } else {
+ switchClass(elements.btnScrollDown, displayNoneClass, true);
+ }
+ if (clauseNextPage == 1) {
+ elements.divContractListItems.innerHTML += html;
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = html;
+ elements.divContractListItems.insertAdjacentElement("beforeend", newElement);
+ }
+ var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'))
+ var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {
+ return new bootstrap.Tooltip(tooltipTriggerEl)
+ })
+ clauseHasNextPage = responseData.hasNextPage;
+ clauseNextPage = responseData.nextPage;
+ if (!flagRedirectFirst && sectionID && sectionID != "0") {
+ setTimeout(function () {
+ flagRedirectClauseCreate = true;
+ $('.contract-item[data-id="' + sectionID + '"]').click();
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ if (chatWindows == 'SS') {
+ $('#btnGoToSameSideChat').click();
+ } else if (chatWindows == 'CP') {
+ $('#btnGoToCounterpartyChat').click();
+ }
+ flagRedirectFirst = true;
+ }, 500);
+ } else if (commentThreadID) {
+ setTimeout(function () {
+ flagRedirectClauseCreate = true;
+ $('.contract-item[data-commentid="' + commentThreadID + '"]').click();
+ $('#btnGoToSameSideChat').click();
+ if (!openContractResponseData.canCommunicateWithCounterparty) {
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, true);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ }
+ if (contractInformation.counterPartyInviteStatus != 'Accepted') {
+ switchClass(elements.btnGoToCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.btnGoToCounterparty, displayNoneClass, true);
+ switchClass(elements.chatFooterInnerSameSide, 'justify-content-end', true);
+ }
+ }, 500);
+ }
+ } else {
+ var norecordhtml = 'No section found
';
+ elements.divContractListItems.innerHTML = norecordhtml;
+ switchClass(elements.btnScrollDown, displayNoneClass, true);
+ }
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used for the get all clause section on open contract
+ * @param commentThreadID
+ */
+ async function getClauseGroups() {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var requestURL = apiBaseUrl + '/contract/get-contract-groups/' + contractID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ contractClauseGroups = responseData;
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ async function getGroupClauses() {
+ try {
+ let requestURL = apiBaseUrl + '/contract-section/get-contract-clause-group-list/' + contractID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ return fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ if (responseData.length > 0) {
+ elements.divGroupClauseListItems.innerHTML = "";
+ var iHTML = '';
+ responseData.forEach((element) => {
+ if (element.contractSectionId && element.contractSectionId.length > 0) {
+ iHTML += '\n' +
+ '
' + element.groupName + ' \n';
+ element.contractSectionId.forEach((ele) => {
+ clauseLists.push(ele);
+ var commentID = ele.commentId;
+ // TODO: API Logic Pending for "unreadMessageSide"
+ iHTML += '';
+ });
+ iHTML += '';
+ }
+ });
+ elements.divGroupClauseListItems.innerHTML += iHTML;
+ }
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used the get the clause information
+ */
+ async function getContractSectionDetails() {
+ try {
+ let requestURL = apiBaseUrl + '/contract-section/get-contract-section-details/' + selectedClauseID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ return fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ elements.divInvitedUsers.innerHTML = '';
+ elements.divInvitedTeams.innerHTML = '';
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ elements.clauseSectionTitleSameSide.innerHTML = responseData.contractSectionData.contractSection;
+ elements.clauseSectionTitleCounterParty.innerHTML = responseData.contractSectionData.contractSection;
+ elements.clauseSectionTitleCHistory.innerHTML = responseData.contractSectionData.contractSection;
+
+ switchClass(elements.divSameSideTextbox, displayNoneClass, false);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, false);
+
+ selectedContractSectionDetails = responseData;
+ if (responseData.sameSideUserList && responseData.sameSideUserList.length > 0) {
+ sameSideUserList = [];
+ responseData.sameSideUserList.forEach(function (element) {
+ if (element.userId != loggedInUserDetails._id) {
+ sameSideUserList.push({
+ 'id': element.userId,
+ 'name': element.userName,
+ 'companyId': element.companyId
+ })
+ }
+ });
+ }
+ if (responseData.getContractSectionUserList && responseData.getContractSectionUserList.length > 0) {
+ counterpartyUserList = [];
+ responseData.getContractSectionUserList.forEach(function (element) {
+ if (element.userId != loggedInUserDetails._id) {
+ counterpartyUserList.push({
+ 'id': element.userId,
+ 'name': element.userName,
+ 'companyId': element.companyId
+ })
+ }
+ });
+ }
+ setSameSideUserTagLists();
+ setCounterPartyUserTagLists();
+
+ switchClass(elements.divSameSideTextbox, displayNoneClass, false);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, false);
+
+ var draftConfirmCPElement = document.getElementById("draftConfirmCP");
+ if (draftConfirmCPElement) {
+ draftConfirmCPElement.parentNode.removeChild(draftConfirmCPElement);
+ }
+ var draftConfirmSSElement = document.getElementById("draftConfirmSS");
+ if (draftConfirmSSElement) {
+ draftConfirmSSElement.parentNode.removeChild(draftConfirmSSElement);
+ }
+
+ switchClass(elements.divChatSameSideBody, 'contract-completed', false);
+ switchClass(elements.divChatCounterPartyBody, 'contract-completed', false);
+
+ var iHtml = '';
+ let contractUsers = ''
+ if (contractCreatorDetails) {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + contractCreatorDetails.itemName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + contractCreatorDetails.role + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ // contractUsers += contractCreatorDetails.itemName
+ // if (selectedContractSectionDetails.contractAssignedUsers.length > 0) {
+ // contractUsers += ', ';
+ // }
+ }
+ if (contractCounterPartyDetails) {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + contractCounterPartyDetails.itemName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + contractCounterPartyDetails.role + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ // contractUsers += contractCounterPartyDetails.itemName
+ // if (selectedContractSectionDetails.contractAssignedUsers.length > 0) {
+ // contractUsers += ', ';
+ // }
+ }
+ if (selectedContractSectionDetails.contractAssignedUsers && selectedContractSectionDetails.contractAssignedUsers.length > 0) {
+ if (openContractResponseData.canSendPositionConfirmation == true) {
+ switchClass(elements.btnSendPositionConfirmationSameSide.closest("li"), displayNoneClass, false);
+ switchClass(elements.btnSendPositionConfirmationSameSideB.closest("li"), displayNoneClass, false);
+ }
+ selectedContractSectionDetails.contractAssignedUsers.forEach((ele, index) => {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + ele.userId.firstName + ' ' + ele.userId.lastName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + ele.userRole + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+
+
+ contractUsers += ele.userId.firstName + ' ' + ele.userId.lastName
+ if (index < selectedContractSectionDetails.contractAssignedUsers.length - 1) {
+ contractUsers += ', ';
+ }
+ });
+ } else {
+ switchClass(elements.btnSendPositionConfirmationSameSide.closest("li"), displayNoneClass, true);
+ switchClass(elements.btnSendPositionConfirmationSameSideB.closest("li"), displayNoneClass, true);
+ }
+ iHtml += ' ';
+ elements.divInvitedUsers.innerHTML = iHtml;
+ elements.sameSideUserList.innerHTML = contractUsers;
+ let teamListingHtml = '';
+
+ if (selectedContractSectionDetails.contractAssignedTeams && selectedContractSectionDetails.contractAssignedTeams.length > 0) {
+ var iHtml = '';
+ let teamListHeader = ''
+ selectedContractSectionDetails.contractAssignedTeams.forEach((ele) => {
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + ele.teamName + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ teamListHeader += ele.teamName
+ teamListingHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + ele.teamName + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ });
+ iHtml += ' ';
+ elements.divInvitedTeams.innerHTML = iHtml;
+ // elements.sameSideTeamList.innerHTML = teamListHeader;
+ } else {
+ var html = '' +
+ 'No team invited
' +
+ ' ';
+ elements.divInvitedTeams.innerHTML = html;
+ // elements.sameSideTeamList.innerHTML = '-';
+ }
+ if (selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.contractSection) {
+ let contractCreatorUsers = [];
+ let opositesideUsers = [];
+ if (selectedContractSectionDetails.contractSectionUsers && selectedContractSectionDetails.contractSectionUsers.length > 0) {
+ selectedContractSectionDetails.contractSectionUsers.forEach((ele) => {
+ if (ele.companyId == contractInformation.companyId) {
+ contractCreatorUsers.push(ele);
+ } else {
+ opositesideUsers.push(ele);
+ }
+ });
+ }
+ let contractCreatorUsersHtml = '';
+ if (teamListingHtml != '') {
+ contractCreatorUsersHtml += teamListingHtml;
+ }
+ // if (selectedContractSectionDetails.contractCreatorDetail) {
+ // contractCreatorUsersHtml += '\n' +
+ // '\t\t\t\t\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\t
' + selectedContractSectionDetails.contractCreatorDetail.firstName + ' ' + selectedContractSectionDetails.contractCreatorDetail.lastName + ' \n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\tContract Creator \n' +
+ // '\t\t\t\t\t\t\t\t\n' +
+ // '\t\t\t\t
\n' +
+ // ' ';
+ // }
+ if (selectedContractSectionDetails.contractAssignedUsers && selectedContractSectionDetails.contractAssignedUsers.length > 0) {
+ selectedContractSectionDetails.contractAssignedUsers.forEach((el) => {
+ contractCreatorUsersHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + el.userId.firstName + ' ' + el.userId.lastName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + el.userRole + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ });
+ }
+ contractCreatorUsersHtml += ' ';
+
+ let opositesideUserHtml = '';
+ // if (selectedContractSectionDetails.contractCounterPartyDetail) {
+ // opositesideUserHtml += '\n' +
+ // '\t\t\t\t\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t
\n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\t
' + selectedContractSectionDetails.contractCounterPartyDetail.firstName + ' ' + selectedContractSectionDetails.contractCounterPartyDetail.lastName + ' \n' +
+ // '\t\t\t\t\t\t\t\t\t\t\t\tCounterparty \n' +
+ // '\t\t\t\t\t\t\t\t\n' +
+ // '\t\t\t\t
\n' +
+ // ' ';
+ // }
+ if (selectedContractSectionDetails.contractAssignedUsers && selectedContractSectionDetails.contractAssignedUsers.length > 0) {
+ selectedContractSectionDetails.contractAssignedUsers.forEach((el) => {
+ opositesideUserHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + el.userId.firstName + ' ' + el.userId.lastName + ' \n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t' + el.userRole + ' \n' +
+ '\t\t\t\t\t\t\t\t\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ });
+ }
+ opositesideUserHtml += ' ';
+
+
+ // Get the tooltip button
+ var tooltipButtonA = document.getElementById('divUserProfileA');
+
+ // Set the dynamic HTML content for the tooltip
+ var dynamicHTMLContentA = '\n' +
+ '
\n' +
+ '
' + selectedContractSectionDetails.contractSectionData.contractSection + ' \n' +
+ ' \n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (loggedInCompanyDetails._id == contractInformation.companyId ? contractCreatorUsersHtml : opositesideUserHtml) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+
+ // Initialize the tooltip manually with a custom class
+ var tooltipA = new bootstrap.Tooltip(tooltipButtonA, {
+ title: dynamicHTMLContentA,
+ html: true,
+ placement: 'bottom',
+ customClass: 'custom-tooltip-class' // Add your custom class here
+ });
+
+ // Show the tooltip on mouseover
+ tooltipButtonA.addEventListener('mouseover', function () {
+ tooltipA.show();
+ });
+
+ // Hide the tooltip on mouseleave
+ tooltipButtonA.addEventListener('mouseleave', function () {
+ tooltipA.hide();
+ });
+
+ // Get the tooltip button
+ // var tooltipButtonB = document.getElementById('divOppsiteUserProfile');
+ //
+ // // Set the dynamic HTML content for the tooltip
+ // var dynamicHTMLContentB = '\n' +
+ // '
\n' +
+ // '
' + selectedContractSectionDetails.contractSectionData.contractSection + ' \n' +
+ // ' \n' +
+ // '
\n' +
+ // '
\n' +
+ // '
\n' +
+ // '
\n' +
+ // '
' + (loggedInCompanyDetails._id != contractInformation.companyId ? contractCreatorUsersHtml : opositesideUserHtml) + '
\n' +
+ // '
\n' +
+ // '
\n' +
+ // '
\n' +
+ // '
\n' +
+ // '
';
+ //
+ // // Initialize the tooltip manually with a custom class
+ // var tooltipB = new bootstrap.Tooltip(tooltipButtonB, {
+ // title: dynamicHTMLContentB,
+ // html: true,
+ // placement: 'bottom',
+ // customClass: 'custom-tooltip-class counterparty-tooltip' // Add your custom class here
+ // });
+ //
+ // // Show the tooltip on mouseover
+ // tooltipButtonB.addEventListener('mouseover', function () {
+ // tooltipB.show();
+ // });
+ //
+ // // Hide the tooltip on mouseleave
+ // tooltipButtonB.addEventListener('mouseleave', function () {
+ // tooltipB.hide();
+ // });
+ }
+ contractSectionCompleted = false
+ if (selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && (selectedContractSectionDetails.contractSectionData.contractSectionStatus == "Completed" || selectedContractSectionDetails.contractSectionData.contractSectionStatus == "Withdrawn")) {
+ contractSectionCompleted = true;
+ switchClass(elements.initialMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.initialMessage, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+
+ switchClass(elements.divSameSideTextbox, displayNoneClass, true);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, true);
+
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+
+ var renderHTML = '';
+ var message = '';
+ if (selectedContractSectionDetails.contractSectionData.contractSectionStatus == "Completed") {
+ message = selectedContractSectionDetails.contractSectionData.draftConfirmMessage + " " + selectedContractSectionDetails.contractSectionData.confirmByCounterPartyId.firstName + " " + selectedContractSectionDetails.contractSectionData.confirmByCounterPartyId.lastName + " and " + selectedContractSectionDetails.contractSectionData.confirmByUserId.firstName + " " + selectedContractSectionDetails.contractSectionData.confirmByUserId.lastName + ". Section complete.";
+ } else {
+ message = 'This section has withdrawn by ' + selectedContractSectionDetails.contractSectionData.contractSectionWithdrawnBy.firstName + " " + selectedContractSectionDetails.contractSectionData.contractSectionWithdrawnBy.lastName;
+ }
+ renderHTML += '\n' +
+ '
' + message + '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Position Confirmer") {
+ if (contractArchieveStatus != true) {
+ renderHTML += '
Re-Open
\n';
+ }
+ }
+ renderHTML += '
';
+
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.divChatContractCounterpartyFooter.appendChild(newElement);
+
+ var renderHTML = '';
+ var message = '';
+ if (selectedContractSectionDetails.contractSectionData.contractSectionStatus == "Completed") {
+ message = selectedContractSectionDetails.contractSectionData.draftConfirmMessage + " " + selectedContractSectionDetails.contractSectionData.confirmByCounterPartyId.firstName + " " + selectedContractSectionDetails.contractSectionData.confirmByCounterPartyId.lastName + " and " + selectedContractSectionDetails.contractSectionData.confirmByUserId.firstName + " " + selectedContractSectionDetails.contractSectionData.confirmByUserId.lastName + ". Section complete.";
+ } else {
+ message = 'This section has withdrawn by ' + selectedContractSectionDetails.contractSectionData.contractSectionWithdrawnBy.firstName + " " + selectedContractSectionDetails.contractSectionData.contractSectionWithdrawnBy.lastName;
+ }
+ renderHTML += '\n' +
+ '
' + message + '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Position Confirmer") {
+ if (contractArchieveStatus != true) {
+ renderHTML += '
Re-Open
\n';
+ }
+ }
+ renderHTML += '
';
+
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.divChatContractSameSideFooter.appendChild(newElement);
+
+ switchClass(elements.divChatSameSideBody, 'contract-completed', true);
+ switchClass(elements.divChatCounterPartyBody, 'contract-completed', true);
+ }
+ } else {
+ var noUserAssigned = '' +
+ '' +
+ 'No user invited
' +
+ ' ' +
+ ' ';
+ elements.divInvitedUsers.innerHTML = noUserAssigned;
+
+ var noTeamAssigned = '' +
+ '' +
+ 'No team invited
' +
+ ' ' +
+ ' ';
+ elements.divInvitedTeams.innerHTML = noTeamAssigned;
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ if (contractArchieveStatus == true) {
+ switchClass(elements.divSameSideTextbox, displayNoneClass, true);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, true);
+ }
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ }
+ }
+
+ /**
+ * @description This function will used to redirect to chat window where users needs attention
+ */
+ async function redirectToMessageScreen() {
+ try {
+ if (selectedThreadID) {
+ if (selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && selectedContractSectionDetails.contractSectionData.contractSectionStatus == "Completed") {
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ } else {
+ switchClass(elements.loader, displayNoneClass, false);
+ let requestURL = apiBaseUrl + '/contract-section/get-required-action-window/' + selectedClauseID + '?sort[createdAt]=-1&page=1&limit=500';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ if (responseData.total > 0) {
+ var draftEditRequest = response.data.filter(item => item.messageConfirmationFor == "Same Side" && item.messageType == "Draft Edit Request");
+ var samesideMessage = response.data.filter(item => item.messageConfirmationFor == "Same Side" && item.messageType !== "Draft Edit Request");
+ var counterpartyMessage = response.data.filter(item => item.messageConfirmationFor != "Same Side");
+ if (draftEditRequest && draftEditRequest.length > 0) {
+ withType = 'Counterparty';
+ messageConfirmationFor = 'Opposite Side';
+ elements.conversionCounterparty.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionMessageList('Counterparty');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputCounterParty.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, false);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ } else if (samesideMessage && samesideMessage.length > 0) {
+ withType = 'Our Team';
+ messageConfirmationFor = 'Same Side';
+ elements.conversionSameSide.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionMessageList('our');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputSameSide.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, false);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ } else if (counterpartyMessage && counterpartyMessage.length > 0) {
+ withType = 'Counterparty';
+ messageConfirmationFor = 'Opposite Side';
+ elements.conversionCounterparty.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionMessageList('Counterparty');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputCounterParty.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, false);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ } else {
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ }
+ } else {
+ if (chatWindows == 'SS' || clauseChatWindows == 'SS') {
+ withType = 'Our Team';
+ messageConfirmationFor = 'Same Side';
+ elements.conversionSameSide.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionMessageList('our');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputSameSide.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, false);
+ } else if (chatWindows == 'CP' || clauseChatWindows == 'CP') {
+ withType = 'Counterparty';
+ messageConfirmationFor = 'Opposite Side';
+ elements.conversionCounterparty.innerHTML = '';
+ chatNextPage = 1;
+ chatHasNextPage = true;
+ getContractSectionMessageList('Counterparty');
+ var chatRoomName = getChatRoom(withType);
+ socket.emit('joinContractSectionChatRoom', chatRoomName);
+ elements.messageInputCounterParty.value = "";
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, false);
+ } else {
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionSameSideChat, displayNoneClass, true);
+ switchClass(elements.sectionCounterpartyChat, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ }
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ } else {
+ switchClass(elements.loader, displayNoneClass, true);
+ chatHistoryNextPage = 1;
+ chatHistoryHasNextPage = true;
+ getClauseConversionHistory();
+ switchClass(elements.sectionContractLists, displayNoneClass, true);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, false);
+ }
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ }
+ }
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This function will return the contract clause message history
+ * @returns {Promise}
+ */
+ async function getClauseConversionHistory() {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+
+ let requestURL = apiBaseUrl + '/contract-section/get-contract-section-message-list/' + selectedClauseID + '/all';
+
+ var queryParam = [];
+ // Set sortby created time
+ queryParam.push('sort[createdAt]=-1');
+ // Set pageSize
+ queryParam.push('page=' + chatHistoryNextPage);
+ // Set recordLimit
+ queryParam.push('limit=10');
+ // Set queryparams
+ requestURL += '?' + queryParam.join('&');
+
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ if (response && response.status == true && response.code == 200 && response.data) {
+ if (response.data.data.length > 0) {
+ var responseData;
+ if (chatHistoryNextPage == 1) {
+ elements.conversionHistory.innerHTML = '';
+ responseData = response?.data?.data.reverse();
+ var scrollToOptions = {
+ top: elements.divChatHistoryBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatHistoryBody.scrollTo(scrollToOptions);
+ } else {
+ responseData = response?.data?.data;
+ }
+ var setLastHeight = elements.conversionHistory.scrollHeight;
+
+ responseData.forEach((element, index) => {
+ var renderHTML = '';
+ switch (element.messageType) {
+ case "Normal":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Attachment":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.attachmentName ? element.attachmentName.trim().replaceAll(/\n/g, ' ') : '') + ' \n' +
+ '
' + (element.attachmentSize ? element.attachmentSize.trim().replaceAll(/\n/g, ' ') : '') + (element.attachmentExtention ? ' | ' + element.attachmentExtention.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Invite":
+ var inviteMessage = '';
+ var userName = element.messageSenderUser.firstName + " " + element.messageSenderUser.lastName;
+ if (element.inviteType == 'Team' && element.invitedTeamDetails) {
+ inviteMessage += element.invitedTeamDetails.teamName;
+ } else {
+ var invitedUser = element.invitedUserDetails.firstName + " " + element.invitedUserDetails.lastName;
+ inviteMessage += invitedUser.trim();
+ }
+ inviteMessage += ' ' + element.message + ' ' + userName.trim() + ' in this section';
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + userName.trim() + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + inviteMessage + ' \n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Position Confirmation":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.messageStatus == 'None' || element.messageStatus == 'Updated' ? 'Sent a position confirmation request' : (element.messageStatus == 'Approve' ? 'Position confirmation approved' : 'Position confirmation rejected')) + (element.conversationType == 'OTM' ? ' - Counterparty' : ' - Sameside') + ' \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Draft Request":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved ' + (element.conversationType == 'OTM' ? ' - Counterparty' : ' - Sameside') + ' \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Draft Confirmation":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.messageStatus == 'None' || element.messageStatus == 'Updated' ? 'Sent drafting for approval' : (element.messageStatus == 'Approve' ? 'Draft confirmation approved' : 'Drafting rejected')) + (element.conversationType == 'OTM' ? ' - Counterparty' : ' - Sameside') + ' \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Notification":
+ if (element.message == 'Ignore') {
+ break;
+ }
+ var notificationMessage;
+ var userName = element.messageSenderUser.firstName + " " + element.messageSenderUser.lastName;
+ if (element.message == 'request_draft_counter') {
+ if (loggedInCompanyDetails._id == contractInformation.companyId) {
+ notificationMessage = userName.trim() + " has assigned " + (contractInformation.companyId == element.companyId ? counterPartyCompanyDetail.companyName : loggedInCompanyDetails.companyName) + " to draft the changes to this section.";
+ } else {
+ notificationMessage = userName.trim() + " has assigned " + (contractInformation.companyId == element.companyId ? loggedInCompanyDetails.companyName : counterPartyCompanyDetail.companyName) + " to draft the changes to this section.";
+ }
+ if (loggedInCompanyDetails._id != element.companyId) {
+ notificationMessage += " Go to my side to assign a user to draft changes."
+ }
+ } else if (element.message == 'request_draft') {
+ if (element && element.messageReceiverUser) {
+ var userReceiverName = element.messageReceiverUser.firstName + " " + element.messageReceiverUser.lastName;
+ notificationMessage = userName.trim() + " has assigned " + userReceiverName.trim() + " to draft the changes to this section.";
+ } else {
+ notificationMessage = userName.trim() + " has assigned a team member to draft the changes to this section.";
+ }
+ } else if (element.message == 'withdrawn') {
+ notificationMessage = "Contract section withdrawn by " + userName.trim();
+ } else {
+ notificationMessage = element.message + ' ' + userName.trim();
+ if (element.message == 'Drafting rejected by') {
+ notificationMessage += '. This will need to be redrafted and sent for approval. To reassign drafting go to my side.'
+ }
+ }
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + notificationMessage.replaceAll(/\n/g, ' ') + ' \n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Meeting":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.meetingDetails.meetingTitle + ' \n' +
+ '
Scheduled Meeting
\n' +
+ '
' + formatDateForMeeting(element.meetingDetails.meetingDate) + ' · ' + element.meetingDetails.meetingStartTime + ' - ' + element.meetingDetails.meetingEndTime + ' \n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ break;
+ default:
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ }
+ if (chatHistoryNextPage == 1) {
+ var newElement = document.createElement("div");
+ newElement.setAttribute('data-message', index + 1);
+ newElement.innerHTML = renderHTML;
+ elements.conversionHistory.appendChild(newElement);
+ // targetDiv.before(html);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.setAttribute('data-message', index + 1);
+ newElement.innerHTML = renderHTML;
+ elements.conversionHistory.insertBefore(newElement, elements.conversionHistory.firstChild);
+ }
+ });
+
+ var scrollToOptions = {
+ top: elements.divChatHistoryBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ if (chatHistoryNextPage == 1) {
+ elements.divChatHistoryBody.scrollTo(scrollToOptions);
+ } else {
+ elements.divChatHistoryBody.scrollTop = elements.divChatHistoryBody.scrollHeight - setLastHeight;
+ }
+ chatHistoryHasNextPage = response.data.hasNextPage;
+ chatHistoryNextPage = response.data.nextPage;
+ switchClass(elements.loader, displayNoneClass, true);
+ } else {
+ elements.conversionHistory.innerHTML = '';
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ } else {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This function will return the contract clause messages
+ * @param messageType
+ * @returns {Promise}
+ */
+ async function getContractSectionMessageList(messageType = 'our') {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+
+ let requestURL = apiBaseUrl + '/contract-section/get-contract-section-message-list/' + selectedClauseID + '/' + messageType;
+
+ var queryParam = [];
+ // Set sortby created time
+ queryParam.push('sort[createdAt]=-1');
+ // Set pageSize
+ queryParam.push('page=' + chatNextPage);
+ // Set recordLimit
+ queryParam.push('limit=10');
+ // Set queryparams
+ requestURL += '?' + queryParam.join('&');
+
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, {headers: headers})
+ .then(response => response.json())
+ .then(response => {
+ switchClass(elements.initialMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.initialMessage, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ if (showDraftingMessage == false) {
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ }
+ if (response && response.status == true && response.code == 200 && response.data) {
+ let messageList = response.data.data
+
+ var getNormalMessage = messageList.filter((ele) => ele.messageType != "Invite" && ele.messageType != "Notification");
+ if (getNormalMessage && getNormalMessage.length == 0) {
+ switchClass(elements.initialMessageMySide, displayNoneClass, false);
+ switchClass(elements.initialMessage, displayNoneClass, false);
+ }
+ if (getNormalMessage && getNormalMessage.length > 0) {
+ switchClass(elements.positionMessageMySide, displayNoneClass, false);
+ switchClass(elements.positionMessage, displayNoneClass, false);
+ }
+
+ var positionMessage = messageList.filter((ele) => ele.messageType == "Position Confirmation" || ele.messageType == "Draft Confirmation" || ele.messageType == "Draft Request");
+ if (positionMessage && positionMessage.length > 0) {
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ }
+
+ if (response.data.data.length > 0) {
+ var responseData;
+ if (chatNextPage == 1) {
+ if (messageType == 'our') {
+ elements.conversionSameSide.innerHTML = '';
+ responseData = response?.data?.data.reverse();
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ } else {
+ elements.conversionCounterparty.innerHTML = '';
+ responseData = response?.data?.data.reverse();
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ }
+ } else {
+ responseData = response?.data?.data;
+ }
+ var setLastHeight;
+ if (messageType == 'our') {
+ setLastHeight = elements.conversionSameSide.scrollHeight;
+ } else {
+ setLastHeight = elements.conversionCounterparty.scrollHeight;
+ }
+
+ responseData.forEach((element, index) => {
+ var renderHTML = '';
+ switch (element.messageType) {
+ case "Invite":
+ var inviteMessage = '';
+ var userName = element.messageSenderUser.firstName + " " + element.messageSenderUser.lastName;
+ if (element.inviteType == 'Team' && element.invitedTeamDetails) {
+ inviteMessage += element.invitedTeamDetails.teamName;
+ } else {
+ var invitedUser = element.invitedUserDetails.firstName + " " + element.invitedUserDetails.lastName;
+ inviteMessage += invitedUser.trim();
+ }
+ inviteMessage += ' ' + element.message + ' ' + userName.trim() + ' in this section';
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + userName.trim() + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + inviteMessage + ' \n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Position Confirmation":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.messageStatus == 'None' || element.messageStatus == 'Updated' ? 'Sent a position confirmation request' : (element.messageStatus == 'Approve' ? 'Position confirmation approved' : 'Position confirmation rejected')) + ' \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (messageType == 'Counterparty') {
+ if (element.from != loggedInUserDetails._id && element.companyId != loggedInCompanyDetails._id && element.messageStatus == 'None' && openContractResponseData.canConfirmPosition) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
\n';
+ }
+ } else {
+ if (element.from != loggedInUserDetails._id && element.messageStatus == 'None' && openContractResponseData.canConfirmPosition) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
\n';
+ }
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Draft Request":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (element.with == 'Our Team' && element.messageStatus == 'None' && element.sendTo == null && (openContractResponseData.userRole == 'Contract Creator' || openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty')) {
+ renderHTML += '
\n' +
+ ' Assign user to draft changes \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Draft Confirmation":
+ draftingMessageSent = true;
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.messageStatus == 'None' || element.messageStatus == 'Updated' ? 'Sent drafting for approval' : (element.messageStatus == 'Approve' ? 'Draft confirmation approved' : 'Drafting rejected')) + ' \n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ if (element.from != loggedInUserDetails._id && element.companyId != loggedInCompanyDetails._id && element.messageStatus == 'None' && openContractResponseData.canConfirmPosition && (openContractResponseData.userRole == 'Contract Creator' || openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty')) {
+ renderHTML += '
\n' +
+ ' Approve \n' +
+ ' Reject \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Notification":
+ var notificationMessage;
+ var userName = element.messageSenderUser.firstName + " " + element.messageSenderUser.lastName;
+ if (element.message == 'request_draft_counter') {
+ notificationMessage = userName.trim() + " has assigned " + (loggedInCompanyDetails._id !== element.companyId ? loggedInCompanyDetails.companyName : counterPartyCompanyDetail.companyName) + " to draft the changes to this section.";
+ if (loggedInCompanyDetails._id != element.companyId) {
+ notificationMessage += " Go to my side to assign a user to draft changes."
+ }
+ } else if (element.message == 'request_draft') {
+ if (element && element.messageReceiverUser) {
+ var userReceiverName = element.messageReceiverUser.firstName + " " + element.messageReceiverUser.lastName;
+ notificationMessage = userName.trim() + " has assigned " + userReceiverName.trim() + " to draft the changes to this section.";
+ } else {
+ notificationMessage = userName.trim() + " has assigned a team member to draft the changes to this section.";
+ }
+ } else if (element.message == 'withdrawn') {
+ notificationMessage = "Contract section withdrawn by " + userName.trim();
+ } else {
+ notificationMessage = element.message + ' ' + userName.trim();
+ if (element.message == 'Drafting rejected by') {
+ notificationMessage += '. This will need to be redrafted and sent for approval. To reassign drafting go to my side.'
+ }
+ }
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (notificationMessage ? notificationMessage.trim().replaceAll(/\n/g, ' ') : '') + ' \n';
+ if (element.with == 'Our Team' && element.messageStatus == 'None' && (openContractResponseData.userRole == 'Contract Creator' || openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty') && element && element.messageReceiverUser && element.message == 'request_draft') {
+ renderHTML += '
' +
+ '
\n' +
+ ' Reassign Drafting \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ break;
+ case "Meeting":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.meetingDetails.meetingTitle + ' \n' +
+ '
Scheduled Meeting
\n' +
+ '
' + formatDateForMeeting(element.meetingDetails.meetingDate) + ' · ' + element.meetingDetails.meetingStartTime + ' - ' + element.meetingDetails.meetingEndTime + ' \n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ break;
+ case "Attachment":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + ' (' + (element && element.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.attachmentName ? element.attachmentName.trim().replaceAll(/\n/g, ' ') : '') + ' \n' +
+ '
' + (element.attachmentSize ? element.attachmentSize.trim().replaceAll(/\n/g, ' ') : '') + (element.attachmentExtention ? ' | ' + element.attachmentExtention.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ default:
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + element.messageSenderUser.firstName + ' ' + element.messageSenderUser.lastName + '
\n' +
+ '
' + formatDate(element.createdAt) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (element.message ? element.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ }
+ if (draftingMessageSent) {
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ }
+ if (chatNextPage == 1) {
+ var contentDiv;
+ if (messageType == 'our') {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+ }
+ // targetDiv.before(html);
+ } else {
+ if (messageType == 'our') {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.insertBefore(newElement, elements.conversionSameSide.firstChild);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.insertBefore(newElement, elements.conversionCounterparty.firstChild);
+ }
+ }
+ });
+
+ var myDiv;
+ if (messageType == 'our') {
+ myDiv = elements.divChatSameSideBody;
+ } else {
+ myDiv = elements.divChatCounterPartyBody;
+ }
+ var scrollToOptions = {
+ top: myDiv.scrollHeight,
+ behavior: 'smooth'
+ };
+ if (chatNextPage == 1) {
+ myDiv.scrollTo(scrollToOptions);
+ } else {
+ if (messageType == 'our') {
+ elements.divChatSameSideBody.scrollTop = elements.conversionSameSide.scrollHeight - setLastHeight;
+ } else {
+ elements.divChatCounterPartyBody.scrollTop = elements.conversionCounterparty.scrollHeight - setLastHeight;
+ }
+ }
+ chatHasNextPage = response.data.hasNextPage;
+ chatNextPage = response.data.nextPage;
+ switchClass(elements.loader, displayNoneClass, true);
+ if (contractSectionCompleted) {
+ switchClass(elements.initialMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.initialMessage, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ }
+ } else {
+ elements.conversionHistory.innerHTML = '';
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ } else {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for send clause message
+ * @param postData
+ * @param socket
+ * @returns {Promise}
+ */
+ async function addContractSectionMessage(postData, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify(postData);
+ var requestURL = apiBaseUrl + '/contract-section/add-message-contract-section';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 200) {
+ postData._id = response.data._id;
+ var conversationType = 'OTM';
+ if (loggedInCompanyDetails._id.toString() == contractInformation.companyId.toString() && postData.with == "Our Team") {
+ conversationType = 'OTCC';
+ } else if (loggedInCompanyDetails._id.toString() == contractInformation.counterPartyCompanyId.toString() && postData.with == "Our Team") {
+ conversationType = 'OTCP';
+ }
+
+ socket.emit('contractSectionMessage', postData);
+ var generalChatData = postData;
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ if (selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && (selectedContractSectionDetails.contractSectionData.isVisibleToCounterparty == false || selectedContractSectionDetails.contractSectionData.isVisibleToContractCreator == false)) {
+ getContractSectionDetails();
+ var data = {
+ chatRoomName: contractID,
+ refreshClauseList: true
+ };
+ socket.emit('refreshClauseList', data);
+ }
+
+ if (postData.with == "Counterparty") {
+ elements.messageInputCounterParty.innerHTML = '';
+ } else {
+ elements.messageInputSameSide.innerHTML = '';
+ }
+ var renderHTML = '';
+ switch (postData.messageType) {
+ case "Position Confirmation":
+ positionMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + 'Sent a position confirmation request' + ' \n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break;
+ case "Draft Confirmation":
+ draftingMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Sent drafting for approval \n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ renderHTML += '
\n' +
+ '
\n';
+ if (typeof window.Asc.plugin.executeMethod === 'function') {
+ var sDocumentEditingRestrictions = "readOnly";
+ window.Asc.plugin.executeMethod("SetEditingRestrictions", [sDocumentEditingRestrictions]);
+ }
+ break;
+ default:
+ normalMessageSent = true
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break
+ }
+ if (normalMessageSent) {
+ switchClass(elements.initialMessageMySide, displayNoneClass, true);
+ switchClass(elements.initialMessage, displayNoneClass, true);
+ switchClass(elements.positionMessageMySide, displayNoneClass, false);
+ switchClass(elements.positionMessage, displayNoneClass, false);
+ }
+
+ if (positionMessageSent) {
+ switchClass(elements.positionMessageMySide, displayNoneClass, true);
+ switchClass(elements.positionMessage, displayNoneClass, true);
+ }
+
+ if (draftingMessageSent) {
+ switchClass(elements.draftingMessageMySide, displayNoneClass, true);
+ switchClass(elements.draftingMessage, displayNoneClass, true);
+ }
+
+ if (postData.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+ closeBottomPopup();
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ async function addContractSectionAttachment(formData, otherDetails, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ // var data = JSON.stringify(postData);
+ var requestURL = apiBaseUrl + '/contract-section/add-contract-section-attachment';
+ var headers = {};
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: formData
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 201) {
+ if (response && response.data && response.data.length > 0) {
+ response.data.forEach((ele) => {
+ var conversationType = 'OTM';
+ if (loggedInCompanyDetails._id.toString() == contractInformation.companyId.toString() && ele.with == "Our Team") {
+ conversationType = 'OTCC';
+ } else if (loggedInCompanyDetails._id.toString() == contractInformation.counterPartyCompanyId.toString() && ele.with == "Our Team") {
+ conversationType = 'OTCP';
+ }
+ ele.chatRoomName = otherDetails.chatRoomName;
+ ele.actionperformedbyUserImage = otherDetails.actionperformedbyUserImage;
+ ele.actionperformedbyUser = otherDetails.actionperformedbyUser;
+ ele.actionperformedbyUserRole = otherDetails.actionperformedbyUserRole;
+ ele.actionperformedbyUserId = otherDetails.actionperformedbyUserId;
+ ele.actionperformedbyUserType = otherDetails.actionperformedbyUserType;
+ socket.emit('contractSectionMessage', ele);
+
+ var generalChatData = ele;
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ if (selectedContractSectionDetails && selectedContractSectionDetails.contractSectionData && (selectedContractSectionDetails.contractSectionData.isVisibleToCounterparty == false || selectedContractSectionDetails.contractSectionData.isVisibleToContractCreator == false)) {
+ getContractSectionDetails();
+ var data = {
+ chatRoomName: contractID,
+ refreshClauseList: true
+ };
+ socket.emit('refreshClauseList', data);
+ }
+
+ if (otherDetails.with == "Counterparty") {
+ elements.attchedFilenameCounterparty.innerHTML = '';
+ attachFileCounterparty = [];
+ } else {
+ elements.attchedFilenameSameSide.innerHTML = '';
+ attachFileSameSide = [];
+ }
+ var renderHTML = '';
+ switch (ele.messageType) {
+ default:
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + otherDetails.actionperformedbyUser + ' (' + (ele && ele.companyId === loggedInCompanyDetails._id ? 'Sameside' : 'Counterparty') + ') ' + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (ele.attachmentName ? ele.attachmentName.trim().replaceAll(/\n/g, ' ') : '') + ' \n' +
+ '
' + (ele.attachmentSize ? ele.attachmentSize.trim().replaceAll(/\n/g, ' ') : '') + (ele.attachmentExtention ? ' | ' + ele.attachmentExtention.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n';
+ break
+ }
+
+
+ if (otherDetails.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+
+ });
+ }
+ // postData._id = response.data._id;
+ /*
+
+
+
+
+
+ */
+ closeBottomPopup();
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for update the clause confirmation request status Approve/Reject
+ * @param postData
+ * @param socket
+ * @returns {Promise}
+ */
+ async function updateContractSectionConfirmationStatus(postData, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify(postData);
+ var requestURL = apiBaseUrl + '/contract-section/update-message-status-contract-section';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ elements.formReconfirmPosition.reset();
+ elements.formRejectPosition.reset();
+ elements.formAssignDraftRequest.reset();
+ elements.formRejectDraft.reset();
+ elements.formRejectDraftRequest.reset();
+ // Handle the response data
+ // var responseData = response;t
+ if (response && response.status == true && response.code == 200) {
+ if (response.data) {
+ if (response.data.addedMessageId) {
+ postData._id = response.data.addedMessageId;
+ }
+ if (response.data.sharedMessage) {
+ postData.message = response.data.sharedMessage;
+ }
+ }
+ if (postData.messageType == 'Notification' && postData.confirmationType == 'request_draft') {
+ if (postData.sendTo) {
+ socket.emit('contractSectionMessage', postData);
+ } else {
+ if (!(response.data && response.data.flagDraftAssigned)) {
+ socket.emit('contractSectionMessage', postData);
+ }
+ }
+ } else {
+ socket.emit('contractSectionMessage', postData);
+ }
+ var conversationType = 'OTM';
+ if (loggedInCompanyDetails._id.toString() == contractInformation.companyId.toString() && postData.with == "Our Team") {
+ conversationType = 'OTCC';
+ } else if (loggedInCompanyDetails._id.toString() == contractInformation.counterPartyCompanyId.toString() && postData.with == "Our Team") {
+ conversationType = 'OTCP';
+ }
+
+ var generalChatData = postData;
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ if (postData.with == "Counterparty") {
+ elements.messageInputCounterParty.innerHTML = '';
+ } else {
+ elements.messageInputSameSide.innerHTML = '';
+ }
+ var renderHTML = '';
+ switch (postData.confirmationType) {
+ case "position":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n';
+ if (postData.status == 'rejected') {
+ renderHTML += '
\n' +
+ '
Position confirmation rejected \n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n';
+ } else {
+ renderHTML += '
Position approved by ' + postData.actionperformedbyUser + ' \n';
+ }
+ renderHTML += '
\n' +
+ '
';
+ if (postData.status == 'rejected') {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' Position rejected by ' + postData.actionperformedbyUser + ' \n' +
+ '
\n' +
+ '
';
+ }
+ break;
+ case "request_draft":
+ if (postData.flag !== 'reassign') {
+ if (postData.sendTo) {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + postData.actionperformedbyUser + ' has assigned a team member to draft the changes to this section. \n';
+ renderHTML += '
\n' +
+ '
\n';
+ if (postData.messageConfirmationFor != "Same Side") {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Draft contract request \n' +
+ '
\n' +
+ '
Position confirmation approved: ' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
Note: ' + postData.actionperformedbyUser + ' has requested to give contract draft edit request to ' + postData.sendToName + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ }
+ switchClass(elements.btnWithdrawnClauseSameSide, displayNoneClass, true);
+ getContractSectionDetails();
+ getContractDetails(socket, false);
+ } else {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Position confirmation approved \n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ var message = '';
+ if (response.data.flagDraftAssigned) {
+ postData.flagDraftAssigned = response.data.flagDraftAssigned;
+ postData.assignedUserDetails = response.data.assignedUserDetails;
+ socket.emit('contractSectionMessage', postData);
+ message = postData.actionperformedbyUser + ' has assigned ' + (response.data.assignedUserDetails ? response.data.assignedUserDetails.firstName + " " + response.data.assignedUserDetails.lastName : "") + ' to draft the changes to this section.';
+ } else {
+ message = postData.actionperformedbyUser + ' has assigned ' + (loggedInCompanyDetails._id !== postData.companyId ? loggedInCompanyDetails.companyName : counterPartyCompanyDetail.companyName) + ' to draft the changes to this section.';
+ if (loggedInCompanyDetails._id !== postData.companyId) {
+ message += ' Go to my side to assign a user to draft changes.'
+ }
+ }
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + message + ' \n' +
+ '
\n' +
+ '
';
+ }
+ } else {
+ if (postData.sendTo) {
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + ' has assigned ' + postData.sendToName + ' to draft the changes to this section. ';
+ if (postData.with == 'Our Team' && (openContractResponseData.userRole == 'Contract Creator' || openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty') && postData && postData.flag == 'reassign') {
+ renderHTML += '
' +
+ '
\n' +
+ ' Reassign Drafting \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
\n';
+ }
+ document.querySelector('button.assign-user[data-id="' + postData.messageId + '"]').style.display = 'none';
+ }
+ getContractSectionDetails();
+ getContractDetails(socket, false);
+ break;
+ case "assign_draft":
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + ' has assigned ' + postData.sendToName + ' to draft the changes to this section. ';
+ if (postData.with == 'Our Team' && (openContractResponseData.userRole == 'Contract Creator' || openContractResponseData.userRole == 'Admin' || openContractResponseData.userRole == 'Counterparty')) {
+ renderHTML += '
' +
+ '
\n' +
+ ' Reassign Drafting \n' +
+ '
\n';
+ }
+ renderHTML += '
\n' +
+ '
\n';
+
+ getContractDetails(socket, redirection = false);
+ switchClass(elements.btnWithdrawnClauseSameSide, displayNoneClass, true);
+ break;
+ case "draft":
+ var message = '';
+ if (postData.status == 'approved') {
+ if (postData.chatWindow !== "Our Team") {
+ document.getElementById('divChatCounterPartyBody').classList.add('contract-completed');
+ document.getElementById('divChatSameSideBody').classList.add('contract-completed');
+ document.getElementById('divSameSideTextbox').classList.add(displayNoneClass);
+ document.getElementById('divCounterpartyTextbox').classList.add(displayNoneClass);
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ }
+ message = 'Drafting approved by ' + postData.actionperformedbyUser;
+ } else {
+ message = 'Drafting rejected by ' + postData.actionperformedbyUser + '. This will need to be redrafted and sent for approval. To reassign drafting go to my side.';
+
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
Drafting rejected \n' +
+ '
\n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
\n' +
+ '
';
+ }
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' ' + message + ' \n' +
+ '
\n' +
+ '
\n';
+ getContractSectionDetails();
+ getContractDetails(socket, redirection = false);
+ break;
+ default:
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ '
' + (postData.message ? postData.message.trim().replaceAll(/\n/g, ' ') : '') + '
\n' +
+ '
\n' +
+ '
\n';
+ break
+ }
+
+
+ if (postData.messageType == 'Notification' && postData.confirmationType == 'request_draft' && postData.sendTo && postData.flag != "reassign") {
+ if (postData.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ }
+ } else {
+ if (postData.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+ }
+ closeBottomPopup();
+
+ // Refresh the clause lists
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for withdrawn clause
+ * @param postData
+ * @param socket
+ * @returns {Promise}
+ */
+ async function withdrawnContractSection(postData, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify(postData);
+ var requestURL = apiBaseUrl + '/contract-section/withdrawn-contract-section';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 200) {
+ // Send same side user
+ socket.emit('contractSectionMessage', postData);
+
+ // Send conversion history window
+ var generalChatData = postData;
+ var conversationType = 'OTM';
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ // Send counter party user
+ var oppositeChat = generalChatData;
+ oppositeChat.with = 'Counterparty';
+ oppositeChat.messageConfirmationFor = 'Opposite Side';
+ oppositeChat.chatRoomName = 'counterparty_' + selectedThreadID;
+ socket.emit('contractSectionMessage', oppositeChat);
+
+ switchClass(elements.divChatSameSideBody, 'contract-completed', true);
+ switchClass(elements.divChatCounterPartyBody, 'contract-completed', true);
+ switchClass(elements.divSameSideTextbox, displayNoneClass, true);
+ switchClass(elements.divCounterpartyTextbox, displayNoneClass, true);
+
+ var actionSameSide = document.querySelectorAll('.action-sameside');
+ actionSameSide.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+ var actionCounterparty = document.querySelectorAll('.action-counterparty');
+ actionCounterparty.forEach(function (element) {
+ element.classList.add(displayNoneClass);
+ });
+
+ var renderHTML = '';
+ renderHTML += '\n' +
+ '
This section has withdrawn by ' + postData.actionperformedbyUser + '
\n';
+ if (openContractResponseData.userRole == "Admin" || openContractResponseData.userRole == "Contract Creator" || openContractResponseData.userRole == "Counterparty" || openContractResponseData.userRole == "Position Confirmer") {
+ if (contractArchieveStatus != true) {
+ renderHTML += '
Re-Open
\n';
+ }
+ }
+ renderHTML += '
';
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.divChatContractSameSideFooter.appendChild(newElement);
+
+ var renderHTML = '';
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + postData.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' Contract section withdrawn by ' + postData.actionperformedbyUser + ' \n' +
+ '
\n' +
+ '
';
+ if (postData.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ }
+ // Refresh the clause lists
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the reopen the clause
+ * @param reopenDetail
+ * @param socket
+ * @returns {Promise}
+ */
+ async function reOpenContractSection(reopenDetail, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var requestURL = apiBaseUrl + '/contract-section/re-open-contract-section/' + reopenDetail.contractSectionId;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'GET',
+ headers: headers,
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+
+ // Send the message to clause same side
+ socket.emit('contractSectionMessage', reopenDetail);
+
+ // Send the message to contract history section
+ var generalChatData = reopenDetail;
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ var oppositeChat = reopenDetail;
+ // Send the message to contract counterparty side
+ if (reopenDetail.chatWindow !== "Counterparty") {
+ oppositeChat.with = 'Counterparty';
+ oppositeChat.messageConfirmationFor = 'Opposite Side';
+ oppositeChat.chatRoomName = 'counterparty_' + selectedThreadID;
+ socket.emit('contractSectionMessage', oppositeChat);
+ } else {
+ if (counterPartyCompanyDetail) {
+ oppositeChat.with = 'Our Team';
+ oppositeChat.messageConfirmationFor = 'Same Side';
+ oppositeChat.chatRoomName = 'user_' + counterPartyCompanyDetail._id + selectedThreadID;
+ socket.emit('contractSectionMessage', oppositeChat);
+ }
+ }
+ var renderHTML = '';
+ renderHTML += '\n' +
+ '
\n' +
+ '
\n' +
+ '
' + reopenDetail.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ '
\n' +
+ ' Contract section Re-Opened by ' + reopenDetail.actionperformedbyUser + ' \n' +
+ '
\n' +
+ '
';
+ if (reopenDetail.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = renderHTML;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ }
+ getContractDetails(socket, false);
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the invite user or team in clause from Sameside window
+ * @param socket
+ * @param invitationType
+ * @returns {Promise}
+ */
+ async function inviteUsersInContractSection(socket, invitationType) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var postData = [];
+ var requestURL = apiBaseUrl + '/contract-section/invite-members-contract-section';
+ if (invitationType == 'users') {
+ inviteUserSelect.forEach((el) => {
+ postData.push(el.itemId)
+ });
+ } else {
+ inviteTeamSelect.forEach((el) => {
+ postData.push(el.itemId)
+ });
+ }
+ var data = JSON.stringify(
+ {
+ "contractSectionId": selectedClauseID,
+ "memberType": invitationType == 'users' ? "user" : "team",// team or user
+ "inviteList": postData
+ }
+ );
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ if (invitationType == 'users') {
+ inviteUserSelect.forEach((el) => {
+ var inviteMessage = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": "invited by",
+ "with": withType,
+ "messageType": 'Invite',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'None',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "invitedUserName": el.itemName,
+ "chatRoomName": getChatRoom(withType),
+ };
+ socket.emit('contractSectionMessage', inviteMessage);
+
+ var generalChatData = inviteMessage;
+ var conversationType = 'OTM';
+ if (loggedInCompanyDetails._id.toString() == contractInformation.companyId.toString() && generalChatData.with == "Our Team") {
+ conversationType = 'OTCC';
+ } else if (loggedInCompanyDetails._id.toString() == contractInformation.counterPartyCompanyId.toString() && generalChatData.with == "Our Team") {
+ conversationType = 'OTCP';
+ }
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ var data = {
+ chatRoomName: contractID,
+ usertype: withType
+ };
+ socket.emit('inviteClause', data);
+
+ var html = '';
+ html += '\n' +
+ ' \n' +
+ '
\n' +
+ '
' + inviteMessage.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ ' \n' + inviteMessage.invitedUserName.trim() + " invited by " + inviteMessage.actionperformedbyUser.trim() + " in this section" + ' \n' +
+ '\n';
+
+ if (inviteMessage.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = html;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ } else {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = html;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+ });
+ // Handle the response data
+ elements.btnOpenInviteUserTeam.closest("li").classList.remove('active');
+ closeBottomPopup();
+ getContractSectionDetails();
+ inviteUserSelect = [];
+ } else {
+ inviteTeamSelect.forEach((el) => {
+ var inviteMessage = {
+ "contractId": contractID,
+ "contractSectionId": selectedClauseID,
+ "message": "invited by",
+ "with": withType,
+ "messageType": 'Invite',
+ "companyId": loggedInCompanyDetails._id,
+ "oppositeCompanyId": counterPartyCompanyDetail && counterPartyCompanyDetail._id ? counterPartyCompanyDetail._id : null,
+ "threadID": selectedThreadID,
+ "status": 'None',
+ "actionperformedbyUser": loggedInUserDetails.firstName + " " + loggedInUserDetails.lastName,
+ "actionperformedbyUserImage": loggedInUserDetails.imageKey,
+ "actionperformedbyUserRole": openContractResponseData.userRole,
+ "messageConfirmationFor": messageConfirmationFor,
+ "invitedTeamName": el.itemName,
+ "chatRoomName": getChatRoom(withType),
+ };
+ socket.emit('contractSectionMessage', inviteMessage);
+
+ var generalChatData = inviteMessage;
+ var conversationType = 'OTM';
+ if (loggedInCompanyDetails._id.toString() == contractInformation.companyId.toString() && generalChatData.with == "Our Team") {
+ conversationType = 'OTCC';
+ } else if (loggedInCompanyDetails._id.toString() == contractInformation.counterPartyCompanyId.toString() && generalChatData.with == "Our Team") {
+ conversationType = 'OTCP';
+ }
+ generalChatData.chatRoomName = 'conversionHistory_' + selectedThreadID;
+ generalChatData.conversationType = conversationType;
+ socket.emit('conversionHistoryMessage', generalChatData);
+
+ var html = '';
+ html += '\n' +
+ ' \n' +
+ '
\n' +
+ '
' + inviteMessage.actionperformedbyUser + '
\n' +
+ '
' + formatDate(new Date()) + '
\n' +
+ '
\n' +
+ ' \n' + inviteMessage.invitedTeamName.trim() + " invited by " + inviteMessage.actionperformedbyUser.trim() + " in this section" + ' \n' +
+ '\n';
+
+ if (inviteMessage.with == "Counterparty") {
+ var newElement = document.createElement("div");
+ newElement.innerHTML = html;
+ elements.conversionCounterparty.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatCounterPartyBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatCounterPartyBody.scrollTo(scrollToOptions);
+ } else {
+ var contentDiv = document.getElementById("chatArea");
+ var newElement = document.createElement("div");
+ newElement.innerHTML = html;
+ elements.conversionSameSide.appendChild(newElement);
+
+ var scrollToOptions = {
+ top: elements.divChatSameSideBody.scrollHeight,
+ behavior: 'smooth'
+ };
+ elements.divChatSameSideBody.scrollTo(scrollToOptions);
+ }
+ });
+ // Handle the response data
+ elements.btnOpenInviteUserTeam.closest("li").classList.remove('active');
+ closeBottomPopup();
+ getContractSectionDetails();
+ inviteTeamSelect = [];
+ }
+ switchClass(elements.loader, displayNoneClass, true);
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the update unread message flag of clause
+ * @returns {Promise}
+ */
+ async function unreadMessageForThread() {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify({
+ contractSectionId: selectedClauseID
+ });
+ var requestURL = apiBaseUrl + '/contract-section/update-unread-message-status/';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(data => {
+ // Handle the response data
+ switchClass(elements.loader, displayNoneClass, true);
+ var responseData = data;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ return true;
+ } else {
+ console.error('Error fetching data:', responseData);
+ }
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the geeting details of meeting
+ * @param meetingID
+ * @returns {Promise}
+ */
+ async function getContractMeetingDetails(meetingID) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var requestURL = apiBaseUrl + '/meeting/get-contract-meeting-detail/' + meetingID;
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'GET',
+ headers: headers,
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ switchClass(elements.loader, displayNoneClass, true);
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+
+ var participantCount = responseData.meetingParticipants ? responseData.meetingParticipants.length : 0
+
+ switchClass(elements.meetingPopup, displayNoneClass, false);
+
+ elements.meetingTitle.textContent = responseData.meetingTitle;
+ if (responseData.meetingLocation != null && responseData.meetingLocation != undefined) {
+ elements.meetingLocation.textContent = 'in ' + responseData.meetingLocation;
+ }
+ elements.meetingAgenda.textContent = responseData.meetingAgenda;
+ elements.meetingScheduleTime.textContent = formatDateForMeeting(responseData.meetingDate);
+ elements.MeetingTimings.textContent = responseData.meetingStartTime + " - " + responseData.meetingEndTime;
+ elements.participantCounts.textContent = participantCount;
+
+
+ var iHtml = '';
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + responseData.meetingOrganiser.firstName + " " + responseData.meetingOrganiser.lastName + '(Organiser) \n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ responseData.meetingParticipants.forEach((ele) => {
+ if (ele.userId != responseData.meetingOrganiser._id) {
+ var meetingStatus = 'images/pending-icon.svg'
+ if (ele.meetingStatus == 'Accepted') {
+ meetingStatus = 'images/check-circle.svg'
+ } else if (ele.meetingStatus == 'Decline') {
+ meetingStatus = 'images/times-circle-icon.svg'
+ } else {
+ meetingStatus = 'images/pending-icon.svg'
+ }
+ iHtml += '\n' +
+ '\t\t\t\t\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
' + ele.userInfo.firstName + " " + ele.userInfo.lastName + ' \n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t\t\t\t\t
\n' +
+ '\t\t\t\t
\n' +
+ ' ';
+ }
+ });
+ iHtml += ' ';
+ elements.meetingParticipantList.innerHTML = iHtml;
+ // Get the current time
+ var currentTime = new Date();
+
+ // Specify the meeting end time
+ var meetingEndTiming = new Date(responseData.meetingEndTiming);
+
+ // Check if the current time is less than the meeting end time
+ if (currentTime < meetingEndTiming) {
+ if (responseData.meetingLink != null && responseData.meetingLink != undefined && responseData.meetingLink != "") {
+ switchClass(elements.btnMeetingView, displayNoneClass, false);
+ } else {
+ switchClass(elements.btnMeetingView, displayNoneClass, true);
+ }
+ } else {
+ switchClass(elements.btnMeetingView, displayNoneClass, true);
+ if (responseData.meetingOutcomes != null && responseData.meetingOutcomes != undefined && responseData.meetingOutcomes != "") {
+ switchClass(elements.btnMeetingEnterOutcomes, displayNoneClass, true);
+ switchClass(elements.btnMeetingViewOutcomes, displayNoneClass, false);
+ elements.txtMeetingViewOutcomes.innerText = responseData.meetingOutcomes;
+ } else {
+ switchClass(elements.btnMeetingEnterOutcomes, displayNoneClass, false);
+ switchClass(elements.btnMeetingViewOutcomes, displayNoneClass, true);
+ }
+ }
+ return true;
+ } else {
+ console.error('Error fetching data:', responseData);
+ }
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for add meeting outcomes
+ * @returns {Promise}
+ */
+ async function submitMeetingOutcomes() {
+ switchClass(elements.loader, displayNoneClass, false);
+ var form = elements.formMeetingOutcomes;
+ const urlencoded = new URLSearchParams();
+ urlencoded.append("meetingId", elements.btnMeetingEnterOutcomes.getAttribute('data-id'));
+ urlencoded.append("meetingOutcome", form.elements['meetingOutcomes'].value);
+
+ let requestURL = apiBaseUrl + '/meeting/update-meeting-outcome';
+ var headers = {
+ "Content-Type": "application/x-www-form-urlencoded"
+ };
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: urlencoded
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ var responseData = response;
+ elements.txtMeetingViewOutcomes.innerText = form.elements['meetingOutcomes'].value;
+ switchClass(elements.btnMeetingViewOutcomes, displayNoneClass, false);
+ switchClass(elements.divMeetingViewOutcomes, displayNoneClass, false);
+ switchClass(elements.btnMeetingEnterOutcomes, displayNoneClass, true);
+ switchClass(elements.divMeetingEnterOutcomes, displayNoneClass, true);
+ switchClass(elements.loader, displayNoneClass, true);
+ elements.formMeetingOutcomes.reset();
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ }
+
+ /**
+ * @description This method is used for the get organisation lists
+ * @returns {Promise}
+ */
+ async function getOrganisationLists() {
+ try {
+ var requestURL = apiBaseUrl + '/contract/search-organisation';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'GET',
+ headers: headers,
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(response => {
+ // Handle the response data
+ if (response && response.status == true && response.code == 200) {
+ var responseData = response.data;
+ let organisationList = [];
+ responseData.forEach((ele) => {
+ organisationList.push({'id': ele._id, 'name': ele.companyName});
+ // organisationList.push(ele.companyName);
+ })
+ if (organisationList.length > 0) {
+ autocomplete(elements.inputOrganisationName, organisationList);
+ }
+ }
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the add clause to new group
+ * @param formData
+ * @param socket
+ */
+ function addContractClauseGroup(formData, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify(formData);
+ var requestURL = apiBaseUrl + '/contract/add-contract-clause-group';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(data => {
+ // Handle the response data
+ switchClass(elements.loader, displayNoneClass, true);
+ var responseData = data;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ getGroupClauses();
+ getClauseGroups();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ closeBottomPopup();
+ var data = {
+ chatRoomName: contractID,
+ refreshClauseList: true
+ };
+ socket.emit('refreshClauseList', data);
+ } else {
+ }
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the add clause to existing groups
+ * @param formData
+ * @param socket
+ */
+ function addContractSectionInExistingGroup(formData, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var data = JSON.stringify(formData);
+ var requestURL = apiBaseUrl + '/contract-section/add-contract-section-in-existing-group';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(data => {
+ // Handle the response data
+ switchClass(elements.loader, displayNoneClass, true);
+ var responseData = data;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ getGroupClauses();
+ getClauseGroups();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ closeBottomPopup();
+ var data = {
+ chatRoomName: contractID,
+ refreshClauseList: true
+ };
+ socket.emit('refreshClauseList', data);
+ } else {
+ }
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**
+ * @description This method is used for the remove clause from the group
+ * @param clauseID
+ * @param clauseGroupID
+ */
+ function clauseRemoveFromGroup(clauseID, clauseGroupID, socket) {
+ try {
+ switchClass(elements.loader, displayNoneClass, false);
+ var formData = {
+ clauseGroupId: clauseGroupID,
+ clauseId: clauseID
+ }
+ var data = JSON.stringify(formData);
+ var requestURL = apiBaseUrl + '/contract-section/remove-contract-section-from-group';
+ var headers = {
+ "Content-Type": "application/json"
+ };
+ if (authToken) headers["Authorization"] = 'Bearer ' + authToken;
+ var requestOptions = {
+ method: 'POST',
+ headers: headers,
+ body: data
+ };
+ fetch(requestURL, requestOptions)
+ .then(response => response.json())
+ .then(data => {
+ // Handle the response data
+ switchClass(elements.loader, displayNoneClass, true);
+ var responseData = data;
+ if (responseData && responseData.status == true && responseData.code == 200) {
+ // location.reload(true);
+ selectedThreadID = '';
+ $('.div-selected').removeClass('div-selected');
+ clauseNextPage = 1;
+ clauseHasNextPage = true;
+ clauseLists = [];
+ getClauses();
+ getGroupClauses();
+ getClauseGroups();
+ switchClass(elements.sectionContractLists, displayNoneClass, false);
+ switchClass(elements.sectionConversionHistory, displayNoneClass, true);
+ closeBottomPopup();
+ var data = {
+ chatRoomName: contractID,
+ refreshClauseList: true
+ };
+ socket.emit('refreshClauseList', data);
+ } else {
+ }
+ return true;
+ })
+ .catch(error => {
+ // Handle any errors
+ switchClass(elements.loader, displayNoneClass, true);
+ });
+ } catch (error) {
+ switchClass(elements.loader, displayNoneClass, true);
+ }
+ }
+
+ /**================== API End =========================*/
+
+ function autocomplete(inp, arr) {
+ /*the autocomplete function takes two arguments,
+ the text field element and an array of possible autocompleted values:*/
+ var currentFocus;
+ /*execute a function when someone writes in the text field:*/
+ inp.addEventListener("input", function (e) {
+ var a, b, i, val = this.value;
+ /*close any already open lists of autocompleted values*/
+ closeAllLists();
+ if (!val) {
+ return false;
+ }
+ let matchFound = false
+ currentFocus = -1;
+ /*create a DIV element that will contain the items (values):*/
+ a = document.createElement("DIV");
+ a.setAttribute("id", this.id + "autocomplete-list");
+ a.setAttribute("class", "autocomplete-items");
+ /*append the DIV element as a child of the autocomplete container:*/
+ this.parentNode.appendChild(a);
+ /*for each item in the array...*/
+ for (i = 0; i < arr.length; i++) {
+ /*check if the item starts with the same letters as the text field value:*/
+ if (arr[i] && arr[i].name.substr(0, val.length).toUpperCase() == val.toUpperCase()) {
+ matchFound = true
+ /*create a DIV element for each matching element:*/
+ b = document.createElement("DIV");
+ b.className = 'dropdown-option';
+ /*make the matching letters bold:*/
+ b.innerHTML = "" + arr[i].name.substr(0, val.length) + " ";
+ b.innerHTML += arr[i].name.substr(val.length);
+ /*insert a input field that will hold the current array item's value:*/
+ b.innerHTML += " ";
+ /*execute a function when someone clicks on the item value (DIV element):*/
+ b.addEventListener("click", function (e) {
+ /*insert the value for the autocomplete text field:*/
+ inp.value = this.getElementsByTagName("input")[0].value;
+ inp.setAttribute('data-id', this.getElementsByTagName("input")[0].getAttribute('data-id'));
+ // inp.value = this.getElementsByTagName("input")[0].value;
+ /*close the list of autocompleted values,
+ (or any other open lists of autocompleted values:*/
+ closeAllLists();
+ });
+ a.appendChild(b);
+ } else {
+ inp.setAttribute('data-id', '');
+ }
+ }
+
+ if (!matchFound) {
+ closeAllLists();
+ }
+ });
+ /*execute a function presses a key on the keyboard:*/
+ inp.addEventListener("keydown", function (e) {
+ var x = document.getElementById(this.id + "autocomplete-list");
+ if (x) x = x.getElementsByTagName("div");
+ if (e.keyCode == 40) {
+ /*If the arrow DOWN key is pressed,
+ increase the currentFocus variable:*/
+ currentFocus++;
+ /*and and make the current item more visible:*/
+ addActive(x);
+ } else if (e.keyCode == 38) { //up
+ /*If the arrow UP key is pressed,
+ decrease the currentFocus variable:*/
+ currentFocus--;
+ /*and and make the current item more visible:*/
+ addActive(x);
+ } else if (e.keyCode == 13) {
+ /*If the ENTER key is pressed, prevent the form from being submitted,*/
+ e.preventDefault();
+ if (currentFocus > -1) {
+ /*and simulate a click on the "active" item:*/
+ if (x) x[currentFocus].click();
+ }
+ }
+ });
+
+ function addActive(x) {
+ /*a function to classify an item as "active":*/
+ if (!x) return false;
+ /*start by removing the "active" class on all items:*/
+ removeActive(x);
+ if (currentFocus >= x.length) currentFocus = 0;
+ if (currentFocus < 0) currentFocus = (x.length - 1);
+ /*add class "autocomplete-active":*/
+ x[currentFocus].classList.add("autocomplete-active");
+ }
+
+ function removeActive(x) {
+ /*a function to remove the "active" class from all autocomplete items:*/
+ for (var i = 0; i < x.length; i++) {
+ x[i].classList.remove("autocomplete-active");
+ }
+ }
+
+ function closeAllLists(elmnt) {
+ /*close all autocomplete lists in the document,
+ except the one passed as an argument:*/
+ var x = document.getElementsByClassName("autocomplete-items");
+ for (var i = 0; i < x.length; i++) {
+ if (elmnt != x[i] && elmnt != inp) {
+ x[i].parentNode.removeChild(x[i]);
+ }
+ }
+ }
+
+ /*execute a function when someone clicks in the document:*/
+ document.addEventListener("click", function (e) {
+ closeAllLists(e.target);
+ });
+ }
+
+})(window, undefined);
diff --git a/sdkjs-plugins/content/propact/styles/font-awesome.min.css b/sdkjs-plugins/content/propact/styles/font-awesome.min.css
new file mode 100755
index 000000000..540440ce8
--- /dev/null
+++ b/sdkjs-plugins/content/propact/styles/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.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}.fa-lg{font-size:1.33333333em;line-height:.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:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;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}.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{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-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{-ms-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:#fff}.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-pp: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-resistance: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: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"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/sdkjs-plugins/content/propact/styles/jquery.atwho.min.css b/sdkjs-plugins/content/propact/styles/jquery.atwho.min.css
new file mode 100644
index 000000000..f770dc73b
--- /dev/null
+++ b/sdkjs-plugins/content/propact/styles/jquery.atwho.min.css
@@ -0,0 +1 @@
+.atwho-view{position:absolute;top:0;left:0;display:none;margin-top:18px;background:#fff;color:#000;border:1px solid #DDD;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.1);min-width:120px;z-index:11110!important}.atwho-view .atwho-header{padding:5px;margin:5px;cursor:pointer;border-bottom:solid 1px #eaeff1;color:#6f8092;font-size:11px;font-weight:700}.atwho-view .atwho-header .small{color:#6f8092;float:right;padding-top:2px;margin-right:-5px;font-size:12px;font-weight:400}.atwho-view .atwho-header:hover{cursor:default}.atwho-view .cur{background:#36F;color:#fff}.atwho-view .cur small{color:#fff}.atwho-view strong{color:#36F}.atwho-view .cur strong{color:#fff;font:700}.atwho-view ul{list-style:none;padding:0;margin:auto;max-height:200px;overflow-y:auto}.atwho-view ul li{display:block;padding:5px 10px;border-bottom:1px solid #DDD;cursor:pointer}.atwho-view small{font-size:smaller;color:#777;font-weight:400}
\ No newline at end of file
diff --git a/sdkjs-plugins/content/propact/styles/plugins.css b/sdkjs-plugins/content/propact/styles/plugins.css
new file mode 100755
index 000000000..e69de29bb
diff --git a/sdkjs-plugins/content/propact/styles/style.css b/sdkjs-plugins/content/propact/styles/style.css
new file mode 100755
index 000000000..b8c94f45e
--- /dev/null
+++ b/sdkjs-plugins/content/propact/styles/style.css
@@ -0,0 +1,539 @@
+@import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
+*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;}
+body{font-size:14px;font-weight:400;color:#00223A;font-family:'Poppins', sans-serif;margin:0;padding:0;line-height:21px;background-color:#EEEEEE;}
+h1, h2, h3, h4, h5{font-family:'Poppins', sans-serif;line-height:1.2;margin-top:0;color:#000;}
+p{margin:0;font-size:16px;color:#00223A;font-weight:400;line-height:25px;}
+a{color:#777;transition:.3s all ease;}
+a, a:focus, input:focus, button:focus{outline:none;box-shadow:inherit;}
+a, a:focus, a:hover, a:visited{text-decoration:none;transition:all 0.4s ease-in-out;}
+ul{padding:0;margin:0;}
+li{list-style:none;}
+img{max-width:100%;vertical-align:middle;border-style:none;height:auto;}
+
+/* ======================================= Editor Css ======================================= */
+.btn{width:auto;display:inline-block;margin:0;padding:10px 8px;border:0;font-size:14px;color:#282756;font-weight:400;font-family:'Poppins', sans-serif;border-radius:4px;min-width:86px;text-align:center;box-shadow:none !important;outline:none !important;}
+.btn-secondary{background:#E5E5E5;border:1px solid transparent;}
+.btn-secondary:hover{background-color:#ffffff !important;border:1px solid #282756;color:#282756;}
+/*#divCounterpartyTextbox .btn-secondary:hover{background-color:#FFBC81 !important;}*/
+.btn-primary{color:#ffffff !important;border:1px solid !important;background:#282756 !important;}
+.btn-primary:hover{background-color:transparent !important;border-color:#282756 !important;color:#282756 !important;}
+.form-group{width:100%;margin:0 0 20px 0;padding:0;float:left;}
+.form-group label{font-size:12px;font-weight:500;color:#282756;display:flex;margin:0 0 6px 0;padding:0;width:100%;}
+.form-group label.error, label.error{font-weight:400 !important;color:red;font-size:12px;}
+.form-group .form-control{width:100%;margin:0;padding:0 12px;border:1px solid #DADDE0;border-radius:5px;height:50px;font-size:12px;color:#282756;font-weight:400;font-family:'Poppins', sans-serif;outline:none !important;}
+.editable-div{padding:12px !important;height:70px !important;overflow-y:auto;}
+.form-group select.form-control{background-image:url(../images/select_Icon.svg);background-repeat:no-repeat;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:0.375rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;background-position:99.5%;padding-right:0px;}
+.left-sidebar{width:100%;margin:0;padding:0;display:flex;flex-wrap:wrap;background:#FFFFFF;height:100vh;max-width:100%;overflow:hidden;}
+.invite-counterpartie{width:100%;margin:0;padding:20px;float:left;height:auto;}
+.invite-counterpartie .invite-button{display:flex;width:100%;margin:0;padding:18px 18px;text-align:center;border:1px dashed #A2A6A7;font-size:14px;color:#282756;font-weight:400;line-height:normal;border-radius:4px;justify-content:center;align-items:center;}
+.invite-counterpartie .invite-button img{margin:0 12px 0 0;}
+.invite-counterpartie-form, .invite-counterpartie-pending, .contract-sameside-chat, .contract-create-form, .contract-chat-history, .contract-lists{width:100%;}
+.invite-form{width:100%;float:left;margin:0;padding:0;overflow:auto;}
+.invite-form .invite-form-header{width:100%;margin:0;padding:13px 20px;display:flex;align-items:center;justify-content:space-between;background:#F5F9FF;}
+.invite-form-header h3{margin:0;padding:0 15px 0 0;font-size:14px;color:#282756;font-weight:600;}
+.form-inner{width:100%;margin:0;padding:20px;float:left;}
+.form-inner form{width:100%;margin:0;padding:0;float:left;}
+/*.form-inner .submit-btn{float:right;margin:10px 0 0 0;padding:0;clear:both;}*/
+/*.form-inner .submit-btn .btn{margin:0 0 0 14px;}*/
+/*.form-inner .submit-btn .btn:first-child{margin:0;}*/
+.form-inner .submit-btn{margin:10px 0 0 0;padding:0;clear:both;display:flex;gap:16px 20px;flex-wrap:wrap;justify-content:flex-end;}
+.contract-section{width:100%;margin:0;padding:20px;float:left;}
+.intellivision-inner{width:100%;margin:0 0 20px 0;padding:0;display:flex;align-items:center;flex-wrap:wrap;}
+.intellivision-inner img{border-radius:50%;margin:0 10px 0 0;padding:0;object-fit:cover;object-position:center center;width:40px;height:40px;}
+.intellivision-inner h4{width:calc(100% - 50px);display:block;margin:0;padding:0;font-size:14px;color:#282756;font-weight:600;line-height:24px;}
+.contract-user-list{width:100%;float:left;margin:0;padding:0;}
+.contract-user-inner{width:100%;display:flex;align-items:center;margin:0 0 12px 0;padding:0;flex-wrap:wrap;}
+.contract-user-inner .contract-user-icon{margin:0 10px 0 0;float:left;}
+.contract-user-inner .contract-user-icon img{border-radius:50%;margin:0;padding:0;object-fit:cover;object-position:center center;width:40px;height:40px;}
+.contract-user-inner .contract-user-name{width:calc(100% - 50px);float:left;margin:0;padding:0;}
+.contract-user-inner .contract-user-name h4{display:block;margin:0;padding:0;font-size:12px;color:#282756;font-weight:600;line-height:22px;}
+.contract-user-inner .contract-user-name span{font-size:12px;color:#7E8299;font-weight:400;display:block;margin:0;padding:0;line-height:22px;}
+.contract-section.disabled .intellivision-inner{opacity:50%;}
+.contract-section.disabled .contract-user-inner{opacity:50%;}
+.contract-user-list p{font-size:12px;color:#282756;font-weight:400;margin:0;padding:0;line-height:22px;}
+.contract-user-list p a{font-size:12px;color:#282756;font-weight:600;text-decoration:underline;opacity:1;}
+.contract-drafting{width:100%;margin:0;padding:0;float:left;}
+.contract-drafting .contract-header{width:100%;margin:0;padding:8px 20px;display:flex;align-items:center;justify-content:space-between;background:#F5F9FF;}
+.contract-drafting .contract-header h3{margin:0;padding:0 15px 0 0;font-size:14px;color:#282756;font-weight:600;}
+.contract-list{overflow:hidden;width:100%;height:calc(100vh - 57px);float:left;margin:0;padding:12px;}
+.contract-list .contract-search{width:100%;margin:0;padding:0 0 10px 0;float:left;}
+.contract-list .contract-search .form-group{width:100%;margin:0;padding:0;float:left;position:relative;}
+.contract-list .contract-search .form-group .form-control{width:100%;margin:0;padding:0 42px 0 12px;border:1px solid #DADDE0;border-radius:5px;height:50px;font-size:12px;color:#485666;font-weight:400;font-family:'Poppins', sans-serif;}
+.contract-list .contract-search .form-group .btn{position:absolute;right:0;top:0;width:auto;min-width:auto;padding:14px 12px;background:transparent;}
+.contract-list-items{width:100%;float:left;margin:0;padding:2px 0 12px;height:calc(100% - 60px);overflow-y:auto;overflow-x:hidden;}
+.contract-list-items .contract-item{width:99.75%;margin:0 0 10px 0;padding:12px 12px 7px 12px;float:left;background:#F7F7F7;border-radius:6px;}
+.contract-list-items .contract-item a{width:100%;margin:0;padding:0;float:left;position:relative;}
+.contract-list-items .contract-item div.notification-no{width:10px;height:10px;background:#FF0000;border-radius:50%;display:inline-block;position:absolute;right:11px;top:29px;}
+.contract-item .contract-top{width:100%;margin:0;padding:0 0 10px 0;border-bottom:1px solid #E4E4E4;float:left;}
+.contract-item .contract-top h3{font-size:14px;font-weight:600;color:#282756;margin:0 0 8px 0;padding:0;width:100%;display:block;}
+.contract-item .contract-top p{font-size:12px;font-weight:400;margin:0;padding:0;color:#282756;line-height:18px;display:block;display:-webkit-box;max-width:100%;height:36px;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;}
+.contract-item .contract-top .btn{padding:4px 8px;margin:10px 0 0 0;width:auto;min-width:auto;background:transparent;border:1px solid;border-radius:30px;font-size:12px;font-weight:400;cursor:pointer;}
+.contract-item .contract-top .brown-color{color:#5D210C;border-color:#5D210C;}
+.contract-item .contract-top .fuchsia-color{color:#950495;border-color:#950495;}
+.contract-item .contract-top .success-color{color:#11AE0C;border-color:#11AE0C;}
+.contract-item .contract-top .withdrawn-color{color:#CC0000;border-color:#CC0000;}
+.contract-foot{width:100%;float:left;margin:0;padding:0;}
+.contract-foot .contract-foot-inner{display:flex;margin:0 -15px;padding:8px 0 0 0;}
+.contract-foot-inner .contract-foot-item{width:50%;padding:0 15px;float:left;margin:0;position:relative;}
+.contract-foot-inner .contract-foot-item::after{content:"";border-right:1px solid #E4E4E4;width:1px;height:100%;position:absolute;top:0;right:10px;}
+.contract-foot-inner .contract-foot-item:last-child::after{display:none;}
+.contract-foot-inner .contract-foot-item h3{font-size:12px;color:#282756;font-weight:600;margin:0 0 6px;padding:0;}
+.contract-foot-inner .contract-foot-item .contract-user{width:100%;display:flex;align-items:center;margin:0;padding:0;flex-wrap:wrap;}
+.contract-foot-inner .contract-foot-item .contract-user img{width:24px;height:24px;border-radius:50%;margin:0 4px 0 0;padding:0;}
+.contract-foot-inner .contract-foot-item .contract-user span{font-size:12px;color:#282756;font-weight:400;margin:0;padding:0;display:block;width:calc(100% - 27px);white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}
+.contract-foot-inner .contract-foot-item .contract-user .approved-user-lists{display:flex;width:auto;margin:0 7px 5px 0;}
+.create-contract{width:100%;margin:0;padding:0;float:left;}
+.create-contract-header{background:#79D7FA;width:100%;margin:0;padding:12px 20px;display:flex;align-items:center;justify-content:space-between;}
+.conversation-left{display:flex;align-items:center;margin:0;padding:0;flex-wrap:wrap;}
+.conversation-left .user-icon{width:40px;height:40px;margin:0 10px 0 0;padding:0;}
+.conversation-left .user-icon img{border-radius:50%;object-fit:cover;object-position:center center;width:100%;height:100%;}
+.conversation-left .user-inner{float:left;margin:0;padding:0;}
+.conversation-left .user-inner .user-name{font-size:12px;color:#282756;font-weight:600;margin:0 0 0px 0;padding:0;display:block;line-height:22px;}
+.conversation-left .user-inner p{font-size:12px;line-height:16px;margin:0;padding:0;display:block;}
+.create-contract-inner{width:100%;margin:0;padding:20px;float:left;height:calc(100vh - 62px);overflow:auto;}
+.form-group textarea.form-control{min-height:95px;margin:0;padding:12px;}
+/*.create-contract-inner .submit-btn{float:right;margin:10px 0 0 0;padding:0;clear:both;}*/
+/*.create-contract-inner .submit-btn .btn{margin:0 0 0 14px;}*/
+/*.create-contract-inner .submit-btn .btn:first-child{margin:0;}*/
+.create-contract-inner .submit-btn{margin:10px 0 0 0;padding:0;clear:both;display:flex;gap:16px 20px;flex-wrap:wrap;justify-content:flex-end;}
+.meeting-screen{width:100%;margin:0;padding:0;float:left;height:100%;}
+.meeting-screen .chat-create-header{background:#79D7FA;width:100%;margin:0;padding:10px 5px;display:flex;align-items:center;justify-content:space-between;}
+.meeting-screen .chat-create-header.counterparty{background:#FFBC81 !important;}
+.chat-create-header h3{font-size:14px;color:#282756;font-weight:600;margin:0;padding:0;line-height:22px;}
+.chat-body{overflow:auto;width:100%;float:left;margin:0;padding:12px 20px 20px;height:calc(100vh - 137px);overflow-y:auto;overflow-x:hidden;}
+.chat-body .chat-area{width:100%;margin:0;padding:0;float:left;}
+.chat-body .chat-area .message-wrapper{width:100%;float:left;margin:0 0 20px 0;padding:0;}
+/*.chat-body .chat-area .message-wrapper.reverse{direction:rtl;}*/
+.message-wrapper .profile-picture{width:100%;display:flex;margin:0;padding:0;align-items:start;}
+/*.message-wrapper.reverse .profile-picture{direction:rtl;justify-content:start;}*/
+.message-wrapper.reverse .profile-picture .last-seen{margin:0 6px 0 0;}
+.message-wrapper.reverse .profile-picture .name{margin:0 8px 0 0;}
+.message-wrapper .profile-picture .last-seen{font-size:12px;font-weight:400;margin:0 0 0 6px;padding:0;display:inline-block;color:#282756;opacity:50%;}
+.message-wrapper .profile-picture .name{font-size:12px;font-weight:400;color:#282756;margin:0 0 0 8px;padding:0;display:inline-block;position:relative;}
+.message-wrapper .profile-picture .name small{display:block;line-height:normal;position:absolute;}
+.message-wrapper .profile-picture img{width:40px;height:40px;border-radius:50%;border:2px solid #79D7FA;object-fit:cover;object-position:center center;}
+.chat-body .chat-area .message-wrapper .message-content{width:auto;display:inline-block;text-align:left;max-width:308px;background:#EFFAFF;padding:12px;border-radius:0 5px 5px 5px;margin:8px 0 0 0px;min-width:246px;position:relative;}
+.chat-body .chat-area .message-wrapper .message-content .message{font-size:12px;font-weight:400;line-height:17px;color:#282756;}
+.chat-body .chat-area .message-wrapper.reverse .message-content{margin-right:0;border-radius:5px 0px 5px 5px;margin-left:0;}
+.dark-gold-color .profile-picture img{border-color:#FFBC81;}
+.chat-body .chat-area .dark-gold-color .message-content{background:#FFBC81;}
+.chat-body .chat-area .dark-gold-color .message-content h4{font-size:12px;font-weight:600;margin:0 0 12px 0;padding:0;line-height:16px;}
+.chat-body .chat-area .dark-gold-color .message-content .message{background:#fff;border-radius:5px;padding:6px;}
+.chat-body .chat-area .message-wrapper.reverse strong{width:100%;float:none;margin:0;padding:8px 0 0 0;font-size:14px;font-weight:400;color:#282756;line-height:normal;}
+.chat-body .chat-area .message-wrapper strong{width:100%;float:left;margin:0;padding:8px 0 0 0;font-size:14px;font-weight:400;color:#282756;line-height:normal;}
+.light-gold-color .profile-picture img{border-color:#FFBC81;}
+.chat-body .chat-area .light-gold-color .message-content{background:#FFF6ED;}
+.red-color .profile-picture img{border-color:#FF0000;}
+.chat-body .chat-area .red-color .message-content{background:#FF0000;}
+.chat-body .chat-area .red-color .message-content h4{font-size:12px;font-weight:600;margin:0 0 12px 0;padding:0;line-height:16px;color:#fff;}
+.chat-body .chat-area .red-color .message-content .message{background:#fff;border-radius:5px;padding:6px;}
+.chat-body .chat-area .red-color .request-content{background:#FF0000;}
+.chat-body .chat-area .red-color .request-content h4{font-size:12px;font-weight:600;margin:0 0 12px 0;padding:0;line-height:16px;color:#fff;}
+.chat-body .chat-area .red-color .request-content .message{background:#fff;border-radius:5px;padding:6px;}
+.dudhiya-color .profile-picture img{border-color:#79D7FA;}
+.chat-body .chat-area .dudhiya-color .message-content{background:#79D7FA;}
+.chat-body .chat-area .dudhiya-color .message-content h4{font-size:12px;font-weight:600;margin:0 0 12px 0;padding:0;line-height:16px;}
+.chat-body .chat-area .dudhiya-color .message-content .message{background:#fff;border-radius:5px;padding:6px;}
+.chat-body .chat-area .top-bar{position:sticky;top:-12px;margin:0;text-align:center;background:#ffff;padding:4px 5px;z-index:9;}
+.chat-body .chat-area .top-bar span{font-size:12px;font-weight:600;color:#282756;opacity:50%;}
+.chat-create-footer{width:100%;float:left;margin:0;padding:12px 20px 20px;}
+.chat-footer-inner{display:flex;justify-content:center;margin:0;padding:0;width:100%;flex-wrap:wrap;}
+.chat-footer-inner .btn{border:1px solid #282756;margin:0 8px;background:transparent;color:#282756;opacity:1;padding:10px 12px;min-width:157px;}
+.chat-footer-inner .btn:hover, .submit-btn .btn:hover{cursor:pointer;}
+.chat-body .chat-area .grey-color .message-content{background:#F3F3F3;}
+.meeting-screen .chat-create-header .conversation-right{display:flex;align-items:center;margin:0;padding:0;position:relative;}
+.conversation-right > ul{display:flex;align-items:center;margin:0;padding:0;width:auto;}
+.conversation-right > ul li{margin:0;padding:0 3px;width:auto;float:left;min-width:30px;text-align:center}
+.conversation-right > ul li a{display:inline-block;margin:0;padding:0;width:auto;text-align:left;}
+.conversation-right > ul li a img{width:auto;max-width:30px;max-height:30px;margin:0;}
+/*.conversation-right > ul li:first-child a{width:30px}*/
+.conversation-right > ul li:first-child a img{max-height:30px;max-width:30px;width:100%;}
+.conversion-history .chat-body{height:calc(100vh - 325px);}
+.chat-create-footer .form-group{margin:0 0 16px 0;}
+.chat-create-footer .form-group textarea.form-control{min-height:80px;}
+.conversion-history .chat-footer-inner{justify-content:space-between;}
+.conversion-history .chat-footer-inner .btn{margin:0;}
+.conversion-history .chat-footer-inner .send-btn{width:auto;display:inline-block;margin:0;padding:0;}
+.conversion-history .chat-footer-inner .send-btn .btn-primary{height:40px;line-height:40px;font-size:14px;font-weight:400;margin:0 0 0 20px;background-color:#282756 !important;color:#fff !important;border:1px solid #282756 !important;padding:0 12px;border-radius:5px;}
+.conversion-history .chat-footer-inner .send-btn .btn-primary img{margin:0 6px 0 0;}
+.conversion-history .chat-footer-inner .send-btn .btn-primary.attach{width:44px;height:44px;padding:0;line-height:normal;}
+.conversion-history .chat-footer-inner .send-btn .btn-primary.attach img{margin:auto;}
+.conversion-history .chat-footer-inner .send-btn .btn-primary:hover{opacity:90%}
+.chat-body .chat-area .message-wrapper .message-content .delete-icon{position:absolute;right:-30px;top:50%;transform:translate(0, -50%);}
+.request-row{width:100%;margin:8px 0 0 0;padding:0 0 0 0px;}
+.request-row .request-content{width:auto;display:inline-block;text-align:left;max-width:308px;background:#79D7FA;padding:12px;border-radius:5px 0px 5px 5px;margin:0 0 0 0;min-width:246px;position:relative;}
+.request-row .request-content h4{margin:0 0 12px 0;padding:0;font-size:12px;font-weight:600;color:#282756;line-height:normal;}
+.request-row .request-content .content-message{background:#fff;border-radius:5px;padding:6px;font-size:12px;font-weight:400;line-height:17px;color:#282756;}
+.request-row .request-btn{display:block;align-items:center;margin:20px 0 0;padding:0 0 0 0;}
+.request-row .request-btn .btn{margin:0 6px 0 0;min-width:100px;}
+.request-row .request-btn .reject-btn{background:#FF0000;color:#fff;}
+.conversation-right > ul li .invite-user-tabs{width:100%;position:absolute;background:#fff;box-shadow:0 3px 10px #0000001a;border-radius:10px;min-width:250px;left:auto;right:0;top:34px;padding:20px 12px;transition:all .6s ease .1s;opacity:0;transform:translateY(-15px);visibility:hidden;pointer-events:none;z-index:99;}
+.conversation-right > ul li .invite-user-tabs:after{background:url(../images/Polygon_icon.svg) no-repeat center center;content:"";position:absolute;margin:0;padding:0;width:14px;height:14px;top:-5px;left:150px;right:auto;}
+.conversation-right > ul li.active .invite-user-tabs{transform:translate(0);opacity:1;visibility:visible;pointer-events:auto;}
+.conversation-right > ul li .invite-user-tabs .invite-user-tabs-header{width:100%;margin:0;padding:0;float:left;}
+.invite-user-tabs .invite-user-tabs-header .nav-tabs{width:auto;justify-content:center;align-items:center;margin:0 auto 20px;background:#69DAEE;border:0;border-radius:4px;padding:4px;float:none;max-width:216px;}
+.invite-user-tabs .invite-user-tabs-header .nav-tabs .nav-item{margin:0;padding:0;float:none;display:inline-block;}
+.invite-user-tabs-header .nav-tabs .nav-item .nav-link{font-size:14px;font-weight:600;color:#282756;border:0;border-radius:4px;padding:0;line-height:32px;min-width:102px;text-align:center;margin:0;display:inline-block;}
+/*.invite-user-tabs-header .nav-tabs .nav-item .nav-link:hover,.invite-user-tabs-header .nav-tabs .nav-item .nav-link.active{background:#fff;opacity:100%;}*/
+.conversation-right > ul li .invite-user-tabs .invite-user-tabs-body{float:left;margin:0;padding:0;width:100%;}.invite-user-tabs-body .tab-content{width:100%;margin:0;padding:0;display:block;}
+.invite-user-tabs-body .tab-content .invite-user-list{width:100%;margin:0;padding:0;float:left }
+.invite-user-tabs-body .tab-content .invite-user-list ul{width:100%;float:left;margin:0;display:inline-block;padding:0 10px;}
+.invite-user-tabs-body .tab-content .invite-user-list ul li{margin:0 0 12px;padding:0;width:100%;float:left;}
+.invite-user-list ul li .invite-user-inner{width:100%;display:flex;align-items:center;margin:0;padding:0;}
+.invite-user-list ul li .invite-user-inner .invite-user-icon{margin:0;padding:0 10px 0 0;display:block;}
+.invite-user-list ul li .invite-user-inner .invite-user-icon img{width:40px;height:40px;object-fit:cover;object-position:center center;border-radius:50%;}
+.invite-user-list ul li .invite-user-inner .invite-user-name{width:calc(100% - 50px);float:left;margin:0;padding:0;}
+.invite-user-list ul li .invite-user-inner .invite-user-name h3{font-size:14px;font-weight:400;color:#282756;margin:0;padding:0;width:100%;float:left;text-align:left;}
+.invite-user-list ul li .invite-user-inner .invite-user-name span{font-size:10px;font-weight:400;color:#282756;float:left;width:100%;opacity:50%;text-align:left;}
+.invite-user-list .invite-btn{width:100%;float:left;padding:0;text-align:center;margin:8px 0 0;}
+.invite-user-list .invite-btn .btn-primary{padding:4px 15px;font-size:14px;font-weight:400;background:#282756 !important;color:#fff !important;border:1px solid !important;}
+.invite-user-list .invite-btn .btn-primary:hover{opacity:90%}
+.d-none{display:none;}
+.btn-markup{border:1px solid;}
+.btn-markup:hover{background-color:#282756 !important;border-color:#282756 !important;color:#fff !important;}
+/* ======================================= Editor Css ======================================= */
+
+/* ===================================== Sanckbar CSS ======================================= */
+#snackbar{visibility:hidden;max-width:250px;margin-left:-110px;background-color:#333;color:#fff;text-align:center;border-radius:2px;padding:8px;position:fixed;z-index:1;left:44%;bottom:30px;font-size:13px;}
+#snackbar.show{visibility:visible;-webkit-animation:fadein 0.5s, fadeout 0.5s 2.5s;animation:fadein 0.5s, fadeout 0.5s 2.5s;}
+@-webkit-keyframes fadein{from{bottom:0;opacity:0;} to{bottom:30px;opacity:1;}}
+@keyframes fadein{from{bottom:0;opacity:0;} to{bottom:30px;opacity:1;}}
+@-webkit-keyframes fadeout{from{bottom:30px;opacity:1;} to{bottom:0;opacity:0;}}
+@keyframes fadeout{from{bottom:30px;opacity:1;} to{bottom:0;opacity:0;}}
+/* ===================================== Sanckbar CSS ======================================= */
+
+.form-group .form-control.invite-users-input{background-image:url(../images/select_Icon.svg);background-repeat:no-repeat;background-position:99.5%;padding-right:32px;cursor:pointer;}
+.accordion-button:focus{z-index:unset;border-color:transparent;box-shadow:none;}
+.form-control:focus{background-color:transparent;border-color:#DADDE0;outline:0;box-shadow:none;}
+.chat-body::-webkit-scrollbar, .contract-clause-sections::-webkit-scrollbar, .create-contract-inner::-webkit-scrollbar{width:0.25em;z-index:99999999;}
+.chat-body::-webkit-scrollbar-track, .contract-clause-sections::-webkit-scrollbar-track, .create-contract-inner::-webkit-scrollbar-track{-webkit-box-shadow:inset 0 0 6px rgba(0,0,0,0.3);}
+.chat-body::-webkit-scrollbar-thumb, .contract-clause-sections::-webkit-scrollbar-thumb, .create-contract-inner::-webkit-scrollbar-thumb{background-color:darkgrey;outline:1px solid slategrey;}
+div.div-selected{background:#d5d5d5 !important;}
+.chat-body .chat-area .message-wrapper.reverse .message, .reverse .message, .reverse .content-message{direction:ltr;}
+.small, small{font-size:0.75em;}
+.crop-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;width:125px;}
+p.nodata-info{text-align:center;font-size:12px;color:#282756;}
+.btn.disabled, .btn:disabled, fieldset:disabled .btn{background-color:grey !important;color:white !important;border:none;}
+span#typingSpanCP, span#typingSpan{font-size:10px;}
+.invite-user-list #userTabContent, .invite-user-list #teamTabContent{padding:0 8px;}
+.invite-teams-popup, .invite-users-popup, .position-confirmation-popup{width:100%;float:left;margin:0;padding:40px 12px;position:absolute;left:0;right:0;bottom:0;background:#fff;z-index:9;box-shadow:0 -3px 10px #0000001a;border-radius:10px 10px 4px 4px;}
+.contract-completed{opacity:.5!important;pointer-events:none!important;}
+.chat-body .chat-area .message-wrapper .message-content .message p{font-size:12px;font-weight:400;line-height:17px;color:#282756;}
+
+/*==================================== 22-08-2023 ====================================*/
+.invite-users-inner{width:100%;margin:0;padding:0;display:block;}
+.invite-users-inner img{width:48px;margin:0 auto 12px;display:block;}
+.invite-users-inner h3{font-size:18px;color:#282756;text-align:center;display:block;margin:0 0 16px 0;padding:0;}
+.chat-create-footer .chat-typing-area{width:100%;margin:0;padding:0;display:block;text-align:center;}
+.chat-create-footer .chat-typing-area .position-text{font-size:14px;color:#282756;font-weight:400;margin:0 auto 20px;max-width:340px;}
+.select-user-table{width:100%;margin:0;padding:0;display:block;}
+.select-user-table h4{margin:0 0 15px 0;padding:0;display:block;width:100%;color:#282756;font-size:1rem;}
+.select-user-table .table-responsive{width:100%;margin:0;padding:0;}
+.select-user-table .table-responsive thead th{vertical-align:middle;font-size:14px;font-weight:500;margin:0;}
+.select-user-table .table-responsive tbody td{vertical-align:middle;font-size:14px;font-weight:400;margin:0;}
+.select-user-table .table-responsive .form-check{display:block;min-height:0;margin-bottom:0;}
+input[type=checkbox]{position:relative;border:1px solid #282756 !important;border-radius:2px;cursor:pointer;line-height:0;margin:2px 0 0 0;outline:0;padding:0 !important;vertical-align:text-top;height:18px;width:18px;-webkit-appearance:none;opacity:1;background-color:#fff;box-shadow:none !important;right:7px;}
+#formClause input[type=checkbox]{width:22px !important;}
+#formClause #accordionBodyTeams input[type=checkbox], #formClause #accordionBodyUsers input[type=checkbox]{width:18px !important;}
+input[type=checkbox]:hover{opacity:1;}
+input[type=checkbox]:checked{background-color:#282756 !important;opacity:1;}
+input[type=checkbox]:before{content:'';position:absolute;right:50%;top:50%;width:6px;height:10px;border:solid #FFF;border-width:0 2px 2px 0;margin:-1px -2px 0 -1px;transform:rotate(45deg) translate(-50%, -50%);z-index:2;}
+.form-check-input:focus{border-color:#282756 !important;outline:0 !important;box-shadow:none !important;}
+.position-confirmation-popup .confirmation-form input[type=checkbox]{margin:0;}
+.confirmation-form{width:100%;margin:0;padding:0;display:block;}
+.confirmation-form .accordion-header{width:100%;display:block;clear:both;margin:0 0 10px 0;padding:0;}
+.filter-box{width:100%;margin:10px 0 0 0;padding:0;display:block;}
+div#divDraftingBox div#assignDraftingRequestBox{margin:0 0 0 0;}
+div#divDraftingBox div#assignDraftingRequestBox.d-none .accordion .accordion-collapse{display:none;}
+div#divDraftingBox div#assignDraftingRequestBox .accordion .accordion-collapse{display:block;}
+div#divDraftingBox div#assignDraftingRequestBox .accordion .accordion-header{display:none;}
+div#divDraftingBox div#assignDraftingRequestBox{margin:-4px 0 0 0;}
+div#divDraftingBox div#assignDraftingRequestBox div#accordionExampleB .accordion-item{border-top:0;border-radius:0px 0px 6px 6px;}
+
+#formAssignDraftRequest div#assignDraftRequestBox, #formReassignDraftRequest div#reassignDraftRequestBox{margin:0;}
+#formAssignDraftRequest div#assignDraftRequestBox.d-none .accordion .accordion-collapse, #formReassignDraftRequest div#reassignDraftRequestBox.d-none .accordion .accordion-collapse{display:none;}
+#formAssignDraftRequest div#assignDraftRequestBox .accordion .accordion-collapse, #formReassignDraftRequest div#reassignDraftRequestBox .accordion .accordion-collapse{display:block;}
+#formAssignDraftRequest div#assignDraftRequestBox .accordion .accordion-header, #formReassignDraftRequest div#reassignDraftRequestBox .accordion .accordion-header{display:none;}
+#formAssignDraftRequest div#assignDraftRequestBox div#accordionExampleA, #formReassignDraftRequest div#reassignDraftRequestBox div#accordionExampleC{margin:-4px 0 0 0;}
+#formAssignDraftRequest div#assignDraftRequestBox div#accordionExampleA .accordion-item, #formReassignDraftRequest div#reassignDraftRequestBox div#accordionExampleC .accordion-item{border-top:0;border-radius:0px 0px 6px 6px;}
+.go-btn2{padding-bottom:10px;}
+.go-btn2 .btn{border:1px solid #282756;}
+lable.d-block{color:red;}
+/*.chat-footer-inner-2{justify-content:flex-end;}*/
+.close-btn{width:30px;}
+.filter-box .accordion-header{margin:0;}
+.filter-box .filter-inner{width:100%;margin:0;padding:0;display:block;}
+.filter-box .filter-inner li{margin:0 0 15px 0;}
+.filter-box .filter-inner li:last-child{margin:0;}
+.contract-drafting .contract-header .btn-markup{color:#282756 !important;}
+.contract-drafting .contract-header .btn-markup:hover{color:#fff !important;}
+.contract-drafting .contract-header .btn-primary{color:#ffffff !important;}
+.contract-drafting .contract-header .btn-primary:hover{color:#282756 !important;}
+.filter-box .accordion-item .accordion-button{font-size:14px;font-weight:500;gap:10px;color:#282756;}
+.filter-box .filter-inner .form-check{gap:10px;display:flex;align-items:center;}
+.filter-box .filter-inner .form-check .form-check-label{margin:0;}
+.filter-box .filter-inner .form-check .form-check-label strong{font-weight:500;}
+.accordion-button:not(.collapsed){background-color:#ebebeb;}
+.filter-box .accordion-item .accordion-body p{font-size:14px;}
+.filter-box .accordion-item #accordionAssignDraftRequest p{font-size:12px !important;}
+.invite-user-tabs-body .tab-content .invite-user-list ul p{font-size:14px;}
+.tooltip .tooltip-inner{font-size:12px;}
+a.disabled{pointer-events:none;cursor:not-allowed;opacity:.5;}
+.chat-area .scheduled-meeting{width:100%;float:left;margin:0 0 15px 0;padding:15px;background:#E9E9EE;border-radius:10px;cursor:pointer;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner{width:100%;display:flex;border-bottom:none;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner .scheduled-meeting-icon{width:52px;margin:0;padding:0 12px 0 0;float:left;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner .scheduled-meeting-content{width:calc(100% - 52px);float:left;margin:0;padding:0;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner .scheduled-meeting-content h3{font-size:14px;font-weight:500;color:#282756;margin:0 0 8px 0;padding:0;width:100%;float:left;line-height:20px;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner .scheduled-meeting-content p{font-size:12px;color:#282756;opacity:70%;margin:0 0 8px 0;padding:0;width:100%;float:left;font-weight:400;}
+.chat-area .scheduled-meeting .scheduled-meeting-inner .scheduled-meeting-content span{width:auto;display:inline-block;margin:0 10px 0 0;padding:0;font-size:12px;font-weight:400;color:#282756;opacity:70%;}
+.meeting-details{width:100%;float:left;margin:0;padding:40px 12px 20px;position:absolute;left:0;right:0;bottom:0;background:#fff;z-index:9;box-shadow:0 -3px 10px rgba(0, 0, 0, 0.1);border-radius:10px 10px 4px 4px;}
+.meeting-details .meeting-details-inner{width:100%;float:left;margin:0 0 14px 0;padding:0 0 14px 0;border-bottom:1px solid #D1D1D1;}
+.meeting-details .meeting-details-inner .inner-title{width:100%;float:left;margin:0;padding:0;}
+.meeting-details .meeting-details-inner .inner-title h4{font-size:16px;color:#282756;font-weight:500;margin:0 0 12px 0;padding:0;float:left;width:100%;line-height:20px;}
+.meeting-details .meeting-details-inner .inner-title p{font-size:14px;font-weight:400;margin:0 0 12px 0;padding:0;line-height:20px;color:#282756;width:100%;float:left;}
+.meeting-details .meeting-details-inner .inner-title span{display:inline-block;font-size:14px;font-weight:400;margin:0 2px 0 0;padding:0;line-height:20px;color:#282756;opacity:70%;}
+.meeting-details .meeting-user-list{width:100%;float:left;margin:0;padding:0;}
+.meeting-user-list .meeting-user-title{width:100%;float:left;margin:0 0 20px 0;padding:0;}
+.meeting-details .meeting-user-list .meeting-user-title h4{margin:0;padding:0;display:block;width:100%;font-size:14px;color:#282756;font-weight:500;line-height:20px;}
+.meeting-details .meeting-user-list .meeting-user-items{width:100%;float:left;margin:0;padding:0;}
+.meeting-details .meeting-user-list .meeting-user-items ul{width:100%;float:left;padding:0;margin:0;max-height:170px;overflow:auto;-ms-overflow-style:none;scrollbar-width:none;}
+.meeting-details .meeting-user-list .meeting-user-items ul li{width:100%;float:left;margin:0 0 10px 0;padding:0;}
+.meeting-details .meeting-user-list .meeting-user-items ul li .meeting-user-item{width:100%;display:flex;align-items:center;justify-content:space-between;margin:0;padding:0;}
+.meeting-details .meeting-user-list .meeting-user-items ul li .meeting-user-item .left-item{width:auto;display:inline-block;margin:0 10px 0 0;padding:0;}
+.meeting-details .meeting-user-list .meeting-user-items ul li .meeting-user-item .left-item img{width:24px;height:24px;object-fit:cover;object-position:center center;margin:0 12px 0 0;padding:0;border-radius:50%;}
+.meeting-details .meeting-user-list .meeting-user-items ul li .meeting-user-item .left-item span{font-size:14px;color:#282756;font-weight:400;margin:0;padding:0;display:inline-block;}
+.meeting-details .meeting-user-list .submit-btn{width:100%;display:flex;align-items:center;justify-content:space-between;margin:0;padding:10px 0 0 0;}
+.form-control, .form-control[readonly], .form-control[disabled]{border-color:#DADDE0 !important;}
+.page-loader{position:absolute;top:0;right:0;width:100%;height:100%;background-color:#fff;background-image:url('../images/ajax-loader.gif');background-size:50px;background-repeat:no-repeat;background-position:50%;z-index:10000000;opacity:.6;}
+.displayed-invitecp{height:calc(100vh - 240px);}
+.displayed-invitecp-pending{height:calc(100vh - 320px);}
+.scroll-down{opacity:1;-webkit-transition:all .5s ease-in 3s;transition:all .5s ease-in 3s;}
+.scroll-down{position:absolute;bottom:30px;margin-left:-16px;display:block;width:32px;height:32px;border:2px solid #282756;background-size:14px auto;border-radius:50%;z-index:2;-webkit-animation:bounce 2s infinite 2s;animation:bounce 2s infinite 2s;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;right:30px;background:#282756;}
+.scroll-down:before{position:absolute;top:calc(50% - 8px);left:calc(50% - 6px);transform:rotate(-45deg);display:block;width:12px;height:12px;content:"";border:2px solid white;border-width:0px 0 2px 2px;}
+a.clause-options{width:16px;text-align:center;}
+.clause-options i{color:#282756;font-size:21px;padding-top:4px;}
+ul.more-option{min-width:140px;}
+ul.more-option li{padding:5px 5px;width:100%;}
+ul.more-option li a{font-weight:400;font-size:12px;padding:3px 6px;width:100%;color:#282756 !important;}
+ul.more-option li a:visited{color:#282756 !important;}
+.tooltip.custom-tooltip-class{opacity:1;}
+.tooltip.custom-tooltip-class .tooltip-inner{font-size:12px;background:#fff;box-shadow:rgba(99, 99, 99, 0.2) 0px 2px 8px 0px;}
+.tooltip.custom-tooltip-class .tooltip-inner .invite-user-tabs{padding:0 10px 10px;}
+.tooltip.custom-tooltip-class .tooltip-inner .clause-heading h3{font-size:14px;padding:15px 0 0;}
+.tooltip.custom-tooltip-class.counterparty-tooltip .tooltip-inner .clause-heading h3{font-size:14px;padding:10px 0 0;}
+.tooltip.custom-tooltip-class .tooltip-inner .invite-user-tabs h3{font-size:14px;margin:0 0 10px 0;font-weight:600;}
+.tooltip.custom-tooltip-class .tooltip-inner .invite-user-tabs #userTabContent h3{font-size:12px;margin:6px 0px 2px 0;font-weight:500 !important;}
+.tooltip.custom-tooltip-class .tooltip-arrow::before{border-bottom-color:#fff;}
+.tooltip.custom-tooltip-class .invite-user-list ul li .invite-user-inner .invite-user-name{text-align:left;}
+.tooltip.custom-tooltip-class .invite-user-list ul li{padding:3px 0;}
+.tooltip.custom-tooltip-class .invite-user-list ul li .invite-user-inner .invite-user-name span{opacity:90%;}
+.chat-body .atwho-inserted a, #messageInputSameSide .atwho-inserted a{color:#00d4ff !important;}
+.chat-body .light-gold-color .atwho-inserted a, #messageInputCounterParty .atwho-inserted a{color:#FFBC81 !important;}
+#atwho-ground-messageInputSameSide .atwho-view .cur{background:#00d4ff !important;}
+#atwho-ground-messageInputCounterParty .atwho-view .cur{background:#FFBC81 !important;}
+img.img-info{width:16px;padding-left:3px;display:inline-block;margin:-2px 0 0 0;}
+.chkbox-label{padding-top:9px !important;cursor:pointer;}
+.meeting-outcomes, .meeting-outcomes-form{padding:20px 0;}
+.meeting-outcomes h5, .meeting-outcomes-form h5{font-size:16px;color:#282756;font-weight:500;}
+.meeting-outcomes-form .form-group{margin:0 0 5px 0;}
+p#txtMeetingViewOutcomes{font-size:14px;font-weight:400;}
+@keyframes bounce{
+ 0%,
+ 100%,
+ 20%,
+ 50%,
+ 80%{
+ -webkit-transform:translateY(0);
+ -ms-transform:translateY(0);
+ transform:translateY(0);
+ }
+ 40%{
+ -webkit-transform:translateY(-10px);
+ -ms-transform:translateY(-10px);
+ transform:translateY(-10px);
+ }
+ 60%{
+ -webkit-transform:translateY(-5px);
+ -ms-transform:translateY(-5px);
+ transform:translateY(-5px);
+ }
+}
+.contract-list-items .contract-item div.ringring{border:3px solid #FF0000;-webkit-border-radius:30px;height:20px;width:20px;position:absolute;right:6px;top:24px;-webkit-animation:pulsate 1s ease-out;-webkit-animation-iteration-count:infinite;opacity:0.0;}
+@-webkit-keyframes pulsate{
+ 0%{-webkit-transform:scale(0.1, 0.1);opacity:0.0;}
+ 50%{opacity:1.0;}
+ 100%{-webkit-transform:scale(1.2, 1.2);opacity:0.0;}
+}
+
+/******** 17-6-2024 **********/
+.contract-list .contract-list-items{border:1px solid transparent;padding:8px 1px 12px 5px;border-radius:5px;height:auto;}
+.contract-list .contract-list-items.selected{border-color:#282756;}
+.contract-list .contract-list-items .head-h2{color:#282756;font-size:14px;font-weight:600;padding:10px 0 0;}
+.contract-top .contract-checkbox{float:right;}
+.remove-btn{padding-bottom:12px;text-align:right;}
+.remove-btn .btn{border:1px solid #282756;}
+.remove-btn .btn:hover{background-color:#282756;color:#ffffff;}
+.radio-custom{position:relative;margin:0 0 0 -20px;}
+.radio-custom input{width:15px;height:15px;opacity:0;cursor:pointer;position:absolute;left:20px;z-index:2;}
+.radio-custom span{width:14px;height:14px;display:inline-block;outline:1px solid #282756;border-radius:50%;border:3px solid #F7F7F7;position:absolute;left:0;top:3px;}
+.radio-custom input:checked + span{background:#282756;}
+.radio-group-top label{font-size:13px;cursor:pointer;}
+.radio-custom + .form-check-label{cursor:pointer;}
+.radio-group-top{background:#F7F7F7;padding:16px 10px 8px 20px;margin-bottom:20px;border-radius:5px;}
+.space-beetween{display:flex;justify-content:space-between;}
+.type-sms-btn-part{position:static;right:8px;bottom:8px;}
+.type-sms-btn-part .btn{min-width:40px;padding:8px 7px;width:40px;height:40px}
+.conversation-right > ul li .invite-user-tabs.first-icon{right:43px;}
+.chat-top-new-part .line{font-size:14px;color:#282756;font-weight:600;}
+.chat-top-new-part .line3{display:block;}
+.chat-top-new-part .line3 div:first-child{flex:none;display:inline-block;}
+.chat-top-new-part .line3 .text{font-size:12px;font-weight:normal;flex-wrap:wrap;padding-left:5px;}
+/*.chat-pdf-box{background-color:rgba(121, 215, 250, 0.12);padding:10px;width:242px;margin-left:auto;border-radius:5px;}
+.chat-pdf-box .icon{background-color:#ffffff;text-align:center;width:222px;height:110px;display:flex;justify-content:center;align-items:center;border-radius:5px;}
+.chat-pdf-box h4{color:#282756;font-size:12px;line-height:17px;margin:0;padding:10px 0 0 0;font-weight:600;}
+.chat-pdf-box p{font-size:10px;line-height:18px;color:rgba(40, 39, 86, 0.50);margin:0;padding:0;}*/
+.attachment{padding:10px;width:242px;border-radius:5px;margin:8px 0 0 0px;cursor:pointer;}
+.attachment .icon{background-color:#ffffff;text-align:center;width:222px;height:110px;display:flex;justify-content:center;align-items:center;border-radius:5px;}
+.attachment h4{color:#282756;font-size:12px;line-height:17px;margin:0;padding:10px 0 0 0;font-weight:600;}
+.attachment p{font-size:10px;line-height:18px;color:rgba(40, 39, 86, 0.50);margin:0;padding:0;}
+.chat-body .chat-area .message-wrapper .attachment{background:rgba(121, 215, 250, 0.12);}
+.chat-body .chat-area .light-gold-color .attachment{background:rgb(255, 246, 237);}
+.chat-body .chat-area .message-wrapper.reverse .attachment, .reverse .attachment{direction:ltr;}
+/*==================================== 22-08-2023 ====================================*/
+
+/*======= Responsive CSS Start =======*/
+@media only screen and (max-width:422px){
+ .chat-footer-inner .btn{margin:0 4px;padding:7px 8px;min-width:auto;font-size:12px}
+ .conversion-history .chat-footer-inner .send-btn .btn-primary{font-size:12px}
+}
+@media only screen and (max-width:375px){
+ .chat-footer-inner .btn{margin:0 4px;padding:10px 12px;min-width:auto;}
+ .btn{font-size:11px;}
+ .request-row .request-content,.chat-body .chat-area .message-wrapper .message-content{min-width:auto;}
+ .conversation-right > ul li{min-width:30px;}
+ .conversation-right > ul li a img{max-width:24px;max-height:24px;}
+ .conversation-right > ul li:first-child a{width:27px}
+ .conversation-right > ul li:first-child a img{max-height:27px;max-width:27px;width:100%;}
+ .clause-options i{font-size:19px;}
+ .conversation-left .user-icon{width:35px;height:35px;margin:0 6px 0 0;}
+ .conversation-left .user-inner .user-name{font-size:12px;width:105px;}
+ .conversion-history .chat-footer-inner .send-btn .btn-primary{margin:0 0 0 2px;padding:0 10px;}
+ .meeting-screen .chat-create-header .conversation-right .close-btn img{max-width:26px;}
+ .chat-body .chat-area .message-wrapper .message-content .delete-icon{right:-20px;}
+ .contract-list .contract-search .form-group .form-control{height:40px;}
+ .contract-list .contract-search .form-group .btn{padding:10px 12px;height:40px}
+ .contract-list .contract-search .form-group .btn img{max-width:15px;}
+ .chat-body .chat-area .message-wrapper strong,.chat-body .chat-area .message-wrapper.reverse strong{font-size:12px;}
+ .select-user-table .table-responsive tbody td,.select-user-table .table-responsive thead th{font-size:12px;}
+ .select-user-table h4{margin:0 0 10px 0;font-size:14px;}
+ .confirmation-form .accordion-header label{font-size:12px;line-height:16px;}
+ .form-group .form-control{height:40px;}
+ .confirmation-form .accordion-header .accordion-button{padding:10px 12px;font-size:12px;}
+ .confirmation-form .accordion-collapse .accordion-body{padding:8px 10px;}
+ .conversation-right > ul li .invite-user-tabs{min-width:230px;padding:10px 10px;}
+ .invite-user-tabs .invite-user-tabs-header .nav-tabs{margin:0 auto 10px;max-width:216px;}
+ .invite-user-tabs-header .nav-tabs .nav-item .nav-link{font-size:12px;min-width:100px;}
+ .invite-user-list ul li .invite-user-inner .invite-user-icon img{width:30px;height:30px;}
+ .invite-user-list ul li .invite-user-inner .invite-user-name{width:calc(100% - 40px);}
+ .invite-user-list ul li .invite-user-inner .invite-user-name h3{font-size:12px;margin:0 0 0;line-height:16px;}
+ .invite-user-list ul li .invite-user-inner .invite-user-name span{line-height:15px;}
+ .conversion-history .chat-footer-inner .send-btn .btn-primary{font-size:12px;}
+ .invite-user-list .invite-btn .btn-primary{font-size:12px;}
+ .filter-box .accordion-item .accordion-button{font-size:12px;padding:10px 10px;}
+ .accordion-body{padding:10px;}
+ .filter-box .accordion-item .accordion-body p{font-size:12px;line-height:18px;width:auto}
+ .filter-box .accordion-item .accordion-body .user-name{width:auto;}
+ .invite-user-tabs-body .tab-content .invite-user-list ul p{font-size:12px;line-height:18px;}
+ .filter-box .accordion-item .accordion-button::after{background-size:18px auto;background-position:100%;}
+ .crop-text{width:115px;}
+ .chat-panel-wrap .chat-create-footer .go-btn2 lable{font-size:12px;line-height:16px;}
+ .chat-panel-wrap .chat-create-footer .go-btn2 lable .file-icon{width:17px;}
+}
+@media only screen and (max-width:350px){
+ .meeting-screen .chat-create-header{padding:10px 10px;}
+ .contract-drafting .contract-header{padding:8px 10px;}
+ .conversation-left .user-icon{width:25px;height:25px;}
+ .btn{padding:6px 8px;}
+ .contract-list{padding:12px 10px;}
+ .contract-list-items .contract-item{padding:10px 10px 5px 10px;}
+ .contract-foot-inner .contract-foot-item{padding:0 10px;}
+ .contract-foot .contract-foot-inner{margin:0 -10px;}
+ .contract-foot-inner .contract-foot-item::after{right:5px;}
+ .chat-create-header h3{font-size:12px;line-height:18px;}
+ .chat-body{padding:10px 10px 10px;}
+ .message-wrapper .profile-picture img{width:25px;height:25px;border:1px;}
+ .message-wrapper .profile-picture .name{font-size:10px;margin:0 0 0 4px;line-height:16px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}
+ .message-wrapper .profile-picture .last-seen{font-size:10px;margin:0 0 0 4px;line-height:16px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}
+ .message-wrapper.reverse .profile-picture .name,.message-wrapper.reverse .profile-picture .last-seen{margin:0 4px 0 0;}
+ .message-wrapper .profile-picture .name small{position:static;}
+ .chat-body .chat-area .message-wrapper .message-content{padding:6px;}
+ .request-row .request-content{padding:6px;}
+ .conversation-left{flex-wrap:inherit;}
+ .conversation-left .user-inner .user-name{font-size:11px;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:105px;}
+ .conversation-left .user-inner p{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;width:90px;font-size:10px;}
+ .chat-create-header .conversation-left .user-inner p{line-height:10px }
+ .conversation-right > ul li a img{max-width:20px;max-height:20px;}
+ .conversation-right > ul li:first-child a{width:23px}
+ .conversation-right > ul li:first-child a img{max-height:23px;max-width:23px;width:100%;}
+ .conversation-right > ul li{padding:0 2px;}
+ .chat-create-footer{padding:10px 10px 10px;}
+ .conversion-history .chat-body{height:calc(100vh - 265px);}
+ .conversion-history .chat-footer-inner .send-btn .btn-primary{height:32px;line-height:30px;padding:0 5px;font-size:10px;}
+ .conversion-history .chat-footer-inner .btn{margin:0;height:32px;}
+ .chat-footer-inner{flex-wrap:inherit;}
+ .chat-footer-inner .btn{margin:0 2px;padding:6px 10px;}
+ .contract-list{height:calc(100vh - 48px);}
+ .invite-teams-popup, .invite-users-popup, .position-confirmation-popup{padding:20px 10px;}
+ .invite-users-inner img{width:40px;margin:0 auto 10px;}
+ div#inviteTeamPopup .invite-users-inner img, div#inviteUserPopup .invite-users-inner img{max-width:25px;width:auto}
+ .invite-users-inner h3{font-size:14px;}
+ .conversion-history .chat-footer-inner .send-btn .btn-primary img{margin:0 2px 0 0;max-width:14px;}
+ .request-row .request-btn{padding:0 0 0 0;}
+ .request-row .request-btn .btn{margin:0 4px;min-width:90px;}
+ a.clause-options{width:12px !important;}
+ .clause-options i{font-size:16px;padding-top:6px;}
+ .close-btn{width:24px;}
+ /*.conversation-right > ul li a{text-align:center;}*/
+}
+@media only screen and (max-width:310px){
+ .chat-create-header .conversation-left .user-icon{display:none;}
+ .conversation-right > ul li .invite-user-tabs{min-width:190px;}
+ .invite-user-tabs .invite-user-tabs-header .nav-tabs{max-width:190px;}
+ .invite-user-tabs-header .nav-tabs .nav-item .nav-link{min-width:80px;}
+ .invite-user-list ul li .invite-user-inner .invite-user-name h3{font-size:11px;}
+ #btnInviteUsers img{width:20px;}
+ .invite-user-list .invite-btn .btn-primary{padding:4px 10px;min-width:80px;}
+ .conversation-right > ul li .invite-user-tabs:after{left:95px;}
+}
+@media only screen and (max-width:295px){
+ .chat-create-header .conversation-right > ul li{min-width:26px;}
+ .create-contract-inner .submit-btn,.form-inner .submit-btn{gap:16px;}
+ .chat-panel-wrap.meeting-screen .chat-create-header{flex-wrap:wrap;}
+}
+@media only screen and (max-width:190px){
+ .invite-counterpartie .invite-button{flex-wrap:wrap;gap:12px;}
+ .invite-counterpartie .invite-button img{margin:0;}
+}
+/*======= Responsive CSS END =======*/
+
+/* Custom CSS to decrease tooltip font size */
+.form-group.autocomplete{position:relative;}
+.autocomplete-items{padding:12px;border:1px solid #DADDE0;border-radius:5px;margin-top:5px;position:absolute;width:100%;background:#fff }
+.autocomplete-items .dropdown-option{padding:5px;}
+.error-validation .type-sms-btn-part{bottom:36px;}
+.clause-group-head{width:100%;margin:0;padding:8px 5px;display:flex;align-items:center;justify-content:space-between;}
+.contract-clause-sections{overflow:auto;height:calc(100vh - 150px);width:100%;}
+.contract-clause-sections.action-button-open{overflow:auto;height:calc(100vh - 220px);width:100%;}
+#divGroupClauseListItems .contract-list-items{margin-bottom:10px }
+#divGroupClauseListItems .contract-list-items:last-child{margin-bottom:0px !important }
+#divContractClauseSections .contract-list-items:first-child{padding-top:0px !important }
+.contract-list .contract-list-items{padding-bottom:0px;}
+.btn-secondary{background:#69daee;}
+.plugin-close{display:none;}
+.plugin-hide{display:none;}
+
+/*29-May-2025*/
+.chat-panel-wrap.meeting-screen{flex-direction:column;max-height:100dvh;display:flex;}
+.chat-panel-wrap.meeting-screen .chat-body{height:auto;flex:1;}
+.chat-panel-wrap .chat-create-footer .chat-footer-inner{flex-wrap:wrap;gap:13px 10px;}
+.chat-panel-wrap .chat-create-header .conversation-right .dropdown-menu li a{width: 100%;}
diff --git a/sdkjs-plugins/content/propact/vendor/jQuery-2.2.2-min/jquery-v2.2.2-min.js b/sdkjs-plugins/content/propact/vendor/jQuery-2.2.2-min/jquery-v2.2.2-min.js
new file mode 100755
index 000000000..93dc28a05
--- /dev/null
+++ b/sdkjs-plugins/content/propact/vendor/jQuery-2.2.2-min/jquery-v2.2.2-min.js
@@ -0,0 +1,4 @@
+/*! jQuery v2.2.2 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.2",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML=" ",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML=" ","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML=" ",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c;
+}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/