/**
 * MoveableBoxes 
 * 
 * Skrypt umożliwia przemieszczanie boxów w kilku kolumnach. 
 * Dodatkowo zarządza liczbą jednocześnie wyświetlanych elementów w boxach.
 * 
 * Przemek Szalko (c) 2008 
 */
var MoveableBoxesObject;

/**
 * Tworzy nową instancję obiektu.
 * @param Array boxContainers - Tablica z identyfikatorami dla boxów na których ma operować skrypt
 */
function MoveableBoxes(boxContainers) {
	MoveableBoxesObject = this;
	this.boxContainers = new Array;
	for(x in boxContainers) {
		this.boxContainers[x] = jQuery('#' + boxContainers[x]).get(0);
	}
	this.init();	
} // end MoveableBoxes

/**
 *  Inicjuje klasę MoveableBoxes.
 */
MoveableBoxes.prototype.init = function() {
	for(x in this.boxContainers) {
		var container = this.boxContainers[x];
			
        // przesuwanie boxów w górę
		jQuery('#' + container.id + ' > div > .nagl a[rel="mb-up"]').click(MoveableBoxesObject.moveUp);

		// przesuwanie boxów w dół
        jQuery('#' + container.id + ' > div > .nagl a[rel="mb-down"]').click(MoveableBoxesObject.moveDown);

	}
	
	// aktualizacja linków z opcjami
	this.updateOptions();
	
	// przywracanie stanu boxów z cookies
	this.restoreState();
	
} // end  MoveableBoxes.init()


/**
 * Zmienia limit wyświetlanych elementów w wybranym boksie.
 */
MoveableBoxes.prototype.changeLimit = function() {
	var limit = parseInt(jQuery(this).text());
	if(isNaN(limit)) {
		limit = 9; // jeśli odebraliśmy nieprawidłowy limit, ustawiamy nowy
	}
	
	limit--; // numeracja boxów od 0
	
	if(limit < 0) {
		limit = 0;
	}
	
	var currentBox = MoveableBoxesObject.getCurrentBox(this);
	if(!currentBox) {
		// niepoprawna struktura dokumentu
		// nie możemy nic zrobić, więc kończymy działanie
		return false;
	}
	
	// ustawia aktualny limit wyświetlanych elementów
	MoveableBoxesObject.setLimit(currentBox, limit);
	
	// zapisujemy ustawienia
	MoveableBoxesObject.saveCurrentLimit(currentBox, limit);
		
	return false;
} // end MoveableBoxes.changeLinksLimit()

/**
 * Zwiększa limit wyświetlanych elementów
 */
MoveableBoxes.prototype.moreItems = function() {
	var currentBox = MoveableBoxesObject.getCurrentBox(this);
	var limit = MoveableBoxesObject.getCurrentLimit(currentBox);
	limit++;
	
	MoveableBoxesObject.setLimit(currentBox, limit);
	MoveableBoxesObject.saveCurrentLimit(currentBox, limit);
	
	return false;
} // end MoveableBoxes.moreItems()

/**
 * Zwiększa limit wyświetlanych elementów
 */
MoveableBoxes.prototype.lessItems = function() {
	var currentBox = MoveableBoxesObject.getCurrentBox(this);
	var limit = MoveableBoxesObject.getCurrentLimit(currentBox);
	
	if(limit > 0) {
		limit--;
		MoveableBoxesObject.setLimit(currentBox, limit);
		MoveableBoxesObject.saveCurrentLimit(currentBox, limit);
	}
	
	return false;
} // end MoveableBoxes.lessItems()

/**
 *  Ustawia liczbę aktualnie wyświetlanych elementów.
 */
MoveableBoxes.prototype.setLimit = function(currentBox, limit) {
	limit = parseInt(limit);
	if((limit == null) || isNaN(limit)) { 
		limit = 8;
	}
	// zaznaczamy liczbę aktualnie wyświetlanych elementów
	jQuery(currentBox).find('.mb-header > .mb-options a[rel="mb-count"]').each(function() { 
		var currentLimit = parseInt(jQuery(this).text());
		
		if(currentLimit == (limit + 1)) {
			jQuery(this).attr('class', 'selected');
		} else {
			jQuery(this).removeAttr('class');
		}	
	});
	
	// rozwijamy potrzebne elementy	
	jQuery(currentBox).find('.mb-content ul > li:lt(' + (limit + 1) + ')').slideDown();
	
	// i zawijamy niepotrzebne
	jQuery(currentBox).find('.mb-content ul > li:gt(' + limit + ')').slideUp();
	
} // end MoveableBoxes.setLimit()



/** 
 * Przenosi wybrany box jeden poziom wyżej.
 */
MoveableBoxes.prototype.moveUp = function() {
	var currentBox = MoveableBoxesObject.getCurrentBox(this);
	
	// jeśli box jest pierwszym  - nie możemy go przenieść w górę
	if(jQuery(currentBox).is(':first-child')) {
		return false;
	}
	
	var prevElement = jQuery(currentBox).prev();
	
	jQuery(currentBox).slideUp(function () {
		// przenosimy box o jeden poziom wyżej
		jQuery(prevElement).before(currentBox);
		MoveableBoxesObject.updateOptions();
		
		jQuery(currentBox).slideDown(function() {

        // zapamiętujemy kolejność
		MoveableBoxesObject.saveOrderState();
		});
	});
	
	return false;
} // end MoveableBoxes.moveUp()

/**
 *  Przenosi wybrany box jeden poziom niżej.
 */
MoveableBoxes.prototype.moveDown = function() {
	var currentBox = MoveableBoxesObject.getCurrentBox(this);
	
	// jeśli box jest pierwszym  - nie możemy go przenieść w górę
	if(jQuery(currentBox).is(':last-child')) {
		return false;
	}
	
	var nextElement = jQuery(currentBox).next();
	
	jQuery(currentBox).slideUp(function () {
		// przenosimy box o jeden poziom niżej
		jQuery(nextElement).after(currentBox);
		MoveableBoxesObject.updateOptions();
		jQuery(currentBox).slideDown(function() {
			// zapamiętujemy kolejność
			MoveableBoxesObject.saveOrderState();
		});
	});
	
	return false;
} // end MoveableBoxes.moveDown()


/**
 * Aktualizuje opcje dla wszystkich boxów.
 */
MoveableBoxes.prototype.updateOptions = function() {
	for(x in MoveableBoxesObject.boxContainers) {
		var container = MoveableBoxesObject.boxContainers[x];	

		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-up"]').show();
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-down"]').show();
		jQuery('#' + container.id + ' > li:first-child > .mb-header > .mb-options a[rel="mb-up"]').hide();
		jQuery('#' + container.id + ' > li:last-child > .mb-header > .mb-options a[rel="mb-down"]').hide();
	}
} // end MoveableBoxes.updateOptions()

/**
 * Zapamiętuje kolejność boxów.
 */
MoveableBoxes.prototype.saveOrderState = function() {
	var prefix = 'mb-order-';
	
	for(x in MoveableBoxesObject.boxContainers) {
		var containerName = MoveableBoxesObject.boxContainers[x];
		var children = jQuery('#' + containerName.id).children();
		
        /*
        var order = '';
		for(i in children) {
			if((children[i].nodeName != undefined) && (children[i].nodeName.toUpperCase() == 'LI')) {
				order+= ',' + children[i].id;
			}
		}
        */
        var order = '';
		for(i in children) {
			if((children[i].nodeName != undefined) && (children[i].nodeName.toUpperCase() == 'DIV')) { 
				order+= ',' + children[i].id;
			}
		}

		Cookie.create(prefix + containerName.id, order.substr(1), 100);
	}
} // end MoveableBoxes.saveOrderState()

/**
 * Odczytuje stan skryptu z plików cookies.
 */
MoveableBoxes.prototype.restoreState = function() {
	var containers = MoveableBoxesObject.boxContainers;
	var cookiesBoxesOrder = Cookie.getAll('mb-order-');
	
	// przywracanie limitu wyświetlanych linków
	// var cookiesBoxesLength = Cookie.getAll('mb-limit-');
	/* for(x in cookiesBoxesLength) {
		var cookieName = cookiesBoxesLength[x];
		var limit = Cookie.get(cookieName);
		var boxName = '#' + cookieName.substring('mb-limit-'.length);
		MoveableBoxesObject.setLimit(boxName, limit);
	}*/
	for(x in containers) {
		jQuery(containers[x]).children().each(function() {
			var box = this;  
			var limit = MoveableBoxesObject.getCurrentLimit(box);
			
			MoveableBoxesObject.setLimit(box, limit);
		});
	}
	
	// przywracanie kolejności boxów
	for(x in cookiesBoxesOrder) {
		var cookieName = cookiesBoxesOrder[x];
		var order = Cookie.get(cookieName);
		var container = '#' + cookieName.substring('mb-order-'.length);
		if((order != null) && (order.length > 0)) {
			order = order.split(',');
			
			var current = jQuery(container + ' > #' + order[0]);
			for(i = 1; i < order.length; i++) {
				var temp = jQuery(container + ' > #' + order[i]);
				jQuery(current).after(temp);
				current = temp;
			}
		}	
	}
	
	MoveableBoxesObject.updateOptions();
} // end MoveableBoxes.restoreState()

/**
 *  Pobiera box w którym znajduje się podany element.
 */
MoveableBoxes.prototype.getCurrentBox = function(element) {

    /*
	while((element.parentNode != null) && (element.nodeName.toUpperCase() != 'LI')) {
		element = element.parentNode;
	}
    */

	element = element.parentNode.parentNode.parentNode;
  
	return element;	
} // end MoveableBoxes.getCurrentBox()

/**
 * Pobiera limit wyświetlanych elementów w podanym boxie.
 */
MoveableBoxes.prototype.getCurrentLimit = function(currentBox) {
	var cookieName = 'mb-limit-' + currentBox.id;
	var limit = parseInt(Cookie.get(cookieName));
	
	if((limit == null) || (isNaN(limit))) {
		limit = 8;
	}
	if(limit < 0) {
		limit = 0;
	}
	
	return limit;
} // end MoveableBoxes.getCurrentLimit()

/**
 * Zapisujemy limit wyświetlanych elementów w podanym boxie.
 */
MoveableBoxes.prototype.saveCurrentLimit = function(currentBox, limit) {
	var cookieName = 'mb-limit-' + currentBox.id;
	Cookie.create(cookieName, limit, 100);	
} // end MoveableBoxes.saveCurrentLimit() 
