##// END OF EJS Templates
ie8 fixes for inline comments :/
marcink -
r2698:4debfe3b beta
parent child Browse files
Show More
@@ -1,1713 +1,1731 b''
1 /**
1 /**
2 RhodeCode JS Files
2 RhodeCode JS Files
3 **/
3 **/
4
4
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
5 if (typeof console == "undefined" || typeof console.log == "undefined"){
6 console = { log: function() {} }
6 console = { log: function() {} }
7 }
7 }
8
8
9
9
10 var str_repeat = function(i, m) {
10 var str_repeat = function(i, m) {
11 for (var o = []; m > 0; o[--m] = i);
11 for (var o = []; m > 0; o[--m] = i);
12 return o.join('');
12 return o.join('');
13 };
13 };
14
14
15 /**
15 /**
16 * INJECT .format function into String
16 * INJECT .format function into String
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
17 * Usage: "My name is {0} {1}".format("Johny","Bravo")
18 * Return "My name is Johny Bravo"
18 * Return "My name is Johny Bravo"
19 * Inspired by https://gist.github.com/1049426
19 * Inspired by https://gist.github.com/1049426
20 */
20 */
21 String.prototype.format = function() {
21 String.prototype.format = function() {
22
22
23 function format() {
23 function format() {
24 var str = this;
24 var str = this;
25 var len = arguments.length+1;
25 var len = arguments.length+1;
26 var safe = undefined;
26 var safe = undefined;
27 var arg = undefined;
27 var arg = undefined;
28
28
29 // For each {0} {1} {n...} replace with the argument in that position. If
29 // For each {0} {1} {n...} replace with the argument in that position. If
30 // the argument is an object or an array it will be stringified to JSON.
30 // the argument is an object or an array it will be stringified to JSON.
31 for (var i=0; i < len; arg = arguments[i++]) {
31 for (var i=0; i < len; arg = arguments[i++]) {
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
32 safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
33 str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
34 }
34 }
35 return str;
35 return str;
36 }
36 }
37
37
38 // Save a reference of what may already exist under the property native.
38 // Save a reference of what may already exist under the property native.
39 // Allows for doing something like: if("".format.native) { /* use native */ }
39 // Allows for doing something like: if("".format.native) { /* use native */ }
40 format.native = String.prototype.format;
40 format.native = String.prototype.format;
41
41
42 // Replace the prototype property
42 // Replace the prototype property
43 return format;
43 return format;
44
44
45 }();
45 }();
46
46
47 String.prototype.strip = function(char) {
47 String.prototype.strip = function(char) {
48 if(char === undefined){
48 if(char === undefined){
49 char = '\\s';
49 char = '\\s';
50 }
50 }
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
51 return this.replace(new RegExp('^'+char+'+|'+char+'+$','g'), '');
52 }
52 }
53 String.prototype.lstrip = function(char) {
53 String.prototype.lstrip = function(char) {
54 if(char === undefined){
54 if(char === undefined){
55 char = '\\s';
55 char = '\\s';
56 }
56 }
57 return this.replace(new RegExp('^'+char+'+'),'');
57 return this.replace(new RegExp('^'+char+'+'),'');
58 }
58 }
59 String.prototype.rstrip = function(char) {
59 String.prototype.rstrip = function(char) {
60 if(char === undefined){
60 if(char === undefined){
61 char = '\\s';
61 char = '\\s';
62 }
62 }
63 return this.replace(new RegExp(''+char+'+$'),'');
63 return this.replace(new RegExp(''+char+'+$'),'');
64 }
64 }
65
65
66
66
67 if(!Array.prototype.indexOf) {
67 if(!Array.prototype.indexOf) {
68 Array.prototype.indexOf = function(needle) {
68 Array.prototype.indexOf = function(needle) {
69 for(var i = 0; i < this.length; i++) {
69 for(var i = 0; i < this.length; i++) {
70 if(this[i] === needle) {
70 if(this[i] === needle) {
71 return i;
71 return i;
72 }
72 }
73 }
73 }
74 return -1;
74 return -1;
75 };
75 };
76 }
76 }
77
77
78 // IE(CRAP) doesn't support previousElementSibling
79 var prevElementSibling = function( el ) {
80 if( el.previousElementSibling ) {
81 return el.previousElementSibling;
82 } else {
83 while( el = el.previousSibling ) {
84 if( el.nodeType === 1 ) return el;
85 }
86 }
87 }
88
89
90
91
78 /**
92 /**
79 * SmartColorGenerator
93 * SmartColorGenerator
80 *
94 *
81 *usage::
95 *usage::
82 * var CG = new ColorGenerator();
96 * var CG = new ColorGenerator();
83 * var col = CG.getColor(key); //returns array of RGB
97 * var col = CG.getColor(key); //returns array of RGB
84 * 'rgb({0})'.format(col.join(',')
98 * 'rgb({0})'.format(col.join(',')
85 *
99 *
86 * @returns {ColorGenerator}
100 * @returns {ColorGenerator}
87 */
101 */
88 var ColorGenerator = function(){
102 var ColorGenerator = function(){
89 this.GOLDEN_RATIO = 0.618033988749895;
103 this.GOLDEN_RATIO = 0.618033988749895;
90 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
104 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
91 this.HSV_1 = 0.75;//saturation
105 this.HSV_1 = 0.75;//saturation
92 this.HSV_2 = 0.95;
106 this.HSV_2 = 0.95;
93 this.color;
107 this.color;
94 this.cacheColorMap = {};
108 this.cacheColorMap = {};
95 };
109 };
96
110
97 ColorGenerator.prototype = {
111 ColorGenerator.prototype = {
98 getColor:function(key){
112 getColor:function(key){
99 if(this.cacheColorMap[key] !== undefined){
113 if(this.cacheColorMap[key] !== undefined){
100 return this.cacheColorMap[key];
114 return this.cacheColorMap[key];
101 }
115 }
102 else{
116 else{
103 this.cacheColorMap[key] = this.generateColor();
117 this.cacheColorMap[key] = this.generateColor();
104 return this.cacheColorMap[key];
118 return this.cacheColorMap[key];
105 }
119 }
106 },
120 },
107 _hsvToRgb:function(h,s,v){
121 _hsvToRgb:function(h,s,v){
108 if (s == 0.0)
122 if (s == 0.0)
109 return [v, v, v];
123 return [v, v, v];
110 i = parseInt(h * 6.0)
124 i = parseInt(h * 6.0)
111 f = (h * 6.0) - i
125 f = (h * 6.0) - i
112 p = v * (1.0 - s)
126 p = v * (1.0 - s)
113 q = v * (1.0 - s * f)
127 q = v * (1.0 - s * f)
114 t = v * (1.0 - s * (1.0 - f))
128 t = v * (1.0 - s * (1.0 - f))
115 i = i % 6
129 i = i % 6
116 if (i == 0)
130 if (i == 0)
117 return [v, t, p]
131 return [v, t, p]
118 if (i == 1)
132 if (i == 1)
119 return [q, v, p]
133 return [q, v, p]
120 if (i == 2)
134 if (i == 2)
121 return [p, v, t]
135 return [p, v, t]
122 if (i == 3)
136 if (i == 3)
123 return [p, q, v]
137 return [p, q, v]
124 if (i == 4)
138 if (i == 4)
125 return [t, p, v]
139 return [t, p, v]
126 if (i == 5)
140 if (i == 5)
127 return [v, p, q]
141 return [v, p, q]
128 },
142 },
129 generateColor:function(){
143 generateColor:function(){
130 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
144 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
131 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
145 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
132 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
146 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
133 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
147 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
134 function toRgb(v){
148 function toRgb(v){
135 return ""+parseInt(v*256)
149 return ""+parseInt(v*256)
136 }
150 }
137 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
151 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
138
152
139 }
153 }
140 }
154 }
141
155
142
156
143
157
144
158
145
159
146 /**
160 /**
147 * GLOBAL YUI Shortcuts
161 * GLOBAL YUI Shortcuts
148 */
162 */
149 var YUC = YAHOO.util.Connect;
163 var YUC = YAHOO.util.Connect;
150 var YUD = YAHOO.util.Dom;
164 var YUD = YAHOO.util.Dom;
151 var YUE = YAHOO.util.Event;
165 var YUE = YAHOO.util.Event;
152 var YUQ = YAHOO.util.Selector.query;
166 var YUQ = YAHOO.util.Selector.query;
153
167
154 // defines if push state is enabled for this browser ?
168 // defines if push state is enabled for this browser ?
155 var push_state_enabled = Boolean(
169 var push_state_enabled = Boolean(
156 window.history && window.history.pushState && window.history.replaceState
170 window.history && window.history.pushState && window.history.replaceState
157 && !( /* disable for versions of iOS before version 4.3 (8F190) */
171 && !( /* disable for versions of iOS before version 4.3 (8F190) */
158 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
172 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
159 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
173 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
160 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
174 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
161 )
175 )
162 );
176 );
163
177
164 var _run_callbacks = function(callbacks){
178 var _run_callbacks = function(callbacks){
165 if (callbacks !== undefined){
179 if (callbacks !== undefined){
166 var _l = callbacks.length;
180 var _l = callbacks.length;
167 for (var i=0;i<_l;i++){
181 for (var i=0;i<_l;i++){
168 var func = callbacks[i];
182 var func = callbacks[i];
169 if(typeof(func)=='function'){
183 if(typeof(func)=='function'){
170 try{
184 try{
171 func();
185 func();
172 }catch (err){};
186 }catch (err){};
173 }
187 }
174 }
188 }
175 }
189 }
176 }
190 }
177
191
178 /**
192 /**
179 * Partial Ajax Implementation
193 * Partial Ajax Implementation
180 *
194 *
181 * @param url: defines url to make partial request
195 * @param url: defines url to make partial request
182 * @param container: defines id of container to input partial result
196 * @param container: defines id of container to input partial result
183 * @param s_call: success callback function that takes o as arg
197 * @param s_call: success callback function that takes o as arg
184 * o.tId
198 * o.tId
185 * o.status
199 * o.status
186 * o.statusText
200 * o.statusText
187 * o.getResponseHeader[ ]
201 * o.getResponseHeader[ ]
188 * o.getAllResponseHeaders
202 * o.getAllResponseHeaders
189 * o.responseText
203 * o.responseText
190 * o.responseXML
204 * o.responseXML
191 * o.argument
205 * o.argument
192 * @param f_call: failure callback
206 * @param f_call: failure callback
193 * @param args arguments
207 * @param args arguments
194 */
208 */
195 function ypjax(url,container,s_call,f_call,args){
209 function ypjax(url,container,s_call,f_call,args){
196 var method='GET';
210 var method='GET';
197 if(args===undefined){
211 if(args===undefined){
198 args=null;
212 args=null;
199 }
213 }
200
214
201 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
215 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
202 YUC.initHeader('X-PARTIAL-XHR',true);
216 YUC.initHeader('X-PARTIAL-XHR',true);
203
217
204 // wrapper of passed callback
218 // wrapper of passed callback
205 var s_wrapper = (function(o){
219 var s_wrapper = (function(o){
206 return function(o){
220 return function(o){
207 YUD.get(container).innerHTML=o.responseText;
221 YUD.get(container).innerHTML=o.responseText;
208 YUD.setStyle(container,'opacity','1.0');
222 YUD.setStyle(container,'opacity','1.0');
209 //execute the given original callback
223 //execute the given original callback
210 if (s_call !== undefined){
224 if (s_call !== undefined){
211 s_call(o);
225 s_call(o);
212 }
226 }
213 }
227 }
214 })()
228 })()
215 YUD.setStyle(container,'opacity','0.3');
229 YUD.setStyle(container,'opacity','0.3');
216 YUC.asyncRequest(method,url,{
230 YUC.asyncRequest(method,url,{
217 success:s_wrapper,
231 success:s_wrapper,
218 failure:function(o){
232 failure:function(o){
219 console.log(o);
233 console.log(o);
220 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
234 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
221 YUD.setStyle(container,'opacity','1.0');
235 YUD.setStyle(container,'opacity','1.0');
222 },
236 },
223 cache:false
237 cache:false
224 },args);
238 },args);
225
239
226 };
240 };
227
241
228 var ajaxPOST = function(url,postData,success) {
242 var ajaxPOST = function(url,postData,success) {
229 // Set special header for ajax == HTTP_X_PARTIAL_XHR
243 // Set special header for ajax == HTTP_X_PARTIAL_XHR
230 YUC.initHeader('X-PARTIAL-XHR',true);
244 YUC.initHeader('X-PARTIAL-XHR',true);
231
245
232 var toQueryString = function(o) {
246 var toQueryString = function(o) {
233 if(typeof o !== 'object') {
247 if(typeof o !== 'object') {
234 return false;
248 return false;
235 }
249 }
236 var _p, _qs = [];
250 var _p, _qs = [];
237 for(_p in o) {
251 for(_p in o) {
238 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
252 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
239 }
253 }
240 return _qs.join('&');
254 return _qs.join('&');
241 };
255 };
242
256
243 var sUrl = url;
257 var sUrl = url;
244 var callback = {
258 var callback = {
245 success: success,
259 success: success,
246 failure: function (o) {
260 failure: function (o) {
247 alert("error");
261 alert("error");
248 },
262 },
249 };
263 };
250 var postData = toQueryString(postData);
264 var postData = toQueryString(postData);
251 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
265 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
252 return request;
266 return request;
253 };
267 };
254
268
255
269
256 /**
270 /**
257 * tooltip activate
271 * tooltip activate
258 */
272 */
259 var tooltip_activate = function(){
273 var tooltip_activate = function(){
260 function toolTipsId(){
274 function toolTipsId(){
261 var ids = [];
275 var ids = [];
262 var tts = YUQ('.tooltip');
276 var tts = YUQ('.tooltip');
263 for (var i = 0; i < tts.length; i++) {
277 for (var i = 0; i < tts.length; i++) {
264 // if element doesn't not have and id
278 // if element doesn't not have and id
265 // autogenerate one for tooltip
279 // autogenerate one for tooltip
266 if (!tts[i].id){
280 if (!tts[i].id){
267 tts[i].id='tt'+((i*100)+tts.length);
281 tts[i].id='tt'+((i*100)+tts.length);
268 }
282 }
269 ids.push(tts[i].id);
283 ids.push(tts[i].id);
270 }
284 }
271 return ids
285 return ids
272 };
286 };
273 var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
287 var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
274 context: [[toolTipsId()],"tl","bl",null,[0,5]],
288 context: [[toolTipsId()],"tl","bl",null,[0,5]],
275 monitorresize:false,
289 monitorresize:false,
276 xyoffset :[0,0],
290 xyoffset :[0,0],
277 autodismissdelay:300000,
291 autodismissdelay:300000,
278 hidedelay:5,
292 hidedelay:5,
279 showdelay:20,
293 showdelay:20,
280 });
294 });
281 };
295 };
282
296
283 /**
297 /**
284 * show more
298 * show more
285 */
299 */
286 var show_more_event = function(){
300 var show_more_event = function(){
287 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
301 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
288 var el = e.target;
302 var el = e.target;
289 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
303 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
290 YUD.setStyle(el.parentNode,'display','none');
304 YUD.setStyle(el.parentNode,'display','none');
291 });
305 });
292 };
306 };
293
307
294
308
295 /**
309 /**
296 * Quick filter widget
310 * Quick filter widget
297 *
311 *
298 * @param target: filter input target
312 * @param target: filter input target
299 * @param nodes: list of nodes in html we want to filter.
313 * @param nodes: list of nodes in html we want to filter.
300 * @param display_element function that takes current node from nodes and
314 * @param display_element function that takes current node from nodes and
301 * does hide or show based on the node
315 * does hide or show based on the node
302 *
316 *
303 */
317 */
304 var q_filter = function(target,nodes,display_element){
318 var q_filter = function(target,nodes,display_element){
305
319
306 var nodes = nodes;
320 var nodes = nodes;
307 var q_filter_field = YUD.get(target);
321 var q_filter_field = YUD.get(target);
308 var F = YAHOO.namespace(target);
322 var F = YAHOO.namespace(target);
309
323
310 YUE.on(q_filter_field,'click',function(){
324 YUE.on(q_filter_field,'click',function(){
311 q_filter_field.value = '';
325 q_filter_field.value = '';
312 });
326 });
313
327
314 YUE.on(q_filter_field,'keyup',function(e){
328 YUE.on(q_filter_field,'keyup',function(e){
315 clearTimeout(F.filterTimeout);
329 clearTimeout(F.filterTimeout);
316 F.filterTimeout = setTimeout(F.updateFilter,600);
330 F.filterTimeout = setTimeout(F.updateFilter,600);
317 });
331 });
318
332
319 F.filterTimeout = null;
333 F.filterTimeout = null;
320
334
321 var show_node = function(node){
335 var show_node = function(node){
322 YUD.setStyle(node,'display','')
336 YUD.setStyle(node,'display','')
323 }
337 }
324 var hide_node = function(node){
338 var hide_node = function(node){
325 YUD.setStyle(node,'display','none');
339 YUD.setStyle(node,'display','none');
326 }
340 }
327
341
328 F.updateFilter = function() {
342 F.updateFilter = function() {
329 // Reset timeout
343 // Reset timeout
330 F.filterTimeout = null;
344 F.filterTimeout = null;
331
345
332 var obsolete = [];
346 var obsolete = [];
333
347
334 var req = q_filter_field.value.toLowerCase();
348 var req = q_filter_field.value.toLowerCase();
335
349
336 var l = nodes.length;
350 var l = nodes.length;
337 var i;
351 var i;
338 var showing = 0;
352 var showing = 0;
339
353
340 for (i=0;i<l;i++ ){
354 for (i=0;i<l;i++ ){
341 var n = nodes[i];
355 var n = nodes[i];
342 var target_element = display_element(n)
356 var target_element = display_element(n)
343 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
357 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
344 hide_node(target_element);
358 hide_node(target_element);
345 }
359 }
346 else{
360 else{
347 show_node(target_element);
361 show_node(target_element);
348 showing+=1;
362 showing+=1;
349 }
363 }
350 }
364 }
351
365
352 // if repo_count is set update the number
366 // if repo_count is set update the number
353 var cnt = YUD.get('repo_count');
367 var cnt = YUD.get('repo_count');
354 if(cnt){
368 if(cnt){
355 YUD.get('repo_count').innerHTML = showing;
369 YUD.get('repo_count').innerHTML = showing;
356 }
370 }
357
371
358 }
372 }
359 };
373 };
360
374
361 var tableTr = function(cls,body){
375 var tableTr = function(cls,body){
362 var tr = document.createElement('tr');
376 var tr = document.createElement('tr');
363 YUD.addClass(tr, cls);
377 YUD.addClass(tr, cls);
364
378
365
379
366 var cont = new YAHOO.util.Element(body);
380 var cont = new YAHOO.util.Element(body);
367 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
381 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
368 tr.id = 'comment-tr-{0}'.format(comment_id);
382 tr.id = 'comment-tr-{0}'.format(comment_id);
369 tr.innerHTML = '<td class="lineno-inline new-inline"></td>'+
383 tr.innerHTML = '<td class="lineno-inline new-inline"></td>'+
370 '<td class="lineno-inline old-inline"></td>'+
384 '<td class="lineno-inline old-inline"></td>'+
371 '<td>{0}</td>'.format(body);
385 '<td>{0}</td>'.format(body);
372 return tr;
386 return tr;
373 };
387 };
374
388
375 /** comments **/
389 /** comments **/
376 var removeInlineForm = function(form) {
390 var removeInlineForm = function(form) {
377 form.parentNode.removeChild(form);
391 form.parentNode.removeChild(form);
378 };
392 };
379
393
380 var createInlineForm = function(parent_tr, f_path, line) {
394 var createInlineForm = function(parent_tr, f_path, line) {
381 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
395 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
382 tmpl = tmpl.format(f_path, line);
396 tmpl = tmpl.format(f_path, line);
383 var form = tableTr('comment-form-inline',tmpl)
397 var form = tableTr('comment-form-inline',tmpl)
384
398
385 // create event for hide button
399 // create event for hide button
386 form = new YAHOO.util.Element(form);
400 form = new YAHOO.util.Element(form);
387 var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
401 var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
388 form_hide_button.on('click', function(e) {
402 form_hide_button.on('click', function(e) {
389 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
403 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
390 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
404 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
391 YUD.setStyle(newtr.nextElementSibling,'display','');
405 YUD.setStyle(newtr.nextElementSibling,'display','');
392 }
406 }
393 removeInlineForm(newtr);
407 removeInlineForm(newtr);
394 YUD.removeClass(parent_tr, 'form-open');
408 YUD.removeClass(parent_tr, 'form-open');
395
409
396 });
410 });
397
411
398 return form
412 return form
399 };
413 };
400
414
401 /**
415 /**
402 * Inject inline comment for on given TR this tr should be always an .line
416 * Inject inline comment for on given TR this tr should be always an .line
403 * tr containing the line. Code will detect comment, and always put the comment
417 * tr containing the line. Code will detect comment, and always put the comment
404 * block at the very bottom
418 * block at the very bottom
405 */
419 */
406 var injectInlineForm = function(tr){
420 var injectInlineForm = function(tr){
407 if(!YUD.hasClass(tr, 'line')){
421 if(!YUD.hasClass(tr, 'line')){
408 return
422 return
409 }
423 }
410 var submit_url = AJAX_COMMENT_URL;
424 var submit_url = AJAX_COMMENT_URL;
411 var _td = tr.getElementsByClassName('code')[0];
425 var _td = tr.getElementsByClassName('code')[0];
412 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
426 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
413 return
427 return
414 }
428 }
415 YUD.addClass(tr,'form-open');
429 YUD.addClass(tr,'form-open');
416 var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0];
430 var node = tr.parentNode.parentNode.parentNode.getElementsByClassName('full_f_path')[0];
417 var f_path = YUD.getAttribute(node,'path');
431 var f_path = YUD.getAttribute(node,'path');
418 var lineno = getLineNo(tr);
432 var lineno = getLineNo(tr);
419 var form = createInlineForm(tr, f_path, lineno, submit_url);
433 var form = createInlineForm(tr, f_path, lineno, submit_url);
420
434
421 var parent = tr;
435 var parent = tr;
422 while (1){
436 while (1){
423 var n = parent.nextElementSibling;
437 var n = parent.nextElementSibling;
424 // next element are comments !
438 // next element are comments !
425 if(YUD.hasClass(n,'inline-comments')){
439 if(YUD.hasClass(n,'inline-comments')){
426 parent = n;
440 parent = n;
427 }
441 }
428 else{
442 else{
429 break;
443 break;
430 }
444 }
431 }
445 }
432 YUD.insertAfter(form,parent);
446 YUD.insertAfter(form,parent);
433
447
434 var f = YUD.get(form);
448 var f = YUD.get(form);
435
449
436 var overlay = f.getElementsByClassName('overlay')[0];
450 var overlay = f.getElementsByClassName('overlay')[0];
437 var _form = f.getElementsByClassName('inline-form')[0];
451 var _form = f.getElementsByClassName('inline-form')[0];
438
452
439 form.on('submit',function(e){
453 form.on('submit',function(e){
440 YUE.preventDefault(e);
454 YUE.preventDefault(e);
441
455
442 //ajax submit
456 //ajax submit
443 var text = YUD.get('text_'+lineno).value;
457 var text = YUD.get('text_'+lineno).value;
444 var postData = {
458 var postData = {
445 'text':text,
459 'text':text,
446 'f_path':f_path,
460 'f_path':f_path,
447 'line':lineno
461 'line':lineno
448 };
462 };
449
463
450 if(lineno === undefined){
464 if(lineno === undefined){
451 alert('missing line !');
465 alert('missing line !');
452 return
466 return
453 }
467 }
454 if(f_path === undefined){
468 if(f_path === undefined){
455 alert('missing file path !');
469 alert('missing file path !');
456 return
470 return
457 }
471 }
458
472
459 if(text == ""){
473 if(text == ""){
460 return
474 return
461 }
475 }
462
476
463 var success = function(o){
477 var success = function(o){
464 YUD.removeClass(tr, 'form-open');
478 YUD.removeClass(tr, 'form-open');
465 removeInlineForm(f);
479 removeInlineForm(f);
466 var json_data = JSON.parse(o.responseText);
480 var json_data = JSON.parse(o.responseText);
467 renderInlineComment(json_data);
481 renderInlineComment(json_data);
468 };
482 };
469
483
470 if (YUD.hasClass(overlay,'overlay')){
484 if (YUD.hasClass(overlay,'overlay')){
471 var w = _form.offsetWidth;
485 var w = _form.offsetWidth;
472 var h = _form.offsetHeight;
486 var h = _form.offsetHeight;
473 YUD.setStyle(overlay,'width',w+'px');
487 YUD.setStyle(overlay,'width',w+'px');
474 YUD.setStyle(overlay,'height',h+'px');
488 YUD.setStyle(overlay,'height',h+'px');
475 }
489 }
476 YUD.addClass(overlay, 'submitting');
490 YUD.addClass(overlay, 'submitting');
477
491
478 ajaxPOST(submit_url, postData, success);
492 ajaxPOST(submit_url, postData, success);
479 });
493 });
480
494
481 setTimeout(function(){
495 setTimeout(function(){
482 // callbacks
496 // callbacks
483 tooltip_activate();
497 tooltip_activate();
484 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
498 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
485 _USERS_AC_DATA, _GROUPS_AC_DATA);
499 _USERS_AC_DATA, _GROUPS_AC_DATA);
486 YUD.get('text_'+lineno).focus();
500 var _e = YUD.get('text_'+lineno);
501 if(_e){
502 _e.focus();
503 }
487 },10)
504 },10)
488 };
505 };
489
506
490 var deleteComment = function(comment_id){
507 var deleteComment = function(comment_id){
491 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
508 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
492 var postData = {'_method':'delete'};
509 var postData = {'_method':'delete'};
493 var success = function(o){
510 var success = function(o){
494 var n = YUD.get('comment-tr-'+comment_id);
511 var n = YUD.get('comment-tr-'+comment_id);
495 var root = n.previousElementSibling.previousElementSibling;
512 var root = prevElementSibling(prevElementSibling(n));
496 n.parentNode.removeChild(n);
513 n.parentNode.removeChild(n);
497
514
498 // scann nodes, and attach add button to last one
515 // scann nodes, and attach add button to last one
499 placeAddButton(root);
516 placeAddButton(root);
500 }
517 }
501 ajaxPOST(url,postData,success);
518 ajaxPOST(url,postData,success);
502 }
519 }
503
520
504 var updateReviewers = function(reviewers_ids){
521 var updateReviewers = function(reviewers_ids){
505 var url = AJAX_UPDATE_PULLREQUEST;
522 var url = AJAX_UPDATE_PULLREQUEST;
506 var postData = {'_method':'put',
523 var postData = {'_method':'put',
507 'reviewers_ids': reviewers_ids};
524 'reviewers_ids': reviewers_ids};
508 var success = function(o){
525 var success = function(o){
509 window.location.reload();
526 window.location.reload();
510 }
527 }
511 ajaxPOST(url,postData,success);
528 ajaxPOST(url,postData,success);
512 }
529 }
513
530
514 var createInlineAddButton = function(tr){
531 var createInlineAddButton = function(tr){
515
532
516 var label = TRANSLATION_MAP['add another comment'];
533 var label = TRANSLATION_MAP['add another comment'];
517
534
518 var html_el = document.createElement('div');
535 var html_el = document.createElement('div');
519 YUD.addClass(html_el, 'add-comment');
536 YUD.addClass(html_el, 'add-comment');
520 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
537 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
521
538
522 var add = new YAHOO.util.Element(html_el);
539 var add = new YAHOO.util.Element(html_el);
523 add.on('click', function(e) {
540 add.on('click', function(e) {
524 injectInlineForm(tr);
541 injectInlineForm(tr);
525 });
542 });
526 return add;
543 return add;
527 };
544 };
528
545
529 var getLineNo = function(tr) {
546 var getLineNo = function(tr) {
530 var line;
547 var line;
531 var o = tr.children[0].id.split('_');
548 var o = tr.children[0].id.split('_');
532 var n = tr.children[1].id.split('_');
549 var n = tr.children[1].id.split('_');
533
550
534 if (n.length >= 2) {
551 if (n.length >= 2) {
535 line = n[n.length-1];
552 line = n[n.length-1];
536 } else if (o.length >= 2) {
553 } else if (o.length >= 2) {
537 line = o[o.length-1];
554 line = o[o.length-1];
538 }
555 }
539
556
540 return line
557 return line
541 };
558 };
542
559
543 var placeAddButton = function(target_tr){
560 var placeAddButton = function(target_tr){
544 if(!target_tr){
561 if(!target_tr){
545 return
562 return
546 }
563 }
547 var last_node = target_tr;
564 var last_node = target_tr;
548 //scann
565 //scann
549 while (1){
566 while (1){
550 var n = last_node.nextElementSibling;
567 var n = last_node.nextElementSibling;
551 // next element are comments !
568 // next element are comments !
552 if(YUD.hasClass(n,'inline-comments')){
569 if(YUD.hasClass(n,'inline-comments')){
553 last_node = n;
570 last_node = n;
554 //also remove the comment button from previos
571 //also remove the comment button from previos
555 var comment_add_buttons = last_node.getElementsByClassName('add-comment');
572 var comment_add_buttons = last_node.getElementsByClassName('add-comment');
556 for(var i=0;i<comment_add_buttons.length;i++){
573 for(var i=0;i<comment_add_buttons.length;i++){
557 var b = comment_add_buttons[i];
574 var b = comment_add_buttons[i];
558 b.parentNode.removeChild(b);
575 b.parentNode.removeChild(b);
559 }
576 }
560 }
577 }
561 else{
578 else{
562 break;
579 break;
563 }
580 }
564 }
581 }
565
582
566 var add = createInlineAddButton(target_tr);
583 var add = createInlineAddButton(target_tr);
567 // get the comment div
584 // get the comment div
568 var comment_block = last_node.getElementsByClassName('comment')[0];
585 var comment_block = last_node.getElementsByClassName('comment')[0];
569 // attach add button
586 // attach add button
570 YUD.insertAfter(add,comment_block);
587 YUD.insertAfter(add,comment_block);
571 }
588 }
572
589
573 /**
590 /**
574 * Places the inline comment into the changeset block in proper line position
591 * Places the inline comment into the changeset block in proper line position
575 */
592 */
576 var placeInline = function(target_container,lineno,html){
593 var placeInline = function(target_container,lineno,html){
577 var lineid = "{0}_{1}".format(target_container,lineno);
594 var lineid = "{0}_{1}".format(target_container,lineno);
578 var target_line = YUD.get(lineid);
595 var target_line = YUD.get(lineid);
579 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
596 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
580
597
581 // check if there are comments already !
598 // check if there are comments already !
582 var parent = target_line.parentNode;
599 var parent = target_line.parentNode;
583 var root_parent = parent;
600 var root_parent = parent;
584 while (1){
601 while (1){
585 var n = parent.nextElementSibling;
602 var n = parent.nextElementSibling;
586 // next element are comments !
603 // next element are comments !
587 if(YUD.hasClass(n,'inline-comments')){
604 if(YUD.hasClass(n,'inline-comments')){
588 parent = n;
605 parent = n;
589 }
606 }
590 else{
607 else{
591 break;
608 break;
592 }
609 }
593 }
610 }
594 // put in the comment at the bottom
611 // put in the comment at the bottom
595 YUD.insertAfter(comment,parent);
612 YUD.insertAfter(comment,parent);
596
613
597 // scann nodes, and attach add button to last one
614 // scann nodes, and attach add button to last one
598 placeAddButton(root_parent);
615 placeAddButton(root_parent);
599
616
600 return target_line;
617 return target_line;
601 }
618 }
602
619
603 /**
620 /**
604 * make a single inline comment and place it inside
621 * make a single inline comment and place it inside
605 */
622 */
606 var renderInlineComment = function(json_data){
623 var renderInlineComment = function(json_data){
607 try{
624 try{
608 var html = json_data['rendered_text'];
625 var html = json_data['rendered_text'];
609 var lineno = json_data['line_no'];
626 var lineno = json_data['line_no'];
610 var target_id = json_data['target_id'];
627 var target_id = json_data['target_id'];
611 placeInline(target_id, lineno, html);
628 placeInline(target_id, lineno, html);
612
629
613 }catch(e){
630 }catch(e){
614 console.log(e);
631 console.log(e);
615 }
632 }
616 }
633 }
617
634
618 /**
635 /**
619 * Iterates over all the inlines, and places them inside proper blocks of data
636 * Iterates over all the inlines, and places them inside proper blocks of data
620 */
637 */
621 var renderInlineComments = function(file_comments){
638 var renderInlineComments = function(file_comments){
622 for (f in file_comments){
639 for (f in file_comments){
623 // holding all comments for a FILE
640 // holding all comments for a FILE
624 var box = file_comments[f];
641 var box = file_comments[f];
625
642
626 var target_id = YUD.getAttribute(box,'target_id');
643 var target_id = YUD.getAttribute(box,'target_id');
627 // actually comments with line numbers
644 // actually comments with line numbers
628 var comments = box.children;
645 var comments = box.children;
629 for(var i=0; i<comments.length; i++){
646 for(var i=0; i<comments.length; i++){
630 var data = {
647 var data = {
631 'rendered_text': comments[i].outerHTML,
648 'rendered_text': comments[i].outerHTML,
632 'line_no': YUD.getAttribute(comments[i],'line'),
649 'line_no': YUD.getAttribute(comments[i],'line'),
633 'target_id': target_id
650 'target_id': target_id
634 }
651 }
635 renderInlineComment(data);
652 renderInlineComment(data);
636 }
653 }
637 }
654 }
638 }
655 }
639
656
640 var removeReviewer = function(reviewer_id){
657 var removeReviewer = function(reviewer_id){
641 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
658 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
642 if (el.parentNode !== undefined){
659 if (el.parentNode !== undefined){
643 el.parentNode.removeChild(el);
660 el.parentNode.removeChild(el);
644 }
661 }
645 }
662 }
646
663
647 var fileBrowserListeners = function(current_url, node_list_url, url_base){
664 var fileBrowserListeners = function(current_url, node_list_url, url_base){
648
665
649 var current_url_branch = +"?branch=__BRANCH__";
666 var current_url_branch = +"?branch=__BRANCH__";
650 var url = url_base;
667 var url = url_base;
651 var node_url = node_list_url;
668 var node_url = node_list_url;
652
669
653 YUE.on('stay_at_branch','click',function(e){
670 YUE.on('stay_at_branch','click',function(e){
654 if(e.target.checked){
671 if(e.target.checked){
655 var uri = current_url_branch;
672 var uri = current_url_branch;
656 uri = uri.replace('__BRANCH__',e.target.value);
673 uri = uri.replace('__BRANCH__',e.target.value);
657 window.location = uri;
674 window.location = uri;
658 }
675 }
659 else{
676 else{
660 window.location = current_url;
677 window.location = current_url;
661 }
678 }
662 })
679 })
663
680
664 var n_filter = YUD.get('node_filter');
681 var n_filter = YUD.get('node_filter');
665 var F = YAHOO.namespace('node_filter');
682 var F = YAHOO.namespace('node_filter');
666
683
667 F.filterTimeout = null;
684 F.filterTimeout = null;
668 var nodes = null;
685 var nodes = null;
669
686
670 F.initFilter = function(){
687 F.initFilter = function(){
671 YUD.setStyle('node_filter_box_loading','display','');
688 YUD.setStyle('node_filter_box_loading','display','');
672 YUD.setStyle('search_activate_id','display','none');
689 YUD.setStyle('search_activate_id','display','none');
673 YUD.setStyle('add_node_id','display','none');
690 YUD.setStyle('add_node_id','display','none');
674 YUC.initHeader('X-PARTIAL-XHR',true);
691 YUC.initHeader('X-PARTIAL-XHR',true);
675 YUC.asyncRequest('GET',url,{
692 YUC.asyncRequest('GET',url,{
676 success:function(o){
693 success:function(o){
677 nodes = JSON.parse(o.responseText).nodes;
694 nodes = JSON.parse(o.responseText).nodes;
678 YUD.setStyle('node_filter_box_loading','display','none');
695 YUD.setStyle('node_filter_box_loading','display','none');
679 YUD.setStyle('node_filter_box','display','');
696 YUD.setStyle('node_filter_box','display','');
680 n_filter.focus();
697 n_filter.focus();
681 if(YUD.hasClass(n_filter,'init')){
698 if(YUD.hasClass(n_filter,'init')){
682 n_filter.value = '';
699 n_filter.value = '';
683 YUD.removeClass(n_filter,'init');
700 YUD.removeClass(n_filter,'init');
684 }
701 }
685 },
702 },
686 failure:function(o){
703 failure:function(o){
687 console.log('failed to load');
704 console.log('failed to load');
688 }
705 }
689 },null);
706 },null);
690 }
707 }
691
708
692 F.updateFilter = function(e) {
709 F.updateFilter = function(e) {
693
710
694 return function(){
711 return function(){
695 // Reset timeout
712 // Reset timeout
696 F.filterTimeout = null;
713 F.filterTimeout = null;
697 var query = e.target.value.toLowerCase();
714 var query = e.target.value.toLowerCase();
698 var match = [];
715 var match = [];
699 var matches = 0;
716 var matches = 0;
700 var matches_max = 20;
717 var matches_max = 20;
701 if (query != ""){
718 if (query != ""){
702 for(var i=0;i<nodes.length;i++){
719 for(var i=0;i<nodes.length;i++){
703
720
704 var pos = nodes[i].name.toLowerCase().indexOf(query)
721 var pos = nodes[i].name.toLowerCase().indexOf(query)
705 if(query && pos != -1){
722 if(query && pos != -1){
706
723
707 matches++
724 matches++
708 //show only certain amount to not kill browser
725 //show only certain amount to not kill browser
709 if (matches > matches_max){
726 if (matches > matches_max){
710 break;
727 break;
711 }
728 }
712
729
713 var n = nodes[i].name;
730 var n = nodes[i].name;
714 var t = nodes[i].type;
731 var t = nodes[i].type;
715 var n_hl = n.substring(0,pos)
732 var n_hl = n.substring(0,pos)
716 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
733 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
717 +n.substring(pos+query.length)
734 +n.substring(pos+query.length)
718 node_url = node_url.replace('__FPATH__',n);
735 node_url = node_url.replace('__FPATH__',n);
719 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url,n_hl));
736 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,node_url,n_hl));
720 }
737 }
721 if(match.length >= matches_max){
738 if(match.length >= matches_max){
722 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['search truncated']));
739 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['search truncated']));
723 }
740 }
724 }
741 }
725 }
742 }
726 if(query != ""){
743 if(query != ""){
727 YUD.setStyle('tbody','display','none');
744 YUD.setStyle('tbody','display','none');
728 YUD.setStyle('tbody_filtered','display','');
745 YUD.setStyle('tbody_filtered','display','');
729
746
730 if (match.length==0){
747 if (match.length==0){
731 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['no matching files']));
748 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['no matching files']));
732 }
749 }
733
750
734 YUD.get('tbody_filtered').innerHTML = match.join("");
751 YUD.get('tbody_filtered').innerHTML = match.join("");
735 }
752 }
736 else{
753 else{
737 YUD.setStyle('tbody','display','');
754 YUD.setStyle('tbody','display','');
738 YUD.setStyle('tbody_filtered','display','none');
755 YUD.setStyle('tbody_filtered','display','none');
739 }
756 }
740
757
741 }
758 }
742 };
759 };
743
760
744 YUE.on(YUD.get('filter_activate'),'click',function(){
761 YUE.on(YUD.get('filter_activate'),'click',function(){
745 F.initFilter();
762 F.initFilter();
746 })
763 })
747 YUE.on(n_filter,'click',function(){
764 YUE.on(n_filter,'click',function(){
748 if(YUD.hasClass(n_filter,'init')){
765 if(YUD.hasClass(n_filter,'init')){
749 n_filter.value = '';
766 n_filter.value = '';
750 YUD.removeClass(n_filter,'init');
767 YUD.removeClass(n_filter,'init');
751 }
768 }
752 });
769 });
753 YUE.on(n_filter,'keyup',function(e){
770 YUE.on(n_filter,'keyup',function(e){
754 clearTimeout(F.filterTimeout);
771 clearTimeout(F.filterTimeout);
755 F.filterTimeout = setTimeout(F.updateFilter(e),600);
772 F.filterTimeout = setTimeout(F.updateFilter(e),600);
756 });
773 });
757 };
774 };
758
775
759
776
760 var initCodeMirror = function(textAreadId,resetUrl){
777 var initCodeMirror = function(textAreadId,resetUrl){
761 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
778 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
762 mode: "null",
779 mode: "null",
763 lineNumbers:true
780 lineNumbers:true
764 });
781 });
765 YUE.on('reset','click',function(e){
782 YUE.on('reset','click',function(e){
766 window.location=resetUrl
783 window.location=resetUrl
767 });
784 });
768
785
769 YUE.on('file_enable','click',function(){
786 YUE.on('file_enable','click',function(){
770 YUD.setStyle('editor_container','display','');
787 YUD.setStyle('editor_container','display','');
771 YUD.setStyle('upload_file_container','display','none');
788 YUD.setStyle('upload_file_container','display','none');
772 YUD.setStyle('filename_container','display','');
789 YUD.setStyle('filename_container','display','');
773 });
790 });
774
791
775 YUE.on('upload_file_enable','click',function(){
792 YUE.on('upload_file_enable','click',function(){
776 YUD.setStyle('editor_container','display','none');
793 YUD.setStyle('editor_container','display','none');
777 YUD.setStyle('upload_file_container','display','');
794 YUD.setStyle('upload_file_container','display','');
778 YUD.setStyle('filename_container','display','none');
795 YUD.setStyle('filename_container','display','none');
779 });
796 });
780 };
797 };
781
798
782
799
783
800
784 var getIdentNode = function(n){
801 var getIdentNode = function(n){
785 //iterate thru nodes untill matched interesting node !
802 //iterate thru nodes untill matched interesting node !
786
803
787 if (typeof n == 'undefined'){
804 if (typeof n == 'undefined'){
788 return -1
805 return -1
789 }
806 }
790
807
791 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
808 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
792 return n
809 return n
793 }
810 }
794 else{
811 else{
795 return getIdentNode(n.parentNode);
812 return getIdentNode(n.parentNode);
796 }
813 }
797 };
814 };
798
815
799 var getSelectionLink = function(selection_link_label) {
816 var getSelectionLink = function(selection_link_label) {
800 return function(){
817 return function(){
801 //get selection from start/to nodes
818 //get selection from start/to nodes
802 if (typeof window.getSelection != "undefined") {
819 if (typeof window.getSelection != "undefined") {
803 s = window.getSelection();
820 s = window.getSelection();
804
821
805 from = getIdentNode(s.anchorNode);
822 from = getIdentNode(s.anchorNode);
806 till = getIdentNode(s.focusNode);
823 till = getIdentNode(s.focusNode);
807
824
808 f_int = parseInt(from.id.replace('L',''));
825 f_int = parseInt(from.id.replace('L',''));
809 t_int = parseInt(till.id.replace('L',''));
826 t_int = parseInt(till.id.replace('L',''));
810
827
811 if (f_int > t_int){
828 if (f_int > t_int){
812 //highlight from bottom
829 //highlight from bottom
813 offset = -35;
830 offset = -35;
814 ranges = [t_int,f_int];
831 ranges = [t_int,f_int];
815
832
816 }
833 }
817 else{
834 else{
818 //highligth from top
835 //highligth from top
819 offset = 35;
836 offset = 35;
820 ranges = [f_int,t_int];
837 ranges = [f_int,t_int];
821 }
838 }
822
839
823 if (ranges[0] != ranges[1]){
840 if (ranges[0] != ranges[1]){
824 if(YUD.get('linktt') == null){
841 if(YUD.get('linktt') == null){
825 hl_div = document.createElement('div');
842 hl_div = document.createElement('div');
826 hl_div.id = 'linktt';
843 hl_div.id = 'linktt';
827 }
844 }
828 anchor = '#L'+ranges[0]+'-'+ranges[1];
845 anchor = '#L'+ranges[0]+'-'+ranges[1];
829 hl_div.innerHTML = '';
846 hl_div.innerHTML = '';
830 l = document.createElement('a');
847 l = document.createElement('a');
831 l.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
848 l.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
832 l.innerHTML = selection_link_label;
849 l.innerHTML = selection_link_label;
833 hl_div.appendChild(l);
850 hl_div.appendChild(l);
834
851
835 YUD.get('body').appendChild(hl_div);
852 YUD.get('body').appendChild(hl_div);
836
853
837 xy = YUD.getXY(till.id);
854 xy = YUD.getXY(till.id);
838
855
839 YUD.addClass('linktt','yui-tt');
856 YUD.addClass('linktt','yui-tt');
840 YUD.setStyle('linktt','top',xy[1]+offset+'px');
857 YUD.setStyle('linktt','top',xy[1]+offset+'px');
841 YUD.setStyle('linktt','left',xy[0]+'px');
858 YUD.setStyle('linktt','left',xy[0]+'px');
842 YUD.setStyle('linktt','visibility','visible');
859 YUD.setStyle('linktt','visibility','visible');
843 }
860 }
844 else{
861 else{
845 YUD.setStyle('linktt','visibility','hidden');
862 YUD.setStyle('linktt','visibility','hidden');
846 }
863 }
847 }
864 }
848 }
865 }
849 };
866 };
850
867
851 var deleteNotification = function(url, notification_id,callbacks){
868 var deleteNotification = function(url, notification_id,callbacks){
852 var callback = {
869 var callback = {
853 success:function(o){
870 success:function(o){
854 var obj = YUD.get(String("notification_"+notification_id));
871 var obj = YUD.get(String("notification_"+notification_id));
855 if(obj.parentNode !== undefined){
872 if(obj.parentNode !== undefined){
856 obj.parentNode.removeChild(obj);
873 obj.parentNode.removeChild(obj);
857 }
874 }
858 _run_callbacks(callbacks);
875 _run_callbacks(callbacks);
859 },
876 },
860 failure:function(o){
877 failure:function(o){
861 alert("error");
878 alert("error");
862 },
879 },
863 };
880 };
864 var postData = '_method=delete';
881 var postData = '_method=delete';
865 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
882 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
866 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
883 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
867 callback, postData);
884 callback, postData);
868 };
885 };
869
886
870 var readNotification = function(url, notification_id,callbacks){
887 var readNotification = function(url, notification_id,callbacks){
871 var callback = {
888 var callback = {
872 success:function(o){
889 success:function(o){
873 var obj = YUD.get(String("notification_"+notification_id));
890 var obj = YUD.get(String("notification_"+notification_id));
874 YUD.removeClass(obj, 'unread');
891 YUD.removeClass(obj, 'unread');
875 var r_button = obj.children[0].getElementsByClassName('read-notification')[0]
892 var r_button = obj.children[0].getElementsByClassName('read-notification')[0]
876
893
877 if(r_button.parentNode !== undefined){
894 if(r_button.parentNode !== undefined){
878 r_button.parentNode.removeChild(r_button);
895 r_button.parentNode.removeChild(r_button);
879 }
896 }
880 _run_callbacks(callbacks);
897 _run_callbacks(callbacks);
881 },
898 },
882 failure:function(o){
899 failure:function(o){
883 alert("error");
900 alert("error");
884 },
901 },
885 };
902 };
886 var postData = '_method=put';
903 var postData = '_method=put';
887 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
904 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
888 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
905 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
889 callback, postData);
906 callback, postData);
890 };
907 };
891
908
892 /** MEMBERS AUTOCOMPLETE WIDGET **/
909 /** MEMBERS AUTOCOMPLETE WIDGET **/
893
910
894 var MembersAutoComplete = function (users_list, groups_list) {
911 var MembersAutoComplete = function (users_list, groups_list) {
895 var myUsers = users_list;
912 var myUsers = users_list;
896 var myGroups = groups_list;
913 var myGroups = groups_list;
897
914
898 // Define a custom search function for the DataSource of users
915 // Define a custom search function for the DataSource of users
899 var matchUsers = function (sQuery) {
916 var matchUsers = function (sQuery) {
900 // Case insensitive matching
917 // Case insensitive matching
901 var query = sQuery.toLowerCase();
918 var query = sQuery.toLowerCase();
902 var i = 0;
919 var i = 0;
903 var l = myUsers.length;
920 var l = myUsers.length;
904 var matches = [];
921 var matches = [];
905
922
906 // Match against each name of each contact
923 // Match against each name of each contact
907 for (; i < l; i++) {
924 for (; i < l; i++) {
908 contact = myUsers[i];
925 contact = myUsers[i];
909 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
926 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
910 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
927 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
911 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
928 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
912 matches[matches.length] = contact;
929 matches[matches.length] = contact;
913 }
930 }
914 }
931 }
915 return matches;
932 return matches;
916 };
933 };
917
934
918 // Define a custom search function for the DataSource of usersGroups
935 // Define a custom search function for the DataSource of usersGroups
919 var matchGroups = function (sQuery) {
936 var matchGroups = function (sQuery) {
920 // Case insensitive matching
937 // Case insensitive matching
921 var query = sQuery.toLowerCase();
938 var query = sQuery.toLowerCase();
922 var i = 0;
939 var i = 0;
923 var l = myGroups.length;
940 var l = myGroups.length;
924 var matches = [];
941 var matches = [];
925
942
926 // Match against each name of each contact
943 // Match against each name of each contact
927 for (; i < l; i++) {
944 for (; i < l; i++) {
928 matched_group = myGroups[i];
945 matched_group = myGroups[i];
929 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
946 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
930 matches[matches.length] = matched_group;
947 matches[matches.length] = matched_group;
931 }
948 }
932 }
949 }
933 return matches;
950 return matches;
934 };
951 };
935
952
936 //match all
953 //match all
937 var matchAll = function (sQuery) {
954 var matchAll = function (sQuery) {
938 u = matchUsers(sQuery);
955 u = matchUsers(sQuery);
939 g = matchGroups(sQuery);
956 g = matchGroups(sQuery);
940 return u.concat(g);
957 return u.concat(g);
941 };
958 };
942
959
943 // DataScheme for members
960 // DataScheme for members
944 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
961 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
945 memberDS.responseSchema = {
962 memberDS.responseSchema = {
946 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
963 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
947 };
964 };
948
965
949 // DataScheme for owner
966 // DataScheme for owner
950 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
967 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
951 ownerDS.responseSchema = {
968 ownerDS.responseSchema = {
952 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
969 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
953 };
970 };
954
971
955 // Instantiate AutoComplete for perms
972 // Instantiate AutoComplete for perms
956 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
973 var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
957 membersAC.useShadow = false;
974 membersAC.useShadow = false;
958 membersAC.resultTypeList = false;
975 membersAC.resultTypeList = false;
959 membersAC.animVert = false;
976 membersAC.animVert = false;
960 membersAC.animHoriz = false;
977 membersAC.animHoriz = false;
961 membersAC.animSpeed = 0.1;
978 membersAC.animSpeed = 0.1;
962
979
963 // Instantiate AutoComplete for owner
980 // Instantiate AutoComplete for owner
964 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
981 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
965 ownerAC.useShadow = false;
982 ownerAC.useShadow = false;
966 ownerAC.resultTypeList = false;
983 ownerAC.resultTypeList = false;
967 ownerAC.animVert = false;
984 ownerAC.animVert = false;
968 ownerAC.animHoriz = false;
985 ownerAC.animHoriz = false;
969 ownerAC.animSpeed = 0.1;
986 ownerAC.animSpeed = 0.1;
970
987
971 // Helper highlight function for the formatter
988 // Helper highlight function for the formatter
972 var highlightMatch = function (full, snippet, matchindex) {
989 var highlightMatch = function (full, snippet, matchindex) {
973 return full.substring(0, matchindex)
990 return full.substring(0, matchindex)
974 + "<span class='match'>"
991 + "<span class='match'>"
975 + full.substr(matchindex, snippet.length)
992 + full.substr(matchindex, snippet.length)
976 + "</span>" + full.substring(matchindex + snippet.length);
993 + "</span>" + full.substring(matchindex + snippet.length);
977 };
994 };
978
995
979 // Custom formatter to highlight the matching letters
996 // Custom formatter to highlight the matching letters
980 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
997 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
981 var query = sQuery.toLowerCase();
998 var query = sQuery.toLowerCase();
982 var _gravatar = function(res, em, group){
999 var _gravatar = function(res, em, group){
983 if (group !== undefined){
1000 if (group !== undefined){
984 em = '/images/icons/group.png'
1001 em = '/images/icons/group.png'
985 }
1002 }
986 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1003 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
987 return tmpl.format(em,res)
1004 return tmpl.format(em,res)
988 }
1005 }
989 // group
1006 // group
990 if (oResultData.grname != undefined) {
1007 if (oResultData.grname != undefined) {
991 var grname = oResultData.grname;
1008 var grname = oResultData.grname;
992 var grmembers = oResultData.grmembers;
1009 var grmembers = oResultData.grmembers;
993 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1010 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
994 var grprefix = "{0}: ".format(_TM['Group']);
1011 var grprefix = "{0}: ".format(_TM['Group']);
995 var grsuffix = " (" + grmembers + " )";
1012 var grsuffix = " (" + grmembers + " )";
996 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1013 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
997
1014
998 if (grnameMatchIndex > -1) {
1015 if (grnameMatchIndex > -1) {
999 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1016 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1000 }
1017 }
1001 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1018 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1002 // Users
1019 // Users
1003 } else if (oResultData.nname != undefined) {
1020 } else if (oResultData.nname != undefined) {
1004 var fname = oResultData.fname || "";
1021 var fname = oResultData.fname || "";
1005 var lname = oResultData.lname || "";
1022 var lname = oResultData.lname || "";
1006 var nname = oResultData.nname;
1023 var nname = oResultData.nname;
1007
1024
1008 // Guard against null value
1025 // Guard against null value
1009 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1026 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1010 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1027 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1011 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1028 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1012 displayfname, displaylname, displaynname;
1029 displayfname, displaylname, displaynname;
1013
1030
1014 if (fnameMatchIndex > -1) {
1031 if (fnameMatchIndex > -1) {
1015 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1032 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1016 } else {
1033 } else {
1017 displayfname = fname;
1034 displayfname = fname;
1018 }
1035 }
1019
1036
1020 if (lnameMatchIndex > -1) {
1037 if (lnameMatchIndex > -1) {
1021 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1038 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1022 } else {
1039 } else {
1023 displaylname = lname;
1040 displaylname = lname;
1024 }
1041 }
1025
1042
1026 if (nnameMatchIndex > -1) {
1043 if (nnameMatchIndex > -1) {
1027 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1044 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1028 } else {
1045 } else {
1029 displaynname = nname ? "(" + nname + ")" : "";
1046 displaynname = nname ? "(" + nname + ")" : "";
1030 }
1047 }
1031
1048
1032 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1049 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1033 } else {
1050 } else {
1034 return '';
1051 return '';
1035 }
1052 }
1036 };
1053 };
1037 membersAC.formatResult = custom_formatter;
1054 membersAC.formatResult = custom_formatter;
1038 ownerAC.formatResult = custom_formatter;
1055 ownerAC.formatResult = custom_formatter;
1039
1056
1040 var myHandler = function (sType, aArgs) {
1057 var myHandler = function (sType, aArgs) {
1041
1058
1042 var myAC = aArgs[0]; // reference back to the AC instance
1059 var myAC = aArgs[0]; // reference back to the AC instance
1043 var elLI = aArgs[1]; // reference to the selected LI element
1060 var elLI = aArgs[1]; // reference to the selected LI element
1044 var oData = aArgs[2]; // object literal of selected item's result data
1061 var oData = aArgs[2]; // object literal of selected item's result data
1045 //fill the autocomplete with value
1062 //fill the autocomplete with value
1046 if (oData.nname != undefined) {
1063 if (oData.nname != undefined) {
1047 //users
1064 //users
1048 myAC.getInputEl().value = oData.nname;
1065 myAC.getInputEl().value = oData.nname;
1049 YUD.get('perm_new_member_type').value = 'user';
1066 YUD.get('perm_new_member_type').value = 'user';
1050 } else {
1067 } else {
1051 //groups
1068 //groups
1052 myAC.getInputEl().value = oData.grname;
1069 myAC.getInputEl().value = oData.grname;
1053 YUD.get('perm_new_member_type').value = 'users_group';
1070 YUD.get('perm_new_member_type').value = 'users_group';
1054 }
1071 }
1055 };
1072 };
1056
1073
1057 membersAC.itemSelectEvent.subscribe(myHandler);
1074 membersAC.itemSelectEvent.subscribe(myHandler);
1058 if(ownerAC.itemSelectEvent){
1075 if(ownerAC.itemSelectEvent){
1059 ownerAC.itemSelectEvent.subscribe(myHandler);
1076 ownerAC.itemSelectEvent.subscribe(myHandler);
1060 }
1077 }
1061
1078
1062 return {
1079 return {
1063 memberDS: memberDS,
1080 memberDS: memberDS,
1064 ownerDS: ownerDS,
1081 ownerDS: ownerDS,
1065 membersAC: membersAC,
1082 membersAC: membersAC,
1066 ownerAC: ownerAC,
1083 ownerAC: ownerAC,
1067 };
1084 };
1068 }
1085 }
1069
1086
1070
1087
1071 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1088 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1072 var myUsers = users_list;
1089 var myUsers = users_list;
1073 var myGroups = groups_list;
1090 var myGroups = groups_list;
1074
1091
1075 // Define a custom search function for the DataSource of users
1092 // Define a custom search function for the DataSource of users
1076 var matchUsers = function (sQuery) {
1093 var matchUsers = function (sQuery) {
1077 var org_sQuery = sQuery;
1094 var org_sQuery = sQuery;
1078 if(this.mentionQuery == null){
1095 if(this.mentionQuery == null){
1079 return []
1096 return []
1080 }
1097 }
1081 sQuery = this.mentionQuery;
1098 sQuery = this.mentionQuery;
1082 // Case insensitive matching
1099 // Case insensitive matching
1083 var query = sQuery.toLowerCase();
1100 var query = sQuery.toLowerCase();
1084 var i = 0;
1101 var i = 0;
1085 var l = myUsers.length;
1102 var l = myUsers.length;
1086 var matches = [];
1103 var matches = [];
1087
1104
1088 // Match against each name of each contact
1105 // Match against each name of each contact
1089 for (; i < l; i++) {
1106 for (; i < l; i++) {
1090 contact = myUsers[i];
1107 contact = myUsers[i];
1091 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1108 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1092 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1109 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1093 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1110 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1094 matches[matches.length] = contact;
1111 matches[matches.length] = contact;
1095 }
1112 }
1096 }
1113 }
1097 return matches
1114 return matches
1098 };
1115 };
1099
1116
1100 //match all
1117 //match all
1101 var matchAll = function (sQuery) {
1118 var matchAll = function (sQuery) {
1102 u = matchUsers(sQuery);
1119 u = matchUsers(sQuery);
1103 return u
1120 return u
1104 };
1121 };
1105
1122
1106 // DataScheme for owner
1123 // DataScheme for owner
1107 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1124 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1108
1125
1109 ownerDS.responseSchema = {
1126 ownerDS.responseSchema = {
1110 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1127 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1111 };
1128 };
1112
1129
1113 // Instantiate AutoComplete for mentions
1130 // Instantiate AutoComplete for mentions
1114 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1131 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1115 ownerAC.useShadow = false;
1132 ownerAC.useShadow = false;
1116 ownerAC.resultTypeList = false;
1133 ownerAC.resultTypeList = false;
1117 ownerAC.suppressInputUpdate = true;
1134 ownerAC.suppressInputUpdate = true;
1118 ownerAC.animVert = false;
1135 ownerAC.animVert = false;
1119 ownerAC.animHoriz = false;
1136 ownerAC.animHoriz = false;
1120 ownerAC.animSpeed = 0.1;
1137 ownerAC.animSpeed = 0.1;
1121
1138
1122 // Helper highlight function for the formatter
1139 // Helper highlight function for the formatter
1123 var highlightMatch = function (full, snippet, matchindex) {
1140 var highlightMatch = function (full, snippet, matchindex) {
1124 return full.substring(0, matchindex)
1141 return full.substring(0, matchindex)
1125 + "<span class='match'>"
1142 + "<span class='match'>"
1126 + full.substr(matchindex, snippet.length)
1143 + full.substr(matchindex, snippet.length)
1127 + "</span>" + full.substring(matchindex + snippet.length);
1144 + "</span>" + full.substring(matchindex + snippet.length);
1128 };
1145 };
1129
1146
1130 // Custom formatter to highlight the matching letters
1147 // Custom formatter to highlight the matching letters
1131 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1148 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1132 var org_sQuery = sQuery;
1149 var org_sQuery = sQuery;
1133 if(this.dataSource.mentionQuery != null){
1150 if(this.dataSource.mentionQuery != null){
1134 sQuery = this.dataSource.mentionQuery;
1151 sQuery = this.dataSource.mentionQuery;
1135 }
1152 }
1136
1153
1137 var query = sQuery.toLowerCase();
1154 var query = sQuery.toLowerCase();
1138 var _gravatar = function(res, em, group){
1155 var _gravatar = function(res, em, group){
1139 if (group !== undefined){
1156 if (group !== undefined){
1140 em = '/images/icons/group.png'
1157 em = '/images/icons/group.png'
1141 }
1158 }
1142 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1159 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1143 return tmpl.format(em,res)
1160 return tmpl.format(em,res)
1144 }
1161 }
1145 if (oResultData.nname != undefined) {
1162 if (oResultData.nname != undefined) {
1146 var fname = oResultData.fname || "";
1163 var fname = oResultData.fname || "";
1147 var lname = oResultData.lname || "";
1164 var lname = oResultData.lname || "";
1148 var nname = oResultData.nname;
1165 var nname = oResultData.nname;
1149
1166
1150 // Guard against null value
1167 // Guard against null value
1151 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1168 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1152 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1169 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1153 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1170 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1154 displayfname, displaylname, displaynname;
1171 displayfname, displaylname, displaynname;
1155
1172
1156 if (fnameMatchIndex > -1) {
1173 if (fnameMatchIndex > -1) {
1157 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1174 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1158 } else {
1175 } else {
1159 displayfname = fname;
1176 displayfname = fname;
1160 }
1177 }
1161
1178
1162 if (lnameMatchIndex > -1) {
1179 if (lnameMatchIndex > -1) {
1163 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1180 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1164 } else {
1181 } else {
1165 displaylname = lname;
1182 displaylname = lname;
1166 }
1183 }
1167
1184
1168 if (nnameMatchIndex > -1) {
1185 if (nnameMatchIndex > -1) {
1169 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1186 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1170 } else {
1187 } else {
1171 displaynname = nname ? "(" + nname + ")" : "";
1188 displaynname = nname ? "(" + nname + ")" : "";
1172 }
1189 }
1173
1190
1174 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1191 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1175 } else {
1192 } else {
1176 return '';
1193 return '';
1177 }
1194 }
1178 };
1195 };
1179
1196
1180 if(ownerAC.itemSelectEvent){
1197 if(ownerAC.itemSelectEvent){
1181 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1198 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1182
1199
1183 var myAC = aArgs[0]; // reference back to the AC instance
1200 var myAC = aArgs[0]; // reference back to the AC instance
1184 var elLI = aArgs[1]; // reference to the selected LI element
1201 var elLI = aArgs[1]; // reference to the selected LI element
1185 var oData = aArgs[2]; // object literal of selected item's result data
1202 var oData = aArgs[2]; // object literal of selected item's result data
1186 //fill the autocomplete with value
1203 //fill the autocomplete with value
1187 if (oData.nname != undefined) {
1204 if (oData.nname != undefined) {
1188 //users
1205 //users
1189 //Replace the mention name with replaced
1206 //Replace the mention name with replaced
1190 var re = new RegExp();
1207 var re = new RegExp();
1191 var org = myAC.getInputEl().value;
1208 var org = myAC.getInputEl().value;
1192 var chunks = myAC.dataSource.chunks
1209 var chunks = myAC.dataSource.chunks
1193 // replace middle chunk(the search term) with actuall match
1210 // replace middle chunk(the search term) with actuall match
1194 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1211 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1195 '@'+oData.nname+' ');
1212 '@'+oData.nname+' ');
1196 myAC.getInputEl().value = chunks.join('')
1213 myAC.getInputEl().value = chunks.join('')
1197 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1214 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1198 } else {
1215 } else {
1199 //groups
1216 //groups
1200 myAC.getInputEl().value = oData.grname;
1217 myAC.getInputEl().value = oData.grname;
1201 YUD.get('perm_new_member_type').value = 'users_group';
1218 YUD.get('perm_new_member_type').value = 'users_group';
1202 }
1219 }
1203 });
1220 });
1204 }
1221 }
1205
1222
1206 // in this keybuffer we will gather current value of search !
1223 // in this keybuffer we will gather current value of search !
1207 // since we need to get this just when someone does `@` then we do the
1224 // since we need to get this just when someone does `@` then we do the
1208 // search
1225 // search
1209 ownerAC.dataSource.chunks = [];
1226 ownerAC.dataSource.chunks = [];
1210 ownerAC.dataSource.mentionQuery = null;
1227 ownerAC.dataSource.mentionQuery = null;
1211
1228
1212 ownerAC.get_mention = function(msg, max_pos) {
1229 ownerAC.get_mention = function(msg, max_pos) {
1213 var org = msg;
1230 var org = msg;
1214 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1231 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1215 var chunks = [];
1232 var chunks = [];
1216
1233
1217
1234
1218 // cut first chunk until curret pos
1235 // cut first chunk until curret pos
1219 var to_max = msg.substr(0, max_pos);
1236 var to_max = msg.substr(0, max_pos);
1220 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1237 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1221 var msg2 = to_max.substr(at_pos);
1238 var msg2 = to_max.substr(at_pos);
1222
1239
1223 chunks.push(org.substr(0,at_pos))// prefix chunk
1240 chunks.push(org.substr(0,at_pos))// prefix chunk
1224 chunks.push(msg2) // search chunk
1241 chunks.push(msg2) // search chunk
1225 chunks.push(org.substr(max_pos)) // postfix chunk
1242 chunks.push(org.substr(max_pos)) // postfix chunk
1226
1243
1227 // clean up msg2 for filtering and regex match
1244 // clean up msg2 for filtering and regex match
1228 var msg2 = msg2.lstrip(' ').lstrip('\n');
1245 var msg2 = msg2.lstrip(' ').lstrip('\n');
1229
1246
1230 if(re.test(msg2)){
1247 if(re.test(msg2)){
1231 var unam = re.exec(msg2)[1];
1248 var unam = re.exec(msg2)[1];
1232 return [unam, chunks];
1249 return [unam, chunks];
1233 }
1250 }
1234 return [null, null];
1251 return [null, null];
1235 };
1252 };
1236
1253
1237 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1254 if (ownerAC.textboxKeyUpEvent){
1238
1255 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1239 var ac_obj = args[0];
1256
1240 var currentMessage = args[1];
1257 var ac_obj = args[0];
1241 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1258 var currentMessage = args[1];
1242
1259 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1243 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1260
1244 var curr_search = null;
1261 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1245 if(unam[0]){
1262 var curr_search = null;
1246 curr_search = unam[0];
1263 if(unam[0]){
1247 }
1264 curr_search = unam[0];
1248
1265 }
1249 ownerAC.dataSource.chunks = unam[1];
1266
1250 ownerAC.dataSource.mentionQuery = curr_search;
1267 ownerAC.dataSource.chunks = unam[1];
1251
1268 ownerAC.dataSource.mentionQuery = curr_search;
1252 })
1269
1253
1270 })
1271 }
1254 return {
1272 return {
1255 ownerDS: ownerDS,
1273 ownerDS: ownerDS,
1256 ownerAC: ownerAC,
1274 ownerAC: ownerAC,
1257 };
1275 };
1258 }
1276 }
1259
1277
1260
1278
1261 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1279 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1262 var myUsers = users_list;
1280 var myUsers = users_list;
1263 var myGroups = groups_list;
1281 var myGroups = groups_list;
1264
1282
1265 // Define a custom search function for the DataSource of users
1283 // Define a custom search function for the DataSource of users
1266 var matchUsers = function (sQuery) {
1284 var matchUsers = function (sQuery) {
1267 // Case insensitive matching
1285 // Case insensitive matching
1268 var query = sQuery.toLowerCase();
1286 var query = sQuery.toLowerCase();
1269 var i = 0;
1287 var i = 0;
1270 var l = myUsers.length;
1288 var l = myUsers.length;
1271 var matches = [];
1289 var matches = [];
1272
1290
1273 // Match against each name of each contact
1291 // Match against each name of each contact
1274 for (; i < l; i++) {
1292 for (; i < l; i++) {
1275 contact = myUsers[i];
1293 contact = myUsers[i];
1276 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1294 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1277 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1295 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1278 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1296 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1279 matches[matches.length] = contact;
1297 matches[matches.length] = contact;
1280 }
1298 }
1281 }
1299 }
1282 return matches;
1300 return matches;
1283 };
1301 };
1284
1302
1285 // Define a custom search function for the DataSource of usersGroups
1303 // Define a custom search function for the DataSource of usersGroups
1286 var matchGroups = function (sQuery) {
1304 var matchGroups = function (sQuery) {
1287 // Case insensitive matching
1305 // Case insensitive matching
1288 var query = sQuery.toLowerCase();
1306 var query = sQuery.toLowerCase();
1289 var i = 0;
1307 var i = 0;
1290 var l = myGroups.length;
1308 var l = myGroups.length;
1291 var matches = [];
1309 var matches = [];
1292
1310
1293 // Match against each name of each contact
1311 // Match against each name of each contact
1294 for (; i < l; i++) {
1312 for (; i < l; i++) {
1295 matched_group = myGroups[i];
1313 matched_group = myGroups[i];
1296 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1314 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1297 matches[matches.length] = matched_group;
1315 matches[matches.length] = matched_group;
1298 }
1316 }
1299 }
1317 }
1300 return matches;
1318 return matches;
1301 };
1319 };
1302
1320
1303 //match all
1321 //match all
1304 var matchAll = function (sQuery) {
1322 var matchAll = function (sQuery) {
1305 u = matchUsers(sQuery);
1323 u = matchUsers(sQuery);
1306 return u
1324 return u
1307 };
1325 };
1308
1326
1309 // DataScheme for owner
1327 // DataScheme for owner
1310 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1328 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1311
1329
1312 ownerDS.responseSchema = {
1330 ownerDS.responseSchema = {
1313 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1331 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1314 };
1332 };
1315
1333
1316 // Instantiate AutoComplete for mentions
1334 // Instantiate AutoComplete for mentions
1317 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1335 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1318 reviewerAC.useShadow = false;
1336 reviewerAC.useShadow = false;
1319 reviewerAC.resultTypeList = false;
1337 reviewerAC.resultTypeList = false;
1320 reviewerAC.suppressInputUpdate = true;
1338 reviewerAC.suppressInputUpdate = true;
1321 reviewerAC.animVert = false;
1339 reviewerAC.animVert = false;
1322 reviewerAC.animHoriz = false;
1340 reviewerAC.animHoriz = false;
1323 reviewerAC.animSpeed = 0.1;
1341 reviewerAC.animSpeed = 0.1;
1324
1342
1325 // Helper highlight function for the formatter
1343 // Helper highlight function for the formatter
1326 var highlightMatch = function (full, snippet, matchindex) {
1344 var highlightMatch = function (full, snippet, matchindex) {
1327 return full.substring(0, matchindex)
1345 return full.substring(0, matchindex)
1328 + "<span class='match'>"
1346 + "<span class='match'>"
1329 + full.substr(matchindex, snippet.length)
1347 + full.substr(matchindex, snippet.length)
1330 + "</span>" + full.substring(matchindex + snippet.length);
1348 + "</span>" + full.substring(matchindex + snippet.length);
1331 };
1349 };
1332
1350
1333 // Custom formatter to highlight the matching letters
1351 // Custom formatter to highlight the matching letters
1334 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1352 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1335 var org_sQuery = sQuery;
1353 var org_sQuery = sQuery;
1336 if(this.dataSource.mentionQuery != null){
1354 if(this.dataSource.mentionQuery != null){
1337 sQuery = this.dataSource.mentionQuery;
1355 sQuery = this.dataSource.mentionQuery;
1338 }
1356 }
1339
1357
1340 var query = sQuery.toLowerCase();
1358 var query = sQuery.toLowerCase();
1341 var _gravatar = function(res, em, group){
1359 var _gravatar = function(res, em, group){
1342 if (group !== undefined){
1360 if (group !== undefined){
1343 em = '/images/icons/group.png'
1361 em = '/images/icons/group.png'
1344 }
1362 }
1345 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1363 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1346 return tmpl.format(em,res)
1364 return tmpl.format(em,res)
1347 }
1365 }
1348 if (oResultData.nname != undefined) {
1366 if (oResultData.nname != undefined) {
1349 var fname = oResultData.fname || "";
1367 var fname = oResultData.fname || "";
1350 var lname = oResultData.lname || "";
1368 var lname = oResultData.lname || "";
1351 var nname = oResultData.nname;
1369 var nname = oResultData.nname;
1352
1370
1353 // Guard against null value
1371 // Guard against null value
1354 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1372 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1355 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1373 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1356 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1374 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1357 displayfname, displaylname, displaynname;
1375 displayfname, displaylname, displaynname;
1358
1376
1359 if (fnameMatchIndex > -1) {
1377 if (fnameMatchIndex > -1) {
1360 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1378 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1361 } else {
1379 } else {
1362 displayfname = fname;
1380 displayfname = fname;
1363 }
1381 }
1364
1382
1365 if (lnameMatchIndex > -1) {
1383 if (lnameMatchIndex > -1) {
1366 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1384 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1367 } else {
1385 } else {
1368 displaylname = lname;
1386 displaylname = lname;
1369 }
1387 }
1370
1388
1371 if (nnameMatchIndex > -1) {
1389 if (nnameMatchIndex > -1) {
1372 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1390 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1373 } else {
1391 } else {
1374 displaynname = nname ? "(" + nname + ")" : "";
1392 displaynname = nname ? "(" + nname + ")" : "";
1375 }
1393 }
1376
1394
1377 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1395 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1378 } else {
1396 } else {
1379 return '';
1397 return '';
1380 }
1398 }
1381 };
1399 };
1382
1400
1383 //members cache to catch duplicates
1401 //members cache to catch duplicates
1384 reviewerAC.dataSource.cache = [];
1402 reviewerAC.dataSource.cache = [];
1385 // hack into select event
1403 // hack into select event
1386 if(reviewerAC.itemSelectEvent){
1404 if(reviewerAC.itemSelectEvent){
1387 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1405 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1388
1406
1389 var myAC = aArgs[0]; // reference back to the AC instance
1407 var myAC = aArgs[0]; // reference back to the AC instance
1390 var elLI = aArgs[1]; // reference to the selected LI element
1408 var elLI = aArgs[1]; // reference to the selected LI element
1391 var oData = aArgs[2]; // object literal of selected item's result data
1409 var oData = aArgs[2]; // object literal of selected item's result data
1392 var members = YUD.get('review_members');
1410 var members = YUD.get('review_members');
1393 //fill the autocomplete with value
1411 //fill the autocomplete with value
1394
1412
1395 if (oData.nname != undefined) {
1413 if (oData.nname != undefined) {
1396 if (myAC.dataSource.cache.indexOf(oData.id) != -1){
1414 if (myAC.dataSource.cache.indexOf(oData.id) != -1){
1397 return
1415 return
1398 }
1416 }
1399
1417
1400 var tmpl = '<li id="reviewer_{2}">'+
1418 var tmpl = '<li id="reviewer_{2}">'+
1401 '<div class="reviewers_member">'+
1419 '<div class="reviewers_member">'+
1402 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1420 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1403 '<div style="float:left">{1}</div>'+
1421 '<div style="float:left">{1}</div>'+
1404 '<input type="hidden" value="{2}" name="review_members" />'+
1422 '<input type="hidden" value="{2}" name="review_members" />'+
1405 '<span class="delete_icon action_button" onclick="removeReviewer({2})"></span>'+
1423 '<span class="delete_icon action_button" onclick="removeReviewer({2})"></span>'+
1406 '</div>'+
1424 '</div>'+
1407 '</li>'
1425 '</li>'
1408
1426
1409 var displayname = "{0} {1} ({2})".format(oData.fname,oData.lname,oData.nname);
1427 var displayname = "{0} {1} ({2})".format(oData.fname,oData.lname,oData.nname);
1410 var element = tmpl.format(oData.gravatar_lnk,displayname,oData.id);
1428 var element = tmpl.format(oData.gravatar_lnk,displayname,oData.id);
1411 members.innerHTML += element;
1429 members.innerHTML += element;
1412 myAC.dataSource.cache.push(oData.id);
1430 myAC.dataSource.cache.push(oData.id);
1413 YUD.get('user').value = ''
1431 YUD.get('user').value = ''
1414 }
1432 }
1415 });
1433 });
1416 }
1434 }
1417 return {
1435 return {
1418 ownerDS: ownerDS,
1436 ownerDS: ownerDS,
1419 reviewerAC: reviewerAC,
1437 reviewerAC: reviewerAC,
1420 };
1438 };
1421 }
1439 }
1422
1440
1423
1441
1424 /**
1442 /**
1425 * QUICK REPO MENU
1443 * QUICK REPO MENU
1426 */
1444 */
1427 var quick_repo_menu = function(){
1445 var quick_repo_menu = function(){
1428 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1446 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1429 var menu = e.currentTarget.firstElementChild.firstElementChild;
1447 var menu = e.currentTarget.firstElementChild.firstElementChild;
1430 if(YUD.hasClass(menu,'hidden')){
1448 if(YUD.hasClass(menu,'hidden')){
1431 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1449 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1432 YUD.replaceClass(menu, 'hidden', 'active');
1450 YUD.replaceClass(menu, 'hidden', 'active');
1433 }
1451 }
1434 })
1452 })
1435 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1453 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1436 var menu = e.currentTarget.firstElementChild.firstElementChild;
1454 var menu = e.currentTarget.firstElementChild.firstElementChild;
1437 if(YUD.hasClass(menu,'active')){
1455 if(YUD.hasClass(menu,'active')){
1438 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1456 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1439 YUD.replaceClass(menu, 'active', 'hidden');
1457 YUD.replaceClass(menu, 'active', 'hidden');
1440 }
1458 }
1441 })
1459 })
1442 };
1460 };
1443
1461
1444
1462
1445 /**
1463 /**
1446 * TABLE SORTING
1464 * TABLE SORTING
1447 */
1465 */
1448
1466
1449 // returns a node from given html;
1467 // returns a node from given html;
1450 var fromHTML = function(html){
1468 var fromHTML = function(html){
1451 var _html = document.createElement('element');
1469 var _html = document.createElement('element');
1452 _html.innerHTML = html;
1470 _html.innerHTML = html;
1453 return _html;
1471 return _html;
1454 }
1472 }
1455 var get_rev = function(node){
1473 var get_rev = function(node){
1456 var n = node.firstElementChild.firstElementChild;
1474 var n = node.firstElementChild.firstElementChild;
1457
1475
1458 if (n===null){
1476 if (n===null){
1459 return -1
1477 return -1
1460 }
1478 }
1461 else{
1479 else{
1462 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1480 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1463 return parseInt(out);
1481 return parseInt(out);
1464 }
1482 }
1465 }
1483 }
1466
1484
1467 var get_name = function(node){
1485 var get_name = function(node){
1468 var name = node.firstElementChild.children[2].innerHTML;
1486 var name = node.firstElementChild.children[2].innerHTML;
1469 return name
1487 return name
1470 }
1488 }
1471 var get_group_name = function(node){
1489 var get_group_name = function(node){
1472 var name = node.firstElementChild.children[1].innerHTML;
1490 var name = node.firstElementChild.children[1].innerHTML;
1473 return name
1491 return name
1474 }
1492 }
1475 var get_date = function(node){
1493 var get_date = function(node){
1476 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1494 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1477 return date_
1495 return date_
1478 }
1496 }
1479
1497
1480 var get_age = function(node){
1498 var get_age = function(node){
1481 return node
1499 return node
1482 }
1500 }
1483
1501
1484 var get_link = function(node){
1502 var get_link = function(node){
1485 return node.firstElementChild.text;
1503 return node.firstElementChild.text;
1486 }
1504 }
1487
1505
1488 var revisionSort = function(a, b, desc, field) {
1506 var revisionSort = function(a, b, desc, field) {
1489
1507
1490 var a_ = fromHTML(a.getData(field));
1508 var a_ = fromHTML(a.getData(field));
1491 var b_ = fromHTML(b.getData(field));
1509 var b_ = fromHTML(b.getData(field));
1492
1510
1493 // extract revisions from string nodes
1511 // extract revisions from string nodes
1494 a_ = get_rev(a_)
1512 a_ = get_rev(a_)
1495 b_ = get_rev(b_)
1513 b_ = get_rev(b_)
1496
1514
1497 var comp = YAHOO.util.Sort.compare;
1515 var comp = YAHOO.util.Sort.compare;
1498 var compState = comp(a_, b_, desc);
1516 var compState = comp(a_, b_, desc);
1499 return compState;
1517 return compState;
1500 };
1518 };
1501 var ageSort = function(a, b, desc, field) {
1519 var ageSort = function(a, b, desc, field) {
1502 var a_ = fromHTML(a.getData(field));
1520 var a_ = fromHTML(a.getData(field));
1503 var b_ = fromHTML(b.getData(field));
1521 var b_ = fromHTML(b.getData(field));
1504
1522
1505 // extract name from table
1523 // extract name from table
1506 a_ = get_date(a_)
1524 a_ = get_date(a_)
1507 b_ = get_date(b_)
1525 b_ = get_date(b_)
1508
1526
1509 var comp = YAHOO.util.Sort.compare;
1527 var comp = YAHOO.util.Sort.compare;
1510 var compState = comp(a_, b_, desc);
1528 var compState = comp(a_, b_, desc);
1511 return compState;
1529 return compState;
1512 };
1530 };
1513
1531
1514 var nameSort = function(a, b, desc, field) {
1532 var nameSort = function(a, b, desc, field) {
1515 var a_ = fromHTML(a.getData(field));
1533 var a_ = fromHTML(a.getData(field));
1516 var b_ = fromHTML(b.getData(field));
1534 var b_ = fromHTML(b.getData(field));
1517
1535
1518 // extract name from table
1536 // extract name from table
1519 a_ = get_name(a_)
1537 a_ = get_name(a_)
1520 b_ = get_name(b_)
1538 b_ = get_name(b_)
1521
1539
1522 var comp = YAHOO.util.Sort.compare;
1540 var comp = YAHOO.util.Sort.compare;
1523 var compState = comp(a_, b_, desc);
1541 var compState = comp(a_, b_, desc);
1524 return compState;
1542 return compState;
1525 };
1543 };
1526
1544
1527 var permNameSort = function(a, b, desc, field) {
1545 var permNameSort = function(a, b, desc, field) {
1528 var a_ = fromHTML(a.getData(field));
1546 var a_ = fromHTML(a.getData(field));
1529 var b_ = fromHTML(b.getData(field));
1547 var b_ = fromHTML(b.getData(field));
1530 // extract name from table
1548 // extract name from table
1531
1549
1532 a_ = a_.children[0].innerHTML;
1550 a_ = a_.children[0].innerHTML;
1533 b_ = b_.children[0].innerHTML;
1551 b_ = b_.children[0].innerHTML;
1534
1552
1535 var comp = YAHOO.util.Sort.compare;
1553 var comp = YAHOO.util.Sort.compare;
1536 var compState = comp(a_, b_, desc);
1554 var compState = comp(a_, b_, desc);
1537 return compState;
1555 return compState;
1538 };
1556 };
1539
1557
1540 var groupNameSort = function(a, b, desc, field) {
1558 var groupNameSort = function(a, b, desc, field) {
1541 var a_ = fromHTML(a.getData(field));
1559 var a_ = fromHTML(a.getData(field));
1542 var b_ = fromHTML(b.getData(field));
1560 var b_ = fromHTML(b.getData(field));
1543
1561
1544 // extract name from table
1562 // extract name from table
1545 a_ = get_group_name(a_)
1563 a_ = get_group_name(a_)
1546 b_ = get_group_name(b_)
1564 b_ = get_group_name(b_)
1547
1565
1548 var comp = YAHOO.util.Sort.compare;
1566 var comp = YAHOO.util.Sort.compare;
1549 var compState = comp(a_, b_, desc);
1567 var compState = comp(a_, b_, desc);
1550 return compState;
1568 return compState;
1551 };
1569 };
1552 var dateSort = function(a, b, desc, field) {
1570 var dateSort = function(a, b, desc, field) {
1553 var a_ = fromHTML(a.getData(field));
1571 var a_ = fromHTML(a.getData(field));
1554 var b_ = fromHTML(b.getData(field));
1572 var b_ = fromHTML(b.getData(field));
1555
1573
1556 // extract name from table
1574 // extract name from table
1557 a_ = get_date(a_)
1575 a_ = get_date(a_)
1558 b_ = get_date(b_)
1576 b_ = get_date(b_)
1559
1577
1560 var comp = YAHOO.util.Sort.compare;
1578 var comp = YAHOO.util.Sort.compare;
1561 var compState = comp(a_, b_, desc);
1579 var compState = comp(a_, b_, desc);
1562 return compState;
1580 return compState;
1563 };
1581 };
1564
1582
1565 var linkSort = function(a, b, desc, field) {
1583 var linkSort = function(a, b, desc, field) {
1566 var a_ = fromHTML(a.getData(field));
1584 var a_ = fromHTML(a.getData(field));
1567 var b_ = fromHTML(a.getData(field));
1585 var b_ = fromHTML(a.getData(field));
1568
1586
1569 // extract url text from string nodes
1587 // extract url text from string nodes
1570 a_ = get_link(a_)
1588 a_ = get_link(a_)
1571 b_ = get_link(b_)
1589 b_ = get_link(b_)
1572
1590
1573 var comp = YAHOO.util.Sort.compare;
1591 var comp = YAHOO.util.Sort.compare;
1574 var compState = comp(a_, b_, desc);
1592 var compState = comp(a_, b_, desc);
1575 return compState;
1593 return compState;
1576 }
1594 }
1577
1595
1578
1596
1579 /* Multi selectors */
1597 /* Multi selectors */
1580
1598
1581 var MultiSelectWidget = function(selected_id, available_id, form_id){
1599 var MultiSelectWidget = function(selected_id, available_id, form_id){
1582
1600
1583
1601
1584 //definition of containers ID's
1602 //definition of containers ID's
1585 var selected_container = selected_id;
1603 var selected_container = selected_id;
1586 var available_container = available_id;
1604 var available_container = available_id;
1587
1605
1588 //temp container for selected storage.
1606 //temp container for selected storage.
1589 var cache = new Array();
1607 var cache = new Array();
1590 var av_cache = new Array();
1608 var av_cache = new Array();
1591 var c = YUD.get(selected_container);
1609 var c = YUD.get(selected_container);
1592 var ac = YUD.get(available_container);
1610 var ac = YUD.get(available_container);
1593
1611
1594 //get only selected options for further fullfilment
1612 //get only selected options for further fullfilment
1595 for(var i = 0;node =c.options[i];i++){
1613 for(var i = 0;node =c.options[i];i++){
1596 if(node.selected){
1614 if(node.selected){
1597 //push selected to my temp storage left overs :)
1615 //push selected to my temp storage left overs :)
1598 cache.push(node);
1616 cache.push(node);
1599 }
1617 }
1600 }
1618 }
1601
1619
1602 //get all available options to cache
1620 //get all available options to cache
1603 for(var i = 0;node =ac.options[i];i++){
1621 for(var i = 0;node =ac.options[i];i++){
1604 //push selected to my temp storage left overs :)
1622 //push selected to my temp storage left overs :)
1605 av_cache.push(node);
1623 av_cache.push(node);
1606 }
1624 }
1607
1625
1608 //fill available only with those not in choosen
1626 //fill available only with those not in choosen
1609 ac.options.length=0;
1627 ac.options.length=0;
1610 tmp_cache = new Array();
1628 tmp_cache = new Array();
1611
1629
1612 for(var i = 0;node = av_cache[i];i++){
1630 for(var i = 0;node = av_cache[i];i++){
1613 var add = true;
1631 var add = true;
1614 for(var i2 = 0;node_2 = cache[i2];i2++){
1632 for(var i2 = 0;node_2 = cache[i2];i2++){
1615 if(node.value == node_2.value){
1633 if(node.value == node_2.value){
1616 add=false;
1634 add=false;
1617 break;
1635 break;
1618 }
1636 }
1619 }
1637 }
1620 if(add){
1638 if(add){
1621 tmp_cache.push(new Option(node.text, node.value, false, false));
1639 tmp_cache.push(new Option(node.text, node.value, false, false));
1622 }
1640 }
1623 }
1641 }
1624
1642
1625 for(var i = 0;node = tmp_cache[i];i++){
1643 for(var i = 0;node = tmp_cache[i];i++){
1626 ac.options[i] = node;
1644 ac.options[i] = node;
1627 }
1645 }
1628
1646
1629 function prompts_action_callback(e){
1647 function prompts_action_callback(e){
1630
1648
1631 var choosen = YUD.get(selected_container);
1649 var choosen = YUD.get(selected_container);
1632 var available = YUD.get(available_container);
1650 var available = YUD.get(available_container);
1633
1651
1634 //get checked and unchecked options from field
1652 //get checked and unchecked options from field
1635 function get_checked(from_field){
1653 function get_checked(from_field){
1636 //temp container for storage.
1654 //temp container for storage.
1637 var sel_cache = new Array();
1655 var sel_cache = new Array();
1638 var oth_cache = new Array();
1656 var oth_cache = new Array();
1639
1657
1640 for(var i = 0;node = from_field.options[i];i++){
1658 for(var i = 0;node = from_field.options[i];i++){
1641 if(node.selected){
1659 if(node.selected){
1642 //push selected fields :)
1660 //push selected fields :)
1643 sel_cache.push(node);
1661 sel_cache.push(node);
1644 }
1662 }
1645 else{
1663 else{
1646 oth_cache.push(node)
1664 oth_cache.push(node)
1647 }
1665 }
1648 }
1666 }
1649
1667
1650 return [sel_cache,oth_cache]
1668 return [sel_cache,oth_cache]
1651 }
1669 }
1652
1670
1653 //fill the field with given options
1671 //fill the field with given options
1654 function fill_with(field,options){
1672 function fill_with(field,options){
1655 //clear firtst
1673 //clear firtst
1656 field.options.length=0;
1674 field.options.length=0;
1657 for(var i = 0;node = options[i];i++){
1675 for(var i = 0;node = options[i];i++){
1658 field.options[i]=new Option(node.text, node.value,
1676 field.options[i]=new Option(node.text, node.value,
1659 false, false);
1677 false, false);
1660 }
1678 }
1661
1679
1662 }
1680 }
1663 //adds to current field
1681 //adds to current field
1664 function add_to(field,options){
1682 function add_to(field,options){
1665 for(var i = 0;node = options[i];i++){
1683 for(var i = 0;node = options[i];i++){
1666 field.appendChild(new Option(node.text, node.value,
1684 field.appendChild(new Option(node.text, node.value,
1667 false, false));
1685 false, false));
1668 }
1686 }
1669 }
1687 }
1670
1688
1671 // add action
1689 // add action
1672 if (this.id=='add_element'){
1690 if (this.id=='add_element'){
1673 var c = get_checked(available);
1691 var c = get_checked(available);
1674 add_to(choosen,c[0]);
1692 add_to(choosen,c[0]);
1675 fill_with(available,c[1]);
1693 fill_with(available,c[1]);
1676 }
1694 }
1677 // remove action
1695 // remove action
1678 if (this.id=='remove_element'){
1696 if (this.id=='remove_element'){
1679 var c = get_checked(choosen);
1697 var c = get_checked(choosen);
1680 add_to(available,c[0]);
1698 add_to(available,c[0]);
1681 fill_with(choosen,c[1]);
1699 fill_with(choosen,c[1]);
1682 }
1700 }
1683 // add all elements
1701 // add all elements
1684 if(this.id=='add_all_elements'){
1702 if(this.id=='add_all_elements'){
1685 for(var i=0; node = available.options[i];i++){
1703 for(var i=0; node = available.options[i];i++){
1686 choosen.appendChild(new Option(node.text,
1704 choosen.appendChild(new Option(node.text,
1687 node.value, false, false));
1705 node.value, false, false));
1688 }
1706 }
1689 available.options.length = 0;
1707 available.options.length = 0;
1690 }
1708 }
1691 //remove all elements
1709 //remove all elements
1692 if(this.id=='remove_all_elements'){
1710 if(this.id=='remove_all_elements'){
1693 for(var i=0; node = choosen.options[i];i++){
1711 for(var i=0; node = choosen.options[i];i++){
1694 available.appendChild(new Option(node.text,
1712 available.appendChild(new Option(node.text,
1695 node.value, false, false));
1713 node.value, false, false));
1696 }
1714 }
1697 choosen.options.length = 0;
1715 choosen.options.length = 0;
1698 }
1716 }
1699
1717
1700 }
1718 }
1701
1719
1702 YUE.addListener(['add_element','remove_element',
1720 YUE.addListener(['add_element','remove_element',
1703 'add_all_elements','remove_all_elements'],'click',
1721 'add_all_elements','remove_all_elements'],'click',
1704 prompts_action_callback)
1722 prompts_action_callback)
1705 if (form_id !== undefined) {
1723 if (form_id !== undefined) {
1706 YUE.addListener(form_id,'submit',function(){
1724 YUE.addListener(form_id,'submit',function(){
1707 var choosen = YUD.get(selected_container);
1725 var choosen = YUD.get(selected_container);
1708 for (var i = 0; i < choosen.options.length; i++) {
1726 for (var i = 0; i < choosen.options.length; i++) {
1709 choosen.options[i].selected = 'selected';
1727 choosen.options[i].selected = 'selected';
1710 }
1728 }
1711 });
1729 });
1712 }
1730 }
1713 } No newline at end of file
1731 }
General Comments 0
You need to be logged in to leave comments. Login now