/***
 * 
 * Javascript tools for this site.
 * 
 */


//------------------------------------------------------------------------------
// Classes
//------------------------------------------------------------------------------


/**
 * Support for building your own pdf.
 */
function PdfBuilder() {
	this.checkboxes;
	this.selected_nrs;
	this.cookie_name;
	this.language;
	this.form;
	
	this.init();
}

PdfBuilder.prototype = {
		
	
	init: function() {
		var self = this;
		
		this.language = $.cookie('language');
		this.cookie_name = 'pdf_selected_nrs';
		
		// Get selected_nrs from the cookie.
		var str_selected_nrs = $.cookie(this.cookie_name);
		if(typeof str_selected_nrs == 'string' && str_selected_nrs != "") {
			this.selected_nrs = str_selected_nrs.split(',');
		} else {
			this.selected_nrs = [];
		}

		
		// Collect selection checkboxes in the page.
		this.form = $("form#pdfBuilder");
		if(this.form.length > 0) {
			this.checkboxes = $(":checkbox[name^=selected_nrs]", this.form);
			// Set the checkboxes and .
			$.each(this.selected_nrs, function(index, nr){
				$("[value=" +  nr + "]", this.checkboxes).attr('checked', true);
			});
			// Install toolbar checkbox callback;
			this.checkboxes.click(this, this.onClickBuilderPageCheckbox);
		}
		
		// Install form submit handler.
		$('input#printButton', this.form).click(this, this.onSubmitSelectionForm);
		
		// Install toolbar checkbox callback;
		$('#addToPdf').click(this, this.onAddToPdf);

		
		// Install checkbox handlers for the home page toggle chapter selection on home page.
		$("input:checkbox[name=pdfToggleChapterHome]").click(this, this.onPdfToggleChapterHome);
		
		// Install checkbox handlers for the home page toggle chapter selection on home.
		$("input:checkbox[name=pdfToggleChapterHome]").each(function () {
			var nr = $(this).attr('value');
			if(self.selected_nrs.indexOf(nr) != -1) {
				$(this).attr('checked', true);
			}
		});
		
		
		// Disable toolbox links if irrelavnt. 
		$('.toolboxItemDisabled')
			.css('opacity', '0.6')
			.children('a')
				.attr('href', '#')
				.click(function(e){
					return false;
				});
		
		
		// Update all selection.
		this.afterSelectionUpdate();
	},

	
	//---------------------------------------------------------------------------
	// Methods
	//---------------------------------------------------------------------------
	

	/**
	 * After the selection has been changed this method is called to store the cookie
	 * and set the paragraph count.
	 */
	afterSelectionUpdate: function(e) {
		$.cookie(this.cookie_name, this.selected_nrs.join(','));
		var display_count = this.selected_nrs.length == 0 ? '' : '(' + this.selected_nrs.length + ')';
		$('span#pdfBuilderCount').html(display_count);
		var add_to_pdf = $('#addToPdf');
		if(add_to_pdf.length > 0) {
			var nr = add_to_pdf.attr('href').substring(1);
			if(this.selected_nrs.indexOf(nr) != -1) {
				add_to_pdf.html(this.language == 'nl' ? 'Verwijder uit PDF' : 'Remove from PDF');
			} else {
				add_to_pdf.html(this.language == 'nl' ? 'Voeg toe aan PDF' : 'Add to PDF');
			}
		}
	},
	
	setNrSelected: function(nr, selected) {
		this.selected_nrs  = $.grep(this.selected_nrs , function(v) {
			return (v != nr);
		});
		if(selected) {
			this.selected_nrs.push(nr);
		}
	},
	
	//---------------------------------------------------------------------------
	// Handlers
	//---------------------------------------------------------------------------
	
	/**
	 * Handler for checkbox change.
	 */
	onAddToPdf: function(e) {
		var self = e.data;

		// Check/uncheck sub chapters.
		var nr = $(this).attr('href').substring(1);
//		if(nr != '' && nr != '0') {
		if(nr != '') {
			var selected = (self.selected_nrs.indexOf(nr) != -1);
			self.setNrSelected(nr, !selected);
		}		
		e.stopPropagation();
		e.preventDefault();
		self.afterSelectionUpdate();		
	},
	
	
	toggleChapterSelected: function(input) {
		var checked, tag, regex, input;
		checked = input.checked; 
		tags_selected_nrs = input.form['selected_nrs[]'];
		if(input.id == '') {
			// This the root paragraph so we not to toggle all.
			regex = '';
		} else {
			regex = new RegExp("^" + input.id + "(\\..*)*" + "$");
		}
		for(var i = 0; i < tags_selected_nrs.length; i++) {
			tag = tags_selected_nrs[i];
			if((regex == '' || regex.test(tag.id)) && !tag.disabled) {
				tags_selected_nrs[i].checked = checked;
			}
		}
	},
	
	onClickBuilderPageCheckbox: function(e) {
		var self = e.data;
		self.toggleChapterSelected(this);
		
		var checkboxes = $(":checked", this.checkboxes);
		self.selected_nrs = $.map(checkboxes, function(c) {
			return $(c).attr('value');
		});
    e.stopPropagation();
		self.afterSelectionUpdate();		
	},
	
	
	/**
	 * Handler for overview form submit.(Shows popup-printdoc.php); 
	 */
	onSubmitSelectionForm: function(e) {
		var form, tags_selected_nrs, url, args, output_mode;
		var self = e.data;
		
		output_mode = 'pdf';
		
		tags_selected_nrs = $(':checkbox:checked', self.form);
		
		if(tags_selected_nrs.length == 0) {
			if(self.language == 'nl') {
				alert('Kies een aantal hoofdstukken');
			} else {
				alert('Choose some chapters');
			}
	     e.preventDefault();
		} else {
			form.submit();
			return true;
		}
	},
	
	onPdfToggleChapterHome: function(e) {
		var self = e.data;
		var checkbox = $(this);
		var args = {
			action: 'subtree_nrs',
			paragraph_nr: checkbox.attr('value')
		};
		$.get('json.php', args, function (data){
			var new_value = checkbox.attr('checked');
			$.each(data['nrs'], function(i, nr) {
				self.setNrSelected(nr, new_value);
			});
			self.afterSelectionUpdate();		
		});
		
    e.stopPropagation();
	}
	
	
	
}


/**
 * Mail-a-friend form handler.
 */
function MailAFriend() {
	this.form_visible = false;
	this.init();
}

MailAFriend.prototype = {
		
	init: function() {
		var self = this;
		this.language = $.cookie('language');

		$('a#show_mailafriend').click(self, self.toggleShowForm);
		$('a#close_mailafriend').click(self, self.toggleShowForm);
		
		this.form = $('form#mailafriend');
		
		this.receivers_email = new InputWithDefault($('#receivers_email', this.form));
		this.message = new InputWithDefault($('#message', this.form));
		this.sender_email = new InputWithDefault($('#sender_email', this.form));
		
		$(this.form).submit(self, self.submitForm);
	},
	
	
	
	//---------------------------------------------------------------------------
	// Callbacks.
	//---------------------------------------------------------------------------

	toggleShowForm: function(e) {
		var self = e.data;
		
		self.form_visible = !self.form_visible;
		if(self.form_visible) {
			// Cleanup form.
			$('p.form_error', self.form).remove();
			$('p#message_mailafriend').html('');
			self.receivers_email.setDefaultValue();
			self.message.setDefaultValue();
			self.sender_email.setDefaultValue();
			// Make form visible.
			self.form.show();
			$('ul#share').show();
		} else {
			$('ul#share').hide();
		}
		e.preventDefault();
		e.stopPropagation();
	},
	
	submitForm: function(e) {
		var self = e.data;
		
    e.preventDefault();
    e.stopPropagation();

    // Cleanup errors
		$('.field-container p.error-message').remove()
		$('.field-container[class*=has-errors]').removeClass('has-errors');
		
		var url = "mailafriend.php";
		
		$.get(url, {
			receivers_email: self.receivers_email.getValue(),
			message:         self.message.getValue(),
			sender_email:    self.sender_email.getValue(),
			url:             $('[name=url]', self.form).val()
		}, function(data) {
			$('p.form_error', self.form).remove();
			$('p#message_mailafriend').html('');
			if(data['success']) {
				$('p#message_mailafriend').html(data['message']);
				self.form.hide();
			} else {
				var errors = data['errors'];
				for(field in errors) {
					var input = $('[name=' + field + ']');
					var container = $(input).parents('[class*=field-container]');
					container.prepend('<p class="form_error">' + errors[field] + '</p>');
				}
				$('p#message_mailafriend').html(data['message']);
			}
		});
		e.preventDefault();
		e.stopPropagation();
	}
	
	
}


function InputWithDefault(input) {
	this.input = input;
	this.init();
}


$.extend(InputWithDefault.prototype, {

	init: function() {
		var self = this;
		self.default_text = $(self.input).val();
		$(self.input)
			.focus(function() {
				if(self.input.val() == self.default_text) {
					self.input.val("");
				}
			})
			.blur(function() {
				if(self.input.val() == "") {
					self.input.val(self.default_text);
				}
			});
	},
	
	
	setDefaultValue: function() {
		var self = this;
		self.input.val(self.default_text) 
	},
	
	
	getValue: function() {
		var self = this;
		var value;
		if(self.input.val() == self.default_text) {
			value = "";
		} else {
			value = self.input.val();
		}
		return value;
	}
	
});

// ------------------------------------------------------------------------------
// Functions
//------------------------------------------------------------------------------

/**
* Show an url in a popup window.
*/
function popupWindow(name, url, refresh_url, width, height, win_attrs) {
	var win_exists;

	if(typeof popup_windows == 'undefined' ) {
		popup_windows = [];
	}
	
	// IE bug when showing pdf in a popup window. The window object cannot be
	// accessed the second time. So we will create every time a new window by
	// changing the window name.
	
//	if(name.substring(0, 6) == '_blank') {
//		if(navigator.appName == 'Microsoft Internet Explorer') {
//			name = '_blank';
//		}
//	}
	
	if(typeof win_attrs == 'undefined') {
		win_attrs = "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=yes,";
	
	}
	// MS browser doesnt like a '-' character in object field names.
	name = name.replace(/-/g, "_");
	
	win_exists = name != '_blank' && popup_windows[name] && !popup_windows[name].closed;
	if(win_exists && !refresh_url) {
		popup_windows[name].focus();
	} else {
		if(!win_exists) {
			var new_window = window.open('', name,
				win_attrs + "width=" + width + ", height=" + height
			)
			if(typeof new_window == 'undefined') {
				alert("The browser's popup blocker prevents showing a popup. Please turn it off.");
			} else {
				popup_windows[name] = new_window;
			}
		}
		win_exists = name != '_blank' && popup_windows[name] && !popup_windows[name].closed;
		if(win_exists) {
			popup_windows[name].location.href = url;
			popup_windows[name].focus();
		}
	}
}


// Add Array.indexOf method
if(!Array.indexOf){
	Array.prototype.indexOf = function(obj){
		for(var i=0; i<this.length; i++){
			if(this[i]==obj){
				return i;
			}
	}
	return -1;
	}
}



//------------------------------------------------------------------------------
// Startup
//------------------------------------------------------------------------------

$(function() {
	var pdf_builder = new PdfBuilder();
	var mailafriend = new MailAFriend();
	
});
