// Stack Manager
// Copyright (c) Alexander Shpack, 2009-now().

function stackManager() {

	// Private fields

	var stack = [];

	// Private methods

	// Public methods declaration

	var add = function ( obj, opts ) {
		try {
			var index = stack.length;
			stack.push( { obj: obj||{}, opts: opts||{}, tOut: null, index: index } );
			return index;
		} catch ( e ) { re };
	};

	var remove = function ( index, dontSplice ) {
		try {
			if ( dontSplice ) {
				stack[ index ] = undefined;
			}
			else
			{
				return stack.splice( index, 1 );
			}
		} catch ( e ) { };
	};

	var exec = function ( ) {
		try {

			var self = this;
			var execObj = stack[0];

			if( !execObj.opts.cond || ( execObj.opts.cond && execObj.opts.cond() ) ) {

				if ( typeof execObj.obj == "function" ){
					var funcParams = execObj.opts.args || [];
					execObj.obj.apply( window, funcParams );
				};
				stack.shift();
				if ( execObj.tOut ) clearTimeout( execObj.tOut );
				this.exec();
			} 
			else 
			{
				execObj.tOut = setTimeout( function( ){ self.exec(); }, 500 );	
			}
		} catch ( e ) { };
	};

	var clear = function ( ) {
		try {
			stack = [];
		} catch ( e ) { }; 
	};

	var get = function ( index ) {
		try {
			if( index != undefined ) {
				return stack[ index ];
			}
			else
			{
				return stack;
			}
		} catch ( e ) { }; 
	};

	// Public methods

	return {
		add: add
		,remove: remove
		,exec: exec
		,clear: clear
		,get: get
	}
};
