/*
	Copyright (c) 2007-2009 JB Interactive Pty. Ltd.
	All Rights Reserved
	http://www.jbinteractive.com.au/
*/

/* 
	Facilitates usage of uploadify in file upload elements in employment form
	Enables toggle animation on employment details and postal address elements
*/

Application = {};

(function ($) {

var Employment = {
	
	// File elements
	fields: {
		cover_letter 	: '.cover_letter',
		cv			 	: '.cv',
		supporting_docs : '.supporting'
	},
	
	// Animated fieldsets and checkboxes that cause the animation
	fieldsets: {
		postal_address     : {
			fieldset : '#fieldset-postal',
			checkbox : '#postal_same'
		},
		employment_details : {
			fieldset : '#fieldset-employment_details',
			radio_on : '#currently_employed-1',
			radio_off : '#currently_employed-0'
		}
	},
	
	elements: [],
	
	init : function()
	{
		var self = this;
		
		$.each(this.fields, function(i, val) {
			self.elements.push($(val));
		});
		
		if($(this.fields.cover_letter).length) {
			this.bindUploadify();			
		}
		this.bindAnimation();
	},
	
	// Bind each file control with uploadify
	bindUploadify: function()
	{	
		var self = this;
		
		$.each(this.elements, function(i, val){
			
			var element = val,
				elementName = val.selector.substring(1);
			
			// Initialise each file upload element
			$(this)
				.find('a.cancel, .filename').hide().end()
				.data('uploaded', false);

			// Bind uploadify onto file upload fields
			$(this).find('input[type=file]').uploadify({
				'uploader'	   : '/swf/uploadify.swf',
				'script'  	   : '/employment/upload',
				'buttonImg'    : '/images/public/browse.jpg',
				'cancelImg'    : '/images/public/blank.png',
				'auto'		   : true,
				'width'		   : 130,
				'height'	   : 30,
				'scriptData'   : { 
					'control' : elementName,
			 		'app_id'  : Application.id		 
				},
				onComplete   : function(e, queueID, file, response)
				{
					self.toggleUpload(element);
					element.find('.filename').empty();
					
					$.getJSON("/employment/getfileinfo", { 'id' : Application.id, 'type' : elementName }, function(data) 
					{
						if(data.ok) {
							self.updateElement(element, data);
						} else {
							alert('An error has occurred in uploading this file. Please refresh the page and try again.')
						}
					});
				}
			});
			
			// Bind the cancel button
			$(this).find('a.cancel').click(function(e){
				e.preventDefault();
				
				// JSON message to delete file associated with current application
				$.getJSON("/employment/deletefile", { 'id' : Application.id, 'type' : elementName }, function(data) 
				{
					self.toggleUpload(element);
				});
				
			});
			
			// Files are already set for this field
			if(element.find('.filename_info').is('*'))
			{
				values = {
					'filename' : $(this).find('.filename_info').val(),
					'ext'	   : $(this).find('.ext_info').val()
				};
				
				self.toggleUpload(element);
				self.updateElement(element, values);
			}
			
		});	// $.each

	},
	
	// Bind and define animation functions for both 
	// postal address & employment details fieldsets
	bindAnimation : function()
	{
		var self = this;
		
		// Define functions
		// @param selector fieldset selector containing fields to animate
		// @param instant boolean whether animation is instant or not
		var hideElements = function(selector, instant) {
			
			var elements = $(selector)
				.children('.field')
				.filter(function(i){
					if(i == 0) return false;
					return true;
				});
			
			if(instant) {
				elements.hide();
			} else {
				elements.slideUp();
			}
		};
		
		var showElements = function(selector, instant) {
			
			var elements = $(selector)
				.children('.field')
				.filter(function(i){
					if(i == 0) return false;
					return true;
				});
				
			if(instant) {
				elements.show();
			} else {
				elements.slideDown();
			}			
		};
		
		// Employment details fieldset
		if($(this.fieldsets.employment_details.fieldset).is('*')) 
		{			
			// Init based on page state - hide if set to 'No'
			if(!$(self.fieldsets.employment_details.radio_on).attr('checked')) {
				hideElements(self.fieldsets.employment_details.fieldset, true);
			};
			
			// Bind click event
			$(self.fieldsets.employment_details.radio_on).click(function(e){
					showElements(self.fieldsets.employment_details.fieldset);
			});

			$(self.fieldsets.employment_details.radio_off).click(function(e){
					hideElements(self.fieldsets.employment_details.fieldset);
			});
		}
		
		// Postal address fieldset
		if($(this.fieldsets.postal_address.fieldset).is('*'))
		{
			// Init based on page state
			if($(self.fieldsets.postal_address.checkbox).attr('checked')) {
				hideElements(self.fieldsets.postal_address.fieldset, true);
				$(self.fieldsets.postal_address.checkbox).data('closed', true);
			}
			
			// Bind click event
			$(self.fieldsets.postal_address.checkbox).click(function(e){
				
					if(!$(this).data('closed'))
					{
						hideElements(self.fieldsets.postal_address.fieldset);
						$(this).data('closed', true);
					} else {
						showElements(self.fieldsets.postal_address.fieldset);
						$(this).data('closed', false);
					}
			});
		}
	},
	
	// Toggles a given upload element between 'uploaded' state
	// and an 'awaiting file' state
	toggleUpload : function(element)
	{		
		if(element.data('uploaded'))
		{
			// Document exists - remove document
			$(element).find('.upload_element').css('display', 'block').end()
				  .find('a.cancel, .filename').css('display','none').end()
				  .data('uploaded', false);
				
			element.find('input[id*=added]').val(0);
		} else {
			// Document does not exist - place document, hide uploader
			$(element).find('.upload_element').css('display', 'none').end()
				  .find('a.cancel, .filename').css('display','block').end()
				  .data('uploaded', true);
				
			element.find('input[id*=added]').val(1);		
		}
	},
	
	// Add filename to filename container, remove previous class
	// append new file class	
	updateElement : function(element, data)
	{	
		var elementClass = element.find('.filename').attr('class').split(' ').slice(-1);
		if(elementClass != 'filename' && elementClass.length)
			element.find('.filename').removeClass(elementClass);
		
		element.find('.filename').text(data.filename +'.'+data.ext).addClass(data.ext);
	}
};

$(function () {
	Employment.init();
});

})(jQuery);