/**JS stack realization with some
 * additional features
 * rev. 64095
 */
var stackObj = Class.create({
	initialize: function(options) {
		try{
			this.pointer = -1;
			this.lastSeenCardPointer = 0;
		    this.options = {
		     	
		    };
		    Object.extend(this.options, options || { });
		    this.els = Array();
		}
		catch(err){
			alert('Error in stack.js (stackObj.initialize):' + err);
		}
	},
	
	
	
	push: function(item){
		try{
			this.els.push(item);
			++this.pointer;
		}
		catch(err){
			alert('Error in stack.js (stackObj.push):' + err);
		}
	},
	
	pop: function(){
		try{
			if((this.pointer + 1) == this.els.length) this.pointer -= 1;
			this.els.pop();
		}
		catch(err){
			alert('Error in stack.js (stackObj.pop):' + err);
		}
	},
	
	unset: function(){
		try{
			delete this.els[this.pointer];
			this.setPointer(this.lastSeenCardPointer);
		}
		catch(err){
			alert('Error in stack.js (stackObj.setPointer):' + console.log(err));
		}
	},
	
	unsetById: function(id){
		try{
			if(this.getPointer() == id){ 
				this.setPointer(this.lastSeenCardPointer);
			}
			delete this.els[id];
			
		}
		catch(err){
			alert('Error in stack.js (stackObj.setPointer):' + console.log(err));
		}
	},
	
	setPointer: function(intVar){
		try{
			this.lastSeenCardPointer = this.pointer;
			this.pointer = parseInt(intVar);
		}
		catch(err){
			alert('Error in stack.js (stackObj.setPointer):' + err);
		}
	},
	
	getPointer: function(){
		try{
			return this.pointer;
		}
		catch(err){
			alert('Error in stack.js (stackObj.getPointer):' + err);
		}
	},
	
	currentElement: function(){
		try{
			return this.els[this.pointer];
		}
		catch(err){
			alert('Error in stack.js (stackObj.currentElement):' + err);
		}
	},
	
	lastSeenElement: function(){
		try{
			//this.lastSeenCardPointer = this.pointer;
			return this.els[this.lastSeenCardPointer];
		}
		catch(err){
			alert('Error in stack.js (stackObj.currentElement):' + err);
		}
	},
	
	nextElement: function(){
		try{
			if(!Object.isUndefined(this.els[parseInt(this.pointer)+1])){
				this.lastSeenCardPointer = this.pointer;
				this.pointer++;
				return this.els[this.pointer];
			
			}
			else {
				this.lastSeenCardPointer = this.pointer;
				this.pointer = 0;
				return this.els[this.pointer];
			}
		}
		catch(err){
			alert('Error in stack.js (stackObj.currentElement):' + err);
		}
	},
	
	prevElement: function(){
		try{
			if(!Object.isUndefined(this.els[this.pointer-1])){
				this.lastSeenCardPointer = this.pointer;
				this.pointer--;
				return this.els[this.pointer];
			}
			else {
				this.lastSeenCardPointer = this.pointer;
				this.pointer = (this.els.length - 1);
				return this.els[this.pointer];
			}
		}
		catch(err){
			alert('Error in stack.js (stackObj.currentElement):' + err);
		}
	},
	
	shuffleElements: function(){
		var tempElements = this.els;
		var newElements = Array();
		var currentId = this.currentElement().id;
		
		this.els.each(function(){
			var rand = Math.random(0,tempElements.length-1);
			var Length = newElements.length;
			if(tempElements[rand].id == currentId) currentNewId = Length;
			tempElements[rand].id = Length;
			newElements.push(tempElements[rand]);
			delete tempElements[rand];
		}.bind(this));
		
		this.els = newElements;
		this.setPointer(currentNewId);
	},
	
	elements: function(){
		try{
		return this.els;
		}
		catch(err){
			alert('Error in stack.js (stackObj.elements):' + err);
		}
	}
	
});


