/*
* ProgressBar v. 1.0.0
* 2012-11-25
*
* jQuery плагин для отображения прогресс-бара
*
* События:
* onSuccess(data) - задача успешно завершена
* onError(data) - случилась ошибка
* onRequestComplete - запрос к серверу завершен
* onRequestSuccess - запрос к серверу завершен успешно
* onRequestError - запрос к серверу завершен с ошибкой
*
*/
(function($) {
var
_options = {},
_defaults = {
url: '',
pid: '', //если pid указан то он присоединяется к url по правилу: url/pid
max: 0,
value: 0,
text: '',
form: 'progress', //внешний вид прогресс-бара (прогресс-бар, заполняющийся по мере выполнения задачи 'progress', прогресс-бар без индикации процесса выполнения 'load')
interval: 1000, //интервал запроса к серверу в миллисекундах
disabled: false, //первоначальное состояние прогресс-бара
typeRequest: 'GET', //тип запроса к серверу
waitRequestComplete: true, //ждать ответа от сервера и до этого времени не делать новых запросов
classProgressBar: 'progress-bar',
classProgressBarLabel: 'progress-bar-label',
classProgressBarContainer: 'progress-bar-container'
},
_getOptions = function($element) {
return $element.data('options');
},
_setOptions = function($element, option, value) {
var item = {};
item[option] = value;
$element.data('options', $.extend($element.data('options'), item));
},
_start = function($element) {
var options = _getOptions($element);
if (options.intervalId) {
return;
}
_request($element);
options.intervalId = setInterval(function() {
if (!options.request || !options.waitRequestComplete) {
_request($element);
}
}, options.interval);
_setOptions($element, 'intervalId', options.intervalId);
options.onEnable && options.onEnable();
},
_stop = function($element) {
var options = _getOptions($element);
clearInterval(options.intervalId);
_setOptions($element, 'intervalId', 0);
options.onDisable && options.onDisable();
},
_render = function($element) {
var
options = _getOptions($element),
$bar = $('
').addClass(options.classProgressBar),
$label = $('
').addClass(options.classProgressBarLabel).html(options.text);
switch (options.form) {
case 'progress':
$bar.width(options.value / options.max * $element.width());
$element.empty().append($bar, $label);
break;
case 'load':
$bar.width($element.width());
$element.empty().append($bar, $label);
break;
}
},
_request = function($element) {
var options = _getOptions($element);
_setOptions($element, 'request', true);
$.ajax({
url: options.url + (options.pid ? '/' + options.pid : ''),
type: options.typeRequest,
dataType: 'json',
cache: false,
complete: function() {
_setOptions($element, 'request', false);
options.onRequestComplete && options.onRequestComplete();
},
success: function(data) {
_setOptions($element, 'value', data.progress.num);
_setOptions($element, 'max', data.progress.total);
data.started_at && _setOptions($element, 'text', data.progress.message);
_render($element);
if (data.succeeded || data.failed) {
_stop($element);
data.succeeded && options.onSuccess && options.onSuccess(data);
data.failed && options.onError && options.onError(data);
}
options.onRequestSuccess && options.onRequestSuccess(data);
},
error: function(e) {
_stop($element);
options.onRequestError && options.onRequestError(e);
}
});
},
_create = function($container) {
$container.each(function() {
var
$this = $(this).data('options', $.extend({}, _options)),
options = _getOptions($this);
$this.addClass(options.classProgressBarContainer).show().html(options.text);
!options.disabled && _start($this);
});
},
//методы плагина
_methods = {
init: function(options) {
_options = {};
$.extend(_options, _defaults, options);
_create(this);
return this;
},
disable: function() {
_stop(this);
return this;
},
enable: function() {
_start(this);
return this;
},
option: function() {
return _getOptions(this);
},
value: function(value) {
if (value === undefined) {
return _getOptions(this).value;
} else {
_setOptions(this, 'value', value);
_render(this);
}
},
text: function(value) {
if (value === undefined) {
return _getOptions(this).text;
} else {
_setOptions(this, 'text', value);
_render(this);
}
}
};
$.fn.progressBar = function(method) {
if (typeof method === 'object' || !method) {
return _methods.init.apply(this, arguments);
}
if (_methods[method]) {
return _methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
}
$.error('Метод ' + method + ' не существует в jQuery.progressBar');
};
})(jQuery);