/*
 * jDialog - v1.1
 * Copyright (c): Seitenbau GmbH, Konstanz
 * created: 2007/10/30
 * packed by: http://dean.edwards.name/packer/
*/

// Language-Object
var sbDialogLang = {
  msgOkay: 'Ok',
  msgCancel: 'Abbrechen',
  msgClose: 'Schließen',
  msgLoadClose: 'Abbrechen',
  titleOkay: 'Ok',
  titleCancel: 'Abbrechen',
  titleClose: 'Schließen',
  titleLoadClose: 'Abbrechen'
}

// Path to Loading-Image
var dLoadImg = 'images/load.gif';


/* sbDialog ------------------------------------------------ */
var iTtCount = 0;
jQuery(document).ready(function(){
  dLoader = new Image();
  dLoader.src = dLoadImg;
  jQuery(".sbToolTip").mousemove( function(e) {
      // Over
      iTtCount++;
      if(iTtCount>9999) { iTtCount=0; }
      var oCurTt = jQuery(this);
      var iCurTtCounter = iTtCount;
      if( oCurTt.attr('id') )
      {
        window.setTimeout(function() {
          if( iCurTtCounter == iTtCount )
          {
            oCurTt.sbDialog({obj:'#'+oCurTt.attr('id')+'_TT'}, false, {fade:'fast',box:'sbToolTipBox',container:'sbToolTipContainer',content:'sbToolTipContent',control:'sbToolTipControl',event:'ToolTip',buttons:sbDialogBtn.None,pos:'absolute',left:(e.pageX+16),top:(e.pageY+16)});
          }
        }, 250 );
      }
    } );
    jQuery(".sbToolTip").mouseout( function() {
      iTtCount++;
      if( jQuery(this).attr('lastevent') == 'ToolTip' )
      {
        jQuery(this).trigger('sbDialogClose',[{fade:true}]);
      }
    } );
});
// Button-Type-Object
var sbDialogBtn = {
  Close: 1,
  Okay: 2,
  Cancel: 4,
  None: 8
};
// Main-Function
(function(jQuery){
  jQuery.fn.sbDialog = function(remote, clickDialog, settings)
  {
    // settings
    var iGetCount = 0;
    var oElement = jQuery(this);
    var dSettings = jQuery.extend({}, arguments.callee.defaults, settings);
    var dBtnOkay = null;
    var dBtnCancel = null;
    var dBtnClose = null;
    var defaultBtn = dSettings.defaultBtn; // save default-button
    var oBox = null;

    if( dSettings.event !== false && dSettings.event !== 'ToolTip')
    {
      oElement.bind(dSettings.event, function(){
        return create(dSettings.event);
      });
    }
    else
    {
      create(dSettings.event);
    }


    function create() {
      // ToolTip?
      if( oElement.attr('lastevent') === 'ToolTip' && dSettings.event !== 'ToolTip')
      {
        oElement.trigger('sbDialogClose',[{'fade':false}]);
        oElement.removeAttr('dialog');
      }

      // check if dialog is already open
      if( oElement.attr('dialog') === 'open' )
      {
        setFocus();
        return false;
      }
      else
      {
        oElement.attr({dialog:'open'});
      }
      oElement.attr({'lastevent':dSettings.event});

      // Weitere Events binden
      bindEvents();

      // Alte Link-Url speichern
      dSettings.orginal_url = oElement.attr('href');
      oElement.attr('href', 'javascript:return false;');

      // create dialog-box
      var dBox = dBoxCreate(); // create dialog-container
      var dContainer = dBoxContainer(dBox); // insert content-container
      var dContent = dBoxContent(dContainer); // insert content-container
      var dControl = dBoxControl(dContainer); // insert control-container
      oBox = dBox;

      // schliessenfunction hinzufuegen
      dBox.destroyBox = function() {
        dBoxDelete(dBox);
      };

      // Mindesten der Schliessen-Button muss vorhanden
      if(!(dSettings.buttons & (sbDialogBtn.Close+sbDialogBtn.Okay+sbDialogBtn.Cancel+sbDialogBtn.None)))
      {
        dSettings.buttons = sbDialogBtn.Close;
      }

      // check default-focus button
      if(!(dSettings.buttons & dSettings.defaultBtn))
      {
        if(dSettings.buttons & sbDialogBtn.Okay)
        {
          dSettings.defaultBtn = sbDialogBtn.Okay;
        }
        else if(dSettings.buttons & sbDialogBtn.Cancel)
        {
          dSettings.defaultBtn = sbDialogBtn.Cancel;
        }
        else if(dSettings.buttons & sbDialogBtn.Close)
        {
          dSettings.defaultBtn = sbDialogBtn.Close;
        }
      }

      // show okay-button
      if( dSettings.buttons & sbDialogBtn.Okay )
      {
        // check url for okay-action
        if(dSettings.hrefOkay === false)
        {
          dSettings.hrefOkay = dSettings.orginal_url;
        }
        dBtnOkay = dBoxOkay(dControl, dSettings.hrefOkay); // insert okay-button
        dBtnOkay.click(btnClick);
      }
      // show cancel-button
      if( dSettings.buttons & sbDialogBtn.Cancel )
      {
        dBtnCancel = dBoxCancel(dControl); // insert cancel-button
        dBtnCancel.click(btnClick);
      }
      // insert close-button
      dBtnClose = dBoxClose(dControl);
      dSettings.defaultBtn = sbDialogBtn.Close; // set close-button as default
      dBtnClose.click(function(){
        dBoxDelete(dBox);
        return false;
      });

      // arrange dialog on screen
      if(dSettings.arrange === true)
      {
        var iLeft = iTop = 0;
        if( dSettings.pos == 'relative' )
        {
          iLeft = oElement.offset().left;
          iTop = oElement.offset().top;
        }
        dBox.css({left:(iLeft + dSettings.left),top:(iTop + dSettings.top)});
      }

      // close on esc-key
      dBox.keydown(function(e){
        if (e == null) { // ie
          keycode = event.keyCode;
        } else { // mozilla
          keycode = e.which;
        }
        if(keycode == 27){ // esc
          dBoxDelete(dBox);
        }
      });


      dBox.click(function(e){
        var oTarget = jQuery(e.target);
        var iSec = 0;
        while( oTarget[0] != dBox[0] && oTarget.length > 0 && iSec++ < 100 )
        {
          if( oTarget.is("input") || oTarget.is("select") ||
              oTarget.is("a") || oTarget.is("textarea") ||
              oTarget.is("label") )
          {
            // Kein auto-Focus
            return;
          }
          oTarget = oTarget.parent();
        }

        setFocus();
      });

      dBoxLoadImage(dContent); // show loading-image

      // show dialog
      if(dSettings.fade !== false)
      {
        dBox.fadeIn(dSettings.fade);
      }
      else
      {
        dBox.show();
      }
      try{
        dBtnClose.focus(); // set focus on close-button
      } catch(e) {};

      // get data via ajax?
      if( remote === false )
      {
        dBoxSetContent( null, null );
      }
      else if( remote.src )
      {
        iGetCount++;
        var iCurGetCount = iGetCount;
        jQuery.get(remote.src, remote.data, function(remoteData){
          if(iCurGetCount == iGetCount && dBox)
          {
            dBoxSetContent( remoteData, null );
          }
        });
      }
      else if( remote.obj )
      {
        var sHtml = '';
        if( remote.html ) {
          sHtml += remote.html;
        }
        jQuery(remote.obj).each( function() {
          sHtml += jQuery(this).html();
        });
        dBoxSetContent( null, sHtml );
      }
      else
      {
        dBoxSetContent( null, remote.html );
      }

      function dBoxSetContent( remoteData, sHtml )
      {
        dContent.empty(); // delete loading-image
        var content = false;
        if( sHtml )
        {
          dContent.append(sHtml).show();
          content = true;
        }
        if( remote.callback )
        {
          var hO = {'oElement':oElement,'oBox':dBox,'oContent':dContent,'oBtn':jQuery(this),'settings':dSettings};
          content = remote.callback(hO, remoteData); // call content-function
        }
        else if( remoteData )
        {
          dContent.append(remoteData).show();
          content = true;
        }

        // delete dialog, if callback returns false
        if(content === false)
        {
          dBoxDelete(dBox);
          return false;
        }

        // Buttons anzeigen
        showBtn();
        // Fokus setzen
        setFocus();

        return true;
      };

      function showBtn()
      {
        // delete close-button if not in settings
        if(!(dSettings.buttons & sbDialogBtn.Close))
        {
          dBtnClose.remove();
        }
        else
        {
          dBtnClose.attr({title:dSettings.lang.titleClose}).text(dSettings.lang.msgClose);
        }

        dSettings.defaultBtn = defaultBtn; // reset default-button
        if(dBtnOkay)
        {
          dBtnOkay.show().removeAttr('style'); // show okay-button
        }
        if(dBtnCancel)
        {
          dBtnCancel.show().removeAttr('style'); // show close-button
        }

        // weiter Buttons auf die Callback-Funktion binden
        if( clickDialog && dSettings.additionalBtn )
        {
          jQuery('.'+dSettings.additionalBtn, dBox).click(btnClick);
        }
      };

      // Funktion die beim Click auf die Buttons aufgerufen wird
      function btnClick()
      {
        if( !clickDialog || clickDialog == false || clickDialog == true )
        {
          var reply = clickDialog;
        }
        else
        {
          var hO = {'oElement':oElement,'oBox':dBox,'oContent':dContent,'oBtn':jQuery(this),'settings':dSettings};
          var reply = clickDialog(hO);
        }
        if(true === dSettings.autoclose)
        {
          dBoxDelete(dBox);
        }

        if( reply == true )
        {
          return true;
        }

        if(jQuery.browser.safari) // fix bug in safari 1.3
        {
          if( this.nodeName.toLowerCase == 'a' )
          {
            jQuery(this).attr('href', 'javascript: return false;');
          }
        }
        return false;
      };

      return false;
    };

    // verschieden Events binden
    function bindEvents()
    {
      oElement.bind('sbDialogClose', evtClose);
      oElement.bind('sbDialogOkay', evtOkay);
      oElement.bind('sbDialogCancel', evtCancel);
    }
    function evtClose(e,data) {
      if( oBox )
      {
        if( data && data.fade && data.fade !== false )
        {
          var sFade = dSettings.fade;
          if( data.fade === true )
          {
            sFade = data.fade;
          }
          oBox.fadeOut(sFade, function(){
            dBoxDelete(oBox);
          });
        }
        else
        {
          dBoxDelete(oBox);
        }
      }
      return true;
    }
    function evtOkay() {
      if( dBtnOkay )
      {
        dBtnOkay.trigger('click');
      }
      return true;
    }
    function evtCancel() {
      if( dBtnCancel )
      {
        dBtnCancel.trigger('click');
      }
      return true;
    }


    // create dialog-container
    function setFocus()
    {
      // set default-button
      if( dBtnOkay && (dSettings.defaultBtn & sbDialogBtn.Okay) )
      {
        dBtnOkay.focus();
      }
      else if( dBtnCancel && (dSettings.defaultBtn & sbDialogBtn.Cancel) )
      {
        dBtnCancel.focus();
      }
      else if( dBtnClose && (dSettings.defaultBtn & sbDialogBtn.Close) )
      {
        dBtnClose.focus();
      }
    };

    // create dialog-container
    function dBoxCreate()
    {
      var dBox = jQuery(document.createElement('DIV'))
        .hide()
        .addClass(dSettings.box)
        .css({position:'absolute','z-index':1000})
        .appendTo('body');
      if(dSettings.boxID !== false)
      {
        dBox.attr({id:dSettings.boxID});
      }
      return dBox;
    };

    // delete dialog-container
    function dBoxDelete(dBox)
    {
      window.setTimeout( function() {
        /*
        if( oElement.attr('lastevent') && oElement.attr('lastevent') !== false && oElement.attr('lastevent') !== 'ToolTip' )
        {
          oElement.unbind(oElement.attr('lastevent'), create);
        }*/
        oElement.unbind('sbDialogClose', evtClose);
        oElement.unbind('sbDialogOkay', evtOkay);
        oElement.unbind('sbDialogCancel', evtCancel);
        oElement.attr('href', dSettings.orginal_url);
        oElement.removeAttr('lastevent');
        oElement.removeAttr('dialog');
        if(dBox.parent().length > 0 )
        {
          dBox.remove();
        }
        // delete objects
        delete dBox;
        delete dContent;
        delete dControl;
        delete dBtnOkay;
        delete dBtnCancel;
        delete dBtnClose;
      }, 1 );
    };

    // create content-outer-container
    function dBoxContainer(dBox)
    {
      var dContainer = jQuery(document.createElement('DIV'))
        .addClass(dSettings.container)
        .appendTo(dBox);
      if(dSettings.containerID !== false)
      {
        dContainer.attr({id:dSettings.containerID});
      }
      return dContainer;
    };

    // create content-container
    function dBoxContent(dContainer)
    {
      var dContent = jQuery( document.createElement('DIV'))
        .addClass(dSettings.content)
        .appendTo(dContainer);
      return dContent;
    };

    // create content-container
    function dBoxControl(dContainer)
    {
      var dControl = jQuery(document.createElement('DIV'))
        .addClass(dSettings.control)
        .appendTo(dContainer);
      return dControl;
    };

    // create okay-button
    function dBoxOkay(dControl, href)
    {
      var btnOkay = jQuery(document.createElement('A'))
        .attr({href:href,title:dSettings.lang.titleOkay})
        .addClass(dSettings.btnOkay)
        .append(dSettings.lang.msgOkay)
        .appendTo(dControl)
        .hide();
      return btnOkay;
    };

    // create cancel-button
    function dBoxCancel(dControl)
    {
      var btnCancel = jQuery(document.createElement('A'))
        .attr({href:dSettings.hrefCancel,title:dSettings.lang.titleCancel})
        .addClass(dSettings.btnCancel)
        .append(dSettings.lang.msgCancel)
        .appendTo(dControl)
        .hide();
      return btnCancel;
    };

    // create close-button
    function dBoxClose(dControl)
    {
      var btnClose = jQuery(document.createElement('A'))
        .attr({href:'javascript: return false;'})
        .attr({title:dSettings.lang.titleLoadClose})
        .addClass(dSettings.btnClose)
        .append(dSettings.lang.msgLoadClose)
        .appendTo(dControl);
      return btnClose;
    };

    // add loading-image
    function dBoxLoadImage(dContent)
    {
      jQuery(document.createElement('IMG'))
        .attr({src:dLoader.src})
        .addClass(dSettings.loadImage)
        .appendTo(dContent);
    };

    return false;
  };

  // default settings
  jQuery.fn.sbDialog.defaults = {
    boxID: false,
    box: 'sbDialogBox',
    containerID: false,
    container: 'sbDialogContainer',
    content: 'sbDialogContent',
    control: 'sbDialogControl',
    btnOkay: 'sbDialogOkay',
    btnCancel: 'sbDialogCancel',
    btnClose: 'sbDialogClose',
    defaultBtn: sbDialogBtn.Okay,
    buttons: sbDialogBtn.Close + sbDialogBtn.Okay,
    hrefOkay: false,
    hrefCancel: '#',
    loadImage: 'sbDialogLoad',
    event: 'click',
    arrange: true,
    pos: 'relative',
    left: 20,
    top: 10,
    autoclose: true,
    lang: sbDialogLang,
    fade: 'normal',
    additionalBtn: 'sbDialogBtn'
  };

})(jQuery);
