/**
 * FormExtras: Client-Funktionen für Forms
 * Tastendrücke, Widgets, etc
 *
 * @version     0.5
 * @author      Dragan Espenschied / Michael Kaiser
 * @requires    jQuery 1.3.2
 * @requires    HKS
 *
 */

var FormExtras = {

    // aktueller z-index aller Extra-Menüs. Wird kontinuierlich erhöht,
    // damit die neu aufgerufenen Menüs über den alten erscheinen
    globalZ: 1,

    init: function() {

        $('form').bind("submit", function(event){FormExtras.checkForm(event, this)});

        $('input.HKS').each(function(){this.handler = new FormExtras.HKS.handler(this)});

        $('form.pdfUpload').each(function(){this.handler = new FormExtras.pdfUpload.handler(this)});
        
        $('form.IconUpload').each(function(){this.handler = new FormExtras.IconUpload.handler(this)});
        
        $('form.pdfUploadExtras').each(function(){this.handler = new FormExtras.pdfUploadExtras.handler(this)});
        
        $('select#Pages').each(function(){this.handler = new FormExtras.Pages.handler(this)});

        $('select#OddPages').each(function(){this.handler = new FormExtras.OddPages.handler(this)});

        $('input.int').each(function(){this.handler = new FormExtras.integer.handler(this)});

        $('div.inPlaceEdit, form.inPlaceEdit').each(function(){this.handler = new FormExtras.inPlaceEdit.handler(this)});

        //$('a.button-inPlaceEdit').trigger('click');

        $('form.notiz').each(function(){this.handler = new FormExtras.notiz.handler(this)});

        $('form.custOrder').each(function(){this.handler = new FormExtras.custOrder.handler(this)});

        $('a#pdf_offer').each(function(){this.handler = new FormExtras.angebot.handler(this)});
        $('#login_error').each(function(){this.handler = new FormExtras.login.handler(this)});

        // (i)-Icons
        $('div.info').each(function(){this.handler = new FormExtras.info.handler(this)});
        
        $('form[name=pinform]').each(function(){this.handler = new FormExtras.pin.handler(this)});

    },

    keyCodes: {
        //                normales Keyboard              Ziffernblock
        numbers: Util.co([48,49,50,51,52,53,54,55,56,57, 96,97,98,99,100,101,102,103,104,105]),

        del: Util.co([8,46]), // backspace und delete

        //               ←  ↑  →  ↓  home end tab enter
        arrows: Util.co([37,38,39,40,36,  35, 9, 13]),

        dash: Util.co ([190, 110]), // period, decimal point

        minus : Util.co ([109, 189]) 
    },

    checkForm: function(event, node) {
        $(node).find('.helpBubble-attached').removeBubble();
        var errorCounter = 0;
        var bubble = false;
        $(node).find("input")
            .removeClass("error")
            .trigger("check");
        $(node).find("input.error, input:radio:checked:disabled")
            .each(function() {
                var errorText = (this.errorText || "Diese Option kann in dieser Kombination nicht ausgewählt werden!");
                $(this).createBubble(errorText);
                errorCounter++;
            });

    },

    /**
     * inPlaceEdit: Eingabefelder sind nicht editierbar, erst
     * wenn man einen Button mit der Klasse "inPlaceEdit" clickt,
     * verwandeln sie sich in normale Eingabefelder zurück.
     */

    inPlaceEdit: {

      handler: function(node) {

        var self = this;
        self.values = [];
        this.edit = false;

        this.node = node;
        this.inputfields = $(node).find('input:text, input:password, select');
        
        // Werte in Undo-Puffer schreiben
        $(self.inputfields).each(function() {
          self.values.push(this.value);
        });

        //inputs verdecken, text anzeigen
        this.cover = function(self) {
          var i = 0;
          $(self.inputfields).each(function() {
             
             // Werte aus Undo-Puffer zurückspielen
             this.value = self.values[i++];
             if (this.tagName == 'SELECT') {
               var val = $(this).find('option[value=' + this.value + ']').text();
               $(this).before('<span class="cover" id="'+$(this).attr('name')+'">' + val + '</span>').hide();
             }
             else {
               $(this).before('<span class="cover" id="'+$(this).attr('name')+'">' + this.value + '</span>').hide();
             }
          });    
          $(self.node).find('a.button-inPlaceEdit-ok').hide();
          $(self.node).find('a.button-inPlaceEdit-cancel').hide();
          $(self.node).find('a.button-inPlaceEdit').show();
          $(self.node).find('a.button-inPlaceEdit-delete').hide();
        }

        //inputs anzeigen
        this.uncover = function(self) {
          $(self.inputfields).each(function() {             
              $(this).show();
          });
          $(self.node).find('span.cover').remove();
          $(self.node).find('a.button-inPlaceEdit').hide();
          $(self.node).find('a.button-inPlaceEdit-ok').show();
          $(self.node).find('a.button-inPlaceEdit-cancel').show();
          $(self.node).find('a.button-inPlaceEdit-delete').show();
        }

        // alle eingabefelder ausschalten;
        this.cover(this);

        // Buttons suchen, mit denen man InPlaceEdit ein- und ausschalten kann
        $(this.node).find('a.button-inPlaceEdit').bind('click', function(event) {
          if(!self.edit) {
           
            self.uncover(self);
            self.edit = true;
          }
          this.blur();
          event.stopPropagation();
          event.preventDefault(); 
        });

        // OK, Änderungen übernehmen
        $(this.node).find('a.button-inPlaceEdit-ok').bind('click', function(event) {
          if(self.edit) {
                   
            // veränderte Daten an Server weitergeben

            var form = $(self.node).parents('form')[0];
            var formdata = $(form).serializeArray();
            var url = $(form).attr('action');

            //console.log(form, formdata, url);

            $.ajax({
              type: "POST",
              url:  url,
              data: formdata,
              success:  function(data){
							//fehlercomponente erhalten
               if(data.indexOf("ERROREXPRESSION") != -1){
              		$('#error').html(data);
					     }
							 else{
								  $('#error').html(' ');
									$('form.register input:text').removeClass('inputerror');
                  self.values = [];
                  $(self.inputfields).each(function() {
                    self.values.push(this.value);
                  });
                  self.cover(self);
                  self.edit = false;
                  var d = data.split('|');
                  $('input[name=addressid_sec]').val(d[0]);
                  //infotext shipment chaged
                  if (d[1]) {
                    $('#error').html('<div class="error">'+d[1]+'</div>');
                  }  
                }
				      },
              error:  function(data){
              	var errorText = "Internal Server Error(500):"+data.responseText.match(/\n[^(=<>)]+\n/g)
             	  alert(errorText);
              }
            });


          }
          this.blur();
          event.stopPropagation();
          event.preventDefault();
        });
 
         // delete übernehmen
        $(this.node).find('a.button-inPlaceEdit-delete').bind('click', function(event) {
          if(self.edit && $('input[name=addressid_sec]').val()) {
                             
            var url = $(this).attr('href');

            //console.log(form, formdata, url);

            $.ajax({
              type: "POST",
              url:  url,
              data: "addressid_sec="+$('input[name=addressid_sec]').val(),
              success:  function(data){
              //fehlercomponente erhalten
               if(data.indexOf("ERROREXPRESSION") != -1){
                  $('#error').html(data);
               }
               else{
                  $('#error').html(' ');
                  $('form.register input:text').removeClass('inputerror');
                  self.values = [];
                  $(self.inputfields).each(function() {
                    self.values.push('');
                  });
                  self.cover(self);
                  self.edit = false;
                  $('input[name=addressid_sec]').val('');
                }
              },
              error:  function(data){
                var errorText = "Internal Server Error(500):"+data.responseText.match(/\n[^(=<>)]+\n/g)
                alert(errorText);
              }
            });


          }
          this.blur();
          event.stopPropagation();
          event.preventDefault();
          return false;
        });
      
        // Cancel, alten Zustand wieder herstellen
        $(this.node).find('a.button-inPlaceEdit-cancel').bind('click', function(event) {
          if(self.edit) {
            self.cover(self);
            self.edit = false;
          }
          this.blur();
          event.stopPropagation();
          event.preventDefault();
          $('#error').html(' ');
          $('form.register input:text').removeClass('inputerror');          
         });

       }    
    },

    /**
     * int: Eingabefeld, dass nur ganze Zahlen zulässt.
     * Pfeil rauf und runter verändern den Wert.
     */

    integer: {

        handler: function(node) {

            var self = this;
            this.node = node;

            //$(this.node).attr("autocomplete","off");

            // Erlaubte Tasten zusammenmergen:
            // Negativ erlaubt ?
	    if ( $(node).hasClass('negative') ) {
		    this.allowedKeys = $.extend({}, FormExtras.keyCodes.numbers, FormExtras.keyCodes.del, FormExtras.keyCodes.arrows, FormExtras.keyCodes.minus);
	    } else {
		    this.allowedKeys = $.extend({}, FormExtras.keyCodes.numbers, FormExtras.keyCodes.del, FormExtras.keyCodes.arrows);
	    }
            this.keydown = function(event) {
                if(event.keyCode in event.data.self.allowedKeys) {
                    if (event.shiftKey || event.ctrlKey || event.altKey) {
                      event.preventDefault();
                      event.stopPropagation();
                    }                  
                    // Pfeil nach oben
                    if(event.keyCode==38) {
                        event.data.self.node.value++;
                    // Pfeil nach unten
                    } else if (event.keyCode==40) {
                        event.data.self.node.value--;
                    }
                    //$(event.data.self.node).trigger("check");
                } else {
                    event.preventDefault();
                }
            }

            $(this.node)
                .bind("keydown", {self: self}, self.keydown);


        }

    },

    HKS: {

        handler: function(node) {

            var self = this;
            this.node = node;

            $(this.node).attr("autocomplete","off");

            this.oldValue = this.node.value;

            this.values = Util.ca(HKS);

            var menuHTML = "<div class='HKSmenu'>";
            for(var i in HKS) {
                var selected = (i==this.node.value) ? " selected" : "";

                menuHTML += "<div class='HKS"+i+selected+"'>"+i+"</div>"
            }
            menuHTML += "</div>";

            this.menu = $(menuHTML).css({left:"-1000px", top:"-1000px"})[0];

            $("body").append(this.menu);

            this.menuStatus = "hidden";

            // Erlaubte Tasten zusammenmergen:
            this.allowedKeys = $.extend({}, FormExtras.keyCodes.numbers, FormExtras.keyCodes.del, FormExtras.keyCodes.arrows);


            this.keydown = function(event) {
                var self = event.data.self;
                if(self.menuStatus == "hidden" || self.menuStatus == "down") {
                    $(self.node).trigger("focus");
                }
                if(!(event.keyCode in event.data.self.allowedKeys)) {
                    event.preventDefault();
                    event.stopPropagation();
                }
                if (event.shiftKey || event.ctrlKey || event.altKey) {
                    event.preventDefault();
                    event.stopPropagation();
                }
                if(event.keyCode == 38) { // Pfeil hoch

                    // ist der aktuelle Wert des Eingabefeldes
                    // ein erlaubter? Das sollte sich durch die
                    // Selektion zeigen.
                    var selected = $(self.menu).find(".selected")[0];

                    if(selected) {
                        if( $(selected).next().length != 0) {
                            $(self.node)
                                .val( $(selected).next().text() )
                                .trigger("change");
                            return false;
                        }
                    // ein unbekannter Wert ist eingetragen, als ob das
                    // Leben nicht schon schlimm genug wäre!
                    } else {
                        // vom aktuellen wert ausgehend nach oben
                        // den nächsten gültigen wert suchen
                        var index = (parseInt(self.node.value)||0);
                        while(true) {
                            index++;
                            // schon übers ende hinausgeschossen?
                            if(index > parseInt(self.values[self.values.length-1])) {
                                $(self.node)
                                    .val(self.values[self.values.length-1])
                                    .trigger("change");
                                break;
                            }
                            // eine korrekte zahl gefunden?
                            if(index.toString() in HKS) {
                                $(self.node)
                                    .val(index)
                                    .trigger("change");
                                break;
                            }
                        }
                    }

                } else if(event.keyCode == 40) { // Pfeil runter
                    // ähnlicher Zirkus wie bei Pfeil hoch

                    var selected = $(self.menu).find(".selected")[0];

                    if(selected) {
                        if( $(selected).prev().length != 0) {
                            $(self.node)
                                .val( $(selected).prev().text() )
                                .trigger("change");
                            return false;
                        }
                    } else {
                        // vom aktuellen wert ausgehend nach unten
                        // den nächsten gültigen wert suchen
                        var index = (parseInt(self.node.value)||0);
                        while(true) {
                            index--;
                            // schon übers ende hinausgeschossen?
                            if(index < parseInt(self.values[0])) {
                                $(self.node)
                                    .val(self.values[0])
                                    .trigger("change");
                                break;
                            }
                            // eine korrekte zahl gefunden?
                            if(index.toString() in HKS) {
                                $(self.node)
                                    .val(index)
                                    .trigger("change");
                                break;
                            }
                        }
                    }


                }
            }

            this.change = function(event) {
                // selektion aus dem menü entfernen

                $(event.data.self.node).removeClass("error");

                $(event.data.self.menu).find("div").removeClass("selected");

                if(event.data.self.node.value in HKS) {

                    $(event.data.self.node)
                        .removeClass("HKS"+event.data.self.node.oldValue)
                        .addClass("HKS"+event.data.self.node.value).removeBubble();

                    $(event.data.self.menu).find("div.HKS"+event.data.self.node.value).addClass("selected");

                    event.data.self.node.oldValue = event.data.self.node.value;

                } else {
                    $(event.data.self.node)
                        .removeClass("HKS"+event.data.self.node.oldValue)
                        .addClass("error").createBubble($('input[name=error_chromaticity]').val());
                    event.data.self.node.oldValue = "error";
                }
            }

            this.menuOn = function(event) {

                var self = event.data.self;

                if(self.menuStatus=="up" || self.menuStatu=="visible") return;

                if(self.menuStatus=="down") $(self.menu).stop();

                self.menuStatus = "up";

                FormExtras.globalZ++;
                $(self.menu).css({"z-index": FormExtras.globalZ});

                var pos = $(self.node).offset();
                var width = $(self.node).outerWidth();
                var menuWidth = $(self.menu).outerWidth();

                $(self.menu).css({height: "auto"});

                var menuHeight = $(self.menu).outerHeight();

                $(self.menu).css({
                    top: pos.top,
                    left: (pos.left+(width/2)-(menuWidth/2)),
                    overflow: "hidden",
                    height: 0
                }).animate({
                    height: menuHeight,
                    top: (pos.top-menuHeight)
                }, function() {
                    self.menuStatus = "visible";
                });

            }

            this.menuOff = function(event) {

                var self = event.data.self;

                if(self.menuStatus!="visible") return;

                self.menuStatus="down";

                var node = $(self.menu);
                var pos = node.offset();
                var menuHeight = node.outerHeight();
                node.animate({
                    height: 0,
                    top: (pos.top+menuHeight)
                }, function() {
                    node
                        .css({left:-1000, top:-1000, height: "auto"})
                        .find("div").css({"visibility":"visible"});
                    self.menuStatus = "hidden";
                });

            }

            this.menuClick = function(event) {
                var self = event.data.self;
                var target = event.target;
                var targetCopy = $(target).clone();
                var pos = $(target).offset();

                $(targetCopy)
                    .addClass("HKSmenuFloat")
                    .css({position:"absolute",top: pos.top,left: pos.left, "z-index":++FormExtras.globalZ})
                    .appendTo("body")
                    .fadeOut("slow", function() { $(this).remove() });

                $(target).css({visibility:"hidden"});

                self.node.value = $(event.target).text();
                $(self.node).trigger("change");
            }

            this.check = function(event) {
                var self = event.data.self;

                if(! self.node.value in HKS){
                    self.node.addClass("error");
                    
                } else {
                  self.node.removeBubble();
                  self.node.removClass("error");
                }
            }


            $(this.node)
                .bind("keydown", {self: self}, self.keydown)
                .bind("change keyup", {self: self}, self.change)
                .bind("focus", {self: self}, self.menuOn)
                .bind("blur", {self: self}, self.menuOff)
                .bind("check", {self: self}, self.check)
                .trigger("change");


            $(this.menu).find("div").bind("mousedown", {self: self}, this.menuClick);

        }


    },

    /**
     * Pages: Seitenzahl festlegen
     *
     * Macht aus einer Select-Auswahl ein Zahle-Eingabefeld,
     * das nur Werte aus <option>-Liste akzeptiert.
     */

    Pages: {

        handler: function(node) {

            var self = this;
            this.node = node;

            this.menuStatus = "hidden";

            this.values = []; // Alle im Menü entthaltenen Werte

            // Erlaubte Tasten zusammenmergen:
            this.allowedKeys = $.extend({}, FormExtras.keyCodes.numbers, FormExtras.keyCodes.del, FormExtras.keyCodes.arrows);


            // Das <select>-Menü ausblenden und an dessen Stelle
            // das Eingabefeld unterbringen. Der Name des Menüs
            // wird auf das Eingabefeld übertragen.

            var name = node.name;

            var value = $(node.options[node.selectedIndex]).text();

				this.proxy = $('input.Pages')[0];

            $(node).hide();


            // jedes Mal, wenn das Menü angezeigt werden soll, muss
            // es neu generiert werden -- es könnten schließlich
            // Elemente ausgeblendet worden sein.

            this.generateMenu = function() {

                var self=this;

                if(this.menu) $(this.menu).remove();

                self.values = [];

                var menuHTML = '<div class="PagesMenu">';

                $(node).children("option").each( function() {
                    if(!this.disabled) {
                        var content = $(this).text();
                        var selected = (content==self.proxy.value) ? "selected" : "";
                        menuHTML += '<div class="'+selected+'">'+content+'</div>';
                        self.values.push(parseInt(content));
                    }
                });

                menuHTML += '</div>';


                FormExtras.globalZ++;
                this.menu = $(menuHTML)
                    .css({"top": "-1000px", "z-index": FormExtras.globalZ})
                    .find("div").one("mousedown", {self: self}, self.menuClick)
                    .end()[0];

                $("body").append(this.menu);

                this.menuStatus = "hidden";

            };

            this.menuClick = function(event) {
                var self = event.data.self;
                var target = event.target;
                var pos = $(target).offset();

                var targetCopy = $(target).clone().addClass("PagesMenuFloat");

                $(targetCopy)
                    .css({position:"absolute", top: pos.top, left: pos.left, "z-index": ++FormExtras.globalZ})
                    .appendTo("body")
                    .fadeOut("slow", function(){$(this).remove()});

                $(target).css({visibility: "hidden"});

                self.proxy.value = $(target).text();
                $(event.data.self.proxy).trigger("change");
            }

            // wenn das Menü eingeschaltet wird ...

            this.menuOn = function(event) {
                var self = event.data.self;

                if(self.menuStatus=="up" || self.menuStatu=="visible") return;

                if(self.menuStatus=="down") $(self.menu).stop();

                self.menuStatus = "up";

                self.generateMenu();

                var pos = $(self.proxy).offset();
                var width = $(self.proxy).outerWidth();
                var menuWidth = $(self.menu).outerWidth();

                $(self.menu).css({height: "auto"});

                var menuHeight = $(self.menu).outerHeight();

                $(self.menu).css({
                    top: pos.top,
                    left: (pos.left+(width/2)-(menuWidth/2)),
                    overflow: "hidden",
                    height: 0
                }).animate({
                    height: menuHeight,
                    top: (pos.top-menuHeight)
                }, function() {
                    self.menuStatus = "visible";
                });

            };

            this.menuOff = function(event) {
                var self = event.data.self;

                if(self.menuStatus!="visible") return;

                self.menuStatus="down";

                var node = $(self.menu);
                var pos = node.offset();
                var menuHeight = node.outerHeight();
                node.animate({
                    height: 0,
                    top: (pos.top+menuHeight)
                }, function() {
                    node.css({left:-1000, top:-1000, height: "auto"});
                    self.menuStatus = "hidden";
                });

            }

            this.keydown = function(event) {
                var self = event.data.self;
                if(self.menuStatus == "hidden" || self.menuStatus == "down") {
                    $(self.proxy).trigger("focus");
                }
                if(!(event.keyCode in event.data.self.allowedKeys)) {
                    //self.proxy.value = self.proxy.value.replace(/\D+/, '');
                    event.preventDefault();
                    return false;
                } else if (event.shiftKey || event.ctrlKey || event.altKey) {
                    event.preventDefault();
                    return false;                  
                } else {

                    if(event.keyCode == 38) { // Pfeil hoch

                        // ist der aktuelle Wert des Eingabefeldes
                        // einer, der in der Liste mit erlaubten Werten
                        // enthalten ist?
                        var index = $.inArray(self.proxy.value, self.values);
                        if(index!=-1) {
                            index++;
                            if(self.values[index]) {
                                self.proxy.value = self.values[index];
                                $(self.proxy)
                                    .val(self.values[index])
                                    .trigger("change");
                            }

                        // es ist aktuell ein "schlechter" wert eingetragen
                        } else {

                            var testValue = self.proxy.value;

                            // Wert so lange erhöhen, bis er passt, oder
                            // über das Ende des Arrays hinausschießt
                            while(true) {
                                testValue++;
                                if(testValue > self.values[self.values.length-1]) {
                                    $(self.proxy)
                                        .val(self.values[self.values.length-1])
                                        .trigger("change");
                                    break;
                                }
                                var index = $.inArray(testValue, self.values);
                                if(index!=-1) {
                                    $(self.proxy)
                                        .val(testValue)
                                        .trigger("change");
                                    break;
                                }
                            }
                        }

                    } else if (event.keyCode == 40) { // Pfeil runter

                        var index = $.inArray(self.proxy.value, self.values);
                        if(index!=-1) {
                            index--;
                            if(self.values[index]) {
                                self.proxy.value = self.values[index];
                                $(self.proxy)
                                    .val(self.values[index])
                                    .trigger("change");
                            }
                        // es ist aktuell ein "schlechter" wert eingetragen
                        } else {

                            var testValue = self.proxy.value;

                            // Wert so lange verringern, bis er passt, oder
                            // über das Ende des Arrays hinausschießt
                            while(true) {
                                testValue--;
                                if(testValue < self.values[0]) {
                                    $(self.proxy)
                                        .val(self.values[0])
                                        .trigger("change");
                                    break;
                                }
                                var index = $.inArray(testValue, self.values);
                                if(index!=-1) {
                                    $(self.proxy)
                                        .val(testValue)
                                        .trigger("change");
                                    break;
                                }
                            }
                        }

                    }

                }
            }

            this.change = function(event) {
                var self = event.data.self;

                $(self.proxy).removeClass("error");

                // selektion aus dem menü entfernen
                $(self.menu).find("div").removeClass("selected");




                // welches <option>-element enthält den eingegebenen wert, wenn überhaupt?
                var index=0;

                if($.inArray(parseInt(self.proxy.value), self.values) != -1) {

                    $(self.menu).children("div").each(function() {
                        if( $(this).text() == self.proxy.value ) {
                            $(this).addClass("selected");
                        }
                    });

                    // alle <options> durchgehen und das richtige auswählen
                    $(self.node).children("option").each( function() {
                        if ($(this).text() == self.proxy.value) {
                            self.node.selectedIndex = index
                        };
                        index++;
                    })

                    self.proxy.oldValue = self.proxy.value;
                    $(self.proxy).removeBubble();
                } else {
                    $(self.proxy)
                        .addClass("error");

                    self.proxy.oldValue = "error";
                    self.proxy.error = true;
                    $(self.proxy).createBubble($('input[name=error_pages]').val());
                }

                // beim ie6 sollte man das lieber weglassen
                if( ! ($.browser.msie && ($.browser.version<7))) {
                    $(self.node.options[self.node.selectedIndex]).trigger('click');
                }

                if($.browser.msie) {
                    $(self.node).trigger('change');
                }
            }

            this.check = function(event) {
                var self = event.data.self;
                self.generateMenu();
                if($.inArray(parseInt(self.proxy.value), self.values)==-1) {
                    self.proxy.errorText = "Die Seitenzahl muss zwischen "+self.values[0]+" und "+self.values[self.values.length-1]+" liegen und durch 4 teilbar sein.";
                    $(self.proxy).addClass("error");
                }
            }

            this.generateMenu();
 				this.proxy.value = value;
 				$(this.proxy).val(value);
            // ein eingabefeld kümmert sich um die interaktion

            $(this.proxy)
                .bind("keydown", {self: self}, self.keydown)
                .bind("change keyup", {self: self}, self.change)
                .bind("focus", {self: self}, self.menuOn)
                .bind("blur", {self: self}, self.menuOff)
                .bind("check", {self: self}, self.check)
                .trigger("change");


        }

    },
    
   /**
     * Pages: Seitenzahl festlegen
     *
     * Macht aus einer Select-Auswahl ein Zahle-Eingabefeld,
     * das nur Werte aus <option>-Liste akzeptiert. Ohne Popupmenu zur leichteren Auswahl
     */

    OddPages: {

        handler: function(node) {

            var self = this;
            this.node = node;

            this.values = []; // Alle im Menü entthaltenen Werte

            // Erlaubte Tasten zusammenmergen:
            this.allowedKeys = $.extend({}, FormExtras.keyCodes.numbers, FormExtras.keyCodes.del, FormExtras.keyCodes.arrows);


            $(node).children("option").each( function() {
                    if(!this.disabled) {
                        var content = $(this).text();
                        self.values.push(parseInt(content));
                    }
            });
            
            var name = node.name;

            var value = $(node.options[node.selectedIndex]).text();

            this.proxy = $('input.Pages')[0];

            $(node).hide();


            this.keydown = function(event) {
                var self = event.data.self;
              
                if(!(event.keyCode in event.data.self.allowedKeys)) {
                    //self.proxy.value = self.proxy.value.replace(/\D+/, '');
                    event.preventDefault();
                    return false;
                } else if (event.shiftKey || event.ctrlKey || event.altKey) {
                    event.preventDefault();
                    return false;                  
                } else {

                    if(event.keyCode == 38) { // Pfeil hoch

                        // ist der aktuelle Wert des Eingabefeldes
                        // einer, der in der Liste mit erlaubten Werten
                        // enthalten ist?
                        var index = $.inArray(self.proxy.value, self.values);
                        if(index!=-1) {
                            index++;
                            if(self.values[index]) {
                                self.proxy.value = self.values[index];
                                $(self.proxy)
                                    .val(self.values[index])
                                    .trigger("change");
                            }

                        // es ist aktuell ein "schlechter" wert eingetragen
                        } else {

                            var testValue = self.proxy.value;

                            // Wert so lange erhöhen, bis er passt, oder
                            // über das Ende des Arrays hinausschießt
                            while(true) {
                                testValue++;
                                if(testValue > self.values[self.values.length-1]) {
                                    $(self.proxy)
                                        .val(self.values[self.values.length-1])
                                        .trigger("change");
                                    break;
                                }
                                var index = $.inArray(testValue, self.values);
                                if(index!=-1) {
                                    $(self.proxy)
                                        .val(testValue)
                                        .trigger("change");
                                    break;
                                }
                            }
                        }

                    } else if (event.keyCode == 40) { // Pfeil runter

                        var index = $.inArray(self.proxy.value, self.values);
                        if(index!=-1) {
                            index--;
                            if(self.values[index]) {
                                self.proxy.value = self.values[index];
                                $(self.proxy)
                                    .val(self.values[index])
                                    .trigger("change");
                            }
                        // es ist aktuell ein "schlechter" wert eingetragen
                        } 
                        else {

                            var testValue = self.proxy.value;

                            // Wert so lange erhöhen, bis er passt, oder
                            // über das Ende des Arrays hinausschießt
                             while(true) {
                                testValue--;
                                if(testValue < self.values[0]) {
                                    $(self.proxy)
                                        .val(self.values[0])
                                        .trigger("change");
                                    break;
                                }
                                var index = $.inArray(testValue, self.values);
                                if(index!=-1) {
                                    $(self.proxy)
                                        .val(testValue)
                                        .trigger("change");
                                    break;
                                }
                            }  
                        }
                    }
                    
                    

                }
            }

            this.change = function(event) {
                var self = event.data.self;

                $(self.proxy).removeClass("error");



                // welches <option>-element enthält den eingegebenen wert, wenn überhaupt?
                var index=0;

                if($.inArray(parseInt(self.proxy.value), self.values) == -1)
                {
                  var testValue = self.proxy.value;
                  while (true) {
                    testValue++;
                    if (testValue > self.values[self.values.length - 1]) {
                      $(self.proxy).val(self.values[self.values.length - 1])
                      
                      break;
                    }
                    var index = $.inArray(testValue, self.values);
                    if (index != -1) {
                      $(self.proxy).val(testValue)
                      
                      break;
                    }
                  }
                }          
 
                
                // alle <options> durchgehen und das richtige auswählen
                $(self.node).children("option").each( function() {
                        if ($(this).text() == self.proxy.value) {
                            self.node.selectedIndex = index
                        }
                        index++;
                });

                self.proxy.oldValue = self.proxy.value;
                $(self.proxy).removeBubble();

                // beim ie6 sollte man das lieber weglassen
                if( ! ($.browser.msie && ($.browser.version<7))) {
                    $(self.node.options[self.node.selectedIndex]).trigger('click');
                }

                if($.browser.msie) {
                    $(self.node).trigger('change');
                }
            }


         
            this.proxy.value = value;
            $(this.proxy).val(value);
            // ein eingabefeld kümmert sich um die interaktion

            $(this.proxy)
                .bind("keydown", {self: self}, self.keydown)
                .bind("change", {self: self}, self.change)
                .trigger("change");


        }

    },    

    /**
     * pdfUpload -- Hintergrund-Hochlader fürs PDF
     */

    pdfUpload: {

        handler: function(node) {
            var self = this;
            this.node = node;
            var progress_id;

            $(".progress").html("");
            // bei eventuellem reload alle felder auf
            // ursprungszustand setzen
            $(node).find("input, label, textarea")
                .removeAttr("disabled")
                .removeClass("disabled");

            $(node).find("input[type='file']").bind('change',function(){
              $(".after").remove();
              if ($(this).val().match(/\.(pdf|zip)$/)) {
                $(this).after("<div class=\"after\"><img src='/aimages/icons/icn_app_pdf.gif'> "+$(this).val()+"</div>");
              } else {
                 $(this).after("<div class=\"after\">"+$(this).val()+"</div>");
              }
            });

            // bevor das Formular abgeschickt wird
            this.formCheck = function(self) {

              var error = 0;
              
              $(node).find("input[name='content']").each(function(){
                      if($(this).val()=='') {
                          //alert($('#upload_error_nofile').val());
                          //error = 1;
                      }
                      else if (!$(this).val().match(/\.(pdf|zip)$/i)){
                          $(node).find("a.button").createBubble($(this).val()+' uuuu '+$('#upload_error_wrongtype').val());
                          error = 1;
                      }
                  });
              

              $(node).find("input[name='cover']").each(function(){
                      //if($(this).val()=='') {
                      //  alert($('#upload_error_nofile').val());
                      //  error = 1;
                      //}
                      /* else*/ if (!$(this).val().match(/.pdf$|^$/)){
                          $(node).find("a.button").createBubble($(this).val()+' '+$('#upload_error_wrongtype').val());
                          error = 1;
                      }
                  });
              
              //fehlercheck
              if(error!=0){
                  return false;
              }
              
              window.setTimeout(function() {
                      $(self.node).find("input, label")
                      .attr("disabled","disabled")
                      .addClass("disabled");
                  },100);
              
              $(self.node).find(".result").slideUp();

              startProgressBar(progress_id);
              return true;
            }


            this.uploadFinished = function(self,response) {

              $(self.node)
                      .find("input, label, textarea")
                      .removeAttr("disabled")
                      .removeClass("disabled")
                      .end();
              $(".after").remove();
              window.setTimeout('$("#progress").html("")', 10000 );
              
              if(response.match(/^(\d+|OK)$/)){

               $.post(
                        $('#preflight').val(),
                        'temp_id='+response,
                        function(data){
                           $(".result")
                           .removeClass('error')
                           .html(data)
                          .slideDown();
                          Buttons.init();
                          subForm.init('.result');
                          $('a#up_vorlage').trigger('click'); 
                        }
              		);
                   $(".upload input:file,.upload textarea,.upload input:text").each(function(){
                     $(this).val('');
                   });
                   $('div.after').remove();
                   $('#save_upload').show();
              }
              else if (response != null){

                  if(response.indexOf('Exceeds configured maximum limit')!=-1){
                      response = 'Datei ist zu groß!!';
                  }
 
      	       //response = response.replace(/=/g,'');
      	       //response = response.replace(/<.+>/g,'');
               //response = response.replace(/\n\s/g,'');
               response = response.split(' at /')[0];
      	       $(self.node).find('a').createBubble(response);
             } else {
               $(self.node).find('a').createBubble("Undefined Error");
             }
            }

            this.error = function(req,txt,obj){
                $(self.node).find('a').createBubble(txt);
            }

            progress_id = generateProgressID();
            if (self.node.action.match(/\?/))
                self.node.action += '&progress_id=' + progress_id;
            else
                self.node.action += '?progress_id=' + progress_id;
            $('#progress_id').val(progress_id);

            $(node).ajaxForm({
                iframe:        true,
                //dataType:      'json',
                beforeSubmit:  function(data,serialized,node){return self.formCheck(self)},
                success:       function(data){self.uploadFinished(self, data)},
                error:         function(req,txt,obj){self.error(req,txt,obj)}

            });

        }

    },
    /**
     * pdfUploadExtras -- Hintergrund-Hochlader fürs weitere Dateien
     */
    pdfUploadExtras: {

        handler: function(node) {
            var self = this;
            this.node = node;
            var progress_id;

            $(".progress").html("");
            // bevor das Formular abgeschickt wird
            this.formCheck = function(self) {

              var error = 0;

                $(node).find("input:file").each(function(){
                  var name = $(this).attr('name');
                  if($('input:text[name=comment_'+name+']').val() == '' && $(this).val() != '') {;
                    $(this).createBubble($('div#extras_error_msg').text());
                    error++;
                  }
                  
                });

              //fehlercheck
              if(error!=0){
                return false;
              }

             $(self.node).find(".result").slideUp();

             startProgressBar(progress_id);

             return true;
            }


            this.uploadFinished = function(self,response) {

 
              
              if(response == "OK"){

               $.post(
                        $('#preflight_extra').val(),
                        'short=0',
                        function(data){
                           $(".result")
                           .removeClass('error')
                           .html(data)
                          .slideDown();
                          PriceCalc.init();
                          Buttons.init();
                        }
                  );
                   $("input:file").each(function(){
                     $(this).val('');
                   });
                   $("input:text").each(function(){
                     $(this).val('');
                   });
              }
              else{

               if(response.indexOf('Exceeds configured maximum limit')!=-1){
                 response = 'Datei ist zu groß!!';
               }
               response = response.replace(/=/g,'');
               response = response.replace(/<.+>/g,'');
               alert(response);
             }
            }

            this.error = function(req,txt,obj){
                alert(txt);
            }

        progress_id = generateProgressID();
        if (self.node.action.match(/\?/))
              self.node.action += '&progress_id=' + progress_id;
          else
              self.node.action += '?progress_id=' + progress_id;
          $('#progress_id1').val(progress_id);

            $(node).ajaxForm({
                iframe:        true,
                //dataType:      "json",
                beforeSubmit:  function(data,serialized,node){return self.formCheck(self)},
                success:       function(response){self.uploadFinished(self, response)},
                error:         function(req,txt,obj){self.error(req,txt,obj)}

            });

        }

    },
    /**
     * Icon Upload -- Hintergrund-Hochlader fürs Icon des Angebots
     */

    IconUpload: {

        handler: function(node) {
            var self = this;
            this.node = node;
            var progress_id;

            $(".progress").html("");
            // bei eventuellem reload alle felder auf
            // ursprungszustand setzen
            $(node).find("input, label")
                .removeAttr("disabled")
                .removeClass("disabled");

            $(node).find("input[type='file']").bind('change',function(){
              $(".after").remove();
              $(this).after("<div class=\"after\">-- "+$(this).val()+" --</div>");
            });

            // bevor das Formular abgeschickt wird
            this.formCheck = function(self) {

              var error = 0;

                $(node).find("input[name='icon']").each(function(){
                  if($(this).val()=='') {
                    $(node).find("a.button").createBubble($('#upload_error_nofile_icon').val());
                    error = 1;
                  }
                  else if (!$(this).val().match(/.png|gif$/)){
                     $(node).find("a.button").createBubble($(this).val()+' '+$('#upload_error_wrongtype_icon').val());
                     error = 1;
                  }
                });

              //fehlercheck
              if(error!=0){
                return false;
              }

              window.setTimeout(function() {
                      $(self.node).find("input, label")
                          .attr("disabled","disabled")
                          .addClass("disabled");
             },100);

             $(self.node).find(".result").slideUp();

             startProgressBar(progress_id);

             return true;
            }


            this.uploadFinished = function(self,response) {

              $(self.node)
                      .find("input, label, textarea")
                      .removeAttr("disabled")
                      .removeClass("disabled")
                      .end();
              $(".after").remove();
              window.setTimeout('$("#progress").html("")', 10000 );
              
              if(response == "OK"){

               $.post(
                        $('#preflight_icon').val(),
                        'short=0',
                        function(data){
                           $(".result")
                           .removeClass('error')
                           .html(data)
                          .slideDown();
                          PriceCalc.init();
                          Buttons.init();
                        }
                  );
                   $("input:file").each(function(){
                     $(this).val('');
                   });
                   $('div.after').remove();
              }
              else if (response != null){

               if(response.indexOf('Exceeds configured maximum limit')!=-1){
                 response = 'Datei ist zu groß!!';
               }
 
               //response = response.replace(/=/g,'');
               //response = response.replace(/<.+>/g,'');
               //response = response.replace(/\n\s/g,'');
               response = response.split(' at /')[0];
               $(self.node).find('a').createBubble(response);
             } else {
               alert("Error");
             }
            }

            this.error = function(req,txt,obj){
                alert(txt);
            }

        progress_id = generateProgressID();
        if (self.node.action.match(/\?/))
              self.node.action += '&progress_id=' + progress_id;
          else
              self.node.action += '?progress_id=' + progress_id;
          $('#progress_id').val(progress_id);

            $(node).ajaxForm({
                iframe:        true,
                //dataType:      'json',
                beforeSubmit:  function(data,serialized,node){return self.formCheck(self)},
                success:       function(data){self.uploadFinished(self, data)},
                error:         function(req,txt,obj){self.error(req,txt,obj)}

            });

        }

    },
    /**
     * info-icons
     */
    info : {
      handler: function(node){

        // Bei Klick aufs (i) wird die Hilfsblase entweder
        // angezeigt oder ausgeblendet.
        $(node).hover(function(){
          if( $(this).data('helpBubble') ) {
            $(this).removeBubble();
          } else {
            $(this).createBubble(this.innerHTML, {type: 'sticky'});
          }
        },function(){
          if( $(this).data('helpBubble') ) $(this).removeBubble();
        });
      }
    },

     /**
     * notiz: speichern einer notiz zu einem produkt im Warenkorb
     *
     */

    notiz : {
      handler: function(node) {

        $(node).find('a')
               .bind("click", function(event) {
                  event.preventDefault();
                  var text = $(node).find('textarea').val();
                  // falls eine hilfblase vorhanden ist, diese entfernen
                  if( $(this).data('helpBubble') ) $(this).removeBubble();
                  $.getJSON('/submit/Product_Notiz_Save',$(node).serialize(),function(data){
                       $(node).createBubble(data.msg); 
                  });
                  return false;
                });
      }
    },

     /**
     * custorder: speichert eine kundenauftragsbezeichnung zu einem produkt im Warenkorb
     *
     */

    custOrder : {
      handler: function(node) {

        $(node).find('a')
               .bind("click", function(event) {
                  event.preventDefault();
                  // falls eine hilfblase vorhanden ist, diese entfernen
                  if( $(this).data('helpBubble') ) $(this).removeBubble();
                  var a = this;
                  $.getJSON('/submit/Product_CustOrder_Save',$(node).serialize(),function(data){
                       $(a).createBubble(data.msg);
                       $(a).removeClass('RefEdit'); //editmodus aus
                  });
                  return false;
                });
      }
    },
    /**
     * login: erzeut ein meldefenster bei fehlerhaftem login
     *
     */
    login : {
      handler: function(node){

        if ($(node).find('.error').is('div')) {
          $('#send').createBubble( $('#login_error').html());
        }
      }

    },

		     /**
     * angebots-pdf: verschickt ein angebots pdf per mail
     *
     */
		angebot : {
			handler: function(node){

				$(node).bind('click',function(event){
				  event.preventDefault();
          //cursor als wait
          $('body').css('cursor','wait');
          
          $.ajax({
            type: "POST",
            url:  '/submit/Product_PDF_Offer',
            dataType: 'json',
            cache: false,
            timeout: 10000,
            success:  function(data){
               $('body').css('cursor','');
               if (data.status) {
                 $(node).createBubble(data.msg);
                 $('#angebotlink').remove();
                 $(node).after('<div id="angebotlink"><a href="/products/image.comp?name='+data.name+'&path=InvoiceTmpDir">'+data.name+'</a></div>');
               }
               else {
                 $(node).createBubble(data.error);
               }
               
            },
            error:  function(data){
               $('body').css('cursor','');
               $(node).createBubble(data.statusText);
            }
				  });
		   });
     }

		},
		
			  /*	
     * eingabe der pin fur bonus
     *
     */		
		pin : {
			handler: function(node){
			  $(node).bind('submit', function(){
			  
			 	$.getJSON('/submit/Test_Bonus',$(this).serialize(), function(res){
			 	  
			 	  if (res.msg=='OK'){
		   	 	  location.href = '/cart/cart.html';	 
	   		  }
	   		  else{$(node).createBubble(res.msg);}
	   		  
    		 	});
    		 	return false;
		     });
			}
		}	

}
