/*
 * ranDo 0.1
 *
 * Copyright (c) 2008 wakasa.org
 *
 * $Date: 2008-06-22 $
 */
 
function ranDo(config){this.set(config)};
ranDo.prototype = {
	raw:null,
	list:null,
	callNum:0,
	set:function(raw){
		this._init();
		this.raw=raw;

		if(this._isArray(raw)){
			this.list=raw;
			this._shuffleList();
		}else if(this._isObj(raw)){
			var max = raw["max"];
			var min = raw["min"];
			if(this._isNum(min) && this._isNum(max)){
				var range = max-min;
				this.list=[];
				for(var i=0;i<=range;i++){
					this.list.push(i+min);
				}
				this._shuffleList();
			}else if(this._isNum(max)){
				this.list=[];
				for(var i=0;i<=max;i++){
					this.list.push(i);
				}
				this._shuffleList();
			}
		}else if(this._isNum(raw)){
			this.list=[];
			for(var i=0;i<=raw;i++){
				this.list.push(i);
			}
			this._shuffleList();
		}
	},
	get:function(config){
		if(!this._isNull(config)){
			this.set(config);
		}

		var raw = this.raw;
		var rnd=Math.random();

		if(this._isNull(raw)){
			return rnd;
		}else if(this._isNum(raw)){
			return Math.floor(rnd*raw);
		}else if(this._isArray(raw)){
			return raw[Math.floor(rnd*raw.length)];
		}else if(this._isObj(raw)){
			var max = raw["max"];
			var min = raw["min"];
			if(this._isNum(min) && this._isNum(max)){
				var range = max-min;
				return Math.floor(rnd*range+min);
			}else if(this._isNum(max)){
				return Math.floor(rnd*max);
			}
		}
	},
	next:function(){
		return this._isUseList()?this.list[this.callNum++]:null;
	},
	hasNext:function(){
		return this._isUseList();
	},
	_init:function(){
		this.list=null;
		this.raw=null;
		this.callNum=0;
	},
	_shuffleList:function(){
				var i = this.list.length;
				while(i){
					var j = Math.floor(Math.random()*i);
					var t = this.list[--i];
        			this.list[i] = this.list[j];
        			this.list[j] = t;
        		}
	},
	_isUseList:function(){return this._isArray(this.list)&&this.callNum<this.list.length;},
	_isNull:function(o){return typeof(o)=='undefined' || o==null;},
	_isObj:function(o){return typeof(o)=='object' && o!=null;},
	_isNum:function(o){return typeof(o)=='number';},
	_isArray:function(o){return this._isObj(o) && this._isNum(o.length);}
}
