document.observe('dom:loaded', function() {
  correctSafari.initialize();
  cityChoice.initialize();
  allForms.initialize();
  photoSlide.initialize();
  remindOpen.initialize();
  
  login_init();
  remind_init();
  reg_init();
  site_init();
  ads_init();
  user_info_init();
  site_response_init();
});


function insertError(form_name, field_name, error_text) {
   
   if( field_name == 'common' || form_name == $('enter') ) {
      alert("Ошибка: " + error_text);
   } else {
      alert("Ошибка в поле " + field_name + ": \n" + error_text);
   }
   //formSubmit.insertError(form[error_field], error_text);

}

function removeError(form_name, field_name) {
}
/////////////////////////////////////////////////////////////////////////////////


var remindOpen = {//Показываем и прячем напоминалку пароля
  links: null,
  initialize: function() {
    this.links = $$('.block .toggle_remind');
    var parent = this;
    this.links.each(function(link) {
      link.observe('click', parent.show.bindAsEventListener(parent));
    });
  },
  show: function(event) {
    event.stop();
    this.links.each(function(link) {
      $(link).up('.block').toggleClassName('none');
    });
  }
}

var photoSlide = {//Прокрутка фоток по стрелкам
  sliders: null,
  arrows: null,
  initialize: function() {
    var parent = this;
    this.arrows = $$('.show .arrow');
    this.arrows.each(function(arrow) {
      $(arrow).observe('click', parent.slidePhoto.bindAsEventListener(parent));
      var container = $(arrow).up('.container');
      arrow.slide = container.down('.slide');
      arrow.table = container.down('table');
      arrow.cell = Math.round(arrow.table.getWidth() / arrow.table.getElementsByTagName('td').length);
    });
  },
  slidePhoto: function(event) {
    var target = event.element();
    var left = parseInt(target.table.getStyle('left')) || 0;
    if (target.hasClassName('right')) {
      if (target.slide.getWidth() + target.cell / 2 <= target.table.getWidth() + left) {
        new Effect.Move(target.table, { x: -target.cell, y: 0 });
      }
    } else if (target.hasClassName('left')) {
      if (left + target.cell / 2 <= 0) {
        new Effect.Move(target.table, { x: target.cell, y: 0 });
      }
    }
  }
}

var allForms = {//Глобальный массив форм
  forms: null,
  initialize: function() {
    this.forms = $$('form');
    inputAction.initialize();
    formSubmit.initialize();
  }
}

var inputAction = {//Это тупо подсветка инпутов и замена дефолтного текста
  mask: new RegExp('^[\\s\\t]*$', 'ig'),
  initialize: function() {
    var parent = this;
    allForms.forms.each(function(form) {
      if (form.id != 'city_search') {
        form.getElements().each(function(element) {
          if (element.up('.wrapper')) {
            $(element).observe('blur', parent.inputBlur.bindAsEventListener(parent));
            $(element).observe('focus', parent.inputFocus.bindAsEventListener(parent));
          }
        });
      }
    });
  },
  inputBlur: function(event) {
    var target = event.element();
    $(target).up('.wrapper').removeClassName('focus');
    if (this.mask.test(target.value) && !$(target).up('.no_replace')) {
      target.value = target.defaultValue;
    }
  },
  inputFocus: function(event) {
    var target = event.element();
    $(target).up('.wrapper').addClassName('focus');
    if (target.value == target.defaultValue && !$(target).up('.no_replace')) {
      target.value = '';
    }
  }
}

var formSubmit = {//Проверка отправляемых форм - у оболочек требуемых полей стоит класс need
  mask: new RegExp('^[0-9a-z_.]+@[0-9a-z_^.-]+\\.[a-z]{2,}$', 'ig'),
  email: new RegExp('^[0-9a-zA-Z_\.]+@[0-9a-zA-Z\.-]+$'),
  initialize: function() {
    var parent = this;
    allForms.forms.each(function(form) {
      if (form.id != 'city_search' &&
          form.id != 'reg') {
        form.observe('submit', parent.checkForm.bindAsEventListener(parent));
        form.needElements = [];
        form.getElements().each(function(element) {
          if (element.up('.need')) {
            form.needElements.push($(element));
            $(element).observe('blur', parent.inputBlur.bindAsEventListener(parent));
            $(element).observe('focus', parent.inputFocus.bindAsEventListener(parent));
          }
        });
      } else {
        form.observe('submit', function (event) {
          event.stop();
        });
      }
    });
    document.observe('click', this.allRemoveError.bindAsEventListener(this));
  },
  inputBlur: function(event) {
    var target = event.element();
    if ($(target).up('.wrapper').hasClassName('wrong')) {
      this.checkElement(target);
    }
  },
  inputFocus: function(event) {
    var target = event.element();
  },
  allRemoveError: function(event) {
    var target = event.element();
    var parent = this;
    if (!$(target).up('form')) {
      allForms.forms.each(function(form) {
        form.getElements().each(function(element) {
          parent.removeError(element);
        });
      });
    }
  },
  checkElement: function(element) {
    if (/mail/.test(element.name)) {
      if (element.value == '' || (element.value == element.defaultValue && !$(element).up('.no_replace')) ) {
        this.insertError(element, 'Укажите E-mail')
      } else {
        if (!this.mask.test(element.value)) {
          this.insertError(element, 'E-mail некорректный');
        } else {
          this.removeError(element);
        }
      }
    } else if (element.type == 'password') {
      if (element.value == '' || (element.value == element.defaultValue && !$(element).up('.no_replace')) ) {
        this.insertError(element, 'Укажите пароль');
      } else {
        this.removeError(element);
      }
    } else {
      if (element.value == '' || (element.value == element.defaultValue && !$(element).up('.no_replace')) ) {
        this.insertError(element, 'Наберите что-нибудь');
      } else if (element.value.length < 3) {
        this.insertError(element, 'Что-то маловато');
      } else {
        this.removeError(element);
      }
    }
  },
  checkForm: function(event) {
    var form = event.element();
    form.first_wrong = null;
    var parent = this;
    form.needElements.each(function(element) {
      parent.checkElement(element);
    });
    if (form.first_wrong) {
      event.stop();
      form.first_wrong.focus();
    }
  },
  insertError: function(element, text) {
    if (!element.error) {
      element.error = new Element('div', { 'class': 'error' }).insert(new Element('div', { 'class': 'content' }).update(text)).insert(new Element('span'));
      $(element).up('.wrapper').insert({ after: element.error });
    } else {
      $(element.error).down('.content').update(text);
    }
    $(element).up('.wrapper').addClassName('wrong');
    if (!element.form.first_wrong) {
      element.form.first_wrong = element;
    }
  },
  removeError: function(element) {
    if (element.error) {
      $(element.error).remove();
      element.error = null;
      $(element).up('.wrapper').removeClassName('wrong');
    }
  }
}

var correctSafari = {//Коррекция стилей для Safari - у него есть встроенная подсветка полей
  initialize: function() {
    if (window.devicePixelRatio) {
      $$('.wrapper').each(function(wrapper) {
        wrapper.removeClassName('input');
        wrapper.removeClassName('textarea');
      });
      $$('.button').each(function(button) {
        button.removeClassName('button');
      });
    }
  }
}

var cityChoice = {//Работа с блоком городов
  container: null,
  inputNode: null,
  cities: null,
  cityNodes: null,
  initialize: function() {
    this.container = $('region');
    this.inputNode = $('city_name');
    if (this.inputNode) {
      this.inputNode.observe('keyup', this.showCity.bindAsEventListener(this));
      this.cityNodes = $$('#' + this.container.id + ' li');
      this.cities = this.cityNodes.collect(function(cityNode) {
        return cityNode.down('a').innerHTML.replace(/[^ЁёА-Яа-яA-Za-z]/g,'-');
      });
      document.observe('click', this.showContainer.bindAsEventListener(this));
    }
  },
  showContainer: function(event) {
    var target = Event.element(event);
    if (target.up('#' + this.container.id)) {
      if (target == this.inputNode) {
        if (!this.container.hasClassName('on')) {
          this.inputNode.value = '';
        }
        this.container.addClassName('on');
        this.inputNode.up('.wrapper').addClassName('focus');
      }
    } else {
      this.clear();
    }
  },
  showCity: function() {
    var mask = new RegExp('(^' + this.inputNode.value + ')|(-' + this.inputNode.value + ')', 'ig');
    this.cityNodes.each((function(cityNode, index) {
      mask.lastIndex = 0;
      if (mask.test(this.cities[index])) {
        cityNode.removeClassName('none');
      } else {
        cityNode.addClassName('none');
      }
    }).bind(this));
  },
  clear: function() {
    if (this.container.hasClassName('on')) {
      this.inputNode.up('.wrapper').removeClassName('focus');
      this.inputNode.value = this.inputNode.defaultValue;
      this.cityNodes.each((function(cityNode) {
        cityNode.removeClassName('none');
      }).bind(this));
      this.container.removeClassName('on');
    }
  }
}




//////////////////////////////////////////////////////////////////////////
// Авторизация
function login_init() {
   form = $('enter');
   if( form ) {
      form.observe('submit', login_request);
   }
}

function login_request(event) {
    
   event.stop();
    
   form = $('enter');

   var email = form.email.value;
   var pswd  = form.pswd.value;
   var url = "/shell/login.php";
   var pars = {email: email, pswd: pswd};
    
   var myAjax = new Ajax.Request(
      url,
      {
        method: "post",
        parameters: pars,
        onComplete: login_response
       });
}
 
function login_response(transport) {
   
   form = $('enter');
   
   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      if( status == 'ok' ) {
         location.reload();
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}



//////////////////////////////////////////////////////////////////////////
// Напоминание пароля
function remind_init() {
   form = $('remind');
   if( form ) {
      form.observe('submit', remind_request);
   }
}

function remind_request(event) {
    
   event.stop();
    
   form = $('remind');

   var email = form.email.value;
   var url = "/shell/login.php";
   var pars = {email: email, remind: 1};
    
   var myAjax = new Ajax.Request(
      url,
      {
        method: "post",
        parameters: pars,
        onComplete: remind_response
       });
}
 
function remind_response(transport) {

   form = $('remind');
   
   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      if( status == 'ok' ) {
         alert('Пароль выслан на указанный email');
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}


//////////////////////////////////////////////////////////////////////////
// Регистрация
function reg_init() {
   var form = $('reg');
   if( form != null ) {
      form.observe('submit', reg_request);
   }
}

function reg_request(event) {
 
   event.stop();
 
   var form = $('reg');
   
   user = check_registration(form);
 
   if( !user['is_error'] ) {
      // Если нет ошибок, то отправляем форму
      var url = "/shell/registration.php";
      var pars = {fio: user['fio'], login: user['login'], email: user['email'], pswd: user['pswd']};
    
      var myAjax = new Ajax.Request(
        url,
        {
          method: "post",
          parameters: pars,
          onComplete: reg_response
         });
   }
 
}
  
function reg_response(transport) {

   var form = $('reg');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      if( status == 'ok' ) {
         $("divform").style.display = "none";
         $("divregok").style.display = "block";
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}

function check_registration(form) {
 
   var is_error = false;
   var fio   = '';
   var login = '';
   var email = '';
   var pswd  = '';
   
   if( form.is_registration.value == 1 ) {
      fio   = form.fio.value;
      login = form.login.value;
      email = form.email.value;
      pswd  = form.pswd.value;
 
      // Проверка полей
      if(email == '') {
         insertError(form, 'email', 'Укажите E-mail');
         is_error = true;
      } else if (!formSubmit.email.test(email)) {
         insertError(form, 'email', 'E-mail некорректный');
         is_error = true;
      } else {
         removeError(form, 'email');
      }
   
      if (pswd == '') {
         insertError(form, 'pswd', 'Укажите пароль');
         is_error = true;
      } else {
         removeError(form, 'pswd');
      }
   
      if (fio == '') {
         insertError(form, 'fio', 'Наберите что-нибудь');
         is_error = true;
      } else if (fio.length < 3) {
         insertError(form, 'fio', 'Что-то маловато');
         is_error = true;
      } else {
         removeError(form, 'fio');
      }
   
      if (login == '') {
         insertError(form, 'login', 'Наберите что-нибудь');
         is_error = true;
      } else if (login.length < 3) {
         insertError(form, 'login', 'Что-то маловато');
         is_error = true;
      } else {
         removeError(form, 'login');
      }
   }
   // Конец проверки полей
 
   return {is_error: is_error, fio: fio, login: login, email: email, pswd: pswd};
 
}




//////////////////////////////////////////////////////////////////////////
// Отзыв пользователя
function site_response_init() {
   var form = $('site_response');
   if( form != null ) {
      form.observe('submit', site_response_request);
   }
}

function site_response_request(event) { 
   
   event.stop();
 
   var form = $('site_response');

   var name     = form.name.value;
   var contacts = form.contacts.value;
   var content  = form.content.value;
   var status   = 1;
   var site_id  = form.site_id.value;
 
   // Проверка полей
   var is_error = false;
 
   if (name == '') {
      insertError(form, 'name', 'Наберите что-нибудь');
      is_error = true;
   } else if (name.length < 3) {
      insertError(form, 'name', 'Что-то маловато');
      is_error = true;
   } else {
      removeError(form, 'name');
   }

   if (content == '') {
      insertError(form, 'content', 'Наберите что-нибудь');
      is_error = true;
   } else if (content.length < 3) {
      insertError(form, 'content', 'Что-то маловато');
      is_error = true;
   } else {
      removeError(form, 'content');
   }
   // Конец проверки полей
   
   if( !is_error ) {
      // Если нет ошибок, то отправляем форму
      var url = "/shell/site_response.php";
      var pars = {name: name, content: content, contacts: contacts, status: status, site_id: site_id};

      var myAjax = new Ajax.Request(
        url,
        {
          method: "post",
          parameters: pars,
          onComplete: site_response_response
         });
   }
 
}
  
function site_response_response(transport) {

   var form = $('site_response');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      if( status == 'ok' ) {
         var text = response.firstChild ? response.firstChild.data : '';
         $('div_site_response_send').innerHTML = text;
         
         $('div_site_response').hide();
         $('div_site_response_send').show();
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}



//////////////////////////////////////////////////////////////////////////
// Ответ менеджера на отзыв
function site_reply_request(id, reply) { 
   
   var form = $('site_reply');
 
   // Проверка полей
   var is_error = false;
 
   if (reply == '') {
      insertError(form, 'reply'+id, 'Наберите что-нибудь');
      is_error = true;
   } else if (reply.length < 3) {
      insertError(form, 'reply'+id, 'Что-то маловато');
      is_error = true;
   } else {
      removeError('reply'+id);
   }
   // Конец проверки полей
   
   if( !is_error ) {
      // Если нет ошибок, то отправляем форму
      var url = "/shell/site_response.php";
      var pars = {reply: reply, id: id};

      var myAjax = new Ajax.Request(
        url,
        {
          method: "post",
          parameters: pars,
          onComplete: site_reply_response
         });
   }
 
}
  
function site_reply_response(transport) {

   var form = $('site_reply');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      if( status == 'ok' ) {
         var text = response.firstChild ? response.firstChild.data : '';
         alert("Ответ сохранен.");
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}



//////////////////////////////////////////////////////////////////////////
// Добавление или изменение сайта
function site_init() {
   var form = $('site');
   if( form != null ) {
      form.observe('submit', site_request);
   }
}

function site_request(event) {
 
   event.stop();
 
   var form = $('site');

   var site_id        = form.site_id.value;
   var ring_dir_id    = form.ring_dir_id.value;
   var region_id      = form.region_id.value;
   var url            = form.url.value;
   var name           = form.name.value;
   var description    = form.description.value;
   var where_is_link  = form.where_is_link.value;
   var address        = form.address.value;
   var phone          = form.phone.value;
   var advertisement  = form.advertisement.value;
 
   // Проверка полей
   var is_error = false;
   var user = check_registration(form);
 
   // Конец проверки полей
 
   if( !user['is_error'] ) {
      // Если нет ошибок, то отправляем форму
      var request_url = "/shell/modify_site.php";
      var pars = {fio: user['fio'], login: user['login'], email: user['email'], pswd: user['pswd'],
                  site_id: site_id,
                  ring_dir_id: ring_dir_id,
                  region_id: region_id,
                  url: url,
                  name: name,
                  description: description,
                  where_is_link: where_is_link,
                  address: address,
                  phone: phone,
                  advertisement: advertisement};
    
      var myAjax = new Ajax.Request(
        request_url,
        {
          method: "post",
          parameters: pars,
          onComplete: site_response
         });
   }
 
}
  
function site_response(transport) {

   var form = $('site');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      var site_id = response.getAttribute( 'id' );
      if( status == 'reg_ok' ) {
         var text = response.firstChild ? response.firstChild.data : '';
         $('divregok').innerHTML = text;
         $("divform").style.display = "none";
         $("divregok").style.display = "block";
         window.scroll(0,0);
      } else if( status == 'add_ok' ) {
         document.location = '/sites/modify/'+site_id+'/';
      } else if( status == 'modify_ok' ) {
         alert("Запрос на изменение отправлен модератору.");
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}





//////////////////////////////////////////////////////////////////////////
// Добавление или изменение объявления
function ads_init() {
   var form = $('ads');
   if( form != null ) {
      form.observe('submit', ads_request);
   }
}

function ads_request(event) {
 
   event.stop();
 
   var form = $('ads');

   var ads_id        = form.ads_id.value;
   var ring_dir_id   = form.ring_dir_id.value;
   var region_id     = form.region_id.value;
   var notice        = form.notice.value;
   var content       = form.content.value;
 
   var user = check_registration(form);
 
   if( !user['is_error'] ) {
      // Если нет ошибок, то отправляем форму
      var request_url = "/shell/modify_ads.php";
      var pars = {fio: user['fio'], login: user['login'], email: user['email'], pswd: user['pswd'],
                  ads_id: ads_id,
                  ring_dir_id: ring_dir_id,
                  region_id: region_id,
                  notice: notice,
                  content: content};
    
      var myAjax = new Ajax.Request(
        request_url,
        {
          method: "post",
          parameters: pars,
          onComplete: ads_response
         });
   }
 
}
  
function ads_response(transport) {

   var form = $('ads');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      var ads_id = response.getAttribute( 'id' );
      if( status == 'reg_ok' ) {
         var text = response.firstChild ? response.firstChild.data : '';
         $('divregok').innerHTML = text;
         $("divform").style.display = "none";
         $("divregok").style.display = "block";
         window.scroll(0,0);
      } else if( status == 'add_ok' ) {
         document.location = '/ads/modify/'+ads_id+'/';
      } else if( status == 'modify_ok' ) {
         alert("Изменения сохранены.");
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}





//////////////////////////////////////////////////////////////////////////
// Изменение информации о пользователе
function user_info_init() {
   var form = $('user_info');
   if( form != null ) {
      form.observe('submit', user_info_request);
   }
}

function user_info_request(event) {
 
   event.stop();
 
   var form = $('user_info');

   var fio             = form.fio.value;
   var login           = form.login.value;
   var old_pswd        = form.old_pswd.value;
   var pswd            = form.pswd.value;
   var email           = form.email.value;
   var phone           = form.phone.value;
   var sign            = form.sign.value;
   var about           = form.about.value;
   var birthday_day    = form.birthday_day.value;
   var birthday_month  = form.birthday_month.value;
   var birthday_year   = form.birthday_year.value;
 
   // Проверка полей
   var is_error = false;
 
   // Конец проверки полей
 
   if( !is_error ) {
      // Если нет ошибок, то отправляем форму
      var request_url = "/shell/modify_user.php";
      var pars = {fio: fio,
                  login: login,
                  old_pswd: old_pswd,
                  pswd: pswd,
                  email: email,
                  phone: phone,
                  sign: sign,
                  about: about,
                  birthday_day: birthday_day,
                  birthday_month: birthday_month,
                  birthday_year: birthday_year};
    
      var myAjax = new Ajax.Request(
        request_url,
        {
          method: "post",
          parameters: pars,
          onComplete: user_info_response
         });
   }
 
}
  
function user_info_response(transport) {

   var form = $('user_info');

   if (200 == transport.status) {
      var response = transport.responseXML.documentElement;
      var status = response.getAttribute( 'status' );
      var pswd_changed = response.getAttribute( 'pswd_changed' );
      if( status == 'modify_ok' ) {
         if( pswd_changed == 1 ) {
            alert("Изменения сохранены.\nПароль изменен и выслан на указанный email.");
         } else {
            alert("Изменения сохранены.");
         }
      } else {
         var error = response.getElementsByTagName( 'error' );
         for( var i = 0; i < error.length; i++ ) {
            var error_text = error[i].firstChild ? error[i].firstChild.data : '';
            var error_field = error[i].getAttribute( 'name' );
            insertError(form, error_field, error_text);
         }
      } 
   } else {
      alert('Сервер не отвечает!');
   }
}

