Initial dev repository
[kcls-web.git] / js / ui / kcls / circ / selfcheck / floating.js
diff --git a/js/ui/kcls/circ/selfcheck/floating.js b/js/ui/kcls/circ/selfcheck/floating.js
new file mode 100644 (file)
index 0000000..863cde8
--- /dev/null
@@ -0,0 +1,223 @@
+/* Script by: www.jtricks.com\r
+ * Version: 20071017\r
+ * Latest version:\r
+ * www.jtricks.com/javascript/navigation/floating.html\r
+ */\r
+var floatingMenuId = 'floatdiv';\r
+var floatingMenu =\r
+{\r
+    targetX: -250,\r
+    targetY: -75,\r
+\r
+    hasInner: typeof(window.innerWidth) == 'number',\r
+    hasElement: typeof(document.documentElement) == 'object'\r
+        && typeof(document.documentElement.clientWidth) == 'number',\r
+\r
+    menu:\r
+        document.getElementById\r
+        ? document.getElementById(floatingMenuId)\r
+        : document.all\r
+          ? document.all[floatingMenuId]\r
+          : document.layers[floatingMenuId]\r
+};\r
+\r
+floatingMenu.move = function ()\r
+{\r
+    floatingMenu.menu.style.left = floatingMenu.nextX + 'px';\r
+    floatingMenu.menu.style.top = floatingMenu.nextY + 'px';\r
+}\r
+\r
+floatingMenu.computeShifts = function ()\r
+{\r
+    var de = document.documentElement;\r
+\r
+    floatingMenu.shiftX =  \r
+        floatingMenu.hasInner  \r
+        ? pageXOffset  \r
+        : floatingMenu.hasElement  \r
+          ? de.scrollLeft  \r
+          : document.body.scrollLeft;  \r
+    if (floatingMenu.targetX < 0)\r
+    {\r
+        floatingMenu.shiftX +=\r
+            floatingMenu.hasElement\r
+            ? de.clientWidth\r
+            : document.body.clientWidth;\r
+    }\r
+\r
+    floatingMenu.shiftY = \r
+        floatingMenu.hasInner\r
+        ? pageYOffset\r
+        : floatingMenu.hasElement\r
+          ? de.scrollTop\r
+          : document.body.scrollTop;\r
+floatingMenu.shiftY = ( floatingMenu.shiftY < 76 ) ? 76 :\r
+floatingMenu.shiftY;\r
+    if (floatingMenu.targetY < -75)\r
+    {\r
+        if (floatingMenu.hasElement && floatingMenu.hasInner)\r
+        {\r
+            // Handle Opera 8 problems\r
+            floatingMenu.shiftY +=\r
+                de.clientHeight > window.innerHeight\r
+                ? window.innerHeight\r
+                : de.clientHeight\r
+        }\r
+        else\r
+        {\r
+            floatingMenu.shiftY +=\r
+                floatingMenu.hasElement\r
+                ? de.clientHeight\r
+                : document.body.clientHeight;\r
+        }\r
+    }\r
+}\r
+\r
+floatingMenu.calculateCornerX = function()\r
+{\r
+       return 0;\r
+    if (floatingMenu.targetX != 'center')\r
+        return floatingMenu.shiftX + floatingMenu.targetX;\r
+\r
+    var width = parseInt(floatingMenu.menu.offsetWidth);\r
+\r
+    var cornerX =\r
+        floatingMenu.hasElement\r
+        ? (floatingMenu.hasInner\r
+           ? pageXOffset\r
+           : document.documentElement.scrollLeft) + \r
+          (document.documentElement.clientWidth - width)/2\r
+        : document.body.scrollLeft + \r
+          (document.body.clientWidth - width)/2;\r
+    return cornerX;\r
+};\r
+\r
+floatingMenu.calculateCornerY = function()\r
+{\r
+    if (floatingMenu.targetY != 'center')\r
+        return floatingMenu.shiftY + floatingMenu.targetY;\r
+\r
+    var height = parseInt(floatingMenu.menu.offsetHeight);\r
+\r
+    // Handle Opera 8 problems\r
+    var clientHeight = \r
+        floatingMenu.hasElement && floatingMenu.hasInner\r
+        && document.documentElement.clientHeight \r
+            > window.innerHeight\r
+        ? window.innerHeight\r
+        : document.documentElement.clientHeight\r
+\r
+    var cornerY =\r
+        floatingMenu.hasElement\r
+        ? (floatingMenu.hasInner  \r
+           ? pageYOffset\r
+           : document.documentElement.scrollTop) + \r
+          (clientHeight - height)/2\r
+        : document.body.scrollTop + \r
+          (document.body.clientHeight - height)/2;\r
+    return cornerY;\r
+};\r
+\r
+floatingMenu.doFloat = function()\r
+{\r
+    // Check if reference to menu was lost due\r
+    // to ajax manipuations\r
+    if (!floatingMenu.menu)\r
+    {\r
+        menu = document.getElementById\r
+            ? document.getElementById(floatingMenuId)\r
+            : document.all\r
+              ? document.all[floatingMenuId]\r
+              : document.layers[floatingMenuId];\r
+\r
+        initSecondary();\r
+    }\r
+\r
+    var stepX, stepY;\r
+\r
+    floatingMenu.computeShifts();\r
+\r
+    var cornerX = floatingMenu.calculateCornerX();\r
+\r
+    var stepX = (cornerX - floatingMenu.nextX) * .07;\r
+    if (Math.abs(stepX) < .5)\r
+    {\r
+        stepX = cornerX - floatingMenu.nextX;\r
+    }\r
+\r
+    var cornerY = floatingMenu.calculateCornerY();\r
+\r
+    var stepY = (cornerY - floatingMenu.nextY) * .07;\r
+    if (Math.abs(stepY) < .5)\r
+    {\r
+        stepY = cornerY - floatingMenu.nextY;\r
+    }\r
+\r
+    if (Math.abs(stepX) > 0 ||\r
+        Math.abs(stepY) > 0)\r
+    {\r
+        floatingMenu.nextX += stepX;\r
+        floatingMenu.nextY += stepY;\r
+        floatingMenu.move();\r
+    }\r
+\r
+    setTimeout('floatingMenu.doFloat()', 20);\r
+};\r
+\r
+// addEvent designed by Aaron Moore\r
+floatingMenu.addEvent = function(element, listener, handler)\r
+{\r
+    if(typeof element[listener] != 'function' || \r
+       typeof element[listener + '_num'] == 'undefined')\r
+    {\r
+        element[listener + '_num'] = 0;\r
+        if (typeof element[listener] == 'function')\r
+        {\r
+            element[listener + 0] = element[listener];\r
+            element[listener + '_num']++;\r
+        }\r
+        element[listener] = function(e)\r
+        {\r
+            var r = true;\r
+            e = (e) ? e : window.event;\r
+            for(var i = element[listener + '_num'] -1; i >= 0; i--)\r
+            {\r
+                if(element[listener + i](e) == false)\r
+                    r = false;\r
+            }\r
+            return r;\r
+        }\r
+    }\r
+\r
+    //if handler is not already stored, assign it\r
+    for(var i = 0; i < element[listener + '_num']; i++)\r
+        if(element[listener + i] == handler)\r
+            return;\r
+    element[listener + element[listener + '_num']] = handler;\r
+    element[listener + '_num']++;\r
+};\r
+\r
+floatingMenu.init = function()\r
+{\r
+    floatingMenu.initSecondary();\r
+    floatingMenu.doFloat();\r
+};\r
+\r
+// Some browsers init scrollbars only after\r
+// full document load.\r
+floatingMenu.initSecondary = function()\r
+{\r
+    floatingMenu.computeShifts();\r
+    floatingMenu.nextX = floatingMenu.calculateCornerX();\r
+    floatingMenu.nextY = floatingMenu.calculateCornerY();\r
+    floatingMenu.move();\r
+}\r
+\r
+if (document.layers)\r
+    floatingMenu.addEvent(window, 'onload', floatingMenu.init);\r
+else\r
+{\r
+    floatingMenu.init();\r
+    floatingMenu.addEvent(window, 'onload',\r
+        floatingMenu.initSecondary);\r
+}
\ No newline at end of file