/*
Kontaktmanager Funktionen.

Basisprinzip:
Die Formulare haben immer die id "cm", 
die einzelen Versionen werden über den Klassennamen unterschieden.
(z.B. #cm.manual für Anleitungen.)

Jeder Schritt wird mit einem Block der Art 
<div id="step{Nr}" class="step"> { ... } </div>
beginnend bei 1 umschlossen.
Untermenüs mit Blöcken der Art 
<div id="step{Nr}-{SubNr}" class="step"> { ... } </div>

Pflichtfelder bekommen zusätzlich zu den für das CSS relaventen Klassen die Angabe
"mandatory".
Pflichtfelder mit Freitext werden grundsätzlich auf min. 3 Zeichen geprüft, 
Abweichungen können durch die Klassenangabe "l_{Minimum}" angeben werden.
(z.B "l_1" für die Hausnummer, "l_5" für die PLZ.)
Checkboxen werden nur auf angekreuzt oder nicht geprüft.

Submenüs werden laut Konzept über Radioboxen getriggert.
Die Funktion hierzu hat zwei Aufgaben:
Zum einen bei der Auswahl eines Radiobuttons ohne Submenü den nächsten Schritt einblenden.
Alternativ das Submenü anzeigen, und dies mit der entsprechenden Prüfung (Textfelder) versehen.
Der nächste Schritt wird dann nach Efüllung der Bedingung des Submenüs, 
oder nach Änderung der Auswahl eingeblendet. 
  

Die einzelnen Funktionsaufrufe unten sollten selbsterklärend sein.
Für jeden Schritt reicht eine Funktion, Schritte mit verschiedenen Konzepten sollte es nicht geben. 

*/

$(document).ready(function()
{

  $("#cm img.info").hover(function()
  {
    var thisInfo = $(this).next("div.info");
    
    if(!thisInfo.html())
    {
      $(this).attr("alt", "");
      $(this).after("<div class=\"info\">" + $(this).attr("title") + "</div>");
      $(this).attr("title", "");
      thisInfo = $(this).next("div.info");
      thisInfo.css("margin", "20px 0 0 20px");
      if(!isNaN(parseInt($(this).css("top").replace(/px/, ""))))
      { 
        thisInfo.css("margin-top", 0);
        thisInfo.css("top", (parseInt($(this).css("top").replace(/px/, "")) + 20) + "px" ); 
      }
      if(!isNaN(parseInt($(this).css("left").replace(/px/, ""))))
      { 
        thisInfo.css("margin-left", 0);
        thisInfo.css("left", (parseInt($(this).css("left").replace(/px/, "")) + 20) + "px" ); 
      }
      thisInfo.hide();
      thisInfo.fadeIn(1000);
    }
    else
    {
      thisInfo.fadeIn(1000);
    }
  });
  
  $("#cm img.info").mouseout(function()
  {
    var thisInfo = $(this).next("div.info");
    thisInfo.fadeOut(100);
  });
  
  if($("#cm").find(".error").length == 0) // Bei Fehlern alles aufklappen.
  {
    $("div.step div.step").hide(); // IE 6 Bugfix (Subebenen vor den Hauptebenen verstecken unterdrückt Darstellungsfehler)
    $("div.step:not(#step1)").hide();
  }
  
  /* #cm.manual: Betriebsanleitungen */
  if($("#cm.manual").html())
  {
    /* Trigger step1 */
    checkTextfields("step1");

    /* Trigger step2 */
    toggleSubmenu("step2", "prof");
    checkTextfields("step2-1");

    /* Trigger step3 */
    checkTextfields("step3");

    /* Trigger step4 */
    checkCheckboxes("step4");
  }
  
  /* #cm.manual: Broschüren */
  if($("#cm.flyer").html())
  {
    /* Trigger step1 */
    checkCheckboxes("step1");

    /* Trigger step2 */
    toggleSubmenu("step2", "prof");
    checkTextfields("step2-1");

    /* Trigger step3 */
    checkTextfields("step3");

    /* Trigger step4 */
    checkCheckboxes("step4");
  }
  
  /* #cm.critics: Lob & Tadel */
  if($("#cm.critics").html())
  {
    /* Trigger step1 */
    checkCheckboxes("step1");

    /* Trigger step2 */
    checkTextfields("step2");

    /* Trigger step3 */
    toggleSubmenu("step3", "prof");
    checkTextfields("step3-1");

    /* Trigger step3 */
    toggleSubmenu("step4", "1");
    toggleMandatory("step4-1-1", "step4-1-2");
    checkTextfields("step4-1-2");

    /* Trigger step5 */
    checkCheckboxes("step5");
  }
  
  /* #cm.techrequest: Kundenservice - Technische Anfrage */
  if($("#cm.techrequest").html())
  {
    /* Trigger step1 */
    checkTextfields("step1");

    /* Trigger step2 */
    toggleSubmenu("step2", "prof");
    checkTextfields("step2-1");

    /* Trigger step3 */
    toggleSubmenu("step3", "1");
    toggleMandatory("step3-1-1", "step3-1-2");
    checkTextfields("step3-1-2");

    /* Trigger step4 */
    checkCheckboxes("step4");
  }
  
  /* #cm.techrequest: Kundenservice - Kundendienstannahme */
  if($("#cm.customerservice").html())
  {
    /* Trigger step1 */
    checkTextfields("step1");

    /* Trigger step2 */
    checkTextfields("step2");

    /* Trigger step3 */
    checkTextfields("step3");

    /* Trigger step4 */
    toggleSubmenu("step4", "prof");
    checkTextfields("step4-1");

    /* Trigger step5 */
    toggleSubmenu("step5", "1");
    toggleMandatory("step5-1-1", "step5-1-2");
    checkTextfields("step5-1-2");

    /* Trigger step6 */
    checkCheckboxes("step6");
  }
  
  /* #cm.press: Prsseanfrage */
  if($("#cm.press").html())
  {
    /* Trigger step1 */
    checkTextfields("step1");

    /* Trigger step2 */
    toggleSubmenu("step2", "1");
    checkTextfields("step2-1-1");

    /* Trigger step3 */
    checkCheckboxes("step3");
  }
  

  
});

function getNextStepExpr(thisStepId)
{  
  var thisStep = $("#" + thisStepId);
  var nextStep = thisStep.nextAll("div.step");
  if(!nextStep.html())
  {
    nextStep = thisStep.parents("div.step").nextAll("div.step");
  }
  
  return "#" + nextStep.attr("id");
}


var eventCtrl = false;
function checkTextfields(thisStepId)
{
  /*
    Hängt an alle Textfelder die nötigen Events für die Prüfung der Eingaben an.
    Fängt Tastatureingaben, Drag-n-Drop und C&P ab.
  */
  
  
  var thisStepExpr = "#" + thisStepId;
  var nextStepExpr = getNextStepExpr(thisStepId); 
  
  $(thisStepExpr + " input.text," + thisStepExpr + " textarea").keyup(function() // Tastatureingaben
  {
    if(checkMandatory(thisStepExpr, nextStepExpr))
    { $(nextStepExpr).slideDown(300); }
  });

  $(thisStepExpr + " input.text," + thisStepExpr + " textarea").mousemove(function() // Mouseeingaben, Drag-n-Drop und C&P per Kontextmenue
  {
    window.clearInterval(eventCtrl);
    if($(nextStepExpr).is(":hidden"))
    {
      eventCtrl = window.setInterval(function()
      {
        if(checkMandatory(thisStepExpr, nextStepExpr))
        { 
          $(nextStepExpr).slideDown(300);
           window.clearInterval(eventCtrl);
        }
      }, 500);
    }
  });
}

function toggleSubmenu(thisStepId, checkVal)
{
  var thisStepExpr = "#" + thisStepId;
  var nextStepExpr = getNextStepExpr(thisStepId);
  var subStepExpr = thisStepExpr + "-1"; 

  if($(thisStepExpr + " input.clickbox:checked").val() != checkVal && $("#cm").find(".error").length > 0)
  { $(subStepExpr).hide();  }
  
  $(thisStepExpr + " input.clickbox").click(function()
  {
    if($(thisStepExpr + " input.clickbox:checked").val() == checkVal && $(subStepExpr).is(":hidden"))
    {
      $(subStepExpr).find("div.step:first").show();
      $(subStepExpr).slideDown(300);
    }
    else if($(thisStepExpr + " input.clickbox:checked").val() != checkVal && $(nextStepExpr).is(":hidden"))
    {
      $(nextStepExpr).slideDown(300);
    }
    
    if($(thisStepExpr + " input.clickbox:checked").val() != checkVal && $(subStepExpr).is(":visible"))
    {
      $(subStepExpr).slideUp(300);
    }
  });

}


function checkCheckboxes(thisStepId)
{
  var thisStepExpr = "#" + thisStepId;
  var nextStepExpr = getNextStepExpr(thisStepId);
  
  $(thisStepExpr + " input.clickbox").click(function() 
  {
    if(checkMandatory(thisStepExpr, nextStepExpr))
    { $(nextStepExpr).slideDown(300); }
  });
}

function checkMandatory(thisStepExpr, nextStepExpr) 
{
  /* 
  Prüft alle Pflichtfelder eines Steps. 
  Liefert true, wenn alle nach vorgabe gesetzt sind
  und false, wenn min. eines nicht korrekt gesetzt ist. 
  */
  var retVal = $(nextStepExpr).is(":hidden"); // Stoppen, wenn die Ebene bereits offen ist.
  $(thisStepExpr + " input," + thisStepExpr + " textarea").each(function()
  {
    //alert($(this).html());
    if($(this).attr("type") == "text" || $(this).is("textarea"))
    {
      // Stoppen, falls Pflichtfelder (mit *) mit zu wenig (default 3, ansonsgten über Klasse l_{zahl} zu setzen) Zeichen im aktuellen Step. 
      var minLength = 3;
      if($(this).attr("class").indexOf("l_") > -1)
      {
        thisClasses = $(this).attr("class").split(" ");
        for(var i = 0; i < thisClasses.length; i++)
        {
          if(thisClasses[i].indexOf("l_") > -1)
          {
            minLength = parseInt(thisClasses[i].replace(/l_/, ""));
          }
        }
      }
      if($(this).attr("class").indexOf("mandatory") > -1 && $(this).val().length < minLength )
      { retVal = false; }
    }
    else if($(this).attr("type") == "checkbox")
    {   
      // Stoppen, falls Pflichtfelder (mit *) im aktuellen Step nicht angekreuzt sind. 
      if($(this).attr("class").indexOf("mandatory") > -1 && !$(this).attr("checked"))
      { retVal = false; }
    }
  });
  return retVal;
}

function toggleMandatory(thisStepId, targetStepId)
{
  var thisStepExpr = "#" + thisStepId;
  var targetStepExpr = "#" + targetStepId;

  setMandatory(thisStepExpr, targetStepExpr);
  $(thisStepExpr + " input.clickbox").click(function() 
  {
    if($(targetStepExpr).is(":hidden"))
    {
      $(targetStepExpr).slideDown(300);
    }
    setMandatory(thisStepExpr, targetStepExpr);
  });  
  
}

function setMandatory(thisStepExpr, targetStepExpr)
{
  if($(thisStepExpr + " input.clickbox:checked").val() == "email")
  {
    $("#email:not(.mandatory)").siblings("span").append("*");
    $("#phone").removeClass("mandatory");
    $("#email").addClass("mandatory");
    $("#phone").siblings("span").html($("#phone").siblings("span").html().replace(/\*/, ""));
  }
  else if($(thisStepExpr + " input.clickbox:checked").val() == "post")
  {
    $("#phone").siblings("span").html($("#phone").siblings("span").html().replace(/\*/, ""));
    $("#email").siblings("span").html($("#email").siblings("span").html().replace(/\*/, ""));
  }
  if($(thisStepExpr + " input.clickbox:checked").val() == "phone")
  {
    $("#phone:not(.mandatory)").siblings("span").append("*");
    $("#phone").addClass("mandatory");
    $("#email").removeClass("mandatory");
    $("#email").siblings("span").html($("#email").siblings("span").html().replace(/\*/, ""));
  }
}
