function setAssetUrl(url) {
  window['asset-url'] = url;
}

document.on("dom:loaded",  function() {
  Event.delegate(document.body, '.extended-textarea a.attach-image', 'click', function(e) {
    Event.stop(e);
    this.up('.extended-textarea').down('.image-file').clsShow()
      .next('.image-url').clsHide()
      .next('.video-url').clsHide();
    this.up('.extended-textarea').down('a.attach-image').addClassName('active');
    this.up('.extended-textarea').down('a.attach-video').removeClassName('active');
  });

  Event.delegate(document.body, '.extended-textarea a.attach-video', 'click', function(e) {
    Event.stop(e);
    this.up('.extended-textarea').down('.image-file').clsHide()
      .next('.image-url').clsHide()
      .next('.video-url').clsShow();
    this.up('.extended-textarea').down('a.attach-video').addClassName('active');
    this.up('.extended-textarea').down('a.attach-image').removeClassName('active');
  });

  Event.delegate(document.body, '.extended-textarea a.attach-image-url', 'click', function(e) {
    Event.stop(e);
    this.up('.extended-textarea').down('.image-file').clsHide()
      .next('.image-url').clsShow()
      .next('.video-url').clsHide();
    this.up('.extended-textarea').down('a.attach-video').removeClassName('active');
    this.up('.extended-textarea').down('a.attach-image').removeClassName('active');
  });

  Event.delegate(document.body, '.extended-textarea a.cancel-attach', 'click', function(e) {
    Event.stop(e);
    this.up('.extended-textarea').down('.image-file').clsHide()
      .next('.image-url').clsHide()
      .next('.video-url').clsHide();
    this.up('.extended-textarea').down('a.attach-video').removeClassName('active');
    this.up('.extended-textarea').down('a.attach-image').removeClassName('active');
  });

  Event.delegate(document.body, '.extended-textarea input[type=submit]', 'click', function(e) {
      Event.stop(e);

      var form = $(this.form);
      var textArea = this.up('.extended-textarea').down('.borderless');
      var errors = this.up().previous('.errors');

      var iFrame = form.down('.submit-target');
      if (typeof(iFrame) == 'undefined') {
        var newID = "id-" + new Date().getTime().toString();
        try {
          iFrame = new Element('iframe', {style:'display:none;position:absolute', name: newID, id:newID});
        } catch(e) {
          iFrame = new Element('iframe', {style:'display:none;position:absolute'});
          iFrame.updateAttributes({name:newID, id:newID})
        }
        form.insert(iFrame);
      }

      var oldValue = $(this).getAttribute("value");
      $(this).disable().writeAttribute("value", "Please wait...");

      var oldAction = form.action;
      var oldTarget = form.target;

      form.action = window['asset-url'] + "?attachment_type=" + this.getAttribute('rel') + "&textarea_id=" + textArea.id;
      form.target = iFrame.id;

      var me = this;

      Event.stopObserving(iFrame, 'load');
      Event.observe(iFrame, 'load', function() {
          me.enable().writeAttribute("value", oldValue);
          var responseBody = $(window.frames[iFrame.id].document.body);
          if (responseBody.className.indexOf("error") != -1) {
            errors.clsShow().update(responseBody.innerHTML);
          } else {
            var editor = $(textArea.id + '_editor');
            if (editor){
              $(textArea.id + '_editor').insertHTML(responseBody.innerHTML);
            }
            else{
              TextAreaEditing.insert(textArea, responseBody.innerHTML);
            }
          }
      });

      errors.clsHide();
      form.submit();

      form.action = oldAction;
      form.target = oldTarget;
  });
});

var TextAreaEditing = {

  insert: function(el, value){
    try {
      var el = $(el);
      var position = TextAreaEditing.getCursorPosition(el);

      el.focus();

      // Sometimes IE fails on this so we have to do some ugly workaround
      if (document.selection && position == 0 && el.value != '') {
        el.focus();
        
        position = TextAreaEditing.getCursorPosition(el);
        
        // If position is still zero, position the cursor at the end
        if (position == 0) {
          position = el.value.length;
        }
      }

      var start = el.value.substr(0, position);
      var end   = el.value.substr(position, el.value.length-start.length);
      el.value = start + value + end;
    } catch (e) {
      alert("Sorry, this feature does not work in your browser.");
    }
  },
  
  getCursorPosition: function(el){
    var textarea = $(el);
    textarea.focus();
    
    // Get position in Firefox, Opera, Safari etc.
    if (typeof(textarea.selectionStart) == 'number'){
      return textarea.selectionStart;
    // Look at how big the code is for IE... damn it!
    } else if(document.selection){
      var selection_range = document.selection.createRange().duplicate();
    
      if (selection_range.parentElement() == textarea) {
        var before_range = document.body.createTextRange();
        before_range.moveToElementText(textarea); // Selects all the text
        before_range.setEndPoint('EndToStart', selection_range); // Moves the end where we need it
        
        var after_range = document.body.createTextRange();
        after_range.moveToElementText(textarea); // Selects all the text
        after_range.setEndPoint('StartToEnd', selection_range); // Moves the start where we need it
    
        var before_finished = false, selection_finished = false, after_finished = false;
        var before_text, untrimmed_before_text, selection_text, untrimmed_selection_text, after_text, untrimmed_after_text;
    
        before_text = untrimmed_before_text = before_range.text;
        selection_text = untrimmed_selection_text = selection_range.text;
        after_text = untrimmed_after_text = after_range.text;

        do {
          if (!before_finished) {
            if (before_range.compareEndPoints('StartToEnd', before_range) == 0) {
              before_finished = true;
            } else {
              before_range.moveEnd('character', -1)
              
              if (before_range.text == before_text) {
                untrimmed_before_text += "\r\n";
              } else {
                before_finished = true;
              }
            }
          }
          
          if (!selection_finished) {
            if (selection_range.compareEndPoints('StartToEnd', selection_range) == 0) {
              selection_finished = true;
            } else {
              selection_range.moveEnd('character', -1)
              
              if (selection_range.text == selection_text) {
                untrimmed_selection_text += "\r\n";
              } else {
                selection_finished = true;
              }
            }
          }
          
          if (!after_finished) {
            if (after_range.compareEndPoints('StartToEnd', after_range) == 0) {
              after_finished = true;
            } else {
              after_range.moveEnd('character', -1)
              
              if (after_range.text == after_text) {
                untrimmed_after_text += "\r\n";
              } else {
                after_finished = true;
              }
            }
          }
        } while ((!before_finished || !selection_finished || !after_finished));
        
        var untrimmed_text = untrimmed_before_text + untrimmed_selection_text + untrimmed_after_text;
        var untrimmed_successful = false;
        
        if (textarea.value == untrimmed_text) {
          untrimmed_successful = true;
        }

        var startPoint = untrimmed_before_text.length;
        return startPoint;
      }
    }
  }
}
