/**
* use this plugin if you want to make tiled menu like windows 8 start menu
* what plugin needs for?
* it needs for following elements structure
*
*
* if you do some changes, for example, move tile from one group, you have to use
* $('.tiles').trigger('changed')
* and all tiles will placed to own place
*/
(function($) {
$.StartMenu = function(element, options) {
var $startMenu,
plugin = this,
maxGroupHeight;
plugin.init = function() {
var resizeTimer;
$startMenu = $('.tiles');
addMouseWheel();
setPageWidth();
tuneUpStartMenu(); // need twice
$(window).on('resize', function(){
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function(){
tuneUpStartMenu();
}, 200);
});
$startMenu.on('changed', function(){
tuneUpStartMenu();
});
};
/**
* called on init
* and on resize window
* and any tiles moves
*/
var tuneUpStartMenu = function () {
var $groups = $startMenu.find('.tile-group');
if ($groups.length === 0) {
return;
}
maxGroupHeight = $(window).height() - $($groups.get(0)).offset().top;
$groups.each(function(index, group){
var $group = $(group);
// finding min width for group
var groupWidth = 0;
var $tiles = $group.find('.tile');
if ($tiles.length === 0) {
return;
}
// finding min width according to the widest tile
$tiles.each(function(index, tile){
var $tile = $(tile);
var tileWidth = 161;
if ($tile.hasClass('double')) {
tileWidth = 322;
} else if ($tile.hasClass('triple')) {
tileWidth = 483;
} else if ($tile.hasClass('quadro')) {
tileWidth = 644;
}
if (tileWidth > groupWidth) {
groupWidth = tileWidth;
}
});
$group.css({
width: 'auto',
maxWidth: groupWidth
});
var counter, groupHeight_,
groupHeight = $group.height();
while (groupHeight > maxGroupHeight) {
if (counter > $tiles.length) { // protection from endless loop
break;
} else if (groupHeight === groupHeight_) {
counter++;
} else {
counter = 1;
}
groupHeight_ = groupHeight;
groupWidth += 161;
$group.css({
'maxWidth': groupWidth
});
groupHeight = $group.height();
}
});
setPageWidth();
};
var setPageWidth = function () {
var tilesWidth = 0;
$startMenu.find(".tile-group").each(function(){
tilesWidth += $(this).outerWidth() + 80;
});
$startMenu.css("width", 120 + tilesWidth + 20);
$(".page").css('width', '').css({
width: $(document).width()
});
};
var addMouseWheel = function (){
$("body").mousewheel(function(event, delta){
var scroll_value = delta * 50;
$(document).scrollLeft($(document).scrollLeft() - scroll_value);
return false;
});
};
plugin.init();
};
$.fn.StartMenu = function(options) {
return this.each(function() {
if (undefined == $(this).data('StartMenu')) {
var plugin = new $.StartMenu(this, options);
$(this).data('StartMenu', plugin);
}
});
};
})(jQuery);
$(function(){
$.StartMenu();
});