

function CRegBox(attrs){
	if(typeof(attrs)!='object') attrs = {};

	this.max = Math.max(attrs.max || 10, 4); // max must be 4 or larger, default is 10
	this.listener = attrs.listener || function(){};
	this.defaultsrc = attrs.defaultsrc || "/resources/eda49c056d/images/vrfresh/featbox-nophoto.jpg";
	this.dealsperpage = attrs.dealsperpage || 7;
	this.coverdelay = attrs.coverdelay || 2000;
	this.pos = attrs.pos || 0;
	this.debug = attrs.debug || false;
	
	// not configurable
	this.Deals = new Array();
	this.Objs = new Array();
	this.photow = 186;
	this.photoh = 142;
	this.ie6 = ($.browser.msie && $.browser.version=="6.0");
	
	// create
	var ThisObj = this;
	this.Element = $('#regbox');
	this.Group = this.Element.find('.regbox-propgroup');
	for(var i=0; i<3; i++){
		var Obj = $('<a href="#" class="regbox-prop regbox-prop-'+i+'"></a>').append('<span><span class="regbox-imgwrap"></span></span>').append('<b></b>');
		this.loadClick(Obj, i);
		this.Group.append(Obj);
	}
	
	
	this.Group.append(this.Prev = $('<a href="#" class="regbox-prev"><span>previous</span></a>'));
	this.Group.append(this.Next = $('<a href="#" class="regbox-next"><span>next</span></a>'));
	
	// right side
	var List = this.Element.find('.regbox-deals ul');
	this.Deals = List.children();
	if(List[0]){
		this.Right = $('<div class="regbox-right" />').hide();
		this.Element.find('.regbox-deals').wrap(this.Right);
		this.dealpage = 0;
		this.dealpagecount = Math.ceil(this.Deals.length / this.dealsperpage);
		if(this.dealpagecount>1){
			List.after($('<p></p>').append($('<div></div>').append(this.PrevDeal = $('<a href="#"></a>').addClass('regbox-prevdeals regbox-off').html('&lt;&lt; Prev')).append(this.NextDeal = $('<a href="#"></a>').addClass('regbox-nextdeals regbox-off').html('More &gt;&gt;'))));
			this.PrevDeal.click(function(){ThisObj.godeals(ThisObj.dealpage - 1); return false;});
			this.NextDeal.click(function(){ThisObj.godeals(ThisObj.dealpage + 1); return false;});
			this.godeals(0);
			}
		}

	
	// handlers
	this.Prev.click(function(){ThisObj.offset(-1);return false;});
	this.Next.click(function(){ThisObj.offset(1);return false;});
	this.update();
	}

CRegBox.prototype.loadClick = function(Link, i){
	Link.click(function(){
		if(typeof(sendContainerTrackingSpecific)=='function')sendContainerTrackingSpecific.call(this, i);
		if(!this.isactive) return false; 
		if($.browser.msie){
			window.location = this.getAttribute('href');
			return false;
			}
		});
	}

CRegBox.prototype.godeals = function(n){
	this.dealpage = n = Math.max(Math.min(n, this.dealpagecount-1), 0);
	!n ? this.PrevDeal.addClass('regbox-off') : this.PrevDeal.removeClass('regbox-off');
	(n==(this.dealpagecount-1)) ? this.NextDeal.addClass('regbox-off') : this.NextDeal.removeClass('regbox-off');
	this.Deals.addClass('regbox-off');
	var last = Math.min(((n+1)*this.dealsperpage), this.Deals.length);
	for(var i=(n*this.dealsperpage); i<last; i++){
		if(this.Deals[i]) $(this.Deals[i]).removeClass('regbox-off');
		}
	}

CRegBox.prototype.status = function(name, bool, callListener){
	var cur = this.Element.hasClass('regbox-' + name);
	if(typeof(bool)=='undefined') return cur;
	if((bool && cur) || (!bool && !cur)) return; // do nothing
	if(bool) this.Element.addClass('regbox-' + name);
	else this.Element.removeClass('regbox-' + name);
	if(callListener) this.listener.call(this, name, bool);
	}

CRegBox.prototype.loadImage = function(Obj){
	if(Obj.Image) return; // already done
	var ThisObj = this;
	Obj.Image = $(new Image());
	if(Obj.photoalt) Obj.Image.attr('alt', Obj.photoalt);
	Obj.iserror = false;

	var onerror = function(){
		Obj.iserror = true;
		if(Obj.Image.attr('src')!==ThisObj.defaultsrc)Obj.Image.attr('src', ThisObj.defaultsrc);
		ThisObj.listener.call(ThisObj, 'photoerror', Obj, Obj.Image);
		}
	var onload = function(response, status, xhr){
		if(Obj.iserror)Obj.Image.width(ThisObj.photow).height(ThisObj.photoh);
		ThisObj.listener.call(ThisObj, 'photoloaded', !Obj.iserror, Obj, Obj.Image);
		Obj.Image.removeAttr('width').removeAttr('height'); // IE 8 auto-loads these properties, negating the max-height/max-width css
		}
	
	Obj.Image.load(onload).error(onerror).attr('src', Obj.photosrc || this.defaultsrc);// *finally*, set the src attribute of the new image to our image
	}

CRegBox.prototype.update = function(Obj){
	this.status('isone', (this.Objs.length==1));
	this.status('istwo', (this.Objs.length==2));
	this.status('isthree', (this.Objs.length==3));
	this.status('ismore', (this.Objs.length>3));
	this.status('isdealsonly', !this.Objs.length && this.Deals.length);
	this.status('isempty', !this.Objs.length && !this.Deals.length);
	}

CRegBox.prototype.show = function(arr){
	var ThisObj = this;
	if( this.coverdelay && this.Right && this.Deals.length ) {
		if ( this.coverdelay > -1 ) {
			setTimeout(function(){$('.regbox-right').fadeIn(); }, this.coverdelay);
		} else {
			$('.regbox-right').show();
		}
	}
	this.show2(arr);
}

CRegBox.prototype.show2 = function(arr){
	
	if(arr instanceof Array){
		this.add(arr);
	}
	if(!this.Objs.length) return; // error
	if(this.status('isloaded')) return;
	this.status('isloaded', true, true);
	this.update();
	this.go(this.pos, true);
	}

CRegBox.prototype.cleanup = function(num, isReverse){
	
	if(this.Objs.length<=this.max) return;
	
	var remObjs = new Array();
	var holdPos = this.pos;
	if (isReverse) {
		// Delete from end
		remObjs = this.Objs.splice(this.Objs.length-num, num);
		this.pos = holdPos + num;
	} else {
		// Delete from start
		remObjs = this.Objs.splice(0, num);
		this.pos = holdPos - num;
	}
	
	if( this.debug && window.console ) {
		console.debug('Removed ' + remObjs.toString() + ' removed from the ' + (isReverse ? 'end' : 'beginning'));
		console.debug("Queue State: " + this.Objs.toString());
	}
}

CRegBox.prototype.add = function(mixed, isReverse){
	
	var thisObj = this;
	
	if (mixed instanceof Array) {
		
		if (isReverse) {
			this.Objs = mixed.concat(this.Objs);
		} else {
			this.Objs = this.Objs.concat(mixed);
		}
		
		$(mixed).each(function(){
			thisObj.listener.call(thisObj, 'add', this);
			thisObj.loadImage(this);
		});
		
		this.cleanup(mixed.length, isReverse);
		
	} else {
		
		if (isReverse) {
			this.Objs.unshift(mixed);
		} else {
			this.Objs.push(mixed);
		}
		this.listener.call(this, 'add', mixed);
		this.loadImage(mixed);
		
		this.cleanup(1, isReverse);
	}
		
	if( this.debug && window.console ) {
		console.debug('Added ' + mixed.toString());
		console.debug("Queue State: " + this.Objs.toString());
	}	
}

CRegBox.prototype.offset = function(offset){this.go(this.pos + offset);}
CRegBox.prototype.go = function(n, isinit){
	if(!this.Objs.length || this.islocked) return;
	var isforward = isinit ? true : (n>this.pos);
	var prevpos = this.pos;
	
	if(n<0) n = this.Objs.length + n;
	n = n % this.Objs.length;
	if(!isinit && (n==this.pos)) return; // no changes
	this.pos = n;
	var ThisObj = this;
	var kids = this.Group.children();

	var len = Math.min(this.Objs.length, 3);
	for(var i=0; i<len; i++){
		var i2 = (this.pos+i)%this.Objs.length;
		var Obj = this.Objs[i2];
		Obj.isshown = true; 
		var Tag = $(kids[i]);
		Tag.find('span.regbox-imgwrap').html(Obj.Image);
		Tag.find('b').html(Obj.name);
		Tag.attr('href', Obj.url||'');
		kids[i].isactive = true;
	}
	
	this.update();
	this.listener.call(this, 'change', this.Objs[this.pos], this.pos, prevpos, isforward);
	this.cleanup();
}



