/**
 * checkForm
 * version: 0.93
 * author: Nedik <tomas.nedela@religis.cz>
 * 
 * description:
 * v. 0.93
 * - upravena cela trida tak, aby byly veskere promenne a metody private
 * v. 0.92
 * - opraveno skrolování na focus objekt
 * v. 0.9   
 * - testuje vsechny formulare, ktere jsou na webu. pokud nějaké políčko formuláře má definovanou třídu class="required", je testován.
 * - další doplňující podporované třídy: check_email, check_phone
 *
 * updates:
 */

var CheckForm = function ()
{
  var aError = new Array();
  var aElementsForProcess = new Array('input', 'select', 'textarea');
  var aElementsRadioAlreadyChecked = new Array();
  var oFocusElement = false;

  function init ()
  {
    if (!$)
    {
      alert('CheckForm needs JQUERY for operate.');
      return true;
    }
    
    // vezmu si vsechny formulare pod kontrolu
    $('form').bind('submit', function () {return checkFormOnSubmit(this);});

    return true;
  }

  function checkFormOnSubmit (oForm)
  {
    aError = new Array();
    aElementsRadioAlreadyChecked = new Array();
    oFocusElement = false;
    
    // projdu veskere elementy FORMu
    for (i in aElementsForProcess)
    {
      
      $(oForm).find(aElementsForProcess[i]).each(function () {
        if ($(this).attr('type') == 'radio')
          processElementRadio(this);
        else
          processElement(this);
      });
    }

    if (aError.length > 0)
    {
      focusElement();
      throwError();
      return false;
    }
    else
    {
      return true;
    }
  }


  function focusElement ()
  {
    if (oFocusElement)
    {
      windowHeight = document.documentElement.clientHeight;      
      offset = $(oFocusElement).offset();
      
      heightHalf = windowHeight/2;
      scrollTop = offset.top-heightHalf;      
      window.scrollTo(offset.left, scrollTop);
      
      $(oFocusElement).focus();
    }
  }


  function processElementRadio (oElement)
  {
    // zjistim, jestli uz jsem tento element jednou nezkoumal
    sElementName = $(oElement).attr('name');
    for (i in aElementsRadioAlreadyChecked)
    {
      if (aElementsRadioAlreadyChecked[i] == sElementName)
        return true;
    }
    
    bError = false;

    if ($(oElement).attr('rel'))
      sErrorMessage = $(oElement).attr('rel');
    else if ($(oElement).attr('title'))
      sErrorMessage = $(oElement).attr('title');
    else
      sErrorMessage = $(oElement).attr('name')+' musí být zvolen';

    if ($(oElement).hasClass('required'))
    {
      // najdu vsechy tyto elementy dle jejich NAME a zjistim, jestli je nejaky z nich checked
      var bChecked = false;
      $('input[name="'+sElementName+'"]').each( function () {
        if (this.checked == true) bChecked = true;
      });

      if (bChecked === false)
      {
        aError[aError.length] = sErrorMessage;
      }
    }
    aElementsRadioAlreadyChecked[aElementsRadioAlreadyChecked.length] = sElementName;
    return true;
  }


  function processElement (oElement)
  {
    bError = false;
    
    if ($(oElement).attr('rel'))
      sErrorMessage = $(oElement).attr('rel');
    else if ($(oElement).attr('title'))
      sErrorMessage = $(oElement).attr('title');
    else
      sErrorMessage = $(oElement).attr('name')+' musí být vypln\u011bn';


    // required
    if ($(oElement).hasClass('required') && $(oElement).val() == '')
    {
      aError[aError.length] = sErrorMessage;
      bError = true;
    }

    // required AND check_email
    if (!bError && $(oElement).hasClass('check_email') && $(oElement).val().length)
    {
      if (!validEmail($(oElement).val()))
      {
        aError[aError.length] = sErrorMessage;
        bError = true;
      }
    }

    // required AND check_phone
    if (!bError && $(oElement).hasClass('check_phone') && $(oElement).val().length)
    {
      if (!check_phone($(oElement).val()))
      {
        aError[aError.length] = sErrorMessage;
        bError = true;
      }
    }



    // oznacim element warningem
    markElement(oElement, bError);
  }


  function check_phone ( pnumber, length ) {
     if (!length) length = 9;
     pnumber = pnumber.replace(/^\s+|\s+$/g,""); // TRIM funkce
     pnumber = pnumber.replace(/\s+/g,""); // odstranim dalsi nepotrebne znaky
     pnumber = pnumber.replace(/\+420+/g,""); // odstranim dalsi nepotrebne znaky
     pnumber = pnumber.replace(/00420+/g,""); // odstranim dalsi nepotrebne znaky
     pnumber = pnumber.replace(/\++/g,""); // odstranim dalsi nepotrebne znaky

     if( pnumber.length != length ) {
         return false;
     }

     return true;
  }


  function markElement (oElement, bError)
  {
    if (bError)
    {
      $(oElement).addClass('checkFormWarning');
      if (!oFocusElement) oFocusElement = oElement;
    }
    else
      $(oElement).removeClass('checkFormWarning');
  }


  function throwError ()
  {
    sMessage = 'Formulá\u0159 nemohl být odeslán, neboť:'+"\n\n";
    for (i in aError)
    {
      sMessage += '   -'+aError[i]+"\n";
    }
    sMessage += "\n"+'Opravte chyby a ode\u0161lete formulá\u0159 znovu';
    alert(sMessage);
  }


  function validEmail(sEmail)
  {
    reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
    if (reg.test(sEmail) == false) return false;
    else return true
  }

  return {
    init : function() { init(); }
  }
}();

$(document).ready(CheckForm.init);

