
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');
    }
  },
  
  prevNodeByClass: function(el, c) {
    while (el = el.previousSibling) {
      if (dom.hasClass(el, c)) return el;
    }
  },

  nextNodeByClass: function(el, c) {
    while (el = el.nextSibling) {
      if (dom.hasClass(el, c)) return el;
    }
  },

  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};
  },
  
  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) {
    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;
    var x = "" + pos.x;
    var y = "" + pos.y;
    el.style.top = y.match("%") ? y : y + 'px';
    el.style.left = x.match("%") ? x : 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 = '<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) {
    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 = ''+
  			'<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);
    }
    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);
    if (!top['request_count']) top.request_count = 0;
    top.request_count++;
    top.location.hash = '#' + top.request_count;
    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["stats"] = {
  run : function() {
    stats.trackRequest();
  }
}

var stats = {

  trackRequest : function() {
    var el;
    if (!window['request_tracked']) {
      window.request_tracked = 1;
      var href = location.href;
      var rf = document['referrer'] ? document.referrer : '';
      var rm = window.request_method;
      var img = new Image();
      img.src = window.root_path + 'stats/request?url=' + escape(href) + '&rf=' + escape(rf) + '&rm=' + escape(rm) + '&title=' + escape(document.title);
      //if (window['console']) console.log(img.src);
    }
  }

}



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;
    if (dom.hasClass(el, 'drag-handle')) {
      var el = dom.parentByClass('draggable', el);
      if (dom.hasClass(el, 'nomove')) {
        var trail = document.createElement('div');
        trail.id = "drag-trail";
        trail["_source"] = el;
        dom.setDim(trail, dom.elDim(el));
        dom.setPos(trail, dom.elPos(el));
        dom.elByTag('body').appendChild(trail);
        return trail;
      }
      return el;
    }
    return 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];
      if (dom.hasClass(cell, 'nodrop')) continue;
      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, 'auto', dom.elDim(this.drag_el).h);
    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;
    dom.cancelEvent(e);
    var dz = dom.elById('dropzone');
    var cell = 0;
    if (dz) {
      if (this.drag_cell) {/* source container */
        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, dz);
    if (this.drag_el['_source'] && this.drag_el['_source']['_ondrop']) this.drag_el._source._ondrop(this.drag_el, dz);
    if (trice['_ondrop']) trice._ondrop(this.drag_el, dz);
    this.drag_el = null;
    try {clearInterval(this.hlTO)} catch(e){}
  }  
 
};

if (!window.trice_libs) {trice_libs = {};}

trice_libs['fx'] = {
  run : function() {
  }
}

var fx = {

  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';
  },

  fadeOut: function(el_id, op) {
    if (!op) var op = 9;
    var el = dom.elById(el_id);
    if (el) {
      el.style.opacity = op/10;
      if (op <= 1) {
        el.style.display = 'none';
        setTimeout("dom.elById('" + el_id + "').style.opacity = 1", 500);
      }
      else {
        setTimeout("fx.fadeOut('" + el_id + "', " + (op - 1) + ")", 100);
      }
    }
  }
 
};

if (!window.trice_libs) {trice_libs = {};}

trice_libs['paggr'] = {
  run : function() {
    paggr.activateColHandles();
    paggr.activateItems();
    paggr.activateWidgets();
    paggr.activatePreviewWidgets();
    paggr.checkMaps();
  }
}

var paggr = {

  /* toggle */
  
  toggleAll: function() {
    var el = dom.elByClass('canvas');
    if (dom.hasClass(el, 'min-all')) {
      dom.removeClass(el, 'min-all');
    }
    else {
      dom.addClass(el, 'min-all');
    }
  },

  /* col handles */

  activateColHandles: function() {
    var els = dom.elsByClass('col-handle');
    for (var i = 0; i < els.length; i++) {
      paggr.activateColHandle(els[i]);
    }
    dom.addEvent(document, 'mouseup', function(e) {paggr.endColDrag(e)});
    dom.addEvent(document, 'mousemove', function(e) {paggr.doColDrag(e)});
  },
  
  activateColHandle: function(el) {
    if (el['activated']) return 1;
    dom.addEvent(el, 'mousedown', function(e) {paggr.startColDrag(e, el)});
    el.activated = 1;
  },
  
  startColDrag: function(e, el) {
    var e = e || window.event;
    dom.cancelEvent(e);/* prevent text selection */
    this.is_col_dragging = 1;
    this.start_pos = dom.getEventPos(e).x;
    this.l_col = dom.prevNodeByClass(el, "col");
    this.r_col = dom.nextNodeByClass(el, "col");
    this.l_col_start_w = dom.elDim(this.l_col).w;
    this.r_col_start_w = dom.elDim(this.r_col).w;
  },

  doColDrag: function(e, el) {
    var e = e || window.event;
    if (!this.is_col_dragging) return 1;
    dom.cancelEvent(e);/* prevent text selection */
    var diff = dom.getEventPos(e).x - this.start_pos;
    if (this.l_col_start_w + diff < 5) diff = 5 - this.l_col_start_w;
    if (this.r_col_start_w - diff < 5) diff = this.r_col_start_w - 5;
    this.l_col.style.width = this.l_col_start_w + diff + 'px';
    this.r_col.style.width = this.r_col_start_w - diff + 'px';
  },

  endColDrag: function(e) {
    if (!this.is_col_dragging) return 1;
    this.is_col_dragging = 0;
    var full_w = dom.elDim(this.l_col.parentNode).w;
    var l_w = dom.elDim(this.l_col).w;
    var r_w = dom.elDim(this.r_col).w;
    var rel_l_w = parseFloat(100 * l_w)/full_w;
    var rel_r_w = parseFloat(100 * r_w)/full_w;
    this.l_col.style.width = rel_l_w + '%';
    this.r_col.style.width = rel_r_w + '%';
    var hook = dom.elByClass('resize-cols-hook');
    hook.ajax_href += hook.ajax_href.match(/\?/) ? '&' : '?';
    hook.ajax_href += this.l_col.id + '=' + rel_l_w+ '&' + this.r_col.id + '=' + rel_r_w;
    ajax.callLink(hook);
    hook.ajax_href = hook.ajax_href.replace(/^(.*)\?.*$/, '$1');
  },
  
  /* item handles */

  activateItems: function() {
    var els = dom.elsByClass('widget-item');
    for (var i = 0; i < els.length; i++) {
      /* handle */
      var handle = dom.elByClass('item-drag-handle', els[i]);
      if (handle) paggr.activateItemHandle(handle, els[i]);
      paggr.activateItem(els[i]);
    }
    dom.addEvent(document, 'mouseup', function(e) {paggr.endItemDrag(e)});
    dom.addEvent(document, 'mousemove', function(e) {paggr.doItemDrag(e)});
  },
  
  activateItemHandle: function(handle, el) {
    if (handle['activated']) return 1;
    dom.addEvent(handle, 'mousedown', function(e) {paggr.startItemDrag(e, el)});
    dom.addEvent(handle, 'mouseup', function(e) {dom.elByTag('input', el).select()});
    //dom.addEvent(handle, 'click', function(e) {var e = e || window.event; dom.cancelEvent(e); return false});
    
    handle.activated = 1;
  },
  
  activateItem: function(el) {
    if (el['activated']) return 1;
    dom.addEvent(el, 'mouseover', function(e) {paggr.markOverItem(e, el)});
    dom.addEvent(el, 'mouseout', function(e) {paggr.markOutItem(e, el)});
    el.activated = 1;
  },
  
  markOverItem: function(e, el) {
    if (!this.dragged_item) return 1;
    var e = e || window.event;
    dom.cancelEvent(e);/* prevent text selection */
    dom.addClass(el, "hovered");
    this.over_item = el;
  },
  
  markOutItem: function(e, el) {
    if (!this.dragged_item) return 1;
    var e = e || window.event;
    dom.cancelEvent(e);/* prevent text selection */
    dom.removeClass(el, "hovered");
    this.over_item = null;
  },
  
  startItemDrag: function(e, el) {
    var e = e || window.event;
		if(e && (typeof(e["button"]) != "undefined") && (e.button < 2)){/* only left button */
      dom.cancelEvent(e);/* prevent text selection */
      /* trail */
      var trail = document.createElement('div');
      trail.id = "item-trail";
      dom.setDim(trail, dom.elDim(el));
      trail.style.position = 'absolute';
      trail.style.zIndex = 100;
      var el_pos = dom.elPos(el);
      dom.elByTag('body').appendChild(trail);
      this.dragged_item = el;
      this.doItemDrag(e);
    }
    else {
      dom.elByTag('input', el).select();
    }
  },
  
  doItemDrag: function(e) {
    if (!this.dragged_item) return 1;
    var e = e || window.event;
    dom.cancelEvent(e);/* prevent text selection */
    var ev_pos = dom.getEventPos(e);
    var el = dom.elById("item-trail");
    if (el) {
      dom.setPos(el, ev_pos.x +5, ev_pos.y + 5);
    }
  },
  
  endItemDrag: function(e) {
    if (!this.dragged_item) return 1;
    if (this.over_item) {
      var drag_handle = dom.elByTag('input', dom.elByClass('item-drag-handle', this.dragged_item));
      var drag_val = drag_handle.value;
      /* filter */
      if (dom.hasClass(this.over_item, 'filter-area')) {
        dom.elByClass('filter-input', this.over_item).value = drag_val;
      }
      /* annotate */
      else {
        var drop_handle = dom.elByTag('input', dom.elByClass('item-drag-handle', this.over_item));
        var drop_val = drop_handle.value;
        var hook = dom.elByClass('annotation-hook');
        hook.ajax_href += hook.ajax_href.match(/\?/) ? '&' : '?';
        hook.ajax_href += 'src=' + escape(drag_val) + '&trgt=' + escape(drop_val);
        ajax.callLink(hook);
        hook.ajax_href = hook.ajax_href.replace(/^(.*)\?.*$/, '$1');
        //this.showSysMessage('dropped ' + this.dragged_item.innerHTML + ' on ' + this.over_item.innerHTML + '.<br />No link rules defined.');
      }
      //dom.elById('debug').innerHTML = 'dropped "' + this.dragged_item.innerHTML + '" on "' + this.over_item.innerHTML + '"';
      paggr.markOutItem(e, this.over_item);
    }
    this.dragged_item = 0;
    var el = dom.elById('item-trail');
    if (el) el.parentNode.removeChild(el);
  },
  
  /* sys msg */
  
  showSysMessage: function(val) {
    var el = dom.elById('sys-msg');
    el.innerHTML = val;
    var full_w = dom.elDim(dom.elByClass('canvas')).w;
    dom.setPos(el, full_w/2 - 200, '20%');
    fx.show('sys-msg');
    setTimeout("fx.fadeOut('sys-msg')", 4000);
  },
  
  /* new page */
  
  showPagePathForm: function(val) {
    if (!val) return 1;
    var el = dom.elById('sys-msg');
    el.innerHTML = val;
    var full_w = dom.elDim(dom.elByClass('canvas')).w;
    dom.setPos(el, full_w/2 - 200, '20%');
    fx.show('sys-msg');
  },
  
  showWidgetSelector: function(val) {
    ajax.updateEl(val);
    fx.show('widget-selector');
  },
  
  /* widgets */
  
  activateWidgets: function() {
    var els = dom.elsByClass('widget');
    for (var i = 0; i < els.length; i++) {
      paggr.activateWidget(els[i]);
    }
  },
  
  activateWidget: function(el) {
    el._ondrop = function(drag_el, dz) {
      var widget = drag_el.parentNode;
      var widget_id = widget.id;
      /* col */
      var col = dom.parentByClass('col', drag_el);
      var col_id = col.id;
      var els = col.childNodes;
      var pos = 0;
      for (var i = 0; i < els.length; i++) {
        if (els[i]['id']) {
          if (els[i]['id'] == widget_id) break;
          pos++;
        }
      }
      var uri = dom.elByClass('drag-handle', widget).href;
      var hook = dom.elByClass('move-widget-hook');
      hook.ajax_href += hook.ajax_href.match(/\?/) ? '&' : '?';
      hook.ajax_href += 'col=' + col_id + '&pos=' + (pos - 1) + '&widget=' + escape(uri);
      ajax.callLink(hook);
      hook.ajax_href = hook.ajax_href.replace(/^(.*)\?.*$/, '$1');
    };
    /* filters */
    var el = dom.elByClass('filter-input', el);
    if (el) {
      el.prev_value = el.value;
      dom.addEvent(el, 'focus', function(e){paggr.trackFilter(el)});
      dom.addEvent(el, 'mouseover', function(e){paggr.trackFilter(el)});
      dom.addEvent(el, 'blur', function(e){paggr.stopFilter(el)});
    }
  },
  
  trackFilter: function(el) {
    try { window.clearTimeout(window.filter_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.filter_submit_to); } catch(e) {}
        //dom.parentByTag('form', el.id).target="_debug";
        window.filter_submit_to = window.setTimeout("paggr.filterWidget('" + el.id + "')", 1000);
      }
      window.filter_track_to = window.setTimeout("paggr.trackFilter('" + el.id + "')", 250);
      el.prev_value = val;
    }
  },
  
  stopFilter : function(el) {
    try { window.clearTimeout(window.filter_track_to); } catch(e) {}
    try { window.clearTimeout(window.filter_submit_to); } catch(e) {}
  },
  
  filterWidget: function(el) {
    var el = dom.elById(el);
    var val = el.value;
    var hook = dom.elByClass('reload', dom.parentByClass('widget', el));
    hook.ajax_href += '&' + el.id + '=' + escape(val);
    ajax.callLink(hook);
  },
  
  /* preview widgets */
  
  activatePreviewWidgets: function() {
    var els = dom.elsByClass('widget-preview');
    for (var i = 0; i < els.length; i++) {
      paggr.activatePreviewWidget(els[i]);
    }
  },
  
  activatePreviewWidget: function(el) {
    el._ondrop = function(drag_el, dz) {
      var widget = drag_el._source;
      drag_el.style.display = 'none';
      /* col */
      var col = dom.parentByClass('col', dz);
      var col_id = col.id;
      var els = col.childNodes;
      var pos = 0;
      for (var i = 0; i < els.length; i++) {
        if (els[i]['id']) {
          if (els[i]['id'] == 'dropzone') break;
          pos++;
        }
      }
      var uri = dom.elByClass('drag-handle', widget).href;
      var hook = dom.elByClass('add-widget-hook');
      hook.ajax_href += hook.ajax_href.match(/\?/) ? '&' : '?';
      hook.ajax_href += 'col=' + col_id + '&pos=' + (pos - 1) + '&widget=' + escape(uri);
      ajax.callLink(hook);
      hook.ajax_href = hook.ajax_href.replace(/^(.*)\?.*$/, '$1');
    };
  },
  
  showAnnotationForm: function(val) {
    if (!val) return 1;
    var el = dom.elById('annotation-win');
    el.innerHTML = val;
    var full_w = dom.elDim(dom.elByClass('canvas')).w;
    dom.setPos(el, full_w/2 - 400, dom.scrollPos().y + 150);
    fx.show('annotation-win');
  },
  
  checkMaps: function() {
    if (!dom.elById('gmap-script')) {
      var el = document.createElement("script");
      var api_key = 'ABQIAAAAfa92YFZ-JDOjYwYJg6kCIhQ0YpOyE949BI0_SKeDzhZGvOCaOhQmefSRg6aQVEfwf53334BK4SRXPw';
      if (window.root_path != '/') api_key = 'ABQIAAAAfa92YFZ-JDOjYwYJg6kCIhR2FljB09TvstGedhvtZqVlZ8B_rRQXUv_vleTax5emNSfAVZrf-mvIpA';
      el.setAttribute("src", "http://maps.google.com/maps?file=api&v=2.x&key=" + api_key + "&c&async=2&callback=paggr.mapLoaded");
      el.setAttribute("type", "text/javascript");
      el.id = 'gmap-script';
      dom.elByTag('head').appendChild(el);
    }
    if (!this.map_loaded) {
      return setTimeout("paggr.checkMaps()", 1000);
    }
    /* loaded */
    if (GBrowserIsCompatible()) {
      var els = dom.elsByClass('map-hook');
      for (var i = 0; i < els.length; i++) {
        dom.removeClass(els[i], 'map-hook');
        var lat = 50.1;
        var lon = 13.4;
        var add_marker = 0;
        var zoom = 5;
        if (dom.elByClass('lat', els[i]) && dom.elByClass('lat', els[i]).innerHTML) {
          lat = dom.elByClass('lat', els[i]).innerHTML;
          lon = dom.elByClass('lon', els[i]).innerHTML;
          add_marker = 1;
          zoom = 13;
        }
        var map = new GMap2(els[i]);
        map.checkResize();
        map.addControl(new GLargeMapControl());
        var point = new GLatLng(parseFloat(lat), parseFloat(lon));
        map.setCenter(point, zoom);
        if (add_marker) {
          var marker = new GMarker(point);
          GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml('<b>Lat:</b> ' + lat + '<br /><b>Long:</b> ' + lon);});
          map.addOverlay(marker);
        }
      }
    }
  },
  
  mapLoaded: function() {
    this.map_loaded =1;
  }
  
   
};


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);
    dom.addEvent(this, 'keydown', form.textareaKeydown);
  },
  
  textareaKeyup : function(e) {
    //form.resizeTextarea(this);
  },
  
  textareaKeydown : function(e) {
    var e = e || window.event;
    var el = this;
    var kc = e.which ? e.which : e.keyCode;
    if (kc && (kc == 9)) {
      dom.cancelEvent(e);
      form.injectTab(this);
      setTimeout("dom.elById('" + this.id + "').focus();", 20);	
   		return false;
    }
  },
  
  injectTab: function(el) {
  	if (el.setSelectionRange) {
      var sel_start = el.selectionStart;
      var sel_end = el.selectionEnd;
  		el.value = el.value.substring(0, sel_start)+ "\t" + el.value.substring(sel_end);
      el.focus();
      el.setSelectionRange(sel_start + 1, sel_start + 1);
    }
    else if (document.selection) {
  		var r = document.selection.createRange();
  		if (r.parentElement() == el) {
        r.text = "\t";
        range.moveStart('character', -1);
        range.select();
      }
    }
  },

  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['theme'] = {
  run : function() {
  }
}

var theme = {


};

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


};

