function ParadeQLoader(p_opts){
	var _this;
	var _data = [];
	var _index = 0;
	var _settings = {};
	var _defaults = {
		autoStart	: true,
		loadThumbs	: true,
		imgStarted	: function(){},
		imgLoaded	: function(){},
		qComplete	: function(){},
		firstLoad	: function(){}
		// imageComplete	: function(){},
		// loaded 		: function(){},
	};
	var _curr = null;
	var _return;
	var _isRunning = false;
	var _stopped = false;
	var _firstRun = true;
	

	function init(){
		_settings = $.extend(true, {}, _defaults, p_opts);	//	merge options with default settings	
		_data = _settings.images;
		//	create public object for return to calling script (public ParadeQLoader object)
		_this = {
			data	: _data,
			start 	: startQueue,
			// stop	: stopQueue,
			add		: addToQueue,
			reset	: reset
		};
		
		if (_settings.autoStart) startQueue();
	};
	
	function startQueue(){
		// if(window.console) window.console.log('startQueue()');
		_isRunning = true;
		_stopped = false;
		loadImage();
	};
	
	function stopQueue(){
		// if(window.console) window.console.log('stopQueue()');
		_isRunning = false;
	};
	
	function queueComplete(){
		// if(window.console) window.console.log('queueComplete()');
		_isRunning = false;
		_settings.qComplete.call();
	};
	
	function addToQueue(p_obj){
		// if(window.console) window.console.log('add()');
		if (p_obj.path) _data.push(p_obj);
	};
	
	function reset(p_data){
		cleanUp();
		_data = _this.data = p_data;
		startQueue();
	};
	
	//	set isThumb to true if loading a thumb
	function loadImage(isThumb){
		if (_stopped) return;

		if(isThumb != true) isThumb = false;
		if (!isThumb) {
			_curr = _data.shift();	//	get data for next image to load
			_return = {
				gIndex:_curr.gIndex,
				iIndex:_curr.iIndex
			};	//	reset _return to empty object
		};

		//	create new image node for main image
		var i = $(new Image()).load(function(){
			if (!isThumb) {
				_return.main = $(this);
				if (_settings.loadThumbs) {
					loadImage(true);
				}else{
					imageComplete(_return);
				};
			}else{
				_return.thumb = $(this);
				imageComplete(_return);
			};
		}).error(function(){
			if(window.console) window.console.log('ParadeQLoader. Error loading image:', $(this));
		}).attr(formatAttributes(isThumb));
		if (!isThumb) _settings.imgStarted.call(i);
	};
	
	function imageComplete(p_obj){
		_settings.imgLoaded.call(p_obj);
		if (_firstRun) { _settings.firstLoad.call(); _firstRun = false; }
		if(hasNext()) loadImage();
	};
	

/*
**	=helper functions
******************************/
	function formatAttributes(isThumb){
		var attrs;
		if (isThumb) {
			attrs = {
				src		: _curr.thumb,
				alt		: _curr.title,
				width	: _curr.tWidth,
				height	: _curr.tHeight
			};
		}else{
			attrs = {
				src		: _curr.path,
				alt		: _curr.title,
				width	: _curr.width,
				height	: _curr.height
			};
		};
		return attrs;
	};
	
	function hasNext(){
		if (_data.length > 0) {
			return true;
		}else{
			queueComplete();
			return false;
		};
	};
	
	function cleanUp(){
		// if(window.console) window.console.log('cleanUp()',_return,_return.main,_return.thumb);
		if (_return.main) $(_return.main).unbind();
		if (_return.thumb) $(_return.thumb).unbind();
		
		_stopped = true;
		_data = [];
		// $('img').unbind('load');
		
	};
	

	init();
	return _this;
} // end ParadeQLoader class
