diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php
index e50c2903807..beb9cab5c47 100644
--- a/htdocs/comm/propal.php
+++ b/htdocs/comm/propal.php
@@ -1075,7 +1075,7 @@ if ($_GET['propalid'] > 0)
}
else
{
- print $html->textwithtooltip($text,$objp->description,4,'','',$i+1,$objp->ref.' - '.nl2br(stripslashes($objp->product)));
+ print $html->textwithtooltip($text,$objp->description,4,'','',$i,$objp->ref.' - '.nl2br(stripslashes($objp->product)));
}
print_date_range($objp->date_start,$objp->date_end);
diff --git a/htdocs/html.form.class.php b/htdocs/html.form.class.php
index 0f9d7765ef3..f5070c1d7d5 100644
--- a/htdocs/html.form.class.php
+++ b/htdocs/html.form.class.php
@@ -68,14 +68,14 @@ class Form
\brief Affiche un texte+picto avec tooltip sur texte ou sur picto
\param text Texte à afficher
\param htmltext Contenu html du tooltip, codé en html
- \param tooltipon 1=tooltip sur texte, 2=tooltip sur picto, 3=tooltip sur les 2, 4=tooltip ajax
+ \param tooltipon 1=tooltip sur texte, 2=tooltip sur picto, 3=tooltip sur les 2, 4=tooltip Ajax
\param direction -1=Le picto est avant, 0=pas de picto, 1=le picto est après
\param img Code img du picto
\return string Code html du texte,picto
*/
function textwithtooltip($text,$htmltext,$tooltipon=1,$direction=0,$img='',$i=1,$option='')
{
- global $conf;
+ global $conf,$langs;
if (! $htmltext) return $text;
@@ -88,15 +88,16 @@ class Form
if ($conf->use_ajax && $tooltipon == 4)
{
- $s = '';
- $s.= ''.$text.' ';
+ $s = '
'."\n";
+ $s.= $text;
+ $s.= '
'."\n";
+ $s.= ''."\n";
+ $s.= $htmltext."\n";
+ $s.= '
'."\n";
+ $s.= ''."\n";
}
else
{
diff --git a/htdocs/includes/scriptaculous/src/prototip.js b/htdocs/includes/scriptaculous/src/prototip.js
deleted file mode 100644
index 60b9053bc73..00000000000
--- a/htdocs/includes/scriptaculous/src/prototip.js
+++ /dev/null
@@ -1,248 +0,0 @@
-// Prototip 1.0.1.1
-// by Nick Stakenburg - http://www.nickstakenburg.com
-// 25-07-2007
-//
-// More information on this project:
-// http://www.nickstakenburg.com/projects/prototip/
-//
-// Licensed under the Creative Commons Attribution 3.0 License
-// http://creativecommons.org/licenses/by/3.0/
-//
-
-var Tip = Class.create();
-Tip.prototype = {
-
- initialize: function(element, content) {
- this.element = $(element);
- this.content = content;
-
- this.options = Object.extend({
- className: 'tooltip',
- duration: 0.3, // duration of the effect
- effect: false, // false, 'appear' or 'blind'
- hook: false, // { element: {'topLeft|topRight|bottomLeft|bottomRight'}, tip: {'topLeft|topRight|bottomLeft|bottomRight'}
- offset: (arguments[2] && arguments[2].hook) ? {x:0, y:0} : {x:16, y:16},
- fixed: false, // follow the mouse if false
- target: this.element, // or another element
- title: false,
- viewport: true, // keep within viewport if mouse is followed
- zIndex: 1200
- }, arguments[2] || {});
-
- this.target = $(this.options.target);
-
- if (this.options.hook) {
- this.options.fixed = true;
- this.options.viewport = false;
- }
-
- if (this.options.effect) {
- this.queue = { position: 'end', limit: 1, scope: ''}
- var c = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
- for (var i=0; i<6; i++) {
- var r = Math.floor(Math.random() * c.length);
- this.queue.scope += c.substring(r,r+1);
- }
- }
-
- this.setup();
- },
-
- setup: function() {
- this.element.observe('mousemove', this.showTip.safeBind(this));
- this.element.observe('mouseout', this.hideTip.safeBind(this));
- },
-
- buildTip: function() {
- // IE select fix, this is placed first in case zIndex fails
- if (Prototype.Browser.IE) {
- this.underlay = document.createElement('iframe');
- Element.setStyle(this.underlay, {
- position: 'absolute',
- display: 'none',
- border: 0,
- margin: 0,
- opacity: 0.01,
- padding: 0,
- background: 'none',
- zIndex: this.options.zIndex
- });
- document.body.appendChild(this.underlay);
- }
-
- // create a wrapper
- this.wrapper = document.createElement('div');
- Element.setStyle(this.wrapper, {
- position: 'absolute',
- zIndex: this.options.zIndex+1,
- display: 'none'
- });
- if (this.options.width) this.wrapper.setStyle({ width: this.options.width+'px' });
-
- // add the tooltip
- this.tooltip = this.wrapper.appendChild(document.createElement('div'));
- this.tooltip.className = this.options.className;
- this.tooltip.style.position = 'relative';
-
- // add the title
- if (this.options.title) {
- this.title = this.tooltip.appendChild(document.createElement('div'));
- this.title.className = 'title';
- Element.update(this.title, this.options.title);
- }
-
- // content
- this.tip = this.tooltip.appendChild(document.createElement('div'));
- this.tip.className = 'content';
- Element.update(this.tip, this.content);
-
- // add wrapper to the body
- document.body.appendChild(this.wrapper);
-
- // prepare for effects
- var w = this.wrapper.getDimensions();
- this.wrapper.setStyle({ width: w.width+'px', height: w.height+'px' });
- if (Prototype.Browser.IE) this.underlay.setStyle({ width: w.width+'px', height: w.height+'px' });
- Element.hide(this.tooltip);
- },
-
- showTip: function(event){
- if (!this.wrapper) this.buildTip();
- this.positionTip(event); // follow mouse
- if (this.wrapper.visible() && this.options.effect != 'appear') return;
-
- if (Prototype.Browser.IE) this.underlay.show(); // IE select fix
- this.wrapper.show();
-
- if (!this.options.effect) {
- this.tooltip.show();
- } else {
- // stop running effect
- if (this.activeEffect) Effect.Queues.get(this.queue.scope).remove(this.activeEffect);
- // start new
- this.activeEffect = Effect[Effect.PAIRS[this.options.effect][0]](this.tooltip, { duration: this.options.duration, queue: this.queue});
- }
- },
-
- hideTip: function(event){
- if(!this.wrapper.visible()) return;
-
- if (!this.options.effect) {
- if (Prototype.Browser.IE) { this.underlay.hide(); } // select fix
- this.tooltip.hide();
- this.wrapper.hide();
- }
- else {
- // stop running effect
- if (this.activeEffect) Effect.Queues.get(this.queue.scope).remove(this.activeEffect);
- // start new
- this.activeEffect = Effect[Effect.PAIRS[this.options.effect][1]](this.tooltip, { duration: this.options.duration, queue: this.queue, afterFinish: function(){
- if (Prototype.Browser.IE) this.underlay.hide(); // select fix
- this.wrapper.hide();
- }.bind(this)});
- }
- },
-
- positionTip: function(event){
- // calculate
- var offset = {'left': this.options.offset.x,'top': this.options.offset.y};
- var targetPosition = Position.cumulativeOffset(this.target);
- var tipd = this.wrapper.getDimensions();
- var pos = {
- 'left': (this.options.fixed) ? targetPosition[0] : Event.pointerX(event),
- 'top': (this.options.fixed) ? targetPosition[1] : Event.pointerY(event)
- }
-
- // add offsets
- pos.left += offset.left;
- pos.top += offset.top;
-
- if (this.options.hook) {
- var dims = {'target': this.target.getDimensions(), 'tip': tipd}
- var hooks = {'target': Position.cumulativeOffset(this.target), 'tip': Position.cumulativeOffset(this.target)}
-
- for(var z in hooks) {
- switch(this.options.hook[z]){
- case 'topRight':
- hooks[z][0] += dims[z].width;
- break;
- case 'bottomLeft':
- hooks[z][1] += dims[z].height;
- break;
- case 'bottomRight':
- hooks[z][0] += dims[z].width;
- hooks[z][1] += dims[z].height;
- break;
- }
- }
-
- // move based on hooks
- pos.left += -1*(hooks.tip[0] - hooks.target[0]);
- pos.top += -1*(hooks.tip[1] - hooks.target[1]);
- }
-
- // move tooltip when there is a different target when following mouse
- if (!this.options.fixed && this.element !== this.target) {
- var elementPosition = Position.cumulativeOffset(this.element);
- pos.left += -1*(elementPosition[0] - targetPosition[0]);
- pos.top += -1*(elementPosition[1] - targetPosition[1]);
- }
-
- if (!this.options.fixed && this.options.viewport) {
- var scroll = this.getScrollOffsets();
- var viewport = this.viewportSize();
- var pair = {'left': 'width', 'top': 'height'};
-
- for(var z in pair) {
- if ((pos[z] + tipd[pair[z]] - scroll[z]) > viewport[pair[z]]) {
- pos[z] = pos[z] - tipd[pair[z]] - 2*offset[z];
- }
- }
- }
-
- // position
- this.wrapper.setStyle({
- left: pos.left + 'px',
- top: pos.top + 'px'
- });
-
- if (Prototype.Browser.IE) this.underlay.setStyle({ left: pos.left+'px', top: pos.top+'px' });
- },
-
- // Functions below hopefully won't be needed with prototype 1.6
- viewportWidth: function(){
- if (Prototype.Browser.Opera) return document.body.clientWidth;
- return document.documentElement.clientWidth;
- },
-
- viewportHeight: function(){
- if (Prototype.Browser.Opera) return document.body.clientHeight;
- if (Prototype.Browser.WebKit) return this.innerHeight;
- return document.documentElement.clientHeight;
- },
-
- viewportSize : function(){
- return {'height': this.viewportHeight(), 'width': this.viewportWidth()};
- },
-
- getScrollLeft: function(){
- return this.pageXOffset || document.documentElement.scrollLeft;
- },
-
- getScrollTop: function(){
- return this.pageYOffset || document.documentElement.scrollTop;
- },
-
- getScrollOffsets: function(){
- return {'left': this.getScrollLeft(), 'top': this.getScrollTop()}
- }
-}
-
-/* fix for $A is not defined on Firefox */
-Function.prototype.safeBind = function() {
- var __method = this, args = $A(arguments), object = args.shift();
- return function() {
- if (typeof $A == 'function')
- return __method.apply(object, args.concat($A(arguments)));
- }
-}
\ No newline at end of file
diff --git a/htdocs/includes/scriptaculous/src/window/MIT-LICENSE b/htdocs/includes/scriptaculous/src/window/MIT-LICENSE
new file mode 100644
index 00000000000..5bcdad1bd74
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/MIT-LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.com)
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/htdocs/includes/scriptaculous/src/window/README b/htdocs/includes/scriptaculous/src/window/README
new file mode 100644
index 00000000000..e2cb9608345
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/README
@@ -0,0 +1,182 @@
+== Installation/Usage
+
+Just copy windows.js in your javascript directory, and default.css + default directory in your stylesheets directory
+See samples/index.html for more details and go on my web page : http://prototype-window.xilinus.com
+
+== Change log
+- 04/23/07 V 1.3
+ - Added: getTitle
+ - Added: blur/focus function on Windows module
+ - Added: onBlur event
+ - Fixed: WindowCloseKey works with URL content (iframe)
+ - Fixed: Modal window with a parent != document.body
+ - Updated: prototype 1.5RC3
+ - Updated: Dialog handle resizable,minimizable, maximizable, draggable and closable options
+- 02/27/07 V 1.2
+ - Added: gridX and gridY constructor's options to snap move and resize
+ - Added: Effect on modal overlay (fade/appear) only if effects.js in included.
+ You can change effect options (Windows.overlayShowEffectOptions and Windows.overlayHideEffectOptions).
+
+ - Fixed: Multimodal mode.
+ - Fixed: Works on WebKit.
+
+ - Beta: effects on minimize and maximize. You need to include window_effects.js to have them.
+
+- 02/17/07 V 1.1
+ - Constructor has been simplified, now you can just do win = new Window(). By default id is automatically generated and can be passed as options
+ win = new Window({id: "my_id", width: 100, height: 100})
+ Backward compatibility with old constructor win = new Window("my_id", {width: 100, height: 100})
+ - Observer event can be passed as window option: win = new Window({onClose: function() {alert('close')}})
+ - parent option can be id or element
+ - delegate has been removed (not really usefull) and0 setCloseCallback has been addedinstead. (It could be also passed as a constructor's option closeCallback: your_callcabck)
+ your_callcabck must return true to be able to close the window
+ - add onMove event
+ - fix constraint for minimized window
+ - destroyOnClose could be passed as constructor's option: win = new Window({destroyOnClose: true})
+ - constraint works for maximized windows
+ - Dialog ok and cancel parameters has been renamed to onOk and onCancel for coherence (ok and cancel still works)
+ - Update to Prototype 1.5 and script.aculo.us 1.7
+
+- 01/14/07 V 1.00
+ - add changeClassName to change look and feel dynamically.
+ - add constraint move. Constraint can be on a div or document.
+ - full top and bottom bar are use to move window.
+ - fixed computation of window width or height.
+ - add setURL/getURL/refresh and setHTMLContent. Content can be change dynamically.
+ - add tooltip.js add on. It's an add-on to add dynamically tooltips on a webpage (see samples/tooltips/tooltip.html)
+ Thanks to Jonathan Modell of 2moromedia.com.
+
+- 12/06/06 V 0.99
+ - remove addClass that automatically tries to include default.css
+ - add wired move/resize
+ - fix recenterAuto
+ - add show to WindowStore to be able to open a window the first time, wihtout any cookie (check samples/window_store/html)
+
+- 11/06/06 V 0.98
+ - new optional behavior for multi-level modal window.
+ - Two new add-ons (in window_ext.js file)
+ + WindowStore to save open/close window status.
+ + WindowCloseKey to handle escape key (or any keys) to close windows/dialogs
+
+- 10/26/06 V 0.97
+ - add recenterModal to constructor
+ - setAjaxContent eval response request
+ - modal window multi level
+ - fix close/closeAll issues
+ - add addCss (auto add default.css)
+
+- 09/26/06 V 0.96.3
+ - Fixed onClose, no more memory leak and nore issues with sound on IE (even on dialogs)
+ - add getLocation
+ - Debug select problem on Firefox
+ - change mouseup event to onclick event
+ - Fixed event propagation on mininize/maximize/close
+ - Add frameborder=0
+ - Add prototype_window_class_helper.rb by Jorge DÃaz (http://xurde.info)
+
+- 07/22/06 V 0.96.2
+ - Fixed select issue in modal window
+
+- 07/15/06 V 0.96.1
+ - Bugs fixed
+ - Add isVisible()
+ - Update debug.js
+
+- 07/11/06 V 0.96
+ - New events onShow, onHide, onFocus
+ - isVisible()
+ - Autofit width or height if width or (NOT AND) height is set to null in the constructor
+ - updateWidth / updateHeight if you need to update width or height (useful after changing window content if you do not want scrollbars)
+ - Add top, left to showCenter(modal, top, left) optional arguments if you need to center only left or top value.
+
+- 06/30/06 V 0.95
+ - Now you can set windows or dialogs content with an Ajax request!!
+ - Fixed IE issue when you destroy window with an url that embeds mp3.
+ - Fixed buttonClass issue for Dialog.
+ - Update samples
+
+- 06/24/06 V 0.90
+ - Valid XHTML 1.0 Strict!
+ - Fixed minimize function
+ - Fixed destroy on window without hide effects
+ - No more text selection while dragging
+ - Add onMinimize/onMaximize event
+
+- 06/19/06 V 0.85.2
+ - Remove undeclared vars
+ - Set top/left to 0 if not specify
+ - Destroy objet after hide effect instead of before effect instead
+ - getSize
+ - add extended_debug.js (from Jason Pollard)
+
+- 06/13/06 V 0.85.1
+ - IE bug fixed
+
+- 06/12/06 V 0.85
+ - Autofit width or height for Dialog
+ - Better Move/Resize over
+ - Allow select in modal window (even on IE)
+ - WARNING, ok callback for Dialog should returns true to close the dialog
+ - better window HTML code (no more div inside the td)
+ - Add themes
+
+- 05/23/06 V 0.80
+ - Add setTitle
+ - Add setStatusBar
+ - Store minimize/maximize in the cookie (Thanks to Ifran)
+ - Add onload constructor parameter (Thanks to Ifran)
+ - Add button class for dialog (Thanks to Felix Shnir)
+
+- 05/09/06 V 0.75
+ - Update with Script.aculo.us 1.6.1 and Prototype 1.5.0_rc1
+ - Remove PNG for dialog overlay, use opacity as done in lightbox V2
+ - Add Windows.focusedWindow and Windows.closeAll
+ - Add name to iframe in case of url window
+ - Clean up code, use _ for private function (just name convention)
+ - Add Dialog.info function, usefull for for submit or notice info (in Rails)
+ - Add minimize and maximize buttons
+ - Add alert_lite.css without any images
+ - Debug
+
+- 04/15/06 V 0.70
+ - Add autoposition in setContent. The window will at the element location
+ - Add draggable/closable parameter if you need to specify is the window is draggable/closable or not
+ - Add parent parameter if you need a specific parent instead of body
+ - Better resize
+ - Add setCookie to store window location/size in a cookie
+ - Add parent.html sample
+
+- 04/05/06 V 0.65
+ - Update to Prototype 1.5.0_pre1, script.aculo.us 1.6.0
+ - Add setDestoyOnClose
+ - Add Windows Observer with onStartResize(), onEndResize(), onStartMove(), onEndMove(), onClose(), onDestroy() events
+ - Add setContent(id, autoresize)
+
+- 03/29/06 V 0.6
+ - Add Window delegate to manage close action
+ - Add modal mode and Dialog class with common panels: alert, confirm
+ - Clean HTML code and change caracters to lowercase to be XHTML compliant (thanks to nuxygen and Joseph)
+ - Add showEffectOptions, hideEffectOptions, effectOptions to Window constructor (thanks to Jon)
+ - Fix checkbox IE bug (big thanks to JCA)
+ - Fix other little bugs (thanks to nuxygen, Dennis, and all who sent me emails)
+ - Update samples/index.html
+ - Add new sample usng frame (samples/inset.html and samples/inframe.html but use only samples/inset.html)
+
+- 03/27/06 V 0.51
+ - New CSS theme structure
+ - Add url: constructor parameter to have a window with an URL content
+ - Add bottom/right constructor parameters
+ - Update sample files.
+
+- 03/24/06 V 0.50 Initial revision
+
+
+== License
+
+it is licensed under the terms of the MIT License, see the included MIT-LICENSE file.
+
+== Thanks
+To all of you who sent me bugs, patches and feature requests
+
+http://www.ciudadmovil.com.co/q/mod/mapa/conexion.php
+http://www.desyr.net/
\ No newline at end of file
diff --git a/htdocs/includes/scriptaculous/src/window/debug.js b/htdocs/includes/scriptaculous/src/window/debug.js
new file mode 100644
index 00000000000..3d8f338836e
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/debug.js
@@ -0,0 +1,137 @@
+var debugWindow = null;
+function debug(text, reverse) {
+ if (debugWindow == null)
+ return;
+
+ time = "-"; //new Date();
+ if (reverse) {
+ $('debug').innerHTML = time + " " + text + " "+ $('debug').innerHTML;
+ debugWindow.getContent().scrollTop=0;
+ }
+ else {
+ $('debug').innerHTML += time + " " + text + " ";
+ debugWindow.getContent().scrollTop=10000; // Far away
+ }
+}
+
+function hideDebug() {
+ if (debugWindow) {
+ debugWindow.destroy();
+ debugWindow = null;
+ }
+}
+
+function showDebug(bShow) {
+ if (debugWindow == null) {
+ debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+ debugWindow.getContent().innerHTML = "
";
+ date=new Date;
+ date.setMonth(date.getMonth()+3);
+
+ //debugWindow.setCookie(null, date);
+ }
+ if( typeof bShow == 'undefined' || bShow)debugWindow.show()
+}
+
+
+function clearDebug() {
+ if (debugWindow == null)
+ return;
+ $('debug').innerHTML = "";
+}
+
+/**
+ * document.createElement convenience wrapper
+ *
+ * The data parameter is an object that must have the "tag" key, containing
+ * a string with the tagname of the element to create. It can optionally have
+ * a "children" key which can be: a string, "data" object, or an array of "data"
+ * objects to append to this element as children. Any other key is taken as an
+ * attribute to be applied to this tag.
+ *
+ * Available under an MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ *
+ * @param {Object} data The data representing the element to create
+ * @return {Element} The element created.
+ */
+function $E(data) {
+ var el;
+ if ('string'==typeof data) {
+ el=document.createTextNode(data);
+ } else {
+ //create the element
+ el=document.createElement(data.tag);
+ delete(data.tag);
+
+ //append the children
+ if ('undefined'!=typeof data.children) {
+ if ('string'==typeof data.children ||'undefined'==typeof data.children.length) {
+ //strings and single elements
+ el.appendChild($E(data.children));
+ } else {
+ //arrays of elements
+ for (var i=0, child=null; 'undefined'!=typeof (child=data.children[i]); i++) {
+ el.appendChild($E(child));
+ }
+ }
+ delete(data.children);
+ }
+
+ //any other data is attributes
+ for (attr in data) {
+ el[attr]=data[attr];
+ }
+ }
+
+ return el;
+}
+
+// FROM Nick Hemsley
+var Debug = {
+ inspectOutput: function (container, within) {
+ within = within || debugWindow.getContent()
+
+ if (debugWindow == null)
+ return;
+
+ within.appendChild(container)
+ },
+
+ inspect: function(object) {
+ var cont = $E({tag: "div", className: "inspector"})
+ Debug.inspectObj(object, cont)
+ debugWindow.getContent().appendChild(cont)
+ },
+
+ inspectObj: function (object, container) {
+ for (prop in object) {
+ Debug.inspectOutput(Debug.inspectable(object, prop), container)
+ }
+ },
+
+ inspectable: function(object, prop) {
+ cont = $E({tag: 'div', className: 'inspectable', children: [prop + " value: " + object[prop] ]})
+ cont.toInspect = object[prop]
+ Event.observe(cont, 'click', Debug.inspectClicked, false)
+ return cont
+ },
+
+ inspectClicked: function(e) {
+ Debug.inspectContained(Event.element(e))
+ Event.stop(e)
+ },
+
+ inspectContained: function(container) {
+ if (container.opened) {
+ container.parentNode.removeChild(container.opened)
+ delete(container.opened)
+ } else {
+ sibling = container.parentNode.insertBefore($E({tag: "div", className: "child"}), container.nextSibling)
+ if (container.toInspect)
+ Debug.inspectObj(container.toInspect, sibling)
+ container.opened = sibling
+ }
+ }
+}
+var inspect = Debug.inspect;
diff --git a/htdocs/includes/scriptaculous/src/window/extended_debug.js b/htdocs/includes/scriptaculous/src/window/extended_debug.js
new file mode 100644
index 00000000000..2b935b1b7dd
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/extended_debug.js
@@ -0,0 +1,113 @@
+var commandHistory;
+var historyIndex;
+
+function showExtendedDebug() {
+ if (debugWindow != null) {
+ hideDebug();
+ }
+
+ if (debugWindow == null) {
+ commandHistory = new Array();
+ historyIndex = 0;
+
+ debugWindow = new Window('debug_window', {className: 'dialog',width:250, height:100, right:4, minWidth:250, bottom:42, zIndex:1000, opacity:1, showEffect: Element.show, resizable: true, title: "Debug"})
+ debugWindow.getContent().innerHTML = "
";
+
+ //create hourglass icon and attach events to it.
+ var cont = "
";
+
+ new Insertion.After('debug_window_maximize', cont);
+ Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+
+ //create command text box
+ cont = "Eval: "
+ debugWindow.setStatusBar(cont);
+
+ Event.observe('debug_window_command', 'mousedown', donothing);
+ Event.observe('debug_window_command', 'keypress', evalJS, false);
+ }
+ debugWindow.show();
+}
+
+function donothing(evt){
+ Field.activate('debug_window_command');
+ return false;
+}
+
+function evalJS(evt){
+ if(evt.keyCode == Event.KEY_RETURN){
+ var js = $F('debug_window_command');
+ try{
+ var ret = eval(js);
+ if(ret != null)
+ debug(ret);
+ }catch(e){
+ debug(e);
+ }
+ $('debug_window_command').value = '';
+
+ Field.activate('debug_window_command');
+ commandHistory.push(js);
+ historyIndex = 0;
+ }
+
+ if(evt.keyCode == Event.KEY_UP){
+ if(commandHistory.length > historyIndex){
+ historyIndex++;
+ var js = commandHistory[commandHistory.length-historyIndex];
+ $('debug_window_command').value = js;
+ Event.stop(evt);
+ Field.activate('debug_window_command');
+ }
+ }
+
+ if(evt.keyCode == Event.KEY_DOWN){
+ if(commandHistory.length >= historyIndex && historyIndex > 1){
+ historyIndex--;
+ var js = commandHistory[commandHistory.length-historyIndex];
+ $('debug_window_command').value = js;
+ Event.stop(evt);
+ Field.activate('debug_window_command');
+ }
+ }
+}
+
+function enterInspectionMode(evt){
+ //stop observing magnifying glass
+ Event.stopObserving('debug_window_inspect', 'click', enterInspectionMode, false);
+ //change pointer
+ document.body.style.cursor='help';
+ //start observing mouse clicks
+ Event.observe(window, 'click', inspectItem, false);
+}
+
+function inspectItem(evt){
+ // the element that triggered the event
+ var element = Event.element(evt);
+ if(element.id!="debug_window_inspect"){
+ clearDebug()
+ //change pointer
+ document.body.style.cursor='default';
+ debug(element.id);
+ inspect(element);
+ //stop observing mouse clicks
+ Event.stopObserving(window, 'click', inspectItem, false);
+ //alert('doing something');
+ //start observing mag
+ Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
+ }
+}
+
+function clearDebug() {
+ var win = $('debug');
+ if (win == null)
+ return;
+
+ win.innerHTML=" ";
+ //clear inspections too
+ var divs = document.getElementsByClassName('inspector');
+ divs.each(function(div){
+ Element.remove(div);
+ });
+}
+
diff --git a/htdocs/includes/scriptaculous/src/window/tooltip.js b/htdocs/includes/scriptaculous/src/window/tooltip.js
new file mode 100644
index 00000000000..65e6106034c
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/tooltip.js
@@ -0,0 +1,241 @@
+// Singleton class TooltipWindow
+// This class works with special className. The tooltip content could be in your HTML page as an hidden element or
+// can be retreive by an AJAX call.
+//
+// To work, You just need to set two class name on elements that should show tooltips
+// - One to say to TooltipManager that this element must have a tooltip ('tooltip' by default)
+// - Another to indicate how to find the tooltip content
+// It could be html_XXXX if tootltip content is somewhere hidden in your page, XXX must be DOM ID of this hidden element
+// It could be ajax_XXXX if tootltip content must be find by an ajax request, XXX will be the string send as id parameter to your server.
+// Check samples/tooltips/tooltip.html to see how it works
+//
+TooltipManager = {
+ options: {cssClassName: 'tooltip', delayOver: 200, delayOut: 1000, shiftX: 10, shiftY: 10,
+ className: 'alphacube', width: 200, height: null,
+ draggable: false, minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide},
+ ajaxInfo: null,
+ elements: null,
+ showTimer: null,
+ hideTimer: null,
+
+ // Init tooltip manager
+ // parameters:
+ // - cssClassName (string) : CSS class name where tooltip should be shown.
+ // - ajaxOptions (hash) : Ajax options for ajax tooltip.
+ // For examples {url: "/tooltip/get.php", options: {method: 'get'}}
+ // see Ajax.Request documentation for details
+ //- tooltipOptions (hash) : available keys
+ // - delayOver: int in ms (default 10) delay before showing tooltip
+ // - delayOut: int in ms (default 1000) delay before hidding tooltip
+ // - shiftX: int in pixels (default 10) left shift of the tooltip window
+ // - shiftY: int in pixels (default 10) top shift of the tooltip window
+ // and All window options like showEffect: Element.show, hideEffect: Element.hide to remove animation
+ // default: {className: 'alphacube', width: 200, height: null, draggable: false, minimizable: false, maximizable: false}
+
+ init: function(cssClassName, ajaxInfo, tooltipOptions) {
+ TooltipManager.options = Object.extend(TooltipManager.options, tooltipOptions || {});
+
+ cssClassName = TooltipManager.options.cssClassName || "tooltip";
+ TooltipManager.ajaxInfo = ajaxInfo;
+ TooltipManager.elements = $$("." + cssClassName);
+ TooltipManager.elements.each(function(element) {
+ element = $(element)
+ var info = TooltipManager._getInfo(element);
+ if (info.ajax) {
+ element.ajaxId = info.id;
+ element.ajaxInfo = ajaxInfo;
+ }
+ else {
+ element.tooltipElement = $(info.id);
+ }
+ element.observe("mouseover", TooltipManager._mouseOver);
+ element.observe("mouseout", TooltipManager._mouseOut);
+ });
+ Windows.addObserver(this);
+ },
+
+ addHTML: function(element, tooltipElement) {
+ element = $(element);
+ tooltipElement = $(tooltipElement);
+ element.tooltipElement = tooltipElement;
+
+ element.observe("mouseover", TooltipManager._mouseOver);
+ element.observe("mouseout", TooltipManager._mouseOut);
+ },
+
+ addAjax: function(element, ajaxInfo) {
+ element = $(element);
+ element.ajaxInfo = ajaxInfo;
+ element.observe("mouseover", TooltipManager._mouseOver);
+ element.observe("mouseout", TooltipManager._mouseOut);
+ },
+
+ addURL: function(element, url, width, height) {
+ element = $(element);
+ element.url = url;
+ element.frameWidth = width;
+ element.frameHeight = height;
+ element.observe("mouseover", TooltipManager._mouseOver);
+ element.observe("mouseout", TooltipManager._mouseOut);
+ },
+
+ close: function() {
+ if (TooltipManager.tooltipWindow)
+ TooltipManager.tooltipWindow.hide();
+ },
+
+ preloadImages: function(path, images, extension) {
+ if (!extension)
+ extension = ".gif";
+
+ //preload images
+ $A(images).each(function(i) {
+ var image = new Image();
+ image.src= path + "/" + i + extension;
+ });
+ },
+
+ _showTooltip: function(element) {
+ if (this.element == element)
+ return;
+ // Get original element
+ while (element && (!element.tooltipElement && !element.ajaxInfo && !element.url))
+ element = element.parentNode;
+ this.element = element;
+
+ TooltipManager.showTimer = null;
+ if (TooltipManager.hideTimer)
+ clearTimeout(TooltipManager.hideTimer);
+
+ var position = Position.cumulativeOffset(element);
+ var dimension = element.getDimensions();
+
+ if (! this.tooltipWindow)
+ this.tooltipWindow = new Window("__tooltip__", TooltipManager.options);
+
+ this.tooltipWindow.hide();
+ this.tooltipWindow.setLocation(position[1] + dimension.height + TooltipManager.options.shiftY, position[0] + TooltipManager.options.shiftX);
+
+ Event.observe(this.tooltipWindow.element, "mouseover", function(event) {TooltipManager._tooltipOver(event, element)});
+ Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
+
+ // Reset width/height for computation
+ this.tooltipWindow.height = TooltipManager.options.height;
+ this.tooltipWindow.width = TooltipManager.options.width;
+
+ // Ajax content
+ if (element.ajaxInfo) {
+ var p = element.ajaxInfo.options.parameters;
+ var saveParam = p;
+
+ // Set by CSS
+ if (element.ajaxId) {
+ if (p)
+ p += "&id=" + element.ajaxId;
+ else
+ p = "id=" + element.ajaxId;
+ }
+ element.ajaxInfo.options.parameters = p || "";
+ this.tooltipWindow.setHTMLContent("");
+ this.tooltipWindow.setAjaxContent(element.ajaxInfo.url, element.ajaxInfo.options);
+ element.ajaxInfo.options.parameters = saveParam;
+ }
+ // URL content
+ else if (element.url) {
+ this.tooltipWindow.setURL(element.url);
+ this.tooltipWindow.setSize(element.frameWidth, element.frameHeight);
+
+ // Set tooltip size
+ this.tooltipWindow.height = element.frameHeight;
+ this.tooltipWindow.width = element.frameWidth;
+ }
+ // HTML content
+ else
+ this.tooltipWindow.setHTMLContent(element.tooltipElement.innerHTML);
+
+ if (!element.ajaxInfo) {
+ this.tooltipWindow.show();
+ this.tooltipWindow.toFront();
+ }
+ },
+
+ _hideTooltip: function(element) {
+ if (this.tooltipWindow) {
+ this.tooltipWindow.hide();
+ this.element = null;
+ }
+ },
+
+ _mouseOver: function (event) {
+ var element = Event.element(event);
+ if (TooltipManager.showTimer)
+ clearTimeout(TooltipManager.showTimer);
+
+ TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver)
+ },
+
+ _mouseOut: function(event) {
+ var element = Event.element(event);
+ if (TooltipManager.showTimer) {
+ clearTimeout(TooltipManager.showTimer);
+ TooltipManager.showTimer = null;
+ return;
+ }
+ if (TooltipManager.tooltipWindow)
+ TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+ },
+
+ _tooltipOver: function(event, element) {
+ if (TooltipManager.hideTimer) {
+ clearTimeout(TooltipManager.hideTimer);
+ TooltipManager.hideTimer = null;
+ }
+ },
+
+ _tooltipOut: function(event, element) {
+ if (TooltipManager.hideTimer == null)
+ TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
+ },
+
+ _getInfo: function(element) {
+ // Find html_ for static content
+ var id = element.className.split(' ').detect(function(name) {return name.indexOf("html_") == 0});
+ var ajax = true;
+ if (id)
+ ajax = false;
+ else
+ // Find ajax_ for ajax content
+ id = element.className.split(' ').detect(function(name) {return name.indexOf("ajax_") == 0});
+
+ id = id.substr(id.indexOf('_')+1, id.length)
+ return id ? {ajax: ajax, id: id} : null;
+ },
+
+ onBeforeShow: function(eventName, win) {
+ var top = parseFloat(win.getLocation().top);
+ var dim = win.element.getDimensions();
+
+ if (top + dim.height > TooltipManager._getScrollTop() + TooltipManager._getPageHeight()) {
+ var position = Position.cumulativeOffset(this.element);
+
+ var top = position[1] - TooltipManager.options.shiftY - dim.height;
+ win.setLocation(top, position[0] + TooltipManager.options.shiftX)
+ }
+ },
+
+ _getPageWidth: function(){
+ return window.innerWidth || document.documentElement.clientWidth || 0;
+ },
+
+ _getPageHeight: function(){
+ return window.innerHeight || document.documentElement.clientHeight || 0;
+ },
+
+ _getScrollTop: function(){
+ return document.documentElement.scrollTop || window.pageYOffset || 0;
+ },
+
+ _getScrollLeft: function(){
+ return document.documentElement.scrollLeft || window.pageXOffset || 0;
+ }
+};
diff --git a/htdocs/includes/scriptaculous/src/window/window.js b/htdocs/includes/scriptaculous/src/window/window.js
new file mode 100644
index 00000000000..5fc2533f879
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/window.js
@@ -0,0 +1,1843 @@
+// Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// VERSION 1.3
+
+var Window = Class.create();
+
+Window.keepMultiModalWindow = false;
+Window.hasEffectLib = (typeof Effect != 'undefined');
+Window.resizeEffectDuration = 0.4;
+
+Window.prototype = {
+ // Constructor
+ // Available parameters : className, blurClassName, title, minWidth, minHeight, maxWidth, maxHeight, width, height, top, left, bottom, right, resizable, zIndex, opacity, recenterAuto, wiredDrag
+ // hideEffect, showEffect, showEffectOptions, hideEffectOptions, effectOptions, url, draggable, closable, minimizable, maximizable, parent, onload
+ // add all callbacks (if you do not use an observer)
+ // onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+
+ initialize: function() {
+ var id;
+ var optionIndex = 0;
+ // For backward compatibility like win= new Window("id", {...}) instead of win = new Window({id: "id", ...})
+ if (arguments.length > 0) {
+ if (typeof arguments[0] == "string" ) {
+ id = arguments[0];
+ optionIndex = 1;
+ }
+ else
+ id = arguments[0] ? arguments[0].id : null;
+ }
+
+ // Generate unique ID if not specified
+ if (!id)
+ id = "window_" + new Date().getTime();
+
+ if ($(id))
+ alert("Window " + id + " is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor");
+
+ this.options = Object.extend({
+ className: "dialog",
+ blurClassName: null,
+ minWidth: 100,
+ minHeight: 20,
+ resizable: true,
+ closable: true,
+ minimizable: true,
+ maximizable: true,
+ draggable: true,
+ userData: null,
+ showEffect: (Window.hasEffectLib ? Effect.Appear : Element.show),
+ hideEffect: (Window.hasEffectLib ? Effect.Fade : Element.hide),
+ showEffectOptions: {},
+ hideEffectOptions: {},
+ effectOptions: null,
+ parent: document.body,
+ title: " ",
+ url: null,
+ onload: Prototype.emptyFunction,
+ width: 200,
+ height: 300,
+ opacity: 1,
+ recenterAuto: true,
+ wiredDrag: false,
+ closeCallback: null,
+ destroyOnClose: false,
+ gridX: 1,
+ gridY: 1
+ }, arguments[optionIndex] || {});
+ if (this.options.blurClassName)
+ this.options.focusClassName = this.options.className;
+
+ if (typeof this.options.top == "undefined" && typeof this.options.bottom == "undefined")
+ this.options.top = this._round(Math.random()*500, this.options.gridY);
+ if (typeof this.options.left == "undefined" && typeof this.options.right == "undefined")
+ this.options.left = this._round(Math.random()*500, this.options.gridX);
+
+ if (this.options.effectOptions) {
+ Object.extend(this.options.hideEffectOptions, this.options.effectOptions);
+ Object.extend(this.options.showEffectOptions, this.options.effectOptions);
+ if (this.options.showEffect == Element.Appear)
+ this.options.showEffectOptions.to = this.options.opacity;
+ }
+ if (Window.hasEffectLib) {
+ if (this.options.showEffect == Effect.Appear)
+ this.options.showEffectOptions.to = this.options.opacity;
+
+ if (this.options.hideEffect == Effect.Fade)
+ this.options.hideEffectOptions.from = this.options.opacity;
+ }
+ if (this.options.hideEffect == Element.hide)
+ this.options.hideEffect = function(){ Element.hide(this.element); if (this.options.destroyOnClose) this.destroy(); }.bind(this)
+
+ if (this.options.parent != document.body)
+ this.options.parent = $(this.options.parent);
+
+ this.element = this._createWindow(id);
+ this.element.win = this;
+
+ // Bind event listener
+ this.eventMouseDown = this._initDrag.bindAsEventListener(this);
+ this.eventMouseUp = this._endDrag.bindAsEventListener(this);
+ this.eventMouseMove = this._updateDrag.bindAsEventListener(this);
+ this.eventOnLoad = this._getWindowBorderSize.bindAsEventListener(this);
+ this.eventMouseDownContent = this.toFront.bindAsEventListener(this);
+ this.eventResize = this._recenter.bindAsEventListener(this);
+
+ this.topbar = $(this.element.id + "_top");
+ this.bottombar = $(this.element.id + "_bottom");
+ this.content = $(this.element.id + "_content");
+
+ Event.observe(this.topbar, "mousedown", this.eventMouseDown);
+ Event.observe(this.bottombar, "mousedown", this.eventMouseDown);
+ Event.observe(this.content, "mousedown", this.eventMouseDownContent);
+ Event.observe(window, "load", this.eventOnLoad);
+ Event.observe(window, "resize", this.eventResize);
+ Event.observe(window, "scroll", this.eventResize);
+ Event.observe(this.options.parent, "scroll", this.eventResize);
+
+ if (this.options.draggable) {
+ var that = this;
+ [this.topbar, this.topbar.up().previous(), this.topbar.up().next()].each(function(element) {
+ element.observe("mousedown", that.eventMouseDown);
+ element.addClassName("top_draggable");
+ });
+ [this.bottombar.up(), this.bottombar.up().previous(), this.bottombar.up().next()].each(function(element) {
+ element.observe("mousedown", that.eventMouseDown);
+ element.addClassName("bottom_draggable");
+ });
+
+ }
+
+ if (this.options.resizable) {
+ this.sizer = $(this.element.id + "_sizer");
+ Event.observe(this.sizer, "mousedown", this.eventMouseDown);
+ }
+
+ this.useLeft = null;
+ this.useTop = null;
+ if (typeof this.options.left != "undefined") {
+ this.element.setStyle({left: parseFloat(this.options.left) + 'px'});
+ this.useLeft = true;
+ }
+ else {
+ this.element.setStyle({right: parseFloat(this.options.right) + 'px'});
+ this.useLeft = false;
+ }
+
+ if (typeof this.options.top != "undefined") {
+ this.element.setStyle({top: parseFloat(this.options.top) + 'px'});
+ this.useTop = true;
+ }
+ else {
+ this.element.setStyle({bottom: parseFloat(this.options.bottom) + 'px'});
+ this.useTop = false;
+ }
+
+ this.storedLocation = null;
+
+ this.setOpacity(this.options.opacity);
+ if (this.options.zIndex)
+ this.setZIndex(this.options.zIndex)
+
+ if (this.options.destroyOnClose)
+ this.setDestroyOnClose(true);
+
+ this._getWindowBorderSize();
+ this.width = this.options.width;
+ this.height = this.options.height;
+ this.visible = false;
+
+ this.constraint = false;
+ this.constraintPad = {top: 0, left:0, bottom:0, right:0};
+
+ if (this.width && this.height)
+ this.setSize(this.options.width, this.options.height);
+ this.setTitle(this.options.title)
+ Windows.register(this);
+ },
+
+ // Destructor
+ destroy: function() {
+ this._notify("onDestroy");
+ Event.stopObserving(this.topbar, "mousedown", this.eventMouseDown);
+ Event.stopObserving(this.bottombar, "mousedown", this.eventMouseDown);
+ Event.stopObserving(this.content, "mousedown", this.eventMouseDownContent);
+
+ Event.stopObserving(window, "load", this.eventOnLoad);
+ Event.stopObserving(window, "resize", this.eventResize);
+ Event.stopObserving(window, "scroll", this.eventResize);
+
+ Event.stopObserving(this.content, "load", this.options.onload);
+
+ if (this._oldParent) {
+ var content = this.getContent();
+ var originalContent = null;
+ for(var i = 0; i < content.childNodes.length; i++) {
+ originalContent = content.childNodes[i];
+ if (originalContent.nodeType == 1)
+ break;
+ originalContent = null;
+ }
+ if (originalContent)
+ this._oldParent.appendChild(originalContent);
+ this._oldParent = null;
+ }
+
+ if (this.sizer)
+ Event.stopObserving(this.sizer, "mousedown", this.eventMouseDown);
+
+ if (this.options.url)
+ this.content.src = null
+
+ if(this.iefix)
+ Element.remove(this.iefix);
+
+ Element.remove(this.element);
+ Windows.unregister(this);
+ },
+
+ // Sets close callback, if it sets, it should return true to be able to close the window.
+ setCloseCallback: function(callback) {
+ this.options.closeCallback = callback;
+ },
+
+ // Gets window content
+ getContent: function () {
+ return this.content;
+ },
+
+ // Sets the content with an element id
+ setContent: function(id, autoresize, autoposition) {
+ var element = $(id);
+ if (null == element) throw "Unable to find element '" + id + "' in DOM";
+ this._oldParent = element.parentNode;
+
+ var d = null;
+ var p = null;
+
+ if (autoresize)
+ d = Element.getDimensions(element);
+ if (autoposition)
+ p = Position.cumulativeOffset(element);
+
+ var content = this.getContent();
+ // Clear HTML (and even iframe)
+ this.setHTMLContent("");
+ content = this.getContent();
+
+ content.appendChild(element);
+ element.show();
+ if (autoresize)
+ this.setSize(d.width, d.height);
+ if (autoposition)
+ this.setLocation(p[1] - this.heightN, p[0] - this.widthW);
+ },
+
+ setHTMLContent: function(html) {
+ // It was an url (iframe), recreate a div content instead of iframe content
+ if (this.options.url) {
+ this.content.src = null;
+ this.options.url = null;
+
+ var content ="
";
+ $(this.getId() +"_table_content").innerHTML = content;
+
+ this.content = $(this.element.id + "_content");
+ }
+
+ this.getContent().innerHTML = html;
+ },
+
+ setAjaxContent: function(url, options, showCentered, showModal) {
+ this.showFunction = showCentered ? "showCenter" : "show";
+ this.showModal = showModal || false;
+
+ options = options || {};
+
+ // Clear HTML (and even iframe)
+ this.setHTMLContent("");
+
+ this.onComplete = options.onComplete;
+ if (! this._onCompleteHandler)
+ this._onCompleteHandler = this._setAjaxContent.bind(this);
+ options.onComplete = this._onCompleteHandler;
+
+ new Ajax.Request(url, options);
+ options.onComplete = this.onComplete;
+ },
+
+ _setAjaxContent: function(originalRequest) {
+ Element.update(this.getContent(), originalRequest.responseText);
+ if (this.onComplete)
+ this.onComplete(originalRequest);
+ this.onComplete = null;
+ this[this.showFunction](this.showModal)
+ },
+
+ setURL: function(url) {
+ // Not an url content, change div to iframe
+ if (this.options.url)
+ this.content.src = null;
+ this.options.url = url;
+ var content= "";
+ $(this.getId() +"_table_content").innerHTML = content;
+
+ this.content = $(this.element.id + "_content");
+ },
+
+ getURL: function() {
+ return this.options.url ? this.options.url : null;
+ },
+
+ refresh: function() {
+ if (this.options.url)
+ $(this.element.getAttribute('id') + '_content').src = this.options.url;
+ },
+
+ // Stores position/size in a cookie, by default named with window id
+ setCookie: function(name, expires, path, domain, secure) {
+ name = name || this.element.id;
+ this.cookie = [name, expires, path, domain, secure];
+
+ // Get cookie
+ var value = WindowUtilities.getCookie(name)
+ // If exists
+ if (value) {
+ var values = value.split(',');
+ var x = values[0].split(':');
+ var y = values[1].split(':');
+
+ var w = parseFloat(values[2]), h = parseFloat(values[3]);
+ var mini = values[4];
+ var maxi = values[5];
+
+ this.setSize(w, h);
+ if (mini == "true")
+ this.doMinimize = true; // Minimize will be done at onload window event
+ else if (maxi == "true")
+ this.doMaximize = true; // Maximize will be done at onload window event
+
+ this.useLeft = x[0] == "l";
+ this.useTop = y[0] == "t";
+
+ this.element.setStyle(this.useLeft ? {left: x[1]} : {right: x[1]});
+ this.element.setStyle(this.useTop ? {top: y[1]} : {bottom: y[1]});
+ }
+ },
+
+ // Gets window ID
+ getId: function() {
+ return this.element.id;
+ },
+
+ // Detroys itself when closing
+ setDestroyOnClose: function() {
+ this.options.destroyOnClose = true;
+ },
+
+ setConstraint: function(bool, padding) {
+ this.constraint = bool;
+ this.constraintPad = Object.extend(this.constraintPad, padding || {});
+ // Reset location to apply constraint
+ if (this.useTop && this.useLeft)
+ this.setLocation(parseFloat(this.element.style.top), parseFloat(this.element.style.left));
+ },
+
+ // initDrag event
+
+ _initDrag: function(event) {
+ // No resize on minimized window
+ if (Event.element(event) == this.sizer && this.isMinimized())
+ return;
+
+ // No move on maximzed window
+ if (Event.element(event) != this.sizer && this.isMaximized())
+ return;
+
+ if (Prototype.Browser.IE && this.heightN == 0)
+ this._getWindowBorderSize();
+
+ // Get pointer X,Y
+ this.pointer = [this._round(Event.pointerX(event), this.options.gridX), this._round(Event.pointerY(event), this.options.gridY)];
+ if (this.options.wiredDrag)
+ this.currentDrag = this._createWiredElement();
+ else
+ this.currentDrag = this.element;
+
+ // Resize
+ if (Event.element(event) == this.sizer) {
+ this.doResize = true;
+ this.widthOrg = this.width;
+ this.heightOrg = this.height;
+ this.bottomOrg = parseFloat(this.element.getStyle('bottom'));
+ this.rightOrg = parseFloat(this.element.getStyle('right'));
+ this._notify("onStartResize");
+ }
+ else {
+ this.doResize = false;
+
+ // Check if click on close button,
+ var closeButton = $(this.getId() + '_close');
+ if (closeButton && Position.within(closeButton, this.pointer[0], this.pointer[1])) {
+ this.currentDrag = null;
+ return;
+ }
+
+ this.toFront();
+
+ if (! this.options.draggable)
+ return;
+ this._notify("onStartMove");
+ }
+ // Register global event to capture mouseUp and mouseMove
+ Event.observe(document, "mouseup", this.eventMouseUp, false);
+ Event.observe(document, "mousemove", this.eventMouseMove, false);
+
+ // Add an invisible div to keep catching mouse event over iframes
+ WindowUtilities.disableScreen('__invisible__', '__invisible__', this.overlayOpacity);
+
+ // Stop selection while dragging
+ document.body.ondrag = function () { return false; };
+ document.body.onselectstart = function () { return false; };
+
+ this.currentDrag.show();
+ Event.stop(event);
+ },
+
+ _round: function(val, round) {
+ return round == 1 ? val : val = Math.floor(val / round) * round;
+ },
+
+ // updateDrag event
+ _updateDrag: function(event) {
+ var pointer = [this._round(Event.pointerX(event), this.options.gridX), this._round(Event.pointerY(event), this.options.gridY)];
+ var dx = pointer[0] - this.pointer[0];
+ var dy = pointer[1] - this.pointer[1];
+
+ // Resize case, update width/height
+ if (this.doResize) {
+ var w = this.widthOrg + dx;
+ var h = this.heightOrg + dy;
+
+ dx = this.width - this.widthOrg
+ dy = this.height - this.heightOrg
+
+ // Check if it's a right position, update it to keep upper-left corner at the same position
+ if (this.useLeft)
+ w = this._updateWidthConstraint(w)
+ else
+ this.currentDrag.setStyle({right: (this.rightOrg -dx) + 'px'});
+ // Check if it's a bottom position, update it to keep upper-left corner at the same position
+ if (this.useTop)
+ h = this._updateHeightConstraint(h)
+ else
+ this.currentDrag.setStyle({bottom: (this.bottomOrg -dy) + 'px'});
+
+ this.setSize(w , h);
+ this._notify("onResize");
+ }
+ // Move case, update top/left
+ else {
+ this.pointer = pointer;
+
+ if (this.useLeft) {
+ var left = parseFloat(this.currentDrag.getStyle('left')) + dx;
+ var newLeft = this._updateLeftConstraint(left);
+ // Keep mouse pointer correct
+ this.pointer[0] += newLeft-left;
+ this.currentDrag.setStyle({left: newLeft + 'px'});
+ }
+ else
+ this.currentDrag.setStyle({right: parseFloat(this.currentDrag.getStyle('right')) - dx + 'px'});
+
+ if (this.useTop) {
+ var top = parseFloat(this.currentDrag.getStyle('top')) + dy;
+ var newTop = this._updateTopConstraint(top);
+ // Keep mouse pointer correct
+ this.pointer[1] += newTop - top;
+ this.currentDrag.setStyle({top: newTop + 'px'});
+ }
+ else
+ this.currentDrag.setStyle({bottom: parseFloat(this.currentDrag.getStyle('bottom')) - dy + 'px'});
+
+ this._notify("onMove");
+ }
+ if (this.iefix)
+ this._fixIEOverlapping();
+
+ this._removeStoreLocation();
+ Event.stop(event);
+ },
+
+ // endDrag callback
+ _endDrag: function(event) {
+ // Remove temporary div over iframes
+ WindowUtilities.enableScreen('__invisible__');
+
+ if (this.doResize)
+ this._notify("onEndResize");
+ else
+ this._notify("onEndMove");
+
+ // Release event observing
+ Event.stopObserving(document, "mouseup", this.eventMouseUp,false);
+ Event.stopObserving(document, "mousemove", this.eventMouseMove, false);
+
+ Event.stop(event);
+
+ this._hideWiredElement();
+
+ // Store new location/size if need be
+ this._saveCookie()
+
+ // Restore selection
+ document.body.ondrag = null;
+ document.body.onselectstart = null;
+ },
+
+ _updateLeftConstraint: function(left) {
+ if (this.constraint && this.useLeft && this.useTop) {
+ var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+
+ if (left < this.constraintPad.left)
+ left = this.constraintPad.left;
+ if (left + this.width + this.widthE + this.widthW > width - this.constraintPad.right)
+ left = width - this.constraintPad.right - this.width - this.widthE - this.widthW;
+ }
+ return left;
+ },
+
+ _updateTopConstraint: function(top) {
+ if (this.constraint && this.useLeft && this.useTop) {
+ var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+
+ var h = this.height + this.heightN + this.heightS;
+
+ if (top < this.constraintPad.top)
+ top = this.constraintPad.top;
+ if (top + h > height - this.constraintPad.bottom)
+ top = height - this.constraintPad.bottom - h;
+ }
+ return top;
+ },
+
+ _updateWidthConstraint: function(w) {
+ if (this.constraint && this.useLeft && this.useTop) {
+ var width = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
+ var left = parseFloat(this.element.getStyle("left"));
+
+ if (left + w + this.widthE + this.widthW > width - this.constraintPad.right)
+ w = width - this.constraintPad.right - left - this.widthE - this.widthW;
+ }
+ return w;
+ },
+
+ _updateHeightConstraint: function(h) {
+ if (this.constraint && this.useLeft && this.useTop) {
+ var height = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
+ var top = parseFloat(this.element.getStyle("top"));
+
+ if (top + h + this.heightN + this.heightS > height - this.constraintPad.bottom)
+ h = height - this.constraintPad.bottom - top - this.heightN - this.heightS;
+ }
+ return h;
+ },
+
+
+ // Creates HTML window code
+ _createWindow: function(id) {
+ var className = this.options.className;
+ var win = document.createElement("div");
+ win.setAttribute('id', id);
+ win.className = "dialog";
+
+ var content;
+ if (this.options.url)
+ content= "";
+ else
+ content ="
";
+
+ var closeDiv = this.options.closable ? "
" : "";
+ var minDiv = this.options.minimizable ? "
" : "";
+ var maxDiv = this.options.maximizable ? "
" : "";
+ var seAttributes = this.options.resizable ? "class='" + className + "_sizer' id='" + id + "_sizer'" : "class='" + className + "_se'";
+ var blank = "../themes/default/blank.gif";
+
+ win.innerHTML = closeDiv + minDiv + maxDiv + "\
+ \
+ \
+ \
+ "+ this.options.title +"
\
+ \
+ \
+
\
+ \
+ \
+ \
+ " + content + " \
+ \
+ \
+
\
+ \
+ ";
+ Element.hide(win);
+ this.options.parent.insertBefore(win, this.options.parent.firstChild);
+ Event.observe($(id + "_content"), "load", this.options.onload);
+ return win;
+ },
+
+
+ changeClassName: function(newClassName) {
+ var className = this.options.className;
+ var id = this.getId();
+ $A(["_close", "_minimize", "_maximize", "_sizer", "_content"]).each(function(value) { this._toggleClassName($(id + value), className + value, newClassName + value) }.bind(this));
+ this._toggleClassName($(id + "_top"), className + "_title", newClassName + "_title");
+ $$("#" + id + " td").each(function(td) {td.className = td.className.sub(className,newClassName); });
+ this.options.className = newClassName;
+ },
+
+ _toggleClassName: function(element, oldClassName, newClassName) {
+ if (element) {
+ element.removeClassName(oldClassName);
+ element.addClassName(newClassName);
+ }
+ },
+
+ // Sets window location
+ setLocation: function(top, left) {
+ top = this._updateTopConstraint(top);
+ left = this._updateLeftConstraint(left);
+
+ var e = this.currentDrag || this.element;
+ e.setStyle({top: top + 'px'});
+ e.setStyle({left: left + 'px'});
+
+ this.useLeft = true;
+ this.useTop = true;
+ },
+
+ getLocation: function() {
+ var location = {};
+ if (this.useTop)
+ location = Object.extend(location, {top: this.element.getStyle("top")});
+ else
+ location = Object.extend(location, {bottom: this.element.getStyle("bottom")});
+ if (this.useLeft)
+ location = Object.extend(location, {left: this.element.getStyle("left")});
+ else
+ location = Object.extend(location, {right: this.element.getStyle("right")});
+
+ return location;
+ },
+
+ // Gets window size
+ getSize: function() {
+ return {width: this.width, height: this.height};
+ },
+
+ // Sets window size
+ setSize: function(width, height, useEffect) {
+ width = parseFloat(width);
+ height = parseFloat(height);
+
+ // Check min and max size
+ if (!this.minimized && width < this.options.minWidth)
+ width = this.options.minWidth;
+
+ if (!this.minimized && height < this.options.minHeight)
+ height = this.options.minHeight;
+
+ if (this.options. maxHeight && height > this.options. maxHeight)
+ height = this.options. maxHeight;
+
+ if (this.options. maxWidth && width > this.options. maxWidth)
+ width = this.options. maxWidth;
+
+
+ if (this.useTop && this.useLeft && Window.hasEffectLib && Effect.ResizeWindow && useEffect) {
+ new Effect.ResizeWindow(this, null, null, width, height, {duration: Window.resizeEffectDuration});
+ } else {
+ this.width = width;
+ this.height = height;
+ var e = this.currentDrag ? this.currentDrag : this.element;
+
+ e.setStyle({width: width + this.widthW + this.widthE + "px"})
+ e.setStyle({height: height + this.heightN + this.heightS + "px"})
+
+ // Update content size
+ if (!this.currentDrag || this.currentDrag == this.element) {
+ var content = $(this.element.id + '_content');
+ content.setStyle({height: height + 'px'});
+ content.setStyle({width: width + 'px'});
+ }
+ }
+ },
+
+ updateHeight: function() {
+ this.setSize(this.width, this.content.scrollHeight, true);
+ },
+
+ updateWidth: function() {
+ this.setSize(this.content.scrollWidth, this.height, true);
+ },
+
+ // Brings window to front
+ toFront: function() {
+ if (this.element.style.zIndex < Windows.maxZIndex)
+ this.setZIndex(Windows.maxZIndex + 1);
+ if (this.iefix)
+ this._fixIEOverlapping();
+ },
+
+ getBounds: function(insideOnly) {
+ if (! this.width || !this.height || !this.visible)
+ this.computeBounds();
+ var w = this.width;
+ var h = this.height;
+
+ if (!insideOnly) {
+ w += this.widthW + this.widthE;
+ h += this.heightN + this.heightS;
+ }
+ var bounds = Object.extend(this.getLocation(), {width: w + "px", height: h + "px"});
+ return bounds;
+ },
+
+ computeBounds: function() {
+ if (! this.width || !this.height) {
+ var size = WindowUtilities._computeSize(this.content.innerHTML, this.content.id, this.width, this.height, 0, this.options.className)
+ if (this.height)
+ this.width = size + 5
+ else
+ this.height = size + 5
+ }
+
+ this.setSize(this.width, this.height);
+ if (this.centered)
+ this._center(this.centerTop, this.centerLeft);
+ },
+
+ // Displays window modal state or not
+ show: function(modal) {
+ this.visible = true;
+ if (modal) {
+ // Hack for Safari !!
+ if (typeof this.overlayOpacity == "undefined") {
+ var that = this;
+ setTimeout(function() {that.show(modal)}, 10);
+ return;
+ }
+ Windows.addModalWindow(this);
+
+ this.modal = true;
+ this.setZIndex(Windows.maxZIndex + 1);
+ Windows.unsetOverflow(this);
+ }
+ else
+ if (!this.element.style.zIndex)
+ this.setZIndex(Windows.maxZIndex + 1);
+
+ // To restore overflow if need be
+ if (this.oldStyle)
+ this.getContent().setStyle({overflow: this.oldStyle});
+
+ this.computeBounds();
+
+ this._notify("onBeforeShow");
+ if (this.options.showEffect != Element.show && this.options.showEffectOptions)
+ this.options.showEffect(this.element, this.options.showEffectOptions);
+ else
+ this.options.showEffect(this.element);
+
+ this._checkIEOverlapping();
+ WindowUtilities.focusedWindow = this
+ this._notify("onShow");
+ },
+
+ // Displays window modal state or not at the center of the page
+ showCenter: function(modal, top, left) {
+ this.centered = true;
+ this.centerTop = top;
+ this.centerLeft = left;
+
+ this.show(modal);
+ },
+
+ isVisible: function() {
+ return this.visible;
+ },
+
+ _center: function(top, left) {
+ var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);
+ var pageSize = WindowUtilities.getPageSize(this.options.parent);
+ if (typeof top == "undefined")
+ top = (pageSize.windowHeight - (this.height + this.heightN + this.heightS))/2;
+ top += windowScroll.top
+
+ if (typeof left == "undefined")
+ left = (pageSize.windowWidth - (this.width + this.widthW + this.widthE))/2;
+ left += windowScroll.left
+ this.setLocation(top, left);
+ this.toFront();
+ },
+
+ _recenter: function(event) {
+ if (this.centered) {
+ var pageSize = WindowUtilities.getPageSize(this.options.parent);
+ var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);
+
+ // Check for this stupid IE that sends dumb events
+ if (this.pageSize && this.pageSize.windowWidth == pageSize.windowWidth && this.pageSize.windowHeight == pageSize.windowHeight &&
+ this.windowScroll.left == windowScroll.left && this.windowScroll.top == windowScroll.top)
+ return;
+ this.pageSize = pageSize;
+ this.windowScroll = windowScroll;
+ // set height of Overlay to take up whole page and show
+ if ($('overlay_modal'))
+ $('overlay_modal').setStyle({height: (pageSize.pageHeight + 'px')});
+
+ if (this.options.recenterAuto)
+ this._center(this.centerTop, this.centerLeft);
+ }
+ },
+
+ // Hides window
+ hide: function() {
+ this.visible = false;
+ if (this.modal) {
+ Windows.removeModalWindow(this);
+ Windows.resetOverflow();
+ }
+ // To avoid bug on scrolling bar
+ this.oldStyle = this.getContent().getStyle('overflow') || "auto"
+ this.getContent().setStyle({overflow: "hidden"});
+
+ this.options.hideEffect(this.element, this.options.hideEffectOptions);
+
+ if(this.iefix)
+ this.iefix.hide();
+
+ if (!this.doNotNotifyHide)
+ this._notify("onHide");
+ },
+
+ close: function() {
+ // Asks closeCallback if exists
+ if (this.visible) {
+ if (this.options.closeCallback && ! this.options.closeCallback(this))
+ return;
+
+ if (this.options.destroyOnClose) {
+ var destroyFunc = this.destroy.bind(this);
+ if (this.options.hideEffectOptions.afterFinish) {
+ var func = this.options.hideEffectOptions.afterFinish;
+ this.options.hideEffectOptions.afterFinish = function() {func();destroyFunc() }
+ }
+ else
+ this.options.hideEffectOptions.afterFinish = function() {destroyFunc() }
+ }
+ Windows.updateFocusedWindow();
+
+ this.doNotNotifyHide = true;
+ this.hide();
+ this.doNotNotifyHide = false;
+ this._notify("onClose");
+ }
+ },
+
+ minimize: function() {
+ if (this.resizing)
+ return;
+
+ var r2 = $(this.getId() + "_row2");
+
+ if (!this.minimized) {
+ this.minimized = true;
+
+ var dh = r2.getDimensions().height;
+ this.r2Height = dh;
+ var h = this.element.getHeight() - dh;
+
+ if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
+ new Effect.ResizeWindow(this, null, null, null, this.height -dh, {duration: Window.resizeEffectDuration});
+ } else {
+ this.height -= dh;
+ this.element.setStyle({height: h + "px"});
+ r2.hide();
+ }
+
+ if (! this.useTop) {
+ var bottom = parseFloat(this.element.getStyle('bottom'));
+ this.element.setStyle({bottom: (bottom + dh) + 'px'});
+ }
+ }
+ else {
+ this.minimized = false;
+
+ var dh = this.r2Height;
+ this.r2Height = null;
+ if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
+ new Effect.ResizeWindow(this, null, null, null, this.height + dh, {duration: Window.resizeEffectDuration});
+ }
+ else {
+ var h = this.element.getHeight() + dh;
+ this.height += dh;
+ this.element.setStyle({height: h + "px"})
+ r2.show();
+ }
+ if (! this.useTop) {
+ var bottom = parseFloat(this.element.getStyle('bottom'));
+ this.element.setStyle({bottom: (bottom - dh) + 'px'});
+ }
+ this.toFront();
+ }
+ this._notify("onMinimize");
+
+ // Store new location/size if need be
+ this._saveCookie()
+ },
+
+ maximize: function() {
+ if (this.isMinimized() || this.resizing)
+ return;
+
+ if (Prototype.Browser.IE && this.heightN == 0)
+ this._getWindowBorderSize();
+
+ if (this.storedLocation != null) {
+ this._restoreLocation();
+ if(this.iefix)
+ this.iefix.hide();
+ }
+ else {
+ this._storeLocation();
+ Windows.unsetOverflow(this);
+
+ var windowScroll = WindowUtilities.getWindowScroll(this.options.parent);
+ var pageSize = WindowUtilities.getPageSize(this.options.parent);
+ var left = windowScroll.left;
+ var top = windowScroll.top;
+
+ if (this.options.parent != document.body) {
+ windowScroll = {top:0, left:0, bottom:0, right:0};
+ var dim = this.options.parent.getDimensions();
+ pageSize.windowWidth = dim.width;
+ pageSize.windowHeight = dim.height;
+ top = 0;
+ left = 0;
+ }
+
+ if (this.constraint) {
+ pageSize.windowWidth -= Math.max(0, this.constraintPad.left) + Math.max(0, this.constraintPad.right);
+ pageSize.windowHeight -= Math.max(0, this.constraintPad.top) + Math.max(0, this.constraintPad.bottom);
+ left += Math.max(0, this.constraintPad.left);
+ top += Math.max(0, this.constraintPad.top);
+ }
+
+ var width = pageSize.windowWidth - this.widthW - this.widthE;
+ var height= pageSize.windowHeight - this.heightN - this.heightS;
+
+ if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
+ new Effect.ResizeWindow(this, top, left, width, height, {duration: Window.resizeEffectDuration});
+ }
+ else {
+ this.setSize(width, height);
+ this.element.setStyle(this.useLeft ? {left: left} : {right: left});
+ this.element.setStyle(this.useTop ? {top: top} : {bottom: top});
+ }
+
+ this.toFront();
+ if (this.iefix)
+ this._fixIEOverlapping();
+ }
+ this._notify("onMaximize");
+
+ // Store new location/size if need be
+ this._saveCookie()
+ },
+
+ isMinimized: function() {
+ return this.minimized;
+ },
+
+ isMaximized: function() {
+ return (this.storedLocation != null);
+ },
+
+ setOpacity: function(opacity) {
+ if (Element.setOpacity)
+ Element.setOpacity(this.element, opacity);
+ },
+
+ setZIndex: function(zindex) {
+ this.element.setStyle({zIndex: zindex});
+ Windows.updateZindex(zindex, this);
+ },
+
+ setTitle: function(newTitle) {
+ if (!newTitle || newTitle == "")
+ newTitle = " ";
+
+ Element.update(this.element.id + '_top', newTitle);
+ },
+
+ getTitle: function() {
+ return $(this.element.id + '_top').innerHTML;
+ },
+
+ setStatusBar: function(element) {
+ var statusBar = $(this.getId() + "_bottom");
+
+ if (typeof(element) == "object") {
+ if (this.bottombar.firstChild)
+ this.bottombar.replaceChild(element, this.bottombar.firstChild);
+ else
+ this.bottombar.appendChild(element);
+ }
+ else
+ this.bottombar.innerHTML = element;
+ },
+
+ _checkIEOverlapping: function() {
+ if(!this.iefix && (navigator.appVersion.indexOf('MSIE')>0) && (navigator.userAgent.indexOf('Opera')<0) && (this.element.getStyle('position')=='absolute')) {
+ new Insertion.After(this.element.id, '');
+ this.iefix = $(this.element.id+'_iefix');
+ }
+ if(this.iefix)
+ setTimeout(this._fixIEOverlapping.bind(this), 50);
+ },
+
+ _fixIEOverlapping: function() {
+ Position.clone(this.element, this.iefix);
+ this.iefix.style.zIndex = this.element.style.zIndex - 1;
+ this.iefix.show();
+ },
+
+ _getWindowBorderSize: function(event) {
+ // Hack to get real window border size!!
+ var div = this._createHiddenDiv(this.options.className + "_n")
+ this.heightN = Element.getDimensions(div).height;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.options.className + "_s")
+ this.heightS = Element.getDimensions(div).height;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.options.className + "_e")
+ this.widthE = Element.getDimensions(div).width;
+ div.parentNode.removeChild(div)
+
+ var div = this._createHiddenDiv(this.options.className + "_w")
+ this.widthW = Element.getDimensions(div).width;
+ div.parentNode.removeChild(div);
+
+ var div = document.createElement("div");
+ div.className = "overlay_" + this.options.className ;
+ document.body.appendChild(div);
+ //alert("no timeout:\nopacity: " + div.getStyle("opacity") + "\nwidth: " + document.defaultView.getComputedStyle(div, null).width);
+ var that = this;
+
+ // Workaround for Safari!!
+ setTimeout(function() {that.overlayOpacity = ($(div).getStyle("opacity")); div.parentNode.removeChild(div);}, 10);
+
+ // Workaround for IE!!
+ if (Prototype.Browser.IE) {
+ this.heightS = $(this.getId() +"_row3").getDimensions().height;
+ this.heightN = $(this.getId() +"_row1").getDimensions().height;
+ }
+
+ // Safari size fix
+ if (Prototype.Browser.WebKit && Prototype.Browser.WebKitVersion < 420)
+ this.setSize(this.width, this.height);
+ if (this.doMaximize)
+ this.maximize();
+ if (this.doMinimize)
+ this.minimize();
+ },
+
+ _createHiddenDiv: function(className) {
+ var objBody = document.body;
+ var win = document.createElement("div");
+ win.setAttribute('id', this.element.id+ "_tmp");
+ win.className = className;
+ win.style.display = 'none';
+ win.innerHTML = '';
+ objBody.insertBefore(win, objBody.firstChild);
+ return win;
+ },
+
+ _storeLocation: function() {
+ if (this.storedLocation == null) {
+ this.storedLocation = {useTop: this.useTop, useLeft: this.useLeft,
+ top: this.element.getStyle('top'), bottom: this.element.getStyle('bottom'),
+ left: this.element.getStyle('left'), right: this.element.getStyle('right'),
+ width: this.width, height: this.height };
+ }
+ },
+
+ _restoreLocation: function() {
+ if (this.storedLocation != null) {
+ this.useLeft = this.storedLocation.useLeft;
+ this.useTop = this.storedLocation.useTop;
+
+ if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow)
+ new Effect.ResizeWindow(this, this.storedLocation.top, this.storedLocation.left, this.storedLocation.width, this.storedLocation.height, {duration: Window.resizeEffectDuration});
+ else {
+ this.element.setStyle(this.useLeft ? {left: this.storedLocation.left} : {right: this.storedLocation.right});
+ this.element.setStyle(this.useTop ? {top: this.storedLocation.top} : {bottom: this.storedLocation.bottom});
+ this.setSize(this.storedLocation.width, this.storedLocation.height);
+ }
+
+ Windows.resetOverflow();
+ this._removeStoreLocation();
+ }
+ },
+
+ _removeStoreLocation: function() {
+ this.storedLocation = null;
+ },
+
+ _saveCookie: function() {
+ if (this.cookie) {
+ var value = "";
+ if (this.useLeft)
+ value += "l:" + (this.storedLocation ? this.storedLocation.left : this.element.getStyle('left'))
+ else
+ value += "r:" + (this.storedLocation ? this.storedLocation.right : this.element.getStyle('right'))
+ if (this.useTop)
+ value += ",t:" + (this.storedLocation ? this.storedLocation.top : this.element.getStyle('top'))
+ else
+ value += ",b:" + (this.storedLocation ? this.storedLocation.bottom :this.element.getStyle('bottom'))
+
+ value += "," + (this.storedLocation ? this.storedLocation.width : this.width);
+ value += "," + (this.storedLocation ? this.storedLocation.height : this.height);
+ value += "," + this.isMinimized();
+ value += "," + this.isMaximized();
+ WindowUtilities.setCookie(value, this.cookie)
+ }
+ },
+
+ _createWiredElement: function() {
+ if (! this.wiredElement) {
+ if (Prototype.Browser.IE)
+ this._getWindowBorderSize();
+ var div = document.createElement("div");
+ div.className = "wired_frame " + this.options.className + "_wired_frame";
+
+ div.style.position = 'absolute';
+ this.options.parent.insertBefore(div, this.options.parent.firstChild);
+ this.wiredElement = $(div);
+ }
+ if (this.useLeft)
+ this.wiredElement.setStyle({left: this.element.getStyle('left')});
+ else
+ this.wiredElement.setStyle({right: this.element.getStyle('right')});
+
+ if (this.useTop)
+ this.wiredElement.setStyle({top: this.element.getStyle('top')});
+ else
+ this.wiredElement.setStyle({bottom: this.element.getStyle('bottom')});
+
+ var dim = this.element.getDimensions();
+ this.wiredElement.setStyle({width: dim.width + "px", height: dim.height +"px"});
+
+ this.wiredElement.setStyle({zIndex: Windows.maxZIndex+30});
+ return this.wiredElement;
+ },
+
+ _hideWiredElement: function() {
+ if (! this.wiredElement || ! this.currentDrag)
+ return;
+ if (this.currentDrag == this.element)
+ this.currentDrag = null;
+ else {
+ if (this.useLeft)
+ this.element.setStyle({left: this.currentDrag.getStyle('left')});
+ else
+ this.element.setStyle({right: this.currentDrag.getStyle('right')});
+
+ if (this.useTop)
+ this.element.setStyle({top: this.currentDrag.getStyle('top')});
+ else
+ this.element.setStyle({bottom: this.currentDrag.getStyle('bottom')});
+
+ this.currentDrag.hide();
+ this.currentDrag = null;
+ if (this.doResize)
+ this.setSize(this.width, this.height);
+ }
+ },
+
+ _notify: function(eventName) {
+ if (this.options[eventName])
+ this.options[eventName](this);
+ else
+ Windows.notify(eventName, this);
+ }
+};
+
+// Windows containers, register all page windows
+var Windows = {
+ windows: [],
+ modalWindows: [],
+ observers: [],
+ focusedWindow: null,
+ maxZIndex: 0,
+ overlayShowEffectOptions: {duration: 0.5},
+ overlayHideEffectOptions: {duration: 0.5},
+
+ addObserver: function(observer) {
+ this.removeObserver(observer);
+ this.observers.push(observer);
+ },
+
+ removeObserver: function(observer) {
+ this.observers = this.observers.reject( function(o) { return o==observer });
+ },
+
+ // onDestroy onStartResize onStartMove onResize onMove onEndResize onEndMove onFocus onBlur onBeforeShow onShow onHide onMinimize onMaximize onClose
+ notify: function(eventName, win) {
+ this.observers.each( function(o) {if(o[eventName]) o[eventName](eventName, win);});
+ },
+
+ // Gets window from its id
+ getWindow: function(id) {
+ return this.windows.detect(function(d) { return d.getId() ==id });
+ },
+
+ // Gets the last focused window
+ getFocusedWindow: function() {
+ return this.focusedWindow;
+ },
+
+ updateFocusedWindow: function() {
+ this.focusedWindow = this.windows.length >=2 ? this.windows[this.windows.length-2] : null;
+ },
+
+ // Registers a new window (called by Windows constructor)
+ register: function(win) {
+ this.windows.push(win);
+ },
+
+ // Add a modal window in the stack
+ addModalWindow: function(win) {
+ // Disable screen if first modal window
+ if (this.modalWindows.length == 0) {
+ WindowUtilities.disableScreen(win.options.className, 'overlay_modal', win.overlayOpacity, win.getId(), win.options.parent);
+ }
+ else {
+ // Move overlay over all windows
+ if (Window.keepMultiModalWindow) {
+ $('overlay_modal').style.zIndex = Windows.maxZIndex + 1;
+ Windows.maxZIndex += 1;
+ WindowUtilities._hideSelect(this.modalWindows.last().getId());
+ }
+ // Hide current modal window
+ else
+ this.modalWindows.last().element.hide();
+ // Fucking IE select issue
+ WindowUtilities._showSelect(win.getId());
+ }
+ this.modalWindows.push(win);
+ },
+
+ removeModalWindow: function(win) {
+ this.modalWindows.pop();
+
+ // No more modal windows
+ if (this.modalWindows.length == 0)
+ WindowUtilities.enableScreen();
+ else {
+ if (Window.keepMultiModalWindow) {
+ this.modalWindows.last().toFront();
+ WindowUtilities._showSelect(this.modalWindows.last().getId());
+ }
+ else
+ this.modalWindows.last().element.show();
+ }
+ },
+
+ // Registers a new window (called by Windows constructor)
+ register: function(win) {
+ this.windows.push(win);
+ },
+
+ // Unregisters a window (called by Windows destructor)
+ unregister: function(win) {
+ this.windows = this.windows.reject(function(d) { return d==win });
+ },
+
+ // Closes all windows
+ closeAll: function() {
+ this.windows.each( function(w) {Windows.close(w.getId())} );
+ },
+
+ closeAllModalWindows: function() {
+ WindowUtilities.enableScreen();
+ this.modalWindows.each( function(win) {if (win) win.close()});
+ },
+
+ // Minimizes a window with its id
+ minimize: function(id, event) {
+ var win = this.getWindow(id)
+ if (win && win.visible)
+ win.minimize();
+ Event.stop(event);
+ },
+
+ // Maximizes a window with its id
+ maximize: function(id, event) {
+ var win = this.getWindow(id)
+ if (win && win.visible)
+ win.maximize();
+ Event.stop(event);
+ },
+
+ // Closes a window with its id
+ close: function(id, event) {
+ var win = this.getWindow(id);
+ if (win)
+ win.close();
+ if (event)
+ Event.stop(event);
+ },
+
+ blur: function(id) {
+ var win = this.getWindow(id);
+ if (!win)
+ return;
+ if (win.options.blurClassName)
+ win.changeClassName(win.options.blurClassName);
+ if (this.focusedWindow == win)
+ this.focusedWindow = null;
+ win._notify("onBlur");
+ },
+
+ focus: function(id) {
+ var win = this.getWindow(id);
+ if (!win)
+ return;
+ if (this.focusedWindow)
+ this.blur(this.focusedWindow.getId())
+
+ if (win.options.focusClassName)
+ win.changeClassName(win.options.focusClassName);
+ this.focusedWindow = win;
+ win._notify("onFocus");
+ },
+
+ unsetOverflow: function(except) {
+ this.windows.each(function(d) { d.oldOverflow = d.getContent().getStyle("overflow") || "auto" ; d.getContent().setStyle({overflow: "hidden"}) });
+ if (except && except.oldOverflow)
+ except.getContent().setStyle({overflow: except.oldOverflow});
+ },
+
+ resetOverflow: function() {
+ this.windows.each(function(d) { if (d.oldOverflow) d.getContent().setStyle({overflow: d.oldOverflow}) });
+ },
+
+ updateZindex: function(zindex, win) {
+ if (zindex > this.maxZIndex) {
+ this.maxZIndex = zindex;
+ if (this.focusedWindow)
+ this.blur(this.focusedWindow.getId())
+ }
+ this.focusedWindow = win;
+ if (this.focusedWindow)
+ this.focus(this.focusedWindow.getId())
+ }
+};
+
+var Dialog = {
+ dialogId: null,
+ onCompleteFunc: null,
+ callFunc: null,
+ parameters: null,
+
+ confirm: function(content, parameters) {
+ // Get Ajax return before
+ if (content && typeof content != "string") {
+ Dialog._runAjaxRequest(content, parameters, Dialog.confirm);
+ return
+ }
+ content = content || "";
+
+ parameters = parameters || {};
+ var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+ var cancelLabel = parameters.cancelLabel ? parameters.cancelLabel : "Cancel";
+
+ // Backward compatibility
+ parameters = Object.extend(parameters, parameters.windowParameters || {});
+ parameters.windowParameters = parameters.windowParameters || {};
+
+ parameters.className = parameters.className || "alert";
+
+ var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+ var cancelButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " cancel_button'"
+ var content = "\
+ " + content + "
\
+ \
+ \
+ \
+
\
+ ";
+ return this._openDialog(content, parameters)
+ },
+
+ alert: function(content, parameters) {
+ // Get Ajax return before
+ if (content && typeof content != "string") {
+ Dialog._runAjaxRequest(content, parameters, Dialog.alert);
+ return
+ }
+ content = content || "";
+
+ parameters = parameters || {};
+ var okLabel = parameters.okLabel ? parameters.okLabel : "Ok";
+
+ // Backward compatibility
+ parameters = Object.extend(parameters, parameters.windowParameters || {});
+ parameters.windowParameters = parameters.windowParameters || {};
+
+ parameters.className = parameters.className || "alert";
+
+ var okButtonClass = "class ='" + (parameters.buttonClass ? parameters.buttonClass + " " : "") + " ok_button'"
+ var content = "\
+ " + content + "
\
+ \
+ \
+
";
+ return this._openDialog(content, parameters)
+ },
+
+ info: function(content, parameters) {
+ // Get Ajax return before
+ if (content && typeof content != "string") {
+ Dialog._runAjaxRequest(content, parameters, Dialog.info);
+ return
+ }
+ content = content || "";
+
+ // Backward compatibility
+ parameters = parameters || {};
+ parameters = Object.extend(parameters, parameters.windowParameters || {});
+ parameters.windowParameters = parameters.windowParameters || {};
+
+ parameters.className = parameters.className || "alert";
+
+ var content = "" + content + "
";
+ if (parameters.showProgress)
+ content += "
";
+
+ parameters.ok = null;
+ parameters.cancel = null;
+
+ return this._openDialog(content, parameters)
+ },
+
+ setInfoMessage: function(message) {
+ $('modal_dialog_message').update(message);
+ },
+
+ closeInfo: function() {
+ Windows.close(this.dialogId);
+ },
+
+ _openDialog: function(content, parameters) {
+ var className = parameters.className;
+
+ if (! parameters.height && ! parameters.width) {
+ parameters.width = WindowUtilities.getPageSize(parameters.options.parent || document.body).pageWidth / 2;
+ }
+ if (parameters.id)
+ this.dialogId = parameters.id;
+ else {
+ var t = new Date();
+ this.dialogId = 'modal_dialog_' + t.getTime();
+ parameters.id = this.dialogId;
+ }
+
+ // compute height or width if need be
+ if (! parameters.height || ! parameters.width) {
+ var size = WindowUtilities._computeSize(content, this.dialogId, parameters.width, parameters.height, 5, className)
+ if (parameters.height)
+ parameters.width = size + 5
+ else
+ parameters.height = size + 5
+ }
+ parameters.effectOptions = parameters.effectOptions ;
+ parameters.resizable = parameters.resizable || false;
+ parameters.minimizable = parameters.minimizable || false;
+ parameters.maximizable = parameters.maximizable || false;
+ parameters.draggable = parameters.draggable || false;
+ parameters.closable = parameters.closable || false;
+
+ var win = new Window(parameters);
+ win.getContent().innerHTML = content;
+
+ win.showCenter(true, parameters.top, parameters.left);
+ win.setDestroyOnClose();
+
+ win.cancelCallback = parameters.onCancel || parameters.cancel;
+ win.okCallback = parameters.onOk || parameters.ok;
+
+ return win;
+ },
+
+ _getAjaxContent: function(originalRequest) {
+ Dialog.callFunc(originalRequest.responseText, Dialog.parameters)
+ },
+
+ _runAjaxRequest: function(message, parameters, callFunc) {
+ if (message.options == null)
+ message.options = {}
+ Dialog.onCompleteFunc = message.options.onComplete;
+ Dialog.parameters = parameters;
+ Dialog.callFunc = callFunc;
+
+ message.options.onComplete = Dialog._getAjaxContent;
+ new Ajax.Request(message.url, message.options);
+ },
+
+ okCallback: function() {
+ var win = Windows.focusedWindow;
+ if (!win.okCallback || win.okCallback(win)) {
+ // Remove onclick on button
+ $$("#" + win.getId()+" input").each(function(element) {element.onclick=null;})
+ win.close();
+ }
+ },
+
+ cancelCallback: function() {
+ var win = Windows.focusedWindow;
+ // Remove onclick on button
+ $$("#" + win.getId()+" input").each(function(element) {element.onclick=null})
+ win.close();
+ if (win.cancelCallback)
+ win.cancelCallback(win);
+ }
+}
+/*
+ Based on Lightbox JS: Fullsize Image Overlays
+ by Lokesh Dhakar - http://www.huddletogether.com
+
+ For more information on this script, visit:
+ http://huddletogether.com/projects/lightbox/
+
+ Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
+ (basically, do anything you want, just leave my name and link)
+*/
+
+if (Prototype.Browser.WebKit) {
+ var array = navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));
+ Prototype.Browser.WebKitVersion = parseFloat(array[1]);
+}
+
+var WindowUtilities = {
+ // From dragdrop.js
+ getWindowScroll: function(parent) {
+ var T, L, W, H;
+ parent = parent || document.body;
+ if (parent != document.body) {
+ T = parent.scrollTop;
+ L = parent.scrollLeft;
+ W = parent.scrollWidth;
+ H = parent.scrollHeight;
+ }
+ else {
+ var w = window;
+ with (w.document) {
+ if (w.document.documentElement && documentElement.scrollTop) {
+ T = documentElement.scrollTop;
+ L = documentElement.scrollLeft;
+ } else if (w.document.body) {
+ T = body.scrollTop;
+ L = body.scrollLeft;
+ }
+ if (w.innerWidth) {
+ W = w.innerWidth;
+ H = w.innerHeight;
+ } else if (w.document.documentElement && documentElement.clientWidth) {
+ W = documentElement.clientWidth;
+ H = documentElement.clientHeight;
+ } else {
+ W = body.offsetWidth;
+ H = body.offsetHeight
+ }
+ }
+ }
+ return { top: T, left: L, width: W, height: H };
+ },
+ //
+ // getPageSize()
+ // Returns array with page width, height and window width, height
+ // Core code from - quirksmode.org
+ // Edit for Firefox by pHaez
+ //
+ getPageSize: function(parent){
+ parent = parent || document.body;
+ var windowWidth, windowHeight;
+ var pageHeight, pageWidth;
+ if (parent != document.body) {
+ windowWidth = parent.getWidth();
+ windowHeight = parent.getHeight();
+ pageWidth = parent.scrollWidth;
+ pageHeight = parent.scrollHeight;
+ }
+ else {
+ var xScroll, yScroll;
+
+ if (window.innerHeight && window.scrollMaxY) {
+ xScroll = document.body.scrollWidth;
+ yScroll = window.innerHeight + window.scrollMaxY;
+ } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
+ xScroll = document.body.scrollWidth;
+ yScroll = document.body.scrollHeight;
+ } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
+ xScroll = document.body.offsetWidth;
+ yScroll = document.body.offsetHeight;
+ }
+
+
+ if (self.innerHeight) { // all except Explorer
+ windowWidth = self.innerWidth;
+ windowHeight = self.innerHeight;
+ } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
+ windowWidth = document.documentElement.clientWidth;
+ windowHeight = document.documentElement.clientHeight;
+ } else if (document.body) { // other Explorers
+ windowWidth = document.body.clientWidth;
+ windowHeight = document.body.clientHeight;
+ }
+
+ // for small pages with total height less then height of the viewport
+ if(yScroll < windowHeight){
+ pageHeight = windowHeight;
+ } else {
+ pageHeight = yScroll;
+ }
+
+ // for small pages with total width less then width of the viewport
+ if(xScroll < windowWidth){
+ pageWidth = windowWidth;
+ } else {
+ pageWidth = xScroll;
+ }
+ }
+ return {pageWidth: pageWidth ,pageHeight: pageHeight , windowWidth: windowWidth, windowHeight: windowHeight};
+ },
+
+ disableScreen: function(className, overlayId, overlayOpacity, contentId, parent) {
+ WindowUtilities.initLightbox(overlayId, className, function() {this._disableScreen(className, overlayId, overlayOpacity, contentId)}.bind(this), parent || document.body);
+ },
+
+ _disableScreen: function(className, overlayId, overlayOpacity, contentId) {
+ // prep objects
+ var objOverlay = $(overlayId);
+
+ var pageSize = WindowUtilities.getPageSize(objOverlay.parentNode);
+
+ // Hide select boxes as they will 'peek' through the image in IE, store old value
+ if (contentId && Prototype.Browser.IE) {
+ WindowUtilities._hideSelect();
+ WindowUtilities._showSelect(contentId);
+ }
+
+ // set height of Overlay to take up whole page and show
+ objOverlay.style.height = (pageSize.pageHeight + 'px');
+ objOverlay.style.display = 'none';
+ if (overlayId == "overlay_modal" && Window.hasEffectLib && Windows.overlayShowEffectOptions) {
+ objOverlay.overlayOpacity = overlayOpacity;
+ new Effect.Appear(objOverlay, Object.extend({from: 0, to: overlayOpacity}, Windows.overlayShowEffectOptions));
+ }
+ else
+ objOverlay.style.display = "block";
+ },
+
+ enableScreen: function(id) {
+ id = id || 'overlay_modal';
+ var objOverlay = $(id);
+ if (objOverlay) {
+ // hide lightbox and overlay
+ if (id == "overlay_modal" && Window.hasEffectLib && Windows.overlayHideEffectOptions)
+ new Effect.Fade(objOverlay, Object.extend({from: objOverlay.overlayOpacity, to:0}, Windows.overlayHideEffectOptions));
+ else {
+ objOverlay.style.display = 'none';
+ objOverlay.parentNode.removeChild(objOverlay);
+ }
+
+ // make select boxes visible using old value
+ if (id != "__invisible__")
+ WindowUtilities._showSelect();
+ }
+ },
+
+ _hideSelect: function(id) {
+ if (Prototype.Browser.IE) {
+ id = id == null ? "" : "#" + id + " ";
+ $$(id + 'select').each(function(element) {
+ if (! WindowUtilities.isDefined(element.oldVisibility)) {
+ element.oldVisibility = element.style.visibility ? element.style.visibility : "visible";
+ element.style.visibility = "hidden";
+ }
+ });
+ }
+ },
+
+ _showSelect: function(id) {
+ if (Prototype.Browser.IE) {
+ id = id == null ? "" : "#" + id + " ";
+ $$(id + 'select').each(function(element) {
+ if (WindowUtilities.isDefined(element.oldVisibility)) {
+ // Why?? Ask IE
+ try {
+ element.style.visibility = element.oldVisibility;
+ } catch(e) {
+ element.style.visibility = "visible";
+ }
+ element.oldVisibility = null;
+ }
+ else {
+ if (element.style.visibility)
+ element.style.visibility = "visible";
+ }
+ });
+ }
+ },
+
+ isDefined: function(object) {
+ return typeof(object) != "undefined" && object != null;
+ },
+
+ // initLightbox()
+ // Function runs on window load, going through link tags looking for rel="lightbox".
+ // These links receive onclick events that enable the lightbox display for their targets.
+ // The function also inserts html markup at the top of the page which will be used as a
+ // container for the overlay pattern and the inline image.
+ initLightbox: function(id, className, doneHandler, parent) {
+ // Already done, just update zIndex
+ if ($(id)) {
+ Element.setStyle(id, {zIndex: Windows.maxZIndex + 1});
+ Windows.maxZIndex++;
+ doneHandler();
+ }
+ // create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)
+ else {
+ var objOverlay = document.createElement("div");
+ objOverlay.setAttribute('id', id);
+ objOverlay.className = "overlay_" + className
+ objOverlay.style.display = 'none';
+ objOverlay.style.position = 'absolute';
+ objOverlay.style.top = '0';
+ objOverlay.style.left = '0';
+ objOverlay.style.zIndex = Windows.maxZIndex + 1;
+ Windows.maxZIndex++;
+ objOverlay.style.width = '100%';
+ parent.insertBefore(objOverlay, parent.firstChild);
+ if (Prototype.Browser.WebKit && id == "overlay_modal") {
+ setTimeout(function() {doneHandler()}, 10);
+ }
+ else
+ doneHandler();
+ }
+ },
+
+ setCookie: function(value, parameters) {
+ document.cookie= parameters[0] + "=" + escape(value) +
+ ((parameters[1]) ? "; expires=" + parameters[1].toGMTString() : "") +
+ ((parameters[2]) ? "; path=" + parameters[2] : "") +
+ ((parameters[3]) ? "; domain=" + parameters[3] : "") +
+ ((parameters[4]) ? "; secure" : "");
+ },
+
+ getCookie: function(name) {
+ var dc = document.cookie;
+ var prefix = name + "=";
+ var begin = dc.indexOf("; " + prefix);
+ if (begin == -1) {
+ begin = dc.indexOf(prefix);
+ if (begin != 0) return null;
+ } else {
+ begin += 2;
+ }
+ var end = document.cookie.indexOf(";", begin);
+ if (end == -1) {
+ end = dc.length;
+ }
+ return unescape(dc.substring(begin + prefix.length, end));
+ },
+
+ _computeSize: function(content, id, width, height, margin, className) {
+ var objBody = document.body;
+ var tmpObj = document.createElement("div");
+ tmpObj.setAttribute('id', id);
+ tmpObj.className = className + "_content";
+
+ if (height)
+ tmpObj.style.height = height + "px"
+ else
+ tmpObj.style.width = width + "px"
+
+ tmpObj.style.position = 'absolute';
+ tmpObj.style.top = '0';
+ tmpObj.style.left = '0';
+ tmpObj.style.display = 'none';
+
+ tmpObj.innerHTML = content;
+ objBody.insertBefore(tmpObj, objBody.firstChild);
+
+ var size;
+ if (height)
+ size = $(tmpObj).getDimensions().width + margin;
+ else
+ size = $(tmpObj).getDimensions().height + margin;
+ objBody.removeChild(tmpObj);
+ return size;
+ }
+}
+
diff --git a/htdocs/includes/scriptaculous/src/window/window_effects.js b/htdocs/includes/scriptaculous/src/window/window_effects.js
new file mode 100644
index 00000000000..6ad73cc052e
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/window_effects.js
@@ -0,0 +1,157 @@
+Effect.ResizeWindow = Class.create();
+Object.extend(Object.extend(Effect.ResizeWindow.prototype, Effect.Base.prototype), {
+ initialize: function(win, top, left, width, height) {
+ this.window = win;
+ this.window.resizing = true;
+
+ var size = win.getSize();
+ this.initWidth = parseFloat(size.width);
+ this.initHeight = parseFloat(size.height);
+
+ var location = win.getLocation();
+ this.initTop = parseFloat(location.top);
+ this.initLeft = parseFloat(location.left);
+
+ this.width = width != null ? parseFloat(width) : this.initWidth;
+ this.height = height != null ? parseFloat(height) : this.initHeight;
+ this.top = top != null ? parseFloat(top) : this.initTop;
+ this.left = left != null ? parseFloat(left) : this.initLeft;
+
+ this.dx = this.left - this.initLeft;
+ this.dy = this.top - this.initTop;
+ this.dw = this.width - this.initWidth;
+ this.dh = this.height - this.initHeight;
+
+ this.r2 = $(this.window.getId() + "_row2");
+ this.content = $(this.window.getId() + "_content");
+
+ this.contentOverflow = this.content.getStyle("overflow") || "auto";
+ this.content.setStyle({overflow: "hidden"});
+
+ // Wired mode
+ if (this.window.options.wiredDrag) {
+ this.window.currentDrag = win._createWiredElement();
+ this.window.currentDrag.show();
+ this.window.element.hide();
+ }
+
+ this.start(arguments[5]);
+ },
+
+ update: function(position) {
+ var width = Math.floor(this.initWidth + this.dw * position);
+ var height = Math.floor(this.initHeight + this.dh * position);
+ var top = Math.floor(this.initTop + this.dy * position);
+ var left = Math.floor(this.initLeft + this.dx * position);
+
+ if (window.ie) {
+ if (Math.floor(height) == 0)
+ this.r2.hide();
+ else if (Math.floor(height) >1)
+ this.r2.show();
+ }
+ this.r2.setStyle({height: height});
+ this.window.setSize(width, height);
+ this.window.setLocation(top, left);
+ },
+
+ finish: function(position) {
+ // Wired mode
+ if (this.window.options.wiredDrag) {
+ this.window._hideWiredElement();
+ this.window.element.show();
+ }
+
+ this.window.setSize(this.width, this.height);
+ this.window.setLocation(this.top, this.left);
+ this.r2.setStyle({height: null});
+
+ this.content.setStyle({overflow: this.contentOverflow});
+
+ this.window.resizing = false;
+ }
+});
+
+Effect.ModalSlideDown = function(element) {
+ var windowScroll = WindowUtilities.getWindowScroll();
+ var height = element.getStyle("height");
+ element.setStyle({top: - (parseFloat(height) - windowScroll.top) + "px"});
+
+ element.show();
+ return new Effect.Move(element, Object.extend({ x: 0, y: parseFloat(height) }, arguments[1] || {}));
+};
+
+
+Effect.ModalSlideUp = function(element) {
+ var height = element.getStyle("height");
+ return new Effect.Move(element, Object.extend({ x: 0, y: -parseFloat(height) }, arguments[1] || {}));
+};
+
+PopupEffect = Class.create();
+PopupEffect.prototype = {
+ initialize: function(htmlElement) {
+ this.html = $(htmlElement);
+ this.options = Object.extend({className: "popup_effect", duration: 0.4}, arguments[1] || {});
+
+ },
+ show: function(element, options) {
+ var position = Position.cumulativeOffset(this.html);
+ var size = this.html.getDimensions();
+ var bounds = element.win.getBounds();
+ this.window = element.win;
+ // Create a div
+ if (!this.div) {
+ this.div = document.createElement("div");
+ this.div.className = this.options.className;
+ this.div.style.height = size.height + "px";
+ this.div.style.width = size.width + "px";
+ this.div.style.top = position[1] + "px";
+ this.div.style.left = position[0] + "px";
+ this.div.style.position = "absolute"
+ document.body.appendChild(this.div);
+ }
+ if (this.options.fromOpacity)
+ this.div.setStyle({opacity: this.options.fromOpacity})
+ this.div.show();
+ var style = "top:" + bounds.top + ";left:" +bounds.left + ";width:" + bounds.width +";height:" + bounds.height;
+ if (this.options.toOpacity)
+ style += ";opacity:" + this.options.toOpacity;
+
+ new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._showWindow.bind(this)});
+ },
+
+ hide: function(element, options) {
+ var position = Position.cumulativeOffset(this.html);
+ var size = this.html.getDimensions();
+ this.window.visible = true;
+ var bounds = this.window.getBounds();
+ this.window.visible = false;
+
+ this.window.element.hide();
+
+ this.div.style.height = bounds.height;
+ this.div.style.width = bounds.width;
+ this.div.style.top = bounds.top;
+ this.div.style.left = bounds.left;
+
+ if (this.options.toOpacity)
+ this.div.setStyle({opacity: this.options.toOpacity})
+
+ this.div.show();
+ var style = "top:" + position[1] + "px;left:" + position[0] + "px;width:" + size.width +"px;height:" + size.height + "px";
+
+ if (this.options.fromOpacity)
+ style += ";opacity:" + this.options.fromOpacity;
+ new Effect.Morph(this.div ,{style: style, duration: this.options.duration, afterFinish: this._hideDiv.bind(this)});
+ },
+
+ _showWindow: function() {
+ this.div.hide();
+ this.window.element.show();
+ },
+
+ _hideDiv: function() {
+ this.div.hide();
+ }
+}
+
diff --git a/htdocs/includes/scriptaculous/src/window/window_ext.js b/htdocs/includes/scriptaculous/src/window/window_ext.js
new file mode 100644
index 00000000000..60efac61b4b
--- /dev/null
+++ b/htdocs/includes/scriptaculous/src/window/window_ext.js
@@ -0,0 +1,115 @@
+// Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.com)
+// YOU MUST INCLUDE window.js BEFORE
+//
+// Object to store hide/show windows status in a cookie
+// Just add at the end of your HTML file this javascript line: WindowStore.init()
+WindowStore = {
+ doSetCookie: false,
+ cookieName: "__window_store__",
+ expired: null,
+
+ // Init function with two optional parameters
+ // - cookieName (default = __window_store__)
+ // - expiration date (default 3 years from now)
+ init: function(cookieName, expired) {
+ WindowStore.cookieName = cookieName || WindowStore.cookieName
+
+ if (! expired) {
+ var today = new Date();
+ today.setYear(today.getYear()+1903);
+ WindowStore.expired = today;
+ }
+ else
+ WindowStore.expired = expired;
+
+ Windows.windows.each(function(win) {
+ win.setCookie(win.getId(), WindowStore.expired);
+ });
+
+ // Create observer on show/hide events
+ var myObserver = {
+ onShow: function(eventName, win) {
+ WindowStore._saveCookie();
+ },
+
+ onClose: function(eventName, win) {
+ WindowStore._saveCookie();
+ },
+
+ onHide: function(eventName, win) {
+ WindowStore._saveCookie();
+ }
+ }
+ Windows.addObserver(myObserver);
+
+ WindowStore._restoreWindows();
+ WindowStore._saveCookie();
+ },
+
+ show: function(win) {
+ eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+ if (cookie != null) {
+ if (cookie[win.getId()])
+ win.show();
+ }
+ else
+ win.show();
+ },
+
+ // Function to store windows show/hide status in a cookie
+ _saveCookie: function() {
+ if (!doSetCookie)
+ return;
+
+ var cookieValue = "{";
+ Windows.windows.each(function(win) {
+ if (cookieValue != "{")
+ cookieValue += ","
+ cookieValue += win.getId() + ": " + win.isVisible();
+ });
+ cookieValue += "}"
+
+ WindowUtilities.setCookie(cookieValue, [WindowStore.cookieName, WindowStore.expired]);
+ },
+
+ // Function to restore windows show/hide status from a cookie if exists
+ _restoreWindows: function() {
+ eval("var cookie = " + WindowUtilities.getCookie(WindowStore.cookieName));
+ if (cookie != null) {
+ doSetCookie = false;
+ Windows.windows.each(function(win) {
+ if (cookie[win.getId()])
+ win.show();
+ });
+ }
+ doSetCookie = true;
+ }
+}
+
+// Object to set a close key an all windows
+WindowCloseKey = {
+ keyCode: Event.KEY_ESC,
+
+ init: function(keyCode) {
+ if (keyCode)
+ WindowCloseKey.keyCode = keyCode;
+
+ Event.observe(document, 'keydown', this._closeCurrentWindow.bindAsEventListener(this));
+ },
+
+ _closeCurrentWindow: function(event) {
+ var e = event || window.event
+ var characterCode = e.which || e.keyCode;
+
+ // Check if there is a top window (it means it's an URL content)
+ var win = top.Windows.focusedWindow;
+ if (characterCode == WindowCloseKey.keyCode && win) {
+ if (win.cancelCallback)
+ top.Dialog.cancelCallback();
+ else if (win.okCallback)
+ top.Dialog.okCallback();
+ else
+ top.Windows.close(top.Windows.focusedWindow.getId());
+ }
+ }
+}
\ No newline at end of file
diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php
index db3585405da..e118f6daf42 100644
--- a/htdocs/main.inc.php
+++ b/htdocs/main.inc.php
@@ -648,7 +648,11 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0)
// Affiche style sheets et link
print ' '."\n";
- print ' '."\n";
+ print ' '."\n";
+
+ // Style sheets pour la class Window
+ print ' '."\n";
+ print ' '."\n";
// Definition en alternate style sheet des feuilles de styles les plus maintenues
// Les navigateurs qui supportent sont rares. Plus aucun connu.
@@ -672,7 +676,9 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0)
print ''."\n";
print ''."\n";
print ''."\n";
- print ''."\n";
+ //print ''."\n";
+ print ''."\n";
+ print ''."\n";
}
diff --git a/htdocs/theme/auguria/auguria.css.php b/htdocs/theme/auguria/auguria.css.php
index 94f47fb1ccd..cd5f58c0d7d 100644
--- a/htdocs/theme/auguria/auguria.css.php
+++ b/htdocs/theme/auguria/auguria.css.php
@@ -1259,22 +1259,3 @@ form.inplaceeditor-form a { /* The cancel link */
background-position : bottom;
cursor:pointer;
}
-
-/* ============================================================================== */
-/* Ajax - Tooltip */
-/* ============================================================================== */
-.tooltip {
- width: 500px;
- color: #fff;
- }
-.tooltip .title {
- background: #0F6788;
- font: 15px Arial, Helvetica, sans-serif;
- font-weight: bold;
- padding: 5px;
- }
-.tooltip .content {
- background: dodgerblue;
- font: 11px Arial, Helvetica, sans-serif;
- padding: 5px;
- }
\ No newline at end of file
diff --git a/htdocs/theme/common/window/alphacube.css b/htdocs/theme/common/window/alphacube.css
new file mode 100644
index 00000000000..7d2790e75e1
--- /dev/null
+++ b/htdocs/theme/common/window/alphacube.css
@@ -0,0 +1,150 @@
+.overlay_alphacube {
+ background-color: #85BBEF;
+ filter:alpha(opacity=60);
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+
+.alphacube_nw {
+ background: transparent url(alphacube/left-top.gif) no-repeat 0 0;
+ width:10px;
+ height:25px;
+}
+
+.alphacube_n {
+ background: transparent url(alphacube/top-middle.gif) repeat-x 0 0;
+ height:25px;
+}
+
+.alphacube_ne {
+ background: transparent url(alphacube/right-top.gif) no-repeat 0 0;
+ width:10px;
+ height:25px;
+}
+
+.alphacube_w {
+ background: transparent url(alphacube/frame-left.gif) repeat-y top left;
+ width:7px;
+}
+
+.alphacube_e {
+ background: transparent url(alphacube/frame-right.gif) repeat-y top right;
+ width:7px;
+}
+
+.alphacube_sw {
+ background: transparent url(alphacube/bottom-left-c.gif) no-repeat 0 0;
+ width:7px;
+ height:7px;
+}
+
+.alphacube_s {
+ background: transparent url(alphacube/bottom-middle.gif) repeat-x 0 0;
+ height:7px;
+}
+
+.alphacube_se, .alphacube_sizer {
+ background: transparent url(alphacube/bottom-right-c.gif) no-repeat 0 0;
+ width:7px;
+ height:7px;
+}
+
+.alphacube_sizer {
+ cursor:se-resize;
+}
+
+.alphacube_close {
+ width: 23px;
+ height: 23px;
+ background: transparent url(alphacube/button-close-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:11px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.alphacube_minimize {
+ width: 23px;
+ height: 23px;
+ background: transparent url(alphacube/button-min-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:55px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.alphacube_maximize {
+ width: 23px;
+ height: 23px;
+ background: transparent url(alphacube/button-max-focus.gif) no-repeat 0 0;
+ position:absolute;
+ top:0px;
+ right:33px;
+ cursor:pointer;
+ z-index:1000;
+}
+
+.alphacube_title {
+ float:left;
+ height:14px;
+ font-size:14px;
+ text-align:center;
+ margin-top:2px;
+ width:100%;
+ color:#123456;
+}
+
+.alphacube_content {
+ overflow:auto;
+ color: #000;
+ font-family: Tahoma, Arial, sans-serif;
+ font: 12px arial;
+ background:#FDFDFD;
+}
+
+/* For alert/confirm dialog */
+.alphacube_window {
+ border:1px solid #F00;
+ background: #FFF;
+ padding:20px;
+ margin-left:auto;
+ margin-right:auto;
+ width:400px;
+}
+
+.alphacube_message {
+ font: 12px arial;
+ text-align:center;
+ width:100%;
+ padding-bottom:10px;
+}
+
+.alphacube_buttons {
+ text-align:center;
+ width:100%;
+}
+
+.alphacube_buttons input {
+ width:20%;
+ margin:10px;
+}
+
+.alphacube_progress {
+ float:left;
+ margin:auto;
+ text-align:center;
+ width:100%;
+ height:16px;
+ background: #FFF url('alert/progress.gif') no-repeat center center
+}
+
+.alphacube_wired_frame {
+ background: #FFF;
+ filter:alpha(opacity=60);
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+
+
diff --git a/htdocs/theme/common/window/alphacube/bottom-left-c.gif b/htdocs/theme/common/window/alphacube/bottom-left-c.gif
new file mode 100644
index 00000000000..531acdc513d
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/bottom-left-c.gif differ
diff --git a/htdocs/theme/common/window/alphacube/bottom-middle.gif b/htdocs/theme/common/window/alphacube/bottom-middle.gif
new file mode 100644
index 00000000000..d4ce3be02ce
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/bottom-middle.gif differ
diff --git a/htdocs/theme/common/window/alphacube/bottom-right-c.gif b/htdocs/theme/common/window/alphacube/bottom-right-c.gif
new file mode 100644
index 00000000000..2164c22c144
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/bottom-right-c.gif differ
diff --git a/htdocs/theme/common/window/alphacube/button-close-focus.gif b/htdocs/theme/common/window/alphacube/button-close-focus.gif
new file mode 100644
index 00000000000..99f635c102c
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/button-close-focus.gif differ
diff --git a/htdocs/theme/common/window/alphacube/button-max-focus.gif b/htdocs/theme/common/window/alphacube/button-max-focus.gif
new file mode 100644
index 00000000000..1708a1e0d15
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/button-max-focus.gif differ
diff --git a/htdocs/theme/common/window/alphacube/button-min-focus.gif b/htdocs/theme/common/window/alphacube/button-min-focus.gif
new file mode 100644
index 00000000000..ff69d1b20f4
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/button-min-focus.gif differ
diff --git a/htdocs/theme/common/window/alphacube/frame-left.gif b/htdocs/theme/common/window/alphacube/frame-left.gif
new file mode 100644
index 00000000000..543f13db663
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/frame-left.gif differ
diff --git a/htdocs/theme/common/window/alphacube/frame-right.gif b/htdocs/theme/common/window/alphacube/frame-right.gif
new file mode 100644
index 00000000000..5d7afef939b
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/frame-right.gif differ
diff --git a/htdocs/theme/common/window/alphacube/left-top.gif b/htdocs/theme/common/window/alphacube/left-top.gif
new file mode 100644
index 00000000000..8373aaae17f
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/left-top.gif differ
diff --git a/htdocs/theme/common/window/alphacube/right-top.gif b/htdocs/theme/common/window/alphacube/right-top.gif
new file mode 100644
index 00000000000..77cf65ef868
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/right-top.gif differ
diff --git a/htdocs/theme/common/window/alphacube/top-middle.gif b/htdocs/theme/common/window/alphacube/top-middle.gif
new file mode 100644
index 00000000000..9cab17d53de
Binary files /dev/null and b/htdocs/theme/common/window/alphacube/top-middle.gif differ
diff --git a/htdocs/theme/common/window/default.css b/htdocs/theme/common/window/default.css
new file mode 100644
index 00000000000..6ab13789d24
--- /dev/null
+++ b/htdocs/theme/common/window/default.css
@@ -0,0 +1,155 @@
+.overlay_dialog {
+ background-color: #666666;
+ filter:alpha(opacity=60);
+ -moz-opacity: 0.6;
+ opacity: 0.6;
+}
+
+.overlay___invisible__ {
+ background-color: #666666;
+ filter:alpha(opacity=0);
+ -moz-opacity: 0;
+ opacity: 0;
+}
+
+.dialog_nw {
+ width: 9px;
+ height: 23px;
+ background: transparent url(default/top_left.gif) no-repeat 0 0;
+}
+
+.dialog_n {
+ background: transparent url(default/top_mid.gif) repeat-x 0 0;
+ height: 23px;
+}
+
+.dialog_ne {
+ width: 9px;
+ height: 23px;
+ background: transparent url(default/top_right.gif) no-repeat 0 0;
+}
+
+.dialog_e {
+ width: 2px;
+ background: transparent url(default/center_right.gif) repeat-y 0 0;
+}
+
+.dialog_w {
+ width: 2px;
+ background: transparent url(default/center_left.gif) repeat-y 0 0;
+}
+
+.dialog_sw {
+ width: 9px;
+ height: 19px;
+ background: transparent url(default/bottom_left.gif) no-repeat 0 0;
+}
+
+.dialog_s {
+ background: transparent url(default/bottom_mid.gif) repeat-x 0 0;
+ height: 19px;
+}
+
+.dialog_se {
+ width: 9px;
+ height: 19px;
+ background: transparent url(default/bottom_right.gif) no-repeat 0 0;
+}
+
+.dialog_sizer {
+ width: 9px;
+ height: 19px;
+ background: transparent url(default/sizer.gif) no-repeat 0 0;
+ cursor:se-resize;
+}
+
+.dialog_close {
+ width: 14px;
+ height: 14px;
+ background: transparent url(default/close.gif) no-repeat 0 0;
+ position:absolute;
+ top:5px;
+ left:8px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.dialog_minimize {
+ width: 14px;
+ height: 15px;
+ background: transparent url(default/minimize.gif) no-repeat 0 0;
+ position:absolute;
+ top:5px;
+ left:28px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.dialog_maximize {
+ width: 14px;
+ height: 15px;
+ background: transparent url(default/maximize.gif) no-repeat 0 0;
+ position:absolute;
+ top:5px;
+ left:49px;
+ cursor:pointer;
+ z-index:2000;
+}
+
+.dialog_title {
+ float:left;
+ height:14px;
+ font-family: Tahoma, Arial, sans-serif;
+ font-size:12px;
+ text-align:center;
+ width:100%;
+ color:#000;
+}
+
+.dialog_content {
+ overflow:auto;
+ color: #DDD;
+ font-family: Tahoma, Arial, sans-serif;
+ font-size: 10px;
+ background-color:#123;
+}
+
+.top_draggable, .bottom_draggable {
+ cursor:move;
+}
+
+.status_bar {
+ font-size:12px;
+}
+.status_bar input{
+ font-size:12px;
+}
+
+.wired_frame {
+ display: block;
+ position: absolute;
+ border: 1px #000 dashed;
+}
+
+/* DO NOT CHANGE THESE VALUES*/
+.dialog {
+ display: block;
+ position: absolute;
+}
+
+.dialog table.table_window {
+ border-collapse: collapse;
+ border-spacing: 0;
+ width: 100%;
+ margin: 0px;
+ padding:0px;
+}
+
+.dialog table.table_window td , .dialog table.table_window th {
+ padding: 0;
+}
+
+.dialog .title_window {
+ -moz-user-select:none;
+}
+
diff --git a/htdocs/theme/common/window/default/bottom_left.gif b/htdocs/theme/common/window/default/bottom_left.gif
new file mode 100644
index 00000000000..4c73d356353
Binary files /dev/null and b/htdocs/theme/common/window/default/bottom_left.gif differ
diff --git a/htdocs/theme/common/window/default/bottom_mid.gif b/htdocs/theme/common/window/default/bottom_mid.gif
new file mode 100644
index 00000000000..9205d30190b
Binary files /dev/null and b/htdocs/theme/common/window/default/bottom_mid.gif differ
diff --git a/htdocs/theme/common/window/default/bottom_right.gif b/htdocs/theme/common/window/default/bottom_right.gif
new file mode 100644
index 00000000000..8d002eeb82f
Binary files /dev/null and b/htdocs/theme/common/window/default/bottom_right.gif differ
diff --git a/htdocs/theme/common/window/default/bottom_right_resize.gif b/htdocs/theme/common/window/default/bottom_right_resize.gif
new file mode 100644
index 00000000000..649b0d870dd
Binary files /dev/null and b/htdocs/theme/common/window/default/bottom_right_resize.gif differ
diff --git a/htdocs/theme/common/window/default/center_left.gif b/htdocs/theme/common/window/default/center_left.gif
new file mode 100644
index 00000000000..79e7a1cca64
Binary files /dev/null and b/htdocs/theme/common/window/default/center_left.gif differ
diff --git a/htdocs/theme/common/window/default/center_right.gif b/htdocs/theme/common/window/default/center_right.gif
new file mode 100644
index 00000000000..554c55c864e
Binary files /dev/null and b/htdocs/theme/common/window/default/center_right.gif differ
diff --git a/htdocs/theme/common/window/default/clear.gif b/htdocs/theme/common/window/default/clear.gif
new file mode 100644
index 00000000000..c10b166944c
Binary files /dev/null and b/htdocs/theme/common/window/default/clear.gif differ
diff --git a/htdocs/theme/common/window/default/close.gif b/htdocs/theme/common/window/default/close.gif
new file mode 100644
index 00000000000..31ef5a3948a
Binary files /dev/null and b/htdocs/theme/common/window/default/close.gif differ
diff --git a/htdocs/theme/common/window/default/inspect.gif b/htdocs/theme/common/window/default/inspect.gif
new file mode 100644
index 00000000000..ebeeb02f692
Binary files /dev/null and b/htdocs/theme/common/window/default/inspect.gif differ
diff --git a/htdocs/theme/common/window/default/maximize.gif b/htdocs/theme/common/window/default/maximize.gif
new file mode 100644
index 00000000000..892a0f08c9f
Binary files /dev/null and b/htdocs/theme/common/window/default/maximize.gif differ
diff --git a/htdocs/theme/common/window/default/minimize.gif b/htdocs/theme/common/window/default/minimize.gif
new file mode 100644
index 00000000000..a7214167b7e
Binary files /dev/null and b/htdocs/theme/common/window/default/minimize.gif differ
diff --git a/htdocs/theme/common/window/default/overlay.png b/htdocs/theme/common/window/default/overlay.png
new file mode 100644
index 00000000000..648e71ed690
Binary files /dev/null and b/htdocs/theme/common/window/default/overlay.png differ
diff --git a/htdocs/theme/common/window/default/resize.gif b/htdocs/theme/common/window/default/resize.gif
new file mode 100644
index 00000000000..c44070259c4
Binary files /dev/null and b/htdocs/theme/common/window/default/resize.gif differ
diff --git a/htdocs/theme/common/window/default/sizer.gif b/htdocs/theme/common/window/default/sizer.gif
new file mode 100644
index 00000000000..649b0d870dd
Binary files /dev/null and b/htdocs/theme/common/window/default/sizer.gif differ
diff --git a/htdocs/theme/common/window/default/top_left.gif b/htdocs/theme/common/window/default/top_left.gif
new file mode 100644
index 00000000000..774538ac6ab
Binary files /dev/null and b/htdocs/theme/common/window/default/top_left.gif differ
diff --git a/htdocs/theme/common/window/default/top_mid.gif b/htdocs/theme/common/window/default/top_mid.gif
new file mode 100644
index 00000000000..6124e78bd3b
Binary files /dev/null and b/htdocs/theme/common/window/default/top_mid.gif differ
diff --git a/htdocs/theme/common/window/default/top_right.gif b/htdocs/theme/common/window/default/top_right.gif
new file mode 100644
index 00000000000..fbc94bf2b94
Binary files /dev/null and b/htdocs/theme/common/window/default/top_right.gif differ
diff --git a/htdocs/theme/eldy/eldy.css.php b/htdocs/theme/eldy/eldy.css.php
index 2910cbb962e..ab7ea6a9e6a 100644
--- a/htdocs/theme/eldy/eldy.css.php
+++ b/htdocs/theme/eldy/eldy.css.php
@@ -1367,22 +1367,3 @@ div.menuFleche
position:relative;
}
-
-/* ============================================================================== */
-/* Ajax - Tooltip */
-/* ============================================================================== */
-.tooltip {
- width: 500px;
- color: #fff;
- }
-.tooltip .title {
- background: #0F6788;
- font: 15px Arial, Helvetica, sans-serif;
- font-weight: bold;
- padding: 5px;
- }
-.tooltip .content {
- background: dodgerblue;
- font: 11px Arial, Helvetica, sans-serif;
- padding: 5px;
- }
\ No newline at end of file