var paragraphs = bmContainer = bm = bmList = blList = brList = myBookmarks = myBooklist = newListItemID = null,
	userListVarArray = new Array(),
	userListIDArray = new Array(),
	userListArray = new Array(),
	deleteListItemArray = new Array(),
	pBtmMargin = textHeight = marginPosY = 0,
	bmVisiBool = false,
	shortMonthNames = new Array("jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"),
	OpacityWait = 150;

function repopulateVariables() {
	paragraphs = $$("div#leftpane div.body div.textmass p"),
	pBtmMargin = (paragraphs[0])?paragraphs[0].getStyle("margin-bottom").toInt():0,
	bmList = $("bookmarklist"),
	blList = $("booklistlist"),
	brList = $("bookrecommendlist"),
	deleteListItemArray = $("rightpane").getElements("ul li a.deletelistitem"),
	userListsSortables = $("rightpane").getElements("ul.sortable"),
	userListsUnsortables = $("rightpane").getElements("ul.unsortable"),
	bmContainer = $("bookmarkcontainer"),
	bm = (bmContainer)?bmContainer.getElement("img"):null,
	textHeight = 0;
}

function recalculateBmHeight(){
	if (paragraphs.length == 0)
		return;
	
	var heading = $("leftpane").getElement("div.textmass h1"),
		bmMarginTop = (heading)?145:95;
	
	for (i = 0; i < paragraphs.length; i++)
		textHeight += paragraphs[i].clientHeight + pBtmMargin;
	
	bmContainer.setStyle("height", textHeight);
	bmContainer.setStyle("margin-top", bmMarginTop);
	bmContainer.setStyle("opacity", 0);
	bmContainer.setStyle("visibility", "visible");
	bm.setStyle("opacity", 0);
	bmVisiBool = false;
}

function initiateDeleteButton(dellistitem,text){
	var deleteListItemA = dellistitem.getElement("a.deletelistitem");
	if (!deleteListItemA)
		return;
	
	deleteListItemA.addEvents({
		"click": function(e) {
			deleteListItem(this,text);
			e = new Event(e).stop();
		}
	});
	
	deleteListItemA.setStyle("opacity", 0);
	dellistitem.addEvents({
		"mouseover": function() {
			var FadeInDelList = new Fx.Tween(deleteListItemA, {duration: OpacityWait}).start("opacity", 1);
		},
		"mouseout": function() {
			var FadeOutDelList = new Fx.Tween(deleteListItemA, {duration: OpacityWait}).start("opacity", 0);
		}
	});	
}

function initiateDeleteButtons(){
	var userListItems;
	userListItems = $$("div#rightpane ul.sortable li");
	userListItems.each(function(dellistitem){
		initiateDeleteButton(dellistitem);
	});
	userListItems = $$("div#rightpane ul.unsortable li");
	userListItems.each(function(dellistitem){
		//initiateDeleteButton(dellistitem,'T&auml;nk p&aring; att du m&aring;ste rekommendera 3 b&ouml;cker f&ouml;r att dina rekommendationer ska r&auml;knas i Bok-SM.');
		initiateDeleteButton(dellistitem,'Du har inga r&ouml;ster nu');
	});
}

function doBookmarks(){
	if (bmContainer != null) {
		recalculateBmHeight();
		
		bmContainer.addEvent("mousemove", function(ev) {
			var bmContOffset = bmContainer.getPosition().y,
				mousePosY = ev.page.y,
				bmHeight = bm.clientHeight,
				bmContHeight = bmContainer.getStyle("height").toInt();
			marginPosY = mousePosY - bmContOffset - (bmHeight / 2);
			
			if (marginPosY < 0)
				marginPosY = 0;
			else if (bmContHeight <= marginPosY + bmHeight)
				marginPosY = bmContHeight - bmHeight;
			
			bmContainer.setStyle("background-position", "0px " + marginPosY + "px");
		});
		
		bmContainer.addEvent("mouseenter", function() {
			var FadeInCont = new Fx.Tween(bmContainer, {duration: OpacityWait}).start("opacity", 1);
		});
		
		bmContainer.addEvent("mouseleave", function() {
			if (!bmVisiBool) {
				var FadeOutCont= new Fx.Tween(bmContainer, {duration: OpacityWait, onComplete:function() {
					bmContainer.setStyle("visibility", "visible");
				}}).start("opacity", 0);
			} else
				bmContainer.setStyle("background-position", "0px " + (0 - bm.clientHeight) + "px");
		});
		
		bmContainer.addEvent("click", function(ev) {
			if (bmList != null) {
				if (bmVisiBool)
					var MoveBM = new Fx.Tween(bm, {duration: OpacityWait * 1.5, transition: Fx.Transitions.Circ.easeInOut, onComplete: function() {
							var oldListItemID = newListItemID;
							newListItemID = newListItemID.substring(0, newListItemID.lastIndexOf(":")+1) + marginPosY;
							if ($(oldListItemID) != null)
								$(oldListItemID).id = newListItemID;
							updateUserLists(bmList);
						}}).start("margin-top", marginPosY);
				else {
					bm.setStyle("margin-top", marginPosY);
					saveBMPosition(marginPosY);
					var FadeInBM = new Fx.Tween(bm, {duration: OpacityWait, onComplete: function() {
						bmVisiBool = true;
					}}).start("opacity", 1);
				}
			} else {
				gMessage("register", "", "Du m&aring;ste vara inloggad f&ouml;r att l&auml;gga till bokm&auml;rken");
			}
		});
	}
}

function doBooklist() {
	var booklistAnchors = $$("a.addbooklist");
	booklistAnchors.each(function(bAnchor){
		bAnchor.addEvent("click", function() {
			if (blList != null)
				saveBookmark(this);
			else
				gMessage("register", "", "Du m&aring;ste vara inloggad f&ouml;r att l&auml;gga till b&ouml;cker i din boklista");
		});
	});
}

function doLibraryBooklist() {
	var booklistAnchors = $$("a.addlibrarybooklist");
	booklistAnchors.each(function(bAnchor){
		bAnchor.addEvent("click", function() {
			if (blList != null)
				saveLibraryBook(this);
			else
				gMessage("register", "", "Du m&aring;ste vara inloggad f&ouml;r att l&auml;gga till b&ouml;cker i ditt bibliotek");
		});
	});
        booklistAnchors = $$("a.removelibrarybooklist");
        
	booklistAnchors.each(function(bAnchor){
		bAnchor.addEvent("click", function() {
			if (blList != null)
				removeLibraryBook(this);
			else
				gMessage("register", "", "Du m&aring;ste vara inloggad f&ouml;r att ta bort b&ouml;cker i ditt bibliotek");
		});
	});
}

function saveRecommendation(obj){ //id,text) {
	var brString = obj.getProperty("rel");
	if (!brString || brString.indexOf("|") <= 0)
		return;
	
	//var brID = id,
	//    brTitle = $('booktitle').innerHTML,
	//    dublicateListID = null,
	//    brListItems = brList.getElements("li");
	var brArray = brString.split("|"),
		brID = brArray[1],
		brTitle = brArray[2],
		dublicateListID = null,
		brListItems = brList.getElements("li");
		brListItems2 = brList.getElements("li a.deletelistitem");
		
	//alert(brListItems2.length);
	if(brListItems2.length>0){
		gMessage('infostop','Bok-SM','Du har redan r&ouml;stat p&aring; en bok, ta bort en r&ouml;st och f&ouml;rs&ouml;k igen.<br /><br />Ta bort en r&ouml;st genom att klicka med musen till h&ouml;ger om boktiteln under rubriken &quot;Mina r&ouml;ster i Bok-SM&quot; som du hittar i h&ouml;gerspalten under ditt anv&auml;ndarnamn.');
		return;
	}
	var ownbooks = $$('ul.ownbooks li a');
	var ok = true;
	for (i = 0; i < ownbooks.length; i++) {
		
		var rel = ownbooks[i].getProperty("rel");
		if(rel==brID){
			ok = false;
			break;
		}
		//var addedBookIDs = brListItems[i].id.substring(brListItems[i].id.indexOf(":")+1, brListItems[i].id.length);
		//if (brID == addedBookIDs)
		//	dublicateListID = brListItems[i].id;
	}
	for (i = 0; i < brListItems.length; i++) {
		
		var addedBookIDs = brListItems[i].id.substring(brListItems[i].id.indexOf(":")+1, brListItems[i].id.length);
		if (brID == addedBookIDs){
			dublicateListID = brListItems[i].id;
		}
	}
	if (dublicateListID == null && ok){
		createListItem("bookrecommendlist", "recommend:" + brID, baseurl + 'lasbok?bid=' + brID, brTitle, "", "br",'Du har r&ouml;st p&aring; boken i Bok-SM.');
	} else if(ok){
		gMessage('infostop','Bok-SM','Du har redan r&ouml;stat p&aring; den h&auml;r boken till Bok-SM.');
	} else {
		gMessage('infostop','Bok-SM','Du kan inte r&ouml;sta p&aring; ditt eget bidrag till Bok-SM.');
	}
}


function saveCompetitionRecommendation(obj){ //id,text) {
	
	var brString = obj.getProperty("rel");
	if (!brString || brString.indexOf("|") <= 0)
		return;
	
	//var brID = id,
	//    brTitle = $('booktitle').innerHTML,
	//    dublicateListID = null,
	//    brListItems = brList.getElements("li");
	var brArray = brString.split("|"),
		brID = brArray[1],
		brTitle = brArray[2],
		dublicateListID = null,
		brListItems = brList.getElements("li");
		brListItems2 = brList.getElements("li a.deletelistitem");
		
	//alert(brListItems2.length);
	if(brListItems2.length>2){
		gMessage('infostop','T&auml;vling','Du har redan r&ouml;stat p&aring; tre b&ounl;cker, ta bort en r&ouml;st och f&ouml;rs&ouml;k igen.<br /><br />Ta bort en r&ouml;st genom att klicka med musen till h&ouml;ger om boktiteln under rubriken &quot;Mina r&ouml;ster i T&auml;vlingen&quot; som du hittar i h&ouml;gerspalten under ditt anv&auml;ndarnamn.');
		return;
	}
	var ownbooks = $$('ul.ownbooks li a');
	var ok = true;
	for (i = 0; i < ownbooks.length; i++) {
		
		var rel = ownbooks[i].getProperty("rel");
		if(rel==brID){
			ok = false;
			break;
		}
		//var addedBookIDs = brListItems[i].id.substring(brListItems[i].id.indexOf(":")+1, brListItems[i].id.length);
		//if (brID == addedBookIDs)
		//	dublicateListID = brListItems[i].id;
	}
	for (i = 0; i < brListItems.length; i++) {
		
		var addedBookIDs = brListItems[i].id.substring(brListItems[i].id.indexOf(":")+1, brListItems[i].id.length);
		if (brID == addedBookIDs){
			dublicateListID = brListItems[i].id;
		}
	}
	if (dublicateListID == null && ok){
		createListItem("bookrecommendlist", "recommend:" + brID, baseurl + 'lasbok?bid=' + brID, brTitle, "", "br",'Du har tagit bort din r&ouml;st i t&auml;vlingen.');
	} else if(ok){
		gMessage('infostop','T&auml;vling','Du har redan r&ouml;stat p&aring; den h&auml;r boken i t&auml;vlingen.');
	} else {
		gMessage('infostop','T&auml;vling','Du kan inte r&ouml;sta p&aring; ditt eget bidrag i t&auml;vlingen.');
	}
}

function saveLibraryBook(obj) {

	var req = new Request({
                url: liburl,
                data: "add=" + obj.rel,
                onSuccess:function(req){
                        var r = JSON.decode(req);

                        if(r!=undefined && r.text!=undefined) {
                            gMessage('infostop',r.title,r.text);
                            window.location.href = window.location.href;
                        }
                }
        }).send();
}

function removeLibraryBook(obj) {

	var req = new Request({
                url: liburl,
                data: "del=" + obj.rel,
                onSuccess:function(req){
                        var r = JSON.decode(req);

                        if(r!=undefined && r.text!=undefined) {
                            gMessage('infostop',r.title,r.text);
                            window.location.href = window.location.href;
                        }
                }
        }).send();
}

function saveBookmark(obj) {
	var blString = obj.getProperty("rel");
	if (!blString || blString.indexOf("|") <= 0)
		return;
	
	var blArray = blString.split("|"),
		blID = blArray[1],
		blTitle = blArray[2],
		dublicateListID = null,
		blListItems = blList.getElements("li");
	
	for (i = 0; i < blListItems.length; i++) {
		var addedBookIDs = blListItems[i].id.substring(blListItems[i].id.indexOf(":")+1, blListItems[i].id.length);
		if (blID == addedBookIDs)
			dublicateListID = blListItems[i].id;
	}
	
	for (i = 0; i < blListItems.length; i++) {
		var addedBookIDs = blListItems[i].id.substring(blListItems[i].id.indexOf(":")+1, blListItems[i].id.length);
		if (blID == addedBookIDs)
			dublicateListID = blListItems[i].id;
	}
	
	if (dublicateListID == null)
		createListItem("booklistlist", "list:" + blID, baseurl + 'lasbok?bid=' + blID, blTitle, "", "bl");
}

function ellipCut(string,len){
	return (string.length > len ? string.substr(0,(len-2))+"&hellip;":string);
}

function createListItem(listObjID, newListID, myHref, myTitle, myText, ajaxTask,deletetext) {
	var listObj = $(listObjID),
		newListItem = new Element("li", {
			id: (newListID)?newListID:"",
			styles: {
				"height": "0px",
				"visibility": "hidden",
				"opacity": 0
			},
			text: (myText)?myText:""
		}),
		delAnchor = new Element("a", {
			"href": "javascript:;",
			"class": "deletelistitem"
		}),
		hrefAnchor = new Element("a", {
			"href": myHref,
			"html": ellipCut(myTitle,40)
		});
	
	hrefAnchor.inject(newListItem, "top");
	delAnchor.inject(newListItem, "top");
	
	if (listObj != null) {
		if (listObj.hasClass("empty")) {
			for( i = 0, emptyListItems = listObj.getChildren("li"); i < emptyListItems.length; i++)
				if (!emptyListItems[i].id)
					emptyListItems[i].dispose();
			listObj.removeClass("empty");
		}
		if(deletetext){
			initiateDeleteButton(newListItem,deletetext);
		} else {
			initiateDeleteButton(newListItem);
		}
		listObj.adopt(newListItem);
		if(userListArray[listObjID]!=undefined){
			userListArray[listObjID].addItems(newListItem);
		}
		var FadeInListItem = new Fx.Tween(newListItem, {duration: OpacityWait}).start("opacity", 1),
			MaximizeListItem = new Fx.Tween(newListItem, {duration: OpacityWait}).start("height", listObj.getElement("li").getStyle("font-size").toInt() + 3);
		updateUserLists(listObj);
		recolorizeListItems(listObj);
		repopulateVariables();
	}
}

function saveBMPosition(ypos) {
	var myDate = new Date(),
		bmYear = myDate.getFullYear() + "",
		bmYear = bmYear.substr(2,2),
		titleMaxLength = 25,
		bmMonth = shortMonthNames[myDate.getMonth()],
		bmDay = myDate.getDate(),
		bmSec = parseInt(myDate.getTime() / 1000),
		myTitle = $("booktitle").get("text"),
		myTitle = (myTitle.length < titleMaxLength)?myTitle:myTitle.substring(0, titleMaxLength) + "&hellip;",
		dublicateListID = null,
		bmListItems = bmList.getElements("li");
	
	for (i = 0; i < bmListItems.length; i++) {
		var addedBookIDs = bmListItems[i].id.substring(bmListItems[i].id.indexOf(":")+1, bmListItems[i].id.indexOf(":", bmListItems[i].id.indexOf(":")+1));
		if (window.bookid == addedBookIDs)
			dublicateListID = bmListItems[i].id;
	}
	
	newListItemID = "book:" + bookid + ":" + chapterid + ":" + pagenum + ":" + bmSec + ":" + ypos;
	if (dublicateListID != null) {
		$(dublicateListID).id = newListItemID;
		updateUserLists(bmList);
	} else {
		var myText = " (" + bmDay + " " + bmMonth + " " + bmYear + ")";
		createListItem("bookmarklist", newListItemID, document.location.href, myTitle, myText);
	}
}

function updateUserLists(listobj,text) {
	var task;
	
	if($(listobj).id == "bookmarklist") { task = "bm"; }
	else if($(listobj).id == "booklistlist") { task = "bl"; } 
	else if($(listobj).id == "bookrecommendlist") { task = "br"; }//"T&auml;nk p&aring; att du m&aring;ste rekommendera 3 b&ouml;cker f&ouml;r att dina rekommendationer ska r&auml;knas." }
	
	var listItems = listobj.getElements("li"),
		listIDArray = new Array(),
		AjaxTask = task;

	for (i = 0; i < listItems.length; i++)
		listIDArray.push(listItems[i].id  + ":" + i);
	doAjax(AjaxTask, listIDArray.join(";"),text);
}

function doAjax(task, request, text) {
	var req = new Request({
			url: bmurl,
			data: task + "=" + request,
			onSuccess:function(req){
				
				if(text==undefined){
					var r = JSON.decode(req);
					
					if(r!=undefined && r.text!=undefined) { gMessage('infostop',r.title,r.text); }
				} else {
					gMessage('infostop','T&auml;vling',text);
				}
			}
		}).send();
}

function recolorizeListItems(obj) {
	var listItems = obj.getElements("li");
	for (i = 0; i < listItems.length; i++)
		listItems[i].className = (i % 2 == 0)?"":"even";
}

function deleteListItem(obj,text) {
	var listRow = obj.getParent(),
		listContainer = listRow.getParent(),
		listRowID = listRow.id,
		delBookID = listRowID.substring(listRowID.indexOf(":")+1, listRowID.indexOf(":", listRowID.indexOf(":")+1)),
		delBookID = (!isNaN(delBookID) && parseInt(delBookID) > 0)?delBookID:listRowID.substring(listRowID.indexOf(":")+1, listRowID.length),
		FadeOutListItem = new Fx.Tween(listRow, {duration: OpacityWait}).start("opacity", 0);
		MinimizeListItem = new Fx.Tween(listRow, {duration: parseInt(OpacityWait * 1.5), onComplete:function() {
			
			if(userListArray[listContainer.id]!=undefined){
				userListArray[listContainer.id].removeItems(listRow);
			}
			listRow.destroy();
			listRow.dispose();
			if (!listContainer.getChildren("li").length) {
				listContainer.addClass("empty");
				new Element("li", {
					"html": "Du har ingenting sparat h&auml;r"
				}).inject(listContainer);
			}
			recolorizeListItems(listContainer);
			updateUserLists(listContainer,text);
		}}).start("height", 0);
	
	if (window.bookid == delBookID && bm) {
		var FadeOutBM = new Fx.Tween(bm, {duration: OpacityWait, onComplete: function() {
			bmVisiBool = false;
		}}).start("opacity", 0);
	}
}


window.addEvent("domready", function() {
	// redeclare global variables
	repopulateVariables();
	
	doBookmarks();
	doBooklist();
        doLibraryBooklist();
	initiateDeleteButtons();
	
	userListsSortables.each(function(listobj) {
		var sortableList = new Sortables(listobj, {
			constrain: true,
			snap: 5,
			handle: "li",
			doSort: false,
			onSort: function() {
				recolorizeListItems(listobj);
				this.doSort = true;
			},
			onComplete: function() {
				if (this.doSort)
					updateUserLists(listobj);
				this.doSort = false;
			}
		});
		
		userListVarArray.push(sortableList);
		userListIDArray.push(listobj.id);
	});
	/*
	 userListsUnsortables.each(function(listobj) {
	
		userListVarArray.push(listobj);
		userListIDArray.push(listobj.id);
		
	});
	*/
	userListArray = userListVarArray.associate(userListIDArray);
	
	//var i = 0;
});

