/* Copyright (c) 2007 Infoteria Corp USA. All rights reserved. */

Lingr = function() {};
Lingr.MenuMgr = Class.create();
Lingr.MenuMgr.prototype = {
	initialize: function()
  {
    this.activeMenuOuterWrapper = null;
	},
	
	initMenus: function()
	{
    document.getElementsByClassName('menuActivator').each(function(elem) { Event.observe(elem, 'click', this.onMenuActivatorClick.bindAsEventListener(this) ) }.bind(this));
    document.getElementsByClassName('menuItem').each(function(elem) { Event.observe(elem, 'click', this.onMenuItemClick.bindAsEventListener(this) ) }.bind(this));
	},
	
	getMenuWrapperFromOuterWrapper: function(outerWrapper)
	{
	  return document.getElementsByClassName('menuWrapper', outerWrapper)[0];
	},
	
	getOuterWrapperFromElement: function(element)
	{
	  var ret = element.parentNode;
	  while (!Element.hasClassName(ret, 'menuOuterWrapper'))
	  {
	    ret = ret.parentNode;
	  }
	  
	  return ret;
	},
	
  activateMenu: function(outerWrapper)
  {
    if (this.activeMenuOuterWrapper)
    {
      this.deactivateMenu(this.activeMenuOuterWrapper);
    }
    
    if (/MSIE/.test(navigator.userAgent) && $('profile') && Element.visible($('profile'))) /* should just check the Chatroom.IE flag */
    {
      chatroom.profile.hide();
    }

    Element.addClassName(outerWrapper, 'active');
    Element.addClassName(this.getMenuWrapperFromOuterWrapper(outerWrapper), 'active');
    Event.observe(document, 'mousedown', this.onDocumentClickWhileMenuActive.bindAsEventListener(this));
    Event.observe(document, 'keydown', this.onDocumentKeyDownWhileMenuActive.bindAsEventListener(this));

    this.activeMenuOuterWrapper = outerWrapper;
  },

  deactivateMenu: function(outerWrapper)
  {
    Element.removeClassName(outerWrapper, 'active');
    Element.removeClassName(this.getMenuWrapperFromOuterWrapper(outerWrapper), 'active');
    Event.stopObserving(document, 'mousedown', this.onDocumentClickWhileMenuActive.bindAsEventListener(this));
    Event.stopObserving(document, 'keydown', this.onDocumentKeyDownWhileMenuActive.bindAsEventListener(this));
    this.activeMenuOuterWrapper = null;
  },

  processMenuClick: function(wrapper)
  {
    if (Element.hasClassName(wrapper, 'active'))
    {
      this.deactivateMenu(wrapper);
    }
    else
    {
      this.activateMenu(wrapper);
    }
  },
  
  onMenuActivatorClick: function(event)
  {
    this.processMenuClick(this.getOuterWrapperFromElement(Event.element(event)));
    Event.stop(event);
  },

  onMenuItemClick: function(event)
  {
    this.deactivateMenu(this.getOuterWrapperFromElement(Event.element(event)));
  },

  onDocumentClickWhileMenuActive: function(event)
  {
    var elem = Event.element(event);
    
    if (this.activeMenuOuterWrapper && !Element.childOf(elem, this.activeMenuOuterWrapper))
    {
      this.deactivateMenu(this.activeMenuOuterWrapper);
    }
  },

  onDocumentKeyDownWhileMenuActive: function(event)
  {
    if (event.keyCode == Event.KEY_ESC) 
    {
      this.deactivateMenu(this.activeMenuOuterWrapper);
  	}
  }
}

menuMgr = new Lingr.MenuMgr();

Lingr.InPlaceEditorMgr = Class.create();
Lingr.InPlaceEditorMgr.prototype = {
	initialize: function()
  {
	},
	
	initInPlaceEditors: function()
	{
    document.getElementsByClassName('inPlaceEditorStaticField').each(function(elem) { 
      Event.observe(elem, 'click', this.enterEditMode.bindAsEventListener(this) ) }.bind(this));
      document.getElementsByClassName('inPlaceEditorFormField').each(function(elem) { 
        Event.observe(elem, 'keydown', this.handleKeyDown.bindAsEventListener(this) ) }.bind(this));
      
	},

	getStaticFieldFromWrapper: function(wrapper)
	{
	  return document.getElementsByClassName('inPlaceEditorStaticField', wrapper)[0];
	},
	
	getFormFromWrapper: function(wrapper)
	{
	  return document.getElementsByClassName('inPlaceEditorForm', wrapper)[0];
	},
	
	getFormFieldFromWrapper: function(wrapper)
	{
	  return document.getElementsByClassName('inPlaceEditorFormField', wrapper)[0];
	},
	
	getWrapperFromCancelLink: function(link)
	{
	  return link.parentNode.parentNode;
	},
	
	getWrapperFromForm: function(form)
	{
	  return form.parentNode;
	},
	
	getWrapperFromFormField: function(field)
	{
	  return field.parentNode.parentNode;
	},
	
	getWrapperFromStaticField: function(field)
	{
	  return field.parentNode;
	},
	
	getSavingFieldFromWrapper: function(wrapper)
	{
	  return document.getElementsByClassName('inPlaceEditorSaving', wrapper)[0];
	},
	
	getWrapperFromId: function(id)
	{
	  return $('inPlaceEditorWrapper-' + id);
	},
	
	getOldValueFieldFromWrapper: function(wrapper)
	{
	  var form = this.getFormFromWrapper(wrapper);
	  return this.getFormFromWrapper(wrapper).oldvalue;
	},
	
	enterEditMode: function(event)
	{
	  if (this.editing || this.saving)
	  {
	    return false;
	  }
	  
	  this.editing = true;
	  var staticField = Event.element(event);
	  var wrapper = this.getWrapperFromStaticField(staticField);
	  var form = this.getFormFromWrapper(wrapper);
    var formField = this.getFormFieldFromWrapper(wrapper);
    var oldValueField = this.getOldValueFieldFromWrapper(wrapper);
    
	  Element.hide(staticField);
	  formField.value = staticField.innerHTML.unescapeHTML();
	  oldValueField.value = formField.value;
	  Element.show(form);
    Field.scrollFreeActivate(formField);

    Event.stop(event);
    this.editing = true;
    return false;
	},
	
	handleKeyDown: function(event)
	{
	  if (event.keyCode == Event.KEY_ESC) 
    {
      this.leaveEditMode(this.getWrapperFromFormField(Event.element(event)));
  	}
	},
	
	leaveEditMode: function(wrapper)
	{
	  var staticField = this.getStaticFieldFromWrapper(wrapper);
	  var form = this.getFormFromWrapper(wrapper);
	  Element.hide(form);
	  Element.show(staticField);
	  this.editing = false;
	  this.saving = false;
	},
	
	onCancel: function(link)
	{
	  var wrapper = this.getWrapperFromCancelLink(link);
	  this.leaveEditMode(wrapper);
	},
	
	onSubmit: function(form)
	{
	  var wrapper = this.getWrapperFromForm(form);
	  this.leaveEditMode(wrapper);
	  this.saving = true;
	  this.showSaving(wrapper);
	},
	
	onComplete: function(request, id)
	{
	  var wrapper = this.getWrapperFromId(id);
	  this.leaveEditMode(wrapper);
	  this.saving = false;
	  this.hideSaving(wrapper);
	},
	
	showSaving: function(wrapper)
	{
	  var saving = this.getSavingFieldFromWrapper(wrapper);
	  var form = this.getFormFromWrapper(wrapper);
	  var staticField = this.getStaticFieldFromWrapper(wrapper);

	  Element.hide(form);
	  Element.hide(staticField);
	  Element.show(saving);
	},
	
	hideSaving: function(wrapper)
	{
	  var saving = this.getSavingFieldFromWrapper(wrapper);
	  Element.hide(saving);
	}
}

inPlaceEditorMgr = new Lingr.InPlaceEditorMgr();