var FlickrAPI = Class.create();

FlickrAPI.prototype = {
	
	initialize: function(divResult,key,shared_secret){
   		this.obj = this;
		
		this.divResult = divResult;
		this.divLoading = 'divLoading';
		
		this.auth_url = 'http://flickr.com/services/auth/?';
   		this.rest_url = '/proxyFlickr.php?yws_path=';
   		this.key = key;
   		this.shared_secret = shared_secret;
		this.responseJSON = '';
		
		this.userId;
		this.params = new Object;
		this.preloadPhoto = new Array;
		this.txtPhoto = new Array;
		this.methodCall='';
		this.oneSet = false;
		this.slideShowIsActive = false;
		this.timeOutForSlide = 3;
	},

	setUserId: function(userId){
		this.params['user_id'] = userId;
	},

	setPage: function(page){
		this.params['page'] = page;
	},

	setPerPage: function(perPage){
		this.params['per_page'] = perPage;
	},

	setIdPhoto: function(idPhoto){
		this.params['photo_id'] = idPhoto;
	},

	setIdSet: function(idSet){
		this.params['photoset_id'] = idSet;
	},

	setForSlideShow: function(){
		this.slideShowIsActive = true;
	},

	setTimeOutForSlide: function(val){
		this.timeOutForSlide = val;
	},

	onlyOneSet: function(){
		this.oneSet = true;
	},	
	
	fadeIn: function(_element){
		
		if(_element == undefined){
			var element = this.divResult;
		} else {
			var element = _element
		}
			 
		
		new Effect.Opacity(element,
                {
			duration: 0.5,
                        from: 0,
                        to: 1.0
                });

	},

	fadeOut: function(afterCallFunc,idElement,page){
			
		var obj = this;
		new Effect.Opacity(this.divResult,
                {
			duration: 0.5,
                        from: 1.0,
                        to: 0,
                        afterFinish: function(){
                                $(obj.divResult).innerHTML='&nbsp;';
                        	var myTemplate = new Template("obj.#{funct}('#{id}','#{idPage}');");
                        	var show = {funct: afterCallFunc, id: idElement, idPage: page};
				eval(myTemplate.evaluate(show));
                        }
                });

	},

	changePhoto: function(url){
		var obj = this;
                new Effect.Opacity(obj.params['photo_id'],
                {
                        duration: 0.5,
                        from: 1.0,
                        to: 0,
                        afterFinish: function(){
                        	$$('img.border')[0].src = url
				obj.fadeIn(obj.params['photo_id']);
			}
                });
	},

	show: function(method){

        	this.params['format'] = 'json';
        	this.params['nojsoncallback'] = 1;
        	this._call(method);
   	},
	
	getPhoto: function(photo){
        	var str = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + ".jpg";
		return str;
	},
	getPhotoURL: function(photo){
		if(this.slideShowIsActive){
        		var str = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_t.jpg";
		} else {
        		var str = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_s.jpg";
		}
		return str;
	},
	
	getPhotoSetURL: function(photo){
        	var str = "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.primary + "_" + photo.secret + "_s.jpg";
		return str;
	},

	_call: function(method){
		try {
			var obj = this;
       	 		var url = this.rest_url;
 	      	 	var tmp_url = "http://api.flickr.com/services/rest?method=" + method + "&api_key=" + this.key;
       		 	
			for(key in this.params){
       		         	if(typeof(this.params[key]) != 'function'){
       		                 	tmp_url += "&" + key + "=" + this.params[key];
               		 	}
        		}

			url += encodeURIComponent(tmp_url);
        
			new Ajax.Request(url,
			{
				method:'get',

				onSuccess: function(transport){
					obj.responseJSON = transport.responseText;
					obj.parseResult(method);
					$(obj.divLoading).innerHTML = '&nbsp;';
				},
	
				onLoading: function(){
					$(obj.divLoading).innerHTML = "<img style='border:0px' src='/images/tpl/loading.gif'> LOADING";
				},
	
				onFailure: function(){
					alert('Something went wrong...')
				}
			});
		} catch(e) {
			$(this.divResult).innerHTML = e.message;
		}	
		
   	},

	parseResult: function(method){
		
		var fadeIn = true;
		var changeScroll = true;	

		var obj = this.responseJSON.evalJSON(true);
		switch(method){

			case 'flickr.photosets.getPhotos':
				if(this.slideShowIsActive){
					this.loadForSlideShow(obj);
				} else {
					this.displayPhotoSet(obj);
				}
				this.methodCall = 'photo';
				changeScroll = false;
			break;

			case 'flickr.photosets.getList':
				this.displaySet(obj);
				this.methodCall = 'set';
			break;

			case 'flickr.photos.getInfo':
				this.displayPhoto(obj);
				this.methodCall = 'photo';
			break;
		
			case 'flickr.photos.getContext':
				this.displayPrevNext(obj);
				this.methodCall = 'photo';
				fadeIn = false;
			break;

			case 'flickr.photos.getSizes':
				this.displayAllDim(obj);
				this.methodCall = 'photo';
				fadeIn = false;
			break;
		}
	
		if(changeScroll){
			var pos = Position.page($(this.divResult));
			window.scrollBy(0,pos[1]);
		}

		this.fotoOnClick('cSet');
   		
		if(fadeIn){
			 this.fadeIn();
		}
	},

	displaySet: function(obj){
		var set = obj.photosets.photoset;
		var str ="<div id='cSet'>";
		for(i in set){
			var row = set[i];
			if(typeof(row) != 'function'){
				str += '<div class="box_cont1">';
				str += "<img id ='" + row.id + "' src='" + this.getPhotoSetURL(row) + "'>"; 
				str += "<h5 id='" + row.id + "'><a href='javascript:void(0)'>" +row.title._content + "</a> (" + row.photos + " foto)</h5>";
				str += "<p>" +row.description._content+ "</p>";
				str += "</div>";
			}
		}
		str +="</div>";

		
		$(this.divResult).innerHTML = str;
	},

	displayPhotoSet: function(obj){

		var flickr = this;
		var photo = obj.photoset.photo;
		var str="";
		str +="<div id='pathSet'>";
		str += "<div id='pathSX'>";
		if(!this.oneSet) str += "<a href='javascript:void(0)'> Visualizza gli altri album </a>";
		str +="</div>";
		str +="</div>";
		str +="<div id='cSet'><div id='setPaging'></div>";
		for(i in photo){
			var row = photo[i];
			if(typeof(row) != 'function'){
				str += "<div id='cSetThumb'><img id ='"+row.id+"' src='" + this.getPhotoURL(row) + "'></div>"; 
			}
		}	
		str +="</div>";

		$(this.divResult).innerHTML = str;
	
		$('setPaging').hide();
		new Insertion.Bottom('setPaging',"Sfoglia l'album: ");
		$R(1,obj.photoset.pages).each(
			function(item){
				if(flickr.params['page'] == item){ 
					new Insertion.Bottom('setPaging',"<a href='javascript:void(0)' id='" + item + "'><font color='#000'>[" + item + "]</font></a>&nbsp;");
				} else {	
					if(isNaN(parseInt(flickr.params['page']))){
						if(item == 1){
							new Insertion.Bottom('setPaging',"<a href='javascript:void(0)' id='" + item + "'><font color='#000'>[" + item + "]</font></a>&nbsp;");
						} else {
							new Insertion.Bottom('setPaging',"<a href='javascript:void(0)' id='" + item + "'>" + item + "</a>&nbsp;");
						}
					} else {
						new Insertion.Bottom('setPaging',"<a href='javascript:void(0)' id='" + item + "'>" + item + "</a>&nbsp;");

					}
				}
			}
		);
	
			
		if(obj.photoset.pages > 1){
			$$('#setPaging a').each(
				function(el){
					$(el).onclick = function(){
						flickr.openSet(obj.photoset.id,this.id);
					}
				}
			);
			$('setPaging').show();
		}

	
		$('pathSet').onclick = function(){
			flickr.openAllSet();
		}
		
	},

	displayPhoto: function(obj){
		var flickr = this;
		var row = obj.photo;
		var str="<div id='pathSetSxDx'><div id='pathSX'><a href='javascript:void(0)'>Torna all'album</a></div></div><div id='cSet'>";
		str += "<div id='cSetPhoto'>";
		if(row.title._content.length > 0) str += "<b>Titolo:</b>&nbsp;" + row.title._content  + "<br />";
		if(row.description._content.length > 0 ) str += "<b>Descrizione:</b>&nbsp;<em>" + row.description._content + "</em><br />";
		str += "<br /><img class='border' id='"+ row.id +"' src='" + this.getPhoto(row) + "'>";
		str += "</div>"; 
		str +="</div>";
		str += "<div id='allDim'></div>"; 
		str += "<div id='prevNext'></div>"; 
	
		$(this.divResult).innerHTML = str;
			
		$('pathSX').onclick = function(){
			flickr.openSet(flickr.params['photoset_id']);
		}

		this.prevNext();
		this.getDim();
      	},

	displayPrevNext: function(obj){
		if($('prevNext')){
			var prevPhoto = obj.nextphoto;
			var nextPhoto = obj.prevphoto;
			$('prevNext').innerHTML = "<b>Sfogli l'album</b><br /><img id='" + prevPhoto.id+ "' src='"+ this.getPhotoURL(prevPhoto)+ "'><img id='" + nextPhoto.id + "' src='" + this.getPhotoURL(nextPhoto) + "'>";;
			this.fotoOnClick('prevNext');
		}
	},

	displayAllDim: function(obj){
		if($('allDim')){
			var dim = obj.sizes.size;
			var _str = '';
			for(i in dim){
				if(typeof(dim[i]) != 'function'){

					this.preload(dim[i].source,dim[i].label);			
					
					switch(dim[i].label){
						case 'Small':
							_str += "<a href='javascript: void(0)' id='" + dim[i].label + "'>Piccola</a> - ";
						break;

						case 'Medium':
							_str += "<a href='javascript: void(0)' id='" + dim[i].label + "'>Media</a> - ";
						break;

						case 'Large':
							_str += "<a href='javascript: void(0)' id='" + dim[i].label + "'>Grande</a>&nbsp";
						break;
					}
				}
			}				
			
			//$('allDim').innerHTML = "<b>Dimensioni disponibili:</b>&nbsp;" + _str;
			
			var link = $$('#allDim a');
			var obj = this;

			link.each(
				function(item){
					item.onclick = function(){
						switch(this.id){
							case 'Small':
								obj.changePhoto(dim[2].source);
							break;

							case 'Medium':
								obj.changePhoto(dim[3].source);
							break;

							case 'Large':
								obj.changePhoto(dim[4].source);
							break;
						}
					}
				}
			);
		}
		
	},

	

	fotoOnClick: function(div){
		var img = $$('#' + div + ' img', '#' + div + ' h5');
                var obj = this;
                img.each(
                        function(item){

				item.onmouseover = function(){
					if(this.className =='border') return true;
					this.setStyle({
						'filter': 'alpha(opacity=15)',
						'-moz-opacity':'.15',
						'opacity':'.15',
						'cursor': 'hand'	
					});

				}
				
				item.onmouseout = function(){
					if(this.className =='border') return true;
					this.setStyle({
						'filter': 'alpha(opacity=100)',
						'-moz-opacity':'1',
						'opacity':'1'	
					});
				}

                                item.onclick = function(){
					switch(obj.methodCall){
						case 'set':
                                        		obj.openSet(item.id);
						break;

						case 'photo':
                                        		obj.openPhoto(item.id);
						break;
					}
                                }
                        }

                );
	},
	
	openAllSet: function(){
		this.fadeOut('showAllSet',null,null);
	},

	openSet: function(_idSet,page){
		var obj = this;
		var idSet = _idSet;
		this.fadeOut('showSet',idSet,page);

	},

	openPhoto: function(_idPhoto){
		var obj = this;
		var idPhoto = _idPhoto;
		this.fadeOut('showPhoto',idPhoto,null);
		
	},


	showAllSet: function(){

		$(this.divResult).setStyle({
			'filter': 'alpha(opacity=0)',
			'-moz-opacity':'0',
			'opacity':'0'
		});

		this.show('flickr.photosets.getList'); 
	},

	showSet: function(idSet,page){
		if(page!=null) this.setPage(page);
		this.setIdSet(idSet);
		this.show('flickr.photosets.getPhotos'); 
	},

	showPhoto: function(idPhoto){
		this.setIdPhoto(idPhoto);
		this.show('flickr.photos.getInfo'); 
	},

	prevNext: function(){
		if(this.params['photo_id'] != undefined){
			this.show('flickr.photos.getContext');
		}
	},

	slideShow: function(idSet,page){
		if(page!=null) this.setPage(page);
		
		this.setIdSet(idSet);
		this.setForSlideShow();
		this.show('flickr.photosets.getPhotos'); 
	},

	loadForSlideShow: function(obj){
                
		var flickr = this;
                var photo = obj.photoset.photo;
                for(i in photo){
                        var row = photo[i];
                        if(typeof(row) != 'function'){
				var key = parseInt(i);
				flickr.preloadPhoto[key + 1] = this.getPhotoURL(row);
				flickr.txtPhoto[key + 1] = row.title;
			}
			
                }
		var slider = new fotoSlide(this.preloadPhoto,this.txtPhoto,this.timeOutForSlide);	
	},

	getDim: function(){
		if(this.params['photo_id'] != undefined){
			this.show('flickr.photos.getSizes');
		}
	},

	preload: function(foto,label){
	
                preload_image_object = new Image();
                preload_image_object.src = foto;

		preload_image_object.onload = function(){
			if($(label)){
				new Effect.Highlight(label);
			}
		}
        }

} 
