here's the code and problem (i think):
// Popup the change password dialog.
ZmPreferencesPage.prototype._changePasswordListene r =
function(ev) {
var url = appCtxt.get(ZmSetting.CHANGE_PASSWORD_URL);
if (!url) {
url = appCtxt.get(ZmSetting.PUBLIC_URL) + "/h/changepass";
}
if (!url) {
var isHttp = appCtxt.get(ZmSetting.PROTOCOL_MODE) == ZmSetting.PROTO_HTTP;
var proto = isHttp ? ZmSetting.PROTO_HTTP : ZmSetting.PROTO_HTTPS;
var port = appCtxt.get(isHttp ? ZmSetting.HTTP_PORT : ZmSetting.HTTPS_PORT);
url = AjxUtil.formatUrl({protocol

roto, port

ort, path:"/zimbra/h/changepass", qsReset:true});
}
url is getting set to 'url = appCtxt.get(ZmSetting.PUBLIC_URL) + "/h/changepass";' _before_ the fancy check for protocol - so its never hitting the part that does formatUrl().