/*
 * oleyValidation
 * http://www.oley.com/
 *
 * Copyright (c) 2009 oley.com
 * Author: İzzet Emre Erkan
 * Licensed under Creative Commons Attribution-Share Alike 3.0 Unported License
 * http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Date: 2009-10-12 16:34:00 +0300 (Mon, 12 Oct 2009)
 * Revision: 3
 */
(function($){
  $.fn.extend({
    oleyValidate: function(opt) {
      var defaults = {
        type: "jgrowl",
        useIndicator: false,
        submit: false,
        success: null
      }
      var options = $.extend(defaults, opt);
      
      return this.each(function() {
        
        var $form = $(this);
        $form.submit(function() {
          
          switch(options.type) {
            case "jgrowl":
              if($('.jGrowl-notification').length > 0)
                $('.jGrowl-notification').trigger("jGrowl.close");
            break;
            case "inline":
              $form.find('.validated').removeClass('validated');
              $('.error').remove();
            break;
          }
          var success = true;
          $form.find('[class*="validate"]:visible:enabled').each(function(i) {
            var $input = $(this);
            var error = "";
            var rules = $.oleyValidation.getRules(this);
            for(x=0,xl=rules.length;x<xl;x++) {
              var rule;
              if(rules[x].indexOf('(') > -1)
                rule = rules[x].substring(0, rules[x].indexOf('('));
              else
                rule = rules[x];
              switch(rule) {
                case "required":
                  if(! $input.hasClass('validated')) {
                    if(error != "")
                      error = error + "<br />";
                    error = error + (rules[x] == "required(true)" ? $.oleyValidation._required(this, true) : $.oleyValidation._required(this));
                    }
                break;
                case "length":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._length(this,rules[x].substring(rules[x].indexOf('(') + 1, rules[x].indexOf(')')));
                break;
                case "number":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._number(this);
                break;
                case "email":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._email(this);
                break;
                case "date":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._date(this);
                break;
                case "age18":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._age18(this);
                break;
                case "phone":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._phone(this);
                break;
                case "dupe":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._dupe(this,rules[x].substring(rules[x].indexOf('(') + 1, rules[x].indexOf(')')));
                break;
                case "tck":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._tck(this);
                break;
                case "custom":
                  if(error != "")
                    error = error + "<br />";
                  error = error + $.oleyValidation._custom(rules[x].substring(rules[x].indexOf('(') + 1, rules[x].indexOf(')')));
              }
            }
            if(error != "") {
              success = false;
              error = error.replace(/<br \/><br \/>/g,'<br />');
              switch(options.type) {
                case "jgrowl":
                  $.jGrowl(error, { header: 'Uyarı', sticky: true });
                break;
                case "inline":
                  switch($input.attr('type')) {
                    case "text":
                    case "password":
                      $form.prepend('<span class="error" style="top:' + $input.top($form.get(0)) + 'px;left:' + ($input.left($form.get(0)) + $input.width() + 15) + 'px;">' + error + '</span>');
                    break;
                    case "radio":
                      var $elm = $form.find('[type=radio][name='+$input.attr('name')+']:last');
                      if($elm.next().is('label'))
                        $elm = $elm.next();
                      $form.prepend('<span class="error" style="top:' + ($input.top($form.get(0)) - 5) + 'px;left:' + ($elm.left($form.get(0)) + $elm.width() + 15) + 'px;">' + error + '</span>');
                    break;
                    case "checkbox":
                      var $elm = $input.next().is('label') ? $input.next() : $input;
                      $form.prepend('<span class="error" style="top:' + $elm.top($form.get(0)) + 'px;left:' + ($elm.left($form.get(0)) + $elm.width() + 15) + 'px;">' + error + '</span>');
                    break;
                  }
                break;
              }
            }
          });
          if(success) {
            if(options.success) {
              options.success();
              if(options.submit)return true;
            }
            else
              if(options.submit)return true;
          }
          else {
            var $firstError = $('.error:last');
            if($firstError.length > 0)
              window.scrollTo(0,$firstError.top() - 5);
          }
          return false;
        });
      });
    }
  });
  $.oleyValidation = {
    getRules: function(obj) {
      var re = /validate\[(.*)\]/i;
      var match = re.exec(obj.className);
      var result, rules = [];
      if(match != null){
        result = match[1];
        rules = result.trim(',').split(',');
      }
      return rules;
    },
    _required: function(obj, def) {
      def = def || false;
      var $obj = $(obj);
      switch($obj.attr('type')) {
        case "text":
        case "password":
          if($obj.val() == "" || (def && $obj.val() == $obj.attr('title')))
            return "Bu alanı boş bırakamazsınız.";
        break;
        case "radio":
          var $radios = $('input[type=radio][name='+$obj.attr('name')+']');
          $radios.addClass('validated');
          if($radios.filter(':checked').length == 0)
            return "En az bir seçenek seçmeniz gerekmektedir.";
        break;
        case "checkbox":
          if(!$obj.is(':checked'))
            return "Bu seçeneği seçmeniz gerekmektedir.";
        break;
      }
      return "";
    },
    _length: function(obj, len) {
      var val = $(obj).val();
      if(len.indexOf('-') > -1) {
        var vals = len.split("-");
        if(vals[0] == "" && vals[1] != "")
          return val.length > parseInt(vals[1],10) ? 'Girdiğiniz metin en fazla ' + vals[1] + ' karakter uzunluğunda olmalıdır.' : '';
        else if(vals[1] == "" && vals[0] != "")
          return val.length < parseInt(vals[0],10) ? 'Girdiğiniz metin en az ' + vals[0] + ' karakter uzunluğunda olmalıdır.' : '';
        else if(vals[0] != "" && vals[1] != "")
          return val.length < parseInt(vals[0],10) || val.length > parseInt(vals[1],10) ? 'Girdiğiniz metnin uzunluğu ' + vals[0] + ' karakter ile ' + vals[1] + ' karakter arasında olmalıdır.' : '';
        else
          // TODO: hata kodu 1
          return 'Form doğrulamada hata oluştu. Lütfen Oley yönetimi ile irtibat kurun. Hata kodu: 1';
      }
      else {
        if(val.length != len)
          return 'Girdiğiniz metin tam olarak ' + len + ' karakter uzunluğunda olmalıdır.';
      }
      return '';
    },
    _number: function(obj) {
      return /\D/.test($(obj).val()) ? 'Bu alana sadece rakam girişi yapabilirsiniz.' : '';
    },
    _email: function(obj) {
      return /^[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}$/i.test($(obj).val()) ? '' : 'Geçerli bir e-posta adresi giriniz.';
    },
    _date: function(obj) {
      return $(obj).val().valiDate() ? '' : '"gg.aa.yyyy" formatında geçerli bir tarih girmelisiniz.';
    },
    _age18: function(obj) {
      var v = $(obj).val().replace(/[- /]/g,'.').split('.');
      var d=parseInt(v[0],10), m=parseInt(v[1],10), y=parseInt(v[2],10);
      var d1 = new Date(y, m - 1, d);
      var d2 = new Date();
      d2.setYear(d2.getYear() - 18);

      return d1 < d2 ? "" : "Oley.com'a 18 yaşından büyükler üye olabilir.";
    },
    _phone: function(obj) {
      return /^\d{3} \d{3} \d{4}$/i.test($(obj).val()) ? '' : '"0### ### ####" formatında bir telefon numarası giriniz.';
    },
    _dupe: function(obj,dupe) {
      return $(obj).val() == $('#'+dupe).val() ? '' : 'Her iki şifre alanına aynı değeri girmelisiniz.';
    },
    _tck: function(obj) {
      var tck = $(obj).val();
      if(tck.length != 11)
        return 'Lütfen 11 haneden oluşan TC Kimlik Numaranızı girin';
      else {
        var t1 = 0;
        for(i=0;i<9;i=i+2)
          t1 += parseInt(tck.substring(i, i+1), 10);
        var t2 = 0;
        for(i=1;i<8;i=i+2)
          t2 += parseInt(tck.substring(i, i+1), 10);
        var c10 = (10 - (((t1 * 3) + t2) % 10)) % 10;
        var c11 = (10 - ((((t2 + c10) * 3) + t1) % 10)) % 10;
        if(tck.substring(9,11) == c10.toString()+c11.toString())
          return '';
        else
          return 'Geçersiz TC Kimlik Numarası';
      }
    },
    _custom: function(func) {
      try{
        return eval(func+'()');
      }
      catch(ex){
        // TODO: hata kodu 2
        return "Form doğrulamada hata oluştu. Lütfen Oley yönetimi ile irtibat kurun. Hata kodu: 2";
      }
    }
  }
})(jQuery);