﻿function Controller()
{
	this.getElementById = function(id)
	{
		var element = document.getElementById(id);
		if(!element)
		{
			throw "element not found. id:" + id;
		}
		return element;
	}	
	
	this.showView = function(view)
	{
		if(this.currentView)
		{
			if(this.currentView == view)
			{
				return;
			}
			
			this.currentView.style.display = "none";
			if(this.currentView == this.viewJoinGroup)
			{
				this.frameJoinGroup.src = "";
				if(this.interval != null)
				{
					clearTimeout(this.interval);
					this.interval  = null;
				}
			}
			else if(this.currentView == this.viewUpload)
			{
				this.showHideFlash(false);				
			}
		}
		
		view.style.display = "block";
		this.currentView = view;
	}

	this.showHideFlash = function(show)
	{
		if(show)
		{
			this.flashapp.width = 75;			
			this.flashapp.height = 23;			
		}
		else
		{
			this.flashapp.style.top = "-1000px";
			this.flashapp.width = 1;			
			this.flashapp.height = 1;			
		}
	}
	
	this.onFlashInit = function()
	{
		this.flashapp = this.getElementById("fa_flashapp");
		this.showHideFlash(false);
		
		this.errorCount = 0;
		this.flashapp.getLoginSignature();
		this.startIndex = 0;
		this.flashapp.getPoolPhotos(auth_token, this.startIndex, this.divImageThumbs.length);
	}
	
	this.onGetLoginSignature = function(api_sig)
	{
		this.errorCount = 0;
	
		var useruploadlink = this.getElementById("fa_userupload");
		useruploadlink.href = "http://flickr.com/services/auth/?api_key=" + api_key + "&perms=write&api_sig=" + api_sig;	
		
		var frob = "";
		var querystr = window.location.search;
		if(querystr && querystr.length > 0)
		{
			querystr = querystr.substring(1);
			if(querystr && querystr.length > 0)
			{
				var arr = querystr.split("&");
				for(var i = 0; i < arr.length; i++)
				{
					var nameval = arr[i].split("=");
					if(nameval && nameval.length == 2)
					{
						if(nameval[0] == "frob")
						{
							frob = nameval[1];
							break;
						}
					}
				}
			}
		}
		
		if(frob == "")
		{
			this.showView(this.viewChoose);
		}
		else
		{
			this.flashapp.getUserAuthToken(frob);
		}		
	}
	
	this.onGetUserAuthToken = function(token, id, name)
	{
		this.uploadMethod = "user";
		this.userAuthToken = token;
		this.userId = id;
		this.userName = name;
		this.flashapp.getUserInGroup(id);
	}
	
	this.onGetUserInGroup = function(status)
	{
		this.errorCount = 0;

		if(status)
		{
			this.interval = null;
			this.onShowUpload();
		}
		else
		{
			if(this.interval == null)
			{
				this.showView(this.viewJoinGroup);	
				this.frameJoinGroup.src = "http://www.flickr.com/groups_join.gne?id=" + group_id;
			}
			this.interval = setTimeout("controller.flashapp.getUserInGroup('" + this.userId + "')", 5000);
		}
	}
	
	this.clearUploadErrors = function()
	{
		this.paraUploadError.innerHTML = "";
		this.paraUploadError.style.display = "none";
		this.paraUploadFormatError.style.display = "none";
		this.paraUploadLimitError.style.display = "none";
	}
	
	this.onShowUpload = function(retain)
	{
		if(!retain)
		{			
			this.textFirstName.value = "";
			this.textLastName.value = "";
			this.textEmail.value = "";
			this.selectCountry.selectedIndex = 0;
			this.textFileTitle.value = "";
			this.textFileDescription.value = "";
			this.checkSignup.checked = false;
			this.clearUploadErrors();			
		}
		
		this.textFilePath.value = "";
				
		this.showView(this.viewUpload);
		this.onShowHideUploadFields();
		this.showHideFlash(true);
	}
	
	this.onShowHideUploadFields = function()
	{		
		if(this.checkSignup.checked == true)
		{
			this.textEmail.parentNode.parentNode.style.display = "block";					
		}
		else
		{
			this.textEmail.parentNode.parentNode.style.display = "none";		
		}
		
		var top = 0;
		var left = 0;
		if(this.textFilePath.offsetParent.nodeName == "FIELDSET")
		{
			top = this.textFilePath.offsetParent.offsetTop;
			left = this.textFilePath.offsetParent.offsetLeft;
		}

		this.flashapp.style.left = (left + this.textFilePath.offsetLeft + this.textFilePath.offsetWidth + 10) + "px";
		this.flashapp.style.top = (top + this.textFilePath.offsetTop - 3) + "px";
	}
	
	this.onShowUploadOptions = function()
	{
		this.showView(this.viewChoose);
	}
	
	this.onShowSharedUpload = function()
	{
		this.uploadMethod = "shared";
		this.onShowUpload();
	}
	
	this.onFileSelect = function(name, size)
	{
		this.textFilePath.value = name;		
	}
	
	this.showUploadError = function(text, field)
	{
		this.paraUploadError.innerHTML = text;
		this.paraUploadError.style.display = "block";
		this.onShowHideUploadFields();	
		field.focus();	
	}

	this.trim = function(text)
	{
		return text.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	}
	
	this.onUploadFile = function()
	{
		this.clearUploadErrors();
		
		var fname = this.trim(this.textFirstName.value);
		if(fname == "")
		{
			this.showUploadError("Please enter your first name.", this.textFirstName);
			return;
		}
		
		var lname = this.trim(this.textLastName.value);
		if(lname == "")
		{
			this.showUploadError("Please enter your last name.", this.textLastName);
			return;
		}

		if(this.trim(this.textFilePath.value) == "")
		{
			this.showUploadError("Please select a photograph to upload.", this.textFilePath);
			return;
		}
		
		var email = this.trim(this.textEmail.value);
		if(this.checkSignup.checked == true)
		{
			var emailRegxp = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
			if(emailRegxp.test(email) != true)
			{
				this.showUploadError("Please enter a valid email address.", this.textEmail);
				return;			
			}
			
			if(this.selectCountry.selectedIndex == 0)
			{
				this.showUploadError("Please select your country.", this.selectCountry);
				return;
			}
		}
		
		this.textFirstName.value = fname;
		this.textLastName.value = lname;
		this.textEmail.value = email;
					
		var title = this.trim(this.textFileTitle.value);
		var desc = this.trim(this.textFileDescription.value);
		var token;

		if(title == "")
		{
			title = "I'm watching";
		}
		
		if(desc == "")
		{
			desc = "I want a new global climate deal at the UN conference in Copenhagen in December 2009.";
		}

		if(this.uploadMethod == "shared")
		{		
			token = auth_token;

			if(fname != "")
			{
				desc += "\rAuthor: " + fname;
				
				if(this.selectCountry.selectedIndex > 0)
				{
					desc += ", " + this.selectCountry.options[this.selectCountry.selectedIndex].text;
				}				
			}
		}
		else
		{		
			token = this.userAuthToken;
		}
		
		desc += "\r\rVisit <a href=\"http://www.flickr.com/groups/" + group_name + "/\">http://www.flickr.com/groups/" + group_name + "</a>";
		
		this.divUploadBarFill.style.width = "0%";
		this.showView(this.viewUploadProgress);
		this.flashapp.uploadFile(token, title, desc);
	}

	this.onFileUploadProgress = function(percentage)
	{
		if(percentage < 0)
		{
			percentage = parseInt(this.divUploadBarFill.style.width.substr(0, this.divUploadBarFill.style.width.length - 1), 10);
			if(percentage < 100)
			{
				percentage += 10;
			}
		}
		
		this.divUploadBarFill.style.width = percentage + "%";
	}

	this.onFileUploadDone = function(photoId)
	{
		this.divUploadBarFill.style.width = "100%";	

		this.showView(this.viewWait);

		var token;		

		if(this.uploadMethod == "shared")
		{
			token = auth_token;
		}
		else
		{
			token = this.userAuthToken;
		}

		
		this.photoId = photoId;
		this.flashapp.addPhotoToPool(token, photoId);		
	}

	this.onAddPhotoToPool = function()
	{
		this.errorCount = 0;
	
		if(this.checkSignup.checked == true)
		{
			this.flashapp.newsletterSignup(this.textFirstName.value, this.textLastName.value, this.textEmail.value, this.selectCountry.options[this.selectCountry.selectedIndex].value);
		}
		else
		{
			this.onNewsletterSignup();		
		}
	}
	
	this.onNewsletterSignup = function()
	{
		var token;		
		if(this.uploadMethod == "shared")
		{
			token = auth_token;
		}
		else
		{
			token = this.userAuthToken;
		}
				
		this.flashapp.getPhotoPaths(token, this.photoId);
	}
	
	this.changeImgSrc = function(image, src)
	{
		var newImg = document.createElement("img");
		newImg.src = src;
		newImg.className = image.className;
		newImg.id = image.id;
		newImg.alt = image.alt;
		image.parentNode.replaceChild(newImg, image);
		
		return newImg;
	}
	
	this.onGetPhotoPaths = function(paths)
	{
		this.errorCount = 0;
	
		var userId;		
		if(this.uploadMethod == "shared")
		{
			userId = user_id;
		}
		else
		{
			userId = this.userId;
		}
		
		this.linkUploadedPhoto.href = "http://www.flickr.com/photos/" + userId + "/" + this.photoId + "/in/pool-" + group_name;

		var src;
		
		if(paths.Small)
		{
			src = paths.Small;
		}
		else
		{
			src = paths.Thumbnail;			
		}
		
		
		this.changeImgSrc(this.imgUploadedPhoto, src);
		
		this.imgUploadedPhoto.alt = this.textFileTitle.value;
		
		this.divSignupConfirm.style.display = (this.checkSignup.checked == true?"block":"none");
		this.showView(this.viewUploadComplete);		
	}
	
	this.onGetPoolPhotos = function(photos, total)
	{
		var thumb;
		for(var i = 0; i < this.divImageThumbs.length; i++)
		{
			thumb = this.divImageThumbs[i];		
			thumb.imgThumb.parentNode.parentNode.style.display = "none";
			thumb.imgThumb.src = assets_path + "img/blank.gif";
			thumb.imgThumb.alt = "";			
			thumb.imgPreview.src = assets_path + "img/blank.gif";
			thumb.imgPreview.alt = "";
		}
		
		var photo;		
		for(var i = 0; i < photos.length; i++)
		{
			photo = photos[i];
			thumb = this.divImageThumbs[i];

			thumb.imgThumb.parentNode.parentNode.style.display = "block";		

			thumb.imgThumb.parentNode.href = this.getPageURLForPhoto(photo);

			thumb.imgThumb.alt = photo.title;
			thumb.imgThumb.src = this.getURLForPhoto(photo);

			thumb.imgPreview = this.changeImgSrc(thumb.imgPreview, this.getURLForPhotoPreview(photo)); 
			thumb.imgPreview.alt = photo.title;
			thumb.imgPreview.parentNode.href = this.getPageURLForPhoto(photo);
			
			if(thumb.span)
			{
				if(user_ids[photo.owner] != true && photo.ownername != "")
				{
					thumb.span.innerHTML = photo.ownername + " is watching";			
				}
				else
				{
					thumb.span.innerHTML = "The world is watching";			
				}
			}
		}
		
		this.startIndex += this.divImageThumbs.length;
		if(this.startIndex >= total)
		{
			this.startIndex = 0;
		}
		
		setTimeout("controller.flashapp.getPoolPhotos('" + auth_token + "'," + this.startIndex + "," + this.divImageThumbs.length + ")", 30000);			
	}

	this.onError = function(code, method)
	{	
		if(method == "getPoolPhotos")
		{
			setTimeout("controller.flashapp.getPoolPhotos('" + auth_token + "'," + this.startIndex + "," + this.divImageThumbs.length + ")", 15000);
		}
		else if(method == "uploadFile")
		{
			if(code == 4 || code == 5)
			{
				this.paraUploadFormatError.style.display = "block";		
				this.onShowUpload(true);
			}
			else if(code == 6 && this.uploadMethod != "shared")
			{
				this.paraUploadLimitError.style.display = "block";		
				this.onShowUpload(true);		
			}
			else
			{
				this.showView(this.viewError);
			}		
		}
		else if(method == "getUserAuthToken")
		{
			if(code == 108)
			{
				this.onShowUploadOptions();		
			}
			else
			{
				this.showView(this.viewError);
			}
		}
		else
		{
			if(this.errorCount == 3)
			{
				this.showView(this.viewError);
				this.errorCount = 0;
			}
			else
			{		
				this.errorCount++;
				switch(method)
				{
					case "getLoginSignature":
					{
						this.flashapp.getLoginSignature();
					}
					break;
					case "getUserInGroup":
					{
						this.flashapp.getUserInGroup(this.userId);
					}
					break;
					case "addPhotoToPool":
					{
						if(this.uploadMethod == "shared")
						{
							token = auth_token;
						}
						else
						{
							token = this.userAuthToken;
						}
				
						this.flashapp.addPhotoToPool(token, this.photoId);	
					}
					break;
					case "getPhotoPaths":
					{
						if(this.uploadMethod == "shared")
						{
							token = auth_token;
						}
						else
						{
							token = this.userAuthToken;
						}
						this.flashapp.getPhotoPaths(token, this.photoId);
					}
					break;
				}
			}
		}
	}

	this.getURLForPhoto = function(photo)
	{
		return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_s.jpg";
	}
	
	this.getURLForPhotoPreview = function(photo)
	{
		return "http://farm" + photo.farm + ".static.flickr.com/" + photo.server + "/" + photo.id + "_" + photo.secret + "_m.jpg";
	}

	this.getPageURLForPhoto = function(photo)
	{
		return "http://www.flickr.com/photos/" + photo.owner + "/" + photo.id + "/in/pool-" + group_name;
	}
	
	this.onHoverFixOver = function()
	{
		this.className = "over";
	}

	this.onHoverFixOut = function()
	{
		this.className = "";
	}

	this.init = function()
	{
		this.viewWait = this.getElementById("fa_wait");
		this.showView(this.viewWait);
	
		var container = this.getElementById("fa_container");
		var links = container.getElementsByTagName("A");
		
		for(var i = 0; i < links.length; i++)
		{
			var link = links[i];
			if(link.className == "fa_grouplink")
			{
				link.href = "http://www.flickr.com/groups/" + group_name;
			}			
		}
		
		var images = container.getElementsByTagName("IMG");
		
		for(var i = 0; i < images.length; i++)
		{
			var image = images[i];
			if(image.src.indexOf("asset://") == 0)
			{
				this.changeImgSrc(image, image.src.replace("asset://", assets_path)); 
			}
		}
		
		this.viewInstallFlash = this.getElementById("fa_installflash");
		this.viewError = this.getElementById("fa_error");
		this.viewChoose = this.getElementById("fa_choosemethod");
		this.viewJoinGroup = this.getElementById("fa_joingroup");
		this.viewUpload = this.getElementById("fa_upload");
		this.viewUploadProgress = this.getElementById("fa_uploadprogress");
		this.viewUploadComplete = this.getElementById("fa_uploadcomplete");

		this.frameJoinGroup = this.getElementById("fa_joingroupframe");

		this.textFirstName = this.getElementById("fa_firstname");
		this.textLastName = this.getElementById("fa_lastname");
		this.textEmail = this.getElementById("fa_email");
		this.selectCountry = this.getElementById("fa_country");
		this.textFileTitle = this.getElementById("fa_filetitle");
		this.textFileDescription = this.getElementById("fa_filedescription");
		this.textFilePath = this.getElementById("fa_filepath");
		this.checkSignup = this.getElementById("fa_signup");
		this.checkSignup.onclick = function(){controller.onShowHideUploadFields();};

		this.paraUploadError = this.getElementById("fa_uploaderr");
		this.paraUploadFormatError = this.getElementById("fa_uploadformaterr");
		this.paraUploadLimitError = this.getElementById("fa_uploadlimiterr");
		
		this.divUploadBarFill = this.getElementById("fa_uploadbarfill");
		
		this.linkUploadedPhoto = this.getElementById("fa_newphotolink");
		this.imgUploadedPhoto = this.getElementById("fa_newphoto");
		
		this.divSignupConfirm = this.getElementById("fa_signupconfirm");
	
		this.divImageThumbs = new Array();
		div = this.getElementById("fa_imagegrid");
		var nodes = div.getElementsByTagName("div");
		
		for(var i = 0; i < nodes.length; i++)
		{
			var node = nodes[i];
			node.style.display = "none";
			
			if(this.ie6)
			{
				node.onmouseover = this.onHoverFixOver;
				node.onmouseout = this.onHoverFixOut;
			}

			var anchors = node.getElementsByTagName("A");
			
			var imgThumb = anchors[0].getElementsByTagName("IMG")[0];
			
			var imgPreview = anchors[1].getElementsByTagName("IMG")[0];			
			span = anchors[1].getElementsByTagName("SPAN")[0];

			this.divImageThumbs.push({"imgThumb":imgThumb, "imgPreview": imgPreview, "span":span});
		}
	
		if(swfobject.hasFlashPlayerVersion("9.0.28.0"))
		{
			var flashvars = {"php_path": php_path, "api_key": api_key, "group_id": group_id};
			var params = {menu: "false", allowscriptaccess : "always"};
			swfobject.embedSWF(assets_path + "swf/flickrapp.swf", "fa_flashapp", "1px", "1px", "9.0.28.0", assets_path + "swf/expressInstall.swf", flashvars, params);
		}
		else
		{
			this.showView(this.viewInstallFlash);
		}
	}
	
	this.addCSS = function(head, path)
	{
		var link = document.createElement("link")
		link.rel = "stylesheet";
		link.type = "text/css";
		link.href = assets_path + path;
		head.appendChild(link);	
	}
	
	this.loadCSS = function()
	{
		var head = document.getElementsByTagName("head")[0];
		this.addCSS(head, "css/flickrapp.css");
		
		if(this.ie7)
		{
			this.addCSS(head, "css/flickrappie.css");
		}
		
		if(this.ie6)
		{
			this.addCSS(head, "css/flickrappie6.css");
		}
	}
}

var controller = new Controller();