/*!
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
AccessManager={contextPath:"",messages:{"error.dlg.title":"Error","confirm.yes":"Yes","confirm.no":"No","button.add":"Add","tooltip.removeProperty":"Remove Property","tooltip.removeMember":"Remove Member","group.updated.msg":"Updated the group","user.updated.msg":"Updated the user","user.pwd.updated.msg":"Updated the password"}};
AccessManager.SideBar={init:function(){var c,b,a,d,e;
b=$("ul#sidebar-nav li a");
a=location.href;
d=location.hash;
if(d!=null&&d.length>0){a=a.substring(0,a.length-d.length)
}for(c=0;
c<b.length;
c++){e=b[c];
if(a==e.href){$(e.parentNode).addClass("ui-corner-all ui-state-highlight")
}}}};
AccessManager.ErrorDlg={showError:function(b,a){if($("#error_dialog").length==0){$("body").append('<div id="error_dialog" style="display:none;"></div>')
}$("#error_dialog").html(a);
$("#error_dialog").dialog({title:b,bgiframe:true,autoOpen:false,width:400,maxHeight:500,modal:true});
$("#error_dialog").dialog("open")
},errorHandler:function(d,g,c){var f,b;
try{f=UserMgmt.messages["error.dlg.title"];
b=$.parseJSON(d.responseText);
if(b.error){UserMgmt.ErrorDlg.showError(f,b.error.message)
}else{UserMgmt.ErrorDlg.showError(f,d.responseText)
}}catch(a){UserMgmt.ErrorDlg.showError(f,d.responseText)
}}};
AccessManager.Acl={init:function(){$("#acl-list button").button();
$("#acl-list tbody tr:odd").addClass("odd");
$(".remove-ace").click(function(b){var a=this.form;
$("#remove-ace-dialog").dialog({autoOpen:false,height:"auto",width:350,modal:true,resizable:false,buttons:[{text:AccessManager.messages["confirm.yes"],click:function(){a.submit()
}},{text:AccessManager.messages["confirm.no"],click:function(){$("#remove-ace-dialog").dialog("close")
}}]});
$("#remove-ace-dialog").dialog("open");
return false
})
}};
AccessManager.Ace={init:function(){var b,d;
b=AccessManager.Ace;
$("#ace-list tbody tr:odd").addClass("odd");
$("#addAceSaveButton").button();
d=$("#update-ace-form");
d.validate({rules:{principalId:"required"}});
var f=$("input[name='privilege@jcr:all'][value=granted]:radio:checked");
var a=$("input[name='privilege@jcr:all'][value=denied]:radio:checked");
if(f.length>0||a.length>0){var e=f.length>0?"granted":"denied";
b.setAggregatePrivilege("jcr:read",e);
b.setAggregatePrivilege("jcr:write",e);
b.setAggregatePrivilege("jcr:modifyProperties",e);
b.setAggregatePrivilege("jcr:removeNode",e);
b.setAggregatePrivilege("jcr:addChildNodes",e);
b.setAggregatePrivilege("jcr:removeChildNodes",e);
b.setAggregatePrivilege("jcr:readAccessControl",e);
b.setAggregatePrivilege("jcr:modifyAccessControl",e);
b.setAggregatePrivilege("jcr:lockManagement",e);
b.setAggregatePrivilege("jcr:versionManagement",e);
b.setAggregatePrivilege("jcr:nodeTypeManagement",e);
b.setAggregatePrivilege("jcr:retentionManagement",e);
b.setAggregatePrivilege("jcr:lifecycleManagement",e)
}else{var c=$("input[name='privilege@jcr:write'][value=granted]:radio:checked");
var g=$("input[name='privilege@jcr:write'][value=denied]:radio:checked");
if(c.length>0||g.length>0){var e=c.length>0?"granted":"denied";
b.setAggregatePrivilege("jcr:modifyProperties",e);
b.setAggregatePrivilege("jcr:removeNode",e);
b.setAggregatePrivilege("jcr:addChildNodes",e);
b.setAggregatePrivilege("jcr:removeChildNodes",e)
}}$("input[name='privilege@jcr:all']:radio").bind("change",function(h){b.setAggregatePrivilege("jcr:read",this.value);
b.setAggregatePrivilege("jcr:write",this.value);
b.setAggregatePrivilege("jcr:modifyProperties",this.value);
b.setAggregatePrivilege("jcr:removeNode",this.value);
b.setAggregatePrivilege("jcr:addChildNodes",this.value);
b.setAggregatePrivilege("jcr:removeChildNodes",this.value);
b.setAggregatePrivilege("jcr:readAccessControl",this.value);
b.setAggregatePrivilege("jcr:modifyAccessControl",this.value);
b.setAggregatePrivilege("jcr:lockManagement",this.value);
b.setAggregatePrivilege("jcr:versionManagement",this.value);
b.setAggregatePrivilege("jcr:nodeTypeManagement",this.value);
b.setAggregatePrivilege("jcr:retentionManagement",this.value);
b.setAggregatePrivilege("jcr:lifecycleManagement",this.value)
});
$("input[name='privilege@jcr:write']:radio").bind("change",function(h){b.setAggregatePrivilege("jcr:modifyProperties",this.value);
b.setAggregatePrivilege("jcr:removeNode",this.value);
b.setAggregatePrivilege("jcr:addChildNodes",this.value);
b.setAggregatePrivilege("jcr:removeChildNodes",this.value)
});
$("#principalId").autocomplete({source:AccessManager.contextPath+"/system/userManager.autocomplete.json",minLength:1,select:function(i,j){var h=j.item;
$("#principalId").val(h.value).data("item",h)
}}).data("autocomplete")._renderItem=function(h,i){return $("<li></li>").data("item.autocomplete",i).append("<a>"+(i.label?(i.label+" ("+i.value+")"):i.value)+"</a>").appendTo(h)
};
$("#removeAceLink").click(function(h){$("#remove-ace-dialog").dialog({autoOpen:false,height:"auto",width:350,modal:true,resizable:false,buttons:[{text:AccessManager.messages["confirm.yes"],click:function(){$("#remove-ace-form").submit()
}},{text:AccessManager.messages["confirm.no"],click:function(){$("#remove-ace-dialog").dialog("close")
}}]});
$("#remove-ace-dialog").dialog("open");
return false
})
},setAggregatePrivilege:function(b,c){var a=$("input[name='privilege@"+b+"'][value=granted]:radio");
a.attr("checked",c=="granted");
a.attr("disabled",c!="none");
a=$("input[name='privilege@"+b+"'][value=denied]:radio");
a.attr("checked",c=="denied");
a.attr("disabled",c!="none");
a=$("input[name='privilege@"+b+"'][value=none]:radio");
a.attr("checked",c=="none");
a.attr("disabled",c!="none")
}};
$(function(){$(".noscript-hide").removeClass("noscript-hide");
if($("#sidebar-nav").length>0){AccessManager.SideBar.init()
}if($("#update-acl-block").length>0){AccessManager.Acl.init()
}if($("#update-ace-form").length>0){AccessManager.Ace.init()
}});