/*****************************************************************
 AUTHOR: BRENDON CRAWFORD (CodeMagi, Inc)
 CONTACT: <brendon at codemagi dotcom>
 CREATED: 2007-10-03
 REQUIRES: JQuery 1.2.1+
******************************************************************/

//JQuery Compatibility
if(!window.$j) { var $j = jQuery.noConflict();}

var LB = new Object;
LB.lbURL = '/lightbox';
LB.thumbURL = '/thumbnail/40/40';
LB.blankImage = "/images/spacer.gif";
LB.ELM_MAP = [];
LB.ITEM_MAP = [];
LB.PAGE = [];
LB.paginator = null;
LB.PAGE_OFFSET = 0;
LB.selectElm = null;
LB.SELECTED = null;
LB.def = 0;
LB.defName = "UNNAMED";
LB.LIGHTBOX = false;
LB.ADD_TEXT = "Add to lightbox";
LB.REM_TEXT = "Remove from lightbox";

//Comment out contnts for live
LB.debug = function() {
 //For debugging
 //console.trace();
}

LB.assignSelected = function() {
	//This can be set to zero, so we need to do strict checking
	if(
		LB_INIT_SELECTED !== undefined &&
		LB_INIT_SELECTED !== false &&
		LB_INIT_SELECTED !== null &&
		LB_INIT_SELECTED !== ""
	) {
	 LB.SELECTED = LB_INIT_SELECTED;
		//Only use the init variable once if we have a select
		if(LB.selectElm !== false) {
		 LB_INIT_SELECTED = false;
		}
	}
	//Use the selectElm
	else if(LB.selectElm !== false) {
	 LB.SELECTED = parseInt(LB.selectElm.val());
	}
	//Fallback last resort
	else {
	 LB.SELECTED = LB.def;
	}
}

/*
	Kicks everything off
*/
LB.init = function() {
 LB.selectElm = $j('#lightboxId');
 LB.paginator = $j('#paginator');
	//If select elm doesnt exist set it to false
	if(!LB.selectElm.length) {
	 LB.selectElm = false;
	}
 LB.assignSelected();
	//Sometimes the selectElm wont exist
	if(!LB.selectElm) {
		 LB.ITEM_MAP[LB.SELECTED] = {
			elm : false,
			list : [],
			grabbed : false
		 };
	}
	//Loop through selectElm
	else {
		$j( 'option', LB.selectElm).each(function() {
		 LB.ITEM_MAP[parseInt(this.value)] = {
			elm : $j(this),
			list : [],
			grabbed : false
		 };
		});
	}
	//Populate the paginator
	$j('.lbPage').each(function(i) {
	 LB.PAGE[i] = $j(this);
	});
	//First assign the ELM_MAP
	$j('.lbitem').each(function(i){;
	 thisImg = this.appendChild(document.createElement('img'));
	 thisImg.src = LB.blankImage;
	 LB.ELM_MAP[i] = {
		elm : $j(this),
		img : thisImg
	 }
	 //We need to set a var to state that a lightbox element actually exists
	 LB.LIGHTBOX = true;
	});
	//We will most likely always be using inline vars
	if(LB_VALS) {
	 LB.grabItems(LB.SELECTED, {usedata:LB_VALS});
	}
	//Just in case no inline vars exist
	else {
	 LB.grabItems(LB.SELECTED);
	}
}

LB.tb_gallery = function(itemID){
 var ret = $j.ajax({
	url : "/asset/"+itemID+"/asset_popup.jsp",
	type : "GET",
	dataType : "text",
	async : false
 });
 return ret.responseText;
}

LB.tb_imgurl = function(itemID) {
 window.location.href = "/download?acton=download&id=" + itemID + "&returnPage=/page/100";
}

LB.redrawLinks = function() {
 var txt;
	$j('.lbAction').each(function(){
	 itemID = parseInt(this.id.match(/lbitem_(\d+)/i)[1]);
		if(LB.itemExists(itemID)) {
		 txt = LB.REM_TEXT;
		}
		else {
		 txt = LB.ADD_TEXT;
		}
	 $j(this).text(txt);
	});
}

LB.saveLightbox = function() {
	//Saving the blank lb
	//Or if a lightbox doesnt even exist, we can still save it
	//only in certain situations
	if(LB.SELECTED == LB.def || !LB.LIGHTBOX) {
	 //thickbox.jquery
	 tb_show(null, '/lightbox_form_save.jsp?height=220&width=400', false);
	}
	//Save an existing one
	else {
	 $j.get(LB.lbURL, {acton : 'saveAjax', name : ''});
	}
}

LB.handleEmailForm = function(frm) {
	$j(frm).ajaxSubmit({dataType:'json', success: function(data){
	 LB.setFormStatus( data.confirmation.msg, data.confirmation.code );
	}});
}

LB.setFormStatus = function(msg, code) {
 $j('#lbFormStatus').text(msg);
	if(code == 1) {
	 window.setTimeout(tb_remove, 3000);
	}
}

LB.handleSubmitForm = function(frm) {
 var backupSelect;
	//form.jquery
	$j(frm).ajaxSubmit({dataType:'json', success: function(data){
		//A lightbox will not ALWAYS exist. sometimes it will be gone
		if(LB.LIGHTBOX) {
		 LB.addLightbox(data.confirmation.id, data.confirmation.name, {copy:LB.def});
		}
		//Sometimes we need to populate a backup select element
		//Which is not affiliated with the main lightbox element
		else if( backupSelect = $j('#id') ) {
		 backupSelect = backupSelect[0];
		 backupSelect.options[backupSelect.selectedIndex].text = data.confirmation.name;
		}
	 LB.setFormStatus( data.confirmation.msg, data.confirmation.code );
	}});
}

LB.killLightbox = function(options) {
 options = $j.extend({
	which : LB.SELECTED
 }, options);
 //Remove select option
	if(LB.ITEM_MAP[options.which].elm !== false) {
	 LB.ITEM_MAP[options.which].elm.remove();
	}
 LB.ITEM_MAP[options.which] = undefined;
}

LB.newLightbox = function(){
	if(!LB.ITEM_MAP[LB.def]) {
	 LB.addLightbox(LB.def, LB.defName);
	}
	else {
	 LB.clearLightbox({which:LB.def, andSelect:true});
	}
}

LB.addLightbox = function(id, name, options){
 options = $j.extend({
	copy : false
 });
 //Create new option
 var opt = $j("<option>").text(name).attr("value",id);
 //Add new lightbox to select list
 LB.ITEM_MAP[id] = new Object;
	//If a select element exists
	if(LB.selectElm) {
	 LB.ITEM_MAP[id].elm = opt;
	 LB.selectElm.append(opt);
	}
	//If the select element doesnt exist
	else {
	 LB.ITEM_MAP[id].elm = false;
	}
	//If we do a data copy
	if(options.copy !== false) {
	 LB.ITEM_MAP[id].list = LB.ITEM_MAP[options.copy].list;
	}
	else {
	 LB.ITEM_MAP[id].list = [];
	}
 //Select new element
 LB.setLightboxSelect(id);
}

LB.clearLightbox = function(options) {
 options = $j.extend({
	andSelect : true,
	which : LB.SELECTED
 }, options);
 LB.ITEM_MAP[options.which].list = [];
 LB.redrawElms();
	if(options.andSelect) {
	 LB.setLightboxSelect(options.which);
	}
}

LB.setLightboxSelect = function(val) {
	$j('option', LB.selectElm).each(function() {
		if(parseInt(this.value) == val) {
		 this.selected = true;
		}
		else {
		 this.selected = false;
		}
	});
 //Update list drawing
 LB.selectList();
}

LB.grabItems = function(id, options) {
 options = $j.extend({
	usedata : false
 }, options);
 var handler = function(data) {
	if(!LB.ITEM_MAP[id].grabbed){
	 $j.each(data.items, function(){ LB.makeItem(this); });
	 LB.ITEM_MAP[id].grabbed = true;
	}
  LB.redrawElms();
 }
	//Use local vars
	if(options.usedata) {
	 handler(options.usedata);
	}
	//Use ajax vars
	else {
	 $j.getJSON( LB.lbURL, { acton : 'loadAjax', id : id}, handler);
	}
}

LB.selectList = function() {
 LB.assignSelected();
	//Remove if a default exists and this is not it.
	if(LB.ITEM_MAP[LB.def] && LB.SELECTED != LB.def){
	 LB.killLightbox({which:LB.def});
	}
 LB.grabItems(LB.SELECTED);
}

/*
	Checks if item exists
*/
LB.itemExists = function(val) {
 var i, il;
	for(i = 0, il = LB.ITEM_MAP[LB.SELECTED].list.length; i < il; i++) {
		if(LB.ITEM_MAP[LB.SELECTED].list[i] == val) {
		 return true;
		}
	}
 return false;
}

/*
	Removes item and compacts list
*/
LB.removeItem = function(val) {
 var tmpList = [];
 var i, il;
	for(i = 0, il = LB.ITEM_MAP[LB.SELECTED].list.length; i < il; i++) {
		if(LB.ITEM_MAP[LB.SELECTED].list[i] == val) {
		 LB.ITEM_MAP[LB.SELECTED].list[i] = undefined;
		}
	}
	for( i = 0, il = LB.ITEM_MAP[LB.SELECTED].list.length; i < il; i++) {
		if(LB.ITEM_MAP[LB.SELECTED].list[i] != undefined) {
		 tmpList[tmpList.length] = LB.ITEM_MAP[LB.SELECTED].list[i];
		}
	}
 LB.ITEM_MAP[LB.SELECTED].list = tmpList;
 LB.redrawElms();
}

/*
	Api interfae to add and remove items
	Use only rewriteLink to rewrite links
	which are located in external implementations
	for example in the thickbox popup
*/
LB.processItem =
lightboxRemoval =
lightboxSelection =
function(val, thisLink, rewriteLink) {
 	// ADD AN ITEM
	if(!LB.itemExists(val)) {
	 $j.ajax({
		url : LB.lbURL,
		data : {
		 acton : 'add_ajax',
		 id : val
		},
		complete: function(data) {
			if(rewriteLink) {
			 $j(thisLink).text(LB.REM_TEXT);
			}
		 LB.addItem(val);
		}
	 });
	}
	// REMOVE ITEM
	else {
	 $j.ajax({
		url : LB.lbURL,
		data : {
		 acton : 'remove_ajax',
		 id : val
		},
		complete: function(data) {
			if(rewriteLink) {
			 $j(thisLink).text(LB.ADD_TEXT);
			}
		 LB.removeItem(val);
		}
	 });
	}
}

/*
	Post-init item addition
*/
LB.addItem = function(val) {
 LB.makeItem(val);
 LB.redrawElms();
}

/*
	Shifts items up and adds new one at beginning
*/
LB.makeItem = function(val) {
	for(var i = LB.ITEM_MAP[LB.SELECTED].list.length; i > 0; i--) {
	 LB.ITEM_MAP[LB.SELECTED].list[i] = LB.ITEM_MAP[LB.SELECTED].list[i-1];
	}
 LB.ITEM_MAP[LB.SELECTED].list[0] = val;
}

/*
	Redraw all ELMS
*/
LB.redrawElms = function(options) {
 options = $j.extend({
	pageoffset : 0
 }, options);
 var i, il, dataOffset;
 var maxVal = Math.ceil(LB.ITEM_MAP[LB.SELECTED].list.length/LB.ELM_MAP.length);
	//No values exist
	if(maxVal <= 0) {
	 dataOffset = 0;
	}
	//Negative value or zero
	else if(options.pageoffset <= 0) {
	 dataOffset = 0;
	}
	//Too big
	else if(options.pageoffset > maxVal-1) {
	 dataOffset = maxVal-1;
	}
	//Within range
	else {
	 dataOffset = options.pageoffset;
	}
 var itemOffset = dataOffset * LB.ELM_MAP.length;
	for(i = 0, il = LB.ELM_MAP.length; i < il; i++) {
		if(i+itemOffset < LB.ITEM_MAP[LB.SELECTED].list.length) {
	 	 thisSrc = LB.getImgURL(LB.ITEM_MAP[LB.SELECTED].list[i+itemOffset]);
		}
		else {
		 thisSrc = LB.blankImage;
		}
	 LB.ELM_MAP[i].img.src = thisSrc;
	}
 //Redraw the paginator
 LB.redrawPage({offset:options.pageoffset});
 //redraw the links too
 LB.redrawLinks();
 LB.debug();
}

LB.movePage = function(count) {
 LB.redrawElms({pageoffset: LB.PAGE_OFFSET + count});
}

/*
	Redraws the paginator
*/
LB.redrawPage = function(options) {
 options = $j.extend({
	offset : 0
 }, options);
 var i, il, dataOffset, renderOffset;
 var maxVal = Math.ceil(LB.ITEM_MAP[LB.SELECTED].list.length/LB.ELM_MAP.length);
	//If we dont have at least 2 pages, hide the paginator
	if(maxVal <= 1) {
	 LB.paginator.hide();
	}
	else {
	 LB.paginator.show();
	}
	//First
	if(options.offset <= 0) {
	 dataOffset = 0;
	 LB.PAGE_OFFSET = 0;
	}
	//Last
	else if(options.offset+1 >= maxVal) {
		//Last, but not filling entire list
		if(options.offset+1 < LB.PAGE.length) {
		 dataOffset = 0;
		 LB.PAGE_OFFSET = 0;
		}
		//Last, and has at least filled list
		else {
		 dataOffset = maxVal - LB.PAGE.length;
		 LB.PAGE_OFFSET = maxVal - 1;
		}
	}
	//Not last
	else {
	 dataOffset = options.offset-1;
	 LB.PAGE_OFFSET = options.offset;
	}
	for(i = 0, il = LB.PAGE.length; i < il; i++) {
	 renderOffset = i+dataOffset;
		//Always show the first one
		if(renderOffset+1 <= maxVal || renderOffset == 0) {
		 pageText = renderOffset+1;
		 LB.setPageHandler(i, dataOffset);
		}
		else {
		 pageText = "";
		}
	 LB.PAGE[i].text(pageText);
	}
}

/*
	Sets click for paginator items
*/
LB.setPageHandler = function(index, offset) {
 LB.PAGE[index][0].onclick = function() {
  LB.redrawElms({pageoffset:index+offset});
 }
}

/*
	Gets URL for item
*/
LB.getImgURL = function(val) {
 return (LB.thumbURL + '/' + val);
}
