3033 lines
62 KiB
JavaScript
3033 lines
62 KiB
JavaScript
|
/*
|
||
|
Accordion Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.accordion = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'accordion', {});
|
||
|
$.data(this, 'accordion', Accordion(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Accordion(el, options)
|
||
|
{
|
||
|
return new Accordion.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Accordion = Accordion;
|
||
|
$.Accordion.NAME = 'accordion';
|
||
|
$.Accordion.VERSION = '1.0';
|
||
|
$.Accordion.opts = {
|
||
|
|
||
|
scroll: false,
|
||
|
collapse: true,
|
||
|
toggle: true,
|
||
|
titleClass: '.accordion-title',
|
||
|
panelClass: '.accordion-panel'
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Accordion.fn = $.Accordion.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.build();
|
||
|
|
||
|
if (this.opts.collapse)
|
||
|
{
|
||
|
this.closeAll();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.openAll();
|
||
|
}
|
||
|
|
||
|
this.loadFromHash();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Accordion.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Accordion.NAME || namespace == $.Accordion.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
getTitles: function()
|
||
|
{
|
||
|
this.titles = this.$element.find(this.opts.titleClass);
|
||
|
this.titles.append($('<span />').addClass('accordion-toggle'));
|
||
|
this.titles.each(function()
|
||
|
{
|
||
|
var $el = $(this);
|
||
|
$el.attr('rel', $el.attr('href'));
|
||
|
});
|
||
|
|
||
|
},
|
||
|
getPanels: function()
|
||
|
{
|
||
|
this.panels = this.$element.find(this.opts.panelClass);
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.getTitles();
|
||
|
this.getPanels();
|
||
|
|
||
|
this.titles.on('click', $.proxy(this.toggle, this));
|
||
|
},
|
||
|
loadFromHash: function()
|
||
|
{
|
||
|
if (top.location.hash === '') return;
|
||
|
if (!this.opts.scroll) return;
|
||
|
if (this.$element.find('[rel=' + top.location.hash +']').size() === 0) return;
|
||
|
|
||
|
this.open(top.location.hash);
|
||
|
this.scrollTo(top.location.hash);
|
||
|
},
|
||
|
toggle: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
e.stopPropagation();
|
||
|
|
||
|
var hash = $(e.target).attr('rel');
|
||
|
|
||
|
if (this.opts.toggle)
|
||
|
{
|
||
|
var $target = $(e.target);
|
||
|
var $title = $target.closest(this.opts.titleClass);
|
||
|
var opened = $title.hasClass('accordion-title-opened');
|
||
|
|
||
|
this.closeAll();
|
||
|
|
||
|
if (!opened) this.open(hash);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if ($('[rel=' + hash + ']').hasClass('accordion-title-opened'))
|
||
|
{
|
||
|
this.close(hash);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.open(hash);
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
open: function(hash)
|
||
|
{
|
||
|
this.$title = $('[rel=' + hash + ']');
|
||
|
this.$panel = $(hash);
|
||
|
|
||
|
top.location.hash = hash;
|
||
|
|
||
|
this.setStatus('open');
|
||
|
this.$panel.show();
|
||
|
|
||
|
this.setCallback('opened', this.$title, this.$panel);
|
||
|
},
|
||
|
close: function(hash)
|
||
|
{
|
||
|
this.$title = $('[rel=' + hash + ']');
|
||
|
this.$panel = $(hash);
|
||
|
|
||
|
this.setStatus('close');
|
||
|
this.$panel.hide();
|
||
|
|
||
|
this.setCallback('closed', this.$title, this.$panel);
|
||
|
},
|
||
|
setStatus: function(command)
|
||
|
{
|
||
|
var items = { toggle: this.$title.find('span.accordion-toggle'), title: this.$title, panel: this.$panel };
|
||
|
|
||
|
$.each(items, function(i, s)
|
||
|
{
|
||
|
if (command == 'close')
|
||
|
{
|
||
|
s.removeClass('accordion-' + i + '-opened').addClass('accordion-' + i + '-closed');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
s.removeClass('accordion-' + i + '-closed').addClass('accordion-' + i + '-opened');
|
||
|
}
|
||
|
});
|
||
|
},
|
||
|
openAll: function()
|
||
|
{
|
||
|
this.titles.each($.proxy(function(i, s)
|
||
|
{
|
||
|
this.open($(s).attr('rel'));
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
closeAll: function()
|
||
|
{
|
||
|
this.titles.each($.proxy(function(i, s)
|
||
|
{
|
||
|
this.close($(s).attr('rel'));
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
scrollTo: function(id)
|
||
|
{
|
||
|
$('html, body').animate(
|
||
|
{
|
||
|
scrollTop: $(id).offset().top - 50
|
||
|
|
||
|
}, 500);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.accordion', function()
|
||
|
{
|
||
|
$('[data-tools="accordion"]').accordion();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Accordion.prototype.init.prototype = Accordion.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Autocomplete Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.autocomplete = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'autocomplete', {});
|
||
|
$.data(this, 'autocomplete', Autocomplete(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Autocomplete(el, options)
|
||
|
{
|
||
|
return new Autocomplete.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Autocomplete = Autocomplete;
|
||
|
$.Autocomplete.NAME = 'autocomplete';
|
||
|
$.Autocomplete.VERSION = '1.0';
|
||
|
$.Autocomplete.opts = {
|
||
|
|
||
|
url: false,
|
||
|
min: 2,
|
||
|
set: 'value' // value or id
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Autocomplete.fn = $.Autocomplete.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Autocomplete.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Autocomplete.NAME || namespace == $.Autocomplete.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.result = $('<ul class="autocomplete">').hide();
|
||
|
|
||
|
this.pos = this.$element.offset();
|
||
|
this.elementHeight = this.$element.innerHeight();
|
||
|
|
||
|
$('body').append(this.result);
|
||
|
|
||
|
this.placement = (($(document).height() - (this.pos.top + this.elementHeight)) < this.result.height()) ? 'top' : 'bottom';
|
||
|
$(document).on('click', $.proxy(this.hide, this));
|
||
|
|
||
|
this.$element.on('keyup', $.proxy(function(e)
|
||
|
{
|
||
|
var value = this.$element.val();
|
||
|
if (value.length >= this.opts.min)
|
||
|
{
|
||
|
this.$element.addClass('autocomplete-in');
|
||
|
this.result.addClass('autocomplete-open');
|
||
|
|
||
|
this.listen(e);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.hide();
|
||
|
}
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
lookup: function()
|
||
|
{
|
||
|
$.ajax({
|
||
|
url: this.opts.url,
|
||
|
type: 'post',
|
||
|
data: this.$element.attr('name') + '=' + this.$element.val(),
|
||
|
success: $.proxy(function(json)
|
||
|
{
|
||
|
var data = $.parseJSON(json);
|
||
|
|
||
|
this.result.html('');
|
||
|
|
||
|
$.each(data, $.proxy(function(i,s)
|
||
|
{
|
||
|
var li = $('<li>');
|
||
|
var a = $('<a href="#" rel="' + s.id + '">').html(s.value).on('click', $.proxy(this.set, this));
|
||
|
|
||
|
li.append(a);
|
||
|
this.result.append(li);
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
var top = (this.placement === 'top') ? (this.pos.top - this.result.height() - this.elementHeight) : (this.pos.top + this.elementHeight);
|
||
|
|
||
|
this.result.css({ top: top + 'px', left: this.pos.left + 'px' });
|
||
|
this.result.show();
|
||
|
this.active = false;
|
||
|
|
||
|
}, this)
|
||
|
});
|
||
|
|
||
|
},
|
||
|
listen: function(e)
|
||
|
{
|
||
|
if (!this.$element.hasClass('autocomplete-in')) return;
|
||
|
|
||
|
e.stopPropagation();
|
||
|
e.preventDefault();
|
||
|
|
||
|
switch(e.keyCode)
|
||
|
{
|
||
|
case 40: // down arrow
|
||
|
this.select('next');
|
||
|
break;
|
||
|
|
||
|
case 38: // up arrow
|
||
|
this.select('prev');
|
||
|
break;
|
||
|
|
||
|
case 13: // enter
|
||
|
this.set();
|
||
|
break;
|
||
|
|
||
|
case 27: // escape
|
||
|
this.hide();
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
this.lookup();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
},
|
||
|
select: function(type)
|
||
|
{
|
||
|
var $links = this.result.find('a');
|
||
|
var size = $links.size();
|
||
|
|
||
|
var $active = this.result.find('a.active');
|
||
|
$active.removeClass('active');
|
||
|
|
||
|
var $item = (type === 'next') ? $active.parent().next().children('a') : $active.parent().prev().children('a');
|
||
|
if ($item.size() === 0)
|
||
|
{
|
||
|
$item = (type === 'next') ? $links.eq(0) : $links.eq(size-1);
|
||
|
}
|
||
|
|
||
|
$item.addClass('active');
|
||
|
this.active = $item;
|
||
|
},
|
||
|
set: function(e)
|
||
|
{
|
||
|
var $el = $(this.active);
|
||
|
if (e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
$el = $(e.target);
|
||
|
}
|
||
|
|
||
|
var id = $el.attr('rel');
|
||
|
var value = $el.html();
|
||
|
|
||
|
if (this.opts.set == 'value')
|
||
|
{
|
||
|
this.$element.val(value);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$element.val(id);
|
||
|
}
|
||
|
|
||
|
this.setCallback('set', id, value);
|
||
|
|
||
|
|
||
|
this.hide();
|
||
|
},
|
||
|
hide: function(e)
|
||
|
{
|
||
|
if (e && ($(e.target).hasClass('autocomplete-in') || $(e.target).hasClass('autocomplete-open') || $(e.target).parents().hasClass('autocomplete-open')))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.$element.removeClass('autocomplete-in');
|
||
|
this.result.removeClass('autocomplete-open');
|
||
|
this.result.hide();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.autocomplete', function()
|
||
|
{
|
||
|
$('[data-tools="autocomplete"]').autocomplete();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Autocomplete.prototype.init.prototype = Autocomplete.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Buttons Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.buttons = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'buttons', {});
|
||
|
$.data(this, 'buttons', Buttons(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Buttons(el, options)
|
||
|
{
|
||
|
return new Buttons.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Buttons = Buttons;
|
||
|
$.Buttons.NAME = 'buttons';
|
||
|
$.Buttons.VERSION = '1.0';
|
||
|
$.Buttons.opts = {
|
||
|
|
||
|
className: 'btn',
|
||
|
activeClassName: 'btn-active',
|
||
|
target: false,
|
||
|
type: 'switch' // switch, toggle, segmented
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Buttons.fn = $.Buttons.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.buttons = this.getButtons();
|
||
|
this.value = this.getValue();
|
||
|
|
||
|
this.buttons.each($.proxy(function(i,s)
|
||
|
{
|
||
|
var $s = $(s);
|
||
|
|
||
|
this.setDefault($s);
|
||
|
|
||
|
$s.click($.proxy(function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
if (this.opts.type === 'segmented') this.setSegmented($s);
|
||
|
else if (this.opts.type === 'toggle') this.setToggle($s);
|
||
|
else this.setBasic($s);
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Buttons.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
getButtons: function()
|
||
|
{
|
||
|
return (this.opts.type === 'toggle') ? this.$element : this.$element.find('.' + this.opts.className);
|
||
|
},
|
||
|
getValue: function()
|
||
|
{
|
||
|
return (this.opts.type === 'segmented') ? $(this.opts.target).val().split(',') : $(this.opts.target).val();
|
||
|
},
|
||
|
setDefault: function($el)
|
||
|
{
|
||
|
if (this.opts.type === 'segmented' && $.inArray($el.val(), this.value) !== -1)
|
||
|
{
|
||
|
this.setActive($el);
|
||
|
}
|
||
|
else if ((this.opts.type === 'toggle' && this.value === 1) || this.value === $el.val())
|
||
|
{
|
||
|
this.setActive($el);
|
||
|
}
|
||
|
},
|
||
|
setBasic: function($el)
|
||
|
{
|
||
|
this.setInActive(this.buttons);
|
||
|
this.setActive($el);
|
||
|
$(this.opts.target).val($el.val());
|
||
|
},
|
||
|
setSegmented: function($el)
|
||
|
{
|
||
|
var $target = $(this.opts.target);
|
||
|
this.value = $target.val().split(',');
|
||
|
|
||
|
if (!$el.hasClass(this.opts.activeClassName))
|
||
|
{
|
||
|
this.setActive($el);
|
||
|
this.value.push($el.val());
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.setInActive($el);
|
||
|
this.value.splice(this.value.indexOf($el.val()), 1);
|
||
|
}
|
||
|
|
||
|
$target.val(this.value.join(',').replace(/^,/, ''));
|
||
|
},
|
||
|
setToggle: function($el)
|
||
|
{
|
||
|
if ($el.hasClass(this.opts.activeClassName))
|
||
|
{
|
||
|
this.setInActive($el);
|
||
|
$(this.opts.target).val(0);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.setActive($el);
|
||
|
$(this.opts.target).val(1);
|
||
|
}
|
||
|
},
|
||
|
setActive: function($el)
|
||
|
{
|
||
|
$el.addClass(this.opts.activeClassName);
|
||
|
},
|
||
|
setInActive: function($el)
|
||
|
{
|
||
|
$el.removeClass(this.opts.activeClassName);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.buttons', function()
|
||
|
{
|
||
|
$('[data-tools="buttons"]').buttons();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Buttons.prototype.init.prototype = Buttons.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
CheckAll Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.checkAll = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'checkAll', {});
|
||
|
$.data(this, 'checkAll', CheckAll(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function CheckAll(el, options)
|
||
|
{
|
||
|
return new CheckAll.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.CheckAll = CheckAll;
|
||
|
$.CheckAll.opts = {
|
||
|
|
||
|
classname: false,
|
||
|
parent: false,
|
||
|
highlight: 'highlight',
|
||
|
target: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
CheckAll.fn = $.CheckAll.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.$elements = $('.' + this.opts.classname);
|
||
|
this.$target = $(this.opts.target);
|
||
|
|
||
|
// load
|
||
|
this.$element.on('click', $.proxy(this.load, this));
|
||
|
|
||
|
this.setter = (this.opts.target) ? this.$target.val().split(',') : [];
|
||
|
this.$elements.each($.proxy(this.setOnStart, this));
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.CheckAll.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
load: function()
|
||
|
{
|
||
|
if (this.$element.prop('checked'))
|
||
|
{
|
||
|
this.$elements.prop('checked', true);
|
||
|
|
||
|
if (this.opts.parent || this.opts.target)
|
||
|
{
|
||
|
this.$elements.each($.proxy(function(i,s)
|
||
|
{
|
||
|
var $s = $(s);
|
||
|
this.setHighlight($s);
|
||
|
this.setValue($s.val());
|
||
|
|
||
|
}, this));
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$elements.prop('checked', false);
|
||
|
if (this.opts.parent) this.$elements.each($.proxy(this.removeHighlight, this));
|
||
|
if (this.opts.target) this.$target.val('');
|
||
|
}
|
||
|
},
|
||
|
setOnStart: function(i, el)
|
||
|
{
|
||
|
var $el = $(el);
|
||
|
if (this.$element.prop('checked') || (this.setter && ($.inArray($el.val(), this.setter) !== -1)))
|
||
|
{
|
||
|
$el.prop('checked', true);
|
||
|
this.setHighlight($el);
|
||
|
}
|
||
|
|
||
|
$el.on('click', $.proxy(function()
|
||
|
{
|
||
|
var checkedSize = this.$elements.filter(':checked').size();
|
||
|
|
||
|
if ($el.prop('checked'))
|
||
|
{
|
||
|
this.setValue($el.val());
|
||
|
this.setHighlight($el);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.removeValue($el.val());
|
||
|
this.removeHighlight($el);
|
||
|
}
|
||
|
|
||
|
var prop = (checkedSize !== this.$elements.size()) ? false : true;
|
||
|
this.$element.prop('checked', prop);
|
||
|
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
setHighlight: function($el)
|
||
|
{
|
||
|
if (!this.opts.parent) return;
|
||
|
|
||
|
$el.closest(this.opts.parent).addClass(this.opts.highlight);
|
||
|
},
|
||
|
removeHighlight: function(i, $el)
|
||
|
{
|
||
|
if (!this.opts.parent) return;
|
||
|
|
||
|
$($el).closest(this.opts.parent).removeClass(this.opts.highlight);
|
||
|
},
|
||
|
setValue: function(value)
|
||
|
{
|
||
|
if (!this.opts.target) return;
|
||
|
|
||
|
var str = this.$target.val();
|
||
|
var arr = str.split(',');
|
||
|
arr.push(value);
|
||
|
|
||
|
if (str === '')
|
||
|
{
|
||
|
arr = [value];
|
||
|
}
|
||
|
|
||
|
this.$target.val(arr.join(','));
|
||
|
},
|
||
|
removeValue: function(value)
|
||
|
{
|
||
|
if (!this.opts.target) return;
|
||
|
|
||
|
var arr = this.$target.val().split(',');
|
||
|
|
||
|
var index = arr.indexOf(value);
|
||
|
arr.splice(index, 1);
|
||
|
|
||
|
this.$target.val(arr.join(','));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
$(window).on('load.tools.buttons', function()
|
||
|
{
|
||
|
$('[data-tools="check-all"]').checkAll();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
CheckAll.prototype.init.prototype = CheckAll.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Dropdown Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
|
||
|
// Plugin
|
||
|
$.fn.dropdown = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'dropdown', {});
|
||
|
$.data(this, 'dropdown', Dropdown(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
// Initialization
|
||
|
function Dropdown(el, options)
|
||
|
{
|
||
|
return new Dropdown.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Dropdown = Dropdown;
|
||
|
$.Dropdown.NAME = 'dropdown';
|
||
|
$.Dropdown.VERSION = '1.0';
|
||
|
$.Dropdown.opts = {
|
||
|
|
||
|
target: false,
|
||
|
targetClose: false,
|
||
|
height: false, // number
|
||
|
width: false // number
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Dropdown.fn = $.Dropdown.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Dropdown.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Dropdown.NAME || namespace == $.Dropdown.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.$dropdown = $(this.opts.target);
|
||
|
this.$dropdown.hide();
|
||
|
|
||
|
this.$caret = $('<b class="caret"></b>');
|
||
|
this.$element.append(this.$caret);
|
||
|
|
||
|
this.setCaretUp();
|
||
|
this.preventBodyScroll();
|
||
|
|
||
|
this.$element.click($.proxy(this.toggle, this));
|
||
|
},
|
||
|
setCaretUp: function()
|
||
|
{
|
||
|
var height = this.$element.offset().top + this.$element.innerHeight() + this.$dropdown.innerHeight();
|
||
|
if ($(document).height() > height) return;
|
||
|
|
||
|
this.$caret.addClass('caret-up');
|
||
|
},
|
||
|
toggle: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
if (this.$element.hasClass('dropdown-in'))
|
||
|
{
|
||
|
this.hide();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.show();
|
||
|
}
|
||
|
},
|
||
|
getPlacement: function(height)
|
||
|
{
|
||
|
return ($(document).height() < height) ? 'top' : 'bottom';
|
||
|
},
|
||
|
getPosition: function()
|
||
|
{
|
||
|
return (this.$element.closest('.navigation-fixed').size() !== 0) ? 'fixed' : 'absolute';
|
||
|
},
|
||
|
setPosition: function()
|
||
|
{
|
||
|
var pos = this.$element.position();
|
||
|
var elementHeight = this.$element.innerHeight();
|
||
|
var elementWidth = this.$element.innerWidth();
|
||
|
var height = this.$dropdown.innerHeight();
|
||
|
var width = this.$dropdown.innerWidth();
|
||
|
|
||
|
var position = this.getPosition();
|
||
|
var placement = this.getPlacement(pos.top + height + elementHeight);
|
||
|
|
||
|
var leftFix = 0;
|
||
|
if ($(window).width() < (pos.left + width))
|
||
|
{
|
||
|
leftFix = (width - elementWidth);
|
||
|
}
|
||
|
|
||
|
var top;
|
||
|
var left = pos.left - leftFix;
|
||
|
if (placement == 'bottom')
|
||
|
{
|
||
|
this.$caret.removeClass('caret-up');
|
||
|
top = (position == 'fixed') ? elementHeight : pos.top + elementHeight;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$caret.addClass('caret-up');
|
||
|
top = (position == 'fixed') ? height : pos.top - height;
|
||
|
}
|
||
|
|
||
|
this.$dropdown.css({ position: position, top: top + 'px', left: left + 'px' });
|
||
|
},
|
||
|
show: function()
|
||
|
{
|
||
|
$('.dropdown-in').removeClass('dropdown-in');
|
||
|
$('.dropdown').removeClass('dropdown-open').hide();
|
||
|
|
||
|
if (this.opts.height) this.$dropdown.css('min-height', this.opts.height + 'px');
|
||
|
if (this.opts.width) this.$dropdown.width(this.opts.width);
|
||
|
|
||
|
this.setPosition();
|
||
|
|
||
|
this.$dropdown.addClass('dropdown-open').show();
|
||
|
this.$element.addClass('dropdown-in');
|
||
|
|
||
|
$(document).on('scroll.tools.dropdown', $.proxy(this.setPosition, this));
|
||
|
$(window).on('resize.tools.dropdown', $.proxy(this.setPosition, this));
|
||
|
$(document).on('click.tools.dropdown touchstart.tools.dropdown', $.proxy(this.hide, this));
|
||
|
|
||
|
if (this.opts.targetClose)
|
||
|
{
|
||
|
$(this.opts.targetClose).on('click.tools.dropdown', $.proxy(function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
this.hide(false);
|
||
|
|
||
|
}, this));
|
||
|
}
|
||
|
|
||
|
$(document).on('keydown.tools.dropdown', $.proxy(function(e)
|
||
|
{
|
||
|
// esc
|
||
|
if (e.which === 27) this.hide();
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
this.setCallback('opened', this.$dropdown, this.$element);
|
||
|
|
||
|
},
|
||
|
preventBodyScroll: function()
|
||
|
{
|
||
|
this.$dropdown.on('mouseover', function() { $('html').css('overflow', 'hidden'); });
|
||
|
this.$dropdown.on('mouseout', function() { $('html').css('overflow', ''); });
|
||
|
},
|
||
|
hide: function(e)
|
||
|
{
|
||
|
if (e)
|
||
|
{
|
||
|
e = e.originalEvent || e;
|
||
|
|
||
|
var $target = $(e.target);
|
||
|
if ($target.hasClass('caret') || $target.hasClass('dropdown-in') || $target.closest('.dropdown-open').size() !== 0)
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.$dropdown.removeClass('dropdown-open').hide();
|
||
|
this.$element.removeClass('dropdown-in');
|
||
|
|
||
|
$(document).off('.tools.dropdown');
|
||
|
$(window).off('.tools.dropdown');
|
||
|
|
||
|
this.setCallback('closed', this.$dropdown, this.$element);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.dropdown', function()
|
||
|
{
|
||
|
$('[data-tools="dropdown"]').dropdown();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Dropdown.prototype.init.prototype = Dropdown.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
FilterBox Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.filterbox = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'filterbox', {});
|
||
|
$.data(this, 'filterbox', Filterbox(this, options));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Filterbox(el, options)
|
||
|
{
|
||
|
return new Filterbox.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Filterbox = Filterbox;
|
||
|
$.Filterbox.NAME = 'filterbox';
|
||
|
$.Filterbox.VERSION = '1.0';
|
||
|
$.Filterbox.opts = {
|
||
|
|
||
|
// settings
|
||
|
placeholder: false
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Filterbox.fn = $.Filterbox.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
|
||
|
this.loadOptions(options);
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Filterbox.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Filterbox.NAME || namespace == $.Filterbox.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.$sourceBox = $('<div class="filterbox" />');
|
||
|
this.$sourceSelect = $('<span class="filterbox-toggle" />');
|
||
|
this.$sourceLayer = $('<ul class="filterbox-list hide" />');
|
||
|
this.$source = $('<input type="text" id="' + this.$element.attr('id') + '-input" class="' + this.$element.attr('class') + '" />');
|
||
|
|
||
|
this.$sourceBox.append(this.$source);
|
||
|
this.$sourceBox.append(this.$sourceSelect);
|
||
|
this.$sourceBox.append(this.$sourceLayer);
|
||
|
|
||
|
this.setPlaceholder();
|
||
|
|
||
|
this.$element.hide().after(this.$sourceBox);
|
||
|
this.$element.find('option').each($.proxy(this.buildListItemsFromOptions, this));
|
||
|
|
||
|
this.$source.on('keyup', $.proxy(this.clearSelected, this));
|
||
|
this.$sourceSelect.on('click', $.proxy(this.load, this));
|
||
|
|
||
|
this.preventBodyScroll();
|
||
|
|
||
|
},
|
||
|
load: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
if (this.$sourceLayer.hasClass('open'))
|
||
|
{
|
||
|
this.close();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var value = this.$element.val();
|
||
|
|
||
|
this.$sourceLayer.addClass('open').show();
|
||
|
|
||
|
var items = this.$sourceLayer.find('li').removeClass('active');
|
||
|
this.setSelectedItem(items, value);
|
||
|
|
||
|
$(document).on('click.tools.filterbox', $.proxy(this.close, this));
|
||
|
$(document).on('keydown.tools.filterbox', $.proxy(function(e)
|
||
|
{
|
||
|
var key = e.which;
|
||
|
var $el;
|
||
|
var item;
|
||
|
|
||
|
if (key === 38) // up
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
if (items.hasClass('active'))
|
||
|
{
|
||
|
item = items.filter('li.active');
|
||
|
item.removeClass('active');
|
||
|
|
||
|
var prev = item.prev();
|
||
|
$el = (prev.size() !== 0) ? $el = prev : items.last();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$el = items.last();
|
||
|
}
|
||
|
|
||
|
$el.addClass('active');
|
||
|
this.setScrollTop($el);
|
||
|
}
|
||
|
else if (key === 40) // down
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
if (items.hasClass('active'))
|
||
|
{
|
||
|
item = items.filter('li.active');
|
||
|
item.removeClass('active');
|
||
|
|
||
|
var next = item.next();
|
||
|
$el = (next.size() !== 0) ? next : items.first();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$el = items.first();
|
||
|
}
|
||
|
|
||
|
$el.addClass('active');
|
||
|
this.setScrollTop($el);
|
||
|
|
||
|
}
|
||
|
else if (key === 13) // enter
|
||
|
{
|
||
|
if (!items.hasClass('active')) return;
|
||
|
|
||
|
item = items.filter('li.active');
|
||
|
this.onItemClick(e, item);
|
||
|
}
|
||
|
else if (key === 27) // esc
|
||
|
{
|
||
|
this.close();
|
||
|
}
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
},
|
||
|
clearSelected: function()
|
||
|
{
|
||
|
if (this.$source.val().length === 0) this.$element.val(0);
|
||
|
},
|
||
|
setSelectedItem: function(items, value)
|
||
|
{
|
||
|
var selectEl = items.filter('[rel=' + value + ']');
|
||
|
if (selectEl.size() === 0)
|
||
|
{
|
||
|
selectEl = false;
|
||
|
|
||
|
// if user typed value
|
||
|
var sourceValue = this.$source.val();
|
||
|
$.each(items, function(i,s)
|
||
|
{
|
||
|
var $s = $(s);
|
||
|
if ($s.text() == sourceValue)
|
||
|
{
|
||
|
selectEl = $s;
|
||
|
}
|
||
|
});
|
||
|
|
||
|
if (selectEl === false) return;
|
||
|
}
|
||
|
|
||
|
selectEl.addClass('active');
|
||
|
this.setScrollTop(selectEl);
|
||
|
},
|
||
|
setScrollTop: function($el)
|
||
|
{
|
||
|
this.$sourceLayer.scrollTop(this.$sourceLayer.scrollTop() + $el.position().top - 40);
|
||
|
},
|
||
|
buildListItemsFromOptions: function(i,s)
|
||
|
{
|
||
|
var $el = $(s);
|
||
|
var val = $el.val();
|
||
|
if (val === 0) return;
|
||
|
|
||
|
var item = $('<li />');
|
||
|
|
||
|
item.attr('rel', val).text($el.html());
|
||
|
item.on('click', $.proxy(this.onItemClick, this));
|
||
|
|
||
|
this.$sourceLayer.append(item);
|
||
|
},
|
||
|
onItemClick: function(e, item)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
var $el = $(item || e.target);
|
||
|
var rel = $el.attr('rel');
|
||
|
var text = $el.text();
|
||
|
|
||
|
this.$source.val(text);
|
||
|
this.$element.val(rel);
|
||
|
|
||
|
this.close();
|
||
|
|
||
|
this.setCallback('select', { id: rel, value: text });
|
||
|
},
|
||
|
preventBodyScroll: function()
|
||
|
{
|
||
|
this.$sourceLayer.on('mouseover', function() { $('html').css('overflow', 'hidden'); });
|
||
|
this.$sourceLayer.on('mouseout', function() { $('html').css('overflow', ''); });
|
||
|
},
|
||
|
setPlaceholder: function()
|
||
|
{
|
||
|
if (!this.opts.placeholder) return;
|
||
|
this.$source.attr('placeholder', this.opts.placeholder);
|
||
|
},
|
||
|
close: function(e)
|
||
|
{
|
||
|
if (e && ($(e.target).hasClass('filterbox-toggle') || $(e.target).closest('div.filterbox').size() == 1))
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.$sourceLayer.removeClass('open').hide();
|
||
|
$(document).off('.tools.filterbox');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.filterbox', function()
|
||
|
{
|
||
|
$('[data-tools="filterbox"]').filterbox();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Filterbox.prototype.init.prototype = Filterbox.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Infinity Scroll Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.infinityScroll = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'infinity-scroll', {});
|
||
|
$.data(this, 'infinity-scroll', InfinityScroll(this, options));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function InfinityScroll(el, options)
|
||
|
{
|
||
|
return new InfinityScroll.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.InfinityScroll = InfinityScroll;
|
||
|
$.InfinityScroll.NAME = 'infinity-scroll';
|
||
|
$.InfinityScroll.VERSION = '1.0';
|
||
|
$.InfinityScroll.opts = {
|
||
|
|
||
|
url: false,
|
||
|
offset: 0,
|
||
|
limit: 20,
|
||
|
tolerance: 50,
|
||
|
pagination: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
InfinityScroll.fn = $.InfinityScroll.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.hidePagination();
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.InfinityScroll.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.InfinityScroll.NAME || namespace == $.InfinityScroll.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
$(window).on('DOMContentLoaded.tools.infinite-scroll load.tools.infinite-scroll resize.tools.infinite-scroll scroll.tools.infinite-scroll', $.proxy(function()
|
||
|
{
|
||
|
var $last = this.$element.children().last();
|
||
|
if (this.isElementInViewport($last[0]))
|
||
|
{
|
||
|
this.getData();
|
||
|
}
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
getData: function()
|
||
|
{
|
||
|
$.ajax({
|
||
|
url: this.opts.url,
|
||
|
type: 'post',
|
||
|
data: 'limit=' + this.opts.limit + '&offset=' + this.opts.offset,
|
||
|
success: $.proxy(function(data)
|
||
|
{
|
||
|
if (data === '')
|
||
|
{
|
||
|
$(window).off('.tools.infinite-scroll');
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
this.opts.offset = this.opts.offset + this.opts.limit;
|
||
|
this.$element.append(data);
|
||
|
|
||
|
this.setCallback('loaded', data);
|
||
|
|
||
|
}, this)
|
||
|
});
|
||
|
},
|
||
|
hidePagination: function()
|
||
|
{
|
||
|
if (!this.opts.pagination) return;
|
||
|
|
||
|
$(this.opts.pagination).hide();
|
||
|
},
|
||
|
isElementInViewport: function(el)
|
||
|
{
|
||
|
var rect = el.getBoundingClientRect();
|
||
|
return (
|
||
|
rect.top >= 0 &&
|
||
|
rect.left >= 0 &&
|
||
|
rect.bottom <= $(window).height() + this.opts.tolerance &&
|
||
|
rect.right <= $(window).width()
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.infinity-scroll', function()
|
||
|
{
|
||
|
$('[data-tools="infinity-scroll"]').infinityScroll();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
InfinityScroll.prototype.init.prototype = InfinityScroll.prototype;
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
|
||
|
/*
|
||
|
Livesearch Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.livesearch = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'livesearch', {});
|
||
|
$.data(this, 'livesearch', Livesearch(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Livesearch(el, options)
|
||
|
{
|
||
|
return new Livesearch.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Livesearch = Livesearch;
|
||
|
$.Livesearch.NAME = 'livesearch';
|
||
|
$.Livesearch.VERSION = '1.0';
|
||
|
$.Livesearch.opts = {
|
||
|
|
||
|
// settings
|
||
|
url: false,
|
||
|
target: false,
|
||
|
min: 2,
|
||
|
params: false,
|
||
|
appendForms: false
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Livesearch.fn = $.Livesearch.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Livesearch.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Livesearch.NAME || namespace == $.Livesearch.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.$box = $('<span class="livesearch-box" />');
|
||
|
|
||
|
this.$element.after(this.$box);
|
||
|
this.$box.append(this.$element);
|
||
|
|
||
|
this.$element.off('keyup.tools.livesearch');
|
||
|
this.$element.on('keyup.tools.livesearch', $.proxy(this.load, this));
|
||
|
|
||
|
this.$icon = $('<span class="livesearch-icon" />');
|
||
|
this.$box.append(this.$icon);
|
||
|
|
||
|
this.$close = $('<span class="close" />').hide();
|
||
|
this.$box.append(this.$close);
|
||
|
|
||
|
this.$close.off('click.tools.livesearch');
|
||
|
this.$close.on('click.tools.livesearch', $.proxy(function()
|
||
|
{
|
||
|
this.search();
|
||
|
this.$element.val('').focus();
|
||
|
this.$close.hide();
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
},
|
||
|
toggleClose: function(length)
|
||
|
{
|
||
|
if (length === 0) this.$close.hide();
|
||
|
else this.$close.show();
|
||
|
},
|
||
|
load: function()
|
||
|
{
|
||
|
var value = this.$element.val();
|
||
|
var data = '';
|
||
|
|
||
|
if (value.length > this.opts.min)
|
||
|
{
|
||
|
var name = 'q';
|
||
|
if (typeof this.$element.attr('name') != 'undefined') name = this.$element.attr('name');
|
||
|
|
||
|
data += '&' + name + '=' + value;
|
||
|
data = this.appendForms(data);
|
||
|
|
||
|
var str = '';
|
||
|
if (this.opts.params)
|
||
|
{
|
||
|
this.opts.params = $.trim(this.opts.params.replace('{', '').replace('}', ''))
|
||
|
var properties = this.opts.params.split(',');
|
||
|
var obj = {};
|
||
|
$.each(properties, function(k, v)
|
||
|
{
|
||
|
var tup = v.split(':');
|
||
|
obj[$.trim(tup[0])] = $.trim(tup[1]);
|
||
|
});
|
||
|
|
||
|
str = [];
|
||
|
$.each(obj, $.proxy(function(k, v)
|
||
|
{
|
||
|
str.push(k + "=" + v);
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
str = str.join("&");
|
||
|
|
||
|
data += '&' + str;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.toggleClose(value.length);
|
||
|
this.search(data);
|
||
|
|
||
|
},
|
||
|
appendForms: function(data)
|
||
|
{
|
||
|
if (!this.opts.appendForms) return data;
|
||
|
|
||
|
$.each(this.opts.appendForms, function(i, s)
|
||
|
{
|
||
|
data += '&' + $(s).serialize();
|
||
|
});
|
||
|
|
||
|
return data;
|
||
|
},
|
||
|
search: function(data)
|
||
|
{
|
||
|
$.ajax({
|
||
|
url: this.opts.url,
|
||
|
type: 'post',
|
||
|
data: data,
|
||
|
success: $.proxy(function(result)
|
||
|
{
|
||
|
$(this.opts.target).html(result);
|
||
|
this.setCallback('result', result);
|
||
|
|
||
|
}, this)
|
||
|
});
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.livesearch', function()
|
||
|
{
|
||
|
$('[data-tools="livesearch"]').livesearch();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Livesearch.prototype.init.prototype = Livesearch.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
/*
|
||
|
Tabs Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.message = function(options)
|
||
|
{
|
||
|
var val = [];
|
||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||
|
|
||
|
if (typeof options === 'string')
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
var instance = $.data(this, 'message');
|
||
|
if (typeof instance !== 'undefined' && $.isFunction(instance[options]))
|
||
|
{
|
||
|
var methodVal = instance[options].apply(instance, args);
|
||
|
if (methodVal !== undefined && methodVal !== instance) val.push(methodVal);
|
||
|
}
|
||
|
else return $.error('No such method "' + options + '" for Message');
|
||
|
});
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
$.data(this, 'message', {});
|
||
|
$.data(this, 'message', Message(this, options));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (val.length === 0) return this;
|
||
|
else if (val.length === 1) return val[0];
|
||
|
else return val;
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Message(el, options)
|
||
|
{
|
||
|
return new Message.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Message = Message;
|
||
|
$.Message.NAME = 'message';
|
||
|
$.Message.VERSION = '1.0';
|
||
|
$.Message.opts = {
|
||
|
|
||
|
target: false,
|
||
|
delay: 10 // message delay - seconds or false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Message.fn = $.Message.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
|
||
|
this.loadOptions(options);
|
||
|
this.build();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Message.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$message[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Message.NAME || namespace == $.Message.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
|
||
|
if (!this.opts.target)
|
||
|
{
|
||
|
this.$message = this.$element;
|
||
|
this.show();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$message = $(this.opts.target);
|
||
|
|
||
|
this.$message.data('message', '');
|
||
|
this.$message.data('message', this);
|
||
|
|
||
|
this.$element.on('click', $.proxy(this.show, this));
|
||
|
}
|
||
|
},
|
||
|
show: function()
|
||
|
{
|
||
|
if (this.$message.hasClass('open'))
|
||
|
{
|
||
|
this.hide();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$('.tools-message').hide().removeClass('open');
|
||
|
this.$message.addClass('open').fadeIn('fast').on('click.tools.message', $.proxy(this.hide, this));
|
||
|
|
||
|
$(document).on('keyup.tools.message', $.proxy(this.hideHandler, this));
|
||
|
|
||
|
if (this.opts.delay)
|
||
|
{
|
||
|
setTimeout($.proxy(this.hide, this), this.opts.delay * 1000);
|
||
|
}
|
||
|
|
||
|
this.setCallback('opened');
|
||
|
},
|
||
|
hideHandler: function(e)
|
||
|
{
|
||
|
if (e.which != 27) return;
|
||
|
|
||
|
this.hide();
|
||
|
},
|
||
|
hide: function()
|
||
|
{
|
||
|
if (!this.$message.hasClass('open')) return;
|
||
|
|
||
|
this.$message.off('click.tools.message');
|
||
|
$(document).off('keyup.tools.message');
|
||
|
this.$message.fadeOut('fast', $.proxy(function()
|
||
|
{
|
||
|
this.$message.removeClass('open');
|
||
|
this.setCallback('closed');
|
||
|
|
||
|
}, this));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Constructor
|
||
|
Message.prototype.init.prototype = Message.prototype;
|
||
|
|
||
|
$(function()
|
||
|
{
|
||
|
$('[data-tools="message"]').message();
|
||
|
});
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
|
||
|
/*
|
||
|
Modal Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.modal = function(options)
|
||
|
{
|
||
|
var val = [];
|
||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||
|
|
||
|
if (typeof options === 'string')
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
var instance = $.data(this, 'modal');
|
||
|
if (typeof instance !== 'undefined' && $.isFunction(instance[options]))
|
||
|
{
|
||
|
var methodVal = instance[options].apply(instance, args);
|
||
|
if (methodVal !== undefined && methodVal !== instance) val.push(methodVal);
|
||
|
}
|
||
|
else return $.error('No such method "' + options + '" for Modal');
|
||
|
});
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
$.data(this, 'modal', {});
|
||
|
$.data(this, 'modal', Modal(this, options));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (val.length === 0) return this;
|
||
|
else if (val.length === 1) return val[0];
|
||
|
else return val;
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Modal(el, options)
|
||
|
{
|
||
|
return new Modal.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Modal = Modal;
|
||
|
$.Modal.NAME = 'modal';
|
||
|
$.Modal.VERSION = '1.0';
|
||
|
$.Modal.opts = {
|
||
|
|
||
|
title: '',
|
||
|
width: 500,
|
||
|
blur: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Modal.fn = $.Modal.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.$element.on('click.tools.modal', $.proxy(this.load, this));
|
||
|
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Modal.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Modal.NAME || namespace == $.Modal.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
load: function()
|
||
|
{
|
||
|
this.build();
|
||
|
this.enableEvents();
|
||
|
this.setTitle();
|
||
|
this.setDraggable();
|
||
|
this.setContent();
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
this.buildOverlay();
|
||
|
|
||
|
this.$modalBox = $('<div class="modal-box" />').hide();
|
||
|
this.$modal = $('<div class="modal" />');
|
||
|
this.$modalHeader = $('<header />');
|
||
|
this.$modalClose = $('<span class="modal-close" />').html('×');
|
||
|
this.$modalBody = $('<section />');
|
||
|
this.$modalFooter = $('<footer />');
|
||
|
|
||
|
this.$modal.append(this.$modalHeader);
|
||
|
this.$modal.append(this.$modalClose);
|
||
|
this.$modal.append(this.$modalBody);
|
||
|
this.$modal.append(this.$modalFooter);
|
||
|
this.$modalBox.append(this.$modal);
|
||
|
this.$modalBox.appendTo(document.body);
|
||
|
},
|
||
|
buildOverlay: function()
|
||
|
{
|
||
|
this.$modalOverlay = $('<div id="modal-overlay">').hide();
|
||
|
$('body').prepend(this.$modalOverlay);
|
||
|
|
||
|
if (this.opts.blur)
|
||
|
{
|
||
|
this.blurredElements = $('body').children('div, section, header, article, pre, aside, table').not('.modal, .modal-box, #modal-overlay');
|
||
|
this.blurredElements.addClass('modal-blur');
|
||
|
}
|
||
|
},
|
||
|
show: function()
|
||
|
{
|
||
|
// modal loading callback
|
||
|
this.setCallback('loading', this.$modal);
|
||
|
|
||
|
this.bodyOveflow = $(document.body).css('overflow');
|
||
|
$(document.body).css('overflow', 'hidden');
|
||
|
|
||
|
if (this.isMobile())
|
||
|
{
|
||
|
this.showOnMobile();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.showOnDesktop();
|
||
|
}
|
||
|
|
||
|
this.$modalOverlay.show();
|
||
|
this.$modalBox.show();
|
||
|
|
||
|
this.setButtonsWidth();
|
||
|
|
||
|
// resize
|
||
|
if (!this.isMobile())
|
||
|
{
|
||
|
setTimeout($.proxy(this.showOnDesktop, this), 0);
|
||
|
$(window).on('resize.tools.modal', $.proxy(this.resize, this));
|
||
|
}
|
||
|
|
||
|
// modal shown callback
|
||
|
this.setCallback('opened', this.$modal);
|
||
|
|
||
|
// fix bootstrap modal focus
|
||
|
$(document).off('focusin.modal');
|
||
|
|
||
|
},
|
||
|
showOnDesktop: function()
|
||
|
{
|
||
|
var height = this.$modal.outerHeight();
|
||
|
var windowHeight = $(window).height();
|
||
|
var windowWidth = $(window).width();
|
||
|
|
||
|
if (this.opts.width > windowWidth)
|
||
|
{
|
||
|
this.$modal.css({
|
||
|
width: '96%',
|
||
|
marginTop: (windowHeight/2 - height/2) + 'px'
|
||
|
});
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (height > windowHeight)
|
||
|
{
|
||
|
this.$modal.css({
|
||
|
width: this.opts.width + 'px',
|
||
|
marginTop: '20px'
|
||
|
});
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$modal.css({
|
||
|
width: this.opts.width + 'px',
|
||
|
marginTop: (windowHeight/2 - height/2) + 'px'
|
||
|
});
|
||
|
}
|
||
|
},
|
||
|
showOnMobile: function()
|
||
|
{
|
||
|
this.$modal.css({
|
||
|
width: '96%',
|
||
|
marginTop: '2%'
|
||
|
});
|
||
|
|
||
|
},
|
||
|
resize: function()
|
||
|
{
|
||
|
if (this.isMobile())
|
||
|
{
|
||
|
this.showOnMobile();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.showOnDesktop();
|
||
|
}
|
||
|
},
|
||
|
setTitle: function()
|
||
|
{
|
||
|
this.$modalHeader.html(this.opts.title);
|
||
|
},
|
||
|
setContent: function()
|
||
|
{
|
||
|
if (typeof this.opts.content == 'object' || this.opts.content.search('#') === 0)
|
||
|
{
|
||
|
this.type = 'html';
|
||
|
|
||
|
this.$modalBody.html($(this.opts.content).html());
|
||
|
this.show();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
$.ajax({
|
||
|
url: this.opts.content,
|
||
|
cache: false,
|
||
|
success: $.proxy(function(data)
|
||
|
{
|
||
|
this.$modalBody.html(data);
|
||
|
this.show();
|
||
|
|
||
|
}, this)
|
||
|
});
|
||
|
}
|
||
|
|
||
|
},
|
||
|
setDraggable: function()
|
||
|
{
|
||
|
if (typeof $.fn.draggable === 'undefined') return;
|
||
|
|
||
|
this.$modal.draggable({ handle: this.$modalHeader });
|
||
|
this.$modalHeader.css('cursor', 'move');
|
||
|
},
|
||
|
createCancelButton: function(label)
|
||
|
{
|
||
|
if (typeof label == 'undefined') label = 'Cancel';
|
||
|
|
||
|
var button = $('<button>').addClass('btn modal-close-btn').html(label);
|
||
|
button.on('click', $.proxy(this.close, this));
|
||
|
|
||
|
this.$modalFooter.append(button);
|
||
|
},
|
||
|
createDeleteButton: function(label)
|
||
|
{
|
||
|
if (typeof label == 'undefined') label = 'Delete';
|
||
|
|
||
|
return this.createButton(label, 'red');
|
||
|
},
|
||
|
createActionButton: function(label)
|
||
|
{
|
||
|
if (typeof label == 'undefined') label = 'Ok';
|
||
|
|
||
|
return this.createButton(label, 'blue');
|
||
|
},
|
||
|
createButton: function(label, className)
|
||
|
{
|
||
|
var button = $('<button>').addClass('btn').addClass('btn-' + className).html(label);
|
||
|
this.$modalFooter.append(button);
|
||
|
|
||
|
return button;
|
||
|
},
|
||
|
setButtonsWidth: function()
|
||
|
{
|
||
|
var buttons = this.$modalFooter.find('button');
|
||
|
var buttonsSize = buttons.size();
|
||
|
if (buttonsSize === 0) return;
|
||
|
|
||
|
buttons.css('width', (100/buttonsSize) + '%');
|
||
|
},
|
||
|
enableEvents: function()
|
||
|
{
|
||
|
this.$modalClose.on('click.tools.modal', $.proxy(this.close, this));
|
||
|
$(document).on('keyup.tools.modal', $.proxy(this.closeHandler, this));
|
||
|
this.$modalBox.on('click.tools.modal', $.proxy(this.close, this));
|
||
|
},
|
||
|
disableEvents: function()
|
||
|
{
|
||
|
this.$modalClose.off('click.tools.modal');
|
||
|
$(document).off('keyup.tools.modal');
|
||
|
this.$modalBox.off('click.tools.modal');
|
||
|
$(window).off('resize.tools.modal');
|
||
|
},
|
||
|
closeHandler: function(e)
|
||
|
{
|
||
|
if (e.which != 27) return;
|
||
|
|
||
|
this.close();
|
||
|
},
|
||
|
close: function(e)
|
||
|
{
|
||
|
if (e)
|
||
|
{
|
||
|
if (!$(e.target).hasClass('modal-close-btn') && e.target != this.$modalClose[0] && e.target != this.$modalBox[0])
|
||
|
{
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
e.preventDefault();
|
||
|
}
|
||
|
|
||
|
if (!this.$modalBox) return;
|
||
|
|
||
|
this.disableEvents();
|
||
|
|
||
|
this.$modalOverlay.remove();
|
||
|
this.$modalBox.fadeOut('fast', $.proxy(function()
|
||
|
{
|
||
|
this.$modalBox.remove();
|
||
|
|
||
|
$(document.body).css('overflow', this.bodyOveflow);
|
||
|
|
||
|
// remove blur
|
||
|
if (this.opts.blur && typeof this.blurredElements != 'undefined')
|
||
|
{
|
||
|
this.blurredElements.removeClass('modal-blur');
|
||
|
}
|
||
|
|
||
|
this.setCallback('closed');
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
isMobile: function()
|
||
|
{
|
||
|
var mq = window.matchMedia("(max-width: 767px)");
|
||
|
return (mq.matches) ? true : false;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.modal', function()
|
||
|
{
|
||
|
$('[data-tools="modal"]').modal();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Modal.prototype.init.prototype = Modal.prototype;
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
|
||
|
/*
|
||
|
Navigation Fixed Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.navigationFixed = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'navigationFixed', {});
|
||
|
$.data(this, 'navigationFixed', NavigationFixed(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function NavigationFixed(el, options)
|
||
|
{
|
||
|
return new NavigationFixed.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.NavigationFixed = NavigationFixed;
|
||
|
$.NavigationFixed.NAME = 'navigation-fixed';
|
||
|
$.NavigationFixed.VERSION = '1.0';
|
||
|
$.NavigationFixed.opts = {
|
||
|
|
||
|
// settings
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
NavigationFixed.fn = $.NavigationFixed.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
var mq = window.matchMedia("(max-width: 767px)");
|
||
|
if (mq.matches) return;
|
||
|
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.navBoxOffsetTop = this.$element.offset().top;
|
||
|
|
||
|
this.build();
|
||
|
$(window).scroll($.proxy(this.build, this));
|
||
|
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.NavigationFixed.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.NavigationFixed.NAME || namespace == $.NavigationFixed.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
if ($(window).scrollTop() > this.navBoxOffsetTop)
|
||
|
{
|
||
|
this.$element.addClass('navigation-fixed');
|
||
|
this.setCallback('fixed');
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$element.removeClass('navigation-fixed');
|
||
|
this.setCallback('unfixed');
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.navigation-fixed', function()
|
||
|
{
|
||
|
$('[data-tools="navigation-fixed"]').navigationFixed();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
NavigationFixed.prototype.init.prototype = NavigationFixed.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Navigation Toggle Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.navigationToggle = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'navigationToggle', {});
|
||
|
$.data(this, 'navigationToggle', NavigationToggle(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function NavigationToggle(el, options)
|
||
|
{
|
||
|
return new NavigationToggle.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.NavigationToggle = NavigationToggle;
|
||
|
$.NavigationToggle.NAME = 'navigation-toggle';
|
||
|
$.NavigationToggle.VERSION = '1.0';
|
||
|
$.NavigationToggle.opts = {
|
||
|
|
||
|
target: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
NavigationToggle.fn = $.NavigationToggle.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.$target = $(this.opts.target);
|
||
|
|
||
|
this.$toggle = this.$element.find('span');
|
||
|
this.$toggle.on('click', $.proxy(this.onClick, this));
|
||
|
|
||
|
this.build();
|
||
|
$(window).resize($.proxy(this.build, this));
|
||
|
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.NavigationToggle.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.NavigationToggle.NAME || namespace == $.NavigationToggle.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
build: function()
|
||
|
{
|
||
|
var mq = window.matchMedia("(max-width: 767px)");
|
||
|
if (mq.matches)
|
||
|
{
|
||
|
// hide
|
||
|
if (!this.$target.hasClass('navigation-target-show'))
|
||
|
{
|
||
|
this.$element.addClass('navigation-toggle-show').show();
|
||
|
this.$target.addClass('navigation-target-show').hide();
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// show
|
||
|
this.$element.removeClass('navigation-toggle-show').hide();
|
||
|
this.$target.removeClass('navigation-target-show').show();
|
||
|
}
|
||
|
},
|
||
|
onClick: function(e)
|
||
|
{
|
||
|
e.stopPropagation();
|
||
|
e.preventDefault();
|
||
|
|
||
|
if (this.isTargetHide())
|
||
|
{
|
||
|
this.$element.addClass('navigation-toggle-show');
|
||
|
this.$target.show();
|
||
|
this.setCallback('show', this.$target);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.$element.removeClass('navigation-toggle-show');
|
||
|
this.$target.hide();
|
||
|
this.setCallback('hide', this.$target);
|
||
|
}
|
||
|
},
|
||
|
isTargetHide: function()
|
||
|
{
|
||
|
return (this.$target[0].style.display == 'none') ? true : false;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.navigation-toggle', function()
|
||
|
{
|
||
|
$('[data-tools="navigation-toggle"]').navigationToggle();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
NavigationToggle.prototype.init.prototype = NavigationToggle.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Progress Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
$.progress = {
|
||
|
show: function()
|
||
|
{
|
||
|
if ($('#tools-progress').length !== 0)
|
||
|
{
|
||
|
$('#tools-progress').fadeIn();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
var $progress = $('<div id="tools-progress"><span></span></div>').hide();
|
||
|
$(document.body).append($progress);
|
||
|
$('#tools-progress').fadeIn();
|
||
|
}
|
||
|
},
|
||
|
update: function(value)
|
||
|
{
|
||
|
this.show();
|
||
|
$('#tools-progress').find('span').css('width', value + '%');
|
||
|
},
|
||
|
hide: function()
|
||
|
{
|
||
|
$('#tools-progress').fadeOut(1500);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
/*
|
||
|
Tabs Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.tabs = function(options)
|
||
|
{
|
||
|
var val = [];
|
||
|
var args = Array.prototype.slice.call(arguments, 1);
|
||
|
|
||
|
if (typeof options === 'string')
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
var instance = $.data(this, 'tabs');
|
||
|
if (typeof instance !== 'undefined' && $.isFunction(instance[options]))
|
||
|
{
|
||
|
var methodVal = instance[options].apply(instance, args);
|
||
|
if (methodVal !== undefined && methodVal !== instance) val.push(methodVal);
|
||
|
}
|
||
|
else return $.error('No such method "' + options + '" for Tabs');
|
||
|
});
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
this.each(function()
|
||
|
{
|
||
|
$.data(this, 'tabs', {});
|
||
|
$.data(this, 'tabs', Tabs(this, options));
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (val.length === 0) return this;
|
||
|
else if (val.length === 1) return val[0];
|
||
|
else return val;
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Tabs(el, options)
|
||
|
{
|
||
|
return new Tabs.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Tabs = Tabs;
|
||
|
$.Tabs.NAME = 'tabs';
|
||
|
$.Tabs.VERSION = '1.0';
|
||
|
$.Tabs.opts = {
|
||
|
|
||
|
equals: false,
|
||
|
active: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Tabs.fn = $.Tabs.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.links = this.$element.find('a');
|
||
|
this.tabs = [];
|
||
|
|
||
|
this.links.each($.proxy(this.load, this));
|
||
|
|
||
|
this.setEquals();
|
||
|
this.setCallback('init');
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Tabs.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Tabs.NAME || namespace == $.Tabs.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
load: function(i, el)
|
||
|
{
|
||
|
var $el = $(el);
|
||
|
var hash = $el.attr('href');
|
||
|
$el.attr('rel', hash);
|
||
|
|
||
|
this.tabs.push($(hash));
|
||
|
|
||
|
if (!$el.parent().hasClass('active'))
|
||
|
{
|
||
|
$(hash).hide();
|
||
|
}
|
||
|
|
||
|
// is hash in url
|
||
|
this.readLocationHash(hash);
|
||
|
|
||
|
// is active
|
||
|
if (this.opts.active !== false && this.opts.active === hash)
|
||
|
{
|
||
|
this.show(hash);
|
||
|
}
|
||
|
|
||
|
$el.on('click', $.proxy(this.onClick, this));
|
||
|
},
|
||
|
onClick: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
var hash = $(e.target).attr('rel');
|
||
|
top.location.hash = hash;
|
||
|
this.show(hash);
|
||
|
},
|
||
|
readLocationHash: function(hash)
|
||
|
{
|
||
|
if (top.location.hash === '' || top.location.hash != hash) return;
|
||
|
|
||
|
this.opts.active = top.location.hash;
|
||
|
},
|
||
|
setActive: function(hash)
|
||
|
{
|
||
|
this.activeHash = hash;
|
||
|
this.activeTab = $('[rel=' + hash + ']');
|
||
|
|
||
|
this.links.parent().removeClass('active');
|
||
|
this.activeTab.parent().addClass('active');
|
||
|
},
|
||
|
getActiveHash: function()
|
||
|
{
|
||
|
return this.activeHash;
|
||
|
},
|
||
|
getActiveTab: function()
|
||
|
{
|
||
|
return this.activeTab;
|
||
|
},
|
||
|
show: function(hash)
|
||
|
{
|
||
|
this.hideAll();
|
||
|
$(hash).show();
|
||
|
this.setActive(hash);
|
||
|
|
||
|
this.setCallback('show', $('[rel=' + hash + ']'), hash);
|
||
|
},
|
||
|
hideAll: function()
|
||
|
{
|
||
|
$.each(this.tabs, function()
|
||
|
{
|
||
|
$(this).hide();
|
||
|
});
|
||
|
},
|
||
|
setEquals: function()
|
||
|
{
|
||
|
if (!this.opts.equals) return;
|
||
|
|
||
|
this.setMaxHeight(this.getMaxHeight());
|
||
|
},
|
||
|
setMaxHeight: function(height)
|
||
|
{
|
||
|
$.each(this.tabs, function()
|
||
|
{
|
||
|
$(this).css('min-height', height + 'px');
|
||
|
});
|
||
|
},
|
||
|
getMaxHeight: function()
|
||
|
{
|
||
|
var max = 0;
|
||
|
$.each(this.tabs, function()
|
||
|
{
|
||
|
var h = $(this).height();
|
||
|
max = h > max ? h : max;
|
||
|
});
|
||
|
|
||
|
return max;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.tabs', function()
|
||
|
{
|
||
|
$('[data-tools="tabs"]').tabs();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Tabs.prototype.init.prototype = Tabs.prototype;
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
|
||
|
/*
|
||
|
TextFit Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.textfit = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'textfit', {});
|
||
|
$.data(this, 'textfit', Textfit(this, options));
|
||
|
});
|
||
|
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Textfit(el, options)
|
||
|
{
|
||
|
return new Textfit.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Textfit = Textfit;
|
||
|
$.Textfit.NAME = 'textfit';
|
||
|
$.Textfit.VERSION = '1.0';
|
||
|
$.Textfit.opts = {
|
||
|
|
||
|
min: '10px',
|
||
|
max: '100px',
|
||
|
compressor: 1
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Textfit.fn = $.Textfit.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.$element.css('font-size', Math.max(Math.min(this.$element.width() / (this.opts.compressor*10), parseFloat(this.opts.max)), parseFloat(this.opts.min)));
|
||
|
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Textfit.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$(window).on('load.tools.textfit', function()
|
||
|
{
|
||
|
$('[data-tools="textfit"]').textfit();
|
||
|
});
|
||
|
|
||
|
// constructor
|
||
|
Textfit.prototype.init.prototype = Textfit.prototype;
|
||
|
|
||
|
|
||
|
})(jQuery);
|
||
|
/*
|
||
|
Tooltip Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.tooltip = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'tooltip', {});
|
||
|
$.data(this, 'tooltip', Tooltip(this, options));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Tooltip(el, options)
|
||
|
{
|
||
|
return new Tooltip.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Tooltip = Tooltip;
|
||
|
$.Tooltip.NAME = 'tooltip';
|
||
|
$.Tooltip.VERSION = '1.0';
|
||
|
$.Tooltip.opts = {
|
||
|
|
||
|
theme: false
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Tooltip.fn = $.Tooltip.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.$element.on('mouseover', $.proxy(this.show, this));
|
||
|
this.$element.on('mouseout', $.proxy(this.hide, this));
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Tooltip.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
show: function()
|
||
|
{
|
||
|
$('.tooltip').hide();
|
||
|
|
||
|
var text = this.$element.attr('title');
|
||
|
this.$element.data('cached-title', text);
|
||
|
this.$element.attr('title', '');
|
||
|
|
||
|
this.tooltip = $('<div class="tooltip" />').html(text).hide();
|
||
|
|
||
|
if (this.opts.theme !== false)
|
||
|
{
|
||
|
this.tooltip.addClass('tooltip-theme-' + this.opts.theme);
|
||
|
}
|
||
|
|
||
|
this.tooltip.css({
|
||
|
top: (this.$element.offset().top + this.$element.innerHeight()) + 'px',
|
||
|
left: this.$element.offset().left + 'px'
|
||
|
});
|
||
|
|
||
|
$('body').append(this.tooltip);
|
||
|
|
||
|
this.tooltip.show();
|
||
|
|
||
|
},
|
||
|
hide: function()
|
||
|
{
|
||
|
this.tooltip.fadeOut('fast', $.proxy(function()
|
||
|
{
|
||
|
this.tooltip.remove();
|
||
|
|
||
|
}, this));
|
||
|
|
||
|
this.$element.attr('title', this.$element.data('cached-title'));
|
||
|
this.$element.data('cached-title', '');
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// Constructor
|
||
|
Tooltip.prototype.init.prototype = Tooltip.prototype;
|
||
|
|
||
|
$(function()
|
||
|
{
|
||
|
$('[data-tools="tooltip"]').tooltip();
|
||
|
});
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
/*
|
||
|
Upload Tool
|
||
|
|
||
|
http://imperavi.com/kube/
|
||
|
|
||
|
Copyright (c) 2009-2014, Imperavi LLC.
|
||
|
*/
|
||
|
(function($)
|
||
|
{
|
||
|
// Plugin
|
||
|
$.fn.upload = function(options)
|
||
|
{
|
||
|
return this.each(function()
|
||
|
{
|
||
|
$.data(this, 'upload', {});
|
||
|
$.data(this, 'upload', Upload(this, options));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// Initialization
|
||
|
function Upload(el, options)
|
||
|
{
|
||
|
return new Upload.prototype.init(el, options);
|
||
|
}
|
||
|
|
||
|
$.Upload = Upload;
|
||
|
$.Upload.NAME = 'upload';
|
||
|
$.Upload.VERSION = '1.0';
|
||
|
$.Upload.opts = {
|
||
|
|
||
|
url: false,
|
||
|
placeholder: 'Drop file here or ',
|
||
|
param: 'file'
|
||
|
|
||
|
};
|
||
|
|
||
|
// Functionality
|
||
|
Upload.fn = $.Upload.prototype = {
|
||
|
|
||
|
// Initialization
|
||
|
init: function(el, options)
|
||
|
{
|
||
|
this.$element = el !== false ? $(el) : false;
|
||
|
this.loadOptions(options);
|
||
|
|
||
|
this.load();
|
||
|
},
|
||
|
loadOptions: function(options)
|
||
|
{
|
||
|
this.opts = $.extend(
|
||
|
{},
|
||
|
$.extend(true, {}, $.Upload.opts),
|
||
|
this.$element.data(),
|
||
|
options
|
||
|
);
|
||
|
},
|
||
|
setCallback: function(type, e, data)
|
||
|
{
|
||
|
var events = $._data(this.$element[0], 'events');
|
||
|
if (events && typeof events[type] != 'undefined')
|
||
|
{
|
||
|
var value = [];
|
||
|
var len = events[type].length;
|
||
|
for (var i = 0; i < len; i++)
|
||
|
{
|
||
|
var namespace = events[type][i].namespace;
|
||
|
if (namespace == 'tools.' + $.Upload.NAME || namespace == $.Upload.NAME + '.tools')
|
||
|
{
|
||
|
var callback = events[type][i].handler;
|
||
|
value.push((typeof data == 'undefined') ? callback.call(this, e) : callback.call(this, e, data));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (value.length == 1) return value[0];
|
||
|
else return value;
|
||
|
}
|
||
|
|
||
|
return (typeof data == 'undefined') ? e : data;
|
||
|
|
||
|
},
|
||
|
load: function()
|
||
|
{
|
||
|
this.$droparea = $('<div class="tools-droparea" />');
|
||
|
this.$placeholdler = $('<div class="tools-droparea-placeholder" />').text(this.opts.placeholder);
|
||
|
|
||
|
this.$droparea.append(this.$placeholdler);
|
||
|
this.$element.after(this.$droparea);
|
||
|
this.$placeholdler.append(this.$element);
|
||
|
|
||
|
this.$droparea.off('.tools.upload');
|
||
|
this.$element.off('.tools.upload');
|
||
|
|
||
|
this.$droparea.on('dragover.tools.upload', $.proxy(this.onDrag, this));
|
||
|
this.$droparea.on('dragleave.tools.upload', $.proxy(this.onDragLeave, this));
|
||
|
|
||
|
// change
|
||
|
this.$element.on('change.tools.upload', $.proxy(function(e)
|
||
|
{
|
||
|
e = e.originalEvent || e;
|
||
|
this.traverseFile(this.$element[0].files[0], e);
|
||
|
}, this));
|
||
|
|
||
|
// drop
|
||
|
this.$droparea.on('drop.tools.upload', $.proxy(function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
|
||
|
this.$droparea.removeClass('drag-hover').addClass('drag-drop');
|
||
|
this.onDrop(e);
|
||
|
|
||
|
}, this));
|
||
|
},
|
||
|
onDrop: function(e)
|
||
|
{
|
||
|
e = e.originalEvent || e;
|
||
|
var files = e.dataTransfer.files;
|
||
|
|
||
|
this.traverseFile(files[0], e);
|
||
|
},
|
||
|
traverseFile: function(file, e)
|
||
|
{
|
||
|
var formData = !!window.FormData ? new FormData() : null;
|
||
|
if (window.FormData)
|
||
|
{
|
||
|
formData.append(this.opts.param, file);
|
||
|
}
|
||
|
|
||
|
if ($.progress) $.progress.show();
|
||
|
this.sendData(formData, e);
|
||
|
},
|
||
|
sendData: function(formData, e)
|
||
|
{
|
||
|
var xhr = new XMLHttpRequest();
|
||
|
xhr.open('POST', this.opts.url);
|
||
|
|
||
|
// complete
|
||
|
xhr.onreadystatechange = $.proxy(function()
|
||
|
{
|
||
|
if (xhr.readyState == 4)
|
||
|
{
|
||
|
var data = xhr.responseText;
|
||
|
|
||
|
data = data.replace(/^\[/, '');
|
||
|
data = data.replace(/\]$/, '');
|
||
|
|
||
|
var json = (typeof data === 'string' ? $.parseJSON(data) : data);
|
||
|
|
||
|
if ($.progress) $.progress.hide();
|
||
|
|
||
|
this.$droparea.removeClass('drag-drop');
|
||
|
this.setCallback('success', json);
|
||
|
}
|
||
|
}, this);
|
||
|
|
||
|
xhr.send(formData);
|
||
|
},
|
||
|
onDrag: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
this.$droparea.addClass('drag-hover');
|
||
|
},
|
||
|
onDragLeave: function(e)
|
||
|
{
|
||
|
e.preventDefault();
|
||
|
this.$droparea.removeClass('drag-hover');
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
// Constructor
|
||
|
Upload.prototype.init.prototype = Upload.prototype;
|
||
|
|
||
|
$(function()
|
||
|
{
|
||
|
$('[data-tools="upload"]').upload();
|
||
|
});
|
||
|
|
||
|
})(jQuery);
|
||
|
|
||
|
|