/*
 * jQuery Sputnik Dialog Plugin
 * Sune Kibsgaard Pedersen, supe@tv2.dk
 *
 * Usage:
 * // activate plugin with options (see defaults for options to override)
 *  $("#player").sputnikDialog({"prefix":"foo_"});
 *
 *  // in conjunction with player plugin, make sure dialog is initialized first
 *  $("#player").sputnikDialog().sputnikPlayer(1);
 */
(function($) {
    var defaults = {
        // id prefix for html elements containing dialogs
        "prefix"            : "dialog_",
        // css class which all dialogs have in common
        "group"             : "dialog_group",
        // css class which all notice dialogs have in common
        "notice_group"      : "dialog_group_notice",
        // css class which all error dialogs have in common
        "error_group"       : "dialog_group_error",
        // class to set when hiding 
        "hide"              : "dialog_hide",
        // if an error is catched and no dialog matches, show this dialog id (prefix is auto added) null = disabled
        "error_dialog"      : "default_error",
        // if a notice is catched and no dialog matches, show this dialog id (prefix is auto added) null = disabled
        "notice_dialog"     : null,
        // which custom event to bind for errors
        "bind_error"        : "error.sputnikPlayer",
        // which custom event to bind for notices
        "bind_notice"       : "notice.sputnikPlayer"
    };

    // define jQuery method
    $.fn.sputnikDialog = function(options) {

        // make sure all matched elements are being processed
        this.each(function(el) {

            // saving options on each element
            el = $(this);
            if(typeof(options) == "undefined") options = {};
            if (options && typeof(options) == 'object') {
                options = $.extend({}, defaults, el.data('sputnikDialog:options'), options);
                el.data('sputnikDialog:options', options);
            }

            // errors from sputnikPlayer plugin
            el.bind(el.data('sputnikDialog:options').bind_error, function(event, data) {
                if (typeof(handlers["error"+toCamelCase(data.name)]) == "function") {
                    handlers["error"+toCamelCase(data.name)](data);
                } else {
                    handlers["error"](data);
                }
            });

            // notices from sputnikPlayer plugin
            el.bind(el.data('sputnikDialog:options').bind_notice, function(event, data) {
                if (typeof(handlers["notice"+toCamelCase(data.name)]) == "function") {
                    handlers["notice"+toCamelCase(data.name)](data);
                } else {
                    handlers["notice"](data);
                }
            });

            // handler functions for errors and notices
            // if an error called "foo_bar" is catched, handlers.errorFooBar will be called if exists
            // default if function is not defined is handlers.error, same system for notices
            var handlers = {};

            // default error handler
            handlers.error = function(data) {
                var prefix = el.data("sputnikDialog:options").prefix;
                var group = el.data("sputnikDialog:options").group;
                var error_group = el.data("sputnikDialog:options").error_group;
                var hide = el.data("sputnikDialog:options").hide;
                var dialog = el.data("sputnikDialog:options").error_dialog;
                
                if ($("."+prefix+"error_"+data.name).length) {
                    $("."+group).addClass(hide);
                    $("."+error_group).addClass(hide);
                    $("."+prefix+"error_"+data.name+",."+prefix+"error")
                    	.not(".not-"+prefix+"error_"+data.name)
                    	.trigger("update.sputnikDialog", data)
                        .removeClass(hide);
                } else if (dialog != null) {
                    $("."+group).addClass(hide);
                    $("."+error_group).addClass(hide);
                    $("."+prefix+dialog+",."+prefix+"error").trigger("update.sputnikDialog", data)
                        .removeClass(hide);
                }
            };

            // default notice handler
            handlers.notice = function(data) {
                var prefix = el.data("sputnikDialog:options").prefix;
                var group = el.data("sputnikDialog:options").group;
                var notice_group = el.data("sputnikDialog:options").notice_group;
                var hide = el.data("sputnikDialog:options").hide;
                var dialog = el.data("sputnikDialog:options").notice_dialog;

                if ($("."+prefix+"notice_"+data.name+",."+prefix+"notice").length) {
                    $("."+group).addClass(hide);
                    $("."+notice_group).addClass(hide);
                    $("."+prefix+"notice_"+data.name+",."+prefix+"notice")
                    	.not(".not-"+prefix+"notice_"+data.name)
                    	.trigger("update.sputnikDialog", data)
                        .removeClass(hide);
                } else if (dialog != null) {
                    $("."+group).addClass(hide);
                    $("."+notice_group).addClass(hide);
                    $("."+prefix+dialog+",."+prefix+"notice").trigger("update.sputnikDialog", data)
                        .removeClass(hide);
                }
            };
        });
        
        // helper function for translating strings to camelCase
        function toCamelCase(str) {
            str = str.replace(/(\_[a-z])/g, function($1){return $1.toUpperCase().replace('_','');});
            return str.substr(0,1).toUpperCase() + str.substr(1);
        }

        // use this debug function internally and you don't have to remove console.logs
        // before publishing changes
        function debug(arg) {
            if (typeof(console) != "undefined" && typeof(console.log) == "function") {
                console.log(arg);
            }
        }

        // always return this, so jquery chaining continue to work
        return this;
    };

})(jQuery);

