// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

var countTextareaRows = function(value) {
    var lines = value.split("\n");
    var count = lines.length;
    lines.each(function(line){count += parseInt(line.length/70)});
    return count
}

var autoResize = function(el_id) {
  $(el_id).rows = Math.max(10,countTextareaRows($(el_id).value) + 3)
  new Form.Element.Observer(el_id, 0.2 /* 200 millisec */, function(el, value){
    count = countTextareaRows(value)
    if( count > 1 ) el.rows = Math.max(10,count + 3)
  })
}

var autoDisable = function(el_id, button_id) {
  new Form.Element.Observer(el_id, 0.2 /* 200 millisec */, function(el, value){
      button = $(button_id)
      if(value.blank()) {button.disabled=true}
      else {button.disabled=false}
  })
}

var userShowMessage = function(messageBody, messageType) {
  $('message_box_body').innerHTML = messageBody
  styled_box = $$('#message_box div').first()
  styled_box.removeClassName(styled_box.className.split(' ')[2])
  styled_box.addClassName(messageType)
  Effect.Appear('message_box', {duration:0.3})
  if (messageType == 'notice')setTimeout("Effect.Fade('message_box', {duration:0.3})",2500)
}

var userToggleEdit = function() {
  $('user_name_input').value = $('user_name').innerHTML
  $('user_about_input').value = $('user_about_source').value
  $('user_edit').toggle()
  $('user_name').toggle()
  $('user_about').toggle()
  $('user_name_form').toggle()
  $('user_about_form').toggle()
  autoResize('user_about_input')
}

var userSave = function(id) {
  var new_about_source = $('user_about_input').value
  var new_name = $('user_name_input').value
  new Ajax.Request('/users/'+id,
  {
    method: 'put',
    parameters: { about: new_about_source, name: new_name },
    onSuccess: function(response) {
      if (response.responseText.evalJSON().error) {
        userShowMessage(response.responseText.evalJSON().error,'error')
      }
      else {
        new_about_body = response.responseText.evalJSON().about
        $('user_about').innerHTML = new_about_body
        $('user_about_source').value = new_about_source
        $('user_name').innerHTML = new_name.escapeHTML()
        userToggleEdit()
        userShowMessage('Ваша страница успешно обновлена','notice')
      }
    },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
  });
}

var userPasswordsCheck = function(password_1_name,password_2_name,button_name) {
  password_1 = $(password_1_name)
  password_2 = $(password_2_name)
  button = $(button_name)
  if ( (password_1.value == password_2.value) && (password_1.value != '') ) {button.enable()}
  else {button.disable()}
}

var userCreateInvite = function() {
  new Ajax.Request('/invitations',
  {
    method: 'post',
    onSuccess: function(response) {
      new_key = response.responseText.evalJSON().key
      $('invite_key').innerHTML = new_key
      $('invite_reg_link')['href'] = 'http://' + document.domain + '/users/new?key=' + new_key
      Effect.SlideDown('invite_box', {duration:0.3});
    },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
  }); 
}

var userCreateStreamToggle = function() {
  $('create_stream_button').toggle()
  Effect.toggle('new_stream', 'blind', {duration:0.2})
}

var userEditStreamToggle = function(id){
  $('stream_' + id).toggle()
  Effect.toggle('edit_stream_' + id, 'blind', {duration:0.2})
}

var userDestroyStream = function(name,id) {
  if (confirm('Вы действительно хотите окончательно и безвозвратно удалить этот блог?')) {
    new Ajax.Request('/streams/'+name,
    {
      method:'delete',
      onSuccess: function() { Effect.Fade('stream_'+id,{oncomplete:userShowMessage('Блог успешно удален','notice')}) },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}

var streamAddFromBlog = function(stream_name) {
  composition_name = $('composition_name').value
  streamAddToComposition(stream_name,composition_name)
  Effect.toggle('add_to_composition_box', 'appear', {duration:0.3})
}

var streamAddToComposition = function(new_stream_name,composition_name) {
  new Ajax.Request('/compositions/'+composition_name+'/add',
  {
    method:'put',
    parameters: {stream_name:new_stream_name},
    onSuccess: function(response) {
      if(response.responseText.evalJSON().reason == 'already') userShowMessage('Блог '+new_stream_name+' уже есть в композиции '+composition_name+'.','error')
      else userShowMessage('Блог успешно добавлен в композицию "'+composition_name+'"','notice')
    },
    onFailure: function(response){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
  });
}

var streamRemoveFromComposition = function(new_stream_name,composition_name) {
  if (confirm('Вы действительно хотите удалить блог "'+new_stream_name+'" из композиции "'+composition_name+'"?')) {
    new Ajax.Request('/compositions/'+composition_name+'/remove',
    {
      method:'put',
      parameters: {stream_name:new_stream_name},
      onSuccess: function() { window.location.reload() },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}

var streamAddWriterFromBlog = function(stream_name) {
  writer_id = $('writer_id').value
  streamAddWriter(writer_id,stream_name)
  Effect.toggle('add_writer_box', 'appear', {duration:0.3})
}

var streamAddWriter = function(new_writer_id,stream_name) {
  new Ajax.Request('/streams/'+stream_name+'/add',
  {
    method:'put',
    parameters: {writer_id:new_writer_id},
    onSuccess: function(response) {
      if(response.responseText.evalJSON().reason == 'already') userShowMessage('Этот пользователь уже является соавтором блога '+stream_name,'error')
      else window.location.reload()
    },
    onFailure: function(response){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
  });
}

var streamRemoveWriter = function(new_writer_id,stream_name) {
  if (confirm('Вы действительно хотите удалить пользователя с id "'+new_writer_id+'" из авторов блога "'+stream_name+'"?')) {
    new Ajax.Request('/streams/'+stream_name+'/remove',
    {
      method:'put',
      parameters: {writer_id:new_writer_id},
      onSuccess: function() { window.location.reload() },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}

var streamTitlesEditToggle = function() {
  $('stream_title').toggle()
  $('stream_subtitle').toggle()
  $('stream_titles_edit').toggle()
  $('stream_titles_form').toggle()
  $('stream_title_input').value = $('stream_title_link').innerHTML
  $('stream_subtitle_input').value = $('stream_subtitle').innerHTML
}

var streamTitlesSave = function(name) {
  var new_title = $('stream_title_input').value
  var new_subtitle = $('stream_subtitle_input').value
  new Ajax.Request('/streams/'+name,
  {
    method: 'put',
    parameters: { title: new_title, subtitle: new_subtitle },
    onSuccess: function(response) {
      $('stream_title_link').innerHTML = new_title.escapeHTML()
      $('stream_subtitle').innerHTML = new_subtitle.escapeHTML()
      streamTitlesEditToggle()
    },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
  });
}

var userCreateCompositionToggle = function() {
  $('create_composition_button').toggle()
  Effect.toggle('new_composition', 'blind', {duration:0.2})
}

var userEditCompositionToggle = function(id){
  $('composition_' + id).toggle()
  Effect.toggle('edit_composition_' + id, 'blind', {duration:0.2})
}

var userDestroyComposition = function(name,id) {
  if (confirm('Вы действительно хотите окончательно и безвозвратно удалить эту композицию?')) {
    new Ajax.Request('/compositions/'+name,
    {
      method:'delete',
      onSuccess: function() { Effect.Fade('composition_'+id,{oncomplete:userShowMessage('Композиция успешно удаленa','notice')}) },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}

var postToggleCreate = function() {
  Effect.toggle('new_post_box', 'blind', {duration:0.3});
  Form.reset($('new_post_form'))
  autoResize('new_post_body')
  autoDisable('new_post_body','new_post_submit')
  setTimeout("if($('new_post_box').visible())$('new_post_title').focus()",400)
}

var postCreateAndInsert = function(form_name) {
  form = $(form_name)
  new Ajax.Updater('new_post_box','/posts',
  {
    method:'post',
    parameters: Form.serialize(form),
    onSuccess: function(response) {
      Form.reset(form);
      userShowMessage('Запись успешно добавлена','notice')
      $('new_post_box').hide()
    },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') },
    insertion: 'after'
  });
}

var postDestroy = function(id) {
  if (confirm('Вы действительно хотите удалить эту запись?')) {
    new Ajax.Request('/posts/'+id,
    {
      method:'delete',
      onSuccess: function() { Effect.Fade('post_'+id,{oncomplete:userShowMessage('Запись успешно удалена','notice')}) },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}

var postEnterEditMode = function(id) {
  new Ajax.Updater('post_'+id,'/posts/'+id+'/edit',
  {
    method:'get',
    onSuccess: function() {  },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') },
    onComplete: function() {
      if ($('post_'+id+'_edit_box')) {
        $('post_'+id+'_edit_box').show()
        $('post_'+id).hide()
        $('post_'+id+'_title_input').focus()
        autoResize('post_'+id+'_body_input')
        autoDisable('post_'+id+'_body_input','post_'+id+'_submit')
      }
    },
    insertion: 'after'
  });
}

var postExitEditMode = function(id) {
  if ($('post_'+id+'_edit_box')) {
    $('post_'+id+'_edit_box').remove()
    $('post_'+id).show()
  }
}

var postSave = function(id) {
  form = $('post_'+id+'_edit_form')
  old_post = $('post_'+id)
  old_post['id'] = 'post_'+id+'_old'
  new Ajax.Updater({success:'post_'+id+'_old'},'/posts/'+id,
  {
    method:'put',
    parameters: Form.serialize(form),
    onSuccess: function() { userShowMessage('Запись успешно обновлена','notice') },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') },
    onComplete: function(){
      if ($('post_'+id)) {
        $('post_'+id+'_old').remove()
        postExitEditMode(id)
      } else {
        old_post['id'] = 'post_'+id
      }
    },
    insertion: 'after'
  });
}

var commentCreateToggle = function(id) {
  form = $('post_'+id+'_new_comment_form')
  $('create_post_'+id+'_comment_button').toggle()
  Effect.toggle('post_'+id+'_new_comment_box', 'blind', {duration:0.3});
  if (!$('create_post_'+id+'_comment_button').visible()) setTimeout("form.getElements()[0].focus()",400)
  autoDisable('new_comment_body', 'new_comment_submit')
  Form.reset(form)
}

var commentCreateAndInsert = function(post_id,form_name) {
  form = $(form_name)
  new Ajax.Updater({success:'post_'+post_id+'_new_comment_box'},'/posts/'+post_id+'/comments',
  {
    method:'post',
    parameters: Form.serialize(form),
    onSuccess: function(response) {
      userShowMessage('Комментарий успешно добавлен','notice')
      commentCreateToggle(post_id)
    },
    onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') },
    insertion: 'after'
  });
}

var commentDestroy = function(id) {
  if (confirm('Вы действительно хотите удалить этот комментарий?')) {
    new Ajax.Request('/comments/'+id,
    {
      method:'delete',
      onSuccess: function() { Effect.Fade('comment_'+id,{oncomplete:userShowMessage('Комментарий успешно удален','notice')}) },
      onFailure: function(){ userShowMessage('Ошибка связи. Поробуйте повторить позднее.','error') }
    });
  }
}
