//defaults
var _popup = { speed:500, queue:new Array(), current:{}, instant:false, active:false, idx:0, offset:0, masker:{ show:true, opacity:0.6 }, defaults:{ closeicon:true, mask:false, loading:false, plain:false, autohide:0 } };
//removed - state:0,  defaults: force:false

_popup.create = function(config){
	//console.log("_popup.create();");
	for(var p in _popup.defaults){ config[p] = (typeof(config[p]) == 'undefined')?_popup[p]:config[p]; }		//apply defaults

	//create / setup DOM elements (only on initial popup)
	if($('#jq-masker').length == 0) _popup.build();
	
	if(_popup.current.loading) config.force = true;
	
	
	if(config.force){ 
		_popup.current.instant = true;
		_popup.close();
	}

	_popup.enqueue(config);
}

_popup.load = function(config){
	//pull one off the que if config is not defined
	if(typeof(config) == 'undefined') config = _popup.dequeue();
	if(typeof(config) == 'undefined') return;

	//console.log("_popup.load(); idx: "+config.idx+" autohide: "+config.autohide);
	
	_popup.current = config;
	
	//control animation
	if(config.width) $("#jq-popup").css({ width:config.width });
	if(config.height) $("#jq-popup").css({ height:config.height });
	
	if(config.plain) $('#jq-popup').addClass('plain');
	else $('#jq-popup').removeClass('plain');
	
	if(_popup.masker.show) $("#jq-masker").css({  opacity: _popup.masker.opacity  }).fadeIn(_popup.speed);

	if(config.loading){
		$('#jq-popup').css({ width: '220px' }).empty().append("<img src='/x_icons/loading-bar.gif' alt='loading'/>").fadeIn((_popup.speed*2));
	}else if(config.mask){
		$('#jq-popup').css({ display: 'none' }).empty();
	}else{
		$('#jq-popup').css({ width: 'auto' }).empty().append((config.closeicon)?"<img src='/x_icons/silk/cross.png' onclick='_popup.close();' alt='cross' title='Close this popup' style='float:right;cursor:pointer;'/>":"").append(config.html).fadeIn((_popup.speed*2));
	}

	//center popup
	_popup.center();
	
	if(typeof(config.onload) == 'function') config.onload();

	if(config.autohide){
		setTimeout(function(){ _popup.close(); },(config.autohide + _popup.speed*2));	//ensure autohide takes into account the time to fade up the popup / masker
	}
	
	_popup.active = true;
}

_popup.build = function(){
	//console.log("_popup.build();");
	var elements = { 'jq-masker':'div', 'jq-popup':'div' };
	for(var p in elements){
		$('<'+elements[p]+' id="'+p+'"></'+elements[p]+'>').prependTo("body");
	}
	
	$("#jq-masker").click(function(){
		_popup.close();
	});

	//Press Escape event!
	$(document).keypress(function(e){
		if(e.keyCode == 27) _popup.close();
	});
}

//enqueue
_popup.enqueue = function(config){
	//console.log("_popup.enqueue();");
	//console.dir(config);

	config.close = function(){
		//console.log("_popup.close(); idx: "+this.idx+" closed: "+this.closed);
		if(!this.closed){
			var allow = true;
			if(typeof(this.onunload) == "function"){
				allow = this.onunload();
				if(typeof(allow) == 'undefined') allow = true;
			}
			if (allow){
				if(this.instant){
					$("#jq-popup").css({'display':'none'}).html("");
					_popup.load();
				}else{
					$("#jq-popup").fadeOut(_popup.speed,function(){
						$("#jq-popup").html("");
						//_popup.state = 0;
						_popup.load();
					});
					if (_popup.queue.length == 0){
						$("#jq-masker").fadeOut((_popup.speed*2));
					}
				}
			}else{	
				this.closed = true;
			}
		}
	}
    config.idx = _popup.idx;
    config.closed = false;
	
    // enqueue the item
    _popup.queue.push(config);

    // load the first item to start the ball rolling
    if(!_popup.active) _popup.load();
    
    _popup.idx++;
}

//dequeue
_popup.dequeue = function(){
    // if the queue is empty, return undefined
    if (_popup.queue.length == 0){
    	_popup.active = false;
    	return undefined;
    }
	//console.log("_popup.dequeue();");

    // retrieve item at the front of the queue
    var config = _popup.queue[_popup.offset];
	//console.dir(config);

    // increment the offset and remove the free space if necessary
    if (++ _popup.offset * 2 >= _popup.queue.length){
      _popup.queue  = _popup.queue.slice(_popup.offset);
      _popup.offset = 0;
    }

    // return the dequeued item
    return config;
}

//centering popup
_popup.center = function(){
	//console.log("_popup.center();");
	//centering
	$("#jq-popup").css({
		position: "absolute",
		top: (($(window).height() - $("#jq-popup").height()) / 2) + $(window).scrollTop(),
		left: (($(window).width() - $("#jq-popup").width()) / 2) + $(window).scrollLeft()
	});
	
	//only need force for IE6
	$("#jq-masker").css({
		height: $(window).height()
	});
}


_popup.close = function(){ 
	if(_popup.current.close) _popup.current.close();
}

/*
$(document).ready(function(){
	_popup.create({html:'TESTING - <b>ONE</b><br/>(visible for 2 seconds)',autohide:2000});
	_popup.create({html:'TESTING - <b>TWO</b><br/>(visible until close)',closeicon:true});
	_popup.create({html:'TESTING - <b>THREE</b><br/>(visible for 4 seconds)',autohide:4000});
	_popup.create({html:'TESTING - <b>FOUR</b><br/>(visible for 2 seconds)',autohide:2000});
});
*/
