################################ # Author: Benjamin Kellermann # # License: CC-by-sa 3.0 # # see License # ################################ class TimePollHead class TimeString attr_reader :date, :time def initialize(date,time) @date = date.class == Date ? date : Date.parse(date) if time =~ /^\d[\d]?:\d[\d]?$/ @time = Time.parse("#{@date} #{time}") else @time = time end end def TimeString.now TimeString.new(Date.today,Time.now) end include Comparable def <=>(other) if self.date == other.date if self.time.class == String && other.time.class == String || self.time.class == Time && other.time.class == Time self.time <=> other.time else self.time.class == String ? -1 : 1 end else self.date <=> other.date end end def to_s "#{@date} #{time_to_s}" end def time_to_s if @time.class == Time return time.strftime("%H:%M") else return @time end end end def initialize @data = [] end def col_size @data.size end def get_id(columntitle) return columntitle end def get_title(columnid) return columnid end def each_columntitle @data.sort.each{|day,time| yield("#{day} #{time}") } end def each_columnid @data.sort.each{|day,time| yield("#{day} #{time}") } end def each_column @data.sort.each{|day,time| yield("#{day} #{time}","#{day} #{time}") } end def each_time h = {} @data.each{|ds| h[ds.time_to_s] = true } h.keys.compact.sort{|a,b| TimeString.new(Date.today,a) <=> TimeString.new(Date.today,b) }.each{|k| yield(k)} end # returns internal representation of cgi-string def cgi_to_id(field) TimeString.new(field,nil) end # returns true if deletion sucessfull def delete_column(columnid) @data.delete(cgi_to_id(columnid)) != nil end def parsecolumntitle(title) if $cgi.include?("add_remove_column_day") parsed_date = YAML::load(Time.parse("#{$cgi["add_remove_column_month"]}-#{$cgi["add_remove_column_day"]} #{title}").to_yaml) else earlytime = @head.keys.collect{|t|t.strftime("%H:%M")}.sort[0] parsed_date = YAML::load(Time.parse("#{$cgi["add_remove_column_month"]}-#{title} #{earlytime}").to_yaml) end parsed_date end # columnid should be never used as changing title is not usefull here # returns parsed title def edit_column(columnid, newtitle, cgi) parsed_date = TimeString.new(newtitle, cgi.include?("columntime") ? cgi["columntime"] : nil) @data << parsed_date @data.uniq! parsed_date.to_s end def to_html(config = false,activecolumn = nil) # returns a sorted array, containing the big units and how often each small is in the big one # small and big must be formated for strftime # ex: head_count("%Y-%m") returns an array like [["2009-03",2],["2009-04",3]] def head_count(elem) ret = Hash.new(0) @data.each{|day| ret[day.date.strftime(elem)] += 1 } ret.sort end ret = "" head_count("%Y-%m").each{|title,count| year, month = title.split("-").collect{|e| e.to_i} ret += "#{Date::ABBR_MONTHNAMES[month]} #{year}\n" } ret += "" head_count("%Y-%m-%d").each{|title,count| ret += "#{Date.parse(title).strftime("%a, %d")}\n" } ret += "Name" @data.sort.each{|date| ret += "#{date.time_to_s}\n" } ret += "Last Edit\n\n" ret end def edit_column_htmlform(activecolumn) if $cgi.include?("add_remove_column_month") if $cgi.params["add_remove_column_month"].size == 1 startdate = Date.parse("#{$cgi["add_remove_column_month"]}-1") else olddate = $cgi.params["add_remove_column_month"][1] case $cgi["add_remove_column_month"] when CGI.unescapeHTML(YEARBACK) startdate = Date.parse("#{olddate}-1")-365 when CGI.unescapeHTML(MONTHBACK) startdate = Date.parse("#{olddate}-1")-1 when CGI.unescapeHTML(MONTHFORWARD) startdate = Date.parse("#{olddate}-1")+31 when CGI.unescapeHTML(YEARFORWARD) startdate = Date.parse("#{olddate}-1")+366 else exit end startdate = Date.parse("#{startdate.year}-#{startdate.month}-1") end else startdate = Date.parse("#{Date.today.year}-#{Date.today.month}-1") end ret = <Add/Remove Column
END def navi val,curmonth return <
END end [YEARBACK,MONTHBACK].each{|val| ret += navi(val,startdate)} ret += "
" [MONTHFORWARD, YEARFORWARD].each{|val| ret += navi(val,startdate)} ret += "\n" 7.times{|i| ret += "" } ret += "\n" ((startdate.wday+7-1)%7).times{ ret += "" } d = startdate while (d.month == startdate.month) do klasse = "notchoosen" varname = "new_columnname" klasse = "disabled" if d < Date.today if @data.include?(TimeString.new(d,nil)) klasse = "choosen" varname = "deletecolumn" end ret += < TD ret += "\n" if d.wday == 0 d = d.next end ret += <
#{startdate.strftime("%b %Y")}
#{Date::ABBR_DAYNAMES[(i+1)%7]}
END ########################### # starting hour input ########################### ret += "
" head_count("%Y-%m").each{|title,count| year,month = title.split("-").collect{|e| e.to_i} ret += "\n" } ret += "" head_count("%Y-%m-%d").each{|title,count| ret += "\n" } ret += "" days = @data.sort.collect{|date| date.date }.uniq each_time{|time| ret +="\n" days.each{|day| timestamp = TimeString.new(day,time) klasse = "notchoosen" klasse = "disabled" if timestamp < TimeString.now klasse = "choosen" if @data.include?(timestamp) ret += <
END } ret += "
\n" } ret += "" days.each{|d| ret += <

END } ret += <
#{Date::ABBR_MONTHNAMES[month]} #{year}
#{Date.parse(title).strftime("%a, %d")}
END ret end end