/************* Class for ToolTips **************/
var ClassToolTip = Class.create();
ClassToolTip.prototype = {

  initialize:function(toolTipBox, id, desktop) {
    this.toolTipBox     = toolTipBox.cloneNode(true);
    this.toolTipBox.id  = id;
    this.cssID          = "#" + id;
    this.desktop        = desktop;
    this.browserIndex   = navigator.userAgent.toLowerCase().indexOf("msie");
    this.observer       = new ObserverHandler();

    document.getElementsByTagName("body")[0].appendChild(this.toolTipBox);
  },

  setToolTipPosition:function(evt) {
    // X- und Y-Position des Mauszeigers ermitteln
    Element.setStyle(this.toolTipBox, { left : (Event.pointerX(evt) + 8)  + "px",
                                        top  : (Event.pointerY(evt) + 19) + "px" });
  },

  showToolTip:function(evt) {

    Event.stop(evt);

    // der KlassenName des Elements bestimmt die Inhaltsanzeige
    var e = Event.element(evt);

    Element.setStyle(this.toolTipBox, { display  : "block" });
    this.setToolTipPosition(evt);

    var messages;
    if (messages = $$(this.cssID + " p")) {
      $A(messages).each(function(aMessageNode) {
         aMessageNode.hide();
      });
    }

    // zeige die Message
    var oneMessage;
    if (oneMessage = $$(this.cssID + " p." + e.className)[0]) {
      oneMessage.style.display = "block";
    }

    // observer zum verschieben der toolTipBox
    this.observer.setObserver(this.desktop,
                              "mousemove",
                              this.setToolTipPosition.bindAsEventListener(this));
  },

  hideToolTip:function(evt) {
    Event.stop(evt);
    this.toolTipBox.hide();
    this.observer.unsetAllObserver(this.desktop.id);
  }
}

/************* Class for Overlay **************/
var ClassOverlay = Class.create();
ClassOverlay.prototype = {

  initialize:function(contentBox, onClose, onOpen) {

    this.onClose = function () { };
    if (onClose != null) {
      this.onClose = onClose;
    }

    this.onOpen = function () { };
    if (onOpen != null) {
      this.onOpen = onOpen;
    }

    if (typeof contentBox != null) {
      this.contentBox = contentBox;
    }

    this.htmlBody      = document.getElementsByTagName('body')[0];
    this.overLayer     = document.createElement("div");
    this.overLayer.id  = "overLayer";

    // Fenster- und Bodygröße ermitteln
    if(navigator.userAgent.toLowerCase().indexOf("msie") >= 0) {
      this.bodyWidth    = this.htmlBody.clientWidth;
      this.windowWidth  = document.documentElement.clientWidth;
      this.windowHeight = document.documentElement.clientHeight;

      if (document.documentElement && document.documentElement.clientHeight) {
        // Explorer 6 Strict Mode
        this.bodyHeight = document.documentElement.clientHeight;
      }
      // other Explorers
      else if (document.body) {
        this.bodyHeight = document.body.clientHeight;
      }
    } else {
      this.bodyWidth    = window.innerWidth;
      this.bodyHeight   = (window.innerHeight >= this.htmlBody.offsetHeight) ? window.innerHeight : this.htmlBody.offsetHeight;
      this.windowWidth  = window.innerWidth;
      this.windowHeight = window.innerHeight;
    }

    $A($$(".overLayerClose")).each(function (oneButton) {
      oneButton.onclick = function() {
        this.closeOverlay();
      }.bind(this);
    }.bind(this));

    this.showOverlay();
  },

  closeOverlay:function() {

    this.onClose();

    // fix den IE  und MAC-OS -Scrollbar-Bug
    this.displayElements("visible", "auto");

    Element.setStyle($(this.contentBox.id), { display:  "none" });

    var overLayer;
    if (overLayer = $(this.overLayer.id)) {
      new Effect.Opacity(overLayer,
                { duration:0.35,
                  from: 0.4, to: 0.1,
                  afterFinish: function() {
                    try {
                      if (this.htmlBody.removeChild($("overLayer"))) {
                        throw "true";
                      }
                      else {
                        throw "false";
                      }
                    } catch (e) {
                      if (e == "false") {
                        console.log(e);
                      }
                    }
                  }.bind(this)
                });
    }
  },

  centerContentBox:function(w, h) {

    Element.setStyle($(this.contentBox.id), {
      display:  "block",
      left:     ((this.windowWidth  / 2) - (w / 2)) + "px",
      top:      ((this.windowHeight / 2) - (h / 2)) + "px"
    });

    window.scrollTo(0, 0);
  },

  showContentBox:function() {

    this.htmlBody.appendChild(this.contentBox);
    // Inhaltsbox zentrieren
    var contentBoxWidth  = parseInt(Element.getStyle(this.contentBox, 'width'));
    var contentBoxHeight = parseInt(Element.getStyle(this.contentBox, 'height'));
    this.centerContentBox(contentBoxWidth, contentBoxHeight);

    setTimeout(function() {
      this.onOpen();
    }.bind(this),300);
  },

  displayElements:function(visibility, overflow) {
    // verstecken von elementen
    // < IE 7
    if(!Prototype.Browser.IE || parseInt(navigator.userAgent.substring (navigator.userAgent.indexOf("MSIE")+5)) >= 7) {
      return true;
    }

    // select elemente suchen
    var v = document.getElementsByTagName('select');

    $A(v).each(function (aElement) {
      if (aElement) { Element.setStyle(aElement, { visibility: visibility }); }
    });

    // overflow hidden
    var o = new Array(
                  $$("#LayoutTemplates .projectLayoutList")[0],
                  $("poolImageListBox"),
                  $("PreviewListeTemplate"),
                  $("folderListBox")
                );
    $A(o).each(function (aElement) {
      if (aElement) { Element.setStyle(aElement, { overflow: overflow }); }
    });
  },

  showOverlay:function() {
    // ist das Overlay schon geöffnet?
    if (!$("overLayer")) {
      // Hintergrund
      Element.setStyle(this.overLayer, { height: this.bodyHeight + "px" });

      this.htmlBody.appendChild(this.overLayer);

      new Effect.Opacity(this.overLayer,
                        { duration:0.2,
                          from: 0.1, to: 0.6,
                          afterFinish: this.showContentBox.bind(this)
                        });

      // fix den IE  und MAC-OS -Scrollbar-Bug
      this.displayElements("hidden", "hidden");
    }
    else {
      $A($$(".overLayer")).each(function (oneContentBox) {
        Element.setStyle(oneContentBox, { display: "none" });
      });
      this.showContentBox();
    }
  }
}

/************* Class for TabMenus **************/
var tabsMenu = Class.create();
tabsMenu.prototype = {

  initialize:function(aTabMenu, onChange) {
    if(!aTabMenu) {
      return false;
    }

    if (typeof onChange != "undefined") {
      this.onChange = onChange;
    }

    // ini Observerhandler
    var obs = new ObserverHandler();

    // ini Menu-Items
    var tabMenuList = aTabMenu.getElementsByTagName("li");

    for (var i=0; i<tabMenuList.length; i++) {
      obs.setObserver(tabMenuList[i], "click", this.showTab.bindAsEventListener(this, tabMenuList[i], tabMenuList));
    }
  },

  onChange: function() {},

  showTab:function(e, El, tabMenuList) {

    if (e) {
      Event.stop(e);
      El.blur();
    }

    //alert(El);
    //alert(tabMenuList);
    for (var i=0; i<tabMenuList.length; i++) {
      Element.setStyle($(tabMenuList[i].id.split("_")[1]), { display: 'none'});
      tabMenuList[i].setAttribute("class", "");
      tabMenuList[i].setAttribute("className", "");
    }

    var showTab = $(El.id.split("_")[1]);

    Element.setStyle(showTab, { display: 'block'});
    El.setAttribute("class", "active");
    El.setAttribute("className", "active");

    this.onChange();
  }
}

/* Dialog confirm */
var Dialog = Class.create();
Dialog = {
  confirm: function(event, showMessage, onConfirm) {

    Event.stop(event);

    // X- und Y-Position des Mauszeigers ermitteln
    var mousePos = {
      posX: Event.pointerX(event),
      posY: Event.pointerY(event)
    }

    // zeige die Message
    $$("#confirmBox p." + showMessage)[0].style.display = "block";

    // Bestätigungsbox anzeigen
    var myBox = new BorderboxB();
    myBox.showAsPopup('confirmBox');
    myBox.position(mousePos.posX, mousePos.posY);

    // Links mit Eventhandlern versehen
    var linkConfirm = $$("#confirmBox a.confirm")[0];
    var linkCancel  = $$("#confirmBox a.cancel")[0];

    linkConfirm.onclick = (function(e) {
      Event.stop(e);
      myBox.hide.call(myBox);
      $A($$("#confirmBox p")).each(function (p) {
        p.style.display = "none";
      });
      onConfirm(e);
    }).bindAsEventListener();

    linkCancel.onclick = (function(e) {
      Event.stop(e);
      myBox.hide.call(myBox);
      $A($$("#confirmBox p")).each(function (p) {
        p.style.display = "none";
      });
    }).bindAsEventListener();
  },

  showHelpBox: function(event, helpBoxID) {

    Event.stop(event);

    // X- und Y-Position des Mauszeigers ermitteln
    var mousePos = {
      posX: Event.pointerX(event),
      posY: Event.pointerY(event)
    }
    // Box anzeigen
    var myBox = new BorderboxB();

    myBox.showAsPopup(helpBoxID);

    /*
     *  Workaround für IE 6 (bei dem haben die Select-Felder immer den höchsten z-index)
     */
    // Formular ausblenden
    if(helpBoxID == 'helpCcardCvcBox') {
      $("formPaymentCCard").style.visibility = "hidden";
      // Beim Schließen der Box Formular wieder einblenden
      myBox.onClose = function() {$("formPaymentCCard").style.visibility = "visible";};
    }

    myBox.position(mousePos.posX, mousePos.posY);
  }
}

/**
 * Container für einige statische Funktionen für den Seitenaufbau, Link-Vorbereitung, usw.
 */
var Page = Class.create();
Page = {

  /* PRIVATE FALLBACK-FUNCTION */
  _linkDoNothing: function(event) {
    Event.stop(event);
  },

  /**
   * Setzt den MiniCart neu
   */
  refreshMiniCart: function(cartItemCount, cartSum, pulsate) {
    var tableMiniCart = $('minicart');

    if (!tableMiniCart) {
      return;
    }

    if (pulsate == true) {
      // Effekte temporär abgeschaltet wg. Script.aculo.us
      //Effect.Fade(tableMiniCart, { duration: 0.25 });
      //Effect.Appear(tableMiniCart, { duration: 0.25, queue: 'end' });
    }

    $('cartItemCount').firstChild.data = Format.number(cartItemCount, 0);
    $('cartSum').firstChild.data       = cartSum;

    if (cartItemCount > 0) {
      Element.show('miniCartLinkToOrder');
    }
    else {
      Element.hide('miniCartLinkToOrder');
    }
  },

  addToCartAnimation: function(element) {

    // Effekte temporär abgeschaltet wg. Script.aculo.us

    //var clone = element.cloneNode(true);
    //Position.absolutize(clone);
    //Position.clone(element, clone);
    //document.body.appendChild(clone);
    //
    //var position = Position.positionedOffset(element);
    //var positionCart = Position.cumulativeOffset($('minicart'));
    //
    //Effect.MoveBy(clone, positionCart[1] - position[1], positionCart[0] - position[0], {
    //  afterFinish: function(obj) {
    //    obj.element.remove();
    //  }
    //})

    Effect.MoveBy(clone, positionCart[1] - position[1], positionCart[0] - position[0], {
      afterFinish: function(obj) {
        obj.element.remove();
      }
    })
  },

  eHandlerAddProjectToCart: function(element, projectID, mousePos) {

    // XML-Request: Füge zum Warenkorb hinzu
    ProjectTools.addProject(projectID, function(transport) {

      var xmlDoc = transport.responseXML;

      if(xmlDoc.getElementsByTagName('result')[0].firstChild.data == "success") {
        var cartSum     = xmlDoc.getElementsByTagName('cart_sum')[0].firstChild.data;
        var cartAmount  = xmlDoc.getElementsByTagName('cart_amount')[0].firstChild.data;
        Page.refreshMiniCart(cartAmount, cartSum, true);

        // falls nicht eingeloggt Anmeldeformular zeigen
        if(xmlDoc.getElementsByTagName('logedIn')[0].firstChild.data == 0) {
          UserAssignTools.register();
          return false;
        }

        // falls wir uns im editor befinden, in den Cart umleiten
        if(typeof project != "undefined") {
          location.href = '/order/';
          return false;
        }

        // Bestätigungsbox anzeigen
        var myBox = new BorderboxB();
        myBox.showAsPopup('confirmOrder');
        myBox.position(mousePos.posX, mousePos.posY);

        // Links mit Eventhandlern versehen
        var linkConfirm = getElementsByClass('confirm', myBox.borderBox, 'a')[0];
        var linkCancel  = getElementsByClass('cancel', myBox.borderBox, 'a')[0];

        linkConfirm.onclick = (function(e) {
          Event.stop(e);
          myBox.hide.call(myBox)
          location.href='/order/';
        }).bindAsEventListener();

        linkCancel.onclick = (function(e) {
          Event.stop(e);
          myBox.hide.call(myBox);
          var loc = location + "";
          // wenn es sich nicht um die projektliste handelt dort hinschicken
            if(!loc.match(/projects\/?$/)) {
              location.href='';
          }
        }).bindAsEventListener();

      }

      else {
          if(xmlDoc.getElementsByTagName('errorInProject')[0].firstChild.data == 1){
            var myBox2 = new BorderboxB();
            myBox2.showAsPopup('errorInProject');
            myBox2.position(mousePos.posX, mousePos.posY);
            var errorProjectConfirm = getElementsByClass('confirm', myBox2.borderBox, 'a')[0];

            errorProjectConfirm.onclick = (function(e) {
              Event.stop(e);
              location.href='';
              myBox2.hide.call(myBox2);
            }).bindAsEventListener();
          }
          else {
            console.log("Status failed");
            Page.eHandlerAddToCartFailed(element, projectID, mousePos, xmlDoc.getElementsByTagName('message'));
          }
      }
    }

    , false);
  },

  /**
   * Handler für das Hinzufügen eines Projekts zum Warenkorb
   */
  eHandlerAddToCart: function(event) {
    Event.stop(event);
    var element = this;

    // X- und Y-Position des Mauszeigers ermitteln
    var mousePos = {
      posX: Event.pointerX(event),
      posY: Event.pointerY(event)
    }

    // ProjektID herausfinden
    var projectID = element.id.split('_')[1];

    // falls wir uns im editor befinden, dann erst mal speichern
    if(typeof project != "undefined") {
      project.saveProject('saveAll');
      Page.eHandlerAddProjectToCart(element, projectID, mousePos);
    }
    else {
      Page.eHandlerAddProjectToCart(element, projectID, mousePos);
    }
  },

  /**
   * Für Aussnahmen beim Bestellen eines Projekts
   */
  eHandlerAddToCartFailed: function(element, projectID, mousePos, message) {

    // Bestätigungsbox anzeigen
    var myBox = new BorderboxB();
    myBox.showAsPopup('cancelOrder');
    myBox.position(mousePos.posX, mousePos.posY);

    // Callback für Löschen
    var callbackFct = function() {
      var lastProject   = getElementsByClass("projectLink", $('myLastProject'));
      var lastProjectID = lastProject[0].id.split('_')[1];

      if(lastProjectID == projectID) {
        location.href = '/myproducts/';
      }
      if(projectNode = $('Project_' + projectID)) {
        Element.hide($('Project_' + projectID));
      }
    }

    // Message übergeben
    var messageBoxes = getElementsByClass('message', myBox.borderBox, 'li');
    $A(messageBoxes).each(function(mb) {
      Element.setStyle(mb, { visibility: "hidden"});
    })

    $A(message).each(function(m) {
      Element.setStyle(messageBoxes[m.firstChild.data], { visibility: "visible"});
    })

    // Links mit Eventhandlern versehen
    var linkConfirm = getElementsByClass('confirm', myBox.borderBox, 'a')[0];
    var linkCancel  = getElementsByClass('cancel', myBox.borderBox, 'a')[0];

    linkConfirm.onclick = (function(e) {
      Event.stop(e);

      // XML-Request: Füge definitiv zum Warenkorb hinzu (confirmed = true)
      ProjectTools.addProject(projectID, function(transport) {

        var xmlDoc = transport.responseXML;

        if(xmlDoc.getElementsByTagName('logedIn')[0].firstChild.data == 0) {
          // falls nicht eingeloggt Anmeldeformular zeigen
          UserAssignTools.register();
        }
        else {
          var cartSum = xmlDoc.getElementsByTagName('cart_sum')[0].firstChild.data;
          var cartAmount = xmlDoc.getElementsByTagName('cart_amount')[0].firstChild.data;
          Page.refreshMiniCart(cartAmount, cartSum, true);
          //QaD-Umleitung direkt auf Order-Seite
          location.href = '/order/';
          myBox.hide.call(myBox)
          // falls wir uns im editor befinden, in den Cart umleiten
          if(typeof project != "undefined") {
            location.href = '/order/';
            return false;
          }
        }
      }, true);
      //myBox.hide.call(myBox)
    }).bindAsEventListener();
    Event.observe(linkCancel,  'click', myBox.hide.bind(myBox));
  },

  /**
   * Handler für das Bearbeiten eines Projekts
   */
  eHandlerEditProject: function(event) {
    Event.stop(event);
    var element = this;


    // ProjektID herausfinden
    var projectID = element.id.split('_')[1];

    ProjectInterface.startEditor(projectID);
  },

  /**
   * Handler für das Bearbeiten eines Projekts
   */
  eHandlerCopyProject: function(event) {
    var element = this;

    Event.stop(event);

    // ProjektID herausfinden
    var params = element.id.split('_');
    var projectID = params[1];
    var productType = params[2];

    var buttonPos = (Position.cumulativeOffset(element));
    var myBox     = new BorderboxB();
    myBox.showAsPopup('copyProjectConfirm');
    myBox.position(buttonPos[0], buttonPos[1]);
    var confirmBox    = $("copyProjectConfirm");
    var linkConfirm   = confirmBox.getElementsByTagName("a")[0];
    var inputNameEl   = confirmBox.getElementsByTagName("input")[0];
    var pel = $('Project_' + projectID);
    var h2  = pel.getElementsByTagName("h2");
    inputNameEl.value = $('Project_' + projectID).getElementsByTagName("h2")[0].firstChild.nodeValue;


    linkConfirm.onclick = (function(evt) {
      Event.stop(evt);
      myBox.hide.call(myBox);
      var projectName = inputNameEl.value;
      ProjectTools.copyProject(projectID, projectName, false, false,
        function(transport) {
        var XMLDoc = transport.responseXML;
          if ((result = XMLDoc.getElementsByTagName('result')) && (result[0].firstChild.data == "success")) {
            new Ajax.Updater('projectClass_' + productType, '/interfaces/project_properties.php' + "?action=getRenderedProjectList&type=" + productType);
            location.hash = 'projectClass_' + productType;
          }
       }.bind(this));
    }).bindAsEventListener(this);

  },

  /**
   * Handler für das Bearbeiten eines Projekts
   */
  eHandlerRenameProject: function(event) {
    var element = this;

    Event.stop(event);

    // ProjektID herausfinden
    var params = element.id.split('_');
    var projectID = params[1];

    var buttonPos = (Position.cumulativeOffset(element));
    var myBox     = new BorderboxB();
    myBox.showAsPopup('copyProjectConfirm');
    myBox.position(buttonPos[0], buttonPos[1]);
    var confirmBox    = $("copyProjectConfirm");
    var linkConfirm   = confirmBox.getElementsByTagName("a")[0];
    var inputNameEl   = confirmBox.getElementsByTagName("input")[0];
    var pel = $('Project_' + projectID);
    var h2  = pel.getElementsByTagName("h2");
    inputNameEl.value = $('Project_' + projectID).getElementsByTagName("h2")[0].firstChild.nodeValue;


    linkConfirm.onclick = (function(evt) {
      Event.stop(evt);
      var projectName = inputNameEl.value;
      // Leere Namen nicht zulassen
      if(projectName == "") {
        return;
      }
      myBox.hide.call(myBox);
      ProjectTools.renameProject(projectID, projectName,
        function(transport) {
        var XMLDoc = transport.responseXML;
          if ((result = XMLDoc.getElementsByTagName('result')) && (result[0].firstChild.data == "success")) {
          $('Project_' + projectID).getElementsByTagName('h2')[0].firstChild.data = projectName;
          }
       }.bind(this));
    }).bindAsEventListener(this);

  },
  showUserImages: function() {
      // Upload ist nur dann möglich, wenn ein User-Ordner ausgewählt ist (nix PoolImages)
      if(!FOA.selectedFolder) {

      // Wenn kein User Ordner augewöhlt wird, wird UserImages-Tab eingeblendet
        var tabMenuList = $('galleryTabsMenu');
        var userLink    = tabMenuList.getElementsByClassName('user');

        // den Fall abfangen, dass ein Mandant keine UserImages hat (z.B. StudiVZ)
        if(userLink.length) {
         galleryTabsMenu.showTab(null,userLink[0].parentNode,tabMenuList.getElementsByTagName('li'));
        }
      }
  },
  eHandlerStartUpload: function(e) {
      Event.stop(e);
      Page.showUserImages();
    if (FOA.uploadType == "html") {
        location.href = "/mypics/upload/";
      } else {
        FOA.overlayContext = new ClassUpload(FOA.User.id, FOA.selectedFolder, "overLayerUpload", ClassUpload.onClose);
        FOA.overlayContext.uploadStep(1);
        FOA.overlayContext.openFileSelection(true);
      }
    },

  eHandlerAddNewFolder: function(e) {
     Event.stop(e);
     Page.showUserImages();
     Folder.addNewFolderHandler();
  },

  /**
   * Handler für die Anzeige einer Projektvorschau
   */
  eHandlerPreviewProject: function(event) {
    Event.stop(event);
    ProjectTools.preview(this);
  },

  /**
   * Handler für das Löschen eines Projekts
   */
  eHandlerRemoveProject: function(event) {

    if (event) {
      Event.stop(event);
    }

    var element = this;

    // ProjektID herausfinden
    var projectID = element.id.split('_')[1];

    // Callback für Löschen
    var callbackFct = function() {
      var lastProject   = getElementsByClass("projectLink", $('myLastProject'));
      var lastProjectID = lastProject[0].id.split('_')[1];

      if(lastProjectID == projectID) {
        location.href = '/myproducts/';
      }
      if(projectNode = $('Project_' + projectID)) {
        Element.hide($('Project_' + projectID));
      }
    }

    ProjectInterface.removeProject(projectID, callbackFct);
  },

  /**
   * Handler für das Löschen einer Projektfreigabe
   */
  eHandlerRemoveSharedProject: function(event) {

    if (event) {
      Event.stop(event);
    }

    var element = this;

    // ProjektID herausfinden
    var projectID = element.id.split('_')[1];

    // Callback für Löschen
    var callbackFct = function() {
      var lastProject   = getElementsByClass("projectLink", $('myLastProject'));
      var lastProjectID = lastProject[0].id.split('_')[1];

      if(lastProjectID == projectID) {
        location.href = '/myproducts/';
      }
      if(projectNode = $('Project_' + projectID)) {
        Element.hide($('Project_' + projectID));
      }
    }

    ProjectInterface.removeSharedProject(projectID, callbackFct);
  },

  /**
   * Bereitet alle "projectLink"-Links der aktuellen Seite auf
   */
  prepareProjectLinks: function() {},

  /**
   * Linkverhalten festlegen
   */
  applyLinkBehaviour: function() {
    //Behaviour.register({

    $$("li.addProjectTeaserLink").each(function(aBox) {

      var aLink = getElementsByClass("projectTeaserLink", aBox, "a")

      if( aLink[0]) {
        Event.observe(aBox, 'click', function() { location.href = aLink[0]; });
      }

    });

    /**
     *
     */
    var searchProjectLinks = $$("a.projectLink");
    searchProjectLinks = searchProjectLinks.concat($$("h2.projectLink"));

    $A(searchProjectLinks).each(function(aLink) {
      // Art des Links (edit/remove/usw.)

      var linkType = aLink.id.split("_")[0].replace('projectLink', '').toLowerCase();

      switch (linkType) {
        case 'addtocart':
          Event.observe(aLink, 'click', Page.eHandlerAddToCart.bindAsEventListener(aLink));
          break;
        case 'nocart':
          Event.observe(aLink, "click", Dialog.showHelpBox.bindAsEventListener(null, 'notReadyForOrder'));
          break;
        case 'noshare':
          Event.observe(aLink, "click", Dialog.showHelpBox.bindAsEventListener(null, 'notReadyForSharing'));
          break;
        case 'edit':
          Event.observe(aLink, 'click', Page.eHandlerEditProject.bindAsEventListener(aLink));
          break;
        case 'remove':
          Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteOneProject', Page.eHandlerRemoveProject.bindAsEventListener(aLink)));
          break;
        case 'removeshared':
          Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteSharedProject', Page.eHandlerRemoveSharedProject.bindAsEventListener(aLink)));
          break;
        case 'preview':
          Event.observe(aLink, 'click', Page.eHandlerPreviewProject.bindAsEventListener(aLink));
          break;
        case 'copy':
            Event.observe(aLink, 'click', Page.eHandlerCopyProject.bindAsEventListener(aLink));
            break;
        case 'rename':
            Event.observe(aLink, 'click', Page.eHandlerRenameProject.bindAsEventListener(aLink));
            break;
      }
    });

    /**
     * PaymentLink: Nutze diese Bankverbindung für den Orderprozess
     */
    $$("a.paymentItemLink").each(function(aLink) {

      // Art des Links (edit/remove/usw.)
      var linkType = aLink.id.split("_")[0].replace('paymentItemLink', '').toLowerCase();

      switch (linkType) {

        case 'remove':
          //Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteOneELV', PaymentInterface.eHandlerRemovePaymentItem.bindAsEventListener(aLink)));
          break;

        case 'use':
          //Event.observe(aLink, "click", PaymentInterface.eHandlerUsePaymentItem.bindAsEventListener(aLink));
          break;

        case 'usenew':
          Event.observe(aLink, "click", PaymentInterface.eHandlerUseNewPaymentItem.bindAsEventListener(aLink));
          break;
      }
    });
    if(helpCcardCVC=$("help_ccard_cvc")) {
      Event.observe(helpCcardCVC, "click", Dialog.showHelpBox.bindAsEventListener(null, 'helpCcardCvcBox'));
    }

    $$("a.cartItemLink").each(function(aLink) {

      // Art des Links (edit/remove/usw.)
      var linkType = aLink.id.split("_")[0].replace('cartItemLink', '').toLowerCase();

      switch (linkType) {

        case 'remove':
          Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteOneCartItem', OrderInterface.eHandlerRemoveCartItem.bindAsEventListener(aLink)));
          break;

        case 'removeall':
          Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteAllCartItems', OrderInterface.eHandlerRemoveAllCartItems.bindAsEventListener(aLink)));
          break;

        case 'edit':
          Event.observe(aLink, "click", OrderInterface.eHandlerEditCartItem.bindAsEventListener(aLink));
          break;

      }
    });

    $$("a.cartItemLink").each(function(aLink) {

        // Art des Links (edit/remove/usw.)
        var linkType = aLink.id.split("_")[0].replace('cartItemLink', '').toLowerCase();

        switch (linkType) {

          case 'remove':
            Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteOneCartItem', OrderInterface.eHandlerRemoveCartItem.bindAsEventListener(aLink)));
            break;

          case 'removeall':
            Event.observe(aLink, 'click', Dialog.confirm.bindAsEventListener(aLink, 'deleteAllCartItems', OrderInterface.eHandlerRemoveAllCartItems.bindAsEventListener(aLink)));
            break;

          case 'edit':
            Event.observe(aLink, "click", OrderInterface.eHandlerEditCartItem.bindAsEventListener(aLink));
            break;

        }
      });
    $$("#form_order input.productOption").each(function(element) {
        Event.observe(element, "click", OrderInterface.eHandlerOption.bindAsEventListener(element));
      });

    /**
    * ImageContext:
    */
    // Album-Navigation
    $A($$("img.link_first_image")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('first') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_prev_image")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('prev') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_next_image")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('next') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_last_image")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('last') }.bindAsEventListener());
    }.bind(this));

    // rename
    $A($$("a.imageContextRename")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.step(1);
                                      }.bindAsEventListener());
    });
    $A($$("#formImageRename .renameImageButton")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.rename();
                                      }.bindAsEventListener());
    });
    // upload
    $A($$("a.imageContextUpload")).each(function(oneLink) {
      Event.observe(oneLink, 'click', Page.eHandlerStartUpload.bindAsEventListener());
    });

    // In der Gallery observer auf Menu-Elemente "Neuen Ordner anlegen" und "Bilder hochladen" legen
    if($('galleryTabsMenu')) {
      if(menuUploadLink = $('mypics_upload')) {
        Event.observe(menuUploadLink, 'click', Page.eHandlerStartUpload.bindAsEventListener());
      }

      if(menuNewFolderLink = $('mypics_create_folder')) {
        Event.observe(menuNewFolderLink, 'click', Page.eHandlerAddNewFolder.bindAsEventListener());
      }
    }

    // delete
    $A($$("a.imageContextDelete")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.step(2);
                                      }.bindAsEventListener());
    });
    $A($$("#formImageDelete .deleteImageButton")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.remove();
                                      }.bindAsEventListener());
    });

    // automatic Printsmap
    /*
    $A($$(".imagestepTeaser a")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.startProduct();
                                      }.bindAsEventListener());
    });
    */
    // image SlideShow LoginHome
    $A($$("#page_login_home .formDisplayImage")).each(function(oneForm) {
      Event.observe(oneForm, 'click', function(e) {
                                        Event.stop(e);
                                        var inputs = Form.getInputs(oneForm);
                                        var img    = new Hash();
                                        $A(inputs).each(function(oneInput) {
                                           img[oneInput.name] = oneInput.value;
                                        });
                                        FOA.overlayContext = new ClassImageSlideShow(FOA.User.id, img.imageID, img.folderID, "user");
                                      }.bindAsEventListener());
    });

    /**
    * FolderContext:
    */
    // Album-Navigation
    $A($$("img.link_first_album")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('first') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_prev_album")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('prev') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_next_album")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('next') }.bindAsEventListener());
    }.bind(this));
    $A($$("img.link_last_album")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) { Event.stop(e); FOA.overlayContext.go('last') }.bindAsEventListener());
    }.bind(this));
    // rename
    $A($$("a.folderContextRename")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.step(1);
                                      }.bindAsEventListener());
    });
    $A($$("#formRename .renameFolderButton")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.rename();
                                      }.bindAsEventListener());
    });
    // delete
    $A($$("a.folderContextDelete")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.step(2);
                                      }.bindAsEventListener());
    });
    var folderLink;
    if (folderLink = $("folderOptionDelete")) {
      Event.observe(folderLink, 'click', function() { $("folderContextDisplace").hide(); });
    }
    if (folderLink = $("folderOptionDisplace")) {
      Event.observe(folderLink, 'click', function() { $("folderContextDisplace").show(); });
    }
    if (folderLink = $("folderContextDeleteButton")) {
      Event.observe(folderLink, 'click', function(e) {
                                            Event.stop(e);
                                            FOA.overlayContext.remove();
                                         }.bindAsEventListener());
    }
    // upload
    $A($$("a.folderContextUpload")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        if (FOA.uploadType == "html") {
                                          location.href = "/mypics/upload/";
                                        } else {
                                          FOA.overlayContext = new ClassUpload(FOA.User.id, FOA.selectedFolder, "overLayerUpload", ClassUpload.onClose);
                                          FOA.overlayContext.openFileSelection(true);
                                        }
                                      }.bindAsEventListener());
    });
    // automatic Product
    $A($$(".folderstepTeaser a")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.startProduct(this.href);
                                      }.bindAsEventListener(oneLink));
    });
    // Dateiauswahl mit neuem FolderContext
    var openLink;
    if (openLink = $("openFileSelectionOverlay")) {
      Event.observe(openLink, 'click', function(e) {
                                        if (FOA.uploadType != "html") {
                                          Event.stop(e);
                                          var folder;
                                          if (folder = $('folder_id')) {
                                            FOA.selectedFolder = parseInt(folder.value);
                                            FOA.overlayContext = new ClassUpload(FOA.User.id, FOA.selectedFolder, "overLayerUpload", ClassUpload.onClose);
                                            FOA.overlayContext.uploadStep(1);
                                            FOA.overlayContext.openFileSelection(true);
                                          }
                                        }
                                      }.bindAsEventListener());
    }
    // Dateiauswahl mit vorhandenem FolderContext
    $A($$(".openFileSelection")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        FOA.overlayContext.uploadStep(1);
                                        FOA.overlayContext.openFileSelection();
                                      }.bindAsEventListener());
    }.bind(this));
    // Ordner anlegen
    var newLink;
    if (newLink = $("applyNewAlbum")) {
      Event.observe(newLink, 'click', function(e) {
                                        if (FOA.uploadType != "html") {
                                          Event.stop(e);
                                          ClassUpload.applyNewAlbum();
                                        }
                                      }.bindAsEventListener());
    }
    // gallery mit folderID öffnenen
    $A($$("a.locationUploadGallery")).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        location.href='/mypics/?folder_id=' + FOA.selectedFolder;
                                      }.bindAsEventListener());
    }.bind(this));
    // Upload beenden
    $A($$('a.locationUploadEnd')).each(function(oneLink) {
      Event.observe(oneLink, 'click', function(e) {
                                        Event.stop(e);
                                        ModalboxUpload.closeModal();
                                      }.bindAsEventListener());
    });
  },

  toggleGivenObj: function(eId, d)
  {
    new Effect.toggle(eId, 'blind',{ duration: d });
  },

  manageMultipleToggle: function(eId, eClassname, duration) {
    var myduration = (duration == null) ? 1 : duration;
    var eList     = $A(document.getElementsByClassName(eClassname));
    for(i=0; i<eList.length; i++) {
      if(eList[i].id != eId && eList[i].visible()) {
        this.toggleGivenObj(eList[i].id, myduration)
      }
    }
    this.toggleGivenObj(eId, myduration);
  }
}

var AddressInterface = Class.create();
AddressInterface = {

  /**
   * Interface-URL
   */
  interfaceURL: '/interfaces/xml_user_addresses.php',

  /**
   * Löscht eine Adresse des Users
   */
  removeAddress: function(addressID, callback) {

    if (!callback) {
      callback = function() {}
    }

    new Ajax.Request(AddressInterface.interfaceURL, {
      parameters: 'action=removeAddress'
                + '&address_id=' + addressID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  }
}

var ProjectInterface = Class.create();
ProjectInterface = {

  /**
   * Interface-URL
   */
  interfaceURL: '/interfaces/xml_projects.php',

  /**
   * Fügt ein Projekt (ProjectID) zum Warenkorb hinzu
   */
  getProjectData: function(projectID, callback) {

    if (!callback) {
      callback = function() {}
    }

    new Ajax.Request(ProjectInterface.interfaceURL, {
      parameters: 'action=getData'
                + '&project_id=' + projectID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Löscht ein Projekt
   */
  removeProject: function(projectID, callback) {

    if (!callback) {
      callback = function() { }
    }

    new Ajax.Request(ProjectInterface.interfaceURL, {
      parameters: 'action=removeProject'
                + '&project_id=' + projectID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Löscht eine Projektfreigabe
   */
  removeSharedProject: function(projectID, callback) {

    if (!callback) {
      callback = function() { }
    }

    new Ajax.Request(ProjectInterface.interfaceURL, {
      parameters: 'action=removeSharedProject'
                + '&project_id=' + projectID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Startet den Editor für eine ProjektID. Holt sich vorher
   * die Produktklasse für das Projekt um die URL zu erstellen.
   */
  startEditor: function(projectID) {

    // Projektdaten abfragen, um den Produktklassentyp zu erhalten
    ProjectInterface.getProjectData(projectID, function(transport) {
     try {
        var className = transport.responseXML.getElementsByTagName('product_type')[0].firstChild.data;
        location.href = '/myproducts/' + className + 'Editor/?project_id=' + projectID;
      }
      catch(e) {
        alert("Es ist ein Fehler aufgetreten.");
      }
    })
  }
}


var PaymentInterface = Class.create();
PaymentInterface = {

  /**
   * Interface-URL
   */
  interfaceURL: '/interfaces/xml_user_paymentaccounts.php',

  /**
   * Linkhandler für die Verwendung einer Zahlungsart
   */
  eHandlerUsePaymentItem: function(event) {
    Event.stop(event);

    var element = this;

    // RecordID herausfinden
    var recordID = element.id.split('_')[1];

    // Typ der Zahlungsart unterscheiden
    if (element.hasClassName('elv')) {
      var type = 'elv';
    }
    else if (element.hasClassName('ccard')) {
      var type = 'ccard';
    }
    else if (element.hasClassName('invoice')) {
      var type = 'invoice';
    }
    else if (element.hasClassName('prepayment')) {
      var type = 'prepayment';
      // Damit Request nicht abgewiesen wird
      recordID = 1;
    }

    // Zahlungsart setzen
    OrderInterface.setPayment(type, recordID, OrderInterface.jumpToNextStep)
  },

  /**
   * Linkhandler für die Verwendung einer neuen Zahlungsart
   */
  eHandlerUseNewPaymentItem: function(event) {
    Event.stop(event);

    var element = this;

    // Typ der Zahlungsart unterscheiden
    if (element.hasClassName('elv')) {
      var type = 'elv';
      var myForm = $('formPaymentELV');
      var idField = 'useraccount_id';
    }
    else if (element.hasClassName('ccard')) {
      var type = 'ccard';
      var myForm = $('formPaymentCCard');
      var idField = 'creditcard_id';
    }

    // Callbackfunktion für die Übermittlung des Formulars setzen
    myForm.callbackFunction = function(xmlDoc) {

      var recordIDNode = xmlDoc.getElementsByTagName(idField)[0];
      if (recordIDNode) {
        recordID = recordIDNode.firstChild.data;
        //OrderInterface.setPayment(type, recordID, OrderInterface.jumpToNextStep);
        OrderInterface.setPayment(type, recordID, function(){ location.href = "/order/check/";});
      }
    }

    // Formular abschicken
    myForm.submitForm.call(myForm, event);

  },

  /**
   * Clickhandler für den Löschen-Link einer Zahlungsart
   */
  eHandlerRemovePaymentItem: function(event) {

    var element = this;

    // RecordID herausfinden
    var recordID = element.id.split('_')[1];
    // Typ der Zahlungsart unterscheiden
    if (element.hasClassName('elv')) {
      var type = 'elv';
      var removeUserPaymentMethod = PaymentInterface.removeUserAccount;
    }
    else if (element.hasClassName('ccard')) {
      var type = 'ccard';
      var removeUserPaymentMethod = PaymentInterface.removeUserCreditcard;
    }

    // Übergeordnetes Listenelement finden
    var liNode = getParentByClass('generalList', element);
    //liNode.style.border = "5pt solid #0000ff;";

    if (!liNode) {
      return false;
    }

    // Callback für Löschen
    callbackFct = function() {
       Element.remove(liNode);
    }

    // Zuvor definierte Callbackfunktion ausführen
    removeUserPaymentMethod(recordID, callbackFct);
  },

  /**
   * Löscht eine Bankverbindung eines Users
   */
  removeUserAccount: function(accountID, callback) {

    if (!callback) {
      callback = function() { }
    }

    new Ajax.Request(PaymentInterface.interfaceURL, {
      parameters: 'action=removeAccount'
                + '&account_id=' + accountID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Löscht eine Kreditkarte eines Users
   */
  removeUserCreditcard: function(creditcardID, callback) {

    if (!callback) {
      callback = function() { }
    }

    new Ajax.Request(PaymentInterface.interfaceURL, {
      parameters: 'action=removeCreditcard'
                + '&creditcard_id=' + creditcardID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  }
}

var OrderInterface = Class.create();
OrderInterface = {

  /**
   * Interface-URL
   */
  interfaceURL: '/interfaces/xml_user_new_order.php',

  /**
   * Setzt eine Zahlungsart
   */
  setPayment: function(type, paymentID, callback) {
    if (!callback) {
      callback = function() { }
    }
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=setPayment'
                + '&type=' + type
                + '&payment_id=' + paymentID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Setzt eine Adresse
   */
  setAddress: function(addressID, type, callback) {

    if (!callback) {
      callback = function() { }
    }

    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=setAddress'
                + '&addressType=' + type
                + '&addressID=' + addressID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Clickhandler für die Verwendung einer Adresse
   */
  eHandlerAddressUse: function(event) {
    Event.stop(event);

    var element = this;

    // recordID herausfinden
    var addressID = element.id.split('_')[1];

    var addressType;
    if (!(addressType = element.id.split('_')[2])) {
      addressType = 'both';
    }

    var callbackFct = function (XMLDoc)  {
      var result    = XMLDoc.responseXML.getElementsByTagName('result')[0].firstChild.data;
      // Adresse erfolgreich gesetzt ?
      if(result == "success") {
        OrderInterface.jumpToNextStep();
      }
      else {
        alert("Beim Speichern der Adresse ist ein Fehler aufgetreten");
      }
    }
    OrderInterface.setAddress(addressID, addressType, callbackFct);
  },

  showErrorBox: function(id, e) {
    /*
    // Stoppe das Click-Event auf den #-Link
    Event.stop(e);
    */
    var myBox = new BorderboxB();
    myBox.showAsPopup(id);
    //myBox.position(Event.pointerX(e), Event.pointerY(e));
    var pos = Position.cumulativeOffset($("voucherCodeField"));
    myBox.position(pos[0], pos[1]);
  },

  /**
   * Clickhandler für die Verwendung einer Adresse
   */
  eHandlerAddressRemove: function(event) {
    Event.stop(event);

    var element = this;

    // RecordID herausfinden
    var addressID = element.id.split('_')[1];

    // Übergeordnetes Listenelement finden
    var liNode = getParentByClass('listItem', element);
    if (!liNode) {
      return false;
    }

    // X- und Y-Position des Mauszeigers ermitteln
    var mousePos = {
      posX: Event.pointerX(event),
      posY: Event.pointerY(event)
    }

    // Bestätigungsbox anzeigen
    var myBox = new BorderboxB();
    myBox.showAsPopup('deleteBox');
    myBox.position(mousePos.posX, mousePos.posY);

    // Links mit Eventhandlern versehen
    var linkConfirm = getElementsByClass('confirm', myBox.borderBox, 'a')[0];
    var linkCancel  = getElementsByClass('cancel', myBox.borderBox, 'a')[0];
    linkConfirm.onclick = (function(e) {
      Event.stop(e);

      // Adresse löschen
      AddressInterface.removeAddress(addressID, function(transport) {

        var XMLDoc = transport.responseXML;
        var result = XMLDoc.getElementsByTagName('result')[0].firstChild.data;

        if (result == 'success') {
          Element.remove(liNode);
        }
      });

      myBox.hide.call(myBox);

    }).bindAsEventListener();
    Event.observe(linkCancel,  'click', myBox.hide.bind(myBox));

  },

  /**
   * Leitet den Browser auf die nächste Seite im Bestellprozess um
   */
  jumpToNextStep: function() {
    // Suche aus den Link-Elementen der Seite das "next"-Element
    var linkElements = document.getElementsByTagName('link');
    for (var i = 0; i < linkElements.length; i++) {
      var relAttrib = linkElements[i].getAttribute('rel');
      var relHref   = linkElements[i].getAttribute('href');
      if (relAttrib == 'next') {
        location.href = relHref;
        return;
      }
    }

    // Wenn nichts gefunden werden konnte, dann hier auf den Orderprozess umleiten
    location.href = '/order/';

  },

  /**
   * Ändert die Menge eines Items im Warenkorb
   */
  changeAmount: function(cartItemID, newAmount) {

    if (newAmount < 1) {
      return false;
    }

    new Ajax.Updater($('cartSummary'), OrderInterface.interfaceURL + '?action=setItemAmount&usercart_id=' + cartItemID + '&amount=' + newAmount)
    $('amountCartItem_' + cartItemID).firstChild.data = newAmount;
//    new Ajax.Request(OrderInterface.interfaceURL, {
//      parameters: 'action=setItemAmount'
//                + '&usercart_id=' + cartItemID
//                + '&amount=' + newAmount,
//      onSuccess: callback,
//      on403: UserAssignTools.login
//    });
  },

  eHandlerOption: function(e) {
    var element = this;

    // RecordID herausfinden
    var params = element.getAttribute('name').split('[');
    new Ajax.Updater($('cartSummary'), OrderInterface.interfaceURL + '?action=' +
      (element.checked ? 'addOption' : 'deleteOption') + '&usercart_id=' + params[1].substring(0, params[1].length -1)
      + '&type=' + params[0]
    );
  },

  /**
   * Clickhandler für den Bearbeiten-Link (= Anzahl ändern) eines WarenkorbItems
   */
  eHandlerEditCartItem: function(e) {

    // Stoppe das Click-Event auf den #-Link
    Event.stop(e);

    var element = this;

    // RecordID herausfinden
    var cartItemID = element.id.split('_')[1];

    // Übergeordnetes Listenelement finden
    var liNode = getParentByClass('cartItem', element);
    if (!liNode) {
      return false;
    }

    // X- und Y-Position des Mauszeigers ermitteln
    var mousePos = {
      posX: Event.pointerX(e),
      posY: Event.pointerY(e)
    }

    var myBox = new BorderboxB();
    myBox.showAsPopup('amountBox');
    myBox.position(mousePos.posX, mousePos.posY);

    // aktuellen Wert einsetzen
    $("amountInput").value = parseInt(getElementsByClass('unformatedAmount', liNode, 'span')[0].firstChild.data);

    // Click auf übernehmen-Link beobachten
    var amountSetter = $("amountSetter");

    amountSetter.onclick = (function(e) {
      Event.stop(e);

      var newAmount = parseInt($("amountInput").value);

      if (newAmount > 0) {
        OrderInterface.changeAmount(cartItemID, newAmount);
        myBox.hide.call(myBox);
      }
    }).bindAsEventListener(this);

    $('countUp').onclick = function() {
      $("amountInput").value = parseInt($("amountInput").value) + 1;
    }

    $('countDown').onclick = function() {
      $("amountInput").value = Math.max(1, parseInt($("amountInput").value) - 1);
    };
  },

  /**
   * Löscht ein Item aus dem Warenkorb
   */
  removeItem: function(recordID, liNode) {

  // RecordID herausfinden
    new Ajax.Updater($('cartSummary'), OrderInterface.interfaceURL + '?action=removeCartItem&usercart_id=' + recordID);
  // Übergeordnetes Listenelement finden

    var childElements = getElementsByClass('child_' + recordID, liNode.parentNode, 'div');
    console.log(childElements);
    Element.remove(liNode);
    for(var i = 0; i < childElements.length; i++) {
      Element.remove(childElements[i].parentNode);
    }
  },

  /**
   * Clickhandler für den Löschen-Link eines WarenkorbItems
   */
  eHandlerRemoveCartItem: function(event) {

    var element = this;

    // RecordID herausfinden
    var recordID = element.id.split('_')[1];

    // Übergeordnetes Listenelement finden
    var liNode = getParentByClass('listItem', element);
    if (!liNode) {
      return false;
    }

    OrderInterface.removeItem(recordID, liNode);
  },

  /**
   * Löscht alle Items aus dem Warenkorb
   */
  removeAllItems: function(callback) {

    if (!callback) {
      var callback = function() { };
    }


    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=removeAllCartItems',
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  /**
   * Clickhandler für den Löschen-Link eines WarenkorbItems
   */
  eHandlerRemoveAllCartItems: function(event) {

    OrderInterface.removeAllItems(function(transport) {

      var XMLDoc = transport.responseXML;
      var result = XMLDoc.getElementsByTagName('result')[0].firstChild.data;
      if (result == 'success') {
        location.href = '/order';
        // Listenelement suchen
//        var cartItemList = $$("div.cartItemList")[0];
//        var newList = cartItemList.cloneNode(false);
//        cartItemList.parentNode.replaceChild(newList, cartItemList);
//
//        // Gesamtpreis und Anzahl und PoolImageSumme zurücksetzen
//        $$('td.tableCell.value.cartSaldo')[0].firstChild.data = Format.currency(0);
//        $$('td.tableCell.value.poolImageCosts')[0].firstChild.data = Format.currency(0);
//
//        // ggf. Minicart auffrischen
//        Page.refreshMiniCart(0, 0, true);

      }
    });
  },

  useCredits: function(callback) {
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=useCredits',
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  checkResult: function(XMLDoc, e) {
    responseXML = XMLDoc.responseXML;
    var result = responseXML.getElementsByTagName("result")[0].firstChild.data;
    if(result == "success") {
      OrderInterface.jumpToNextStep();
    }
    else {
      /* Das ergibt ein Fahler bei Opera (evtl. liegt es daran), dass Textfeld kein Teil
       * eines Formulars ist. TODO: prüfen, ob das so ist
       *
       * $("voucherCodeField").enable();
       */
      Form.Element.enable("voucherCodeField");
      var errorString = responseXML.getElementsByTagName("error_string")[0].firstChild.data;
      OrderInterface.showErrorBox(errorString);
    }
  },

  useVoucher: function(callback) {
    //var voucherID = this.id.split("_")[1];
    var voucherID = $("voucherCodeField").value;
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=useVoucher&voucherID=' + voucherID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  setShippingProduct: function(e, callback) {
    if (!callback) {
      callback = function() { }
    }
    var shippingProductID = this.id.split("_")[1];
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=setShippingProduct'
                + '&shippingProductID=' + shippingProductID,
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },


  doNotUseBenefits: function(callback) {
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=doNotUseBenefits',
      onSuccess: callback,
      on403: UserAssignTools.login
    });
  },

  checkUsingOfBenefits: function(e) {
    Event.stop(e);
    var benefitsPossibilities = $$(".select_benefits");
    for(var i=0;i<benefitsPossibilities.length;i++) {
      if(benefitsPossibilities[i].checked) {
        eval("OrderInterface." + benefitsPossibilities[i].id + "(OrderInterface.checkResult)");
        return false;
      }
    }
    if($("voucherCodeField").value=="") {
      OrderInterface.doNotUseBenefits(OrderInterface.checkResult);
    }
    else{
      OrderInterface.addNewVoucher(OrderInterface.checkResult);
    }
    return false;
  },

  addNewVoucher: function(callback) {
    /* Das ergibt ein Fahler bei Opera (evtl. liegt es daran), dass Textfeld kein Teil
     * eines Formulars ist. TODO: prüfen, ob das so ist
     *
     * $("voucherCodeField").disable();
     */
    Form.Element.disable("voucherCodeField");
    var voucherCode = $("voucherCodeField").value;
    new Ajax.Request(OrderInterface.interfaceURL, {
      parameters: 'action=addNewVoucher&voucherCode=' + voucherCode,
      onSuccess: callback,
      on403: UserAssignTools.login
    });

  }
}

var BorderboxA = Class.create();
BorderboxA.prototype = Object.extend(new BasicBorderBox, {

  initialize: function() {

    // Referenzen auf die Images
    this.images = {
      topleft:     'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_topleft.png?1279003237',
      top:         'http://www10.fotoalbum.de/mandants/root/gfx/box_popup_top.png?1279003237',
      topright:    'http://www4.fotoalbum.de/mandants/root/gfx/box_popup_topright.png?1279003237',
      left:        'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_left.png?1279003237',
      right:       'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_right.png?1279003237',
      bottomleft:  'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomleft.png?1279003237',
      bottom:      'http://www6.fotoalbum.de/mandants/root/gfx/box_popup_bottom.png?1279003237',
      bottomright: 'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomright.png?1279003237'
    }

    // Größen der BorderImages
    this.imgSizes = {
      top:    22,
      right:  12,
      bottom: 12,
      left:   12
    }

    // Größen der Versatzes
    this.centerOffset = {
      top:    8,
      right:  5,
      bottom: 0,
      left:   5
    }

     // Größe des Schließen-Icons
    this.closeIcon = {
      url:    'http://www9.fotoalbum.de/mandants/root/gfx/icon_close.png?1279003237',
      width:  17,
      height: 17,
      top: 5,
      right: 5
    }
  }
});

/**
 * spezielle Bilder für Draggablefunktion im IE
 */

var BorderboxDrag = Class.create();
BorderboxDrag.prototype = Object.extend(new BasicBorderBox, {

  initialize: function() {

    // Referenzen auf die Images
    this.images = {
      topleft:     'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_topleft.png?1279003237',
      top:         'http://www10.fotoalbum.de/mandants/root/gfx/box_popup_top.gif?1279003237',
      topDraggable:'http://www10.fotoalbum.de/mandants/root/gfx/box_popup_top.gif?1279003237',
      topright:    'http://www4.fotoalbum.de/mandants/root/gfx/box_popup_topright.png?1279003237',
      left:        'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_left.png?1279003237',
      right:       'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_right.png?1279003237',
      bottomleft:  'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomleft.png?1279003237',
      bottom:      'http://www6.fotoalbum.de/mandants/root/gfx/box_popup_bottom.png?1279003237',
      bottomright: 'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomright.png?1279003237'
    }

    // Größen der Images
    this.imgSizes = {
      top:    27,
      right:  26,
      bottom: 26,
      left:   28
    }

    // Größen der Versatzes
    this.centerOffset = {
      top:    8,
      right:  5,
      bottom: 0,
      left:   5
    }

    // Größe des Schließen-Icons
    this.closeIcon = {
      url:    'http://www9.fotoalbum.de/mandants/root/gfx/icon_close.png?1279003237',
      width:  17,
      height: 17,
      top: 12,
      right: 17
    }
  }
});

var BorderboxB = Class.create();
BorderboxB.prototype = Object.extend(new BasicBorderBox, {

  initialize: function() {

    // Referenzen auf die Images
    this.images = {
      topleft:     'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_topleft.png?1279003237',
      top:         'http://www10.fotoalbum.de/mandants/root/gfx/box_popup_top.png?1279003237',
      topDraggable:'http://www10.fotoalbum.de/mandants/root/gfx/box_popup_top.gif?1279003237',
      topright:    'http://www4.fotoalbum.de/mandants/root/gfx/box_popup_topright.png?1279003237',
      left:        'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_left.png?1279003237',
      right:       'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_right.png?1279003237',
      bottomleft:  'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomleft.png?1279003237',
      bottom:      'http://www6.fotoalbum.de/mandants/root/gfx/box_popup_bottom.png?1279003237',
      bottomright: 'http://www8.fotoalbum.de/mandants/root/gfx/box_popup_bottomright.png?1279003237'
    }

    // Größen der Images
    this.imgSizes = {
      top:    27,
      right:  26,
      bottom: 26,
      left:   28
    }

    // Größen der Versatzes
    this.centerOffset = {
      top:    8,
      right:  5,
      bottom: 0,
      left:   5
    }

    // Größe des Schließen-Icons
    this.closeIcon = {
      url:    'http://www9.fotoalbum.de/mandants/root/gfx/icon_close.png?1279003237',
      width:  17,
      height: 17,
      top: 12,
      right: 17
    }
  }
});

/**
 * Mandantenspezifische javascriptseitige Formatierungs-Funktion
 */
var Format = Object.extend(BaseFormat, {
  amount: function(val) {
    return Format._number_format(parseFloat(val), 0, ',', '.');
  },

  number: function(val, decimals) {
    if (typeof decimals == "undefined") {
      decimals = 2;
    }
    return Format._number_format(parseFloat(val), parseInt(decimals), ',', '.');
  }
});
