AstroJS/botanjs/src/Astro/Blog/AstroEdit/Flag.js
2015-09-28 03:26:22 +08:00

191 lines
4.8 KiB
JavaScript

(function(){
var ns = __namespace( "Astro.Blog.AstroEdit" );
/** @type {System.Debug} */
var debug = __import( "System.Debug" );
/** @type {Components.MessageBox} */
var MessageBox = __import( "Components.MessageBox" );
/** @type {Dandelion} */
var Dand = __import( "Dandelion" );
/** @type {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 );
})();