1 | /* KSS plugins for plonetabs */ |
---|
2 | |
---|
3 | kukit.actionsGlobalRegistry.register('plonetabs-redirectTo', function(oper) { |
---|
4 | ;;; oper.componentName = '[plonetabs-redirectTo] action'; |
---|
5 | var wl = window.location; |
---|
6 | oper.evaluateParameters([], {'protocol' : wl.protocol, |
---|
7 | 'host' : wl.host, |
---|
8 | 'pathname' : wl.pathname, |
---|
9 | 'search' : wl.search, |
---|
10 | 'searchparams' : '', |
---|
11 | 'searchvalues' : '', |
---|
12 | 'hash' : wl.hash}); |
---|
13 | |
---|
14 | // normalize parameters |
---|
15 | var protocol = oper.parms.protocol + (oper.parms.protocol[oper.parms.protocol.length - 1] == ':') ? '' : ':'; |
---|
16 | var host = oper.parms.host; |
---|
17 | var pathname = oper.parms.pathname; |
---|
18 | if ((params = oper.parms.searchparams) && (values = oper.parms.searchvalues)) { |
---|
19 | search = '?'; |
---|
20 | params = params.split(','); |
---|
21 | values = values.split(','); |
---|
22 | for (var i = 0; i < params.length; i++) { |
---|
23 | search += params[i] + '=' + values[i] + '&'; |
---|
24 | } |
---|
25 | search = (search.slice(search.length - 1) == '&') ? search.slice(0, search.length - 1) : search; |
---|
26 | } else { |
---|
27 | search = oper.parms.search; |
---|
28 | search = (search && search.substr(0, 1) == '?') ? search : (search ? '?' + search : ''); |
---|
29 | } |
---|
30 | var hash = (oper.parms.hash.length > 1) ? ((oper.parms.hash.substr(0, 1) == '#' ? '' : '#') + oper.parms.hash) : ''; |
---|
31 | |
---|
32 | url = protocol + '//' + host + pathname + search + hash; |
---|
33 | window.location.replace(url); |
---|
34 | |
---|
35 | }); |
---|
36 | |
---|
37 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-redirectTo', kukit.cr.makeSelectorCommand); |
---|
38 | |
---|
39 | |
---|
40 | kukit.actionsGlobalRegistry.register('plonetabs-toggleCollapsible', function(oper) { |
---|
41 | ;;; oper.componentName = '[plonetabs-toggleCollapsible] action'; |
---|
42 | oper.evaluateParameters([], {'collapsed' : 'collapsedBlock', |
---|
43 | 'expanded' : 'expandedBlock', |
---|
44 | 'collapse': 'none'}); |
---|
45 | |
---|
46 | var node = oper.node.parentNode; // collapsible section |
---|
47 | |
---|
48 | if (oper.parms.collapse != 'none') { |
---|
49 | if (oper.parms.collapse == 'true') { |
---|
50 | removeClassName(node, oper.parms.expanded); |
---|
51 | addClassName(node, oper.parms.collapsed); |
---|
52 | } else { |
---|
53 | removeClassName(node, oper.parms.collapsed); |
---|
54 | addClassName(node, oper.parms.expanded); |
---|
55 | } |
---|
56 | } else { |
---|
57 | if (hasClassName(node, oper.parms.collapsed)) { |
---|
58 | removeClassName(node, oper.parms.collapsed); |
---|
59 | addClassName(node, oper.parms.expanded); |
---|
60 | } else { |
---|
61 | removeClassName(node, oper.parms.expanded); |
---|
62 | addClassName(node, oper.parms.collapsed); |
---|
63 | } |
---|
64 | } |
---|
65 | |
---|
66 | }); |
---|
67 | |
---|
68 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-toggleCollapsible', kukit.cr.makeSelectorCommand); |
---|
69 | |
---|
70 | |
---|
71 | kukit.actionsGlobalRegistry.register('plonetabs-resetForm', function(oper) { |
---|
72 | ;;; oper.componentName = '[plonetabs-resetForm] action'; |
---|
73 | oper.evaluateParameters([], {}); |
---|
74 | if (typeof(oper.node.reset) == 'function' || typeof(oper.node.reset) == 'object') { |
---|
75 | oper.node.reset(); |
---|
76 | } else { |
---|
77 | kukit.logWarning('plonetabs-resetForm: reset could only be executed on form element'); |
---|
78 | } |
---|
79 | |
---|
80 | }); |
---|
81 | |
---|
82 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-resetForm', kukit.cr.makeSelectorCommand); |
---|
83 | |
---|
84 | function blur(node) { |
---|
85 | tagName = node.tagName.toLowerCase(); |
---|
86 | if ((tagName == 'input') || (tagName == 'select') |
---|
87 | || (tagName == 'textarea')) { |
---|
88 | node.blur(); |
---|
89 | ;;;} else { |
---|
90 | ;;; kukit.logWarning('Blur on node that cannot be blured!'); |
---|
91 | }; |
---|
92 | }; |
---|
93 | |
---|
94 | kukit.actionsGlobalRegistry.register('plonetabs-blur', function(oper) { |
---|
95 | ;;; oper.componentName = '[plonetabs-blur] action'; |
---|
96 | // TODO get rid of none |
---|
97 | oper.evaluateParameters([], {'none': false}); |
---|
98 | blur(oper.node); |
---|
99 | |
---|
100 | }); |
---|
101 | |
---|
102 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-blur', kukit.cr.makeSelectorCommand); |
---|
103 | |
---|
104 | kukit.actionsGlobalRegistry.register('plonetabs-handleServerError', function(oper) { |
---|
105 | oper.componentName = '[plonetabs-handleServerError] action'; |
---|
106 | oper.evaluateParameters([], {'message' : ''}); |
---|
107 | var message = oper.parms.message; |
---|
108 | if (message == '') { |
---|
109 | var server_reason = (/^.*(server_reason="(.*?)").*$/i).exec(kukit.E); |
---|
110 | if (server_reason && server_reason[2]) { |
---|
111 | message = server_reason[2]; |
---|
112 | } else { |
---|
113 | var client_reason = (/^.*(client_reason="(.*?)").*$/i).exec(kukit.E); |
---|
114 | if (client_reason && client_reason[2]) { |
---|
115 | message = client_reason[2]; |
---|
116 | if (message.indexOf('invalid KSS response') != -1) { |
---|
117 | message = 'Error occured. ' + |
---|
118 | 'It seems like you are not logged in anymore ' + |
---|
119 | 'or have no privileges to perform this action. ' + |
---|
120 | 'In another case there might be an internal ' + |
---|
121 | 'server error while executing your last action.' + |
---|
122 | ' Check your portal error log.' + |
---|
123 | ' Eventually your server may be not available.'; |
---|
124 | } |
---|
125 | } |
---|
126 | } |
---|
127 | } |
---|
128 | if (message) { |
---|
129 | alert(message); |
---|
130 | } |
---|
131 | }); |
---|
132 | |
---|
133 | |
---|
134 | var PLONETABS_ADD_PATTERN = new RegExp('[^a-zA-Z0-9-_~,.\\$\\(\\)# ]','g'); |
---|
135 | |
---|
136 | kukit.actionsGlobalRegistry.register('plonetabs-generateId', function(oper) { |
---|
137 | oper.componentName = '[plonetabs-generateId] action'; |
---|
138 | oper.evaluateParameters(['target', 'var_name'], {}); |
---|
139 | |
---|
140 | var source = oper.node; |
---|
141 | var var_name = oper.parms.var_name; |
---|
142 | var initialValue = typeof(kukit.engine.stateVariables[var_name]) != 'undefined' ? kukit.engine.stateVariables[var_name] : ''; |
---|
143 | var target = document.getElementById(oper.parms.target); |
---|
144 | |
---|
145 | if (target == null) { |
---|
146 | kukit.logWarning('plonetabs-generateId: target element ("' + oper.parms.target + '") not found'); |
---|
147 | return ; |
---|
148 | } |
---|
149 | |
---|
150 | if (target.value == initialValue.replace(PLONETABS_ADD_PATTERN, '')) { |
---|
151 | target.value = source.value.replace(PLONETABS_ADD_PATTERN, ''); |
---|
152 | } |
---|
153 | kukit.engine.stateVariables[var_name] = source.value; |
---|
154 | |
---|
155 | }); |
---|
156 | |
---|
157 | function plonetabs_notifySortableUpdate(element, oper) { |
---|
158 | var draggables = element.getElementsByTagName('LI'); |
---|
159 | var ids = []; |
---|
160 | for (var i = 0, o; o = draggables[i]; i++) { |
---|
161 | ids.push(o.id); |
---|
162 | } |
---|
163 | oper.parms = {'actions': ids.join('&'), 'cat_name': kukit.engine.stateVariables['plonetabs-category']}; |
---|
164 | oper.executeServerAction('plonetabs-orderActions'); |
---|
165 | } |
---|
166 | |
---|
167 | kukit.actionsGlobalRegistry.register('plonetabs-createSortable', function(oper) { |
---|
168 | oper.componentName = '[plonetabs-createSortable] action'; |
---|
169 | oper.evaluateParameters([], {}, '', true); |
---|
170 | var parms = oper.clone().parms; |
---|
171 | |
---|
172 | var new_oper = oper.clone(); |
---|
173 | parms['onUpdate'] = function(element){plonetabs_notifySortableUpdate(element, new_oper);}; |
---|
174 | Sortable.create(oper.node, parms); |
---|
175 | }); |
---|
176 | |
---|
177 | kukit.actionsGlobalRegistry.register('plonetabs-updateSortable', function(oper) { |
---|
178 | oper.componentName = '[plonetabs-updateSortable] action'; |
---|
179 | oper.evaluateParameters([], {}, '', true); |
---|
180 | var parms = oper.clone().parms; |
---|
181 | var node = oper.node; |
---|
182 | var sort_list = node.parentNode; |
---|
183 | var options_ = Sortable.sortables[sort_list.id]; |
---|
184 | |
---|
185 | if (typeof(options_) != 'undefined') { |
---|
186 | // check whether node element isn't already registered as draggables |
---|
187 | for (var i = 0, drag; drag = options_.draggables[i]; i++) { |
---|
188 | if (node == drag.element) { |
---|
189 | return false; |
---|
190 | } |
---|
191 | } |
---|
192 | // destroy sortable list |
---|
193 | Sortable.destroy(sort_list.id); |
---|
194 | } |
---|
195 | |
---|
196 | var new_oper = oper.clone(); |
---|
197 | parms['onUpdate'] = function(element){plonetabs_notifySortableUpdate(element, new_oper);}; |
---|
198 | Sortable.create(sort_list, parms); |
---|
199 | }); |
---|
200 | |
---|
201 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-updateSortable', kukit.cr.makeSelectorCommand); |
---|
202 | |
---|
203 | kukit.actionsGlobalRegistry.register('plonetabs-replaceOrInsert', function(oper) { |
---|
204 | oper.componentName = '[plonetabs-replaceOrInsert] action'; |
---|
205 | var defaultSelectorType = kukit.selectorTypesGlobalRegistry.defaultSelectorType |
---|
206 | oper.evaluateParameters(['selector', 'html'], {'alternativeHTML': '', |
---|
207 | 'selectorType': defaultSelectorType, |
---|
208 | 'position': 'last', // can be one of the following: first, last, after, before |
---|
209 | 'positionSelector': '', // work together with position=after|before |
---|
210 | 'positionSelectorType': defaultSelectorType, |
---|
211 | 'withKssSetup': true}); |
---|
212 | oper.evalBool('withKssSetup'); |
---|
213 | var parentNode = oper.node; |
---|
214 | var nodes = kukit.selectorTypesGlobalRegistry.get(oper.parms.selectorType)(oper.parms.selector, parentNode); |
---|
215 | if (nodes.length > 0) { |
---|
216 | var content = oper.parms.html; |
---|
217 | var new_node = nodes[0]; |
---|
218 | var action_ = 'replaceHTML'; |
---|
219 | } else { |
---|
220 | var content = oper.parms.alternativeHTML ? oper.parms.alternativeHTML : oper.parms.html; |
---|
221 | var action_ = 'insertHTMLAsLastChild'; |
---|
222 | var new_node = parentNode; |
---|
223 | var position = oper.parms.position; |
---|
224 | if (position == 'first') { |
---|
225 | action_ = 'insertHTMLAsFirstChild'; |
---|
226 | } else if (position == 'after' || position == 'before') { |
---|
227 | var posSelector = kukit.selectorTypesGlobalRegistry.get(oper.parms.positionSelectorType); |
---|
228 | nodes = posSelector(oper.parms.positionSelector, new_node); |
---|
229 | if (nodes.length > 0) { |
---|
230 | new_node = nodes[0]; |
---|
231 | action_ = (position == 'after') ? 'insertHTMLAfter' : 'insertHTMLBefore'; |
---|
232 | } |
---|
233 | } |
---|
234 | } |
---|
235 | var new_oper = new kukit.op.Oper({'node': new_node, |
---|
236 | 'parms': {'html': content, |
---|
237 | 'withKssSetup': oper.parms.withKssSetup}}); |
---|
238 | kukit.actionsGlobalRegistry.get(action_)(new_oper); |
---|
239 | }); |
---|
240 | |
---|
241 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-replaceOrInsert', kukit.cr.makeSelectorCommand); |
---|
242 | |
---|
243 | kukit.actionsGlobalRegistry.register('plonetabs-timeout', function(oper) { |
---|
244 | oper.componentName = '[plonetabs-timeout] action'; |
---|
245 | oper.evaluateParameters(['cmd_name', 'delay',], {'repeat': 'true'}, '', true); |
---|
246 | oper.evalBool('repeat'); |
---|
247 | var parms = oper.parms; |
---|
248 | |
---|
249 | // marshall it, the rest of the parms will be passed |
---|
250 | var actionParameters = {}; |
---|
251 | for (var key in parms) { |
---|
252 | if (key != 'cmd_name' && key != 'delay' && key != 'repeat') { |
---|
253 | actionParameters[key] = parms[key]; |
---|
254 | } |
---|
255 | } |
---|
256 | |
---|
257 | // clear previously set timeout if such exists |
---|
258 | var node = oper.node; |
---|
259 | if (typeof(node.plonetabs_counter) != 'undefined') { |
---|
260 | node.plonetabs_counter.clear(); |
---|
261 | } |
---|
262 | |
---|
263 | // function to bind |
---|
264 | var new_oper = new kukit.op.Oper({'node': node, 'parms': actionParameters}); |
---|
265 | var f = function() { |
---|
266 | // check if the node has been deleted |
---|
267 | // and weed it out if so |
---|
268 | if (oper.node != null && !oper.node.parentNode) { |
---|
269 | ;;; var msg = 'Timeout action with ' + parms.cmd_name; |
---|
270 | ;;; msg += ' client action stopped'; |
---|
271 | ;;; kukit.logDebug(msg); |
---|
272 | this.clear(); |
---|
273 | } else { |
---|
274 | ;;; var msg = 'TIMEOUT: Timer action with ' + parms.cmd_name; |
---|
275 | ;;; msg += ' client action executed'; |
---|
276 | ;;; kukit.logDebug(msg); |
---|
277 | kukit.actionsGlobalRegistry.get(parms.cmd_name)(new_oper); |
---|
278 | } |
---|
279 | }; |
---|
280 | var counter = new kukit.ut.TimerCounter(parms.delay, f, parms.repeat); |
---|
281 | node.plonetabs_counter = counter; |
---|
282 | counter.start(); |
---|
283 | }); |
---|
284 | |
---|
285 | kukit.commandsGlobalRegistry.registerFromAction('plonetabs-timeout', kukit.cr.makeSelectorCommand); |
---|