/**
 * 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];
			
		// podpinamy ustawianie minimalnej ilości elementów
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-count"]').click(MoveableBoxesObject.changeLimit);
		// przesuwanie boxów w górę
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-up"]').click(MoveableBoxesObject.moveUp);
		// przesuwanie boxów w dół
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-down"]').click(MoveableBoxesObject.moveDown);
		
		// zwiększanie limitu dla wyświetlanych elementów
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-add"]').click(MoveableBoxesObject.moreItems);
		
		// zmniejszanie limitu dla wyświetlanych elementów
		jQuery('#' + container.id + ' > li > .mb-header > .mb-options a[rel="mb-del"]').click(MoveableBoxesObject.lessItems);
	}
	
	// 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);
	
		//alert(this+" - "+currentBox+"-"+jQuery(this).text());
	
	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');
		}	
	});
	
	//alert('currentBox'+currentBox);
	
	// 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;
			}
		}	
		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-');
	var cookiesBoxesVisibility = Cookie.getAll('mb-visibility-');
	
	// 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;  
			//alert(box);
			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;
			}
		}	
	}
	
	//przywracanie widocznosci boxow
	for(x in cookiesBoxesVisibility)
	{
		var cookieName = cookiesBoxesVisibility[x];
		var stan = Cookie.get(cookieName);
		
		MoveableBoxesObject.SetBoxVisibility(cookieName.substring('mb-visibility-'.length), stan);
	}
	
	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;
	}
	
	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))) 
	{
		if((currentBox.id=="mb4-box10")||(currentBox.id=="mb4-box11")||(currentBox.id=="mb4-box12")||(currentBox.id=="mb4-box13"))//wyjatek dla boxow
		{
			limit = 2;
		}
		else
		{
			if((currentBox.id=="mb4-box1")||(currentBox.id=="mb4-box2")||(currentBox.id=="mb4-box3")||(currentBox.id=="mb4-box5")||(currentBox.id=="mb4-box6")||(currentBox.id=="mb4-box7")||(currentBox.id=="mb4-box8")||(currentBox.id=="mb4-box9")||(currentBox.id=="mb4-box14")||(currentBox.id=="mb1-box5"))//wyjatek dla boxow
			{
				limit = 4;
			}
			else
			{
				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() 

/**
 * Pokazywanie i ukrywanie contentu boxa po kliknieciu na link
 */
MoveableBoxes.prototype.ShowHideBox = function(box_id) 
{
	if($("li#"+box_id).children("div.mb-content").css("display")=="block")
	{
		MoveableBoxesObject.SetBoxVisibility(box_id, 0);
	}
	else
	{
		MoveableBoxesObject.SetBoxVisibility(box_id, 1);	
	}

} // end MoveableBoxes.ShowHideBox() 

/**
 * Pokazywanie i ukrywanie contentu boxa po kliknieciu na link
 */
MoveableBoxes.prototype.SetBoxVisibility = function(box_id, state) 
{

	if(state==0)
	{
		$("li#"+box_id).children("div.mb-content").css("display", "none");
		Cookie.create("mb-visibility-"+box_id, 0, 100);	
		
		//podmienienie obrazka
		imgsrc = $("li#"+box_id).children("div.mb-header").children("div.mb-options").children("a").children("img.showhideboximg").attr("src");
		if(imgsrc)
		{
			var new_imgsrc = imgsrc.replace("-zwin.jpg","-rozwin.jpg");
			$("li#"+box_id).children("div.mb-header").children("div.mb-options").children("a").children("img.showhideboximg").attr("src", new_imgsrc);
		}
	}
	else
	{
		$("li#"+box_id).children("div.mb-content").css("display", "block");
		Cookie.create("mb-visibility-"+box_id, 1, 100);	
		
		//podmienienie obrazka
		imgsrc = $("li#"+box_id).children("div.mb-header").children("div.mb-options").children("a").children("img.showhideboximg").attr("src");
		if(imgsrc)
		{
			var new_imgsrc = imgsrc.replace("-rozwin.jpg","-zwin.jpg");
			$("li#"+box_id).children("div.mb-header").children("div.mb-options").children("a").children("img.showhideboximg").attr("src", new_imgsrc);
		}
	}	

} // end MoveableBoxes.SetBoxVisibility() 



