1 package net.systemeD.potlatch2.mapfeatures {
3 import flash.events.EventDispatcher;
4 import flash.events.Event;
5 import net.systemeD.halcyon.connection.Entity;
7 public class Feature extends EventDispatcher {
8 private var mapFeatures:MapFeatures;
10 private static var variablesPattern:RegExp = /[$][{]([^}]+)[}]/g;
11 private var _tags:Array;
12 private var _editors:Array;
14 public function Feature(mapFeatures:MapFeatures, _xml:XML) {
15 this.mapFeatures = mapFeatures;
21 private function parseTags():void {
24 for each(var tag:XML in definition.tag) {
25 var tagObj:Object = new Object();
32 private function parseEditors():void {
33 _editors = new Array();
35 addEditors(definition);
37 _editors.sortOn(["sortOrder", "name"], [Array.DESCENDING | Array.NUMERIC, Array.CASEINSENSITIVE]);
40 private function addEditors(xml:XML):void {
43 for each(var inputSetRef:XML in xml.inputSet) {
44 var setName:String = String(inputSetRef.@ref);
45 for each (inputXML in mapFeatures.definition.inputSet.(@id==setName)) {
50 for each(inputXML in xml.input) {
55 private function addEditor(inputXML:XML):void {
56 var inputType:String = inputXML.@type;
57 var presenceStr:String = inputXML.@presence;
58 var sortOrderStr:String = inputXML.@priority;
59 var editor:EditorFactory = EditorFactory.createFactory(inputType, inputXML);
60 if ( editor != null ) {
61 editor.presence = Presence.getPresence(presenceStr);
62 editor.sortOrder = EditorFactory.getPriority(sortOrderStr);
63 _editors.push(editor);
67 public function get editors():Array {
71 public function get definition():XML {
75 [Bindable(event="nameChanged")]
76 public function get name():String {
80 [Bindable(event="imageChanged")]
81 public function get image():String {
82 var icon:XMLList = _xml.icon;
84 if ( icon.length() > 0 && icon[0].hasOwnProperty("@image") )
85 return icon[0].@image;
90 public function htmlDetails(entity:Entity):String {
91 var icon:XMLList = _xml.icon;
92 return makeHTMLIcon(icon, entity);
95 public static function makeHTMLIcon(icon:XMLList, entity:Entity):String {
99 var txt:String = icon.children().toXMLString();
100 var replaceTag:Function = function():String {
101 var value:String = entity.getTag(arguments[1]);
102 return value == null ? "" : htmlEscape(value);
104 txt = txt.replace(variablesPattern, replaceTag);
108 public static function htmlEscape(str:String):String {
109 var newStr:String = str.replace(/&/g, "&");
110 newStr = newStr.replace(/</g, "<");
111 newStr = newStr.replace(/>/g, ">");
112 newStr = newStr.replace(/"/g, """);
113 newStr = newStr.replace(/'/g, "'");
118 public function isInCategory(category:String):Boolean {
119 var cats:XMLList = _xml.category;
120 if ( cats.length() == 0 )
123 for each( var cat:XML in cats )
124 if ( cat.text()[0] == category )
129 public function get tags():Array {
133 public function findFirstCategory():Category {
134 for each( var cat:Category in mapFeatures.categories ) {
135 if ( isInCategory(cat.id) )
141 public function isType(type:String):Boolean {
142 return _xml.elements(type).length() > 0;