// We need this to prevent multiple clicks on menu link
var bIsActive = false;


Event.observe(window, 'load', function() {
  // Fix for Firefox 2: Move element to bottom of DOM
  var oLangMenu = $('language_menu');
  document.body.appendChild(oLangMenu);
  oLangMenu.absolutize();
  
  oMenuObserver.oHandle = oMenuObserver.vCloseMenu.bindAsEventListener(oMenuObserver);
});


// Remove the menu at any click and resize event
var oMenuObserver = {
  vCloseMenu: function(oEvent) {
    // Never handle clicks on menu link at this point
    try {
      if (oEvent.element().identify() === 'lang_link') {
        return;
      }
    } catch (e) {}

    // Close the menu
    var oMenu = $('language_menu');
    new Effect.Opacity(oMenu, {
      from: 1.0,
      to: 0,
      duration: 0.2,
      afterFinish : function() {
        oMenu.hide();
        vSwitchObserving(false);
      }
    });
  }
}


/**
 * Show language menu
 */
function vShowMenu() {
  // Do nothing if an effect is running
  if (bIsActive) {
    return;
  }


  // Get defaults
  var oMenu = $('language_menu');
  var oLink = $('lang_link');
  var iMenuH = oMenu.getHeight();
  var iMenuW = oMenu.getWidth();
  var iLinkW = oLink.getWidth();
  var aLinkPos = aGetAbsPosition('lang_link');


  // Set top and left position of the menu
  var iMenuT = (aLinkPos[1] - iMenuH - 3);
  var iMenuL = (aLinkPos[0] + iLinkW - iMenuW);
  oMenu.style.top = (iMenuT-20) + 'px';
  oMenu.style.left = iMenuL + 'px';


  // Render effects
  if (!oMenu.visible()) {
    // Show menu
    new Effect.Parallel([
      new Effect.Opacity(oMenu, {
        from: 0,
        to: 1.0,
        sync: true
      }),
      new Effect.Move(oMenu, {
        x: iMenuL,
        y: iMenuT,
        mode: 'absolute'
      })
    ], {
      duration: 0.3,
      transition: Effect.Transitions.sinoidal,
      beforeStart : function () {
        oMenu.setOpacity(0);
        oMenu.show();
        bIsActive = true;
      },
      afterFinish : function () {
        vSwitchObserving(true);
        bIsActive = false;
      }
    });
  } else {
    // Hide menu
    new Effect.Parallel([
      new Effect.Move(oMenu, {
        x: iMenuL,
        y: (iMenuT-20),
        mode: 'absolute'
      }),
      new Effect.Opacity(oMenu, {
        from: 1.0,
        to: 0,
        sync: true
      })
    ], {
      duration: 0.3,
      transition: Effect.Transitions.sinoidal,
      beforeStart : function () {
        bIsActive = true;
      },
      afterFinish : function () {
        oMenu.setOpacity(1.0);
        oMenu.hide();
        vSwitchObserving(false);
        bIsActive = false;
      }
    });
  }
}


/**
 * Get absolute position of an object
 *
 * @return Array with left top position
 */
function aGetAbsPosition(psElement) {
  var oElement = $(psElement);
  var aPos = new Array(0,0);

  if (oElement.offsetParent) {
    do {
      aPos[0] += oElement.offsetLeft;
      aPos[1] += oElement.offsetTop;
    }
    while (oElement = oElement.offsetParent);
  }

  return aPos;
}


/**
 * Switch observing mode
 *
 */
function vSwitchObserving(pbActivate) {
  if (pbActivate) {
    // Start
    Event.observe(document.onresize ? document : window, 'resize', oMenuObserver.oHandle);
    Event.observe(document, 'click', oMenuObserver.oHandle);
  } else {
    // Stop
    Event.stopObserving(document.onresize ? document : window, 'resize', oMenuObserver.oHandle);
    Event.stopObserving(document, 'click', oMenuObserver.oHandle);
  }
}


/**
 * Switch the state of an image
 */
function vSwitchImage() {
  oImageNO = $('lang_dropdown_no');
  oImageRO = $('lang_dropdown_ro');

  if (!oImageRO.visible()) {
    oImageNO.hide();
    oImageRO.show();
  } else {
    oImageRO.hide();
    oImageNO.show();
  }
}