/**
 * Eeip 1.1 - epointment edit in place (or 'easiest edit in place')
 *
 * (c) 2006 http://www.epointment.com
 *
 * Author: Peter C. Verhage <peter@epointment.com>
 *
 * Eeip is freely distributable under the terms of a BSD-style license.
 * Eeip is provided as-is, with absolutely no warranty of any kind.
 *
 * For details, see the Eeip web site: http://www.epointment.com/software/eeip
 *
 * (prototype is included to make the demo work out of the box, see the
 * prototype.js file for prototype details)
 */


document.getElementsByTagNames = function(tagNames, parentElement) {
  var list = tagNames.split(',');
  var children = ($(parentElement) || document.body).getElementsByTagName('*');
  return $A(children).inject([], function(elements, child) {
    if (list.include(child.tagName.toLowerCase()))
      elements.push(child);
    return elements;
  });
}

if (typeof(Epointment) == 'undefined')
{
  var Epointment = {};
}

Epointment.EditObserver = Class.create();
Epointment.EditObserver.prototype = {
  IDENTIFIER: '@epointment::click@',

  initialize: function(parentElement) {
    this.parentElement = parentElement;
    Event.observe(window, 'load', this.onWindowLoad.bind(this));
  },

  onWindowLoad: function() {
    var observer = this;
    var parent = this.parentElement ? $(this.parentElement) : document.body;
    if (parent == null) return;
    document.getElementsByClassName('editable', parent).each(function(element) {
      if (element.tagName.toLowerCase() == 'a') {
        element.href = 'javascript:void(0)';
      }
      Event.observe(element, 'click', observer.onElementEvent.bind(observer, element));
    });
  },

  locateCursor: function(element, event) {
    if (element.innerHTML.length == 0) { 
      element.innerHTML = this.IDENTIFIER;
    }
    else if (document.body && document.body.createTextRange) {
      var range = document.body.createTextRange();
      range.moveToPoint(event.clientX, event.clientY);
      range.pasteHTML(this.IDENTIFIER);
    }
    else if (document.createRange && event.rangeParent) {
      var range = document.createRange();
      range.setStart(event.rangeParent, event.rangeOffset);
      range.setEnd(event.rangeParent, event.rangeOffset);
      range.collapse(true);
      var node = document.createTextNode(this.IDENTIFIER);
      range.insertNode(node)
      range.detach();
    }

    var text = element.innerHTML.unescapeHTML();
    var index = text.indexOf(this.IDENTIFIER);
    return index;
  },

  moveCursor: function(element, index) {
    element.focus();

    if (element.setSelectionRange) {
      element.setSelectionRange(index, index);
    }
    else if (element.createTextRange) {
      var range = element.createTextRange();
      range.collapse(true);
      range.moveEnd('character', index);
      range.moveStart('character', index);
      range.select();
    }
  },

  onElementEvent: function(element, event) {
    var widget = $(element.id + '_widget');
    if (widget == null) return;

    var index = this.locateCursor(element, event);

    Element.hide(element);
    Element.show(widget);

    var tagElements = document.getElementsByTagNames('input,select,textarea', widget);
    for (var i = 0; i < tagElements.length; i++) {
      if (tagElements[i].type != 'hidden') {
        this.moveCursor(tagElements[i], index);
        return;
      }
    }
  }
};
