mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-05 08:35:26 +00:00
432 lines
12 KiB
JavaScript
432 lines
12 KiB
JavaScript
/* -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* 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 Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
|
|
var NC_NAMESPACE_URI = "http://home.netscape.com/NC-rdf#";
|
|
|
|
// 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.
|
|
var Fields = ["name", "shortcut", "description", "url"];
|
|
|
|
// ...and this is a parallel array that contains the RDF properties
|
|
// that they are associated with.
|
|
var Properties = [NC_NAMESPACE_URI + "Name",
|
|
NC_NAMESPACE_URI + "ShortcutURL",
|
|
NC_NAMESPACE_URI + "Description",
|
|
NC_NAMESPACE_URI + "URL"];
|
|
|
|
var RDF = Components.classes["component://netscape/rdf/rdf-service"].getService();
|
|
RDF = RDF.QueryInterface(Components.interfaces.nsIRDFService);
|
|
|
|
var RDFC = Components.classes["component://netscape/rdf/container-utils"].getService();
|
|
RDFC = RDFC.QueryInterface(Components.interfaces.nsIRDFContainerUtils);
|
|
|
|
var Bookmarks = RDF.GetDataSource("rdf:bookmarks");
|
|
|
|
// Init() will fill this in.
|
|
var bookmark_url = '';
|
|
|
|
|
|
|
|
function Init()
|
|
{
|
|
bookmark_url = window.arguments[0];
|
|
|
|
// set up action buttons
|
|
doSetOKCancel(Commit, Cancel);
|
|
|
|
// Initialize the properties panel by copying the values from the
|
|
// RDF graph into the fields on screen.
|
|
|
|
for (var i = 0; i < Fields.length; ++i) {
|
|
var field = document.getElementById(Fields[i]);
|
|
|
|
var value = Bookmarks.GetTarget(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(Properties[i]),
|
|
true);
|
|
|
|
if (value) value = value.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
if (value) value = value.Value;
|
|
|
|
dump("field '" + Fields[i] + "' <== '" + value + "'\n");
|
|
|
|
if (value) field.value = value;
|
|
}
|
|
|
|
/*
|
|
// try and set window title
|
|
var nameNode = document.getElementById("name");
|
|
if (nameNode)
|
|
{
|
|
var name = nameNode.value;
|
|
if (name && name != "")
|
|
{
|
|
dump("\n Set window name to '" + name + "'\n");
|
|
window.title = name;
|
|
}
|
|
}
|
|
*/
|
|
|
|
// check bookmark schedule
|
|
var value = Bookmarks.GetTarget(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource("http://home.netscape.com/WEB-rdf#Schedule"),
|
|
true);
|
|
|
|
if (value) value = value.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
if (value) value = value.Value;
|
|
if ((value) && (value != ""))
|
|
{
|
|
var sep;
|
|
|
|
// get day range
|
|
if ((sep = value.indexOf("|")) > 0)
|
|
{
|
|
var days = value.substr(0, sep);
|
|
value = value.substr(sep+1, value.length-1);
|
|
|
|
var dayNode = document.getElementById("dayRange");
|
|
for (var x=0; x < dayNode.childNodes[0].childNodes.length; x++)
|
|
{
|
|
if (dayNode.childNodes[0].childNodes[x].getAttribute("data") == days)
|
|
{
|
|
dayNode.selectedItem = dayNode.childNodes[0].childNodes[x];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// get hour range
|
|
if ((sep = value.indexOf("|")) > 0)
|
|
{
|
|
var hours = value.substr(0, sep);
|
|
value = value.substr(sep+1, value.length-1);
|
|
|
|
var startHour = "";
|
|
var endHour = "";
|
|
|
|
var dashSep = hours.indexOf("-");
|
|
if (dashSep > 0)
|
|
{
|
|
startHour = hours.substr(0, dashSep);
|
|
endHour = hours.substr(dashSep + 1, hours.length-1);
|
|
}
|
|
|
|
// set start hour
|
|
var startHourNode = document.getElementById("startHourRange");
|
|
for (var x=0; x < startHourNode.childNodes[0].childNodes.length; x++)
|
|
{
|
|
if (startHourNode.childNodes[0].childNodes[x].getAttribute("data") == startHour)
|
|
{
|
|
startHourNode.selectedItem = startHourNode.childNodes[0].childNodes[x];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// set end hour
|
|
var endHourNode = document.getElementById("endHourRange");
|
|
for (var x=0; x < endHourNode.childNodes[0].childNodes.length; x++)
|
|
{
|
|
if (endHourNode.childNodes[0].childNodes[x].getAttribute("data") == endHour)
|
|
{
|
|
endHourNode.selectedItem = endHourNode.childNodes[0].childNodes[x];
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// get duration
|
|
if ((sep = value.indexOf("|")) > 0)
|
|
{
|
|
var duration = value.substr(0, sep);
|
|
value = value.substr(sep+1, value.length-1);
|
|
|
|
var durationNode = document.getElementById("duration");
|
|
durationNode.value = duration;
|
|
}
|
|
|
|
// get notification method
|
|
if (value.indexOf("icon") >= 0)
|
|
{
|
|
document.getElementById("bookmarkIcon").checked = true;
|
|
}
|
|
if (value.indexOf("sound") >= 0)
|
|
{
|
|
document.getElementById("playSound").checked = true;
|
|
}
|
|
if (value.indexOf("alert") >= 0)
|
|
{
|
|
document.getElementById("showAlert").checked = true;
|
|
}
|
|
if (value.indexOf("open") >= 0)
|
|
{
|
|
document.getElementById("openWindow").checked = true;
|
|
}
|
|
}
|
|
|
|
// if its a container, disable some things
|
|
var isContainerFlag = RDFC.IsContainer(Bookmarks, RDF.GetResource(bookmark_url));
|
|
if (!isContainerFlag)
|
|
{
|
|
// XXX To do: the "RDFC.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.
|
|
}
|
|
|
|
if (isContainerFlag)
|
|
{
|
|
// If it is a folder, it has no URL.
|
|
var locationBox = document.getElementById("locationBox");
|
|
if (locationBox)
|
|
{
|
|
dump("Hide location box\n");
|
|
var parentNode = locationBox.parentNode;
|
|
parentNode.removeChild(locationBox);
|
|
}
|
|
|
|
// If it is a folder, it has no Shortcut URL.
|
|
var shortcutBox = document.getElementById("shortcutBox");
|
|
if (shortcutBox)
|
|
{
|
|
dump("Hide shortcut box\n");
|
|
var parentNode = shortcutBox.parentNode;
|
|
parentNode.removeChild(shortcutBox);
|
|
}
|
|
}
|
|
|
|
if ((bookmark_url.indexOf("http://") != 0) && (bookmark_url.indexOf("https://") != 0))
|
|
{
|
|
// only allow scheduling of http/https URLs
|
|
var scheduleTab = document.getElementById("ScheduleTab");
|
|
if (scheduleTab)
|
|
{
|
|
dump("Hide schedule tab\n");
|
|
var parentNode = scheduleTab.parentNode;
|
|
parentNode.removeChild(scheduleTab);
|
|
}
|
|
}
|
|
|
|
window.sizeToContent();
|
|
|
|
// set initial focus
|
|
var nameNode = document.getElementById("name");
|
|
if (nameNode)
|
|
{
|
|
nameNode.focus();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
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 < Fields.length; ++i)
|
|
{
|
|
var field = document.getElementById(Fields[i]);
|
|
// if the field was removed, just skip it
|
|
if (!field) continue;
|
|
|
|
// Get the new value as a literal, using 'null' if the value is
|
|
// empty.
|
|
var newvalue = field.value;
|
|
dump("field value = " + newvalue + "\n");
|
|
|
|
// if the field was removed, just skip it
|
|
if (!Properties[i]) continue;
|
|
|
|
var oldvalue = Bookmarks.GetTarget(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(Properties[i]),
|
|
true);
|
|
|
|
if (oldvalue) oldvalue = oldvalue.QueryInterface(Components.interfaces.nsIRDFLiteral);
|
|
|
|
if ((newvalue) && (Properties[i] == (NC_NAMESPACE_URI + "ShortcutURL")))
|
|
{
|
|
// shortcuts are always lowercased internally
|
|
newvalue = newvalue.toLowerCase();
|
|
}
|
|
else if ((newvalue) && (Properties[i] == (NC_NAMESPACE_URI + "URL")))
|
|
{
|
|
// we're dealing with the URL attribute;
|
|
// if a scheme isn't specified, use "http://"
|
|
if (newvalue.indexOf(":") < 0)
|
|
{
|
|
dump("Setting default URL scheme to HTTP.\n");
|
|
newvalue = "http://" + newvalue;
|
|
}
|
|
}
|
|
|
|
if (updateAttribute(Properties[i], oldvalue, newvalue) == true)
|
|
{
|
|
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";
|
|
var oldvalue = Bookmarks.GetTarget(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(scheduleRes), true);
|
|
var newvalue = "";
|
|
|
|
var dayRange = "";
|
|
var dayRangeNode = document.getElementById("dayRange");
|
|
if (dayRangeNode)
|
|
{
|
|
dayRange = dayRangeNode.selectedItem.getAttribute("data");
|
|
}
|
|
if (dayRange != "")
|
|
{
|
|
var startHourRange = "";
|
|
var startHourRangeNode = document.getElementById("startHourRange");
|
|
if (startHourRangeNode)
|
|
{
|
|
startHourRange = startHourRangeNode.selectedItem.getAttribute("data");
|
|
}
|
|
var endHourRange = "";
|
|
var endHourRangeNode = document.getElementById("endHourRange");
|
|
if (endHourRangeNode)
|
|
{
|
|
endHourRange = endHourRangeNode.selectedItem.getAttribute("data");
|
|
}
|
|
|
|
if (startHourRange > endHourRange)
|
|
{
|
|
var temp = startHourRange;
|
|
startHourRange = endHourRange;
|
|
endHourRange = temp;
|
|
}
|
|
|
|
var duration = document.getElementById("duration").value;
|
|
if (duration == "")
|
|
{
|
|
var bundle = srGetStrBundle("chrome://communicator/locale/bookmarks/bookmark.properties");
|
|
alert( bundle.GetStringFromName("pleaseEnterADuration") );
|
|
return(false);
|
|
}
|
|
|
|
var method = "";
|
|
if (document.getElementById("bookmarkIcon").checked) method += ",icon";
|
|
if (document.getElementById("playSound").checked) method += ",sound";
|
|
if (document.getElementById("showAlert").checked) method += ",alert";
|
|
if (document.getElementById("openWindow").checked) method += ",open";
|
|
if (method.length < 1)
|
|
{
|
|
var bundle = srGetStrBundle("chrome://communicator/locale/bookmarks/bookmark.properties");
|
|
alert( bundle.GetStringFromName("pleaseSelectANotification") );
|
|
return(false);
|
|
}
|
|
method = method.substr(1, method.length - 1); // trim off the initial comma
|
|
|
|
dump("dayRange: " + dayRange + "\n");
|
|
dump("startHourRange: " + startHourRange + "\n");
|
|
dump("endHourRange: " + endHourRange + "\n");
|
|
dump("duration: " + duration + "\n");
|
|
dump("method: " + method + "\n");
|
|
|
|
newvalue = dayRange + "|" + startHourRange + "-" + endHourRange + "|" + duration + "|" + method;
|
|
}
|
|
}
|
|
|
|
if (updateAttribute(scheduleRes, oldvalue, newvalue) == true)
|
|
{
|
|
changed = true;
|
|
}
|
|
|
|
if (changed == true)
|
|
{
|
|
dump("re-writing bookmarks.html\n");
|
|
var remote = Bookmarks.QueryInterface(Components.interfaces.nsIRDFRemoteDataSource);
|
|
if (remote)
|
|
{
|
|
remote.Flush();
|
|
}
|
|
}
|
|
|
|
window.close();
|
|
}
|
|
|
|
|
|
|
|
function updateAttribute(prop, oldvalue, newvalue)
|
|
{
|
|
var changed = false;
|
|
|
|
if (!prop) return(changed)
|
|
|
|
newvalue = (newvalue != '') ? RDF.GetLiteral(newvalue) : null;
|
|
|
|
if (oldvalue != newvalue)
|
|
{
|
|
dump("replacing value for " + prop + "\n");
|
|
dump(" oldvalue = " + oldvalue + "\n");
|
|
dump(" newvalue = " + newvalue + "\n");
|
|
|
|
if (oldvalue && !newvalue) {
|
|
Bookmarks.Unassert(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(prop),
|
|
oldvalue);
|
|
}
|
|
else if (!oldvalue && newvalue) {
|
|
Bookmarks.Assert(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(prop),
|
|
newvalue,
|
|
true);
|
|
}
|
|
else if (oldvalue && newvalue) {
|
|
Bookmarks.Change(RDF.GetResource(bookmark_url),
|
|
RDF.GetResource(prop),
|
|
oldvalue,
|
|
newvalue);
|
|
}
|
|
|
|
changed = true;
|
|
}
|
|
return(changed);
|
|
}
|
|
|
|
|
|
|
|
function Cancel()
|
|
{
|
|
// Ignore any changes.
|
|
window.close();
|
|
}
|
|
|
|
|
|
|
|
function switchTab( aPageIndex )
|
|
{
|
|
var deck = document.getElementById( "Deck" );
|
|
if (deck) deck.setAttribute( "index", aPageIndex );
|
|
}
|