/* Add dynamic behaviours to shortlist links
   Author:			Andrew Hedges, andrew@bookabach.co.nz
   Date:			15/7/08
   Last modified:	15/7/08
   Requires:		jquery.js
*/

if ('undefined' === typeof BOOKABACH) {
	BOOKABACH = {};
}

BOOKABACH.shortlist = (function () {
	// private variables
	var _classname, _a, _shortlist, _listStyle;
	
	_classname = 'shortListedBach';
	
	_a = (function () {
		var a;
		a = document.createElement('A');
		$(a).attr({'style' : 'text-decoration: underline;'}).addClass('shortlist');
		return a;
	})();
	
	// private methods
	var _addEventListener, _getBachIdFromUrl, _makeShortlisted, _makeUnshortlisted, _toggleViewShortlistLinks, _removeShortlistItem;
	
	_addEventListener = function (element) {
		$(element).click(function () {
			$.ajax({
				type     : 'GET',
				url      : element.href,
				complete : (function (transport) {
					if ('sidebar' === _listStyle) {
						return function (transport) {
							_removeShortlistItem(element);
						};
					} else {
						if (element.href.indexOf('addFavourite') > -1) {
							return function (transport) {
								_makeShortlisted(element);
							};
						} else {
							return function (transport) {
								_makeUnshortlisted(element);
							};
						}
					}
				})()
			});
			return false;
		});
	};
	
	_getBachIdFromUrl = function (url) {
		var queryVals;
		queryVals = BOOKABACH.utils.getKeysAndValuesFromUrl(url);
		if ('undefined' === typeof queryVals.favBachId) {
			return undefined;
		} else {
			return +queryVals.favBachId;
		}
	};
	
	_addToShortlist = function (bachId) {
		_shortlist[_shortlist.length] = bachId;
		_shortlist = $.unique(_shortlist);
	};
	
	_removeFromShortlist = function (bachId) {
		_shortlist = $.grep(_shortlist, function (id, idx) {
			return id !== bachId;
		});
	};
	
	_makeShortlisted = function (element) {
		var a, bachId;
		if ($(element.parentNode.parentNode.parentNode).hasClass('container')) {
			$(element.parentNode.parentNode.parentNode).addClass(_classname);
		} else {
			$(element.parentNode).addClass(_classname);
		}
		a           = _a.cloneNode(true);
		a.href      = element.href.replace(/addFavourite/, 'removeFavourite');
		a.innerHTML = 'Remove from Shortlist';
		element.parentNode.replaceChild(a, element);
		_addEventListener(a);
		bachId = _getBachIdFromUrl(a.href);
		if ('undefined' !== typeof bachId) {
			_addToShortlist(bachId);
			_toggleViewShortlistLinks();
		}
	};
	
	_makeUnshortlisted = function (element) {
		var a, bachId;
		if ($(element.parentNode.parentNode.parentNode).hasClass('shortListedBach')) {
			$(element.parentNode.parentNode.parentNode).removeClass(_classname).addClass('container');
		} else {
			$(element.parentNode).removeClass(_classname).addClass('container');
		}
		a           = _a.cloneNode(true);
		a.href      = element.href.replace(/removeFavourite/, 'addFavourite');
		a.innerHTML = 'Add to Shortlist';
		element.parentNode.replaceChild(a, element);
		_addEventListener(a);
		bachId = _getBachIdFromUrl(a.href);
		if ('undefined' !== typeof bachId) {
			_removeFromShortlist(bachId);
			_toggleViewShortlistLinks();
		}
	};
	
	_toggleViewShortlistLinks = function () {
		var display;
		display = _shortlist.length > 0 ? 'inline' : 'none';
		$('.viewShortlist').css({display : display});
	};
	
	_removeShortlistItem = function (element) {
		var bachId;
		$(element.parentNode.parentNode).remove();
		bachId = _getBachIdFromUrl(element.href);
		if ('undefined' !== typeof bachId) {
			_removeFromShortlist(bachId);
			if (0 === _shortlist.length) {
				$('.shortlistaction').remove();
				$('#addproperty').show();
			}
		}
	};
	
	// public methods
	return {
		init: function (shortlist, type) {
			_shortlist = shortlist || [];
			_listStyle      = type || 'searchresult';
			$('a.shortlist').each(function () {
				var href;
				href = this.href;
				href = href.split('#')[0];
				this.href = href;
				_addEventListener(this);
			});
		}
	};
})();
