/* Common utils */
if (typeof s25 == 'undefined')
{
  var s25 = {};
}
s25.gebi = function (id) {
  return document.getElementById(id);
}
s25.show = function (id) {
  return s25.gebi(id).style.display = '';
}
s25.hide = function (id) {
  return s25.gebi(id).style.display = 'none';
}

s25.is_visible = function (id) {
  return s25.gebi(id).style.display != 'none';
}

s25.is_enumerable = function(el) {
  if (typeof el == 'object' || typeof el == "function") {
    return ('length' in el);
  }
  return false;
}

s25.is_array = function(el) {
  if (typeof el == 'object') { 
    return ('splice' in el && 'join' in el);
  }
  return false;
}

s25.trim = function(str) {
  str = str.replace(/^\s+/, '');
  return str.replace(/\s+$/, '');
}

s25.up = function (el, expr) {
  while (el.parentNode != null && el.tagName != expr.toUpperCase())
  {
    el = el.parentNode;
  }
  return (el.tagName == expr.toUpperCase() ? el : null);
}

// Меняете библиотеку с prototype? перепишите функцию
s25.attach_event = function (el, event_type, func) {
  if (s25.is_enumerable(el)) {
    for (var i = 0; i < el.length; i++) {
      Event.observe(el[i], event_type, func);
    }
  } else {
    Event.observe(el, event_type, func);
  }
}

s25.add_class_name = function (el, class_name) {
  Element.addClassName(el, class_name);
}

s25.remove_class_name = function (el, class_name) {
  Element.removeClassName(el, class_name);
}

/**
* Returns the value of the selected radio button in the radio group, null if
* none are selected, and false if the button group doesn't exist
*
* @param {radio Object} or {radio id} el
* OR
* @param {form Object} or {form id} el
* @param {radio group name} radioGroup
*/
s25.get_radio_value = function (el, radioGroup) {
    if($(el).type && $(el).type.toLowerCase() == 'radio') {
        var radioGroup = $(el).name;
        var el = $(el).form;
    } else if ($(el).tagName.toLowerCase() != 'form') {
        return false;
    }

    var checked = $(el).getInputs('radio', radioGroup).find(
        function(re) {return re.checked;}
    );
    return (checked) ? $F(checked) : null;
} 

/* validators */

s25.validators = {
  radio: function (el) {
    if (s25.is_enumerable(el) == false)
    {
      var el = [el];
    }
    for (var i = 0; i < el.length; i++) {
      if (el[i].checked) {
        return true;
      }
    }
    return false;
  },

  string: function (el, is_required, params) {
    var str = s25.trim(el.value);

    // Если поле не обязательно, то пустое значение является корректным
    if (is_required == false && str.length == 0)
    {
      return true;
    }

    if (typeof params != 'undefined') {
      if ("min_length" in params) {
        return (str.length >= params.min_length * 1);
      }
    }
    return (str.length > 0);
  },

  phone: function (el, is_required) {
    var str = s25.trim(el.value);

    // Если поле не обязательно, то пустое значение является корректным
    if (is_required == false && str.length == 0)
    {
      return true;
    }

    var reg = /\d{5,}/;
    return reg.test(str.replace(/[^\d]+/g, ''));
  },

  zip:  function (el, is_required) {
    var str = s25.trim(el.value);

    // Если поле не обязательно, то пустое значение является корректным
    if (is_required == false && str.length == 0)
    {
      return true;
    }

    var reg = /^\d{5,}$/;
    return reg.test(str);
  },

  number: function (el, is_required, params)
  {
    var str = s25.trim(el.value);

    // Если поле не обязательно, то пустое значение является корректным
    if (is_required == false && str.length == 0)
    {
      return true;
    }

    istr = parseInt(str, 10);
    if (isNaN(istr)) {return false;}

    var result = true;
    if (typeof params != 'undefined') {
      if ("min" in params && istr < params.min) {
        result = false;
      }
      if ("max" in params && istr > params.max) {
        result = false;
      }
    }

    return (str.length > 0 && result);
  },

  email: function (el, is_required)
  {
    var str = s25.trim(el.value);

    // Если поле не обязательно, то пустое значение является корректным
    if (is_required == false && str.length == 0)
    {
      return true;
    }
    var r = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
    return r.test(str);
  }

};


function init_validators(form_id, validators) {
  var form   = s25.gebi(form_id);
  var els    = form.elements;

  for (var i = 0; i < validators.length; i++)
  {
    var v  = validators[i];
    var el = null;
    if (v.type == 'name')
    {
      if (typeof els[v.name] != 'undefined')
      {
        el = els[v.name];
      }
    }
    else
    {
      el = s25.gebi(v.id);
    }
   
    var el_type = null;
    if (el != null && s25.is_enumerable(el)) {
      el_type = el[0].type;
    }
    else if (el != null) {
      el_type = el.type;
    }
    switch (el_type) {
      case null:
        break;

      case 'hidden':
        s25.attach_event(s25.gebi(v.attach_event_on), 'keyup', function() {validate(form, validators, true);});
        s25.attach_event(s25.gebi(v.attach_event_on), 'blur', function() {validate(form, validators, true);});
        break;
      case 'radio':
        s25.attach_event(el, 'click', function() {validate(form, validators, true);});
        s25.attach_event(el, 'change', function() {validate(form, validators, true);});
        break;

      case 'text':
      default:
        s25.attach_event(el, 'keyup', function() {validate(form, validators, true);});
        s25.attach_event(el, 'blur', function() {validate(form, validators, true);});
        break;
    }
  }
  if (arguments.length <= 2 || arguments[2] == false)
  {
    validate(form, validators, true);
  }
  return {validate: function() {validate(form, validators, true);}};
}

function validate(form, validators, show_error) {
  var result = true;
  var els    = form.elements;

  for (var i = 0; i < validators.length; i++)
  {
    var v  = validators[i];
    if ('pre_validator' in v && typeof v.pre_validator == 'function' && v.pre_validator() == false)
    {
      continue;
    }
    var el = null;
    if (v.type == 'name')
    {
      if (typeof els[v.name] != 'undefined')
      {
        el = els[v.name];
      }
    }
    else
    {
      el = s25.gebi(v.id);
    }
    if (s25.validators[v.validator](el, ('required' in v && v.required == false ? false : true), ('config' in v ? v.config : {})) == false)
    {
      result = false;
      if (typeof show_error != 'undefined' && show_error == true)
      {
        if ('attach_error_class_on' in v) {
          s25.add_class_name(s25.up((s25.is_enumerable(el) ? el[0] : el), v.attach_error_class_on), 'has_error');
        } else {
          s25.add_class_name((s25.is_enumerable(el) ? el[0] : el), 'has_error');
        }
      }
    } else {
      if ('attach_error_class_on' in v) {
        s25.remove_class_name(s25.up((s25.is_enumerable(el) ? el[0] : el), v.attach_error_class_on), 'has_error');
      } else {
        s25.remove_class_name((s25.is_enumerable(el) ? el[0] : el), 'has_error');
      }
    }
  }
  if (result) {
    s25.show(form.id + '_submit_enabled');
    s25.hide(form.id + '_submit_disabled');
  } else {
    s25.show(form.id + '_submit_disabled');
    s25.hide(form.id + '_submit_enabled');
  }
}
