/**
 * @author paweł smoleński <pawel@smolenski.pl>
 * @copyright paweł smoleński <pawel@smolenski.pl>
 */

var pl =
{
	smolenski:
	{
		Tree: new Class
		({
			dataSource: null,
			allowDragSorting: false,
			__container: null,
			__menuContainer: null,
			__treeContainer: null,
			__activeNode: null,
			__draggedNode: null,
			
			initialize: function()
			{
				this.__container = new Element('div', {'class': 'tree'});
				this.__menuContainer = new Element('div', {'class': 'actions'}).inject(this.__container); 
				this.__treeContainer = new Element('div', {'class': 'structure'}).inject(this.__container);
			},
			
			loadNode: function(node)
			{
				new Request.JSON
				({
					url: this.dataSource,
					onComplete: this.__generateNode.bind(this)
				})
				.post
				({
					'action': 'GET_NODE',
					'node': node ? node.nodeId : null
				});
			},
			
			getParentNode: function(node)
			{
				node = node.getParent();
				
				while (!node.hasClass('node'))
				{
					node = node.getParent();
					
					if (node == document.body || !node)
						return false;
				}
				
				return node;			
			},
			
			getNodeById: function(nodeId)
			{
				var node = this.__container.getElement('.node[nodeId=' + nodeId + ']');
				
				return node;
			},
			
			toElement: function()
			{
				return this.__container;
			},
			
			__generateNode: function(nodeData)
			{
				var parentNode = this.__container.getElement('.node[nodeId=' + nodeData.data.parentNode + ']');

				if (!parentNode)
				{
					var parentNode = this.__treeContainer;
					var nodesContainer = parentNode;
				}
				else
				{
					var nodesContainer = parentNode.getElement('div.children');
				}
				
				parentNode.nodeLoaded = true;
				nodesContainer.empty();
				
				if (!nodeData.data.childrenNodes.length)
					parentNode.addClass('unfoldable');
				else
					for (var i = 0; i < nodeData.data.childrenNodes.length; i++)
					{
						var node = this.__generateNodeElement(nodeData.data.childrenNodes[i]);
						node.inject(nodesContainer);
					}
				
				new Element('div', {'class': 'clear'}).inject(nodesContainer);
			},
			
			__generateNodeElement: function(nodeData)
			{
				var node = new Element('div', {'class': 'node', 'nodeId': nodeData.id});
				var toggler = new Element('div', {'class': 'toggler'}).inject(node);
				var item = new Element('div', {'class': 'item'}).inject(node);
				var icon = new Element('div', {'class': 'icon', 'title': 'id: ' + nodeData.id}).inject(item);
				var label = new Element('div', {'class': 'label', 'text': nodeData.label}).inject(item);
				var children = new Element('div', {'class': 'children'}).inject(node);
				
				if (nodeData['class'])
					node.addClass(nodeData['class']);
				
				if (nodeData.unfoldable)
					node.addClass('unfoldable');

				toggler.addEvent('click', this.__handleTogglerClick.bind(this));
				item.addEvent('click', this.__handleItemClick.bind(this));
				item.addEvent('dblclick', this.__handleTogglerClick.bind(this));
				item.addEvent('mouseup', this.__handleItemRelease.bind(this));
				item.addEvent('mousedown', this.__handleItemPress.bind(this));
				item.addEvent('mousemove', this.__handleItemRollover.bind(this));
				item.addEvent('mouseout', this.__handleItemRollout.bind(this));
				
				/*
				item.addEvent('contextmenu', this.__contextMenu.bind(this));
				*/
				
				label.addEvent('selectstart', function(event) { event.stop(); });
				label.setStyle('-moz-user-select', 'none');
				
				node.nodeId = nodeData.id;
				node.data = nodeData;
				node.childrenLoaded = false;

				return node;
			},
			
			__activateNode: function(node)
			{
				try
				{
					this.__activeNode.getElement('.item').removeClass('active');
				}
				catch (xcpt) {}
				
				this.__activeNode = node;
				
				node.getElement('.item').addClass('active');
				
				$(this).fireEvent('nodeactivate', node);		
			},

			__toggleNode: function(node)
			{
				if (node.hasClass('unfoldable'))
					return false;
				
				if (node.hasClass('unfolded'))
				{
					node.removeClass('unfolded');
				}
				else
				{
					node.addClass('unfolded');
					
					if (!node.nodeLoaded)
						this.loadNode(node);
				}
			},

			__getRelatedNode: function(event)
			{
				var node = event.target;
				
				while (!node.hasClass('node'))
				{
					node = node.getParent();
					
					if (node == document.body)
						return false;
				}
				
				return node;		
			},
			
			__moveNodeInside: function(node, targetNode)
			{
				if (node == targetNode)
					return false;
				
				try
				{
					node.inject(targetNode.getElement('.children'));

					new Request.JSON
					({
						url: this.dataSource,
						onComplete: this.__afterStructureUpdate.bind(this)
					})
					.post
					({
						'action': 'MOVE_NODE_INSIDE',
						'node': node.nodeId,
						'targetNode': targetNode.nodeId
					});
				}
				catch (xcpt) {}
			},
			
			__moveNodeBefore: function(node, targetNode)
			{
				if (node == targetNode || !this.allowDragSorting)
					return false;
				
				try
				{
					node.inject(targetNode, 'before');

					new Request.JSON
					({
						url: this.dataSource,
						onComplete: this.__afterStructureUpdate.bind(this)
					})
					.post
					({
						'action': 'MOVE_NODE_BEFORE',
						'node': node.nodeId,
						'targetNode': targetNode.nodeId
					});
				}
				catch (xcpt) {}
			},
			
			__moveNodeAfter: function(node, targetNode)
			{
				if (node == targetNode || !this.allowDragSorting)
					return false;
				
				try
				{
					node.inject(targetNode, 'after');

					new Request.JSON
					({
						url: this.dataSource,
						onComplete: this.__afterStructureUpdate.bind(this)
					})
					.post
					({
						'action': 'MOVE_NODE_BEFORE',
						'node': node.nodeId,
						'targetNode': targetNode.nodeId
					});
				}
				catch (xcpt) {}
			},

			__afterStructureUpdate: function(nodeData)
			{
				var node = this.getNodeById(nodeData.data.refreshNode);
				
				this.loadNode(node ? node : null);
				
				if (node)
				{
					node.addClass('unfolded');
					this.__activateNode(node);
				}
			},
			
			__handleItemClick: function(event)
			{
				var node = this.__getRelatedNode(event);
				this.__activateNode(node);
			},

			__handleTogglerClick: function(event)
			{
				var node = this.__getRelatedNode(event);
				this.__toggleNode(node);
			},

			__handleItemPress: function(event)
			{
				if (event.rightClick)
					return;
				
				var node = this.__getRelatedNode(event);
				this.__draggedNode = node;
			},
			
			__handleItemRelease: function(event)
			{
				if (!this.__draggedNode)
					return;

				var node = this.__getRelatedNode(event);
				
				if (!node.data.drop)
					return false;
				
				var label = node.getElement('.label');
				var offset = event.client.y -node.getPosition().y -10;
				
				label.setStyle('border-color', 'transparent');

				if (offset < -6 && this.allowDragSorting)
					this.__moveNodeBefore(this.__draggedNode, node);

				else if (offset > 6 && this.allowDragSorting)
					this.__moveNodeAfter(this.__draggedNode, node);
				
				else
					this.__moveNodeInside(this.__draggedNode, node);
				
				this.__draggedNode = null;
			},
			
			__handleItemRollover: function(event)
			{
				if (!this.__draggedNode)
					return;
				
				var node = this.__getRelatedNode(event);
				var label = node.getElement('.label');
				var offset = event.client.y -node.getPosition().y -10;

				label.setStyle('border-color', 'transparent');
				
				if (offset < -6 && this.allowDragSorting)
					label.setStyle('border-top-color', '#888');

				if (offset > 6 && this.allowDragSorting)
					label.setStyle('border-bottom-color', '#888');
			},
			
			__handleItemRollout: function(event)
			{
				if (!this.__draggedNode)
					return;
				
				var node = this.__getRelatedNode(event);
				var label = node.getElement('.label');

				label.setStyle('border-color', 'transparent');
			}
		}),
			
		List: new Class
		({
			dataSource: null,
			allowDragSorting: false,
			__container: null,
			__menuContainer: null,
			__treeContainer: null,
			__activeItem: null,
			__draggedItem: null,
			
			initialize: function()
			{
				this.__container = new Element('div', {'class': 'list'});
				this.__menuContainer = new Element('div', {'class': 'actions'}).inject(this.__container); 
				this.__listContainer = new Element('div', {'class': 'structure'}).inject(this.__container);
			},
			
			loadItems: function()
			{
				new Request.JSON
				({
					url: this.dataSource,
					onComplete: this.__generateList.bind(this)
				})
				.post
				({
					'action': 'GET_ITEMS'
				});
			},
			
			getItemById: function(itemId)
			{
				var item = this.__listContainer.getElement('.item[itemId=' + itemId + ']');
				
				return item;
			},
			
			toElement: function()
			{
				return this.__container;
			},
			
			__generateList: function(listData)
			{
				this.__listContainer.empty();
				
				for (var i = 0; i < listData.data.items.length; i++)
				{
					var item = this.__generateItemElement(listData.data.items[i]);
					item.inject(this.__listContainer);
				}
				
				new Element('div', {'class': 'clear'}).inject(this.__listContainer);
			},
			
			__generateItemElement: function(itemData)
			{
				var item = new Element('div', {'class': 'item', 'itemId': itemData.id});
				var label = new Element('div', {'class': 'label', 'html': this.__generateItemLabel(itemData)}).inject(item);
				
				if (itemData['class'])
					item.addClass(itemData['class']);
				
				item.addEvent('click', this.__handleItemClick.bind(this));
				item.addEvent('mouseup', this.__handleItemRelease.bind(this));
				item.addEvent('mousedown', this.__handleItemPress.bind(this));
				item.addEvent('mousemove', this.__handleItemRollover.bind(this));
				item.addEvent('mouseout', this.__handleItemRollout.bind(this));
				
				label.addEvent('selectstart', function(event) { event.stop(); });
				label.setStyle('-moz-user-select', 'none');
				
				item.itemId = itemData.id;
				item.data = itemData;

				return item;
			},
			
			__generateItemLabel: function(itemData)
			{
				return itemData.label;
			},
			
			__activateItem: function(item)
			{
				try
				{
					this.__activeItem.removeClass('active');
				}
				catch (xcpt) {}
				
				this.__activeItem = item;
				
				item.addClass('active');
				
				$(this).fireEvent('itemactivate', item);		
			},

			__getRelatedItem: function(event)
			{
				var item = event.target;
				
				while (!item.hasClass('item'))
				{
					item = item.getParent();
					
					if (item == document.body)
						return false;
				}
				
				return item;		
			},
			
			__moveItemBefore: function(item, targetItem)
			{
				if (item == targetItem || !this.allowDragSorting)
					return false;
				
				try
				{
					item.inject(targetItem, 'before');

					new Request.JSON
					({
						url: this.dataSource,
						onComplete: this.__afterStructureUpdate.bind(this)
					})
					.post
					({
						'action': 'MOVE_ITEM_BEFORE',
						'item': item.itemId,
						'targetItem': targetItem.itemId
					});
				}
				catch (xcpt) {}
			},

			__moveItemAfter: function(item, targetItem)
			{
				if (item == targetItem || !this.allowDragSorting)
					return false;
				
				try
				{
					item.inject(targetItem, 'after');

					new Request.JSON
					({
						url: this.dataSource,
						onComplete: this.__afterStructureUpdate.bind(this)
					})
					.post
					({
						'action': 'MOVE_ITEM_AFTER',
						'item': item.itemId,
						'targetItem': targetItem.itemId
					});
				}
				catch (xcpt) {}
			},
			
			__afterStructureUpdate: function(itemData)
			{
				this.loadItems();
			},
			
			__handleItemClick: function(event)
			{
				var item = this.__getRelatedItem(event);
				this.__activateItem(item);
			},

			__handleItemPress: function(event)
			{
				if (event.rightClick)
					return;
				
				var item = this.__getRelatedItem(event);
				this.__draggedItem = item;
			},
			
			__handleItemRelease: function(event)
			{
				if (!this.__draggedItem)
					return;

				var item = this.__getRelatedItem(event);
				
				var label = item.getElement('.label');
				var offset = event.client.y -item.getPosition().y -10;
				
				label.setStyle('border-color', 'transparent');

				if (offset < -6 && this.allowDragSorting)
					this.__moveItemBefore(this.__draggedItem, item);

				else if (offset > 6 && this.allowDragSorting)
					this.__moveItemAfter(this.__draggedItem, item);
				
				this.__draggedItem = null;
			},
			
			__handleItemRollover: function(event)
			{
				if (!this.__draggedItem)
					return;
				
				var item = this.__getRelatedItem(event);
				var label = item.getElement('.label');
				var offset = event.client.y -item.getPosition().y -10;

				label.setStyle('border-color', 'transparent');
				
				if (offset < -6 && this.allowDragSorting)
					label.setStyle('border-top-color', '#888');

				if (offset > 6 && this.allowDragSorting)
					label.setStyle('border-bottom-color', '#888');
			},
			
			__handleItemRollout: function(event)
			{
				if (!this.__draggedItem)
					return;
				
				var item = this.__getRelatedItem(event);
				var label = item.getElement('.label');

				label.setStyle('border-color', 'transparent');
			}
		}),
			
		Tabs: new Class
		({
			__container: null,
			__handlesContainer: null,
			__panelsContainer: null,
			__tabs: new Array(),
			
			initialize: function()
			{
				this.__container = new Element('div', {'class': 'tabs'});
				
				this.__handlesContainer = new Element('div', {'class': 'handles'}).inject(this.__container);
				this.__panelsContainer = new Element('div', {'class': 'panels'}).inject(this.__container);
			},
		
			addTab: function(label, panelContent)
			{
				var tab = this.__buildTab(label).inject(this.__handlesContainer);
				var panel = this.__buildPanel().inject(this.__panelsContainer);
				
				this.__tabs.push({'tab': tab, 'panel': panel});
				
				tab.addEvent('click', this.__handleTabClick.bind(this));
				
				tab.addEvent('selectstart', function(event) { event.stop(); });
				tab.setStyle('-moz-user-select', 'none');
				
				if (panelContent)
					$(panelContent).inject(panel);

				this.activateTab(tab);
				
				return panel;
			},
			
			activateTab: function(tab)
			{
				for (var i = 0; i < this.__tabs.length; i++)
				{
					if (this.__tabs[i].tab == tab || this.__tabs[i].panel == tab || i == tab)
					{
						this.__tabs[i].tab.addClass('active');
						this.__tabs[i].panel.removeClass('none');
					}
					else
					{
						this.__tabs[i].tab.removeClass('active');
						this.__tabs[i].panel.addClass('none');
					}
				}
				
				window.fireEvent('resize');
			},
			
			toElement: function()
			{
				return this.__container;
			},
			
			__buildTab: function(label)
			{
				var tab = new Element('div', {'class': 'tab', 'text': label});
				
				return tab;
			},
			
			__buildPanel: function()
			{
				var panel = new Element('div', {'class': 'panel none'});
				
				return panel;
			},
			
			__handleTabClick: function(event)
			{
				this.activateTab(event.target);
			}
			
		}),

		Form: new Class
		({
			__submitButton: null,
			__fields: null,

			initialize: function()
			{
			},
			
			clear: function(fieldName)
			{
				var field = this.__fields[fieldName];
				
				if (!field)
					return false;
				
				switch (field.get('tag'))
				{
					case 'select':
						field.options.length = 0;
						break;
				}
			},
			
			addOption: function(fieldName, label, value)
			{
				var field = this.__fields[fieldName];
				var option = new Option(label, value);
				field.options[field.options.length] = option;
			}
		}),
		
		Gallery: new Class
		({
			__container: null,
			__background: null,
			__frame: null,
			__photos: null,
			__current: null,
			__animationDuration: 500,
			__ie6: null,
			
			initialize: function()
			{
				this.__ie6 = new pl.smolenski.IE6();
			},
			
			setGallery: function(data)
			{
				this.__photos = data;
			},
			
			show: function(i)
			{
				i = Math.min(Math.max(0, i), this.__photos.length - 1);
				
				this.__current = i;
				
				this.__container.setStyle('display', 'block');
				
				var framePadding = 
				{
					'left': this.__frame.getStyle('padding-left').toInt(),
					'top': this.__frame.getStyle('padding-top').toInt()
				};
				
				var photo = this.__frame.getElement('.photo');
				
				photo.setStyles.delay
				(
						200, photo,
						[{
					'background-image': 'url(' + this.__photos[i].filename + ')',
					'background-position': 'center -2000px'
				}]);
				
				photo.setStyle.delay
				(
					this.__animationDuration,
					photo,
					['background-position', 'center center']
				);
				
				new Fx.Morph
				(
					photo,
					{
						'duration': this.__animationDuration,
						'transition': Fx.Transitions.Quad.easeOut
					}
				)
				.start
				({
					'height': this.__photos[i].height,
					'width': this.__photos[i].width
				});
				
				new Fx.Morph
				(
					this.__frame,
					{
						'duration': this.__animationDuration,
						'transition': Fx.Transitions.Quad.easeOut
					}
				)
				.start
				({
					'margin-left': (-this.__photos[i].width / 2 -framePadding.left),
					'margin-top': (-this.__photos[i].height / 2 -framePadding.top)
				});

				
				this.__frame.getElement('.label')
					.set('text', this.__photos[i].label)
					.setStyle('display', this.__photos[i].label ? 'block' : 'none');
				
				this.__frame.getElement('.navigation .counter')
					.set('text', (i + 1) + '/' + this.__photos.length);
				
				this.__frame.getElement('.navigation')
					.setStyle('display', this.__photos.length > 1 ? 'block' : 'none');
				
				this.__resize();
				
				this.__ie6.hideSelects();
			},
			
			showNext: function()
			{
				this.show(this.__current + 1);
			},
			
			showPrev: function()
			{
				this.show(this.__current - 1);
			},
			
			close: function()
			{
				this.__container.setStyle('display', 'none');
				this.__ie6.showSelects();
			},
			
			__generate: function()
			{
				if (!this.__container)
					return false;
				
				this.__background = this.__container.getElement('.background');
				this.__frame = this.__container.getElement('.frame');
				
				this.__resize();
				
				window.addEvent('resize', this.__resize.bind(this));
				this.__background.addEvent('click', this.close.bind(this));
				this.__frame.getElement('.photo').addEvent('click', this.close.bind(this));
				this.__frame.getElement('.navigation .prev').addEvent('click', this.showPrev.bind(this));
				this.__frame.getElement('.navigation .next').addEvent('click', this.showNext.bind(this));
			},
			
			__resize: function()
			{
				this.__background.setStyles
				({
					'width': 0,
					'height': 0
				});
				
				var docSize = document.getScrollSize();

				this.__background.setStyles
				({
					'width': docSize.x,
					'height': docSize.y
				});
				
				if (this.__ie6.is())
					this.__frame.setStyles
					({
						'top': window.getScroll().y + window.getSize().y / 2
					})
			}
		}),
		
		Button: new Class
		({
			__container: null,

			initialize: function(label, className, onlyIcon)
			{
				if (!className)
					className = '';
				
				this.__container = new Element('div', {'class': 'button'});
				this.__container.addClass(className);

				if (!onlyIcon)
					this.__container.set('text', label);

				if (label)
					this.__container.set('title', label);
			},
			
			toElement: function()
			{
				return this.__container;
			}
		}),
		
		ButtonsContainer: new Class
		({
			__container: null,
			
			initialize: function()
			{
				this.__container = new Element('div', {'class': 'buttons'});
				
				new Element('div', {'class': 'container'}).inject(this.__container);
				new Element('div', {'class': 'clear'}).inject(this.__container);
			},
			
			addButton: function(button)
			{
				$(button).inject(this.__container.getElement('div'));
			},
			
			getButton: function(buttonName)
			{
				return this.__container.getElement('div.' + buttonName);
			},
			
			toElement: function()
			{
				return this.__container;
			}
		}),

		Interface: new Class
		({
			addFlash: function(targetContainer, flashData)
			{
				defaultData = 
				{
					'wmode': 'transparent',
					'vars': '',
					'scale': 'noscale',
					'backgroundColor': 'transparent'
				}
				
				flashData = $merge(defaultData, flashData);
				
				$(targetContainer).innerHTML = '<object id="' + flashData.id + '" width="' + flashData.width + 'px" height="' + flashData.height + 'px" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0">'
				+ ' <param name="allowScriptAccess" value = "sameDomain" />'
				+ ' <param name="movie" value="' + flashData.url + '" />'
				+ ' <param name="loop" value="true" />'
				+ ' <param name="menu" value="false" />'
				+ ' <param name="quality" value="high" />'
				+ ' <param name="bgcolor" value="' + flashData.backgroundColor + '" />'
				+ ' <param name="flashvars" value="' + flashData.vars + '" />'
				+ ' <param name="wmode" value="' + flashData.wmode + '" />'
				+ ' <param name="scale" value="' + flashData.scale + '" />'
				+ ' <embed name="' + flashData.id + '" bgcolor="' + flashData.backgroundColor + '" src="' + flashData.url + '" swLiveConnect="true" loop="true" play="true" menu="false" quality="best" allowScriptAccess="sameDomain" width="' + flashData.width + 'px" height="' + flashData.height + 'px" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="' + flashData.vars + '" wmode="' + flashData.wmode + '" scale="' + flashData.scale + '"></embed>'
				+ ' </object>';
			},
			
			scrollToAnchor: function(anchorName)
			{
				var anchorElement = $E('a[name=' + anchorName + ']');
				
				if (!anchorElement)
					return false;
					
				new Fx.Scroll(window).scrollTo(0, anchorElement.getTop());
			}
		}),
		
		IE6: new Class
		({
			__selects: [],
			__enabled: false,
			
			initialize: function()
			{
				this.__enabled = (Browser.Engine.trident && Browser.Engine.version == 4);
			},
			
			is: function()
			{
				return this.__enabled;
			},
			
			hideSelects: function()
			{
				if (!this.__enabled)
					return false;
				
				this.__selects = document.getElements('select');
				
				for (var i = 0; i < this.__selects.length; i++)
					this.__selects[i].setStyle('visibility', 'hidden');
			},
			
			showSelects: function()
			{
				if (!this.__enabled)
					return false;
				
				for (var i = 0; i < this.__selects.length; i++)
					this.__selects[i].setStyle('visibility', 'visible');
			},
			
			getWindowCenter: function()
			{
				if (!this.__enabled)
					return false;
			}
				
		}),
		
		ColorSwatches:
		[
			{'name': 'Black', 'hex': '#000000'},
			{'name': 'Gray 90%', 'hex': '#191919'},
			{'name': 'Gray 80%', 'hex': '#333333'},
			{'name': 'Gray 70%', 'hex': '#4C4C4C'},
			{'name': 'Gray 60%', 'hex': '#666666'},
			{'name': 'Gray 50%', 'hex': '#7F7F7F'},
			{'name': 'Gray 40%', 'hex': '#999999'},
			{'name': 'Gray 30%', 'hex': '#B2B2B2'},
			{'name': 'Gray 20%', 'hex': '#CCCCCC'},
			{'name': 'Gray 10%', 'hex': '#E5E5E5'},
			{'name': 'White', 'hex': '#ffffff'},

			{'name': 'Gray', 'hex': '#736F6E'},
			{'name': 'Slate Gray4', 'hex': '#616D7E'},
			{'name': 'Slate Gray', 'hex': '#657383'},
			{'name': 'Light Steel Blue4', 'hex': '#646D7E'},
			{'name': 'Light Slate Gray', 'hex': '#6D7B8D'},
			{'name': 'Cadet Blue4', 'hex': '#4C787E'},
			{'name': 'Dark Slate Gray4', 'hex': '#4C7D7E'},
			{'name': 'Thistle4', 'hex': '#806D7E'},
			{'name': 'Medium Slate Blue', 'hex': '#5E5A80'},
			{'name': 'Medium Purple4', 'hex': '#4E387E'},
			{'name': 'Midnight Blue', 'hex': '#151B54'},
			{'name': 'Dark Slate Blue', 'hex': '#2B3856'},
			{'name': 'Dark Slate Gray', 'hex': '#25383C'},
			{'name': 'Dim Gray', 'hex': '#463E41'},
			{'name': 'Cornflower Blue', 'hex': '#151B8D'},
			{'name': 'Royal Blue4', 'hex': '#15317E'},
			{'name': 'Slate Blue4', 'hex': '#342D7E'},
			{'name': 'Royal Blue', 'hex': '#2B60DE'},
			{'name': 'Royal Blue1', 'hex': '#306EFF'},
			{'name': 'Royal Blue2', 'hex': '#2B65EC'},
			{'name': 'Royal Blue3', 'hex': '#2554C7'},
			{'name': 'Deep Sky Blue', 'hex': '#3BB9FF'},
			{'name': 'Deep Sky Blue2', 'hex': '#38ACEC'},
			{'name': 'Slate Blue', 'hex': '#3574EC7'},
			{'name': 'Deep Sky Blue3', 'hex': '#3090C7'},
			{'name': 'Deep Sky Blue4', 'hex': '#25587E'},
			{'name': 'Dodger Blue', 'hex': '#1589FF'},
			{'name': 'Dodger Blue2', 'hex': '#157DEC'},
			{'name': 'Dodger Blue3', 'hex': '#1569C7'},
			{'name': 'Dodger Blue4', 'hex': '#153E7E'},
			{'name': 'Steel Blue4', 'hex': '#2B547E'},
			{'name': 'Steel Blue', 'hex': '#4863A0'},
			{'name': 'Slate Blue2', 'hex': '#6960EC'},
			{'name': 'Violet', 'hex': '#8D38C9'},
			{'name': 'Medium Purple3', 'hex': '#7A5DC7'},
			{'name': 'Medium Purple', 'hex': '#8467D7'},
			{'name': 'Medium Purple2', 'hex': '#9172EC'},
			{'name': 'Medium Purple1', 'hex': '#9E7BFF'},
			{'name': 'Light Steel Blue', 'hex': '#728FCE'},
			{'name': 'Steel Blue3', 'hex': '#488AC7'},
			{'name': 'Steel Blue2', 'hex': '#56A5EC'},
			{'name': 'Steel Blue1', 'hex': '#5CB3FF'},
			{'name': 'Sky Blue3', 'hex': '#659EC7'},
			{'name': 'Sky Blue4', 'hex': '#41627E'},
			{'name': 'Slate Blue', 'hex': '#737CA1'},
			{'name': 'Slate Blue', 'hex': '#737CA1'},
			{'name': 'Slate Gray3', 'hex': '#98AFC7'},
			{'name': 'Violet Red', 'hex': '#F6358A'},
			{'name': 'Violet Red1', 'hex': '#F6358A'},
			{'name': 'Violet Red2', 'hex': '#E4317F'},
			{'name': 'Deep Pink', 'hex': '#F52887'},
			{'name': 'Deep Pink2', 'hex': '#E4287C'},
			{'name': 'Deep Pink3', 'hex': '#C12267'},
			{'name': 'Deep Pink4', 'hex': '#7D053F'},
			{'name': 'Medium Violet Red', 'hex': '#CA226B'},
			{'name': 'Violet Red3', 'hex': '#C12869'},
			{'name': 'Firebrick', 'hex': '#800517'},
			{'name': 'Violet Red4', 'hex': '#7D0541'},
			{'name': 'Maroon4', 'hex': '#7D0552'},
			{'name': 'Maroon', 'hex': '#810541'},
			{'name': 'Maroon3', 'hex': '#C12283'},
			{'name': 'Maroon2', 'hex': '#E3319D'},
			{'name': 'Maroon1', 'hex': '#F535AA'},
			{'name': 'Magenta', 'hex': '#FF00FF'},
			{'name': 'Magenta1', 'hex': '#F433FF'},
			{'name': 'Magenta2', 'hex': '#E238EC'},
			{'name': 'Magenta3', 'hex': '#C031C7'},
			{'name': 'Medium Orchid', 'hex': '#B048B5'},
			{'name': 'Medium Orchid1', 'hex': '#D462FF'},
			{'name': 'Medium Orchid2', 'hex': '#C45AEC'},
			{'name': 'Medium Orchid3', 'hex': '#A74AC7'},
			{'name': 'Medium Orchid4', 'hex': '#6A287E'},
			{'name': 'Purple', 'hex': '#8E35EF'},
			{'name': 'Purple1', 'hex': '#893BFF'},
			{'name': 'Purple2', 'hex': '#7F38EC'},
			{'name': 'Purple3', 'hex': '#6C2DC7'},
			{'name': 'Purple4', 'hex': '#461B7E'},
			{'name': 'Dark Orchid4', 'hex': '#571B7e'},
			{'name': 'Dark Orchid', 'hex': '#7D1B7E'},
			{'name': 'Dark Violet', 'hex': '#842DCE'},
			{'name': 'Dark Orchid3', 'hex': '#8B31C7'},
			{'name': 'Dark Orchid2', 'hex': '#A23BEC'},
			{'name': 'Dark Orchid1', 'hex': '#B041FF'},
			{'name': 'Plum4', 'hex': '#7E587E'},
			{'name': 'Pale Violet Red', 'hex': '#D16587'},
			{'name': 'Pale Violet Red1', 'hex': '#F778A1'},
			{'name': 'Pale Violet Red2', 'hex': '#E56E94'},
			{'name': 'Pale Violet Red3', 'hex': '#C25A7C'},
			{'name': 'Pale Violet Red4', 'hex': '#7E354D'},
			{'name': 'Plum', 'hex': '#B93B8F'},
			{'name': 'Plum1', 'hex': '#F9B7FF'},
			{'name': 'Plum2', 'hex': '#E6A9EC'},
			{'name': 'Plum3', 'hex': '#C38EC7'},
			{'name': 'Thistle', 'hex': '#D2B9D3'},
			{'name': 'Thistle3', 'hex': '#C6AEC7'},
			{'name': 'Lavendar Blush2', 'hex': '#EBDDE2'},
			{'name': 'Lavendar Blush3', 'hex': '#C8BBBE'},
			{'name': 'Thistle2', 'hex': '#E9CFEC'},
			{'name': 'Thistle1', 'hex': '#FCDFFF'},
			{'name': 'Lavendar', 'hex': '#E3E4FA'},
			{'name': 'Lavendar Blush', 'hex': '#FDEEF4'},
			{'name': 'Light Steel Blue1', 'hex': '#C6DEFF'},
			{'name': 'Light Blue', 'hex': '#ADDFFF'},
			{'name': 'Light Blue1', 'hex': '#BDEDFF'},
			{'name': 'Light Cyan', 'hex': '#E0FFFF'},
			{'name': 'Slate Gray1', 'hex': '#C2DFFF'},
			{'name': 'Slate Gray2', 'hex': '#B4CFEC'},
			{'name': 'Light Steel Blue2', 'hex': '#B7CEEC'},
			{'name': 'Turquoise1', 'hex': '#52F3FF'},
			{'name': 'Cyan', 'hex': '#00FFFF'},
			{'name': 'Cyan1', 'hex': '#57FEFF'},
			{'name': 'Cyan2', 'hex': '#50EBEC'},
			{'name': 'Turquoise2', 'hex': '#4EE2EC'},
			{'name': 'Medium Turquoise', 'hex': '#48CCCD'},
			{'name': 'Turquoise', 'hex': '#43C6DB'},
			{'name': 'Dark Slate Gray1', 'hex': '#9AFEFF'},
			{'name': 'Dark Slate Gray2', 'hex': '#8EEBEC'},
			{'name': 'Dark Slate Gray3', 'hex': '#78c7c7'},
			{'name': 'Cyan3', 'hex': '#46C7C7'},
			{'name': 'Turquoise3', 'hex': '#43BFC7'},
			{'name': 'Cadet Blue3', 'hex': '#77BFC7'},
			{'name': 'Pale Turquoise3', 'hex': '#92C7C7'},
			{'name': 'Light Blue2', 'hex': '#AFDCEC'},
			{'name': 'Dark Turquoise', 'hex': '#3B9C9C'},
			{'name': 'Cyan4', 'hex': '#307D7E'},
			{'name': 'Light Sea Green', 'hex': '#3EA99F'},
			{'name': 'Light Sky Blue', 'hex': '#82CAFA'},
			{'name': 'Light Sky Blue2', 'hex': '#A0CFEC'},
			{'name': 'Light Sky Blue3', 'hex': '#87AFC7'},
			{'name': 'Sky Blue', 'hex': '#82CAFF'},
			{'name': 'Sky Blue2', 'hex': '#79BAEC'},
			{'name': 'Light Sky Blue4', 'hex': '#566D7E'},
			{'name': 'Sky Blue', 'hex': '#6698FF'},
			{'name': 'Light Slate Blue', 'hex': '#736AFF'},
			{'name': 'Light Cyan2', 'hex': '#CFECEC'},
			{'name': 'Light Cyan3', 'hex': '#AFC7C7'},
			{'name': 'Light Cyan4', 'hex': '#717D7D'},
			{'name': 'Light Blue3', 'hex': '#95B9C7'},
			{'name': 'Light Blue4', 'hex': '#5E767E'},
			{'name': 'Pale Turquoise4', 'hex': '#5E7D7E'},
			{'name': 'Dark Sea Green4', 'hex': '#617C58'},
			{'name': 'Medium Aquamarine', 'hex': '#348781'},
			{'name': 'Medium Sea Green', 'hex': '#306754'},
			{'name': 'Sea Green', 'hex': '#4E8975'},
			{'name': 'Dark Green', 'hex': '#254117'},
			{'name': 'Sea Green4', 'hex': '#387C44'},
			{'name': 'Forest Green', 'hex': '#4E9258'},
			{'name': 'Medium Forest Green', 'hex': '#347235'},
			{'name': 'Spring Green4', 'hex': '#347C2C'},
			{'name': 'Dark Olive Green4', 'hex': '#667C26'},
			{'name': 'Chartreuse4', 'hex': '#437C17'},
			{'name': 'Green4', 'hex': '#347C17'},
			{'name': 'Medium Spring Green', 'hex': '#348017'},
			{'name': 'Spring Green', 'hex': '#4AA02C'},
			{'name': 'Lime Green', 'hex': '#41A317'},
			{'name': 'Spring Green', 'hex': '#4AA02C'},
			{'name': 'Dark Sea Green', 'hex': '#8BB381'},
			{'name': 'Dark Sea Green3', 'hex': '#99C68E'},
			{'name': 'Green3', 'hex': '#4CC417'},
			{'name': 'Chartreuse3', 'hex': '#6CC417'},
			{'name': 'Yellow Green', 'hex': '#52D017'},
			{'name': 'Spring Green3', 'hex': '#4CC552'},
			{'name': 'Sea Green3', 'hex': '#54C571'},
			{'name': 'Spring Green2', 'hex': '#57E964'},
			{'name': 'Spring Green1', 'hex': '#5EFB6E'},
			{'name': 'Sea Green2', 'hex': '#64E986'},
			{'name': 'Sea Green1', 'hex': '#6AFB92'},
			{'name': 'Dark Sea Green2', 'hex': '#B5EAAA'},
			{'name': 'Dark Sea Green1', 'hex': '#C3FDB8'},
			{'name': 'Green', 'hex': '#00FF00'},
			{'name': 'Lawn Green', 'hex': '#87F717'},
			{'name': 'Green1', 'hex': '#5FFB17'},
			{'name': 'Green2', 'hex': '#59E817'},
			{'name': 'Chartreuse2', 'hex': '#7FE817'},
			{'name': 'Chartreuse', 'hex': '#8AFB17'},
			{'name': 'Green Yellow', 'hex': '#B1FB17'},
			{'name': 'Dark Olive Green1', 'hex': '#CCFB5D'},
			{'name': 'Dark Olive Green2', 'hex': '#BCE954'},
			{'name': 'Dark Olive Green3', 'hex': '#A0C544'},
			{'name': 'Yellow', 'hex': '#FFFF00'},
			{'name': 'Yellow1', 'hex': '#FFFC17'},
			{'name': 'Khaki1', 'hex': '#FFF380'},
			{'name': 'Khaki2', 'hex': '#EDE275'},
			{'name': 'Goldenrod', 'hex': '#EDDA74'},
			{'name': 'Gold2', 'hex': '#EAC117'},
			{'name': 'Gold1', 'hex': '#FDD017'},
			{'name': 'Goldenrod1', 'hex': '#FBB917'},
			{'name': 'Goldenrod2', 'hex': '#E9AB17'},
			{'name': 'Gold', 'hex': '#D4A017'},
			{'name': 'Gold3', 'hex': '#C7A317'},
			{'name': 'Goldenrod3', 'hex': '#C68E17'},
			{'name': 'Dark Goldenrod', 'hex': '#AF7817'},
			{'name': 'Khaki', 'hex': '#ADA96E'},
			{'name': 'Khaki3', 'hex': '#C9BE62'},
			{'name': 'Khaki4', 'hex': '#827839'},
			{'name': 'Dark Goldenrod1', 'hex': '#FBB117'},
			{'name': 'Dark Goldenrod2', 'hex': '#E8A317'},
			{'name': 'Dark Goldenrod3', 'hex': '#C58917'},
			{'name': 'Sienna1', 'hex': '#F87431'},
			{'name': 'Sienna2', 'hex': '#E66C2C'},
			{'name': 'Dark Orange', 'hex': '#F88017'},
			{'name': 'Dark Orange1', 'hex': '#F87217'},
			{'name': 'Dark Orange2', 'hex': '#E56717'},
			{'name': 'Dark Orange3', 'hex': '#C35617'},
			{'name': 'Sienna3', 'hex': '#C35817'},
			{'name': 'Sienna', 'hex': '#8A4117'},
			{'name': 'Sienna4', 'hex': '#7E3517'},
			{'name': 'Indian Red4', 'hex': '#7E2217'},
			{'name': 'Dark Orange3', 'hex': '#7E3117'},
			{'name': 'Salmon4', 'hex': '#7E3817'},
			{'name': 'Dark Goldenrod4', 'hex': '#7F5217'},
			{'name': 'Gold4', 'hex': '#806517'},
			{'name': 'Goldenrod4', 'hex': '#805817'},
			{'name': 'Light Salmon4', 'hex': '#7F462C'},
			{'name': 'Chocolate', 'hex': '#C85A17'},
			{'name': 'Coral3', 'hex': '#C34A2C'},
			{'name': 'Coral2', 'hex': '#E55B3C'},
			{'name': 'Coral', 'hex': '#F76541'},
			{'name': 'Dark Salmon', 'hex': '#E18B6B'},
			{'name': 'Salmon1', 'hex': '#F88158'},
			{'name': 'Salmon2', 'hex': '#E67451'},
			{'name': 'Salmon3', 'hex': '#C36241'},
			{'name': 'Light Salmon3', 'hex': '#C47451'},
			{'name': 'Light Salmon2', 'hex': '#E78A61'},
			{'name': 'Light Salmon', 'hex': '#F9966B'},
			{'name': 'Sandy Brown', 'hex': '#EE9A4D'},
			{'name': 'Hot Pink', 'hex': '#F660AB'},
			{'name': 'Hot Pink1', 'hex': '#F665AB'},
			{'name': 'Hot Pink2', 'hex': '#E45E9D'},
			{'name': 'Hot Pink3', 'hex': '#C25283'},
			{'name': 'Hot Pink4', 'hex': '#7D2252'},
			{'name': 'Light Coral', 'hex': '#E77471'},
			{'name': 'Indian Red1', 'hex': '#F75D59'},
			{'name': 'Indian Red2', 'hex': '#E55451'},
			{'name': 'Indian Red3', 'hex': '#C24641'},
			{'name': 'Red', 'hex': '#FF0000'},
			{'name': 'Red1', 'hex': '#F62217'},
			{'name': 'Red2', 'hex': '#E41B17'},
			{'name': 'Firebrick1', 'hex': '#F62817'},
			{'name': 'Firebrick2', 'hex': '#E42217'},
			{'name': 'Firebrick3', 'hex': '#C11B17'},
			{'name': 'Pink', 'hex': '#FAAFBE'},
			{'name': 'Rosy Brown1', 'hex': '#FBBBB9'},
			{'name': 'Rosy Brown2', 'hex': '#E8ADAA'},
			{'name': 'Pink2', 'hex': '#E7A1B0'},
			{'name': 'Light Pink', 'hex': '#FAAFBA'},
			{'name': 'Light Pink1', 'hex': '#F9A7B0'},
			{'name': 'Light Pink2', 'hex': '#E799A3'},
			{'name': 'Pink3', 'hex': '#C48793'},
			{'name': 'Rosy Brown3', 'hex': '#C5908E'},
			{'name': 'Rosy Brown', 'hex': '#B38481'},
			{'name': 'Light Pink3', 'hex': '#C48189'},
			{'name': 'Rosy Brown4', 'hex': '#7F5A58'},
			{'name': 'Light Pink4', 'hex': '#7F4E52'},
			{'name': 'Pink4', 'hex': '#7F525D'},
			{'name': 'Lavender Blush4', 'hex': '#817679'},
			{'name': 'Light Goldenrod4', 'hex': '#817339'},
			{'name': 'Lemon Chiffon4', 'hex': '#827B60'},
			{'name': 'Lemon Chiffon3', 'hex': '#C9C299'},
			{'name': 'Light Goldenrod3', 'hex': '#C8B560'},
			{'name': 'Light Golden2', 'hex': '#ECD672'},
			{'name': 'Light Goldenrod', 'hex': '#ECD872'},
			{'name': 'Light Goldenrod1', 'hex': '#FFE87C'},
			{'name': 'Lemon Chiffon2', 'hex': '#ECE5B6'},
			{'name': 'Lemon Chiffon', 'hex': '#FFF8C6'},
			{'name': 'Light Goldenrod Yellow', 'hex': '#FAF8CC'}
		]		
	}
};

