// набор функций для реализации многостраничных форм и их валидации
// каждая страница формы оформляется в html в отдельный div с id = stN, где N - номер шага (от 1)

// номер текущей страницы - устанавливается в 1 при загрузке страницы
curNom = 1;

// правила валидации
validation = {
  email : /^[\w\.\-]+@[\w\.\-]+\.[\w]+$/,
  family : /^.+$/,
  rname : /^.+$/,
  name : /^.+$/,
  country : /^.+$/,
  state : /^.+$/,
  f_state : /^.+$/,
  zip : /^.+$/,
  f_zip : /^.+$/,
  city : /^.+$/,
  subway : /^.+$/,
  street : /^.+$/,
  house : /^.+$/,
  phone : /^\(\d+\)\d+$/,
  phone_code: /^\d+$/,
  phone_number : /^[\d\s\-]+$/,
  password1 : /^.{6,}$/,
  password2 : /^.{6,}$/
};   

// список полей для каждой страницы
fieldsList = {
  1 : Array('family','name','otchestvo'),
  2 : Array('delivery'),
  3 : Array('country','zip','f_zip','state','f_state','city','subway','street','house','building','flat','phone_code','phone_number','email','delivery_method'),
  4 : Array('pay_method'),
  5 : Array('info','summary')
};

registration = Array('family','rname','phone_code','phone_number','email','password1')


// проверяет согласно правилам валидации поля, перечисленные в массиве fields
// если значение ошибочное отображает div c id ИМЯ_ПОЛЯ_error
// возращает true если все поля верны
function validateFields(formId, fields) {
  errors = false;
  for (i=0;i<fields.length;i++) {
    formElement = document.forms[formId].elements[fields[i]];
    divElement = document.getElementById(fields[i]);
    if ( validation[fields[i]] && formElement && (!divElement || divElement.style.display != 'none') ) {
      
      if ( fields[i]=='phone_code' || fields[i]=='phone_number' ) 
        errorTip = document.getElementById('phone_error');
      else
        errorTip = document.getElementById(fields[i]+'_error');

      
      var correct = true;
      correct = validation[fields[i]].test(formElement.value);

      if ( correct == false ) {
        if (errorTip) {
          errorTip.style.display = 'block';
        };
        errors = true;
      } else {
        if (errorTip) {
          errorTip.style.display = 'none';
        };
      }
    }
  }
  
  return ( !errors );
}  

function validateRegistration() {
  correct = validateFields('registration', registration);
  formElement = document.forms['registration'];
  if ( formElement.password1.value != formElement.password2.value ) {
    correct = false;
    document.getElementById('password2_error').style.display = 'block';
  } else {
    document.getElementById('password2_error').style.display = 'none'
  }
  if ( !correct ) {
    formElement.password1.value = formElement.password2.value = '';
  }
  return correct;
}

// переключает страницы
// если delta 1 - валидация текущей страницы и если все правильно переход на следующую, если -1 - возврат к предыдущей
// если переключаемся на 3 страницу - она сначала подготавливается функцией addressForm
function swap(delta) {
  if ( delta < 0 || validateFields('order',fieldsList[curNom]) ) {
    newNom = curNom+delta;
    if ( newNom > 0 && newNom < 6 ) {
      if (newNom==3) {
        addressForm();
      };
      if (newNom==4) {
        payForm();
      };
      if (newNom==5) {
        acceptForm();
      }
      document.getElementById('st'+curNom+'_header').className = '';
      document.getElementById('st'+curNom).style.display = 'none';
      document.getElementById('st'+newNom+'_header').className = 'active';
      document.getElementById('st'+newNom).style.display = 'block';
      curNom = newNom;
    } 
  }
}

function getDelivery() {
  // определение способа (поле delivery)
  if (document.forms['order'].delivery.length) {
    for (i=0;i<document.forms['order'].delivery.length;i++) {
      if ( document.forms['order'].delivery[i].checked ) {
        delivery = document.forms['order'].delivery[i].value;
      }
    }
  } else {
    delivery = document.forms['order'].delivery.value;
  }
  return delivery;
}

function payForm() {
  delivery = getDelivery();
  cashElement = document.getElementById('pay_cash');
  if ( cashElement ) {
    if ( delivery=='russia' || delivery=='foreign' || ( delivery=='self' && pay_self_cash != 1 ) ) {
      cashElement.style.display = 'none';
    } else {
      cashElement.style.display = 'block';
    }
  }
}

function acceptForm() {
  delivery = getDelivery();
  if (delivery == 'self') {
    dostavka = 'без доставки';
    total_price = order_price;
  } else {
    dostavka = moscow_delivery_price + ' руб.';
    total_price = moscow_delivery_price + order_price;
    if (delivery == 'moscow') {
      document.getElementById('not_moscow').style.display = 'none';
    } else {
      document.getElementById('not_moscow').style.display = 'block';
    }
  }
  document.getElementById('delivery_price').innerHTML = dostavka;
  document.getElementById('final_price').innerHTML = total_price;
}

// подготавливаем 3 страницу формы (адрес доставки), в зависимости от выбранного способа доставки
function addressForm() {
  // определение способа (поле delivery)
  delivery = getDelivery();  
  // прячем все поля на 3 странице и все сообщения об ошибках
  childFields = document.getElementById('st3').childNodes;
  for (i=0;i<childFields.length;i++) {
    if ( childFields[i].tagName == 'DIV') childFields[i].style.display = 'none';
    error_tip = document.getElementById(childFields[i].id+'_error');
    if (error_tip) {
      error_tip.style.display = 'none';
    }
  }

  // отображаем только необходимые для выбранного способа доставки  
  switch (delivery) {
    case 'moscow': fields = Array('subway','street','house','building','flat','email','phone','info');break;
    case 'mo': fields = Array('city','street','house','building','flat','email','phone','info');break;
    case 'self': fields = Array('email','phone','info');break;
    case 'russia': fields = Array('state','city','zip','street','house','building','flat','email','phone','info');break;
    case 'foreign': fields = Array('country', 'f_state','city','f_zip','street','house','building','flat','email','phone','info');break;
  }
  
  for (i=0;i<fields.length;i++) {
    if ( document.getElementById(fields[i]) ) 
      document.getElementById(fields[i]).style.display = 'block';
  }
}


