window_rails 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +0 -0
- data/LICENSE +44 -0
- data/README.rdoc +68 -0
- data/app/controllers/window_rails_controller.rb +32 -0
- data/files/javascripts/debug.js +137 -0
- data/files/javascripts/extended_debug.js +113 -0
- data/files/javascripts/tooltip.js +241 -0
- data/files/javascripts/window.js +1872 -0
- data/files/javascripts/window_effects.js +157 -0
- data/files/javascripts/window_ext.js +115 -0
- data/files/themes/alert.css +119 -0
- data/files/themes/alert/bottom.gif +0 -0
- data/files/themes/alert/bottom_left.gif +0 -0
- data/files/themes/alert/bottom_right.gif +0 -0
- data/files/themes/alert/left.gif +0 -0
- data/files/themes/alert/overlay.png +0 -0
- data/files/themes/alert/progress.gif +0 -0
- data/files/themes/alert/right.gif +0 -0
- data/files/themes/alert/top.gif +0 -0
- data/files/themes/alert/top_left.gif +0 -0
- data/files/themes/alert/top_right.gif +0 -0
- data/files/themes/alert_lite.css +88 -0
- data/files/themes/alphacube.css +150 -0
- data/files/themes/alphacube/bottom-left-c.gif +0 -0
- data/files/themes/alphacube/bottom-middle.gif +0 -0
- data/files/themes/alphacube/bottom-right-c.gif +0 -0
- data/files/themes/alphacube/button-close-focus.gif +0 -0
- data/files/themes/alphacube/button-max-focus.gif +0 -0
- data/files/themes/alphacube/button-min-focus.gif +0 -0
- data/files/themes/alphacube/frame-left.gif +0 -0
- data/files/themes/alphacube/frame-right.gif +0 -0
- data/files/themes/alphacube/left-top.gif +0 -0
- data/files/themes/alphacube/right-top.gif +0 -0
- data/files/themes/alphacube/top-middle.gif +0 -0
- data/files/themes/behavior.htc +51 -0
- data/files/themes/darkX.css +121 -0
- data/files/themes/darkX/button-close-focused.png +0 -0
- data/files/themes/darkX/button-maximize-focused.png +0 -0
- data/files/themes/darkX/button-minimize-focused.png +0 -0
- data/files/themes/darkX/frame-bottom-left-focused.png +0 -0
- data/files/themes/darkX/frame-bottom-mid-focused.png +0 -0
- data/files/themes/darkX/frame-bottom-right-focused.png +0 -0
- data/files/themes/darkX/frame-left-focused.png +0 -0
- data/files/themes/darkX/frame-right-focused.png +0 -0
- data/files/themes/darkX/titlebar-left-focused.png +0 -0
- data/files/themes/darkX/titlebar-mid-focused.png +0 -0
- data/files/themes/darkX/titlebar-right-focused.png +0 -0
- data/files/themes/debug.css +25 -0
- data/files/themes/default.css +155 -0
- data/files/themes/default/bottom_left.gif +0 -0
- data/files/themes/default/bottom_mid.gif +0 -0
- data/files/themes/default/bottom_right.gif +0 -0
- data/files/themes/default/bottom_right_resize.gif +0 -0
- data/files/themes/default/center_left.gif +0 -0
- data/files/themes/default/center_right.gif +0 -0
- data/files/themes/default/clear.gif +0 -0
- data/files/themes/default/close.gif +0 -0
- data/files/themes/default/inspect.gif +0 -0
- data/files/themes/default/maximize.gif +0 -0
- data/files/themes/default/minimize.gif +0 -0
- data/files/themes/default/overlay.png +0 -0
- data/files/themes/default/resize.gif +0 -0
- data/files/themes/default/sizer.gif +0 -0
- data/files/themes/default/top_left.gif +0 -0
- data/files/themes/default/top_mid.gif +0 -0
- data/files/themes/default/top_right.gif +0 -0
- data/files/themes/iefix/blank.gif +0 -0
- data/files/themes/iefix/iepngfix.css +3 -0
- data/files/themes/iefix/iepngfix.htc +54 -0
- data/files/themes/lighting.css +960 -0
- data/files/themes/lighting/background_buttons.gif +0 -0
- data/files/themes/lighting/bottom-left-blue.png +0 -0
- data/files/themes/lighting/bottom-left-darkblue.png +0 -0
- data/files/themes/lighting/bottom-left-green.png +0 -0
- data/files/themes/lighting/bottom-left-grey.png +0 -0
- data/files/themes/lighting/bottom-middle-blue.png +0 -0
- data/files/themes/lighting/bottom-middle-darkblue.png +0 -0
- data/files/themes/lighting/bottom-middle-green.png +0 -0
- data/files/themes/lighting/bottom-middle-grey.png +0 -0
- data/files/themes/lighting/bottom-right-blue.png +0 -0
- data/files/themes/lighting/bottom-right-darkblue.png +0 -0
- data/files/themes/lighting/bottom-right-green.png +0 -0
- data/files/themes/lighting/bottom-right-grey.png +0 -0
- data/files/themes/lighting/button-close-blue.png +0 -0
- data/files/themes/lighting/button-close-darkblue.png +0 -0
- data/files/themes/lighting/button-close-green.png +0 -0
- data/files/themes/lighting/button-close-grey.png +0 -0
- data/files/themes/lighting/button-maximize-blue.png +0 -0
- data/files/themes/lighting/button-maximize-darkblue.png +0 -0
- data/files/themes/lighting/button-maximize-green.png +0 -0
- data/files/themes/lighting/button-maximize-grey.png +0 -0
- data/files/themes/lighting/button-minimize-blue.png +0 -0
- data/files/themes/lighting/button-minimize-darkblue.png +0 -0
- data/files/themes/lighting/button-minimize-green.png +0 -0
- data/files/themes/lighting/button-minimize-grey.png +0 -0
- data/files/themes/lighting/left-blue.png +0 -0
- data/files/themes/lighting/left-darkblue.png +0 -0
- data/files/themes/lighting/left-green.png +0 -0
- data/files/themes/lighting/left-grey.png +0 -0
- data/files/themes/lighting/pngbehavior.htc +67 -0
- data/files/themes/lighting/right-blue.png +0 -0
- data/files/themes/lighting/right-darkblue.png +0 -0
- data/files/themes/lighting/right-green.png +0 -0
- data/files/themes/lighting/right-grey.png +0 -0
- data/files/themes/lighting/spinner.gif +0 -0
- data/files/themes/lighting/top-left-blue.png +0 -0
- data/files/themes/lighting/top-left-darkblue.png +0 -0
- data/files/themes/lighting/top-left-green.png +0 -0
- data/files/themes/lighting/top-left-grey.png +0 -0
- data/files/themes/lighting/top-middle-blue.png +0 -0
- data/files/themes/lighting/top-middle-darkblue.png +0 -0
- data/files/themes/lighting/top-middle-green.png +0 -0
- data/files/themes/lighting/top-middle-grey.png +0 -0
- data/files/themes/lighting/top-right-blue.png +0 -0
- data/files/themes/lighting/top-right-darkblue.png +0 -0
- data/files/themes/lighting/top-right-green.png +0 -0
- data/files/themes/lighting/top-right-grey.png +0 -0
- data/files/themes/mac_os_x.css +333 -0
- data/files/themes/mac_os_x/B.png +0 -0
- data/files/themes/mac_os_x/BL.png +0 -0
- data/files/themes/mac_os_x/BL_Main.png +0 -0
- data/files/themes/mac_os_x/BR.png +0 -0
- data/files/themes/mac_os_x/BR_Main.png +0 -0
- data/files/themes/mac_os_x/B_Main.png +0 -0
- data/files/themes/mac_os_x/L.png +0 -0
- data/files/themes/mac_os_x/L_Main.png +0 -0
- data/files/themes/mac_os_x/R.png +0 -0
- data/files/themes/mac_os_x/R_Main.png +0 -0
- data/files/themes/mac_os_x/T.png +0 -0
- data/files/themes/mac_os_x/TL.png +0 -0
- data/files/themes/mac_os_x/TL_Main.png +0 -0
- data/files/themes/mac_os_x/TR.png +0 -0
- data/files/themes/mac_os_x/TR_Main.png +0 -0
- data/files/themes/mac_os_x/T_Main.png +0 -0
- data/files/themes/mac_os_x/close.gif +0 -0
- data/files/themes/mac_os_x/maximize.gif +0 -0
- data/files/themes/mac_os_x/minimize.gif +0 -0
- data/files/themes/mac_os_x_dialog.css +160 -0
- data/files/themes/mac_os_x_dialog/B.png +0 -0
- data/files/themes/mac_os_x_dialog/BL.png +0 -0
- data/files/themes/mac_os_x_dialog/BR.png +0 -0
- data/files/themes/mac_os_x_dialog/L.png +0 -0
- data/files/themes/mac_os_x_dialog/R.png +0 -0
- data/files/themes/mac_os_x_dialog/T.png +0 -0
- data/files/themes/mac_os_x_dialog/TL.png +0 -0
- data/files/themes/mac_os_x_dialog/TR.png +0 -0
- data/files/themes/mac_os_x_dialog/bg.gif +0 -0
- data/files/themes/mac_os_x_dialog/close.gif +0 -0
- data/files/themes/mac_os_x_dialog/maximize.gif +0 -0
- data/files/themes/mac_os_x_dialog/minimize.gif +0 -0
- data/files/themes/nuncio.css +164 -0
- data/files/themes/nuncio/bottom_left.png +0 -0
- data/files/themes/nuncio/bottom_mid.png +0 -0
- data/files/themes/nuncio/bottom_right.png +0 -0
- data/files/themes/nuncio/center_left.png +0 -0
- data/files/themes/nuncio/center_right.png +0 -0
- data/files/themes/nuncio/close.png +0 -0
- data/files/themes/nuncio/minimize.png +0 -0
- data/files/themes/nuncio/overlay.png +0 -0
- data/files/themes/nuncio/top_left.png +0 -0
- data/files/themes/nuncio/top_mid.png +0 -0
- data/files/themes/nuncio/top_right.png +0 -0
- data/files/themes/spread.css +108 -0
- data/files/themes/spread/bottom-left-c.gif +0 -0
- data/files/themes/spread/bottom-middle.gif +0 -0
- data/files/themes/spread/bottom-right-c.gif +0 -0
- data/files/themes/spread/button-close-focus.gif +0 -0
- data/files/themes/spread/button-max-focus.gif +0 -0
- data/files/themes/spread/button-min-focus.gif +0 -0
- data/files/themes/spread/frame-left.gif +0 -0
- data/files/themes/spread/frame-right.gif +0 -0
- data/files/themes/spread/left-top.gif +0 -0
- data/files/themes/spread/right-top.gif +0 -0
- data/files/themes/spread/top-middle.gif +0 -0
- data/init.rb +1 -0
- data/install.rb +32 -0
- data/lib/window_rails.rb +164 -0
- data/lib/window_rails/version.rb +3 -0
- data/uninstall.rb +9 -0
- metadata +260 -0
data/CHANGELOG.rdoc
ADDED
File without changes
|
data/LICENSE
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
Current WindowRails License:
|
2
|
+
|
3
|
+
Copyright (c) 2010 Chris Roberts <chrisroberts.code@gmail.com>
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
|
24
|
+
Original Prototype Window License:
|
25
|
+
|
26
|
+
Copyright (c) 2006 Sébastien Gruhier (http://xilinus.com, http://itseb.com)
|
27
|
+
|
28
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
29
|
+
a copy of this software and associated documentation files (the
|
30
|
+
"Software"), to deal in the Software without restriction, including
|
31
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
32
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
33
|
+
permit persons to whom the Software is furnished to do so, subject to
|
34
|
+
the following conditions:
|
35
|
+
|
36
|
+
The above copyright notice and this permission notice shall be
|
37
|
+
included in all copies or substantial portions of the Software.
|
38
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
39
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
40
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
41
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
42
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
43
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
44
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,68 @@
|
|
1
|
+
++ Important note ++
|
2
|
+
|
3
|
+
This is still in its infancy and is pretty unstable. This will be removed once it's ready
|
4
|
+
for initial release.
|
5
|
+
|
6
|
+
== WindowRails
|
7
|
+
|
8
|
+
WindowRails is a plugin for Rails that provides easy to use AJAXy windows. It is based
|
9
|
+
completely on {Prototype Window}[http://prototype-window.xilinus.com/] with helpers for
|
10
|
+
Rails to make it easy to use from a Rails app.
|
11
|
+
|
12
|
+
=== Basic examples to get you started
|
13
|
+
|
14
|
+
==== Linking to a window
|
15
|
+
<%= link_to_window('Link', :url => {:controller => :my_controller, :action => :my_action}, :modal => true, :className => 'alphacube', :window => 'some_name') %>
|
16
|
+
|
17
|
+
==== Opening a window via AJAX
|
18
|
+
def open_my_window
|
19
|
+
respond_to do |format|
|
20
|
+
format.html
|
21
|
+
format.js do
|
22
|
+
render :update do |page|
|
23
|
+
page.open_window({:partial => 'my_partial'}, :modal => true, :width => 400, :height => 200, :window => 'my_window')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
==== Updating a window via AJAX
|
30
|
+
def update_my_window
|
31
|
+
respond_to do |format|
|
32
|
+
format.html
|
33
|
+
format.js do
|
34
|
+
render :update do |page|
|
35
|
+
page.update_window({:partial => 'new_partial'}, :window => 'my_window')
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
==== Closing a window via AJAX
|
42
|
+
def close_my_window
|
43
|
+
respond_to do |format|
|
44
|
+
format.html
|
45
|
+
format.js do
|
46
|
+
render :update do |page|
|
47
|
+
page.close_window(:window => 'my_window')
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
== Documentation
|
54
|
+
|
55
|
+
[WindowRails documentation]{http://chrisroberts.github.com/window_rails}
|
56
|
+
|
57
|
+
== Bugs/Features
|
58
|
+
|
59
|
+
[Issues]{http://github.com/chrisroberts/window_rails/issues}
|
60
|
+
|
61
|
+
== Thanks
|
62
|
+
|
63
|
+
* Many thanks to Sébastien Gruhier (creator of {Prototype Window}[http://prototype-window.xilinus.com/])
|
64
|
+
|
65
|
+
== License
|
66
|
+
|
67
|
+
* Prototype Window was released under the MIT license
|
68
|
+
* WindowRails continues on under the MIT license
|
@@ -0,0 +1,32 @@
|
|
1
|
+
class WindowRailsController < ActionController::Base
|
2
|
+
|
3
|
+
# Make sure we kick any thing out that is making a request other
|
4
|
+
# than openning a new window
|
5
|
+
before_filter :redirect_out, :except => :open_window
|
6
|
+
def redirect_out
|
7
|
+
respond_to do |format|
|
8
|
+
format.html do
|
9
|
+
redirect_to '/'
|
10
|
+
end
|
11
|
+
format.js do
|
12
|
+
render :update do |page|
|
13
|
+
page.redirect_to '/'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Opens a new window
|
20
|
+
def open_window
|
21
|
+
respond_to do |format|
|
22
|
+
format.html do
|
23
|
+
redirect_to '/'
|
24
|
+
end
|
25
|
+
format.js do
|
26
|
+
render :update do |page|
|
27
|
+
page.activate_window({:url => params[:window_url]}, params[:window_options])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
var debugWindow = null;
|
2
|
+
function debug(text, reverse) {
|
3
|
+
if (debugWindow == null)
|
4
|
+
return;
|
5
|
+
|
6
|
+
time = "-"; //new Date();
|
7
|
+
if (reverse) {
|
8
|
+
$('debug').innerHTML = time + " " + text + "<br>"+ $('debug').innerHTML;
|
9
|
+
debugWindow.getContent().scrollTop=0;
|
10
|
+
}
|
11
|
+
else {
|
12
|
+
$('debug').innerHTML += time + " " + text + "<br>";
|
13
|
+
debugWindow.getContent().scrollTop=10000; // Far away
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
function hideDebug() {
|
18
|
+
if (debugWindow) {
|
19
|
+
debugWindow.destroy();
|
20
|
+
debugWindow = null;
|
21
|
+
}
|
22
|
+
}
|
23
|
+
|
24
|
+
function showDebug(bShow) {
|
25
|
+
if (debugWindow == null) {
|
26
|
+
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"})
|
27
|
+
debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div id='debug'></div>";
|
28
|
+
date=new Date;
|
29
|
+
date.setMonth(date.getMonth()+3);
|
30
|
+
|
31
|
+
//debugWindow.setCookie(null, date);
|
32
|
+
}
|
33
|
+
if( typeof bShow == 'undefined' || bShow)debugWindow.show()
|
34
|
+
}
|
35
|
+
|
36
|
+
|
37
|
+
function clearDebug() {
|
38
|
+
if (debugWindow == null)
|
39
|
+
return;
|
40
|
+
$('debug').innerHTML = "";
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* document.createElement convenience wrapper
|
45
|
+
*
|
46
|
+
* The data parameter is an object that must have the "tag" key, containing
|
47
|
+
* a string with the tagname of the element to create. It can optionally have
|
48
|
+
* a "children" key which can be: a string, "data" object, or an array of "data"
|
49
|
+
* objects to append to this element as children. Any other key is taken as an
|
50
|
+
* attribute to be applied to this tag.
|
51
|
+
*
|
52
|
+
* Available under an MIT license:
|
53
|
+
* http://www.opensource.org/licenses/mit-license.php
|
54
|
+
*
|
55
|
+
* @param {Object} data The data representing the element to create
|
56
|
+
* @return {Element} The element created.
|
57
|
+
*/
|
58
|
+
function $E(data) {
|
59
|
+
var el;
|
60
|
+
if ('string'==typeof data) {
|
61
|
+
el=document.createTextNode(data);
|
62
|
+
} else {
|
63
|
+
//create the element
|
64
|
+
el=document.createElement(data.tag);
|
65
|
+
delete(data.tag);
|
66
|
+
|
67
|
+
//append the children
|
68
|
+
if ('undefined'!=typeof data.children) {
|
69
|
+
if ('string'==typeof data.children ||'undefined'==typeof data.children.length) {
|
70
|
+
//strings and single elements
|
71
|
+
el.appendChild($E(data.children));
|
72
|
+
} else {
|
73
|
+
//arrays of elements
|
74
|
+
for (var i=0, child=null; 'undefined'!=typeof (child=data.children[i]); i++) {
|
75
|
+
el.appendChild($E(child));
|
76
|
+
}
|
77
|
+
}
|
78
|
+
delete(data.children);
|
79
|
+
}
|
80
|
+
|
81
|
+
//any other data is attributes
|
82
|
+
for (attr in data) {
|
83
|
+
el[attr]=data[attr];
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
return el;
|
88
|
+
}
|
89
|
+
|
90
|
+
// FROM Nick Hemsley
|
91
|
+
var Debug = {
|
92
|
+
inspectOutput: function (container, within) {
|
93
|
+
within = within || debugWindow.getContent()
|
94
|
+
|
95
|
+
if (debugWindow == null)
|
96
|
+
return;
|
97
|
+
|
98
|
+
within.appendChild(container)
|
99
|
+
},
|
100
|
+
|
101
|
+
inspect: function(object) {
|
102
|
+
var cont = $E({tag: "div", className: "inspector"})
|
103
|
+
Debug.inspectObj(object, cont)
|
104
|
+
debugWindow.getContent().appendChild(cont)
|
105
|
+
},
|
106
|
+
|
107
|
+
inspectObj: function (object, container) {
|
108
|
+
for (prop in object) {
|
109
|
+
Debug.inspectOutput(Debug.inspectable(object, prop), container)
|
110
|
+
}
|
111
|
+
},
|
112
|
+
|
113
|
+
inspectable: function(object, prop) {
|
114
|
+
cont = $E({tag: 'div', className: 'inspectable', children: [prop + " value: " + object[prop] ]})
|
115
|
+
cont.toInspect = object[prop]
|
116
|
+
Event.observe(cont, 'click', Debug.inspectClicked, false)
|
117
|
+
return cont
|
118
|
+
},
|
119
|
+
|
120
|
+
inspectClicked: function(e) {
|
121
|
+
Debug.inspectContained(Event.element(e))
|
122
|
+
Event.stop(e)
|
123
|
+
},
|
124
|
+
|
125
|
+
inspectContained: function(container) {
|
126
|
+
if (container.opened) {
|
127
|
+
container.parentNode.removeChild(container.opened)
|
128
|
+
delete(container.opened)
|
129
|
+
} else {
|
130
|
+
sibling = container.parentNode.insertBefore($E({tag: "div", className: "child"}), container.nextSibling)
|
131
|
+
if (container.toInspect)
|
132
|
+
Debug.inspectObj(container.toInspect, sibling)
|
133
|
+
container.opened = sibling
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
var inspect = Debug.inspect;
|
@@ -0,0 +1,113 @@
|
|
1
|
+
var commandHistory;
|
2
|
+
var historyIndex;
|
3
|
+
|
4
|
+
function showExtendedDebug() {
|
5
|
+
if (debugWindow != null) {
|
6
|
+
hideDebug();
|
7
|
+
}
|
8
|
+
|
9
|
+
if (debugWindow == null) {
|
10
|
+
commandHistory = new Array();
|
11
|
+
historyIndex = 0;
|
12
|
+
|
13
|
+
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"})
|
14
|
+
debugWindow.getContent().innerHTML = "<style>#debug_window .dialog_content {background:#000;}</style> <div font='monaco' id='debug' style='padding:3px;color:#0F0;font-family:monaco'></div>";
|
15
|
+
|
16
|
+
//create hourglass icon and attach events to it.
|
17
|
+
var cont = "<div id=\"debug_window_inspect\" style=\"width: 15px; height: 15px; background: transparent url(themes/default/inspect.gif) no-repeat 0 0; position:absolute; top:5px; left:70px; cursor:pointer; z-index:3000;\"></div>";
|
18
|
+
|
19
|
+
new Insertion.After('debug_window_maximize', cont);
|
20
|
+
Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
|
21
|
+
|
22
|
+
//create command text box
|
23
|
+
cont = "Eval:<input id=\"debug_window_command\" type=\"textbox\" style=\"width:150px; height: 12px; color: black;\">"
|
24
|
+
debugWindow.setStatusBar(cont);
|
25
|
+
|
26
|
+
Event.observe('debug_window_command', 'mousedown', donothing);
|
27
|
+
Event.observe('debug_window_command', 'keypress', evalJS, false);
|
28
|
+
}
|
29
|
+
debugWindow.show();
|
30
|
+
}
|
31
|
+
|
32
|
+
function donothing(evt){
|
33
|
+
Field.activate('debug_window_command');
|
34
|
+
return false;
|
35
|
+
}
|
36
|
+
|
37
|
+
function evalJS(evt){
|
38
|
+
if(evt.keyCode == Event.KEY_RETURN){
|
39
|
+
var js = $F('debug_window_command');
|
40
|
+
try{
|
41
|
+
var ret = eval(js);
|
42
|
+
if(ret != null)
|
43
|
+
debug(ret);
|
44
|
+
}catch(e){
|
45
|
+
debug(e);
|
46
|
+
}
|
47
|
+
$('debug_window_command').value = '';
|
48
|
+
|
49
|
+
Field.activate('debug_window_command');
|
50
|
+
commandHistory.push(js);
|
51
|
+
historyIndex = 0;
|
52
|
+
}
|
53
|
+
|
54
|
+
if(evt.keyCode == Event.KEY_UP){
|
55
|
+
if(commandHistory.length > historyIndex){
|
56
|
+
historyIndex++;
|
57
|
+
var js = commandHistory[commandHistory.length-historyIndex];
|
58
|
+
$('debug_window_command').value = js;
|
59
|
+
Event.stop(evt);
|
60
|
+
Field.activate('debug_window_command');
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
if(evt.keyCode == Event.KEY_DOWN){
|
65
|
+
if(commandHistory.length >= historyIndex && historyIndex > 1){
|
66
|
+
historyIndex--;
|
67
|
+
var js = commandHistory[commandHistory.length-historyIndex];
|
68
|
+
$('debug_window_command').value = js;
|
69
|
+
Event.stop(evt);
|
70
|
+
Field.activate('debug_window_command');
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
|
75
|
+
function enterInspectionMode(evt){
|
76
|
+
//stop observing magnifying glass
|
77
|
+
Event.stopObserving('debug_window_inspect', 'click', enterInspectionMode, false);
|
78
|
+
//change pointer
|
79
|
+
document.body.style.cursor='help';
|
80
|
+
//start observing mouse clicks
|
81
|
+
Event.observe(window, 'click', inspectItem, false);
|
82
|
+
}
|
83
|
+
|
84
|
+
function inspectItem(evt){
|
85
|
+
// the element that triggered the event
|
86
|
+
var element = Event.element(evt);
|
87
|
+
if(element.id!="debug_window_inspect"){
|
88
|
+
clearDebug()
|
89
|
+
//change pointer
|
90
|
+
document.body.style.cursor='default';
|
91
|
+
debug(element.id);
|
92
|
+
inspect(element);
|
93
|
+
//stop observing mouse clicks
|
94
|
+
Event.stopObserving(window, 'click', inspectItem, false);
|
95
|
+
//alert('doing something');
|
96
|
+
//start observing mag
|
97
|
+
Event.observe('debug_window_inspect', 'click', enterInspectionMode, false);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
|
101
|
+
function clearDebug() {
|
102
|
+
var win = $('debug');
|
103
|
+
if (win == null)
|
104
|
+
return;
|
105
|
+
|
106
|
+
win.innerHTML=" ";
|
107
|
+
//clear inspections too
|
108
|
+
var divs = document.getElementsByClassName('inspector');
|
109
|
+
divs.each(function(div){
|
110
|
+
Element.remove(div);
|
111
|
+
});
|
112
|
+
}
|
113
|
+
|
@@ -0,0 +1,241 @@
|
|
1
|
+
// Singleton class TooltipWindow
|
2
|
+
// This class works with special className. The tooltip content could be in your HTML page as an hidden element or
|
3
|
+
// can be retreive by an AJAX call.
|
4
|
+
//
|
5
|
+
// To work, You just need to set two class name on elements that should show tooltips
|
6
|
+
// - One to say to TooltipManager that this element must have a tooltip ('tooltip' by default)
|
7
|
+
// - Another to indicate how to find the tooltip content
|
8
|
+
// It could be html_XXXX if tootltip content is somewhere hidden in your page, XXX must be DOM ID of this hidden element
|
9
|
+
// 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.
|
10
|
+
// Check samples/tooltips/tooltip.html to see how it works
|
11
|
+
//
|
12
|
+
TooltipManager = {
|
13
|
+
options: {cssClassName: 'tooltip', delayOver: 200, delayOut: 1000, shiftX: 10, shiftY: 10,
|
14
|
+
className: 'alphacube', width: 200, height: null,
|
15
|
+
draggable: false, minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide},
|
16
|
+
ajaxInfo: null,
|
17
|
+
elements: null,
|
18
|
+
showTimer: null,
|
19
|
+
hideTimer: null,
|
20
|
+
|
21
|
+
// Init tooltip manager
|
22
|
+
// parameters:
|
23
|
+
// - cssClassName (string) : CSS class name where tooltip should be shown.
|
24
|
+
// - ajaxOptions (hash) : Ajax options for ajax tooltip.
|
25
|
+
// For examples {url: "/tooltip/get.php", options: {method: 'get'}}
|
26
|
+
// see Ajax.Request documentation for details
|
27
|
+
//- tooltipOptions (hash) : available keys
|
28
|
+
// - delayOver: int in ms (default 10) delay before showing tooltip
|
29
|
+
// - delayOut: int in ms (default 1000) delay before hidding tooltip
|
30
|
+
// - shiftX: int in pixels (default 10) left shift of the tooltip window
|
31
|
+
// - shiftY: int in pixels (default 10) top shift of the tooltip window
|
32
|
+
// and All window options like showEffect: Element.show, hideEffect: Element.hide to remove animation
|
33
|
+
// default: {className: 'alphacube', width: 200, height: null, draggable: false, minimizable: false, maximizable: false}
|
34
|
+
|
35
|
+
init: function(cssClassName, ajaxInfo, tooltipOptions) {
|
36
|
+
TooltipManager.options = Object.extend(TooltipManager.options, tooltipOptions || {});
|
37
|
+
|
38
|
+
cssClassName = TooltipManager.options.cssClassName || "tooltip";
|
39
|
+
TooltipManager.ajaxInfo = ajaxInfo;
|
40
|
+
TooltipManager.elements = $$("." + cssClassName);
|
41
|
+
TooltipManager.elements.each(function(element) {
|
42
|
+
element = $(element)
|
43
|
+
var info = TooltipManager._getInfo(element);
|
44
|
+
if (info.ajax) {
|
45
|
+
element.ajaxId = info.id;
|
46
|
+
element.ajaxInfo = ajaxInfo;
|
47
|
+
}
|
48
|
+
else {
|
49
|
+
element.tooltipElement = $(info.id);
|
50
|
+
}
|
51
|
+
element.observe("mouseover", TooltipManager._mouseOver);
|
52
|
+
element.observe("mouseout", TooltipManager._mouseOut);
|
53
|
+
});
|
54
|
+
Windows.addObserver(this);
|
55
|
+
},
|
56
|
+
|
57
|
+
addHTML: function(element, tooltipElement) {
|
58
|
+
element = $(element);
|
59
|
+
tooltipElement = $(tooltipElement);
|
60
|
+
element.tooltipElement = tooltipElement;
|
61
|
+
|
62
|
+
element.observe("mouseover", TooltipManager._mouseOver);
|
63
|
+
element.observe("mouseout", TooltipManager._mouseOut);
|
64
|
+
},
|
65
|
+
|
66
|
+
addAjax: function(element, ajaxInfo) {
|
67
|
+
element = $(element);
|
68
|
+
element.ajaxInfo = ajaxInfo;
|
69
|
+
element.observe("mouseover", TooltipManager._mouseOver);
|
70
|
+
element.observe("mouseout", TooltipManager._mouseOut);
|
71
|
+
},
|
72
|
+
|
73
|
+
addURL: function(element, url, width, height) {
|
74
|
+
element = $(element);
|
75
|
+
element.url = url;
|
76
|
+
element.frameWidth = width;
|
77
|
+
element.frameHeight = height;
|
78
|
+
element.observe("mouseover", TooltipManager._mouseOver);
|
79
|
+
element.observe("mouseout", TooltipManager._mouseOut);
|
80
|
+
},
|
81
|
+
|
82
|
+
close: function() {
|
83
|
+
if (TooltipManager.tooltipWindow)
|
84
|
+
TooltipManager.tooltipWindow.hide();
|
85
|
+
},
|
86
|
+
|
87
|
+
preloadImages: function(path, images, extension) {
|
88
|
+
if (!extension)
|
89
|
+
extension = ".gif";
|
90
|
+
|
91
|
+
//preload images
|
92
|
+
$A(images).each(function(i) {
|
93
|
+
var image = new Image();
|
94
|
+
image.src= path + "/" + i + extension;
|
95
|
+
});
|
96
|
+
},
|
97
|
+
|
98
|
+
_showTooltip: function(element) {
|
99
|
+
if (this.element == element)
|
100
|
+
return;
|
101
|
+
// Get original element
|
102
|
+
while (element && (!element.tooltipElement && !element.ajaxInfo && !element.url))
|
103
|
+
element = element.parentNode;
|
104
|
+
this.element = element;
|
105
|
+
|
106
|
+
TooltipManager.showTimer = null;
|
107
|
+
if (TooltipManager.hideTimer)
|
108
|
+
clearTimeout(TooltipManager.hideTimer);
|
109
|
+
|
110
|
+
var position = Position.cumulativeOffset(element);
|
111
|
+
var dimension = element.getDimensions();
|
112
|
+
|
113
|
+
if (! this.tooltipWindow)
|
114
|
+
this.tooltipWindow = new Window("__tooltip__", TooltipManager.options);
|
115
|
+
|
116
|
+
this.tooltipWindow.hide();
|
117
|
+
this.tooltipWindow.setLocation(position[1] + dimension.height + TooltipManager.options.shiftY, position[0] + TooltipManager.options.shiftX);
|
118
|
+
|
119
|
+
Event.observe(this.tooltipWindow.element, "mouseover", function(event) {TooltipManager._tooltipOver(event, element)});
|
120
|
+
Event.observe(this.tooltipWindow.element, "mouseout", function(event) {TooltipManager._tooltipOut(event, element)});
|
121
|
+
|
122
|
+
// Reset width/height for computation
|
123
|
+
this.tooltipWindow.height = TooltipManager.options.height;
|
124
|
+
this.tooltipWindow.width = TooltipManager.options.width;
|
125
|
+
|
126
|
+
// Ajax content
|
127
|
+
if (element.ajaxInfo) {
|
128
|
+
var p = element.ajaxInfo.options.parameters;
|
129
|
+
var saveParam = p;
|
130
|
+
|
131
|
+
// Set by CSS
|
132
|
+
if (element.ajaxId) {
|
133
|
+
if (p)
|
134
|
+
p += "&id=" + element.ajaxId;
|
135
|
+
else
|
136
|
+
p = "id=" + element.ajaxId;
|
137
|
+
}
|
138
|
+
element.ajaxInfo.options.parameters = p || "";
|
139
|
+
this.tooltipWindow.setHTMLContent("");
|
140
|
+
this.tooltipWindow.setAjaxContent(element.ajaxInfo.url, element.ajaxInfo.options);
|
141
|
+
element.ajaxInfo.options.parameters = saveParam;
|
142
|
+
}
|
143
|
+
// URL content
|
144
|
+
else if (element.url) {
|
145
|
+
this.tooltipWindow.setURL(element.url);
|
146
|
+
this.tooltipWindow.setSize(element.frameWidth, element.frameHeight);
|
147
|
+
|
148
|
+
// Set tooltip size
|
149
|
+
this.tooltipWindow.height = element.frameHeight;
|
150
|
+
this.tooltipWindow.width = element.frameWidth;
|
151
|
+
}
|
152
|
+
// HTML content
|
153
|
+
else
|
154
|
+
this.tooltipWindow.setHTMLContent(element.tooltipElement.innerHTML);
|
155
|
+
|
156
|
+
if (!element.ajaxInfo) {
|
157
|
+
this.tooltipWindow.show();
|
158
|
+
this.tooltipWindow.toFront();
|
159
|
+
}
|
160
|
+
},
|
161
|
+
|
162
|
+
_hideTooltip: function(element) {
|
163
|
+
if (this.tooltipWindow) {
|
164
|
+
this.tooltipWindow.hide();
|
165
|
+
this.element = null;
|
166
|
+
}
|
167
|
+
},
|
168
|
+
|
169
|
+
_mouseOver: function (event) {
|
170
|
+
var element = Event.element(event);
|
171
|
+
if (TooltipManager.showTimer)
|
172
|
+
clearTimeout(TooltipManager.showTimer);
|
173
|
+
|
174
|
+
TooltipManager.showTimer = setTimeout(function() {TooltipManager._showTooltip(element)}, TooltipManager.options.delayOver)
|
175
|
+
},
|
176
|
+
|
177
|
+
_mouseOut: function(event) {
|
178
|
+
var element = Event.element(event);
|
179
|
+
if (TooltipManager.showTimer) {
|
180
|
+
clearTimeout(TooltipManager.showTimer);
|
181
|
+
TooltipManager.showTimer = null;
|
182
|
+
return;
|
183
|
+
}
|
184
|
+
if (TooltipManager.tooltipWindow)
|
185
|
+
TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
|
186
|
+
},
|
187
|
+
|
188
|
+
_tooltipOver: function(event, element) {
|
189
|
+
if (TooltipManager.hideTimer) {
|
190
|
+
clearTimeout(TooltipManager.hideTimer);
|
191
|
+
TooltipManager.hideTimer = null;
|
192
|
+
}
|
193
|
+
},
|
194
|
+
|
195
|
+
_tooltipOut: function(event, element) {
|
196
|
+
if (TooltipManager.hideTimer == null)
|
197
|
+
TooltipManager.hideTimer = setTimeout(function() {TooltipManager._hideTooltip(element)}, TooltipManager.options.delayOut)
|
198
|
+
},
|
199
|
+
|
200
|
+
_getInfo: function(element) {
|
201
|
+
// Find html_ for static content
|
202
|
+
var id = element.className.split(' ').detect(function(name) {return name.indexOf("html_") == 0});
|
203
|
+
var ajax = true;
|
204
|
+
if (id)
|
205
|
+
ajax = false;
|
206
|
+
else
|
207
|
+
// Find ajax_ for ajax content
|
208
|
+
id = element.className.split(' ').detect(function(name) {return name.indexOf("ajax_") == 0});
|
209
|
+
|
210
|
+
id = id.substr(id.indexOf('_')+1, id.length)
|
211
|
+
return id ? {ajax: ajax, id: id} : null;
|
212
|
+
},
|
213
|
+
|
214
|
+
onBeforeShow: function(eventName, win) {
|
215
|
+
var top = parseFloat(win.getLocation().top);
|
216
|
+
var dim = win.element.getDimensions();
|
217
|
+
|
218
|
+
if (top + dim.height > TooltipManager._getScrollTop() + TooltipManager._getPageHeight()) {
|
219
|
+
var position = Position.cumulativeOffset(this.element);
|
220
|
+
|
221
|
+
var top = position[1] - TooltipManager.options.shiftY - dim.height;
|
222
|
+
win.setLocation(top, position[0] + TooltipManager.options.shiftX)
|
223
|
+
}
|
224
|
+
},
|
225
|
+
|
226
|
+
_getPageWidth: function(){
|
227
|
+
return window.innerWidth || document.documentElement.clientWidth || 0;
|
228
|
+
},
|
229
|
+
|
230
|
+
_getPageHeight: function(){
|
231
|
+
return window.innerHeight || document.documentElement.clientHeight || 0;
|
232
|
+
},
|
233
|
+
|
234
|
+
_getScrollTop: function(){
|
235
|
+
return document.documentElement.scrollTop || window.pageYOffset || 0;
|
236
|
+
},
|
237
|
+
|
238
|
+
_getScrollLeft: function(){
|
239
|
+
return document.documentElement.scrollLeft || window.pageXOffset || 0;
|
240
|
+
}
|
241
|
+
};
|