// Useful vars var ie = document.all ? true : false; var moz = document.getElementById && !document.all; // Send forms virtually function post_to_url(path, params, method) { method = method || "post"; var form = document.createElement("form"); form.setAttribute("method", method); form.setAttribute("action", path); for(var key in params) { var hiddenField = document.createElement("input"); hiddenField.setAttribute("type", "hidden"); hiddenField.setAttribute("name", key); hiddenField.setAttribute("value", params[key]); form.appendChild(hiddenField); } document.body.appendChild(form); form.submit(); } // Text edit function addClass(base, newClass) { return findClass(base, newClass)? base : base+" "+newClass; } function removeClass(base, oldClass) { var classList = base.split(" "); var newBase = ""; for (var i = 0; i < classList.length; i++) { if (classList[i] == oldClass) { continue; } newBase += " "+classList[i]; } return newBase; } function findClass(base, myClass) { var classList = base.split(" "); var found = false; for (var i = 0; i < classList.length; i++) { if (classList[i] == myClass) { found = true; break; } } return found; } // Dom parsing function nextSibiling(elem) { do { elem = elem.nextSibling; } while (elem && elem.nodeType != 1); return elem; } function previousSibling(elem) { do { elem = elem.previousSibling; } while (elem && elem.nodeType != 1); return elem; } function firstChild(elem) { elem = elem.firstChild; while (elem && elem.nodeType != 1) { elem = elem.nextSibling; } return elem; } // Ajax functions function xmlhttpPost(strURL, queryString, okFunction) { var xmlHttpReq = false; var self = this; // Mozilla/Safari if (window.XMLHttpRequest) { self.xmlHttpReq = new XMLHttpRequest(); } // IE else if (window.ActiveXObject) { self.xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP"); } self.xmlHttpReq.open('POST', strURL, true); self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); if (okFunction) { self.xmlHttpReq.onreadystatechange = function() { if (self.xmlHttpReq.readyState == 4) { okFunction(self.xmlHttpReq.responseText); } } } self.xmlHttpReq.send(queryString); } // Admin functions function updateDBContent(id, content, field, target) { var el = document.getElementById(target+'-'+field+'-'+id); el.className = addClass(el.className, 'waiting'); el.className = removeClass(el.className, 'error'); param = "id="+escape(id)+"&"+field+"="+escape(content); xmlhttpPost('/action/update-'+target+'-'+field+'/', param, contentOk); } function contentOk(resp) { var result = resp.split(' '); if (result[0] == 'ok') { el = document.getElementById(result[1]); el.className = removeClass(el.className, 'waiting'); } else { el = document.getElementById(result[1]); el.className = removeClass(el.className, 'waiting'); el.className = addClass(el.className, 'error'); alert(resp); } } function createDBContent(param, target, callback) { var el = document.getElementById('new-'+target); el.className = addClass(el.className, 'waiting'); el.className = removeClass(el.className, 'error'); customFunction = function(resp) { callback(createOk(resp)); }; xmlhttpPost('/action/new-'+target+'/', param, customFunction); } function createOk(resp) { var result = resp.split(' '); var list = result[1].split('-'); var id = 0; if (result[0] == 'ok') { el = document.getElementById('new-'+list[0]); el.className = removeClass(el.className, 'waiting'); id = list[1]; } else { el = document.getElementById('new-'+list[0]); el.className = removeClass(el.className, 'waiting'); el.className = addClass(el.className, 'error'); alert(resp); } return id; } function deleteDBContent(id, target, callback) { var el = document.getElementById(target+'-'+id); el.className = addClass(el.className, 'waiting'); el.className = removeClass(el.className, 'error'); param = 'id='+id; customFunction = function(resp) { callback(deleteOk(resp)); }; xmlhttpPost('/action/delete-'+target+'/', param, customFunction); } function deleteOk(resp) { var result = resp.split(' '); var list = result[1].split('-'); id = list[1]; if (result[0] == 'ok') { el = document.getElementById(list[0]+'-'+id); el.className = removeClass(el.className, 'waiting'); } else { el = document.getElementById(list[0]+'-'+id); el.className = removeClass(el.className, 'waiting'); el.className = addClass(el.className, 'error'); alert(resp); } return id; } // DOM functions /* Developed by Robert Nyman, http://www.robertnyman.com Code/licensing: http://code.google.com/p/getelementsbyclassname/ */ function getElementsByClassName(className, tag, elm) { if (document.getElementsByClassName) { getElementsByClassName = function (className, tag, elm) { elm = elm || document; var elements = elm.getElementsByClassName(className), nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null, returnElements = [], current; for(var i=0, il=elements.length; i=0; i--) { if (elSel.options[i].selected) { return i; } } return -1; } function findValue(elSel, value) { for (var i = elSel.length - 1; i>=0; i--) { if (elSel.options[i].value == value) { return i; } } return -1; } function getSelected(elSel) { var i = findSelected(elSel); return i==-1? -1 : elSel.options[i].value; } function selectAllOptions(elSel) { for (var i = 0; i < elSel.options.length; i++) { elSel.options[i].selected = true; } } function splitEx(str, separator, num) { if (num == 'undefined') { num = 1000; } var ts = str.split(separator); var arr = new Array(); var glue = ''; var first = true; for (var i = 0; i < ts.length; i++) { if (i < num - 1) { arr.push(ts[i]); } else { if (first) { first = false; } else { glue += separator; } glue += ts[i]; } } if (!first) { arr.push(glue); } return arr; } function randomString() { return '' + new Date().getTime(); } // Base 64 encode and decode // From: http://ntt.cc/2008/01/19/base64-encoder-decoder-with-javascript.html var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "="; function encode64(input) { input = escape(input); var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return output; } function decode64(input) { var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = var base64test = /[^A-Za-z0-9\+\/\=]/g; if (base64test.exec(input)) { alert("There were invalid base64 characters in the input text.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/',and '='\n" + "Expect errors in decoding."); } input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return unescape(output); } /* Get explorer version */ function getInternetExplorerVersion() // Returns the version of Internet Explorer or a -1 // (indicating the use of another browser). { var rv = -1; // Return value assumes failure. if (navigator.appName == 'Microsoft Internet Explorer') { var ua = navigator.userAgent; var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); if (re.exec(ua) != null) rv = parseFloat( RegExp.$1 ); } return rv; } /****** Commmon functions *******/ // Non exportable functions function countParentFolders(path) { if (path == undefined || path == '') { return 0; } var parts = path.split('/'); return parts.length; } function getListDepth(list) { if (list == undefined) { return 0; } var cnt, max = 0; var all = list.getElementsByTagName('UL'); for (var i=0; i max) max = cnt; } var current = 0; if (max > 0) { while ((list = findParent(list.parentNode, 'LI')) != null) current++; } return max - current; } function getRoute(node) { if (!node) return ""; var type = splitEx(node.id, '-', 2); var folderName = type[1]; while ((node = findParent(node.parentNode, 'LI')) != null) { type = splitEx(node.id, '-', 2); if (type && type[0] == 'fid') folderName = type[1] + '/' + folderName; } return folderName; } function createBranchItem(name) { // BEWARE: Relation with "draw_bookmarks_tree" var spanItem = document.createElement('SPAN'); spanItem.setAttribute('class', 'name'); spanItem.innerHTML = name; var superSpanItem = document.createElement('SPAN'); superSpanItem.setAttribute('class', 'folderItem'); superSpanItem.appendChild(spanItem); superSpanItem.onclick = function() {return selectFolder(this);} superSpanItem.onmouseover = function() {return listbox.highlight(this, true);} superSpanItem.onmouseout = function() {return listbox.highlight(this, false);} context.contextize(superSpanItem, ['cmRemove', 'cmNewFolder', 'cmRename']); var ulItem = document.createElement('UL'); ulItem.setAttribute('class', 'bookmarks'); var divItem = document.createElement('DIV'); divItem.setAttribute('class', 'dragable'); divItem.appendChild(superSpanItem); divItem.appendChild(ulItem); var listItem = document.createElement('LI'); listItem.setAttribute('class', 'branch dropable'); listItem.setAttribute('id', 'fid-'+name); listItem.appendChild(divItem); return listItem; } function createLeafItem(cid, name, url) { // BEWARE: Relation with "draw_bookmarks_tree" var spanItem = document.createElement('SPAN'); spanItem.setAttribute('class', 'name'); spanItem.innerHTML = name; var imgItem = document.createElement('IMG'); imgItem.setAttribute('src', url); imgItem.setAttribute('alt', name); imgItem.setAttribute('title', name); imgItem.setAttribute('class', 'favicon'); var divItem = document.createElement('DIV'); divItem.setAttribute('class', 'dragable'); divItem.appendChild(imgItem); divItem.appendChild(spanItem); var listItem = document.createElement('LI'); listItem.setAttribute('class', 'leaf'); listItem.setAttribute('id', 'lid-'+cid); listItem.appendChild(divItem); return listItem; }