/* Namespace bo_bkk */
var bo_bkk = {};
bo_bkk.teaser_index = "";
bo_bkk.remote_top = "";
bo_bkk.remote_left = "";
bo_bkk.remote_visible = "";
bo_bkk.remote_url = "";
bo_bkk.remote_content = "";

/*
 *Funktion um den Inhalt der Fernbedienung zu wechseln
 *@param content_id (String) - erwartete Werte studenten, berufsstarter, arbeitnehmer, selbstaendige und familien
 *wechselt inhalt, bild und überschrift der Fernbedienung
 *
 **/

function fn_toggle_remote_content(content_id) {
  bo_bkk.remote_content = content_id;
  $('#box_'+content_id).show();
  $('#box_studenten').hide();
  $('#box_content_studenten').hide();
  $('#box_berufsstarter').hide();
  $('#box_content_berufsstarter').hide();
  $('#box_arbeitnehmer').hide();
  $('#box_content_arbeitnehmer').hide();
  $('#box_selbstaendige').hide();
  $('#box_content_selbstaendige').hide();
  $('#box_familien').hide();
  $('#box_content_familien').hide();
  $('#box_'+content_id).show();
  $('#box_content_'+content_id).show();
  $('#draggable').show();
  return false;
}

/*
 *Funktion zum öffnen von seiten aus der Fernbedienung mit Übergabe der Parameter
 *@param url (String) - Erwartet wird eine gültige Url
 *aktuelle position der Fernbedienung wird rausgelesen und an die Url als GET Parameter angehängt
 *
 **/

function fn_switch_view_from_remote(url) {
  bo_bkk.remote_top = $('#draggable').css("top");
  bo_bkk.remote_left = $('#draggable').css("left");
  bo_bkk.remote_visible = $('#draggable').css("display");
  bo_bkk.remote_url = url+"?rm_top="+bo_bkk.remote_top+"&rm_left="+bo_bkk.remote_left+"&rm_display="+bo_bkk.remote_visible+"&content="+bo_bkk.remote_content;
  window.location.href = bo_bkk.remote_url;
  return false;
}

/*
 * Funktion zum öffnen und schliessen der Dosier Listen Teaser für alle Seiten die keine Artikelseite sind
 * @param teaser_nr (String) - fortlaufende Nummer des Teasers zum öffnen bzw. schliesse
 **/

function fn_toggle_teaser(teaser_nr) {

  $('#linked_content_'+bo_bkk.teaser_index).css({display:'none'});
  $('#main #toggle_content_'+bo_bkk.teaser_index+' div')[0].className = "closed";
  $('#toggle_content_'+teaser_nr).toggle(function(){
    $('#linked_content_'+teaser_nr).show();
    $('#main #toggle_content_'+teaser_nr+' div')[0].className = "active";
    $('#main #toggle_content_'+teaser_nr+' div').html("Inhalte ausblenden");
  }, function() {
    $('#linked_content_'+teaser_nr).hide();
    $('#main #toggle_content_'+teaser_nr+' div')[0].className = "closed";
    $('#main #toggle_content_'+teaser_nr+' div').html("Inhalte einblenden");
  });
  return false;
}


$(document).ready(function(){

  //schließt die submenüs bei mousout. Ist z.Zt. die einzige Möglichkeit um die subnavi zu schließen
  $("#sfnav").mouseout(function(){
    $("#sfnav li.top").each(function(index, item) {
      $(item).removeClass("over");
    });
  });

  //öffnet die submenüs auf focus, für barrierefreies öffnen
  $("#sfnav li.top").children('a').focus(function(){
      $("#sfnav li.top").each(function(index, item) {
        $(item).removeClass("over");
      });
      $(this).parent("li").addClass("over");
    });

    //fix für ie6 mouseover problem
    if ( $.browser.msie && $.browser.version.indexOf("6.") != -1 ) {
      $("#sfnav li.top").mouseover(function(){
        $("#sfnav li.top").each(function(index, item) {
          $(item).removeClass("over");
        });
        $(this).addClass("over");
      });
    }
    
});

function hookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.addEventListener)
  {
    element.addEventListener(eventName, callback, false);
  }
  else if(element.attachEvent)
    element.attachEvent("on" + eventName, callback);
}

function unhookEvent(element, eventName, callback)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
    return;
  if(element.removeEventListener)
    element.removeEventListener(eventName, callback, false);
  else if(element.detachEvent)
    element.detachEvent("on" + eventName, callback);
}

function cancelEvent(e)
{
  e = e ? e : window.event;
  if(e.stopPropagation)
    e.stopPropagation();
  if(e.preventDefault)
    e.preventDefault();
  e.cancelBubble = true;
  e.cancel = true;
  e.returnValue = false;
  return false;
}

function Position(x, y)
{
  this.X = x;
  this.Y = y;

  this.Add = function(val)
  {
    var newPos = new Position(this.X, this.Y);
    if(val != null)
    {
      if(!isNaN(val.X))
        newPos.X += val.X;
      if(!isNaN(val.Y))
        newPos.Y += val.Y
    }
    return newPos;
  }

  this.Subtract = function(val)
  {
    var newPos = new Position(this.X, this.Y);
    if(val != null)
    {
      if(!isNaN(val.X))
        newPos.X -= val.X;
      if(!isNaN(val.Y))
        newPos.Y -= val.Y
    }
    return newPos;
  }

  this.Min = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;

    if(!isNaN(val.X) && this.X > val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y > val.Y)
      newPos.Y = val.Y;

    return newPos;
  }

  this.Max = function(val)
  {
    var newPos = new Position(this.X, this.Y)
    if(val == null)
      return newPos;

    if(!isNaN(val.X) && this.X < val.X)
      newPos.X = val.X;
    if(!isNaN(val.Y) && this.Y < val.Y)
      newPos.Y = val.Y;

    return newPos;
  }

  this.Bound = function(lower, upper)
  {
    var newPos = this.Max(lower);
    return newPos.Min(upper);
  }

  this.Check = function()
  {
    var newPos = new Position(this.X, this.Y);
    if(isNaN(newPos.X))
      newPos.X = 0;
    if(isNaN(newPos.Y))
      newPos.Y = 0;
    return newPos;
  }

  this.Apply = function(element)
  {
    if(typeof(element) == "string")
      element = document.getElementById(element);
    if(element == null)
      return;
    if(!isNaN(this.X))
      element.style.left = this.X + 'px';
    if(!isNaN(this.Y))
      element.style.top = this.Y + 'px';
  }
}

function absoluteCursorPostion(eventObj)
{
  eventObj = eventObj ? eventObj : window.event;

  if(isNaN(window.scrollX))
    return new Position(eventObj.clientX + document.documentElement.scrollLeft + document.body.scrollLeft,
      eventObj.clientY + document.documentElement.scrollTop + document.body.scrollTop);
  else
    return new Position(eventObj.clientX + window.scrollX, eventObj.clientY + window.scrollY);
}

function dragObject(element, attachElement, lowerBound, upperBound, startCallback, moveCallback, endCallback, attachLater)
{
  if(typeof(element) == "string")
    element = document.getElementById(element);
  if(element == null)
      return;

  if(lowerBound != null && upperBound != null)
  {
    var temp = lowerBound.Min(upperBound);
    upperBound = lowerBound.Max(upperBound);
    lowerBound = temp;
  }

  var cursorStartPos = null;
  var elementStartPos = null;
  var dragging = false;
  var listening = false;
  var disposed = false;

  function dragStart(eventObj)
  {
    if(dragging || !listening || disposed) return;
    dragging = true;

    if(startCallback != null)
      startCallback(eventObj, element);

    cursorStartPos = absoluteCursorPostion(eventObj);

    elementStartPos = new Position(parseInt(element.style.left), parseInt(element.style.top));

    elementStartPos = elementStartPos.Check();

    hookEvent(document, "mousemove", dragGo);
    hookEvent(document, "mouseup", dragStopHook);

    return cancelEvent(eventObj);
  }

  function dragGo(eventObj)
  {
    if(!dragging || disposed) return;

    var newPos = absoluteCursorPostion(eventObj);
    newPos = newPos.Add(elementStartPos).Subtract(cursorStartPos);
    newPos = newPos.Bound(lowerBound, upperBound)
    newPos.Apply(element);
    if(moveCallback != null)
      moveCallback(newPos, element);

    return cancelEvent(eventObj);
  }

  function dragStopHook(eventObj)
  {
    dragStop();
    return cancelEvent(eventObj);
  }

  function dragStop()
  {
    if(!dragging || disposed) return;
    unhookEvent(document, "mousemove", dragGo);
    unhookEvent(document, "mouseup", dragStopHook);
    cursorStartPos = null;
    elementStartPos = null;
    if(endCallback != null)
      endCallback(element);
    dragging = false;
  }

  this.Dispose = function()
  {
    if(disposed) return;
    this.StopListening(true);
    element = null;
    attachElement = null
    lowerBound = null;
    upperBound = null;
    startCallback = null;
    moveCallback = null
    endCallback = null;
    disposed = true;
  }

  this.StartListening = function()
  {
    if(listening || disposed) return;
    listening = true;
    hookEvent(attachElement, "mousedown", dragStart);
  }

  this.StopListening = function(stopCurrentDragging)
  {
    if(!listening || disposed) return;
    unhookEvent(attachElement, "mousedown", dragStart);
    listening = false;

    if(stopCurrentDragging && dragging)
      dragStop();
  }

  this.IsDragging = function(){ return dragging; }
  this.IsListening = function() { return listening; }
  this.IsDisposed = function() { return disposed; }

  if(typeof(attachElement) == "string")
    attachElement = document.getElementById(attachElement);
  if(attachElement == null)
    attachElement = element;

  if(!attachLater)
    this.StartListening();
}

