var cRolling=function(cont_id,params,photos) {
	this.trig_cache={x: {}, z: {}, prop: {}}
	
	this.cont=$(cont_id);
	this.photos=photos;
	
	this.cur_id=params.start_id; //ID стартовой фотки
	this.dest_id=this.cur_id; //Точка назначения
	this.move=false; //Направление вращения
	
	this.count=params.count; //Кол-во видимых одновременно фоток
	this.half_count=Math.ceil(this.count/2);
	this.rad_d=this.round(1/(this.count-1)); //Угол между соседними фотками
	this.distance=params.distance;
	
	this.padding=params.padding; //Отступ рамки фотки	
	this.norm_w=params.size[0]; //Нормальная ширина и высота фотки (при максимальной приближенности)
	this.norm_h=params.size[1];
	this.height_mlt=this.round(params.size[1]/params.size[0]); //Множитель высоты к ширине
	
	this.time=params.time; //Время поворота круга на одну фотку
	this.time_step=Math.round((this.time/params.steps)*1000); //Время поворота круга на один шаг (в мс)
	this.rad_step=parseFloat(this.rad_d/params.steps); //Значение угла, на который поворачивается круг за один шаг
}
cRolling.prototype={
	//Инициализация
	make: function() {
		var c=0, p_index=[], cur_p;
		this.r=Math.round((this.cont.offsetWidth-this.norm_w/2-this.padding-100)/2);
		this.center=Math.round(this.cont.offsetWidth/2);
		this.d=Math.round(this.r*2);
		
		//Клик по фотке
		this.cont.onclick=OOP_Event(this, function(e) {
			var ev = e || window.event, target = ev.target || ev.srcElement;
			while(target.id!=this.cont.id) {
				if(target.className=='photo') {
					var id=target.id.replace(/^ph_/,'');
					if(id==this.cur_id) window.location='/works/sites/'+id.replace('p','')+'/';
					else this.roll_to(id);
					break;
				}
				target=target.parentNode;
			}
			return false;
		});
		
		//Кнопки вращения
		this.left_but=AddElement(this.cont,'A',{className: 'left_arr', href: '#left'});
		this.right_but=AddElement(this.cont,'A',{className: 'right_arr', href: '#right'});
		this.left_but.onmousedown=this.left_but.onmouseup=this.left_but.onmouseout=this.left_but.onclick=this.left_but.ondblclick=OOP_Event(this,'roll_dir');
		this.right_but.onmousedown=this.right_but.onmouseup=this.right_but.onmouseout=this.right_but.onclick=this.right_but.ondblclick=OOP_Event(this,'roll_dir');
		
		for(var i in this.photos) {
			cur_p=this.photos[i];
			cur_p.cur_rad=0;
			cur_p.loaded=false;			
			cur_p.obj=AddElement(this.cont,'DIV',{className: 'photo', id: 'ph_'+i, style: {display: 'none'}});
			cur_p.inner=AddElement(cur_p.obj,'DIV',{className: 'photo_inner'});
			if(isIE) cur_p.img=AddElement(cur_p.inner,'DIV',{style: {width: this.norm_w+'px', height: this.norm_h+'px', filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='/i/empty_photo.gif', sizingMethod='scale') progid:DXImageTransform.Microsoft.Alpha(opacity=0)"}});
			else cur_p.img=AddElement(cur_p.inner,'IMG',{src: '/i/empty_photo.gif', width: this.norm_w, style: {opacity: 0}});
			
			p_index[c++]=i;
		}
		this.full_length=c;
		this.max_rad=this.round(this.rad_d*(this.full_length-1));
		
		for(var k=0, p=null; p=p_index[k]; k++) {
			this.photos[p].left=p_index[(k==0)?this.full_length-1:k-1];
			this.photos[p].right=p_index[(k==this.full_length-1)?0:k+1];
		}
		
		for(var j=this.get_id(this.cur_id,-this.half_count), c=0, rad=this.round(1+this.rad_d); c++<this.full_length; rad-=this.rad_d, j=this.photos[j].right) {this.change_one(j,rad);}
		setInterval(function(ins){return function(){ins.roll()}}(this),this.time_step);
		
		document.onkeydown=document.onkeyup=OOP_Event(this, function(e) {
			var e = e || window.event, dir=null;
			switch (e.keyCode) {
				case 39: dir='right'; break;
				case 37: dir='left'; break;
			}
			if(dir) {
				this['roll_dir_'+(e.type=='keydown'?'start':'end')](dir);
				if(e.type=='keydown') {
					this[dir+'_but'].style.backgroundPosition='0 -31px';
					$(dir+'_arr').style.color='#990000';
				}
				else {
					this[dir+'_but'].removeAttribute('style');
					$(dir+'_arr').style.color='#222222';
				}
			}
		});
		
		this.show_info();
	},
	
	//Получение id по расстоянию и наоборот
	get_id: function(id,dist) {for(var c=1, da=Math.abs(dist); id=this.photos[id][(dist>0)?'right':'left']; c++) {if(c==da) return id;}},
	get_dist: function(id,dest_id) {for(var c=1; id=this.photos[id]['left']; c++) {if(id==dest_id) return [Math.min(c,this.full_length-c),(c<this.full_length-c)?'left':'right'];}},
	
	//Округление до знака (по-умолчанию - 4 знака после запятой)
	round: function(num,dig) {return parseFloat(num.toFixed(dig||4))},
	
	//Прокрутка в направлении
	roll_dir: function(e) {
		var ev = e || window.event, target = ev.target || ev.srcElement;
		if(ev.type=='mousedown') this.roll_dir_start(target.href.replace(/^([^#]*#?)/,''));
		else if(ev.type=='mouseup'||(ev.type=='mouseout'&&!this.dest_id)) this.roll_dir_end();
		target.blur();
		return false;
	},
	
	roll_dir_start: function(dir) {this.dest_id=false; this.move=dir;},
	roll_dir_end: function() {this.dest_id=(this.photos[this.cur_id].cur_rad!=0.5)?this.get_id(this.cur_id,(this.move=='left'?-1:1)):this.cur_id;},
	
	//Прокрутка до определенного id
	roll_to: function(id) {this.dest_id=id;	this.move=(this.dest_id==this.cur_id&&this.move)?(this.move=='right'?'left':'right'):this.get_dist(this.cur_id,this.dest_id)[1];},
	
	//Прокрутка колеса
	roll: function() {
		if(this.dest_id==this.cur_id && this.photos[this.cur_id].cur_rad==0.5) {
			if(this.move) {this.show_info(); this.move=false;}
		}
		else {
			$('roll_text').innerHTML='';
			var step=this.rad_step*(this.move=='left'?-1:1);
			for(var i in this.photos) this.change_one(i,step);
		}
	},
	
	//Отображение информации о работе
	show_info: function() {
		var p=this.photos[this.cur_id];
		$('roll_text').innerHTML="<a class='work_name' href='/works/sites/"+this.cur_id.replace(/^p/,'')+"/'>"+p.name+"</a><br>"+p.text+"<br><noindex><a href='http://"+p.url+"' target='_blank'>"+p.url+"</a></noindex>";
	},
	
	//Получение x и z координат, а также пропорции (с кэшированием)
	get_xd: function(rad) {return this.trig_cache['x'][rad] || (this.trig_cache['x'][rad]=Math.round(Math.cos(Math.PI*rad)*this.r));},
	get_zd: function(rad) {return this.trig_cache['z'][rad] || (this.trig_cache['z'][rad]=Math.round(this.r*(1-Math.sin(Math.PI*rad))));},
	get_prop: function(rad,x,z) {return this.trig_cache['prop'][rad] || (this.trig_cache['prop'][rad]=this.round(this.distance/Math.sqrt(Math.pow(z+this.distance,2)+Math.pow(x,2))));},
	
	//Позиционируем элемент по угловому значению
	change_one: function(id,rad) {
		var cur_p=this.photos[id], rad=cur_p.cur_rad=this.round(rad+cur_p.cur_rad);
		if(rad==0.5) this.cur_id=id;
		
		if(rad>=this.max_rad) cur_p.cur_rad=-this.rad_d;
		else if(rad<=-this.max_rad+1) cur_p.cur_rad=1+this.rad_d;
		
		var vis=(rad<this.round(1+this.rad_d)&&rad>-this.rad_d), obj=cur_p.obj, img=cur_p.img;
		if(!vis) {obj.style.display='none'; return false;}
		
		var x=this.get_xd(rad), z=this.get_zd(rad), prop=this.get_prop(rad,x,z), width=parseInt(this.norm_w*prop);

		if(isIE) {
			img.style.width=width+'px';
			img.style.height=parseInt(width*this.height_mlt)+'px';
			img.filters["DXImageTransform.Microsoft.Alpha"].opacity=parseInt(prop*100);
		}
		else {
			img.width=width;
			img.style.opacity=prop;
		}
		
		obj.style.zIndex=parseInt(prop*100);
		
		obj.style.bottom=parseInt((1-prop)*60)+'px';
		obj.style.left=this.center+x-parseInt((width+this.padding*2)/2)+'px';
		
		if(!cur_p.loaded) {
			cur_p.loaded=true;
			if(isIE) img.filters["DXImageTransform.Microsoft.AlphaImageLoader"].src=cur_p.src;
			else img.src=cur_p.src;
		}
		obj.style.display='block';
	}
}
