diff --git a/__init__.py b/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/__pycache__/base.cpython-310.pyc b/__pycache__/base.cpython-310.pyc
new file mode 100644
index 0000000..495518f
Binary files /dev/null and b/__pycache__/base.cpython-310.pyc differ
diff --git a/__pycache__/base_var.cpython-310.pyc b/__pycache__/base_var.cpython-310.pyc
new file mode 100644
index 0000000..dcf5bfb
Binary files /dev/null and b/__pycache__/base_var.cpython-310.pyc differ
diff --git a/__pycache__/browser.cpython-310.pyc b/__pycache__/browser.cpython-310.pyc
new file mode 100644
index 0000000..b31428c
Binary files /dev/null and b/__pycache__/browser.cpython-310.pyc differ
diff --git a/__pycache__/callhandler.cpython-310.pyc b/__pycache__/callhandler.cpython-310.pyc
new file mode 100644
index 0000000..9b12006
Binary files /dev/null and b/__pycache__/callhandler.cpython-310.pyc differ
diff --git a/__pycache__/main.cpython-310.pyc b/__pycache__/main.cpython-310.pyc
new file mode 100644
index 0000000..f191856
Binary files /dev/null and b/__pycache__/main.cpython-310.pyc differ
diff --git a/__pycache__/mouseevents.cpython-310.pyc b/__pycache__/mouseevents.cpython-310.pyc
new file mode 100644
index 0000000..c78193a
Binary files /dev/null and b/__pycache__/mouseevents.cpython-310.pyc differ
diff --git a/__pycache__/settings.cpython-310.pyc b/__pycache__/settings.cpython-310.pyc
new file mode 100644
index 0000000..09ffc57
Binary files /dev/null and b/__pycache__/settings.cpython-310.pyc differ
diff --git a/__pycache__/sight.cpython-310.pyc b/__pycache__/sight.cpython-310.pyc
new file mode 100644
index 0000000..14d0457
Binary files /dev/null and b/__pycache__/sight.cpython-310.pyc differ
diff --git a/__pycache__/sightfactory.cpython-310.pyc b/__pycache__/sightfactory.cpython-310.pyc
new file mode 100644
index 0000000..86bc193
Binary files /dev/null and b/__pycache__/sightfactory.cpython-310.pyc differ
diff --git a/base.py b/base.py
new file mode 100644
index 0000000..71dab8c
--- /dev/null
+++ b/base.py
@@ -0,0 +1,48 @@
+import sys
+import os
+import configparser
+from mouseevents import MouseEvents
+from pynput import mouse
+from sightfactory import SightFactory
+from PyQt6.QtWidgets import QApplication
+from pynput.mouse import Controller
+
+def init():
+ global data, sights, mousectrl, app
+ #init the basic values
+ app = QApplication(sys.argv)
+ mousectrl = Controller()
+ sights = SightFactory()
+ data = {}
+ data["move"] = False
+ data["active_sight"] = "main"
+ data["sight_processes"] = {}
+ data["mouse_distance_x"] = 0
+ data["mouse_distance_y"] = 0
+ data["base_dir"]=os.path.abspath(os.getcwd())+os.path.sep
+ data["template_dir"]=data["base_dir"]+"place"+os.path.sep+"templates"+os.path.sep
+ #LOAD the template config content
+ loadConfigTemplate()
+ #Events
+ mouseevent = MouseEvents()
+ start()
+
+def loadConfigTemplate():
+ config = configparser.ConfigParser()
+ config.sections()
+ config.read(data["template_dir"]+"config.ini")
+ if "DEFAULT" in config:
+ data["default_template"] = config["DEFAULT"]["default_template"]
+ data["default_template_dir"] = data["template_dir"]+data["default_template"]+os.path.sep
+ data["sight_mode"] = config["DEFAULT"]["sight_mode"]
+ print("Template config is loaded!")
+ else:
+ print("Missing 'DEFAULT' data from the templates config.ini folder. It can't start!")
+
+def start():
+ # Creating the main Sight
+ sights.create("main","main");
+ sights.processes();
+ sights.show("main");
+
+ app.exec()
\ No newline at end of file
diff --git a/base.py.bak b/base.py.bak
new file mode 100644
index 0000000..1b5a350
--- /dev/null
+++ b/base.py.bak
@@ -0,0 +1,47 @@
+import sys
+import os
+import configparser
+from mouseevents import MouseEvents
+from pynput import mouse
+from sightfactory import SightFactory
+from PyQt6.QtWidgets import QApplication
+from pynput.mouse import Controller
+
+def init():
+ global data, sights, mousectrl, app
+ #init the basic values
+ app = QApplication(sys.argv)
+ mousectrl = Controller()
+ sights = SightFactory()
+ data = {}
+ data["move"] = False
+ data["active_sight"] = "main"
+ data["sight_processes"] = {}
+ data["mouse_distance_x"] = 0
+ data["mouse_distance_y"] = 0
+ data["base_dir"]=os.path.abspath(os.getcwd())+os.path.sep
+ data["template_dir"]=data["base_dir"]+"place"+os.path.sep+"templates"+os.path.sep
+ #LOAD the template config content
+ loadConfigTemplate()
+ #Events
+ mouseevent = MouseEvents()
+ start()
+
+def loadConfigTemplate():
+ config = configparser.ConfigParser()
+ config.sections()
+ config.read(data["template_dir"]+"config.ini")
+ if "DEFAULT" in config:
+ data["default_template"] = config["DEFAULT"]["default_template"]
+ data["default_template_dir"] = data["template_dir"]+data["default_template"]+os.path.sep
+ print("Template config is loaded!")
+ else:
+ print("Missing 'DEFAULT' data from the templates config.ini folder. It can't start!")
+
+def start():
+ # Creating the main Sight
+ sights.create("main","main");
+ sights.processes();
+ sights.show("main");
+
+ app.exec()
\ No newline at end of file
diff --git a/browser.py b/browser.py
new file mode 100644
index 0000000..c127325
--- /dev/null
+++ b/browser.py
@@ -0,0 +1,19 @@
+import base
+
+from PyQt6.QtWebChannel import QWebChannel
+from PyQt6.QtWebEngineWidgets import QWebEngineView
+from PyQt6.QtCore import QUrl
+
+class Browser(QWebEngineView):
+ def __init__(self):
+ super().__init__()
+ self.channel = QWebChannel()
+
+ def addObject(self, id, call_handler):
+ self.handler = call_handler
+ self.channel.registerObject(id, self.handler)
+ self.page().setWebChannel(self.channel)
+
+ def loadContent(self, type):
+ print(base.data["default_template_dir"]+type+".html")
+ self.load(QUrl.fromLocalFile(base.data["default_template_dir"]+type+".html"))
\ No newline at end of file
diff --git a/browser.py.bak b/browser.py.bak
new file mode 100644
index 0000000..519aadf
--- /dev/null
+++ b/browser.py.bak
@@ -0,0 +1,19 @@
+import base
+
+from PyQt6.QtWebChannel import QWebChannel
+from PyQt6.QtWebEngineWidgets import QWebEngineView
+from PyQt6.QtCore import QUrl
+
+class Browser(QWebEngineView):
+ def __init__(self):
+ super().__init__()
+ self.channel = QWebChannel()
+
+ def addObject(self, id, call_handler):
+ self.handler = call_handler
+ self.channel.registerObject(id, self.handler)
+ self.page().setWebChannel(self.channel)
+
+ def loadContent(self, type):
+ print(base.data["default_template_dir"]+type+".html"))
+ self.load(QUrl.fromLocalFile(base.data["default_template_dir"]+type+".html"))
\ No newline at end of file
diff --git a/callhandler.py b/callhandler.py
new file mode 100644
index 0000000..345eaaa
--- /dev/null
+++ b/callhandler.py
@@ -0,0 +1,101 @@
+import base
+import random
+from PyQt6.QtCore import QObject, pyqtSlot
+
+class CallHandler(QObject):
+ def __init__(self, sight):
+ super().__init__()
+ self.sight = sight
+
+ @pyqtSlot(str)
+ def test(self, t):
+ print(t)
+
+ @pyqtSlot(str, result=str)
+ def test2(self, t):
+ print(t)
+ return t+"_return"
+
+ @pyqtSlot(result=str)
+ def getDefaultTemplate(self):
+ return base.data["default_template"]
+
+ @pyqtSlot(int)
+ def setWidth(self, width):
+ self.sight.resize(width, self.sight.height());
+
+ @pyqtSlot(int)
+ def setHeight(self, height):
+ self.sight.resize(self.sight.width(), height);
+
+ @pyqtSlot(str, str, result = str)
+ def create(self, id, type):
+ new_id = base.sights.create(id, type)
+ if new_id is not None:
+ base.sights.show(new_id)
+ return new_id;
+
+ @pyqtSlot(str, str, bool)
+ def addData(self, key, value, is_global = False):
+ if is_global:
+ base.sights.addGlobalData(key,value)
+ else:
+ self.sight.addData(key,value)
+
+ @pyqtSlot(str, bool, result=str)
+ def getData(self, key, is_global = False):
+ if is_global:
+ return base.sights.getGlobalData(key)
+ return self.sight.getData(key)
+
+ @pyqtSlot()
+ def activeSight(self):
+ print("active")
+ if base.data["active_sight"] != self.sight.getId():
+ print(self.sight.getId())
+ base.data["active_sight"] = self.sight.getId()
+
+ @pyqtSlot()
+ def close(self):
+ base.sights.close(self.sight.getId())
+
+ @pyqtSlot()
+ def setMaximized(self):
+ self.sight.showMaximized()
+ self.sight.setLayoutContentMargins(0,0,0,0) #because there will be a transparented line as a border
+
+ @pyqtSlot()
+ def setMinimize(self):
+ self.sight.showMinimized()
+
+ @pyqtSlot()
+ def restoreDown(self):
+ self.sight.showNormal()
+ self.sight.setLayoutContentMargins(1,1,1,1) #because if it is no border then I get setgeometry warning what can't be set
+
+ @pyqtSlot()
+ def setFullscreen(self):
+ self.sight.showFullScreen()
+
+ """@pyqtSlot(result=str)
+ def getTitle(self):
+ return self.sight.getTitle();
+ """
+ @pyqtSlot()
+ def move(self):
+ base.data["move"] = True
+
+
+ @pyqtSlot()
+ def endmove(self):
+ base.data["move"] = False
+
+ @pyqtSlot()
+ def resize(self):
+ new_height = base.mousectrl.position[1]-self.sight.pos().y()
+ new_width = base.mousectrl.position[0]-self.sight.pos().x()
+ if(new_height<250):
+ new_height = 250
+ if(new_width<250):
+ new_width = 250
+ self.sight.resize( new_width, new_height)
\ No newline at end of file
diff --git a/callhandler.py.bak b/callhandler.py.bak
new file mode 100644
index 0000000..794d4fe
--- /dev/null
+++ b/callhandler.py.bak
@@ -0,0 +1,100 @@
+import base
+import random
+from PyQt6.QtCore import QObject, pyqtSlot
+
+class CallHandler(QObject):
+ def __init__(self, sight):
+ super().__init__()
+ self.sight = sight
+
+ @pyqtSlot(str)
+ def test(self, t):
+ print(t)
+
+ @pyqtSlot(str, result=str)
+ def test2(self, t):
+ print(t)
+ return t+"_return"
+
+ @pyqtSlot(result=str)
+ def getDefaultTemplate(self):
+ return base.data["default_template"]
+
+ @pyqtSlot(int)
+ def setWidth(self, width):
+ self.sight.resize(width, self.sight.height());
+
+ @pyqtSlot(int)
+ def setHeight(self, height):
+ self.sight.resize(self.sight.width(), height);
+
+ @pyqtSlot(str, str, result = str)
+ def create(self, id, type):
+ new_id = base.sights.create(id, type)
+ base.sights.show(new_id)
+ return new_id;
+
+ @pyqtSlot(str, str, bool)
+ def addData(self, key, value, is_global = False):
+ if is_global:
+ base.sights.addGlobalData(key,value)
+ else:
+ self.sight.addData(key,value)
+
+ @pyqtSlot(str, bool, result=str)
+ def getData(self, key, is_global = False):
+ if is_global:
+ return base.sights.getGlobalData(key)
+ return self.sight.getData(key)
+
+ @pyqtSlot()
+ def activeSight(self):
+ print("active")
+ if base.data["active_sight"] != self.sight.getId():
+ print(self.sight.getId())
+ base.data["active_sight"] = self.sight.getId()
+
+ @pyqtSlot()
+ def close(self):
+ base.sights.close(self.sight.getId())
+
+ @pyqtSlot()
+ def setMaximized(self):
+ self.sight.showMaximized()
+ self.sight.setLayoutContentMargins(0,0,0,0) #because there will be a transparented line as a border
+
+ @pyqtSlot()
+ def setMinimize(self):
+ self.sight.showMinimized()
+
+ @pyqtSlot()
+ def restoreDown(self):
+ self.sight.showNormal()
+ self.sight.setLayoutContentMargins(1,1,1,1) #because if it is no border then I get setgeometry warning what can't be set
+
+ @pyqtSlot()
+ def setFullscreen(self):
+ self.sight.showFullScreen()
+
+ """@pyqtSlot(result=str)
+ def getTitle(self):
+ return self.sight.getTitle();
+ """
+ @pyqtSlot()
+ def move(self):
+ base.data["move"] = True
+
+
+ @pyqtSlot()
+ def endmove(self):
+ base.data["move"] = False
+
+ @pyqtSlot()
+ def resize(self):
+ new_height = base.mousectrl.position[1]-self.sight.pos().y()
+ new_width = base.mousectrl.position[0]-self.sight.pos().x()
+ if(new_height<250):
+ new_height = 250
+ if(new_width<250):
+ new_width = 250
+ self.sight.resize( new_width, new_height)
\ No newline at end of file
diff --git a/core/template/base/content/main/content.html b/core/template/base/content/main/content.html
new file mode 100644
index 0000000..ecf63d5
--- /dev/null
+++ b/core/template/base/content/main/content.html
@@ -0,0 +1 @@
+Create an "Other" sight!
\ No newline at end of file
diff --git a/core/template/base/content/main/content.html.bak b/core/template/base/content/main/content.html.bak
new file mode 100644
index 0000000..1cfc492
--- /dev/null
+++ b/core/template/base/content/main/content.html.bak
@@ -0,0 +1 @@
+Create an "Other" sight!
\ No newline at end of file
diff --git a/core/template/base/content/main/main.html.bak b/core/template/base/content/main/main.html.bak
new file mode 100644
index 0000000..e69de29
diff --git a/core/template/base/content/main_text/content.html b/core/template/base/content/main_text/content.html
new file mode 100644
index 0000000..1e61d87
--- /dev/null
+++ b/core/template/base/content/main_text/content.html
@@ -0,0 +1,6 @@
+
+
+
This is a sentence.
+
\ No newline at end of file
diff --git a/core/template/base/content/main_text/content.html.bak b/core/template/base/content/main_text/content.html.bak
new file mode 100644
index 0000000..792c4b3
--- /dev/null
+++ b/core/template/base/content/main_text/content.html.bak
@@ -0,0 +1,6 @@
+
+
+This is a sentence.
+
\ No newline at end of file
diff --git a/core/template/base/content/main_text/test.css b/core/template/base/content/main_text/test.css
new file mode 100644
index 0000000..11c8899
--- /dev/null
+++ b/core/template/base/content/main_text/test.css
@@ -0,0 +1,3 @@
+#example {
+ background-color: yellow;
+}
\ No newline at end of file
diff --git a/core/template/base/css/template.css b/core/template/base/css/template.css
new file mode 100644
index 0000000..d6db84a
--- /dev/null
+++ b/core/template/base/css/template.css
@@ -0,0 +1,26 @@
+body {
+ background-color: white;
+}
+#sight #stitlebar {
+ background-color: #4f9af3;
+}
+#sight #stitle {
+ color: white;
+ padding: 2px;
+ font-weight: bold;
+ font-family: monospace;
+ font-size: larger;
+ float: left;
+}
+#sight {
+ border: 4px solid #4f9af3;
+}
+#sight #content {
+ padding: 5px;
+}
+#sight #sclose:not([except]), #sight #sminimize:not([except]), #sight #stoggled:not([except]) {
+ height: 20px;
+ width: 20px;
+ float: right;
+ margin-left: 5px;
+}
diff --git a/core/template/base/css/template.css.bak b/core/template/base/css/template.css.bak
new file mode 100644
index 0000000..67dbb73
--- /dev/null
+++ b/core/template/base/css/template.css.bak
@@ -0,0 +1,35 @@
+body {
+ background-color: white;
+}
+#sight #stitlebar {
+ background-color: #4f9af3;
+}
+#sight #stitle {
+ color: white;
+ padding: 2px;
+ font-weight: bold;
+ font-family: monospace;
+ font-size: larger;
+ float: left;
+}
+#sight #sresize {
+ width: 15px;
+ height: 15px;
+ background-color: none;
+ right: 0;
+ float: right;
+ bottom: 0;
+ position: absolute;
+}
+#sight {
+ border: 4px solid #4f9af3;
+}
+#sight #content {
+ padding: 5px;
+}
+#sight #sclose:not([except]), #sight #sminimize:not([except]), #sight #stoggled:not([except]) {
+ height: 20px;
+ width: 20px;
+ float: right;
+ margin-left: 5px;
+}
diff --git a/core/template/base/img/close.png b/core/template/base/img/close.png
new file mode 100644
index 0000000..a4f8492
Binary files /dev/null and b/core/template/base/img/close.png differ
diff --git a/core/template/base/img/maximized.png b/core/template/base/img/maximized.png
new file mode 100644
index 0000000..7e659de
Binary files /dev/null and b/core/template/base/img/maximized.png differ
diff --git a/core/template/base/img/minimize.png b/core/template/base/img/minimize.png
new file mode 100644
index 0000000..0ac804d
Binary files /dev/null and b/core/template/base/img/minimize.png differ
diff --git a/core/template/base/img/restoredown.png b/core/template/base/img/restoredown.png
new file mode 100644
index 0000000..bfd2475
Binary files /dev/null and b/core/template/base/img/restoredown.png differ
diff --git a/core/template/base/main.html b/core/template/base/main.html
new file mode 100644
index 0000000..262556b
--- /dev/null
+++ b/core/template/base/main.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/template/base/main.html.bak b/core/template/base/main.html.bak
new file mode 100644
index 0000000..c756937
--- /dev/null
+++ b/core/template/base/main.html.bak
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/template/base/other.html b/core/template/base/other.html
new file mode 100644
index 0000000..0b5204f
--- /dev/null
+++ b/core/template/base/other.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/template/base/other.html.bak b/core/template/base/other.html.bak
new file mode 100644
index 0000000..b99c0c9
--- /dev/null
+++ b/core/template/base/other.html.bak
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/core/template/base/template.conf.bak b/core/template/base/template.conf.bak
new file mode 100644
index 0000000..e69de29
diff --git a/core/template/base/template.js b/core/template/base/template.js
new file mode 100644
index 0000000..d36ed3b
--- /dev/null
+++ b/core/template/base/template.js
@@ -0,0 +1,13 @@
+var s_template={
+ 'name' : "Base",
+ 'author' : 'Balazs Birtalan',
+ 'URL' : '/template/base',
+ 'created': '2023'
+}
+
+// first element: "key" is the ID where the content html will be embedded
+// second element: "value" is the folder name of that content folder where the content.html file's contents will be embedded
+var s_contents={
+ 'main_content':"main",
+ 'main_text':"main_text",
+}
\ No newline at end of file
diff --git a/core/template/base/template.js.bak b/core/template/base/template.js.bak
new file mode 100644
index 0000000..6556055
--- /dev/null
+++ b/core/template/base/template.js.bak
@@ -0,0 +1,13 @@
+var s_template={
+ 'name' : "Base",
+ 'author' : 'Balazs Birtalan',
+ 'URL' : '/template/base',
+ 'created': '2023'
+}
+
+// first element "key" is the ID where the content html will be embedded
+// second element "value" is the folder name of that content folder where the content.html file's contents will be embedded
+var s_contents={
+ 'main_content':"main",
+ 'main_text':"main_text",
+}
\ No newline at end of file
diff --git a/core/template/config.ini b/core/template/config.ini
new file mode 100644
index 0000000..5b58ad9
--- /dev/null
+++ b/core/template/config.ini
@@ -0,0 +1,3 @@
+[DEFAULT]
+default_template = base
+sight_mode = single
\ No newline at end of file
diff --git a/core/template/config.ini.bak b/core/template/config.ini.bak
new file mode 100644
index 0000000..2b10775
--- /dev/null
+++ b/core/template/config.ini.bak
@@ -0,0 +1,3 @@
+[DEFAULT]
+default_template = base
+sight_mode = multiple
\ No newline at end of file
diff --git a/lib/jquery-3.6.4.min.js b/lib/jquery-3.6.4.min.js
new file mode 100644
index 0000000..0de648e
--- /dev/null
+++ b/lib/jquery-3.6.4.min.js
@@ -0,0 +1,2 @@
+/*! jQuery v3.6.4 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.4",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssHas=ce(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssHas||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=" ",v.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.cssHas=ce(function(){try{return C.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML=" ",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML=" ";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),d.cssHas||y.push(":has"),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType&&e.documentElement||e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML=" ",v.option=!!ce.lastChild;var ge={thead:[1,""],col:[2,""],tr:[2,""],td:[3,""],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 0) {
+ new QWebChannel(qt.webChannelTransport, function (channel) {
+ // now I retrieve my object
+ window.sight = channel.objects.handler;
+ });
+}
+
+(function ( $ ) {
+ $.fn.s_create = function() {
+ $(document).on( "click", "#screate", function() {
+ event.preventDefault();
+ window.sight.create($(this).data("id"), $(this).data("type"), function(sight_id) {
+ /*alert(sight_id)*/
+ });
+ })
+ };
+ $.fn.s_close = function() {
+ $("body").on( "click", "#sclose", function() {
+ event.preventDefault();
+ window.sight.close();
+ })
+ };
+ $.fn.s_exit = function() {
+ this.bind("click.s_exit", function (event) {
+ event.preventDefault();
+ window.sight.exit();
+ });
+ };
+ $.fn.s_toggled = function() {
+ this.bind("click.s_toggled", function (event) {
+ event.preventDefault();
+ $(this).empty();
+ if($(this).attr('state') != "maximized") { // set to the maximized
+ window.sight.setMaximized();
+ $(this).attr("state", "maximized");
+ $(this).prepend(' ')
+ } else { // set to the restore down
+ window.sight.restoreDown();
+ $(this).attr("state", "restoredown");
+ $(this).prepend(' ')
+ }
+ });
+ };
+ $.fn.s_maximized = function() {
+ this.bind("click.s_maximized", function (event) {
+ if($(this).attr('state') != "maximized") {
+ event.preventDefault();
+ $("#stoggled").empty();
+ window.sight.setMaximized()
+ $("#stoggled").prepend(' ')
+ $("#stoggled").attr("state", "maximized");
+ }
+ });
+ };
+ $.fn.s_restoredown = function() {
+ this.bind("click.s_restoredown", function (event) {
+ if($(this).attr('state') != "restoredown") {
+ event.preventDefault();
+ $("#stoggled").empty();
+ window.sight.restoreDown();
+ $("#stoggled").attr("state", "restoredown");
+ $("#stoggled").prepend(' ')
+ }
+ });
+ };
+ $.fn.s_minimize = function() {
+ this.bind("click.s_minimize", function (event) {
+ event.preventDefault();
+ window.sight.setMinimize();
+ });
+ };
+ $.fn.s_fullscreen = function() {
+ this.bind("click.s_fullscreen", function (event) {
+ event.preventDefault();
+ window.sight.setFullscreen();
+ });
+ };
+ $.fn.s_title = function() {
+ $(this).text(window.sight.getTitle());
+ };
+ $.fn.s_titlebar = function() {
+ /* DISABLE TEXT SELECT */
+ $( this ).attr('unselectable', 'on').css('user-select', 'none').on('selectstart dragstart', false);
+ $( this ).mousedown(function() {
+ /*$( "body" ).attr('unselectable', 'on').css('user-select', 'none').on('selectstart dragstart', false);*/
+ if($(this).children("#stoggled").attr('state') == "restoredown")
+ window.sight.move();
+ })
+ .mouseup(function() {
+ /*$( "body" ).attr('unselectable', 'off').css('user-select', 'yes').on('selectstart dragstart', true);*/
+ window.sight.endmove();
+ });
+
+ };
+ $.fn.s_global_add = function() {
+ this.bind("click.s_global_add", function (event) {
+ event.preventDefault();
+ //window.sight.global($(this));
+ });
+ };
+ $(document).mousemove(function(e){
+ if(resizing)
+ window.sight.resize();
+ });
+ $(document).mouseup(function(e){
+ resizing = false
+ });
+ $(document).mousedown(function(e){
+ window.sight.activeSight();
+ });
+ var resizing = false;
+ $.fn.s_resize = function() {
+ $(this).mousemove(function(e){
+ event.preventDefault();
+ if(e.buttons==1)
+ resizing = true
+ });
+ };
+}( jQuery ));
+function addData(key, value, is_global = false) {
+ window.sight.addData(key,value, is_global);
+}
+function getData(key, is_global = false) {
+ window.sight.getData(key, is_global, function(result) {
+ alert(result)
+ });
+}
+function sclose() {
+ window.sight.close();
+}
+function setTitle(title) {
+ $("#stitle").text(title);
+}
+$(document).ready(function(){
+ // LOAD the contents into the Sight
+ if (typeof s_contents !== 'undefined') {
+ for ( const [id_name,content_folder] of Object.entries( s_contents ) ) {
+ $("#"+id_name).load("content/"+content_folder+"/content.html");
+ }
+ }
+ // INIT the Sight from init_sight variable
+ if (typeof init_sight !== 'undefined') {
+
+ for ( const [key,value] of Object.entries( init_sight ) ) {
+ window.sight.test(key + " - " + value)
+ switch(key) {
+ case 'width':
+ window.sight.setWidth(value)
+ break;
+ case 'height':
+ window.sight.setHeight(value)
+ break;
+ }
+ }
+ }
+ // INIT
+ /*window.sight.getDefaultTemplate(function(default_template) {
+ $('a[href]:not([href^="http://"]), a[href]:not([href^="https://"]), a[href]:not([href^="#"])').each(function(){
+ if(!$(this).hasClass( "nav-link" )) {
+ window.sight.test($(this).attr("href") + " je1");
+ var newUrl = './templates/'+default_template+'/'+$(this).attr("href");
+ $(this).attr("href", newUrl);
+ window.sight.test(newUrl + " je2");
+ }
+ });
+ });*/
+
+ if($("#stoggled").length) {
+ var attr = $("#stoggled").attr("state")
+ if (typeof attr !== 'undefined' && attr !== false && (attr == "restoredown" || attr == "maximized")) {
+
+ png_button = "restoredown"
+ if(attr == "restoredown")
+ png_button = "maximized"
+ $("#stoggled").prepend(' ');
+
+ if(attr == "maximized")
+ window.sight.setMaximized();
+ } else {
+ $("#stoggled").attr("state", "restoredown");
+ $("#stoggled").prepend(' ');
+ }
+ }
+ if($("#sclose").length) {
+ $("#sclose:not([except])").empty();
+ $("#sclose:not([except])").prepend(' ');
+ }
+ if($("#sminimize").length) {
+ $("#sminimize").empty();
+ $("#sminimize").prepend(' ');
+ }
+ /*window.sight.getTitle(function(result) {
+ setTitle(result);
+ });*/
+ // INIT END
+
+ $( "#screate" ).s_create();
+ $( "#sclose" ).s_close();
+ $( "#sexit" ).s_exit();
+ $( "#smaximized" ).s_maximized();
+ $( "#sminimize" ).s_minimize();
+ $( "#sresize" ).s_resize();
+ $( "#srestoredown" ).s_restoredown();
+ $( "#sfullscreen" ).s_fullscreen();
+ $( "#stitlebar" ).s_titlebar();
+ $( "#stoggled" ).s_toggled();
+});
\ No newline at end of file
diff --git a/place/js/sight.js.bak b/place/js/sight.js.bak
new file mode 100644
index 0000000..6ab0db4
--- /dev/null
+++ b/place/js/sight.js.bak
@@ -0,0 +1,208 @@
+if(navigator.userAgent.indexOf("QtWebEngine") > 0) {
+ new QWebChannel(qt.webChannelTransport, function (channel) {
+ // now I retrieve my object
+ window.sight = channel.objects.handler;
+ });
+}
+
+(function ( $ ) {
+ $.fn.s_create = function() {
+ $(document).on( "click", "#screate", function() {
+ event.preventDefault();
+ var data_id = ""
+ window.sight.create(data_id, $(this).data("type"), function(sight_id) {
+ /*alert(sight_id)*/
+ });
+ })
+ };
+ $.fn.s_close = function() {
+ $("body").on( "click", "#sclose", function() {
+ event.preventDefault();
+ window.sight.close();
+ })
+ };
+ $.fn.s_exit = function() {
+ this.bind("click.s_exit", function (event) {
+ event.preventDefault();
+ window.sight.exit();
+ });
+ };
+ $.fn.s_toggled = function() {
+ this.bind("click.s_toggled", function (event) {
+ event.preventDefault();
+ $(this).empty();
+ if($(this).attr('state') != "maximized") { // set to the maximized
+ window.sight.setMaximized();
+ $(this).attr("state", "maximized");
+ $(this).prepend(' ')
+ } else { // set to the restore down
+ window.sight.restoreDown();
+ $(this).attr("state", "restoredown");
+ $(this).prepend(' ')
+ }
+ });
+ };
+ $.fn.s_maximized = function() {
+ this.bind("click.s_maximized", function (event) {
+ if($(this).attr('state') != "maximized") {
+ event.preventDefault();
+ $("#stoggled").empty();
+ window.sight.setMaximized()
+ $("#stoggled").prepend(' ')
+ $("#stoggled").attr("state", "maximized");
+ }
+ });
+ };
+ $.fn.s_restoredown = function() {
+ this.bind("click.s_restoredown", function (event) {
+ if($(this).attr('state') != "restoredown") {
+ event.preventDefault();
+ $("#stoggled").empty();
+ window.sight.restoreDown();
+ $("#stoggled").attr("state", "restoredown");
+ $("#stoggled").prepend(' ')
+ }
+ });
+ };
+ $.fn.s_minimize = function() {
+ this.bind("click.s_minimize", function (event) {
+ event.preventDefault();
+ window.sight.setMinimize();
+ });
+ };
+ $.fn.s_fullscreen = function() {
+ this.bind("click.s_fullscreen", function (event) {
+ event.preventDefault();
+ window.sight.setFullscreen();
+ });
+ };
+ $.fn.s_title = function() {
+ $(this).text(window.sight.getTitle());
+ };
+ $.fn.s_titlebar = function() {
+ /* DISABLE TEXT SELECT */
+ $( this ).attr('unselectable', 'on').css('user-select', 'none').on('selectstart dragstart', false);
+ $( this ).mousedown(function() {
+ /*$( "body" ).attr('unselectable', 'on').css('user-select', 'none').on('selectstart dragstart', false);*/
+ if($(this).children("#stoggled").attr('state') == "restoredown")
+ window.sight.move();
+ })
+ .mouseup(function() {
+ /*$( "body" ).attr('unselectable', 'off').css('user-select', 'yes').on('selectstart dragstart', true);*/
+ window.sight.endmove();
+ });
+
+ };
+ $.fn.s_global_add = function() {
+ this.bind("click.s_global_add", function (event) {
+ event.preventDefault();
+ //window.sight.global($(this));
+ });
+ };
+ $(document).mousemove(function(e){
+ if(resizing)
+ window.sight.resize();
+ });
+ $(document).mouseup(function(e){
+ resizing = false
+ });
+ $(document).mousedown(function(e){
+ window.sight.activeSight();
+ });
+ var resizing = false;
+ $.fn.s_resize = function() {
+ $(this).mousemove(function(e){
+ event.preventDefault();
+ if(e.buttons==1)
+ resizing = true
+ });
+ };
+}( jQuery ));
+function addData(key, value, is_global = false) {
+ window.sight.addData(key,value, is_global);
+}
+function getData(key, is_global = false) {
+ window.sight.getData(key, is_global, function(result) {
+ alert(result)
+ });
+}
+function sclose() {
+ window.sight.close();
+}
+function setTitle(title) {
+ $("#stitle").text(title);
+}
+$(document).ready(function(){
+ // LOAD the contents into the Sight
+ if (typeof s_contents !== 'undefined') {
+ for ( const [id_name,content_folder] of Object.entries( s_contents ) ) {
+ $("#"+id_name).load("content/"+content_folder+"/content.html");
+ }
+ }
+ // INIT the Sight from init_sight variable
+ if (typeof init_sight !== 'undefined') {
+
+ for ( const [key,value] of Object.entries( init_sight ) ) {
+ window.sight.test(key + " - " + value)
+ switch(key) {
+ case 'width':
+ window.sight.setWidth(value)
+ break;
+ case 'height':
+ window.sight.setHeight(value)
+ break;
+ }
+ }
+ }
+ // INIT
+ /*window.sight.getDefaultTemplate(function(default_template) {
+ $('a[href]:not([href^="http://"]), a[href]:not([href^="https://"]), a[href]:not([href^="#"])').each(function(){
+ if(!$(this).hasClass( "nav-link" )) {
+ window.sight.test($(this).attr("href") + " je1");
+ var newUrl = './templates/'+default_template+'/'+$(this).attr("href");
+ $(this).attr("href", newUrl);
+ window.sight.test(newUrl + " je2");
+ }
+ });
+ });*/
+
+ if($("#stoggled").length) {
+ var attr = $("#stoggled").attr("state")
+ if (typeof attr !== 'undefined' && attr !== false && (attr == "restoredown" || attr == "maximized")) {
+
+ png_button = "restoredown"
+ if(attr == "restoredown")
+ png_button = "maximized"
+ $("#stoggled").prepend(' ');
+
+ if(attr == "maximized")
+ window.sight.setMaximized();
+ } else {
+ $("#stoggled").attr("state", "restoredown");
+ $("#stoggled").prepend(' ');
+ }
+ }
+ if($("#sclose").length) {
+ $("#sclose:not([except])").empty();
+ $("#sclose:not([except])").prepend(' ');
+ }
+ if($("#sminimize").length) {
+ $("#sminimize").empty();
+ $("#sminimize").prepend(' ');
+ }
+ /*window.sight.getTitle(function(result) {
+ setTitle(result);
+ });*/
+ // INIT END
+
+ $( "#screate" ).s_create();
+ $( "#sclose" ).s_close();
+ $( "#sexit" ).s_exit();
+ $( "#smaximized" ).s_maximized();
+ $( "#sminimize" ).s_minimize();
+ $( "#sresize" ).s_resize();
+ $( "#srestoredown" ).s_restoredown();
+ $( "#sfullscreen" ).s_fullscreen();
+ $( "#stitlebar" ).s_titlebar();
+ $( "#stoggled" ).s_toggled();
+});
\ No newline at end of file
diff --git a/place/js/xtr-translator/demo/index.html b/place/js/xtr-translator/demo/index.html
new file mode 100644
index 0000000..db1e695
--- /dev/null
+++ b/place/js/xtr-translator/demo/index.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+jQuery xtr.js plugin Demo
+
+
+
+
+
+
jQuery xtr.js plugin Demo
+
Welcome
+
Hello
+
Good Bye
+
+
Current language
+
+ EN
+ DE
+ FR
+ ES
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/place/js/xtr-translator/demo/styles.css b/place/js/xtr-translator/demo/styles.css
new file mode 100644
index 0000000..a6ed151
--- /dev/null
+++ b/place/js/xtr-translator/demo/styles.css
@@ -0,0 +1,27 @@
+
+#wrapper {
+ font: 16px/18px Calibri;
+ margin: 0 auto;
+ width: 200px;
+ text-align: center
+}
+
+#wrapper div {
+ background: #28b7ff;
+ padding: 15px;
+ margin: 10px;
+ text-align: center
+}
+
+label {
+ font-weight: 700;
+ margin: 25px 0 5px;
+ display: block
+}
+
+select {
+ width: 100%;
+ height: 30px;
+ outline: 0;
+ cursor: pointer
+}
diff --git a/place/js/xtr-translator/demo/styles.less b/place/js/xtr-translator/demo/styles.less
new file mode 100644
index 0000000..a26f8be
--- /dev/null
+++ b/place/js/xtr-translator/demo/styles.less
@@ -0,0 +1,23 @@
+#wrapper {
+ font: 16px / 18px Calibri;
+ margin: 0 auto;
+ width: 200px;
+ text-align: center;
+ div {
+ background: #28b7ff;
+ padding: 15px;
+ margin: 10px;
+ text-align: center;
+ }
+}
+label {
+ font-weight: bold;
+ margin: 25px 0 5px;
+ display: block;
+}
+select {
+ width: 100%;
+ height: 30px;
+ outline: none;
+ cursor: pointer;
+}
\ No newline at end of file
diff --git a/place/js/xtr-translator/dictonary.js b/place/js/xtr-translator/dictonary.js
new file mode 100644
index 0000000..ff3df08
--- /dev/null
+++ b/place/js/xtr-translator/dictonary.js
@@ -0,0 +1,8 @@
+var data = {
+ "close": {
+ en: "close",
+ hu: "Bezar",
+ it: "Vicino"
+ },
+
+};
diff --git a/place/js/xtr-translator/jquery.xtr.js b/place/js/xtr-translator/jquery.xtr.js
new file mode 100644
index 0000000..90458ba
--- /dev/null
+++ b/place/js/xtr-translator/jquery.xtr.js
@@ -0,0 +1,88 @@
+/*!
+ * July 2017
+ * xtr 1.0.0
+ * @author Mario Vidov
+ * @url http://vidov.it
+ * @twitter MarioVidov
+ * MIT license
+*/
+
+(function($) {
+ var pluginName = 'xtr';
+
+ var settings = {
+ default: 'en',
+ lang: 'en',
+ regExp: {
+ '': /\s/g,
+ '_': /[&<>"'`\/=]/g
+ }
+ };
+
+ var config = {
+ defaultClass: 'data-xtr-default',
+ langClass: 'data-xtr-lang',
+ langKey : 'data-xtr-key',
+ langOrig : 'data-xtr-original'
+ };
+
+ function Plugin(element, options) {
+ options = options || {};
+ this.$element = $(element);
+ this.options = $.extend(true, {}, settings, options);
+ this.selector = '[xtr]';
+ this.regExp = this.options.regExp;
+ this.default = this.options.default;
+ this.t = this.options.t;
+ this.l = this.options.lang;
+
+ this.$element.attr(config.langClass, this.l)
+ .attr(config.defaultClass, this.default);
+ this.init();
+ }
+
+ Plugin.prototype.lang = function(l) {
+ if (l && l === 'reset') {
+ this.l = this.default;
+ } else if (l) {
+ this.l = l;
+ }
+ this.init();
+ };
+
+ Plugin.prototype.set = function(index) {
+ var $el = $('[' + config.langKey + '="' + index + '"]');
+ var original = $el && $el.attr(config.langOrig) || index;
+ return (this.t && this.t[index] && this.t[index][this.l]) ? this.t[index][this.l] : original;
+ };
+
+ Plugin.prototype.init = function() {
+ var self = this;
+ this.$element.attr(config.langClass, this.l);
+ $(self.selector).add('[' + config.langKey + ']').each(function () {
+ var $this = $(this);
+ var key = $this.attr(config.langKey);
+ var original = $this.attr(config.langOrig);
+ var text = $this.text();
+ if (!key) {
+ key = text;
+ for (var i in self.regExp) {
+ key = key.replace(self.regExp[i], i);
+ }
+ $this.attr(config.langKey, key);
+ }
+ if (!original) {
+ $this.attr(config.langOrig, text);
+ }
+ $this.html(self.set(key));
+ });
+ };
+
+ $.fn[pluginName] = function (options) {
+ return this.each(function () {
+ if (!$.data(this, 'plugin_' + pluginName)) {
+ $.data(this, 'plugin_' + pluginName, new Plugin(this, options));
+ }
+ });
+ };
+})(jQuery);
diff --git a/place/js/xtr-translator/jquery.xtr.min.js b/place/js/xtr-translator/jquery.xtr.min.js
new file mode 100644
index 0000000..9a8431b
--- /dev/null
+++ b/place/js/xtr-translator/jquery.xtr.min.js
@@ -0,0 +1 @@
+(function(t){var i="xtr";var a={"default":"en",lang:"en",regExp:{"":/\s/g,_:/[&<>"'`\/=]/g}};var e={defaultClass:"data-xtr-default",langClass:"data-xtr-lang",langKey:"data-xtr-key",langOrig:"data-xtr-original"};function s(i,s){s=s||{};this.$element=t(i);this.options=t.extend(true,{},a,s);this.selector="[xtr]";this.regExp=this.options.regExp;this.default=this.options.default;this.t=this.options.t;this.l=this.options.lang;this.$element.attr(e.langClass,this.l).attr(e.defaultClass,this.default);this.init()}s.prototype.lang=function(t){if(t&&t==="reset"){this.l=this.default}else if(t){this.l=t}this.init()};s.prototype.set=function(i){var a=t("["+e.langKey+'="'+i+'"]');var s=a&&a.attr(e.langOrig)||i;return this.t&&this.t[i]&&this.t[i][this.l]?this.t[i][this.l]:s};s.prototype.init=function(){var i=this;this.$element.attr(e.langClass,this.l);t(i.selector).add("["+e.langKey+"]").each(function(){var a=t(this);var s=a.attr(e.langKey);var n=a.attr(e.langOrig);var r=a.text();if(!s){s=r;for(var l in i.regExp){s=s.replace(i.regExp[l],l)}a.attr(e.langKey,s)}if(!n){a.attr(e.langOrig,r)}a.html(i.set(s))})};t.fn[i]=function(a){return this.each(function(){if(!t.data(this,"plugin_"+i)){t.data(this,"plugin_"+i,new s(this,a))}})}})(jQuery);
\ No newline at end of file
diff --git a/place/templates/base/content/main/content.html b/place/templates/base/content/main/content.html
new file mode 100644
index 0000000..ecf63d5
--- /dev/null
+++ b/place/templates/base/content/main/content.html
@@ -0,0 +1 @@
+Create an "Other" sight!
\ No newline at end of file
diff --git a/place/templates/base/content/main/content.html.bak b/place/templates/base/content/main/content.html.bak
new file mode 100644
index 0000000..1cfc492
--- /dev/null
+++ b/place/templates/base/content/main/content.html.bak
@@ -0,0 +1 @@
+Create an "Other" sight!
\ No newline at end of file
diff --git a/place/templates/base/content/main/main.html.bak b/place/templates/base/content/main/main.html.bak
new file mode 100644
index 0000000..e69de29
diff --git a/place/templates/base/content/main_text/content.html b/place/templates/base/content/main_text/content.html
new file mode 100644
index 0000000..1e61d87
--- /dev/null
+++ b/place/templates/base/content/main_text/content.html
@@ -0,0 +1,6 @@
+
+
+This is a sentence.
+
\ No newline at end of file
diff --git a/place/templates/base/content/main_text/content.html.bak b/place/templates/base/content/main_text/content.html.bak
new file mode 100644
index 0000000..792c4b3
--- /dev/null
+++ b/place/templates/base/content/main_text/content.html.bak
@@ -0,0 +1,6 @@
+
+
+This is a sentence.
+
\ No newline at end of file
diff --git a/place/templates/base/content/main_text/test.css b/place/templates/base/content/main_text/test.css
new file mode 100644
index 0000000..11c8899
--- /dev/null
+++ b/place/templates/base/content/main_text/test.css
@@ -0,0 +1,3 @@
+#example {
+ background-color: yellow;
+}
\ No newline at end of file
diff --git a/place/templates/base/css/template.css b/place/templates/base/css/template.css
new file mode 100644
index 0000000..d6db84a
--- /dev/null
+++ b/place/templates/base/css/template.css
@@ -0,0 +1,26 @@
+body {
+ background-color: white;
+}
+#sight #stitlebar {
+ background-color: #4f9af3;
+}
+#sight #stitle {
+ color: white;
+ padding: 2px;
+ font-weight: bold;
+ font-family: monospace;
+ font-size: larger;
+ float: left;
+}
+#sight {
+ border: 4px solid #4f9af3;
+}
+#sight #content {
+ padding: 5px;
+}
+#sight #sclose:not([except]), #sight #sminimize:not([except]), #sight #stoggled:not([except]) {
+ height: 20px;
+ width: 20px;
+ float: right;
+ margin-left: 5px;
+}
diff --git a/place/templates/base/css/template.css.bak b/place/templates/base/css/template.css.bak
new file mode 100644
index 0000000..67dbb73
--- /dev/null
+++ b/place/templates/base/css/template.css.bak
@@ -0,0 +1,35 @@
+body {
+ background-color: white;
+}
+#sight #stitlebar {
+ background-color: #4f9af3;
+}
+#sight #stitle {
+ color: white;
+ padding: 2px;
+ font-weight: bold;
+ font-family: monospace;
+ font-size: larger;
+ float: left;
+}
+#sight #sresize {
+ width: 15px;
+ height: 15px;
+ background-color: none;
+ right: 0;
+ float: right;
+ bottom: 0;
+ position: absolute;
+}
+#sight {
+ border: 4px solid #4f9af3;
+}
+#sight #content {
+ padding: 5px;
+}
+#sight #sclose:not([except]), #sight #sminimize:not([except]), #sight #stoggled:not([except]) {
+ height: 20px;
+ width: 20px;
+ float: right;
+ margin-left: 5px;
+}
diff --git a/place/templates/base/img/close.png b/place/templates/base/img/close.png
new file mode 100644
index 0000000..a4f8492
Binary files /dev/null and b/place/templates/base/img/close.png differ
diff --git a/place/templates/base/img/maximized.png b/place/templates/base/img/maximized.png
new file mode 100644
index 0000000..7e659de
Binary files /dev/null and b/place/templates/base/img/maximized.png differ
diff --git a/place/templates/base/img/minimize.png b/place/templates/base/img/minimize.png
new file mode 100644
index 0000000..0ac804d
Binary files /dev/null and b/place/templates/base/img/minimize.png differ
diff --git a/place/templates/base/img/restoredown.png b/place/templates/base/img/restoredown.png
new file mode 100644
index 0000000..bfd2475
Binary files /dev/null and b/place/templates/base/img/restoredown.png differ
diff --git a/place/templates/base/main.html b/place/templates/base/main.html
new file mode 100644
index 0000000..262556b
--- /dev/null
+++ b/place/templates/base/main.html
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/place/templates/base/main.html.bak b/place/templates/base/main.html.bak
new file mode 100644
index 0000000..c756937
--- /dev/null
+++ b/place/templates/base/main.html.bak
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/place/templates/base/other.html b/place/templates/base/other.html
new file mode 100644
index 0000000..0b5204f
--- /dev/null
+++ b/place/templates/base/other.html
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/place/templates/base/other.html.bak b/place/templates/base/other.html.bak
new file mode 100644
index 0000000..b99c0c9
--- /dev/null
+++ b/place/templates/base/other.html.bak
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/place/templates/base/template.conf.bak b/place/templates/base/template.conf.bak
new file mode 100644
index 0000000..e69de29
diff --git a/place/templates/base/template.js b/place/templates/base/template.js
new file mode 100644
index 0000000..d36ed3b
--- /dev/null
+++ b/place/templates/base/template.js
@@ -0,0 +1,13 @@
+var s_template={
+ 'name' : "Base",
+ 'author' : 'Balazs Birtalan',
+ 'URL' : '/template/base',
+ 'created': '2023'
+}
+
+// first element: "key" is the ID where the content html will be embedded
+// second element: "value" is the folder name of that content folder where the content.html file's contents will be embedded
+var s_contents={
+ 'main_content':"main",
+ 'main_text':"main_text",
+}
\ No newline at end of file
diff --git a/place/templates/base/template.js.bak b/place/templates/base/template.js.bak
new file mode 100644
index 0000000..6556055
--- /dev/null
+++ b/place/templates/base/template.js.bak
@@ -0,0 +1,13 @@
+var s_template={
+ 'name' : "Base",
+ 'author' : 'Balazs Birtalan',
+ 'URL' : '/template/base',
+ 'created': '2023'
+}
+
+// first element "key" is the ID where the content html will be embedded
+// second element "value" is the folder name of that content folder where the content.html file's contents will be embedded
+var s_contents={
+ 'main_content':"main",
+ 'main_text':"main_text",
+}
\ No newline at end of file
diff --git a/place/templates/config.ini b/place/templates/config.ini
new file mode 100644
index 0000000..5b58ad9
--- /dev/null
+++ b/place/templates/config.ini
@@ -0,0 +1,3 @@
+[DEFAULT]
+default_template = base
+sight_mode = single
\ No newline at end of file
diff --git a/place/templates/config.ini.bak b/place/templates/config.ini.bak
new file mode 100644
index 0000000..2b10775
--- /dev/null
+++ b/place/templates/config.ini.bak
@@ -0,0 +1,3 @@
+[DEFAULT]
+default_template = base
+sight_mode = multiple
\ No newline at end of file
diff --git a/settings.py.bak b/settings.py.bak
new file mode 100644
index 0000000..91b3cc2
--- /dev/null
+++ b/settings.py.bak
@@ -0,0 +1,4 @@
+
+def init():
+ global data
+ data = []
\ No newline at end of file
diff --git a/sight .py.back b/sight .py.back
new file mode 100644
index 0000000..609d1b5
--- /dev/null
+++ b/sight .py.back
@@ -0,0 +1,194 @@
+import os
+import sys
+import random
+
+import base
+from PyQt6.QtCore import QUrl, QObject, pyqtSlot, Qt
+from PyQt6.QtWebEngineWidgets import QWebEngineView
+from PyQt6.QtWidgets import QMainWindow
+from PyQt6.QtWebChannel import QWebChannel
+from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
+
+class CallHandler(QObject):
+ def __init__(self, sight):
+ super().__init__()
+ self.sight = sight
+
+ @pyqtSlot(str)
+ def test(self, t):
+ print(t)
+
+ @pyqtSlot(str, result=str)
+ def test2(self, t):
+ print(t)
+ return t+"_return"
+
+ @pyqtSlot(str)
+ def create(self, t):
+ id = str(random.randrange(1000,9999))
+ createSight(id)
+ base.data["sight_processes"][id].show()
+
+ @pyqtSlot()
+ def activeSight(self):
+ print("active")
+ if base.data["active_sight"] != self.sight.getId():
+ print(self.sight.getId())
+ base.data["active_sight"] = self.sight.getId()
+
+ @pyqtSlot()
+ def close(self):
+ closeSight(self.sight.id)
+ """if self.sight.id == "main":
+ app.exit(0)
+ else:
+ try:
+ base.data["sight_processes"][self.sight.id].close()
+ base.data["sight_processes"][self.sight.id].destroy()
+ del base.data["sight_processes"][self.sight.id]
+ print("The '"+self.sight.id+"' is closed now!")
+ base.processSight()
+ except KeyError:
+ print("KeyError: when closing "+self.sight.id)"""
+
+ @pyqtSlot()
+ def setMaximized(self):
+ self.sight.showMaximized()
+
+ @pyqtSlot()
+ def setMinimize(self):
+ self.sight.showMinimized()
+
+ @pyqtSlot()
+ def restoreDown(self):
+ self.sight.showNormal()
+
+ @pyqtSlot()
+ def setFullscreen(self):
+ self.sight.showFullScreen()
+
+ @pyqtSlot(result=str)
+ def getTitle(self):
+ print("IIIIID: ")
+ return self.sight.getTitle();
+
+ @pyqtSlot()
+ def move(self):
+ base.data["move"] = True
+
+
+ @pyqtSlot()
+ def endmove(self):
+ base.data["move"] = False
+
+ @pyqtSlot()
+ def resize(self):
+ global mousectrl
+ new_height = base.mousectrl.position[1]-self.sight.pos().y()
+ new_width = base.mousectrl.position[0]-self.sight.pos().x()
+ if(new_height<250):
+ new_height = 250
+ if(new_width<250):
+ new_width = 250
+ self.sight.resize( new_width, new_height)
+
+
+class Browser(QWebEngineView):
+ def __init__(self, sight_id):
+ super().__init__()
+ self.id = sight_id
+ self.channel = QWebChannel()
+ self.handler = CallHandler(self)
+ self.channel.registerObject('handler', self.handler)
+ self.page().setWebChannel(self.channel)
+ self.title = sight_id
+
+ def getId(self):
+ return self.id
+ def setTitle(self, title):
+ self.title = title
+ def getTitle(self):
+ return self.title
+
+ def mouseMoveEvent(self, e):
+ print("mouseMoveEvent")
+
+ def mousePressEvent(self, e):
+ print("mousePressEvent")
+
+ def mouseReleaseEvent(self, e):
+ print("mouseReleaseEvent")
+
+ def mouseDoubleClickEvent(self, e):
+ print("mouseDoubleClickEvent")
+
+class Sight(QWidget):
+ def __init__(self, sight_id):
+ super().__init__()
+
+ self.id = sight_id
+ base.data["active_sight"] = self.id
+ self.title = sight_id
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint | self.windowFlags())
+
+ self.browser = Browser(sight_id)
+
+
+
+ current_folder = os.path.abspath(os.getcwd())
+ html_file = current_folder + os.path.sep + "place" + os.path.sep + "templates" + os.path.sep + "base" + os.path.sep + "index.html"
+ print(html_file)
+ url = QUrl.fromLocalFile(html_file)
+
+ self.browser.load(url)
+
+ lay = QVBoxLayout(self)
+ lay.setSpacing(0);
+ lay.setContentsMargins(0, 0, 0, 0);
+ lay.addWidget(self.browser)
+ #self.setCentralWidget(self.browser)
+
+ def mouseMoveEvent(self, e):
+ print("mouseMoveEvent")
+
+ def mousePressEvent(self, e):
+ print("mousePressEvent")
+
+ def mouseReleaseEvent(self, e):
+ print("mouseReleaseEvent")
+
+ def mouseDoubleClickEvent(self, e):
+ print("mouseDoubleClickEvent")
+
+
+
+
+ def getId(self):
+ return self.id
+
+def createSight(id):
+ if id != "main":
+ base.data["sight_processes"][id] = Sight(id)
+ base.data["sight_processes"][id].show()
+ print("The '"+id+"' is opened now!")
+ base.processSight()
+ else:
+ print("The 'main' id is the main active windows which is occupied!")
+
+def closeSight(id):
+ if id == "main":
+ app.exit(0)
+ else:
+ try:
+ base.data["sight_processes"][id] .close()
+ base.data["sight_processes"][id] .destroy()
+ del base.data["sight_processes"][id]
+ print("The '"+id+"' is closed now!")
+ base.processSight()
+ except KeyError:
+ print("KeyError: when closing "+id)
+
+app = QApplication(sys.argv)
+base.data["sight_processes"]["main"] = Sight("main")
+base.data["sight_processes"]["main"].show()
+app.exec()
\ No newline at end of file
diff --git a/sight.py b/sight.py
new file mode 100644
index 0000000..16a6fe8
--- /dev/null
+++ b/sight.py
@@ -0,0 +1,47 @@
+import base
+from callhandler import CallHandler
+from browser import Browser
+from PyQt6.QtCore import Qt
+from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout
+
+class Sight(QWidget):
+ def __init__(self, id, type):
+ super().__init__()
+
+ self.id = id
+ self.type = type
+ self.data = {} # private data(s) of the sight
+
+ base.data["active_sight"] = self.id
+ self.title = id
+
+ self.setWindowFlags(Qt.WindowType(0x00000800)) # remove the os windows frame (borders, close and other buttons
+ self.setAttribute(Qt.WidgetAttribute(0x78)) # (int: 120)) # Make Transparent
+
+ self.browser = Browser()
+ self.browser.addObject('handler', CallHandler(self) )
+ self.browser.loadContent(type)
+
+ self.layout = QVBoxLayout()
+ self.layout.addWidget(self.browser)
+ self.layout.setSpacing(0);
+ self.layout.setContentsMargins(1, 1, 1, 1); #Need 1,1,1,1 if it is 0,0,0,0 I got setgeometry warnings
+
+ self.setLayout(self.layout)
+
+ def setLayoutContentMargins(self,a,b,c,d):
+ self.layout.setContentsMargins(a, b, c, d)
+
+ def setTitle(self, title):
+ self.title = title
+ def getTitle(self):
+ return self.title
+ def getId(self):
+ return self.id
+ def addData(self, key, value):
+ self.data[key] = value
+ def getData(self, key):
+ if key in self.data:
+ return self.data[key]
+ return None
+
\ No newline at end of file
diff --git a/sight.py.2back b/sight.py.2back
new file mode 100644
index 0000000..6348548
--- /dev/null
+++ b/sight.py.2back
@@ -0,0 +1,168 @@
+import os
+import sys
+import random
+
+import base
+from PyQt6.QtCore import QUrl, QObject, pyqtSlot, Qt
+from PyQt6.QtWebEngineWidgets import QWebEngineView
+from PyQt6.QtWidgets import QMainWindow
+from PyQt6.QtWebChannel import QWebChannel
+from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout
+
+class CallHandler(QObject):
+ def __init__(self, sight):
+ super().__init__()
+ self.sight = sight
+
+ @pyqtSlot(str)
+ def test(self, t):
+ print(t)
+
+ @pyqtSlot(str, result=str)
+ def test2(self, t):
+ print(t)
+ return t+"_return"
+
+ @pyqtSlot(str)
+ def create(self, t):
+ id = str(random.randrange(1000,9999))
+ createSight(id)
+ base.data["sight_processes"][id].show()
+
+ @pyqtSlot()
+ def activeSight(self):
+ print("active")
+ if base.data["active_sight"] != self.sight.getId():
+ print(self.sight.getId())
+ base.data["active_sight"] = self.sight.getId()
+
+ @pyqtSlot()
+ def close(self):
+ closeSight(self.sight.id)
+ """if self.sight.id == "main":
+ app.exit(0)
+ else:
+ try:
+ base.data["sight_processes"][self.sight.id].close()
+ base.data["sight_processes"][self.sight.id].destroy()
+ del base.data["sight_processes"][self.sight.id]
+ print("The '"+self.sight.id+"' is closed now!")
+ base.processSight()
+ except KeyError:
+ print("KeyError: when closing "+self.sight.id)"""
+
+ @pyqtSlot()
+ def setMaximized(self):
+ self.sight.showMaximized()
+
+ @pyqtSlot()
+ def setMinimize(self):
+ self.sight.showMinimized()
+
+ @pyqtSlot()
+ def restoreDown(self):
+ self.sight.showNormal()
+
+ @pyqtSlot()
+ def setFullscreen(self):
+ self.sight.showFullScreen()
+
+ @pyqtSlot(result=str)
+ def getTitle(self):
+ print("IIIIID: ")
+ return self.sight.getTitle();
+
+ @pyqtSlot()
+ def move(self):
+ base.data["move"] = True
+
+
+ @pyqtSlot()
+ def endmove(self):
+ base.data["move"] = False
+
+ @pyqtSlot()
+ def resize(self):
+ global mousectrl
+ new_height = base.mousectrl.position[1]-self.sight.pos().y()
+ new_width = base.mousectrl.position[0]-self.sight.pos().x()
+ if(new_height<250):
+ new_height = 250
+ if(new_width<250):
+ new_width = 250
+ self.sight.resize( new_width, new_height)
+
+
+class Browser(QWebEngineView):
+ def __init__(self):
+ super().__init__()
+ self.channel = QWebChannel()
+
+ def addHandler(self, id, call_handler):
+ self.handler = call_handler
+ self.channel.registerObject(id, self.handler)
+ self.page().setWebChannel(self.channel)
+
+class Sight(QWidget):
+ def __init__(self, sight_id):
+ super().__init__()
+
+ self.id = sight_id
+ base.data["active_sight"] = self.id
+ self.title = sight_id
+ self.setWindowFlags(Qt.WindowType.FramelessWindowHint | self.windowFlags())
+
+ self.browser = Browser()
+ self.browser.addHandler('handler', CallHandler(self) )
+ #self.channel = QWebChannel()
+ #self.handler = CallHandler(self)
+ #self.channel.registerObject('handler', self.handler)
+ #self.browser.page().setWebChannel(self.channel)
+
+ current_folder = os.path.abspath(os.getcwd())
+ html_file = current_folder + os.path.sep + "place" + os.path.sep + "templates" + os.path.sep + "base" + os.path.sep + "index.html"
+ print(html_file)
+ url = QUrl.fromLocalFile(html_file)
+
+ self.browser.load(url)
+
+ lay = QVBoxLayout(self)
+ lay.setSpacing(0);
+ lay.setContentsMargins(0, 0, 0, 0);
+ lay.addWidget(self.browser)
+ #self.setCentralWidget(self.browser)
+
+ def setTitle(self, title):
+ self.title = title
+ def getTitle(self):
+ return self.title
+
+ def getId(self):
+ return self.id
+
+def createSight(id):
+ if id != "main":
+ base.data["sight_processes"][id] = Sight(id)
+ base.data["sight_processes"][id].show()
+ print("The '"+id+"' is opened now!")
+ base.processSight()
+ else:
+ print("The 'main' id is the main active windows which is occupied!")
+
+def closeSight(id):
+ if id == "main":
+ app.exit(0)
+ else:
+ try:
+ base.data["sight_processes"][id] .close()
+ base.data["sight_processes"][id] .destroy()
+ del base.data["sight_processes"][id]
+ print("The '"+id+"' is closed now!")
+ base.processSight()
+ except KeyError:
+ print("KeyError: when closing "+id)
+
+app = QApplication(sys.argv)
+base.data["sight_processes"]["main"] = Sight("main")
+base.data["sight_processes"]["main"].show()
+app.exec()
\ No newline at end of file
diff --git a/sight.py.bak b/sight.py.bak
new file mode 100644
index 0000000..7b11e5b
--- /dev/null
+++ b/sight.py.bak
@@ -0,0 +1,47 @@
+import base
+from callhandler import CallHandler
+from browser import Browser
+from PyQt6.QtCore import Qt
+from PyQt6.QtWidgets import QMainWindow, QWidget, QVBoxLayout
+
+class Sight(QWidget):
+ def __init__(self, id, type):
+ super().__init__()
+
+ self.id = id
+ self.type = type
+ self.data = {} # private data of the sight
+
+ base.data["active_sight"] = self.id
+ self.title = id
+
+ self.setWindowFlags(Qt.WindowType(0x00000800)) # remove the os windows frame (borders, close and other buttons
+ self.setAttribute(Qt.WidgetAttribute(0x78)) # (int: 120)) # Make Transparent
+
+ self.browser = Browser()
+ self.browser.addObject('handler', CallHandler(self) )
+ self.browser.loadContent(type)
+
+ self.layout = QVBoxLayout()
+ self.layout.addWidget(self.browser)
+ self.layout.setSpacing(0);
+ self.layout.setContentsMargins(1, 1, 1, 1); #Need 1,1,1,1 if it is 0,0,0,0 I got setgeometry warnings
+
+ self.setLayout(self.layout)
+
+ def setLayoutContentMargins(self,a,b,c,d):
+ self.layout.setContentsMargins(a, b, c, d)
+
+ def setTitle(self, title):
+ self.title = title
+ def getTitle(self):
+ return self.title
+ def getId(self):
+ return self.id
+ def addData(self, key, value):
+ self.data[key] = value
+ def getData(self, key):
+ if key in self.data:
+ return self.data[key]
+ return None
+
\ No newline at end of file
diff --git a/sightfactory.py b/sightfactory.py
new file mode 100644
index 0000000..425e738
--- /dev/null
+++ b/sightfactory.py
@@ -0,0 +1,79 @@
+import base
+import random
+from sight import Sight
+
+class SightFactory():
+ def __init__(self):
+ self.list = {}
+ self.data = {} #Global data(s) for the sight(s)
+
+ def create(self, id, type):
+ print("----- "+type+"-"+str(id)+"-------")
+
+ if str(id) == "main" and self.checkKey(id):
+ print("The 'main' window already exist! You can't create more than one 'main' type window!")
+ return None
+
+ if base.data["sight_mode"] == "single":
+ if len(id) == 0:
+ print("No ID was given! In single mode need declare an ID to the Sight in advance!")
+ return None
+ if self.checkKey(id):
+ print("This ['"+type+"'-'"+str(id)+"'] already exist!")
+ return None
+ if base.data["sight_mode"] == "multiple":
+ if len(id) == 0:
+ id = self.createUniqueId()
+ if len(id) > 0 and self.checkKey(id) and str(id) != "main":
+ id = self.createUniqueId()
+
+ self.list[id] = Sight(id,type)
+ print("The ['"+type+"'-'"+str(id)+"'] is created now!")
+ return id
+
+ def show(self, id):
+ if self.checkKey(id):
+ self.list[id].show()
+ print("The '"+str(id)+"' sight is showed!")
+ return True
+ print("This '"+str(id)+"' id isn't exist to show!")
+ return False
+
+ def get(self, id):
+ if self.checkKey(id):
+ return self.list[id]
+ print("This '"+str(id)+"' id isn't exist to get!")
+
+ def close(self, id):
+ if self.checkKey(id):
+ if id == "main":
+ print("Program Exit!")
+ base.app.exit(0)
+ self.list[id].close()
+ self.list[id].deleteLater()
+ del self.list[id]
+ print("The '"+str(id)+"' is closed now!")
+ return True
+ else:
+ print("The '"+str(id)+"' isn't exist'")
+ return False
+
+ def processes(self):
+ print(self.list)
+
+ def checkKey(self, id):
+ if id in self.list:
+ return True
+ return False
+ def addGlobalData(self, key, value):
+ self.data[key] = value
+ def getGlobalData(self, key):
+ if key in self.data:
+ return self.data[key]
+ return None
+
+ def createUniqueId(self):
+ new_id = str(random.randint(1000, 9999))
+ if self.checkKey(new_id):
+ self.createUniqueId()
+ return new_id
\ No newline at end of file
diff --git a/sightfactory.py.bak b/sightfactory.py.bak
new file mode 100644
index 0000000..d9823f5
--- /dev/null
+++ b/sightfactory.py.bak
@@ -0,0 +1,79 @@
+import base
+import random
+from sight import Sight
+
+class SightFactory():
+ def __init__(self):
+ self.list = {}
+ self.data = {} #Global data(s) for the sight(s)
+
+ def create(self, id, type):
+ print("----- "+type+"-"+str(id)+"-------")
+
+ if str(id) == "main" and self.checkKey(id):
+ print("The 'main' window already exist! You can't create more than one 'main' type window!")
+ return None
+
+ if base.data["sight_mode"] == "single":
+ if len(id) == 0:
+ print("No ID was given! In single mode need declare an ID to the Sight in advance!")
+ return None
+ if self.checkKey(id):
+ print("This ['"+type+"'-'"+str(id)+"'] already exist!")
+ return None
+ if base.data["sight_mode"] == "multiple":
+ if len(id) == 0:
+ id = self.createUniqueId()
+ if len(id) > 0 and self.checkKey(id) and str(id) != "main":
+ id = self.createUniqueId()
+
+ self.list[id] = Sight(id,type)
+ print("The ['"+type+"'-'"+str(id)+"'] is created now!")
+ return id
+
+ def show(self, id):
+ if self.checkKey(id):
+ self.list[id].show()
+ print("The '"+str(id)+"' sight is showed!")
+ return True
+ print("This '"+str(id)+"' id isn't exist to show!")
+ return False
+
+ def get(self, id):
+ if self.checkKey(id):
+ return self.list[id]
+ print("This '"+str(id)+"' id isn't exist to get!")
+
+ def close(self, id):
+ if self.checkKey(id):
+ if id == "main":
+ print("Program Exit!")
+ base.app.exit(0)
+ self.list[id].close()
+ self.list[id].destroy()
+ del self.list[id]
+ print("The '"+str(id)+"' is closed now!")
+ return True
+ else:
+ print("The '"+str(id)+"' isn't exist'")
+ return False
+
+ def processes(self):
+ print(self.list)
+
+ def checkKey(self, id):
+ if id in self.list:
+ return True
+ return False
+ def addGlobalData(self, key, value):
+ self.data[key] = value
+ def getGlobalData(self, key):
+ if key in self.data:
+ return self.data[key]
+ return None
+
+ def createUniqueId(self):
+ new_id = str(random.randint(1000, 9999))
+ if self.checkKey(new_id):
+ self.createUniqueId()
+ return new_id
\ No newline at end of file