function $(id) {
  return document.getElementById(id);
}

function realId(obj) {
  if (!obj || !obj.id) return '';
  return obj.id.replace(/.*\_\_/, '');
}

function GetNode(ev) {
  if (!ev) ev = window.event;
  var node = ev.target ? ev.target : ev.srcElement;
  while (node && !node.id) node = node.parentNode;
  return node;
}

function onFocus(event) {
  //$('debuginfo').innerHTML = event.target.id + '.focus<br>' + $('debuginfo').innerHTML;
  if (!event.target.origHTML) event.target.origHTML = event.target.innerHTML;
}

function onBlur(event) {
  //$('debuginfo').innerHTML = event.target.id + '.blur<br>' + $('debuginfo').innerHTML;
  if (event.target.origHTML != event.target.innerHTML) {
    $('debuginfo').innerHTML = 'changed ' + event.target.id + ' from <pre>' + event.target.origHTML + '</pre><br><pre>    to ' + event.target.innerHTML + $('debuginfo').innerHTML + '</pre>';
    updateProp(event.target.id, 'innerHTML', event.target.innerHTML);
  }
}

function updateProp(id, what, value) {
//  dojo.style('editedprops', "display", "block");
  document.globalform.action= currentSelectHref + "action=editedprops";
  input = dojo.query('input[name=' + id + '__' + what + ']', 'editpropstable');
  if (input.length) {
    input.attr('value', value);
    $('editpropstable').innerHTML = $('editpropstable').innerHTML; // triggers refresh
  }
  else $('editpropstable').innerHTML = '<tr><td>' + id + '</td><td>' + what + '</td><td><input name="' +  id + '__' + what + '" class="' + what + '" value="' + value + '"></td></tr>' + $('editpropstable').innerHTML;
}

function submit(href) {
  updateProps();
  document.globalform.action= (href ? href + '&' : currentSelectHref) + "action=editedprops";
  document.globalform.submit();
}

function updateProps() {
  // is necessary because we don't get Ctrl+Z
  dojo.query('.innerHTML', 'editprops').forEach(function(item) {
    item.attr('value', $(item.name).innerHtml);
  });
}

function makeEditable(node) {
  if (!node.id) return false;
//  if (node.contentEditable) return true;
  dojo.attr(node, {'contentEditable':true});
  node.addEventListener('blur', onBlur, false);
  node.addEventListener('focus', onFocus, false);
  node.addEventListener('DOMAttrModified', function (event) {
    if (!event.target.id) return;
    $('debuginfo').innerHTML = (event.target.id + '.' + event.attrName + " changed from " + event.prevValue + " to " + event.newValue + ".<br>" + $('debuginfo').innerHTML);
    onAttrModified(event);
    if (!event.attrName.match(/\_moz\_/) && !node.id.match(/editmenu\_/)) updateProp(event.target.id, event.attrName, event.newValue);}, false);
  node.onkeydown = function (event) {
    if (event.keyCode == 13)
      if (event.ctrlKey) document.execCommand('insertHTML', false, '<br>');
    return (event.keyCode != 13);
  }
  return true;
}

function makeChildrenEditable(node) {
  var child = node.firstChild;
  var res   = false;
  while (child) {
    res = makeChildrenEditable(child) || makeEditable(child) || res;
    child = child.nextSibling;
  }
  return res;
}

function doEdit()
{
  dojo.query("a").attr('href', 'javascript:');
  makeChildrenEditable($('body'));
}

function onAttrModified(event) {
  // if absolute position is shown via coloring bg to white, recolor texts from white to grey and vice-versa
  if (event.attrName == "_moz_abspos" && event.target.id) {
    dojo.query("#" + event.target.id + " *").forEach(function(item){
      if (event.newValue == 'white' && dojo.style(item, 'color') == 'rgb(255, 255, 255)') dojo.style(item, 'color', 'rgb(128, 128, 129)');
      if (!event.newValue           && dojo.style(item, 'color') == 'rgb(128, 128, 129)') dojo.style(item, 'color', 'white');
    });
  }
}

var inMenu = false;

function MouseDown(ev) {
  if (!inMenu) HideMenu();
}

function HideMenu() {
  $('editmenu').style.display = 'none';
}

var editNode;

function ContextMenu(ev) {
  if (!ev) ev = window.event;
  var node = GetNode(ev);
  if (!node) return;
  if (node.firstChild && node.firstChild.nodeValue)
    if (node.firstChild.nodeValue.length > 10)
      $('editmenu_name').firstChild.nodeValue = node.firstChild.nodeValue.substr(0,10) + '...';
    else
      $('editmenu_name').firstChild.nodeValue = node.firstChild.nodeValue;
  else
    $('editmenu_name').firstChild.nodeValue = 'id: '+realId(node);

  $('editmenu').style.display = 'none';

  ContextMenuUpDownClone(node);

  $('editmenu_edit').style.display = 'none';
  $('editmenu_edit').href = 'javascript:';
  $('editmenu_edit').onclick = function (){
    dojo.query("a").forEach(function(item) {
      alert(item);
      item = dojo.byId(item);
      alert(item);
//      if (!dojo.byId(item).attr) alert('NO attr: ' + item); else
      if (!item.attr('href').match(/^javascript:/))
        item.attr('href', 'javascript: submit(' + item.attr('href') + ')');
    });
    makeEditable(node);
    HideMenu();
  };
  $('editmenu_edit').href = 'javascript:';
//  $('editmenu_edit').style.display = 'block';

  ContextMenuDelItem(node);

  var scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
  var scrollLeft = document.body.scrollLeft ? document.body.scrollLeft : document.documentElement.scrollLeft;
  $('editmenu').style.left = ev.clientX + scrollLeft + 'px';
  $('editmenu').style.top  = ev.clientY + scrollTop + 'px';
  $('editmenu').style.display = 'block';

  return false;
}

function ContextMenuUpDownClone(node) {
  var pnode = node.parentNode;
  if (pnode && (pnode.className == 'link' || pnode.className == 'href')) {
    ContextMenuUpDownClone(pnode);
    return;
  }
  if (pnode && (pnode.className == 'group' || pnode.className == 'basicgroup')) {
    if (pnode.firstChild == node) $('editmenu_up').removeAttribute('href'); else $('editmenu_up').href = currentSelectHref+'action=up&id='+realId(pnode)+'&item='+realId(node);
    $('editmenu_up').style.display = 'block';
    if (pnode.lastChild == node) $('editmenu_down').removeAttribute('href'); else $('editmenu_down').href = currentSelectHref+'action=down&id='+realId(pnode)+'&item='+realId(node);
    $('editmenu_down').style.display = 'block';
    $('editmenu_clone').href = currentSelectHref+'action=clone&id='+realId(pnode)+'&item='+realId(node);
    $('editmenu_clone').style.display = 'block';
  }
  else {
    $('editmenu_up').style.display = 'none';
    $('editmenu_down').style.display = 'none';
    $('editmenu_clone').style.display = 'none';
  }
}

function ContextMenuDelItem(node) {
  $('editmenu_del').style.display = 'block';
  var pnode = node.parentNode;
  if (pnode && pnode.className == 'href') {
    ContextMenuDelItem(pnode);
    return;
  }
  if (pnode && (pnode.className == 'group' || pnode.classname == 'link' || pnode.className == 'basicgroup')) {
    $('editmenu_del').href = currentSelectHref+'action=delitem&id='+realId(pnode)+'&item='+realId(node);
  }
  else {
    $('editmenu_del').removeAttribute('href');
  }
}

function Init() {
  $('editmenu').onmouseover = function() { inMenu = true; };
  $('editmenu').onmouseout  = function() { inMenu = false; };
  document.body.onmousedown   = MouseDown;
  document.body.oncontextmenu = ContextMenu;
  var is = document.getElementsByTagName("input");
  for (var i = 0; i < is.length; i++) {
    if (!is[i].getAttribute('disabled') && dojo.style(is[i], 'display') != 'none') {
      is[i].focus();
      return;
    }
  }
//  $('root').addEventListener('blur', onBlur, true);
//  $('root').addEventListener('focus', onFocus, true);
}


