var flyout_counter = 0;
var flyouts = Array();

function flyout_init(obj, parent_idx, url, x_offset, y_offset, width, height) {
  if(x_offset == undefined) {x_offset = 0;}
  if(y_offset == undefined) {y_offset = 0;}
	var root = document.getElementById('body');
  obj.onmouseover = null;
  if (obj.id == '') {
    obj.id = 'flyout_trigger_' + flyout_counter;
    flyouts[flyout_counter] = { timeout: null, refcount: 1, parent_idx: parent_idx };
    flyout = Builder.node('span', {id: 'flyout_' + flyout_counter}, [
      Builder.node('span', {id: 'flyout_content_' + flyout_counter})
    ]);
    Element.classNames(flyout).add('flyout');
    origin = Position.cumulativeOffset(root);
    position = Position.cumulativeOffset(obj);
    flyout.style.left  = ((position[0] - origin[0]) + x_offset) + "px";
    flyout.style.top   = ( position[1] - origin[1]  + y_offset) + "px";
    if(width  != undefined) {flyout.style.width  = width  + "px";}
    if(height != undefined) {flyout.style.height = height + "px";}
    root.appendChild(flyout);
    obj.onmouseover = flyout_mouseover;
    obj.onmouseout  = flyout_mouseout;
    flyout.onmouseover = flyout_mouseover;
    flyout.onmouseout  = flyout_mouseout;
    new Ajax.Updater('flyout_content_' + flyout_counter,
                     url + (url.indexOf('?') > 0 ? "&" : "?") + "parent=" + flyout_counter,
                     {asynchronous: true, evalScripts: false});
    flyout_counter++;
  }
}

function flyout_mouseover() {
  var index = this.id.split("_").last();
  show_flyout(index);
}

function show_flyout(index) {
  if($('flyout_' + index).style.display == 'none') {
    Effect.Appear($('flyout_' + index), {duration: 0.25});
  }
//  $('flyout_' + index).style.display = 'block';
  clearTimeout( flyouts[index].timeout );
  $('flyout_' + index).onmouseout = flyout_mouseout;
  if( flyouts[index].parent_idx != -1 ) {
    show_flyout(flyouts[index].parent_idx);
  }
}

function flyout_mouseout() {
  var index = this.id.split("_").last();
  hide_flyout(index);
}

function hide_flyout(index) {
  flyouts[index].timeout = setTimeout( "hide_flyout_delayed('" + index + "')", 500);
  $('flyout_' + index).onmouseout = null;
  if( flyouts[index].parent_idx != -1 ) {
    hide_flyout(flyouts[index].parent_idx);
  }
}

function hide_flyout_delayed( index ) {
  flyouts[index].refcount--;
  if( flyouts[index].refcount <= 0 ) {
    Effect.Fade($('flyout_' + index), {duration: 0.25});
//    $('flyout_' + index).style.display = 'none';
  }
}
