
var dom = {

  is_ie: /*@cc_on!@*/0,

  elById : function(id) {
    return (typeof id != "string") ? id : (document["getElementById"] ? document.getElementById(id) : false );
  },
  
  elsByTag : function(t, p) {
    p = p ? dom.elById(p) : document;
    return (p && 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, check_self) {
    el = dom.elById(el);
    if (check_self) {
      if (el['tagName'] && el.tagName.toLowerCase() == t) {
        return el;
      }
    }
    if (el.parentNode) {
      var p = el.parentNode;
      if (!p['tagName']) return 0;
      if (p.tagName.toLowerCase() == t) {
        return p;
      }
      return dom.parentByTag(t, p);
    }
    return 0;
  },

  isInTag: function(t, el) {
    el = dom.elById(el);
    if (el['tagName'] && el.tagName.toLowerCase() == t) return 1;
    return dom.parentByTag(t, el) ? 1 : 0;
  },
  
  parentByClass : function(c, el, check_self) {
    el = dom.elById(el);
    if (check_self && dom.hasClass(el, c)) return 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|$)");
    el = dom.elById(el);
    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');
    }
  },

  mainClass: function(el) {
    if (!el.className) return '';
    var m = el.className.match(/^\s*([^\s]+)/);
    return m ? m[1] : '';
  },
  
  prevNodeByClass: function(c, el) {
    while ((el = el.previousSibling)) {
      if (dom.hasClass(el, c)) return el;
    }
    return 0;
  },

  nextNodeByClass: function(c, el) {
    while ((el = el.nextSibling)) {
      if (dom.hasClass(el, c)) return el;
    }
    return 0;
  },

  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++) {
      cur_a = els[i].getAttribute(a_name);
      if (!cur_a) continue;
      if (a && !cur_a.match(re)) continue;
      r[r.length] = els[i];
    }
    return r;
  },

  elByAttr : function(a_name, a, p) {
    var els = dom.elsByAttr(a_name, a, p);
    return els.length ? els[0] : 0;
  },
  
  elsByPath : function(path, p) {
    p = p ? dom.elById(p) : document;
    var parts = path.split(" ");
    var part = parts.shift();
    var rest = parts.join(" ");
    var m, i;
    var r = [];
    var els = [];
    if ((m = part.match(/^[\.]([^\.]+)(.*)$/))) {/* .foo or .foo.bar */
      els = dom.elsByClass(m[1], p);
      if (m[2]) {
        sub_path = m[2].substr(1);
        pre_els = els;
        els = [];
        for (i = 0; i < pre_els.length; i++) {
          if (dom.hasClass(pre_els[i], sub_path)) els[els.length] = pre_els[i];
        }
      }
    }
    else if ((m = part.match(/^[\#](.*)$/))) {/* #foo */
      els = [dom.elById(m[1])];
    }
    else if ((m = part.match(/^([^\.]+)\.(.*)$/))) {/* foo.bar */
      els = dom.elsByClass(m[2], p, m[1]);
    }
    else {/* foo */
      els = dom.elsByTag(part, p);
    }
    if (rest) {
      for (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;
  },
  
  styleVal: function(el, s_name, default_val) {
    el = dom.elById(el);
    if (el['currentStyle']) 
      return el.currentStyle[s_name];
    if (window['getComputedStyle']) 
      return document.defaultView.getComputedStyle(el, null).getPropertyValue(s_name);
    return default_val ? default_val : '';
  },
  
  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);
    if ((el.style.display == "none") || !dom.elDim(el).h) {
      el.style.display = 'block';
    }
    else {
      el.style.display = 'none';
    }
    window.focus();
  },
  
  removeEl : function(id) {
    var el = dom.elById(id);
    if (el) el.parentNode.removeChild(el);
  },
  
  getId : function(el) {
    el = dom.elById(el);
    if (!el) return 0;
    if (el.id) return el.id;
    if (!el.dom_id) {
      var pos = 0;
      var p;
      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;
  },

  setHover: function() {
    dom.addClass(this, 'hover');
  },

  removeHover: function() {
    dom.removeClass(this, 'hover');
  },

  isInEl: function(el, p_el) {
    if (!el["parentNode"]) return 0;
    if (el.parentNode == p_el) return 1;
    return dom.isInEl(el.parentNode, p_el);
  },

  sharedNode: function(n1, n2, root) {
    if (!root) root = document;
    if (n1 == n2) return n1;
    if (n1 == root) return root;
    if (dom.isInEl(n2, n1)) return n1;
    if (dom.isInEl(n1, n2)) return n2;
    return dom.sharedNode(n1.parentNode, n2, root);
  },
  
  /* event stuff */

  event_registry : {'count' : 0},
  
  addEvent : function(el, e_type, fnc) {
    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);
    //console.log(fnc_key);
    /* 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;
    }
    return true;
  },
  
  removeEvent : function(el, e_type, fnc) {
    el = dom.elById(el);
    if (!el || (typeof el != "object")) return;
    var dom_id = dom.getId(el);
    var fnc_key = escape(dom_id + e_type + fnc);
    if (!dom.event_registry[fnc_key]) return;
    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) {
    e = e || window.event;
    if (e.preventDefault) {
      e.preventDefault();
      e.stopPropagation();
    }
    else {
      e.cancelBubble = true;
      e.returnValue = false;
    }
    return false;
  },
  
  fireEvent: function(el, e_type){
    el = dom.elById(el);
    var e;
    if (document['createEventObject']) {/* ie */
      e = document.createEventObject();
      return el.fireEvent('on' + e_type, e);
    }
    if (document['createEvent']) {
      e = document.createEvent("Events");
      e.initEvent(e_type, true, true);/* bubble, allow_cancel */
      return el.dispatchEvent(e);
    }
    return true;
  },

  getEventPos : function(e) {
    e = e || window.event;
    var x, y;
    try {
      x = (e && e.pageX) ? e.pageX : ((e && e.x) ? e.x : 0);
      y = (e && e.pageY) ? e.pageY : ((e && e.y) ? e.y : 0);
      if(navigator.userAgent.indexOf('Safari') != -1) {
        //y += dom.scrollPos().y;
      }
    } catch(e){}
    return {'x' : x,  'y' : y};
  },

  ePos: function(e) {
    return dom.getEventPos(e);
  },

  eventButton: function(e) {
    e = e || window.event;
    if(e && (typeof(e["button"]) != "undefined")) return e.button;
    if(e && (typeof(e["which"]) != "undefined")) return e.which;
    return false;
  },

  eButton: function(e) {
    return dom.eventButton(e);
  },

  eTarget: function(e) {
    e = e || window.event;
    return e['target'] ? e.target : e.srcElement;
  },

  /* pos */
  
  scrollPos: function() {
    var x, y;
  	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;
    }
    else {
      y = window.pageYOffset;
    }
    return {'x' : 0,  'y' : parseInt(y)};
  },

  elPos : function(el, abs_pos) {
    el = dom.elById(el);
    if (dom.styleVal(el, 'position').match('fixed|absolute')) {
      abs_pos = true;
    }
    var r = {
      'x': el.offsetLeft - el.scrollLeft,
      'y': el.offsetTop - el.scrollTop,
      'z': el.style['zIndex'] ? parseInt(el.style.zIndex) : 0
    };
    if (el.offsetParent) {
      var sub_r = dom.elPos(el.offsetParent, abs_pos);
      r = { 'x' : r.x + sub_r.x, 'y' : r.y + sub_r.y, 'z': r.z };
    }
    /* safari */
    else if (abs_pos && navigator.userAgent.indexOf('Safari') != -1) {
      r.y += dom.scrollPos().y;
    }
    return r;
  },
  
  setPos: function(el, pos, y) {
    pos = y ? {'x': pos, 'y': y} : pos;
    var x = "" + pos.x;
    y = "" + pos.y;
    try {
      el.style.top = y.match("%") ? y : y + 'px';
      el.style.left = x.match("%") ? x : x + 'px';
    }
    catch(e) {};
  },
  
  elDim: function(el) {
    return {'w': el.offsetWidth, 'h': el.offsetHeight};
  },
  
  setDim: function(el, dim, h) {
    dim = h ? {'w': dim, 'h': h} : dim;
    this.setW(el, dim.w);
    this.setH(el, dim.h);
  },

  setW: function(el, w) {
    el = dom.elById(el);
    w = "" + w;
    el.style.width = w.match(/(\%|auto)/) ? w : w + 'px';
  },

  setH: function(el, h) {
    el = dom.elById(el);
    h = "" + h;
    el.style.height = h.match(/(\%|auto)/) ? h : h + 'px';
  },

  isOver: function(over_el, under_el, fixed_under) {
    var o_pos = dom.elPos(over_el);
    var o_dim = dom.elDim(over_el);
    var u_pos = dom.elPos(under_el);
    var u_dim = dom.elDim(under_el);
    if (fixed_under) {
      u_pos.y += dom.scrollPos().y;
    }
    if (o_pos.x > (u_pos.x + u_dim.w)) return 0;
    if (o_pos.y > (u_pos.y + u_dim.h)) return 0;
    if ((o_pos.x + o_dim.w) < u_pos.x) return 0;
    if ((o_pos.y + o_dim.h) < u_pos.y) return 0;
    return 1;
  },

  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);
  },

  setTitle: function(v) {
    document.title = v;
  }
  
};

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);});
    if (dom.hasClass(el, 'auto-load')) {
      ajax.callLink(el);
    }
  },

  /*  */

  activateForms: function() {
    var els = dom.elsByPath('form.ajax');
    for (var i = 0, i_max = els.length; i < i_max; i++) {
      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 = '<iframe id="win' + id + '" name="win' + id +'" src="javascript:;"></iframe>';
      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, connection_id) {
    var silent = dom.hasClass(el, 'silent-post') || dom.hasClass(el, 'silent-get');
    if (!silent) ajax.wait();
    var href = el["ajax_href"] ? el.ajax_href : el.href;
    var id = connection_id ? ajax.getCallID(connection_id, 'link') : ajax.getCallID(href, 'link');
    /* POST */
    if (dom.hasClass(el, 'post')) {
      var div = dom.elById('div' + id);
      if (!div) {
        div = document.createElement("div");
        div.id = 'div' + id;
        div.innerHTML = ''+
          '<iframe id="win' + id + '" name="win' + id +'" src="javascript:;"></iframe>'+
          '<form id="form' + id + '" target="win' + id + '" method="post" enctype="application/x-www-form-urlencoded"></form>'+
        '';
        dom.elById('trice-ajax-area').appendChild(div);
      }
  		var form = dom.elById('form' + id);
      form.action = "javascript:;";
  		form.action = href;
  		//form.target = "debug";
  		form.submit();
    }
    /* GET or silent POST */
    else {
      /*
  		var win = dom.elById('win' + id);
  		win.src = "javascript:;";
  		win.src = href;
      */
      if (!ajax['xhrs']) ajax.xhrs = {};
      try { ajax.xhrs[id].abort() } catch(e) {}
      ajax.xhrs[id] = ajax.getXHR();
      ajax.xhrs[id].id = id;
      var mthd = dom.hasClass(el, 'silent-post') ? 'POST' : 'GET';
      ajax.xhrs[id].open(mthd, href, true);
      ajax.xhrs[id].onreadystatechange = ajax.xhrDone;
      ajax.xhrs[id].send(null);
    }
    if (window.contextmenu) contextmenu.hide();
    if (window.form) window.form.hideSuggestions();
  },

  getXHR: function() {
    try { return new XMLHttpRequest(); } catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {}
    return false;
  },

  xhrDone: function() {
    if (this.readyState != 4) return false;
    if (this.status != 200) return false;
    if (this !== ajax.xhrs[this.id]) return false;
    var r = this.responseText;
    r = r.substring(r.indexOf('<!-- trice ajax result start '), r.indexOf('<!-- trice ajax result end '));
    var div = document.createElement("div");
    div.innerHTML = r;
    var cbs = dom.elsByClass('callback', div, '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(call + '(' + arg_code + ');');
      }
      catch(e) {alert(e)}
    }
    /* apply js to new html */
    trice.loaded();
    if (!top['request_count']) top.request_count = 0;
    top.request_count++;
    top.location.hash = '#' + top.request_count;
    ajax.done();
    return true;
  },

  /*  */

  wait : function() {
    dom.addClass(dom.elByTag('body'), 'loading');
  },

  done : function() {
    dom.removeClass(dom.elByTag('body'), 'loading');
  },

  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+/, '');
      var id = tmp_el.firstChild.id;
      if (window.fx) {
        fx.flash(id, tmp_el.firstChild.innerHTML);
      }
      else {
        dom.setEl(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, delay) {
    if (!delay) delay = 1;
    setTimeout("location.href = '" + url + "';", delay);
  },

  /*  */

  buildURL: function(method, url) {
    if (!url) url = location.href;
    if (url.match(/^\?/)) url = location.href.replace(/[\?\#].*$/, '') + url;
    return url.replace(/(\?|\#|$)/, '$' + method + '$1');
  },

  get: function(method, url, connection_id) {
    return this.getURL(this.buildURL(method, url), connection_id);
  },

  getURL: function(url, connection_id) {
    var el = document.createElement("a");
    el.ajax_href = url;
    ajax.callLink(el, connection_id);
  },

  post: function(method, url, connection_id, silent) {
    return this.postURL(this.buildURL(method, url), connection_id, silent);
  },

  bgPost: function(method, url, connection_id) {
    return this.postURL(this.buildURL(method, url), connection_id, 1);
  },

  postURL: function(url, connection_id, silent) {
    var el = document.createElement("a");
    el.ajax_href = url;
    el.className = silent ? 'silent-post' : 'post';
    ajax.callLink(el, connection_id);
  }

}

/* microdata/RDF utils */

var micrordf = {

  getItemURI : function(el) {
    var r;
    var id_el = this.getIdEl(el);
    if (id_el && (r = id_el.getAttribute('itemid'))) {
      return r;
    }
    var about_el = this.getAboutEl(el);
    if (!about_el) return 0;
    if ((r = about_el.getAttribute('content'))) return r;
    if ((r = about_el.getAttribute('href'))) return r;
    if ((r = about_el.getAttribute('src'))) return r;
    return about_el.innerHTML;
  },

  getPropEl: function(item_el, prop) {
    item_el = dom.elById(item_el);
    var els = dom.elsByAttr('itemprop', prop, item_el);
    for (var i = 0, i_max = els.length; i < i_max; i++) {
      if (item_el == this.getParentItem(els[i])) return els[i];
    }
    return false;
  },

  getPropValue: function(item_el, prop) {
    var el = this.getPropEl(item_el, prop);
    if (!el) return false;
    if ((r = el.getAttribute('content'))) return r;
    if ((r = el.getAttribute('href'))) return r;
    if ((r = el.getAttribute('src'))) return r;
    return el.innerHTML();
  },

  getIdEl: function(el) {
    el = dom.elById(el);
    var p_el = this.getParentItem(el, 1);
    if (!p_el) return 0;
    if (p_el['getAttribute'] && (typeof p_el.getAttribute("itemid") == 'string')) {
      return p_el;
    }
    return 0;
  },

  getAboutEl: function(el) {
    el = dom.elById(el);
    var p_el = this.getParentItem(el, 1);
    if (!p_el) return 0;
    var els = dom.elsByAttr('itemprop', 'about', p_el);
    for (var i = 0, i_max = els.length; i < i_max; i++) {
      if (p_el == this.getParentItem(els[i])) return els[i];
    }
    return 0;
  },

  getParentItem: function(el, check_self) {
    el = dom.elById(el);
    if (check_self && el['getAttribute'] && (typeof el.getAttribute("itemscope") == 'string')) return el;
    if (check_self && el['getAttribute'] && (typeof el.getAttribute("item") == 'string')) return el;
    if (el.parentNode) return this.getParentItem(el.parentNode, 1);
    return 0;
  },

  itemByURI: function(uri) {
    return dom.elByAttr('itemid', uri);
  }
  
}

if (!window.trice_libs) {trice_libs = {};}

trice_libs['login'] = {
  run : function() {
    login.activate();
  }
}

var login = {

  /*  */

  activate: function() {
    if (login.activated) return;
    login.activated = 1;
    popup.blockScreen();
    dom.addClass(dom.elById('login-popup'), 'active');
  },

  checkNick: function() {
    var val = dom.elById('signup-nick').value;
    if (!val) return;
    ajax.get('check-nick', trice.getQS({"nick": escape(val)}));
  }

  /*  */


};


if (!window.trice_libs) {trice_libs = {};}

trice_libs["form"] = {
  run : function() {
    form.activateTextareas();
    form.activateAutoCompletes();
    form.setFocus();
    form.resizeSuggestions();
    form.enableSuggestions();
  }
}

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);
    e = e || window.event;
    var el = e.target || e.srcElement;
    dom.addEvent(el, 'keydown', form.textareaKeydown);
  },

  textareaDblclick : function(e) {
    e = e || window.event;
    var el = e.target || e.srcElement;
    form.resizeTextarea(el);
  },

  textareaKeyup : function(e) {
    //form.resizeTextarea(this);
  },

  textareaKeydown : function(e) {
    e = e || window.event;
    var el = e.target || e.srcElement;
    var kc = e.which ? e.which : e.keyCode;
    if (kc) {
      /* tab */
      if (kc == 9) {
        dom.cancelEvent(e);
        form.injectTab(el);
        setTimeout("dom.elById('" + el.id + "').focus();", 20);
        return false;
      }
      /* enter */
      else if (kc == 13) {
        form.resizeTextarea(el)
      }
      /* backspace */
      else if (kc == 8) {
        form.resizeTextarea(el)
      }
    }
  },

  injectTab: function(el) {
    //var inj_text = "\t";
    var inj_text = "    ";
  	if (el.setSelectionRange) {
      var sel_start = el.selectionStart;
      var sel_end = el.selectionEnd;
  		el.value = el.value.substring(0, sel_start)+ inj_text + el.value.substring(sel_end);
      el.focus();
      el.setSelectionRange(sel_start + inj_text.length, sel_start + inj_text.length);
    }
    else if (document.selection) {
  		var r = document.selection.createRange();
  		if (r.parentElement() == el) {
        r.text = inj_text;
        r.moveStart('character', -1);
        //r.select();
      }
    }
  },

  resizeTextarea : function(el) {
    if (!el || !el.value) return;
    var scroll_pos = window.scrollY;
    var lines = el.value.split(unescape("%0A"));
    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';
    var new_h = (el.scrollHeight + 16) + 'px';
    el.style.height = new_h;
    dom.elById(el.id + '-height').value = new_h;
    window.scroll(0, scroll_pos);
  },

  /*   */

  activateAutoCompletes : function() {
    var els = dom.elsByPath('.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.hideSuggestions();
      //el.prev_value = '';
      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 { dom.elById(el.id + '-selection').value = '' } catch(e) {}
        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()", 250);
        window.auto_complete_submit_to = window.setTimeout("form.doAutoComplete('" + el.id + "')", 450);
      }
      window.auto_complete_track_to = window.setTimeout("form.trackAutoComplete('" + el.id + "')", 150);
      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) {}
  },

  doAutoComplete: function(el) {
    el = dom.elById(el);
    var id = el.id;
    var args = {};
    args[id] = escape(el.value);
    ajax.get(id + '-auto-complete', trice.getQS(args));
  },

  /*   */

  setFocus : function() {
    var els = dom.elsByPath('form .focus input');
    if (!els) return;
    for (var i = 0, i_max = els.length; i < i_max; i++) {
      try { els[i].focus(); } catch(e){};
    }
  },

  /*   */

  resizeSuggestions: function() {
    var els = dom.elsByClass('form-field-suggestions');
    for (var i = 0; i < els.length; i++) {
      var el = els[i];
      var fld = el.parentNode;
      var el_dim = dom.elDim(el);
      var fld_dim = dom.elDim(fld);
      dom.setDim(el, fld_dim.w, el_dim.h);
    }
  },

  enableSuggestions: function() {
    var els = dom.elsByPath('.form-field-suggestions a');
    for (var i = 0; i < els.length; i++) {
      this.enableSuggestion(els[i]);
    }
  },

  enableSuggestion: function(el) {
    dom.addEvent(el, 'click', form.pickSuggestion);
  },

  pickSuggestion: function(e) {
    e = e || window.event;
    if (dom.eventButton(e) > 1) return;
    var fld = dom.parentByClass('field', this);
    var input = dom.elByTag('input', fld);
    var id = input.id;
    var sel_fld = dom.elById(id + '-selection');
    if (!sel_fld) return;
    dom.cancelEvent(e);
    sel_fld.value = this.href;
    input.value = this.title ? this.title : this.innerHTML.replace(/^\s*([^\s].*[^\s])\s*$/, '$1');
    input.prev_value = input.value;
    form.hideSuggestions();
    //dom.parentByTag('form', this).submit();
  },

  /* inject server-generated list of suggestions */

  showSuggestions : function(val, el_id) {
    form.hideSuggestions();
    el_id += '-suggestions';
    var el = dom.elById(el_id);
    if (!el) return alert(el_id);
    val = val.replace(/^\s+/, '');
    el.innerHTML = val;
    if (val) dom.addClass(el, 'active');
    return true;
  },

  hideSuggestions : function() {
    var els = dom.elsByClass('form-field-suggestions');
    var el;
    for (var i = 0; i < els.length; i++) {
      el = els[i];
      el.innerHTML = '';
      el.style.height = 'auto';
      dom.removeClass(el, 'active');
      //els[i].parentNode.removeChild(els[i]);
      //els[i].style.display = 'none';
    }
  },

  /* multi-field */

  addMultiField: function(el) {
    /* form item */
    var item_el = dom.parentByClass('item', el);
    /* template */
    var t = dom.elByClass('multi-field-template', item_el);
    var i_el = dom.elByClass('field-info', item_el);
    var t_el = document.createElement('div');
    dom.addClass(t_el, 'multi-field-entry');
    var entries = dom.elsByClass('multi-field-entry', item_el);
    var suffix = entries.length + 1;
    t_el.innerHTML = t.innerHTML.replace(/\-template/g, '-' + suffix);
    i_el.parentNode.insertBefore(t_el, i_el);
    /* show remove-links */
    form.adjustMultiFields(item_el);
  },
  
  removeMultiField: function(el) {
    var item_el = dom.parentByClass('item', el);
    var entries = dom.elsByClass('multi-field-entry', item_el);
    var entry_el = dom.parentByClass('multi-field-entry', el);
    entry_el.parentNode.removeChild(entry_el);
    /* hide remove-links, if necessary, and rebuild field IDs */
    form.adjustMultiFields(item_el);
  },

  adjustMultiFields: function(item_el) {
    var entries = dom.elsByClass('multi-field-entry', item_el);
    var vc = entries.length;
    for (var i = 0; i < vc; i++) {
      /* remove-link */
      if (vc == 1) {
        dom.addClass(dom.elByClass('remove-multi-field', entries[i]), 'disabled');
      }
      else {
        dom.removeClass(dom.elByClass('remove-multi-field', entries[i]), 'disabled');
      }
      /* adjust suffixes of INPUT, TEXTAREA, SELECT */
      var new_pos = i + 1;
      var tags = ['input', 'select', 'textarea'];
      for (var j = 0; j < tags.length; j++ ) {
        var els = dom.elsByTag(tags[j], entries[i]);
        var fld_name = '';
        for (var k = 0; k < els.length; k++) {
          try {
            fld_name = els[k].id.replace(/\-[0-9]+$/, '');
            els[k].id = fld_name + '-' + new_pos;
            els[k].name = els[k].id;
            if (tags[j] == 'select') els[k].name += '[]';
          } catch(e) {alert(e)}
        }
        if (fld_name) {
          if (!dom.elById(fld_name + '-count')) {
            fld_name = fld_name.replace(/\-[^\-]+$/, '');
          }
          dom.elById(fld_name + '-count').value = vc;
        }
      }
    }
  }

}


if (!window.trice_libs) {trice_libs = {};}

trice_libs['popup'] = {
  run : function() {
  }
}

var popup = {

  /*  */

  blockScreen: function() {
    dom.addClass(dom.elById('screen-blocker'), 'active');
  },

  unblockScreen: function() {
    dom.removeClass(dom.elById('screen-blocker'), 'active');
  },

  /*  */

  showPopup: function(val, id) {
    el = dom.elById(id);
    if (dom.hasClass(el, 'single')) popup.blockScreen();
    dom.addClass(el, 'active');
    ajax.updateEl(val);
  },

  closePopup: function(el) {
    el = dom.parentByClass('popup', el, 1);
    if (dom.hasClass(el, 'single')) popup.unblockScreen();
    dom.removeClass(el, 'active');
    el.innerHTML = '';
  },

  raisePopup: function(el) {
    var r = 1;
    var els = dom.elsByClass('popup');
    for (var i = 0; i < els.length; i++) {
      r = Math.max(1 + parseInt(dom.styleVal(els[i], 'z-index')), r);
    }
    el.style.zIndex = r;
  }

  /*  */

}


if (!window.trice_libs) {trice_libs = {};}

trice_libs['dragdrop'] = {
  run : function() {
    dragdrop.activate();
  }
}

var dragdrop = {

  end_handlers: [],

  activate: function() {
    if (window["dragdrop_active"]) return;
    dom.addEvent(document, 'mousedown', dragdrop.startDrag);
    dom.addEvent(document, 'mousemove', dragdrop.doDrag);
    dom.addEvent(document, 'mouseup', dragdrop.endDrag);
    window.dragdrop_active = 1;
  },

  addEndHandler: function(fnc) {
    dragdrop.end_handlers[dragdrop.end_handlers.length] = fnc;
  },

  /* pre dragging */
  
  startDrag: function(e) {
    /* already in drag mode */
    if (dragdrop.drag_el) return dom.cancelEvent(e);
    dragdrop.dragged_el = 0;
    dragdrop.dropped_el = 0;
    dragdrop.has_trail = 0;
    /* drag el */
    dragdrop.drag_el = dragdrop.getDragEl(e);
    if (!dragdrop.drag_el) return true;
    /* mark drag el */
    dom.addClass(dragdrop.drag_el, 'drag-active');
    if (dragdrop.getDropAreas().length) {
      /* activate drag trail */
      dragdrop.activateTrail(e);
      /* mark drop areas */
      dragdrop.markDropAreas();
    }
    else {
      dragdrop.activateDragEl(e);
    }
    /* prevent text selection */
    dom.cancelEvent(e);
    return false;
  },

  activateTrail: function(e) {
    /* trail */
    el = dom.elById('drag-trail');
    if (!el) {
      el = document.createElement('div');
      el.id = "drag-trail";
      dom.elByClass('page').appendChild(el);
    }
    /* position/scale trail */
    dom.setDim(el, dom.elDim(this.drag_el).w, 30);
    dom.setPos(el, dom.elPos(this.drag_el));
    el.style.display = 'block';
    /* offset between cursor pos and trail corner */
    var ev_pos = dom.getEventPos(e);
    var el_pos = dom.elPos(el);
    el.m_diff = {'x': ev_pos.x - el_pos.x, 'y': ev_pos.y - el_pos.y};
    dragdrop.has_trail = 1;
  },

  activateDragEl: function(e) {
    var ev_pos = dom.getEventPos(e);
    var el_pos = dom.elPos(dragdrop.drag_el);
    dragdrop.drag_el.m_diff = {'x': ev_pos.x - el_pos.x, 'y': ev_pos.y - el_pos.y};
  },

  getDragEl: function(e) {
    var el = dom.eTarget(e);
    if (!dom.parentByClass('drag-handle', el, 1)) return 0;
    el = dom.parentByClass('drag-item', el, 1);
    return el ? el : 0;
  },

  markDropAreas: function() {
    var els = this.getDropAreas();
    for (var i = 0; i < els.length; i++) {
      dom.addClass(els[i], 'drop-active');
    }
  },

  getDropAreas: function() {
    var cls = dom.mainClass(this.drag_el);
    return dom.elsByPath('.drop-area.' + cls + '-container');
  },

  getStartDropArea: function() {
    var cls = dom.mainClass(this.drag_el);
    return dom.parentByClass(cls + '-container', this.drag_el);
  },

  /* during dragging */

  doDrag: function(e) {
    if (!dragdrop.drag_el) return;
    var el = dragdrop.has_trail ? dom.elById('drag-trail') : dragdrop.drag_el;
    if (!el) return;
    var pos = dom.ePos(e);
    dom.setPos(el, pos.x - el.m_diff.x, pos.y - el.m_diff.y);
  },

  /* after dragging */

  endDrag: function(e) {
    /* not in drag mode */
    if (!dragdrop.drag_el) return;
    /* unmark drag el */
    dom.removeClass(dragdrop.drag_el, 'drag-active');
    /* unmark drop areas */
    dragdrop.unmarkDropAreas();
    /* move or copy */
    dragdrop.dropEl();
    /* deactivate trail */
    dragdrop.deactivateTrail();
    /* unset drag el */
    dragdrop.dragged_el = dragdrop.drag_el;
    dragdrop.drag_el = 0;
    dragdrop.onDragEnd();
  },

  dropEl: function() {
    var container_el = this.getTargetDropArea();
    if (!container_el) return;
    var sib_el = this.getClosestSibling(container_el);
    if (sib_el == this.drag_el) return;
    var el;
    var do_copy = dom.hasClass(dragdrop.drag_el, 'drag-copy');
    if (container_el == dragdrop.getStartDropArea()) do_copy = 0;
    if (do_copy) {
      el = this.drag_el.cloneNode(true);
      if (dragdrop.containerHasEl(container_el, el)) return;
    }
    else {
      el = this.drag_el.parentNode.removeChild(this.drag_el);
    }
    if (!sib_el) {/* move el to bottom */
      container_el.appendChild(el);
    }
    else {
      container_el.insertBefore(el, sib_el);
    }
    dragdrop.dropped_el = el;
  },

  onDragEnd: function() {
    for (var i = 0; i < dragdrop.end_handlers.length; i++) {
      dragdrop.end_handlers[i]();
    }
  },

  getClosestSibling: function(container_el) {
    var trail = dom.elById('drag-trail');
    var trail_pos = dom.elPos(trail);
    var trail_dim = dom.elDim(trail);
    var cls = dom.mainClass(this.drag_el);
    var sib_els = dom.elsByClass(cls, container_el);
    /* find the first el below the trail */
    for (var i = 0; i < sib_els.length; i++) {
      var sib_pos = dom.elPos(sib_els[i]);
      if (sib_pos.y < trail_pos.y) {
        continue;
      }
      if (sib_pos.y < (trail_pos.y + trail_dim.h)) {
        return sib_els[i];
      }
    }
    return 0;
  },

  getTargetDropArea: function() {
    var el = dom.elById('drag-trail');
    var els = this.getDropAreas();
    for (var i = 0; i < els.length; i++) {
      if (dom.isOver(el, els[i])) return els[i];
    }
    return 0;
  },

  deactivateTrail: function() {
    var el = dom.elById('drag-trail');
    if (!el) return;
    el.style.display = 'none';
  },

  unmarkDropAreas: function() {
    var els = dom.elsByClass('drop-active');
    for (var i = 0; i < els.length; i++) {
      dom.removeClass(els[i], 'drop-active');
    }
  },

  containerHasEl: function(c_el, el) {
    if (!window.micrordf) return false;
    var uri = micrordf.getItemURI(el);
    if (!uri) return false;
    var els = dom.elsByClass(dom.mainClass(el), c_el);
    for (var i = 0; i < els.length; i++) {
      if (micrordf.getItemURI(els[i]) == uri) return true;
    }
    return false;
  }
 
}

if (!window.trice_libs) {trice_libs = {};}

trice_libs['fx'] = {
  run : function() {
    fx.runAutoFadeOuts();
  }
}

var fx = {

  id_count: 0,
  el_vals: {},

  show: function(el_id) {
    var el = dom.elById(el_id);
    el.style.display = 'block';
    el.style.opacity = 1;
  },

  hide: function(el_id) {
    var el = dom.elById(el_id);
    el.style.display = 'none';
  },

  setOpacity: function(el_id, op) {
    var el = dom.elById(el_id);
    if (!el) return;
    if (op > 1) op = 1;
    if (op < 0) op = 0;
    el.style.opacity = op;
    el.style.filter = "alpha(opacity = " + (op*100) + ")";
  },

  /*  */

  fade: function(el_id, dir, dur) {
    if (!dur) dur = 1000;
    var el = dom.elById(el_id);
    if (!el) return;
    if (!el['fade_start']) el.fade_start = new Date().getTime();
    if (!el['fade_end']) el.fade_end = el.fade_start + dur;
    var t = new Date().getTime();
    var state = (t - el.fade_start) / (el.fade_end - el.fade_start);
    var op = (dir == 'out') ? 1 - state : state;
    fx.setOpacity(el, op);
    /* in case of flash(): delayed trice.loaded */
    if (typeof fx.el_vals[el.id] == 'string') {
      el.innerHTML = fx.el_vals[el.id];
      fx.el_vals[el.id] = false;
      trice.loaded();
    }
    if (state < 1) {
      setTimeout("fx.fade('" + el_id + "', '" + dir + "', " + dur + ")", 40);
    }
    else {
      el.fade_start = undefined;
      el.fade_end = undefined;
      if (dir == 'out') {
        el.style.display = 'none';
        setTimeout("fx.setOpacity('" + el_id + "', 1)", 100);
      }
    }
  },

  /*  */

  flash: function(el, val) {
    el = dom.elById(el);
    if (!el['id']) {
      fx.id_count++;
      el.id = 'fxid' + fx.id_count;
    }
    fx.setOpacity(el.id, 0);
    if (typeof val == 'string') {/* value has still to be set */
      fx.el_vals[el.id] = val;
    }
    setTimeout("fx.fade('" + el.id + "', 'in', 500)", 50);
  },

  /*  */

  runAutoFadeOuts: function() {
    var els = dom.elsByClass('fade-out');
    for (var i = 0; i < els.length; i++) {
      if (!els[i]['id']) {
        fx.id_count++;
        els[i].id = 'fxid' + fx.id_count;
      }
      dom.removeClass(els[i], 'fade-out');
      setTimeout("fx.fade('" + els[i]['id'] + "', 'out', 500)", 2000);
    }
  },
  
  /*  */

  scaleH: function(el_id, end_h, dur) {
    if (!dur) dur = 1000;
    var el = dom.elById(el_id);
    if (!el) return;
    if (!el['id']) {
      fx.id_count++;
      el.id = 'fxid' + fx.id_count;
    }
    var t = new Date().getTime();
    if (!el['scale_start']) el.scale_start = t;
    if (!el['scale_end']) el.scale_end = el.scale_start + dur;
    if (!el['scale_start_h']) el.scale_start_h = dom.elDim(el).h;
    var state = (t - el.scale_start) / (el.scale_end - el.scale_start);
    var h = el.scale_start_h + ((end_h - el.scale_start_h) * state);
    if (state > 0.99) {
      h = end_h;
    }
    dom.setH(el, h);
    if (h != end_h) {
      setTimeout("fx.scaleH('" + el.id + "', '" + end_h + "', " + dur + ")", 40);
    }
    else {
      el.scale_start = undefined;
      el.scale_end = undefined;
      el.scale_start_h = undefined;
    }
  },

  /*  */
  
  slideOut: function(el_id, dir, dur) {
    if (!dur) dur = 1000;
    var el = dom.elById(el_id);
    if (!el) return;
    el.innerHTML = '';
  }

  /*  */

}

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')) {
        trice.loaded();
        return;
      }
      var body = dom.elByTag('body');
      var el = document.createElement('div');
      el.id = 'trice-ajax-area';
      if (body['appendChild']) {
        body.appendChild(el);
        trice.loaded();
      }
      else if (trice.loading) {
        trice.runTO = setTimeout("trice.init()", 100);
      }
    }
    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) {
    url = url ? url : location.href;
    url = url.replace(/\#.*$/, '');
    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) {
  	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 ? '?' + 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;
  }


};

