--------------------------------------------------------------------------------
--
--      
--        Licensed to the Apache Software Foundation (ASF) under one or more
--        contributor license agreements.  See the NOTICE file distributed with
--        this work for additional information regarding copyright ownership.
--        The ASF licenses this file to You under the Apache License, Version 2.0
--        (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.apache.org/licenses/LICENSE-2.0
--      
--        Unless required by applicable law or agreed to in writing, software
--        distributed under the License is distributed on an "AS IS" BASIS,
--        WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
--        See the License for the specific language governing permissions and
--        limitations under the License.
--
--------------------------------------------------------------------------------

-- tell Camino browser to close all windows that have the specified URL
tell application "Camino"
	-- 'closed' keeps track of whether we have closed any documents
	set closed to false

	set done to false
	repeat until done
		set done to true

		-- Camino has some hidden windows that are not regular browser
		-- windows.  Those windows don't have a URL.  We keep count of
		-- how many windows do have a URL.
		set countOfWindowsWithURL to 0

		repeat with win in windows
			if URL of win exists then
				if URL of win is item 1 of argv then
					close win
					set closed to true

					-- since we have closed a document, we must restart the loop
					set done to false
					exit repeat
				else
					set countOfWindowsWithURL to countOfWindowsWithURL+1
				end if
			end if
		end repeat
	end repeat

	-- if we closed at least one Safari window, and no more are
	-- open, then tell Safari to exit
	if closed and countOfWindowsWithURL is 0 then 
		quit
		set closed to "appquit"
	end if

	-- return true if we closed at least one window, false if not, appquit if told browser to quit
	closed
end tell
