//$Id$
|
|
|
|
// simple translation function for tiki 6
|
|
function tr(str) {
|
|
// The lang object defined in lang/xx/language.js (included automatically) holds JS string translations.
|
|
if (typeof lang !== "undefined" /* language.js is included after tiki-js.js. This prevents errors in case tr() is called before language.js is loaded. Ideally, language.js would be loaded before tr() is defined. */ && typeof lang[str] == 'string') {
|
|
return lang[str];
|
|
} else {
|
|
return str;
|
|
}
|
|
}
|
|
|
|
var lang = {}; // object to hold JS string translations
|
|
// default strings empty, override in lang/xx/language.js
|
|
// which will be included automatically
|
|
|
|
// end translation
|
|
|
|
function browser() {
|
|
var b = navigator.appName;
|
|
if (b == "Netscape") { this.b = "ns"; }
|
|
else { this.b = b; }
|
|
this.version = navigator.appVersion;
|
|
this.v = parseInt(this.version, 10);
|
|
this.ns = (this.b=="ns" && this.v>=5);
|
|
this.op = (navigator.userAgent.indexOf('Opera')>-1);
|
|
this.safari = (navigator.userAgent.indexOf('Safari')>-1);
|
|
this.op7 = (navigator.userAgent.indexOf('Opera')>-1 && this.v>=7);
|
|
this.ie56 = (this.version.indexOf('MSIE 5')>-1||this.version.indexOf('MSIE 6')>-1);
|
|
/* ie567 added by Enmore */
|
|
this.ie567 = (this.version.indexOf('MSIE 5')>-1||this.version.indexOf('MSIE 6')>-1||this.version.indexOf('MSIE 7')>-1);
|
|
this.iewin = (this.ie56 && navigator.userAgent.indexOf('Windows')>-1);
|
|
/* iewin7 added by Enmore */
|
|
this.iewin7 = (this.ie567 && navigator.userAgent.indexOf('Windows')>-1);
|
|
this.iemac = (this.ie56 && navigator.userAgent.indexOf('Mac')>-1);
|
|
this.moz = (navigator.userAgent.indexOf('Mozilla')>-1);
|
|
this.moz13 = (navigator.userAgent.indexOf('Mozilla')>-1 && navigator.userAgent.indexOf('1.3')>-1);
|
|
this.oldmoz = (navigator.userAgent.indexOf('Mozilla')>-1 && navigator.userAgent.indexOf('1.4')>-1 || navigator.userAgent.indexOf('Mozilla')>-1 && navigator.userAgent.indexOf('1.5')>-1 || navigator.userAgent.indexOf('Mozilla')>-1 && navigator.userAgent.indexOf('1.6')>-1);
|
|
this.ns6 = (navigator.userAgent.indexOf('Netscape6')>-1);
|
|
this.docom = (this.ie56||this.ns||this.iewin||this.op||this.iemac||this.safari||this.moz||this.oldmoz||this.ns6);
|
|
}
|
|
|
|
function toggle_dynamic_var(name) {
|
|
var displayContainer = document.getElementById('dyn_'+name+'_display');
|
|
var editContainer = document.getElementById('dyn_'+name+'_edit');
|
|
|
|
// Create form element and append all inputs from "edit" span
|
|
var form = document.createElement('form');
|
|
form.setAttribute('method', 'post');
|
|
form.setAttribute('name', 'dyn_vars');
|
|
form.style.display = "inline";
|
|
editContainer.parentNode.insertBefore(form, editContainer);
|
|
form.appendChild(editContainer);
|
|
|
|
// Show form
|
|
if (displayContainer.style.display == "none") {
|
|
editContainer.style.display = "none";
|
|
displayContainer.style.display = "inline";
|
|
} else {
|
|
displayContainer.style.display = "none";
|
|
editContainer.style.display = "inline";
|
|
}
|
|
}
|
|
|
|
function chgArtType() {
|
|
var articleType = document.getElementById('articletype').value;
|
|
var typeProperties = articleTypes[articleType];
|
|
|
|
var propertyList = ['show_topline','y',
|
|
'show_subtitle','y',
|
|
'show_linkto','y',
|
|
'show_author','y',
|
|
'use_ratings','y',
|
|
'heading_only','n',
|
|
'show_image_caption','y',
|
|
'show_pre_publ','y',
|
|
'show_post_expire','y',
|
|
'show_image','y',
|
|
'show_expdate','y'
|
|
];
|
|
if (typeof articleCustomAttributes != 'undefined') {
|
|
propertyList = propertyList.concat(articleCustomAttributes);
|
|
}
|
|
var l = propertyList.length, property, value, display;
|
|
for (var i=0; i<l; i++) {
|
|
property = propertyList[i++];
|
|
value = propertyList[i];
|
|
|
|
if (typeProperties[property] == value || (!typeProperties[property] && value == "n")) {
|
|
display = "";
|
|
} else {
|
|
display = "none";
|
|
}
|
|
|
|
if (document.getElementById(property)) {
|
|
document.getElementById(property).style.display = display;
|
|
} else {
|
|
var j = 1;
|
|
while (document.getElementById(property+'_'+j)) {
|
|
document.getElementById(property+'_'+j).style.display = display;
|
|
j++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function toggleSpan(id) {
|
|
$("#" + id).toggle();
|
|
}
|
|
|
|
function toggleBlock(id) {
|
|
$("#" + id).toggle();
|
|
}
|
|
|
|
function toggleTrTd(id) {
|
|
$("#" + id).toggle();
|
|
}
|
|
|
|
function changeText(el, newText) {
|
|
// Safari work around
|
|
if (el.innerText) {
|
|
el.innerText = newText;
|
|
} else if (el.firstChild && el.firstChild.nodeValue) {
|
|
el.firstChild.nodeValue = newText;
|
|
}
|
|
}
|
|
|
|
function toggleToc() {
|
|
var toc = document.getElementById('toc').getElementsByTagName('ul')[0];
|
|
|
|
if (toc && toc.style.display == 'none') {
|
|
toc.style.display = 'block';
|
|
} else {
|
|
toc.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
function chgTrkFld(f,o) {
|
|
var opt = 0;
|
|
document.getElementById('z').style.display = "none";
|
|
document.getElementById('zDescription').style.display = "";
|
|
document.getElementById('zStaticText').style.display = "none";
|
|
document.getElementById('zStaticTextToolbars').style.display = "none";
|
|
|
|
for (var i = 0; i < f.length; i++) {
|
|
var c = f.charAt(i);
|
|
if (document.getElementById(c)) {
|
|
var ichoiceParent = document.getElementById('itemChoicesRow');
|
|
var ichoice = document.getElementById(c + 'itemChoices');
|
|
if (c == o) {
|
|
document.getElementById(c).style.display = "";
|
|
document.getElementById('z').style.display = "block";
|
|
if (c == 'S') {
|
|
document.getElementById('zDescription').style.display = "none";
|
|
document.getElementById('zStaticText').style.display = "";
|
|
document.getElementById('zStaticTextToolbars').style.display = "";
|
|
}
|
|
if (ichoice) {
|
|
ichoice.style.display = "";
|
|
ichoiceParent.style.display = "";
|
|
} else {
|
|
ichoiceParent.style.display = "none";
|
|
}
|
|
} else {
|
|
document.getElementById(c).style.display = "none";
|
|
if (ichoice) {
|
|
ichoice.style.display = "none";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function chgTrkLingual(item) {
|
|
document.getElementById("multilabelRow").style.display = ( item == 't' || item == 'a' ) ? '' : 'none';
|
|
}
|
|
|
|
function multitoggle(f,o) {
|
|
for (var i = 0; i < f.length; i++) {
|
|
if (document.getElementById('fid'+f[i])) {
|
|
if (f[i] == o) {
|
|
document.getElementById('fid'+f[i]).style.display = "block";
|
|
} else {
|
|
document.getElementById('fid'+f[i]).style.display = "none";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function setMenuCon(foo) {
|
|
var it = foo.split(",");
|
|
document.getElementById('menu_url').value = it[0];
|
|
document.getElementById('menu_name').value = it[1];
|
|
if (it[2]) {
|
|
document.getElementById('menu_section').value = it[2];
|
|
} else {
|
|
document.getElementById('menu_section').value = '';
|
|
}
|
|
if (it[3]) {
|
|
document.getElementById('menu_perm').value = it[3];
|
|
} else {
|
|
document.getElementById('menu_perm').value = '';
|
|
}
|
|
flip('weburls');
|
|
}
|
|
|
|
function genPass(w1) {
|
|
var lower, upper, num, other, l, p, pstr, i, letter, j, temp;
|
|
lower = 'abcdefghijklmnopqrstuvwxyz';
|
|
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
num = '0123456789';
|
|
other = '_$%#!@*+';
|
|
l = 8;
|
|
p = [];
|
|
//ensure at least 2 upper case letters, 2 numbers, and 2 other characters
|
|
for (i = 0; i < l; i++) {
|
|
if (i < 2) {
|
|
letter = lower.charAt(Math.round(Math.random() * (lower.length - 1)));
|
|
} else if (i < 4) {
|
|
letter = upper.charAt(Math.round(Math.random() * (upper.length - 1)));
|
|
} else if (i < 6) {
|
|
letter = num.charAt(Math.round(Math.random() * (num.length - 1)));
|
|
} else {
|
|
letter = other.charAt(Math.round(Math.random() * (other.length - 1)));
|
|
}
|
|
p[i] = letter;
|
|
}
|
|
//shuffle the characters since they are blocks of 2 per above
|
|
for (i = p.length - 1; i > 0; i--) {
|
|
j = Math.floor(Math.random() * (i + 1));
|
|
temp = p[i];
|
|
p[i] = p[j];
|
|
p[j] = temp;
|
|
}
|
|
//implode into a string
|
|
pstr = p.join('');
|
|
document.getElementById(w1).value = pstr;
|
|
}
|
|
|
|
function setUserModule(foo1) {
|
|
document.getElementById('usermoduledata').value = foo1;
|
|
}
|
|
|
|
function replaceLimon(vec) {
|
|
document.getElementById(vec[0]).value = document.getElementById(vec[0]).value.replace(vec[1], vec[2]);
|
|
}
|
|
|
|
function setSelectionRange(textarea, selectionStart, selectionEnd) {
|
|
var $textareaEditor = syntaxHighlighter.get($(textarea));
|
|
if ($textareaEditor) {
|
|
syntaxHighlighter.setSelection($textareaEditor, selectionStart, selectionEnd);
|
|
return;
|
|
}
|
|
|
|
$(textarea).selection(selectionStart, selectionEnd);
|
|
}
|
|
|
|
function getTASelection( textarea ) {
|
|
var $textareaEditor = syntaxHighlighter.get($(textarea));
|
|
if ($textareaEditor) {
|
|
return $textareaEditor.getSelection();
|
|
}
|
|
|
|
var ta_id = $(textarea).attr("id"), r, cked, output;
|
|
if (cked = typeof CKEDITOR !== 'undefined' ? CKEDITOR.instances[ta_id] : null) {
|
|
// get selection from ckeditor
|
|
return cked.getSelection().getSelectedText();
|
|
|
|
} else {
|
|
if (typeof $(textarea).attr("selectionStartSaved") != 'undefined' && $(textarea).attr("selectionStartSaved")) { // forgetful firefox/IE now
|
|
return textarea.value.substring($(textarea).attr("selectionStartSaved"), $(textarea).attr("selectionEndSaved"));
|
|
} else if ((typeof textarea != 'undefined') && (typeof textarea.selectionStart != 'undefined')) {
|
|
return textarea.value.substring(textarea.selectionStart, textarea.selectionEnd);
|
|
} else { // IE
|
|
r = document.selection.createRange();
|
|
return r.text;
|
|
}
|
|
}
|
|
}
|
|
|
|
var ieFirstTimeInsertKludge = null;
|
|
|
|
function storeTASelection( area_id ) {
|
|
if (typeof CKEDITOR === 'undefined' || typeof CKEDITOR.instances[area_id] === 'undefined') {
|
|
var $el = $("#" + area_id);
|
|
var sel = $el.selection();
|
|
$el.attr("selectionStartSaved", sel.start)
|
|
.attr("selectionEndSaved", sel.end)
|
|
.attr("scrollTopSaved", $el.attr("scrollTop"));
|
|
}
|
|
if (ieFirstTimeInsertKludge === null) {
|
|
ieFirstTimeInsertKludge = true;
|
|
}
|
|
}
|
|
|
|
function setCaretToPos (textarea, pos) {
|
|
setSelectionRange(textarea, pos, pos);
|
|
}
|
|
|
|
function getCaretPos (textarea) {
|
|
var $textareaEditor = syntaxHighlighter.get($(textarea));
|
|
if ($textareaEditor) {
|
|
var endPoint = $textareaEditor.cursorCoords();
|
|
return (endPoint.x ? endPoint.x : 0);
|
|
}
|
|
|
|
if (typeof textarea.selectionEnd != 'undefined') {
|
|
return textarea.selectionEnd;
|
|
} else if ( document.selection ) {
|
|
|
|
textarea.focus();
|
|
var range = document.selection.createRange();
|
|
if (range === null) {
|
|
return 0;
|
|
}
|
|
var re = textarea.createTextRange();
|
|
var rc = re.duplicate();
|
|
re.moveToBookmark(range.getBookmark());
|
|
rc.setEndPoint('EndToStart', re);
|
|
return rc.text.length ? rc.text.length : 0;
|
|
|
|
} else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
function insertAt(elementId, replaceString, blockLevel, perLine, replaceSelection) {
|
|
|
|
// inserts given text at selection or cursor position
|
|
var $textarea = $('#' + elementId);
|
|
var $textareaEditor = syntaxHighlighter.get($textarea);
|
|
var toBeReplaced = /text|page|area_id/g; //substrings in replaceString to be replaced by the selection if a selection was done
|
|
var hiddenParents = $textarea.parents('fieldset:hidden:last');
|
|
if (hiddenParents.length) { hiddenParents.show(); }
|
|
|
|
if ($textareaEditor) {
|
|
syntaxHighlighter.insertAt($textareaEditor, replaceString, perLine, blockLevel, replaceSelection);
|
|
return;
|
|
// get ckeditor handling out of the way - can only be simple text insert for now
|
|
} else if (typeof CKEDITOR !== 'undefined' && CKEDITOR.instances[elementId]) {
|
|
// get selection from ckeditor
|
|
var cked = CKEDITOR.instances[elementId];
|
|
if (cked) {
|
|
var isPlugin = replaceString.match(/^\s?\{/m); // do match in two halves due to multiline problems
|
|
if (isPlugin) {
|
|
isPlugin = replaceString.match(/\}\s?$/m); // not so simple {plugin} match
|
|
}
|
|
isPlugin = isPlugin && isPlugin.length > 0;
|
|
|
|
var sel = cked.getSelection(), rng;
|
|
if (sel) { // not from IE sometimes?
|
|
rng = sel.getRanges();
|
|
if (rng.length) {
|
|
rng = rng[0];
|
|
}
|
|
}
|
|
var plugin_el, com;
|
|
if (isPlugin && rng && !rng.collapsed) {
|
|
com = cked.getSelection().getStartElement();
|
|
if (typeof com !== 'undefined' && com && com.$) {
|
|
while (!$(com.$).hasClass("tiki_plugin") && com.$.nextSibling && com.$ !== rng.endContainer.$) { // loop through selection if multiple elements
|
|
com = new CKEDITOR.dom.element(com.$.nextSibling);
|
|
if ($(com.$).hasClass("tiki_plugin") || $(com.$).find(".tiki_plugin").length === 0) { // found it or parent (hmm)
|
|
break;
|
|
}
|
|
}
|
|
if (!$(com.$).hasClass("tiki_plugin")) { // not found it yet?
|
|
plugin_el = $(com.$).find(".tiki_plugin"); // using jQuery
|
|
if (plugin_el.length == 1) { // found descendant plugin
|
|
com = new CKEDITOR.dom.element(plugin_el[0]);
|
|
} else {
|
|
plugin_el = $(com.$).parents(".tiki_plugin:last"); // try parents
|
|
if (plugin_el.length == 1) { // found p plugin
|
|
com = new CKEDITOR.dom.element(plugin_el[0]);
|
|
} else { // still not found it? sometimes Fx seems to get the editor body as the selection...
|
|
var plugin_type = replaceString.match(/^\s?\{([\w]+)/);
|
|
if (plugin_type.length > 1) { plugin_type = plugin_type[1].toLowerCase(); }
|
|
|
|
plugin_el = $(com.$).find("[plugin=" + plugin_type + "].tiki_plugin"); // find all of them
|
|
if (plugin_el.length == 1) { // good guess!
|
|
com = new CKEDITOR.dom.element(plugin_el[0]);
|
|
} else {
|
|
// Does not seem to be a problem at least with the image plugin, commenting out for release but keeping it here in case problem reappears
|
|
//if (!confirm(tr("Development notice: Could not find plugin being edited, sorry. Choose cancel to debug."))) {
|
|
// debugger;
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (com && com.hasClass("tiki_plugin")) {
|
|
var html = cked.getData().replace(com.data("syntax"), replaceString);
|
|
cked.setData(html);
|
|
return;
|
|
}
|
|
}
|
|
// catch all other issues and do the insert wherever ckeditor thinks best,
|
|
// sadly as the first element sometimes FIXME
|
|
//cked.focus(); seems calling focus here makes the editor focus disappear in webkit - still FIXME
|
|
|
|
try {
|
|
cked.insertText(replaceString);
|
|
} catch (e) {
|
|
prompt(tr("Development notice: The editor selection has been lost, here is the text to insert."), replaceString);
|
|
return;
|
|
}
|
|
if (typeof cked.reParse === "function" && // also ((wiki links)) or tables
|
|
(isPlugin || replaceString.match(/^\s?\(\(.*?\)\)\s?$/) || replaceString.match(/^||.*||$/))) {
|
|
|
|
var bookmarks = cked.getSelection().createBookmarks2(true); // remember selection
|
|
|
|
cked.reParse();
|
|
|
|
cked.getSelection().selectBookmarks( bookmarks ); // restore selection
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (!$textarea.length && elementId === "fgal_picker") { // ckeditor file browser
|
|
$(".cke_dialog_contents").find("input:first").val(replaceString.replace("&", "&"));
|
|
return;
|
|
} else if ($textarea.is(":input") && elementId === "fgal_picker_id") {
|
|
$textarea.val(replaceString);
|
|
return;
|
|
}
|
|
|
|
$textarea.focus();
|
|
|
|
var val = $textarea.val();
|
|
var selection = $textarea.selection();
|
|
var scrollTop=$textarea[0].scrollTop;
|
|
|
|
if (selection.start === 0 && selection.end === 0 &&
|
|
typeof $textarea.attr("selectionStartSaved") != 'undefined') { // get saved textarea selection
|
|
if ($textarea.attr("selectionStartSaved")) { // forgetful firefox/IE
|
|
selection.start = $textarea.attr("selectionStartSaved");
|
|
selection.end = $textarea.attr("selectionEndSaved");
|
|
if ($textarea.attr("scrollTopSaved")) {
|
|
scrollTop = $textarea.attr("scrollTopSaved");
|
|
$textarea.attr("scrollTopSaved", "");
|
|
}
|
|
$textarea.attr("selectionStartSaved", "").attr("selectionEndSaved", "");
|
|
} else {
|
|
selection.start = getCaretPos($textarea[0]);
|
|
selection.end = selection.start;
|
|
}
|
|
}
|
|
|
|
// deal with IE's two char line ends
|
|
var lines, startoff = 0, endoff = 0;
|
|
if ($textarea[0].createTextRange && $textarea[0].value !== val) {
|
|
val = $textarea[0].value; // use raw value of the textarea
|
|
if (val.substring(selection.start, selection.start + 1) === "\n") {
|
|
selection.start++;
|
|
}
|
|
lines = val.substring(0, selection.start).match(/\r\n/g);
|
|
if (lines) {
|
|
startoff -= lines.length; // remove one char per line for IE
|
|
}
|
|
}
|
|
var selectionStart = selection.start;
|
|
var selectionEnd = selection.end;
|
|
|
|
if ( blockLevel ) {
|
|
// Block level operations apply to entire lines
|
|
|
|
// +1 and -1 to handle end of line caret position correctly
|
|
selectionStart = val.lastIndexOf( "\n", selectionStart - 1 ) + 1;
|
|
var blockEnd = val.indexOf( "\r", selectionEnd ); // check for IE first
|
|
if (blockEnd < 0) {
|
|
selectionEnd = val.indexOf( "\n", selectionEnd );
|
|
} else {
|
|
selectionEnd = blockEnd;
|
|
}
|
|
if (selectionEnd < 0) {
|
|
selectionEnd = val.length;
|
|
}
|
|
}
|
|
|
|
var newString = '';
|
|
if ((selectionStart != selectionEnd) && !$textareaEditor) { // has there been a selection
|
|
if ( perLine ) {
|
|
lines = val.substring(selectionStart, selectionEnd).split("\n");
|
|
for( var k = 0; lines.length > k; ++k ) {
|
|
if ( lines[k].length !== 0 ) {
|
|
newString += replaceString.replace(toBeReplaced, lines[k]);
|
|
}
|
|
if ( k != lines.length - 1 ) {
|
|
newString += "\n";
|
|
}
|
|
}
|
|
} else {
|
|
if (replaceSelection) {
|
|
newString = replaceString;
|
|
} else if (replaceString.match(toBeReplaced)) {
|
|
newString = replaceString.replace(toBeReplaced, val.substring(selectionStart, selectionEnd));
|
|
} else {
|
|
newString = replaceString + '\n' + val.substring(selectionStart, selectionEnd);
|
|
}
|
|
}
|
|
|
|
$textarea.val(val.substring(0, selectionStart)
|
|
+ newString
|
|
+ val.substring(selectionEnd)
|
|
);
|
|
lines = newString.match(/\r\n/g);
|
|
if (lines) {
|
|
endoff -= lines.length; // lines within the replacement for IE
|
|
}
|
|
setSelectionRange($textarea[0], selectionStart + startoff, selectionStart + startoff + newString.length + endoff);
|
|
|
|
} else { // insert at caret
|
|
$textarea.val(val.substring(0, selectionStart)
|
|
+ replaceString
|
|
+ val.substring(selectionEnd)
|
|
);
|
|
lines = replaceString.match(/\r\n/g);
|
|
if (lines) {
|
|
endoff -= lines.length; // lines within the replacement for IE
|
|
}
|
|
setCaretToPos($textarea[0], selectionStart + startoff + replaceString.length + endoff);
|
|
|
|
}
|
|
$textarea.attr("scrollTop", scrollTop);
|
|
if (this.iewin && ieFirstTimeInsertKludge) {
|
|
setTimeout(function(){ // not only does IE reset the scrollTop and selection the first time a dialog is used
|
|
if (newString.length) { // but somehow all the ints have been converted into strings...
|
|
setSelectionRange($textarea[0], parseInt(selectionStart,10) + parseInt(startoff,10),
|
|
parseInt(selectionStart,10) + parseInt(startoff,10) + newString.length + parseInt(endoff,10));
|
|
}
|
|
$textarea.attr("scrollTop", scrollTop);
|
|
}, 1000);
|
|
ieFirstTimeInsertKludge = false;
|
|
}
|
|
|
|
if (hiddenParents.length) { hiddenParents.hide(); }
|
|
if (typeof auto_save === "function") {
|
|
auto_save(elementId);
|
|
}
|
|
}
|
|
|
|
function setUserModuleFromCombo(id, textarea) {
|
|
document.getElementById(textarea).value = document.getElementById(textarea).value
|
|
+ document.getElementById(id).options[document.getElementById(id).selectedIndex].value;
|
|
}
|
|
|
|
|
|
function toggle(foo) {
|
|
var display = $("#"+foo).css('display');
|
|
if (display == "none") {
|
|
show(foo, true, "menu");
|
|
} else {
|
|
if (display == "block" || display == "flex") {
|
|
hide(foo, true, "menu");
|
|
} else {
|
|
show(foo, true, "menu");
|
|
}
|
|
}
|
|
}
|
|
|
|
function flip_thumbnail_status(id) {
|
|
var elem = document.getElementById(id);
|
|
if ( elem.className == 'thumbnailcontener' ) {
|
|
elem.className += ' thumbnailcontenerchecked';
|
|
} else {
|
|
elem.className = 'thumbnailcontener';
|
|
}
|
|
}
|
|
|
|
function flip_class(itemid, class1, class2) {
|
|
var elem = document.getElementById(itemid);
|
|
if (elem && typeof elem != 'undefined') {
|
|
elem.className = elem.className == class1 ? class2 : class1;
|
|
setCookie('flip_class_' + itemid, elem.className);
|
|
}
|
|
}
|
|
|
|
function tikitabs( focus, tabElement) {
|
|
var container, ofocus = focus;
|
|
if (typeof tabElement === "undefined") {
|
|
container = $(".tabset:first");
|
|
} else {
|
|
container = $(tabElement).parents(".tabset:first");
|
|
}
|
|
|
|
if (focus > $("> .tabs .tabmark", container).length) {
|
|
focus = 1; // limit to number of tabs - somehow getting set to 222 sometimes
|
|
}
|
|
|
|
while ($("> .tabs .tabmark.tab" + focus + ":first", container).is(":hidden")) {
|
|
focus++;
|
|
}
|
|
if ($("> .tabs .tabmark.tab" + focus + ":first", container).length === 0) {
|
|
focus = ofocus;
|
|
}
|
|
|
|
$("> .tabs .tabmark:not(.tab" + focus + ":first)", container).removeClass("tabactive"); // may need .addClass("tabinactive");
|
|
$("> .tabs .tabmark.tab" + focus + ":first", container).addClass("tabactive"); // and .removeClass("tabinactive");
|
|
$("> .tabcontent:not(.content" + focus + ":first)", container).hide();
|
|
$("> .tabcontent.content" + focus + ":first", container).show();
|
|
setCookie( $(".tabs:first", container).data("name"), focus, "tabs", "session");
|
|
|
|
}
|
|
|
|
/* foo: name of the menu
|
|
* def: menu type (e:extended, c:collapsed, f:fixed)
|
|
* the menu is collapsed function of its cookie: if no cookie is set, the def is used
|
|
*/
|
|
function setfolderstate(foo, def, img, status) {
|
|
if (!status) {
|
|
status = getCookie(foo, "menu", "o");
|
|
}
|
|
if (!img) {
|
|
if (document.getElementsByName('icn' + foo)[0].src.search(/[\\\/]/)) {
|
|
img = document.getElementsByName('icn' + foo)[0].src.replace(/.*[\\\/]([^\\\/]*)$/, "$1");
|
|
} else {
|
|
img = 'folder.png';
|
|
}
|
|
}
|
|
var src = img; // default
|
|
if (status == 'c') {
|
|
hide(foo, false, "menu");
|
|
} else {
|
|
show(foo, false, "menu");
|
|
}
|
|
if (status == 'c' && def != 'd') { /* need to change the open icon to a close one*/
|
|
src = src.replace(/^o/, '');
|
|
} else if (status != 'c' && def == 'd' && src.indexOf('o') !== 0) { /* need to change the close icon to an open one */
|
|
src = 'o' + img;
|
|
}
|
|
document.getElementsByName('icn' + foo)[0].src = document.getElementsByName('icn' + foo)[0].src.replace(/[^\\\/]*$/, src);
|
|
}
|
|
|
|
function setheadingstate(foo) {
|
|
var status = getCookie(foo, "showhide_headings");
|
|
var $foo = $("#" + foo);
|
|
if (status == "o") {
|
|
$foo.show();
|
|
collapseSign("flipper" + foo);
|
|
} else if (status == "c") {
|
|
$foo.hide();
|
|
expandSign("flipper" + foo);
|
|
}
|
|
}
|
|
|
|
function setsectionstate(foo, def, img, status) {
|
|
var src;
|
|
if (!status) {
|
|
status = getCookie(foo, "menu", "o");
|
|
}
|
|
if (status == "o") {
|
|
show(foo);
|
|
if (img) { src = "o" + img; }
|
|
} else if (status != "c" && def != 'd') {
|
|
show(foo);
|
|
if (img) { src = "o" + img; }
|
|
} else /* if (status == "c") */ {
|
|
hide(foo);
|
|
if (img) { src = img; }
|
|
}
|
|
if (img && document.getElementsByName('icn' + foo).length) {
|
|
document.getElementsByName('icn' + foo)[0].src = document.getElementsByName('icn' + foo)[0].src.replace(/[^\\\/]*$/, src);
|
|
}
|
|
}
|
|
|
|
function icntoggle(foo, img) {
|
|
var $icn = $("#icn" + foo);
|
|
var src = $icn.attr("src");
|
|
if (!src) {
|
|
src = "";
|
|
}
|
|
if (!img) {
|
|
if (src.search(/[\\\/]/)) {
|
|
img = src.replace(/.*[\\\/]([^\\\/]*)$/, "$1");
|
|
} else {
|
|
img = 'folder.png';
|
|
}
|
|
}
|
|
if ($("#" + foo + ":hidden").length) {
|
|
show(foo, true, "menu");
|
|
$icn.attr("src", src.replace(/[^\\\/]*$/, 'o' + img));
|
|
|
|
} else {
|
|
hide(foo, true, "menu");
|
|
img = img.replace(/(^|\/|\\)o(.*)$/, '$1$2');
|
|
$icn.attr("src", src.replace(/[^\\\/]*$/, img));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* New version of icntoggle function above to better deal with iconsets
|
|
* Different than the above function, both versions of the icon are included in the template with one hidden
|
|
* @param foo
|
|
* @param clicked
|
|
*/
|
|
|
|
function icontoggle(foo, clicked) {
|
|
//expand or collapse
|
|
if ($("#" + foo + ":hidden").length) {
|
|
show(foo, true, "menu");
|
|
} else {
|
|
hide(foo, true, "menu");
|
|
}
|
|
//toggle icon display
|
|
var id = clicked.id;
|
|
$('#' + id + ' .toggle-open').toggle();
|
|
$('#' + id + ' .toggle-closed').toggle();
|
|
return false;
|
|
}
|
|
|
|
|
|
//Initialize a cross-browser XMLHttpRequest object.
|
|
//The object return has to be sent using send(). More parameters can be
|
|
//given.
|
|
//callback - The function that will be called when the response arrives
|
|
//First parameter will be the status
|
|
//(HTTP Response Code [200,403, 404, ...])
|
|
//method - GET or POST
|
|
//url - The URL to open
|
|
function getHttpRequest( method, url, async )
|
|
{
|
|
if ( async === undefined ) {
|
|
async = false;
|
|
}
|
|
var request;
|
|
|
|
if ( window.XMLHttpRequest ) {
|
|
request = new XMLHttpRequest();
|
|
} else if ( window.ActiveXObject )
|
|
{
|
|
try
|
|
{
|
|
request = new ActiveXObject( "Microsoft.XMLHTTP" );
|
|
}
|
|
catch( ex )
|
|
{
|
|
request = new ActiveXObject("MSXML2.XMLHTTP");
|
|
}
|
|
}
|
|
else {
|
|
return false;
|
|
}
|
|
if ( !request ) {
|
|
return false;
|
|
}
|
|
request.open( method, url, async );
|
|
|
|
return request;
|
|
}
|
|
|
|
//name - name of the cookie
|
|
//value - value of the cookie
|
|
// [expires] - expiration date of the cookie (defaults to end of current session)
|
|
// [path] - path for which the cookie is valid (defaults to path of calling document)
|
|
// [domain] - domain for which the cookie is valid (defaults to domain of calling document)
|
|
// [secure] - Boolean value indicating if the cookie transmission requires a secure transmission
|
|
//* an argument defaults when it is assigned null as a placeholder
|
|
//* a null placeholder is not required for trailing omitted arguments
|
|
function setSessionVar(name,value) {
|
|
var request = getHttpRequest( "GET", "tiki-cookie-jar.php?" + name + "=" + tiki_encodeURIComponent(value));
|
|
request.send('');
|
|
|
|
if (tiki_cookie_jar) {
|
|
tiki_cookie_jar[name] = value;
|
|
}
|
|
}
|
|
|
|
function setCookie(name, value, section, expires, path, domain, secure) {
|
|
if (getCookie(name, section) == value) {
|
|
return true;
|
|
}
|
|
if (!expires) {
|
|
expires = new Date();
|
|
expires.setFullYear(expires.getFullYear() + 1);
|
|
}
|
|
if (expires === "session") {
|
|
expires = "";
|
|
}
|
|
if (typeof jqueryTiki != "undefined" && jqueryTiki.no_cookie) {
|
|
var request = getHttpRequest( "GET", "tiki-cookie-jar.php?" + name + "=" + encodeURIComponent( value ) );
|
|
try {
|
|
request.send('');
|
|
// alert("XMLHTTP/set"+request.readyState+request.responseText);
|
|
tiki_cookie_jar[name] = value;
|
|
return true;
|
|
}
|
|
catch( ex ) {
|
|
setCookieBrowser(name, value, section, expires, path, domain, secure);
|
|
return false;
|
|
}
|
|
}
|
|
else {
|
|
setCookieBrowser(name, value, section, expires, path, domain, secure);
|
|
return true;
|
|
}
|
|
}
|
|
function setCookieBrowser(name, value, section, expires, path, domain, secure) {
|
|
if (section) {
|
|
var valSection = getCookie(section);
|
|
var name2 = "@" + name + ":";
|
|
if (valSection) {
|
|
if (new RegExp(name2).test(valSection)) {
|
|
valSection = valSection.replace(new RegExp(name2 + "[^@;]*"), name2 + value);
|
|
} else {
|
|
valSection = valSection + name2 + value;
|
|
}
|
|
setCookieBrowser(section, valSection, null, expires, path, domain, secure);
|
|
}
|
|
else {
|
|
valSection = name2+value;
|
|
setCookieBrowser(section, valSection, null, expires, path, domain, secure);
|
|
}
|
|
|
|
}
|
|
else {
|
|
var curCookie = name + "=" + encodeURIComponent(value) + ((expires) ? "; expires=" + expires.toGMTString() : "")
|
|
+ ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + ((secure) ? "; secure" : "");
|
|
document.cookie = curCookie;
|
|
}
|
|
}
|
|
|
|
//name - name of the desired cookie
|
|
//section - name of group of cookies or null
|
|
// * return string containing value of specified cookie or null if cookie does not exist
|
|
function getCookie(name, section, defval) {
|
|
if ( typeof jqueryTiki != "undefined" && jqueryTiki.no_cookie && (window.XMLHttpRequest || window.ActiveXObject) && typeof tiki_cookie_jar != "undefined" && tiki_cookie_jar.length > 0) {
|
|
if (typeof tiki_cookie_jar[name] == "undefined") {
|
|
return defval;
|
|
}
|
|
return tiki_cookie_jar[name];
|
|
}
|
|
else {
|
|
return getCookieBrowser(name, section, defval);
|
|
}
|
|
}
|
|
function getCookieBrowser(name, section, defval) {
|
|
if (typeof defval === "undefined") { defval = null; }
|
|
if (section) {
|
|
var valSection = getCookieBrowser(section);
|
|
if (valSection) {
|
|
var name2 = "@"+name+":";
|
|
var val = valSection.match(new RegExp(name2 + "([^@;]*)"));
|
|
if (val) {
|
|
return decodeURIComponent(val[1]);
|
|
} else {
|
|
return defval;
|
|
}
|
|
} else {
|
|
return defval;
|
|
}
|
|
} else {
|
|
var dc = document.cookie;
|
|
|
|
var prefix = name + "=";
|
|
var begin = dc.indexOf("; " + prefix);
|
|
|
|
if (begin == -1) {
|
|
begin = dc.indexOf(prefix);
|
|
|
|
if (begin !== 0) {
|
|
return defval;
|
|
}
|
|
} else { begin += 2; }
|
|
|
|
var end = document.cookie.indexOf(";", begin);
|
|
|
|
if (end == -1) {
|
|
end = dc.length;
|
|
}
|
|
return decodeURIComponent(dc.substring(begin + prefix.length, end));
|
|
}
|
|
}
|
|
|
|
//name - name of the cookie
|
|
//[path] - path of the cookie (must be same as path used to create cookie)
|
|
// [domain] - domain of the cookie (must be same as domain used to create cookie)
|
|
// * path and domain default if assigned null or omitted if no explicit argument proceeds
|
|
function deleteCookie(name, section, expires, path, domain, secure) {
|
|
if (section) {
|
|
var valSection = getCookieBrowser(section);
|
|
var name2 = "@" + name + ":";
|
|
if (valSection) {
|
|
if (new RegExp(name2).test(valSection)) {
|
|
valSection = valSection.replace(new RegExp(name2 + "[^@;]*"), "");
|
|
setCookieBrowser(section, valSection, null, expires, path, domain, secure);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
|
|
// if ( !setCookie( name, '', 0, path, domain ) ) {
|
|
// if (getCookie(name)) {
|
|
document.cookie = name + "="
|
|
+ ((path) ? "; path=" + path : "") + ((domain) ? "; domain=" + domain : "") + "; expires=Thu, 01-Jan-70 00:00:01 GMT";
|
|
// }
|
|
}
|
|
}
|
|
|
|
//date - any instance of the Date object
|
|
//* hand all instances of the Date object to this function for "repairs"
|
|
function fixDate(date) {
|
|
var base = new Date(0);
|
|
|
|
var skew = base.getTime();
|
|
|
|
if (skew > 0) {
|
|
date.setTime(date.getTime() - skew);
|
|
}
|
|
}
|
|
|
|
|
|
//Expand/collapse lists
|
|
|
|
function flipWithSign(foo) {
|
|
if (document.getElementById(foo).style.display == "none") {
|
|
show(foo, true, "showhide_headings");
|
|
collapseSign("flipper" + foo);
|
|
} else {
|
|
hide(foo, true, "showhide_headings");
|
|
expandSign("flipper" + foo);
|
|
}
|
|
}
|
|
|
|
//set the state of a flipped entry after page reload
|
|
function setFlipWithSign(foo) {
|
|
if (getCookie(foo, "showhide_headings", "o") == "o") {
|
|
collapseSign("flipper" + foo);
|
|
|
|
show(foo);
|
|
} else {
|
|
expandSign("flipper" + foo);
|
|
|
|
hide(foo);
|
|
}
|
|
}
|
|
|
|
function expandSign(foo) {
|
|
if (document.getElementById(foo)) {
|
|
document.getElementById(foo).firstChild.nodeValue = "[+]";
|
|
}
|
|
}
|
|
|
|
function collapseSign(foo) {
|
|
if (document.getElementById(foo)) {
|
|
document.getElementById(foo).firstChild.nodeValue = "[-]";
|
|
}
|
|
} // flipWithSign()
|
|
|
|
// Set client timezone
|
|
// moved to lib/setup/javascript.php
|
|
|
|
//function added for use in navigation dropdown
|
|
//example :
|
|
//<select name="anything" onchange="go(this);">
|
|
//<option value="http://tiki.org">tiki.org</option>
|
|
//</select>
|
|
function go(o) {
|
|
if (o.options[o.selectedIndex].value !== "") {
|
|
location.replace(o.options[o.selectedIndex].value);
|
|
|
|
o.options[o.selectedIndex] = 1;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//function: targetBlank
|
|
//desc: opens a new window, XHTML-compliant replacement of the "TARGET" tag
|
|
//added by: Ralf Lueders (lueders@lrconsult.com)
|
|
//date: Sep 7, 2003
|
|
//params: url: the url for the new window
|
|
//mode='nw': new, full-featured browser window
|
|
//mode='popup': new windows, no features & buttons
|
|
|
|
function targetBlank(url,mode) {
|
|
var features = 'menubar=yes,toolbar=yes,location=yes,directories=yes,fullscreen=no,titlebar=yes,hotkeys=yes,status=yes,scrollbars=yes,resizable=yes';
|
|
switch (mode) {
|
|
// new full-equipped browser window
|
|
case 'nw':
|
|
break;
|
|
// new popup-window
|
|
case 'popup':
|
|
features = 'menubar=no,toolbar=no,location=no,directories=no,fullscreen=no,titlebar=no,hotkeys=no,status=no,scrollbars=yes,resizable=yes';
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
window.open(url,'_blank',features);
|
|
}
|
|
|
|
//function: confirmTheLink
|
|
//desc: pop up a dialog box to confirm the action
|
|
//added by: Franck Martin
|
|
//date: Oct 12, 2003
|
|
//params: theLink: The link where it is called from
|
|
//params: theMsg: The message to display
|
|
function confirmTheLink(theLink, theMsg)
|
|
{
|
|
// Confirmation is not required if browser is Opera (crappy js implementation)
|
|
if (typeof(window.opera) != 'undefined') {
|
|
return true;
|
|
}
|
|
|
|
var is_confirmed = confirm(theMsg);
|
|
// if (is_confirmed) {
|
|
// theLink.href += '&is_js_confirmed=1';
|
|
// }
|
|
|
|
return is_confirmed;
|
|
}
|
|
|
|
/** \brief: insert img tag in textarea
|
|
*
|
|
*/
|
|
function insertImgFile(elementId, fileId, oldfileId,type,page,attach_comment) {
|
|
var textarea = $('#' + elementId)[0];
|
|
var fileup = $('input[name=' + fileId + ']')[0];
|
|
var oldfile = $('input[name=' + oldfileId + ']')[0];
|
|
var prefixEl = $('input[name=prefix]')[0];
|
|
var prefix = "img/wiki_up/";
|
|
|
|
if (!textarea || ! fileup) {
|
|
return;
|
|
}
|
|
if ( prefixEl) { prefix= prefixEl.value; }
|
|
|
|
var filename = fileup.value, dirs, str;
|
|
var oldfilename = oldfile.value;
|
|
|
|
if (filename == oldfilename || filename === "" ) { // insert only if name really changed
|
|
return;
|
|
}
|
|
oldfile.value = filename;
|
|
|
|
if (filename.indexOf("/")>=0) { // unix
|
|
dirs = filename.split("/");
|
|
filename = dirs[dirs.length-1];
|
|
}
|
|
if (filename.indexOf("\\")>=0) { // dos
|
|
dirs = filename.split("\\");
|
|
filename = dirs[dirs.length-1];
|
|
}
|
|
if (filename.indexOf(":")>=0) { // mac
|
|
dirs = filename.split(":");
|
|
filename = dirs[dirs.length-1];
|
|
}
|
|
// @todo - here's a hack: we know its ending up in img/wiki_up.
|
|
// replace with dyn. variable once in a while to respect the tikidomain
|
|
if (type == "file") {
|
|
str = "{file name=\""+filename + "\"";
|
|
var desc = $('#' + attach_comment).val();
|
|
if (desc) {
|
|
str = str + " desc=\"" + desc + "\"";
|
|
}
|
|
str = str + "}";
|
|
} else {
|
|
str = "{img src=\"img/wiki_up/" + filename + "\" }\n";
|
|
}
|
|
insertAt(elementId, str);
|
|
}
|
|
|
|
/* add new upload image form in page edition */
|
|
var img_form_count = 2, needToConfirm = false;
|
|
function addImgForm() {
|
|
var new_text = document.createElement('span');
|
|
new_text.setAttribute('id','picfile' + img_form_count);
|
|
new_text.innerHTML = '<input name=\'picfile' + img_form_count + '\' type=\'file\' onchange=\'insertImgFile("editwiki","picfile' + img_form_count + '","hasAlreadyInserted","img")\'/><br />';
|
|
document.getElementById('new_img_form').appendChild(new_text);
|
|
needToConfirm = true;
|
|
img_form_count ++;
|
|
}
|
|
|
|
browser();
|
|
|
|
//This was added to allow wiki3d to change url on tiki's window
|
|
window.name = 'tiki';
|
|
|
|
var fgals_window = null;
|
|
|
|
function openFgalsWindow(filegal_manager_url, reload) {
|
|
if (fgals_window && typeof fgals_window.document != "undefined" && !fgals_window.closed) {
|
|
if (reload) {
|
|
fgals_window.location.replace(filegal_manager_url);
|
|
}
|
|
fgals_window.focus();
|
|
} else {
|
|
fgals_window=window.open(filegal_manager_url,'_blank','menubar=1,scrollbars=1,resizable=1,height=500,width=800,left=50,top=50');
|
|
}
|
|
$(window).on("unload", function(){ // tidy
|
|
fgals_window.close();
|
|
});
|
|
}
|
|
|
|
/* Count the number of words (spearated with space) */
|
|
function wordCount(maxSize, source, cpt, message) {
|
|
var formcontent = source.value;
|
|
var str = formcontent.replace(/^\s+|\s+$/g, '') ;
|
|
formcontent = str.split(/[^\S]+/);
|
|
if (maxSize > 0 && formcontent.length > maxSize) {
|
|
alert(message);
|
|
source.value = source.value.substr(0, source.value.length-1);
|
|
} else {
|
|
document.getElementById(cpt).value = formcontent.length;
|
|
}
|
|
}
|
|
function charCount(maxSize, source, cpt, message) {
|
|
var formcontent = source.value.replace(/(\r\n|\n|\r)/g, ' ');
|
|
if (maxSize > 0 && formcontent.length > maxSize) {
|
|
alert(message);
|
|
source.value = source.value.substr(0, maxSize);
|
|
} else {
|
|
document.getElementById(cpt).value = formcontent.length;
|
|
}
|
|
}
|
|
|
|
//Password strength
|
|
//Based from code by:
|
|
//Matthew R. Miller - 2007
|
|
//www.codeandcoffee.com
|
|
//originally released as "free software license"
|
|
|
|
/*
|
|
* Password Strength Algorithm:
|
|
*
|
|
* Password Length: 5 Points: Less than 4 characters 10 Points: 5 to 7
|
|
* characters 25 Points: 8 or more
|
|
*
|
|
* Letters: 0 Points: No letters 10 Points: Letters are all lower case 20
|
|
* Points: Letters are upper case and lower case
|
|
*
|
|
* Numbers: 0 Points: No numbers 10 Points: 1 number 20 Points: 3 or more
|
|
* numbers
|
|
*
|
|
* Characters: 0 Points: No characters 10 Points: 1 character 25 Points: More
|
|
* than 1 character
|
|
*
|
|
* Bonus: 2 Points: Letters and numbers 3 Points: Letters, numbers, and
|
|
* characters 5 Points: Mixed case letters, numbers, and characters
|
|
*
|
|
* Password Text Range: >= 90: Very Secure >= 80: Secure >= 70: Very Strong >=
|
|
* 60: Strong >= 50: Average >= 25: Weak >= 0: Very Weak
|
|
*
|
|
*/
|
|
|
|
|
|
//Settings
|
|
// -- Toggle to true or false, if you want to change what is checked in the password
|
|
var m_strUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
|
var m_strLowerCase = "abcdefghijklmnopqrstuvwxyz";
|
|
var m_strNumber = "0123456789";
|
|
var m_strCharacters = "!@#$%^&*?_~";
|
|
|
|
//Check password
|
|
function checkPassword(strPassword)
|
|
{
|
|
// Reset combination count
|
|
var nScore = 0;
|
|
|
|
// Password length
|
|
// -- Less than 4 characters
|
|
if (strPassword.length < 5)
|
|
{
|
|
nScore += 5;
|
|
}
|
|
// -- 5 to 7 characters
|
|
else if (strPassword.length > 4 && strPassword.length < 8)
|
|
{
|
|
nScore += 10;
|
|
}
|
|
// -- 8 or more
|
|
else if (strPassword.length > 7)
|
|
{
|
|
nScore += 25;
|
|
}
|
|
|
|
// Letters
|
|
var nUpperCount = countContain(strPassword, m_strUpperCase);
|
|
var nLowerCount = countContain(strPassword, m_strLowerCase);
|
|
var nLowerUpperCount = nUpperCount + nLowerCount;
|
|
// -- Letters are all lower case
|
|
if (nUpperCount === 0 && nLowerCount !== 0)
|
|
{
|
|
nScore += 10;
|
|
}
|
|
// -- Letters are upper case and lower case
|
|
else if (nUpperCount !== 0 && nLowerCount !== 0)
|
|
{
|
|
nScore += 20;
|
|
}
|
|
|
|
// Numbers
|
|
var nNumberCount = countContain(strPassword, m_strNumber);
|
|
// -- 1 number
|
|
if (nNumberCount == 1)
|
|
{
|
|
nScore += 10;
|
|
}
|
|
// -- 3 or more numbers
|
|
if (nNumberCount >= 3)
|
|
{
|
|
nScore += 20;
|
|
}
|
|
|
|
// Characters
|
|
var nCharacterCount = countContain(strPassword, m_strCharacters);
|
|
// -- 1 character
|
|
if (nCharacterCount == 1)
|
|
{
|
|
nScore += 10;
|
|
}
|
|
// -- More than 1 character
|
|
if (nCharacterCount > 1)
|
|
{
|
|
nScore += 25;
|
|
}
|
|
|
|
// Bonus
|
|
// -- Letters and numbers
|
|
if (nNumberCount !== 0 && nLowerUpperCount !== 0)
|
|
{
|
|
nScore += 2;
|
|
}
|
|
// -- Letters, numbers, and characters
|
|
if (nNumberCount !== 0 && nLowerUpperCount !== 0 && nCharacterCount !== 0)
|
|
{
|
|
nScore += 3;
|
|
}
|
|
// -- Mixed case letters, numbers, and characters
|
|
if (nNumberCount !== 0 && nUpperCount !== 0 && nLowerCount !== 0 && nCharacterCount !== 0)
|
|
{
|
|
nScore += 5;
|
|
}
|
|
|
|
|
|
return nScore;
|
|
}
|
|
|
|
//Runs password through check and then updates GUI
|
|
function runPassword(strPassword, strFieldID)
|
|
{
|
|
// Get controls
|
|
var ctlBar = document.getElementById(strFieldID + "_bar");
|
|
var ctlText = document.getElementById(strFieldID + "_text");
|
|
var ctlTextInner = document.getElementById(strFieldID + "_text_inner");
|
|
if (!ctlBar || !ctlText || !ctlTextInner) {
|
|
return;
|
|
}
|
|
if (strPassword.length > 0) {
|
|
// Check password
|
|
var nScore = checkPassword(strPassword);
|
|
|
|
// Set new width
|
|
ctlBar.style.width = nScore + "%";
|
|
|
|
// Color and text
|
|
var icon, strText, strColor;
|
|
// -- Very Secure
|
|
if (nScore >= 90)
|
|
{
|
|
icon = 'ok';
|
|
strText = tr("Very Secure");
|
|
strColor = "#0ca908";
|
|
}
|
|
// -- Secure
|
|
else if (nScore >= 80)
|
|
{
|
|
icon = 'ok';
|
|
strText = tr("Secure");
|
|
strColor = "#0ca908";
|
|
}
|
|
// -- Very Strong
|
|
else if (nScore >= 70)
|
|
{
|
|
icon = 'ok';
|
|
strText = tr("Very Strong");
|
|
strColor = "#0ca908";
|
|
}
|
|
// -- Strong
|
|
else if (nScore >= 60)
|
|
{
|
|
icon = 'ok';
|
|
strText = tr("Strong");
|
|
strColor = "#0ca908";
|
|
}
|
|
// -- Average
|
|
else if (nScore >= 40)
|
|
{
|
|
icon = 'none';
|
|
strText = tr("Average");
|
|
strColor = "#e3cb00";
|
|
}
|
|
// -- Weak
|
|
else if (nScore >= 25)
|
|
{
|
|
icon = 'error';
|
|
strText = tr("Weak");
|
|
strColor = "#ff0000";
|
|
}
|
|
// -- Very Weak
|
|
else
|
|
{
|
|
icon = 'error';
|
|
strText = tr("Very Weak");
|
|
strColor = "#ff0000";
|
|
}
|
|
ctlBar.style.backgroundColor = strColor;
|
|
$(ctlBar).show();
|
|
if (icon === 'none') {
|
|
$(ctlText).children('span.icon').hide();
|
|
} else if (icon === 'ok') {
|
|
$(ctlText).children('span.icon-ok').css('color', strColor).show();
|
|
$(ctlText).children('span.icon-error').hide();
|
|
} else if (icon === 'error') {
|
|
$(ctlText).children('span.icon-ok').hide();
|
|
$(ctlText).children('span.icon-error').css('color', strColor).show();
|
|
}
|
|
$(ctlTextInner).text(tr('Strength') + ': ' + strText).show();
|
|
} else {
|
|
$(ctlText).children().hide();
|
|
$(ctlTextInner).hide();
|
|
$(ctlBar).hide();
|
|
}
|
|
}
|
|
|
|
//Checks a string for a list of characters
|
|
function countContain(strPassword, strCheck)
|
|
{
|
|
// Declare variables
|
|
var nCount = 0, i;
|
|
|
|
for (i = 0; i < strPassword.length; i++)
|
|
{
|
|
if (strCheck.indexOf(strPassword.charAt(i)) > -1)
|
|
{
|
|
nCount++;
|
|
}
|
|
}
|
|
|
|
return nCount;
|
|
}
|
|
|
|
function checkPasswordsMatch(in1, in2, el) {
|
|
if ($(in1).val().length) {
|
|
if ($(in1).val() == $(in2).val()) {
|
|
$(el).children('#match').show();
|
|
$(el).children('#nomatch').hide();
|
|
return true;
|
|
} else {
|
|
$(el).children('#match').hide();
|
|
$(el).children('#nomatch').show();
|
|
return false;
|
|
}
|
|
} else {
|
|
$(el).children().hide();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds an Option to the quickpoll section.
|
|
*/
|
|
function pollsAddOption()
|
|
{
|
|
var newOption = $( '<input />')
|
|
.attr('type', 'text')
|
|
.attr('name', 'options[]')
|
|
.attr('placeholder', tr('New option'))
|
|
.addClass('form-control');
|
|
$('#tikiPollsOptions').append($('<div class="mb-2"></div>').append(newOption));
|
|
}
|
|
|
|
/**
|
|
* toggles the quickpoll section
|
|
*/
|
|
function pollsToggleQuickOptions()
|
|
{
|
|
$( '#tikiPollsQuickOptions' ).toggle(function () {
|
|
var display = $( '#tikiPollsQuickOptions' ).css('display');
|
|
if (display === 'none') {
|
|
$('#tikiPollsOptionsButton').text(tr('Show Options'));
|
|
} else {
|
|
$('#tikiPollsOptionsButton').text(tr('Hide Options'));
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* toggles div for droplist with Disabled option
|
|
*/
|
|
|
|
function hidedisabled(divid,value) {
|
|
if (value=='disabled') {
|
|
document.getElementById(divid).style.display = 'none';
|
|
} else {
|
|
document.getElementById(divid).style.display = 'block';
|
|
}
|
|
}
|
|
|
|
/* for filegals */
|
|
// Uniformize thumbnail size. Uses non-standard element.offsetHeight
|
|
function adjustThumbnails() {
|
|
var i,j,h = 0;
|
|
var t = document.getElementById("thumbnails").childNodes;
|
|
|
|
// Find maximum height
|
|
for ( i = 0; i < t.length; i++ ) {
|
|
if ( t[i].className == "thumbnailcontener" ) {
|
|
var t2 = t[i].childNodes;
|
|
for ( j = 0; j < t2.length; j++ ) {
|
|
if ( t2[j].className == "thumbnail" ) {
|
|
t2[j].style.height = "100%";
|
|
t2[j].style.overflow = "visible";
|
|
}
|
|
}
|
|
if ( t[i].offsetHeight >= h ) {
|
|
h = t[i].offsetHeight;
|
|
}
|
|
t[i].style.height = h+"px"; // Set height to maximum. Is that not redundant given the following loop? Chealer 20170911
|
|
}
|
|
}
|
|
|
|
// Set height to maximum
|
|
for ( i = 0; i < t.length; i++ ) {
|
|
if ( t[i].className == "thumbnailcontener" ) {
|
|
if ( t[i].offsetHeight <= h ) {
|
|
t[i].style.height = h+"px";
|
|
} else {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function open_webdav(url) {
|
|
// Works only in IE
|
|
if (typeof ActiveXObject != 'undefined') {
|
|
var EditDocumentButton = new ActiveXObject("SharePoint.OpenDocuments.1");
|
|
EditDocumentButton.EditDocument(url);
|
|
} else {
|
|
prompt(tr('URL to open this file with WebDAV'), url);
|
|
}
|
|
}
|
|
|
|
function ccsValueToInteger(str) {
|
|
var v = str.replace(/[^\d]*$/, "");
|
|
if (v) {
|
|
v = parseInt(v, 10);
|
|
}
|
|
if (isNaN(v)) {
|
|
return 0;
|
|
} else {
|
|
return v;
|
|
}
|
|
}
|
|
|
|
// function to allow multiselection in checkboxes
|
|
// must be called like this :
|
|
//
|
|
// <input type="checkbox" class="form-check-input" onclick="checkbox_list_check_all(form_name,[checkbox_name_1,checkbox_name2 ...],true|false);">
|
|
function checkbox_list_check_all(form,list,checking) {
|
|
for (var checkbox in list) {
|
|
document.forms[form].elements[list[checkbox]].checked=checking;
|
|
}
|
|
}
|
|
|
|
if (!window.syntaxHighlighter) {
|
|
window.syntaxHighlighter = {
|
|
get: function() {return null;}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Wrapper for javascript encodeURI
|
|
*/
|
|
function tiki_encodeURI(rawstr)
|
|
{
|
|
return encodeURI(rawstr);
|
|
}
|
|
|
|
/**
|
|
* Wrapper for javascript decodeURI
|
|
*/
|
|
function tiki_decodeURI(encstr)
|
|
{
|
|
return decodeURI(encstr.replace(/\+/g, " "));
|
|
}
|
|
|
|
/**
|
|
* Wrapper for javascript encodeURIComponent
|
|
*/
|
|
function tiki_encodeURIComponent(rawstr)
|
|
{
|
|
var str = encodeURIComponent(rawstr);
|
|
return str;
|
|
}
|
|
|
|
/**
|
|
* Wrapper for javascript decodeURIComponent
|
|
*/
|
|
function tiki_decodeURIComponent(encstr)
|
|
{
|
|
var str = decodeURIComponent(encstr.replace(/\+/g, " "));
|
|
return str;
|
|
}
|
|
|
|
//Date helpers for to and from unix times
|
|
Date.prototype.toUnix = function() {
|
|
return Math.round(this.getTime() / 1000.0);
|
|
};
|
|
|
|
var UnixDate = function(unixDate) {
|
|
return new Date(unixDate * 1000);
|
|
};
|
|
|
|
Date.parseUnix = function(date) {
|
|
date = new Date(Date.parse(date));
|
|
return date.toUnix();
|
|
};
|
|
|
|
/**
|
|
* Tracker rating field adjust after voing using ajax
|
|
* (when rendered in search results)
|
|
*
|
|
* @param element
|
|
* @param data array containing result
|
|
* 'my_rate',
|
|
* 'numvotes',
|
|
* 'voteavg',
|
|
* 'request_rate',
|
|
* 'value',
|
|
* 'mode',
|
|
* 'labels',
|
|
* 'rating_options'
|
|
* @param vote
|
|
*/
|
|
|
|
function adjustRating(element, data, vote) {
|
|
|
|
var $sibs, $help, $unvote;
|
|
|
|
if (vote === "NULL") { // unvote
|
|
$sibs = $("span > a", $(element).parent());
|
|
$help = $(element).prev().prev();
|
|
$unvote = $(element);
|
|
} else {
|
|
$sibs = $(element).siblings().addBack();
|
|
$help = $(element).parent().next();
|
|
$unvote = $help.nextAll("a");
|
|
}
|
|
|
|
for (var i = 0; i < $sibs.length; i++) {
|
|
var v = $($sibs[i]).data("vote"), icon = "";
|
|
|
|
if (v <= data[0].voteavg && data[0].numvotes > 0) {
|
|
if (data[0].result && data[0].my_rate == v) {
|
|
icon = 'star-selected';
|
|
} else {
|
|
icon = 'star';
|
|
}
|
|
} else if (v - data[0].voteavg <= 0.5 && data[0].numvotes > 0) {
|
|
if (data[0].result && data[0].my_rate == v) {
|
|
icon = 'star-half-selected';
|
|
} else {
|
|
icon = 'star-half-rating';
|
|
}
|
|
} else {
|
|
if (data[0].result && data[0].my_rate == v) {
|
|
icon = 'star-empty-selected';
|
|
} else {
|
|
icon = 'star-empty';
|
|
}
|
|
}
|
|
$($sibs[i]).find('.icon-' + icon).css('display', 'inline');
|
|
$($sibs[i]).find('.icon').not('.icon-' + icon).css('display', 'none');
|
|
}
|
|
|
|
var t = tr("Number of votes:") + " " + data[0].numvotes + ", " + tr("Average:") + " " + data[0].voteavg;
|
|
if (data[0].result) {
|
|
if (data[0].my_rate != "NULL") {
|
|
t = t + ", " + tr("Your rating:") + " " + data[0].my_rate;
|
|
$unvote.show();
|
|
} else {
|
|
$unvote.hide();
|
|
}
|
|
} else {
|
|
t = t + ", " + tr("Vote not accepted");
|
|
}
|
|
$help.text("(" + data[0].numvotes + ")")
|
|
.next().attr("title", t);
|
|
}
|
|
|
|
function sendVote(element, itemId, fieldId, vote) {
|
|
$(element).parent().tikiModal(" ");
|
|
$.getJSON(
|
|
$.service(
|
|
'tracker',
|
|
'vote',
|
|
{i:itemId,f:fieldId,v:vote}
|
|
), function(data){
|
|
$(element).parent().tikiModal();
|
|
adjustRating(element, data, vote);
|
|
}
|
|
);
|
|
}
|
|
|
|
/**
|
|
*
|
|
* @param str string Query or hash string to parse
|
|
* @returns object
|
|
*/
|
|
function parseQuery(str) {
|
|
var arr, pair, key, val, out = {}, b1, b2, key2;
|
|
|
|
if (str.substr(0, 1) === "?" || str.substr(0, 1) === "#") {
|
|
str = str.substr(1);
|
|
}
|
|
arr = str.split("&");
|
|
for (var i = 0; i < arr.length; i++) {
|
|
pair = arr[i].split("=");
|
|
key = tiki_decodeURIComponent(pair[0]);
|
|
val = pair.length > 1 ? tiki_decodeURIComponent(pair[1]) : "";
|
|
|
|
if ((b1 = key.indexOf("[")) > -1 && (b2 = key.substr(b1+1).indexOf("]")) > -1) {
|
|
key2 = key.substr(b1 + 1, b2);
|
|
key = key.substr(0, b1);
|
|
if (key2) {
|
|
if (typeof out[key] != "object") {
|
|
out[key] = {};
|
|
}
|
|
out[key][key2] = val;
|
|
} else {
|
|
if (typeof out[key] != "object") {
|
|
out[key] = [];
|
|
}
|
|
out[key].push(val);
|
|
}
|
|
} else {
|
|
out[key] = val;
|
|
}
|
|
}
|
|
return out;
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function(){
|
|
setTimeout(function(){
|
|
var progressBar = document.getElementById("progressBar");
|
|
|
|
if(progressBar) {
|
|
progressBar.remove();
|
|
}
|
|
}, 500);
|
|
});
|