diff --git a/rhodecode/public/js/rhodecode.js b/rhodecode/public/js/rhodecode.js
--- a/rhodecode/public/js/rhodecode.js
+++ b/rhodecode/public/js/rhodecode.js
@@ -609,6 +609,178 @@ var deleteNotification = function(url, n
};
+/** MEMBERS AUTOCOMPLETE WIDGET **/
+
+var MembersAutoComplete = function (users_list, groups_list, group_lbl, members_lbl) {
+ var myUsers = users_list;
+ var myGroups = groups_list;
+
+ // Define a custom search function for the DataSource of users
+ var matchUsers = function (sQuery) {
+ // Case insensitive matching
+ var query = sQuery.toLowerCase();
+ var i = 0;
+ var l = myUsers.length;
+ var matches = [];
+
+ // Match against each name of each contact
+ for (; i < l; i++) {
+ contact = myUsers[i];
+ if ((contact.fname.toLowerCase().indexOf(query) > -1) || (contact.lname.toLowerCase().indexOf(query) > -1) || (contact.nname && (contact.nname.toLowerCase().indexOf(query) > -1))) {
+ matches[matches.length] = contact;
+ }
+ }
+ return matches;
+ };
+
+ // Define a custom search function for the DataSource of usersGroups
+ var matchGroups = function (sQuery) {
+ // Case insensitive matching
+ var query = sQuery.toLowerCase();
+ var i = 0;
+ var l = myGroups.length;
+ var matches = [];
+
+ // Match against each name of each contact
+ for (; i < l; i++) {
+ matched_group = myGroups[i];
+ if (matched_group.grname.toLowerCase().indexOf(query) > -1) {
+ matches[matches.length] = matched_group;
+ }
+ }
+ return matches;
+ };
+
+ //match all
+ var matchAll = function (sQuery) {
+ u = matchUsers(sQuery);
+ g = matchGroups(sQuery);
+ return u.concat(g);
+ };
+
+ // DataScheme for members
+ var memberDS = new YAHOO.util.FunctionDataSource(matchAll);
+ memberDS.responseSchema = {
+ fields: ["id", "fname", "lname", "nname", "grname", "grmembers", "gravatar_lnk"]
+ };
+
+ // DataScheme for owner
+ var ownerDS = new YAHOO.util.FunctionDataSource(matchUsers);
+ ownerDS.responseSchema = {
+ fields: ["id", "fname", "lname", "nname", "gravatar_lnk"]
+ };
+
+ // Instantiate AutoComplete for perms
+ var membersAC = new YAHOO.widget.AutoComplete("perm_new_member_name", "perm_container", memberDS);
+ membersAC.useShadow = false;
+ membersAC.resultTypeList = false;
+
+ // Instantiate AutoComplete for owner
+ var ownerAC = new YAHOO.widget.AutoComplete("user", "owner_container", ownerDS);
+ ownerAC.useShadow = false;
+ ownerAC.resultTypeList = false;
+
+
+ // Helper highlight function for the formatter
+ var highlightMatch = function (full, snippet, matchindex) {
+ return full.substring(0, matchindex)
+ + ""
+ + full.substr(matchindex, snippet.length)
+ + "" + full.substring(matchindex + snippet.length);
+ };
+
+ // Custom formatter to highlight the matching letters
+ var custom_formatter = function (oResultData, sQuery, sResultMatch) {
+ var query = sQuery.toLowerCase();
+ var _gravatar = function(res, em, group){
+ if (group !== undefined){
+ em = '/images/icons/group.png'
+ }
+ tmpl = '
{1}'
+ return tmpl.format(em,res)
+ }
+ // group
+ if (oResultData.grname != undefined) {
+ var grname = oResultData.grname;
+ var grmembers = oResultData.grmembers;
+ var grnameMatchIndex = grname.toLowerCase().indexOf(query);
+ var grprefix = "{0}: ".format(group_lbl);
+ var grsuffix = " (" + grmembers + " )";
+ var grsuffix = " ({0} {1})".format(grmembers, members_lbl);
+
+ if (grnameMatchIndex > -1) {
+ return _gravatar(grprefix + highlightMatch(grname, query, grnameMatchIndex) + grsuffix,null,true);
+ }
+ return _gravatar(grprefix + oResultData.grname + grsuffix, null,true);
+ // Users
+ } else if (oResultData.fname != undefined) {
+ var fname = oResultData.fname,
+ lname = oResultData.lname,
+ nname = oResultData.nname || "",
+ // Guard against null value
+ fnameMatchIndex = fname.toLowerCase().indexOf(query),
+ lnameMatchIndex = lname.toLowerCase().indexOf(query),
+ nnameMatchIndex = nname.toLowerCase().indexOf(query),
+ displayfname, displaylname, displaynname;
+
+ if (fnameMatchIndex > -1) {
+ displayfname = highlightMatch(fname, query, fnameMatchIndex);
+ } else {
+ displayfname = fname;
+ }
+
+ if (lnameMatchIndex > -1) {
+ displaylname = highlightMatch(lname, query, lnameMatchIndex);
+ } else {
+ displaylname = lname;
+ }
+
+ if (nnameMatchIndex > -1) {
+ displaynname = "(" + highlightMatch(nname, query, nnameMatchIndex) + ")";
+ } else {
+ displaynname = nname ? "(" + nname + ")" : "";
+ }
+
+ return _gravatar(displayfname + " " + displaylname + " " + displaynname, oResultData.gravatar_lnk);
+ } else {
+ return '';
+ }
+ };
+ membersAC.formatResult = custom_formatter;
+ ownerAC.formatResult = custom_formatter;
+
+ var myHandler = function (sType, aArgs) {
+
+ var myAC = aArgs[0]; // reference back to the AC instance
+ var elLI = aArgs[1]; // reference to the selected LI element
+ var oData = aArgs[2]; // object literal of selected item's result data
+ //fill the autocomplete with value
+ if (oData.nname != undefined) {
+ //users
+ myAC.getInputEl().value = oData.nname;
+ YUD.get('perm_new_member_type').value = 'user';
+ } else {
+ //groups
+ myAC.getInputEl().value = oData.grname;
+ YUD.get('perm_new_member_type').value = 'users_group';
+ }
+ };
+
+ membersAC.itemSelectEvent.subscribe(myHandler);
+ if(ownerAC.itemSelectEvent){
+ ownerAC.itemSelectEvent.subscribe(myHandler);
+ }
+
+ return {
+ memberDS: memberDS,
+ ownerDS: ownerDS,
+ membersAC: membersAC,
+ ownerAC: ownerAC,
+ };
+}
+
+
+
/**
* QUICK REPO MENU
*/