var PriceCalc = {

    /**
     * Hier die URL der Komponente eintragen, welche die Preisberechnung
     * ausführt. Das Form wird als POST übergeben und gibt nichts weiter als
     * den Preis und dahinter das Währungssymbol aus.
     */

    //speichert aktelles Windoestimeout zur Preisberechung
    interrupt: false,

    //speichert Windoestimeout wenn Textfeld statt radiobox Ausloeser ist.
    interuppt2: false,

    //legt fest,ob Preisberechung gerade laeuft
    loading: false,
    
    //Bei Eingaben in Texfelder gibt es eine Updateverzoegerung (solange waiting=true)
    waiting: false,

    //true,wenn eine radiogruppe keine Auswahl hat (kann vom Permissionmager gesetzt werden    
    missingRadio: false,
    
    //entaehlt das Textfeld, dass Preisberchung auslost
    changer: null,
    
    nullprice: false,

    init: function() {

        // damit firefox sich keine blöden disabled-statuus merkt
        //$("form .accept input").removeAttr("disabled");
        // aber gleich mal die buttons disablen, damit nichts falsches
        // abgeschickt wird.
        //$("#configForm .accept input").attr("disabled","disabled");

        // damit der ie auch mitbekommt, wenn sich was ändert:
        if($.browser.msie) {
            $("#configForm input, #configForm select").bind("click", function(event) {

                // Wenn jemand in ein Textfeld klickt, muss kein change-Event
                // getriggert werden.
                if(this.type=="text") {
                    return;
                };

                $("#configForm").trigger("change");
            });
        }

        $("#configForm input.copies").bind("keyup", function(event) {

            //auloesendes text input speichern
            PriceCalc.changer = this;
            //falls keyup preisberechnung noch im gange, killen
            if (PriceCalc.interuppt2) window.clearTimeout(PriceCalc.interuppt2);
            
            //preisberechnung akiv, weiterbutton muss warten/inaktiv
            PriceCalc.waiting=true;
            
            PriceCalc.interuppt2 = window.setTimeout(function(){PriceCalc.request();}, 1500);
        });
              

        $("#configForm").bind("change", function(event) {
          
            //falls eine text-keyup preisberechnung, abbrechen
            if ($(event.target).is('input.copies')) return;

            //falls normale preisberechnung noch im gange, killen
            if(PriceCalc.interrupt) window.clearTimeout(PriceCalc.interrupt);
            
            PriceCalc.interrupt = window.setTimeout(function(){PriceCalc.request()}, 1000);
        });
        
        $("a#save_all, .copyOptionsV a.button-continue").bind("click", function(event) {

          if (PriceCalc.loading || PriceCalc.waiting || PriceCalc.nullprice) {
            event.preventDefault();
            return false;
          }
          return true;                  
        });
        
        //auflageninputs anschalten falls aus
        $('form#configForm').find('input.copies:disabled').removeAttr('disabled');
       //coverformat angleichen an inhalt 
       var cid = $('input[name=attr_format]:checked').val();
       if (cid>0) {
          $('input:radio[name=eattr_format]').val(cid).attr('id','eattr_format'+cid);
       }
    },
       
    request: function() {

      // falls gerade noch was lädt, warten und in einer sekunde nochmal versuchen
      if(PriceCalc.loading) {
        PriceCalc.interrupt = window.setTimeout(function(){PriceCalc.request()}, "1000");
        return false;
      }
      
      //abbrechen bei fehlern
      if ($('input.Pages').hasClass('error')) return;
      if ($('input.HKS').hasClass('error')) return;
      
      
      //test ob es eine nicht gewaehlte radiogruppe gibt (nur bei product config)
      var radioname;
      //nur erste ul.options pro productOptions nehmen (eine 2. options ist z.b. HKS)
      $('div.productConfig div.productOptions').find('ul.options:first').each(function(){
        if(PriceCalc.missingRadio) return;
        //nur ersten gruppenname holen
        radioname =$(this).find('input:radio:first').attr('name');
        if(radioname == undefined || radioname == null) return;
        //keine radio gewahlt und box nicht versteckt
        if (!$('input:radio[name=' + radioname + ']:checked').val() && $(this).css('display') != 'none') {            
          PriceCalc.missingRadio = true ;
          return;
        }
      });
      
      //Abbruch wenn Eingabe bei einer Radiogruppe fehlt (s.o oben oder durch ConflictManager)
      if (PriceCalc.missingRadio) {
        //wieder auf false, da sonst dauer true
        PriceCalc.missingRadio = false;
        return;
      } 
 
      //spinner
      if (PriceCalc.changer) {
        var id =($(PriceCalc.changer).attr('id').match(/\d+/));
        $('div#price'+id).addClass('loading');
      }
      else 
        $("div.price").addClass('loading');
      
      //links abschalten
      $('a#save_all, a.button-continue').addClass('wait');
      //inputs disablen
      //$("#configForm input").attr("disabled","disabled");

      //sonderfarben hks + pantone defaults setzen
      if ($('div#sonderfarbe').is(':visible')) {

        if (!$('input#hks2').is(':visible')) {        
          $('input#hks2').val('');
        }
        //pantome gesetzt? wenn, ja loscht hks
        if ($('#pantone').is(':checked')) {
          if ($('input#pantone1').val() == '') {
            $('input#pantone1').addClass('error');
            return false;
          }
          else {
            //wert gesetzt, hks loschen,
            $('input#pantone1').removeClass('error');
            $('input#hks1').val('');
            $('input#hks2').val('');
            //pnatone1 zu pantone2 koieren, wenn vorhanden
            if ($('input#pantone2').val() == '' && $('div#pantone2').is(':visible'))
              $('input#pantone2').val($('input#pantone1').val());
          }
        }
        //hks gesetzt? wenn ja loscht pantone
        if ($('#hks').is(':checked')) {
          if ($('input#hks1').val() == '') {
            //default '1' setzten
            $('input#hks1').val('1').attr('class', 'HKS HKS1');
            $('input#hks2').val('1').addClass('HKS1');
          }
          //pantone werte loschen
          $('input#pantone1').val('');
          $('input#pantone2').val('');

        }
      } else {
          $('input#pantone1').val('');
          $('input#pantone2').val('');
          $('input#hks1').val('');
          $('input#hks2').val('');                  
      }
      
      //foramt nach cover kopieren
      var cid = $('input[name=attr_format]:checked').val();
      if (cid > 0) {
        $('input:radio[name=eattr_format]').val(cid).attr('id', 'eattr_format' + cid);
      }
      //copies min max test
      var copies_err = false;
      $('input.copies').each(function(){
        if (PriceCalc.copies(this)) copies_err = true;
      });
      if (copies_err) return false;

      PriceCalc.loading = true;
      var formdata = $('form#configForm').serializeArray();
      var url = $('form#configForm').attr('action');

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

      //ajax request starten ->preisberechnung
      $.ajax({
        type: "POST",
        url:  url,
        //async: false,
        dataType: 'json',
        timeout: 10000,
        data: formdata,
        success:  function(data){PriceCalc.arrive(data)},
        error:    function(data){PriceCalc.error(data)}
      });
      
      //falls changer ein textfeld war, wieder null setzen
      PriceCalc.changer = null;
      return true;
    },

    arrive: function(data) {
    
      $('form#configForm input:radio').each(function(){
          var id = $(this).attr("id");
          if($(this).is(':checked'))
             $('label[for='+id+']').addClass('option_checked');
          else
             $('label[for='+id+']').removeClass('option_checked');
      });
      
      var ok = true;
      if (data) {
          for (var i=1;data[i];i++) {
            //weiter wenn preisinputs nicht vorhanden
            if ($("#price" + i).length == 0) continue;
            
            $("#price" + i).removeClass('loading');
            $("#1000price" + i).removeClass('loading');
            
            //weiter,wenn preis unveraendert
            //if ($("#price" + i).find('span').html() == data[i].total) continue;
            
            //pruefen ob gueltiger wert  -> rs: entfrnt da Probleme wenn edit_offer aktiv!
            // if (data[i].total == 0) ok = false;
            
            //preise setzen
            $("#price" + i).find("div.total").html(data[i].total_f);
            $("#1000price" + i).find("div.total").html(data[i].total1000_f);
            
            //extress preise setzen
            if (data[i].total_with_express_f && data[i].express>0){
              $("#price" + i).find("div.total").html(data[i].total_with_express_f); 
            }
          }
          //wenn fehler zurueckkommt
          //if (data[i] && data[i].error)  $("#price1").createBubble("Error:<br/>"+data[i].error.substr(0,170)+'...');
          if (data['err'] && data['err'].error)  $("#price1").createBubble("Error:<br/>Could not calculate price");
     
      }
      
      PriceCalc.loading = false;
      PriceCalc.waiting = false;
      
      if (ok) {
         PriceCalc.nullprice = false;
         //spinner aus
         //$("div.price").removeClass('loading');
         $('a#save_all, a.button-continue').removeClass('wait');
      } else {
         PriceCalc.nullprice = true;
         $('a#save_all, a.button-continue').addClass('wait');
      }
      //pruefen ob alle copies korrekt ohne change trigger zu starten
      //$('input.copies').trigger('check');
      
      //$("#configForm input").removeAttr("disabled");
    },

    error: function(data) {

        //PriceCalc.loading = false;
        $("div.price").removeClass('loading');
        //$('a#save_all, a.button-continue').removeClass('wait');
        //$('body').css('cursor','');
        
        var text = data.responseText || '';
        
        if (data.responseText['1']) {
          PriceCalc.arrive(data.responseText);
          return;
        }
        
        var errorText = "<b>Internal Server Error(500)</b>:<br/>";
        //$("#configForm input").removeAttr("disabled");
        if (text=='') errorText+="Could not calculate price";
        else errorText += text.match(/\n[^(=<>)]+\n/g);
		    $("#price1").createBubble(errorText);
        //pruefen ob alle copies korrekt ohne erneutes berechnen
        PriceCalc.copies(this)
    },
    
    /**
     * copies: Eingabefelder für die Auflage auf max, min testen
     * Bei falscher Eingabe return true (fuer Abfrage, ob Eingabe fehlerhaft)
     *
     * z.B. <input name="test" value="1000" min="100" max="1000" />
     */

    copies : function(node) {
     
        var min = parseInt($(node).attr("min"));
        var max = parseInt($(node).attr("max"));
        var value = parseInt($(node).val(), 10);
        //bei angebot erstellen keine copie noetig, min setzten
        if(isNaN(value)){
          $(node).val(min);
          $(node).removeClass("error").removeBubble();
          return false;
        }     
        
        var errorText = $('input#copies_error').val();

        if(value<min || value>max || isNaN(value)){
          $(node).addClass("error").createBubble(errorText);
          return true;
        }
        else{
          $(node).removeClass("error").removeBubble();
          return false;
        }       
    }
}
