(function($){
  $.fn.dynamicUploader = function(url,options) {
    var settings = $.extend({
       max: 1,
       count: 0,
       indicator_class: "uploading",
       delete_url: "",
       hidden_image_ids: "#id_avatar_image_id",
       file_types: ["png","jpg","bmp","gif","jpeg"]
    }, options);

    if(!url||url=="") return false;
    var uploaded_images = new Object();
    var getImageIds = function() {
      var result = "";
      for(var i in uploaded_images) {
        result += i + ",";
      }
      return result.substr(0,result.length-1);
    };
    if(!settings.images_cont) {
      var d = new Date();
      var imid = "uploaded_images_" + (Date.UTC() * -1);
      $(this).after("<ul class='dyna_uploaded_images' id='" + imid + "'></ul>");
      settings.images_cont = "#" + imid;
    } else {
      $(settings.images_cont).find("a").each(function(){
          var id = $(this).attr("href").substr(1);
          uploaded_images[id] = id;
      });
      $(settings.images_cont).find("a").click(function(){
          var id = $(this).attr("href").substr(1);
          delete uploaded_images[id];
          $(this).parent().parent().remove();
          $("#id_avatar_image_id").val(getImageIds());
          if(settings.delete_url!="") {
            var postd = {'img_id':id};
            for(var i in settings.deleteinputs) {
              postd[settings.deleteinputs[i].name] = settings.deleteinputs[i].value;
            }
            $.post(settings.delete_url,postd);
          }
          return false;
      });
      
    }

    $(this).change(function(){
      var filetype = $(this).val().substring($(this).val().lastIndexOf(".")+1).toLowerCase();
      if($.inArray(filetype, settings.file_types) < 0) {
        alert("Please choose a supported image type (" + settings.file_types.join(", ") + ").");
        $(this).val("");
        return false;
      }
    
      //clear old image
      if($(settings.images_cont + " li:not(.uploading)").length>=(settings.max-settings.count)) {
        alert("You can only upload "+settings.max+" images");
        return;
        //var last = $(settings.images_cont + " li:last");
        //var id = last.find("a").attr("href").substr(1);
        //delete uploaded_images[id];
        //last.remove();
      }
      $(settings.images_cont).append("<li class='"+settings.indicator_class+"'></li>");
      
      var image_form = $("<form class='personal hidden' action='" + url + "' method='post' enctype='multipart/form-data'></form>");
      var file = $(this);
      $(this).replaceWith(file.clone(true).val(''));
      image_form.append(file);
      for(var i in settings.hiddeninputs) {
        image_form.append("<input type='hidden' name='"+settings.hiddeninputs[i].name+"' value='"+settings.hiddeninputs[i].value+"'/>");
      }
      $("body").append(image_form);
      $(settings.status_container).val("uploading");
      image_form.ajaxSubmit({
        dataType: 'json',
        success:function(response) {
          $(settings.status_container).val("");
          $(settings.images_cont).find("li."+settings.indicator_class).remove();
          if(response.success==true) {
            uploaded_images[response.image_id] = response.thumbnail_url;
            var remove = $("<a href='#" + response.image_id + "' class='small-link-size'>Remove</a>");
            remove.click(function() {
              var id = $(this).attr("href").substr(1);
              delete uploaded_images[id];
              $(this).parent().parent().remove();
              file.val("");
              $("#id_avatar_image_id").val(getImageIds());
              if(settings.delete_url!="") {
                var postd = {'img_id':id};
                for(var i in settings.deleteinputs) {
                  postd[settings.deleteinputs[i].name] = settings.deleteinputs[i].value;
                }
                $.post(settings.delete_url,postd);
              }
              return false;
            });
            $(settings.hidden_image_ids).val(getImageIds());
            var li = $("<li></li>");
            var file_name = file.val();
            if(file_name.length>16) {
              file_name = file_name.substring(0,16)+"...";
            }
            $("<div></div>").append("<span>" + file_name + "</span>").append(remove).appendTo(li);
            li.append("<img src='" + response.thumbnail_url + "'/>");
            li.appendTo(settings.images_cont);
            if($.isFunction(settings.success)) settings.success(response);
          }
        }
      });
      return false;
    });
  };
})(jQuery);