Monday, November 08, 2010 at 12:01 AM.

on save (adr, flClosing=false) {
	<<Save a Manila site outline.
		<<10/12/00; 5:01:23 PM by PBS
		<<12/31/00; 5:16:27 PM by JES
			<<On Macs, convert opml text to Latin text before sending to the server.
	local (atts);
	if not window.attributes.getAll (@atts) { //return false if no atts
		return (false)};
	if atts.flReadOnly { //can't be saved -- return true
		return (true)};
	try { //if tcp.isOffline, show a dialog, and then return false
		if tcp.isOffline () {
			dialog.alert ("Can't save " + atts.title + " because you are working offline.");
			return (false)}};
	<<Send the Manila site outline to the Manila server.
	local (adrinfo = atts.adrSiteInfo);
	local (username, password);
	if manila.windowTypes.getUsernameAndPassword (adrinfo, @username, @password) {
		manila.windowTypes.setUsernameAndPassword (adrinfo, username, password)}
	else { //the user cancelled the password dialog -- return false
		return (false)};
	local (siteInfoTable = adrinfo^);
	siteInfoTable.username = username;
	siteInfoTable.password = password;
	local (opmlText = op.outlineToXml (adr, ownerEmail:username));
	if system.environment.isMac {
		opmlText = string.macToLatin (opmlText)};
	loop { //loop until the user enters a valid username and password
		try {
			manila.editorialOutline.set (@siteInfoTable, opmlText);
			break} //it's saved -- break out of the loop
		else {
			local (errorString = tryError);
			if errorString contains "returned error code 4:" {
				local (ix = string.patternMatch (": ", errorString) + 2);
				errorString = string.mid (errorString, ix, infinity)};
			window.attributes.setOne ("savingError", tryError, adr);
			if not dialog.yesNo (errorString + " Try again?") {
				msg (""); //clear the About window
				return (false)};
			local (lowerError = string.lower (tryError));
			if (lowerError contains "password") or (lowerError contains "not a member") { //clear the password
				if manila.windowTypes.getUsernameAndPassword (adrinfo, @username, @password, true) {
					manila.windowTypes.setUsernameAndPassword (adrinfo, username, password);
					siteInfoTable.username = username;
					siteInfoTable.password = password}
				else { //the user cancelled the password dialog
					return (false)}}}};
	window.attributes.setOne ("lastSaved", timeModified (adr), adr);
	<<if flClosing //also check it in if the app is shutting down
		<<//this is done by the close script, so we don't need to do it here.
		<<manila.editorialOutline.checkIn (@siteInfoTable)
	return (true);
	<<bundle //original code
		<<local (adrTable = parentOf (adrItem^))
		<<if adrTable^.flReadOnly //can't be saved
			<<return (true)
		<<Send the Manila site outline to the Manila server.
		<<local (username, password)
		<<local (siteUrl = adrTable^.siteUrl)
		<<if not (playlist.manila.getUsernameAndPassword (siteUrl, @username, @password))
			<<return (true)
		<<local (opmlText = op.outlineToXml (adrItem, ownerEmail:username))
		<<playlist.manila.convertToLatin (@opmlText) //12/31/00 JES
			<<playlist.manila.rpc.saveManilaSiteOutline (siteUrl, username, password, opmlText)
			<<playlist.notifyDialog (tryError)
			<<scriptError (tryError)
		<<adrTable^.flSaved = true
		<<adrTable^.lastSave = ()
		<<if flClosing //also check it in if the app is shutting down
			<<playlist.manila.rpc.checkInManilaSiteOutline (siteUrl, username, password)
		<<return (true)

bundle { //debugging
	save (window.frontmost ())}

This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.