// ---- Project -----------------------------------------

var Project = Class.create({
  	initialize: function(id, items) { 
  		this.id = id;
  		this.items = items;
  		this.path = "/projects/" + this.id;
  		
  		this.totalItems = items.length;
  	},
  	setup: function() {
  		if(this.items.length > 1) {
  			this.initSortables();
  		}
  	},
  	viewItem: function(itemIndex) {
  		var base = this;
  		
  		var item = this.items[itemIndex];

		if(SortableClickThroughPreventer.canClickThrough()) {
			$('addImgCon').hide();
			$('imageHolder').hide();
			
			// Load the photo into a temporary image
			var photoUrl = previewImages[itemIndex];
			
			var tmpImage = new Image();
		
			tmpImage.onload = function() {
				// Set the src
				$('imageHolder').src = photoUrl;
				$('imageHolder').show();
				$('imageHolder').width = tmpImage.width;
				$('imageHolder').height = tmpImage.height;
			}

			tmpImage.src = photoUrl;

			//'image_' + mediaId (de-highlight the other thumbs, and highlight this one)
			
			var name = "item_description";

			if(item.description.length == 0) {
				[name, name + 'Edit', name + 'Delete'].each(Element.hide);
				$(name + 'AddLink').show();
				$(name + 'Thing').src = '/img/proj_addsmDis.gif';
				$(name + 'Btn').src = '/img/proj_addsm.gif';
				$(name + 'Edit').style.backgroundColor = '#FFF0B0';
				$(name + 'Submit').src = '/img/btn_add_yel.gif';
				$(name + 'CancelLink').onclick = function () { 
					[name + 'Edit',name + 'Btn'].each(Element.toggle);
					return false;
				};
			}
			else {
				[name + 'AddLink', name + 'Edit', name].each(Element.hide);
				[name, name + 'Delete'].each(Element.show);
				$(name + 'Thing').src = '/img/proj_editsmDis.gif';
				$(name + 'Btn').src = '/img/proj_editsm.gif';
				$(name + 'Edit').style.backgroundColor = '#DCEEF7';
				$(name + 'Submit').src = '/img/btn_sv_blu.gif';
				$(name + 'CancelLink').onclick = function () { 
					[name + 'Edit',name + 'Btn'].each(Element.toggle);
					return false;
				};
			}

			$(name + 'Text').update(item.description);
			$(name + 'Input').value = item.description;

			$(name + 'Form').onsubmit = function () {			
				// item.description
				// item.id
				
				var requestUrl = base.path + '/items/' + item.id + '/update.json';
				
				new Ajax.Request(requestUrl, {
					parameters: Form.serialize(this), 
					onComplete: function(transport) { 
						var result = transport.responseJSON;
						
						Blocks.Update(transport, name, 'Image Caption');
					
						item.description = result.description;
					}
				});
		
				return false; 
			};
		}
	},
	deleteItem: function(itemId) {	
		var request = new Ajax.Request(this.path + '/items/' + itemId + '/destroy.json', {
			method: 'POST',
			onComplete: function(transport) { 
				new Effect.DropOut('item_' + itemId);
			}
		});

		this.totalItems--;
		
		// Show the last photo if they delete the currently selected photo
		//if(imageId == mediaId) {
		//	// TODO
		// }

		// If there is only one image left, hide the delete functionality
		if(this.totalItems <= 1){
			$$('div.Thmb').each(function(thmb) {
				thmb.hide();
			});
		}
	},
	hide: function() {
		new Ajax.Request(this.path + '/update.json', {
			parameters:' project.id=' + this.id + '&project.isHidden=true',
			method: 'POST',
			onComplete:function(request) {
				$('hideProjOn').addClassName('dis');
				$('hideProjOff').removeClassName('dis');
			}
		});
	},		
	show: function() {
		new Ajax.Request(this.path + '/update.json', {
			parameters: 'project.id=' + this.id + '&project.isHidden=false',
			method: 'POST',
			onComplete:function(request) {
				$('hideProjOn').removeClassName('dis');
				$('hideProjOff').addClassName('dis');
			}
		});
	},
	updateDisplaySetting: function(setting) {
		// Settings : Gallery, List
		
		var settingName = (setting == 1) ? 'Gallery' : 'List';
				
		new Ajax.Request(this.path + '/update.json', {
			parameters: 'project.id=' + this.id + '&project.displaySetting=' + settingName,
			onComplete: function(request) {
				if(setting == 1) {
					$('listtype1').removeClassName('dis');
					$('listtype2').addClassName('dis');
					$('thumbSub').show();
				}
				else if(setting == 2) {
					$('listtype1').addClassName('dis');
					$('listtype2').removeClassName('dis');
					$('thumbSub').hide();
				}
			}
		});
	},
	updateThumbnailSetting: function(setting) {
		var settingName = "Off";
		
		if(setting == 1) {
			settingName = "Vertical";
		}
		else if(setting == 2) {
			settingName = "Horizontal";
		}       
                
		new Ajax.Request(this.path + '/update.json', {
			parameters: 'project.id=' + this.id + '&project.thumbnailSetting=' + settingName,
			onComplete: function(request) {
				if(setting == 0) {
					$('thumbs0').removeClassName('dis');
					$('thumbs1').addClassName('dis');
					$('thumbs2').addClassName('dis');
				}
				else if(setting == 1) {
					$('thumbs0').addClassName('dis');
					$('thumbs1').removeClassName('dis');
					$('thumbs2').addClassName('dis');
				}
				else if(setting == 2) {
					$('thumbs0').addClassName('dis');
					$('thumbs1').addClassName('dis');
					$('thumbs2').removeClassName('dis');
				}
			}
		});
	},
	initSortables: function() {
		var base = this;
		
		Sortable.create('projThmbs', {
			overlap:'vertical', 
			handle:'projThmbBlock', 
			constraint:false, 
			onUpdate:function() {
				new Ajax.Request(base.path + '/items/reorder.json',{ 
					parameters: Sortable.serialize('projThmbs', { name: 'items' }),
					onComplete:function(transport) {
						// alert(transport.responseText);
					}
				})
			}
		});
				
		Draggables.addObserver(new SortableClickThroughPreventer.ClickObserver());
	}
});

// ---- Help -----------------------------------------

var Help = {
	SendFeedback: function(form) {
		$('feedback').hide();
		$('sending').show();

		new Ajax.Request('/help/sendfeedback', { 
			method: 'POST', 
			parameters: Form.serialize(form), 
			onComplete: function(transport) { 
				$('feedbackSent').show();
				$('sending').hide();
			}
		});
		
		return false;
	}
}

// ---- Profiles -----------------------------------------

var Profiles = { 
	UpdateWorkFlag: function(profileId, flagStatus) {
		new Ajax.Request('/profiles/' + profileId + '/update.json', {
			parameters: 'profile.id=' + profileId + '&profile.workFlag=' + flagStatus,
			onComplete: function(transport) {
				if(flagStatus) { // On
					$('workFlagOn').removeClassName('dis');
					$('workFlagOff').addClassName('dis');
				}
				else { // Off
					$('workFlagOn').addClassName('dis');
					$('workFlagOff').removeClassName('dis');
				}
			}
		});	
	},
	UpdateThumbnailFlag: function(profileId, flag) {
		// /profiles/update?profile.id=${space.id}&profile.thumbnailFlag=true&returnTo=/
		
		new Ajax.Request('/profiles/' + profileId + '/update.json', {
			method: 'POST',
			parameters: 'profile.id=' + profileId + '&profile.thumbnailFlag=' + flag + '&result.include=thumbnailFlag',
			onComplete: function(transport) {
				window.location = '/';
			}
		});
	},
	UpdateThumbsPerRow: function(profileId, thumbsPerRow) {
		// ?profile.id=${space.id}&profile.displaySetting=3&returnTo=/
		
		new Ajax.Request('/profiles/' + profileId + '/update.json', {
			method: 'POST',
			parameters: 'profile.id=' + profileId + '&profile.displaySetting=' + thumbsPerRow + '&result.include=displaySetting',
			onComplete: function(transport) {
				window.location = '/';
			}
		});	
	}
}

var Emails = { 
	Change: function(form) {
		new Ajax.Request('/emails/create.json', { 
			parameters: Form.serialize(form),
			onComplete: function(transport) {				
				// Get the response object
				var result = transport.responseJSON;
		
				// Make sure there weren't any errors
				if(HasErrors(result)) {
					alert(result.errors[0].message)
			
					return;
				}
				
				$('emailText').update(result.address);
				
				['email','emailEdit'].each(Element.toggle);
			}
		});	
	}
}

var Password = {
	Update: function(personId, form) {
		var url = '/people/' + personId + '/updatepassword.json';		
		
		new Ajax.Request(url, { 
			method: 'POST',
			parameters: Form.serialize(form),
			onComplete: function(transport) {
				var result = transport.responseJSON;
		
				if(HasErrors(result)) {
					alert(result.errors[0].message)
			
					return;
				}
				
				$('passwordText').update('Password Updated');
				
				['password','passwordEdit'].each(Element.toggle);
				
				Highlight('password');
			}
		});	
	}
}

// --- Helpers -----------------------------------------

function Highlight(el) {
	new Effect.Highlight(el, { startcolor:'#FFFF99', endcolor:'#F6F6F6' });
};

function HasErrors(obj) {
	return (obj.count && obj.errors.length > 0);
}

// ---- Transformations -----------------------------------------

var Transformations = {
	FromPropertyName: function(name) { 
		
		var previewTransformation;

		if(name == "tags") {
			previewTransformation = "tagsToList";
		}		
		if(name == "skills") {
			previewTransformation = "tagsToList";
		}
		else if(name == "keywords"){
			previewTransformation = "tagsToList";
		}
		else if(name == "description") {
			previewTransformation = "markdown";
		}
		else if(name == "rights") {
			previewTransformation = "markdown";
		}
		
		return previewTransformation;
	}
}

// ---- Tags -----------------------

var Tags = {
	Toggle: function(obj, input, tag) {
		if($(obj).hasClassName('cur')) {
			$(obj).removeClassName('cur');

			// Remove the tag (may be anwhere in the string, with or without a comma)
			$(input).value =  $F(input).replace(tag + ',', "");
			$(input).value =  $F(input).replace(',' + tag, "");
			$(input).value =  $F(input).replace(tag, "");
		}
		else {
			$(obj).addClassName('cur');

			// Append a comma if nessary
			if($(input).value.length > 0) {
				$(input).value =  $F(input) + ",";
			}

			// Append the tag
			$(input).value= $F(input) + tag;
		}
	},
	Sift: function(tags, predicate) {
		return tags.filter(function(tag) {
			return tag.predicate == predicate;
		});
	},
	ToList: function(tags) {		
		var t = "";
		
		tags.each(function(tag) {
			t += tag.value;
			
			var isLast = tags[tags.length - 1].value == tag.value;
			
			if(!isLast) {
				t += ", ";
			}
		});
		
		return t;
	}
}

// TODO: Refactor

// ---- Blocks -----------------------------------------

var Blocks = { 
	Update: function(transport, name, blockType) {	
	
		//alert(transport.responseText);
							
		var result = transport.responseJSON;
		
		if(HasErrors(result)) {
			alert(result.errors[0].message)
			
			return;
		}
		
		[name, name + 'Edit'].each(Element.toggle);

		Highlight(name);

		propertyName = name.split('_')[1];
		
		var propertyValue = eval("result." + propertyName);
		
		// Get the preview text
		var previewText = propertyValue;
		var inputText = propertyValue;
		
		// Figure out if we need to translate the response to a string
		var previewTransformation = Transformations.FromPropertyName(propertyName);
	
		// Or convert the tags to a list
		if(previewTransformation == "tagsToList") {
			previewText = Tags.ToList(propertyValue);
			inputText = previewText;
		}
		else if(propertyName == "location") {
			inputText = "";
		}
		
		// Update the preview
		$(name + "Text").update(previewText);
		
		if(previewTransformation != "markdown") {
			// Update the input
			$(name + "Input").value = inputText;
		}
		
		
		if(!previewText || previewText.length == 0) {
			[name, name + 'Delete', name + 'edblockDel'].each(Element.hide);
			[name + 'AddLink', name + 'Btn'].each(Element.show);

			$(name + 'Btn').src = '/img/proj_addDis.gif';
			$(name + 'Edit').style.backgroundColor = '#FFF0B0';
			$(name + 'Submit').src = '/img/btn_add_yel.gif';
			$(name + 'CancelLink').onclick = function () {
				$(name + 'AddLink').show();
				$(name + 'Edit').hide();
				
				return false;
			};

			if(blockType) {
				$(name + 'Thing').src = '/img/proj_addsmDis.gif';
				$(name + 'Btn').src = '/img/proj_addsm.gif';
				$(name + 'CancelLink').onclick = function () {				
					[name + 'Edit', name + 'Btn'].each(Element.toggle);
					return false;
 				};

				toggleAllObjects();
			}
		}
		else {
			[name, name + 'Delete', name + 'Btn'].each(Element.show);
			$(name + 'AddLink').hide();
			$(name + 'Edit').style.backgroundColor = '#DCEEF7';

			if(blockType) {
				$(name + 'Thing').src = '/img/proj_editsmDis.gif';
				$(name + 'Btn').src = '/img/proj_editsm.gif';
				$(name + 'Submit').src = '/img/btn_sv_blu.gif';
				$(name + 'CancelLink').onclick = function () { 
					[name + 'Edit',name + 'Btn'].each(Element.toggle);

					return false;
				};

				toggleAllObjects();
			}
			else {
				$(name + 'Btn').src = '/img/proj_editDis.gif';
				$(name + 'Submit').src = '/img/btn_svchngs_blu.gif';
				$(name + 'CancelLink').onclick = function () {
					[name, name + 'Edit'].each(Element.toggle);
					return false;
				};
			}
		}	
	},
	Clear: function(name) {
		$(name + 'Input').value = '';
	}
}

// ---- Helpers ---------------------------------

function toggleProjectTab(tab, info) {
	['image_info', 'image_info', 'flash_info'].each(Element.hide);
	
	$$("ul.typeTabs li a").each(function(li) {
		li.removeClassName('cur');
	});
	
	tab.addClassName('cur');
	
	$(info).show();
}

function toggleVisibility(id) {
 	if ($(id).style.visibility == 'hidden'){
		$(id).style.visibility = 'visible';
      }
	else{
		$(id).style.visibility = 'hidden';
      }
}

function toggleAllObjects() {
	var osa = document.getElementsByTagName("object");
	var osa2 = document.getElementsByTagName("embed");
	
	if(osa.length > 0){
		for(var i=0; i < osa.length; i++)
		{
			var a = osa[i];

			if (a.style.visibility == 'hidden'){
				a.style.visibility = 'visible';
      		}
			else{
				a.style.visibility = 'hidden';
      		}
		}
	}

	if(osa2.length > 0){
		for(var i=0; i < osa2.length; i++)
		{
			var a = osa2[i];

			if (a.style.visibility == 'hidden') {
				a.style.visibility = 'visible';
      		}
			else {
				a.style.visibility = 'hidden';
      		}
		}
	}
}

// ---- Click Though Preventer ---------------------------------

var SortableClickThroughPreventer = {
	ClickObserver: Class.create(),
  
	drag_start_date: null,
	drag_end_date: null,
	current_media_id: 0,
  
	canClickThrough: function() {
		if (SortableClickThroughPreventer.drag_start_date && SortableClickThroughPreventer.drag_end_date && new Date().getTime() - SortableClickThroughPreventer.drag_end_date.getTime() < 500 ) 
    	{
			if (SortableClickThroughPreventer.drag_end_date.getTime() - SortableClickThroughPreventer.drag_start_date.getTime() > 200 ) {
				return false;
			}
		}
	
    	return true;
	}
};

SortableClickThroughPreventer.ClickObserver.prototype = {
  initialize: function(element, observer) {
    this.element   = $(element);
    this.observer  = observer;
  },
  onStart: function() {
    SortableClickThroughPreventer.drag_start_date = new Date();
  },
  onEnd: function() {    
    SortableClickThroughPreventer.drag_end_date = new Date();
  }
};

// ---- Helpers ---------------------------------


function getDimensions(width, height, maxWidth, maxHeight) {
	var returnWidth = 0;
	var returnHeight = 0;
	
	if (height <= maxHeight && width <= maxWidth) {
		returnWidth = width;
		returnHeight = height;
	}
	else {	
   		var mutiplier = (maxWidth / width);

        if (height * mutiplier <= maxHeight) {
			newHeight = Math.round(height * mutiplier);

			returnWidth = maxWidth;
			returnHeight = newHeight;
       	}
		else {
    		var mutiplier = (maxHeight / height);

         	newWidth = Math.round(width * mutiplier);

			returnWidth = newWidth;
			returnHeight = maxHeight;
		}
	}
	
	return { 
		width: returnWidth, 
		height: returnHeight
	};
}
