Files @ 7276b170ce8b
Branch filter:

Location: kallithea/rhodecode/public/js/rhodecode.js - annotation

Marcin Kuzminski
#71 code-review
- simple inline comments
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
9d9e491e2a21
c6b811f11c94
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
ef31d0c6bae9
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
96ae22a4e963
96ae22a4e963
96ae22a4e963
96ae22a4e963
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
9d9e491e2a21
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
c6b811f11c94
91708b96e991
91708b96e991
91708b96e991
91708b96e991
9d9e491e2a21
91708b96e991
91708b96e991
91708b96e991
91708b96e991
91708b96e991
91708b96e991
91708b96e991
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
fab837f40cf7
fab837f40cf7
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
fab837f40cf7
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
fab837f40cf7
fab837f40cf7
fab837f40cf7
fab837f40cf7
fab837f40cf7
fab837f40cf7
b1e1dffd595c
b1e1dffd595c
b1e1dffd595c
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
6f0143e5efe5
b1e1dffd595c
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
7276b170ce8b
/**
RhodeCode JS Files
**/

if (typeof console == "undefined" || typeof console.log == "undefined"){
	console = { log: function() {} }
}


function str_repeat(i, m) {
	for (var o = []; m > 0; o[--m] = i);
	return o.join('');
}

/**
 * INJECT .format function into String
 * Usage: "My name is {0} {1}".format("Johny","Bravo")
 * Return "My name is Johny Bravo"
 * Inspired by https://gist.github.com/1049426
 */
String.prototype.format = function() {
	  
	  function format() {
	    var str = this;
	    var len = arguments.length+1;
	    var safe = undefined;
	    var arg = undefined;
	    
	    // For each {0} {1} {n...} replace with the argument in that position.  If 
	    // the argument is an object or an array it will be stringified to JSON.
	    for (var i=0; i < len; arg = arguments[i++]) {
	      safe = typeof arg === 'object' ? JSON.stringify(arg) : arg;
	      str = str.replace(RegExp('\\{'+(i-1)+'\\}', 'g'), safe);
	    }
	    return str;
	  }

	  // Save a reference of what may already exist under the property native.  
	  // Allows for doing something like: if("".format.native) { /* use native */ }
	  format.native = String.prototype.format;

	  // Replace the prototype property
	  return format;

}();


/**
 * SmartColorGenerator
 *
 *usage::
 *	var CG = new ColorGenerator();
 *  var col = CG.getColor(key); //returns array of RGB
 *  'rgb({0})'.format(col.join(',')
 * 
 * @returns {ColorGenerator}
 */
function ColorGenerator(){
	this.GOLDEN_RATIO = 0.618033988749895;
	this.CURRENT_RATIO = 0.22717784590367374 // this can be random
	this.HSV_1 = 0.75;//saturation
	this.HSV_2 = 0.95;
	this.color;
	this.cacheColorMap = {};
};

ColorGenerator.prototype = {
    getColor:function(key){
    	if(this.cacheColorMap[key] !== undefined){
    		return this.cacheColorMap[key];
    	}
    	else{
    		this.cacheColorMap[key] = this.generateColor();
    		return this.cacheColorMap[key];
    	}
    },
    _hsvToRgb:function(h,s,v){
        if (s == 0.0)
            return [v, v, v];
        i = parseInt(h * 6.0)
        f = (h * 6.0) - i
        p = v * (1.0 - s)
        q = v * (1.0 - s * f)
        t = v * (1.0 - s * (1.0 - f))
        i = i % 6
        if (i == 0) 
            return [v, t, p]
        if (i == 1) 
            return [q, v, p]
        if (i == 2) 
            return [p, v, t]
        if (i == 3)
            return [p, q, v]
        if (i == 4) 
            return [t, p, v]
        if (i == 5)
            return [v, p, q]            	
    },
    generateColor:function(){
        this.CURRENT_RATIO = this.CURRENT_RATIO+this.GOLDEN_RATIO;
        this.CURRENT_RATIO = this.CURRENT_RATIO %= 1;
        HSV_tuple = [this.CURRENT_RATIO, this.HSV_1, this.HSV_2]
        RGB_tuple = this._hsvToRgb(HSV_tuple[0],HSV_tuple[1],HSV_tuple[2]);
        function toRgb(v){
        	return ""+parseInt(v*256)
        }
        return [toRgb(RGB_tuple[0]),toRgb(RGB_tuple[1]),toRgb(RGB_tuple[2])];
        
    }
}





/**
 * GLOBAL YUI Shortcuts
 */
var YUC = YAHOO.util.Connect;
var YUD = YAHOO.util.Dom;
var YUE = YAHOO.util.Event;
var YUQ = YAHOO.util.Selector.query;

// defines if push state is enabled for this browser ?
var push_state_enabled = Boolean(
		window.history && window.history.pushState && window.history.replaceState
		&& !(   /* disable for versions of iOS before version 4.3 (8F190) */
				(/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i).test(navigator.userAgent)
				/* disable for the mercury iOS browser, or at least older versions of the webkit engine */
				|| (/AppleWebKit\/5([0-2]|3[0-2])/i).test(navigator.userAgent)
		)
)

/**
 * Partial Ajax Implementation
 * 
 * @param url: defines url to make partial request
 * @param container: defines id of container to input partial result
 * @param s_call: success callback function that takes o as arg
 *  o.tId
 *  o.status
 *  o.statusText
 *  o.getResponseHeader[ ]
 *  o.getAllResponseHeaders
 *  o.responseText
 *  o.responseXML
 *  o.argument
 * @param f_call: failure callback
 * @param args arguments 
 */
function ypjax(url,container,s_call,f_call,args){
	var method='GET';
	if(args===undefined){
		args=null;
	}
	
	// Set special header for partial ajax == HTTP_X_PARTIAL_XHR
	YUC.initHeader('X-PARTIAL-XHR',true);
	
	// wrapper of passed callback
	var s_wrapper = (function(o){
		return function(o){
			YUD.get(container).innerHTML=o.responseText;
			YUD.setStyle(container,'opacity','1.0');
    		//execute the given original callback
    		if (s_call !== undefined){
    			s_call(o);
    		}
		}
	})()	
	YUD.setStyle(container,'opacity','0.3');
	YUC.asyncRequest(method,url,{
		success:s_wrapper,
		failure:function(o){
			console.log(o);
			YUD.get(container).innerHTML='ERROR';
			YUD.setStyle(container,'opacity','1.0');
			YUD.setStyle(container,'color','red');
		}
	},args);
	
}

/**
 * tooltip activate
 */
var tooltip_activate = function(){
    function toolTipsId(){
        var ids = [];
        var tts = YUQ('.tooltip');
        for (var i = 0; i < tts.length; i++) {
            // if element doesn't not have and id 
        	//  autogenerate one for tooltip 
            if (!tts[i].id){
                tts[i].id='tt'+((i*100)+tts.length);
            }
            ids.push(tts[i].id);
        }
        return ids
    };
    var myToolTips = new YAHOO.widget.Tooltip("tooltip", {
        context: [[toolTipsId()],"tl","bl",null,[0,5]],
        monitorresize:false,
        xyoffset :[0,0],
        autodismissdelay:300000,
        hidedelay:5,
        showdelay:20,
    });
}

/**
 * show more
 */
var show_more_event = function(){
    YUE.on(YUD.getElementsByClassName('show_more'),'click',function(e){
        var el = e.target;
        YUD.setStyle(YUD.get(el.id.substring(1)),'display','');
        YUD.setStyle(el.parentNode,'display','none');
    });
}


/**
 * Quick filter widget
 * 
 * @param target: filter input target
 * @param nodes: list of nodes in html we want to filter.
 * @param display_element function that takes current node from nodes and
 *    does hide or show based on the node
 * 
 */
var q_filter = function(target,nodes,display_element){
	
	var nodes = nodes;
	var q_filter_field = YUD.get(target);
	var F = YAHOO.namespace(target);

	YUE.on(q_filter_field,'click',function(){
	   q_filter_field.value = '';
	});

	YUE.on(q_filter_field,'keyup',function(e){
	    clearTimeout(F.filterTimeout); 
	    F.filterTimeout = setTimeout(F.updateFilter,600); 
	});

	F.filterTimeout = null;

	var show_node = function(node){
		YUD.setStyle(node,'display','')
	}
	var hide_node = function(node){
		YUD.setStyle(node,'display','none');
	}
	
	F.updateFilter  = function() { 
	   // Reset timeout 
	   F.filterTimeout = null;
	   
	   var obsolete = [];
	   
	   var req = q_filter_field.value.toLowerCase();
	   
	   var l = nodes.length;
	   var i;
	   var showing = 0;
	   
       for (i=0;i<l;i++ ){
    	   var n = nodes[i];
    	   var target_element = display_element(n)
    	   if(req && n.innerHTML.toLowerCase().indexOf(req) == -1){
    		   hide_node(target_element);
    	   }
    	   else{
    		   show_node(target_element);
    		   showing+=1;
    	   }
       }	  	   

	   // if repo_count is set update the number
	   var cnt = YUD.get('repo_count');
	   if(cnt){
		   YUD.get('repo_count').innerHTML = showing;
	   }       
       
	}	
}

var ajaxPOST = function(url,postData,success) {
    var sUrl = url;
    var callback = {
        success: success,
        failure: function (o) {
            alert("error");
        },
    };
    var postData = postData;
    var request = YAHOO.util.Connect.asyncRequest('POST', sUrl, callback, postData);
};


/** comments **/
var removeInlineForm = function(form) {
	form.parentNode.removeChild(form);
}

var createInlineForm = function(parent_tr, f_path, line) {
	var form = document.createElement('tr');
	YUD.addClass(form, 'comment-form-inline');
	var tmpl = YUD.get('comment-inline-form-template').innerHTML;
	tmpl = tmpl.format(f_path, line);
	form.innerHTML = '<td class="lineno new"></td>'+
		             '<td class="lineno old"></td>'+ 
			         '<td>{0}</td>'.format(tmpl);

	// create event for hide button
	form = new YAHOO.util.Element(form);
	var form_hide_button = new YAHOO.util.Element(form.getElementsByClassName('hide-inline-form')[0]);
	form_hide_button.on('click', function(e) {
		var newtr = e.currentTarget.parentNode.parentNode.parentNode.parentNode.parentNode;
		removeInlineForm(newtr);
		YUD.removeClass(parent_tr, 'form-open');
	});
	return form
}
var getLineNo = function(tr) {
	var line;
	var o = tr.children[0].id.split('_');
	var n = tr.children[1].id.split('_');

	if (n.length == 2) {
		line = n[1];
	} else if (o.length == 2) {
		line = o[1];
	}

	return line
}