##// END OF EJS Templates
journal: don't show "error" popup when navigating away from page while lazy info is loading...
Mads Kiilerich -
r3553:72c89171 beta
parent child Browse files
Show More
@@ -1,2173 +1,2175 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
78 // IE(CRAP) doesn't support previousElementSibling
79 var prevElementSibling = function( el ) {
79 var prevElementSibling = function( el ) {
80 if( el.previousElementSibling ) {
80 if( el.previousElementSibling ) {
81 return el.previousElementSibling;
81 return el.previousElementSibling;
82 } else {
82 } else {
83 while( el = el.previousSibling ) {
83 while( el = el.previousSibling ) {
84 if( el.nodeType === 1 ) return el;
84 if( el.nodeType === 1 ) return el;
85 }
85 }
86 }
86 }
87 }
87 }
88
88
89 /**
89 /**
90 * SmartColorGenerator
90 * SmartColorGenerator
91 *
91 *
92 *usage::
92 *usage::
93 * var CG = new ColorGenerator();
93 * var CG = new ColorGenerator();
94 * var col = CG.getColor(key); //returns array of RGB
94 * var col = CG.getColor(key); //returns array of RGB
95 * 'rgb({0})'.format(col.join(',')
95 * 'rgb({0})'.format(col.join(',')
96 *
96 *
97 * @returns {ColorGenerator}
97 * @returns {ColorGenerator}
98 */
98 */
99 var ColorGenerator = function(){
99 var ColorGenerator = function(){
100 this.GOLDEN_RATIO = 0.618033988749895;
100 this.GOLDEN_RATIO = 0.618033988749895;
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
101 this.CURRENT_RATIO = 0.22717784590367374 // this can be random
102 this.HSV_1 = 0.75;//saturation
102 this.HSV_1 = 0.75;//saturation
103 this.HSV_2 = 0.95;
103 this.HSV_2 = 0.95;
104 this.color;
104 this.color;
105 this.cacheColorMap = {};
105 this.cacheColorMap = {};
106 };
106 };
107
107
108 ColorGenerator.prototype = {
108 ColorGenerator.prototype = {
109 getColor:function(key){
109 getColor:function(key){
110 if(this.cacheColorMap[key] !== undefined){
110 if(this.cacheColorMap[key] !== undefined){
111 return this.cacheColorMap[key];
111 return this.cacheColorMap[key];
112 }
112 }
113 else{
113 else{
114 this.cacheColorMap[key] = this.generateColor();
114 this.cacheColorMap[key] = this.generateColor();
115 return this.cacheColorMap[key];
115 return this.cacheColorMap[key];
116 }
116 }
117 },
117 },
118 _hsvToRgb:function(h,s,v){
118 _hsvToRgb:function(h,s,v){
119 if (s == 0.0)
119 if (s == 0.0)
120 return [v, v, v];
120 return [v, v, v];
121 i = parseInt(h * 6.0)
121 i = parseInt(h * 6.0)
122 f = (h * 6.0) - i
122 f = (h * 6.0) - i
123 p = v * (1.0 - s)
123 p = v * (1.0 - s)
124 q = v * (1.0 - s * f)
124 q = v * (1.0 - s * f)
125 t = v * (1.0 - s * (1.0 - f))
125 t = v * (1.0 - s * (1.0 - f))
126 i = i % 6
126 i = i % 6
127 if (i == 0)
127 if (i == 0)
128 return [v, t, p]
128 return [v, t, p]
129 if (i == 1)
129 if (i == 1)
130 return [q, v, p]
130 return [q, v, p]
131 if (i == 2)
131 if (i == 2)
132 return [p, v, t]
132 return [p, v, t]
133 if (i == 3)
133 if (i == 3)
134 return [p, q, v]
134 return [p, q, v]
135 if (i == 4)
135 if (i == 4)
136 return [t, p, v]
136 return [t, p, v]
137 if (i == 5)
137 if (i == 5)
138 return [v, p, q]
138 return [v, p, q]
139 },
139 },
140 generateColor:function(){
140 generateColor:function(){
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
141 this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
142 this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
143 HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
144 RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
145 function toRgb(v){
145 function toRgb(v){
146 return ""+parseInt(v*256)
146 return ""+parseInt(v*256)
147 }
147 }
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
148 return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
149
149
150 }
150 }
151 }
151 }
152
152
153 /**
153 /**
154 * PyRoutesJS
154 * PyRoutesJS
155 *
155 *
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
156 * Usage pyroutes.url('mark_error_fixed',{"error_id":error_id}) // /mark_error_fixed/<error_id>
157 */
157 */
158 var pyroutes = (function() {
158 var pyroutes = (function() {
159 // access global map defined in special file pyroutes
159 // access global map defined in special file pyroutes
160 var matchlist = PROUTES_MAP;
160 var matchlist = PROUTES_MAP;
161 var sprintf = (function() {
161 var sprintf = (function() {
162 function get_type(variable) {
162 function get_type(variable) {
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
163 return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();
164 }
164 }
165 function str_repeat(input, multiplier) {
165 function str_repeat(input, multiplier) {
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
166 for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}
167 return output.join('');
167 return output.join('');
168 }
168 }
169
169
170 var str_format = function() {
170 var str_format = function() {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
171 if (!str_format.cache.hasOwnProperty(arguments[0])) {
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
172 str_format.cache[arguments[0]] = str_format.parse(arguments[0]);
173 }
173 }
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
174 return str_format.format.call(null, str_format.cache[arguments[0]], arguments);
175 };
175 };
176
176
177 str_format.format = function(parse_tree, argv) {
177 str_format.format = function(parse_tree, argv) {
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
178 var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;
179 for (i = 0; i < tree_length; i++) {
179 for (i = 0; i < tree_length; i++) {
180 node_type = get_type(parse_tree[i]);
180 node_type = get_type(parse_tree[i]);
181 if (node_type === 'string') {
181 if (node_type === 'string') {
182 output.push(parse_tree[i]);
182 output.push(parse_tree[i]);
183 }
183 }
184 else if (node_type === 'array') {
184 else if (node_type === 'array') {
185 match = parse_tree[i]; // convenience purposes only
185 match = parse_tree[i]; // convenience purposes only
186 if (match[2]) { // keyword argument
186 if (match[2]) { // keyword argument
187 arg = argv[cursor];
187 arg = argv[cursor];
188 for (k = 0; k < match[2].length; k++) {
188 for (k = 0; k < match[2].length; k++) {
189 if (!arg.hasOwnProperty(match[2][k])) {
189 if (!arg.hasOwnProperty(match[2][k])) {
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
190 throw(sprintf('[sprintf] property "%s" does not exist', match[2][k]));
191 }
191 }
192 arg = arg[match[2][k]];
192 arg = arg[match[2][k]];
193 }
193 }
194 }
194 }
195 else if (match[1]) { // positional argument (explicit)
195 else if (match[1]) { // positional argument (explicit)
196 arg = argv[match[1]];
196 arg = argv[match[1]];
197 }
197 }
198 else { // positional argument (implicit)
198 else { // positional argument (implicit)
199 arg = argv[cursor++];
199 arg = argv[cursor++];
200 }
200 }
201
201
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
202 if (/[^s]/.test(match[8]) && (get_type(arg) != 'number')) {
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
203 throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));
204 }
204 }
205 switch (match[8]) {
205 switch (match[8]) {
206 case 'b': arg = arg.toString(2); break;
206 case 'b': arg = arg.toString(2); break;
207 case 'c': arg = String.fromCharCode(arg); break;
207 case 'c': arg = String.fromCharCode(arg); break;
208 case 'd': arg = parseInt(arg, 10); break;
208 case 'd': arg = parseInt(arg, 10); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
209 case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
210 case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;
211 case 'o': arg = arg.toString(8); break;
211 case 'o': arg = arg.toString(8); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
212 case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break;
213 case 'u': arg = Math.abs(arg); break;
213 case 'u': arg = Math.abs(arg); break;
214 case 'x': arg = arg.toString(16); break;
214 case 'x': arg = arg.toString(16); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
215 case 'X': arg = arg.toString(16).toUpperCase(); break;
216 }
216 }
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
217 arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg);
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
218 pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' ';
219 pad_length = match[6] - String(arg).length;
219 pad_length = match[6] - String(arg).length;
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
220 pad = match[6] ? str_repeat(pad_character, pad_length) : '';
221 output.push(match[5] ? arg + pad : pad + arg);
221 output.push(match[5] ? arg + pad : pad + arg);
222 }
222 }
223 }
223 }
224 return output.join('');
224 return output.join('');
225 };
225 };
226
226
227 str_format.cache = {};
227 str_format.cache = {};
228
228
229 str_format.parse = function(fmt) {
229 str_format.parse = function(fmt) {
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
230 var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;
231 while (_fmt) {
231 while (_fmt) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
232 if ((match = /^[^\x25]+/.exec(_fmt)) !== null) {
233 parse_tree.push(match[0]);
233 parse_tree.push(match[0]);
234 }
234 }
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
235 else if ((match = /^\x25{2}/.exec(_fmt)) !== null) {
236 parse_tree.push('%');
236 parse_tree.push('%');
237 }
237 }
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
238 else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {
239 if (match[2]) {
239 if (match[2]) {
240 arg_names |= 1;
240 arg_names |= 1;
241 var field_list = [], replacement_field = match[2], field_match = [];
241 var field_list = [], replacement_field = match[2], field_match = [];
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
242 if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
243 field_list.push(field_match[1]);
243 field_list.push(field_match[1]);
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
244 while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
245 if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) {
246 field_list.push(field_match[1]);
246 field_list.push(field_match[1]);
247 }
247 }
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
248 else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) {
249 field_list.push(field_match[1]);
249 field_list.push(field_match[1]);
250 }
250 }
251 else {
251 else {
252 throw('[sprintf] huh?');
252 throw('[sprintf] huh?');
253 }
253 }
254 }
254 }
255 }
255 }
256 else {
256 else {
257 throw('[sprintf] huh?');
257 throw('[sprintf] huh?');
258 }
258 }
259 match[2] = field_list;
259 match[2] = field_list;
260 }
260 }
261 else {
261 else {
262 arg_names |= 2;
262 arg_names |= 2;
263 }
263 }
264 if (arg_names === 3) {
264 if (arg_names === 3) {
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
265 throw('[sprintf] mixing positional and named placeholders is not (yet) supported');
266 }
266 }
267 parse_tree.push(match);
267 parse_tree.push(match);
268 }
268 }
269 else {
269 else {
270 throw('[sprintf] huh?');
270 throw('[sprintf] huh?');
271 }
271 }
272 _fmt = _fmt.substring(match[0].length);
272 _fmt = _fmt.substring(match[0].length);
273 }
273 }
274 return parse_tree;
274 return parse_tree;
275 };
275 };
276
276
277 return str_format;
277 return str_format;
278 })();
278 })();
279
279
280 var vsprintf = function(fmt, argv) {
280 var vsprintf = function(fmt, argv) {
281 argv.unshift(fmt);
281 argv.unshift(fmt);
282 return sprintf.apply(null, argv);
282 return sprintf.apply(null, argv);
283 };
283 };
284 return {
284 return {
285 'url': function(route_name, params) {
285 'url': function(route_name, params) {
286 var result = route_name;
286 var result = route_name;
287 if (typeof(params) != 'object'){
287 if (typeof(params) != 'object'){
288 params = {};
288 params = {};
289 }
289 }
290 if (matchlist.hasOwnProperty(route_name)) {
290 if (matchlist.hasOwnProperty(route_name)) {
291 var route = matchlist[route_name];
291 var route = matchlist[route_name];
292 // param substitution
292 // param substitution
293 for(var i=0; i < route[1].length; i++) {
293 for(var i=0; i < route[1].length; i++) {
294
294
295 if (!params.hasOwnProperty(route[1][i]))
295 if (!params.hasOwnProperty(route[1][i]))
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
296 throw new Error(route[1][i] + ' missing in "' + route_name + '" route generation');
297 }
297 }
298 result = sprintf(route[0], params);
298 result = sprintf(route[0], params);
299
299
300 var ret = [];
300 var ret = [];
301 //extra params => GET
301 //extra params => GET
302 for(param in params){
302 for(param in params){
303 if (route[1].indexOf(param) == -1){
303 if (route[1].indexOf(param) == -1){
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
304 ret.push(encodeURIComponent(param) + "=" + encodeURIComponent(params[param]));
305 }
305 }
306 }
306 }
307 var _parts = ret.join("&");
307 var _parts = ret.join("&");
308 if(_parts){
308 if(_parts){
309 result = result +'?'+ _parts
309 result = result +'?'+ _parts
310 }
310 }
311 }
311 }
312
312
313 return result;
313 return result;
314 },
314 },
315 'register': function(route_name, route_tmpl, req_params) {
315 'register': function(route_name, route_tmpl, req_params) {
316 if (typeof(req_params) != 'object') {
316 if (typeof(req_params) != 'object') {
317 req_params = [];
317 req_params = [];
318 }
318 }
319 //fix escape
319 //fix escape
320 route_tmpl = unescape(route_tmpl);
320 route_tmpl = unescape(route_tmpl);
321 keys = [];
321 keys = [];
322 for (o in req_params){
322 for (o in req_params){
323 keys.push(req_params[o])
323 keys.push(req_params[o])
324 }
324 }
325 matchlist[route_name] = [
325 matchlist[route_name] = [
326 route_tmpl,
326 route_tmpl,
327 keys
327 keys
328 ]
328 ]
329 },
329 },
330 '_routes': function(){
330 '_routes': function(){
331 return matchlist;
331 return matchlist;
332 }
332 }
333 }
333 }
334 })();
334 })();
335
335
336
336
337
337
338 /**
338 /**
339 * GLOBAL YUI Shortcuts
339 * GLOBAL YUI Shortcuts
340 */
340 */
341 var YUC = YAHOO.util.Connect;
341 var YUC = YAHOO.util.Connect;
342 var YUD = YAHOO.util.Dom;
342 var YUD = YAHOO.util.Dom;
343 var YUE = YAHOO.util.Event;
343 var YUE = YAHOO.util.Event;
344 var YUQ = YAHOO.util.Selector.query;
344 var YUQ = YAHOO.util.Selector.query;
345
345
346 // defines if push state is enabled for this browser ?
346 // defines if push state is enabled for this browser ?
347 var push_state_enabled = Boolean(
347 var push_state_enabled = Boolean(
348 window.history && window.history.pushState && window.history.replaceState
348 window.history && window.history.pushState && window.history.replaceState
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
349 && !( /* disable for versions of iOS before version 4.3 (8F190) */
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
350 (/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
351 /* disable for the mercury iOS browser, or at least older versions of the webkit engine */
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
352 || (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
353 )
353 )
354 );
354 );
355
355
356 var _run_callbacks = function(callbacks){
356 var _run_callbacks = function(callbacks){
357 if (callbacks !== undefined){
357 if (callbacks !== undefined){
358 var _l = callbacks.length;
358 var _l = callbacks.length;
359 for (var i=0;i<_l;i++){
359 for (var i=0;i<_l;i++){
360 var func = callbacks[i];
360 var func = callbacks[i];
361 if(typeof(func)=='function'){
361 if(typeof(func)=='function'){
362 try{
362 try{
363 func();
363 func();
364 }catch (err){};
364 }catch (err){};
365 }
365 }
366 }
366 }
367 }
367 }
368 }
368 }
369
369
370 /**
370 /**
371 * Partial Ajax Implementation
371 * Partial Ajax Implementation
372 *
372 *
373 * @param url: defines url to make partial request
373 * @param url: defines url to make partial request
374 * @param container: defines id of container to input partial result
374 * @param container: defines id of container to input partial result
375 * @param s_call: success callback function that takes o as arg
375 * @param s_call: success callback function that takes o as arg
376 * o.tId
376 * o.tId
377 * o.status
377 * o.status
378 * o.statusText
378 * o.statusText
379 * o.getResponseHeader[ ]
379 * o.getResponseHeader[ ]
380 * o.getAllResponseHeaders
380 * o.getAllResponseHeaders
381 * o.responseText
381 * o.responseText
382 * o.responseXML
382 * o.responseXML
383 * o.argument
383 * o.argument
384 * @param f_call: failure callback
384 * @param f_call: failure callback
385 * @param args arguments
385 * @param args arguments
386 */
386 */
387 function ypjax(url,container,s_call,f_call,args){
387 function ypjax(url,container,s_call,f_call,args){
388 var method='GET';
388 var method='GET';
389 if(args===undefined){
389 if(args===undefined){
390 args=null;
390 args=null;
391 }
391 }
392
392
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
393 // Set special header for partial ajax == HTTP_X_PARTIAL_XHR
394 YUC.initHeader('X-PARTIAL-XHR',true);
394 YUC.initHeader('X-PARTIAL-XHR',true);
395
395
396 // wrapper of passed callback
396 // wrapper of passed callback
397 var s_wrapper = (function(o){
397 var s_wrapper = (function(o){
398 return function(o){
398 return function(o){
399 YUD.get(container).innerHTML=o.responseText;
399 YUD.get(container).innerHTML=o.responseText;
400 YUD.setStyle(container,'opacity','1.0');
400 YUD.setStyle(container,'opacity','1.0');
401 //execute the given original callback
401 //execute the given original callback
402 if (s_call !== undefined){
402 if (s_call !== undefined){
403 s_call(o);
403 s_call(o);
404 }
404 }
405 }
405 }
406 })()
406 })()
407 YUD.setStyle(container,'opacity','0.3');
407 YUD.setStyle(container,'opacity','0.3');
408 YUC.asyncRequest(method,url,{
408 YUC.asyncRequest(method,url,{
409 success:s_wrapper,
409 success:s_wrapper,
410 failure:function(o){
410 failure:function(o){
411 console.log(o);
411 console.log(o);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
412 YUD.get(container).innerHTML='<span class="error_red">ERROR: {0}</span>'.format(o.status);
413 YUD.setStyle(container,'opacity','1.0');
413 YUD.setStyle(container,'opacity','1.0');
414 },
414 },
415 cache:false
415 cache:false
416 },args);
416 },args);
417
417
418 };
418 };
419
419
420 var ajaxGET = function(url,success) {
420 var ajaxGET = function(url,success) {
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
421 // Set special header for ajax == HTTP_X_PARTIAL_XHR
422 YUC.initHeader('X-PARTIAL-XHR',true);
422 YUC.initHeader('X-PARTIAL-XHR',true);
423
423
424 var sUrl = url;
424 var sUrl = url;
425 var callback = {
425 var callback = {
426 success: success,
426 success: success,
427 failure: function (o) {
427 failure: function (o) {
428 alert("error");
428 if (o.status != 0) {
429 alert("error: " + o.statusText);
430 };
429 },
431 },
430 };
432 };
431
433
432 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
434 var request = YAHOO.util.Connect.asyncRequest('GET', sUrl, callback);
433 return request;
435 return request;
434 };
436 };
435
437
436
438
437
439
438 var ajaxPOST = function(url,postData,success) {
440 var ajaxPOST = function(url,postData,success) {
439 // Set special header for ajax == HTTP_X_PARTIAL_XHR
441 // Set special header for ajax == HTTP_X_PARTIAL_XHR
440 YUC.initHeader('X-PARTIAL-XHR',true);
442 YUC.initHeader('X-PARTIAL-XHR',true);
441
443
442 var toQueryString = function(o) {
444 var toQueryString = function(o) {
443 if(typeof o !== 'object') {
445 if(typeof o !== 'object') {
444 return false;
446 return false;
445 }
447 }
446 var _p, _qs = [];
448 var _p, _qs = [];
447 for(_p in o) {
449 for(_p in o) {
448 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
450 _qs.push(encodeURIComponent(_p) + '=' + encodeURIComponent(o[_p]));
449 }
451 }
450 return _qs.join('&');
452 return _qs.join('&');
451 };
453 };
452
454
453 var sUrl = url;
455 var sUrl = url;
454 var callback = {
456 var callback = {
455 success: success,
457 success: success,
456 failure: function (o) {
458 failure: function (o) {
457 alert("error");
459 alert("error");
458 },
460 },
459 };
461 };
460 var postData = toQueryString(postData);
462 var postData = toQueryString(postData);
461 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
463 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
462 return request;
464 return request;
463 };
465 };
464
466
465
467
466 /**
468 /**
467 * tooltip activate
469 * tooltip activate
468 */
470 */
469 var tooltip_activate = function(){
471 var tooltip_activate = function(){
470 yt = YAHOO.yuitip.main;
472 yt = YAHOO.yuitip.main;
471 YUE.onDOMReady(yt.init);
473 YUE.onDOMReady(yt.init);
472 };
474 };
473
475
474 /**
476 /**
475 * show more
477 * show more
476 */
478 */
477 var show_more_event = function(){
479 var show_more_event = function(){
478 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
480 YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
479 var el = e.target;
481 var el = e.target;
480 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
482 YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
481 YUD.setStyle(el.parentNode,'display','none');
483 YUD.setStyle(el.parentNode,'display','none');
482 });
484 });
483 };
485 };
484
486
485 /**
487 /**
486 * show changeset tooltip
488 * show changeset tooltip
487 */
489 */
488 var show_changeset_tooltip = function(){
490 var show_changeset_tooltip = function(){
489 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
491 YUE.on(YUD.getElementsByClassName('lazy-cs'), 'mouseover', function(e){
490 var target = e.currentTarget;
492 var target = e.currentTarget;
491 var rid = YUD.getAttribute(target,'raw_id');
493 var rid = YUD.getAttribute(target,'raw_id');
492 var repo_name = YUD.getAttribute(target,'repo_name');
494 var repo_name = YUD.getAttribute(target,'repo_name');
493 var ttid = 'tt-'+rid;
495 var ttid = 'tt-'+rid;
494 var success = function(o){
496 var success = function(o){
495 var json = JSON.parse(o.responseText);
497 var json = JSON.parse(o.responseText);
496 YUD.addClass(target,'tooltip')
498 YUD.addClass(target,'tooltip')
497 YUD.setAttribute(target, 'title',json['message']);
499 YUD.setAttribute(target, 'title',json['message']);
498 YAHOO.yuitip.main.show_yuitip(e, target);
500 YAHOO.yuitip.main.show_yuitip(e, target);
499 }
501 }
500 if(rid && !YUD.hasClass(target, 'tooltip')){
502 if(rid && !YUD.hasClass(target, 'tooltip')){
501 YUD.setAttribute(target,'id',ttid);
503 YUD.setAttribute(target,'id',ttid);
502 YUD.setAttribute(target, 'title',_TM['loading...']);
504 YUD.setAttribute(target, 'title',_TM['loading...']);
503 YAHOO.yuitip.main.set_listeners(target);
505 YAHOO.yuitip.main.set_listeners(target);
504 YAHOO.yuitip.main.show_yuitip(e, target);
506 YAHOO.yuitip.main.show_yuitip(e, target);
505 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
507 var url = pyroutes.url('changeset_info', {"repo_name":repo_name, "revision": rid});
506 ajaxGET(url, success)
508 ajaxGET(url, success)
507 }
509 }
508 });
510 });
509 };
511 };
510
512
511 var onSuccessFollow = function(target){
513 var onSuccessFollow = function(target){
512 var f = YUD.get(target);
514 var f = YUD.get(target);
513 var f_cnt = YUD.get('current_followers_count');
515 var f_cnt = YUD.get('current_followers_count');
514
516
515 if(YUD.hasClass(f, 'follow')){
517 if(YUD.hasClass(f, 'follow')){
516 f.setAttribute('class','following');
518 f.setAttribute('class','following');
517 f.setAttribute('title',_TM['Stop following this repository']);
519 f.setAttribute('title',_TM['Stop following this repository']);
518
520
519 if(f_cnt){
521 if(f_cnt){
520 var cnt = Number(f_cnt.innerHTML)+1;
522 var cnt = Number(f_cnt.innerHTML)+1;
521 f_cnt.innerHTML = cnt;
523 f_cnt.innerHTML = cnt;
522 }
524 }
523 }
525 }
524 else{
526 else{
525 f.setAttribute('class','follow');
527 f.setAttribute('class','follow');
526 f.setAttribute('title',_TM['Start following this repository']);
528 f.setAttribute('title',_TM['Start following this repository']);
527 if(f_cnt){
529 if(f_cnt){
528 var cnt = Number(f_cnt.innerHTML)-1;
530 var cnt = Number(f_cnt.innerHTML)-1;
529 f_cnt.innerHTML = cnt;
531 f_cnt.innerHTML = cnt;
530 }
532 }
531 }
533 }
532 }
534 }
533
535
534 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
536 var toggleFollowingUser = function(target,fallows_user_id,token,user_id){
535 args = 'follows_user_id='+fallows_user_id;
537 args = 'follows_user_id='+fallows_user_id;
536 args+= '&amp;auth_token='+token;
538 args+= '&amp;auth_token='+token;
537 if(user_id != undefined){
539 if(user_id != undefined){
538 args+="&amp;user_id="+user_id;
540 args+="&amp;user_id="+user_id;
539 }
541 }
540 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
542 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
541 success:function(o){
543 success:function(o){
542 onSuccessFollow(target);
544 onSuccessFollow(target);
543 }
545 }
544 },args);
546 },args);
545 return false;
547 return false;
546 }
548 }
547
549
548 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
550 var toggleFollowingRepo = function(target,fallows_repo_id,token,user_id){
549
551
550 args = 'follows_repo_id='+fallows_repo_id;
552 args = 'follows_repo_id='+fallows_repo_id;
551 args+= '&amp;auth_token='+token;
553 args+= '&amp;auth_token='+token;
552 if(user_id != undefined){
554 if(user_id != undefined){
553 args+="&amp;user_id="+user_id;
555 args+="&amp;user_id="+user_id;
554 }
556 }
555 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
557 YUC.asyncRequest('POST',TOGGLE_FOLLOW_URL,{
556 success:function(o){
558 success:function(o){
557 onSuccessFollow(target);
559 onSuccessFollow(target);
558 }
560 }
559 },args);
561 },args);
560 return false;
562 return false;
561 }
563 }
562
564
563 var showRepoSize = function(target, repo_name, token){
565 var showRepoSize = function(target, repo_name, token){
564 var args= 'auth_token='+token;
566 var args= 'auth_token='+token;
565
567
566 if(!YUD.hasClass(target, 'loaded')){
568 if(!YUD.hasClass(target, 'loaded')){
567 YUD.get(target).innerHTML = _TM['Loading ...'];
569 YUD.get(target).innerHTML = _TM['Loading ...'];
568 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
570 var url = pyroutes.url('repo_size', {"repo_name":repo_name});
569 YUC.asyncRequest('POST',url,{
571 YUC.asyncRequest('POST',url,{
570 success:function(o){
572 success:function(o){
571 YUD.get(target).innerHTML = JSON.parse(o.responseText);
573 YUD.get(target).innerHTML = JSON.parse(o.responseText);
572 YUD.addClass(target, 'loaded');
574 YUD.addClass(target, 'loaded');
573 }
575 }
574 },args);
576 },args);
575 }
577 }
576 return false;
578 return false;
577 }
579 }
578
580
579 /**
581 /**
580 * TOOLTIP IMPL.
582 * TOOLTIP IMPL.
581 */
583 */
582 YAHOO.namespace('yuitip');
584 YAHOO.namespace('yuitip');
583 YAHOO.yuitip.main = {
585 YAHOO.yuitip.main = {
584
586
585 $: YAHOO.util.Dom.get,
587 $: YAHOO.util.Dom.get,
586
588
587 bgColor: '#000',
589 bgColor: '#000',
588 speed: 0.3,
590 speed: 0.3,
589 opacity: 0.9,
591 opacity: 0.9,
590 offset: [15,15],
592 offset: [15,15],
591 useAnim: false,
593 useAnim: false,
592 maxWidth: 600,
594 maxWidth: 600,
593 add_links: false,
595 add_links: false,
594 yuitips: [],
596 yuitips: [],
595
597
596 set_listeners: function(tt){
598 set_listeners: function(tt){
597 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
599 YUE.on(tt, 'mouseover', yt.show_yuitip, tt);
598 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
600 YUE.on(tt, 'mousemove', yt.move_yuitip, tt);
599 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
601 YUE.on(tt, 'mouseout', yt.close_yuitip, tt);
600 },
602 },
601
603
602 init: function(){
604 init: function(){
603 yt.tipBox = yt.$('tip-box');
605 yt.tipBox = yt.$('tip-box');
604 if(!yt.tipBox){
606 if(!yt.tipBox){
605 yt.tipBox = document.createElement('div');
607 yt.tipBox = document.createElement('div');
606 document.body.appendChild(yt.tipBox);
608 document.body.appendChild(yt.tipBox);
607 yt.tipBox.id = 'tip-box';
609 yt.tipBox.id = 'tip-box';
608 }
610 }
609
611
610 YUD.setStyle(yt.tipBox, 'display', 'none');
612 YUD.setStyle(yt.tipBox, 'display', 'none');
611 YUD.setStyle(yt.tipBox, 'position', 'absolute');
613 YUD.setStyle(yt.tipBox, 'position', 'absolute');
612 if(yt.maxWidth !== null){
614 if(yt.maxWidth !== null){
613 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
615 YUD.setStyle(yt.tipBox, 'max-width', yt.maxWidth+'px');
614 }
616 }
615
617
616 var yuitips = YUD.getElementsByClassName('tooltip');
618 var yuitips = YUD.getElementsByClassName('tooltip');
617
619
618 if(yt.add_links === true){
620 if(yt.add_links === true){
619 var links = document.getElementsByTagName('a');
621 var links = document.getElementsByTagName('a');
620 var linkLen = links.length;
622 var linkLen = links.length;
621 for(i=0;i<linkLen;i++){
623 for(i=0;i<linkLen;i++){
622 yuitips.push(links[i]);
624 yuitips.push(links[i]);
623 }
625 }
624 }
626 }
625
627
626 var yuiLen = yuitips.length;
628 var yuiLen = yuitips.length;
627
629
628 for(i=0;i<yuiLen;i++){
630 for(i=0;i<yuiLen;i++){
629 yt.set_listeners(yuitips[i]);
631 yt.set_listeners(yuitips[i]);
630 }
632 }
631 },
633 },
632
634
633 show_yuitip: function(e, el){
635 show_yuitip: function(e, el){
634 YUE.stopEvent(e);
636 YUE.stopEvent(e);
635 if(el.tagName.toLowerCase() === 'img'){
637 if(el.tagName.toLowerCase() === 'img'){
636 yt.tipText = el.alt ? el.alt : '';
638 yt.tipText = el.alt ? el.alt : '';
637 } else {
639 } else {
638 yt.tipText = el.title ? el.title : '';
640 yt.tipText = el.title ? el.title : '';
639 }
641 }
640
642
641 if(yt.tipText !== ''){
643 if(yt.tipText !== ''){
642 // save org title
644 // save org title
643 YUD.setAttribute(el, 'tt_title', yt.tipText);
645 YUD.setAttribute(el, 'tt_title', yt.tipText);
644 // reset title to not show org tooltips
646 // reset title to not show org tooltips
645 YUD.setAttribute(el, 'title', '');
647 YUD.setAttribute(el, 'title', '');
646
648
647 yt.tipBox.innerHTML = yt.tipText;
649 yt.tipBox.innerHTML = yt.tipText;
648 YUD.setStyle(yt.tipBox, 'display', 'block');
650 YUD.setStyle(yt.tipBox, 'display', 'block');
649 if(yt.useAnim === true){
651 if(yt.useAnim === true){
650 YUD.setStyle(yt.tipBox, 'opacity', '0');
652 YUD.setStyle(yt.tipBox, 'opacity', '0');
651 var newAnim = new YAHOO.util.Anim(yt.tipBox,
653 var newAnim = new YAHOO.util.Anim(yt.tipBox,
652 {
654 {
653 opacity: { to: yt.opacity }
655 opacity: { to: yt.opacity }
654 }, yt.speed, YAHOO.util.Easing.easeOut
656 }, yt.speed, YAHOO.util.Easing.easeOut
655 );
657 );
656 newAnim.animate();
658 newAnim.animate();
657 }
659 }
658 }
660 }
659 },
661 },
660
662
661 move_yuitip: function(e, el){
663 move_yuitip: function(e, el){
662 YUE.stopEvent(e);
664 YUE.stopEvent(e);
663 var movePos = YUE.getXY(e);
665 var movePos = YUE.getXY(e);
664 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
666 YUD.setStyle(yt.tipBox, 'top', (movePos[1] + yt.offset[1]) + 'px');
665 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
667 YUD.setStyle(yt.tipBox, 'left', (movePos[0] + yt.offset[0]) + 'px');
666 },
668 },
667
669
668 close_yuitip: function(e, el){
670 close_yuitip: function(e, el){
669 YUE.stopEvent(e);
671 YUE.stopEvent(e);
670
672
671 if(yt.useAnim === true){
673 if(yt.useAnim === true){
672 var newAnim = new YAHOO.util.Anim(yt.tipBox,
674 var newAnim = new YAHOO.util.Anim(yt.tipBox,
673 {
675 {
674 opacity: { to: 0 }
676 opacity: { to: 0 }
675 }, yt.speed, YAHOO.util.Easing.easeOut
677 }, yt.speed, YAHOO.util.Easing.easeOut
676 );
678 );
677 newAnim.animate();
679 newAnim.animate();
678 } else {
680 } else {
679 YUD.setStyle(yt.tipBox, 'display', 'none');
681 YUD.setStyle(yt.tipBox, 'display', 'none');
680 }
682 }
681 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
683 YUD.setAttribute(el,'title', YUD.getAttribute(el, 'tt_title'));
682 }
684 }
683 }
685 }
684
686
685 /**
687 /**
686 * Quick filter widget
688 * Quick filter widget
687 *
689 *
688 * @param target: filter input target
690 * @param target: filter input target
689 * @param nodes: list of nodes in html we want to filter.
691 * @param nodes: list of nodes in html we want to filter.
690 * @param display_element function that takes current node from nodes and
692 * @param display_element function that takes current node from nodes and
691 * does hide or show based on the node
693 * does hide or show based on the node
692 *
694 *
693 */
695 */
694 var q_filter = function(target,nodes,display_element){
696 var q_filter = function(target,nodes,display_element){
695
697
696 var nodes = nodes;
698 var nodes = nodes;
697 var q_filter_field = YUD.get(target);
699 var q_filter_field = YUD.get(target);
698 var F = YAHOO.namespace(target);
700 var F = YAHOO.namespace(target);
699
701
700 YUE.on(q_filter_field,'click',function(){
702 YUE.on(q_filter_field,'click',function(){
701 q_filter_field.value = '';
703 q_filter_field.value = '';
702 });
704 });
703
705
704 YUE.on(q_filter_field,'keyup',function(e){
706 YUE.on(q_filter_field,'keyup',function(e){
705 clearTimeout(F.filterTimeout);
707 clearTimeout(F.filterTimeout);
706 F.filterTimeout = setTimeout(F.updateFilter,600);
708 F.filterTimeout = setTimeout(F.updateFilter,600);
707 });
709 });
708
710
709 F.filterTimeout = null;
711 F.filterTimeout = null;
710
712
711 var show_node = function(node){
713 var show_node = function(node){
712 YUD.setStyle(node,'display','')
714 YUD.setStyle(node,'display','')
713 }
715 }
714 var hide_node = function(node){
716 var hide_node = function(node){
715 YUD.setStyle(node,'display','none');
717 YUD.setStyle(node,'display','none');
716 }
718 }
717
719
718 F.updateFilter = function() {
720 F.updateFilter = function() {
719 // Reset timeout
721 // Reset timeout
720 F.filterTimeout = null;
722 F.filterTimeout = null;
721
723
722 var obsolete = [];
724 var obsolete = [];
723
725
724 var req = q_filter_field.value.toLowerCase();
726 var req = q_filter_field.value.toLowerCase();
725
727
726 var l = nodes.length;
728 var l = nodes.length;
727 var i;
729 var i;
728 var showing = 0;
730 var showing = 0;
729
731
730 for (i=0;i<l;i++ ){
732 for (i=0;i<l;i++ ){
731 var n = nodes[i];
733 var n = nodes[i];
732 var target_element = display_element(n)
734 var target_element = display_element(n)
733 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
735 if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
734 hide_node(target_element);
736 hide_node(target_element);
735 }
737 }
736 else{
738 else{
737 show_node(target_element);
739 show_node(target_element);
738 showing+=1;
740 showing+=1;
739 }
741 }
740 }
742 }
741
743
742 // if repo_count is set update the number
744 // if repo_count is set update the number
743 var cnt = YUD.get('repo_count');
745 var cnt = YUD.get('repo_count');
744 if(cnt){
746 if(cnt){
745 YUD.get('repo_count').innerHTML = showing;
747 YUD.get('repo_count').innerHTML = showing;
746 }
748 }
747
749
748 }
750 }
749 };
751 };
750
752
751 var tableTr = function(cls, body){
753 var tableTr = function(cls, body){
752 var _el = document.createElement('div');
754 var _el = document.createElement('div');
753 var cont = new YAHOO.util.Element(body);
755 var cont = new YAHOO.util.Element(body);
754 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
756 var comment_id = fromHTML(body).children[0].id.split('comment-')[1];
755 var id = 'comment-tr-{0}'.format(comment_id);
757 var id = 'comment-tr-{0}'.format(comment_id);
756 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
758 var _html = ('<table><tbody><tr id="{0}" class="{1}">'+
757 '<td class="lineno-inline new-inline"></td>'+
759 '<td class="lineno-inline new-inline"></td>'+
758 '<td class="lineno-inline old-inline"></td>'+
760 '<td class="lineno-inline old-inline"></td>'+
759 '<td>{2}</td>'+
761 '<td>{2}</td>'+
760 '</tr></tbody></table>').format(id, cls, body);
762 '</tr></tbody></table>').format(id, cls, body);
761 _el.innerHTML = _html;
763 _el.innerHTML = _html;
762 return _el.children[0].children[0].children[0];
764 return _el.children[0].children[0].children[0];
763 };
765 };
764
766
765 /** comments **/
767 /** comments **/
766 var removeInlineForm = function(form) {
768 var removeInlineForm = function(form) {
767 form.parentNode.removeChild(form);
769 form.parentNode.removeChild(form);
768 };
770 };
769
771
770 var createInlineForm = function(parent_tr, f_path, line) {
772 var createInlineForm = function(parent_tr, f_path, line) {
771 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
773 var tmpl = YUD.get('comment-inline-form-template').innerHTML;
772 tmpl = tmpl.format(f_path, line);
774 tmpl = tmpl.format(f_path, line);
773 var form = tableTr('comment-form-inline',tmpl)
775 var form = tableTr('comment-form-inline',tmpl)
774
776
775 // create event for hide button
777 // create event for hide button
776 form = new YAHOO.util.Element(form);
778 form = new YAHOO.util.Element(form);
777 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
779 var form_hide_button = new YAHOO.util.Element(YUD.getElementsByClassName('hide-inline-form',null,form)[0]);
778 form_hide_button.on('click', function(e) {
780 form_hide_button.on('click', function(e) {
779 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
781 var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
780 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
782 if(YUD.hasClass(newtr.nextElementSibling,'inline-comments-button')){
781 YUD.setStyle(newtr.nextElementSibling,'display','');
783 YUD.setStyle(newtr.nextElementSibling,'display','');
782 }
784 }
783 removeInlineForm(newtr);
785 removeInlineForm(newtr);
784 YUD.removeClass(parent_tr, 'form-open');
786 YUD.removeClass(parent_tr, 'form-open');
785 YUD.removeClass(parent_tr, 'hl-comment');
787 YUD.removeClass(parent_tr, 'hl-comment');
786
788
787 });
789 });
788
790
789 return form
791 return form
790 };
792 };
791
793
792 /**
794 /**
793 * Inject inline comment for on given TR this tr should be always an .line
795 * Inject inline comment for on given TR this tr should be always an .line
794 * tr containing the line. Code will detect comment, and always put the comment
796 * tr containing the line. Code will detect comment, and always put the comment
795 * block at the very bottom
797 * block at the very bottom
796 */
798 */
797 var injectInlineForm = function(tr){
799 var injectInlineForm = function(tr){
798 if(!YUD.hasClass(tr, 'line')){
800 if(!YUD.hasClass(tr, 'line')){
799 return
801 return
800 }
802 }
801 var submit_url = AJAX_COMMENT_URL;
803 var submit_url = AJAX_COMMENT_URL;
802 var _td = YUD.getElementsByClassName('code',null,tr)[0];
804 var _td = YUD.getElementsByClassName('code',null,tr)[0];
803 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
805 if(YUD.hasClass(tr,'form-open') || YUD.hasClass(tr,'context') || YUD.hasClass(_td,'no-comment')){
804 return
806 return
805 }
807 }
806 YUD.addClass(tr,'form-open');
808 YUD.addClass(tr,'form-open');
807 YUD.addClass(tr,'hl-comment');
809 YUD.addClass(tr,'hl-comment');
808 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
810 var node = YUD.getElementsByClassName('full_f_path',null,tr.parentNode.parentNode.parentNode)[0];
809 var f_path = YUD.getAttribute(node,'path');
811 var f_path = YUD.getAttribute(node,'path');
810 var lineno = getLineNo(tr);
812 var lineno = getLineNo(tr);
811 var form = createInlineForm(tr, f_path, lineno, submit_url);
813 var form = createInlineForm(tr, f_path, lineno, submit_url);
812
814
813 var parent = tr;
815 var parent = tr;
814 while (1){
816 while (1){
815 var n = parent.nextElementSibling;
817 var n = parent.nextElementSibling;
816 // next element are comments !
818 // next element are comments !
817 if(YUD.hasClass(n,'inline-comments')){
819 if(YUD.hasClass(n,'inline-comments')){
818 parent = n;
820 parent = n;
819 }
821 }
820 else{
822 else{
821 break;
823 break;
822 }
824 }
823 }
825 }
824 YUD.insertAfter(form,parent);
826 YUD.insertAfter(form,parent);
825 var f = YUD.get(form);
827 var f = YUD.get(form);
826 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
828 var overlay = YUD.getElementsByClassName('overlay',null,f)[0];
827 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
829 var _form = YUD.getElementsByClassName('inline-form',null,f)[0];
828
830
829 YUE.on(YUD.get(_form), 'submit',function(e){
831 YUE.on(YUD.get(_form), 'submit',function(e){
830 YUE.preventDefault(e);
832 YUE.preventDefault(e);
831
833
832 //ajax submit
834 //ajax submit
833 var text = YUD.get('text_'+lineno).value;
835 var text = YUD.get('text_'+lineno).value;
834 var postData = {
836 var postData = {
835 'text':text,
837 'text':text,
836 'f_path':f_path,
838 'f_path':f_path,
837 'line':lineno
839 'line':lineno
838 };
840 };
839
841
840 if(lineno === undefined){
842 if(lineno === undefined){
841 alert('missing line !');
843 alert('missing line !');
842 return
844 return
843 }
845 }
844 if(f_path === undefined){
846 if(f_path === undefined){
845 alert('missing file path !');
847 alert('missing file path !');
846 return
848 return
847 }
849 }
848
850
849 if(text == ""){
851 if(text == ""){
850 return
852 return
851 }
853 }
852
854
853 var success = function(o){
855 var success = function(o){
854 YUD.removeClass(tr, 'form-open');
856 YUD.removeClass(tr, 'form-open');
855 removeInlineForm(f);
857 removeInlineForm(f);
856 var json_data = JSON.parse(o.responseText);
858 var json_data = JSON.parse(o.responseText);
857 renderInlineComment(json_data);
859 renderInlineComment(json_data);
858 };
860 };
859
861
860 if (YUD.hasClass(overlay,'overlay')){
862 if (YUD.hasClass(overlay,'overlay')){
861 var w = _form.offsetWidth;
863 var w = _form.offsetWidth;
862 var h = _form.offsetHeight;
864 var h = _form.offsetHeight;
863 YUD.setStyle(overlay,'width',w+'px');
865 YUD.setStyle(overlay,'width',w+'px');
864 YUD.setStyle(overlay,'height',h+'px');
866 YUD.setStyle(overlay,'height',h+'px');
865 }
867 }
866 YUD.addClass(overlay, 'submitting');
868 YUD.addClass(overlay, 'submitting');
867
869
868 ajaxPOST(submit_url, postData, success);
870 ajaxPOST(submit_url, postData, success);
869 });
871 });
870
872
871 setTimeout(function(){
873 setTimeout(function(){
872 // callbacks
874 // callbacks
873 tooltip_activate();
875 tooltip_activate();
874 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
876 MentionsAutoComplete('text_'+lineno, 'mentions_container_'+lineno,
875 _USERS_AC_DATA, _GROUPS_AC_DATA);
877 _USERS_AC_DATA, _GROUPS_AC_DATA);
876 var _e = YUD.get('text_'+lineno);
878 var _e = YUD.get('text_'+lineno);
877 if(_e){
879 if(_e){
878 _e.focus();
880 _e.focus();
879 }
881 }
880 },10)
882 },10)
881 };
883 };
882
884
883 var deleteComment = function(comment_id){
885 var deleteComment = function(comment_id){
884 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
886 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__',comment_id);
885 var postData = {'_method':'delete'};
887 var postData = {'_method':'delete'};
886 var success = function(o){
888 var success = function(o){
887 var n = YUD.get('comment-tr-'+comment_id);
889 var n = YUD.get('comment-tr-'+comment_id);
888 var root = prevElementSibling(prevElementSibling(n));
890 var root = prevElementSibling(prevElementSibling(n));
889 n.parentNode.removeChild(n);
891 n.parentNode.removeChild(n);
890
892
891 // scann nodes, and attach add button to last one
893 // scann nodes, and attach add button to last one
892 placeAddButton(root);
894 placeAddButton(root);
893 }
895 }
894 ajaxPOST(url,postData,success);
896 ajaxPOST(url,postData,success);
895 }
897 }
896
898
897 var createInlineAddButton = function(tr){
899 var createInlineAddButton = function(tr){
898
900
899 var label = TRANSLATION_MAP['Add another comment'];
901 var label = TRANSLATION_MAP['Add another comment'];
900
902
901 var html_el = document.createElement('div');
903 var html_el = document.createElement('div');
902 YUD.addClass(html_el, 'add-comment');
904 YUD.addClass(html_el, 'add-comment');
903 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
905 html_el.innerHTML = '<span class="ui-btn">{0}</span>'.format(label);
904
906
905 var add = new YAHOO.util.Element(html_el);
907 var add = new YAHOO.util.Element(html_el);
906 add.on('click', function(e) {
908 add.on('click', function(e) {
907 injectInlineForm(tr);
909 injectInlineForm(tr);
908 });
910 });
909 return add;
911 return add;
910 };
912 };
911
913
912 var getLineNo = function(tr) {
914 var getLineNo = function(tr) {
913 var line;
915 var line;
914 var o = tr.children[0].id.split('_');
916 var o = tr.children[0].id.split('_');
915 var n = tr.children[1].id.split('_');
917 var n = tr.children[1].id.split('_');
916
918
917 if (n.length >= 2) {
919 if (n.length >= 2) {
918 line = n[n.length-1];
920 line = n[n.length-1];
919 } else if (o.length >= 2) {
921 } else if (o.length >= 2) {
920 line = o[o.length-1];
922 line = o[o.length-1];
921 }
923 }
922
924
923 return line
925 return line
924 };
926 };
925
927
926 var placeAddButton = function(target_tr){
928 var placeAddButton = function(target_tr){
927 if(!target_tr){
929 if(!target_tr){
928 return
930 return
929 }
931 }
930 var last_node = target_tr;
932 var last_node = target_tr;
931 //scann
933 //scann
932 while (1){
934 while (1){
933 var n = last_node.nextElementSibling;
935 var n = last_node.nextElementSibling;
934 // next element are comments !
936 // next element are comments !
935 if(YUD.hasClass(n,'inline-comments')){
937 if(YUD.hasClass(n,'inline-comments')){
936 last_node = n;
938 last_node = n;
937 //also remove the comment button from previous
939 //also remove the comment button from previous
938 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
940 var comment_add_buttons = YUD.getElementsByClassName('add-comment',null,last_node);
939 for(var i=0;i<comment_add_buttons.length;i++){
941 for(var i=0;i<comment_add_buttons.length;i++){
940 var b = comment_add_buttons[i];
942 var b = comment_add_buttons[i];
941 b.parentNode.removeChild(b);
943 b.parentNode.removeChild(b);
942 }
944 }
943 }
945 }
944 else{
946 else{
945 break;
947 break;
946 }
948 }
947 }
949 }
948
950
949 var add = createInlineAddButton(target_tr);
951 var add = createInlineAddButton(target_tr);
950 // get the comment div
952 // get the comment div
951 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
953 var comment_block = YUD.getElementsByClassName('comment',null,last_node)[0];
952 // attach add button
954 // attach add button
953 YUD.insertAfter(add,comment_block);
955 YUD.insertAfter(add,comment_block);
954 }
956 }
955
957
956 /**
958 /**
957 * Places the inline comment into the changeset block in proper line position
959 * Places the inline comment into the changeset block in proper line position
958 */
960 */
959 var placeInline = function(target_container,lineno,html){
961 var placeInline = function(target_container,lineno,html){
960 var lineid = "{0}_{1}".format(target_container,lineno);
962 var lineid = "{0}_{1}".format(target_container,lineno);
961 var target_line = YUD.get(lineid);
963 var target_line = YUD.get(lineid);
962 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
964 var comment = new YAHOO.util.Element(tableTr('inline-comments',html))
963
965
964 // check if there are comments already !
966 // check if there are comments already !
965 var parent = target_line.parentNode;
967 var parent = target_line.parentNode;
966 var root_parent = parent;
968 var root_parent = parent;
967 while (1){
969 while (1){
968 var n = parent.nextElementSibling;
970 var n = parent.nextElementSibling;
969 // next element are comments !
971 // next element are comments !
970 if(YUD.hasClass(n,'inline-comments')){
972 if(YUD.hasClass(n,'inline-comments')){
971 parent = n;
973 parent = n;
972 }
974 }
973 else{
975 else{
974 break;
976 break;
975 }
977 }
976 }
978 }
977 // put in the comment at the bottom
979 // put in the comment at the bottom
978 YUD.insertAfter(comment,parent);
980 YUD.insertAfter(comment,parent);
979
981
980 // scann nodes, and attach add button to last one
982 // scann nodes, and attach add button to last one
981 placeAddButton(root_parent);
983 placeAddButton(root_parent);
982
984
983 return target_line;
985 return target_line;
984 }
986 }
985
987
986 /**
988 /**
987 * make a single inline comment and place it inside
989 * make a single inline comment and place it inside
988 */
990 */
989 var renderInlineComment = function(json_data){
991 var renderInlineComment = function(json_data){
990 try{
992 try{
991 var html = json_data['rendered_text'];
993 var html = json_data['rendered_text'];
992 var lineno = json_data['line_no'];
994 var lineno = json_data['line_no'];
993 var target_id = json_data['target_id'];
995 var target_id = json_data['target_id'];
994 placeInline(target_id, lineno, html);
996 placeInline(target_id, lineno, html);
995
997
996 }catch(e){
998 }catch(e){
997 console.log(e);
999 console.log(e);
998 }
1000 }
999 }
1001 }
1000
1002
1001 /**
1003 /**
1002 * Iterates over all the inlines, and places them inside proper blocks of data
1004 * Iterates over all the inlines, and places them inside proper blocks of data
1003 */
1005 */
1004 var renderInlineComments = function(file_comments){
1006 var renderInlineComments = function(file_comments){
1005 for (f in file_comments){
1007 for (f in file_comments){
1006 // holding all comments for a FILE
1008 // holding all comments for a FILE
1007 var box = file_comments[f];
1009 var box = file_comments[f];
1008
1010
1009 var target_id = YUD.getAttribute(box,'target_id');
1011 var target_id = YUD.getAttribute(box,'target_id');
1010 // actually comments with line numbers
1012 // actually comments with line numbers
1011 var comments = box.children;
1013 var comments = box.children;
1012 for(var i=0; i<comments.length; i++){
1014 for(var i=0; i<comments.length; i++){
1013 var data = {
1015 var data = {
1014 'rendered_text': comments[i].outerHTML,
1016 'rendered_text': comments[i].outerHTML,
1015 'line_no': YUD.getAttribute(comments[i],'line'),
1017 'line_no': YUD.getAttribute(comments[i],'line'),
1016 'target_id': target_id
1018 'target_id': target_id
1017 }
1019 }
1018 renderInlineComment(data);
1020 renderInlineComment(data);
1019 }
1021 }
1020 }
1022 }
1021 }
1023 }
1022
1024
1023 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1025 var fileBrowserListeners = function(current_url, node_list_url, url_base){
1024 var current_url_branch = +"?branch=__BRANCH__";
1026 var current_url_branch = +"?branch=__BRANCH__";
1025
1027
1026 YUE.on('stay_at_branch','click',function(e){
1028 YUE.on('stay_at_branch','click',function(e){
1027 if(e.target.checked){
1029 if(e.target.checked){
1028 var uri = current_url_branch;
1030 var uri = current_url_branch;
1029 uri = uri.replace('__BRANCH__',e.target.value);
1031 uri = uri.replace('__BRANCH__',e.target.value);
1030 window.location = uri;
1032 window.location = uri;
1031 }
1033 }
1032 else{
1034 else{
1033 window.location = current_url;
1035 window.location = current_url;
1034 }
1036 }
1035 })
1037 })
1036
1038
1037 var n_filter = YUD.get('node_filter');
1039 var n_filter = YUD.get('node_filter');
1038 var F = YAHOO.namespace('node_filter');
1040 var F = YAHOO.namespace('node_filter');
1039
1041
1040 F.filterTimeout = null;
1042 F.filterTimeout = null;
1041 var nodes = null;
1043 var nodes = null;
1042
1044
1043 F.initFilter = function(){
1045 F.initFilter = function(){
1044 YUD.setStyle('node_filter_box_loading','display','');
1046 YUD.setStyle('node_filter_box_loading','display','');
1045 YUD.setStyle('search_activate_id','display','none');
1047 YUD.setStyle('search_activate_id','display','none');
1046 YUD.setStyle('add_node_id','display','none');
1048 YUD.setStyle('add_node_id','display','none');
1047 YUC.initHeader('X-PARTIAL-XHR',true);
1049 YUC.initHeader('X-PARTIAL-XHR',true);
1048 YUC.asyncRequest('GET', node_list_url, {
1050 YUC.asyncRequest('GET', node_list_url, {
1049 success:function(o){
1051 success:function(o){
1050 nodes = JSON.parse(o.responseText).nodes;
1052 nodes = JSON.parse(o.responseText).nodes;
1051 YUD.setStyle('node_filter_box_loading','display','none');
1053 YUD.setStyle('node_filter_box_loading','display','none');
1052 YUD.setStyle('node_filter_box','display','');
1054 YUD.setStyle('node_filter_box','display','');
1053 n_filter.focus();
1055 n_filter.focus();
1054 if(YUD.hasClass(n_filter,'init')){
1056 if(YUD.hasClass(n_filter,'init')){
1055 n_filter.value = '';
1057 n_filter.value = '';
1056 YUD.removeClass(n_filter,'init');
1058 YUD.removeClass(n_filter,'init');
1057 }
1059 }
1058 },
1060 },
1059 failure:function(o){
1061 failure:function(o){
1060 console.log('failed to load');
1062 console.log('failed to load');
1061 }
1063 }
1062 },null);
1064 },null);
1063 }
1065 }
1064
1066
1065 F.updateFilter = function(e) {
1067 F.updateFilter = function(e) {
1066
1068
1067 return function(){
1069 return function(){
1068 // Reset timeout
1070 // Reset timeout
1069 F.filterTimeout = null;
1071 F.filterTimeout = null;
1070 var query = e.target.value.toLowerCase();
1072 var query = e.target.value.toLowerCase();
1071 var match = [];
1073 var match = [];
1072 var matches = 0;
1074 var matches = 0;
1073 var matches_max = 20;
1075 var matches_max = 20;
1074 if (query != ""){
1076 if (query != ""){
1075 for(var i=0;i<nodes.length;i++){
1077 for(var i=0;i<nodes.length;i++){
1076
1078
1077 var pos = nodes[i].name.toLowerCase().indexOf(query)
1079 var pos = nodes[i].name.toLowerCase().indexOf(query)
1078 if(query && pos != -1){
1080 if(query && pos != -1){
1079
1081
1080 matches++
1082 matches++
1081 //show only certain amount to not kill browser
1083 //show only certain amount to not kill browser
1082 if (matches > matches_max){
1084 if (matches > matches_max){
1083 break;
1085 break;
1084 }
1086 }
1085
1087
1086 var n = nodes[i].name;
1088 var n = nodes[i].name;
1087 var t = nodes[i].type;
1089 var t = nodes[i].type;
1088 var n_hl = n.substring(0,pos)
1090 var n_hl = n.substring(0,pos)
1089 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1091 +"<b>{0}</b>".format(n.substring(pos,pos+query.length))
1090 +n.substring(pos+query.length)
1092 +n.substring(pos+query.length)
1091 var new_url = url_base.replace('__FPATH__',n);
1093 var new_url = url_base.replace('__FPATH__',n);
1092 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1094 match.push('<tr><td><a class="browser-{0}" href="{1}">{2}</a></td><td colspan="5"></td></tr>'.format(t,new_url,n_hl));
1093 }
1095 }
1094 if(match.length >= matches_max){
1096 if(match.length >= matches_max){
1095 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1097 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['Search truncated']));
1096 }
1098 }
1097 }
1099 }
1098 }
1100 }
1099 if(query != ""){
1101 if(query != ""){
1100 YUD.setStyle('tbody','display','none');
1102 YUD.setStyle('tbody','display','none');
1101 YUD.setStyle('tbody_filtered','display','');
1103 YUD.setStyle('tbody_filtered','display','');
1102
1104
1103 if (match.length==0){
1105 if (match.length==0){
1104 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1106 match.push('<tr><td>{0}</td><td colspan="5"></td></tr>'.format(_TM['No matching files']));
1105 }
1107 }
1106
1108
1107 YUD.get('tbody_filtered').innerHTML = match.join("");
1109 YUD.get('tbody_filtered').innerHTML = match.join("");
1108 }
1110 }
1109 else{
1111 else{
1110 YUD.setStyle('tbody','display','');
1112 YUD.setStyle('tbody','display','');
1111 YUD.setStyle('tbody_filtered','display','none');
1113 YUD.setStyle('tbody_filtered','display','none');
1112 }
1114 }
1113
1115
1114 }
1116 }
1115 };
1117 };
1116
1118
1117 YUE.on(YUD.get('filter_activate'),'click',function(){
1119 YUE.on(YUD.get('filter_activate'),'click',function(){
1118 F.initFilter();
1120 F.initFilter();
1119 })
1121 })
1120 YUE.on(n_filter,'click',function(){
1122 YUE.on(n_filter,'click',function(){
1121 if(YUD.hasClass(n_filter,'init')){
1123 if(YUD.hasClass(n_filter,'init')){
1122 n_filter.value = '';
1124 n_filter.value = '';
1123 YUD.removeClass(n_filter,'init');
1125 YUD.removeClass(n_filter,'init');
1124 }
1126 }
1125 });
1127 });
1126 YUE.on(n_filter,'keyup',function(e){
1128 YUE.on(n_filter,'keyup',function(e){
1127 clearTimeout(F.filterTimeout);
1129 clearTimeout(F.filterTimeout);
1128 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1130 F.filterTimeout = setTimeout(F.updateFilter(e),600);
1129 });
1131 });
1130 };
1132 };
1131
1133
1132
1134
1133 var initCodeMirror = function(textAreadId,resetUrl){
1135 var initCodeMirror = function(textAreadId,resetUrl){
1134 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1136 var myCodeMirror = CodeMirror.fromTextArea(YUD.get(textAreadId),{
1135 mode: "null",
1137 mode: "null",
1136 lineNumbers:true
1138 lineNumbers:true
1137 });
1139 });
1138 YUE.on('reset','click',function(e){
1140 YUE.on('reset','click',function(e){
1139 window.location=resetUrl
1141 window.location=resetUrl
1140 });
1142 });
1141
1143
1142 YUE.on('file_enable','click',function(){
1144 YUE.on('file_enable','click',function(){
1143 YUD.setStyle('editor_container','display','');
1145 YUD.setStyle('editor_container','display','');
1144 YUD.setStyle('upload_file_container','display','none');
1146 YUD.setStyle('upload_file_container','display','none');
1145 YUD.setStyle('filename_container','display','');
1147 YUD.setStyle('filename_container','display','');
1146 });
1148 });
1147
1149
1148 YUE.on('upload_file_enable','click',function(){
1150 YUE.on('upload_file_enable','click',function(){
1149 YUD.setStyle('editor_container','display','none');
1151 YUD.setStyle('editor_container','display','none');
1150 YUD.setStyle('upload_file_container','display','');
1152 YUD.setStyle('upload_file_container','display','');
1151 YUD.setStyle('filename_container','display','none');
1153 YUD.setStyle('filename_container','display','none');
1152 });
1154 });
1153 };
1155 };
1154
1156
1155
1157
1156
1158
1157 var getIdentNode = function(n){
1159 var getIdentNode = function(n){
1158 //iterate thru nodes untill matched interesting node !
1160 //iterate thru nodes untill matched interesting node !
1159
1161
1160 if (typeof n == 'undefined'){
1162 if (typeof n == 'undefined'){
1161 return -1
1163 return -1
1162 }
1164 }
1163
1165
1164 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1166 if(typeof n.id != "undefined" && n.id.match('L[0-9]+')){
1165 return n
1167 return n
1166 }
1168 }
1167 else{
1169 else{
1168 return getIdentNode(n.parentNode);
1170 return getIdentNode(n.parentNode);
1169 }
1171 }
1170 };
1172 };
1171
1173
1172 var getSelectionLink = function(e) {
1174 var getSelectionLink = function(e) {
1173
1175
1174 //get selection from start/to nodes
1176 //get selection from start/to nodes
1175 if (typeof window.getSelection != "undefined") {
1177 if (typeof window.getSelection != "undefined") {
1176 s = window.getSelection();
1178 s = window.getSelection();
1177
1179
1178 from = getIdentNode(s.anchorNode);
1180 from = getIdentNode(s.anchorNode);
1179 till = getIdentNode(s.focusNode);
1181 till = getIdentNode(s.focusNode);
1180
1182
1181 f_int = parseInt(from.id.replace('L',''));
1183 f_int = parseInt(from.id.replace('L',''));
1182 t_int = parseInt(till.id.replace('L',''));
1184 t_int = parseInt(till.id.replace('L',''));
1183
1185
1184 if (f_int > t_int){
1186 if (f_int > t_int){
1185 //highlight from bottom
1187 //highlight from bottom
1186 offset = -35;
1188 offset = -35;
1187 ranges = [t_int,f_int];
1189 ranges = [t_int,f_int];
1188
1190
1189 }
1191 }
1190 else{
1192 else{
1191 //highligth from top
1193 //highligth from top
1192 offset = 35;
1194 offset = 35;
1193 ranges = [f_int,t_int];
1195 ranges = [f_int,t_int];
1194 }
1196 }
1195 // if we select more than 2 lines
1197 // if we select more than 2 lines
1196 if (ranges[0] != ranges[1]){
1198 if (ranges[0] != ranges[1]){
1197 if(YUD.get('linktt') == null){
1199 if(YUD.get('linktt') == null){
1198 hl_div = document.createElement('div');
1200 hl_div = document.createElement('div');
1199 hl_div.id = 'linktt';
1201 hl_div.id = 'linktt';
1200 }
1202 }
1201 hl_div.innerHTML = '';
1203 hl_div.innerHTML = '';
1202
1204
1203 anchor = '#L'+ranges[0]+'-'+ranges[1];
1205 anchor = '#L'+ranges[0]+'-'+ranges[1];
1204 var link = document.createElement('a');
1206 var link = document.createElement('a');
1205 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1207 link.href = location.href.substring(0,location.href.indexOf('#'))+anchor;
1206 link.innerHTML = _TM['Selection link'];
1208 link.innerHTML = _TM['Selection link'];
1207 hl_div.appendChild(link);
1209 hl_div.appendChild(link);
1208 YUD.get('body').appendChild(hl_div);
1210 YUD.get('body').appendChild(hl_div);
1209
1211
1210 xy = YUD.getXY(till.id);
1212 xy = YUD.getXY(till.id);
1211
1213
1212 YUD.addClass('linktt', 'hl-tip-box');
1214 YUD.addClass('linktt', 'hl-tip-box');
1213 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1215 YUD.setStyle('linktt','top',xy[1]+offset+'px');
1214 YUD.setStyle('linktt','left',xy[0]+'px');
1216 YUD.setStyle('linktt','left',xy[0]+'px');
1215 YUD.setStyle('linktt','visibility','visible');
1217 YUD.setStyle('linktt','visibility','visible');
1216
1218
1217 }
1219 }
1218 else{
1220 else{
1219 YUD.setStyle('linktt','visibility','hidden');
1221 YUD.setStyle('linktt','visibility','hidden');
1220 }
1222 }
1221 }
1223 }
1222 };
1224 };
1223
1225
1224 var deleteNotification = function(url, notification_id,callbacks){
1226 var deleteNotification = function(url, notification_id,callbacks){
1225 var callback = {
1227 var callback = {
1226 success:function(o){
1228 success:function(o){
1227 var obj = YUD.get(String("notification_"+notification_id));
1229 var obj = YUD.get(String("notification_"+notification_id));
1228 if(obj.parentNode !== undefined){
1230 if(obj.parentNode !== undefined){
1229 obj.parentNode.removeChild(obj);
1231 obj.parentNode.removeChild(obj);
1230 }
1232 }
1231 _run_callbacks(callbacks);
1233 _run_callbacks(callbacks);
1232 },
1234 },
1233 failure:function(o){
1235 failure:function(o){
1234 alert("error");
1236 alert("error");
1235 },
1237 },
1236 };
1238 };
1237 var postData = '_method=delete';
1239 var postData = '_method=delete';
1238 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1240 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1239 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1241 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1240 callback, postData);
1242 callback, postData);
1241 };
1243 };
1242
1244
1243 var readNotification = function(url, notification_id,callbacks){
1245 var readNotification = function(url, notification_id,callbacks){
1244 var callback = {
1246 var callback = {
1245 success:function(o){
1247 success:function(o){
1246 var obj = YUD.get(String("notification_"+notification_id));
1248 var obj = YUD.get(String("notification_"+notification_id));
1247 YUD.removeClass(obj, 'unread');
1249 YUD.removeClass(obj, 'unread');
1248 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1250 var r_button = YUD.getElementsByClassName('read-notification',null,obj.children[0])[0];
1249
1251
1250 if(r_button.parentNode !== undefined){
1252 if(r_button.parentNode !== undefined){
1251 r_button.parentNode.removeChild(r_button);
1253 r_button.parentNode.removeChild(r_button);
1252 }
1254 }
1253 _run_callbacks(callbacks);
1255 _run_callbacks(callbacks);
1254 },
1256 },
1255 failure:function(o){
1257 failure:function(o){
1256 alert("error");
1258 alert("error");
1257 },
1259 },
1258 };
1260 };
1259 var postData = '_method=put';
1261 var postData = '_method=put';
1260 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1262 var sUrl = url.replace('__NOTIFICATION_ID__',notification_id);
1261 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1263 var request = YAHOO.util.Connect.asyncRequest('POST', sUrl,
1262 callback, postData);
1264 callback, postData);
1263 };
1265 };
1264
1266
1265 /** MEMBERS AUTOCOMPLETE WIDGET **/
1267 /** MEMBERS AUTOCOMPLETE WIDGET **/
1266
1268
1267 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1269 var MembersAutoComplete = function (divid, cont, users_list, groups_list) {
1268 var myUsers = users_list;
1270 var myUsers = users_list;
1269 var myGroups = groups_list;
1271 var myGroups = groups_list;
1270
1272
1271 // Define a custom search function for the DataSource of users
1273 // Define a custom search function for the DataSource of users
1272 var matchUsers = function (sQuery) {
1274 var matchUsers = function (sQuery) {
1273 // Case insensitive matching
1275 // Case insensitive matching
1274 var query = sQuery.toLowerCase();
1276 var query = sQuery.toLowerCase();
1275 var i = 0;
1277 var i = 0;
1276 var l = myUsers.length;
1278 var l = myUsers.length;
1277 var matches = [];
1279 var matches = [];
1278
1280
1279 // Match against each name of each contact
1281 // Match against each name of each contact
1280 for (; i < l; i++) {
1282 for (; i < l; i++) {
1281 contact = myUsers[i];
1283 contact = myUsers[i];
1282 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1284 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1283 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1285 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1284 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1286 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1285 matches[matches.length] = contact;
1287 matches[matches.length] = contact;
1286 }
1288 }
1287 }
1289 }
1288 return matches;
1290 return matches;
1289 };
1291 };
1290
1292
1291 // Define a custom search function for the DataSource of userGroups
1293 // Define a custom search function for the DataSource of userGroups
1292 var matchGroups = function (sQuery) {
1294 var matchGroups = function (sQuery) {
1293 // Case insensitive matching
1295 // Case insensitive matching
1294 var query = sQuery.toLowerCase();
1296 var query = sQuery.toLowerCase();
1295 var i = 0;
1297 var i = 0;
1296 var l = myGroups.length;
1298 var l = myGroups.length;
1297 var matches = [];
1299 var matches = [];
1298
1300
1299 // Match against each name of each contact
1301 // Match against each name of each contact
1300 for (; i < l; i++) {
1302 for (; i < l; i++) {
1301 matched_group = myGroups[i];
1303 matched_group = myGroups[i];
1302 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1304 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1303 matches[matches.length] = matched_group;
1305 matches[matches.length] = matched_group;
1304 }
1306 }
1305 }
1307 }
1306 return matches;
1308 return matches;
1307 };
1309 };
1308
1310
1309 //match all
1311 //match all
1310 var matchAll = function (sQuery) {
1312 var matchAll = function (sQuery) {
1311 u = matchUsers(sQuery);
1313 u = matchUsers(sQuery);
1312 g = matchGroups(sQuery);
1314 g = matchGroups(sQuery);
1313 return u.concat(g);
1315 return u.concat(g);
1314 };
1316 };
1315
1317
1316 // DataScheme for members
1318 // DataScheme for members
1317 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1319 var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
1318 memberDS.responseSchema = {
1320 memberDS.responseSchema = {
1319 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1321 fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
1320 };
1322 };
1321
1323
1322 // DataScheme for owner
1324 // DataScheme for owner
1323 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1325 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1324 ownerDS.responseSchema = {
1326 ownerDS.responseSchema = {
1325 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1327 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1326 };
1328 };
1327
1329
1328 // Instantiate AutoComplete for perms
1330 // Instantiate AutoComplete for perms
1329 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1331 var membersAC = new YAHOO.widget.AutoComplete(divid, cont, memberDS);
1330 membersAC.useShadow = false;
1332 membersAC.useShadow = false;
1331 membersAC.resultTypeList = false;
1333 membersAC.resultTypeList = false;
1332 membersAC.animVert = false;
1334 membersAC.animVert = false;
1333 membersAC.animHoriz = false;
1335 membersAC.animHoriz = false;
1334 membersAC.animSpeed = 0.1;
1336 membersAC.animSpeed = 0.1;
1335
1337
1336 // Instantiate AutoComplete for owner
1338 // Instantiate AutoComplete for owner
1337 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1339 var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
1338 ownerAC.useShadow = false;
1340 ownerAC.useShadow = false;
1339 ownerAC.resultTypeList = false;
1341 ownerAC.resultTypeList = false;
1340 ownerAC.animVert = false;
1342 ownerAC.animVert = false;
1341 ownerAC.animHoriz = false;
1343 ownerAC.animHoriz = false;
1342 ownerAC.animSpeed = 0.1;
1344 ownerAC.animSpeed = 0.1;
1343
1345
1344 // Helper highlight function for the formatter
1346 // Helper highlight function for the formatter
1345 var highlightMatch = function (full, snippet, matchindex) {
1347 var highlightMatch = function (full, snippet, matchindex) {
1346 return full.substring(0, matchindex)
1348 return full.substring(0, matchindex)
1347 + "<span class='match'>"
1349 + "<span class='match'>"
1348 + full.substr(matchindex, snippet.length)
1350 + full.substr(matchindex, snippet.length)
1349 + "</span>" + full.substring(matchindex + snippet.length);
1351 + "</span>" + full.substring(matchindex + snippet.length);
1350 };
1352 };
1351
1353
1352 // Custom formatter to highlight the matching letters
1354 // Custom formatter to highlight the matching letters
1353 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1355 var custom_formatter = function (oResultData, sQuery, sResultMatch) {
1354 var query = sQuery.toLowerCase();
1356 var query = sQuery.toLowerCase();
1355 var _gravatar = function(res, em, group){
1357 var _gravatar = function(res, em, group){
1356 if (group !== undefined){
1358 if (group !== undefined){
1357 em = '/images/icons/group.png'
1359 em = '/images/icons/group.png'
1358 }
1360 }
1359 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1361 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1360 return tmpl.format(em,res)
1362 return tmpl.format(em,res)
1361 }
1363 }
1362 // group
1364 // group
1363 if (oResultData.grname != undefined) {
1365 if (oResultData.grname != undefined) {
1364 var grname = oResultData.grname;
1366 var grname = oResultData.grname;
1365 var grmembers = oResultData.grmembers;
1367 var grmembers = oResultData.grmembers;
1366 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1368 var grnameMatchIndex = grname.toLowerCase().indexOf(query);
1367 var grprefix = "{0}: ".format(_TM['Group']);
1369 var grprefix = "{0}: ".format(_TM['Group']);
1368 var grsuffix = " (" + grmembers + " )";
1370 var grsuffix = " (" + grmembers + " )";
1369 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1371 var grsuffix = " ({0} {1})".format(grmembers, _TM['members']);
1370
1372
1371 if (grnameMatchIndex > -1) {
1373 if (grnameMatchIndex > -1) {
1372 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1374 return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
1373 }
1375 }
1374 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1376 return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
1375 // Users
1377 // Users
1376 } else if (oResultData.nname != undefined) {
1378 } else if (oResultData.nname != undefined) {
1377 var fname = oResultData.fname || "";
1379 var fname = oResultData.fname || "";
1378 var lname = oResultData.lname || "";
1380 var lname = oResultData.lname || "";
1379 var nname = oResultData.nname;
1381 var nname = oResultData.nname;
1380
1382
1381 // Guard against null value
1383 // Guard against null value
1382 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1384 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1383 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1385 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1384 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1386 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1385 displayfname, displaylname, displaynname;
1387 displayfname, displaylname, displaynname;
1386
1388
1387 if (fnameMatchIndex > -1) {
1389 if (fnameMatchIndex > -1) {
1388 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1390 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1389 } else {
1391 } else {
1390 displayfname = fname;
1392 displayfname = fname;
1391 }
1393 }
1392
1394
1393 if (lnameMatchIndex > -1) {
1395 if (lnameMatchIndex > -1) {
1394 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1396 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1395 } else {
1397 } else {
1396 displaylname = lname;
1398 displaylname = lname;
1397 }
1399 }
1398
1400
1399 if (nnameMatchIndex > -1) {
1401 if (nnameMatchIndex > -1) {
1400 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1402 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1401 } else {
1403 } else {
1402 displaynname = nname ? "(" + nname + ")" : "";
1404 displaynname = nname ? "(" + nname + ")" : "";
1403 }
1405 }
1404
1406
1405 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1407 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1406 } else {
1408 } else {
1407 return '';
1409 return '';
1408 }
1410 }
1409 };
1411 };
1410 membersAC.formatResult = custom_formatter;
1412 membersAC.formatResult = custom_formatter;
1411 ownerAC.formatResult = custom_formatter;
1413 ownerAC.formatResult = custom_formatter;
1412
1414
1413 var myHandler = function (sType, aArgs) {
1415 var myHandler = function (sType, aArgs) {
1414 var nextId = divid.split('perm_new_member_name_')[1];
1416 var nextId = divid.split('perm_new_member_name_')[1];
1415 var myAC = aArgs[0]; // reference back to the AC instance
1417 var myAC = aArgs[0]; // reference back to the AC instance
1416 var elLI = aArgs[1]; // reference to the selected LI element
1418 var elLI = aArgs[1]; // reference to the selected LI element
1417 var oData = aArgs[2]; // object literal of selected item's result data
1419 var oData = aArgs[2]; // object literal of selected item's result data
1418 //fill the autocomplete with value
1420 //fill the autocomplete with value
1419 if (oData.nname != undefined) {
1421 if (oData.nname != undefined) {
1420 //users
1422 //users
1421 myAC.getInputEl().value = oData.nname;
1423 myAC.getInputEl().value = oData.nname;
1422 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1424 YUD.get('perm_new_member_type_'+nextId).value = 'user';
1423 } else {
1425 } else {
1424 //groups
1426 //groups
1425 myAC.getInputEl().value = oData.grname;
1427 myAC.getInputEl().value = oData.grname;
1426 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1428 YUD.get('perm_new_member_type_'+nextId).value = 'users_group';
1427 }
1429 }
1428 };
1430 };
1429
1431
1430 membersAC.itemSelectEvent.subscribe(myHandler);
1432 membersAC.itemSelectEvent.subscribe(myHandler);
1431 if(ownerAC.itemSelectEvent){
1433 if(ownerAC.itemSelectEvent){
1432 ownerAC.itemSelectEvent.subscribe(myHandler);
1434 ownerAC.itemSelectEvent.subscribe(myHandler);
1433 }
1435 }
1434
1436
1435 return {
1437 return {
1436 memberDS: memberDS,
1438 memberDS: memberDS,
1437 ownerDS: ownerDS,
1439 ownerDS: ownerDS,
1438 membersAC: membersAC,
1440 membersAC: membersAC,
1439 ownerAC: ownerAC,
1441 ownerAC: ownerAC,
1440 };
1442 };
1441 }
1443 }
1442
1444
1443
1445
1444 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1446 var MentionsAutoComplete = function (divid, cont, users_list, groups_list) {
1445 var myUsers = users_list;
1447 var myUsers = users_list;
1446 var myGroups = groups_list;
1448 var myGroups = groups_list;
1447
1449
1448 // Define a custom search function for the DataSource of users
1450 // Define a custom search function for the DataSource of users
1449 var matchUsers = function (sQuery) {
1451 var matchUsers = function (sQuery) {
1450 var org_sQuery = sQuery;
1452 var org_sQuery = sQuery;
1451 if(this.mentionQuery == null){
1453 if(this.mentionQuery == null){
1452 return []
1454 return []
1453 }
1455 }
1454 sQuery = this.mentionQuery;
1456 sQuery = this.mentionQuery;
1455 // Case insensitive matching
1457 // Case insensitive matching
1456 var query = sQuery.toLowerCase();
1458 var query = sQuery.toLowerCase();
1457 var i = 0;
1459 var i = 0;
1458 var l = myUsers.length;
1460 var l = myUsers.length;
1459 var matches = [];
1461 var matches = [];
1460
1462
1461 // Match against each name of each contact
1463 // Match against each name of each contact
1462 for (; i < l; i++) {
1464 for (; i < l; i++) {
1463 contact = myUsers[i];
1465 contact = myUsers[i];
1464 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1466 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1465 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1467 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1466 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1468 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1467 matches[matches.length] = contact;
1469 matches[matches.length] = contact;
1468 }
1470 }
1469 }
1471 }
1470 return matches
1472 return matches
1471 };
1473 };
1472
1474
1473 //match all
1475 //match all
1474 var matchAll = function (sQuery) {
1476 var matchAll = function (sQuery) {
1475 u = matchUsers(sQuery);
1477 u = matchUsers(sQuery);
1476 return u
1478 return u
1477 };
1479 };
1478
1480
1479 // DataScheme for owner
1481 // DataScheme for owner
1480 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1482 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1481
1483
1482 ownerDS.responseSchema = {
1484 ownerDS.responseSchema = {
1483 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1485 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1484 };
1486 };
1485
1487
1486 // Instantiate AutoComplete for mentions
1488 // Instantiate AutoComplete for mentions
1487 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1489 var ownerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1488 ownerAC.useShadow = false;
1490 ownerAC.useShadow = false;
1489 ownerAC.resultTypeList = false;
1491 ownerAC.resultTypeList = false;
1490 ownerAC.suppressInputUpdate = true;
1492 ownerAC.suppressInputUpdate = true;
1491 ownerAC.animVert = false;
1493 ownerAC.animVert = false;
1492 ownerAC.animHoriz = false;
1494 ownerAC.animHoriz = false;
1493 ownerAC.animSpeed = 0.1;
1495 ownerAC.animSpeed = 0.1;
1494
1496
1495 // Helper highlight function for the formatter
1497 // Helper highlight function for the formatter
1496 var highlightMatch = function (full, snippet, matchindex) {
1498 var highlightMatch = function (full, snippet, matchindex) {
1497 return full.substring(0, matchindex)
1499 return full.substring(0, matchindex)
1498 + "<span class='match'>"
1500 + "<span class='match'>"
1499 + full.substr(matchindex, snippet.length)
1501 + full.substr(matchindex, snippet.length)
1500 + "</span>" + full.substring(matchindex + snippet.length);
1502 + "</span>" + full.substring(matchindex + snippet.length);
1501 };
1503 };
1502
1504
1503 // Custom formatter to highlight the matching letters
1505 // Custom formatter to highlight the matching letters
1504 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1506 ownerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1505 var org_sQuery = sQuery;
1507 var org_sQuery = sQuery;
1506 if(this.dataSource.mentionQuery != null){
1508 if(this.dataSource.mentionQuery != null){
1507 sQuery = this.dataSource.mentionQuery;
1509 sQuery = this.dataSource.mentionQuery;
1508 }
1510 }
1509
1511
1510 var query = sQuery.toLowerCase();
1512 var query = sQuery.toLowerCase();
1511 var _gravatar = function(res, em, group){
1513 var _gravatar = function(res, em, group){
1512 if (group !== undefined){
1514 if (group !== undefined){
1513 em = '/images/icons/group.png'
1515 em = '/images/icons/group.png'
1514 }
1516 }
1515 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1517 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1516 return tmpl.format(em,res)
1518 return tmpl.format(em,res)
1517 }
1519 }
1518 if (oResultData.nname != undefined) {
1520 if (oResultData.nname != undefined) {
1519 var fname = oResultData.fname || "";
1521 var fname = oResultData.fname || "";
1520 var lname = oResultData.lname || "";
1522 var lname = oResultData.lname || "";
1521 var nname = oResultData.nname;
1523 var nname = oResultData.nname;
1522
1524
1523 // Guard against null value
1525 // Guard against null value
1524 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1526 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1525 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1527 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1526 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1528 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1527 displayfname, displaylname, displaynname;
1529 displayfname, displaylname, displaynname;
1528
1530
1529 if (fnameMatchIndex > -1) {
1531 if (fnameMatchIndex > -1) {
1530 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1532 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1531 } else {
1533 } else {
1532 displayfname = fname;
1534 displayfname = fname;
1533 }
1535 }
1534
1536
1535 if (lnameMatchIndex > -1) {
1537 if (lnameMatchIndex > -1) {
1536 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1538 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1537 } else {
1539 } else {
1538 displaylname = lname;
1540 displaylname = lname;
1539 }
1541 }
1540
1542
1541 if (nnameMatchIndex > -1) {
1543 if (nnameMatchIndex > -1) {
1542 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1544 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1543 } else {
1545 } else {
1544 displaynname = nname ? "(" + nname + ")" : "";
1546 displaynname = nname ? "(" + nname + ")" : "";
1545 }
1547 }
1546
1548
1547 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1549 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1548 } else {
1550 } else {
1549 return '';
1551 return '';
1550 }
1552 }
1551 };
1553 };
1552
1554
1553 if(ownerAC.itemSelectEvent){
1555 if(ownerAC.itemSelectEvent){
1554 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1556 ownerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1555
1557
1556 var myAC = aArgs[0]; // reference back to the AC instance
1558 var myAC = aArgs[0]; // reference back to the AC instance
1557 var elLI = aArgs[1]; // reference to the selected LI element
1559 var elLI = aArgs[1]; // reference to the selected LI element
1558 var oData = aArgs[2]; // object literal of selected item's result data
1560 var oData = aArgs[2]; // object literal of selected item's result data
1559 //fill the autocomplete with value
1561 //fill the autocomplete with value
1560 if (oData.nname != undefined) {
1562 if (oData.nname != undefined) {
1561 //users
1563 //users
1562 //Replace the mention name with replaced
1564 //Replace the mention name with replaced
1563 var re = new RegExp();
1565 var re = new RegExp();
1564 var org = myAC.getInputEl().value;
1566 var org = myAC.getInputEl().value;
1565 var chunks = myAC.dataSource.chunks
1567 var chunks = myAC.dataSource.chunks
1566 // replace middle chunk(the search term) with actuall match
1568 // replace middle chunk(the search term) with actuall match
1567 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1569 chunks[1] = chunks[1].replace('@'+myAC.dataSource.mentionQuery,
1568 '@'+oData.nname+' ');
1570 '@'+oData.nname+' ');
1569 myAC.getInputEl().value = chunks.join('')
1571 myAC.getInputEl().value = chunks.join('')
1570 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1572 YUD.get(myAC.getInputEl()).focus(); // Y U NO WORK !?
1571 } else {
1573 } else {
1572 //groups
1574 //groups
1573 myAC.getInputEl().value = oData.grname;
1575 myAC.getInputEl().value = oData.grname;
1574 YUD.get('perm_new_member_type').value = 'users_group';
1576 YUD.get('perm_new_member_type').value = 'users_group';
1575 }
1577 }
1576 });
1578 });
1577 }
1579 }
1578
1580
1579 // in this keybuffer we will gather current value of search !
1581 // in this keybuffer we will gather current value of search !
1580 // since we need to get this just when someone does `@` then we do the
1582 // since we need to get this just when someone does `@` then we do the
1581 // search
1583 // search
1582 ownerAC.dataSource.chunks = [];
1584 ownerAC.dataSource.chunks = [];
1583 ownerAC.dataSource.mentionQuery = null;
1585 ownerAC.dataSource.mentionQuery = null;
1584
1586
1585 ownerAC.get_mention = function(msg, max_pos) {
1587 ownerAC.get_mention = function(msg, max_pos) {
1586 var org = msg;
1588 var org = msg;
1587 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1589 var re = new RegExp('(?:^@|\s@)([a-zA-Z0-9]{1}[a-zA-Z0-9\-\_\.]+)$')
1588 var chunks = [];
1590 var chunks = [];
1589
1591
1590
1592
1591 // cut first chunk until curret pos
1593 // cut first chunk until curret pos
1592 var to_max = msg.substr(0, max_pos);
1594 var to_max = msg.substr(0, max_pos);
1593 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1595 var at_pos = Math.max(0,to_max.lastIndexOf('@')-1);
1594 var msg2 = to_max.substr(at_pos);
1596 var msg2 = to_max.substr(at_pos);
1595
1597
1596 chunks.push(org.substr(0,at_pos))// prefix chunk
1598 chunks.push(org.substr(0,at_pos))// prefix chunk
1597 chunks.push(msg2) // search chunk
1599 chunks.push(msg2) // search chunk
1598 chunks.push(org.substr(max_pos)) // postfix chunk
1600 chunks.push(org.substr(max_pos)) // postfix chunk
1599
1601
1600 // clean up msg2 for filtering and regex match
1602 // clean up msg2 for filtering and regex match
1601 var msg2 = msg2.lstrip(' ').lstrip('\n');
1603 var msg2 = msg2.lstrip(' ').lstrip('\n');
1602
1604
1603 if(re.test(msg2)){
1605 if(re.test(msg2)){
1604 var unam = re.exec(msg2)[1];
1606 var unam = re.exec(msg2)[1];
1605 return [unam, chunks];
1607 return [unam, chunks];
1606 }
1608 }
1607 return [null, null];
1609 return [null, null];
1608 };
1610 };
1609
1611
1610 if (ownerAC.textboxKeyUpEvent){
1612 if (ownerAC.textboxKeyUpEvent){
1611 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1613 ownerAC.textboxKeyUpEvent.subscribe(function(type, args){
1612
1614
1613 var ac_obj = args[0];
1615 var ac_obj = args[0];
1614 var currentMessage = args[1];
1616 var currentMessage = args[1];
1615 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1617 var currentCaretPosition = args[0]._elTextbox.selectionStart;
1616
1618
1617 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1619 var unam = ownerAC.get_mention(currentMessage, currentCaretPosition);
1618 var curr_search = null;
1620 var curr_search = null;
1619 if(unam[0]){
1621 if(unam[0]){
1620 curr_search = unam[0];
1622 curr_search = unam[0];
1621 }
1623 }
1622
1624
1623 ownerAC.dataSource.chunks = unam[1];
1625 ownerAC.dataSource.chunks = unam[1];
1624 ownerAC.dataSource.mentionQuery = curr_search;
1626 ownerAC.dataSource.mentionQuery = curr_search;
1625
1627
1626 })
1628 })
1627 }
1629 }
1628 return {
1630 return {
1629 ownerDS: ownerDS,
1631 ownerDS: ownerDS,
1630 ownerAC: ownerAC,
1632 ownerAC: ownerAC,
1631 };
1633 };
1632 }
1634 }
1633
1635
1634 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1636 var addReviewMember = function(id,fname,lname,nname,gravatar_link){
1635 var members = YUD.get('review_members');
1637 var members = YUD.get('review_members');
1636 var tmpl = '<li id="reviewer_{2}">'+
1638 var tmpl = '<li id="reviewer_{2}">'+
1637 '<div class="reviewers_member">'+
1639 '<div class="reviewers_member">'+
1638 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1640 '<div class="gravatar"><img alt="gravatar" src="{0}"/> </div>'+
1639 '<div style="float:left">{1}</div>'+
1641 '<div style="float:left">{1}</div>'+
1640 '<input type="hidden" value="{2}" name="review_members" />'+
1642 '<input type="hidden" value="{2}" name="review_members" />'+
1641 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1643 '<span class="delete_icon action_button" onclick="removeReviewMember({2})"></span>'+
1642 '</div>'+
1644 '</div>'+
1643 '</li>' ;
1645 '</li>' ;
1644 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1646 var displayname = "{0} {1} ({2})".format(fname,lname,nname);
1645 var element = tmpl.format(gravatar_link,displayname,id);
1647 var element = tmpl.format(gravatar_link,displayname,id);
1646 // check if we don't have this ID already in
1648 // check if we don't have this ID already in
1647 var ids = [];
1649 var ids = [];
1648 var _els = YUQ('#review_members li');
1650 var _els = YUQ('#review_members li');
1649 for (el in _els){
1651 for (el in _els){
1650 ids.push(_els[el].id)
1652 ids.push(_els[el].id)
1651 }
1653 }
1652 if(ids.indexOf('reviewer_'+id) == -1){
1654 if(ids.indexOf('reviewer_'+id) == -1){
1653 //only add if it's not there
1655 //only add if it's not there
1654 members.innerHTML += element;
1656 members.innerHTML += element;
1655 }
1657 }
1656
1658
1657 }
1659 }
1658
1660
1659 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1661 var removeReviewMember = function(reviewer_id, repo_name, pull_request_id){
1660 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1662 var el = YUD.get('reviewer_{0}'.format(reviewer_id));
1661 if (el.parentNode !== undefined){
1663 if (el.parentNode !== undefined){
1662 el.parentNode.removeChild(el);
1664 el.parentNode.removeChild(el);
1663 }
1665 }
1664 }
1666 }
1665
1667
1666 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1668 var updateReviewers = function(reviewers_ids, repo_name, pull_request_id){
1667 if (reviewers_ids === undefined){
1669 if (reviewers_ids === undefined){
1668 var reviewers_ids = [];
1670 var reviewers_ids = [];
1669 var ids = YUQ('#review_members input');
1671 var ids = YUQ('#review_members input');
1670 for(var i=0; i<ids.length;i++){
1672 for(var i=0; i<ids.length;i++){
1671 var id = ids[i].value
1673 var id = ids[i].value
1672 reviewers_ids.push(id);
1674 reviewers_ids.push(id);
1673 }
1675 }
1674 }
1676 }
1675 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1677 var url = pyroutes.url('pullrequest_update', {"repo_name":repo_name,
1676 "pull_request_id": pull_request_id});
1678 "pull_request_id": pull_request_id});
1677 var postData = {'_method':'put',
1679 var postData = {'_method':'put',
1678 'reviewers_ids': reviewers_ids};
1680 'reviewers_ids': reviewers_ids};
1679 var success = function(o){
1681 var success = function(o){
1680 window.location.reload();
1682 window.location.reload();
1681 }
1683 }
1682 ajaxPOST(url,postData,success);
1684 ajaxPOST(url,postData,success);
1683 }
1685 }
1684
1686
1685 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1687 var PullRequestAutoComplete = function (divid, cont, users_list, groups_list) {
1686 var myUsers = users_list;
1688 var myUsers = users_list;
1687 var myGroups = groups_list;
1689 var myGroups = groups_list;
1688
1690
1689 // Define a custom search function for the DataSource of users
1691 // Define a custom search function for the DataSource of users
1690 var matchUsers = function (sQuery) {
1692 var matchUsers = function (sQuery) {
1691 // Case insensitive matching
1693 // Case insensitive matching
1692 var query = sQuery.toLowerCase();
1694 var query = sQuery.toLowerCase();
1693 var i = 0;
1695 var i = 0;
1694 var l = myUsers.length;
1696 var l = myUsers.length;
1695 var matches = [];
1697 var matches = [];
1696
1698
1697 // Match against each name of each contact
1699 // Match against each name of each contact
1698 for (; i < l; i++) {
1700 for (; i < l; i++) {
1699 contact = myUsers[i];
1701 contact = myUsers[i];
1700 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1702 if (((contact.fname+"").toLowerCase().indexOf(query) > -1) ||
1701 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1703 ((contact.lname+"").toLowerCase().indexOf(query) > -1) ||
1702 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1704 ((contact.nname) && ((contact.nname).toLowerCase().indexOf(query) > -1))) {
1703 matches[matches.length] = contact;
1705 matches[matches.length] = contact;
1704 }
1706 }
1705 }
1707 }
1706 return matches;
1708 return matches;
1707 };
1709 };
1708
1710
1709 // Define a custom search function for the DataSource of userGroups
1711 // Define a custom search function for the DataSource of userGroups
1710 var matchGroups = function (sQuery) {
1712 var matchGroups = function (sQuery) {
1711 // Case insensitive matching
1713 // Case insensitive matching
1712 var query = sQuery.toLowerCase();
1714 var query = sQuery.toLowerCase();
1713 var i = 0;
1715 var i = 0;
1714 var l = myGroups.length;
1716 var l = myGroups.length;
1715 var matches = [];
1717 var matches = [];
1716
1718
1717 // Match against each name of each contact
1719 // Match against each name of each contact
1718 for (; i < l; i++) {
1720 for (; i < l; i++) {
1719 matched_group = myGroups[i];
1721 matched_group = myGroups[i];
1720 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1722 if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
1721 matches[matches.length] = matched_group;
1723 matches[matches.length] = matched_group;
1722 }
1724 }
1723 }
1725 }
1724 return matches;
1726 return matches;
1725 };
1727 };
1726
1728
1727 //match all
1729 //match all
1728 var matchAll = function (sQuery) {
1730 var matchAll = function (sQuery) {
1729 u = matchUsers(sQuery);
1731 u = matchUsers(sQuery);
1730 return u
1732 return u
1731 };
1733 };
1732
1734
1733 // DataScheme for owner
1735 // DataScheme for owner
1734 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1736 var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
1735
1737
1736 ownerDS.responseSchema = {
1738 ownerDS.responseSchema = {
1737 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1739 fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
1738 };
1740 };
1739
1741
1740 // Instantiate AutoComplete for mentions
1742 // Instantiate AutoComplete for mentions
1741 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1743 var reviewerAC = new YAHOO.widget.AutoComplete(divid, cont, ownerDS);
1742 reviewerAC.useShadow = false;
1744 reviewerAC.useShadow = false;
1743 reviewerAC.resultTypeList = false;
1745 reviewerAC.resultTypeList = false;
1744 reviewerAC.suppressInputUpdate = true;
1746 reviewerAC.suppressInputUpdate = true;
1745 reviewerAC.animVert = false;
1747 reviewerAC.animVert = false;
1746 reviewerAC.animHoriz = false;
1748 reviewerAC.animHoriz = false;
1747 reviewerAC.animSpeed = 0.1;
1749 reviewerAC.animSpeed = 0.1;
1748
1750
1749 // Helper highlight function for the formatter
1751 // Helper highlight function for the formatter
1750 var highlightMatch = function (full, snippet, matchindex) {
1752 var highlightMatch = function (full, snippet, matchindex) {
1751 return full.substring(0, matchindex)
1753 return full.substring(0, matchindex)
1752 + "<span class='match'>"
1754 + "<span class='match'>"
1753 + full.substr(matchindex, snippet.length)
1755 + full.substr(matchindex, snippet.length)
1754 + "</span>" + full.substring(matchindex + snippet.length);
1756 + "</span>" + full.substring(matchindex + snippet.length);
1755 };
1757 };
1756
1758
1757 // Custom formatter to highlight the matching letters
1759 // Custom formatter to highlight the matching letters
1758 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1760 reviewerAC.formatResult = function (oResultData, sQuery, sResultMatch) {
1759 var org_sQuery = sQuery;
1761 var org_sQuery = sQuery;
1760 if(this.dataSource.mentionQuery != null){
1762 if(this.dataSource.mentionQuery != null){
1761 sQuery = this.dataSource.mentionQuery;
1763 sQuery = this.dataSource.mentionQuery;
1762 }
1764 }
1763
1765
1764 var query = sQuery.toLowerCase();
1766 var query = sQuery.toLowerCase();
1765 var _gravatar = function(res, em, group){
1767 var _gravatar = function(res, em, group){
1766 if (group !== undefined){
1768 if (group !== undefined){
1767 em = '/images/icons/group.png'
1769 em = '/images/icons/group.png'
1768 }
1770 }
1769 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1771 tmpl = '<div class="ac-container-wrap"><img class="perm-gravatar-ac" src="{0}"/>{1}</div>'
1770 return tmpl.format(em,res)
1772 return tmpl.format(em,res)
1771 }
1773 }
1772 if (oResultData.nname != undefined) {
1774 if (oResultData.nname != undefined) {
1773 var fname = oResultData.fname || "";
1775 var fname = oResultData.fname || "";
1774 var lname = oResultData.lname || "";
1776 var lname = oResultData.lname || "";
1775 var nname = oResultData.nname;
1777 var nname = oResultData.nname;
1776
1778
1777 // Guard against null value
1779 // Guard against null value
1778 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1780 var fnameMatchIndex = fname.toLowerCase().indexOf(query),
1779 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1781 lnameMatchIndex = lname.toLowerCase().indexOf(query),
1780 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1782 nnameMatchIndex = nname.toLowerCase().indexOf(query),
1781 displayfname, displaylname, displaynname;
1783 displayfname, displaylname, displaynname;
1782
1784
1783 if (fnameMatchIndex > -1) {
1785 if (fnameMatchIndex > -1) {
1784 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1786 displayfname = highlightMatch(fname, query, fnameMatchIndex);
1785 } else {
1787 } else {
1786 displayfname = fname;
1788 displayfname = fname;
1787 }
1789 }
1788
1790
1789 if (lnameMatchIndex > -1) {
1791 if (lnameMatchIndex > -1) {
1790 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1792 displaylname = highlightMatch(lname, query, lnameMatchIndex);
1791 } else {
1793 } else {
1792 displaylname = lname;
1794 displaylname = lname;
1793 }
1795 }
1794
1796
1795 if (nnameMatchIndex > -1) {
1797 if (nnameMatchIndex > -1) {
1796 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1798 displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
1797 } else {
1799 } else {
1798 displaynname = nname ? "(" + nname + ")" : "";
1800 displaynname = nname ? "(" + nname + ")" : "";
1799 }
1801 }
1800
1802
1801 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1803 return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
1802 } else {
1804 } else {
1803 return '';
1805 return '';
1804 }
1806 }
1805 };
1807 };
1806
1808
1807 //members cache to catch duplicates
1809 //members cache to catch duplicates
1808 reviewerAC.dataSource.cache = [];
1810 reviewerAC.dataSource.cache = [];
1809 // hack into select event
1811 // hack into select event
1810 if(reviewerAC.itemSelectEvent){
1812 if(reviewerAC.itemSelectEvent){
1811 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1813 reviewerAC.itemSelectEvent.subscribe(function (sType, aArgs) {
1812
1814
1813 var myAC = aArgs[0]; // reference back to the AC instance
1815 var myAC = aArgs[0]; // reference back to the AC instance
1814 var elLI = aArgs[1]; // reference to the selected LI element
1816 var elLI = aArgs[1]; // reference to the selected LI element
1815 var oData = aArgs[2]; // object literal of selected item's result data
1817 var oData = aArgs[2]; // object literal of selected item's result data
1816
1818
1817 //fill the autocomplete with value
1819 //fill the autocomplete with value
1818
1820
1819 if (oData.nname != undefined) {
1821 if (oData.nname != undefined) {
1820 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1822 addReviewMember(oData.id, oData.fname, oData.lname, oData.nname,
1821 oData.gravatar_lnk);
1823 oData.gravatar_lnk);
1822 myAC.dataSource.cache.push(oData.id);
1824 myAC.dataSource.cache.push(oData.id);
1823 YUD.get('user').value = ''
1825 YUD.get('user').value = ''
1824 }
1826 }
1825 });
1827 });
1826 }
1828 }
1827 return {
1829 return {
1828 ownerDS: ownerDS,
1830 ownerDS: ownerDS,
1829 reviewerAC: reviewerAC,
1831 reviewerAC: reviewerAC,
1830 };
1832 };
1831 }
1833 }
1832
1834
1833 /**
1835 /**
1834 * QUICK REPO MENU
1836 * QUICK REPO MENU
1835 */
1837 */
1836 var quick_repo_menu = function(){
1838 var quick_repo_menu = function(){
1837 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1839 YUE.on(YUQ('.quick_repo_menu'),'mouseenter',function(e){
1838 var menu = e.currentTarget.firstElementChild.firstElementChild;
1840 var menu = e.currentTarget.firstElementChild.firstElementChild;
1839 if(YUD.hasClass(menu,'hidden')){
1841 if(YUD.hasClass(menu,'hidden')){
1840 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1842 YUD.replaceClass(e.currentTarget,'hidden', 'active');
1841 YUD.replaceClass(menu, 'hidden', 'active');
1843 YUD.replaceClass(menu, 'hidden', 'active');
1842 }
1844 }
1843 })
1845 })
1844 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1846 YUE.on(YUQ('.quick_repo_menu'),'mouseleave',function(e){
1845 var menu = e.currentTarget.firstElementChild.firstElementChild;
1847 var menu = e.currentTarget.firstElementChild.firstElementChild;
1846 if(YUD.hasClass(menu,'active')){
1848 if(YUD.hasClass(menu,'active')){
1847 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1849 YUD.replaceClass(e.currentTarget, 'active', 'hidden');
1848 YUD.replaceClass(menu, 'active', 'hidden');
1850 YUD.replaceClass(menu, 'active', 'hidden');
1849 }
1851 }
1850 })
1852 })
1851 };
1853 };
1852
1854
1853
1855
1854 /**
1856 /**
1855 * TABLE SORTING
1857 * TABLE SORTING
1856 */
1858 */
1857
1859
1858 // returns a node from given html;
1860 // returns a node from given html;
1859 var fromHTML = function(html){
1861 var fromHTML = function(html){
1860 var _html = document.createElement('element');
1862 var _html = document.createElement('element');
1861 _html.innerHTML = html;
1863 _html.innerHTML = html;
1862 return _html;
1864 return _html;
1863 }
1865 }
1864 var get_rev = function(node){
1866 var get_rev = function(node){
1865 var n = node.firstElementChild.firstElementChild;
1867 var n = node.firstElementChild.firstElementChild;
1866
1868
1867 if (n===null){
1869 if (n===null){
1868 return -1
1870 return -1
1869 }
1871 }
1870 else{
1872 else{
1871 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1873 out = n.firstElementChild.innerHTML.split(':')[0].replace('r','');
1872 return parseInt(out);
1874 return parseInt(out);
1873 }
1875 }
1874 }
1876 }
1875
1877
1876 var get_name = function(node){
1878 var get_name = function(node){
1877 var name = node.firstElementChild.children[2].innerHTML;
1879 var name = node.firstElementChild.children[2].innerHTML;
1878 return name
1880 return name
1879 }
1881 }
1880 var get_group_name = function(node){
1882 var get_group_name = function(node){
1881 var name = node.firstElementChild.children[1].innerHTML;
1883 var name = node.firstElementChild.children[1].innerHTML;
1882 return name
1884 return name
1883 }
1885 }
1884 var get_date = function(node){
1886 var get_date = function(node){
1885 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1887 var date_ = YUD.getAttribute(node.firstElementChild,'date');
1886 return date_
1888 return date_
1887 }
1889 }
1888
1890
1889 var get_age = function(node){
1891 var get_age = function(node){
1890 return node
1892 return node
1891 }
1893 }
1892
1894
1893 var get_link = function(node){
1895 var get_link = function(node){
1894 return node.firstElementChild.text;
1896 return node.firstElementChild.text;
1895 }
1897 }
1896
1898
1897 var revisionSort = function(a, b, desc, field) {
1899 var revisionSort = function(a, b, desc, field) {
1898
1900
1899 var a_ = fromHTML(a.getData(field));
1901 var a_ = fromHTML(a.getData(field));
1900 var b_ = fromHTML(b.getData(field));
1902 var b_ = fromHTML(b.getData(field));
1901
1903
1902 // extract revisions from string nodes
1904 // extract revisions from string nodes
1903 a_ = get_rev(a_)
1905 a_ = get_rev(a_)
1904 b_ = get_rev(b_)
1906 b_ = get_rev(b_)
1905
1907
1906 var comp = YAHOO.util.Sort.compare;
1908 var comp = YAHOO.util.Sort.compare;
1907 var compState = comp(a_, b_, desc);
1909 var compState = comp(a_, b_, desc);
1908 return compState;
1910 return compState;
1909 };
1911 };
1910 var ageSort = function(a, b, desc, field) {
1912 var ageSort = function(a, b, desc, field) {
1911 var a_ = fromHTML(a.getData(field));
1913 var a_ = fromHTML(a.getData(field));
1912 var b_ = fromHTML(b.getData(field));
1914 var b_ = fromHTML(b.getData(field));
1913
1915
1914 // extract name from table
1916 // extract name from table
1915 a_ = get_date(a_)
1917 a_ = get_date(a_)
1916 b_ = get_date(b_)
1918 b_ = get_date(b_)
1917
1919
1918 var comp = YAHOO.util.Sort.compare;
1920 var comp = YAHOO.util.Sort.compare;
1919 var compState = comp(a_, b_, desc);
1921 var compState = comp(a_, b_, desc);
1920 return compState;
1922 return compState;
1921 };
1923 };
1922
1924
1923 var lastLoginSort = function(a, b, desc, field) {
1925 var lastLoginSort = function(a, b, desc, field) {
1924 var a_ = a.getData('last_login_raw') || 0;
1926 var a_ = a.getData('last_login_raw') || 0;
1925 var b_ = b.getData('last_login_raw') || 0;
1927 var b_ = b.getData('last_login_raw') || 0;
1926
1928
1927 var comp = YAHOO.util.Sort.compare;
1929 var comp = YAHOO.util.Sort.compare;
1928 var compState = comp(a_, b_, desc);
1930 var compState = comp(a_, b_, desc);
1929 return compState;
1931 return compState;
1930 };
1932 };
1931
1933
1932 var nameSort = function(a, b, desc, field) {
1934 var nameSort = function(a, b, desc, field) {
1933 var a_ = fromHTML(a.getData(field));
1935 var a_ = fromHTML(a.getData(field));
1934 var b_ = fromHTML(b.getData(field));
1936 var b_ = fromHTML(b.getData(field));
1935
1937
1936 // extract name from table
1938 // extract name from table
1937 a_ = get_name(a_)
1939 a_ = get_name(a_)
1938 b_ = get_name(b_)
1940 b_ = get_name(b_)
1939
1941
1940 var comp = YAHOO.util.Sort.compare;
1942 var comp = YAHOO.util.Sort.compare;
1941 var compState = comp(a_, b_, desc);
1943 var compState = comp(a_, b_, desc);
1942 return compState;
1944 return compState;
1943 };
1945 };
1944
1946
1945 var permNameSort = function(a, b, desc, field) {
1947 var permNameSort = function(a, b, desc, field) {
1946 var a_ = fromHTML(a.getData(field));
1948 var a_ = fromHTML(a.getData(field));
1947 var b_ = fromHTML(b.getData(field));
1949 var b_ = fromHTML(b.getData(field));
1948 // extract name from table
1950 // extract name from table
1949
1951
1950 a_ = a_.children[0].innerHTML;
1952 a_ = a_.children[0].innerHTML;
1951 b_ = b_.children[0].innerHTML;
1953 b_ = b_.children[0].innerHTML;
1952
1954
1953 var comp = YAHOO.util.Sort.compare;
1955 var comp = YAHOO.util.Sort.compare;
1954 var compState = comp(a_, b_, desc);
1956 var compState = comp(a_, b_, desc);
1955 return compState;
1957 return compState;
1956 };
1958 };
1957
1959
1958 var groupNameSort = function(a, b, desc, field) {
1960 var groupNameSort = function(a, b, desc, field) {
1959 var a_ = fromHTML(a.getData(field));
1961 var a_ = fromHTML(a.getData(field));
1960 var b_ = fromHTML(b.getData(field));
1962 var b_ = fromHTML(b.getData(field));
1961
1963
1962 // extract name from table
1964 // extract name from table
1963 a_ = get_group_name(a_)
1965 a_ = get_group_name(a_)
1964 b_ = get_group_name(b_)
1966 b_ = get_group_name(b_)
1965
1967
1966 var comp = YAHOO.util.Sort.compare;
1968 var comp = YAHOO.util.Sort.compare;
1967 var compState = comp(a_, b_, desc);
1969 var compState = comp(a_, b_, desc);
1968 return compState;
1970 return compState;
1969 };
1971 };
1970 var dateSort = function(a, b, desc, field) {
1972 var dateSort = function(a, b, desc, field) {
1971 var a_ = fromHTML(a.getData(field));
1973 var a_ = fromHTML(a.getData(field));
1972 var b_ = fromHTML(b.getData(field));
1974 var b_ = fromHTML(b.getData(field));
1973
1975
1974 // extract name from table
1976 // extract name from table
1975 a_ = get_date(a_)
1977 a_ = get_date(a_)
1976 b_ = get_date(b_)
1978 b_ = get_date(b_)
1977
1979
1978 var comp = YAHOO.util.Sort.compare;
1980 var comp = YAHOO.util.Sort.compare;
1979 var compState = comp(a_, b_, desc);
1981 var compState = comp(a_, b_, desc);
1980 return compState;
1982 return compState;
1981 };
1983 };
1982
1984
1983 var linkSort = function(a, b, desc, field) {
1985 var linkSort = function(a, b, desc, field) {
1984 var a_ = fromHTML(a.getData(field));
1986 var a_ = fromHTML(a.getData(field));
1985 var b_ = fromHTML(a.getData(field));
1987 var b_ = fromHTML(a.getData(field));
1986
1988
1987 // extract url text from string nodes
1989 // extract url text from string nodes
1988 a_ = get_link(a_)
1990 a_ = get_link(a_)
1989 b_ = get_link(b_)
1991 b_ = get_link(b_)
1990
1992
1991 var comp = YAHOO.util.Sort.compare;
1993 var comp = YAHOO.util.Sort.compare;
1992 var compState = comp(a_, b_, desc);
1994 var compState = comp(a_, b_, desc);
1993 return compState;
1995 return compState;
1994 }
1996 }
1995
1997
1996 var addPermAction = function(_html, users_list, groups_list){
1998 var addPermAction = function(_html, users_list, groups_list){
1997 var elmts = YUD.getElementsByClassName('last_new_member');
1999 var elmts = YUD.getElementsByClassName('last_new_member');
1998 var last_node = elmts[elmts.length-1];
2000 var last_node = elmts[elmts.length-1];
1999 if (last_node){
2001 if (last_node){
2000 var next_id = (YUD.getElementsByClassName('new_members')).length;
2002 var next_id = (YUD.getElementsByClassName('new_members')).length;
2001 _html = _html.format(next_id);
2003 _html = _html.format(next_id);
2002 last_node.innerHTML = _html;
2004 last_node.innerHTML = _html;
2003 YUD.setStyle(last_node, 'display', '');
2005 YUD.setStyle(last_node, 'display', '');
2004 YUD.removeClass(last_node, 'last_new_member');
2006 YUD.removeClass(last_node, 'last_new_member');
2005 MembersAutoComplete("perm_new_member_name_"+next_id,
2007 MembersAutoComplete("perm_new_member_name_"+next_id,
2006 "perm_container_"+next_id, users_list, groups_list);
2008 "perm_container_"+next_id, users_list, groups_list);
2007 //create new last NODE
2009 //create new last NODE
2008 var el = document.createElement('tr');
2010 var el = document.createElement('tr');
2009 el.id = 'add_perm_input';
2011 el.id = 'add_perm_input';
2010 YUD.addClass(el,'last_new_member');
2012 YUD.addClass(el,'last_new_member');
2011 YUD.addClass(el,'new_members');
2013 YUD.addClass(el,'new_members');
2012 YUD.insertAfter(el, last_node);
2014 YUD.insertAfter(el, last_node);
2013 }
2015 }
2014 }
2016 }
2015
2017
2016 /* Multi selectors */
2018 /* Multi selectors */
2017
2019
2018 var MultiSelectWidget = function(selected_id, available_id, form_id){
2020 var MultiSelectWidget = function(selected_id, available_id, form_id){
2019
2021
2020
2022
2021 //definition of containers ID's
2023 //definition of containers ID's
2022 var selected_container = selected_id;
2024 var selected_container = selected_id;
2023 var available_container = available_id;
2025 var available_container = available_id;
2024
2026
2025 //temp container for selected storage.
2027 //temp container for selected storage.
2026 var cache = new Array();
2028 var cache = new Array();
2027 var av_cache = new Array();
2029 var av_cache = new Array();
2028 var c = YUD.get(selected_container);
2030 var c = YUD.get(selected_container);
2029 var ac = YUD.get(available_container);
2031 var ac = YUD.get(available_container);
2030
2032
2031 //get only selected options for further fullfilment
2033 //get only selected options for further fullfilment
2032 for(var i = 0;node =c.options[i];i++){
2034 for(var i = 0;node =c.options[i];i++){
2033 if(node.selected){
2035 if(node.selected){
2034 //push selected to my temp storage left overs :)
2036 //push selected to my temp storage left overs :)
2035 cache.push(node);
2037 cache.push(node);
2036 }
2038 }
2037 }
2039 }
2038
2040
2039 //get all available options to cache
2041 //get all available options to cache
2040 for(var i = 0;node =ac.options[i];i++){
2042 for(var i = 0;node =ac.options[i];i++){
2041 //push selected to my temp storage left overs :)
2043 //push selected to my temp storage left overs :)
2042 av_cache.push(node);
2044 av_cache.push(node);
2043 }
2045 }
2044
2046
2045 //fill available only with those not in choosen
2047 //fill available only with those not in choosen
2046 ac.options.length=0;
2048 ac.options.length=0;
2047 tmp_cache = new Array();
2049 tmp_cache = new Array();
2048
2050
2049 for(var i = 0;node = av_cache[i];i++){
2051 for(var i = 0;node = av_cache[i];i++){
2050 var add = true;
2052 var add = true;
2051 for(var i2 = 0;node_2 = cache[i2];i2++){
2053 for(var i2 = 0;node_2 = cache[i2];i2++){
2052 if(node.value == node_2.value){
2054 if(node.value == node_2.value){
2053 add=false;
2055 add=false;
2054 break;
2056 break;
2055 }
2057 }
2056 }
2058 }
2057 if(add){
2059 if(add){
2058 tmp_cache.push(new Option(node.text, node.value, false, false));
2060 tmp_cache.push(new Option(node.text, node.value, false, false));
2059 }
2061 }
2060 }
2062 }
2061
2063
2062 for(var i = 0;node = tmp_cache[i];i++){
2064 for(var i = 0;node = tmp_cache[i];i++){
2063 ac.options[i] = node;
2065 ac.options[i] = node;
2064 }
2066 }
2065
2067
2066 function prompts_action_callback(e){
2068 function prompts_action_callback(e){
2067
2069
2068 var choosen = YUD.get(selected_container);
2070 var choosen = YUD.get(selected_container);
2069 var available = YUD.get(available_container);
2071 var available = YUD.get(available_container);
2070
2072
2071 //get checked and unchecked options from field
2073 //get checked and unchecked options from field
2072 function get_checked(from_field){
2074 function get_checked(from_field){
2073 //temp container for storage.
2075 //temp container for storage.
2074 var sel_cache = new Array();
2076 var sel_cache = new Array();
2075 var oth_cache = new Array();
2077 var oth_cache = new Array();
2076
2078
2077 for(var i = 0;node = from_field.options[i];i++){
2079 for(var i = 0;node = from_field.options[i];i++){
2078 if(node.selected){
2080 if(node.selected){
2079 //push selected fields :)
2081 //push selected fields :)
2080 sel_cache.push(node);
2082 sel_cache.push(node);
2081 }
2083 }
2082 else{
2084 else{
2083 oth_cache.push(node)
2085 oth_cache.push(node)
2084 }
2086 }
2085 }
2087 }
2086
2088
2087 return [sel_cache,oth_cache]
2089 return [sel_cache,oth_cache]
2088 }
2090 }
2089
2091
2090 //fill the field with given options
2092 //fill the field with given options
2091 function fill_with(field,options){
2093 function fill_with(field,options){
2092 //clear firtst
2094 //clear firtst
2093 field.options.length=0;
2095 field.options.length=0;
2094 for(var i = 0;node = options[i];i++){
2096 for(var i = 0;node = options[i];i++){
2095 field.options[i]=new Option(node.text, node.value,
2097 field.options[i]=new Option(node.text, node.value,
2096 false, false);
2098 false, false);
2097 }
2099 }
2098
2100
2099 }
2101 }
2100 //adds to current field
2102 //adds to current field
2101 function add_to(field,options){
2103 function add_to(field,options){
2102 for(var i = 0;node = options[i];i++){
2104 for(var i = 0;node = options[i];i++){
2103 field.appendChild(new Option(node.text, node.value,
2105 field.appendChild(new Option(node.text, node.value,
2104 false, false));
2106 false, false));
2105 }
2107 }
2106 }
2108 }
2107
2109
2108 // add action
2110 // add action
2109 if (this.id=='add_element'){
2111 if (this.id=='add_element'){
2110 var c = get_checked(available);
2112 var c = get_checked(available);
2111 add_to(choosen,c[0]);
2113 add_to(choosen,c[0]);
2112 fill_with(available,c[1]);
2114 fill_with(available,c[1]);
2113 }
2115 }
2114 // remove action
2116 // remove action
2115 if (this.id=='remove_element'){
2117 if (this.id=='remove_element'){
2116 var c = get_checked(choosen);
2118 var c = get_checked(choosen);
2117 add_to(available,c[0]);
2119 add_to(available,c[0]);
2118 fill_with(choosen,c[1]);
2120 fill_with(choosen,c[1]);
2119 }
2121 }
2120 // add all elements
2122 // add all elements
2121 if(this.id=='add_all_elements'){
2123 if(this.id=='add_all_elements'){
2122 for(var i=0; node = available.options[i];i++){
2124 for(var i=0; node = available.options[i];i++){
2123 choosen.appendChild(new Option(node.text,
2125 choosen.appendChild(new Option(node.text,
2124 node.value, false, false));
2126 node.value, false, false));
2125 }
2127 }
2126 available.options.length = 0;
2128 available.options.length = 0;
2127 }
2129 }
2128 //remove all elements
2130 //remove all elements
2129 if(this.id=='remove_all_elements'){
2131 if(this.id=='remove_all_elements'){
2130 for(var i=0; node = choosen.options[i];i++){
2132 for(var i=0; node = choosen.options[i];i++){
2131 available.appendChild(new Option(node.text,
2133 available.appendChild(new Option(node.text,
2132 node.value, false, false));
2134 node.value, false, false));
2133 }
2135 }
2134 choosen.options.length = 0;
2136 choosen.options.length = 0;
2135 }
2137 }
2136
2138
2137 }
2139 }
2138
2140
2139 YUE.addListener(['add_element','remove_element',
2141 YUE.addListener(['add_element','remove_element',
2140 'add_all_elements','remove_all_elements'],'click',
2142 'add_all_elements','remove_all_elements'],'click',
2141 prompts_action_callback)
2143 prompts_action_callback)
2142 if (form_id !== undefined) {
2144 if (form_id !== undefined) {
2143 YUE.addListener(form_id,'submit',function(){
2145 YUE.addListener(form_id,'submit',function(){
2144 var choosen = YUD.get(selected_container);
2146 var choosen = YUD.get(selected_container);
2145 for (var i = 0; i < choosen.options.length; i++) {
2147 for (var i = 0; i < choosen.options.length; i++) {
2146 choosen.options[i].selected = 'selected';
2148 choosen.options[i].selected = 'selected';
2147 }
2149 }
2148 });
2150 });
2149 }
2151 }
2150 }
2152 }
2151
2153
2152
2154
2153 // global hooks after DOM is loaded
2155 // global hooks after DOM is loaded
2154
2156
2155 YUE.onDOMReady(function(){
2157 YUE.onDOMReady(function(){
2156 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2158 YUE.on(YUQ('.diff-collapse-button'), 'click', function(e){
2157 var button = e.currentTarget;
2159 var button = e.currentTarget;
2158 var t = YUD.get(button).getAttribute('target');
2160 var t = YUD.get(button).getAttribute('target');
2159 console.log(t);
2161 console.log(t);
2160 if(YUD.hasClass(t, 'hidden')){
2162 if(YUD.hasClass(t, 'hidden')){
2161 YUD.removeClass(t, 'hidden');
2163 YUD.removeClass(t, 'hidden');
2162 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2164 YUD.get(button).innerHTML = "&uarr; {0} &uarr;".format(_TM['Collapse diff']);
2163 }
2165 }
2164 else if(!YUD.hasClass(t, 'hidden')){
2166 else if(!YUD.hasClass(t, 'hidden')){
2165 YUD.addClass(t, 'hidden');
2167 YUD.addClass(t, 'hidden');
2166 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2168 YUD.get(button).innerHTML = "&darr; {0} &darr;".format(_TM['Expand diff']);
2167 }
2169 }
2168 });
2170 });
2169
2171
2170
2172
2171
2173
2172 });
2174 });
2173
2175
General Comments 0
You need to be logged in to leave comments. Login now