var dom = { elById : function(id) { return (typeof id != "string") ? id : (document["getElementById"] ? document.getElementById(id) : false ); }, elsByTag : function(t, p) { var p = p ? dom.elById(p) : document; return p["getElementsByTagName"] ? p.getElementsByTagName(t) : []; }, elByTag : function(t, p) { var els = dom.elsByTag(t, p); return els.length ? els[0] : 0; }, parentByTag : function(t, el) { var el = dom.elById(el); if (el.parentNode) { var p = el.parentNode; if (p.tagName.toLowerCase() == t) { return p; } return dom.parentByTag(t, p); } return 0; }, parentByClass : function(c, el) { var el = dom.elById(el); if (el.parentNode) { var p = el.parentNode; if (dom.hasClass(p, c)) { return p; } return dom.parentByClass(c, p); } return 0; }, elsByClass : function(c, p, t) { var els = t ? dom.elsByTag(t, p) : dom.elsByTag("*", p); var re = new RegExp("(^|\\s)" + c + "(\\s|$)"); var r = []; for (var i = 0, i_max = els.length; i < i_max; i++) { if (els[i].className && els[i].className.match(re)) { r[r.length] = els[i]; } } return r; }, elByClass : function(c, p, t) { var els = dom.elsByClass(c, p, t); return els.length ? els[0] : 0; }, hasClass : function(el, c) { var re = new RegExp("(^|\\s)" + c + "(\\s|$)"); return (el.className && el.className.match(re)) ? 1 : 0; }, addClass : function(el, c) { if (!dom.hasClass(el, c)) { el.className += el.className ? " " + c : c; } }, removeClass : function(el, c) { if (dom.hasClass(el, c)) { var re = new RegExp("(^|\\s)" + c + "(\\s|$)"); el.className = el.className.replace(re, '$1$2'); } }, elsByAttr : function(a_name, a, p) { var els = dom.elsByTag("*", p); var esc_a = a.replace(/([\.])/g, '\\$1'); var re = new RegExp("(^|\\s)" + esc_a + "(\\s|$)"); var r = []; var cur_a; for (var i = 0, i_max = els.length; i < i_max; i++) { if ((cur_a = els[i].getAttribute(a_name)) && cur_a.match(re)) { r[r.length] = els[i]; } } return r; }, elByAttr : function(a_name, a, p) { var els = dom.elsByAttr(t, p); return els.length ? els[0] : 0; }, elsByPath : function(path, p) { var p = p ? dom.elById(p) : document; var parts = path.split(" "); var part = parts.shift(); var rest = parts.join(" "); var m; var r = []; var sub_r; var els = []; if (m = part.match(/^[\.](.*)$/)) {/* .foo */ var els = dom.elsByClass(m[1], p); } else if (m = part.match(/^[\#](.*)$/)) {/* #foo */ var els = [dom.elById(m[1])]; } else if (m = part.match(/^([^\.]+)\.(.*)$/)) {/* foo.bar */ var els = dom.elsByClass(m[2], p, m[1]); } else {/* foo */ var els = dom.elsByTag(part, p); } if (rest) { for (var i = 0, i_max = els.length; i < i_max; i++) { r.append(dom.elsByPath(rest, els[i])); } } else { r = els; } return r; }, elByPath : function(path, p) { var els = dom.elsByPath(path, p); return els.length ? els[0] : 0; }, attrVal : function(el, a_name) { return(el && el["getAttribute"]) ? el.getAttribute(a_name) : false; }, setEl : function(id, val) { var el = dom.elById(id); if (el) el.innerHTML = val; }, appendEls : function(id, els) { var el = dom.elById(id); if (el) { for (var i = 0; i < els.length; i++) { el.appendChild((els[i].nodeType == 3) ? document.createTextNode(els[i].nodeValue) : els[i]); } } }, toggleEl : function(id) { var el = dom.elById(id); el.style.display = (el.style.display == "none") ? "" : "none"; window.focus(); }, removeEl : function(id) { var el = dom.elById(id); if (el) el.parentNode.removeChild(el); }, getId : function(el) { var el = dom.elById(el); if (!el) return 0; if (el.id) return el.id; if (!el.dom_id) { var pos = 0; if (p = el.parentNode) { var cn = p.childNodes; while (cn[pos] != el) { pos++; } } el.dom_id = p ? dom.getId(p) + '.' + pos : pos; } return el.dom_id; }, event_registry : {'count' : 0}, addEvent : function(el, e_type, fnc) { var el = dom.elById(el); if (!el || (typeof el != "object")) return 0; /* dom_id */ var dom_id = dom.getId(el); /* fnc key */ var fnc_key = escape(dom_id + e_type + fnc); /* already registered ? */ if (dom.event_registry[fnc_key]) { if (dom.event_registry[fnc_key]["el"] == el) return 1; /* el changed, unregister */ dom.removeEvent(el, e_type, fnc); } /* register */ dom.event_registry[fnc_key] = { "el" : el, "e_type" : e_type, "fnc" : fnc }; dom.event_registry.count++; /* add handler */ if (el.addEventListener) el.addEventListener(e_type, fnc, false); else if (el.attachEvent) el.attachEvent('on' + e_type, fnc); else { var cur_fnc = el['on' + e_type]; el['on' + e_type] = (typeof old_fnc == 'function') ? function() { cur_fnc(); fnc();} : fnc; } }, removeEvent : function(el, e_type, fnc) { var el = dom.elById(el); if (!el || (typeof el != "object")) return 0; var dom_id = dom.getId(el); var fnc_key = escape(dom_id + e_type + fnc); if (!dom.event_registry[fnc_key]) return 0; var old_el = dom.event_registry[fnc_key]["el"]; var old_fnc = dom.event_registry[fnc_key]["fnc"]; if (old_el['removeEventListener']) { try { old_el.removeEventListener(e_type, old_fnc, false); } catch (e) {}; } else if (old_el['detachEvent']) { try { old_el.detachEvent('on' + e_type, old_fnc); } catch (e) {}; } else try { old_el['on' + e_type] = null; } catch (e) {}; dom.event_registry.fnc_key = null; dom.event_registry.count--; }, cancelEvent : function(e) { if (e.preventDefault) { e.preventDefault(); e.stopPropagation(); } else { e.cancelBubble = true; e.returnValue = false; } }, fireEvent: function(el, e_type){ var el = dom.elById(el); if (document['createEventObject']) {/* ie */ var e = document.createEventObject(); return el.fireEvent('on' + e_type, e); } if (document['createEvent']) { var e = document.createEvent("Events"); e.initEvent(e_type, true, true);/* bubble, allow_cancel */ return el.dispatchEvent(e); } }, getEventPos : function(event) { var x, y; try { x = (event && event.pageX) ? event.pageX : ((event && event.x) ? event.x : 0); y = (event && event.pageY) ? event.pageY : ((event && event.y) ? event.y : 0); var ua = navigator.userAgent.toLowerCase(); if(document.body && document.body.scrollTop && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ y += document.body.scrollTop; } else if(document.documentElement && document.documentElement.scrollTop && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ y += document.documentElement.scrollTop; } } catch(e){} return {'x' : x, 'y' : y}; }, elPos : function(el) { var el = dom.elById(el); var r = {'x' : el.offsetLeft - el.scrollLeft, 'y' : el.offsetTop - el.scrollTop }; if (el.offsetParent) { var sub_r = dom.elPos(el.offsetParent); r = { 'x' : r.x + sub_r.x, 'y' : r.y + sub_r.y }; } return r; }, setPos: function(el, pos, y) { var pos = y ? {'x': pos, 'y': y} : pos; el.style.top = pos.y + 'px'; el.style.left = pos.x + 'px'; }, elDim: function(el) { return {'w': el.offsetWidth, 'h': el.offsetHeight}; }, setDim: function(el, dim, h) { var dim = h ? {'w': dim, 'h': h} : dim; el.style.width = dim.w + 'px'; el.style.height = dim.h + 'px'; }, winHeight : function() { var ua = navigator.userAgent.toLowerCase(); if(document.body && document.body.clientHeight && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ return parseInt(document.body.clientHeight); } else if(document.documentElement && document.documentElement.clientHeight && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ return parseInt(document.documentElement.clientHeight); } return parseInt(window.innerHeight); }, winWidth : function() { var ua = navigator.userAgent.toLowerCase(); if(document.body && document.body.clientWidth && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ return parseInt(document.body.clientWidth); } else if(document.documentElement && document.documentElement.clientWidth && (ua.indexOf("msie") != -1) && (ua.indexOf("opera")==-1)){ return parseInt(document.documentElement.clientWidth); } return parseInt(window.innerWidth); } }; if (!window.trice_libs) {trice_libs = {};} trice_libs["ajax"] = { run : function() { ajax.activateLinks(); ajax.activateForms(); } } var ajax = { activateLinks : function() { var els = dom.elsByPath('a.ajax'); for (var i in els) { ajax.activateLink(els[i]); } }, activateLink : function(el) { if (!el['href']) return 0; if (!el.href.match(/^([^\$]*)\$[^\?]+(\?.*)?$/)) return 0; if (el.ajax_href) return 0; el.ajax_href = el.href; el.href = el.href.replace(/^([^\$]*)\$[^\?]+(\?.*)?$/, '$1$2'); dom.addEvent(el, 'click', function(e){dom.cancelEvent(e); ajax.callLink(el);}); }, /* */ activateForms : function() { var els = dom.elsByPath('form.ajax'); for (var i in els) { ajax.activateForm(els[i]); } }, activateForm : function(el) { var href = el.action; var id = ajax.getCallID(href, 'form'); var div = dom.elById('div' + id); if (!div) { div = document.createElement("div"); div.id = 'div' + id; div.className = 'form-request'; div.innerHTML = ''; try { dom.elById('trice-ajax-area').appendChild(div); } catch(e){} } el.target = (el.target == 'debug') ? 'debug' : 'win' + id; dom.addEvent(el, 'submit', ajax.wait); }, /* */ callLink : function(el) { ajax.wait() var href = el["ajax_href"] ? el.ajax_href : el.href; var id = ajax.getCallID(href, 'link'); var div = dom.elById('div' + id); if (!div) { div = document.createElement("div"); div.id = 'div' + id; div.innerHTML = ''+ ''+ '
'+ ''; dom.elById('trice-ajax-area').appendChild(div); } if (dom.hasClass(el, 'post')) { var form = dom.elById('form' + id); form.action = "javascript:;"; form.action = href; //form.target = "debug"; form.submit(); } else { var win = dom.elById('win' + id); win.src = "javascript:;"; win.src = href; } if (window.contextmenu) contextmenu.hide(); if (window.form) window.form.hideSuggestions(); }, /* */ wait : function() { }, done : function() { }, /* */ process_callbacks : function() { if (parent.form) parent.form.hideSuggestions(); /* calls and arguments */ var cbs = dom.elsByClass('callback', document, 'form'); for (var i = 0; i < cbs.length; i++) { var cb = cbs[i]; var call = cb.call.value; var args = dom.elsByClass('argument', cb, 'textarea'); var arg_code = ''; for (var j = 0; j < args.length; j++) { arg_code += arg_code ? ', ' : ''; arg_code += 'args[' + j + '].value'; } try { eval('parent.' + call + '(' + arg_code + ');'); } catch(e) { //alert(e) } try { console.log('parent.' + call + '(' + arg_code + ');'); console.log(eval(arg_code)); } catch(e) {} } /* apply js to new html */ parent.trice.loaded(); /* remove request bridge (only for links, keep form bridges) */ var ajax_id = 'div' + ajax.getCallID(location.href, 'link'); setTimeout("parent.dom.removeEl('" + ajax_id + "')", 50); parent.ajax.done(); }, getCallID : function(val, type) { var r = 0; for (var i in val) { r += (1 * val.charCodeAt(i)); } return type + r; }, updateEl : function(val) { if (val) { var tmp_el = document.createElement('div'); tmp_el.innerHTML = val.replace(/^\s+/, ''); dom.setEl(tmp_el.firstChild.id, tmp_el.firstChild.innerHTML); } }, appendEls : function(val) { if (val) { var tmp_el = document.createElement('div'); tmp_el.innerHTML = val.replace(/^\s+/, ''); dom.appendEls(tmp_el.firstChild.id, tmp_el.firstChild.childNodes); } }, /* */ redirectTo : function(url) { location.href = url; } } if (!window.trice_libs) {trice_libs = {};} trice_libs["form"] = { run : function() { form.activateTextareas(); form.activateAutoCompletes(); form.setFocus(); } } var form = { activateTextareas : function() { var els = dom.elsByClass('resizable', '', 'textarea'); for (var i = 0; i < els.length; i++) { form.activateTextarea(els[i]); } }, activateTextarea : function(el) { //form.resizeTextarea(el); //el.style.overflow = 'hidden'; dom.addEvent(el, 'focus', form.textareaFocus); dom.addEvent(el, 'keyup', form.textareaKeyup); dom.addEvent(el, 'dblclick', form.textareaDblclick); }, textareaFocus : function(e) { form.resizeTextarea(this); }, textareaDblclick : function(e) { form.resizeTextarea(this); }, textareaKeyup : function(e) { //form.resizeTextarea(this); }, resizeTextarea : function(el) { var scroll_pos = window.scrollY; var lines = el.value.split("\n"); var lc = lines.length; for (var i in lines) { var ll = lines[i].length; while (ll > (el.scrollWidth / 8)) { lc++; ll -= (el.scrollWidth / 8); } } el.style.height = ((lc + 1) * 12) + 'px'; el.style.height = (el.scrollHeight + 14) + 'px'; window.scroll(0, scroll_pos); }, /* */ activateAutoCompletes : function() { var els = dom.elsByPath('form .auto-complete input'); for (var i = 0 ; i < els.length; i++) { form.activateAutoComplete(els[i]); } }, activateAutoComplete : function(el) { el.prev_value = el.value; try { el.setAttribute('autocomplete', 'off'); } catch(e) {} dom.addEvent(el, 'focus', function(e){form.trackAutoComplete(el)}); dom.addEvent(el, 'blur', function(e){form.stopAutoComplete(el)}); }, trackAutoComplete : function(el) { try { window.clearTimeout(window.auto_complete_track_to); } catch(e) {} var el = dom.elById(el); if (el) { var prev_val = el && el['prev_value'] ? el.prev_value : ''; var val = el.value; if (prev_val != val) { try { window.clearTimeout(window.auto_complete_submit_to); } catch(e) {} //dom.parentByTag('form', el.id).target="_debug"; window.auto_complete_submit_to = window.setTimeout("dom.parentByTag('form', '" + el.id + "').submit()", 500); } window.auto_complete_track_to = window.setTimeout("form.trackAutoComplete('" + el.id + "')", 250); el.prev_value = val; } }, stopAutoComplete : function(el) { try { window.clearTimeout(window.auto_complete_track_to); } catch(e) {} try { window.clearTimeout(window.auto_complete_submit_to); } catch(e) {} }, /* */ setFocus : function() { var els = dom.elsByPath('form .focus input'); for (var i in els) { try { els[i].focus(); } catch(e){}; } }, /* */ showSuggestions : function(val) { form.hideSuggestions(); var tmp_el = document.createElement('div'); tmp_el.innerHTML = val.replace(/^\s+/, ''); var el_id = tmp_el.firstChild.id; var el_pos = dom.elPos(el_id); var canvas_pos = dom.elPos(dom.elByClass('canvas')); var el = tmp_el.firstChild; if (el) { el.id += 'list'; el.className += ' form-field-suggestions'; el.style.top = el_pos.y - canvas_pos.y + 'px'; el.style.left = el_pos.x - canvas_pos.x + 'px'; dom.elByClass('canvas').appendChild(el); } }, hideSuggestions : function() { var els = dom.elsByClass('form-field-suggestions'); for (var i = 0; i < els.length; i++) { els[i].parentNode.removeChild(els[i]); //els[i].style.display = 'none'; } } } if (!window.trice_libs) {trice_libs = {};} trice_libs["dooit"] = { run : function() { dooit.activateItems(); } } var dooit = { activateItems: function() { var els = dom.elsByPath('.todo-item .details'); for (var i = 0; i < els.length; i++) { this.activateItem(els[i]); this.activateCheckbox(dom.elByClass("status", els[i].parentNode)); this.activateDrop(els[i].parentNode); } }, activateItem: function(el) { dom.addEvent(el, 'dblclick', function(e){dom.cancelEvent(e); dooit.loadItemForm(el);}); }, activateCheckbox: function(el) { dom.addEvent(el, 'click', function(e){dooit.tickOnOffItem(el);}); }, loadItemForm: function(el) { ajax.callLink(dom.elByClass('form-hook', el.parentNode)); }, removeItem: function(id) { var el = dom.elById(id).parentNode; dom.toggleEl(el); }, tickOnOffItem: function(el) { ajax.callLink(dom.elByClass('tick-on-off-hook', el.parentNode)); }, activateDrop: function(el) { el.ondrop = dooit.onItemDrop; }, onItemDrop: function(e) { var old_pos = dom.elByClass('dooit-position', this).innerHTML; var els = dom.elsByPath('#items .todo-item'); var prev_pos = 0; var cur_pos = old_pos; var next_pos = 0; for (var i = 0, i_max = els.length; i < i_max; i++) { if (els[i].id == this.id) { if (i > 0) prev_pos = parseInt(dom.elByClass('dooit-position', els[i - 1]).innerHTML); var cur_pos = parseInt(dom.elByClass('dooit-position', els[i]).innerHTML); if (i < i_max - 1) next_pos = parseInt(dom.elByClass('dooit-position', els[i + 1]).innerHTML); break; } } var new_pos = old_pos; if (!prev_pos) new_pos = Math.min(old_pos, next_pos); if (!next_pos) new_pos = Math.max(old_pos, prev_pos); if (prev_pos && next_pos) new_pos = (prev_pos > cur_pos) ? prev_pos : next_pos; //alert(prev_pos + ' / ' + cur_pos + ' / ' + next_pos + ' => ' + new_pos); if (old_pos && new_pos && (old_pos != new_pos)) { var hook = dom.elByClass('reposition-item-hook'); hook.ajax_href += hook.ajax_href.match(/\?/) ? '&' : '?'; hook.ajax_href += 'old_pos=' + old_pos+ '&new_pos=' + new_pos; ajax.callLink(hook); } } } if (!window.trice_libs) {trice_libs = {};} trice_libs['dragdrop'] = { run : function() { dragdrop.activate(); } } var dragdrop = { activate: function() { if (window["dragdrop_active"]) return; var _this = this; dom.addEvent(document, 'mousedown', function(e) {_this.startDrag(e);}); dom.addEvent(document, 'mousemove', function(e) {_this.doDrag(e);}); dom.addEvent(document, 'mouseup', function(e) {_this.endDrag(e);}); window.dragdrop_active = 1; }, startDrag: function(e) { if (this.drag_el) return; var e = e || window.event; var el = this.getDragEl(e); if (!el) return 0; dom.cancelEvent(e);/* prevent text selection */ this.setCells(); var ev_pos = dom.getEventPos(e); var el_pos = dom.elPos(el); this.drag_el = el; this.drag_cell = dom.parentByClass('drag-container', el) this.drag_el.style.width = dom.elDim(el).w + 'px'; this.drag_el.style.position = 'absolute'; this.drag_el.style.zIndex = 100; this.drag_el.m_diff = {'x': ev_pos.x - el_pos.x, 'y': ev_pos.y - el_pos.y}; dom.setPos(this.drag_el, ev_pos.x - this.drag_el.m_diff.x, ev_pos.y - this.drag_el.m_diff.y - 1); this.pos_hash = undefined; var _this = this; setTimeout(function() {_this.showDropzone()}, 5); this.hlTO = setInterval(function() {_this.showDropzone()}, 250); }, setCells: function() { this.cells = dom.elsByClass('drag-container'); for (var i in this.cells) { this.cells[i].pos = dom.elPos(this.cells[i]); this.cells[i].dim = dom.elDim(this.cells[i]); } }, getDragEl: function(e) { var el = e.target || e.srcElement; return dom.hasClass(el, 'drag-handle') ? dom.parentByClass('draggable', el) : 0; }, doDrag: function(e) { if (!this.drag_el) return; var e = e || window.event; var pos = dom.getEventPos(e); dom.setPos(this.drag_el, pos.x - this.drag_el.m_diff.x, pos.y - this.drag_el.m_diff.y); }, showDropzone: function() { if (!this.drag_el) return; var pos = dom.elPos(this.drag_el); var t_cell = 0; var t_dist = 100000; for (var i = 0, i_max = this.cells.length; i < i_max; i++) { var cell = this.cells[i]; var x_dist = Math.abs(pos.x - cell.pos.x); var y_dist = Math.abs(pos.y - cell.pos.y); var dist = Math.sqrt(Math.pow(x_dist, 2) * Math.pow(y_dist, 2)); if (dist <= t_dist) { t_cell = cell; if (!t_cell['id']) t_cell.id = 'id' + i; t_dist = dist; } } var pos_hash = t_cell.id + ' ' + (pos.y < t_cell.pos.y ? 'before' : 'after'); if (this.pos_hash == pos_hash) return; this.pos_hash = pos_hash; var el = dom.elById('dropzone'); if (el) el.parentNode.removeChild(el); el = document.createElement('div'); el.id = 'dropzone'; dom.setDim(el, dom.elDim(this.drag_el)); if (pos.y < t_cell.pos.y) { t_cell.parentNode.insertBefore(el, t_cell); } else if(t_cell.nextSibling) { t_cell.parentNode.insertBefore(el, t_cell.nextSibling); } else { t_cell.parentNode.appendChild(el); } }, endDrag: function(e) { if (!this.drag_el) return; var e = e || window.event; var dz = dom.elById('dropzone'); if (dz) { if (this.drag_cell) { var cell = this.drag_cell.parentNode.removeChild(this.drag_cell); dz.parentNode.insertBefore(cell, dz); dz.parentNode.removeChild(dz); } } this.drag_el.style.position = 'static'; this.drag_el.style.width = 'auto'; dom.setPos(this.drag_el, {'x': 0, 'y': 0}); if (this.drag_el['ondrop']) this.drag_el.ondrop(); this.drag_el = null; try {clearInterval(this.hlTO)} catch(e){} } }; if (!window.trice_libs) {trice_libs = {};} trice_libs["theme"] = { run : function() { theme.stretchCanvas(); } } var theme = { stretchCanvas : function() { var el = dom.elByPath('.canvas'); if (document.documentElement.clientHeight) {// crappy ie check if (el.offsetHeight < 350) { el.style.height = 350 + 'px'; } } } } if (!window.trice_libs) {trice_libs = {};} /* core tweaks */ Array.prototype.append = function(ar) { for (var i = 0, i_max = ar.length; i < i_max; i++) { this[this.length] = ar[i]; } }; /* trice */ var trice = { loading : 1, init : function() { try { if (dom.elById('trice-ajax-area')) return trice.loaded(); var body = dom.elByTag('body'); var el = document.createElement('div'); el.id = 'trice-ajax-area'; body.appendChild(el); trice.loaded(); } catch (e) { if (trice.loading) { trice.runTO = setTimeout("trice.init()", 100); } } }, loaded : function() { trice.loading = 0; try {clearTimeout(window.trice_runTO)} catch(e) {} for (var i in trice_libs) { if (trice_libs[i]['run']) { trice_libs[i].run(); } } }, getURL : function (qs_args, url) { var url = url ? url : location.href; var qs = (url.indexOf('?') != -1) ? url.substring(url.indexOf('?')+1) : ''; var base = (url.indexOf('?') != -1) ? url.substring(0, url.indexOf('?')) : url; return qs_args ? base + '?' + trice.getQS(qs_args, qs) : base; }, getQS : function(a, qs) { var qs = qs ? qs : (location.search ? location.search.substring(1) : ''); for (var i in a) { var re = "/(^|\\?|\\&)("+i+"=)([^\\&]*)/"; /* remove old args */ qs = qs.replace(eval(re), ""); /* add new */ if (a[i]) { qs += qs.length ? "&" : ""; qs += i + "=" + a[i]; } } return qs; }, p : function(name, qs) { var qs = qs ? qs : (location.search ? location.search.substring(1) : ''); qs = qs.replace(/\?/, '&'); alert(qs); var re, m; re = '/\&' + name + '=([^\&]*)/'; return (m = qs.match(eval(re))) ? m[1] : false; } };