/**
 * FormFieldPage Class
 */

var FormFieldPage = Class.create({
	// Getters & Setters
	getDisplay: function() {
		return this.display;
	},
	setDisplay: function(value) {
		this.display = value;
	},
	getDescription: function() {
		return this.description;
	},
	setDescription: function(value) {
		this.description = value;
	},
	getGroups: function() {
		return this.groups;
	},
	setGroups: function(value) {
		this.groups = value;
	},
	getSelected: function() {
		return this.selected;
	},
	setSelected: function(value) {
		this.selected = value;
	},
	getRemoveable: function() {
		return this.removeable;
	},
	setRemoveable: function(value) {
		this.removeable = value;
	},
	getRepeatable: function() {
		return this.repeatable;
	},
	setRepeatable: function(value) {
		this.repeatable = value;
	},
	getDisplayPrefix: function() {
		return this.displayprefix;
	},
	setDisplayPrefix: function(value) {
		this.displayprefix = value;
	},
	getDisplayFieldName: function() {
		return this.displayfieldname;
	},
	setDisplayFieldName: function(value) {
		this.displayfieldname = value;
	},
	
	// Constructor
	initialize: function(properties) {
		// Initialize Members
		this.display = null;
		this.description = null;
		this.groups = null;
		this.selected = false;
		this.removeable = false;
		this.repeatable = false;
		this.displayprefix = 'New Page';
		this.displayfieldname = null;
		
		if (properties !== undefined) {
			if (properties.display !== undefined) {
				this.setDisplay(properties.display);
			}
			if (properties.description !== undefined) {
				this.setDescription(properties.description);
			}
			if (properties.groups !== undefined) {
				this.setGroups(properties.groups);
			}
			if (properties.selected !== undefined) {
				this.setSelected(properties.selected);
			}
			if (properties.removeable !== undefined) {
				this.setRemoveable(properties.removeable);
			}
			if (properties.repeatable !== undefined) {
				this.setRepeatable(properties.repeatable);
			}
			if (properties.displayprefix !== undefined) {
				this.setDisplayPrefix(properties.displayprefix);
			}
			if (properties.displayfieldname !== undefined) {
				this.setDisplayFieldName(properties.displayfieldname);
			}
			
			if (properties._display !== undefined) {
				this.setDisplay(properties._display);
			}
			if (properties._description !== undefined) {
				this.setDescription(properties._description);
			}
			if (properties._groups !== undefined) {
				this.setGroups(properties._groups);
			}
			if (properties._selected !== undefined) {
				this.setSelected(properties._selected);
			}
			if (properties._removeable !== undefined) {
				this.setRemoveable(properties._removeable);
			}
			if (properties._repeatable !== undefined) {
				this.setRepeatable(properties._repeatable);
			}
			if (properties._displayprefix !== undefined) {
				this.setDisplayPrefix(properties._displayprefix);
			}
			if (properties._displayfieldname !== undefined) {
				this.setDisplayFieldName(properties._displayfieldname);
			}
		}
	},
	
	// Methods
	create: function(container, options) {
		if (options.isDynamicPage == undefined) {
			options.isDynamicPage = false;
		}
		
		if (!this.getRepeatable()) {
			// Create page container
			var pageContainer = createExtendedElement('div', {
				hidden: this.getSelected() ? false : true,
				parent: container
			});
		} else {
			var pageContainer;
		}
		
		// Add page list item
		if (options.pageList) {
			var pageListItem = createExtendedElement(options.pageListItemElement, {
				className: options.pageListItemClass
			});
			if (!options.isDynamicPage) {
				options.pageList.appendChild(pageListItem);
			} else {
				options.pageList.insertBefore(pageListItem, $(options.pageList).immediateDescendants().last());
			}
			var pageListLink = createExtendedElement('a', {
				innerHTML: this.getDisplay(),
				href: '#',
				parent: pageListItem
			});
			
			if (options.isDynamicPage || this.getRemoveable()) {
				createExtendedElement('span', {
					innerHTML: ' ',
					parent: pageListItem
				});
				var pageListRemoveLink = createExtendedElement('a', {
					innerHTML: '(remove)',
					href: '#',
					parent: pageListItem
				});
				Event.observe(pageListRemoveLink, 'click', function(event) {
					Dialog.confirm('Are you sure you want to remove this room?', {
						className: 'cityred',
						width: 300,
						okLabel: 'Yes',
						cancelLabel: 'No',
						onOk: function(win) {
							allow_save = false;
							
							if (options.callbacks.remove_page != undefined) {
								options.callbacks.remove_page(this, pageContainer);
							}
							
							new Effect.Fade(pageContainer, {
								afterFinish: function() {
									$(pageContainer).remove();
									allow_save = true;
								}
							});
							new Effect.Fade(pageListItem, {
								afterFinish: function() {
									$(pageListItem).remove();
								}
							});
							
							return true;
						}.bindAsEventListener(this)
					});
					
					event.stop();
				}.bindAsEventListener(this));
			}
			
			if (this.getSelected() && !this.getRepeatable()) {
				if (options.pageListItemSelectedClass) {
					$A(options.pageLists).each(function(item) {
						var listItems = $(item).immediateDescendants();
						listItems.each(function(item) {
							item.className = options.pageListItemClass;
						});
					});
				}
				if (options.pageListItemSelectedClass) {
					pageListItem.className = options.pageListItemClass + ' ' + options.pageListItemSelectedClass;
				}
				var pages = $(container).immediateDescendants();
				$A(pages).each(function(item) {
					if (item != pageContainer) {
						$(item).hide();
					}
				});
				$(pageContainer).show();
			}
			
			if (!this.getRepeatable()) {
				Event.observe(pageListLink, 'click', function(event) {
					var pageListLink = Event.element(event);
					pageListLink.blur();
					
					if (options.pageListItemSelectedClass) {
						$A(options.pageLists).each(function(item) {
							var listItems = $(item).immediateDescendants();
							listItems.each(function(item) {
								item.className = options.pageListItemClass;
							});
						});
						pageListLink.parentNode.className = options.pageListItemClass + ' ' + options.pageListItemSelectedClass;
					}
					
					var pages = $(container).immediateDescendants();
					$A(pages).each(function(item) {
						if (item != pageContainer) {
							$(item).hide();
						}
					});
					$(pageContainer).show();
					
					if (options.callbacks.display_page != undefined) {
						options.callbacks.display_page(this, pageContainer);
					}
					
					event.stop();
				}.bindAsEventListener(this));
			} else {
				var repeatedPages = 0;
				var displayPrefix = this.getDisplayPrefix();
				var displayFieldName = this.getDisplayFieldName();
				var formFieldGroups = this.getGroups();
				Event.observe(pageListLink, 'click', function(event) {
					var pageListLink = Event.element(event);
					pageListLink.blur();
					
					repeatedPages++;
					var newPage = new FormFieldPage(
						Object.extend(options, {
							display: displayPrefix + ' ' + (repeatedPages),
							groups: formFieldGroups,
							selected: true,
							removeable: true
						})
					);
					
					options.isDynamicPage = true;
					options.dynamicFieldName = displayFieldName;
					newPage.create(container, options);
					
					if (typeof cbb != 'undefined') {
						cbb.init();
					}
					
					event.stop();
				}.bindAsEventListener(this));
			}
		}
		
		if (!this.getRepeatable()) {
			// Add Field Groups
			if (this.getGroups()) {
				$H(this.getGroups()).each(function(pair) {
					if (options.isDynamicPage || this.getRemoveable()) {
						if (options.dynamicFieldName != undefined || this.getDisplayFieldName()) {
							if (this.getDisplayFieldName()) {
								options.dynamicFieldName = this.getDisplayFieldName();
							}
							options.fieldOptions = {
								events: [
									{
										fieldname: options.dynamicFieldName,
										event: 'blur',
										callback: function() {
											if (this.value) {
												pageListLink.innerHTML = this.value;
											}
										}
									}
								]
							}
						}
					}
					pair.value.create(pageContainer, options);
				}.bind(this));
			}
		}
		
		if (this.getSelected()) {
			if (options.callbacks.display_page != undefined) {
				options.callbacks.display_page(this, pageContainer, false);
			}
		}
	}
});