Cronica = window.Cronica || {}

Cronica.ARROWS_DISABLED = false;

j(document).ready(function() {


	j('#search-photographer select').change(function() {
		searcher.get('text');
	});

	j('input, textarea').focus(function() {
		Cronica.ARROWS_DISABLED = true;
	});
	j('input, textarea').blur(function() {
		Cronica.ARROWS_DISABLED = false;
	});


	j(window).keydown(function(ev) {

		if (Cronica.ARROWS_DISABLED) return;

		if (!searcher.result.stat) return;

		var BACK =  37;
		var FORWARD = 39;
		
		if (ev.keyCode == BACK) {
			if (Cronica.Search.Viewer.current) {
				searcher.prev_item();
			}
			else {
				searcher.prev();
			}
		}
		else if (ev.keyCode == FORWARD) {
			if (Cronica.Search.Viewer.current) {
				searcher.next_item();
			}
			else {
				searcher.next();
			}
		}
		
	});
});


Cronica.Search = RS.Object.extend({
		
	
	action: 'json', 
		
	form: null,
	
	left: 0,
	result: null,
	
	index: 0,
	
	disabled: false,
	
	val: {
		_text: false,
		text: function() {
			if (!this._text) {
			 	this._text = j('#search-term').val();
			}
			return this._text;
		},
				
		_tag: null,
		tag: function() {
			return Cronica.Tag.val();
		},
		
		filter_tag: function() {
			return Cronica.Tag.filter_val();
		},
		
		_city: null,
		city: function() {
			return Cronica.City.val();
		},
		
		filter_city: function() {
			return Cronica.City.filter_val();
		},
		
		photographer: function() {
			var val = j('#search-photographer select').val();
			if (val == '') {
				return false;
			}
			else {
				return val;
			}
		}
	},
		
	init: function(form) {
		this.form = j(form);
		this.left 	= 0;
		this.result	= new Cronica.Search.Result();
		
		j(document.body).addClass('cronica-animate-nav');
		
		j('#scroller').click(function(e) {
			if (j(e.target).hasClass('img')) {
				Cronica.Search.Viewer.show(e.target);
			}
		});
	},
	
	reset: function() {
		this.val._text = false;
		this.index = 0;
		j('#results').text('').css('left','0em');
		this.result = new Cronica.Search.Result();
		j('#next').hide();
		j('#prev').hide();
	},
	
	prev: function(callback) {
		this.go(this.index-1,callback);
	},
	next: function(callback) {
		this.go(this.index+1,callback);		
	},
	
	prev_item: function() {
		var prev = Cronica.Search.Viewer.current.parent().prev('.img-container').children('.img.ok');
		if (prev.length>0) {
			j('#view').text('');
			Cronica.Search.Viewer.show(prev);
		}
		else {
			this.prev( function() {searcher.load_last_page_item();} );
		}
	},
	next_item: function() {
		var next = Cronica.Search.Viewer.current.parent().next('.img-container').children('.img.ok');
		if (next.length>0) {
			j('#view').text('');
			Cronica.Search.Viewer.show(next);
		}
		else {
			this.next( function() {searcher.load_first_page_item();} );
		}
	},
	
	load_first_page_item: function() {
		var item = j('.page'+this.result.stat.index+' .img-container .img.ok:first');
		Cronica.Search.Viewer.show(item);
	},
	load_last_page_item: function() {
		var item = j('.page'+this.result.stat.index+' .img-container .img.ok:last');
		Cronica.Search.Viewer.show(item);
	},
	
	go: function(idx,callback) {

		if (this.result.stat.pages > 1) {

			var dir = 0;

			if (idx == -1) {
				idx = this.result.stat.pages-1;
				dir = -1;
			}
			if (idx == this.result.stat.pages) {
				idx = 0;
				dir = 1;
			}

			this.result.set_idx(idx);
			this.update_stats();
		
			if (this.disabled) return;
		
			this.disabled = true;
		
			if (!dir) dir = (this.index < idx ? 1 : -1);

			var left = 0;
		
			if (dir == 1) {
				j('#results').css('left','0em');
				j('.page'+this.index).css('left','0em');
				j('.page'+idx).css('left',Cronica.SEARCH_CONTAINER_WIDTH+'em').show();
				left = (-1*Cronica.SEARCH_CONTAINER_WIDTH)+'em';
			}
			else if (dir == -1) {
				j('#results').css('left',(-1*Cronica.SEARCH_CONTAINER_WIDTH)+'em');
				j('.page'+this.index).css('left',Cronica.SEARCH_CONTAINER_WIDTH+'em');
				j('.page'+idx).css('left','0em').show();
				left = '0em';
			}
				
			var hide = this.index;
			var that = this;
			j('#results').animate({left: left},250,'swing', function() {
				j('.page'+hide).hide();
				that.disabled = false;
			});

		
			this.index = idx;

			this.update_display();

		}

		
		if (!j('.page'+idx).hasClass('loaded')) {
			this.get_page(idx,callback);
		}
		else if (callback) {
			callback();
		}
	},
	
	update_display: function() {
		
		if (this.result.stat && this.result.stat.pages > 1) {
			j('#prev').show();
			j('#next').show();
		}
		else {
			j('#prev').hide();
			j('#next').hide();
		}
	},
	
	_lock: false,
	_load_filter: false,
	get: function(type) {
				
		j('#no-results').hide();
		
		j('#scroller').addClass('loading');

		if (this._lock) return;
		
		this._lock = true;
		
		var callback;
		
		if (type) {
			callback = this.load_filter.bind(this);
		}
		
		if (type=='tag' && this.val.tag()) {
			Cronica.City.deselect_all();
		}
		else if (type=='city' && this.val.city()) {
			Cronica.Tag.deselect_all();
		}
		if (type=='text' && (this.val.city()||this.val.tag())) {
			this._load_filter = true;
			j('#filter').text('');
			callback = null;
		}

		this.reset();
		this.get_page(0, callback);
				
		this._lock = false;
		
		j('input').blur();
		
	},
	
	
	req: null,
	get_page: function(nr,callback) {
		
		if (this.req) {
			//this.req.abort();
		}
		
		var args = [];
		
		if (!this.result.stat) {
			args.push('stat=true');
		}
		args.push('page='+nr);
		args.push('search='+encodeURIComponent(this.val.text()));
		if (this.val.photographer()) {
			args.push('photographer='+this.val.photographer());
		}
		if (this.val.tag()) {
			args.push('tag='+encodeURIComponent(this.val.tag()));
		}
		else {
			args.push('tag='+encodeURIComponent(this.val.filter_tag()));
		}
		if (this.val.city()) {
			args.push('city='+encodeURIComponent(this.val.city()));
		}
		else {
			args.push('city='+encodeURIComponent(this.val.filter_city()));
		}
		//window.open(this.form.attr('action')+'/json'+'?'+args.join('&'));
		var that = this;
		this.req = j.getJSON(this.form.attr('action')+'/' + this.action +'?'+args.join('&'), function(r) {
			that.did_get(r);
			if (callback) callback();
		});
		
	},
	
	
	
	did_get: function(r) {
		
		j('#scroller').removeClass('loading');
		j('#filter').removeClass('loading');
		
		this.req = null;
		
		if (r.stat) {
			this.did_get_stat(r.stat);
		}
		
		this.update_display();
		
		
		var idx = 0;
		j('.page'+r.index+' .img-container').each(function() {

			if (idx < r.rows.length && !j(this).data('info')) {
				var row = r.rows[idx];

				

				var t = j(this).find('.img');
				t.addClass('ok');
				
				t.data('info',row);
				setTimeout(function() {
					t.css('background-image','url('+row.path_thumb+')');
				},100);
				t.show();
			}
			idx++;
		});
		
		j('.page'+r.index).addClass('loaded');
		
		if (this._load_filter) {
			this.load_filter();
		}
		
	},
	
	update_stats: function() {
		
		if (this.result.stat && this.result.stat.count <= 1) {
			j('#view-browse').hide();
		}
		else {
			j('#view-browse').show();
		}
		
		if (!this.result.stat || this.result.stat.count<=0) {
			j('#search-stats').hide();
			return;
		}
		
		j('#search-stats').show();
		
		j('#search-stats .page-current').text(this.result.stat.current);
		j('#search-stats .page-total').text(this.result.stat.pages);
		
		j('#search-stats .items-from').text(this.result.stat.from);
		j('#search-stats .items-to').text(this.result.stat.to);
		j('#search-stats .items-total').text(this.result.stat.count);
	},
	
	did_get_stat: function(stat) {
		this.result.stat = stat;
		
		if (stat.count > 0) {
			this.add_pages(0,stat.pages);
			j('#results .page0').show();
		}
		else {
			j('#no-results').show();
		}

		this.update_stats();
				
	},
	
	add_pages: function(from, len) {
		var html = '';
		for (idx = from; idx<len; idx++) {
			var style = (idx+1==len ? 'style="display:none;"':'');
			var left = Cronica.SEARCH_CONTAINER_WIDTH * idx;
			html += '<div class="page page'+idx+'" style="display: none; left: 0em;">'
			+'<div class="img-container top1 left1"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left2"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left3"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left4"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left5"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left6"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left7"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left8"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top1 left9"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left1"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left2"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left3"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left4"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left5"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left6"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left7"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left8"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top2 left9"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left1"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left2"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left3"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left4"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left5"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left6"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left7"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left8"><div '+ style +' class="img"> <\/div><\/div>'
			+'<div class="img-container top3 left9"><div '+ style +' class="img"> <\/div><\/div>'
			+'<\/div>';
		}
		j('#results').get(0).innerHTML += html;
	},
	
	load_filter: function() {

		this._load_filter = false;

		if (!this.val.tag() && !this.val.city()) {
			j('#filter').text('');
			return;
		}
		
		if (!this.result.stat || this.result.stat.count<=0) {
			return;
		}
		
		j('#filter').addClass('loading');
		
		var type = '';
		if (this.val.tag()) {
			type = 'city';
		}
		else if (this.val.city()) {
			type = 'tag'
		}

		if (this.req) {
			//this.req.abort();
		}

		var args = [];

		args.push('tag='+encodeURIComponent(this.val.tag()));
		args.push('search='+encodeURIComponent(this.val.text()));
		args.push('city='+encodeURIComponent(this.val.city()));
		if (this.val.photographer()) args.push('photographer='+this.val.photographer());

		//window.open(this.form.attr('action')+'/'+type+'?'+args.join('&'));
		//j('#filter').load(this.form.attr('action')+'/'+type+'?'+args.join('&'), this.did_get.bind(this));
		var that = this;
		j.get(this.form.attr('action')+'/'+type+'?'+args.join('&'), function(r) {
			j('#filter').get(0).innerHTML = r;
			that.did_get(r);
		});

	}
	
});


Cronica.Search.Result = RS.Object.extend({
	
	stat: null,
	
	set_idx: function(idx) {
		this.stat.index 	= idx;
		this.stat.current 	= idx+1;
		
		this.stat.from		= this.stat.per_page * idx + 1;
		var to 				= this.stat.per_page * (idx+1);
		this.stat.to		= (this.stat.count > to ? to : this.stat.count);
		
	}
	
});

Cronica.Search.Result.Page = RS.Object.extend({
		
});


Cronica.Search.Viewer = {
	
	TARGET: '/photo/view',
	
	current: null,
	
	show: function(elem) {
				
		this.current = j(elem);

		var node = j(elem);
		var info = node.data('info');
				
		if (!info) return;
		
		j('.hide').css('visibility','hidden');
		j('#view').text('');

		this.load(info);


		j('#view').fadeIn(250);
		
		j('#view').css('display','block');
		
		j('#view-controls').show();
		
	},

	load: function(info) {
		// j('#view').load(this.TARGET+"/"+info.id+'/plain');
		j.get(this.TARGET+"/"+info.id+'/plain', function(r) {
			j('#view').get(0).innerHTML = r;
		});
		window.location.hash = 'photo/view/'+info.id;
	},

	hide: function() {
		j('.hide').css('visibility','visible');
		j('#view').fadeOut(100);
		
		j('#view-controls').hide();
		//Cronica.navigation.expand();
		window.location.hash = ' ';
		this.current = null;
	
	}
}



//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////

Cronica.Tag = {
	
	_loaded: false,
	SRC: null,

	
	init: function() {
		j('#tag-hud .tags-list a').click(function(e) {
			Cronica.Tag.toggle(j(this).next('input').val());
		});
	},
	
	show: function(hidden,callback) {
		if (!this._loaded) {
			// j('#tag-hud').load(this.SRC,function() {
			// 	Cronica.Tag.init();
			// });
			j.get(this.SRC,function(r) {
				j('#tag-hud').get(0).innerHTML = r;
				Cronica.Tag.init();
				
				if (callback) {
					callback();
				}

			});
			this._loaded = true;
		}
		j('#tag-hud').show();
		Cronica.hud.open(this,hidden);
	},
	did_close: function() {
		// searcher.load_filter();
		j('#tag-hud').hide();
	},
	
	deselect_all: function() {
		if (this.val()) {
			this.toggle(this.val());
		}
	},
	
	toggle: function(id) {
				
		j('#filter').text('');
		
		var node = j('#tag-hud input[value='+id+']').parent().children('a');
		if (node.parent().hasClass('selected')) {
			j('#tag-hud .selected').removeClass('selected');
			j('#tag-hud .selected-ancestor').removeClass('selected-ancestor');
		}
		else {
			j('#tag-hud .selected').removeClass('selected');
			node.parent().addClass('selected');
			j('#tag-hud .selected-ancestor').removeClass('selected-ancestor');
	
			var name = node.attr("name");
		
			var ids = name.split('.');
			while (ids.pop()) {
				j('#tag-hud').find('a[name='+ids.join(".")+']').parent().addClass('selected-ancestor');
			}
					
		}	
		var sel = j('#tag-hud .selected');
		
		j('#search-tag > span').text( (sel.length==0 ? '' : sel.children('a').text()) );
		
		if (sel.length > 0) {
			j('#search-tag').addClass('selected');
		}
		else {
			j('#search-tag').removeClass('selected');
		}
		
		searcher.get('tag');
		Cronica.hud.close();
	},
	
	toggle_filter: function(id) {
		
		var node = j('#tag-filter input[value='+id+']').parent().children('a');
		if (node.parent().hasClass('selected')) {
			j('#tag-filter .selected').removeClass('selected');
			j('#tag-filter .selected-ancestor').removeClass('selected-ancestor');
		}
		else {
			j('#tag-filter .selected').removeClass('selected');
			node.parent().addClass('selected');
			j('#tag-filter .selected-ancestor').removeClass('selected-filter');
		
			var name = node.attr("name");
			
			var ids = name.split('.');
			while (ids.pop()) {
				j('#tag-filter').find('a[name='+ids.join(".")+']').parent().addClass('selected-ancestor');
			}
						
		}	
		var sel = j('#tag-filter .selected');
		
		searcher.get();
		
	},

	val: function() {
		var sel = j('#tag-hud .selected input');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.val();
		}
	},
	
	path: function() {
		var sel = j('#tag-hud .selected a');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.attr('name');
		}
	},
	filter_path: function() {
		var sel = j('#tag-filter .selected a');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.attr('name');
		}
	},
	filter_val: function() {
		var sel = j('#tag-filter .selected input');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.val();
		}
	}
	
	
}

Cronica.City = {
	
	_loaded: false,
	SRC: null,
	
	init: function() {
		j('#city-hud .city-item a').click(function(e) {
			Cronica.City.toggle(j(this).next('input').val());
		});
	},
	
	show: function() {
		if (!this._loaded) {
			// j('#city-hud').load(this.SRC,function() {
			// 	Cronica.City.init();
			// });
			j.get(this.SRC,function(r) {
				j('#city-hud').get(0).innerHTML = r;
				Cronica.City.init();
			});
			this._loaded = true;
		}
		j('#city-hud').show();
		Cronica.hud.open(this);
	},
	did_close: function() {
		// searcher.load_filter();
		j('#city-hud').hide();
	},
	
	deselect_all: function() {
		if (this.val()) {
			this.toggle(this.val());
		}
	},

	toggle: function(id) {

		j('#filter').text('');

		var wasSelected = j('#city-hud input[value='+id+']').parent().hasClass('selected');
		
		j('#city-hud .selected').removeClass('selected');
		
		if (!wasSelected) {
			j('#city-hud input[value='+id+']').parent().addClass('selected');
		}
		
		var sel = j('#city-hud .selected');
		j('#search-city > span').text( (sel.length==0?'':sel.children('a').text()) );
		
		if (sel.length > 0) {
			j('#search-city').addClass('selected');
		}
		else {
			j('#search-city').removeClass('selected');
		}
		
		
		searcher.get('city');
		
		Cronica.hud.close();
		
	},
	
	toggle_filter: function(id) {
		
		var wasSelected = j('#city-filter input[value='+id+']').parent().hasClass('selected');
		
		j('#city-filter .selected').removeClass('selected');
		
		if (!wasSelected) {
			j('#city-filter input[value='+id+']').parent().addClass('selected');
		}
		
		
		searcher.get();
	},
	
	val: function() {
		var sel = j('#city-hud .selected input');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.val();
		}
	},
	filter_val: function() {
		var sel = j('#city-filter .selected input');
		if (sel.length == 0) {
			return false;
		}
		else {
			return sel.val();
		}
	}
};


Cronica.Search.CUSTOM = {
		type: null,
		val: null
	};
