--
-- timespan__new/1
--
create or replace function timespan__new(
  integer
) returns int4 as $$
	-- timespans.timespan_id%TYPE
declare
        new__interval_id	alias for $1;
begin
        return timespan__new(
		   new__interval_id,
		   true
		   );
        
end;$$ language plpgsql;


--
-- timespan__new/2
--
create or replace function timespan__new(
  new__interval_id integer,
  new__copy_p boolean
) returns int4 as $$

-- timespans.timespan_id%TYPE
DECLARE
        v_timespan_id           timespans.timespan_id%TYPE;
        v_interval_id           time_intervals.interval_id%TYPE;
BEGIN
        -- get a new id;
        select nextval('timespan_sequence') into v_timespan_id from dual;

        if new__copy_p
        then      
             -- JS: Note use of overloaded function (zero offset)
             v_interval_id := time_interval__copy(new__interval_id);
        else
             v_interval_id := new__interval_id;
        end if;
        
        insert into timespans
            (timespan_id, interval_id)
        values
            (v_timespan_id, v_interval_id);
        
        return v_timespan_id;

END;
$$ language plpgsql;


--
-- timespan__new/2
--
create or replace function timespan__new(
  timestamp with time zone,
  timestamp with time zone
) returns int4 as $$
	--  timespans.timespan_id%TYPE
declare
       new__start_date  alias for $1; -- default null,
       new__end_date    alias for $2; -- default null
begin

       -- JS: If we simply call timespan__new with default copy_p = true,
       -- JS: there will be two new time intervals that will be created
       -- JS: everytime this function is called. The first one will never be used!!! 
       -- JS: To fix, we use the timespan__new with copy_p parameter and
       -- JS: setting copy_p to false.
       return timespan__new(time_interval__new(new__start_date, new__end_date),false);

end;$$ language plpgsql;