You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
RnQ/Distro/Template/preferences.htm

2694 lines
91 KiB
HTML

<html>
<head>
<include src="common.htm" />
<style src="preferences.css" />
<style src="customframe.css" />
<style src="color-selector.css" />
<script>
const Native = View.share.PrefsNative;
view.caption = Native.OnPrefsCreate(document);
view.minSize = [500, 320];
CommonNative.SetLargeWindowIcon(document, "");
Element.prototype.show = function() {
this.removeAttribute("hidden");
}
Element.prototype.hide = function() {
this.attr["hidden"] = "";
}
Element.prototype.forceHide = function() {
this.classList.add("hidden");
}
setSettingsDesign();
translateWindow("a[href], h2, h3, span:not([translate]), radio, checkbox, option[translate], caption[translate], button, th, .strip > div[panel], .infopanel h2, .infopanel h3");
var elements = $$(".infopanel [translate]");
var texts = [];
for (let element of elements)
texts.push(element.html_en ? element.html_en : element.html);
if (texts.length > 0) {
let ttexts = CommonNative.GetTranslations(texts);
for (let [index, element] of elements.entries()) {
element.html_en = texts[index];
element.html = ttexts[index];
}
}
var lastProfile,
lastQst = -1,
menuList,
fullMode = true,
body = document.body,
contactmenu = $("#contactmenu"),
updateMediaVars = () => {
document.post(() => {
view.mediaVar("collapsed", view.box("width", "border") < 720dip.valueOf());
view.mediaVar("expanded", view.box("width", "border") > 1100dip.valueOf());
view.mediaVar("multiline", $("div[idx=2] > .settings > div").state.box("width") < 460dip.valueOf());
});
};
class SectionTooltip extends Element {
componentDidMount() {
if (view.mediaVar("collapsed"))
this.popup(this.$(".tooltip"), {
anchorAt: 6,
popupAt: 6
});
}
componentWillUnmount() {
if (view.mediaVar("collapsed"))
this.$(".tooltip").state.popup = false;
}
}
class MultiSelect extends FixSelectList {
CaptureSpace(e) {
if (e.keyCode !== Event.VK_SPACE) return;
var opt = this.$(":current checkbox");
if (!opt || opt.state.disabled) return;
opt.state.checked = !opt.state.checked;
}
componentDidMount() {
this.on("keydown", this.CaptureSpace);
}
componentWillUnmount() {
this.off(this.CaptureSpace);
}
}
class SliderBadge extends Element {
sliderButton;
sliderBuddy;
showSliderValue() {
this.sliderButton.flushPaint();
this.sliderBuddy.style.set({
top: this.sliderButton.state.box("top", "border", "document") - this.sliderBuddy.state.box("height", "border") - 10dip.valueOf(),
left: this.sliderButton.state.box("left", "border", "document") - this.sliderBuddy.state.box("width", "border")/2
});
this.sliderBuddy.state.expanded = true;
}
hideSliderValue() {
var sliderBuddies = $$("body > .sliderhint");
for (let sliderBuddy of sliderBuddies)
sliderBuddy.state.expanded = false;
}
sliderHoverFunc(e) {
if (e.type == "mouseenter")
this.parent.showSliderValue();
else if (e.type == "mouseleave" && !e.mainButton)
this.parent.hideSliderValue();
}
componentDidMount() {
this.sliderBuddy = $("body > #" + this.attr["buddy"]);
this.sliderButton = this.$("button.slider");
this.sliderButton.on("mouseenter mouseleave", this.sliderHoverFunc);
this.on("change", this.showSliderValue).on("mouseleave", this.hideSliderValue);
}
componentWillUnmount() {
if (this.sliderButton) this.sliderButton.off(this.sliderHoverFunc);
this.off(this.showSliderValue).off(this.hideSliderValue);
}
}
function setSettingsDesign() {
if (View.share.commonSettings.newSettings && CommonNative.IsWindows10()) {
view.frameType = "solid-with-shadow";
view.blurBehind = "light ultra";
document.classList.add("customframe");
} else {
view.frameType = "standard";
view.blurBehind = "none";
document.classList.remove("customframe");
}
}
function setPages(pages) {
$(".sections").clear();
var icon;
for (let page of pages) {
switch (page[0]) {
case 1: icon = ""; break;
case 2: icon = <img src="resource:ICQ" />; break;
case 3: icon = ""; break;
case 4: icon = ""; break;
case 5: icon = ""; break;
case 6: icon = ""; break;
case 7: icon = ""; break;
case 10: icon = ""; break;
case 15: icon = ""; break;
case 16: icon = ""; break;
case 20: icon = ""; break;
case 30: icon = ""; break;
case 95: icon = ""; break;
case 96: icon = ""; break;
case 99: icon = ""; break;
}
icon = typeof icon == "string" ? CommonNative.HTMLDecode(icon) : icon;
$(".sections").append(<div class="section" idx={page[0]} name={page[1]}>
<div class="tooltip"><span class="tiptitle">{page[2]}</span>
<span class="fonticon">{icon}</span></div>
<span class="fonticon">{icon}</span>
<span class="title">{page[2]}</span></div>);
}
if (pages.length == 1) {
$(".sections").classList.add("hidden");
$(".buttonbar").classList.add("single")
} else {
$(".sections").classList.remove("hidden");
$(".buttonbar").classList.remove("single")
}
}
function setViewMode(page, full) {
Native.SetViewMode(page, full);
fullMode = full;
}
function setActivePageByIndex(index) {
var sections = $$(".sections > .section");
var cnt = 0;
for (let section of sections) {
if (cnt == index) {
section.classList.add("active");
section.scrollIntoView();
openPref(section);
} else {
section.classList.remove("active");
}
cnt++;
}
}
function setActivePageByName(name) {
if (name == "") {
setActivePageByIndex(0);
return;
}
var sections = $$(".sections > .section");
for (let section of sections)
if (section.attr["name"] == name) {
section.classList.add("active");
section.scrollIntoView();
openPref(section);
} else {
section.classList.remove("active");
}
}
function openPref(section) {
var idx = section.attr["idx"];
var prefs = $$(".prefs > .pref");
for (let pref of prefs)
if (pref.attr["idx"] == idx) {
pref.show();
pref.$("h1").html = section.$("span.title").html;
pref.post(function() {
let constrols = this.$$("checkbox, radio");
for (let constrol of constrols)
constrol.removeAttribute("notransitions");
});
updateMediaVars();
} else {
pref.hide();
}
document.post(() => {
let blink = $("#blink");
if ((parseInt(idx) || 0) == 5)
blink.startBlinking();
else
blink.stopBlinking();
});
}
// Connection page
function initConnection(server) {}
function resetConnection(profiles, profileOnly, data) {
var profilelist = $("#profile_index");
var cnt = 0;
profilelist.clear();
for (let profile of profiles) {
profilelist.append(<option value={cnt}>{profile}</option>);
cnt++;
}
if (profileOnly)
for (let name of Object.keys(data))
if (name.toString().indexOf("profile_") !== 0)
delete data[name];
$("#delprofile").state.disabled = profiles.length <= 1;
lastProfile = data.profile_index;
$("#connection").value = data;
refreshConnection();
}
function refreshConnection() {
var profileProxy = $("#profile_proxy");
if (profileProxy.value == 1) {
$("#profile_proxy_row").show();
$("#profile_proxyauth_col").show();
$("#profile_proxyauth").postEvent(new Event("change", { bubbles: true }));
} else {
$("#profile_proxy_row").hide();
$("#profile_proxyauth_col").hide();
$("#profile_proxyauth_row").hide();
}
if (profileProxy.value !== 1)
$("#profile_proxyntlm_row").hide();
}
$("#addprofile").on("click", (e) => Native.AddProfile());
$("#delprofile").on("click", (e) => Native.DeleteProfile(lastProfile));
$("#profile_index").on("change", function(e) {
if (this.value !== undefined && lastProfile !== this.value) {
Native.StoreProfile($("#connection").value, lastProfile);
lastProfile = this.value;
Native.UpdateMainProfile(lastProfile);
}
});
$("#profile_proxyauth").on("change", (e) => {
if ($("#profile_proxyauth").checked) {
$("#profile_proxyauth_row").show();
if ($("#profile_proxy").value == 1)
$("#profile_proxyntlm_row").show();
} else {
$("#profile_proxyauth_row").hide();
$("#profile_proxyntlm_row").hide();
}
});
body.on("change", "#profile_proxy", (e) => refreshConnection());
// ICQ protocol page
class Capability extends Element {
word = { type: "text", width: 2 };
capmask = [
this.word, this.word, this.word, this.word, this.word, this.word, this.word, this.word,
this.word, this.word, this.word, this.word, this.word, this.word, this.word, this.word
];
updateAsText() {
var str = "";
for (var char of this.masked.value) {
if (!char) char = "0";
var ichar = parseInt(char, 16) || 32;
if (ichar == 0)
str += " ";
else
str += String.fromCharCode(ichar);
}
$("#addedcap_as_text").text = str;
}
cleanValue() {
var hexes = this.masked.value;
for (let [index, hex] of hexes.entries())
if (!hex || hex.indexOf("•") !== -1) hexes[index] = "";
this.value = hexes;
this.updateAsText();
}
componentDidMount() {
this.masked.mask = this.capmask;
this.cleanValue();
}
checkKeys(e) {
if (e.keyCode == Event.VK_DELETE) {
this.masked.setGroupValue(this.masked.currentGroup, "");
this.updateAsText();
}
const allowedChars = "0123456789ABCDEFabcdef";
if (e.keyCode == Event.VK_DELETE ||
(e.type == "keypress" && allowedChars.indexOf(e.key) === -1)) {
e.preventDefault();
return true;
}
return false;
}
["on keyup"](e) { return this.checkKeys(e) }
["on keydown"](e) { return this.checkKeys(e) }
["on ^keypress"](e) { return this.checkKeys(e) }
onchange(e) {
this.cleanValue();
}
}
function resetICQ(data) {
$("#icq").value = data;
refreshICQ();
}
function refreshICQ() {
$("#icq_addedcap").cleanValue();
if ($("#icq_addcap").value)
$("#addedcap").show();
else
$("#addedcap").hide();
if ($("#icq_showtyping").value)
$("#sendtyping").show();
else
$("#sendtyping").hide();
if ($("#icq_enableavatars").value) {
$("#icq_autoavatars").show();
$("#icq_failedavatars").show();
} else {
$("#icq_autoavatars").hide();
$("#icq_failedavatars").hide();
}
$("#icq_inactinterval").state.disabled = !$("#icq_sendtyping").value;
$("#icq_recentlyofflinedelay").state.disabled = !$("#icq_recentlyoffline").value;
$("#icq_birthdate").state.disabled = !$("#icq_birthremind").state.checked;
if ($("#icq_savepass").value)
$("#icq_clearpass").hide();
else
$("#icq_clearpass").show();
}
function setPwd(pass) {
$("#icq_password").value = (pass ? pass : "");
}
body.on("change", "#icq_savepass, #icq_addcap, #icq_showtyping, #icq_sendtyping, #icq_recentlyoffline, #icq_enableavatars, [name=\"icq_birthremind\"]", (e) => refreshICQ());
// Antispam
function addIgnoreListItem(item) {
$("#ignorelist").append(<option value={item.s1}><span class={"fonticon" + (item.isSrv ? "" : " hidden")}>&#59752;</span>{item.s0}</option>);
}
// function setIgnoreListItemToSrv(item) {
// $("#ignorelist").$("option[value=\"" + item + "\"] > span).removeAttribute("hidden");
// }
function addQuietListItem(item) {
$("#quietlist").append(<option value={item.s1}>{item.s0}</option>);
}
function resetAntispam(questions, questionsOnly, ignores, quiets, data) {
var questionlist = $("#spam_botquestion");
var cnt = 0;
questionlist.clear();
if (questions)
for (let [index, quest] of questions.entries()) {
questionlist.append(<option value={index}>{_("Question")} {index + 1}</option>);
cnt++;
}
if (!questionsOnly) {
var ignorelist = $("#ignorelist");
ignorelist.clear();
if (ignores) for (let ign of ignores) addIgnoreListItem(ign);
var quietlist = $("#quietlist");
quietlist.clear();
if (quiets) for (let qts of quiets) addQuietListItem(qts);
$("#antispam").value = data;
}
if (cnt > 0) {
questionlist.value = (lastQst == -1 ? 0 : lastQst);
if (lastQst == -1) lastQst = 0;
}
var noQuest = (cnt == 0);
questionlist.state.disabled = noQuest;
$("#spam_question").state.disabled = noQuest;
$("#spam_answers").state.disabled = noQuest;
$("#delbotquestion").state.disabled = noQuest;
if (noQuest) {
questionlist.value = -1;
$("#spam_question").text = "";
$("#spam_answers").text = "";
} else {
$("#spam_question").text = questions[lastQst].q;
var answs = "";
if (!questions[lastQst].a) $("#spam_answers").text = ""; else
for (let a of questions[lastQst].a) answs += a + "\n";
$("#spam_answers").text = answs.trim();
}
questionlist.postEvent(new Event("change", { bubbles: true }));
refreshAntispam();
}
function refreshAntispam() {
if ($("#spam_botenable").value)
$("#antispambot").show();
else
$("#antispambot").hide();
$("#antispambot").state.disabled = true;
if ($("#spam_botusequest").value) {
$("#questansw1").show();
$("#questansw2").show();
} else {
$("#questansw1").hide();
$("#questansw2").hide();
}
if ($("#spam_ignorebadwords").value)
$("#badwords").show();
else
$("#badwords").hide();
if ($("#spam_quietlist").value) {
$("#quietlist").show();
$("#quietlistbtns").show();
} else {
$("#quietlist").hide();
$("#quietlistbtns").hide();
}
$("#spam_ignoreuinvalue").state.disabled = !$("#spam_ignoreuin").value;
}
$("#spam_botquestion").on("change", function(e) {
if (this.value !== undefined && lastQst != this.value) {
Native.StoreQuestion($("#antispam").value, lastQst);
lastQst = this.value;
Native.UpdateQuestions();
}
});
body.on("change", "#spam_ignoreuin, #spam_botenable, #spam_botusequest, #spam_ignorebadwords, #spam_quietlist", (e) => refreshAntispam());
$("#addbotquestion").on("click", (e) => {
var options = $("#spam_botquestion");
Native.StoreQuestion($("#antispam").value, lastQst);
lastQst = (options.length > 0 ? parseInt(options.children[options.length - 1].value) + 1 : 0);
Native.AddBotQuestion();
});
$("#delbotquestion").on("click", (e) => {
var lQst = lastQst;
lastQst--;
Native.DelBotQuestion(lQst);
});
$("#addignoredcontact").on("click", (e) => {
var UINs = openUINList("Select contacts to ignore", "Select", ["sco_multi", "sco_groups"]);
if (UINs && UINs.length > 0) Native.AddIgnoredContacts(UINs);
});
$("#addignoredcontacttosrv").on("click", (e) => {
var val = $("#ignorelist").value;
if (val !== undefined)
Native.AddIgnoredContactToSrv(val);
});
$("#delignoredcontactfromsrv").on("click", (e) => {
var val = $("#ignorelist").value;
if (val !== undefined)
Native.RemoveIgnoredContactFromSrv(val);
});
$("#delignoredcontact").on("click", (e) => {
var val = $("#ignorelist").value;
if (val === undefined) return;
var ignorelistcur = $("#ignorelist > option:current");
if (ignorelistcur) ignorelistcur.remove();
Native.DelIgnoredContact(val);
});
$("#addquietcontact").on("click", (e) => {
var UINs = openUINList("Select contacts to quiet", "Select", ["sco_multi", "sco_groups"]);
if (UINs && UINs.length > 0) Native.AddQuietContacts(UINs);
});
$("#delquietcontact").on("click", (e) => {
var val = $("#quietlist").value;
if (val === undefined) return;
var quietlistcur = $("#quietlist > option:current");
if (quietlistcur) quietlistcur.remove();
Native.DelQuietContact(val);
});
// Autoaway
function initAutoaway(xstatuses) {
var opt = $("#autoaway_xstatus");
opt.clear();
for (let xst of xstatuses)
opt.append(<option value={xst[0]}><div class="xstatus">{xst[1]}</div><span>{xst[2]}</span></option>);
}
function resetAutoaway(data) {
$("#autoaway").value = data;
refreshAutoaway();
}
function refreshAutoaway() {
$("#autoaway_setawaydelay").state.disabled = !$("#autoaway_setaway").state.checked;
$("#autoaway_setnadelay").state.disabled = !$("#autoaway_setna").state.checked;
if ($("#autoaway_setxstatus").value)
$("#xstatuses").show();
else
$("#xstatuses").hide();
$("#autoaway_xstatus").postEvent(new Event("change", { bubbles: true }));
}
$("#autoaway_xstatus").on("change", function(e) {
if (this.value !== undefined)
$("#xstatus_string").text = Native.GetXStatusMsg(this.value);
});
body.on("change", "#autoaway_setaway, #autoaway_setna, #autoaway_setxstatus", (e) => refreshAutoaway());
// Design
class Blink extends Element {
interval = 300;
changeInterval(val) {
this.interval = val + 150;
this.startBlinking();
}
blinkFunc() {
this.state.expanded = !this.state.expanded;
return true;
}
startBlinking() {
this.state.expanded = true;
this.timer(this.interval, this.blinkFunc);
}
stopBlinking() {
this.timer(0, this.blinkFunc);
this.state.expanded = false;
}
componentDidMount() {
this.state.expanded = false;
}
componentWillUnmount() {
this.timer(0, this.blinkFunc);
this.state.expanded = false;
}
}
var dragging = false,
draggingTarget = null;
class CLItem extends Element {
["on mouseenter"](e) {
if (!dragging || draggingTarget === this) return false;
draggingTarget.detach();
$("#clitems").insert(draggingTarget, draggingTarget.index > this.index ? this.index : this.index + 1);
}
["on mousedown"](e) {
this.starty = e.y + this.style["padding-top"].valueOf();
}
["on mousedragrequest"](e) {
dragging = true;
draggingTarget = this;
let clitems = $("#clitems");
document.bindImage("in-memory:draggingTarget", new Graphics.Image(this));
var cursor = Element.create(<img src="in-memory:draggingTarget" class="capture" />);
this.parent.append(cursor);
this.style.visibility = "hidden";
clitems.classList.add("capture");
document.state.capture(true);
var ph = clitems.state.box("height", "client");
var h = this.state.box("height", "padding");
cursor.style.top = this.state.box("top", "border", clitems);
clitems.on("mousemove", (me) => {
let y = me.y - this.starty;
cursor.style.top = Math.min(Math.max(0, y), ph - h);
});
view.doEvent("untilMouseUp");
document.state.capture(false);
cursor.remove();
document.bindImage("in-memory:draggingTarget", null);
clitems.classList.remove("capture");
clitems.off("mousemove");
this.style.visibility = undefined;
clitems.value = this.value;
dragging = false;
}
}
function resetDesign(items, uiAccentClr, data) {
var opt = $("#clitems");
opt.clear();
for (let item of items)
if (item[0].idx !== 0) {
var optin = [];
if (item[0].idx != 5)
optin.push(<checkbox nolabel="" state-checked={item[1]}></checkbox>);
optin.push(<span>{_(item[0].Name)}</span>);
optin.push(<img src={"themeicon:" + item[0].IconName} />);
opt.append(<option value={item[0].idx}>{optin}</option>);
}
$("#uiaccentcolor").value = uiAccentClr;
$("#design").value = data;
setBlinkingVal($("#design_blinkspeed").value);
refreshDesign();
refreshAccentColor();
}
function refreshAccentColor() {
if ($("#design_uiaccent").state.checked) {
let clr = $("#uiaccentcolor").value;
if (clr.valueOf() !== -1) applyActiveColor(clr);
} else applyActiveColor(makeSystemAccentColor(CommonNative.GetSystemAccentColors()));
}
body.on("change", "[name=\"design_uiaccent\"]", (e) => {
refreshDesign();
refreshAccentColor();
});
refreshAccentColorThrottled = this.refreshAccentColor.throttle(250ms);
body.on("change", "#uiaccentcolor", (e) => refreshAccentColorThrottled());
function refreshDesign() {
let isWin10 = CommonNative.IsWindows10();
$("#design_clautosizeup").state.disabled = $("#design_clautosizedown_0").value;
$("#design_avmaxsizeval").state.disabled = !$("#design_avmaxsize").value;
$("#design_avusepalette").state.disabled = !isWin10;
$("#design_newsettings").state.disabled = !isWin10;
$("#uiaccentcolor").state.disabled = !$("#design_uiaccent").state.checked;
}
function revertTransparency() {
Native.ApplyTransparency(-1);
}
$("#design_actopacity").on("mouseenter", revertTransparency).on("mouseleave", revertTransparency);
$("#design_actopacity").on("change", function(e) { Native.ApplyTransparency(this.value) });
$("#design_inactopacity").on("mouseenter", revertTransparency).on("mouseleave", revertTransparency);
$("#design_inactopacity").on("change", function(e) { Native.ApplyTransparency(this.value) });
$("#design_blinkspeed").on("change", function(e) {
this.timer(250ms, () => setBlinkingVal(this.value));
});
function setBlinkingVal(val) {
document.style.variable("blikningDelay", (val * 100 + 100) + "ms");
$("#blink").changeInterval(val * 100 + 100);
}
body.on("change", "#design_avmaxsize, [name=\"design_clautosizedown\"]", (e) => refreshDesign());
$("#designvarbtn").on("click", (e) => {
createDialog(
"asterisk",
_("Information"),
_("You can use these templates") + "\n%displayed% %nick% %uin% %build%",
true
);
});
// Chat
function resetChat(errClr, data) {
$("#spellcheckcolor").value = errClr;
$("#chat").value = data;
refreshChat();
}
function refreshChat() {
if ($("#chat_spellcheck").value)
$("#spellcheck").show();
else
$("#spellcheck").hide();
$("#chat_maximgwidthval").state.disabled = !$("#chat_maximgwidth").value;
$("#chat_maximgheightval").state.disabled = !$("#chat_maximgheight").value;
}
function hideSpellcheck() {
$("#spellcheckh2").forceHide();
$("#spellcheckbox").forceHide();
$("#spellcheck").forceHide();
}
function refreshLangList(langs) {
var opt = $("#spellchecklangs");
opt.clear();
for (let lang of langs)
opt.append(<option value={lang.lang}>
<checkbox nolabel=""></checkbox><span>{lang.locale}</span>
</option>);
}
function resetLangs(langs) {
if (!langs) return;
var options = $$("#spellchecklangs option");
var contains;
for (let option of options) {
contains = false;
for (let lang of langs)
if (option.value == lang) contains = true;
option.$("checkbox").state.checked = contains;
}
}
function resetMainLang(mainLang) {
if (!mainLang) return;
var options = $$("#spellchecklangs option");
for (let option of options)
option.state.expanded = option.value == mainLang;
}
$("#spellchecklangs").on("dblclick", "option", function(e) {
if (e.mainButton) {
Native.SetMainSpellcheckLang(this.value);
resetMainLang(this.value);
}
});
$("#spellcheckinfo").on("click", (e) => {
createDialog(
"asterisk",
_("Spell checking info"),
_("Install language in the system and then download language pack for it. Restart may be required to start using spell checking for newly installed language.\\n\\n" +
"Double click language that you use the most to optimize spell checking speed. Selecting many languages can add a noticable spell check results delay."),
true
);
});
$("#chatrefreshlangs").on("click", (e) => Native.RefreshLangs());
$("#chatmanagelangs").on("click", (e) => Native.ManageLangs());
$("#chatuserdicts").on("click", (e) => Native.UserDicts());
body.on("change", "#chat_maximgwidth, #chat_maximgheight, #chat_spellcheck", (e) => refreshChat());
// Tips
function resetTips(data) {
$("#tips").value = data;
refreshTips();
}
function refreshTips() {
if ($("#tips_transparency").value)
$("#tipsopacity").show();
else
$("#tipsopacity").hide();
$("#tips_max").postEvent(new Event("change", { bubbles: true }));
}
$("#tips_max").on("change", function(e) {
if (this.value == 0)
$("#tipsdisabled").show();
else
$("#tipsdisabled").hide();
});
$("#tipstest").on("click", (e) => Native.TestTips());
body.on("change", "#tips_transparency", (e) => refreshTips());
// Start
function initStart(status, vis) {
var opt = $("#start_withstatus");
opt.clear();
for (let st of status)
opt.append(<option value={st[0]}>{st[1]}</option>);
opt = $("#start_withvis");
opt.clear();
for (let v of vis)
opt.append(<option value={v[0]}>{v[1]}</option>);
}
function resetStart(data) {
$("#start").value = data;
}
$("#getcurrentacc").on("click", (e) => $("#start_withuin").value = Native.GetCurrentAccountPath());
// Security
function resetSecurity(histCrypt, data) {
$("#histencstate").text = (histCrypt ? _("Account is currently encrypted") : _("Account is not currently encrypted"));
$("#security").value = data;
refreshSecurity();
}
function refreshSecurity() {}
$("#accpass").on("click", (e) => openAccDialog());
// Hotkeys
function initHotkeys(actions) {
var cnt = 0;
var opt = $("#hkaction");
opt.clear();
var outdated = [11, 16, 17, 20, 25, 28];
for (let action of actions) {
if (outdated.indexOf(cnt) < 0)
opt.append(<option value={cnt}>{action}</option>);
cnt++
}
$("#hkaction").value = 0;
}
function resetHotkeys(hotkeys) {
var hktbody = $("#hotkeytable > tbody");
hktbody.clear();
for (let hotkey of hotkeys)
hktbody.append(<tr role="option" shortcut={hotkey[3]}><td>{hotkey[0]}</td><td>{hotkey[1]}</td><td>{hotkey[2]}</td></tr>);
}
function setCurrentHotkey(hk, hktext, sw, win, opcode) {
$("#hkkey").attr["shortcut"] = hk;
$("#hkkey").value = hktext;
$("#hksystemwide").value = sw;
$("#hkwinkey").value = win;
$("#hkaction").value = opcode;
}
$("#hkkey").on("keypress", (e) => { return true });
$("#hkkey").on("keydown", function(e) {
var key = e.platformKeyCode;
var skey = e.keyCode;
var special = (skey == Event.VK_BACK ||
skey == Event.VK_ESCAPE ||
skey == Event.VK_RETURN ||
skey == Event.VK_CONTROL ||
skey == Event.VK_SHIFT ||
skey == Event.VK_MENU);
this.value = "";
if (e.shiftKey && (e.ctrlKey || e.altKey)) {
this.value += "Shift+";
key = key | 0x2000;
}
if (e.ctrlKey) {
this.value += "Ctrl+";
key = key | 0x4000;
}
if (e.altKey) {
this.value += "Alt+";
key = key | 0x8000;
}
if (!special) {
this.value += Native.GetKeyName(e.platformKeyCode);
this.attr["shortcut"] = key;
} else {
this.attr["shortcut"] = 0;
}
this.edit.selectRange(this.value.length, this.value.length);
return true;
});
$("#hkkey").on("keyup", function(e) {
if (!this.attr["shortcut"] || parseInt(this.attr["shortcut"]) == 0)
this.value = "";
});
$("#hkdefault").on("click", (e) => Native.HotkeyDefault());
function saveHotkey() {
var shortcut = $("#hkkey").attr["shortcut"];
if (!shortcut || parseInt(shortcut) == 0) return;
var key = parseInt(shortcut);
if ($("#hkwinkey").value) key = key | 0x1000;
var cur = $("#hotkeytable > tbody tr:current");
Native.HotkeySave(key, $("#hksystemwide").value, $("#hkaction").value);
var last = $("#hotkeytable > tbody tr[shortcut=\"" + key + "\"]");
if (!last) return;
last.execCommand("set-current");
Native.HotkeySelect(last.index);
last.scrollIntoView();
}
function deleteHotkey() {
var cur = $("#hotkeytable > tbody tr:current");
if (!cur) return;
Native.HotkeyDelete(cur.index);
cur.remove();
}
$("#hksave").on("click", (e) => saveHotkey());
$("#hkdelete").on("click", (e) => {
deleteHotkey();
$("#hkkey").attr["shortcut"] = 0;
$("#hkkey").value = "";
$("#hksystemwide").value = false;
$("#hkwinkey").value = false;
$("#hkaction").value = 0;
});
$("#hkreplace").on("click", (e) => {
deleteHotkey();
saveHotkey();
});
$("#hotkeytable > tbody").on("change", (e) => {
if (e.source) Native.HotkeySelect(e.source.index);
});
// Events
function initEvents(events, statuses) {
var cnt = 0;
var opt = $("#evlist");
opt.clear();
for (let event of events) {
if (event) opt.append(<option value={cnt}>{event}</option>);
cnt++
}
$("#evlist").value = 0;
opt = $("#statuslist");
opt.clear();
for (let status of statuses)
opt.append(<option value={status[0]}>{status[1]}</option>);
$("#statuslist").value = 0;
}
function resetEvents(data) {
refreshTriggers();
refreshDisabledEvents();
$("#events").value = data;
refreshEvents();
}
function refreshEvents() {
var audioPresent = Native.IsAudioPresent();
var masterMuted = Native.IsMasterMuted();
if ($("#events_playsnd").value) {
if (!audioPresent) {
$("#soundvolume").hide();
$("#dllwarn").show();
$("#dllwarn span").text = Native.BASSWarning();
} else if (masterMuted) {
$("#soundvolume").show();
$("#dllwarn").show();
$("#dllwarn span").text = _("Sound was muted by command line parameter");
$("#soundtest").state.disabled = true;
} else {
$("#soundvolume").show();
$("#dllwarn").hide();
$("#soundtest").state.disabled = false;
}
} else {
$("#soundvolume").hide();
$("#dllwarn").hide();
}
$("#soundvolume").state.disabled = !audioPresent;
$("#events_inoutdur").state.disabled = !$("#events_inoutignore").state.checked;
$("#events_bdinformdur").state.disabled = !$("#events_bdinform").state.checked;
$("#events_bdnotifydur").state.disabled = !$("#events_bdnotify").state.checked;
}
function refreshTriggers() {
document.post(function() {
Native.UpdateEventTriggers($("#evlist").value);
});
}
function refreshDisabledEvents() {
document.post(function() {
Native.UpdateDisabledEvents($("#statuslist").value);
});
}
function updateEventTriggers(triggers, isTip, isMultiply, tipDur, tipPlus) {
var opt = $("#evtriggers");
opt.clear();
for (let trigger of triggers) {
opt.append(<option value={trigger[0]} state-disabled={!trigger[1]}>
<checkbox nolabel="" state-checked={trigger[2]}></checkbox>
<span>{_(trigger[3])}</span></option>);
}
$("#events_dur").state.disabled = !isTip;
$("#events_dur").value = tipDur;
$("#events_multiply").state.disabled = !isTip;
$("#events_multiply").value = isMultiply;
$("#events_plus").state.disabled = !(isTip && isMultiply);
$("#events_plus").value = tipPlus;
}
function updateDisabledEvents(events) {
$("#events_notips").value = events[0];
$("#events_noblinking").value = events[1];
$("#events_nosound").value = events[2];
$("#events_nochatopening").value = events[3];
}
$("#evlist").on("change", (e) => refreshTriggers());
$("#statuslist").on("change", (e) => refreshDisabledEvents());
$("#soundtest").on("click", (e) => Native.SoundTest($("#events_volume").value));
$("#timetest").on("click", (e) => Native.TimeTest($("#evlist").value));
$("#events_multiply").on("change", function(e) { $("#events_plus").state.disabled = !this.value });
body.on("change", "#evtriggers checkbox, #events_dur, #events_multiply, #events_plus", (e, el) => {
var tval = 0;
var tstate = false;
if (el.tag == "checkbox" && el.parent.tag == "option") {
tval = el.parent.value;
tstate = el.state.checked;
} else {
tstate = $("#evtriggers > option:first-child > checkbox").state.checked;
}
Native.StoreEventTrigger(
$("#evlist").value,
tval,
tstate,
$("#events_dur").value,
$("#events_multiply").value,
$("#events_plus").value
);
});
body.on("change", "#events_notips, #events_noblinking, #events_nosound, #events_nochatopening", (e) => {
Native.StoreDisabledEvents(
$("#statuslist").value,
$("#events_notips").value,
$("#events_noblinking").value,
$("#events_nosound").value,
$("#events_nochatopening").value
);
});
body.on("change", "#events_playsnd, #events_inoutignore, #events_bdinform, #events_bdnotify", (e) => refreshEvents());
// Plugins
function resetPlugins(plugins) {
var pltbody = $("#plugintable > tbody");
pltbody.clear();
if (plugins) for (let plugin of plugins)
pltbody.append(<tr role="option" value={plugin[2] ? "active" : "inactive"}>
<td><checkbox nolabel="" state-checked={plugin[2]}></checkbox>{plugin[0]}</td>
<td>{plugin[1]}</td></tr>);
}
$("#plugreloadbtn").on("click", (e) => Native.ReloadPlugins());
$("#plugprefsbtn").on("click", (e) => {
var cur = $("#plugintable > tbody tr:current");
if (!cur) return;
Native.OpenPluginPrefs(cur.index);
});
$("#plugintable > tbody").on("change", function(e) {
$("#plugprefsbtn").state.disabled = this.value == "inactive";
});
// Autoupdate
function resetAutoupdate(data) {
$("#autoupdate").value = data;
refreshAutoupdate();
}
function refreshAutoupdate() {
if ($("#autoupdate_enable").value)
$("#autoupdateperiod").show();
else
$("#autoupdateperiod").hide();
}
$("#autoupdate_enable").on("change", (e) => refreshAutoupdate());
// ThemeEdit
function initThemeEdit(props) {
var opt = $("#propslist");
opt.clear();
for (let [index, prop] of props.entries())
opt.append(<option value={index} kind={prop[0]}>{prop[1]}</option>);
$("#propslist").value = 0;
}
function resetThemeEdit(data) {
$("#themeedit").value = data;
$("#propslist").postEvent(new Event("change", { bubbles: true }));
refreshTestText();
}
function refreshThemeEdit(propKind, data) {
$("#propfont").hide();
$("#propcolor").hide();
$("#proppic").hide();
$("#propstr").hide();
$("#propsound").hide();
switch (propKind) {
case 0:
$("#propfont").show();
//getFont(false);
break;
case 1:
$("#propcolor").show();
$("#themeedit_propcolor").value = data;
break;
case 3:
case 4:
$("#proppic").show();
$("#themetestimg").attr["src"] = "themeicon:" + data;
break;
case 5:
$("#propstr").show();
$("#themeedit_propstr").value = data;
break;
case 6:
$("#propsound").show();
$("#themeedit_sndpath").value = data;
break;
}
}
function refreshTestText() {
var testtext = $("#themetesttext");
var fontFamily = $("#themeedit_fontname").value;
if (!fontFamily) fontFamily = "Arial";
var fontColor = $("#themeedit_fontcolor").value?.valueOf();
if (!fontColor) fontColor = "#000";
testtext.style.set({
"font-family": "\"" + fontFamily + "\"",
"font-size": $("#themeedit_fontsize").value + "pt",
"color": fontColor
});
}
function setFont() {
Native.SetFontProps($("#themeedit_fontsize").value, $("#themeedit_fontcolor").value?.valueOf());
}
function getFont(openDlg) {
var fontData = Native.GetFont(openDlg);
if (fontData !== false) {
$("#themeedit_fontname").value = fontData[0];
$("#themeedit_fontsize").value = fontData[1];
$("#themeedit_fontcolor").value = fontData[2];
var testtext = $("#themetesttext");
testtext.attr["bold"] = fontData[3];
testtext.attr["italic"] = fontData[4];
testtext.attr["underline"] = fontData[5];
refreshTestText();
}
}
$("#propslist").on("change", function(e) { Native.UpdateThemeEditProp(this.value) });
// Main CSS style
$("#loadmaincss").on("click", function(e) {
var cssThemes = Native.GetMainStyles();
if (!cssThemes || cssThemes.length == 0) {
createDialog(
"asterisk",
_("Load predefined"),
_("No CSS styles found in Themes\\CSS\\ folder")
);
return;
}
var menu = $("#cssthemes");
menu.clear();
for (let cssTheme of cssThemes) {
var name = new URL(cssTheme).filename;
name = name.substring(5, name.length - 4);
menu.append(<li cssfile={cssTheme} target={"#themeedit_maincss"}><span>{name}</span></li>);
}
this.popup(menu, {
anchorAt: 1,
popupAt: 7
});
});
$("#loadmaincss2").on("click", (e) => {
var cssTheme = view.selectFile({
mode: "open",
filter: _("CSS styles") + "|*.css",
extension: "css"
});
if (!cssTheme) return;
sys.fs.readFile(cssTheme).then((data) => {
$("#themeedit_maincss").value = decode(data, "utf-8");
});
});
$("#clearmaincss").on("click", (e) => $("#themeedit_maincss").value = "");
// Chat CSS style
$("#loadchatcss").on("click", function(e) {
var cssThemes = Native.GetChatStyles();
if (!cssThemes || cssThemes.length == 0) {
createDialog(
"asterisk",
_("Load predefined"),
_("No CSS styles found in Themes\\CSS\\ folder")
);
return;
}
var menu = $("#cssthemes");
menu.clear();
for (let cssTheme of cssThemes) {
var name = new URL(cssTheme).filename;
name = name.substring(5, name.length - 4);
menu.append(<li cssfile={cssTheme} target={"#themeedit_chatcss"}><span>{name}</span></li>);
}
this.popup(menu, {
anchorAt: 1,
popupAt: 7
});
});
$("#loadchatcss2").on("click", (e) => {
var cssTheme = view.selectFile({
mode: "open",
filter: _("CSS styles") + "|*.css",
extension: "css"
});
if (!cssTheme) return;
sys.fs.readFile(cssTheme).then((data) => {
$("#themeedit_chatcss").value = decode(data, "utf-8");
});
});
$("#clearchatcss").on("click", (e) => $("#themeedit_chatcss").value = "");
$("#cssthemes").on("click", "li", function(e, el) {
sys.fs.readFile(el.attr["cssfile"]).then((data) => {
$(el.attr["target"]).value = decode(data, "utf-8");
});
});
$("#themeaddpropbtn").on("click", (e) => {
var propKind = parseInt($("#propslist option:current").attr["kind"]);
var propIndex = $("#propslist").value;
var props = $("#themeedit_contents").value;
var scrollTop = $("#themeedit_contents").scrollTop;
var propsOut;
switch (propKind) {
case 0:
propsOut = Native.AddThemeProp(props, propIndex);
break;
case 1:
propsOut = Native.AddThemeProp(props, propIndex, $("#themeedit_propcolor").value?.valueOf());
break;
case 3:
case 4:
propsOut = Native.AddThemeProp(props, propIndex, $("#themeedit_picpath").value);
break;
case 5:
propsOut = Native.AddThemeProp(props, propIndex, $("#themeedit_propstr").value);
break;
case 6:
propsOut = Native.AddThemeProp(props, propIndex, $("#themeedit_sndpath").value);
break;
}
if (propsOut) {
$("#themeedit_contents").value = propsOut;
$("#themeedit_contents").scrollTo({
position: [0, scrollTop],
behavior: "instant"
});
}
});
//$("#themefontbtn").on("click", (e) => getFont(true));
$("#themepicbtn").on("click", (e) => {
var pic = view.selectFile({
mode: "open",
filter: _("Image files") + "|*.jpg;*.jpeg;*.png;*.ico;*.svg;*.gif|" + _("All files") + "|*.*",
extension: "jpg"
});
if (pic) $("#themeedit_picpath").value = pic.toLocalPath();
});
$("#themesndbtn").on("click", (e) => {
var snd = view.selectFile({
mode: "open",
filter: _("Audio files") + "|*.wav;*.mp3|" + _("All files") + "|*.*",
extension: "mp3"
});
if (snd) $("#themeedit_sndpath").value = snd.toLocalPath();
});
$("#themeplaybtn").on("click", (e) => Native.PlaySound($("#themeedit_sndpath").value));
body.on("change", "#themeedit_fontname, #themeedit_fontsize, #themeedit_fontcolor", (e) => {
//setFont();
refreshTestText();
});
// Other
function getElevationWarning() {
return <div class="rowb"><div class="col warning">{_("Option requires elevation, R&Q must be launched with administrator rights")}</div></div>;
}
function initOther() {
if (CommonNative.IsElevated()) return;
var links = $("#handleicqlinks");
links.state.checked = false;
links.state.disabled = true;
links.parent.append(getElevationWarning());
}
function resetOther(data) {
$("#other").value = data;
refreshOther();
}
function refreshOther() {
var srv = $("#other_servertoupload").value;
$("#fileserverinfo").text = (srv == 0 ? _("Store time: unknown") : _("Store time: 7 days or more"));
var maxsize = _("Maximum file size");
$("#maxuploadsize").text = maxsize + (srv == 0 ? ": 4 GB" : ": 100 MB");
$("#other_clautohideval").state.disabled = !$("#other_clautohide").value;
}
$("#otherbrowserbtn").on("click", (e) => {
var path = view.selectFile({
mode: "open",
filter: _("Executable files") + "|*.exe",
extension: "exe"
});
if (path) $("#other_mybrowser").value = path.toLocalPath();
});
body.on("change", "#other_clautohide, #other_servertoupload", (e) => refreshOther());
// Buttons
function resetAllPrefs() {
$("#resetbtn").state.disabled = true;
lastQst = -1;
Native.PrefsReset();
$("#resetbtn").state.disabled = false;
}
function applyAllPrefs() {
$("#applybtn").state.disabled = true;
var clitems = $("#clitems");
var clicons = [];
var clicon = [];
clicon.push(0); clicon.push(false); clicons.push(clicon);
for (let clitem of clitems.children) {
clicon = [];
clicon.push(parseInt(clitem.value));
var checkbox = clitem.$("checkbox");
if (checkbox)
clicon.push(checkbox.state.checked);
else
clicon.push(false);
clicons.push(clicon);
}
var spellchecklangs = $$("#spellchecklangs option");
var slangs = [];
for (let spellchecklang of spellchecklangs)
if (spellchecklang.$("checkbox").state.checked)
slangs.push(spellchecklang.value);
var plugintable = $$("#plugintable [role=\"option\"]");
var plugins = [];
for (let plugin of plugintable)
plugins.push(plugin.$("checkbox").state.checked);
var errClr = $("#spellcheckcolor").value;
var accentClr = $("#uiaccentcolor").value;
var data = {};
extend(data,
$("#connection").value,
$("#icq").value,
$("#antispam").value,
$("#autoaway").value,
$("#design").value,
$("#chat").value,
$("#tips").value,
$("#start").value,
$("#security").value,
$("#events").value,
$("#autoupdate").value,
$("#themeedit").value,
$("#other").value
);
Native.PrefsApply(data, clicons, slangs, errClr.valueOf(), accentClr.valueOf(), plugins);
$("#applybtn").state.disabled = false;
Native.ResetPlugins();
}
$("#applybtn").on("click", (e) => applyAllPrefs());
$("#okbtn").on("click", (e) => {
applyAllPrefs();
view.close();
});
$("#resetbtn").on("click", (e) => resetAllPrefs());
$("#closebtn").on("click", (e) => view.close());
setMenuListener(contactmenu, function() {
if (menuList === undefined) return;
if (this.id == "viewinfo") Native.ViewContactInfo(menuList.value);
if (this.id == "sendmsg") Native.OpenContactChat(menuList.value);
})
body.on("click", ".section", (e, el) => {
var sections = $$(".sections > .section");
for (let section of sections)
if (section == el)
section.classList.add("active");
else
section.classList.remove("active");
openPref(el);
});
body.on("click", "a[gotosection], a[gotowindow]", (e, el) => {
var section = el.attr["gotosection"];
if (section) {
if (!fullMode) setViewMode(section, true);
setActivePageByName(section);
return;
}
var window = el.attr["gotowindow"];
if (!window) return;
if (window == "searchall")
openHistorySearch();
else if (window == "updater")
openUpdater();
});
body.on("~mousedragrequest", "input", (e) => { return true });
function showContextMenu(e) {
menuList = e.target.$p("select") || e.target;
var show = menuList.value !== undefined;
if (show) e.source = contactmenu;
return show;
}
$("#ignorelist").on("contextmenu", showContextMenu).hasContextMenu = true;
$("#quietlist").on("contextmenu", showContextMenu).hasContextMenu = true;
view.on("size", updateMediaVars)
.on("statechange", (e) => {
if (view.state == View.WINDOW_MAXIMIZED)
document.classList.add("maximized");
else
document.classList.remove("maximized");
});
$("#tabs").init();
function finishLoading() {
let controls = $$("checkbox, radio");
for (let control of controls)
control.attr["notransitions"] = "";
document.post(() => $("#loading").classList.add("finished"));
}
document.on("^mouseup", (e) => {
var current = $(".sections > .section.active");
if (current)
if (e.buttons == 8) { // browser backward
if (current.index < $(".sections").length - 1)
setActivePageByIndex(current.index + 1);
} else if (e.buttons == 16) { // browser forward
if (current.index >= 1)
setActivePageByIndex(current.index - 1);
}
})
.on("keydown", (e) => {
if (e.keyCode == Event.VK_ESCAPE || (e.ctrlKey && e.keyCode == Event.VK_W)) {
view.close();
return true;
}
}).on("closerequest", (e) => {
var blink = $("#blink");
if (blink) blink.stopBlinking();
if (view.state != View.WINDOW_MAXIMIZED && view.state != View.WINDOW_FULL_SCREEN)
Native.UpdatePrefsXY(getBounds());
Native.OnPrefsClose();
});
$("window-caption").text = view.caption;
if (!Native.HasMDLFont()) {
$("#fontwarn span").html = _("Install this font to fix section icons") + ": Segoe MDL2 Assets";
$("#fontwarn").show();
}
</script>
</head>
<window-header>
<window-caption role="window-caption"></window-caption>
<window-buttons>
<window-button role="window-minimize"></window-button>
<window-button role="window-maximize"></window-button>
<window-button role="window-close"></window-button>
</window-buttons>
</window-header>
<body>
<div class="container">
<div class="sectionsbkg">
<div class="sections"></div>
</div>
<div class="prefs">
<div idx="1" class="pref" hidden id="connection"><h1></h1><div class="settings"><div>
<h2>Connection settings</h2>
<div class="rowt bottom">
<div class="col limited">
<span>Profile</span>
<select uwp as="integer" name="profile_index" id="profile_index"></select>
</div>
<div class="col shrunk horiz">
<button uwp square class="add" id="addprofile"></button><button uwp square class="del" id="delprofile"></button>
</div>
</div>
<div class="rowt">
<div class="col limited"><span>Title</span><input uwp name="profile_name" /></div>
</div>
<div class="rowt bottom">
<div class="col limited proxy">
<span>Proxy</span>
<select uwp as="integer" name="profile_proxy" id="profile_proxy">
<option value="0" translate>None</option>
<option value="1">HTTPS</option>
<option value="2" translate>System</option>
</select>
</div>
<div class="col limited" id="profile_proxyauth_col" hidden>
<checkbox name="profile_proxyauth" id="profile_proxyauth">Authentication</checkbox>
</div>
</div>
<div class="rowt" id="profile_proxy_row" hidden>
<div class="col limited"><span>Host</span><input uwp name="profile_proxyhost" /></div>
<div class="col limited vslabel"><span>Port</span><input uwp type="integer" min="0" max="65535" name="profile_proxyport" /></div>
</div>
<div class="rowt" id="profile_proxyauth_row" hidden>
<div class="col limited"><span>User</span><input uwp name="profile_proxyuser" /></div>
<div class="col limited"><span>Password</span><input uwp type="password" name="profile_proxypasswd" /></div>
</div>
<div class="row" id="profile_proxyntlm_row" hidden>
<checkbox name="profile_proxyntlm">Use NTLM autentication</checkbox>
</div>
<h2>Networking settings</h2>
<div class="rowb">
<div class="col">
<checkbox name="net_auto">Auto-reconnect (when connection is lost)</checkbox>
<checkbox name="net_whenavailable">Connect when connection is available</checkbox>
<checkbox name="net_lostdlg">Show dialog box when disconnected</checkbox>
<checkbox name="net_showtemp">Show temporary connection errors</checkbox>
</div>
</div>
</div><div class="infopanel">
<h2>Network errors</h2>
<div class="rowt">
<div translate>If R&Q fails to start listening for ICQ protocol events, it will display a temporary error and retry in 5 seconds. After 5 failed attemps in a row client will assume that connection was lost and it was disconnected.</div>
</div>
</div></div></div>
<div idx="2" class="pref" hidden id="icq"><h1></h1><div class="settings"><div>
<h2>ICQ protocol</h2>
<div class="rowb">
<div class="col">
<checkbox name="icq_ident">Introduce to server as R&Q client instead of fake Mail.ru ICQ</checkbox>
<checkbox name="icq_addcap" id="icq_addcap">Add client capability</checkbox>
<div id="addedcap" hidden>
<input uwp type="masked" name="icq_addedcap" id="icq_addedcap" />
<div id="addedcap_as_text"></div>
</div>
</div>
</div>
<h3>Show the birthday reminder icon</h3>
<div class="rowt">
<radio name="icq_birthremind" value="0">Never</radio>
<radio name="icq_birthremind" value="1">Always</radio>
<radio name="icq_birthremind" value="2">On my birtday</radio>
<div class="radio nowrap">
<radio nolabel name="icq_birthremind" value="3" id="icq_birthremind"></radio>
<input uwp disabled value="2017-04-01" type="date" name="icq_birthdate" id="icq_birthdate" />
</div>
</div>
<h2>Security</h2>
<div class="rowt">
<div class="col">
<span>Password</span>
<input uwp type="password" name="icq_password" id="icq_password" />
</div>
</div>
<div class="row">
<div class="col">
<checkbox name="icq_savepass" id="icq_savepass">Save password</checkbox>
<checkbox name="icq_clearpass" id="icq_clearpass" hidden title="Password is asked only once, so be sure that you lock or quit R&Q when you're away">Clear password after disconnect</checkbox>
<checkbox name="icq_savetoken" id="icq_savetoken" title="Saved data is used instead of password to create ICQ session">Save authentication data</checkbox>
</div>
</div>
<h2>Messages</h2>
<div class="row">
<div class="col">
<checkbox name="icq_msgencrypt">Encrypt messages</checkbox>
<checkbox name="icq_showtyping" id="icq_showtyping">Typing notification</checkbox>
<div class="checkbox" id="sendtyping" hidden>
<checkbox name="icq_sendtyping" id="icq_sendtyping">Send typing with idle interval of</checkbox>
<input uwp type="integer" value="5" min="3" max="3600" step="1" name="icq_inactinterval" id="icq_inactinterval" /> <span>sec.</span>
</div>
</div>
</div>
<h2>Statuses</h2>
<div class="row">
<div class="col">
<div class="checkbox">
<checkbox name="icq_recentlyoffline" id="icq_recentlyoffline">Show offline contact in "Recently went offline" category for the first</checkbox>
<input uwp type="integer" value="15" min="1" max="1440" step="1" name="icq_recentlyofflinedelay" id="icq_recentlyofflinedelay" /> <span>min.</span>
</div>
<checkbox name="icq_autoreqxstatus" id="icq_autoreqxstatus">Request xstatuses automatically</checkbox>
</div>
</div>
<h2>Avatars</h2>
<div class="rowb">
<div class="col">
<checkbox name="icq_enableavatars" id="icq_enableavatars">Support avatars</checkbox>
<checkbox name="icq_autoavatars" id="icq_autoavatars">Auto load avatars</checkbox>
<checkbox name="icq_failedavatars" id="icq_failedavatars">Info about not downloaded avatars</checkbox>
</div>
</div>
</div><div class="infopanel">
<h2>Supported statuses</h2>
<div class="rowt">
<div translate>ICQ protocol only supports <Online> <div auto pic="status.online"></div> and <Offline> <div auto pic="status.offline"></div> main statuses, all others can only be used to disable particular <a href gotosection="Events">events</a>.</div>
</div>
<h2>End-to-end encryption</h2>
<div class="rowm">
<div translate>Asymmetric algorithm uses ECDH for key generation and AES-256 for message encryption. New public-private key pair is generated every time R&Q is launched, public key is then stored in client's capabilities so other contacts could initiate a secured conversation. Encrypted messages stored in server history cannot be decrypted after client is closed.</div>
</div>
</div></div></div>
<div idx="3" class="pref" hidden id="antispam"><h1></h1><div class="settings"><div>
<h2>Filter</h2>
<div class="rowb">
<div class="col">
<checkbox name="spam_ignoreunk">Ignore messages from people who are not in your list</checkbox>
<checkbox name="spam_ignoreunkauth">Ignore authorization requests from people who are not in your list</checkbox>
<checkbox name="spam_warn">Warn me about filtered messages</checkbox>
<checkbox name="spam_zero">Add filtered messages to "0spamers" contact history</checkbox>
</div>
</div>
<h3>Ignore messages when all the rules below apply</h3>
<div class="row">
<div class="col">
<checkbox name="spam_ignoremult">It's a multiple-recipient message</checkbox>
<checkbox name="spam_ignoreunk2">Sender is not in my contact list</checkbox>
<checkbox name="spam_ignorenohist">History with the sender is empty</checkbox>
<div class="checkbox nowrap">
<checkbox name="spam_ignoreuin" id="spam_ignoreuin">UIN is greater than</checkbox>
<input uwp type="integer" value="150000000" min="0" max="2000000000" step="1000000" name="spam_ignoreuinvalue" id="spam_ignoreuinvalue" />
</div>
<checkbox name="spam_ignorebadwords" id="spam_ignorebadwords">Message contains a phrase from this list (one per line):</checkbox>
</div>
</div>
<div class="row" id="badwords" hidden>
<div class="col">
<textarea uwp nowrap class="vtext" spellcheck="false" name="spam_badwords"></textarea>
</div>
</div>
<div hidden>
<h2>Anstispam-bot</h2>
<div class="row">
<div class="col">
<checkbox name="spam_botenable" id="spam_botenable">Enable</checkbox>
</div>
</div>
<div id="antispambot" hidden>
<div class="row">
<div class="col ">
<div>
<span>Number of answer attempts</span>
<input uwp type="hslider" value="3" min="2" max="5" step="1" buddy="buddy_botattempts" name="spam_botattempts" id="spam_botattempts" />
</div>
<checkbox name="spam_botusequest" id="spam_botusequest">Use questions</checkbox>
</div>
</div>
<div class="rowb bottom" id="questansw1" hidden>
<div class="col limited">
<select uwp as="integer" name="spam_botquestion" id="spam_botquestion"></select>
</div>
<div class="col shrunk horiz">
<button uwp square class="add" id="addbotquestion"></button><button uwp square class="del" id="delbotquestion"></button>
</div>
</div>
<div class="row" id="questansw2" hidden>
<div class="col limited">
<h3>Question</h3>
<textarea uwp class="vtext" name="spam_question" id="spam_question" spellcheck="false"></textarea>
</div>
<div class="col">
<h3>Answers (one per line)</h3>
<textarea uwp nowrap class="vtext" name="spam_answers" id="spam_answers" spellcheck="false"></textarea>
</div>
</div>
</div>
</div>
<h2>Ignore list</h2>
<div class="row">
<div class="col">
<checkbox name="spam_ignorelist" id="spam_ignorelist">Ignore contacts in local list too</checkbox>
</div>
</div>
<div class="row bottom">
<div class="col limited">
<select uwp type="list" as="string" size="5" class="vlist" id="ignorelist"></select>
</div>
<div class="col shrunk" id="ignorelistbtns">
<button uwp large id="addignoredcontact">Add locally</button>
<button uwp large id="addignoredcontacttosrv">Add to server</button>
<button uwp large id="delignoredcontactfromsrv">Remove from server</button>
<button uwp large id="delignoredcontact">Remove</button>
</div>
</div>
<h2 class="withsub">Quiet list</h2>
<h3 class="sub">Disables intusive reactions to some unimportant events (status change, typing, buzz, etc)</h3>
<div class="rowb bottom">
<div class="col limited">
<checkbox name="spam_quietlist" id="spam_quietlist">Enable</checkbox>
<select uwp type="list" as="string" size="4" class="vlist" id="quietlist" hidden></select>
</div>
<div class="col shrunk" id="quietlistbtns" hidden>
<button uwp large id="addquietcontact">Add</button>
<button uwp large id="delquietcontact">Remove</button>
</div>
</div>
</div></div></div>
<div idx="4" class="pref" hidden id="autoaway"><h1></h1><div class="settings"><div class="topshift">
<h3>R&Q can change status automatically, if you are not using your mouse and keyboard for a while.</h3>
<div class="rowm">
<div class="col">
<div class="checkbox">
<checkbox name="autoaway_setaway" id="autoaway_setaway">Change status to Away after idling for</checkbox>
<input uwp type="integer" value="5" min="1" max="120" step="1" name="autoaway_setawaydelay" id="autoaway_setawaydelay" /> <span>min.</span>
</div>
<div class="checkbox">
<checkbox name="autoaway_setna" id="autoaway_setna">Change status to N/A after idling for</checkbox>
<input uwp type="integer" value="5" min="1" max="120" step="1" name="autoaway_setnadelay" id="autoaway_setnadelay" /> <span>min.</span>
</div>
<checkbox name="autoaway_setnascreen">Change status to N/A when screensaver or lockscreen are activated</checkbox>
<checkbox name="autoaway_setnaboss">Change status to N/A when boss-mode is active</checkbox>
<checkbox name="autoaway_setxstatus" id="autoaway_setxstatus">Change status message to one of the predefined ones</checkbox>
<div id="xstatuses" hidden>
<select uwp default as="integer" name="autoaway_xstatus" id="autoaway_xstatus"></select>
<span id="xstatus_string"></span>
</div>
<checkbox name="autoaway_restore">Restore previous status when I come back</checkbox>
</div>
</div>
</div></div></div>
<div idx="5" class="pref" hidden id="design"><h1></h1><div class="settings"><div>
<h2>Common</h2>
<div class="rowb" id="fontwarn" hidden>
<span class="warning fullwidth"></span>
</div>
<div class="rowb">
<div class="col">
<checkbox name="design_uindelim">Show UIN-delimiter</checkbox>
<checkbox name="design_xbutton">Show status message items in menus</checkbox>
<checkbox name="design_trayclick">Use single click in tray</checkbox>
<checkbox name="design_btips">Show balloon tips in tray (Win2K+)</checkbox>
<checkbox name="design_blinkstatus">Blink with status</checkbox>
<checkbox name="design_userthemes">Use contact themes</checkbox>
<checkbox name="design_animwindows">Animate smaller windows</checkbox>
<checkbox name="design_newsettings" id="design_newsettings">OS-style Settings design</checkbox>
<h3>UI accent color</h3>
<div class="row">
<radio name="design_uiaccent" value="0">Use system color</radio>
<radio name="design_uiaccent" id="design_uiaccent" value="1">Custom</radio>
<input type="color" colors="default" id="uiaccentcolor" />
</div>
</div>
</div>
<div class="row">
<div class="col shrunk fillheight">
<span class="nowrap">Icon blink speed</span>
</div>
<div class="col horiz">
<input uwp type="hslider" medium value="1" min="1" max="15" step="1" buddy="buddy_blinkspeed" name="design_blinkspeed" id="design_blinkspeed" />
<div class="fonticon24 blinkingicon" id="blink"></div>
</div>
</div>
<h2>Contact list</h2>
<div class="row">
<div class="col">
<checkbox name="design_clontop">Contact list is always on top</checkbox>
<checkbox name="design_onlineonly">Show only online contacts</checkbox>
<checkbox name="design_showtip">Show tip for contacts</checkbox>
<checkbox name="design_unauthasoff">Show unauthorized as offline</checkbox>
<checkbox name="design_enablegroups">Enable groups</checkbox>
<checkbox name="design_indentgrp">Indent contacts in groups</checkbox>
<checkbox name="design_collapsegrp">Collapse groups in "Offline" and "Contacts" categories by default</checkbox>
<checkbox name="design_showborder">Show border</checkbox>
<checkbox name="design_noborderwithshadow">Show shadow when border is hidden</checkbox>
</div>
</div>
<h3>Icons visibility and order</h3>
<h3 class="small">Drag to change order</h3>
<div class="rowb">
<div class="col">
<select uwp multi type="list" size="9" id="clitems"></select>
</div>
</div>
<h3>Contacts sorting</h3>
<div class="rowm">
<radio name="design_clsort" value="0">None</radio>
<radio name="design_clsort" value="1">Alphabetically</radio>
<radio name="design_clsort" value="2">By last event time</radio>
</div>
<h3>Auto-size contact list</h3>
<div class="rowm">
<radio name="design_clautosizedown" id="design_clautosizedown_0" value="0">Disabled</radio>
<radio name="design_clautosizedown" value="1">Online only</radio>
<radio name="design_clautosizedown" value="2">Full list</radio>
</div>
<checkbox name="design_clautosizeup" id="design_clautosizeup">Auto-size up</checkbox>
<h3>Contact list bar</h3>
<div class="rowm">
<radio name="design_clbar" value="0">Top</radio>
<radio name="design_clbar" value="1">Bottom</radio>
<radio name="design_clbar" value="2">Off</radio>
</div>
<h3>Filter bar</h3>
<div class="rowm">
<radio name="design_clfilterbar" value="0">Top</radio>
<radio name="design_clfilterbar" value="1">Bottom</radio>
<radio name="design_clfilterbar" value="2">Off</radio>
</div>
<h3>Contact list window title</h3>
<div class="row">
<div class="col horiz">
<input uwp name="design_wintitle" />
<button uwp id="designvarbtn">Variables</button>
</div>
</div>
<h2>Transparency</h2>
<div class="rowb">
<div class="col">
<checkbox name="design_transpcl">For contact list</checkbox>
<checkbox name="design_transpchat">For chat window</checkbox>
</div>
</div>
<div class="rowb">
<div class="col slabel fillheight">
<span class="nowrap">Opacity when active</span>
</div>
<div class="col horiz">
<input uwp type="hslider" long value="0" min="0" max="255" step="1" buddy="buddy_actopacity" name="design_actopacity" id="design_actopacity" />
</div>
</div>
<div class="row">
<div class="col slabel fillheight">
<span class="nowrap">Opacity when inactive</span>
</div>
<div class="col horiz">
<input uwp type="hslider" long value="0" min="0" max="255" step="1" buddy="buddy_inactopacity" name="design_inactopacity" id="design_inactopacity" />
</div>
</div>
<h2>Avatars</h2>
<div class="rowb">
<div class="col">
<checkbox name="design_avchat">Show avatars in chat</checkbox>
<checkbox name="design_avhints">Show avatars in hints</checkbox>
<checkbox name="design_avtray">Show avatars in tray</checkbox>
<div class="checkbox">
<checkbox name="design_avmaxsize" id="design_avmaxsize">Max avatar size in tips</checkbox>
<input uwp type="integer" value="100" min="0" max="300" step="1" name="design_avmaxsizeval" id="design_avmaxsizeval" />
</div>
<checkbox name="design_avtaskbarbtn">Show avatar instead of contact status on additional taskbar buttons</checkbox>
<checkbox name="design_avusepalette" id="design_avusepalette">Use avatar colors to style contact info window</checkbox>
</div>
</div>
</div></div></div>
<div idx="6" class="pref" hidden id="chat"><h1></h1><div class="settings"><div>
<h2>Common</h2>
<div class="row">
<div class="col">
<checkbox name="chat_autocopy">Auto-copy selected text</checkbox>
<checkbox name="chat_tabstatus">Show contact status on tabs</checkbox>
<checkbox name="chat_cursorquote">Place cursor below quoted text</checkbox>
<checkbox name="chat_quoteselected">Quote selected text (if any)</checkbox>
<checkbox name="chat_textformat">Text formatting (* and _)</checkbox>
<checkbox name="chat_chatontop">Chat window is always on top</checkbox>
<checkbox name="chat_tabhints">Show hints on chat tabs</checkbox>
<checkbox name="chat_wrapinseparate">Wrap text in separate preview window</checkbox>
<checkbox name="chat_closeonempty">Close chat when empty message is sent</checkbox>
<checkbox name="chat_singlemsg">Close chat after sending a message by default</checkbox>
<checkbox name="chat_closetabonsingle">Close tab instead of window on single message</checkbox>
<checkbox name="chat_smoothrender">Smooth font rendering</checkbox>
<checkbox name="chat_animatedscroll">Animated scrolling</checkbox>
<checkbox name="chat_msgtrim">Remove leading and trailing empty lines from messages</checkbox>
<checkbox name="chat_smartreplies">Display "smart" replies</checkbox>
<checkbox name="chat_reactions">Display message reactions</checkbox>
</div>
</div>
<div class="rowm">
<div class="col horiz">
<div><span>Preload</span> <input uwp type="integer" value="20" min="10" max="50" step="5" name="chat_msgbuffer" id="chat_msgbuffer" /> <span>messages from history</span></div>
</div>
</div>
<div><span>Send when I press "Enter" key</span> <input uwp type="integer" value="1" min="0" max="3" step="1" name="chat_entercount" id="chat_entercount" /> <span>time(s)</span></div>
<h2>Relative timestamps</h2>
<div class="rowm">
<div class="col horiz">
<span>Display relative days for the last</span> <input uwp type="integer" value="7" min="2" max="31" step="1" name="chat_reldays" /> <span class="fullheight" >day(s)</span>
</div>
</div>
<div class="rowt">
<div class="col horiz">
<span>Display relative hours/minutes for the last</span> <input uwp type="integer" value="6" min="0" max="24" step="1" name="chat_relhours" /> <span class="fullheight" >hour(s)</span>
</div>
</div>
<h2>Smiles menu</h2>
<div class="row">
<div class="col">
<checkbox name="chat_smilescaptions">Show smiles captions</checkbox>
</div>
</div>
<h2>Images</h2>
<div class="row">
<div class="col">
<checkbox name="chat_inimg">Display incoming image links as images</checkbox>
<checkbox name="chat_outimg">Display outgoing image links as images</checkbox>
</div>
</div>
<h3>Preview resolution</h3>
<h3 class="small">Only applies to images on ICQ server</h3>
<div class="row">
<div class="col limited">
<select uwp as="integer" name="chat_previewsize" id="chat_previewsize">
<option translate title="200px" value="0">Small</option>
<option translate title="300px" value="1">Medium</option>
<option translate title="400px" value="2">Large</option>
<option translate title="600px" value="3">Extra large</option>
<option translate title="800px" value="4">Huge</option>
</select>
</div>
</div>
<div class="rowd">
<div class="col mlabel fillheight">
<checkbox name="chat_maximgwidth" id="chat_maximgwidth">Limit image width</checkbox>
</div>
<div class="col horiz fillheight">
<input uwp type="integer" value="512" min="128" max="9999" step="1" name="chat_maximgwidthval" id="chat_maximgwidthval" />
</div>
</div>
<div class="rowd">
<div class="col mlabel fillheight">
<checkbox name="chat_maximgheight" id="chat_maximgheight">Limit image height</checkbox>
</div>
<div class="col horiz fillheight">
<input uwp type="integer" value="512" min="128" max="9999" step="1" name="chat_maximgheightval" id="chat_maximgheightval" />
</div>
</div>
<h3>Resampling preset for chat</h3>
<div class="row">
<div class="col limited">
<select uwp as="integer" name="chat_chatimgquality" id="chat_chatimgquality">
<option translate value="0">Quality</option>
<option translate value="1">Speed (pixelated)</option>
<option translate value="2">Balanced (crisp edges)</option>
</select>
</div>
</div>
<div class="rowt">
<div class="col">
<checkbox name="chat_enablestickers" id="chat_enablestickers">Enable stickers support</checkbox>
</div>
</div>
<h2>Video</h2>
<h3>Preferred resolution</h3>
<div class="row">
<div class="col limited">
<select uwp as="integer" name="chat_videores" id="chat_videores">
<option value="0">Full HD</option>
<option value="1">HD</option>
<option translate value="2">Medium</option>
<option translate value="3">Small</option>
</select>
</div>
</div>
<checkbox name="chat_videothumbs">Display thumbnails for the video links</checkbox>
<h3 class="small">Image links options must be enabled</h3>
<h2>Screenshot format</h2>
<div class="rowm">
<radio name="chat_scrformat" value="0">PNG</radio>
<radio name="chat_scrformat" value="1">JPEG</radio>
<radio name="chat_scrformat" value="2">WebP</radio>
</div>
<h2 id="spellcheckh2">Spell check</h2>
<div class="rowb" id="spellcheckbox">
<div class="col">
<checkbox name="chat_spellcheck" id="chat_spellcheck">Activate real-time checking</checkbox>
</div>
</div>
<div id="spellcheck" hidden>
<div class="row">
<div class="col auto">
<div class="textwbtn">
<span class="nowrap">Languages used:</span>
<button uwp large id="spellcheckinfo" title="Spell checking info">i</button>
</div>
<select uwp multi type="list" size="5" id="spellchecklangs"></select>
</div>
</div>
<div class="row">
<div class="col horizwrap">
<button uwp id="chatrefreshlangs">Refresh language list</button>
<button uwp id="chatmanagelangs">Manage languages</button>
<button uwp id="chatuserdicts">User dictionaries</button>
</div>
</div>
<h3>Spelling errors underline style</h3>
<div class="rowb">
<div class="col horizwrap">
<select uwp as="integer" name="chat_spellcheckstyle" id="chat_spellcheckstyle">
<option translate value="0">Solid</option>
<option translate value="1">Dotted</option>
<option translate value="2">Dashed</option>
<option translate value="3">Wavy</option>
</select>
<input type="color" id="spellcheckcolor" />
</div>
</div>
</div>
</div><div class="infopanel">
<h2>Additional controls</h2>
<h3>Chat buttons</h3>
<div class="rowt">
<div>
<div auto pic="rmb" title="Right mouse button click"></div> <div auto class="uipic" pic="search"></div> <a href gotowindow="searchall" translate>History search</a><br>
<div auto pic="rmb" title="Right mouse button click"></div> <div auto class="uipic" pic="preferences"></div> <span translate>Open <a href gotosection="Plugins">plugins settings</a></span><br>
<div auto pic="rmb" title="Right mouse button click"></div> <div auto class="uipic" pic="quote"></div> <span translate>Quote text from clipboard</span><br>
Ctrl + <div auto pic="lmb" title="Left mouse button click"></div>/ <div auto pic="rmb" title="Right mouse button click"></div> <div auto class="uipic" pic="quote"></div> <span translate>or Ctrl+Alt+Q wraps quoted text if it exceeds 50 characters per line</span><br>
<div auto pic="rmb" title="Right mouse button click"></div> <div auto class="uipic" pic="file"></div> <span translate>Open <a href gotosection="Other">other settings</a></span>
</div>
</div>
<h3>Chat tabs</h3>
<div class="rowt">
<div class="hotkeytable">
<div>Alt+1..9</div><div translate>Switch to tab 1-9</div>
<div>Ctrl+Tab<br>Ctrl+F6<br>Alt+→<br><div auto pic="fmb" title="Browse forward mouse button click"></div></div><div translate>Switch to next tab</div>
<div>Ctrl+Shift+Tab<br>Ctrl+F5<br>Alt+←<br><div auto pic="bmb" title="Browse backward mouse button click"></div></div><div translate>Switch to prev. tab</div>
</div>
</div>
<h3>Input field</h3>
<div class="rowm">
<div class="hotkeytable">
<div>Alt+S</div><div translate>Send message</div>
<div>Ctrl+Space</div><div translate>Open menu to insert text formatting and code tags</div>
<h3>Chat scrolling</h3><span hidden></span>
<div>Ctrl+↑</div><div translate>Scroll up 10%</div>
<div>Ctrl+↓</div><div translate>Scroll down 10%</div>
<div>Ctrl+PgUp</div><div translate>Scroll up 100%</div>
<div>Ctrl+PgDn</div><div translate>Scroll down 100%</div>
<div>Alt+↑</div><div translate>Scroll up 1 event</div>
<div>Alt+↓</div><div translate>Scroll down 1 event</div>
<div>Alt+PgUp</div><div translate>Scroll up 5 events</div>
<div>Alt+PgDn</div><div translate>Scroll down 5 events</div>
<div>Alt+Home</div><div translate>Scroll to top</div>
<div>Alt+End</div><div translate>Scroll to last event</div>
</div>
</div>
</div></div></div>
<div idx="7" class="pref" hidden id="tips"><h1></h1><div class="settings"><div class="topshift">
<div class="row">
<div class="col horiz fillheight">
<span>Max number of tips</span> <input uwp type="integer" value="20" min="0" max="30" step="1" name="tips_max" id="tips_max" />
</div>
</div>
<span id="tipsdisabled" hidden class="warning">Tips disabled</span>
<div class="rowt">
<div class="col horiz fillheight">
<span>Space between tips</span> <input uwp type="integer" value="2" min="0" max="30" step="1" name="tips_space" id="tips_space" />
</div>
</div>
<div class="rowt">
<div class="col">
<checkbox name="tips_transparency" id="tips_transparency">Transparency</checkbox>
</div>
</div>
<div class="rowb" id="tipsopacity" hidden>
<div class="col horiz">
<span class="fullheight">Opacity</span>
<input uwp type="hslider" medium value="255" min="0" max="255" step="1" buddy="buddy_tipsopacity" name="tips_opacity" id="tips_opacity" />
</div>
</div>
<h3>Tips position</h3>
<div class="rowt">
<radio name="tips_position" value="0">Bottom Right</radio>
<radio name="tips_position" value="1">Bottom Left</radio>
<radio name="tips_position" value="2">Top Left</radio>
<radio name="tips_position" value="3">Top Right</radio>
</div>
<h3>Indent</h3>
<div class="rowt">
<div class="col slabel fillheight">
<span class="nowrap">Horizontal</span>
</div>
<div class="col horiz">
<input uwp type="integer" value="0" min="-9999" max="9999" step="1" name="tips_hindent" id="tips_hindent" />
</div>
</div>
<div class="rowt">
<div class="col slabel fillheight">
<span class="nowrap">Vertical</span>
</div>
<div class="col horiz">
<input uwp type="integer" value="0" min="-9999" max="9999" step="1" name="tips_vindent" id="tips_vindent" />
</div>
</div>
<div class="rowt">
<div class="col">
<button uwp id="tipstest">Test it</button>
</div>
</div>
</div></div></div>
<div idx="10" class="pref" hidden id="start"><h1></h1><div class="settings"><div class="topshift">
<div class="row">
<div class="col">
<checkbox name="start_autoconnect">Auto-connect on start</checkbox>
<checkbox name="start_skipsplash">Skip startup sound</checkbox>
<checkbox name="start_minimized">Start minimized</checkbox>
<checkbox name="start_lock">Lock on start</checkbox>
<checkbox name="start_reopenchats">Reopen previous chats on start</checkbox>
</div>
</div>
<h3>Auto start with account</h3>
<div class="row">
<div class="col horiz">
<input uwp name="start_withuin" id="start_withuin" /> <button uwp id="getcurrentacc">Current account</button>
</div>
</div>
<h3>Starting status</h3>
<div class="row">
<div class="col">
<select uwp as="integer" name="start_withstatus" id="start_withstatus"></select>
<checkbox name="start_firstonly">Only for the 1st connection</checkbox>
</div>
</div>
<h3>Starting visibility</h3>
<div class="row">
<div class="col">
<select uwp as="integer" name="start_withvis" id="start_withvis"></select>
</div>
</div>
<h3>Additional users path</h3>
<div class="rowb">
<div class="col">
<input uwp name="start_userpath" />
<h3 class="small">Paths to account folders separated by ;</h3>
</div>
</div>
</div><div class="infopanel">
<h2>Command line parameters</h2>
<div class="rowb">
<div>
<h3>[uin]</h3>
<div translate>Start R&Q with existing account</div>
<h3>--userpath [path]</h3>
<div translate>Path to accounts folder</div>
<h3>--logpath [path]</h3>
<div translate>Path to requests and events logs</div>
<h3>--add-ini [path]</h3>
<div translate>Path to ini file with extra preferences</div>
<h3>--proxy [profile]</h3>
<div translate>Proxy profile to use</div>
<h3>--nosound</h3>
<div translate>Mute all sounds</div>
<h3>--icqlink [icq://...]</h3>
<div translate>Process icq protocol links:</div>
<div translate><i>Add contact</i></div>
<div>icq://[uin]</div>
<div translate><i>Open contact info</i></div>
<div>icq://info/[uin]<br>
icq://profile/[uin]<br>
icq://people/[uin]</div>
<div translate><i>Open chat with contact</i></div>
<div>icq://chat/[uin]</div>
<div translate><i>Open sticker pack info</i></div>
<div>icq://s/[id]<br>
icq://sticker/[id]<br>
icq://stickers/[id]</div>
</div>
</div>
</div></div></div>
<div idx="15" class="pref" hidden id="security"><h1></h1><div class="settings"><div class="topshift">
<div class="row">
<div class="col">
<checkbox name="security_writehist">Save history on disk</checkbox>
<checkbox name="security_backup">Backup files before writing</checkbox>
<checkbox name="security_askboss">Ask account password before exiting from Boss-mode</checkbox>
</div>
</div>
<div class="row">
<div class="col">
<h3 id="histencstate"></h3>
</div>
</div>
<div class="rowb">
<div class="col">
<button uwp id="accpass">Set password for account</button>
</div>
</div>
</div></div></div>
<div idx="16" class="pref" hidden id="hotkeys"><h1></h1><div class="settings"><div class="topshift">
<div class="rowm">
<div class="col">
<table class="columntable" id="hotkeytable">
<thead>
<tr><th>Action</th><th>Hotkey</th><th>System-wide</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<h3>Hotkey</h3>
<div class="row">
<div class="col">
<input uwp id="hkkey" />
</div>
</div>
<div class="row">
<div class="col horiz">
<checkbox id="hksystemwide">System-wide</checkbox>
<checkbox id="hkwinkey">WIN key</checkbox>
</div>
</div>
<h3>Action</h3>
<div class="row">
<div class="col">
<select uwp default as="integer" id="hkaction"></select>
</div>
</div>
<div class="rowb">
<div class="col horizwrap">
<button uwp id="hkdefault">Default</button>
<button uwp id="hksave">Save</button>
<button uwp id="hkdelete">Delete</button>
<button uwp id="hkreplace">Replace</button>
</div>
</div>
</div><div class="infopanel">
<div class="row topped">
<div class="col">
<div translate>System-wide hotkeys can also be used when R&Q is in background/hidden.</div>
<div translate>Changes on this page are applied immediately, but hotkeys are active only when Preferences window is closed.</div>
</div>
</div>
<h2>Contact menu</h2>
<div class="rowt">
<div translate>Hold Shift or Ctrl while opening contact's context menu to reveal some uncommon options.</div>
</div>
<h2>Add contact window</h2>
<div class="rowt">
<div translate>Ctrl+Enter or clicking on <div pic="search_button" auto></div> opens contact search by UIN or nickname.</div>
</div>
<h2>Any window</h2>
<div class="rowm">
<div translate>Pressing Esc or Ctrl+W can close almost any window.</div>
</div>
</div></div></div>
<div idx="20" class="pref" hidden id="events"><h1></h1><div class="settings"><div class="topshift">
<h3>Event</h3>
<div class="row">
<div class="col limited">
<select uwp default as="integer" id="evlist"></select>
</div>
</div>
<h3>Triggers</h3>
<div class="row">
<div class="col">
<select uwp multi as="integer" type="list" size="9" id="evtriggers"></select>
</div>
</div>
<div class="rowt">
<div class="col horiz fillheight">
<span>Duration</span> <input uwp type="decimal" value="1" min="0" max="1000" step="0.1" id="events_dur" /> <span>sec.</span>
</div>
</div>
<div class="row">
<div class="col horizwrap fillheight">
<checkbox class="minlimited" id="events_multiply">Multiply by message length plus</checkbox>
<div class="checkbox">
<input uwp type="decimal" value="1" min="0" max="1000" step="0.1" id="events_plus" /> <span class="fullheight">sec.</span>
</div>
</div>
</div>
<button uwp id="timetest">Test it</button>
<h2>Disable events</h2>
<h3>Status</h3>
<div class="row">
<div class="col limited">
<select uwp as="integer" id="statuslist"></select>
</div>
</div>
<h3>Disable</h3>
<div class="rowt">
<div class="col limited slabel">
<checkbox id="events_notips">Tips</checkbox>
<checkbox id="events_noblinking">Blinking</checkbox>
</div>
<div class="col">
<checkbox id="events_nosound">Sounds</checkbox>
<checkbox id="events_nochatopening">Chat opening</checkbox>
</div>
</div>
<h2>Common</h2>
<div class="row">
<div class="col">
<checkbox name="events_notinclosed">Disable events for closed groups</checkbox>
<checkbox compactbottom name="events_playsnd" id="events_playsnd">Play sounds</checkbox>
</div>
</div>
<div class="rowm" id="dllwarn" hidden>
<span class="warning nowrap"></span>
</div>
<div class="row" id="soundvolume" hidden>
<div class="col horizwrap">
<span class="fullheight">Volume</span>
<input uwp type="hslider" medium value="100" min="0" max="100" step="1" buddy="buddy_volume" name="events_volume" id="events_volume" />
<button uwp id="soundtest">Test it</button>
</div>
</div>
<div class="row">
<div class="col">
<checkbox name="events_awayisonline">Treat switching from <Away> status as going online</checkbox>
<div class="checkbox">
<checkbox name="events_inoutignore" id="events_inoutignore">Ignore incoming/outgoing events if faster than</checkbox>
<input uwp type="integer" value="1" min="1" max="2000" step="1" name="events_inoutdur" id="events_inoutdur" /> <span>sec.</span>
</div>
<checkbox name="events_skipseen">Skip events if you see them</checkbox>
<checkbox name="events_chatfocus">Focus on chat window popup</checkbox>
<checkbox name="events_infoontop">Alert window always on top</checkbox>
</div>
</div>
<h2>Log</h2>
<h3>Requests log</h3>
<div class="rowc">
<checkbox nowrap name="events_logpacketswin">Add to window</checkbox>
<checkbox nowrap name="events_logpacketsfile">Save to file</checkbox>
<checkbox nowrap name="events_logpacketsclear">Clear on start</checkbox>
</div>
<h3>Events log</h3>
<div class="rowc">
<checkbox nowrap name="events_logeventswin">Add to window</checkbox>
<checkbox nowrap name="events_logeventsfile">Save to file</checkbox>
<checkbox nowrap name="events_logeventsclear">Clear on start</checkbox>
</div>
<h2>Birthday</h2>
<div class="rowb">
<div class="col">
<div class="checkbox">
<checkbox name="events_bdinform" id="events_bdinform">First inform about birthday before</checkbox>
<input uwp type="integer" value="1" min="1" max="15" step="1" name="events_bdinformdur" id="events_bdinformdur" />
<span>day(s)</span>
</div>
<div class="checkbox">
<checkbox name="events_bdnotify" id="events_bdnotify">Repeating notifications about birthday before</checkbox>
<input uwp type="integer" value="1" min="1" max="15" step="1" name="events_bdnotifydur" id="events_bdnotifydur" />
<span>day(s)</span>
</div>
</div>
</div>
</div><div class="infopanel">
<h2>Log files</h2>
<div class="rowt">
<div translate>If logging to files is enabled, <i>requests.log</i> and <i>events.log</i> files will be created in exe's folder by default (can be changed by --logpath command line parameter)</div>
</div>
</div></div></div>
<div idx="30" class="pref" hidden id="plugins"><h1></h1><div class="settings"><div class="topshift">
<table class="columntable" id="plugintable">
<thead>
<tr><th>Name</th><th>Filename</th></tr>
</thead>
<tbody></tbody>
</table>
<div class="rowt">
<div class="col horiz">
<button uwp medium id="plugreloadbtn">Reload</button>
<button uwp medium id="plugprefsbtn" disabled>Properties</button>
</div>
</div>
</div></div></div>
<div idx="95" class="pref" hidden id="autoupdate"><h1></h1><div class="settings"><div class="topshift">
<div class="row">
<div class="col">
<checkbox name="autoupdate_beta">Check both major version and build number</checkbox>
<checkbox name="autoupdate_enable" id="autoupdate_enable">Auto-check for new versions</checkbox>
</div>
</div>
<div class="rowm" id="autoupdateperiod" hidden>
<div class="col horizwrap fillheight">
<span class="nowrap fullheight">Check every</span>
<input uwp type="integer" value="1" min="1" max="9999" step="1" name="autoupdate_period" id="autoupdate_period" />
<span class="fullheight">hour(s)</span>
</div>
</div>
</div><div class="infopanel">
<h2>Quick access</h2>
<div class="rowt">
<div>
<a href gotowindow="updater">Check for updates now</a>
</div>
</div>
</div></div></div>
<div idx="96" class="pref" hidden id="themeedit"><h1></h1><div class="settings"><div>
<div id="tabs" class="tabs" prefs>
<div class="strip">
<div panel="maincss">Contact list</div>
<div panel="chatcss">Chat</div>
<div panel="oldthemes">Other theming</div>
</div>
<div class="panels">
<div panel="maincss">
<h2>Additional contact list CSS styles</h2>
<div class="rowb">
<div class="col">
<plaintext type="text/css" maxlength="32000" class="vtheme" name="themeedit_maincss" id="themeedit_maincss" spellcheck="false"></plaintext>
</div>
</div>
<div class="row">
<div class="col horizwrap">
<button uwp id="loadmaincss">Load predefined</button>
<button uwp id="loadmaincss2">Load from file</button>
<button uwp id="clearmaincss">Clear</button>
</div>
</div>
</div>
<div panel="chatcss">
<h2>Additional chat CSS styles</h2>
<div class="rowb">
<div class="col">
<plaintext type="text/css" maxlength="32000" class="vtheme" name="themeedit_chatcss" id="themeedit_chatcss" spellcheck="false"></plaintext>
</div>
</div>
<div class="row">
<div class="col horizwrap">
<button uwp id="loadchatcss">Load predefined</button>
<button uwp id="loadchatcss2">Load from file</button>
<button uwp id="clearchatcss">Clear</button>
</div>
</div>
</div>
<div panel="oldthemes">
<h2>Other theming</h2>
<div class="rowm">
<div class="col">
<textarea uwp nowrap maxlength="32000" class="vtheme" name="themeedit_contents" id="themeedit_contents" spellcheck="false"></textarea>
</div>
</div>
<h3>Properties</h3>
<div class="row">
<div class="col horizwrap">
<select uwp default as="integer" id="propslist"></select>
<button uwp id="themeaddpropbtn">Add</button>
</div>
</div>
<div id="propfont" hidden>
<h3>Font</h3>
<div class="row">
<div class="col horiz">
<input uwp id="themeedit_fontname" readonly />
<button uwp id="themefontbtn">Select</button>
<input type="color" id="themeedit_fontcolor" />
</div>
</div>
<div class="rowt">
<div class="col horiz">
<span class="fullheight">Size</span>
<input uwp type="integer" value="14" min="6" max="100" step="1" id="themeedit_fontsize" />
</div>
</div>
<div class="rowm">
<div class="col">
<div id="themetesttext">This is a font example</div>
</div>
</div>
</div>
<div class="rowt" id="propcolor" hidden>
<div class="col">
<input type="color" id="themeedit_propcolor" />
</div>
</div>
<div id="proppic" hidden>
<div class="rowt">
<div class="col horizwrap">
<input uwp id="themeedit_picpath" readonly />
<button uwp id="themepicbtn">Select</button>
</div>
</div>
<div class="rowt">
<div class="col">
<img id="themetestimg" />
</div>
</div>
</div>
<div class="rowt" id="propstr" hidden>
<div class="col">
<textarea uwp maxlength="32000" class="vtheme" id="themeedit_propstr" spellcheck="false"></textarea>
</div>
</div>
<div class="rowt" id="propsound" hidden>
<div class="col horizwrap">
<input uwp id="themeedit_sndpath" readonly />
<div class="col horiz">
<button uwp id="themesndbtn">Select</button>
<button uwp id="themeplaybtn">Play</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div></div></div>
<div idx="99" class="pref" hidden id="other"><h1></h1><div class="settings"><div>
<h2>Common</h2>
<div class="rowt">
<div class="col horiz">
<span class="fullheight">Mouse wheel speed</span>
<input uwp type="integer" value="3" min="1" max="30" step="1" name="other_mwheelspeed" id="other_mwheelspeed" />
</div>
</div>
<div class="rowb">
<div class="col">
<checkbox name="other_confirmexit">Exit confirmation</checkbox>
<checkbox name="other_autolayout">Auto switch keyboard layout</checkbox>
<checkbox name="other_vacuum">Optimize account database on exit or user switch</checkbox>
<checkbox name="other_trimws">Flush working set from memory to swap file after a long period of inactivity</checkbox>
<div><span class="warning">Might negatively impact performance</span></div>
<checkbox name="other_indialog">Show dialog box when I click on incoming contact</checkbox>
<div class="checkbox">
<checkbox name="other_clautohide" id="other_clautohide">Auto-hide contact list on inactivity</checkbox>
<input uwp type="integer" value="36000" min="1" max="36000" step="1" name="other_clautohideval" id="other_clautohideval" /> <span>sec.</span>
</div>
<checkbox name="other_handleicqlinks" id="handleicqlinks">Handle links with icq: protocol</checkbox>
</div>
</div>
<h3>Action with not-in-list contacts on exit</h3>
<div class="rowm">
<radio name="other_notinlist" value="0">Save all</radio>
<radio name="other_notinlist" value="1">Clear all</radio>
<radio name="other_notinlist" value="2">Ask</radio>
</div>
<h3>Web browser</h3>
<div class="rowt">
<div class="col horiz">
<radio nolabel name="other_browser" value="0"></radio>
<input uwp name="other_mybrowser" id="other_mybrowser" readonly />
<button uwp id="otherbrowserbtn">Select</button>
</div>
</div>
<div class="rowb">
<radio name="other_browser" value="1">Default</radio>
</div>
<h2>File transfer</h2>
<h3>Upload files to selected server</h3>
<div class="row">
<div class="col">
<select uwp as="integer" name="other_servertoupload" id="other_servertoupload">
<option value="0">files.icq.net</option>
<option value="1">code.highspec.ru</option>
<option value="2">rnq.ru</option>
</select>
</div>
</div>
<h3 id="fileserverinfo"></h3>
<h3 id="maxuploadsize"></h3>
<br>
</div></div></div>
<div class="row buttonbar">
<div class="col horiz">
<button uwp medium id="okbtn">OK</button>
<button uwp medium id="applybtn">Apply</button>
</div>
<div class="col horiz">
<button uwp medium id="resetbtn">Reset</button>
<button uwp medium id="closebtn">Close</button>
</div>
</div>
</div>
</div>
<menu class="context" id="contactmenu">
<li id="viewinfo"><span class="fonticon"></span><span>View info</span></li>
<li id="sendmsg"><span class="fonticon"></span><span>Send message</span></li>
</menu>
<menu class="context noicons" id="cssthemes"></menu>
<div id="buddy_botattempts" class="sliderhint"></div>
<div id="buddy_blinkspeed" class="sliderhint"></div>
<div id="buddy_actopacity" class="sliderhint"></div>
<div id="buddy_inactopacity" class="sliderhint"></div>
<div id="buddy_tipsopacity" class="sliderhint"></div>
<div id="buddy_volume" class="sliderhint"></div>
<div id="loading"></div>
</body>
</html>