2002-10-11 05:27:28 +04:00
|
|
|
# -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
|
|
# ***** BEGIN LICENSE BLOCK *****
|
|
|
|
# Version: NPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
#
|
|
|
|
# The contents of this file are subject to the Netscape Public License
|
|
|
|
# Version 1.1 (the "License"); you may not use this file except in
|
|
|
|
# compliance with the License. You may obtain a copy of the License at
|
|
|
|
# http://www.mozilla.org/NPL/
|
|
|
|
#
|
|
|
|
# Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
# for the specific language governing rights and limitations under the
|
|
|
|
# License.
|
|
|
|
#
|
|
|
|
# The Original Code is mozilla.org code.
|
|
|
|
#
|
|
|
|
# The Initial Developer of the Original Code is
|
|
|
|
# Netscape Communications Corporation.
|
|
|
|
# Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
# the Initial Developer. All Rights Reserved.
|
|
|
|
#
|
|
|
|
# Contributor(s):
|
|
|
|
#
|
|
|
|
# Alternatively, the contents of this file may be used under the terms of
|
|
|
|
# either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
# in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
# of those above. If you wish to allow use of your version of this file only
|
|
|
|
# under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
# use your version of this file under the terms of the NPL, indicate your
|
|
|
|
# decision by deleting the provisions above and replace them with the notice
|
|
|
|
# and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
# the provisions above, a recipient may use your version of this file under
|
|
|
|
# the terms of any one of the NPL, the GPL or the LGPL.
|
|
|
|
#
|
|
|
|
# ***** END LICENSE BLOCK *****
|
2002-09-13 07:12:27 +04:00
|
|
|
|
|
|
|
// XXX MAKE SURE that the "url" field is LAST!
|
|
|
|
// This is important for what happens if/when the URL itself is changed.
|
|
|
|
// Ask rjc@netscape.com if you want to know why exactly this is.
|
|
|
|
|
|
|
|
// This is the set of fields that are visible in the window.
|
2002-10-14 05:26:08 +04:00
|
|
|
var gFields;
|
2002-09-13 07:12:27 +04:00
|
|
|
|
|
|
|
// ...and this is a parallel array that contains the RDF properties
|
|
|
|
// that they are associated with.
|
2002-10-14 05:26:08 +04:00
|
|
|
var gProperties;
|
2002-09-13 07:12:27 +04:00
|
|
|
|
2002-10-14 05:26:08 +04:00
|
|
|
var Bookmarks;
|
2003-04-21 09:47:02 +04:00
|
|
|
var gBookmarkID;
|
2002-09-13 07:12:27 +04:00
|
|
|
|
|
|
|
function showDescription()
|
|
|
|
{
|
2002-10-14 05:26:08 +04:00
|
|
|
initServices();
|
|
|
|
initBMService();
|
|
|
|
|
2003-04-21 09:47:02 +04:00
|
|
|
gBookmarkID = window.arguments[0];
|
|
|
|
var resource = RDF.GetResource(gBookmarkID);
|
2002-09-13 07:12:27 +04:00
|
|
|
|
|
|
|
// Check the description
|
|
|
|
var primaryType = BookmarksUtils.resolveType(resource);
|
|
|
|
var description = BookmarksUtils.getLocaleString("description_"+primaryType);
|
|
|
|
|
|
|
|
var newBookmarkFolder = BookmarksUtils.getNewBookmarkFolder();
|
|
|
|
var newSearchFolder = BookmarksUtils.getNewSearchFolder();
|
|
|
|
|
|
|
|
if (resource == newBookmarkFolder && resource == newSearchFolder)
|
|
|
|
description = description+" "+BookmarksUtils.getLocaleString("description_NewBookmarkAndSearchFolder")
|
|
|
|
else if (resource == newBookmarkFolder )
|
|
|
|
description = description+" "+BookmarksUtils.getLocaleString("description_NewBookmarkFolder")
|
|
|
|
else if (resource == newSearchFolder)
|
|
|
|
description = description+" "+BookmarksUtils.getLocaleString("description_NewSearchFolder");
|
|
|
|
|
|
|
|
var textNode = document.createTextNode(description);
|
|
|
|
document.getElementById("bookmarkDescription").appendChild(textNode);
|
|
|
|
}
|
|
|
|
|
|
|
|
function Init()
|
|
|
|
{
|
2002-10-14 05:26:08 +04:00
|
|
|
// This is the set of fields that are visible in the window.
|
2003-08-03 01:35:54 +04:00
|
|
|
gFields = ["name", "url", "shortcut", "description", "webpanel"];
|
2002-10-14 05:26:08 +04:00
|
|
|
|
|
|
|
// ...and this is a parallel array that contains the RDF properties
|
|
|
|
// that they are associated with.
|
|
|
|
gProperties = [NC_NS + "Name",
|
2003-04-21 09:47:02 +04:00
|
|
|
NC_NS + "URL",
|
2002-10-14 05:26:08 +04:00
|
|
|
NC_NS + "ShortcutURL",
|
2003-08-03 01:35:54 +04:00
|
|
|
NC_NS + "Description",
|
|
|
|
NC_NS + "WebPanel"];
|
2002-10-14 05:26:08 +04:00
|
|
|
|
|
|
|
Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
|
|
|
|
2002-09-13 07:12:27 +04:00
|
|
|
var x;
|
2003-04-21 09:47:02 +04:00
|
|
|
var resource = RDF.GetResource(gBookmarkID);
|
2002-09-13 07:12:27 +04:00
|
|
|
// Initialize the properties panel by copying the values from the
|
|
|
|
// RDF graph into the fields on screen.
|
|
|
|
|
|
|
|
for (var i = 0; i < gFields.length; ++i) {
|
|
|
|
var field = document.getElementById(gFields[i]);
|
|
|
|
var value = Bookmarks.GetTarget(resource, RDF.GetResource(gProperties[i]), true);
|
2003-08-03 01:35:54 +04:00
|
|
|
|
2002-09-13 07:12:27 +04:00
|
|
|
if (value)
|
|
|
|
value = value.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
|
|
|
|
2003-08-03 01:35:54 +04:00
|
|
|
if (gFields[i] == "webpanel")
|
|
|
|
field.checked = (value != undefined);
|
|
|
|
else if (value) //make sure were aren't stuffing null into any fields
|
2002-09-13 07:12:27 +04:00
|
|
|
field.value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
var propsWindow = document.getElementById("bmPropsWindow");
|
|
|
|
var nameNode = document.getElementById("name");
|
|
|
|
var title = propsWindow.getAttribute("title");
|
|
|
|
title = title.replace(/\*\*bm_title\*\*/gi, nameNode.value);
|
|
|
|
propsWindow.setAttribute("title", title);
|
|
|
|
|
|
|
|
// check bookmark schedule
|
|
|
|
var scheduleArc = RDF.GetResource("http://home.netscape.com/WEB-rdf#Schedule");
|
|
|
|
value = Bookmarks.GetTarget(resource, scheduleArc, true);
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
value = value.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
var values = value.split("|");
|
|
|
|
if (values.length == 4) {
|
|
|
|
// get day range
|
|
|
|
var days = values[0];
|
|
|
|
var dayNode = document.getElementById("dayRange");
|
|
|
|
var dayItems = dayNode.childNodes[0].childNodes;
|
|
|
|
for (x=0; x < dayItems.length; ++x) {
|
|
|
|
if (dayItems[x].getAttribute("value") == days) {
|
|
|
|
dayNode.selectedItem = dayItems[x];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// get hour range
|
|
|
|
var hours = values[1].split("-");
|
|
|
|
var startHour = "";
|
|
|
|
var endHour = "";
|
|
|
|
|
|
|
|
if (hours.length == 2) {
|
|
|
|
startHour = hours[0];
|
|
|
|
endHour = hours[1];
|
|
|
|
}
|
|
|
|
|
|
|
|
// set start hour
|
|
|
|
var startHourNode = document.getElementById("startHourRange");
|
|
|
|
var startHourItems = startHourNode.childNodes[0].childNodes;
|
|
|
|
for (x=0; x < startHourItems.length; ++x) {
|
|
|
|
if (startHourItems[x].getAttribute("value") == startHour) {
|
|
|
|
startHourNode.selectedItem = startHourItems[x];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// set end hour
|
|
|
|
var endHourNode = document.getElementById("endHourRange");
|
|
|
|
var endHourItems = endHourNode.childNodes[0].childNodes;
|
|
|
|
for (x=0; x < endHourItems.length; ++x) {
|
|
|
|
if (endHourItems[x].getAttribute("value") == endHour) {
|
|
|
|
endHourNode.selectedItem = endHourItems[x];
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// get duration
|
|
|
|
var duration = values[2];
|
|
|
|
var durationNode = document.getElementById("duration");
|
|
|
|
durationNode.value = duration;
|
|
|
|
|
|
|
|
// get notification method
|
|
|
|
var method = values[3];
|
|
|
|
if (method.indexOf("icon") >= 0)
|
|
|
|
document.getElementById("bookmarkIcon").checked = true;
|
|
|
|
|
|
|
|
if (method.indexOf("sound") >= 0)
|
|
|
|
document.getElementById("playSound").checked = true;
|
|
|
|
|
|
|
|
if (method.indexOf("alert") >= 0)
|
|
|
|
document.getElementById("showAlert").checked = true;
|
|
|
|
|
|
|
|
if (method.indexOf("open") >= 0)
|
|
|
|
document.getElementById("openWindow").checked = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if its a container, disable some things
|
2003-04-21 09:47:02 +04:00
|
|
|
var isContainerFlag = RDFCU.IsContainer(Bookmarks, resource);
|
2002-09-13 07:12:27 +04:00
|
|
|
if (!isContainerFlag) {
|
|
|
|
// XXX To do: the "RDFCU.IsContainer" call above only works for RDF sequences;
|
|
|
|
// if its not a RDF sequence, we should to more checking to see if
|
|
|
|
// the item in question is really a container of not. A good example
|
|
|
|
// of this is the "File System" container.
|
|
|
|
}
|
|
|
|
|
2003-04-21 09:47:02 +04:00
|
|
|
var isSeparator = BookmarksUtils.resolveType(resource) == "BookmarkSeparator";
|
|
|
|
|
|
|
|
if (isContainerFlag || isSeparator) {
|
2003-08-06 06:58:52 +04:00
|
|
|
// Hide the "Load in sidebar" checkbox unless it's a bookmark.
|
|
|
|
var webpanelCheckbox = document.getElementById("webpanel");
|
|
|
|
webpanelCheckbox.hidden = true;
|
|
|
|
|
2002-09-13 07:12:27 +04:00
|
|
|
// If it is a folder, it has no URL or Keyword
|
|
|
|
document.getElementById("locationrow").setAttribute("hidden", "true");
|
|
|
|
document.getElementById("shortcutrow").setAttribute("hidden", "true");
|
2003-04-21 09:47:02 +04:00
|
|
|
if (isSeparator) {
|
|
|
|
document.getElementById("descriptionrow").setAttribute("hidden", "true");
|
|
|
|
}
|
2002-09-13 07:12:27 +04:00
|
|
|
}
|
|
|
|
|
2003-04-21 09:47:02 +04:00
|
|
|
var showScheduling = false;
|
|
|
|
var url = Bookmarks.GetTarget(resource, RDF.GetResource(gProperties[1]), true);
|
|
|
|
if (url) {
|
|
|
|
url = url.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
|
|
|
|
if (url.substr(0, 7).toLowerCase() == "http://" ||
|
|
|
|
url.substr(0, 8).toLowerCase() == "https://") {
|
|
|
|
showScheduling = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!showScheduling) {
|
2002-09-13 07:12:27 +04:00
|
|
|
// only allow scheduling of http/https URLs
|
|
|
|
document.getElementById("ScheduleTab").setAttribute("hidden", "true");
|
|
|
|
document.getElementById("NotifyTab").setAttribute("hidden", "true");
|
|
|
|
}
|
|
|
|
|
|
|
|
sizeToContent();
|
|
|
|
|
|
|
|
// Set up the enabled of controls on the scheduling panels
|
|
|
|
dayRangeChange(document.getElementById("dayRange"));
|
|
|
|
|
|
|
|
// set initial focus
|
|
|
|
nameNode.focus();
|
|
|
|
nameNode.select();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function Commit()
|
|
|
|
{
|
|
|
|
var changed = false;
|
|
|
|
|
|
|
|
// Grovel through the fields to see if any of the values have
|
|
|
|
// changed. If so, update the RDF graph and force them to be saved
|
|
|
|
// to disk.
|
|
|
|
for (var i = 0; i < gFields.length; ++i) {
|
|
|
|
var field = document.getElementById(gFields[i]);
|
|
|
|
|
|
|
|
if (field) {
|
|
|
|
// Get the new value as a literal, using 'null' if the value is empty.
|
|
|
|
var newvalue = field.value;
|
2003-08-03 01:35:54 +04:00
|
|
|
if (gFields[i] == "webpanel")
|
|
|
|
newvalue = field.checked ? "true" : undefined;
|
|
|
|
|
2003-04-21 09:47:02 +04:00
|
|
|
var oldvalue = Bookmarks.GetTarget(RDF.GetResource(gBookmarkID),
|
2002-09-13 07:12:27 +04:00
|
|
|
RDF.GetResource(gProperties[i]),
|
|
|
|
true);
|
|
|
|
|
|
|
|
if (oldvalue)
|
|
|
|
oldvalue = oldvalue.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
|
|
|
|
|
|
if (newvalue && gProperties[i] == (NC_NS + "ShortcutURL")) {
|
|
|
|
// shortcuts are always lowercased internally
|
|
|
|
newvalue = newvalue.toLowerCase();
|
|
|
|
}
|
|
|
|
else if (newvalue && gProperties[i] == (NC_NS + "URL")) {
|
|
|
|
// we're dealing with the URL attribute;
|
|
|
|
// if a scheme isn't specified, use "http://"
|
|
|
|
if (newvalue.indexOf(":") < 0)
|
|
|
|
newvalue = "http://" + newvalue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newvalue)
|
|
|
|
newvalue = RDF.GetLiteral(newvalue);
|
|
|
|
|
|
|
|
if (updateAttribute(gProperties[i], oldvalue, newvalue)) {
|
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Update bookmark schedule if necessary;
|
|
|
|
// if the tab was removed, just skip it
|
|
|
|
var scheduleTab = document.getElementById("ScheduleTab");
|
|
|
|
if (scheduleTab) {
|
|
|
|
var scheduleRes = "http://home.netscape.com/WEB-rdf#Schedule";
|
2003-04-21 09:47:02 +04:00
|
|
|
oldvalue = Bookmarks.GetTarget(RDF.GetResource(gBookmarkID),
|
2002-09-13 07:12:27 +04:00
|
|
|
RDF.GetResource(scheduleRes), true);
|
|
|
|
newvalue = "";
|
|
|
|
var dayRangeNode = document.getElementById("dayRange");
|
|
|
|
var dayRange = dayRangeNode.selectedItem.getAttribute("value");
|
|
|
|
|
|
|
|
if (dayRange) {
|
|
|
|
var startHourRangeNode = document.getElementById("startHourRange");
|
|
|
|
var startHourRange = startHourRangeNode.selectedItem.getAttribute("value");
|
|
|
|
|
|
|
|
var endHourRangeNode = document.getElementById("endHourRange");
|
|
|
|
var endHourRange = endHourRangeNode.selectedItem.getAttribute("value");
|
|
|
|
|
|
|
|
if (parseInt(startHourRange) > parseInt(endHourRange)) {
|
|
|
|
var temp = startHourRange;
|
|
|
|
startHourRange = endHourRange;
|
|
|
|
endHourRange = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
var duration = document.getElementById("duration").value;
|
|
|
|
if (!duration) {
|
|
|
|
alert(BookmarksUtils.getLocaleString("pleaseEnterADuration"));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
var methods = [];
|
|
|
|
if (document.getElementById("bookmarkIcon").checked)
|
|
|
|
methods.push("icon");
|
|
|
|
if (document.getElementById("playSound").checked)
|
|
|
|
methods.push("sound");
|
|
|
|
if (document.getElementById("showAlert").checked)
|
|
|
|
methods.push("alert");
|
|
|
|
if (document.getElementById("openWindow").checked)
|
|
|
|
methods.push("open");
|
|
|
|
|
|
|
|
if (methods.length == 0) {
|
|
|
|
alert(BookmarksUtils.getLocaleString("pleaseSelectANotification"));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
var method = methods.join(); // join string in array with ","
|
|
|
|
|
|
|
|
newvalue = dayRange + "|" + startHourRange + "-" + endHourRange + "|" + duration + "|" + method;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newvalue)
|
|
|
|
newvalue = RDF.GetLiteral(newvalue);
|
|
|
|
|
|
|
|
if (updateAttribute(scheduleRes, oldvalue, newvalue))
|
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (changed) {
|
|
|
|
var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
|
|
|
if (remote)
|
|
|
|
remote.Flush();
|
|
|
|
}
|
|
|
|
|
|
|
|
window.close();
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateAttribute(prop, oldvalue, newvalue)
|
|
|
|
{
|
|
|
|
var changed = false;
|
|
|
|
|
|
|
|
if (prop && (oldvalue || newvalue) && oldvalue != newvalue) {
|
|
|
|
if (oldvalue && !newvalue) {
|
2003-04-21 09:47:02 +04:00
|
|
|
Bookmarks.Unassert(RDF.GetResource(gBookmarkID),
|
2002-09-13 07:12:27 +04:00
|
|
|
RDF.GetResource(prop),
|
|
|
|
oldvalue);
|
|
|
|
}
|
|
|
|
else if (!oldvalue && newvalue) {
|
2003-04-21 09:47:02 +04:00
|
|
|
Bookmarks.Assert(RDF.GetResource(gBookmarkID),
|
2002-09-13 07:12:27 +04:00
|
|
|
RDF.GetResource(prop),
|
|
|
|
newvalue,
|
|
|
|
true);
|
|
|
|
}
|
|
|
|
else /* if (oldvalue && newvalue) */ {
|
2003-04-21 09:47:02 +04:00
|
|
|
Bookmarks.Change(RDF.GetResource(gBookmarkID),
|
2002-09-13 07:12:27 +04:00
|
|
|
RDF.GetResource(prop),
|
|
|
|
oldvalue,
|
|
|
|
newvalue);
|
|
|
|
}
|
|
|
|
|
|
|
|
changed = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return changed;
|
|
|
|
}
|
|
|
|
|
|
|
|
function setEndHourRange()
|
|
|
|
{
|
|
|
|
// Get the values of the start-time and end-time as ints
|
|
|
|
var startHourRangeNode = document.getElementById("startHourRange");
|
|
|
|
var startHourRange = startHourRangeNode.selectedItem.getAttribute("value");
|
|
|
|
var startHourRangeInt = parseInt(startHourRange);
|
|
|
|
|
|
|
|
var endHourRangeNode = document.getElementById("endHourRange");
|
|
|
|
var endHourRange = endHourRangeNode.selectedItem.getAttribute("value");
|
|
|
|
var endHourRangeInt = parseInt(endHourRange);
|
|
|
|
|
|
|
|
var endHourItemNode = endHourRangeNode.firstChild.firstChild;
|
|
|
|
|
|
|
|
var index = 0;
|
|
|
|
|
|
|
|
// disable all those end-times before the start-time
|
|
|
|
for (; index < startHourRangeInt; ++index) {
|
|
|
|
endHourItemNode.setAttribute("disabled", "true");
|
|
|
|
endHourItemNode = endHourItemNode.nextSibling;
|
|
|
|
}
|
|
|
|
|
|
|
|
// update the selected value if it's out of the allowed range
|
|
|
|
if (startHourRangeInt >= endHourRangeInt)
|
|
|
|
endHourRangeNode.selectedItem = endHourItemNode;
|
|
|
|
|
|
|
|
// make sure all the end-times after the start-time are enabled
|
|
|
|
for (; index < 24; ++index) {
|
|
|
|
endHourItemNode.removeAttribute("disabled");
|
|
|
|
endHourItemNode = endHourItemNode.nextSibling;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function dayRangeChange (aMenuList)
|
|
|
|
{
|
|
|
|
var controls = ["startHourRange", "endHourRange", "duration", "bookmarkIcon",
|
|
|
|
"showAlert", "openWindow", "playSound", "durationSubLabel",
|
|
|
|
"durationLabel", "startHourRangeLabel", "endHourRangeLabel"];
|
|
|
|
for (var i = 0; i < controls.length; ++i)
|
|
|
|
document.getElementById(controls[i]).disabled = !aMenuList.value;
|
|
|
|
}
|
|
|
|
|
|
|
|
|