// upload class
(function($) { 
  $.fn.upload   = function(settings)
                  {
                    this.settings   = settings;
                    
                    this.createInput  = function(fileInput)
                                        {
                                          return '<input type="file" style="display: none;" name="'  + fileInput.attr('name') + '"/>';
                                        },
                    
                    this.execute    = function(inputs, index)
                                      {
                                        if(index == 0)
                                        {
                                          this.settings.onLoad(inputs);
                                        }
                                        
                                        if(inputs.eq([index]).length == 0)
                                        {
                                          this.settings.onDone(inputs);
                                          
                                          return false;
                                        }
                                        
                                        if($('input[name="' + inputs.eq([index]).attr('name') + '"]').length == 0)
                                        {
                                          return this.execute(inputs, (index+1));
                                        }
                                        
                                        var $this             = this;
                                        var fileInput         = inputs.eq(index);
                                        var parent            = fileInput.parent();
                                        var name              = 'ajax-upload';
                                        var iframe            = '<iframe src="javascript:false;" name="' + name + '" />';
                                        var form              = '<form method="post" action="' + $this.settings.uploadURL + '" enctype="multipart/form-data" target="' + name + '"></form>';
                                        
                                        var file              = fileInput.val().replace(/.*(\/|\\)/, "");;
                                        
                                        if($('#ajax-upload').length == 0)
                                        {
                                          var html = '<div id="ajax-upload" style="display: none;">' + iframe + form + '</div>';
                                          
                                          var fileInputHtml = $this.createInput(fileInput);
                                          
                                          $('#more-image-files').before(html);
                                          
                                          var cloned = fileInput.clone(true);
                                          
                                          cloned.insertAfter(fileInput);
                                          
                                          fileInput.appendTo('#ajax-upload form');
                                          
                                          $('#image_upload__csrf_token').clone().appendTo('#ajax-upload form');
                                        }
                                        
                                        
                                        $this.settings.onSubmit(parent, file);
                                        
                                        $('#ajax-upload form').submit();
                                        
                                        var iframe = $('#ajax-upload iframe');
                                        
                                        iframe.load(function() {
                                          var content = iframe.contents().find('body').html();
                                          
                                          var cleanup = function()
                                                        {
                                                          $('#ajax-upload').remove();
                                                          
                                                          $this.settings.onComplete(content, parent, file, fileInputHtml);
                                                          
                                                          return $this.execute(inputs, (index+1));
                                                        }
                                          
                                          setTimeout(cleanup, 500);
                                        });
                                      };
                    
                    this.initialize   = function()
                                        {
                                          $this = this;
                                        
                                          $this.click(function(event) {
                                            event.preventDefault();
                                            
                                            var inputs = $('#more-image-files input[type=file]');
                                            
                                            if(inputs.length > 0)
                                            {
                                              $.get('/ajax/initializeuploadcount', function(data) {
                                                $this.execute(inputs, 0);
                                              });
                                            }
                                          });
                                        }
                    
                    this.initialize();
                  }
})(jQuery);

$(document).ready(function() {
  
  var errors = new Array();
  
  // progress bar (spinner)
  var progressBar = function (fileInput, file)
                    {
                      var parent = fileInput.parent();
                      
                      parent.find('a.delete').hide();
                      
                      fileInput.hide();
                      
                      parent.find('span:not(.ss_sprite)').html('<img class="spinner" src="/images/spinner.gif" /> uploading ' + file);
                    };
                    
  // upload settings
  var _upload =  function() { 
    $('#image-upload-form #go').upload({
      uploadURL:    $('#image-upload-form').attr('action'),
      onLoad:       function(inputs)
                    {
                      $('#upload-message').remove();
                      
                      inputs.hide();
                      
                      inputs.each(function() {
                        $(this).parent().find('.error').remove();
                        $(this).before('<span class="message"><img class="spinner" src="/images/spinner.gif" /> processing ' + $(this).val() + '</span>');
                      });
                    },
                    
      onSubmit:     function(parent, file)
                    {
                      var fileInput   = parent.find('input[type=file]');
                      var divOffset   = (parent.position().top);
                      
                      $('html').animate({scrollTop: divOffset-20 + 'px'}, 400);
                      
                      $('#image-upload-form #go').hide();
                      $('#more-image').hide();
                      
                      parent.find('.error').remove();
                      
                      parent.addClass('active');
                      
                      progressBar(fileInput, file);
                    },
                    
      onComplete:   function(content, parent, file, fileInputHtml)
                    {
                      parent.removeClass('active');
                      
                      var fileInput = parent.find('input[type=file]');
                      
                      if(content.match(/^\d+/))
                      {
                        parent.find('span:not(.ss_sprite)').html('uploaded ' + file);
                        
                        if(parent.find('p.bottom').length > 0)
                        {
                          parent.find('a.delete').before('<a class="edit fancybox" href="/image/quick/' + content + '"><span class="ss_sprite ss_pencil">edit</span></a>');
                        }
                        else
                        {
                          var html  = '<p class="bottom float-right">';
                              html += '<a class="edit fancybox" href="/image/quick/' + content + '"><span class="ss_sprite ss_pencil">edit</span></a>';
                              html += '<a href="#" class="delete"><span class="ss_sprite ss_delete">hide</span></a>';
                              html += '</p>';
                              
                          parent.find('input').after(html);
                        }
                        
                        parent.find('.fancybox').fancybox({
                          height:         390,
                          width:          510,
                          autoDimensions: false,
                          autoScale:      false
                        });
                        
                        fileInput.remove();
                        
                        parent.find('a.delete').show();
                      }
                      else
                      {
                        var count = parseInt(errors.length) <= 1 ? (parseInt(errors.length) == 1 ? 1 : parseInt(errors.length)) : (parseInt(errors.length));
                        
                        errors[count] = fileInput;
                        
                        parent.find('span:not(.ss_sprite)').remove();
                        
                        fileInput.show();
                        
                        fileInput.attr('style', 'display: block;');
                        
                        parent.find('a.delete').show();
                        
                        fileInput.before('<div class="error">' + content + '</div>');
                      }
                      
                    },
                    
      onDone:       function(inputs)
                    {
                      $.get('/ajax/uploadmessage', function(data) {
                        $('#image-upload-form').parent().find('h2').after(data);
                        
                        $('#image-upload-form #go').show();
                        
                        $('#more-image').show();
                        
                        $('html').animate({scrollTop: 0}, 400);
                      });
                    }
    });
  };
  
  // call upload function
  _upload();
  
  // bind add more file input
  $('#more-image').click(function(event) {
    
    event.preventDefault();
    
    var i = 0;
    
    for(i = 0; i <= 5; i++)
    {
      var list  = $('ul#more-image-files > li');
    
      if(list.length > 20)
      {
        alert('You have reached the limit (20 files per session)!');
      
        return false;
      }
    
      var last  = list.eq((list.length - 1));
      var match = /\[image_add_(\d+)\]\[image\]$/.exec(String(last.find('input[type=file]').attr('name')));
      var count = match == null ? 1 : parseInt(match[1]) + 1;
      var input = '<li>';
          input += '<input type="file" class="more-image-file" name="image_upload[image_add_' + count + '][image]" />';
          input += '<p class="bottom float-right">';
          input += '<a href="#" class="delete"><span class="ss_sprite ss_delete">hide</span></a>';
          input += '</p>'
          input += '</li>';
    
      last.after(input);
    }
  });
  
  // bind delete file input
  $('ul#more-image-files a.delete').live('click', function(event) {
    event.preventDefault();
    
    if($(this).parent().parent().attr('id') != 'file-1')
    {
      $(this).parent().parent().fadeOut('slow', function(event) { $(this).remove(); });
    }
    else
    {
      $(this).parent().parent().fadeOut('slow', function(event) { $(this).hide(); });
    }
  });
  
  //bind quick update
  
  $('.quick').live('click', function(event) {
    event.preventDefault();
    
    $(this).before('<img class="spinner" src="/images/spinner.gif" />');
    
    var form  = $(this).parent().parent();
    var action  = form.attr('action');
    
    form.find('.error_list').remove();
    
    var data = {};
    
    form.find(':input, textarea, select').each(function(i, obj) {
      data[$(obj).attr('name')] = $(obj).val();
    });
    
    $.ajax({
      type:       'post',
      url:        action,
      dataType:   'json',
      data:       data,
      error:      function(data, textStatus, XMLHttpRequest)
                  {
                    $('html').after(data);
                  },
                  
      success:    function(data, textStatus, XMLHttpRequest)
                  {
                    form.find('.spinner').remove();
                    
                    if(data['errors'])
                    {
                      $.each(data['errors'], function(index, value) {
                        $('#' + index).before('<ul class="error_list"><li>' + value + '</li></ul>');
                      });
                    }
                    else
                    {
                      form.prepend(data['success']);
                      
                      $.fancybox.close();
                    }
                  }
    });
  });
});
