/**
 * Copyright 2011 Red Beacon, Inc. - All Rights Reserved
 *
 * This code, and all derivative work, is the exclusive property of
 * Red Beacon, Inc. and may not be used without Red Beacon, Inc.'s
 * authorization.
 *
 * Author: Jon Rohan
 */

(function($){

    $.fn.dynamicUploader = function(url,options) {

        var settings = $.extend({
            max: 1,
            count: 0,
            indicator_class: "uploading",
            is_logo: false,
            delete_url: "",
            hidden_image_ids: "#id_avatar_image_id",
            images_cont: null,
            display_thumbnail: true,
            file_types: ['bmp', 'csv', 'doc', 'docx', 'gif', 'jpg', 'jpeg', 'pdf', 'png',
                         'ppt', 'pptx', 'txt', 'xls', 'xlsx',
                         // Audio/Video extensions (from Zencoder's docs)
                         '3g2', '3gp', '3gp2', '3gpp',
                         '3gpp2', 'aac', 'f4a', 'f4b',
                         'f4v', 'flv', 'm4a', 'm4b', 'm4r',
                         'm4v', 'mov', 'mp3', 'mp4', 'oga',
                         'ogg', 'ogv', 'ogx', 'ts', 'webm',
                         'wma'
                        ],
            onSuccessCallback: function(){},
            onChangeCallback: function(){},
            onRemoveCallback: function(){}
        }, options);

        if (!url || url === "") return false;

        var uploaded_images = {};

        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();
                $(settings.hidden_image_ids).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 file 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('Only ' + settings.max + ' files may be uploaded at a time.');
                return;
            }

            // Callback before creating the loading image container
            settings.onChangeCallback();

            $(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>");
            image_form.append('<input type="hidden" name="is_logo" value="' +
                              (settings.is_logo ? 1 : '') + '"/>');

            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) {
                    var filetype = response.filetype;
                    var icon = filetype;

                    $(settings.status_container).val("");
                    $(settings.images_cont).find("li."+settings.indicator_class).remove();

                    if(response.success===true) {
                        if (typeof(response.thumbnail_url) == 'undefined' || response.thumbnail_url === null) {
                            response.thumbnail_url =
                                window.url.MEDIA_URL + 'images/icons/' + icon + '.png';
                        }

                        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("");
                            $(settings.hidden_image_ids).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);
                            }

                            // Callback function that gets fired after removing the image
                            settings.onRemoveCallback();

                            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 class="image_file_name">' + file_name + '</span>')
                            .append(remove)
                            .appendTo(li);

                        var src = settings.display_thumbnail ? response.thumbnail_url
                            : response.image_url;

                        var anchor = $("<a><img src='" + src + "'/></a>");
                        anchor.attr('href', response.image_url);
                        anchor.attr('rel', 'facebox[.modaldescription]');
                        li.append(anchor);

                        // Enable Facebox if the file is an image.
                        if (filetype == 'bmp' || filetype == 'gif' ||
                            filetype == 'jpeg' || filetype == 'png') {

                            anchor.attr('rel', 'facebox[.modaldescription]');

                            if (anchor.facebox) {
                                // Don't break pages that haven't loaded facebox.
                                anchor.facebox();
                            }
                        }

                        // Not bothering to link audio/video with the
                        // uploader. That will happen on refresh if
                        // the transcoding has finished.

                        li.appendTo(settings.images_cont);
                        if($.isFunction(settings.success)) settings.success(response);

                        settings.onSuccessCallback();
                    }
                }
            });
            return false;
        });
    };
})(jQuery);

