String.prototype.ucFirst = function () {
    return this.substr(0,1).toUpperCase() + this.substr(1,this.length);
};

(function($) {

    $.fn.buttonval = function(){
        if ($.browser.msie) { // ie workaround
            var label = $(this).text();
            $(this).text('');
            var value = $(this).val();
            $(this).text(label);
            return value;
        } else {
            return $(this).val();
        }
    };

    $.fn.floatval = function(){
        var value = $(this).val();

        value = value.replace(/([.,])([0-9]{0,2})$/g, '#$2');
        value = value.replace(/([.,])/g, '');
        value = value.replace(/(#)/g, '.');

        return parseFloat(value);
    };

    $.fn.idle = function(time){
        var elem = $(this);
        elem.queue(function(){
            setTimeout(function(){
                elem.dequeue();
            }, time);
        });
    };

    $.fn.disable = function() {
        return this.each(function() {
            $(this).addClass('disabled');
            $(this).attr('disabled', 'disabled');
            $(this).css('opacity', 0.7);
        });
    };

    $.fn.enable = function() {
        return this.each(function() {
            $(this).removeClass('disabled');
            $(this).removeAttr('disabled');
            $(this).css('opacity', 1);
        });
    };

    $.fn.uploading = function() {
        return this.each(function() {
            $('div.upload', this).hide();
            $('div.uploadloader', this).show();
            $(this).css('background-color', 'transparent');
        });
    };

    $.fn.stopUploading = function() {
        return this.each(function() {
            $('div.upload', this).show();
            $('div.uploadloader', this).hide();
        });
    };

    $.fn.run = function() {
        var data = this;

        for (var i in data) {
            switch (data[i].type) {
                case 'window':
                    var defaults = {
                        modal: true,
                        minHeight: 30,
                        width: 'auto',
                        position: 'center',
                        open: function() {
                            $('a:visible:first', this).focus();
                            $('input:visible:first, textarea:visible:first', this).focus();
                        }
                    }

                    var dialog = $(data[i].view);
                    var id     = dialog.attr('id');
                    var width  = dialog.css('width');

                    if (width.search(/px$/) > 0) {
                        defaults.width = width;
                    }

                    $('#' + dialog.attr('id')).dialog("destroy").remove();

                    $(data[i].view).dialog(defaults);

                    break;
                case 'close':
                    $('div.window').dialog('close');
                    break;
                case 'location':
                    location.href = data[i].location;
                    break;
                case 'hash':
                    location.hash = data[i].location;
                    break;
                case 'reload':
                    window.location.reload();
                    break;
                case 'function':
                    alert('CCP: type `function` is unsupported');
                    break;
                case 'event':
                    $(data[i].selector).trigger(data[i].event, data[i].data);
                    break;
                case 'modal':
                case 'ask':
                case 'confirm':
                case 'accept':
                case 'alert':
                case 'delete':
                    $.modal(data[i].type, data[i].message, data[i].url);
                    break;
                case 'file':
                    var file = data[i].data;
                    if (!file.valid) {
                        $('input[type="file"][name="' + file.element + '"]').each(function() {
                            var container = $(this).parent();
                            $('ul', container).remove();
                            var errors = $('<ul class="errors" />').appendTo(container);
                            for (var error in file.errors) {
                                $('<li />').html(file.errors[error]).appendTo(errors);
                            }
                        });
                    }
                    break;
            }
        }
    }



    /*
     * ajax
     */
    var ajaxDefaults = {
        dataType: 'json',
        success: function(data) {
            $(data).run();
        },
        error: function(xhr, textStatus, errorThrown) {
            alert('error: ' + textStatus + "\n" + xhr.responseText);
        }
    }

    $.ajaxSetup(ajaxDefaults);

    $('a.delete').live('click', function(e) {
        var title = $(this).attr('title');
        var result = window.confirm(title);
        if ($(this).is('.ajax') && result) {
            return false;
        } else if (result) {
            location.href = $(this).attr('href');
        } else if ($(this).is('.ajax') && !result) {
            $(this).addClass('ajax-skip');
        }
        return false;
    });

    $('form.ajax').livequery(function() {
        var form = $(this);
        form.ajaxForm($.extend({
            url: form.attr('action')
        }, ajaxDefaults));
    });

    $('div.window:not(.nonajax)').livequery(function() {
        var form = $('form', this);
        
        $('div.footer a.submit', this).click(function() {
            form.submit();
            return false;
        });
        
        form.ajaxForm($.extend({
            url: form.attr('action')
        }, ajaxDefaults));
    });

    $('a.ajax').live('click', function() {
        if ($(this).is('.ajax-skip')) {
            $(this).removeClass('ajax-skip');
            return false;
        }
        $.ajax({
            type: 'get',
            url: $(this).attr('href')
        });
        return false;
    });

    /*
     * close jquery UI dialog window
     */
    $('div.window a.close').live('click', function() {
        $(this).closest('div.window').dialog('close');
        return false;
    });

})(jQuery);

