/**
 * content.layout.tooltip.js - insert headline here
 *
 * COPYRIGHT: All  title   and  proprietary  rights,  including  trade
 * secrets,   in   the   Software   and   any   copies thereof and the
 * accompanying  written   materials,   are  owned  by   schukai  GmbH
 * and  are  protected  by  German  copyright  laws,  other applicable
 * copyright   laws  and  international  treaty  provisions.
 *
 * @package    alvine
 * @author     schukai GmbH <info@schukai.de>
 * @copyright  Copyright (C) 2002, 2003, 2004, 2005, 2006 schukai GmbH
 * @license    http://www.alvine.de/license/
 * @version    20061114
 * @link       http://www.alvine.de/
 */
var content_frontend_plugin_content_layout_tooltips = new Object();
var content_frontend_plugin_content_layout_windowsSensitiveBorder = new Object();
content_frontend_plugin_content_layout_windowsSensitiveBorder.x = 15;
content_frontend_plugin_content_layout_windowsSensitiveBorder.y = 15;

function content_frontend_plugin_content_layout_tooltip_register(toolTipID, obj, content, position, mode, options) {
  if(typeof content_frontend_plugin_content_layout_tooltips[obj.id] == 'undefined') content_frontend_plugin_content_layout_tooltips[obj.id] = new Object();
  
  content_frontend_plugin_content_layout_tooltips[obj.id]['target']   = toolTipID;
  content_frontend_plugin_content_layout_tooltips[obj.id]['source']   = obj.id;
  content_frontend_plugin_content_layout_tooltips[obj.id]['content']  = content;
  content_frontend_plugin_content_layout_tooltips[obj.id]['fix_width'] = (typeof content == 'string')?true:false;
  content_frontend_plugin_content_layout_tooltips[obj.id]['mode']     = mode;
  content_frontend_plugin_content_layout_tooltips[obj.id]['options']  = options;
  content_frontend_plugin_content_layout_tooltips[obj.id]['position'] = position;

  return true;
}

function content_frontend_plugin_content_layout_tooltip_getItem(obj) {
  
  obj = element_isObject(obj);
  if(!obj) return;
    
  if(typeof content_frontend_plugin_content_layout_tooltips[obj.id] == 'undefined') return false;
  
  return content_frontend_plugin_content_layout_tooltips[obj.id];
}

function content_frontend_plugin_content_layout_tooltip_init(toolTipID, obj, content, hideEvent, mode, options) {
  obj = element_isObject(obj);
  if(!obj) return true;

  if(obj.alvine_tooltipInitalized) {
    content_frontend_plugin_content_layout_tooltip_showObject(obj);
    return true;
  }

  if(typeof hideEvent == 'undefined') hideEvent = 'mouseout';

  if(typeof options == 'undefined') {
    options = new Object();
  } else if(typeof options == 'string')  { //Übergabeparemeter übernehmen
    var tmpEntries = options.split(',');
    options = new Object();
    for(var i = 0;i<tmpEntries.length;i++){
      var entry = tmpEntries[i];
      tmpKeyVal = entry.split(':');

      options[tmpKeyVal[0]] = tmpKeyVal[1];
    }
  }
  if(typeof options['offset']             == 'undefined') options['offset']             = new Object();
  if(typeof options['offset']['positive'] == 'undefined') options['offset']['positive'] = new Object();
  if(typeof options['offset']['negative'] == 'undefined') options['offset']['negative'] = new Object();
  if(typeof options['currentPosition']    == 'undefined') options['currentPosition']    = new Object();
  if(typeof options['width']              == 'undefined') options['width']              = null;
  if(typeof options['min_width']          == 'undefined') options['min_width']          = 300;
  
  var position = element_getPosition(obj, true);

  content_frontend_plugin_content_layout_tooltip_register(toolTipID, obj, content, position, mode, options);

  var ttObj = element_isObject(toolTipID);
  if(!ttObj) return true;

  if(typeof ttObj.alvine_isVisible != 'function'){
    ttObj.alvine_isVisible = function(){

      if(strstr(this.className, 'hidden')) return false;

      return true;
    };
  }

  if(typeof ttObj.alvine_setVisibility != 'function'){
    ttObj.alvine_setVisibility = function(status){
      status = (status===false)?false:true;

      if(status==true){
        if(this.alvine_isVisible()) return;
        element_removeClassName(this, 'hidden', ' ');        
        element_setVisibility(this, 'visible');

        ie6ToggleActiveXControls(false);
      } else {
        if(!this.alvine_isVisible()) return;
        element_setVisibility(this, 'hidden');
        element_move(this, -999, -999);
        element_removeClassName(this, 'hidden', ' ');
        element_addClassName(this, 'hidden');

        ie6ToggleActiveXControls(true);
      }

      //doppelte leerzeichen entfernen (cleanup)
      this.className = str_replace('  ', ' ', this.className);
    };
  }

  if(ttObj.alvine_isVisible()) ttObj.alvine_setVisibility(false);  
  if(ttObj.style.display == 'none') element_setDisplay(ttObj, 'block'); //abwärtskompatitbilität
  content_frontend_plugin_content_layout_tooltip_adjust(obj);

  event_add(obj, hideEvent, content_frontend_plugin_content_layout_tooltip_hideObject);

  obj.alvine_tooltipObject = ttObj;

  switch(mode){
    default:
    case 'mouse':
      mouse_attachToObject(obj);
      event_add(obj, 'mousemove', content_frontend_plugin_content_layout_tooltip_handleMouse);
      event_add(obj, 'mouseover', content_frontend_plugin_content_layout_tooltip_handleMouse);
      break;
    
    case 'sticky':
      event_add(obj, 'focus', content_frontend_plugin_content_layout_tooltip_handleSticky);
      event_add(obj, 'mouseover', content_frontend_plugin_content_layout_tooltip_handleSticky);
      content_frontend_plugin_content_layout_tooltip_stickToObject(null, obj);
      break;

  }  
  content_frontend_plugin_content_layout_tooltip_showObject(obj);
  obj.alvine_tooltipInitalized = true;

  return true;
}


function content_frontend_plugin_content_layout_tooltip_handleMouse(ev){
  if(!ev)   ev = window.event;
  content_frontend_plugin_content_layout_tooltip_setPosition(null, this);
  return object_preventDefaultEventBehaviour(ev);
}

function content_frontend_plugin_content_layout_tooltip_handleSticky(ev){
  if(!ev)   ev = window.event;

  content_frontend_plugin_content_layout_tooltip_stickToObject(null, this);
  content_frontend_plugin_content_layout_tooltip_showObject(this);
  return object_preventDefaultEventBehaviour(ev);
}

function content_frontend_plugin_content_layout_tooltip_adjust(obj){
  obj = element_isObject(obj);
  if(!obj) return true;

  var itemData = content_frontend_plugin_content_layout_tooltip_getItem(obj);

  var ttObj = itemData.target;
  if(!ttObj) return true;

  element_resetSize(ttObj);

  var ttSize = element_getSize(ttObj);

  if(itemData.fix_width){    
    if(ttSize.width>itemData.options.min_width){
      element_setWidth(ttObj, itemData.options.min_width);
    }   
  } else if(itemData.options.width) {
    if(ttSize.width>itemData.options.width){
      //feste Breite setzen
      element_setWidth(ttObj, itemData.options.width);
    }
  }

  return true;
}

function content_frontend_plugin_content_layout_tooltip_arrangeContent(obj, content){
  obj = element_isObject(obj);
  if(!obj) return;

  var gfxObject = element_isObject(obj.id+'_gfx');
  if(gfxObject!=null){
    //gfxObject.innerHTML = content;
    element_addChildNodes(gfxObject, content, true);
  } else {
    //obj.innerHTML = content;
    element_addChildNodes(obj, content, true);
  }
   
  return true;
}

function  content_frontend_plugin_content_layout_tooltip_setPosition(ev, obj){

  if(!ev) ev = window.event;
  var targetObj = (typeof obj!='object')?this:obj;
  
  var item = content_frontend_plugin_content_layout_tooltip_getItem(targetObj);
  
  srcObj = element_isObject(item.source);
  if(srcObj) {
    if(srcObj.alvineHideTooltip==true) return object_preventDefaultEventBehaviour(ev);
  }


  var ttPosition = new Object();
  var ttObj = element_isObject(item.target);
  if(!ttObj) return object_preventDefaultEventBehaviour(ev);
  
  if(!ttObj.alvine_isVisible()) content_frontend_plugin_content_layout_tooltip_showObject(targetObj);

  var options = item.options;
  
  options['offset']['positive']['x'] = 15;
  options['offset']['positive']['y'] = 15;
  options['offset']['negative']['x'] = 5;
  options['offset']['negative']['y'] = 8;

  
  if(typeof document.alvine_getMousePosition != 'function') return true; 
  options['currentPosition'] = document.alvine_getMousePosition(true, false);
  ttPosition = content_frontend_plugin_content_layout_tooltip_calcPosition(targetObj, options);
  if(!ttPosition.x || !ttPosition.y) object_preventDefaultEventBehaviour(ev);
  element_move(ttObj, ttPosition.x, ttPosition.y);
  
  return object_preventDefaultEventBehaviour(ev);
}

function content_frontend_plugin_content_layout_tooltip_stickToObject(ev, obj) {

  if(!ev) ev = window.event;
  
  var parentObj = this;
  parentObj     = (typeof obj != 'undefined')?element_isObject(obj):parentObj;

  var item  = content_frontend_plugin_content_layout_tooltip_getItem(parentObj);
  var ttObj = element_isObject(item.target);
  var tooltipPositionRange = (typeof item.options.stick == 'undefined')?null:item.options.stick;
  
  content_frontend_plugin_content_layout_tooltip_arrangeContent(ttObj, item.content);
  
  var itemSize    = element_getSize(item.source);
  var toolTipSize = element_getSize(item.target);

  var options = item.options;
  options['offset']['positive']['x'] = 2;
  options['offset']['positive']['y'] = options['offset']['positive']['y']>0?options['offset']['positive']['y']:2;
  options['offset']['negative']['x'] = itemSize.width;
  options['offset']['negative']['y'] = (itemSize.height+4);  
  
  var left = item.position.x;
  var top  = item.position.y;

  switch(tooltipPositionRange){    
    case 'top':
      top -= toolTipSize.height;
      break;
    
    default:
    case 'bottom':
      top += itemSize.height;
      break;
    
    case 'left':
      left-= toolTipSize.width;
      break;
    
    case 'right':
      left+= itemSize.width;
      break;
  }

  options['currentPosition']['x'] = left; 
  options['currentPosition']['y'] = top; 

  var ttPosition = content_frontend_plugin_content_layout_tooltip_calcPosition(parentObj, options);

  if(options['stick']=='right') {
    ttPosition.y = content_frontend_plugin_content_layout_tooltip_getStickyY(element_isObject(item.source));
  }
  element_move(ttObj, ttPosition.x, ttPosition.y);
  
  return object_preventDefaultEventBehaviour(ev);
  
}

function content_frontend_plugin_content_layout_tooltip_getStickyY(obj) {

  var offsetY = getTopOfElement(obj);
  var diffY = getScrollOffsetOfElement(obj);
  return offsetY-diffY
}

function content_frontend_plugin_content_layout_tooltip_calcPosition(obj, options){
  obj = element_isObject(obj);
  if(!obj) return false;

  var item  = content_frontend_plugin_content_layout_tooltip_getItem(obj);
  var ttObj = element_isObject(item.target);

  var toolTipSize = element_getSize(ttObj);

  // momentante Position bestimmen 
  var x = options.currentPosition.x;
  var y = options.currentPosition.y;

  var offsetX = options.offset.positive.x; //init offset (a bit right and lower)
  var offsetY = options.offset.positive.y;
    
  var negativeOffsetX = options.offset.negative.x;  //negative offset (a bit left and  higher)
  var negativeOffsetY = options.offset.negative.y;  
  
  var sensitiveBorderX = content_frontend_plugin_content_layout_windowsSensitiveBorder.x; //a sensitive border area for the window rim
  var sensitiveBorderY = content_frontend_plugin_content_layout_windowsSensitiveBorder.y;
  
  var windowInnerWidth  = null;
  var windowInnerHeight = null;
  
  var viewPort = alvine_getViewport();

  windowInnerWidth  = viewPort.width;
  windowInnerHeight = viewPort.height;

  var scrollPos = element_getScrollPosition();
  windowInnerWidth += scrollPos.x;
  windowInnerHeight+= scrollPos.y;

  //check for reaching the end of the visible area
  if(x + offsetX + toolTipSize.width  >= windowInnerWidth - sensitiveBorderX)  offsetX = 0 - negativeOffsetX - toolTipSize.width;
  if(y + offsetY + toolTipSize.height >= windowInnerHeight - sensitiveBorderY) offsetY = 0 - negativeOffsetY - toolTipSize.height;
  
  x += offsetX;
  y += offsetY;
  
  return {
    x:x,
    y:y
  };
  
}




/* Object-Attached Variant:
* Events
* onfocus="content_frontend_plugin_content_layout_tooltip_showObject('tooltip_8712g12')" 
* onblur="content_frontend_plugin_content_layout_tooltip_hideObject()"
*
*
*/
function content_frontend_plugin_content_layout_tooltip_showObject(obj, addContent) {
  
  var item = content_frontend_plugin_content_layout_tooltip_getItem(obj);
  if(!item) return true;

  var ttObj = element_isObject(item.target);
  
  if(typeof addContent == 'undefined') addContent = true;
  if (ttObj == null) return true;

  //arrange content
  if(addContent) { 
    content_frontend_plugin_content_layout_tooltip_arrangeContent(ttObj, item.content);
  }
  
  //display tooltip
  content_frontend_plugin_content_layout_tooltip_adjust(obj);

  element_setOpacity(ttObj, 0);
  
  element_setVisibility(ttObj, 'visible');
  ttObj.alvine_setVisibility(true);

  ttObj.alvine_fadeEffectObj = effects_fade(ttObj, 100, 'now', 16, 25);
  return true;    
}

function content_frontend_plugin_content_layout_tooltip_hideObject(ev) {
  
  if(!ev) ev = window.event;
  
  var item = content_frontend_plugin_content_layout_tooltip_getItem(this);
  var ttObj = element_isObject(item.target);

  if (ttObj == null) return false;  

  if(ttObj.alvine_isVisible()) ttObj.alvine_setVisibility(false);
  
  if(typeof ttObj.alvine_fadeEffectObj == 'object') {
    ttObj.alvine_fadeEffectObj.effect_stop();
  }

  return object_preventDefaultEventBehaviour(ev);
}


/*PLAIN*/
function content_frontend_plugin_content_layout_tooltip_show(toolTipID, content) {
  var ttObj = null;
  ttObj = element_isObject(toolTipID);

  if (ttObj == null) return false;
  
  if(content!=undefined) content_frontend_plugin_content_layout_tooltip_arrangeContent(ttObj, content);

  content_frontend_plugin_content_layout_tooltip_adjust(obj);

  //display tooltip
  element_setVisibility(ttObj, 'hidden');
  ttObj.alvine_setVisibility(true);

  element_setOpacity(ttObj, 0);
  element_setVisibility(ttObj, 'visible');

  effects_fade(ttObj, 100, 'now', 16, 25);
  return true;
}

function content_frontend_plugin_content_layout_tooltip_hide(ttObj) {

  ttObj = element_isObject(ttObj);
  if (ttObj == null) return false;
  
  if(ttObj.alvine_isVisible()) ttObj.alvine_setVisibility(false);
  
  if(typeof ttObj.alvine_fadeEffectObj == 'object') {
    ttObj.alvine_fadeEffectObj.effect_stop();
  }
  return true;  
}
