penguin/AstroJS

Javascript framework for my blog

botanjs/src/Astro/Blog/AstroEdit/Flag.js

raw ยท 4898 bytes

(function(){
	var ns = __namespace( "Astro.Blog.AstroEdit" );

	/** @type {System.Debug} */
	var debug                            = __import( "System.Debug" );
	/** @type {typeof Components.MessageBox} */
	var MessageBox                       = __import( "Components.MessageBox" );
	/** @type {typeof Dandelion} */
	var Dand                             = __import( "Dandelion" );
	/** @type {function(...?): Dandelion.IDOMElement} */
	var IDOMElement                      = __import( "Dandelion.IDOMElement" );
	/** @type {Astro.Blog.Config} */
	var Config                           = __import( "Astro.Blog.Config" );

	var postData                         = __import( "System.Net.postData" );

	/* @type {AstroEdit.IPlugins} */
	var Flag = function ( id, target, flagConf )
	{
		this.id = id;
		var stage = Dand.id( target );
		var ae_addFlag = Dand.glass( "ae_flag_add" , true, stage )[0];
		var ae_flags = Dand.glass( "ae_flags" , false, stage )[0];

		// Store flags for future use
		var flags = {};

		////// Handlers
		ae_addFlag.addEventListener(
			"Click", function ( e )
			{
				e.stopPropagation();
				// Input fields
				var ae_flagInput;

				// Popup MessageBox
				new MessageBox(
					"Add new flag(s)"
					, Dand.wrape([
						Dand.wrapc(
							"v_instruction flsf"
							, "Flags are separated by \\n. (existing flags will be ignored.)"
						)
						, ae_flagInput = Dand.wrap( "textarea", null, "v_snippet_input" )
					])
					, "OK", "Cancel"
					, parseFlags.bind( ae_flagInput )
				).show();
			}
		);

		var	deleteFlag = function (e)
		{
			e.stopPropagation();
			var p = { stage: this.parentNode };
			p[ id ] = this.nodeValue;
			p[ "id" ] = id;
			postData( flagConf.URICount, p, confirmDelete.bind( p ), serverFailed );
		};

		var confirmDelete = function (obj)
		{
			new MessageBox(
				"Delete Flag"
				, [
					Dand.wrapc("ae_blockswitch",
						[
							Dand.textNode( "Are you sure you want to delete " )
							, Dand.wrap( "span", null, "flag_active", Dand.textNode( this[ id ] ) )
							, Dand.textNode( " ?." )
						]
					)
					, obj.count > 0
					? Dand.wrape([
						Dand.textNode( "This will affect " )
						, Dand.wrap(
							"span", null, "ae_affected_count", Dand.textNode( obj.count )
						)
						, Dand.textNode(" article(s).")
					])
					: null
				]
				, "Delete", "No"
				, doDelete.bind( this )
			).show();
		};

		var doDelete = function( confirmed )
		{
			if ( confirmed )
			{
				this[ "del" ] = 1;
				postData(
					flagConf.URISet
					, this
					, deleteSuccess.bind( this )
					, serverFailed
				);
			}
		};

		var deleteSuccess = function(obj)
		{
			// Remove element
			this.stage.parentNode.removeChild( this.stage );
			// Delete reference
			delete flags[ this[ id ] ];
		};

		var parseFlags = function ()
		{
			// Filter invalid flags
			var nflags = this.value.trim().match(/[^\n]+/g), d, e;
			for (var i in nflags)
			{
				if(!flags[(i = nflags[i]).toLowerCase()])
				{
					flags[i] = Dand.wrap("span", null, "flag_active",
						[d = Dand.wrap("span", null, "ae_flag_delete", "\u00D7"), e = Dand.textNode(i)]
					);
					// Seperator
					ae_flags.appendChild(Dand.textNode("	"));
					ae_flags.appendChild(flags[i]);

					flags[i].onclick = function() { toggleFlag(this) }.bind(flags[i]);
					d.onclick = deleteFlag.bind(e);

				}
				else
				{
					debug.Info("Flag exist: " + i);
					// Hightlight these flags
					flags[i.toLowerCase()].className = "flag_active";
				}
			}

		};

		var toggleFlag = function (flag)
		{
			var isEnabled = flag.className == "flag_active" ? true : false;
			flag.className = isEnabled ? "ae_disabled" : "flag_active";
		};

		var serverFailed = function (obj) { };

		var cflag, ae_children = ae_flags.childNodes;
		for (var i in ae_children)
		{
			if((cflag = ae_children[i]).nodeType == 1)
			{
				flags[cflag.lastChild.nodeValue.toLowerCase()] = cflag;
				IDOMElement( cflag ).addEventListener( "Click", function() { toggleFlag( this ); }.bind( cflag ) );
				// Bind the last child (x button) to firstChild (textNode: flagname)
				IDOMElement( cflag.firstChild ).addEventListener( "Click", deleteFlag.bind( cflag.lastChild ) );
			}
		}

		this.getData = function ()
		{
			// Compile flag list
			var tlist = [];

			// Return names
			for (var i in flags)
			{
				if(flags[i].className == "flag_active")
					tlist[tlist.length] = flags[i].lastChild.nodeValue;
			}

			return tlist.join("\n");
		}

		this.setForView = function ( flagList )
		{
			// Disable all flags first
			for ( var i in flags ) flags[i].className = "ae_disabled";

			// Set flags from flagList
			for ( i in flagList )
				if ( flagList[i] ) flags[flagList[i].toLowerCase()].className = "flag_active";
		}
	}

	Flag.prototype.getSetData = function () {	};
	Flag.prototype.setForView = function ( flagList ) {	};

	ns[ NS_EXPORT ]( EX_CLASS, "Flag", Flag );

})();